Compare commits
800 Commits
curl-7_10
...
curl-7_10_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
bdb5e5a250 | ||
![]() |
48a580e609 | ||
![]() |
1361fc69b9 | ||
![]() |
93352e56d8 | ||
![]() |
d9246ff24d | ||
![]() |
9301bc3444 | ||
![]() |
76352c4e2d | ||
![]() |
428f41bd12 | ||
![]() |
99c32e460f | ||
![]() |
83f249cf65 | ||
![]() |
2c2baa93ea | ||
![]() |
f0278ca114 | ||
![]() |
297b1b5013 | ||
![]() |
e9f63bf4e8 | ||
![]() |
556ce1c6a1 | ||
![]() |
cc4ff62681 | ||
![]() |
0423fd9b55 | ||
![]() |
789ab20bf7 | ||
![]() |
b47462bd68 | ||
![]() |
1a94fee42d | ||
![]() |
a91ce6a5d6 | ||
![]() |
981ffd9fce | ||
![]() |
e76c960624 | ||
![]() |
416c92cc6f | ||
![]() |
fb731eb3e7 | ||
![]() |
6f2a4d290f | ||
![]() |
cefc8ba938 | ||
![]() |
d0bd644eef | ||
![]() |
071c95128e | ||
![]() |
1a192c489b | ||
![]() |
56014e74a0 | ||
![]() |
172271498d | ||
![]() |
f2882cb88c | ||
![]() |
152f1fee40 | ||
![]() |
968234e6ae | ||
![]() |
5e133e2dff | ||
![]() |
0049c09fc3 | ||
![]() |
a2a63c27f4 | ||
![]() |
c50a601f1a | ||
![]() |
bc0fd6db71 | ||
![]() |
52b631fade | ||
![]() |
2f0bc9d1f7 | ||
![]() |
5ef6520d4e | ||
![]() |
2c1925161e | ||
![]() |
0529b349d5 | ||
![]() |
b4620364a2 | ||
![]() |
634aef3895 | ||
![]() |
06c86d1a8c | ||
![]() |
79749f8eb4 | ||
![]() |
b036986b3e | ||
![]() |
938f1d1da7 | ||
![]() |
58b6b3df06 | ||
![]() |
f9c3347f7c | ||
![]() |
5b72eb0b03 | ||
![]() |
6dd4c13bc0 | ||
![]() |
e4e7db551f | ||
![]() |
ebfde8da56 | ||
![]() |
756bc0f4b7 | ||
![]() |
269d491b6a | ||
![]() |
449e5bc2ad | ||
![]() |
8736c11d84 | ||
![]() |
45fc760985 | ||
![]() |
7968e3c2de | ||
![]() |
964a41c75c | ||
![]() |
5931d53637 | ||
![]() |
3ed3ae5bcf | ||
![]() |
6519cc70c5 | ||
![]() |
505a4f27fa | ||
![]() |
79144eba99 | ||
![]() |
26e17d89c9 | ||
![]() |
4322c1106f | ||
![]() |
73071dfd4f | ||
![]() |
b7c14b3c27 | ||
![]() |
3130b44535 | ||
![]() |
a2bd73334f | ||
![]() |
1a393f5625 | ||
![]() |
d4951e837e | ||
![]() |
26f6365e93 | ||
![]() |
3a552b1e63 | ||
![]() |
69eb1790da | ||
![]() |
a1af6f3614 | ||
![]() |
3aced61465 | ||
![]() |
6f02ddfce8 | ||
![]() |
c2faa39b62 | ||
![]() |
2d3734b8b5 | ||
![]() |
ed908b7f89 | ||
![]() |
f7d795a364 | ||
![]() |
8919b39d54 | ||
![]() |
84cedc094e | ||
![]() |
3b2b2496d7 | ||
![]() |
445684c409 | ||
![]() |
898e067ccc | ||
![]() |
12859e345f | ||
![]() |
89f4af695e | ||
![]() |
308bc9d919 | ||
![]() |
db566c54ae | ||
![]() |
81d403e207 | ||
![]() |
2bd71d70ff | ||
![]() |
1eef6f44ba | ||
![]() |
204f03912f | ||
![]() |
f8c3b3aa18 | ||
![]() |
d4df981463 | ||
![]() |
497c6d516d | ||
![]() |
8288862b7e | ||
![]() |
9aae16c236 | ||
![]() |
80c194a70a | ||
![]() |
c832b2db5b | ||
![]() |
27018882ec | ||
![]() |
caf6e9c540 | ||
![]() |
e727fb82f2 | ||
![]() |
c78df56801 | ||
![]() |
d13202f43b | ||
![]() |
9d139a6b35 | ||
![]() |
d2abe44e6f | ||
![]() |
bc67228576 | ||
![]() |
ecf32c964a | ||
![]() |
e58f30b82a | ||
![]() |
654e3f1101 | ||
![]() |
86689dc524 | ||
![]() |
5f62a0c1ca | ||
![]() |
ad1bf0f389 | ||
![]() |
9c7703ace1 | ||
![]() |
4a8155b53c | ||
![]() |
80d6d5c5c4 | ||
![]() |
c624be8388 | ||
![]() |
09df1cd41e | ||
![]() |
52c5b57200 | ||
![]() |
5ea04a852e | ||
![]() |
a2eef05198 | ||
![]() |
55f75af353 | ||
![]() |
fb6a51b8fd | ||
![]() |
252cc2213e | ||
![]() |
73c5f24fa4 | ||
![]() |
4c80e103a0 | ||
![]() |
39ea557360 | ||
![]() |
d0cc92a01a | ||
![]() |
d7980c1a45 | ||
![]() |
e56ae1426c | ||
![]() |
696843c020 | ||
![]() |
6ff5621dd7 | ||
![]() |
e7fb72a732 | ||
![]() |
8d30d34e0c | ||
![]() |
bc7fe85f8a | ||
![]() |
89352d92c5 | ||
![]() |
c32390d84c | ||
![]() |
45ca866a2d | ||
![]() |
ceef206c21 | ||
![]() |
7c6424f0a9 | ||
![]() |
bc942de6f1 | ||
![]() |
06984df5cb | ||
![]() |
4f136a3a76 | ||
![]() |
363bf3ba30 | ||
![]() |
acb895956a | ||
![]() |
21e87b9bb3 | ||
![]() |
c896ebcf12 | ||
![]() |
d288222e80 | ||
![]() |
4eb2a6c9a3 | ||
![]() |
2563731c4d | ||
![]() |
4e410111db | ||
![]() |
5670563a26 | ||
![]() |
6caa656d01 | ||
![]() |
c12af7aed1 | ||
![]() |
dcb6d1c01d | ||
![]() |
18234cbdac | ||
![]() |
06bf988dc1 | ||
![]() |
55ff4c3f08 | ||
![]() |
4915002168 | ||
![]() |
5bd8d60e41 | ||
![]() |
fc872808c5 | ||
![]() |
0f4feda382 | ||
![]() |
90b0f38316 | ||
![]() |
18f630ab21 | ||
![]() |
e97fd44151 | ||
![]() |
b75679778f | ||
![]() |
35a84ad576 | ||
![]() |
4ed28be75a | ||
![]() |
e2f4656a86 | ||
![]() |
1e14da5c60 | ||
![]() |
b2ef79ef3d | ||
![]() |
f488874ff5 | ||
![]() |
23258648da | ||
![]() |
6b84ebe501 | ||
![]() |
07dd067f73 | ||
![]() |
420744d048 | ||
![]() |
01108e3a63 | ||
![]() |
8026b1e194 | ||
![]() |
a39d77227f | ||
![]() |
9f69deec7d | ||
![]() |
e912f772e0 | ||
![]() |
0102726aeb | ||
![]() |
1e7aa04040 | ||
![]() |
00a7c6fe6b | ||
![]() |
87f8c0d471 | ||
![]() |
334d78cd18 | ||
![]() |
2356325592 | ||
![]() |
d78ec593fa | ||
![]() |
d5043133e6 | ||
![]() |
509f69a457 | ||
![]() |
662c659220 | ||
![]() |
9a6566e774 | ||
![]() |
4da0428d9e | ||
![]() |
8ee1177206 | ||
![]() |
e9154b2549 | ||
![]() |
d398a0dd58 | ||
![]() |
7723a24297 | ||
![]() |
95a4b8db68 | ||
![]() |
663c1898a3 | ||
![]() |
465de793e8 | ||
![]() |
de9b76cef0 | ||
![]() |
1747a8d3d9 | ||
![]() |
1094e79749 | ||
![]() |
22569681bc | ||
![]() |
e615d117a0 | ||
![]() |
a51258b6bb | ||
![]() |
8894bd07b6 | ||
![]() |
ec45a9e825 | ||
![]() |
871358a6e5 | ||
![]() |
2e2e0fba60 | ||
![]() |
4a5139e3f4 | ||
![]() |
8f85933d7c | ||
![]() |
246f3a63f6 | ||
![]() |
e99eff4eb0 | ||
![]() |
c0197f19cf | ||
![]() |
3994d67eea | ||
![]() |
9ead79c9d4 | ||
![]() |
9371aed46c | ||
![]() |
940707ad66 | ||
![]() |
e6c267fb4c | ||
![]() |
93538fccd6 | ||
![]() |
83a7fad308 | ||
![]() |
3c7e33388e | ||
![]() |
7b0f35edb6 | ||
![]() |
94a157d0b0 | ||
![]() |
ca04620253 | ||
![]() |
073ef0b36a | ||
![]() |
c41c05d4f4 | ||
![]() |
f1ea54e07a | ||
![]() |
a139ce901a | ||
![]() |
7431957113 | ||
![]() |
1752d80915 | ||
![]() |
aa7420e109 | ||
![]() |
a290d4b9db | ||
![]() |
19a4314e7f | ||
![]() |
d166e85e0a | ||
![]() |
f213e857ab | ||
![]() |
eb6130baa7 | ||
![]() |
f69ea2c68a | ||
![]() |
078441d477 | ||
![]() |
95f6b15a67 | ||
![]() |
ee29dbdb8f | ||
![]() |
15f3f4c93f | ||
![]() |
6932e94e0e | ||
![]() |
3ef06d7efe | ||
![]() |
fb012b48e9 | ||
![]() |
bc77bf217f | ||
![]() |
37d1e9351e | ||
![]() |
4494c0dee0 | ||
![]() |
26afc604ac | ||
![]() |
9aefcada19 | ||
![]() |
69fc363760 | ||
![]() |
bea02ddebe | ||
![]() |
3fb257c39c | ||
![]() |
7c96c5a39b | ||
![]() |
efd836d971 | ||
![]() |
836aaa1647 | ||
![]() |
bf2b3dbf3e | ||
![]() |
b4fa2ff995 | ||
![]() |
2f9cabc30b | ||
![]() |
63593f5597 | ||
![]() |
c0acaa5d2c | ||
![]() |
2e46f8d0a6 | ||
![]() |
51da6aaa07 | ||
![]() |
c8b79e36db | ||
![]() |
208374bcc9 | ||
![]() |
7f0a6e7203 | ||
![]() |
54ebb9cfd4 | ||
![]() |
49e9c1495b | ||
![]() |
a84b0fbd52 | ||
![]() |
c95814c04d | ||
![]() |
9f8123f1b8 | ||
![]() |
8b23db4f4d | ||
![]() |
d77cc13374 | ||
![]() |
9a12db1aa2 | ||
![]() |
eb54d34bec | ||
![]() |
4b1203d4c9 | ||
![]() |
183a9c6244 | ||
![]() |
1f2294d585 | ||
![]() |
0b839c4f77 | ||
![]() |
1d4fd1fcae | ||
![]() |
b1d8d72c16 | ||
![]() |
bafb68b844 | ||
![]() |
21873b52e9 | ||
![]() |
0aa8b82871 | ||
![]() |
f9781afafd | ||
![]() |
fece361a55 | ||
![]() |
7b51b2f128 | ||
![]() |
22d88fb28e | ||
![]() |
f7c5b28e76 | ||
![]() |
5760f2a307 | ||
![]() |
ee46efb5a5 | ||
![]() |
eb6ffebfc7 | ||
![]() |
c06c44f286 | ||
![]() |
019c4088cf | ||
![]() |
0b0a88b78d | ||
![]() |
028e9cc56f | ||
![]() |
e0d8615ece | ||
![]() |
c8ecbda40b | ||
![]() |
2324c10d43 | ||
![]() |
89cfa76291 | ||
![]() |
072070a22c | ||
![]() |
3c3ad134ea | ||
![]() |
a4ffcfd4d5 | ||
![]() |
136670c58a | ||
![]() |
28169725fa | ||
![]() |
5b13106f54 | ||
![]() |
1a2db0dfb1 | ||
![]() |
696f95bb0a | ||
![]() |
acec588fe3 | ||
![]() |
6ed0da8e98 | ||
![]() |
7fd91d70bd | ||
![]() |
61788a0389 | ||
![]() |
0821447b5b | ||
![]() |
3cba274ba6 | ||
![]() |
df7bbcfd21 | ||
![]() |
021d406f0c | ||
![]() |
294569c502 | ||
![]() |
bfd00ac2ed | ||
![]() |
735a4714f4 | ||
![]() |
827fd47198 | ||
![]() |
e26b917661 | ||
![]() |
92872a2a3c | ||
![]() |
16ddb09cb4 | ||
![]() |
d37031f14e | ||
![]() |
b4e84ca7d2 | ||
![]() |
47970b9e6f | ||
![]() |
f65f120d50 | ||
![]() |
df00ec3c82 | ||
![]() |
ad6fca28f9 | ||
![]() |
fd33923496 | ||
![]() |
a55649dc82 | ||
![]() |
9558f229db | ||
![]() |
7917bfb1c9 | ||
![]() |
25f611ca42 | ||
![]() |
e6eb49e7e0 | ||
![]() |
9a075f53dc | ||
![]() |
4b3f800c03 | ||
![]() |
82bc76b243 | ||
![]() |
18b9b04907 | ||
![]() |
87f1f08b36 | ||
![]() |
7d7ebbe9f7 | ||
![]() |
5111ce782f | ||
![]() |
20b0e563ce | ||
![]() |
8b6cf239a3 | ||
![]() |
bcc285cffd | ||
![]() |
d5ba030942 | ||
![]() |
803f43592a | ||
![]() |
904b9ccaa3 | ||
![]() |
89721ff04a | ||
![]() |
6164823921 | ||
![]() |
f8b3c47f99 | ||
![]() |
56dd2da962 | ||
![]() |
68bb74d172 | ||
![]() |
bf5e12c8e0 | ||
![]() |
de11f5e53a | ||
![]() |
b125e8e23a | ||
![]() |
b28b616eb2 | ||
![]() |
4534ca238d | ||
![]() |
cee0e94294 | ||
![]() |
8319ea7078 | ||
![]() |
5334a58f9b | ||
![]() |
2616bdc4cd | ||
![]() |
c149b3f797 | ||
![]() |
d349eb3d43 | ||
![]() |
9b43ade1c0 | ||
![]() |
ad05d0a8d9 | ||
![]() |
e6bfbe9683 | ||
![]() |
c871efca4b | ||
![]() |
12c72b419c | ||
![]() |
a15b7691ca | ||
![]() |
01618d323b | ||
![]() |
bb6d0e37e3 | ||
![]() |
24a6100897 | ||
![]() |
0251563c98 | ||
![]() |
72673a351b | ||
![]() |
96b7131844 | ||
![]() |
dcc2f16416 | ||
![]() |
c2b8a04000 | ||
![]() |
d65587b06c | ||
![]() |
1ab0134522 | ||
![]() |
afffce80f0 | ||
![]() |
70b80b0160 | ||
![]() |
64067a04b5 | ||
![]() |
38cf0268c0 | ||
![]() |
2d2034703f | ||
![]() |
571ceeff90 | ||
![]() |
34c4ba4321 | ||
![]() |
babb372eb9 | ||
![]() |
5b9b82c1cd | ||
![]() |
075c534270 | ||
![]() |
f317f8b149 | ||
![]() |
f8d552dde5 | ||
![]() |
606f72bb13 | ||
![]() |
327e6a2b4f | ||
![]() |
be8f6c7f5c | ||
![]() |
073448e0ea | ||
![]() |
f136f435b5 | ||
![]() |
ebea6b487b | ||
![]() |
e5b7dc56e6 | ||
![]() |
c2d8025a0a | ||
![]() |
853e240e1d | ||
![]() |
8755a6d1ac | ||
![]() |
9f723061cb | ||
![]() |
652683fc04 | ||
![]() |
83a463891d | ||
![]() |
957b618fdc | ||
![]() |
ebe5191b63 | ||
![]() |
c426234df7 | ||
![]() |
8c3a10392e | ||
![]() |
d0e44946e9 | ||
![]() |
46a593d968 | ||
![]() |
eb0cc34951 | ||
![]() |
1c7dfda4bc | ||
![]() |
3c0e4a2fa1 | ||
![]() |
c753072ae1 | ||
![]() |
243942a7aa | ||
![]() |
8d5ac8b43c | ||
![]() |
17962b3d2e | ||
![]() |
f70acd5979 | ||
![]() |
ffe5c46224 | ||
![]() |
3242ea5f66 | ||
![]() |
39a282bffc | ||
![]() |
29583004ce | ||
![]() |
0a1a185874 | ||
![]() |
8f809e2a93 | ||
![]() |
f216059b49 | ||
![]() |
9121b1f41d | ||
![]() |
60e015d0c1 | ||
![]() |
7e049fca61 | ||
![]() |
0f0e4de6a4 | ||
![]() |
bc1102922b | ||
![]() |
a3d3642a30 | ||
![]() |
248eb47329 | ||
![]() |
52ebf50607 | ||
![]() |
d34a4b126e | ||
![]() |
de96719a45 | ||
![]() |
9876ed09fe | ||
![]() |
17cbbe3dc5 | ||
![]() |
b995af17eb | ||
![]() |
6589579850 | ||
![]() |
5ddc260fc2 | ||
![]() |
db5c9cd4c0 | ||
![]() |
9b6d010aef | ||
![]() |
065b87e949 | ||
![]() |
a6206a3aef | ||
![]() |
30639ed72b | ||
![]() |
9d02a39e13 | ||
![]() |
fc0af0d4d1 | ||
![]() |
a683416081 | ||
![]() |
9faf57ee8d | ||
![]() |
44b9ccb7e2 | ||
![]() |
de003d9cf8 | ||
![]() |
8a2a523c70 | ||
![]() |
c3dfe50aaf | ||
![]() |
9659d862c7 | ||
![]() |
69ab4cd391 | ||
![]() |
498f3985b3 | ||
![]() |
977175d4fd | ||
![]() |
3ddc7b9390 | ||
![]() |
10e9bf623f | ||
![]() |
48a5c64e94 | ||
![]() |
140606ccd5 | ||
![]() |
f56d006f93 | ||
![]() |
beb13a1d3e | ||
![]() |
fa47138327 | ||
![]() |
9421d4510a | ||
![]() |
ff8abfca85 | ||
![]() |
5c858965b8 | ||
![]() |
e3f83cb17a | ||
![]() |
de6008e01a | ||
![]() |
6417e696df | ||
![]() |
5d28f3781b | ||
![]() |
10026bb62e | ||
![]() |
21c16f923c | ||
![]() |
32cef52f0d | ||
![]() |
e7dd7c54ff | ||
![]() |
b0b50bd12a | ||
![]() |
f2c6057490 | ||
![]() |
169b2eeb94 | ||
![]() |
f81d027f60 | ||
![]() |
872eeb7339 | ||
![]() |
7f67a28c2a | ||
![]() |
30a46e1135 | ||
![]() |
3a01478ce8 | ||
![]() |
53d71fab60 | ||
![]() |
be891f112c | ||
![]() |
89934239d7 | ||
![]() |
8986037fdd | ||
![]() |
a7c72b7abf | ||
![]() |
409ac80710 | ||
![]() |
fc7bebdf55 | ||
![]() |
ca52549557 | ||
![]() |
8948a65654 | ||
![]() |
b4e33cfcc7 | ||
![]() |
86742e8334 | ||
![]() |
173b35eaf8 | ||
![]() |
2b054e5309 | ||
![]() |
a302ff1605 | ||
![]() |
f7bb4e6138 | ||
![]() |
5c5489916b | ||
![]() |
5627cf7167 | ||
![]() |
c05dae4a68 | ||
![]() |
57e61e3743 | ||
![]() |
a6c395c156 | ||
![]() |
543e0b1e0f | ||
![]() |
64b0ff875f | ||
![]() |
a034208a00 | ||
![]() |
5f1251586b | ||
![]() |
6f6cffdc32 | ||
![]() |
21a98ef264 | ||
![]() |
aa90436435 | ||
![]() |
61225052f9 | ||
![]() |
dee3163d95 | ||
![]() |
8b0668b99e | ||
![]() |
8471a82c85 | ||
![]() |
ed4dff63b9 | ||
![]() |
838e776542 | ||
![]() |
39c12790bc | ||
![]() |
126e6d6645 | ||
![]() |
5796a1b282 | ||
![]() |
90982529fc | ||
![]() |
aba51d6b60 | ||
![]() |
49bc4567bb | ||
![]() |
2ac52705c6 | ||
![]() |
d0eb56dd97 | ||
![]() |
b9c60df04b | ||
![]() |
8c236e4dfa | ||
![]() |
154a59f21f | ||
![]() |
9689e1c548 | ||
![]() |
5a83976c99 | ||
![]() |
b5276a9a69 | ||
![]() |
30377baa5e | ||
![]() |
aa8b7dd336 | ||
![]() |
f26a338a54 | ||
![]() |
c4383f1d99 | ||
![]() |
4527995e66 | ||
![]() |
b0fbb98f41 | ||
![]() |
63667dfd96 | ||
![]() |
77c388c928 | ||
![]() |
a69b814ded | ||
![]() |
c51ada766d | ||
![]() |
ef2709f97c | ||
![]() |
bf9b9ca29d | ||
![]() |
64f224bb22 | ||
![]() |
285a8fe4d0 | ||
![]() |
3773d76dfd | ||
![]() |
94c5c7bd6d | ||
![]() |
12cfc4c0b0 | ||
![]() |
9a2de6e6ee | ||
![]() |
2ede47b8c8 | ||
![]() |
76e107506f | ||
![]() |
6f35ed51dc | ||
![]() |
c94ba66310 | ||
![]() |
a15133f5cf | ||
![]() |
cc09e9d4c2 | ||
![]() |
16e0da2c4b | ||
![]() |
ed22f75241 | ||
![]() |
ba25cad6e2 | ||
![]() |
abb01123cb | ||
![]() |
e2d249f8c5 | ||
![]() |
4a2ac166fa | ||
![]() |
5fab55383d | ||
![]() |
f152f23a68 | ||
![]() |
24e78b3571 | ||
![]() |
9a239edb52 | ||
![]() |
abcc5c5a82 | ||
![]() |
cb5ba675a7 | ||
![]() |
2288086695 | ||
![]() |
61421b7a8f | ||
![]() |
6a7e53a7c7 | ||
![]() |
ca134d5522 | ||
![]() |
ec24efda74 | ||
![]() |
7f0f10e498 | ||
![]() |
aa5af100b4 | ||
![]() |
37ae32f688 | ||
![]() |
d0cffdec5d | ||
![]() |
0f34521612 | ||
![]() |
e69362df22 | ||
![]() |
3de8f6f38e | ||
![]() |
5359bc8083 | ||
![]() |
eb6a14fe10 | ||
![]() |
2912537533 | ||
![]() |
cfb32da198 | ||
![]() |
9b4f92130f | ||
![]() |
5a2ab686a6 | ||
![]() |
3b8583b014 | ||
![]() |
ed29552b1e | ||
![]() |
a2ada3cf96 | ||
![]() |
88825a1187 | ||
![]() |
264e7fc58b | ||
![]() |
1698015e3c | ||
![]() |
39dc14c002 | ||
![]() |
04c499a5fc | ||
![]() |
efbe930a69 | ||
![]() |
747f87f61e | ||
![]() |
5a4c56fc44 | ||
![]() |
81f45ba92a | ||
![]() |
a5dc4e32f2 | ||
![]() |
2b839853ec | ||
![]() |
66b6cd68ed | ||
![]() |
0ef3d90838 | ||
![]() |
5cc50f9b27 | ||
![]() |
e879e26a5b | ||
![]() |
96d84150e1 | ||
![]() |
2aa0c6c488 | ||
![]() |
811138386f | ||
![]() |
c433cf7459 | ||
![]() |
e0d6ebc2f2 | ||
![]() |
4938991ab8 | ||
![]() |
13722f536e | ||
![]() |
57f0e3292d | ||
![]() |
da5ae565ab | ||
![]() |
87c5066242 | ||
![]() |
b528bde470 | ||
![]() |
57572e550f | ||
![]() |
3aea0d3d68 | ||
![]() |
9ae920c1b6 | ||
![]() |
dff406a360 | ||
![]() |
d346ba5c3c | ||
![]() |
978541adc2 | ||
![]() |
637bce2707 | ||
![]() |
07e3dc2ee2 | ||
![]() |
ead065d803 | ||
![]() |
0150bff7b4 | ||
![]() |
0f493b6038 | ||
![]() |
f26b709c50 | ||
![]() |
ae10d9cf22 | ||
![]() |
81af9674ed | ||
![]() |
b63df7991a | ||
![]() |
a79990465c | ||
![]() |
ad6bd530ac | ||
![]() |
c1b369fd4c | ||
![]() |
01fcd3c2d5 | ||
![]() |
7196d784d3 | ||
![]() |
0f0aaf51e0 | ||
![]() |
b5f493c55a | ||
![]() |
0aa031beb9 | ||
![]() |
db6ff224f8 | ||
![]() |
b3c7cd61f3 | ||
![]() |
9ae05c4d91 | ||
![]() |
264e6f6efd | ||
![]() |
ec7bccf671 | ||
![]() |
49f75ee8ce | ||
![]() |
4bcc866c52 | ||
![]() |
c65e088caf | ||
![]() |
6ca4116555 | ||
![]() |
f6cdb820af | ||
![]() |
081e5a82ff | ||
![]() |
2ad2a4bd9f | ||
![]() |
645e700da3 | ||
![]() |
92aea29a30 | ||
![]() |
e1c01af929 | ||
![]() |
7ef749497d | ||
![]() |
d72aa49126 | ||
![]() |
e92bd312ec | ||
![]() |
b097c2cfb0 | ||
![]() |
a39cdc80b7 | ||
![]() |
a47250810e | ||
![]() |
1f50f3031f | ||
![]() |
75145dd753 | ||
![]() |
d0b97f7e1f | ||
![]() |
199a0311e2 | ||
![]() |
fa446f860f | ||
![]() |
7a74303f3c | ||
![]() |
7d9eabb981 | ||
![]() |
ff5308a5af | ||
![]() |
3f8ba3a986 | ||
![]() |
4a555de1b2 | ||
![]() |
d27e4a08f9 | ||
![]() |
bf678a1ca9 | ||
![]() |
13a903de28 | ||
![]() |
a3c14c031e | ||
![]() |
e90d528026 | ||
![]() |
d64dd77993 | ||
![]() |
113850a748 | ||
![]() |
1c49a00d64 | ||
![]() |
eef6c83503 | ||
![]() |
ceb5648eb7 | ||
![]() |
a0eadb76ea | ||
![]() |
065852e46c | ||
![]() |
e5e2fb8274 | ||
![]() |
0210b3c893 | ||
![]() |
7df5677b46 | ||
![]() |
2e71876b28 | ||
![]() |
11576b1142 | ||
![]() |
ce011b8a2d | ||
![]() |
12cfb4f7ee | ||
![]() |
9e1123debe | ||
![]() |
c7354142c0 | ||
![]() |
dee84f448f | ||
![]() |
1607711603 | ||
![]() |
8bca5e05b8 | ||
![]() |
f68505ee23 | ||
![]() |
d2174da641 | ||
![]() |
255b1e68d0 | ||
![]() |
fbee6b87f5 | ||
![]() |
3836a70f97 | ||
![]() |
e0ec9fa294 | ||
![]() |
80fe50590f | ||
![]() |
ae18d1c55a | ||
![]() |
75194373e0 | ||
![]() |
f3875048f6 | ||
![]() |
210af986ad | ||
![]() |
c03044f492 | ||
![]() |
522b85ae21 | ||
![]() |
208e56dbe9 | ||
![]() |
42acb00c81 | ||
![]() |
ca6e770837 | ||
![]() |
775968003c | ||
![]() |
323d3e9b5d | ||
![]() |
16f9755e73 | ||
![]() |
66eb98bb0a | ||
![]() |
299546f5c0 | ||
![]() |
7be9b4c418 | ||
![]() |
03c22b4576 | ||
![]() |
ef749fa9ce | ||
![]() |
a23c92596e | ||
![]() |
abb1497c98 | ||
![]() |
7a8594da43 | ||
![]() |
cbf28daed9 | ||
![]() |
0ff1ca30c3 | ||
![]() |
2cff251863 | ||
![]() |
73d996bf26 | ||
![]() |
5bc78cb724 | ||
![]() |
cdba92ac3c | ||
![]() |
6d28f92ffe | ||
![]() |
01387f42c5 | ||
![]() |
8f52b731f4 | ||
![]() |
d442088ed3 | ||
![]() |
22a323890a | ||
![]() |
163bba1410 | ||
![]() |
db1c618fcf | ||
![]() |
01bdfa7b6d | ||
![]() |
6a88c8d845 | ||
![]() |
b8a6913e09 | ||
![]() |
744d8c1006 | ||
![]() |
c2e2c98d81 | ||
![]() |
3fa353a2d3 | ||
![]() |
c27c9f80d2 | ||
![]() |
b5a74715cf | ||
![]() |
13ee2901f4 | ||
![]() |
32c03eadd6 | ||
![]() |
0fa512f26d | ||
![]() |
219d88518c | ||
![]() |
ecf3aee43a | ||
![]() |
7f08cab73e | ||
![]() |
c4e9ef199e | ||
![]() |
9e612b5550 | ||
![]() |
203633d34d | ||
![]() |
45bd009bb1 | ||
![]() |
ee656415c4 | ||
![]() |
156aad198f | ||
![]() |
b1ffb79a50 | ||
![]() |
d6654bfe00 | ||
![]() |
eefdd67d22 | ||
![]() |
86a86d7afd | ||
![]() |
b6dac2b484 | ||
![]() |
e6367abae9 | ||
![]() |
fc4d1d9a60 | ||
![]() |
94bae20776 | ||
![]() |
bb8c8d273c | ||
![]() |
ee600ace37 | ||
![]() |
da86e32eb4 | ||
![]() |
b5bbc04ad1 | ||
![]() |
265c58611f | ||
![]() |
25c973a39e | ||
![]() |
123c7b32db | ||
![]() |
e2d8e2c4ae | ||
![]() |
701509d322 | ||
![]() |
c3cc616264 | ||
![]() |
91b84b89e4 | ||
![]() |
017ec204a9 | ||
![]() |
8dbfecd153 | ||
![]() |
512db1bc54 | ||
![]() |
e157aabd4d | ||
![]() |
db2fea448c | ||
![]() |
dd82d69b8c | ||
![]() |
27328281b7 | ||
![]() |
51d205b267 | ||
![]() |
84800914f6 | ||
![]() |
9b296e65bd | ||
![]() |
5f649a1649 | ||
![]() |
daea056210 | ||
![]() |
30c0db06bd | ||
![]() |
91168c005c | ||
![]() |
cfa0054077 | ||
![]() |
3d5820648b | ||
![]() |
d08df97fe5 | ||
![]() |
fd6624a058 | ||
![]() |
8aa41dd04b | ||
![]() |
e890113fc6 |
@@ -9,3 +9,6 @@ config.status
|
|||||||
curl-config
|
curl-config
|
||||||
autom4te.cache
|
autom4te.cache
|
||||||
depcomp
|
depcomp
|
||||||
|
config.guess
|
||||||
|
config.sub
|
||||||
|
ltmain.sh
|
||||||
|
1504
CHANGES.2002
Normal file
1504
CHANGES.2002
Normal file
File diff suppressed because it is too large
Load Diff
2
COPYING
2
COPYING
@@ -1,6 +1,6 @@
|
|||||||
COPYRIGHT AND PERMISSION NOTICE
|
COPYRIGHT AND PERMISSION NOTICE
|
||||||
|
|
||||||
Copyright (c) 1996 - 2002, Daniel Stenberg, <daniel@haxx.se>.
|
Copyright (c) 1996 - 2003, Daniel Stenberg, <daniel@haxx.se>.
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
39
CVS-INFO
39
CVS-INFO
@@ -15,8 +15,9 @@ Compile and build instructions follow below.
|
|||||||
CHANGES.0 contains ancient changes.
|
CHANGES.0 contains ancient changes.
|
||||||
CHANGES.$year contains changes for the particular year.
|
CHANGES.$year contains changes for the particular year.
|
||||||
|
|
||||||
memanalyze.pl is for analyzing the output generated by curl if -DMALLOCDEBUG
|
tests/memanalyze.pl
|
||||||
is used when compiling
|
is for analyzing the output generated by curl if -DCURLDEBUG
|
||||||
|
is used when compiling (run configure with --enable-debug)
|
||||||
|
|
||||||
buildconf builds the makefiles and configure stuff
|
buildconf builds the makefiles and configure stuff
|
||||||
|
|
||||||
@@ -30,25 +31,39 @@ To build after having extracted everything from CVS, do this:
|
|||||||
./configure
|
./configure
|
||||||
make
|
make
|
||||||
|
|
||||||
|
Daniel uses a ./configure line similar to this for easier development:
|
||||||
|
|
||||||
|
./configure --disable-shared --enable-debug --enable-maintainer-mode
|
||||||
|
|
||||||
|
|
||||||
REQUIREMENTS
|
REQUIREMENTS
|
||||||
|
|
||||||
You need the following software installed:
|
You need the following software installed:
|
||||||
|
|
||||||
o autoconf 2.50 (or later)
|
o autoconf 2.57 (or later)
|
||||||
o automake 1.5 (or later)
|
o automake 1.7 (or later)
|
||||||
o libtool 1.4 (or later)
|
o libtool 1.4.2 (or later)
|
||||||
o GNU m4 (required by autoconf)
|
o GNU m4 (required by autoconf)
|
||||||
|
|
||||||
o nroff + perl (if you don't have nroff and perl and you for some reason
|
o nroff + perl
|
||||||
don't want to install them, you can rename the source file
|
|
||||||
src/hugehelp.c.cvs to src/hugehelp.c and avoid having to generate this
|
If you don't have nroff and perl and you for some reason don't want to
|
||||||
file. This will of course give you an older version of the file that isn't
|
install them, you can rename the source file src/hugehelp.c.cvs to
|
||||||
up-to-date. That file was checked in once and won't be updated very
|
src/hugehelp.c and avoid having to generate this file. This will of course
|
||||||
regularly.)
|
give you an older version of the file that isn't up-to-date. That file was
|
||||||
|
checked in once and won't be updated very regularly.
|
||||||
|
|
||||||
|
o yacc/bison
|
||||||
|
|
||||||
|
If you don't have yacc or bison, you must rename the lib/getdate.c.cvs file
|
||||||
|
to lib/getdate.c to be able to build libcurl. yacc/bison is normally used
|
||||||
|
to generate the lib/getdate.c file from the lib/getdate.y source file.
|
||||||
|
|
||||||
MAC OS X
|
MAC OS X
|
||||||
|
|
||||||
For Mac OS X users, Guido Neitzer write down the following step-by-step guide:
|
With Mac OS X 10.2 and the associated Developer Tools, the installed versions
|
||||||
|
of the build tools are adequate. For Mac OS X 10.1 users, Guido Neitzer
|
||||||
|
wrote the following step-by-step guide:
|
||||||
|
|
||||||
1. Install fink (http://fink.sourceforge.net)
|
1. Install fink (http://fink.sourceforge.net)
|
||||||
2. Update fink to the newest version (with the installed fink)
|
2. Update fink to the newest version (with the installed fink)
|
||||||
|
25
LEGAL
25
LEGAL
@@ -1,25 +0,0 @@
|
|||||||
Copyright (C) 1998-2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
||||||
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
|
||||||
document, but changing it is not allowed.
|
|
||||||
|
|
||||||
In order to be useful for every potential user, the curl and libcurl are
|
|
||||||
dual-licensed under the MPL and the MIT/X-derivate licenses.
|
|
||||||
|
|
||||||
You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
||||||
copies of the Software, and permit persons to whom the Software is furnished
|
|
||||||
to do so, under the terms of the MPL or the MIT/X-derivate licenses. You may
|
|
||||||
pick one of these licenses. The files MITX.txt and MPL-1.1.txt contain the
|
|
||||||
license texts.
|
|
||||||
|
|
||||||
As a courtesy to the open-source and free software community, we ask you to
|
|
||||||
dual-license any modifications that you make as well, under the terms of this
|
|
||||||
document.
|
|
||||||
|
|
||||||
Please remember to always keep the licensing information included in
|
|
||||||
individual source files up-to-date, so as to avoid misleading anyone as to
|
|
||||||
the status of these files.
|
|
||||||
|
|
||||||
I will use a submission policy according to which I will only enter
|
|
||||||
contributions into the CVS tree if the contributor agrees to both licenses
|
|
||||||
and this dual-license approach.
|
|
21
MITX.txt
21
MITX.txt
@@ -1,21 +0,0 @@
|
|||||||
COPYRIGHT AND PERMISSION NOTICE
|
|
||||||
|
|
||||||
Copyright (c) 1996 - 2002, Daniel Stenberg, <daniel@haxx.se>.
|
|
||||||
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software for any purpose
|
|
||||||
with or without fee is hereby granted, provided that the above copyright
|
|
||||||
notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
|
|
||||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
||||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
|
|
||||||
OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Except as contained in this notice, the name of a copyright holder shall not
|
|
||||||
be used in advertising or otherwise to promote the sale, use or other dealings
|
|
||||||
in this Software without prior written authorization of the copyright holder.
|
|
470
MPL-1.1.txt
470
MPL-1.1.txt
@@ -1,470 +0,0 @@
|
|||||||
MOZILLA PUBLIC LICENSE
|
|
||||||
Version 1.1
|
|
||||||
|
|
||||||
---------------
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
1.0.1. "Commercial Use" means distribution or otherwise making the
|
|
||||||
Covered Code available to a third party.
|
|
||||||
|
|
||||||
1.1. "Contributor" means each entity that creates or contributes to
|
|
||||||
the creation of Modifications.
|
|
||||||
|
|
||||||
1.2. "Contributor Version" means the combination of the Original
|
|
||||||
Code, prior Modifications used by a Contributor, and the Modifications
|
|
||||||
made by that particular Contributor.
|
|
||||||
|
|
||||||
1.3. "Covered Code" means the Original Code or Modifications or the
|
|
||||||
combination of the Original Code and Modifications, in each case
|
|
||||||
including portions thereof.
|
|
||||||
|
|
||||||
1.4. "Electronic Distribution Mechanism" means a mechanism generally
|
|
||||||
accepted in the software development community for the electronic
|
|
||||||
transfer of data.
|
|
||||||
|
|
||||||
1.5. "Executable" means Covered Code in any form other than Source
|
|
||||||
Code.
|
|
||||||
|
|
||||||
1.6. "Initial Developer" means the individual or entity identified
|
|
||||||
as the Initial Developer in the Source Code notice required by Exhibit
|
|
||||||
A.
|
|
||||||
|
|
||||||
1.7. "Larger Work" means a work which combines Covered Code or
|
|
||||||
portions thereof with code not governed by the terms of this License.
|
|
||||||
|
|
||||||
1.8. "License" means this document.
|
|
||||||
|
|
||||||
1.8.1. "Licensable" means having the right to grant, to the maximum
|
|
||||||
extent possible, whether at the time of the initial grant or
|
|
||||||
subsequently acquired, any and all of the rights conveyed herein.
|
|
||||||
|
|
||||||
1.9. "Modifications" means any addition to or deletion from the
|
|
||||||
substance or structure of either the Original Code or any previous
|
|
||||||
Modifications. When Covered Code is released as a series of files, a
|
|
||||||
Modification is:
|
|
||||||
A. Any addition to or deletion from the contents of a file
|
|
||||||
containing Original Code or previous Modifications.
|
|
||||||
|
|
||||||
B. Any new file that contains any part of the Original Code or
|
|
||||||
previous Modifications.
|
|
||||||
|
|
||||||
1.10. "Original Code" means Source Code of computer software code
|
|
||||||
which is described in the Source Code notice required by Exhibit A as
|
|
||||||
Original Code, and which, at the time of its release under this
|
|
||||||
License is not already Covered Code governed by this License.
|
|
||||||
|
|
||||||
1.10.1. "Patent Claims" means any patent claim(s), now owned or
|
|
||||||
hereafter acquired, including without limitation, method, process,
|
|
||||||
and apparatus claims, in any patent Licensable by grantor.
|
|
||||||
|
|
||||||
1.11. "Source Code" means the preferred form of the Covered Code for
|
|
||||||
making modifications to it, including all modules it contains, plus
|
|
||||||
any associated interface definition files, scripts used to control
|
|
||||||
compilation and installation of an Executable, or source code
|
|
||||||
differential comparisons against either the Original Code or another
|
|
||||||
well known, available Covered Code of the Contributor's choice. The
|
|
||||||
Source Code can be in a compressed or archival form, provided the
|
|
||||||
appropriate decompression or de-archiving software is widely available
|
|
||||||
for no charge.
|
|
||||||
|
|
||||||
1.12. "You" (or "Your") means an individual or a legal entity
|
|
||||||
exercising rights under, and complying with all of the terms of, this
|
|
||||||
License or a future version of this License issued under Section 6.1.
|
|
||||||
For legal entities, "You" includes any entity which controls, is
|
|
||||||
controlled by, or is under common control with You. For purposes of
|
|
||||||
this definition, "control" means (a) the power, direct or indirect,
|
|
||||||
to cause the direction or management of such entity, whether by
|
|
||||||
contract or otherwise, or (b) ownership of more than fifty percent
|
|
||||||
(50%) of the outstanding shares or beneficial ownership of such
|
|
||||||
entity.
|
|
||||||
|
|
||||||
2. Source Code License.
|
|
||||||
|
|
||||||
2.1. The Initial Developer Grant.
|
|
||||||
The Initial Developer hereby grants You a world-wide, royalty-free,
|
|
||||||
non-exclusive license, subject to third party intellectual property
|
|
||||||
claims:
|
|
||||||
(a) under intellectual property rights (other than patent or
|
|
||||||
trademark) Licensable by Initial Developer to use, reproduce,
|
|
||||||
modify, display, perform, sublicense and distribute the Original
|
|
||||||
Code (or portions thereof) with or without Modifications, and/or
|
|
||||||
as part of a Larger Work; and
|
|
||||||
|
|
||||||
(b) under Patents Claims infringed by the making, using or
|
|
||||||
selling of Original Code, to make, have made, use, practice,
|
|
||||||
sell, and offer for sale, and/or otherwise dispose of the
|
|
||||||
Original Code (or portions thereof).
|
|
||||||
|
|
||||||
(c) the licenses granted in this Section 2.1(a) and (b) are
|
|
||||||
effective on the date Initial Developer first distributes
|
|
||||||
Original Code under the terms of this License.
|
|
||||||
|
|
||||||
(d) Notwithstanding Section 2.1(b) above, no patent license is
|
|
||||||
granted: 1) for code that You delete from the Original Code; 2)
|
|
||||||
separate from the Original Code; or 3) for infringements caused
|
|
||||||
by: i) the modification of the Original Code or ii) the
|
|
||||||
combination of the Original Code with other software or devices.
|
|
||||||
|
|
||||||
2.2. Contributor Grant.
|
|
||||||
Subject to third party intellectual property claims, each Contributor
|
|
||||||
hereby grants You a world-wide, royalty-free, non-exclusive license
|
|
||||||
|
|
||||||
(a) under intellectual property rights (other than patent or
|
|
||||||
trademark) Licensable by Contributor, to use, reproduce, modify,
|
|
||||||
display, perform, sublicense and distribute the Modifications
|
|
||||||
created by such Contributor (or portions thereof) either on an
|
|
||||||
unmodified basis, with other Modifications, as Covered Code
|
|
||||||
and/or as part of a Larger Work; and
|
|
||||||
|
|
||||||
(b) under Patent Claims infringed by the making, using, or
|
|
||||||
selling of Modifications made by that Contributor either alone
|
|
||||||
and/or in combination with its Contributor Version (or portions
|
|
||||||
of such combination), to make, use, sell, offer for sale, have
|
|
||||||
made, and/or otherwise dispose of: 1) Modifications made by that
|
|
||||||
Contributor (or portions thereof); and 2) the combination of
|
|
||||||
Modifications made by that Contributor with its Contributor
|
|
||||||
Version (or portions of such combination).
|
|
||||||
|
|
||||||
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
|
|
||||||
effective on the date Contributor first makes Commercial Use of
|
|
||||||
the Covered Code.
|
|
||||||
|
|
||||||
(d) Notwithstanding Section 2.2(b) above, no patent license is
|
|
||||||
granted: 1) for any code that Contributor has deleted from the
|
|
||||||
Contributor Version; 2) separate from the Contributor Version;
|
|
||||||
3) for infringements caused by: i) third party modifications of
|
|
||||||
Contributor Version or ii) the combination of Modifications made
|
|
||||||
by that Contributor with other software (except as part of the
|
|
||||||
Contributor Version) or other devices; or 4) under Patent Claims
|
|
||||||
infringed by Covered Code in the absence of Modifications made by
|
|
||||||
that Contributor.
|
|
||||||
|
|
||||||
3. Distribution Obligations.
|
|
||||||
|
|
||||||
3.1. Application of License.
|
|
||||||
The Modifications which You create or to which You contribute are
|
|
||||||
governed by the terms of this License, including without limitation
|
|
||||||
Section 2.2. The Source Code version of Covered Code may be
|
|
||||||
distributed only under the terms of this License or a future version
|
|
||||||
of this License released under Section 6.1, and You must include a
|
|
||||||
copy of this License with every copy of the Source Code You
|
|
||||||
distribute. You may not offer or impose any terms on any Source Code
|
|
||||||
version that alters or restricts the applicable version of this
|
|
||||||
License or the recipients' rights hereunder. However, You may include
|
|
||||||
an additional document offering the additional rights described in
|
|
||||||
Section 3.5.
|
|
||||||
|
|
||||||
3.2. Availability of Source Code.
|
|
||||||
Any Modification which You create or to which You contribute must be
|
|
||||||
made available in Source Code form under the terms of this License
|
|
||||||
either on the same media as an Executable version or via an accepted
|
|
||||||
Electronic Distribution Mechanism to anyone to whom you made an
|
|
||||||
Executable version available; and if made available via Electronic
|
|
||||||
Distribution Mechanism, must remain available for at least twelve (12)
|
|
||||||
months after the date it initially became available, or at least six
|
|
||||||
(6) months after a subsequent version of that particular Modification
|
|
||||||
has been made available to such recipients. You are responsible for
|
|
||||||
ensuring that the Source Code version remains available even if the
|
|
||||||
Electronic Distribution Mechanism is maintained by a third party.
|
|
||||||
|
|
||||||
3.3. Description of Modifications.
|
|
||||||
You must cause all Covered Code to which You contribute to contain a
|
|
||||||
file documenting the changes You made to create that Covered Code and
|
|
||||||
the date of any change. You must include a prominent statement that
|
|
||||||
the Modification is derived, directly or indirectly, from Original
|
|
||||||
Code provided by the Initial Developer and including the name of the
|
|
||||||
Initial Developer in (a) the Source Code, and (b) in any notice in an
|
|
||||||
Executable version or related documentation in which You describe the
|
|
||||||
origin or ownership of the Covered Code.
|
|
||||||
|
|
||||||
3.4. Intellectual Property Matters
|
|
||||||
(a) Third Party Claims.
|
|
||||||
If Contributor has knowledge that a license under a third party's
|
|
||||||
intellectual property rights is required to exercise the rights
|
|
||||||
granted by such Contributor under Sections 2.1 or 2.2,
|
|
||||||
Contributor must include a text file with the Source Code
|
|
||||||
distribution titled "LEGAL" which describes the claim and the
|
|
||||||
party making the claim in sufficient detail that a recipient will
|
|
||||||
know whom to contact. If Contributor obtains such knowledge after
|
|
||||||
the Modification is made available as described in Section 3.2,
|
|
||||||
Contributor shall promptly modify the LEGAL file in all copies
|
|
||||||
Contributor makes available thereafter and shall take other steps
|
|
||||||
(such as notifying appropriate mailing lists or newsgroups)
|
|
||||||
reasonably calculated to inform those who received the Covered
|
|
||||||
Code that new knowledge has been obtained.
|
|
||||||
|
|
||||||
(b) Contributor APIs.
|
|
||||||
If Contributor's Modifications include an application programming
|
|
||||||
interface and Contributor has knowledge of patent licenses which
|
|
||||||
are reasonably necessary to implement that API, Contributor must
|
|
||||||
also include this information in the LEGAL file.
|
|
||||||
|
|
||||||
(c) Representations.
|
|
||||||
Contributor represents that, except as disclosed pursuant to
|
|
||||||
Section 3.4(a) above, Contributor believes that Contributor's
|
|
||||||
Modifications are Contributor's original creation(s) and/or
|
|
||||||
Contributor has sufficient rights to grant the rights conveyed by
|
|
||||||
this License.
|
|
||||||
|
|
||||||
3.5. Required Notices.
|
|
||||||
You must duplicate the notice in Exhibit A in each file of the Source
|
|
||||||
Code. If it is not possible to put such notice in a particular Source
|
|
||||||
Code file due to its structure, then You must include such notice in a
|
|
||||||
location (such as a relevant directory) where a user would be likely
|
|
||||||
to look for such a notice. If You created one or more Modification(s)
|
|
||||||
You may add your name as a Contributor to the notice described in
|
|
||||||
Exhibit A. You must also duplicate this License in any documentation
|
|
||||||
for the Source Code where You describe recipients' rights or ownership
|
|
||||||
rights relating to Covered Code. You may choose to offer, and to
|
|
||||||
charge a fee for, warranty, support, indemnity or liability
|
|
||||||
obligations to one or more recipients of Covered Code. However, You
|
|
||||||
may do so only on Your own behalf, and not on behalf of the Initial
|
|
||||||
Developer or any Contributor. You must make it absolutely clear than
|
|
||||||
any such warranty, support, indemnity or liability obligation is
|
|
||||||
offered by You alone, and You hereby agree to indemnify the Initial
|
|
||||||
Developer and every Contributor for any liability incurred by the
|
|
||||||
Initial Developer or such Contributor as a result of warranty,
|
|
||||||
support, indemnity or liability terms You offer.
|
|
||||||
|
|
||||||
3.6. Distribution of Executable Versions.
|
|
||||||
You may distribute Covered Code in Executable form only if the
|
|
||||||
requirements of Section 3.1-3.5 have been met for that Covered Code,
|
|
||||||
and if You include a notice stating that the Source Code version of
|
|
||||||
the Covered Code is available under the terms of this License,
|
|
||||||
including a description of how and where You have fulfilled the
|
|
||||||
obligations of Section 3.2. The notice must be conspicuously included
|
|
||||||
in any notice in an Executable version, related documentation or
|
|
||||||
collateral in which You describe recipients' rights relating to the
|
|
||||||
Covered Code. You may distribute the Executable version of Covered
|
|
||||||
Code or ownership rights under a license of Your choice, which may
|
|
||||||
contain terms different from this License, provided that You are in
|
|
||||||
compliance with the terms of this License and that the license for the
|
|
||||||
Executable version does not attempt to limit or alter the recipient's
|
|
||||||
rights in the Source Code version from the rights set forth in this
|
|
||||||
License. If You distribute the Executable version under a different
|
|
||||||
license You must make it absolutely clear that any terms which differ
|
|
||||||
from this License are offered by You alone, not by the Initial
|
|
||||||
Developer or any Contributor. You hereby agree to indemnify the
|
|
||||||
Initial Developer and every Contributor for any liability incurred by
|
|
||||||
the Initial Developer or such Contributor as a result of any such
|
|
||||||
terms You offer.
|
|
||||||
|
|
||||||
3.7. Larger Works.
|
|
||||||
You may create a Larger Work by combining Covered Code with other code
|
|
||||||
not governed by the terms of this License and distribute the Larger
|
|
||||||
Work as a single product. In such a case, You must make sure the
|
|
||||||
requirements of this License are fulfilled for the Covered Code.
|
|
||||||
|
|
||||||
4. Inability to Comply Due to Statute or Regulation.
|
|
||||||
|
|
||||||
If it is impossible for You to comply with any of the terms of this
|
|
||||||
License with respect to some or all of the Covered Code due to
|
|
||||||
statute, judicial order, or regulation then You must: (a) comply with
|
|
||||||
the terms of this License to the maximum extent possible; and (b)
|
|
||||||
describe the limitations and the code they affect. Such description
|
|
||||||
must be included in the LEGAL file described in Section 3.4 and must
|
|
||||||
be included with all distributions of the Source Code. Except to the
|
|
||||||
extent prohibited by statute or regulation, such description must be
|
|
||||||
sufficiently detailed for a recipient of ordinary skill to be able to
|
|
||||||
understand it.
|
|
||||||
|
|
||||||
5. Application of this License.
|
|
||||||
|
|
||||||
This License applies to code to which the Initial Developer has
|
|
||||||
attached the notice in Exhibit A and to related Covered Code.
|
|
||||||
|
|
||||||
6. Versions of the License.
|
|
||||||
|
|
||||||
6.1. New Versions.
|
|
||||||
Netscape Communications Corporation ("Netscape") may publish revised
|
|
||||||
and/or new versions of the License from time to time. Each version
|
|
||||||
will be given a distinguishing version number.
|
|
||||||
|
|
||||||
6.2. Effect of New Versions.
|
|
||||||
Once Covered Code has been published under a particular version of the
|
|
||||||
License, You may always continue to use it under the terms of that
|
|
||||||
version. You may also choose to use such Covered Code under the terms
|
|
||||||
of any subsequent version of the License published by Netscape. No one
|
|
||||||
other than Netscape has the right to modify the terms applicable to
|
|
||||||
Covered Code created under this License.
|
|
||||||
|
|
||||||
6.3. Derivative Works.
|
|
||||||
If You create or use a modified version of this License (which you may
|
|
||||||
only do in order to apply it to code which is not already Covered Code
|
|
||||||
governed by this License), You must (a) rename Your license so that
|
|
||||||
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
|
|
||||||
"MPL", "NPL" or any confusingly similar phrase do not appear in your
|
|
||||||
license (except to note that your license differs from this License)
|
|
||||||
and (b) otherwise make it clear that Your version of the license
|
|
||||||
contains terms which differ from the Mozilla Public License and
|
|
||||||
Netscape Public License. (Filling in the name of the Initial
|
|
||||||
Developer, Original Code or Contributor in the notice described in
|
|
||||||
Exhibit A shall not of themselves be deemed to be modifications of
|
|
||||||
this License.)
|
|
||||||
|
|
||||||
7. DISCLAIMER OF WARRANTY.
|
|
||||||
|
|
||||||
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
|
||||||
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
|
|
||||||
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
|
|
||||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
|
|
||||||
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
|
|
||||||
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
|
|
||||||
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
|
|
||||||
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
|
|
||||||
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
|
||||||
|
|
||||||
8. TERMINATION.
|
|
||||||
|
|
||||||
8.1. This License and the rights granted hereunder will terminate
|
|
||||||
automatically if You fail to comply with terms herein and fail to cure
|
|
||||||
such breach within 30 days of becoming aware of the breach. All
|
|
||||||
sublicenses to the Covered Code which are properly granted shall
|
|
||||||
survive any termination of this License. Provisions which, by their
|
|
||||||
nature, must remain in effect beyond the termination of this License
|
|
||||||
shall survive.
|
|
||||||
|
|
||||||
8.2. If You initiate litigation by asserting a patent infringement
|
|
||||||
claim (excluding declatory judgment actions) against Initial Developer
|
|
||||||
or a Contributor (the Initial Developer or Contributor against whom
|
|
||||||
You file such action is referred to as "Participant") alleging that:
|
|
||||||
|
|
||||||
(a) such Participant's Contributor Version directly or indirectly
|
|
||||||
infringes any patent, then any and all rights granted by such
|
|
||||||
Participant to You under Sections 2.1 and/or 2.2 of this License
|
|
||||||
shall, upon 60 days notice from Participant terminate prospectively,
|
|
||||||
unless if within 60 days after receipt of notice You either: (i)
|
|
||||||
agree in writing to pay Participant a mutually agreeable reasonable
|
|
||||||
royalty for Your past and future use of Modifications made by such
|
|
||||||
Participant, or (ii) withdraw Your litigation claim with respect to
|
|
||||||
the Contributor Version against such Participant. If within 60 days
|
|
||||||
of notice, a reasonable royalty and payment arrangement are not
|
|
||||||
mutually agreed upon in writing by the parties or the litigation claim
|
|
||||||
is not withdrawn, the rights granted by Participant to You under
|
|
||||||
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
|
|
||||||
the 60 day notice period specified above.
|
|
||||||
|
|
||||||
(b) any software, hardware, or device, other than such Participant's
|
|
||||||
Contributor Version, directly or indirectly infringes any patent, then
|
|
||||||
any rights granted to You by such Participant under Sections 2.1(b)
|
|
||||||
and 2.2(b) are revoked effective as of the date You first made, used,
|
|
||||||
sold, distributed, or had made, Modifications made by that
|
|
||||||
Participant.
|
|
||||||
|
|
||||||
8.3. If You assert a patent infringement claim against Participant
|
|
||||||
alleging that such Participant's Contributor Version directly or
|
|
||||||
indirectly infringes any patent where such claim is resolved (such as
|
|
||||||
by license or settlement) prior to the initiation of patent
|
|
||||||
infringement litigation, then the reasonable value of the licenses
|
|
||||||
granted by such Participant under Sections 2.1 or 2.2 shall be taken
|
|
||||||
into account in determining the amount or value of any payment or
|
|
||||||
license.
|
|
||||||
|
|
||||||
8.4. In the event of termination under Sections 8.1 or 8.2 above,
|
|
||||||
all end user license agreements (excluding distributors and resellers)
|
|
||||||
which have been validly granted by You or any distributor hereunder
|
|
||||||
prior to termination shall survive termination.
|
|
||||||
|
|
||||||
9. LIMITATION OF LIABILITY.
|
|
||||||
|
|
||||||
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
|
|
||||||
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
|
|
||||||
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
|
|
||||||
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
|
|
||||||
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
|
|
||||||
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
|
|
||||||
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
|
|
||||||
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
|
|
||||||
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
|
|
||||||
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
|
|
||||||
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
|
|
||||||
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
|
|
||||||
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
|
|
||||||
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
|
|
||||||
|
|
||||||
10. U.S. GOVERNMENT END USERS.
|
|
||||||
|
|
||||||
The Covered Code is a "commercial item," as that term is defined in
|
|
||||||
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
|
|
||||||
software" and "commercial computer software documentation," as such
|
|
||||||
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
|
|
||||||
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
|
|
||||||
all U.S. Government End Users acquire Covered Code with only those
|
|
||||||
rights set forth herein.
|
|
||||||
|
|
||||||
11. MISCELLANEOUS.
|
|
||||||
|
|
||||||
This License represents the complete agreement concerning subject
|
|
||||||
matter hereof. If any provision of this License is held to be
|
|
||||||
unenforceable, such provision shall be reformed only to the extent
|
|
||||||
necessary to make it enforceable. This License shall be governed by
|
|
||||||
California law provisions (except to the extent applicable law, if
|
|
||||||
any, provides otherwise), excluding its conflict-of-law provisions.
|
|
||||||
With respect to disputes in which at least one party is a citizen of,
|
|
||||||
or an entity chartered or registered to do business in the United
|
|
||||||
States of America, any litigation relating to this License shall be
|
|
||||||
subject to the jurisdiction of the Federal Courts of the Northern
|
|
||||||
District of California, with venue lying in Santa Clara County,
|
|
||||||
California, with the losing party responsible for costs, including
|
|
||||||
without limitation, court costs and reasonable attorneys' fees and
|
|
||||||
expenses. The application of the United Nations Convention on
|
|
||||||
Contracts for the International Sale of Goods is expressly excluded.
|
|
||||||
Any law or regulation which provides that the language of a contract
|
|
||||||
shall be construed against the drafter shall not apply to this
|
|
||||||
License.
|
|
||||||
|
|
||||||
12. RESPONSIBILITY FOR CLAIMS.
|
|
||||||
|
|
||||||
As between Initial Developer and the Contributors, each party is
|
|
||||||
responsible for claims and damages arising, directly or indirectly,
|
|
||||||
out of its utilization of rights under this License and You agree to
|
|
||||||
work with Initial Developer and Contributors to distribute such
|
|
||||||
responsibility on an equitable basis. Nothing herein is intended or
|
|
||||||
shall be deemed to constitute any admission of liability.
|
|
||||||
|
|
||||||
13. MULTIPLE-LICENSED CODE.
|
|
||||||
|
|
||||||
Initial Developer may designate portions of the Covered Code as
|
|
||||||
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
|
|
||||||
Developer permits you to utilize portions of the Covered Code under
|
|
||||||
Your choice of the NPL or the alternative licenses, if any, specified
|
|
||||||
by the Initial Developer in the file described in Exhibit A.
|
|
||||||
|
|
||||||
EXHIBIT A -Mozilla Public License.
|
|
||||||
|
|
||||||
``The contents of this file are subject to the Mozilla Public License
|
|
||||||
Version 1.1 (the "License"); you may not use this file except in
|
|
||||||
compliance with the License. You may obtain a copy of the License at
|
|
||||||
http://www.mozilla.org/MPL/
|
|
||||||
|
|
||||||
Software distributed under the License is distributed on an "AS IS"
|
|
||||||
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
|
||||||
License for the specific language governing rights and limitations
|
|
||||||
under the License.
|
|
||||||
|
|
||||||
The Original Code is ______________________________________.
|
|
||||||
|
|
||||||
The Initial Developer of the Original Code is ________________________.
|
|
||||||
Portions created by ______________________ are Copyright (C) ______
|
|
||||||
_______________________. All Rights Reserved.
|
|
||||||
|
|
||||||
Contributor(s): ______________________________________.
|
|
||||||
|
|
||||||
Alternatively, the contents of this file may be used under the terms
|
|
||||||
of the _____ license (the "[___] License"), in which case the
|
|
||||||
provisions of [______] License are applicable instead of those
|
|
||||||
above. If you wish to allow use of your version of this file only
|
|
||||||
under the terms of the [____] License and not to allow others to use
|
|
||||||
your version of this file under the MPL, indicate your decision by
|
|
||||||
deleting the provisions above and replace them with the notice and
|
|
||||||
other provisions required by the [___] License. If you do not delete
|
|
||||||
the provisions above, a recipient may use your version of this file
|
|
||||||
under either the MPL or the [___] License."
|
|
||||||
|
|
||||||
[NOTE: The text of this Exhibit A may differ slightly from the text of
|
|
||||||
the notices in the Source Code files of the Original Code. You should
|
|
||||||
use the text of this Exhibit A rather than the text found in the
|
|
||||||
Original Code Source Code for Your Modifications.]
|
|
||||||
|
|
21
Makefile.am
21
Makefile.am
@@ -4,24 +4,32 @@
|
|||||||
|
|
||||||
AUTOMAKE_OPTIONS = foreign
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
EXTRA_DIST = CHANGES COPYING maketgz UPGRADE reconf Makefile.dist \
|
EXTRA_DIST = CHANGES COPYING maketgz reconf Makefile.dist \
|
||||||
curl-config.in build_vms.com curl-mode.el
|
curl-config.in build_vms.com curl-style.el sample.emacs testcurl.sh
|
||||||
|
|
||||||
bin_SCRIPTS = curl-config
|
bin_SCRIPTS = curl-config
|
||||||
|
|
||||||
SUBDIRS = docs lib src include tests packages
|
SUBDIRS = lib src
|
||||||
|
DIST_SUBDIRS = $(SUBDIRS) tests include packages docs
|
||||||
|
|
||||||
# create a root makefile in the distribution:
|
# create a root makefile in the distribution:
|
||||||
dist-hook:
|
dist-hook:
|
||||||
|
rm -rf $(top_builddir)/tests/log
|
||||||
cp $(srcdir)/Makefile.dist $(distdir)/Makefile
|
cp $(srcdir)/Makefile.dist $(distdir)/Makefile
|
||||||
|
|
||||||
html:
|
html:
|
||||||
cd docs; make html
|
cd docs; make html
|
||||||
|
|
||||||
|
pdf:
|
||||||
|
cd docs; make pdf
|
||||||
|
|
||||||
check: test
|
check: test
|
||||||
|
|
||||||
test:
|
test:
|
||||||
@(cd tests; $(MAKE) quiet-test)
|
@(cd tests; $(MAKE) all quiet-test)
|
||||||
|
|
||||||
|
test-full:
|
||||||
|
@(cd tests; $(MAKE) all full-test)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros
|
# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros
|
||||||
@@ -70,3 +78,8 @@ pkgadd:
|
|||||||
# resulting .tar.bz2 file will end up at packages/Win32/cygwin
|
# resulting .tar.bz2 file will end up at packages/Win32/cygwin
|
||||||
cygwinbin:
|
cygwinbin:
|
||||||
$(MAKE) -C packages/Win32/cygwin cygwinbin
|
$(MAKE) -C packages/Win32/cygwin cygwinbin
|
||||||
|
|
||||||
|
# We extend the standard install with a custom hook:
|
||||||
|
install-data-hook:
|
||||||
|
cd include && $(MAKE) install
|
||||||
|
cd docs && $(MAKE) install
|
||||||
|
@@ -59,6 +59,10 @@ vc-ssl-dll:
|
|||||||
cd ..\src
|
cd ..\src
|
||||||
nmake -f Makefile.vc6
|
nmake -f Makefile.vc6
|
||||||
|
|
||||||
|
djgpp:
|
||||||
|
make -C lib -f Makefile.dj
|
||||||
|
make -C src -f Makefile.dj
|
||||||
|
|
||||||
cygwin:
|
cygwin:
|
||||||
./configure
|
./configure
|
||||||
make
|
make
|
||||||
|
39
README
39
README
@@ -11,39 +11,58 @@ README
|
|||||||
MANUAL document. Find out how to install Curl by reading the INSTALL
|
MANUAL document. Find out how to install Curl by reading the INSTALL
|
||||||
document.
|
document.
|
||||||
|
|
||||||
libcurl is a library that Curl is using to do its job. It is readily
|
libcurl is the library curl is using to do its job. It is readily
|
||||||
available to be used by your software. Read the libcurl.3 man page to
|
available to be used by your software. Read the libcurl.3 man page to
|
||||||
find out how!
|
learn how!
|
||||||
|
|
||||||
You find answers to the most frequent questions we get in the FAQ document.
|
You find answers to the most frequent questions we get in the FAQ document.
|
||||||
|
|
||||||
Study the LEGAL file for distribution terms and similar.
|
Study the COPYING file for distribution terms and similar.
|
||||||
|
|
||||||
Visit the curl web site or mirror for the latest news:
|
CONTACT
|
||||||
|
|
||||||
http://curl.haxx.se/
|
If you have problems, questions, ideas or suggestions, please contact us
|
||||||
http://curl.sf.net/
|
by posting to a suitable mailing list. See http://curl.haxx.se/mail/
|
||||||
|
|
||||||
|
Many major contributors to the project are listed in the THANKS document.
|
||||||
|
|
||||||
|
WEB SITE
|
||||||
|
|
||||||
|
Visit the curl web site or mirrors for the latest news:
|
||||||
|
|
||||||
|
Sweden -- http://curl.haxx.se/
|
||||||
|
US -- http://curl.sf.net/
|
||||||
|
Australia -- http://curl.planetmirror.com/
|
||||||
|
|
||||||
|
DOWNLOAD
|
||||||
|
|
||||||
The official download mirror sites are:
|
The official download mirror sites are:
|
||||||
|
|
||||||
Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/
|
Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/
|
||||||
Sweden -- http://cool.haxx.se/curl/
|
Sweden -- http://cool.haxx.se/curl/
|
||||||
Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
|
Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
|
||||||
|
Australia -- http://curl.planetmirror.com/download/
|
||||||
|
US -- http://curl.sourceforge.net/download/
|
||||||
|
Hongkong -- http://www.execve.net/curl/
|
||||||
|
|
||||||
|
CVS
|
||||||
|
|
||||||
To download the very latest source off the CVS server do this:
|
To download the very latest source off the CVS server do this:
|
||||||
|
|
||||||
cvs -d :pserver:anonymous@cvs.curl.sourceforge.net:/cvsroot/curl login
|
cvs -d :pserver:cvsread@cvs.php.net:/repository login
|
||||||
|
|
||||||
(just press enter when asked for password)
|
(enter "phpfi" when asked for password)
|
||||||
|
|
||||||
cvs -d :pserver:anonymous@cvs.curl.sourceforge.net:/cvsroot/curl co curl
|
cvs -d :pserver:cvsread@cvs.php.net:/repository co curl
|
||||||
|
|
||||||
(you'll get a directory named curl created, filled with the source code)
|
(you'll get a directory named curl created, filled with the source code)
|
||||||
|
|
||||||
cvs -d :pserver:anonymous@cvs.curl.sourceforge.net:/cvsroot/curl logout
|
cvs -d :pserver:cvsread@cvs.php.net:/repository logout
|
||||||
|
|
||||||
(you're off the hook!)
|
(you're off the hook!)
|
||||||
|
|
||||||
|
NOTICE
|
||||||
|
|
||||||
Curl contains pieces of source code that is Copyright (c) 1998, 1999
|
Curl contains pieces of source code that is Copyright (c) 1998, 1999
|
||||||
Kungliga Tekniska H<>gskolan. This notice is included here to comply with the
|
Kungliga Tekniska H<>gskolan. This notice is included here to comply with the
|
||||||
distribution terms.
|
distribution terms.
|
||||||
|
34
UPGRADE
34
UPGRADE
@@ -1,34 +0,0 @@
|
|||||||
Upgrading to curl/libcurl 7.10 from any previous version
|
|
||||||
========================================================
|
|
||||||
|
|
||||||
libcurl 7.10 performs peer SSL certificate verification by default. This is
|
|
||||||
done by installing a default CA cert bundle on 'make install' (or similar),
|
|
||||||
that CA bundle package is used by default on operations against SSL servers.
|
|
||||||
|
|
||||||
Alas, if you communicate with HTTPS servers using certifcates that are signed
|
|
||||||
by CAs present in the bundle, you will not notice any changed behavior and you
|
|
||||||
will seeminglessly get a higher security level on your SSL connections since
|
|
||||||
can be sure that the remote server really is the one it claims to be.
|
|
||||||
|
|
||||||
If the remote server uses a self-signed certificate, or if you don't install
|
|
||||||
curl's CA cert bundle or if it uses a certificate signed by a CA that isn't
|
|
||||||
included in the bundle, then you need to do one of the following:
|
|
||||||
|
|
||||||
1. Tell libcurl to *not* verify the peer. With libcurl you disable with with
|
|
||||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
|
|
||||||
|
|
||||||
With the curl command tool, you disable this with -k/--insecure.
|
|
||||||
|
|
||||||
2. Get a CA certificate that can verify the remote server and use the proper
|
|
||||||
option to point out this CA cert for verification when connecting. For
|
|
||||||
libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath);
|
|
||||||
|
|
||||||
With the curl command tool: --cacert [file]
|
|
||||||
|
|
||||||
This upgrade procedure has been deemed The Right Thing even though it adds
|
|
||||||
this extra trouble for some users, since it adds security to a majority of the
|
|
||||||
SSL connections that previously weren't really secure.
|
|
||||||
|
|
||||||
It turned out many people were using previous versions of curl/libcurl without
|
|
||||||
realizing the need for the CA cert options to get truly secure SSL
|
|
||||||
connections.
|
|
90
acconfig.h
90
acconfig.h
@@ -1,90 +0,0 @@
|
|||||||
/* Name of this package! */
|
|
||||||
#undef PACKAGE
|
|
||||||
|
|
||||||
/* Version number of this archive. */
|
|
||||||
#undef VERSION
|
|
||||||
|
|
||||||
/* Define if you have the getpass function. */
|
|
||||||
#undef HAVE_GETPASS
|
|
||||||
|
|
||||||
/* Define cpu-machine-OS */
|
|
||||||
#undef OS
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyaddr_r() function with 5 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYADDR_R_5
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyaddr_r() function with 7 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYADDR_R_7
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyaddr_r() function with 8 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYADDR_R_8
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyname_r() function with 3 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYNAME_R_3
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyname_r() function with 5 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYNAME_R_5
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyname_r() function with 6 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYNAME_R_6
|
|
||||||
|
|
||||||
/* Define if you have the inet_ntoa_r function declared. */
|
|
||||||
#undef HAVE_INET_NTOA_R_DECL
|
|
||||||
|
|
||||||
/* Define if you need the _REENTRANT define for some functions */
|
|
||||||
#undef NEED_REENTRANT
|
|
||||||
|
|
||||||
/* Define if you have the Kerberos4 libraries (including -ldes) */
|
|
||||||
#undef KRB4
|
|
||||||
|
|
||||||
/* Define if you want to enable IPv6 support */
|
|
||||||
#undef ENABLE_IPV6
|
|
||||||
|
|
||||||
/* Define this to 'int' if ssize_t is not an available typedefed type */
|
|
||||||
#undef ssize_t
|
|
||||||
|
|
||||||
/* Define this to 'int' if socklen_t is not an available typedefed type */
|
|
||||||
#undef socklen_t
|
|
||||||
|
|
||||||
/* Define this as a suitable file to read random data from */
|
|
||||||
#undef RANDOM_FILE
|
|
||||||
|
|
||||||
/* Define this to your Entropy Gathering Daemon socket pathname */
|
|
||||||
#undef EGD_SOCKET
|
|
||||||
|
|
||||||
/* Define if you have a working OpenSSL installation */
|
|
||||||
#undef OPENSSL_ENABLED
|
|
||||||
|
|
||||||
/* Define the one correct non-blocking socket method below */
|
|
||||||
#undef HAVE_FIONBIO
|
|
||||||
#undef HAVE_IOCTLSOCKET
|
|
||||||
#undef HAVE_IOCTLSOCKET_CASE
|
|
||||||
#undef HAVE_O_NONBLOCK
|
|
||||||
#undef HAVE_DISABLED_NONBLOCKING
|
|
||||||
|
|
||||||
/* Define this to 'int' if in_addr_t is not an available typedefed type */
|
|
||||||
#undef in_addr_t
|
|
||||||
|
|
||||||
/* Define to disable DICT */
|
|
||||||
#undef CURL_DISABLE_DICT
|
|
||||||
|
|
||||||
/* Define to disable FILE */
|
|
||||||
#undef CURL_DISABLE_FILE
|
|
||||||
|
|
||||||
/* Define to disable FTP */
|
|
||||||
#undef CURL_DISABLE_FTP
|
|
||||||
|
|
||||||
/* Define to disable GOPHER */
|
|
||||||
#undef CURL_DISABLE_GOPHER
|
|
||||||
|
|
||||||
/* Define to disable HTTP */
|
|
||||||
#undef CURL_DISABLE_HTTP
|
|
||||||
|
|
||||||
/* Define to disable LDAP */
|
|
||||||
#undef CURL_DISABLE_LDAP
|
|
||||||
|
|
||||||
/* Define to disable TELNET */
|
|
||||||
#undef CURL_DISABLE_TELNET
|
|
||||||
|
|
||||||
/* Define if you have zlib present */
|
|
||||||
#undef HAVE_LIBZ
|
|
40
acinclude.m4
40
acinclude.m4
@@ -38,7 +38,7 @@ AC_DEFUN(CURL_CHECK_NONBLOCKING_SOCKET,
|
|||||||
],[
|
],[
|
||||||
dnl the O_NONBLOCK test was fine
|
dnl the O_NONBLOCK test was fine
|
||||||
nonblock="O_NONBLOCK"
|
nonblock="O_NONBLOCK"
|
||||||
AC_DEFINE(HAVE_O_NONBLOCK)
|
AC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets])
|
||||||
],[
|
],[
|
||||||
dnl the code was bad, try a different program now, test 2
|
dnl the code was bad, try a different program now, test 2
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ dnl the code was bad, try a different program now, test 2
|
|||||||
],[
|
],[
|
||||||
dnl FIONBIO test was good
|
dnl FIONBIO test was good
|
||||||
nonblock="FIONBIO"
|
nonblock="FIONBIO"
|
||||||
AC_DEFINE(HAVE_FIONBIO)
|
AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])
|
||||||
],[
|
],[
|
||||||
dnl FIONBIO test was also bad
|
dnl FIONBIO test was also bad
|
||||||
dnl the code was bad, try a different program now, test 3
|
dnl the code was bad, try a different program now, test 3
|
||||||
@@ -66,7 +66,7 @@ dnl the code was bad, try a different program now, test 3
|
|||||||
],[
|
],[
|
||||||
dnl ioctlsocket test was good
|
dnl ioctlsocket test was good
|
||||||
nonblock="ioctlsocket"
|
nonblock="ioctlsocket"
|
||||||
AC_DEFINE(HAVE_IOCTLSOCKET)
|
AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])
|
||||||
],[
|
],[
|
||||||
dnl ioctlsocket didnt compile!
|
dnl ioctlsocket didnt compile!
|
||||||
|
|
||||||
@@ -79,11 +79,11 @@ dnl ioctlsocket didnt compile!
|
|||||||
],[
|
],[
|
||||||
dnl ioctlsocket test was good
|
dnl ioctlsocket test was good
|
||||||
nonblock="IoctlSocket"
|
nonblock="IoctlSocket"
|
||||||
AC_DEFINE(HAVE_IOCTLSOCKET_CASE)
|
AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])
|
||||||
],[
|
],[
|
||||||
dnl ioctlsocket didnt compile!
|
dnl ioctlsocket didnt compile!
|
||||||
nonblock="nada"
|
nonblock="nada"
|
||||||
AC_DEFINE(HAVE_DISABLED_NONBLOCKING)
|
AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])
|
||||||
])
|
])
|
||||||
dnl end of forth test
|
dnl end of forth test
|
||||||
|
|
||||||
@@ -152,10 +152,8 @@ AC_DEFUN([TYPE_IN_ADDR_T],
|
|||||||
AC_MSG_CHECKING([for in_addr_t equivalent])
|
AC_MSG_CHECKING([for in_addr_t equivalent])
|
||||||
AC_CACHE_VAL([curl_cv_in_addr_t_equiv],
|
AC_CACHE_VAL([curl_cv_in_addr_t_equiv],
|
||||||
[
|
[
|
||||||
# Systems have either "struct sockaddr *" or
|
|
||||||
# "void *" as the second argument to getpeername
|
|
||||||
curl_cv_in_addr_t_equiv=
|
curl_cv_in_addr_t_equiv=
|
||||||
for t in int size_t unsigned long "unsigned long"; do
|
for t in "unsigned long" int size_t unsigned long; do
|
||||||
AC_TRY_COMPILE([
|
AC_TRY_COMPILE([
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
@@ -272,15 +270,15 @@ AC_DEFUN(CURL_CHECK_INET_NTOA_R,
|
|||||||
AC_MSG_CHECKING(whether inet_ntoa_r is declared)
|
AC_MSG_CHECKING(whether inet_ntoa_r is declared)
|
||||||
AC_EGREP_CPP(inet_ntoa_r,[
|
AC_EGREP_CPP(inet_ntoa_r,[
|
||||||
#include <arpa/inet.h>],[
|
#include <arpa/inet.h>],[
|
||||||
AC_DEFINE(HAVE_INET_NTOA_R_DECL)
|
AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
|
||||||
AC_MSG_RESULT(yes)],[
|
AC_MSG_RESULT(yes)],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared)
|
AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared)
|
||||||
AC_EGREP_CPP(inet_ntoa_r,[
|
AC_EGREP_CPP(inet_ntoa_r,[
|
||||||
#define _REENTRANT
|
#define _REENTRANT
|
||||||
#include <arpa/inet.h>],[
|
#include <arpa/inet.h>],[
|
||||||
AC_DEFINE(HAVE_INET_NTOA_R_DECL)
|
AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
|
||||||
AC_DEFINE(NEED_REENTRANT)
|
AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT defined])
|
||||||
AC_MSG_RESULT(yes)],
|
AC_MSG_RESULT(yes)],
|
||||||
AC_MSG_RESULT(no))])])
|
AC_MSG_RESULT(no))])])
|
||||||
])
|
])
|
||||||
@@ -302,7 +300,7 @@ struct hostent_data hdata;
|
|||||||
int rc;
|
int rc;
|
||||||
rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
|
rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYADDR_R_5)
|
AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
|
||||||
ac_cv_gethostbyaddr_args=5],[
|
ac_cv_gethostbyaddr_args=5],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments)
|
AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments)
|
||||||
@@ -318,8 +316,8 @@ struct hostent_data hdata;
|
|||||||
int rc;
|
int rc;
|
||||||
rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
|
rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYADDR_R_5)
|
AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
|
||||||
AC_DEFINE(NEED_REENTRANT)
|
AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT])
|
||||||
ac_cv_gethostbyaddr_args=5],[
|
ac_cv_gethostbyaddr_args=5],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments)
|
AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments)
|
||||||
@@ -337,7 +335,7 @@ struct hostent * hp;
|
|||||||
hp = gethostbyaddr_r(address, length, type, &h,
|
hp = gethostbyaddr_r(address, length, type, &h,
|
||||||
buffer, 8192, &h_errnop);],[
|
buffer, 8192, &h_errnop);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYADDR_R_7)
|
AC_DEFINE(HAVE_GETHOSTBYADDR_R_7, 1, [gethostbyaddr_r() takes 7 args] )
|
||||||
ac_cv_gethostbyaddr_args=7],[
|
ac_cv_gethostbyaddr_args=7],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments)
|
AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments)
|
||||||
@@ -356,7 +354,7 @@ int rc;
|
|||||||
rc = gethostbyaddr_r(address, length, type, &h,
|
rc = gethostbyaddr_r(address, length, type, &h,
|
||||||
buffer, 8192, &hp, &h_errnop);],[
|
buffer, 8192, &hp, &h_errnop);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYADDR_R_8)
|
AC_DEFINE(HAVE_GETHOSTBYADDR_R_8, 1, [gethostbyaddr_r() takes 8 args])
|
||||||
ac_cv_gethostbyaddr_args=8],[
|
ac_cv_gethostbyaddr_args=8],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])])
|
have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])])
|
||||||
@@ -380,7 +378,7 @@ gethostbyname_r(const char *, struct hostent *, struct hostent_data *);],[
|
|||||||
struct hostent_data data;
|
struct hostent_data data;
|
||||||
gethostbyname_r(NULL, NULL, NULL);],[
|
gethostbyname_r(NULL, NULL, NULL);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYNAME_R_3)
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
|
||||||
ac_cv_gethostbyname_args=3],[
|
ac_cv_gethostbyname_args=3],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments])
|
AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments])
|
||||||
@@ -398,8 +396,8 @@ gethostbyname_r(const char *,struct hostent *, struct hostent_data *);],[
|
|||||||
struct hostent_data data;
|
struct hostent_data data;
|
||||||
gethostbyname_r(NULL, NULL, NULL);],[
|
gethostbyname_r(NULL, NULL, NULL);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYNAME_R_3)
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
|
||||||
AC_DEFINE(NEED_REENTRANT)
|
AC_DEFINE(NEED_REENTRANT, 1, [needs REENTRANT])
|
||||||
ac_cv_gethostbyname_args=3],[
|
ac_cv_gethostbyname_args=3],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING([if gethostbyname_r takes 5 arguments])
|
AC_MSG_CHECKING([if gethostbyname_r takes 5 arguments])
|
||||||
@@ -413,7 +411,7 @@ struct hostent *
|
|||||||
gethostbyname_r(const char *, struct hostent *, char *, int, int *);],[
|
gethostbyname_r(const char *, struct hostent *, char *, int, int *);],[
|
||||||
gethostbyname_r(NULL, NULL, NULL, 0, NULL);],[
|
gethostbyname_r(NULL, NULL, NULL, 0, NULL);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYNAME_R_5)
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R_5, 1, [gethostbyname_r() takes 5 args])
|
||||||
ac_cv_gethostbyname_args=5],[
|
ac_cv_gethostbyname_args=5],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING([if gethostbyname_r takes 6 arguments])
|
AC_MSG_CHECKING([if gethostbyname_r takes 6 arguments])
|
||||||
@@ -428,7 +426,7 @@ gethostbyname_r(const char *, struct hostent *, char *, size_t,
|
|||||||
struct hostent **, int *);],[
|
struct hostent **, int *);],[
|
||||||
gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);],[
|
gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYNAME_R_6)
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R_6, 1, [gethostbyname_r() takes 6 args])
|
||||||
ac_cv_gethostbyname_args=6],[
|
ac_cv_gethostbyname_args=6],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
have_missing_r_funcs="$have_missing_r_funcs gethostbyname_r"],
|
have_missing_r_funcs="$have_missing_r_funcs gethostbyname_r"],
|
||||||
|
136
build_vms.com
136
build_vms.com
@@ -1,69 +1,69 @@
|
|||||||
$!
|
$!
|
||||||
$
|
$
|
||||||
$ on control_y then goto Common_Exit!
|
$ on control_y then goto Common_Exit!
|
||||||
$ orig = f$environment("DEFAULT")
|
$ orig = f$environment("DEFAULT")
|
||||||
$ loc = f$environment("PROCEDURE")
|
$ loc = f$environment("PROCEDURE")
|
||||||
$ def = f$parse("X.X;1",loc) - "X.X;1"
|
$ def = f$parse("X.X;1",loc) - "X.X;1"
|
||||||
$
|
$
|
||||||
$ set def 'def'
|
$ set def 'def'
|
||||||
$ cc_qual = "/define=HAVE_CONFIG_H=1/include=(""../include/"",""../"",""../../openssl-0_9_6c/include/"")"
|
$ cc_qual = "/define=HAVE_CONFIG_H=1/include=(""../include/"",""../"",""../../openssl-0_9_7/include/"")"
|
||||||
$ if p1 .eqs. "LISTING" then cc_qual = cc_qual + "/LIST/MACHINE"
|
$ if p1 .eqs. "LISTING" then cc_qual = cc_qual + "/LIST/MACHINE"
|
||||||
$ if p1 .eqs. "DEBUG" then cc_qual = cc_qual + "/LIST/MACHINE/DEBUG"
|
$ if p1 .eqs. "DEBUG" then cc_qual = cc_qual + "/LIST/MACHINE/DEBUG"
|
||||||
$ msg_qual = ""
|
$ msg_qual = ""
|
||||||
$ call build "[.lib]" "*.c"
|
$ call build "[.lib]" "*.c"
|
||||||
$ call build "[.src]" "*.c"
|
$ call build "[.src]" "*.c"
|
||||||
$ call build "[.src]" "*.msg"
|
$ call build "[.src]" "*.msg"
|
||||||
$ link /exe=curl.exe [.src]curl/lib/include=main,[.lib]curl/lib, -
|
$ link /exe=curl.exe [.src]curl/lib/include=main,[.lib]curl/lib, -
|
||||||
[-.openssl-0_9_6c.axp.exe.ssl]libssl/lib, -
|
[-.openssl-0_9_7.axp.exe.ssl]libssl/lib, -
|
||||||
[-.openssl-0_9_6c.axp.exe.crypto]libcrypto/lib
|
[-.openssl-0_9_7.axp.exe.crypto]libcrypto/lib
|
||||||
$
|
$
|
||||||
$
|
$
|
||||||
$ goto Common_Exit
|
$ goto Common_Exit
|
||||||
$build: subroutine
|
$build: subroutine
|
||||||
$ set noon
|
$ set noon
|
||||||
$ set default 'p1'
|
$ set default 'p1'
|
||||||
$ search = p2
|
$ search = p2
|
||||||
$ reset = f$search("reset")
|
$ reset = f$search("reset")
|
||||||
$ if f$search("CURL.OLB") .eqs. ""
|
$ if f$search("CURL.OLB") .eqs. ""
|
||||||
$ then
|
$ then
|
||||||
$ LIB/CREATE/OBJECT CURL.OLB
|
$ LIB/CREATE/OBJECT CURL.OLB
|
||||||
$ endif
|
$ endif
|
||||||
$ reset = f$search("reset",1)
|
$ reset = f$search("reset",1)
|
||||||
$Loop:
|
$Loop:
|
||||||
$ file = f$search(search,1)
|
$ file = f$search(search,1)
|
||||||
$ if file .eqs. "" then goto EndLoop
|
$ if file .eqs. "" then goto EndLoop
|
||||||
$ obj = f$search(f$parse(".OBJ;",file),2)
|
$ obj = f$search(f$parse(".OBJ;",file),2)
|
||||||
$ if (obj .nes. "")
|
$ if (obj .nes. "")
|
||||||
$ then
|
$ then
|
||||||
$ if (f$cvtime(f$file(file,"rdt")) .gts. f$cvtime(f$file(obj,"rdt")))
|
$ if (f$cvtime(f$file(file,"rdt")) .gts. f$cvtime(f$file(obj,"rdt")))
|
||||||
$ then
|
$ then
|
||||||
$ call compile 'file'
|
$ call compile 'file'
|
||||||
$ lib/object curl.OLB 'f$parse(".obj;",file)'
|
$ lib/object curl.OLB 'f$parse(".obj;",file)'
|
||||||
$ else
|
$ else
|
||||||
$! write sys$output "File: ''file' is up to date"
|
$! write sys$output "File: ''file' is up to date"
|
||||||
$ endif
|
$ endif
|
||||||
$ else
|
$ else
|
||||||
$! write sys$output "Object for file: ''file' does not exist"
|
$! write sys$output "Object for file: ''file' does not exist"
|
||||||
$ call compile 'file'
|
$ call compile 'file'
|
||||||
$ lib/object curl.OLB 'f$parse(".obj;",file)'
|
$ lib/object curl.OLB 'f$parse(".obj;",file)'
|
||||||
$ endif
|
$ endif
|
||||||
$ goto Loop
|
$ goto Loop
|
||||||
$EndLoop:
|
$EndLoop:
|
||||||
$ purge
|
$ purge
|
||||||
$ set def 'def'
|
$ set def 'def'
|
||||||
$ endsubroutine ! Build
|
$ endsubroutine ! Build
|
||||||
$
|
$
|
||||||
$compile: subroutine
|
$compile: subroutine
|
||||||
$ set noon
|
$ set noon
|
||||||
$ file = p1
|
$ file = p1
|
||||||
$ qual = p2+p3+p4+p5+p6+p7+p8
|
$ qual = p2+p3+p4+p5+p6+p7+p8
|
||||||
$ typ = f$parse(file,,,"TYPE") - "."
|
$ typ = f$parse(file,,,"TYPE") - "."
|
||||||
$ cmd_c = "CC "+cc_qual
|
$ cmd_c = "CC "+cc_qual
|
||||||
$ cmd_msg = "MESSAGE "+msg_qual
|
$ cmd_msg = "MESSAGE "+msg_qual
|
||||||
$ x = cmd_'typ'
|
$ x = cmd_'typ'
|
||||||
$ 'x' 'file'
|
$ 'x' 'file'
|
||||||
$ ENDSUBROUTINE ! Compile
|
$ ENDSUBROUTINE ! Compile
|
||||||
$
|
$
|
||||||
$Common_Exit:
|
$Common_Exit:
|
||||||
$ set default 'orig'
|
$ set default 'orig'
|
||||||
$ exit
|
$ exit
|
||||||
|
126
buildconf
126
buildconf
@@ -5,7 +5,125 @@ die(){
|
|||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
aclocal || die "The command 'aclocal' failed"
|
#--------------------------------------------------------------------------
|
||||||
autoheader || die "The command 'autoheader' failed"
|
# autoconf 2.57 or newer
|
||||||
autoconf || die "The command 'autoconf' failed"
|
#
|
||||||
automake -a || die "The command 'automake $MAKEFILES' failed"
|
need_autoconf="2.57"
|
||||||
|
ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
||||||
|
if test -z "$ac_version"; then
|
||||||
|
echo "buildconf: autoconf not found."
|
||||||
|
echo " You need autoconf version $need_autoconf or newer installed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
IFS=.; set $ac_version; IFS=' '
|
||||||
|
if test "$1" = "2" -a "$2" -lt "57" || test "$1" -lt "2"; then
|
||||||
|
echo "buildconf: autoconf version $ac_version found."
|
||||||
|
echo " You need autoconf version $need_autoconf or newer installed."
|
||||||
|
echo " If you have a sufficient autoconf installed, but it"
|
||||||
|
echo " is not named 'autoconf', then try setting the"
|
||||||
|
echo " AUTOCONF environment variable."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "buildconf: autoconf version $ac_version (ok)"
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
# autoheader 2.50 or newer
|
||||||
|
#
|
||||||
|
ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
||||||
|
if test -z "$ah_version"; then
|
||||||
|
echo "buildconf: autoheader not found."
|
||||||
|
echo " You need autoheader version 2.50 or newer installed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
IFS=.; set $ah_version; IFS=' '
|
||||||
|
if test "$1" = "2" -a "$2" -lt "50" || test "$1" -lt "2"; then
|
||||||
|
echo "buildconf: autoheader version $ah_version found."
|
||||||
|
echo " You need autoheader version 2.50 or newer installed."
|
||||||
|
echo " If you have a sufficient autoheader installed, but it"
|
||||||
|
echo " is not named 'autoheader', then try setting the"
|
||||||
|
echo " AUTOHEADER environment variable."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "buildconf: autoheader version $ah_version (ok)"
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
# automake 1.7 or newer
|
||||||
|
#
|
||||||
|
need_automake="1.7"
|
||||||
|
am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
||||||
|
if test -z "$am_version"; then
|
||||||
|
echo "buildconf: automake not found."
|
||||||
|
echo " You need automake version $need_automake or newer installed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
IFS=.; set $am_version; IFS=' '
|
||||||
|
if test "$1" = "1" -a "$2" -lt "7" || test "$1" -lt "1"; then
|
||||||
|
echo "buildconf: automake version $am_version found."
|
||||||
|
echo " You need automake version $need_automake or newer installed."
|
||||||
|
echo " If you have a sufficient automake installed, but it"
|
||||||
|
echo " is not named 'autommake', then try setting the"
|
||||||
|
echo " AUTOMAKE environment variable."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "buildconf: automake version $am_version (ok)"
|
||||||
|
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
# libtool check
|
||||||
|
#
|
||||||
|
LIBTOOL_WANTED_MAJOR=1
|
||||||
|
LIBTOOL_WANTED_MINOR=4
|
||||||
|
LIBTOOL_WANTED_PATCH=2
|
||||||
|
LIBTOOL_WANTED_VERSION=1.4.2
|
||||||
|
|
||||||
|
libtool=`which glibtool 2>/dev/null`
|
||||||
|
if test ! -x "$libtool"; then
|
||||||
|
libtool=`which libtool`
|
||||||
|
fi
|
||||||
|
#lt_pversion=`${LIBTOOL:-$libtool} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
||||||
|
lt_pversion=`$libtool --version 2>/dev/null|head -1|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"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
lt_version=`echo $lt_pversion` #|sed -e 's/\([a-z]*\)$/.\1/'`
|
||||||
|
IFS=.; set $lt_version; IFS=' '
|
||||||
|
lt_status="good"
|
||||||
|
if test "$1" = "$LIBTOOL_WANTED_MAJOR"; then
|
||||||
|
if test "$2" -lt "$LIBTOOL_WANTED_MINOR"; then
|
||||||
|
lt_status="bad"
|
||||||
|
elif test ! -z "$LIBTOOL_WANTED_PATCH"; then
|
||||||
|
if test -n "$3"; then
|
||||||
|
if test "$3" -lt "$LIBTOOL_WANTED_PATCH"; then
|
||||||
|
lt_status="bad"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test $lt_status != "good"; then
|
||||||
|
echo "buildconf: libtool version $lt_pversion found."
|
||||||
|
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "buildconf: libtool version $lt_version (ok)"
|
||||||
|
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
|
# run the correct scripts now
|
||||||
|
|
||||||
|
echo "buildconf: running libtoolize"
|
||||||
|
${LIBTOOLIZE:-libtoolize} --copy --automake || die "The command '${LIBTOOLIZE:-libtoolize} --copy --automake' failed"
|
||||||
|
echo "buildconf: running aclocal"
|
||||||
|
${ACLOCAL:-aclocal} || die "The command '${AUTOHEADER:-aclocal}' failed"
|
||||||
|
echo "buildconf: running autoheader"
|
||||||
|
${AUTOHEADER:-autoheader} || die "The command '${AUTOHEADER:-autoheader}' failed"
|
||||||
|
echo "buildconf: running autoconf"
|
||||||
|
${AUTOCONF:-autoconf} || die "The command '${AUTOCONF:-autoconf}' failed"
|
||||||
|
echo "buildconf: running automake"
|
||||||
|
${AUTOMAKE:-automake} -a || die "The command '${AUTOMAKE:-automake} -a' failed"
|
||||||
|
exit 0
|
||||||
|
1317
config.guess
vendored
1317
config.guess
vendored
File diff suppressed because it is too large
Load Diff
1411
config.sub
vendored
1411
config.sub
vendored
File diff suppressed because it is too large
Load Diff
@@ -5,18 +5,30 @@ dnl Ensure that this file is processed with autoconf 2.50 or newer
|
|||||||
dnl Don't even think about removing this check!
|
dnl Don't even think about removing this check!
|
||||||
AC_PREREQ(2.50)
|
AC_PREREQ(2.50)
|
||||||
|
|
||||||
dnl First some basic init macros
|
dnl We don't know the version number "staticly" so we use a dash here
|
||||||
AC_INIT
|
AC_INIT(curl, [-], [curl-bug@haxx.se])
|
||||||
|
|
||||||
|
dnl configure script copyright
|
||||||
|
AC_COPYRIGHT([Copyright (c) 1998 - 2003 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])
|
||||||
|
|
||||||
AC_CONFIG_SRCDIR([lib/urldata.h])
|
AC_CONFIG_SRCDIR([lib/urldata.h])
|
||||||
AM_CONFIG_HEADER(lib/config.h src/config.h tests/server/config.h lib/ca-bundle.h)
|
AM_CONFIG_HEADER(lib/config.h src/config.h tests/server/config.h )
|
||||||
|
AM_MAINTAINER_MODE
|
||||||
|
|
||||||
|
AC_PATH_PROG( SED, sed, , $PATH:/usr/bin:/usr/local/bin)
|
||||||
|
AC_SUBST(SED)
|
||||||
|
|
||||||
dnl figure out the libcurl version
|
dnl figure out the libcurl version
|
||||||
VERSION=`sed -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curl.h`
|
VERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curl.h`
|
||||||
AM_INIT_AUTOMAKE(curl,$VERSION)
|
AM_INIT_AUTOMAKE(curl,$VERSION)
|
||||||
|
AC_MSG_CHECKING([curl version])
|
||||||
|
AC_MSG_RESULT($VERSION)
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
dnl we extract the numerical version for curl-config only
|
dnl we extract the numerical version for curl-config only
|
||||||
VERSIONNUM=`sed -ne 's/^#define LIBCURL_VERSION_NUM 0x\(.*\)/\1/p' ${srcdir}/include/curl/curl.h`
|
VERSIONNUM=`$SED -ne 's/^#define LIBCURL_VERSION_NUM 0x\(.*\)/\1/p' ${srcdir}/include/curl/curl.h`
|
||||||
AC_SUBST(VERSIONNUM)
|
AC_SUBST(VERSIONNUM)
|
||||||
|
|
||||||
dnl Solaris pkgadd support definitions
|
dnl Solaris pkgadd support definitions
|
||||||
@@ -34,7 +46,7 @@ dnl
|
|||||||
|
|
||||||
AC_CANONICAL_HOST
|
AC_CANONICAL_HOST
|
||||||
dnl Get system canonical name
|
dnl Get system canonical name
|
||||||
AC_DEFINE_UNQUOTED(OS, "${host}")
|
AC_DEFINE_UNQUOTED(OS, "${host}", [cpu-machine-OS])
|
||||||
|
|
||||||
dnl Check for AIX weirdos
|
dnl Check for AIX weirdos
|
||||||
AC_AIX
|
AC_AIX
|
||||||
@@ -51,6 +63,17 @@ AC_LIBTOOL_WIN32_DLL
|
|||||||
dnl libtool setup
|
dnl libtool setup
|
||||||
AM_PROG_LIBTOOL
|
AM_PROG_LIBTOOL
|
||||||
|
|
||||||
|
case $host in
|
||||||
|
*-*-cygwin | *-*-mingw* | *-*-pw32*)
|
||||||
|
need_no_undefined=yes
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
need_no_undefined=no
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AM_CONDITIONAL(NO_UNDEFINED, test x$need_no_undefined = xyes)
|
||||||
|
|
||||||
dnl The install stuff has already been taken care of by the automake stuff
|
dnl The install stuff has already been taken care of by the automake stuff
|
||||||
dnl AC_PROG_INSTALL
|
dnl AC_PROG_INSTALL
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
@@ -60,14 +83,14 @@ dnl switch off particular protocols
|
|||||||
dnl
|
dnl
|
||||||
AC_MSG_CHECKING([whether to support http])
|
AC_MSG_CHECKING([whether to support http])
|
||||||
AC_ARG_ENABLE(http,
|
AC_ARG_ENABLE(http,
|
||||||
[ --enable-http Enable HTTP support
|
AC_HELP_STRING([--enable-http],[Enable HTTP support])
|
||||||
--disable-http Disable HTTP support],
|
AC_HELP_STRING([--disable-http],[Disable HTTP support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_DEFINE(CURL_DISABLE_HTTP)
|
AC_DEFINE(CURL_DISABLE_HTTP, 1, [to disable HTTP])
|
||||||
AC_MSG_WARN([disable HTTP disables FTP over proxy and GOPHER too])
|
AC_MSG_WARN([disable HTTP disables FTP over proxy and GOPHER too])
|
||||||
AC_DEFINE(CURL_DISABLE_GOPHER)
|
AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable GOPHER])
|
||||||
AC_SUBST(CURL_DISABLE_HTTP)
|
AC_SUBST(CURL_DISABLE_HTTP)
|
||||||
AC_SUBST(CURL_DISABLE_GOPHER)
|
AC_SUBST(CURL_DISABLE_GOPHER)
|
||||||
;;
|
;;
|
||||||
@@ -78,12 +101,12 @@ AC_ARG_ENABLE(http,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support ftp])
|
AC_MSG_CHECKING([whether to support ftp])
|
||||||
AC_ARG_ENABLE(ftp,
|
AC_ARG_ENABLE(ftp,
|
||||||
[ --enable-ftp Enable FTP support
|
AC_HELP_STRING([--enable-ftp],[Enable FTP support])
|
||||||
--disable-ftp Disable FTP support],
|
AC_HELP_STRING([--disable-ftp],[Disable FTP support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_DEFINE(CURL_DISABLE_FTP)
|
AC_DEFINE(CURL_DISABLE_FTP, 1, [to disable FTP])
|
||||||
AC_SUBST(CURL_DISABLE_FTP)
|
AC_SUBST(CURL_DISABLE_FTP)
|
||||||
;;
|
;;
|
||||||
*) AC_MSG_RESULT(yes)
|
*) AC_MSG_RESULT(yes)
|
||||||
@@ -93,12 +116,12 @@ AC_ARG_ENABLE(ftp,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support gopher])
|
AC_MSG_CHECKING([whether to support gopher])
|
||||||
AC_ARG_ENABLE(gopher,
|
AC_ARG_ENABLE(gopher,
|
||||||
[ --enable-gopher Enable GOPHER support
|
AC_HELP_STRING([--enable-gopher],[Enable GOPHER support])
|
||||||
--disable-gopher Disable GOPHER support],
|
AC_HELP_STRING([--disable-gopher],[Disable GOPHER support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_DEFINE(CURL_DISABLE_GOPHER)
|
AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable GOPHER])
|
||||||
AC_SUBST(CURL_DISABLE_GOPHER)
|
AC_SUBST(CURL_DISABLE_GOPHER)
|
||||||
;;
|
;;
|
||||||
*) AC_MSG_RESULT(yes)
|
*) AC_MSG_RESULT(yes)
|
||||||
@@ -108,12 +131,12 @@ AC_ARG_ENABLE(gopher,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support file])
|
AC_MSG_CHECKING([whether to support file])
|
||||||
AC_ARG_ENABLE(file,
|
AC_ARG_ENABLE(file,
|
||||||
[ --enable-file Enable FILE support
|
AC_HELP_STRING([--enable-file],[Enable FILE support])
|
||||||
--disable-file Disable FILE support],
|
AC_HELP_STRING([--disable-file],[Disable FILE support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_DEFINE(CURL_DISABLE_FILE)
|
AC_DEFINE(CURL_DISABLE_FILE, 1, [to disable FILE])
|
||||||
AC_SUBST(CURL_DISABLE_FILE)
|
AC_SUBST(CURL_DISABLE_FILE)
|
||||||
;;
|
;;
|
||||||
*) AC_MSG_RESULT(yes)
|
*) AC_MSG_RESULT(yes)
|
||||||
@@ -123,12 +146,12 @@ AC_ARG_ENABLE(file,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support ldap])
|
AC_MSG_CHECKING([whether to support ldap])
|
||||||
AC_ARG_ENABLE(ldap,
|
AC_ARG_ENABLE(ldap,
|
||||||
[ --enable-ldap Enable LDAP support
|
AC_HELP_STRING([--enable-ldap],[Enable LDAP support])
|
||||||
--disable-ldap Disable LDAP support],
|
AC_HELP_STRING([--disable-ldap],[Disable LDAP support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_DEFINE(CURL_DISABLE_LDAP)
|
AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
|
||||||
AC_SUBST(CURL_DISABLE_LDAP)
|
AC_SUBST(CURL_DISABLE_LDAP)
|
||||||
;;
|
;;
|
||||||
*) AC_MSG_RESULT(yes)
|
*) AC_MSG_RESULT(yes)
|
||||||
@@ -138,12 +161,12 @@ AC_ARG_ENABLE(ldap,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support dict])
|
AC_MSG_CHECKING([whether to support dict])
|
||||||
AC_ARG_ENABLE(dict,
|
AC_ARG_ENABLE(dict,
|
||||||
[ --enable-dict Enable DICT support
|
AC_HELP_STRING([--enable-dict],[Enable DICT support])
|
||||||
--disable-dict Disable DICT support],
|
AC_HELP_STRING([--disable-dict],[Disable DICT support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_DEFINE(CURL_DISABLE_DICT)
|
AC_DEFINE(CURL_DISABLE_DICT, 1, [to disable DICT])
|
||||||
AC_SUBST(CURL_DISABLE_DICT)
|
AC_SUBST(CURL_DISABLE_DICT)
|
||||||
;;
|
;;
|
||||||
*) AC_MSG_RESULT(yes)
|
*) AC_MSG_RESULT(yes)
|
||||||
@@ -153,12 +176,12 @@ AC_ARG_ENABLE(dict,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support telnet])
|
AC_MSG_CHECKING([whether to support telnet])
|
||||||
AC_ARG_ENABLE(telnet,
|
AC_ARG_ENABLE(telnet,
|
||||||
[ --enable-telnet Enable TELNET support
|
AC_HELP_STRING([--enable-telnet],[Enable TELNET support])
|
||||||
--disable-telnet Disable TELNET support],
|
AC_HELP_STRING([--disable-telnet],[Disable TELNET support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_DEFINE(CURL_DISABLE_TELNET)
|
AC_DEFINE(CURL_DISABLE_TELNET, 1, [to disable TELNET])
|
||||||
AC_SUBST(CURL_DISABLE_TELNET)
|
AC_SUBST(CURL_DISABLE_TELNET)
|
||||||
;;
|
;;
|
||||||
*) AC_MSG_RESULT(yes)
|
*) AC_MSG_RESULT(yes)
|
||||||
@@ -174,8 +197,8 @@ dnl **********************************************************************
|
|||||||
|
|
||||||
AC_MSG_CHECKING([whether to enable ipv6])
|
AC_MSG_CHECKING([whether to enable ipv6])
|
||||||
AC_ARG_ENABLE(ipv6,
|
AC_ARG_ENABLE(ipv6,
|
||||||
[ --enable-ipv6 Enable ipv6 (with ipv4) support
|
AC_HELP_STRING([--enable-ipv6],[Enable ipv6 (with ipv4) support])
|
||||||
--disable-ipv6 Disable ipv6 support],
|
AC_HELP_STRING([--disable-ipv6],[Disable ipv6 support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
@@ -215,11 +238,11 @@ dnl Checks for libraries.
|
|||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
|
|
||||||
dnl gethostbyname in the nsl lib?
|
dnl gethostbyname in the nsl lib?
|
||||||
AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, gethostbyname))
|
AC_CHECK_FUNC(gethostbyname, , [ AC_CHECK_LIB(nsl, gethostbyname) ])
|
||||||
|
|
||||||
if test "$ac_cv_lib_nsl_gethostbyname" != "yes" -a "$ac_cv_func_gethostbyname" != "yes"; then
|
if test "$ac_cv_lib_nsl_gethostbyname" != "yes" -a "$ac_cv_func_gethostbyname" != "yes"; then
|
||||||
dnl gethostbyname in the socket lib?
|
dnl gethostbyname in the socket lib?
|
||||||
AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(socket, gethostbyname))
|
AC_CHECK_FUNC(gethostbyname, , [ AC_CHECK_LIB(socket, gethostbyname) ])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl At least one system has been identified to require BOTH nsl and
|
dnl At least one system has been identified to require BOTH nsl and
|
||||||
@@ -244,7 +267,7 @@ if test "$ac_cv_lib_nsl_gethostbyname" = "$ac_cv_func_gethostbyname"; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
dnl resolve lib?
|
dnl resolve lib?
|
||||||
AC_CHECK_FUNC(strcasecmp, , AC_CHECK_LIB(resolve, strcasecmp))
|
AC_CHECK_FUNC(strcasecmp, , [ AC_CHECK_LIB(resolve, strcasecmp) ])
|
||||||
|
|
||||||
if test "$ac_cv_lib_resolve_strcasecmp" = "$ac_cv_func_strcasecmp"; then
|
if test "$ac_cv_lib_resolve_strcasecmp" = "$ac_cv_func_strcasecmp"; then
|
||||||
AC_CHECK_LIB(resolve, strcasecmp,
|
AC_CHECK_LIB(resolve, strcasecmp,
|
||||||
@@ -254,21 +277,36 @@ if test "$ac_cv_lib_resolve_strcasecmp" = "$ac_cv_func_strcasecmp"; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
dnl socket lib?
|
dnl socket lib?
|
||||||
AC_CHECK_FUNC(connect, , AC_CHECK_LIB(socket, connect))
|
AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ])
|
||||||
|
|
||||||
dnl dl lib?
|
dnl dl lib?
|
||||||
AC_CHECK_FUNC(dlclose, , AC_CHECK_LIB(dl, dlopen))
|
AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([whether to use libgcc])
|
||||||
|
AC_ARG_ENABLE(libgcc,
|
||||||
|
AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
||||||
|
[ case "$enableval" in
|
||||||
|
yes)
|
||||||
|
LIBS="$LIBS -lgcc"
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
;;
|
||||||
|
*) AC_MSG_RESULT(no)
|
||||||
|
;;
|
||||||
|
esac ],
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
)
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check how non-blocking sockets are set
|
dnl Check how non-blocking sockets are set
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
AC_ARG_ENABLE(nonblocking,
|
AC_ARG_ENABLE(nonblocking,
|
||||||
[ --enable-nonblocking Makes the script detect how to do it
|
AC_HELP_STRING([--enable-nonblocking],[Enable detecting how to do it])
|
||||||
--disable-nonblocking Makes the script disable non-blocking sockets],
|
AC_HELP_STRING([--disable-nonblocking],[Disable non-blocking socket detection]),
|
||||||
[
|
[
|
||||||
if test "$enableval" = "no" ; then
|
if test "$enableval" = "no" ; then
|
||||||
AC_MSG_WARN([non-blocking sockets disabled])
|
AC_MSG_WARN([non-blocking sockets disabled])
|
||||||
AC_DEFINE(HAVE_DISABLED_NONBLOCKING)
|
AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1,
|
||||||
|
[to disable NON-BLOCKING connections])
|
||||||
else
|
else
|
||||||
CURL_CHECK_NONBLOCKING_SOCKET
|
CURL_CHECK_NONBLOCKING_SOCKET
|
||||||
fi
|
fi
|
||||||
@@ -282,44 +320,62 @@ dnl Check for the random seed preferences
|
|||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
|
|
||||||
AC_ARG_WITH(egd-socket,
|
AC_ARG_WITH(egd-socket,
|
||||||
[ --with-egd-socket=FILE Entropy Gathering Daemon socket pathname],
|
AC_HELP_STRING([--with-egd-socket=FILE],
|
||||||
|
[Entropy Gathering Daemon socket pathname]),
|
||||||
[ EGD_SOCKET="$withval" ]
|
[ EGD_SOCKET="$withval" ]
|
||||||
)
|
)
|
||||||
if test -n "$EGD_SOCKET" ; then
|
if test -n "$EGD_SOCKET" ; then
|
||||||
AC_DEFINE_UNQUOTED(EGD_SOCKET, "$EGD_SOCKET")
|
AC_DEFINE_UNQUOTED(EGD_SOCKET, "$EGD_SOCKET",
|
||||||
|
[your Entropy Gathering Daemon socket pathname] )
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl Check for user-specified random device
|
dnl Check for user-specified random device
|
||||||
AC_ARG_WITH(random,
|
AC_ARG_WITH(random,
|
||||||
[ --with-random=FILE read randomness from FILE (default=/dev/urandom)],
|
AC_HELP_STRING([--with-random=FILE],[read randomness from FILE (default=/dev/urandom)]),
|
||||||
[ RANDOM_FILE="$withval" ],
|
[ RANDOM_FILE="$withval" ],
|
||||||
[
|
[
|
||||||
dnl Check for random device
|
dnl Check for random device
|
||||||
AC_CHECK_FILE("/dev/urandom",
|
AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] )
|
||||||
[
|
|
||||||
RANDOM_FILE="/dev/urandom";
|
|
||||||
]
|
|
||||||
)
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
if test -n "$RANDOM_FILE" ; then
|
if test -n "$RANDOM_FILE" ; then
|
||||||
AC_SUBST(RANDOM_FILE)
|
AC_SUBST(RANDOM_FILE)
|
||||||
AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE")
|
AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE",
|
||||||
|
[a suitable file to read random data from])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl **********************************************************************
|
||||||
|
dnl Check if the operating system allows programs to write to their own argv[]
|
||||||
|
dnl **********************************************************************
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([if argv can be written to])
|
||||||
|
AC_RUN_IFELSE([[
|
||||||
|
int main(int argc, char ** argv) {
|
||||||
|
argv[0][0] = ' ';
|
||||||
|
return (argv[0][0] == ' ')?0:1;
|
||||||
|
}
|
||||||
|
]],
|
||||||
|
AC_DEFINE(HAVE_WRITABLE_ARGV, 1, [Define this symbol if your OS supports changing the contents of argv])
|
||||||
|
AC_MSG_RESULT(yes),
|
||||||
|
AC_MSG_RESULT(no),
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
AC_MSG_WARN([the previous check could not be made default was used])
|
||||||
|
)
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check for the presence of Kerberos4 libraries and headers
|
dnl Check for the presence of Kerberos4 libraries and headers
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
|
|
||||||
AC_ARG_WITH(krb4-includes,
|
AC_ARG_WITH(krb4-includes,
|
||||||
[ --with-krb4-includes[=DIR] Specify location of kerberos4 headers],[
|
AC_HELP_STRING([--with-krb4-includes=DIR],
|
||||||
|
[Specify location of kerberos4 headers]),[
|
||||||
CPPFLAGS="$CPPFLAGS -I$withval"
|
CPPFLAGS="$CPPFLAGS -I$withval"
|
||||||
KRB4INC="$withval"
|
KRB4INC="$withval"
|
||||||
want_krb4=yes
|
want_krb4=yes
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_ARG_WITH(krb4-libs,
|
AC_ARG_WITH(krb4-libs,
|
||||||
[ --with-krb4-libs[=DIR] Specify location of kerberos4 libs],[
|
AC_HELP_STRING([--with-krb4-libs=DIR],[Specify location of kerberos4 libs]),[
|
||||||
LDFLAGS="$LDFLAGS -L$withval"
|
LDFLAGS="$LDFLAGS -L$withval"
|
||||||
KRB4LIB="$withval"
|
KRB4LIB="$withval"
|
||||||
want_krb4=yes
|
want_krb4=yes
|
||||||
@@ -328,7 +384,7 @@ AC_ARG_WITH(krb4-libs,
|
|||||||
|
|
||||||
OPT_KRB4=off
|
OPT_KRB4=off
|
||||||
AC_ARG_WITH(krb4,dnl
|
AC_ARG_WITH(krb4,dnl
|
||||||
[ --with-krb4[=DIR] where to look for Kerberos4],[
|
AC_HELP_STRING([--with-krb4=DIR],[where to look for Kerberos4]),[
|
||||||
OPT_KRB4="$withval"
|
OPT_KRB4="$withval"
|
||||||
if test X"$OPT_KRB4" != Xyes
|
if test X"$OPT_KRB4" != Xyes
|
||||||
then
|
then
|
||||||
@@ -366,7 +422,7 @@ then
|
|||||||
AC_CHECK_HEADERS(des.h)
|
AC_CHECK_HEADERS(des.h)
|
||||||
|
|
||||||
dnl resolv lib?
|
dnl resolv lib?
|
||||||
AC_CHECK_FUNC(res_search, , AC_CHECK_LIB(resolv, res_search))
|
AC_CHECK_FUNC(res_search, , [AC_CHECK_LIB(resolv, res_search)])
|
||||||
|
|
||||||
dnl Check for the Kerberos4 library
|
dnl Check for the Kerberos4 library
|
||||||
AC_CHECK_LIB(krb, krb_net_read,
|
AC_CHECK_LIB(krb, krb_net_read,
|
||||||
@@ -382,7 +438,8 @@ then
|
|||||||
AC_CHECK_FUNCS(krb_get_our_ip_for_realm)
|
AC_CHECK_FUNCS(krb_get_our_ip_for_realm)
|
||||||
|
|
||||||
dnl add define KRB4
|
dnl add define KRB4
|
||||||
AC_DEFINE(KRB4)
|
AC_DEFINE(KRB4, 1,
|
||||||
|
[if you have the Kerberos4 libraries (including -ldes)])
|
||||||
|
|
||||||
dnl substitute it too!
|
dnl substitute it too!
|
||||||
KRB4_ENABLED=1
|
KRB4_ENABLED=1
|
||||||
@@ -397,6 +454,88 @@ else
|
|||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl **********************************************************************
|
||||||
|
dnl Check for GSS-API libraries
|
||||||
|
dnl **********************************************************************
|
||||||
|
|
||||||
|
AC_ARG_WITH(gssapi-includes,
|
||||||
|
AC_HELP_STRING([--with-gssapi-includes=DIR],
|
||||||
|
[Specify location of GSSAPI header]),
|
||||||
|
[ GSSAPI_INCS="-I$withval"
|
||||||
|
want_gss="yes" ]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_ARG_WITH(gssapi-libs,
|
||||||
|
AC_HELP_STRING([--with-gssapi-libs=DIR],
|
||||||
|
[Specify location of GSSAPI libs]),
|
||||||
|
[ GSSAPI_LIBS="-L$withval -lgssapi"
|
||||||
|
want_gss="yes" ]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_ARG_WITH(gssapi,
|
||||||
|
AC_HELP_STRING([--with-gssapi=DIR],
|
||||||
|
[Where to look for GSSAPI]),
|
||||||
|
[ GSSAPI_ROOT="$withval"
|
||||||
|
want_gss="yes" ]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([if GSSAPI support is requested])
|
||||||
|
if test x"$want_gss" = xyes; then
|
||||||
|
if test -z "$GSSAPI_INCS"; then
|
||||||
|
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
||||||
|
gss_cppflags=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi`
|
||||||
|
CPPFLAGS="$CPPFLAGS $gss_cppflags"
|
||||||
|
else
|
||||||
|
CPPFLAGS="$GSSAPI_ROOT/include"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
CPPFLAGS="$CPPFLAGS $GSSAPI_INCS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$GSSAPI_LIB_DIR"; then
|
||||||
|
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
||||||
|
gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi`
|
||||||
|
LDFLAGS="$LDFLAGS $gss_ldflags"
|
||||||
|
else
|
||||||
|
LDFLAGS="$LDFLAGS $GSSAPI_ROOT/lib -lgssapi"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(GSSAPI, 1, [if you have the gssapi libraries])
|
||||||
|
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
dnl Detect the pkg-config tool, as it may have extra info about the
|
||||||
|
dnl openssl installation we can use. I *believe* this is what we are
|
||||||
|
dnl expected to do on really recent Redhat Linux hosts.
|
||||||
|
AC_PATH_PROG( PKGCONFIG, pkg-config, no, $PATH:/usr/bin:/usr/local/bin)
|
||||||
|
if test "$PKGCONFIG" != "no" ; then
|
||||||
|
AC_MSG_CHECKING([for OpenSSL options using pkg-config])
|
||||||
|
|
||||||
|
$PKGCONFIG --exists openssl
|
||||||
|
SSL_EXISTS=$?
|
||||||
|
|
||||||
|
if test "$SSL_EXISTS" -eq "0"; then
|
||||||
|
SSL_LIBS=`$PKGCONFIG --libs-only-l openssl 2>/dev/null`
|
||||||
|
SSL_LDFLAGS=`$PKGCONFIG --libs-only-L openssl 2>/dev/null`
|
||||||
|
SSL_CPPFLAGS=`$PKGCONFIG --cflags-only-I openssl 2>/dev/null`
|
||||||
|
|
||||||
|
LIBS="$LIBS $SSL_LIBS"
|
||||||
|
CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS"
|
||||||
|
LDFLAGS="$LDFLAGS $SSL_LDFLAGS"
|
||||||
|
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check for the presence of SSL libraries and headers
|
dnl Check for the presence of SSL libraries and headers
|
||||||
@@ -404,11 +543,12 @@ dnl **********************************************************************
|
|||||||
|
|
||||||
dnl Default to compiler & linker defaults for SSL files & libraries.
|
dnl Default to compiler & linker defaults for SSL files & libraries.
|
||||||
OPT_SSL=off
|
OPT_SSL=off
|
||||||
|
dnl Default to no CA bundle
|
||||||
|
ca="no"
|
||||||
AC_ARG_WITH(ssl,dnl
|
AC_ARG_WITH(ssl,dnl
|
||||||
[ --with-ssl[=DIR] where to look for SSL [compiler/linker default paths]
|
AC_HELP_STRING([--with-ssl=PATH],[where to look for SSL, PATH points to the SSL installation (default: /usr/local/ssl)])
|
||||||
DIR points to the SSL installation [/usr/local/ssl]],
|
AC_HELP_STRING([--without-ssl], [disable SSL]),
|
||||||
OPT_SSL=$withval
|
OPT_SSL=$withval)
|
||||||
)
|
|
||||||
|
|
||||||
if test X"$OPT_SSL" = Xno
|
if test X"$OPT_SSL" = Xno
|
||||||
then
|
then
|
||||||
@@ -482,12 +622,42 @@ else
|
|||||||
OPENSSL_ENABLED=1)
|
OPENSSL_ENABLED=1)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl Check for the OpenSSL engine header, it is kind of "separated"
|
dnl If the ENGINE library seems to be around, check for the OpenSSL engine
|
||||||
dnl from the main SSL check
|
dnl header, it is kind of "separated" from the main SSL check
|
||||||
AC_CHECK_HEADERS(openssl/engine.h)
|
AC_CHECK_FUNC(ENGINE_init, [ AC_CHECK_HEADERS(openssl/engine.h) ])
|
||||||
|
|
||||||
AC_SUBST(OPENSSL_ENABLED)
|
AC_SUBST(OPENSSL_ENABLED)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([CA cert bundle install path])
|
||||||
|
|
||||||
|
AC_ARG_WITH(ca-bundle,
|
||||||
|
AC_HELP_STRING([--with-ca-bundle=FILE], [File name to install the CA bundle as])
|
||||||
|
AC_HELP_STRING([--without-ca-bundle], [Don't install the CA bundle]),
|
||||||
|
[ ca="$withval" ],
|
||||||
|
[
|
||||||
|
if test "x$prefix" != xNONE; then
|
||||||
|
ca="\${prefix}/share/curl/curl-ca-bundle.crt"
|
||||||
|
else
|
||||||
|
ca="$ac_default_prefix/share/curl/curl-ca-bundle.crt"
|
||||||
|
fi
|
||||||
|
] )
|
||||||
|
|
||||||
|
if test X"$OPT_SSL" = Xno; then
|
||||||
|
ca="no"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$ca" != "xno"; then
|
||||||
|
CURL_CA_BUNDLE='"'$ca'"'
|
||||||
|
AC_SUBST(CURL_CA_BUNDLE)
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT([$ca])
|
||||||
|
|
||||||
|
dnl these can only exist if openssl exists
|
||||||
|
|
||||||
|
AC_CHECK_FUNCS( RAND_status \
|
||||||
|
RAND_screen \
|
||||||
|
RAND_egd )
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test X"$OPT_SSL" != Xoff &&
|
if test X"$OPT_SSL" != Xoff &&
|
||||||
@@ -495,61 +665,81 @@ else
|
|||||||
AC_MSG_ERROR([OpenSSL libs and/or directories were not found where specified!])
|
AC_MSG_ERROR([OpenSSL libs and/or directories were not found where specified!])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
dnl these can only exist if openssl exists
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS( RAND_status \
|
|
||||||
RAND_screen \
|
|
||||||
RAND_egd )
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
AM_CONDITIONAL(CABUNDLE, test x$ca != xno)
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check for the presence of ZLIB libraries and headers
|
dnl Check for the presence of ZLIB libraries and headers
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
|
|
||||||
dnl Default to compiler & linker defaults for files & libraries.
|
|
||||||
dnl OPT_ZLIB=no
|
|
||||||
dnl AC_ARG_WITH(zlib,dnl
|
|
||||||
dnl [ --with-zlib[=DIR] where to look for ZLIB [compiler/linker default paths]
|
|
||||||
dnl DIR points to the ZLIB installation prefix [/usr/local]],
|
|
||||||
dnl OPT_ZLIB=$withval,
|
|
||||||
dnl )
|
|
||||||
|
|
||||||
dnl Check for & handle argument to --with-zlib.
|
dnl Check for & handle argument to --with-zlib.
|
||||||
dnl
|
|
||||||
dnl NOTE: We *always* look for ZLIB headers & libraries, all this option
|
|
||||||
dnl does is change where we look (by adjusting LIBS and CPPFLAGS.)
|
|
||||||
dnl
|
|
||||||
|
|
||||||
AC_MSG_CHECKING(where to look for ZLIB)
|
_cppflags=$CPPFLAGS
|
||||||
if test X"$OPT_ZLIB" = Xno
|
_ldflags=$LDFLAGS
|
||||||
then
|
OPT_ZLIB="/usr/local"
|
||||||
AC_MSG_RESULT([defaults (or given in environment)])
|
AC_ARG_WITH(zlib,
|
||||||
else
|
AC_HELP_STRING([--with-zlib=PATH],[search for zlib in PATH])
|
||||||
test X"$OPT_ZLIB" = Xyes && OPT_ZLIB=/usr/local
|
AC_HELP_STRING([--without-zlib],[disable use of zlib]),
|
||||||
LIBS="$LIBS -L$OPT_ZLIB/lib"
|
[OPT_ZLIB="$withval"])
|
||||||
CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include"
|
|
||||||
AC_MSG_RESULT([$OPT_ZLIB])
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl AC_CHECK_FUNC(gzread, , AC_CHECK_LIB(z, gzread))
|
case "$OPT_ZLIB" in
|
||||||
AC_CHECK_LIB(z, gzread, [AM_CONDITIONAL(CONTENT_ENCODING, true)
|
no)
|
||||||
AC_DEFINE(HAVE_LIBZ)
|
AC_MSG_WARN([zlib disabled]) ;;
|
||||||
LIBS="$LIBS -lz"
|
*)
|
||||||
HAVE_LIBZ="1"
|
dnl check for the lib first without setting any new path, since many
|
||||||
AC_SUBST(HAVE_LIBZ)])
|
dnl people have it in the default path
|
||||||
|
|
||||||
|
AC_CHECK_LIB(z, inflateEnd, ,
|
||||||
|
[if test -d "$OPT_ZLIB"; then
|
||||||
|
CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include"
|
||||||
|
LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib"
|
||||||
|
fi])
|
||||||
|
|
||||||
|
AC_CHECK_HEADER(zlib.h,[
|
||||||
|
AC_CHECK_LIB(z, gzread,
|
||||||
|
[HAVE_LIBZ="1"
|
||||||
|
AC_SUBST(HAVE_LIBZ)
|
||||||
|
LIBS="$LIBS -lz"
|
||||||
|
AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file])
|
||||||
|
AC_DEFINE(HAVE_LIBZ, 1, [If zlib is available])],
|
||||||
|
[ CPPFLAGS=$_cppflags
|
||||||
|
LDFLAGS=$_ldflags])],
|
||||||
|
[ CPPFLAGS=$_cppflags
|
||||||
|
LDFLAGS=$_ldflags]
|
||||||
|
)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
dnl set variable for use in automakefile(s)
|
||||||
|
AM_CONDITIONAL(HAVE_LIBZ, test x"$HAVE_LIBZ" = x1)
|
||||||
|
|
||||||
dnl Default is to try the thread-safe versions of a few functions
|
dnl Default is to try the thread-safe versions of a few functions
|
||||||
OPT_THREAD=on
|
OPT_THREAD=on
|
||||||
|
|
||||||
|
dnl detect AIX 4.3 or later
|
||||||
|
dnl see full docs on this reasoning in the lib/hostip.c source file
|
||||||
|
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])
|
||||||
|
OPT_THREAD=off ],
|
||||||
|
[ AC_MSG_RESULT([no]) ]
|
||||||
|
)
|
||||||
|
|
||||||
AC_ARG_ENABLE(thread,dnl
|
AC_ARG_ENABLE(thread,dnl
|
||||||
[ --disable-thread tell configure to not look for thread-safe functions],
|
AC_HELP_STRING([--disable-thread],[don't look for thread-safe functions]),
|
||||||
OPT_THREAD=off
|
OPT_THREAD=off
|
||||||
|
AC_MSG_WARN(libcurl will not get built using thread-safe functions)
|
||||||
)
|
)
|
||||||
|
|
||||||
if test X"$OPT_THREAD" = Xoff
|
if test X"$OPT_THREAD" = Xoff
|
||||||
then
|
then
|
||||||
AC_MSG_WARN(libcurl will not get built using thread-safe functions)
|
|
||||||
AC_DEFINE(DISABLED_THREADSAFE, 1, \
|
AC_DEFINE(DISABLED_THREADSAFE, 1, \
|
||||||
Set to explicitly specify we don't want to use thread-safe functions)
|
Set to explicitly specify we don't want to use thread-safe functions)
|
||||||
else
|
else
|
||||||
@@ -576,21 +766,23 @@ dnl **********************************************************************
|
|||||||
|
|
||||||
dnl Checks for header files.
|
dnl Checks for header files.
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_CHECK_HEADERS( \
|
|
||||||
|
dnl First check for the very most basic headers. Then we can use these
|
||||||
|
dnl ones as default-headers when checking for the rest!
|
||||||
|
AC_CHECK_HEADERS(
|
||||||
|
sys/types.h \
|
||||||
|
sys/time.h \
|
||||||
|
sys/select.h \
|
||||||
|
sys/socket.h \
|
||||||
unistd.h \
|
unistd.h \
|
||||||
malloc.h \
|
malloc.h \
|
||||||
stdlib.h \
|
stdlib.h \
|
||||||
arpa/inet.h \
|
arpa/inet.h \
|
||||||
net/if.h \
|
net/if.h \
|
||||||
netinet/in.h \
|
netinet/in.h \
|
||||||
netinet/if_ether.h \
|
|
||||||
netdb.h \
|
netdb.h \
|
||||||
sys/select.h \
|
|
||||||
sys/socket.h \
|
|
||||||
sys/sockio.h \
|
sys/sockio.h \
|
||||||
sys/stat.h \
|
sys/stat.h \
|
||||||
sys/types.h \
|
|
||||||
sys/time.h \
|
|
||||||
sys/param.h \
|
sys/param.h \
|
||||||
termios.h \
|
termios.h \
|
||||||
termio.h \
|
termio.h \
|
||||||
@@ -605,12 +797,28 @@ AC_CHECK_HEADERS( \
|
|||||||
utime.h \
|
utime.h \
|
||||||
sys/utime.h \
|
sys/utime.h \
|
||||||
sys/poll.h \
|
sys/poll.h \
|
||||||
setjmp.h
|
setjmp.h,
|
||||||
|
dnl to do if not found
|
||||||
|
[],
|
||||||
|
dnl to do if found
|
||||||
|
[],
|
||||||
|
dnl default includes
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SELECT_H
|
||||||
|
#include <sys/select.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
dnl Check for libz header
|
|
||||||
AC_CHECK_HEADERS(zlib.h)
|
|
||||||
|
|
||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
AC_TYPE_SIZE_T
|
AC_TYPE_SIZE_T
|
||||||
@@ -629,6 +837,8 @@ AC_CHECK_TYPE(ssize_t, int)
|
|||||||
TYPE_SOCKLEN_T
|
TYPE_SOCKLEN_T
|
||||||
TYPE_IN_ADDR_T
|
TYPE_IN_ADDR_T
|
||||||
|
|
||||||
|
AC_FUNC_SELECT_ARGTYPES
|
||||||
|
|
||||||
dnl Checks for library functions.
|
dnl Checks for library functions.
|
||||||
dnl AC_PROG_GCC_TRADITIONAL
|
dnl AC_PROG_GCC_TRADITIONAL
|
||||||
AC_TYPE_SIGNAL
|
AC_TYPE_SIGNAL
|
||||||
@@ -651,7 +861,6 @@ AC_CHECK_FUNCS( socket \
|
|||||||
tcgetattr \
|
tcgetattr \
|
||||||
perror \
|
perror \
|
||||||
closesocket \
|
closesocket \
|
||||||
setvbuf \
|
|
||||||
sigaction \
|
sigaction \
|
||||||
signal \
|
signal \
|
||||||
getpass_r \
|
getpass_r \
|
||||||
@@ -661,7 +870,21 @@ AC_CHECK_FUNCS( socket \
|
|||||||
dlopen \
|
dlopen \
|
||||||
utime \
|
utime \
|
||||||
sigsetjmp \
|
sigsetjmp \
|
||||||
poll
|
poll,
|
||||||
|
dnl if found
|
||||||
|
[],
|
||||||
|
dnl if not found, $ac_func is the name we check for
|
||||||
|
func="$ac_func"
|
||||||
|
AC_MSG_CHECKING([deeper for $func])
|
||||||
|
AC_TRY_LINK( [],
|
||||||
|
[ $func ();],
|
||||||
|
AC_MSG_RESULT(yes!)
|
||||||
|
eval "ac_cv_func_$func=yes"
|
||||||
|
def=`echo "HAVE_$func" | tr 'a-z' 'A-Z'`
|
||||||
|
AC_DEFINE_UNQUOTED($def, 1, [If you have $func]),
|
||||||
|
AC_MSG_RESULT(but still no)
|
||||||
|
)
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
dnl sigsetjmp() might be a macro and no function so if it isn't found already
|
dnl sigsetjmp() might be a macro and no function so if it isn't found already
|
||||||
@@ -672,20 +895,11 @@ if test "$ac_cv_func_sigsetjmp" != "yes"; then
|
|||||||
[sigjmp_buf jmpenv;
|
[sigjmp_buf jmpenv;
|
||||||
sigsetjmp(jmpenv, 1);],
|
sigsetjmp(jmpenv, 1);],
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_SIGSETJMP),
|
AC_DEFINE(HAVE_SIGSETJMP, 1, [If you have sigsetjmp]),
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl removed 'getpass' check on October 26, 2000
|
|
||||||
|
|
||||||
if test "$ac_cv_func_select" != "yes"; then
|
|
||||||
AC_MSG_ERROR(Can't work without an existing select() function)
|
|
||||||
fi
|
|
||||||
if test "$ac_cv_func_socket" != "yes"; then
|
|
||||||
AC_MSG_ERROR(Can't work without an existing socket() function)
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_PATH_PROG( PERL, perl, ,
|
AC_PATH_PROG( PERL, perl, ,
|
||||||
$PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin )
|
$PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin )
|
||||||
AC_SUBST(PERL)
|
AC_SUBST(PERL)
|
||||||
@@ -694,32 +908,6 @@ AC_PATH_PROGS( NROFF, gnroff nroff, ,
|
|||||||
$PATH:/usr/bin/:/usr/local/bin )
|
$PATH:/usr/bin/:/usr/local/bin )
|
||||||
AC_SUBST(NROFF)
|
AC_SUBST(NROFF)
|
||||||
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([CA cert bundle install path])
|
|
||||||
|
|
||||||
AC_ARG_WITH(ca-bundle,
|
|
||||||
AC_HELP_STRING([--with-ca-bundle=FILE], [File name to install the CA bundle as])
|
|
||||||
AC_HELP_STRING([--without-ca-bundle], [Don't install the CA bundle]),
|
|
||||||
[ ca="$withval" ],
|
|
||||||
[
|
|
||||||
if test "x$prefix" != xNONE; then
|
|
||||||
ca="$prefix/share/curl/curl-ca-bundle.crt"
|
|
||||||
else
|
|
||||||
ca="$ac_default_prefix/share/curl/curl-ca-bundle.crt"
|
|
||||||
fi
|
|
||||||
] )
|
|
||||||
|
|
||||||
if test "x$ca" = "xno"; then
|
|
||||||
dnl let's not keep "no" as path name, blank it instead
|
|
||||||
ca=""
|
|
||||||
else
|
|
||||||
AC_DEFINE_UNQUOTED(CURL_CA_BUNDLE, "$ca", [CA bundle full path name])
|
|
||||||
fi
|
|
||||||
|
|
||||||
CURL_CA_BUNDLE="$ca"
|
|
||||||
AC_SUBST(CURL_CA_BUNDLE)
|
|
||||||
AC_MSG_RESULT([$ca])
|
|
||||||
|
|
||||||
AC_PROG_YACC
|
AC_PROG_YACC
|
||||||
|
|
||||||
dnl AC_PATH_PROG( RANLIB, ranlib, /usr/bin/ranlib,
|
dnl AC_PATH_PROG( RANLIB, ranlib, /usr/bin/ranlib,
|
||||||
@@ -731,16 +919,32 @@ dnl lame option to switch on debug options
|
|||||||
dnl
|
dnl
|
||||||
AC_MSG_CHECKING([whether to enable debug options])
|
AC_MSG_CHECKING([whether to enable debug options])
|
||||||
AC_ARG_ENABLE(debug,
|
AC_ARG_ENABLE(debug,
|
||||||
[ --enable-debug Enable pedantic debug options
|
AC_HELP_STRING([--enable-debug],[Enable pedantic debug options])
|
||||||
--disable-debug Disable debug options],
|
AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
;;
|
;;
|
||||||
*) AC_MSG_RESULT(yes)
|
*) AC_MSG_RESULT(yes)
|
||||||
|
|
||||||
CPPFLAGS="$CPPFLAGS -DMALLOCDEBUG"
|
CPPFLAGS="$CPPFLAGS -DCURLDEBUG"
|
||||||
CFLAGS="-W -Wall -Wwrite-strings -pedantic -Wundef -Wpointer-arith -Wcast-align -Wnested-externs -g"
|
CFLAGS="$CFLAGS -g"
|
||||||
|
if test "$GCC" = "yes"; then
|
||||||
|
CFLAGS="$CFLAGS -W -Wall -Wwrite-strings -pedantic -Wundef -Wpointer-arith -Wnested-externs"
|
||||||
|
fi
|
||||||
|
dnl strip off optimizer flags
|
||||||
|
NEWFLAGS=""
|
||||||
|
for flag in $CFLAGS; do
|
||||||
|
case "$flag" in
|
||||||
|
-O*)
|
||||||
|
dnl echo "cut off $flag"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
NEWFLAGS="$NEWFLAGS $flag"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
CFLAGS=$NEWFLAGS
|
||||||
;;
|
;;
|
||||||
esac ],
|
esac ],
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
@@ -757,6 +961,7 @@ AC_CONFIG_FILES([Makefile \
|
|||||||
tests/Makefile \
|
tests/Makefile \
|
||||||
tests/data/Makefile \
|
tests/data/Makefile \
|
||||||
tests/server/Makefile \
|
tests/server/Makefile \
|
||||||
|
tests/libtest/Makefile \
|
||||||
packages/Makefile \
|
packages/Makefile \
|
||||||
packages/Win32/Makefile \
|
packages/Win32/Makefile \
|
||||||
packages/Win32/cygwin/Makefile \
|
packages/Win32/cygwin/Makefile \
|
||||||
@@ -765,9 +970,9 @@ AC_CONFIG_FILES([Makefile \
|
|||||||
packages/Linux/RPM/curl.spec \
|
packages/Linux/RPM/curl.spec \
|
||||||
packages/Linux/RPM/curl-ssl.spec \
|
packages/Linux/RPM/curl-ssl.spec \
|
||||||
packages/Solaris/Makefile \
|
packages/Solaris/Makefile \
|
||||||
|
packages/DOS/Makefile \
|
||||||
packages/EPM/curl.list \
|
packages/EPM/curl.list \
|
||||||
packages/EPM/Makefile \
|
packages/EPM/Makefile \
|
||||||
curl-config
|
curl-config
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
@@ -107,7 +107,11 @@ while test $# -gt 0; do
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
--cflags)
|
--cflags)
|
||||||
echo -I@includedir@
|
if test "X@includedir@" = "X/usr/include"; then
|
||||||
|
echo ""
|
||||||
|
else
|
||||||
|
echo "-I@includedir@"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--libs)
|
--libs)
|
||||||
|
21
curl-mode.el
21
curl-mode.el
@@ -1,21 +0,0 @@
|
|||||||
;;;; Emacs Lisp help for writing curl code. ;;;;
|
|
||||||
|
|
||||||
;;; In C files, put something like this to load this file automatically:
|
|
||||||
;;
|
|
||||||
;; /* -----------------------------------------------------------------
|
|
||||||
;; * local variables:
|
|
||||||
;; * eval: (load-file "../curl-mode.el")
|
|
||||||
;; * end:
|
|
||||||
;; */
|
|
||||||
;;
|
|
||||||
;; (note: make sure to get the path right in the argument to load-file).
|
|
||||||
|
|
||||||
|
|
||||||
;;; The curl hacker's C conventions
|
|
||||||
|
|
||||||
;;; we use intent-level 2
|
|
||||||
(setq c-basic-offset 2)
|
|
||||||
;;; never ever use tabs to indent!
|
|
||||||
(setq indent-tabs-mode nil)
|
|
||||||
;;; I like this, stolen from Subversion! ;-)
|
|
||||||
(setq angry-mob-with-torches-and-pitchforks t)
|
|
50
curl-style.el
Normal file
50
curl-style.el
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
;;;; Emacs Lisp help for writing curl code. ;;;;
|
||||||
|
;;;; $Id$
|
||||||
|
|
||||||
|
;;; The curl hacker's C conventions.
|
||||||
|
|
||||||
|
;;; After loading this file and added the mode-hook you can in C
|
||||||
|
;;; files, put something like this to use the curl style
|
||||||
|
;;; automatically:
|
||||||
|
;;
|
||||||
|
;; /* -----------------------------------------------------------------
|
||||||
|
;; * local variables:
|
||||||
|
;; * eval: (set c-file-style "curl")
|
||||||
|
;; * end:
|
||||||
|
;; */
|
||||||
|
;;
|
||||||
|
|
||||||
|
(defconst curl-c-style
|
||||||
|
'((c-basic-offset . 2)
|
||||||
|
(c-comment-only-line-offset . 0)
|
||||||
|
(c-hanging-braces-alist . ((substatement-open before after)))
|
||||||
|
(c-offsets-alist . ((topmost-intro . 0)
|
||||||
|
(topmost-intro-cont . 0)
|
||||||
|
(substatement . +)
|
||||||
|
(substatement-open . 0)
|
||||||
|
(statement-case-intro . +)
|
||||||
|
(statement-case-open . 0)
|
||||||
|
(case-label . 0)
|
||||||
|
))
|
||||||
|
)
|
||||||
|
"Curl C Programming Style")
|
||||||
|
|
||||||
|
;; Customizations for all of c-mode, c++-mode, and objc-mode
|
||||||
|
(defun curl-c-mode-common-hook ()
|
||||||
|
"Curl C mode hook"
|
||||||
|
;; add curl style and set it for the current buffer
|
||||||
|
(c-add-style "curl" curl-c-style t)
|
||||||
|
(setq tab-width 8
|
||||||
|
indent-tabs-mode nil ; Use spaces. Not tabs.
|
||||||
|
comment-column 40
|
||||||
|
c-font-lock-extra-types (append '("bool" "CURL" "CURLcode" "ssize_t" "size_t" "socklen_t" "fd_set" "time_t"))
|
||||||
|
)
|
||||||
|
;; keybindings for C, C++, and Objective-C. We can put these in
|
||||||
|
;; c-mode-base-map because of inheritance ...
|
||||||
|
(define-key c-mode-base-map "\M-q" 'c-fill-paragraph)
|
||||||
|
(setq c-recognize-knr-p nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
;; Set this is in your .emacs if you want to use the c-mode-hook as
|
||||||
|
;; defined here right out of the box.
|
||||||
|
; (add-hook 'c-mode-common-hook 'curl-c-mode-common-hook)
|
@@ -1,3 +1,5 @@
|
|||||||
Makefile
|
Makefile
|
||||||
Makefile.in
|
Makefile.in
|
||||||
*html
|
*html
|
||||||
|
*ps
|
||||||
|
*pdf
|
||||||
|
11
docs/BUGS
11
docs/BUGS
@@ -8,7 +8,7 @@ $Id$
|
|||||||
BUGS
|
BUGS
|
||||||
|
|
||||||
Curl and libcurl have grown substantially since the beginning. At the time
|
Curl and libcurl have grown substantially since the beginning. At the time
|
||||||
of writing (end of April 2002), there are 32000 lines of source code, and by
|
of writing (end of March 2003), there are 35000 lines of source code, and by
|
||||||
the time you read this it has probably grown even more.
|
the time you read this it has probably grown even more.
|
||||||
|
|
||||||
Of course there are lots of bugs left. And lots of misfeatures.
|
Of course there are lots of bugs left. And lots of misfeatures.
|
||||||
@@ -19,18 +19,21 @@ BUGS
|
|||||||
WHERE TO REPORT
|
WHERE TO REPORT
|
||||||
|
|
||||||
If you can't fix a bug yourself and submit a fix for it, try to report an as
|
If you can't fix a bug yourself and submit a fix for it, try to report an as
|
||||||
detailed report as possible to the curl mailing list to allow one of us to
|
detailed report as possible to a curl mailing list to allow one of us to
|
||||||
have a go at a solution. You should also post your bug/problem at curl's bug
|
have a go at a solution. You should also post your bug/problem at curl's bug
|
||||||
tracking system over at
|
tracking system over at
|
||||||
|
|
||||||
http://sourceforge.net/bugs/?group_id=976
|
http://sourceforge.net/bugs/?group_id=976
|
||||||
|
|
||||||
(but please read the section below first before doing that)
|
(but please read the sections below first before doing that)
|
||||||
|
|
||||||
|
If you feel you need to ask around first, find a suitable mailing list and
|
||||||
|
post there. The lists are available on http://curl.haxx.se/mail/
|
||||||
|
|
||||||
WHAT TO REPORT
|
WHAT TO REPORT
|
||||||
|
|
||||||
When reporting a bug, you should include information that will help us
|
When reporting a bug, you should include information that will help us
|
||||||
understand what's wrong what you expected to happen and how to repeat the
|
understand what's wrong, what you expected to happen and how to repeat the
|
||||||
bad behavior. You therefore need to tell us:
|
bad behavior. You therefore need to tell us:
|
||||||
|
|
||||||
- your operating system's name and version number (uname -a under a unix
|
- your operating system's name and version number (uname -a under a unix
|
||||||
|
@@ -6,15 +6,16 @@
|
|||||||
|
|
||||||
To Think About When Contributing Source Code
|
To Think About When Contributing Source Code
|
||||||
|
|
||||||
This document is intended to offer some guidelines that can be useful to keep
|
This document is intended to offer some simple guidelines that can be useful
|
||||||
in mind when you decide to write a contribution to the project. This concerns
|
to keep in mind when you decide to contribute to the project. This concerns
|
||||||
new features as well as corrections to existing flaws or bugs.
|
new features as well as corrections to existing flaws or bugs.
|
||||||
|
|
||||||
Join the Community
|
Join the Community
|
||||||
|
|
||||||
Skip over to http://curl.haxx.se/mail/ and join the appropriate mailing
|
Skip over to http://curl.haxx.se/mail/ and join the appropriate mailing
|
||||||
list(s). Read up on details before you post questions. Read this file before
|
list(s). Read up on details before you post questions. Read this file before
|
||||||
you start sending patches!
|
you start sending patches! We prefer patches and discussions being held on
|
||||||
|
the mailing list(s), not sent to individuals.
|
||||||
|
|
||||||
The License Issue
|
The License Issue
|
||||||
|
|
||||||
@@ -29,9 +30,9 @@ The License Issue
|
|||||||
|
|
||||||
What To Read
|
What To Read
|
||||||
|
|
||||||
Source code, the man pages, the INTERALS document, the TODO, the most recent
|
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
|
CHANGES. Just lurking on the libcurl mailing list is gonna give you a lot of
|
||||||
insights on what's going on right now.
|
insights on what's going on right now. Asking there is a good idea too.
|
||||||
|
|
||||||
Naming
|
Naming
|
||||||
|
|
||||||
@@ -39,26 +40,32 @@ Naming
|
|||||||
names. It doesn't necessarily have to mean that you should use the same as in
|
names. It doesn't necessarily have to mean that you should use the same as in
|
||||||
other places of the code, just that the names should be logical,
|
other places of the code, just that the names should be logical,
|
||||||
understandable and be named according to what they're used for. File-local
|
understandable and be named according to what they're used for. File-local
|
||||||
functions should be made static.
|
functions should be made static. We like lower case names.
|
||||||
|
|
||||||
|
See the INTERNALS document on how we name non-exported library-global
|
||||||
|
symbols.
|
||||||
|
|
||||||
Indenting
|
Indenting
|
||||||
|
|
||||||
Please try using the same indenting levels and bracing method as all the
|
Please try using the same indenting levels and bracing method as all the
|
||||||
other code already does. It makes the source code a lot easier to follow if
|
other code already does. It makes the source code a lot easier to follow if
|
||||||
all of it is written using the same style. We don't ask you to like it, we
|
all of it is written using the same style. We don't ask you to like it, we
|
||||||
just ask you to follow the tradition! ;-)
|
just ask you to follow the tradition! ;-) This mainly means: 2-level indents,
|
||||||
|
using spaces only (no tabs) and having the opening brace ({) on the same line
|
||||||
|
as the if() or while().
|
||||||
|
|
||||||
Commenting
|
Commenting
|
||||||
|
|
||||||
Comment your source code extensively. Commented code is quality code and
|
Comment your source code extensively using C comments (/* comment */), DO NOT
|
||||||
enables future modifications much more. Uncommented code much more risk being
|
use C++ comments (// this style). Commented code is quality code and enables
|
||||||
|
future modifications much more. Uncommented code much more risk being
|
||||||
completely replaced when someone wants to extend things, since other persons'
|
completely replaced when someone wants to extend things, since other persons'
|
||||||
source code can get quite hard to read.
|
source code can get quite hard to read.
|
||||||
|
|
||||||
General Style
|
General Style
|
||||||
|
|
||||||
Keep your functions small. If they're small you avoid a lot of mistakes and
|
Keep your functions small. If they're small you avoid a lot of mistakes and
|
||||||
you don't accidentally mix up variables.
|
you don't accidentally mix up variables etc.
|
||||||
|
|
||||||
Non-clobbering All Over
|
Non-clobbering All Over
|
||||||
|
|
||||||
@@ -69,7 +76,14 @@ Non-clobbering All Over
|
|||||||
functionality, try writing it in a new source file. If you fix bugs, try to
|
functionality, try writing it in a new source file. If you fix bugs, try to
|
||||||
fix one bug at a time and send them as separate patches.
|
fix one bug at a time and send them as separate patches.
|
||||||
|
|
||||||
Separate Patches Doing Different Things
|
Platform Dependent Code
|
||||||
|
|
||||||
|
Use #ifdef HAVE_FEATURE to do conditional code. We avoid checking for
|
||||||
|
particular operating systems or hardware in the #ifdef lines. The
|
||||||
|
HAVE_FEATURE shall be generated by the configure script for unix-like systems
|
||||||
|
and they are hard-coded in the config-[system].h files for the others.
|
||||||
|
|
||||||
|
Separate Patches
|
||||||
|
|
||||||
It is annoying when you get a huge patch from someone that is said to fix 511
|
It is annoying when you get a huge patch from someone that is said to fix 511
|
||||||
odd problems, but discussions and opinions don't agree with 510 of them - or
|
odd problems, but discussions and opinions don't agree with 510 of them - or
|
||||||
@@ -94,6 +108,10 @@ Document
|
|||||||
small description of your fix or your new features with every contribution so
|
small description of your fix or your new features with every contribution so
|
||||||
that it can be swiftly added to the package documentation.
|
that it can be swiftly added to the package documentation.
|
||||||
|
|
||||||
|
The documentation is always made in man pages (nroff formatted) or plain
|
||||||
|
ASCII files. All HTML files on the web site and in the release archives are
|
||||||
|
generated from the nroff/ASCII versions.
|
||||||
|
|
||||||
Write Access to CVS Repository
|
Write Access to CVS Repository
|
||||||
|
|
||||||
If you are a frequent contributor, or have another good reason, you can of
|
If you are a frequent contributor, or have another good reason, you can of
|
||||||
@@ -111,3 +129,31 @@ Test Cases
|
|||||||
in the test suite. Every feature that is added should get at least one valid
|
in the test suite. Every feature that is added should get at least one valid
|
||||||
test case that verifies that it works as documented. If every submitter also
|
test case that verifies that it works as documented. If every submitter also
|
||||||
post a few test cases, it won't end up as a heavy burden on a single person!
|
post a few test cases, it won't end up as a heavy burden on a single person!
|
||||||
|
|
||||||
|
How To Make a Patch
|
||||||
|
|
||||||
|
Keep a copy of the unmodified curl sources. Make your changes in a separate
|
||||||
|
source tree. When you think you have something that you want to offer the
|
||||||
|
curl community, use GNU diff to generate patches.
|
||||||
|
|
||||||
|
If you have modified a single file, try something like:
|
||||||
|
|
||||||
|
diff -u undmodified-file.c my-changed-one.c > my-fixes.diff
|
||||||
|
|
||||||
|
If you have modified several files, possibly in different directories, you
|
||||||
|
can use diff recursively:
|
||||||
|
|
||||||
|
diff -ur curl-original-dir curl-modfied-sources-dir > my-fixes.diff
|
||||||
|
|
||||||
|
The GNU diff and GNU patch tools exist for virtually all platforms, including
|
||||||
|
all kinds of unixes and Windows:
|
||||||
|
|
||||||
|
For unix-like operating systems:
|
||||||
|
|
||||||
|
http://www.fsf.org/software/patch/patch.html
|
||||||
|
http://www.gnu.org/directory/diffutils.html
|
||||||
|
|
||||||
|
For Windows:
|
||||||
|
|
||||||
|
http://gnuwin32.sourceforge.net/packages/patch.htm
|
||||||
|
http://gnuwin32.sourceforge.net/packages/diffutils.htm
|
||||||
|
149
docs/FAQ
149
docs/FAQ
@@ -1,4 +1,4 @@
|
|||||||
Updated: September 3, 2002 (http://curl.haxx.se/docs/faq.html)
|
Updated: June 17, 2003 (http://curl.haxx.se/docs/faq.html)
|
||||||
_ _ ____ _
|
_ _ ____ _
|
||||||
___| | | | _ \| |
|
___| | | | _ \| |
|
||||||
/ __| | | | |_) | |
|
/ __| | | | |_) | |
|
||||||
@@ -58,6 +58,8 @@ FAQ
|
|||||||
4.8 I found a bug!
|
4.8 I found a bug!
|
||||||
4.9 Curl can't authenticate to the server that requires NTLM?
|
4.9 Curl can't authenticate to the server that requires NTLM?
|
||||||
4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
|
4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
|
||||||
|
4.11 Why does my HTTP range requests return the full document?
|
||||||
|
4.12 Why do I get "certificate verify failed" ?
|
||||||
|
|
||||||
5. libcurl Issues
|
5. libcurl Issues
|
||||||
5.1 Is libcurl thread-safe?
|
5.1 Is libcurl thread-safe?
|
||||||
@@ -66,6 +68,7 @@ FAQ
|
|||||||
5.4 Does libcurl do Winsock initing on win32 systems?
|
5.4 Does libcurl do Winsock initing on win32 systems?
|
||||||
5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ?
|
5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ?
|
||||||
5.6 What about Keep-Alive or persistent connections?
|
5.6 What about Keep-Alive or persistent connections?
|
||||||
|
5.7 Link errors when building libcurl on Windows!
|
||||||
|
|
||||||
6. License Issues
|
6. License Issues
|
||||||
6.1 I have a GPL program, can I use the libcurl library?
|
6.1 I have a GPL program, can I use the libcurl library?
|
||||||
@@ -94,6 +97,12 @@ FAQ
|
|||||||
We spell it cURL or just curl. We pronounce it with an initial k sound:
|
We spell it cURL or just curl. We pronounce it with an initial k sound:
|
||||||
[kurl].
|
[kurl].
|
||||||
|
|
||||||
|
NOTE: there are numerous sub-projects and related projects that also use the
|
||||||
|
word curl in the project names in various combinations, but you should take
|
||||||
|
notice that this FAQ is directed at the command-line tool named curl (and
|
||||||
|
libcurl the library), and may therefore not be valid for other curl
|
||||||
|
projects.
|
||||||
|
|
||||||
1.2 What is libcurl?
|
1.2 What is libcurl?
|
||||||
|
|
||||||
libcurl is a reliable and portable library which provides you with an easy
|
libcurl is a reliable and portable library which provides you with an easy
|
||||||
@@ -129,11 +138,9 @@ FAQ
|
|||||||
better. We do however believe in a few rules when it comes to the future of
|
better. We do however believe in a few rules when it comes to the future of
|
||||||
curl:
|
curl:
|
||||||
|
|
||||||
* Curl is to remain a command line tool. If you want GUIs or fancy scripting
|
* Curl -- the command line tool -- is to remain a non-graphical command line
|
||||||
capabilities, you're free to write another tool that uses libcurl and that
|
tool. If you want GUIs or fancy scripting capabilities, you should look
|
||||||
offers this. There's no point in having a single tool that does every
|
for another tool that uses libcurl.
|
||||||
imaginable thing. That's also one of the great advantages of having the
|
|
||||||
core of curl as a library.
|
|
||||||
|
|
||||||
* We do not add things to curl that other small and available tools already
|
* We do not add things to curl that other small and available tools already
|
||||||
do very fine at the side. Curl's output is fine to pipe into another
|
do very fine at the side. Curl's output is fine to pipe into another
|
||||||
@@ -172,20 +179,21 @@ FAQ
|
|||||||
Project cURL is entirely free and open. No person gets paid for developing
|
Project cURL is entirely free and open. No person gets paid for developing
|
||||||
curl. We do this voluntarily on our spare time.
|
curl. We do this voluntarily on our spare time.
|
||||||
|
|
||||||
We get some help from companies. Contactor Data hosts the curl web site and
|
We get some help from companies. Contactor Data hosts the curl web site,
|
||||||
the main mailing list, Haxx owns the curl web site's domain and
|
Haxx owns the curl web site's domain and sourceforge.net hosts several
|
||||||
sourceforge.net hosts several project tools we take advantage from like the
|
project services we take advantage from, like the bug tracker, mailing lists
|
||||||
bug tracker, mailing lists and more.
|
and more.
|
||||||
|
|
||||||
If you want to support our project with a donation or similar, one way of
|
If you want to support our project with a donation or similar, one way of
|
||||||
doing that would be to buy "gift certificates" at useful online shopping
|
doing that would be to buy "gift certificates" at useful online shopping
|
||||||
sites, such as amazon.com or thinkgeek.com. Another way would be to sponsor
|
sites, such as amazon.com or thinkgeek.com. Another way would be to sponsor
|
||||||
us through a banner-program or even better: by helping us coding,
|
us through a banner-program or even better: by helping us coding,
|
||||||
documenting, testing etc.
|
documenting, testing etc. You're welcome to send us a buck using paypal, as
|
||||||
|
described here: http://curl.haxx.se/donation.html
|
||||||
|
|
||||||
1.7 What about CURL from curl.com?
|
1.7 What about CURL from curl.com?
|
||||||
|
|
||||||
During the summer 2001, curl.com has been busy advertising their client-side
|
During the summer 2001, curl.com was busy advertising their client-side
|
||||||
programming language for the web, named CURL.
|
programming language for the web, named CURL.
|
||||||
|
|
||||||
We are in no way associated with curl.com or their CURL programming
|
We are in no way associated with curl.com or their CURL programming
|
||||||
@@ -200,17 +208,17 @@ FAQ
|
|||||||
|
|
||||||
1.8 I have a problem who do I mail?
|
1.8 I have a problem who do I mail?
|
||||||
|
|
||||||
Please do not attempt to mail any single individual unless you really need
|
Please do not mail any single individual unless you really need to. Keep
|
||||||
to. Keep curl-related questions on a suitable mailing list. All available
|
curl-related questions on a suitable mailing list. All available mailing
|
||||||
mailing lists are listed in the MANUAL document and online at
|
lists are listed in the MANUAL document and online at
|
||||||
http://curl.haxx.se/mail/
|
http://curl.haxx.se/mail/
|
||||||
|
|
||||||
Keeping curl-related questions and discussions on mailing lists allows others
|
Keeping curl-related questions and discussions on mailing lists allows
|
||||||
to join in and help, to share their ideas, contribute their suggestions and
|
others to join in and help, to share their ideas, contribute their
|
||||||
spread their wisdom. Keeping discussions on public mailing lists also allows
|
suggestions and spread their wisdom. Keeping discussions on public mailing
|
||||||
for others to learn from this (both current and future users thanks to the
|
lists also allows for others to learn from this (both current and future
|
||||||
web based archives of the mailing lists), thus saving us from having to
|
users thanks to the web based archives of the mailing lists), thus saving us
|
||||||
repeat ourselves even more. Thanks for respecting this.
|
from having to repeat ourselves even more. Thanks for respecting this.
|
||||||
|
|
||||||
|
|
||||||
2. Install Related Problems
|
2. Install Related Problems
|
||||||
@@ -272,8 +280,8 @@ FAQ
|
|||||||
|
|
||||||
2.4. Does cURL support Socks (RFC 1928) ?
|
2.4. Does cURL support Socks (RFC 1928) ?
|
||||||
|
|
||||||
No. Nobody has wanted it that badly yet. We appreciate patches that bring
|
There is limited support for SOCKS5 for curl built with IPv6 support
|
||||||
this functionality.
|
disabled.
|
||||||
|
|
||||||
|
|
||||||
3. Usage problems
|
3. Usage problems
|
||||||
@@ -365,9 +373,10 @@ FAQ
|
|||||||
|
|
||||||
http://curl.haxx.se/libcurl/
|
http://curl.haxx.se/libcurl/
|
||||||
|
|
||||||
In December 2001, there are interfaces available for the following
|
In February 2003, there are interfaces available for the following
|
||||||
languages: C/C++, Cocoa, Dylan, Java, Perl, PHP, Python, Rexx, Ruby, Scheme
|
languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal,
|
||||||
and Tcl. By the time you read this, additional ones may have appeared!
|
Pascal, Perl, PHP, PostgreSQL, Python, Rexx, Ruby, Scheme and Tcl. By the
|
||||||
|
time you read this, additional ones may have appeared!
|
||||||
|
|
||||||
3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
|
3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
|
||||||
|
|
||||||
@@ -376,8 +385,8 @@ FAQ
|
|||||||
XML-RPC are all such ones. You can use -X to set custom requests and -H to
|
XML-RPC are all such ones. You can use -X to set custom requests and -H to
|
||||||
set custom headers (or replace internally generated ones).
|
set custom headers (or replace internally generated ones).
|
||||||
|
|
||||||
Using libcurl or PHP's curl modules is just as fine and you'd just use the
|
Using libcurl is of course just as fine and you'd just use the proper
|
||||||
proper library options to do the same.
|
library options to do the same.
|
||||||
|
|
||||||
3.11 How do I POST with a different Content-Type?
|
3.11 How do I POST with a different Content-Type?
|
||||||
|
|
||||||
@@ -491,8 +500,7 @@ FAQ
|
|||||||
curl '{curl,www}.haxx.se'
|
curl '{curl,www}.haxx.se'
|
||||||
|
|
||||||
To be able to use those letters as actual parts of the URL (without using
|
To be able to use those letters as actual parts of the URL (without using
|
||||||
them for the curl URL "globbing" system), use the -g/--globoff option (curl
|
them for the curl URL "globbing" system), use the -g/--globoff option:
|
||||||
7.6 and later):
|
|
||||||
|
|
||||||
curl -g 'www.site.com/weirdname[].html'
|
curl -g 'www.site.com/weirdname[].html'
|
||||||
|
|
||||||
@@ -585,9 +593,11 @@ FAQ
|
|||||||
|
|
||||||
4.9. Curl can't authenticate to the server that requires NTLM?
|
4.9. Curl can't authenticate to the server that requires NTLM?
|
||||||
|
|
||||||
NTLM is a Microsoft proprietary protocol. Unfortunately, curl does not
|
This is supported in curl 7.10.6 or later. No earlier curl version knows
|
||||||
currently support that. Proprietary formats are evil. You should not use
|
of this magic.
|
||||||
such ones.
|
|
||||||
|
NTLM is a Microsoft proprietary protocol. Proprietary formats are evil. You
|
||||||
|
should not use such ones.
|
||||||
|
|
||||||
4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
|
4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
|
||||||
|
|
||||||
@@ -600,6 +610,34 @@ FAQ
|
|||||||
software you're trying to interact with. This is not anything curl can do
|
software you're trying to interact with. This is not anything curl can do
|
||||||
anything about.
|
anything about.
|
||||||
|
|
||||||
|
4.11 Why does my HTTP range requests return the full document?
|
||||||
|
|
||||||
|
Because the range may not be supported by the server, or the server may
|
||||||
|
choose to ignore it and return the full document anyway.
|
||||||
|
|
||||||
|
4.12 Why do I get "certificate verify failed" ?
|
||||||
|
|
||||||
|
You invoke curl 7.10 or later to communicate on a https:// URL and get an
|
||||||
|
error back looking something similar to this:
|
||||||
|
|
||||||
|
curl: (35) SSL: error:14090086:SSL routines:
|
||||||
|
SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
|
||||||
|
|
||||||
|
Then it means that curl couldn't verify that the server's certificate was
|
||||||
|
good. Curl verifies the certificate using the CA cert bundle that comes with
|
||||||
|
the curl installation.
|
||||||
|
|
||||||
|
To disable the verification (which makes it act like curl did before 7.10),
|
||||||
|
use -k. This does however enable man-in-the-middle attacks.
|
||||||
|
|
||||||
|
If you get this failure but are having a CA cert bundle installed and used,
|
||||||
|
the server's certificate is not signed by one of the CA's in the bundle. It
|
||||||
|
might for example be self-signed. You then correct this problem by obtaining
|
||||||
|
a valid CA cert for the server. Or again, decrease the security by disabling
|
||||||
|
this check.
|
||||||
|
|
||||||
|
Details are also in the SSLCERTS file in the release archives, found online
|
||||||
|
here: http://curl.haxx.se/docs/sslcerts.html
|
||||||
|
|
||||||
5. libcurl Issues
|
5. libcurl Issues
|
||||||
|
|
||||||
@@ -651,20 +689,15 @@ FAQ
|
|||||||
|
|
||||||
5.3 How do I fetch multiple files with libcurl?
|
5.3 How do I fetch multiple files with libcurl?
|
||||||
|
|
||||||
Starting with version 7.7, curl and libcurl will have excellent support for
|
libcurl has excellent support for transferring multiple files. You should
|
||||||
transferring multiple files. You should just repeatedly set new URLs with
|
just repeatedly set new URLs with curl_easy_setopt() and then transfer it
|
||||||
curl_easy_setopt() and then transfer it with curl_easy_perform(). The handle
|
with curl_easy_perform(). The handle you get from curl_easy_init() is not
|
||||||
you get from curl_easy_init() is not only reusable starting with libcurl
|
only reusable, but you're even encouraged to reuse it if you can, as that
|
||||||
7.7, but also you're encouraged to reuse it if you can, as that will enable
|
will enable libcurl to use persistent connections.
|
||||||
libcurl to use persistent connections.
|
|
||||||
|
|
||||||
For libcurl prior to 7.7, there was no multiple file support. The only
|
|
||||||
available way to do multiple requests was to init/perform/cleanup for each
|
|
||||||
transfer.
|
|
||||||
|
|
||||||
5.4 Does libcurl do Winsock initialization on win32 systems?
|
5.4 Does libcurl do Winsock initialization on win32 systems?
|
||||||
|
|
||||||
Yes (since 7.8.1) if told to in the curl_global_init() call.
|
Yes, if told to in the curl_global_init() call.
|
||||||
|
|
||||||
5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ?
|
5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ?
|
||||||
|
|
||||||
@@ -678,13 +711,24 @@ FAQ
|
|||||||
|
|
||||||
5.6 What about Keep-Alive or persistent connections?
|
5.6 What about Keep-Alive or persistent connections?
|
||||||
|
|
||||||
Starting with version 7.7, curl and libcurl will have excellent support for
|
curl and libcurl have excellent support for persistent connections when
|
||||||
persistent connections when transferring several files from the same server.
|
transferring several files from the same server. Curl will attempt to reuse
|
||||||
Curl will attempt to reuse connections for all URLs specified on the same
|
connections for all URLs specified on the same command line/config file, and
|
||||||
command line/config file, and libcurl will reuse connections for all
|
libcurl will reuse connections for all transfers that are made using the
|
||||||
transfers that are made using the same libcurl handle.
|
same libcurl handle.
|
||||||
|
|
||||||
|
5.7 Link errors when building libcurl on Windows!
|
||||||
|
|
||||||
|
You need to make sure that your project, and all the libraries (both static
|
||||||
|
and dynamic) that it links against, are compiled/linked against the same run
|
||||||
|
time library.
|
||||||
|
|
||||||
|
This is determined by the /MD, /ML, /MT (and their corresponding /M?d)
|
||||||
|
options to the command line compiler. /MD (linking against MSVCRT dll) seems
|
||||||
|
to be the most commonly used option.
|
||||||
|
|
||||||
|
(Provided by Andrew Francis)
|
||||||
|
|
||||||
Previous versions had no persistent connection support.
|
|
||||||
|
|
||||||
6. License Issues
|
6. License Issues
|
||||||
|
|
||||||
@@ -734,6 +778,5 @@ FAQ
|
|||||||
discussions and a large amount of people have contributed with source code
|
discussions and a large amount of people have contributed with source code
|
||||||
knowing that this is the license we use. This license puts the restrictions
|
knowing that this is the license we use. This license puts the restrictions
|
||||||
we want on curl/libcurl and it does not spread to other programs or
|
we want on curl/libcurl and it does not spread to other programs or
|
||||||
libraries that use it. The recent dual license modification should make it
|
libraries that use it. It should be possible for everyone to use libcurl or
|
||||||
possible for everyone to use libcurl or curl in their projects, no matter
|
curl in their projects, no matter what license they already have in use.
|
||||||
what license they already have in use.
|
|
||||||
|
@@ -17,27 +17,30 @@ Misc
|
|||||||
- progress bar/time specs while downloading
|
- progress bar/time specs while downloading
|
||||||
- "standard" proxy environment variables support
|
- "standard" proxy environment variables support
|
||||||
- config file support
|
- config file support
|
||||||
- compiles on win32 (reported built on 29 operating systems)
|
- compiles on win32 (reported builds on 40+ operating systems)
|
||||||
- redirectable stderr
|
- redirectable stderr
|
||||||
- use selected network interface for outgoing traffic
|
- selectable network interface for outgoing traffic
|
||||||
- IPv6 support
|
- IPv6 support
|
||||||
- persistant connections
|
- persistant connections
|
||||||
|
- socks5 support
|
||||||
|
- supports user name + password in proxy environment variables
|
||||||
|
- operations through proxy "tunnel" (using CONNECT)
|
||||||
|
|
||||||
HTTP
|
HTTP
|
||||||
- HTTP/1.1 compliant
|
- HTTP/1.1 compliant (optionally uses 1.0)
|
||||||
- GET
|
- GET
|
||||||
- PUT
|
- PUT
|
||||||
- HEAD
|
- HEAD
|
||||||
- POST
|
- POST
|
||||||
- multipart POST
|
- multipart formpost (RFC1867-style)
|
||||||
- authentication
|
- authentication (Basic, Digest, NTLM(*1), GSS-Negotiate(*3))
|
||||||
- resume (both GET and PUT)
|
- resume (both GET and PUT)
|
||||||
- follow redirects
|
- follow redirects
|
||||||
- maximum amount of redirects to follow
|
- maximum amount of redirects to follow
|
||||||
- custom HTTP request
|
- custom HTTP request
|
||||||
- cookie get/send fully parsed
|
- cookie get/send fully parsed
|
||||||
- understands the netscape cookie file format
|
- reads/writes the netscape cookie file format
|
||||||
- custom headers (that can replace/remove internally generated headers)
|
- custom headers (replace/remove internally generated headers)
|
||||||
- custom user-agent string
|
- custom user-agent string
|
||||||
- custom referer string
|
- custom referer string
|
||||||
- range
|
- range
|
||||||
@@ -45,12 +48,16 @@ HTTP
|
|||||||
- time conditions
|
- time conditions
|
||||||
- via http-proxy
|
- via http-proxy
|
||||||
- retrieve file modification date
|
- retrieve file modification date
|
||||||
|
- Content-Encoding support for deflate and gzip
|
||||||
|
- "Transfer-Encoding: chunked" support for "uploads"
|
||||||
|
|
||||||
HTTPS (*1)
|
HTTPS (*1)
|
||||||
- (all the HTTP features)
|
- (all the HTTP features)
|
||||||
- using certificates
|
- using certificates
|
||||||
- verify server certificate
|
- verify server certificate
|
||||||
- via http-proxy
|
- via http-proxy
|
||||||
|
- select desired encryption
|
||||||
|
- force usage of a specific SSL version (SSLv2, SSLv3 or TLSv1)
|
||||||
|
|
||||||
FTP
|
FTP
|
||||||
- download
|
- download
|
||||||
@@ -90,5 +97,6 @@ GOPHER
|
|||||||
FILE
|
FILE
|
||||||
- URL support
|
- URL support
|
||||||
|
|
||||||
*1 = requires OpenSSL
|
*1 = requires OpenSSL
|
||||||
*2 = requires OpenLDAP
|
*2 = requires OpenLDAP
|
||||||
|
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
||||||
|
17
docs/HISTORY
17
docs/HISTORY
@@ -4,7 +4,7 @@
|
|||||||
| (__| |_| | _ <| |___
|
| (__| |_| | _ <| |___
|
||||||
\___|\___/|_| \_\_____|
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
How cURL Become Like This
|
How cURL Became Like This
|
||||||
|
|
||||||
|
|
||||||
In the second half of 1997, Daniel Stenberg came up with the idea to make
|
In the second half of 1997, Daniel Stenberg came up with the idea to make
|
||||||
@@ -54,12 +54,12 @@ OpenSSL took over where SSLeay was abandoned.
|
|||||||
May 1999, first Debian package.
|
May 1999, first Debian package.
|
||||||
|
|
||||||
August 1999, LDAP:// and FILE:// support added. The curl web site gets 1300
|
August 1999, LDAP:// and FILE:// support added. The curl web site gets 1300
|
||||||
visits daily.
|
visits weekly.
|
||||||
|
|
||||||
Released curl 6.0 in September. 15000 lines of code.
|
Released curl 6.0 in September. 15000 lines of code.
|
||||||
|
|
||||||
December 28 1999, added project to Sourceforge and started using its services
|
December 28 1999, added the project on Sourceforge and started using its
|
||||||
for managing the project.
|
services for managing the project.
|
||||||
|
|
||||||
Spring 2000, major internal overhaul to provide a suitable library interface.
|
Spring 2000, major internal overhaul to provide a suitable library interface.
|
||||||
The first non-beta release was named 7.1 and arrived in August. This offered
|
The first non-beta release was named 7.1 and arrived in August. This offered
|
||||||
@@ -67,7 +67,7 @@ the easy interface and turned out to be the beginning of actually getting
|
|||||||
other software and programs to get based on and powered by libcurl. Almost
|
other software and programs to get based on and powered by libcurl. Almost
|
||||||
20000 lines of code.
|
20000 lines of code.
|
||||||
|
|
||||||
August 2000, the curl web site gets 4000 visits daily.
|
August 2000, the curl web site gets 4000 visits weekly.
|
||||||
|
|
||||||
The PHP guys adopted libcurl already the same month, when the first ever third
|
The PHP guys adopted libcurl already the same month, when the first ever third
|
||||||
party libcurl binding showed up. CURL has been a supported module in PHP since
|
party libcurl binding showed up. CURL has been a supported module in PHP since
|
||||||
@@ -92,7 +92,7 @@ code.
|
|||||||
|
|
||||||
August 2001. curl is bundled in Mac OS X, 10.1. It was already becoming more
|
August 2001. curl is bundled in Mac OS X, 10.1. It was already becoming more
|
||||||
and more of a standard utility of Linux distributions and a regular in the BSD
|
and more of a standard utility of Linux distributions and a regular in the BSD
|
||||||
ports collections. The curl web site gets 8000 visits daily. Curl Corporation
|
ports collections. The curl web site gets 8000 visits weekly. Curl Corporation
|
||||||
contacted Daniel to discuss "the name issue". After Daniel's reply, they have
|
contacted Daniel to discuss "the name issue". After Daniel's reply, they have
|
||||||
never since got in touch again.
|
never since got in touch again.
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ September 2001, libcurl 7.9 introduces cookie jar and curl_formadd(). During
|
|||||||
the forthcoming 7.9.x releases, we introduced the multi interface slowly and
|
the forthcoming 7.9.x releases, we introduced the multi interface slowly and
|
||||||
without much whistles.
|
without much whistles.
|
||||||
|
|
||||||
June 2002, the curl web site gets 13000 visits daily. curl and libcurl is
|
June 2002, the curl web site gets 13000 visits weekly. curl and libcurl is
|
||||||
35000 lines of code. Reported successful compiles on more than 40 combinations
|
35000 lines of code. Reported successful compiles on more than 40 combinations
|
||||||
of CPUs and operating systems.
|
of CPUs and operating systems.
|
||||||
|
|
||||||
@@ -111,3 +111,6 @@ distributions and otherwise retrieved as part of other software.
|
|||||||
|
|
||||||
September 2002, with the release of curl 7.10 it is released under the MIT
|
September 2002, with the release of curl 7.10 it is released under the MIT
|
||||||
license only.
|
license only.
|
||||||
|
|
||||||
|
February 2003, the curl site averages at 20000 visits weekly. At any given
|
||||||
|
moment, there's an average of 3 people browsing the curl.haxx.se site.
|
||||||
|
25
docs/HOWTO-RELEASE
Normal file
25
docs/HOWTO-RELEASE
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
Steps To Perform When Building a Public Release
|
||||||
|
|
||||||
|
* "make distcheck"
|
||||||
|
|
||||||
|
* ./maketgz
|
||||||
|
then upload the 3 curl packages maketgz created
|
||||||
|
|
||||||
|
* update these files:
|
||||||
|
www/_download.html
|
||||||
|
www/_changes.html
|
||||||
|
www/_newslog.html
|
||||||
|
www/Makefile
|
||||||
|
|
||||||
|
* commit the web changes
|
||||||
|
|
||||||
|
* 'cvs commit'
|
||||||
|
|
||||||
|
* 'cvs tag'
|
||||||
|
|
||||||
|
* write the release announcement, including:
|
||||||
|
- changes / bugfixes
|
||||||
|
- other curl-related news
|
||||||
|
- contributors
|
||||||
|
|
||||||
|
* mail release-announcement to curl-announce and curl-users
|
59
docs/INSTALL
59
docs/INSTALL
@@ -28,11 +28,26 @@ UNIX
|
|||||||
|
|
||||||
You probably need to be root when doing the last command.
|
You probably need to be root when doing the last command.
|
||||||
|
|
||||||
|
If you have checked out the sources from the CVS repository, read the
|
||||||
|
CVS-INFO on how to proceed.
|
||||||
|
|
||||||
|
Get a full listing of all available configure options by invoking it like:
|
||||||
|
|
||||||
|
./configure --help
|
||||||
|
|
||||||
If you want to install curl in a different file hierarchy than /usr/local,
|
If you want to install curl in a different file hierarchy than /usr/local,
|
||||||
you need to specify that already when running configure:
|
you need to specify that already when running configure:
|
||||||
|
|
||||||
./configure --prefix=/path/to/curl/tree
|
./configure --prefix=/path/to/curl/tree
|
||||||
|
|
||||||
|
If you happen to have write permission in that directory, you can do 'make
|
||||||
|
install' without being root. An example of this would be to make a local
|
||||||
|
install in your own home directory:
|
||||||
|
|
||||||
|
./configure --prefix=$HOME
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
The configure script always tries to find a working SSL library unless
|
The configure script always tries to find a working SSL library unless
|
||||||
explicitly told not to. If you have OpenSSL installed in the default search
|
explicitly told not to. If you have OpenSSL installed in the default search
|
||||||
path for your compiler/linker, you don't need to do anything special. If
|
path for your compiler/linker, you don't need to do anything special. If
|
||||||
@@ -71,33 +86,6 @@ UNIX
|
|||||||
LIBS=-lRSAglue -lrsaref
|
LIBS=-lRSAglue -lrsaref
|
||||||
(as suggested by Doug Kaufman)
|
(as suggested by Doug Kaufman)
|
||||||
|
|
||||||
KNOWN PROBLEMS (these ones should not happen anymore)
|
|
||||||
|
|
||||||
If you happen to have autoconf installed, but a version older than 2.12
|
|
||||||
you will get into trouble. Then you can still build curl by issuing these
|
|
||||||
commands (note that this requires curl to be built staticly): (from Ralph
|
|
||||||
Beckmann)
|
|
||||||
|
|
||||||
./configure [...]
|
|
||||||
cd lib; make; cd ..
|
|
||||||
cd src; make; cd ..
|
|
||||||
cp src/curl elsewhere/bin/
|
|
||||||
|
|
||||||
As suggested by David West, you can make a faked version of autoconf and
|
|
||||||
autoheader:
|
|
||||||
|
|
||||||
----start of autoconf----
|
|
||||||
#!/bin/bash
|
|
||||||
#fake autoconf for building curl
|
|
||||||
if [ "$1" = "--version" ] then
|
|
||||||
echo "Autoconf version 2.13"
|
|
||||||
fi
|
|
||||||
----end of autoconf----
|
|
||||||
|
|
||||||
Then make autoheader a symbolic link to the same script and make sure
|
|
||||||
they're executable and set to appear in the path *BEFORE* the actual (but
|
|
||||||
obsolete) autoconf and autoheader scripts.
|
|
||||||
|
|
||||||
MORE OPTIONS
|
MORE OPTIONS
|
||||||
|
|
||||||
To force configure to use the standard cc compiler if both cc and gcc are
|
To force configure to use the standard cc compiler if both cc and gcc are
|
||||||
@@ -416,6 +404,17 @@ CROSS COMPILE
|
|||||||
The '--prefix' parameter specifies where cURL will be installed. If
|
The '--prefix' parameter specifies where cURL will be installed. If
|
||||||
'configure' completes successfully, do 'make' and 'make install' as usual.
|
'configure' completes successfully, do 'make' and 'make install' as usual.
|
||||||
|
|
||||||
|
RISC OS
|
||||||
|
=======
|
||||||
|
The library can be cross-compiled using gccsdk as follows:
|
||||||
|
|
||||||
|
CC=riscos-gcc AR=riscos-ar RANLIB='riscos-ar -s' ./configure \
|
||||||
|
--host=arm-riscos-aof --without-random --disable-shared
|
||||||
|
make
|
||||||
|
|
||||||
|
where riscos-gcc and riscos-ar are links to the gccsdk tools.
|
||||||
|
You can then link your program with curl/lib/.libs/libcurl.a
|
||||||
|
|
||||||
PORTS
|
PORTS
|
||||||
=====
|
=====
|
||||||
This is a probably incomplete list of known hardware and operating systems
|
This is a probably incomplete list of known hardware and operating systems
|
||||||
@@ -435,7 +434,7 @@ PORTS
|
|||||||
- MIPS IRIX 6.2, 6.5
|
- MIPS IRIX 6.2, 6.5
|
||||||
- MIPS Linux
|
- MIPS Linux
|
||||||
- Pocket PC/Win CE 3.0
|
- Pocket PC/Win CE 3.0
|
||||||
- Power AIX 4.2, 4.3.1, 4.3.2, 5.1
|
- Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1
|
||||||
- PowerPC Darwin 1.0
|
- PowerPC Darwin 1.0
|
||||||
- PowerPC Linux
|
- PowerPC Linux
|
||||||
- PowerPC Mac OS 9
|
- PowerPC Mac OS 9
|
||||||
@@ -449,6 +448,7 @@ PORTS
|
|||||||
- StrongARM NetBSD 1.4.1
|
- StrongARM NetBSD 1.4.1
|
||||||
- Ultrix 4.3a
|
- Ultrix 4.3a
|
||||||
- i386 BeOS
|
- i386 BeOS
|
||||||
|
- i386 DOS
|
||||||
- i386 FreeBSD
|
- i386 FreeBSD
|
||||||
- i386 HURD
|
- i386 HURD
|
||||||
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4
|
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4
|
||||||
@@ -459,11 +459,14 @@ PORTS
|
|||||||
- i386 Solaris 2.7
|
- i386 Solaris 2.7
|
||||||
- i386 Windows 95, 98, ME, NT, 2000
|
- i386 Windows 95, 98, ME, NT, 2000
|
||||||
- i386 QNX 6
|
- i386 QNX 6
|
||||||
|
- i486 ncr-sysv4.3.03 (NCR MP-RAS)
|
||||||
- ia64 Linux 2.3.99
|
- ia64 Linux 2.3.99
|
||||||
- m68k AmigaOS 3
|
- m68k AmigaOS 3
|
||||||
- m68k Linux
|
- m68k Linux
|
||||||
- m68k OpenBSD
|
- m68k OpenBSD
|
||||||
|
- m88k dg-dgux5.4R3.00
|
||||||
- s390 Linux
|
- s390 Linux
|
||||||
|
- XScale/PXA250 Linux 2.4
|
||||||
|
|
||||||
OpenSSL
|
OpenSSL
|
||||||
=======
|
=======
|
||||||
|
@@ -3,6 +3,15 @@ join in and help us correct one or more of these! Also be sure to check the
|
|||||||
changelog of the current development status, as one or more of these problems
|
changelog of the current development status, as one or more of these problems
|
||||||
may have been fixed since this was written!
|
may have been fixed since this was written!
|
||||||
|
|
||||||
|
* LDAP output is garbled. Hardly anyone seems to care about LDAP functionality
|
||||||
|
in curl/libcurl why this report has been closed and set to be solved later.
|
||||||
|
If you feel this is something you want fixed, get in touch and we'll start
|
||||||
|
working.
|
||||||
|
http://sourceforge.net/tracker/index.php?func=detail&aid=735752&group_id=976&atid=100976
|
||||||
|
|
||||||
|
* IPv6 support on AIX 4.3.3 doesn't work due to a missing sockaddr_storage
|
||||||
|
struct. It has been reported to work on AIX 5.1 though.
|
||||||
|
|
||||||
* Running 'make test' on Mac OS X gives 4 errors. This seems to be related
|
* Running 'make test' on Mac OS X gives 4 errors. This seems to be related
|
||||||
to some kind of libtool problem:
|
to some kind of libtool problem:
|
||||||
http://curl.haxx.se/mail/archive-2002-03/0029.html and
|
http://curl.haxx.se/mail/archive-2002-03/0029.html and
|
||||||
@@ -15,6 +24,8 @@ may have been fixed since this was written!
|
|||||||
* configure --disable-http is not fully supported. All other protocols seem
|
* configure --disable-http is not fully supported. All other protocols seem
|
||||||
to work to disable.
|
to work to disable.
|
||||||
|
|
||||||
|
* The -m parameter does not work when using telnet with curl on Windows.
|
||||||
|
|
||||||
* If a HTTP server responds to a HEAD request and includes a body (thus
|
* If a HTTP server responds to a HEAD request and includes a body (thus
|
||||||
violating the RFC2616), curl won't wait to read the response but just stop
|
violating the RFC2616), curl won't wait to read the response but just stop
|
||||||
reading and return back. If a second request (let's assume a GET) is then
|
reading and return back. If a second request (let's assume a GET) is then
|
||||||
|
69
docs/MANUAL
69
docs/MANUAL
@@ -11,7 +11,7 @@ SIMPLE USAGE
|
|||||||
|
|
||||||
curl http://www.netscape.com/
|
curl http://www.netscape.com/
|
||||||
|
|
||||||
Get the root README file from funet's ftp-server:
|
Get the README file the user's home directory at funet's ftp-server:
|
||||||
|
|
||||||
curl ftp://ftp.funet.fi/README
|
curl ftp://ftp.funet.fi/README
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ SIMPLE USAGE
|
|||||||
|
|
||||||
curl http://www.weirdserver.com:8000/
|
curl http://www.weirdserver.com:8000/
|
||||||
|
|
||||||
Get a list of the root directory of an FTP site:
|
Get a list of a directory of an FTP site:
|
||||||
|
|
||||||
curl ftp://cool.haxx.se/
|
curl ftp://cool.haxx.se/
|
||||||
|
|
||||||
@@ -166,13 +166,21 @@ UPLOADING
|
|||||||
|
|
||||||
VERBOSE / DEBUG
|
VERBOSE / DEBUG
|
||||||
|
|
||||||
If curl fails where it isn't supposed to, if the servers don't let you
|
If curl fails where it isn't supposed to, if the servers don't let you in,
|
||||||
in, if you can't understand the responses: use the -v flag to get VERBOSE
|
if you can't understand the responses: use the -v flag to get verbose
|
||||||
fetching. Curl will output lots of info and all data it sends and
|
fetching. Curl will output lots of info and what it sends and receives in
|
||||||
receives in order to let the user see all client-server interaction.
|
order to let the user see all client-server interaction (but it won't show
|
||||||
|
you the actual data).
|
||||||
|
|
||||||
curl -v ftp://ftp.upload.com/
|
curl -v ftp://ftp.upload.com/
|
||||||
|
|
||||||
|
To get even more details and information on what curl does, try using the
|
||||||
|
--trace or --trace-ascii options with a given file name to log to, like
|
||||||
|
this:
|
||||||
|
|
||||||
|
curl --trace trace.txt www.haxx.se
|
||||||
|
|
||||||
|
|
||||||
DETAILED INFORMATION
|
DETAILED INFORMATION
|
||||||
|
|
||||||
Different protocols provide different ways of getting detailed information
|
Different protocols provide different ways of getting detailed information
|
||||||
@@ -350,6 +358,13 @@ COOKIES
|
|||||||
|
|
||||||
curl -b headers www.example.com
|
curl -b headers www.example.com
|
||||||
|
|
||||||
|
While saving headers to a file is a working way to store cookies, it is
|
||||||
|
however error-prone and not the prefered way to do this. Instead, make curl
|
||||||
|
save the incoming cookies using the well-known netscape cookie format like
|
||||||
|
this:
|
||||||
|
|
||||||
|
curl -c cookies.txt www.example.com
|
||||||
|
|
||||||
Note that by specifying -b you enable the "cookie awareness" and with -L
|
Note that by specifying -b you enable the "cookie awareness" and with -L
|
||||||
you can make curl follow a location: (which often is used in combination
|
you can make curl follow a location: (which often is used in combination
|
||||||
with cookies). So that if a site sends cookies and a location, you can
|
with cookies). So that if a site sends cookies and a location, you can
|
||||||
@@ -363,7 +378,11 @@ COOKIES
|
|||||||
the cookies received from www.example.com. curl will send to the server the
|
the cookies received from www.example.com. curl will send to the server the
|
||||||
stored cookies which match the request as it follows the location. The
|
stored cookies which match the request as it follows the location. The
|
||||||
file "empty.txt" may be a non-existant file.
|
file "empty.txt" may be a non-existant file.
|
||||||
|
|
||||||
|
Alas, to both read and write cookies from a netscape cookie file, you can
|
||||||
|
set both -b and -c to use the same file:
|
||||||
|
|
||||||
|
curl -b cookies.txt -c cookies.txt www.example.com
|
||||||
|
|
||||||
PROGRESS METER
|
PROGRESS METER
|
||||||
|
|
||||||
@@ -404,12 +423,34 @@ SPEED LIMIT
|
|||||||
To have curl abort the download if the speed is slower than 3000 bytes per
|
To have curl abort the download if the speed is slower than 3000 bytes per
|
||||||
second for 1 minute, run:
|
second for 1 minute, run:
|
||||||
|
|
||||||
curl -y 3000 -Y 60 www.far-away-site.com
|
curl -Y 3000 -y 60 www.far-away-site.com
|
||||||
|
|
||||||
This can very well be used in combination with the overall time limit, so
|
This can very well be used in combination with the overall time limit, so
|
||||||
that the above operatioin must be completed in whole within 30 minutes:
|
that the above operatioin must be completed in whole within 30 minutes:
|
||||||
|
|
||||||
curl -m 1800 -y 3000 -Y 60 www.far-away-site.com
|
curl -m 1800 -Y 3000 -y 60 www.far-away-site.com
|
||||||
|
|
||||||
|
Forcing curl not to transfer data faster than a given rate is also possible,
|
||||||
|
which might be useful if you're using a limited bandwidth connection and you
|
||||||
|
don't want your transfer to use all of it (sometimes referred to as
|
||||||
|
"bandwith throttle").
|
||||||
|
|
||||||
|
Make curl transfer data no faster than 10 kilobytes per second:
|
||||||
|
|
||||||
|
curl --limit-rate 10K www.far-away-site.com
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
curl --limit-rate 10240 www.far-away-site.com
|
||||||
|
|
||||||
|
Or prevent curl from uploading data faster than 1 megabyte per second:
|
||||||
|
|
||||||
|
curl -T upload --limit-rate 1M ftp://uploadshereplease.com
|
||||||
|
|
||||||
|
When using the --limit-rate option, the transfer rate is regulated on a
|
||||||
|
per-second basis, which will cause the total transfer speed to become lower
|
||||||
|
than the given number. Sometimes of course substantially lower, if your
|
||||||
|
transfer stalls during periods.
|
||||||
|
|
||||||
CONFIG FILE
|
CONFIG FILE
|
||||||
|
|
||||||
@@ -548,7 +589,7 @@ HTTPS
|
|||||||
from sites that require valid certificates. The only drawback is that the
|
from sites that require valid certificates. The only drawback is that the
|
||||||
certificate needs to be in PEM-format. PEM is a standard and open format to
|
certificate needs to be in PEM-format. PEM is a standard and open format to
|
||||||
store certificates with, but it is not used by the most commonly used
|
store certificates with, but it is not used by the most commonly used
|
||||||
browsers (Netscape and MSEI both use the so called PKCS#12 format). If you
|
browsers (Netscape and MSIE both use the so called PKCS#12 format). If you
|
||||||
want curl to use the certificates you use with your (favourite) browser, you
|
want curl to use the certificates you use with your (favourite) browser, you
|
||||||
may need to download/compile a converter that can convert your browser's
|
may need to download/compile a converter that can convert your browser's
|
||||||
formatted certificates to PEM formatted ones. This kind of converter is
|
formatted certificates to PEM formatted ones. This kind of converter is
|
||||||
@@ -567,8 +608,8 @@ HTTPS
|
|||||||
|
|
||||||
Many older SSL-servers have problems with SSLv3 or TLS, that newer versions
|
Many older SSL-servers have problems with SSLv3 or TLS, that newer versions
|
||||||
of OpenSSL etc is using, therefore it is sometimes useful to specify what
|
of OpenSSL etc is using, therefore it is sometimes useful to specify what
|
||||||
SSL-version curl should use. Use -3 or -2 to specify that exact SSL version
|
SSL-version curl should use. Use -3, -2 or -1 to specify that exact SSL
|
||||||
to use:
|
version to use (for SSLv3, SSLv2 or TLSv1 respectively):
|
||||||
|
|
||||||
curl -2 https://secure.site.com/
|
curl -2 https://secure.site.com/
|
||||||
|
|
||||||
@@ -826,13 +867,13 @@ MAILING LISTS
|
|||||||
|
|
||||||
Receives notifications on all CVS commits done to the curl source module.
|
Receives notifications on all CVS commits done to the curl source module.
|
||||||
This can become quite a large amount of mails during intense development,
|
This can become quite a large amount of mails during intense development,
|
||||||
be aware. This is for us who liks email...
|
be aware. This is for us who like email...
|
||||||
|
|
||||||
curl-www-commits
|
curl-www-commits
|
||||||
|
|
||||||
Receives notifications on all CVS commits done to the curl www module
|
Receives notifications on all CVS commits done to the curl www module
|
||||||
(basicly the web site). This can become quite a large amount of mails
|
(basicly the web site). This can become quite a large amount of mails
|
||||||
during intense changing, be aware. This is for us who liks email...
|
during intense changing, be aware. This is for us who like email...
|
||||||
|
|
||||||
Please direct curl questions, feature requests and trouble reports to one of
|
Please direct curl questions, feature requests and trouble reports to one of
|
||||||
these mailing lists instead of mailing any individual.
|
these mailing lists instead of mailing any individual.
|
||||||
|
@@ -10,18 +10,23 @@ man_MANS = \
|
|||||||
|
|
||||||
HTMLPAGES = \
|
HTMLPAGES = \
|
||||||
curl.html \
|
curl.html \
|
||||||
curl-config.html
|
curl-config.html \
|
||||||
|
index.html
|
||||||
|
|
||||||
|
PDFPAGES = \
|
||||||
|
curl.pdf \
|
||||||
|
curl-config.pdf
|
||||||
|
|
||||||
SUBDIRS = examples libcurl
|
SUBDIRS = examples libcurl
|
||||||
|
|
||||||
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS \
|
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
|
||||||
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS \
|
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS \
|
||||||
VERSIONS KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) \
|
VERSIONS KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) \
|
||||||
HISTORY
|
HISTORY INSTALL libcurl-the-guide $(PDFPAGES)
|
||||||
|
|
||||||
MAN2HTML= gnroff -man $< | man2html >$@
|
MAN2HTML= gnroff -man $< | man2html >$@
|
||||||
|
|
||||||
SUFFIXES = .1 .3 .html
|
SUFFIXES = .1 .3 .html .pdf
|
||||||
|
|
||||||
html: $(HTMLPAGES)
|
html: $(HTMLPAGES)
|
||||||
cd libcurl; make html
|
cd libcurl; make html
|
||||||
@@ -31,3 +36,13 @@ html: $(HTMLPAGES)
|
|||||||
|
|
||||||
.1.html:
|
.1.html:
|
||||||
$(MAN2HTML)
|
$(MAN2HTML)
|
||||||
|
|
||||||
|
MAN2PDF = groff -Tps -man curl.1 $< >$@
|
||||||
|
|
||||||
|
pdf:
|
||||||
|
for file in $(man_MANS); do \
|
||||||
|
foo=`echo $$file | sed -e 's/\.[0-9]$$//g'`; \
|
||||||
|
groff -Tps -man $$file >$$foo.ps; \
|
||||||
|
ps2pdf $$foo.ps $$foo.pdf; \
|
||||||
|
done
|
||||||
|
cd libcurl; make pdf
|
||||||
|
@@ -13,8 +13,8 @@ README.win32
|
|||||||
are win32-based.
|
are win32-based.
|
||||||
|
|
||||||
The unix-style man pages are tricky to read on windows, so therefore are all
|
The unix-style man pages are tricky to read on windows, so therefore are all
|
||||||
those pages also converted to HTML and those are also included in the
|
those pages converted to HTML as well as pdf, and included in the release
|
||||||
release archives.
|
archives.
|
||||||
|
|
||||||
The main curl.1 man page is also "built-in" in the command line tool. Use a
|
The main curl.1 man page is also "built-in" in the command line tool. Use a
|
||||||
command line similar to this in order to extract a separate text file:
|
command line similar to this in order to extract a separate text file:
|
||||||
|
39
docs/SSLCERTS
Normal file
39
docs/SSLCERTS
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
Peer SSL Certificate Verification
|
||||||
|
=================================
|
||||||
|
|
||||||
|
Starting in 7.10, libcurl performs peer SSL certificate verification by
|
||||||
|
default. This is done by installing a default CA cert bundle on 'make install'
|
||||||
|
(or similar), that CA bundle package is used by default on operations against
|
||||||
|
SSL servers.
|
||||||
|
|
||||||
|
Alas, if you communicate with HTTPS servers using certificates that are signed
|
||||||
|
by CAs present in the bundle, you will not notice any changed behavior and you
|
||||||
|
will seamlessly get a higher security level on your SSL connections since you
|
||||||
|
can be sure that the remote server really is the one it claims to be.
|
||||||
|
|
||||||
|
If the remote server uses a self-signed certificate, or if you don't install
|
||||||
|
curl's CA cert bundle or if it uses a certificate signed by a CA that isn't
|
||||||
|
included in the bundle, then you need to do one of the following:
|
||||||
|
|
||||||
|
1. Tell libcurl to *not* verify the peer. With libcurl you disable with with
|
||||||
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
|
||||||
|
|
||||||
|
With the curl command tool, you disable this with -k/--insecure.
|
||||||
|
|
||||||
|
2. Get a CA certificate that can verify the remote server and use the proper
|
||||||
|
option to point out this CA cert for verification when connecting. For
|
||||||
|
libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath);
|
||||||
|
|
||||||
|
With the curl command tool: --cacert [file]
|
||||||
|
|
||||||
|
Neglecting to use one of the above menthods when dealing with a server using a
|
||||||
|
certficate that isn't signed by one of the certficates in the installed CA
|
||||||
|
cert bundle, will cause SSL to report an error ("certificate verify failed")
|
||||||
|
during the handshake and SSL will then refuse further communication with that
|
||||||
|
server.
|
||||||
|
|
||||||
|
This procedure has been deemed The Right Thing even though it adds this extra
|
||||||
|
trouble for some users, since it adds security to a majority of the SSL
|
||||||
|
connections that previously weren't really secure. It turned out many people
|
||||||
|
were using previous versions of curl/libcurl without realizing the need for
|
||||||
|
the CA cert options to get truly secure SSL connections.
|
@@ -82,3 +82,12 @@ that have contributed with non-trivial parts:
|
|||||||
- Andreas Damm <andreas-sourceforge@radab.org>
|
- Andreas Damm <andreas-sourceforge@radab.org>
|
||||||
- Jacky Lam <sylam@emsoftltd.com>
|
- Jacky Lam <sylam@emsoftltd.com>
|
||||||
- James Gallagher <jgallagher@gso.uri.edu>
|
- James Gallagher <jgallagher@gso.uri.edu>
|
||||||
|
- Kjetil Jacobsen <kjetilja@cs.uit.no>
|
||||||
|
- Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
||||||
|
- Miklos Nemeth <mnemeth@kfkisystems.com>
|
||||||
|
- Kevin Roth <kproth@users.sourceforge.net>
|
||||||
|
- Ralph Mitchell <rmitchell@eds.com>
|
||||||
|
- Dan Fandrich <dan@coneharvesters.com>
|
||||||
|
- Jean-Philippe Barrette-LaPierre <jpb@rrette.com>
|
||||||
|
- Richard Bramante <RBramante@on.com>
|
||||||
|
- Daniel Kouril <kouril@ics.muni.cz>
|
||||||
|
108
docs/TODO
108
docs/TODO
@@ -15,7 +15,8 @@ TODO
|
|||||||
* Introduce an interface to libcurl that allows applications to easier get to
|
* Introduce an interface to libcurl that allows applications to easier get to
|
||||||
know what cookies that are received. Pushing interface that calls a
|
know what cookies that are received. Pushing interface that calls a
|
||||||
callback on each received cookie? Querying interface that asks about
|
callback on each received cookie? Querying interface that asks about
|
||||||
existing cookies? We probably need both.
|
existing cookies? We probably need both. Enable applications to modify
|
||||||
|
existing cookies as well. http://curl.haxx.se/dev/COOKIES
|
||||||
|
|
||||||
* Make content encoding/decoding internally be made using a filter system.
|
* Make content encoding/decoding internally be made using a filter system.
|
||||||
|
|
||||||
@@ -23,16 +24,9 @@ TODO
|
|||||||
less copy of data and thus a faster operation.
|
less copy of data and thus a faster operation.
|
||||||
[http://curl.haxx.se/dev/no_copy_callbacks.txt]
|
[http://curl.haxx.se/dev/no_copy_callbacks.txt]
|
||||||
|
|
||||||
* Run-time querying about library characterics. What protocols do this
|
* Add asynchronous name resolving (http://libdenise.sf.net/). This should be
|
||||||
running libcurl support? What is the version number of the running libcurl
|
made to work on most of the supported platforms, or otherwise it isn't
|
||||||
(returning the well-defined version-#define). This could possibly be made
|
really interesting.
|
||||||
by allowing curl_easy_getinfo() work with a NULL pointer for global info,
|
|
||||||
but perhaps better would be to introduce a new curl_getinfo() (or similar)
|
|
||||||
function for global info reading.
|
|
||||||
|
|
||||||
* Add asynchronous name resolving (http://daniel.haxx.se/resolver/). This
|
|
||||||
should be made to work on most of the supported platforms, or otherwise it
|
|
||||||
isn't really interesting.
|
|
||||||
|
|
||||||
* Data sharing. Tell which easy handles within a multi handle that should
|
* Data sharing. Tell which easy handles within a multi handle that should
|
||||||
share cookies, connection cache, dns cache, ssl session cache. Full
|
share cookies, connection cache, dns cache, ssl session cache. Full
|
||||||
@@ -51,28 +45,23 @@ TODO
|
|||||||
>4GB all over. Bug reports (and source reviews) indicate that it doesn't
|
>4GB all over. Bug reports (and source reviews) indicate that it doesn't
|
||||||
currently work properly.
|
currently work properly.
|
||||||
|
|
||||||
* Make the built-in progress meter use its own dedicated output stream, and
|
|
||||||
make it possible to set it. Use stderr by default.
|
|
||||||
|
|
||||||
* CURLOPT_MAXFILESIZE. Prevent downloads that are larger than the specified
|
* CURLOPT_MAXFILESIZE. Prevent downloads that are larger than the specified
|
||||||
size. CURLE_FILESIZE_EXCEEDED would then be returned. Gautam Mani
|
size. CURLE_FILESIZE_EXCEEDED would then be returned. Gautam Mani
|
||||||
requested. That is, the download should even begin but be aborted
|
requested. That is, the download should not even begin but be aborted
|
||||||
immediately.
|
immediately.
|
||||||
|
|
||||||
* Allow the http_proxy (and other) environment variables to contain user and
|
|
||||||
password as well in the style: http://proxyuser:proxypasswd@proxy:port
|
|
||||||
Berend Reitsma suggested.
|
|
||||||
|
|
||||||
LIBCURL - multi interface
|
LIBCURL - multi interface
|
||||||
|
|
||||||
* Make sure we don't ever loop because of non-blocking sockets return
|
* Make sure we don't ever loop because of non-blocking sockets return
|
||||||
EWOULDBLOCK or similar. This concerns the HTTP request sending (and
|
EWOULDBLOCK or similar. This FTP command sending, the SSL connection etc.
|
||||||
especially regular HTTP POST), the FTP command sending etc.
|
|
||||||
|
|
||||||
* Make uploads treated better. We need a way to tell libcurl we have data to
|
* Make transfers treated more carefully. We need a way to tell libcurl we
|
||||||
write, as the current system expects us to upload data each time the socket
|
have data to write, as the current system expects us to upload data each
|
||||||
is writable and there is no way to say that we want to upload data soon
|
time the socket is writable and there is no way to say that we want to
|
||||||
just not right now, without that aborting the upload.
|
upload data soon just not right now, without that aborting the upload. The
|
||||||
|
opposite situation should be possible as well, that we tell libcurl we're
|
||||||
|
ready to accept read data. Today libcurl feeds the data as soon as it is
|
||||||
|
available for reading, no matter what.
|
||||||
|
|
||||||
DOCUMENTATION
|
DOCUMENTATION
|
||||||
|
|
||||||
@@ -80,59 +69,24 @@ TODO
|
|||||||
|
|
||||||
FTP
|
FTP
|
||||||
|
|
||||||
* FTP ASCII upload does not follow RFC959 section 3.1.1.1: "The sender
|
* Make CURLOPT_FTPPORT support an additional port number on the IP/if/name,
|
||||||
converts the data from an internal character representation to the standard
|
like "blabla:[port]" or possibly even "blabla:[portfirst]-[portsecond]".
|
||||||
8-bit NVT-ASCII representation (see the Telnet specification). The
|
|
||||||
receiver will convert the data from the standard form to his own internal
|
|
||||||
form."
|
|
||||||
|
|
||||||
* An option to only download remote FTP files if they're newer than the local
|
* FTP ASCII transfers do not follow RFC959. They don't convert the data
|
||||||
one is a good idea, and it would fit right into the same syntax as the
|
accordingly.
|
||||||
already working http dito works. It of course requires that 'MDTM' works,
|
|
||||||
and it isn't a standard FTP command.
|
* Since USERPWD always override the user and password specified in URLs, we
|
||||||
|
might need another way to specify user+password for anonymous ftp logins.
|
||||||
|
|
||||||
* Add FTPS support with SSL for the data connection too. This should be made
|
* Add FTPS support with SSL for the data connection too. This should be made
|
||||||
according to the specs written in draft-murray-auth-ftp-ssl-08.txt,
|
according to the specs written in draft-murray-auth-ftp-ssl-11.txt,
|
||||||
"Securing FTP with TLS"
|
"Securing FTP with TLS", valid until September 27th 2003.
|
||||||
|
http://curl.haxx.se/rfc/draft-murray-auth-ftp-ssl-11.txt
|
||||||
|
|
||||||
HTTP
|
HTTP
|
||||||
|
|
||||||
* HTTP PUT for files passed on stdin *OR* when the --crlf option is
|
* Digest, NTLM and GSS-Negotiate support for HTTP proxies. They all work
|
||||||
used. Requires libcurl to send the file with chunked content
|
on direct-connections to the server.
|
||||||
encoding. [http://curl.haxx.se/dev/HTTP-PUT-stdin.txt] When the filter
|
|
||||||
system mentioned above gets real, it'll be a piece of cake to add.
|
|
||||||
|
|
||||||
* Pass a list of host name to libcurl to which we allow the user name and
|
|
||||||
password to get sent to. Currently, it only get sent to the host name that
|
|
||||||
the first URL uses (to prevent others from being able to read it), but this
|
|
||||||
also prevents the authentication info from getting sent when following
|
|
||||||
locations to legitimate other host names.
|
|
||||||
|
|
||||||
* "Content-Encoding: compress/gzip/zlib" HTTP 1.1 clearly defines how to get
|
|
||||||
and decode compressed documents. There is the zlib that is pretty good at
|
|
||||||
decompressing stuff. This work was started in October 1999 but halted again
|
|
||||||
since it proved more work than we thought. It is still a good idea to
|
|
||||||
implement though. This requires the filter system mentioned above.
|
|
||||||
|
|
||||||
* Authentication: NTLM. Support for that MS crap called NTLM
|
|
||||||
authentication. MS proxies and servers sometime require that. Since that
|
|
||||||
protocol is a proprietary one, it involves reverse engineering and network
|
|
||||||
sniffing. This should however be a library-based functionality. There are a
|
|
||||||
few different efforts "out there" to make open source HTTP clients support
|
|
||||||
this and it should be possible to take advantage of other people's hard
|
|
||||||
work. http://modntlm.sourceforge.net/ is one. There's a web page at
|
|
||||||
http://www.innovation.ch/java/ntlm.html that contains detailed reverse-
|
|
||||||
engineered info.
|
|
||||||
|
|
||||||
* RFC2617 compliance, "Digest Access Authentication" A valid test page seem
|
|
||||||
to exist at: http://hopf.math.nwu.edu/testpage/digest/ And some friendly
|
|
||||||
person's server source code is available at
|
|
||||||
http://hopf.math.nwu.edu/digestauth/index.html Then there's the Apache
|
|
||||||
mod_digest source code too of course. It seems as if Netscape doesn't
|
|
||||||
support this, and not many servers do. Although this is a lot better
|
|
||||||
authentication method than the more common "Basic". Basic sends the
|
|
||||||
password in cleartext over the network, this "Digest" method uses a
|
|
||||||
challange-response protocol which increases security quite a lot.
|
|
||||||
|
|
||||||
* Pipelining. Sending multiple requests before the previous one(s) are done.
|
* Pipelining. Sending multiple requests before the previous one(s) are done.
|
||||||
This could possibly be implemented using the multi interface to queue
|
This could possibly be implemented using the multi interface to queue
|
||||||
@@ -217,6 +171,9 @@ TODO
|
|||||||
|
|
||||||
TEST SUITE
|
TEST SUITE
|
||||||
|
|
||||||
|
* If perl wasn't found by the configure script, don't attempt to run the
|
||||||
|
tests but explain something nice why it doesn't.
|
||||||
|
|
||||||
* Extend the test suite to include more protocols. The telnet could just do
|
* Extend the test suite to include more protocols. The telnet could just do
|
||||||
ftp or http operations (for which we have test servers).
|
ftp or http operations (for which we have test servers).
|
||||||
|
|
||||||
@@ -224,3 +181,10 @@ TODO
|
|||||||
fork()s and it should become even more portable.
|
fork()s and it should become even more portable.
|
||||||
|
|
||||||
* Introduce a test suite that tests libcurl better and more explicitly.
|
* Introduce a test suite that tests libcurl better and more explicitly.
|
||||||
|
|
||||||
|
NEXT MAJOR RELEASE
|
||||||
|
|
||||||
|
* curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a
|
||||||
|
CURLMcode. These should be changed to be the same.
|
||||||
|
|
||||||
|
* curl_formparse() should be removed
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man curl-config.1
|
.\" nroff -man curl-config.1
|
||||||
.\" Written by Daniel Stenberg
|
.\" Written by Daniel Stenberg
|
||||||
.\"
|
.\"
|
||||||
.TH curl-config 1 "21 January 2002" "Curl 7.9.3" "curl-config manual"
|
.TH curl-config 1 "8 Oct 2002" "Curl 7.10" "curl-config manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl-config \- Get information about a libcurl installation
|
curl-config \- Get information about a libcurl installation
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -11,6 +11,8 @@ curl-config \- Get information about a libcurl installation
|
|||||||
.B curl-config
|
.B curl-config
|
||||||
displays information about a previous curl and libcurl installation.
|
displays information about a previous curl and libcurl installation.
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
|
.IP "--ca"
|
||||||
|
Displays the built-in path to the CA cert bundle this libcurl uses.
|
||||||
.IP "--cc"
|
.IP "--cc"
|
||||||
Displays the compiler used to build libcurl.
|
Displays the compiler used to build libcurl.
|
||||||
.IP "--cflags"
|
.IP "--cflags"
|
||||||
|
192
docs/curl.1
192
docs/curl.1
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man curl.1
|
.\" nroff -man curl.1
|
||||||
.\" Written by Daniel Stenberg
|
.\" Written by Daniel Stenberg
|
||||||
.\"
|
.\"
|
||||||
.TH curl 1 "11 Sep 2002" "Curl 7.10" "Curl Manual"
|
.TH curl 1 "18 June 2003" "Curl 7.10.6" "Curl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl \- transfer a URL
|
curl \- transfer a URL
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -10,14 +10,18 @@ curl \- transfer a URL
|
|||||||
.I [URL...]
|
.I [URL...]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.B curl
|
.B curl
|
||||||
is a client to get documents/files from or send documents to a server, using
|
is a tool to transfer data from or to a server, using one of the supported
|
||||||
any of the supported protocols (HTTP, HTTPS, FTP, GOPHER, DICT, TELNET, LDAP
|
protocols (HTTP, HTTPS, FTP, FTPS, GOPHER, DICT, TELNET, LDAP or FILE). The
|
||||||
or FILE). The command is designed to work without user interaction or any kind
|
command is designed to work without user interaction.
|
||||||
of interactivity.
|
|
||||||
|
|
||||||
curl offers a busload of useful tricks like proxy support, user
|
curl offers a busload of useful tricks like proxy support, user
|
||||||
authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file
|
authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file
|
||||||
transfer resume and more.
|
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)
|
||||||
|
for details.
|
||||||
.SH URL
|
.SH URL
|
||||||
The URL syntax is protocol dependent. You'll find a detailed description in
|
The URL syntax is protocol dependent. You'll find a detailed description in
|
||||||
RFC 2396.
|
RFC 2396.
|
||||||
@@ -48,10 +52,8 @@ specified on a single command line and cannot be used between separate curl
|
|||||||
invokes.
|
invokes.
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.IP "-a/--append"
|
.IP "-a/--append"
|
||||||
(FTP)
|
(FTP) When used in an FTP upload, this will tell curl to append to the target
|
||||||
When used in a ftp upload, this will tell curl to append to the target
|
file instead of overwriting it. If the file doesn't exist, it will be created.
|
||||||
file instead of overwriting it. If the file doesn't exist, it will
|
|
||||||
be created.
|
|
||||||
|
|
||||||
If this option is used twice, the second one will disable append mode again.
|
If this option is used twice, the second one will disable append mode again.
|
||||||
.IP "-A/--user-agent <agent string>"
|
.IP "-A/--user-agent <agent string>"
|
||||||
@@ -63,6 +65,16 @@ surround the string with single quote marks. This can also be set with the
|
|||||||
|
|
||||||
If this option is set more than once, the last one will be the one that's
|
If this option is set more than once, the last one will be the one that's
|
||||||
used.
|
used.
|
||||||
|
.IP "--anyauth"
|
||||||
|
(HTTP) Tells curl to figure out authentication method by itself, and use the
|
||||||
|
most secure one the remote site claims it supports. This is done by first
|
||||||
|
doing a request and checking the response-headers, thus inducing an extra
|
||||||
|
network round-trip. This is used instead of setting a specific authentication
|
||||||
|
method, which you can do with \fI--digest\fP, \fI--ntlm\fP, and
|
||||||
|
\fI--negotiate\fP. (Added in 7.10.6)
|
||||||
|
|
||||||
|
If this option is used several times, the following occurrences make no
|
||||||
|
difference.
|
||||||
.IP "-b/--cookie <name=data>"
|
.IP "-b/--cookie <name=data>"
|
||||||
(HTTP)
|
(HTTP)
|
||||||
Pass the data to the HTTP server as a cookie. It is supposedly the
|
Pass the data to the HTTP server as a cookie. It is supposedly the
|
||||||
@@ -90,12 +102,26 @@ also be enforced by using an URL that ends with ";type=A". This option causes
|
|||||||
data sent to stdout to be in text mode for win32 systems.
|
data sent to stdout to be in text mode for win32 systems.
|
||||||
|
|
||||||
If this option is used twice, the second one will disable ASCII usage.
|
If this option is used twice, the second one will disable ASCII usage.
|
||||||
|
.IP "--basic"
|
||||||
|
(HTTP) Tells curl to use HTTP Basic authentication. This is the default and
|
||||||
|
this option is usually pointless, unless you use it to override a previously
|
||||||
|
set option that sets a different authentication method (such as \fI--ntlm\fP,
|
||||||
|
\fI--digest\fP and \fI--negotiate\fP). (Added in 7.10.6)
|
||||||
|
|
||||||
|
If this option is used several times, the following occurrences make no
|
||||||
|
difference.
|
||||||
.IP "--ciphers <list of ciphers>"
|
.IP "--ciphers <list of ciphers>"
|
||||||
(SSL) Specifies which ciphers to use in the connection. The list of ciphers
|
(SSL) Specifies which ciphers to use in the connection. The list of ciphers
|
||||||
must be using valid ciphers. Read up on SSL cipher list details on this URL:
|
must be using valid ciphers. Read up on SSL cipher list details on this URL:
|
||||||
.I http://www.openssl.org/docs/apps/ciphers.html (Option added in curl 7.9)
|
.I http://www.openssl.org/docs/apps/ciphers.html (Option added in curl 7.9)
|
||||||
|
|
||||||
If this option is used several times, the last one will override the others.
|
If this option is used several times, the last one will override the others.
|
||||||
|
.IP "--compressed"
|
||||||
|
(HTTP) Request a compressed response using one of the algorithms libcurl
|
||||||
|
supports, and return the uncompressed document. If this option is used and
|
||||||
|
the server sends an unsupported encoding, Curl will report an error.
|
||||||
|
|
||||||
|
If this option is used several times, each occurrence will toggle it on/off.
|
||||||
.IP "--connect-timeout <seconds>"
|
.IP "--connect-timeout <seconds>"
|
||||||
Maximum time in seconds that you allow the connection to the server to take.
|
Maximum time in seconds that you allow the connection to the server to take.
|
||||||
This only limits the connection phase, once curl has connected this option is
|
This only limits the connection phase, once curl has connected this option is
|
||||||
@@ -110,6 +136,12 @@ no file will be written. The file will be written using the Netscape cookie
|
|||||||
file format. If you set the file name to a single dash, "-", the cookies will
|
file format. If you set the file name to a single dash, "-", the cookies will
|
||||||
be written to stdout. (Option added in curl 7.9)
|
be written to stdout. (Option added in curl 7.9)
|
||||||
|
|
||||||
|
.B NOTE
|
||||||
|
If the cookie jar can't be created or written to, the whole curl operation
|
||||||
|
won't fail or even report an error clearly. Using -v will get a warning
|
||||||
|
displayed, but that is the only visible feedback you get about this possibly
|
||||||
|
lethal situation.
|
||||||
|
|
||||||
If this option is used several times, the last specfied file name will be
|
If this option is used several times, the last specfied file name will be
|
||||||
used.
|
used.
|
||||||
.IP "-C/--continue-at <offset>"
|
.IP "-C/--continue-at <offset>"
|
||||||
@@ -122,6 +154,9 @@ Use "-C -" to tell curl to automatically find out where/how to resume the
|
|||||||
transfer. It then uses the given output/input files to figure that out.
|
transfer. It then uses the given output/input files to figure that out.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
|
.IP "--create-dirs"
|
||||||
|
When used in conjunction with the -o option, curl will create the necessary
|
||||||
|
local directory hierarchy as needed.
|
||||||
.IP "--crlf"
|
.IP "--crlf"
|
||||||
(FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390).
|
(FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390).
|
||||||
|
|
||||||
@@ -163,9 +198,27 @@ want to post a binary file without the strip-newlines feature of the
|
|||||||
|
|
||||||
If this option is used several times, the ones following the first will
|
If this option is used several times, the ones following the first will
|
||||||
append data.
|
append data.
|
||||||
|
.IP "--digest"
|
||||||
|
(HTTP) Enables HTTP Digest authentication. This is a authentication that
|
||||||
|
prevents the password from being sent over the wire in clear text. Use this in
|
||||||
|
combination with the normal -u/--user option to set user name and
|
||||||
|
password. See also \fI--ntlm\fP, \fP--negotiate\fI and \fI--anyauth\fP for
|
||||||
|
related options. (Added in curl 7.10.6)
|
||||||
|
|
||||||
|
If this option is used several times, the following occurrences make no
|
||||||
|
difference.
|
||||||
|
.IP "--disable-eprt"
|
||||||
|
(FTP) Tell curl to disable the use of the EPRT and LPRT commands when doing
|
||||||
|
active FTP transfers. Curl will normally always first attempt to use EPRT,
|
||||||
|
then LPRT before using PORT, but with this option, it will use PORT right
|
||||||
|
away. EPRT and LPRT are extensions to the original FTP protocol, may not work
|
||||||
|
on all servers but enable more functionality in a better way than the
|
||||||
|
traditional PORT command. (Aded in 7.10.5)
|
||||||
|
|
||||||
|
If this option is used several times, each occurrence will toggle this on/off.
|
||||||
.IP "--disable-epsv"
|
.IP "--disable-epsv"
|
||||||
(FTP) Tell curl to disable the use of the EPSV command when doing passive FTP
|
(FTP) Tell curl to disable the use of the EPSV command when doing passive FTP
|
||||||
downloads. Curl will normally always first attempt to use EPSV before PASV,
|
transfers. Curl will normally always first attempt to use EPSV before PASV,
|
||||||
but with this option, it will not try using EPSV.
|
but with this option, it will not try using EPSV.
|
||||||
|
|
||||||
If this option is used several times, each occurrence will toggle this on/off.
|
If this option is used several times, each occurrence will toggle this on/off.
|
||||||
@@ -214,14 +267,21 @@ If this option is used several times, the last one will be used.
|
|||||||
peer. The file may contain multiple CA certificates. The certificate(s) must
|
peer. The file may contain multiple CA certificates. The certificate(s) must
|
||||||
be in PEM format.
|
be in PEM format.
|
||||||
|
|
||||||
|
curl recognizes the environment variable named 'CURL_CA_BUNDLE' if that is
|
||||||
|
set, and uses the given path as a path to a CA cert bundle. This option
|
||||||
|
overrides that variable.
|
||||||
|
|
||||||
|
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 this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "--capath <CA certificate directory>"
|
.IP "--capath <CA certificate directory>"
|
||||||
(HTTPS) Tells curl to use the specified certificate directory to verify the
|
(HTTPS) Tells curl to use the specified certificate directory to verify the
|
||||||
peer. The certificates must be in PEM format, and the directory must have been
|
peer. The certificates must be in PEM format, and the directory must have been
|
||||||
processed using the c_rehash utility supplied with openssl. Certificate directories
|
processed using the c_rehash utility supplied with openssl. Using --capath can
|
||||||
are not supported under Windows (because c_rehash uses symbolink links to
|
allow curl to make https connections much more efficiently than using --cacert
|
||||||
create them). Using --capath can allow curl to make https connections much
|
if the --cacert file contains many CA certificates.
|
||||||
more efficiently than using --cacert if the --cacert file contains many CA certificates.
|
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-f/--fail"
|
.IP "-f/--fail"
|
||||||
@@ -246,12 +306,18 @@ Example, to send your password file to the server, where
|
|||||||
\&'password' is the name of the form-field to which /etc/passwd will be the
|
\&'password' is the name of the form-field to which /etc/passwd will be the
|
||||||
input:
|
input:
|
||||||
|
|
||||||
.B curl
|
\fBcurl\fP -F password=@/etc/passwd www.mypasswords.com
|
||||||
-F password=@/etc/passwd www.mypasswords.com
|
|
||||||
|
|
||||||
To read the file's content from stdin insted of a file, use - where the file
|
To read the file's content from stdin insted of a file, use - where the file
|
||||||
name should've been. This goes for both @ and < constructs.
|
name should've been. This goes for both @ and < constructs.
|
||||||
|
|
||||||
|
You can also tell curl what Content-Type to use for the file upload part, by
|
||||||
|
using 'type=', in a manner similar to:
|
||||||
|
|
||||||
|
\fBcurl\fP -F "web=@index.html;type=text/html" url.com
|
||||||
|
|
||||||
|
See further examples and details in the MANUAL.
|
||||||
|
|
||||||
This option can be used multiple times.
|
This option can be used multiple times.
|
||||||
.IP "-g/--globoff"
|
.IP "-g/--globoff"
|
||||||
This option switches off the "URL globbing parser". When you set this option,
|
This option switches off the "URL globbing parser". When you set this option,
|
||||||
@@ -315,6 +381,8 @@ to be made secure by using the CA certificate bundle installed by
|
|||||||
default. This makes all connections considered "insecure" to fail unless
|
default. This makes all connections considered "insecure" to fail unless
|
||||||
-k/--insecure is used.
|
-k/--insecure is used.
|
||||||
|
|
||||||
|
This option is ignored if --cacert or --capath is used!
|
||||||
|
|
||||||
If this option is used twice, the second time will again disable it.
|
If this option is used twice, the second time will again disable it.
|
||||||
.IP "--krb4 <level>"
|
.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
|
||||||
@@ -342,15 +410,15 @@ url = "http://curl.haxx.se/docs/"
|
|||||||
This option can be used multiple times.
|
This option can be used multiple times.
|
||||||
.IP "--limit-rate <speed>"
|
.IP "--limit-rate <speed>"
|
||||||
Specify the maximum transfer rate you want curl to use. This feature is useful
|
Specify the maximum transfer rate you want curl to use. This feature is useful
|
||||||
if you have a limited pipe and you'd prefer you have your transfer not use
|
if you have a limited pipe and you'd like your transfer not use your entire
|
||||||
your entire bandwidth.
|
bandwidth.
|
||||||
|
|
||||||
The given speed is measured in bytes/second, unless a suffix is
|
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'
|
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
|
makes it megabytes while 'g' or 'G' makes it gigabytes. Examples: 200K, 3m and
|
||||||
1G.
|
1G.
|
||||||
|
|
||||||
This option was introduced in curl 7.9.9.
|
This option was introduced in curl 7.10.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-l/--list-only"
|
.IP "-l/--list-only"
|
||||||
@@ -369,9 +437,18 @@ If this option is used twice, the second will again disable list only.
|
|||||||
(HTTP/HTTPS) If the server reports that the requested page has a different
|
(HTTP/HTTPS) If the server reports that the requested page has a different
|
||||||
location (indicated with the header line Location:) this flag will let curl
|
location (indicated with the header line Location:) this flag will let curl
|
||||||
attempt to reattempt the get on the new place. If used together with -i or -I,
|
attempt to reattempt the get on the new place. If used together with -i or -I,
|
||||||
headers from all requested pages will be shown. If this flag is used when
|
headers from all requested pages will be shown. If authentication is used,
|
||||||
making a HTTP POST, curl will automatically switch to GET after the initial
|
curl will only send its credentials to the initial host, so if a redirect
|
||||||
POST has been done.
|
takes curl to a different host, it won't intercept the user+password. See also
|
||||||
|
\fI--location-trusted\fP on how to change this.
|
||||||
|
|
||||||
|
If this option is used twice, the second will again disable location following.
|
||||||
|
.IP "--location-trusted"
|
||||||
|
(HTTP/HTTPS) Like \fI--location\fP, but will allow sending the name + password
|
||||||
|
to all hosts that the site may redirect to. This may or may not introduce a
|
||||||
|
security breach if the site redirects you do a site to which you'll send your
|
||||||
|
authentication info (which is plaintext in the case of HTTP Basic
|
||||||
|
authentication).
|
||||||
|
|
||||||
If this option is used twice, the second will again disable location following.
|
If this option is used twice, the second will again disable location following.
|
||||||
.IP "-m/--max-time <seconds>"
|
.IP "-m/--max-time <seconds>"
|
||||||
@@ -405,6 +482,19 @@ to allow curl to ftp to the machine host.domain.com with user name
|
|||||||
.B "machine host.domain.com login myself password secret"
|
.B "machine host.domain.com login myself password secret"
|
||||||
|
|
||||||
If this option is used twice, the second will again disable netrc usage.
|
If this option is used twice, the second will again disable netrc usage.
|
||||||
|
.IP "--negotiate"
|
||||||
|
(HTTP) Enables GSS-Negotiate authentication. The GSS-Negotiate method was
|
||||||
|
designed by Microsoft and is used in their web aplications. It is primarily
|
||||||
|
meant as a support for Kerberos5 authentication but may be also used along
|
||||||
|
with another authentication methods. For more information see IETF draft
|
||||||
|
draft-brezak-spnego-http-04.txt. (Added in 7.10.6)
|
||||||
|
|
||||||
|
\fBNOTE\fP that this option requiures that the library was built with GSSAPI
|
||||||
|
support. This is not very common. Use \fIcurl --version\fP to see if your
|
||||||
|
version supports GSS-Negotiate.
|
||||||
|
|
||||||
|
If this option is used several times, the following occurrences make no
|
||||||
|
difference.
|
||||||
.IP "-N/--no-buffer"
|
.IP "-N/--no-buffer"
|
||||||
Disables the buffering of the output stream. In normal work situations, curl
|
Disables the buffering of the output stream. In normal work situations, curl
|
||||||
will use a standard buffered output stream that will have the effect that it
|
will use a standard buffered output stream that will have the effect that it
|
||||||
@@ -412,6 +502,19 @@ will output the data in chunks, not necessarily exactly when the data arrives.
|
|||||||
Using this option will disable that buffering.
|
Using this option will disable that buffering.
|
||||||
|
|
||||||
If this option is used twice, the second will again switch on buffering.
|
If this option is used twice, the second will again switch on buffering.
|
||||||
|
.IP "--ntlm"
|
||||||
|
(HTTP) Enables NTLM authentication. The NTLM authentication method was
|
||||||
|
designed by Microsoft and is used by IIS web servers. It is a proprietary
|
||||||
|
protocol, reversed engineered by clever people and implemented in curl based
|
||||||
|
on their efforts. This kind of behavior should not be endorsed, you should
|
||||||
|
encourage everyone who uses NTLM to switch to a public and documented
|
||||||
|
authentication method instead. Such as Digest. (Added in 7.10.6)
|
||||||
|
|
||||||
|
\fBNOTE\fP that this option requiures that the library was built with SSL
|
||||||
|
support. Use \fIcurl --version\fP to see if your version supports NTLM.
|
||||||
|
|
||||||
|
If this option is used several times, the following occurrences make no
|
||||||
|
difference.
|
||||||
.IP "-o/--output <file>"
|
.IP "-o/--output <file>"
|
||||||
Write output to <file> instead of stdout. If you are using {} or [] to fetch
|
Write output to <file> instead of stdout. If you are using {} or [] to fetch
|
||||||
multiple documents, you can use '#' followed by a number in the <file>
|
multiple documents, you can use '#' followed by a number in the <file>
|
||||||
@@ -425,9 +528,11 @@ or use several variables like:
|
|||||||
curl http://{site,host}.host[1-5].com -o "#1_#2"
|
curl http://{site,host}.host[1-5].com -o "#1_#2"
|
||||||
|
|
||||||
You may use this option as many times as you have number of URLs.
|
You may use this option as many times as you have number of URLs.
|
||||||
|
|
||||||
|
See also the --create-dirs option to create the local directories dynamically.
|
||||||
.IP "-O/--remote-name"
|
.IP "-O/--remote-name"
|
||||||
Write output to a local file named like the remote file we get. (Only
|
Write output to a local file named like the remote file we get. (Only the file
|
||||||
the file part of the remote file is used, the path is cut off.)
|
part of the remote file is used, the path is cut off.)
|
||||||
|
|
||||||
You may use this option as many times as you have number of URLs.
|
You may use this option as many times as you have number of URLs.
|
||||||
.IP "-p/--proxytunnel"
|
.IP "-p/--proxytunnel"
|
||||||
@@ -566,7 +671,7 @@ descriptive information, to the given output file. Use "-" as filename to have
|
|||||||
the output sent to stdout.
|
the output sent to stdout.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used. (Added in
|
If this option is used several times, the last one will be used. (Added in
|
||||||
curl 7.9.7)
|
7.9.7)
|
||||||
.IP "--trace-ascii <file>"
|
.IP "--trace-ascii <file>"
|
||||||
Enables a full trace dump of all incoming and outgoing data, including
|
Enables a full trace dump of all incoming and outgoing data, including
|
||||||
descriptive information, to the given output file. Use "-" as filename to have
|
descriptive information, to the given output file. Use "-" as filename to have
|
||||||
@@ -577,11 +682,14 @@ the ASCII part of the dump. It makes smaller output that might be easier to
|
|||||||
read for untrained humans.
|
read for untrained humans.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used. (Added in
|
If this option is used several times, the last one will be used. (Added in
|
||||||
curl 7.9.7)
|
7.9.7)
|
||||||
.IP "-u/--user <user:password>"
|
.IP "-u/--user <user:password>"
|
||||||
Specify user and password to use when fetching. See README.curl for detailed
|
Specify user and password to use when fetching. Read the MANUAL for detailed
|
||||||
examples of how to use this. If no password is specified, curl will
|
examples of how to use this. If no password is specified, curl will ask for it
|
||||||
ask for it interactively.
|
interactively.
|
||||||
|
|
||||||
|
You can also use the --digest option to enable Digest authentication when
|
||||||
|
communicating with HTTP 1.1 servers.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-U/--proxy-user <user:password>"
|
.IP "-U/--proxy-user <user:password>"
|
||||||
@@ -607,10 +715,22 @@ info provided by curl.
|
|||||||
Note that if you want to see HTTP headers in the output, \fI-i/--include\fP
|
Note that if you want to see HTTP headers in the output, \fI-i/--include\fP
|
||||||
might be option you're looking for.
|
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.
|
If this option is used twice, the second will again disable verbose.
|
||||||
.IP "-V/--version"
|
.IP "-V/--version"
|
||||||
Displays the full version of curl, libcurl and other 3rd party libraries
|
Displays information about curl and the libcurl version it uses.
|
||||||
linked with the executable.
|
|
||||||
|
The first line includes the full version of curl, libcurl and other 3rd party
|
||||||
|
libraries linked with the executable.
|
||||||
|
|
||||||
|
The second line (starts with "Protocols:") shows all protocols that libcurl
|
||||||
|
reports to support.
|
||||||
|
|
||||||
|
The third line (starts with "Features:") shows specific features libcurl
|
||||||
|
reports to offer.
|
||||||
|
|
||||||
.IP "-w/--write-out <format>"
|
.IP "-w/--write-out <format>"
|
||||||
Defines what to display after a completed and successful operation. The format
|
Defines what to display after a completed and successful operation. The format
|
||||||
is a string that may contain plain text mixed with any number of variables. The
|
is a string that may contain plain text mixed with any number of variables. The
|
||||||
@@ -820,13 +940,15 @@ FTP couldn't set binary. Couldn't change transfer method to binary.
|
|||||||
.IP 18
|
.IP 18
|
||||||
Partial file. Only a part of the file was transfered.
|
Partial file. Only a part of the file was transfered.
|
||||||
.IP 19
|
.IP 19
|
||||||
FTP couldn't RETR file. The RETR command failed.
|
FTP couldn't download/access the given file, the RETR (or similar) command
|
||||||
|
failed.
|
||||||
.IP 20
|
.IP 20
|
||||||
FTP write error. The transfer was reported bad by the server.
|
FTP write error. The transfer was reported bad by the server.
|
||||||
.IP 21
|
.IP 21
|
||||||
FTP quote error. A quote command returned error from the server.
|
FTP quote error. A quote command returned error from the server.
|
||||||
.IP 22
|
.IP 22
|
||||||
HTTP not found. The requested page was not found. This return code only
|
HTTP page not retrieved. The requested url was not found or returned another
|
||||||
|
error with the HTTP error code being 400 or above. This return code only
|
||||||
appears if --fail is used.
|
appears if --fail is used.
|
||||||
.IP 23
|
.IP 23
|
||||||
Write error. Curl couldn't write data to a local filesystem or similar.
|
Write error. Curl couldn't write data to a local filesystem or similar.
|
||||||
|
@@ -9,7 +9,7 @@ EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.c \
|
|||||||
multithread.c getinmemory.c ftpupload.c httpput.c \
|
multithread.c getinmemory.c ftpupload.c httpput.c \
|
||||||
simplessl.c ftpgetresp.c http-post.c post-callback.c \
|
simplessl.c ftpgetresp.c http-post.c post-callback.c \
|
||||||
multi-app.c multi-double.c multi-single.c multi-post.c \
|
multi-app.c multi-double.c multi-single.c multi-post.c \
|
||||||
fopen.c simplepost.c
|
fopen.c simplepost.c makefile.dj
|
||||||
|
|
||||||
all:
|
all:
|
||||||
@echo "done"
|
@echo "done"
|
||||||
|
@@ -22,10 +22,13 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include <curl/types.h>
|
|
||||||
#include <curl/easy.h>
|
#if (LIBCURL_VERSION_NUM < 0x070907)
|
||||||
|
#error "too old libcurl version, get the latest!"
|
||||||
|
#endif
|
||||||
|
|
||||||
struct data {
|
struct data {
|
||||||
int type;
|
int type;
|
||||||
@@ -34,8 +37,8 @@ struct data {
|
|||||||
FILE *file;
|
FILE *file;
|
||||||
} handle;
|
} handle;
|
||||||
|
|
||||||
/* TODO: We should perhaps document the biggest possible buffer chunk we can
|
/* This is the documented biggest possible buffer chunk we can get from
|
||||||
get from libcurl in one single callback... */
|
libcurl in one single callback! */
|
||||||
char buffer[CURL_MAX_WRITE_SIZE];
|
char buffer[CURL_MAX_WRITE_SIZE];
|
||||||
|
|
||||||
char *readptr; /* read from here */
|
char *readptr; /* read from here */
|
||||||
@@ -62,6 +65,8 @@ size_t write_callback(char *buffer,
|
|||||||
url->readptr += size;
|
url->readptr += size;
|
||||||
url->bytes += size;
|
url->bytes += size;
|
||||||
|
|
||||||
|
fprintf(stderr, "callback %d size bytes\n", size);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,6 +77,7 @@ URL_FILE *url_fopen(char *url, char *operation)
|
|||||||
|
|
||||||
URL_FILE *file;
|
URL_FILE *file;
|
||||||
int still_running;
|
int still_running;
|
||||||
|
(void)operation;
|
||||||
|
|
||||||
file = (URL_FILE *)malloc(sizeof(URL_FILE));
|
file = (URL_FILE *)malloc(sizeof(URL_FILE));
|
||||||
if(!file)
|
if(!file)
|
||||||
@@ -134,47 +140,51 @@ size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!still_running) {
|
if(!still_running) {
|
||||||
printf("NO MORE RUNNING AROUND!\n");
|
printf("DONE RUNNING AROUND!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FD_ZERO(&fdread);
|
do {
|
||||||
FD_ZERO(&fdwrite);
|
|
||||||
FD_ZERO(&fdexcep);
|
FD_ZERO(&fdread);
|
||||||
|
FD_ZERO(&fdwrite);
|
||||||
|
FD_ZERO(&fdexcep);
|
||||||
|
|
||||||
/* set a suitable timeout to fail on */
|
/* set a suitable timeout to fail on */
|
||||||
timeout.tv_sec = 500; /* 5 minutes */
|
timeout.tv_sec = 500; /* 5 minutes */
|
||||||
timeout.tv_usec = 0;
|
timeout.tv_usec = 0;
|
||||||
|
|
||||||
/* get file descriptors from the transfers */
|
/* get file descriptors from the transfers */
|
||||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
|
||||||
switch(rc) {
|
switch(rc) {
|
||||||
case -1:
|
case -1:
|
||||||
/* select error */
|
/* select error */
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* timeout or readable/writable sockets */
|
/* timeout or readable/writable sockets */
|
||||||
do {
|
printf("select() returned %d!\n", rc);
|
||||||
file->m = curl_multi_perform(multi_handle, &still_running);
|
do {
|
||||||
|
file->m = curl_multi_perform(multi_handle, &still_running);
|
||||||
|
|
||||||
|
if(file->bytes)
|
||||||
|
/* we have received data, return that now */
|
||||||
|
break;
|
||||||
|
|
||||||
|
} while(CURLM_CALL_MULTI_PERFORM == file->m);
|
||||||
|
|
||||||
if(file->bytes)
|
|
||||||
/* we have received data, return that now */
|
if(!still_running)
|
||||||
break;
|
printf("DONE RUNNING AROUND!\n");
|
||||||
|
|
||||||
} while(CURLM_CALL_MULTI_PERFORM == file->m);
|
break;
|
||||||
|
}
|
||||||
|
} while(still_running && (file->bytes <= 0));
|
||||||
if(!still_running)
|
|
||||||
printf("NO MORE RUNNING AROUND!\n");
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
printf("(fread) Skip network read\n");
|
printf("(fread) Skip network read\n");
|
||||||
@@ -204,7 +214,10 @@ int main(int argc, char *argv[])
|
|||||||
int nread;
|
int nread;
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
|
|
||||||
handle = url_fopen("http://www.haxx.se", "r");
|
(void)argc;
|
||||||
|
(void)argv;
|
||||||
|
|
||||||
|
handle = url_fopen("http://curl.haxx.se/", "r");
|
||||||
|
|
||||||
if(!handle) {
|
if(!handle) {
|
||||||
printf("couldn't url_fopen()\n");
|
printf("couldn't url_fopen()\n");
|
||||||
|
@@ -11,6 +11,9 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This example shows an FTP upload, with a rename of the file just after
|
* This example shows an FTP upload, with a rename of the file just after
|
||||||
|
@@ -74,6 +74,10 @@ int main(int argc, char **argv)
|
|||||||
* bytes big and contains the remote file.
|
* bytes big and contains the remote file.
|
||||||
*
|
*
|
||||||
* Do something nice with it!
|
* Do something nice with it!
|
||||||
|
*
|
||||||
|
* You should be aware of the fact that at this point we might have an
|
||||||
|
* allocated data block, and nothing has yet deallocated that data. So when
|
||||||
|
* you're done with it, you should free() it as a nice application.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
31
docs/examples/makefile.dj
Normal file
31
docs/examples/makefile.dj
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#
|
||||||
|
# Adapted for djgpp / Watt-32 / DOS by
|
||||||
|
# Gisle Vanem <giva@bgnett.no>
|
||||||
|
#
|
||||||
|
|
||||||
|
include ../../packages/DOS/common.dj
|
||||||
|
|
||||||
|
CFLAGS += -I../../include
|
||||||
|
|
||||||
|
LIBS = ../../lib/libcurl.a
|
||||||
|
|
||||||
|
ifeq ($(USE_SSL),1)
|
||||||
|
LIBS += $(OPENSSL_ROOT)/lib/libssl.a $(OPENSSL_ROOT)/lib/libcrypt.a
|
||||||
|
endif
|
||||||
|
|
||||||
|
LIBS += $(WATT32_ROOT)/lib/libwatt.a $(ZLIB_ROOT)/libz.a
|
||||||
|
|
||||||
|
PROGRAMS = fopen.exe ftpget.exe ftpgetre.exe ftpuploa.exe getinmem.exe \
|
||||||
|
http-pos.exe httpput.exe multi-ap.exe multi-do.exe \
|
||||||
|
multi-po.exe multi-si.exe persista.exe post-cal.exe \
|
||||||
|
postit2.exe sepheade.exe simple.exe simpless.exe
|
||||||
|
|
||||||
|
all: $(PROGRAMS)
|
||||||
|
|
||||||
|
.c.exe:
|
||||||
|
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
|
||||||
|
@echo
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(PROGRAMS)
|
||||||
|
|
@@ -83,7 +83,8 @@ int main(int argc, char **argv)
|
|||||||
default:
|
default:
|
||||||
/* one or more of curl's file descriptors say there's data to read
|
/* one or more of curl's file descriptors say there's data to read
|
||||||
or write */
|
or write */
|
||||||
curl_multi_perform(multi_handle, &still_running);
|
while(CURLM_CALL_MULTI_PERFORM ==
|
||||||
|
curl_multi_perform(multi_handle, &still_running));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -80,7 +80,8 @@ int main(int argc, char **argv)
|
|||||||
case 0:
|
case 0:
|
||||||
default:
|
default:
|
||||||
/* timeout or readable/writable sockets */
|
/* timeout or readable/writable sockets */
|
||||||
curl_multi_perform(multi_handle, &still_running);
|
while(CURLM_CALL_MULTI_PERFORM ==
|
||||||
|
curl_multi_perform(multi_handle, &still_running));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -74,7 +74,8 @@ int main(int argc, char **argv)
|
|||||||
case 0:
|
case 0:
|
||||||
default:
|
default:
|
||||||
/* timeout or readable/writable sockets */
|
/* timeout or readable/writable sockets */
|
||||||
curl_multi_perform(multi_handle, &still_running);
|
while(CURLM_CALL_MULTI_PERFORM ==
|
||||||
|
curl_multi_perform(multi_handle, &still_running));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||||
{
|
{
|
||||||
written = fwrite(ptr, size, nmemb, (FILE *)stream);
|
int written = fwrite(ptr, size, nmemb, (FILE *)stream);
|
||||||
return written;
|
return written;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -40,7 +40,7 @@ int main(int argc, char **argv)
|
|||||||
FILE *headerfile;
|
FILE *headerfile;
|
||||||
|
|
||||||
const char *pCertFile = "testcert.pem";
|
const char *pCertFile = "testcert.pem";
|
||||||
const char *pCACertFile="cacert.pem"
|
const char *pCACertFile="cacert.pem";
|
||||||
|
|
||||||
const char *pKeyName;
|
const char *pKeyName;
|
||||||
const char *pKeyType;
|
const char *pKeyType;
|
||||||
@@ -66,7 +66,7 @@ int main(int argc, char **argv)
|
|||||||
curl = curl_easy_init();
|
curl = curl_easy_init();
|
||||||
if(curl) {
|
if(curl) {
|
||||||
/* what call to write: */
|
/* what call to write: */
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, "HTTPS://curl.haxx.se");
|
curl_easy_setopt(curl, CURLOPT_URL, "HTTPS://your.favourite.ssl.site");
|
||||||
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, headerfile);
|
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, headerfile);
|
||||||
|
|
||||||
while(1) /* do some ugly short cut... */
|
while(1) /* do some ugly short cut... */
|
||||||
|
@@ -232,6 +232,7 @@ Multi-threading issues
|
|||||||
For SIGPIPE info see the UNIX Socket FAQ at
|
For SIGPIPE info see the UNIX Socket FAQ at
|
||||||
http://www.unixguide.net/network/socketfaq/2.22.shtml
|
http://www.unixguide.net/network/socketfaq/2.22.shtml
|
||||||
|
|
||||||
|
Also, note that CURLOPT_DNS_USE_GLOBAL_CACHE is not thread-safe.
|
||||||
|
|
||||||
When It Doesn't Work
|
When It Doesn't Work
|
||||||
|
|
||||||
@@ -255,6 +256,9 @@ When It Doesn't Work
|
|||||||
possible of your code that uses libcurl, operating system name and version,
|
possible of your code that uses libcurl, operating system name and version,
|
||||||
compiler name and version etc.
|
compiler name and version etc.
|
||||||
|
|
||||||
|
If CURLOPT_VERBOSE is not enough, you increase the level of debug data your
|
||||||
|
application receive by using the CURLOPT_DEBUGFUNCTION.
|
||||||
|
|
||||||
Getting some in-depth knowledge about the protocols involved is never wrong,
|
Getting some in-depth knowledge about the protocols involved is never wrong,
|
||||||
and if you're trying to do funny things, you might very well understand
|
and if you're trying to do funny things, you might very well understand
|
||||||
libcurl and how to use it better if you study the appropriate RFC documents
|
libcurl and how to use it better if you study the appropriate RFC documents
|
||||||
@@ -293,8 +297,8 @@ Upload Data to a Remote Site
|
|||||||
curl_easy_setopt(easyhandle, CURLOPT_UPLOAD, TRUE);
|
curl_easy_setopt(easyhandle, CURLOPT_UPLOAD, TRUE);
|
||||||
|
|
||||||
A few protocols won't behave properly when uploads are done without any prior
|
A few protocols won't behave properly when uploads are done without any prior
|
||||||
knowledge of the expected file size. HTTP PUT is one example [1]. So, set the
|
knowledge of the expected file size. So, set the upload file size using the
|
||||||
upload file size using the CURLOPT_INFILESIZE like this:
|
CURLOPT_INFILESIZE for all known file sizes like this[1]:
|
||||||
|
|
||||||
curl_easy_setopt(easyhandle, CURLOPT_INFILESIZE, file_size);
|
curl_easy_setopt(easyhandle, CURLOPT_INFILESIZE, file_size);
|
||||||
|
|
||||||
@@ -404,7 +408,7 @@ HTTP POSTing
|
|||||||
headers = curl_slist_append(headers, "Content-Type: text/xml");
|
headers = curl_slist_append(headers, "Content-Type: text/xml");
|
||||||
|
|
||||||
/* post binary data */
|
/* post binary data */
|
||||||
curl_easy_setopt(easyhandle, CURLOPT_POSTFIELD, binaryptr);
|
curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, binaryptr);
|
||||||
|
|
||||||
/* set the size of the postfields data */
|
/* set the size of the postfields data */
|
||||||
curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDSIZE, 23);
|
curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDSIZE, 23);
|
||||||
@@ -726,6 +730,35 @@ Persistancy Is The Way to Happiness
|
|||||||
CURLOPT_FORBID_REUSE to TRUE.
|
CURLOPT_FORBID_REUSE to TRUE.
|
||||||
|
|
||||||
|
|
||||||
|
HTTP Headers Used by libcurl
|
||||||
|
|
||||||
|
When you use libcurl to do HTTP requeests, it'll pass along a series of
|
||||||
|
headers automaticly. It might be good for you to know and understand these
|
||||||
|
ones.
|
||||||
|
|
||||||
|
Host
|
||||||
|
|
||||||
|
This header is required by HTTP 1.1 and even many 1.0 servers and should
|
||||||
|
be the name of the server we want to talk to. This includes the port
|
||||||
|
number if anything but default.
|
||||||
|
|
||||||
|
Pragma
|
||||||
|
|
||||||
|
"no-cache". Tells a possible proxy to not grap a copy from the cache but
|
||||||
|
to fetch a fresh one.
|
||||||
|
|
||||||
|
Accept:
|
||||||
|
|
||||||
|
"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*". Cloned from a
|
||||||
|
browser once a hundred years ago.
|
||||||
|
|
||||||
|
Expect:
|
||||||
|
|
||||||
|
When doing multi-part formposts, libcurl will set this header to
|
||||||
|
"100-continue" to ask the server for an "OK" message before it proceeds
|
||||||
|
with sending the data part of the post.
|
||||||
|
|
||||||
|
|
||||||
Customizing Operations
|
Customizing Operations
|
||||||
|
|
||||||
There is an ongoing development today where more and more protocols are built
|
There is an ongoing development today where more and more protocols are built
|
||||||
@@ -738,101 +771,129 @@ Customizing Operations
|
|||||||
|
|
||||||
libcurl is your friend here too.
|
libcurl is your friend here too.
|
||||||
|
|
||||||
If just changing the actual HTTP request keyword is what you want, like when
|
CUSTOMREQUEST
|
||||||
GET, HEAD or POST is not good enough for you, CURLOPT_CUSTOMREQUEST is there
|
|
||||||
for you. It is very simple to use:
|
|
||||||
|
|
||||||
curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, "MYOWNRUQUEST");
|
If just changing the actual HTTP request keyword is what you want, like
|
||||||
|
when GET, HEAD or POST is not good enough for you, CURLOPT_CUSTOMREQUEST
|
||||||
|
is there for you. It is very simple to use:
|
||||||
|
|
||||||
When using the custom request, you change the request keyword of the actual
|
curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, "MYOWNRUQUEST");
|
||||||
request you are performing. Thus, by default you make GET request but you can
|
|
||||||
also make a POST operation (as described before) and then replace the POST
|
|
||||||
keyword if you want to. You're the boss.
|
|
||||||
|
|
||||||
HTTP-like protocols pass a series of headers to the server when doing the
|
When using the custom request, you change the request keyword of the
|
||||||
request, and you're free to pass any amount of extra headers that you think
|
actual request you are performing. Thus, by default you make GET request
|
||||||
fit. Adding headers are this easy:
|
but you can also make a POST operation (as described before) and then
|
||||||
|
replace the POST keyword if you want to. You're the boss.
|
||||||
|
|
||||||
struct curl_slist *headers=NULL; /* init to NULL is important */
|
Modify Headers
|
||||||
|
|
||||||
headers = curl_slist_append(headers, "Hey-server-hey: how are you?");
|
HTTP-like protocols pass a series of headers to the server when doing the
|
||||||
headers = curl_slist_append(headers, "X-silly-content: yes");
|
request, and you're free to pass any amount of extra headers that you
|
||||||
|
think fit. Adding headers are this easy:
|
||||||
|
|
||||||
/* pass our list of custom made headers */
|
struct curl_slist *headers=NULL; /* init to NULL is important */
|
||||||
curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers);
|
|
||||||
|
|
||||||
curl_easy_perform(easyhandle); /* transfer http */
|
headers = curl_slist_append(headers, "Hey-server-hey: how are you?");
|
||||||
|
headers = curl_slist_append(headers, "X-silly-content: yes");
|
||||||
|
|
||||||
curl_slist_free_all(headers); /* free the header list */
|
/* pass our list of custom made headers */
|
||||||
|
curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers);
|
||||||
|
|
||||||
... and if you think some of the internally generated headers, such as
|
curl_easy_perform(easyhandle); /* transfer http */
|
||||||
User-Agent:, Accept: or Host: don't contain the data you want them to
|
|
||||||
contain, you can replace them by simply setting them too:
|
|
||||||
|
|
||||||
headers = curl_slist_append(headers, "User-Agent: 007");
|
curl_slist_free_all(headers); /* free the header list */
|
||||||
headers = curl_slist_append(headers, "Host: munged.host.line");
|
|
||||||
|
|
||||||
If you replace an existing header with one with no contents, you will prevent
|
... and if you think some of the internally generated headers, such as
|
||||||
the header from being sent. Like if you want to completely prevent the
|
Accept: or Host: don't contain the data you want them to contain, you can
|
||||||
"Accept:" header to be sent, you can disable it with code similar to this:
|
replace them by simply setting them too:
|
||||||
|
|
||||||
headers = curl_slist_append(headers, "Accept:");
|
headers = curl_slist_append(headers, "Accept: Agent-007");
|
||||||
|
headers = curl_slist_append(headers, "Host: munged.host.line");
|
||||||
|
|
||||||
Both replacing and cancelling internal headers should be done with careful
|
Delete Headers
|
||||||
consideration and you should be aware that you may violate the HTTP protocol
|
|
||||||
when doing so.
|
|
||||||
|
|
||||||
There's only one aspect left in the HTTP requests that we haven't yet
|
If you replace an existing header with one with no contents, you will
|
||||||
mentioned how to modify: the version field. All HTTP requests includes the
|
prevent the header from being sent. Like if you want to completely prevent
|
||||||
version number to tell the server which version we support. libcurl speak
|
the "Accept:" header to be sent, you can disable it with code similar to
|
||||||
HTTP 1.1 by default. Some very old servers don't like getting 1.1-requests
|
this:
|
||||||
and when dealing with stubborn old things like that, you can tell libcurl to
|
|
||||||
use 1.0 instead by doing something like this:
|
|
||||||
|
|
||||||
curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION, CURLHTTP_VERSION_1_0);
|
headers = curl_slist_append(headers, "Accept:");
|
||||||
|
|
||||||
Not all protocols are HTTP-like, and thus the above may not help you when you
|
Both replacing and cancelling internal headers should be done with careful
|
||||||
want to make for example your FTP transfers to behave differently.
|
consideration and you should be aware that you may violate the HTTP
|
||||||
|
protocol when doing so.
|
||||||
|
|
||||||
Sending custom commands to a FTP server means that you need to send the
|
Enforcing chunked transfer-encoding
|
||||||
comands exactly as the FTP server expects them (RFC959 is a good guide here),
|
|
||||||
and you can only use commands that work on the control-connection alone. All
|
|
||||||
kinds of commands that requires data interchange and thus needs a
|
|
||||||
data-connection must be left to libcurl's own judgement. Also be aware that
|
|
||||||
libcurl will do its very best to change directory to the target directory
|
|
||||||
before doing any transfer, so if you change directory (with CWD or similar)
|
|
||||||
you might confuse libcurl and then it might not attempt to transfer the file
|
|
||||||
in the correct remote directory.
|
|
||||||
|
|
||||||
A little example that deletes a given file before an operation:
|
By making sure a request uses the custom header "Transfer-Encoding:
|
||||||
|
chunked" when doing a non-GET HTTP operation, libcurl will switch over to
|
||||||
|
"chunked" upload, even though the size of the data to upload might be
|
||||||
|
known. By default, libcurl usually switches over to chunked upload
|
||||||
|
automaticly if the upload data size is unknown.
|
||||||
|
|
||||||
headers = curl_slist_append(headers, "DELE file-to-remove");
|
HTTP Version
|
||||||
|
|
||||||
/* pass the list of custom commands to the handle */
|
There's only one aspect left in the HTTP requests that we haven't yet
|
||||||
curl_easy_setopt(easyhandle, CURLOPT_QUOTE, headers);
|
mentioned how to modify: the version field. All HTTP requests includes the
|
||||||
|
version number to tell the server which version we support. libcurl speak
|
||||||
|
HTTP 1.1 by default. Some very old servers don't like getting 1.1-requests
|
||||||
|
and when dealing with stubborn old things like that, you can tell libcurl
|
||||||
|
to use 1.0 instead by doing something like this:
|
||||||
|
|
||||||
curl_easy_perform(easyhandle); /* transfer ftp data! */
|
curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION,
|
||||||
|
CURLHTTP_VERSION_1_0);
|
||||||
|
|
||||||
curl_slist_free_all(headers); /* free the header list */
|
FTP Custom Commands
|
||||||
|
|
||||||
If you would instead want this operation (or chain of operations) to happen
|
Not all protocols are HTTP-like, and thus the above may not help you when
|
||||||
_after_ the data transfer took place the option to curl_easy_setopt() would
|
you want to make for example your FTP transfers to behave differently.
|
||||||
instead be called CURLOPT_POSTQUOTE and used the exact same way.
|
|
||||||
|
|
||||||
The custom FTP command will be issued to the server in the same order they
|
Sending custom commands to a FTP server means that you need to send the
|
||||||
are added to the list, and if a command gets an error code returned back from
|
comands exactly as the FTP server expects them (RFC959 is a good guide
|
||||||
the server, no more commands will be issued and libcurl will bail out with an
|
here), and you can only use commands that work on the control-connection
|
||||||
error code (CURLE_FTP_QUOTE_ERROR). Note that if you use CURLOPT_QUOTE to
|
alone. All kinds of commands that requires data interchange and thus needs
|
||||||
send commands before a transfer, no transfer will actually take place when a
|
a data-connection must be left to libcurl's own judgement. Also be aware
|
||||||
quote command has failed.
|
that libcurl will do its very best to change directory to the target
|
||||||
|
directory before doing any transfer, so if you change directory (with CWD
|
||||||
|
or similar) you might confuse libcurl and then it might not attempt to
|
||||||
|
transfer the file in the correct remote directory.
|
||||||
|
|
||||||
If you set the CURLOPT_HEADER to true, you will tell libcurl to get
|
A little example that deletes a given file before an operation:
|
||||||
information about the target file and output "headers" about it. The headers
|
|
||||||
will be in "HTTP-style", looking like they do in HTTP.
|
|
||||||
|
|
||||||
The option to enable headers or to run custom FTP commands may be useful to
|
headers = curl_slist_append(headers, "DELE file-to-remove");
|
||||||
combine with CURLOPT_NOBODY. If this option is set, no actual file content
|
|
||||||
transfer will be performed.
|
/* pass the list of custom commands to the handle */
|
||||||
|
curl_easy_setopt(easyhandle, CURLOPT_QUOTE, headers);
|
||||||
|
|
||||||
|
curl_easy_perform(easyhandle); /* transfer ftp data! */
|
||||||
|
|
||||||
|
curl_slist_free_all(headers); /* free the header list */
|
||||||
|
|
||||||
|
If you would instead want this operation (or chain of operations) to
|
||||||
|
happen _after_ the data transfer took place the option to
|
||||||
|
curl_easy_setopt() would instead be called CURLOPT_POSTQUOTE and used the
|
||||||
|
exact same way.
|
||||||
|
|
||||||
|
The custom FTP command will be issued to the server in the same order they
|
||||||
|
are added to the list, and if a command gets an error code returned back
|
||||||
|
from the server, no more commands will be issued and libcurl will bail out
|
||||||
|
with an error code (CURLE_FTP_QUOTE_ERROR). Note that if you use
|
||||||
|
CURLOPT_QUOTE to send commands before a transfer, no transfer will
|
||||||
|
actually take place when a quote command has failed.
|
||||||
|
|
||||||
|
If you set the CURLOPT_HEADER to true, you will tell libcurl to get
|
||||||
|
information about the target file and output "headers" about it. The
|
||||||
|
headers will be in "HTTP-style", looking like they do in HTTP.
|
||||||
|
|
||||||
|
The option to enable headers or to run custom FTP commands may be useful
|
||||||
|
to combine with CURLOPT_NOBODY. If this option is set, no actual file
|
||||||
|
content transfer will be performed.
|
||||||
|
|
||||||
|
FTP Custom CUSTOMREQUEST
|
||||||
|
|
||||||
|
If you do what list the contents of a FTP directory using your own defined
|
||||||
|
FTP command, CURLOPT_CUSTOMREQUEST will do just that. "NLST" is the
|
||||||
|
default one for listing directories but you're free to pass in your idea
|
||||||
|
of a good alternative.
|
||||||
|
|
||||||
|
|
||||||
Cookies Without Chocolate Chips
|
Cookies Without Chocolate Chips
|
||||||
@@ -1007,19 +1068,30 @@ SSL, Certificates and Other Tricks
|
|||||||
|
|
||||||
[ seeding, passwords, keys, certificates, ENGINE, ca certs ]
|
[ seeding, passwords, keys, certificates, ENGINE, ca certs ]
|
||||||
|
|
||||||
|
Multiple Transfers Using the multi Interface
|
||||||
|
|
||||||
|
The easy interface as described in detail in this document is a synchronous
|
||||||
|
interface that transfers one file at a time and doesn't return until its
|
||||||
|
done.
|
||||||
|
|
||||||
|
The multi interface on the other hand, allows your program to transfer
|
||||||
|
multiple files in both directions at the same time, without forcing you to
|
||||||
|
use multiple threads.
|
||||||
|
|
||||||
|
[fill in lots of more multi stuff here]
|
||||||
|
|
||||||
Future
|
Future
|
||||||
|
|
||||||
[ multi interface, sharing between handles, mutexes, pipelining ]
|
[ sharing between handles, mutexes, pipelining ]
|
||||||
|
|
||||||
|
|
||||||
-----
|
-----
|
||||||
Footnotes:
|
Footnotes:
|
||||||
|
|
||||||
[1] = HTTP PUT without knowing the size prior to transfer is indeed possible,
|
[1] = libcurl 7.10.3 and later have the ability to switch over to chunked
|
||||||
but libcurl does not support the chunked transfers on uploading that is
|
Tranfer-Encoding in cases were HTTP uploads are done with data of an
|
||||||
necessary for this feature to work. We'd gratefully appreciate patches
|
unknown size.
|
||||||
that bring this functionality...
|
|
||||||
|
|
||||||
[2] = This happens on Windows machines when libcurl is built and used as a
|
[2] = This happens on Windows machines when libcurl is built and used as a
|
||||||
DLL. However, you can still do this on Windows if you link with a static
|
DLL. However, you can still do this on Windows if you link with a static
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
Makefile
|
Makefile
|
||||||
Makefile.in
|
Makefile.in
|
||||||
*html
|
*html
|
||||||
|
*ps
|
||||||
|
*pdf
|
||||||
|
@@ -75,7 +75,42 @@ HTMLPAGES = \
|
|||||||
libcurl-errors.html \
|
libcurl-errors.html \
|
||||||
index.html
|
index.html
|
||||||
|
|
||||||
EXTRA_DIST = $(man_MANS) $(HTMLPAGES)
|
PDFPAGES = \
|
||||||
|
curl_easy_cleanup.pdf \
|
||||||
|
curl_easy_getinfo.pdf \
|
||||||
|
curl_easy_init.pdf \
|
||||||
|
curl_easy_perform.pdf \
|
||||||
|
curl_easy_setopt.pdf \
|
||||||
|
curl_easy_duphandle.pdf \
|
||||||
|
curl_formadd.pdf \
|
||||||
|
curl_formparse.pdf \
|
||||||
|
curl_formfree.pdf \
|
||||||
|
curl_getdate.pdf \
|
||||||
|
curl_getenv.pdf \
|
||||||
|
curl_slist_append.pdf \
|
||||||
|
curl_slist_free_all.pdf \
|
||||||
|
curl_version.pdf \
|
||||||
|
curl_version_info.pdf \
|
||||||
|
curl_escape.pdf \
|
||||||
|
curl_unescape.pdf \
|
||||||
|
curl_free.pdf \
|
||||||
|
curl_strequal.pdf \
|
||||||
|
curl_strnequal.pdf \
|
||||||
|
curl_mprintf.pdf \
|
||||||
|
curl_global_init.pdf \
|
||||||
|
curl_global_cleanup.pdf \
|
||||||
|
libcurl.pdf \
|
||||||
|
curl_multi_add_handle.pdf \
|
||||||
|
curl_multi_cleanup.pdf \
|
||||||
|
curl_multi_fdset.pdf \
|
||||||
|
curl_multi_info_read.pdf \
|
||||||
|
curl_multi_init.pdf \
|
||||||
|
curl_multi_perform.pdf \
|
||||||
|
curl_multi_remove_handle.pdf \
|
||||||
|
libcurl-multi.pdf \
|
||||||
|
libcurl-errors.pdf
|
||||||
|
|
||||||
|
EXTRA_DIST = $(man_MANS) $(HTMLPAGES) $(PDFPAGES)
|
||||||
|
|
||||||
MAN2HTML= gnroff -man $< | man2html >$@
|
MAN2HTML= gnroff -man $< | man2html >$@
|
||||||
|
|
||||||
@@ -88,3 +123,10 @@ html: $(HTMLPAGES)
|
|||||||
|
|
||||||
.1.html:
|
.1.html:
|
||||||
$(MAN2HTML)
|
$(MAN2HTML)
|
||||||
|
|
||||||
|
pdf:
|
||||||
|
for file in $(man_MANS); do \
|
||||||
|
foo=`echo $$file | sed -e 's/\.[0-9]$$//g'`; \
|
||||||
|
groff -Tps -man $$file >$$foo.ps; \
|
||||||
|
ps2pdf $$foo.ps $$foo.pdf; \
|
||||||
|
done
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man [file]
|
.\" nroff -man [file]
|
||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_easy_cleanup 3 "4 March 2002" "libcurl 7.7" "libcurl Manual"
|
.TH curl_easy_cleanup 3 "13 Nov 2002" "libcurl 7.7" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_easy_cleanup - End a libcurl easy session
|
curl_easy_cleanup - End a libcurl easy session
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -18,6 +18,9 @@ opposite of the \fIcurl_easy_init\fP function and must be called with the same
|
|||||||
This will effectively close all connections this handle has used and possibly
|
This will effectively close all connections this handle has used and possibly
|
||||||
has kept open until now. Don't call this function if you intend to transfer
|
has kept open until now. Don't call this function if you intend to transfer
|
||||||
more files.
|
more files.
|
||||||
|
|
||||||
|
When you've called this, you can safely remove all the strings you've
|
||||||
|
previously told libcurl to use, as it won't use them anymore now.
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
None
|
None
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
|
@@ -78,7 +78,8 @@ uploaded.
|
|||||||
.TP
|
.TP
|
||||||
.B CURLINFO_SIZE_DOWNLOAD
|
.B CURLINFO_SIZE_DOWNLOAD
|
||||||
Pass a pointer to a double to receive the total amount of bytes that were
|
Pass a pointer to a double to receive the total amount of bytes that were
|
||||||
downloaded.
|
downloaded. The amount is only for the latest transfer and will be reset again
|
||||||
|
for each new transfer.
|
||||||
.TP
|
.TP
|
||||||
.B CURLINFO_SPEED_DOWNLOAD
|
.B CURLINFO_SPEED_DOWNLOAD
|
||||||
Pass a pointer to a double to receive the average download speed that curl
|
Pass a pointer to a double to receive the average download speed that curl
|
||||||
@@ -115,8 +116,12 @@ Pass a pointer to a 'char *' to receive the content-type of the downloaded
|
|||||||
object. This is the value read from the Content-Type: field. If you get NULL,
|
object. This is the value read from the Content-Type: field. If you get NULL,
|
||||||
it means that the server didn't send a valid Content-Type header or that the
|
it means that the server didn't send a valid Content-Type header or that the
|
||||||
protocol used doesn't support this. (Added in 7.9.4)
|
protocol used doesn't support this. (Added in 7.9.4)
|
||||||
|
.TP
|
||||||
|
.B CURLINFO_PRIVATE
|
||||||
|
Pass a pointer to a 'char *' to receive the pointer to the private data
|
||||||
|
associated with the curl handle (set with the CURLOPT_PRIVATE option to curl_easy_setopt).
|
||||||
|
(Added in 7.10.3)
|
||||||
.PP
|
.PP
|
||||||
|
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
If the operation was successful, CURLE_OK is returned. Otherwise an
|
If the operation was successful, CURLE_OK is returned. Otherwise an
|
||||||
appropriate error code will be returned.
|
appropriate error code will be returned.
|
||||||
|
@@ -1,8 +1,7 @@
|
|||||||
.\" You can view this file with:
|
|
||||||
.\" nroff -man [file]
|
.\" nroff -man [file]
|
||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_easy_setopt 3 "18 Sep 2002" "libcurl 7.10" "libcurl Manual"
|
.TH curl_easy_setopt 3 "10 Jun 2003" "libcurl 7.10.6" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_easy_setopt - set options for a curl easy handle
|
curl_easy_setopt - set options for a curl easy handle
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -23,7 +22,8 @@ curl_easy_setopt() calls in the setup phase.
|
|||||||
\fBNOTE:\fP strings passed to libcurl as 'char *' arguments, will not be
|
\fBNOTE:\fP strings passed to libcurl as 'char *' arguments, will not be
|
||||||
copied by the library. Instead you should keep them available until libcurl no
|
copied by the library. Instead you should keep them available until libcurl no
|
||||||
longer needs them. Failing to do so will cause very odd behavior or even
|
longer needs them. Failing to do so will cause very odd behavior or even
|
||||||
crashes.
|
crashes. libcurl will need them until you call curl_easy_cleanup() or you set
|
||||||
|
the same option again to use a different pointer.
|
||||||
|
|
||||||
\fBNOTE2:\fP options set with this function call are valid for the forthcoming
|
\fBNOTE2:\fP options set with this function call are valid for the forthcoming
|
||||||
data transfers that are performed when you invoke \fIcurl_easy_perform\fP.
|
data transfers that are performed when you invoke \fIcurl_easy_perform\fP.
|
||||||
@@ -70,10 +70,10 @@ Function pointer that should match the following prototype: \fBsize_t
|
|||||||
function( void *ptr, size_t size, size_t nmemb, void *stream);\fP This
|
function( void *ptr, size_t size, size_t nmemb, void *stream);\fP This
|
||||||
function gets called by libcurl as soon as there is data reveiced that needs
|
function gets called by libcurl as soon as there is data reveiced that needs
|
||||||
to be saved. The size of the data pointed to by \fIptr\fP is \fIsize\fP
|
to be saved. The size of the data pointed to by \fIptr\fP is \fIsize\fP
|
||||||
multiplied with \fInmemb\fP. Return the number of bytes actually taken care
|
multiplied with \fInmemb\fP, it will not be zero terminated. Return the number
|
||||||
of. If that amount differs from the amount passed to your function, it'll
|
of bytes actually taken care of. If that amount differs from the amount passed
|
||||||
signal an error to the library and it will abort the transfer and return
|
to your function, it'll signal an error to the library and it will abort the
|
||||||
\fICURLE_WRITE_ERROR\fP.
|
transfer and return \fICURLE_WRITE_ERROR\fP.
|
||||||
|
|
||||||
Set the \fIstream\fP argument with the \fBCURLOPT_FILE\fP option.
|
Set the \fIstream\fP argument with the \fBCURLOPT_FILE\fP option.
|
||||||
|
|
||||||
@@ -166,7 +166,7 @@ code). (Added in 7.7.2)
|
|||||||
.B CURLOPT_WRITEHEADER
|
.B CURLOPT_WRITEHEADER
|
||||||
Pass a pointer to be used to write the header part of the received data to. If
|
Pass a pointer to be used to write the header part of the received data to. If
|
||||||
you don't use your own callback to take care of the writing, this must be a
|
you don't use your own callback to take care of the writing, this must be a
|
||||||
valid FILE *. See also the \fICURLOPT_HEADERFUNCTION\fP option below on how to
|
valid FILE *. See also the \fICURLOPT_HEADERFUNCTION\fP option above on how to
|
||||||
set a custom get-all-headers callback.
|
set a custom get-all-headers callback.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_DEBUGFUNCTION
|
.B CURLOPT_DEBUGFUNCTION
|
||||||
@@ -175,6 +175,10 @@ curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *);\fP
|
|||||||
This function will receive debug information if CURLOPT_VERBOSE is
|
This function will receive debug information if CURLOPT_VERBOSE is
|
||||||
enabled. The curl_infotype argument specifies what kind of information it
|
enabled. The curl_infotype argument specifies what kind of information it
|
||||||
is. This funtion must return 0.
|
is. This funtion must return 0.
|
||||||
|
|
||||||
|
NOTE: the data pointed to by the char * passed to this function WILL NOT be
|
||||||
|
zero terminated, but will be exactly of the size as told by the size_t
|
||||||
|
argument.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_DEBUGDATA
|
.B CURLOPT_DEBUGDATA
|
||||||
Pass a pointer to whatever you want passed in to your CURLOPT_DEBUGFUNCTION in
|
Pass a pointer to whatever you want passed in to your CURLOPT_DEBUGFUNCTION in
|
||||||
@@ -235,7 +239,7 @@ you tunnel through the HTTP proxy. Such tunneling is activated with
|
|||||||
Pass a long with this option to set the proxy port to connect to unless it is
|
Pass a long with this option to set the proxy port to connect to unless it is
|
||||||
specified in the proxy string \fICURLOPT_PROXY\fP.
|
specified in the proxy string \fICURLOPT_PROXY\fP.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_PROXTYPE
|
.B CURLOPT_PROXYTYPE
|
||||||
Pass a long with this option to set type of the proxy. Available options for
|
Pass a long with this option to set type of the proxy. Available options for
|
||||||
this are CURLPROXY_HTTP and CURLPROXY_SOCKS5, with the HTTP one being
|
this are CURLPROXY_HTTP and CURLPROXY_SOCKS5, with the HTTP one being
|
||||||
default. (Added in 7.10)
|
default. (Added in 7.10)
|
||||||
@@ -268,7 +272,7 @@ The main point of this would be that the write callback gets called more often
|
|||||||
and with smaller chunks. This is just treated as a request, not an order. You
|
and with smaller chunks. This is just treated as a request, not an order. You
|
||||||
cannot be guaranteed to actually get the given size. (Added in 7.10)
|
cannot be guaranteed to actually get the given size. (Added in 7.10)
|
||||||
.PP
|
.PP
|
||||||
.SH NAMES and PASSWORDS OPTIONS
|
.SH NAMES and PASSWORDS OPTIONS (Authentication)
|
||||||
.TP 0.4i
|
.TP 0.4i
|
||||||
.B CURLOPT_NETRC
|
.B CURLOPT_NETRC
|
||||||
This parameter controls the preference of libcurl between using user names and
|
This parameter controls the preference of libcurl between using user names and
|
||||||
@@ -311,17 +315,84 @@ user.
|
|||||||
.TP
|
.TP
|
||||||
.B CURLOPT_USERPWD
|
.B CURLOPT_USERPWD
|
||||||
Pass a char * as parameter, which should be [user name]:[password] to use for
|
Pass a char * as parameter, which should be [user name]:[password] to use for
|
||||||
the connection. If the password is left out, you will be prompted for it.
|
the connection. If both the colon and password is left out, you will be
|
||||||
\fICURLOPT_PASSWDFUNCTION\fP can be used to set your own prompt function.
|
prompted for it while using a colon with no password will make libcurl use an
|
||||||
|
empty password. \fICURLOPT_PASSWDFUNCTION\fP can be used to set your own
|
||||||
|
prompt function.
|
||||||
|
|
||||||
|
When using HTTP and CURLOPT_FOLLOWLOCATION, libcurl might perform several
|
||||||
|
requests to possibly different hosts. libcurl will only send this user and
|
||||||
|
password information to hosts using the initial host name (unless
|
||||||
|
CURLOPT_UNRESTRICTED_AUTH is set), so if libcurl follows locations to other
|
||||||
|
hosts it will not send the user and password to those. This is enforced to
|
||||||
|
prevent accidental information leakage.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_PROXYUSERPWD
|
.B CURLOPT_PROXYUSERPWD
|
||||||
Pass a char * as parameter, which should be [user name]:[password] to use for
|
Pass a char * as parameter, which should be [user name]:[password] to use for
|
||||||
the connection to the HTTP proxy. If the password is left out, you will be
|
the connection to the HTTP proxy. If the password is left out, you will be
|
||||||
prompted for it. \fICURLOPT_PASSWDFUNCTION\fP can be used to set your own
|
prompted for it. \fICURLOPT_PASSWDFUNCTION\fP can be used to set your own
|
||||||
prompt function.
|
prompt function.
|
||||||
|
.TP
|
||||||
|
.B CURLOPT_HTTPAUTH
|
||||||
|
Pass a long as parameter, which is set to a bitmask, to tell libcurl what
|
||||||
|
authentication method(s) you want it to use. The available bits are listed
|
||||||
|
below. If more than one bit is set, libcurl will first query the site to see
|
||||||
|
what authentication methods it supports and then pick the best one you allow
|
||||||
|
it to use. Note that for some methods, this will induce an extra network
|
||||||
|
round-trip. Set the actual name and password with the \fICURLOPT_USERPWD\fP
|
||||||
|
option. (Added in 7.10.6)
|
||||||
|
.RS
|
||||||
|
.TP 5
|
||||||
|
.B CURLAUTH_BASIC
|
||||||
|
HTTP Basic authentication. This is the default choice, and the only method
|
||||||
|
that is in wide-spread use and supported virtually everywhere. This is sending
|
||||||
|
the user name and password over the network in plain text, easily captured by
|
||||||
|
others.
|
||||||
|
.TP
|
||||||
|
.B CURLAUTH_DIGEST
|
||||||
|
HTTP Digest authentication. Digest authentication is defined in RFC2617 and
|
||||||
|
is a more secure way to do authentication over public networks than the
|
||||||
|
regular old-fashioned Basic method.
|
||||||
|
.TP
|
||||||
|
.B CURLAUTH_GSSNEGOTIATE
|
||||||
|
HTTP GSS-Negotiate authentication. The GSS-Negotiate method was designed by
|
||||||
|
Microsoft and is used in their web aplications. It is primarily meant as a
|
||||||
|
support for Kerberos5 authentication but may be also used along with another
|
||||||
|
authentication methods. For more information see IETF draft
|
||||||
|
draft-brezak-spnego-http-04.txt.
|
||||||
|
.TP
|
||||||
|
.B CURLAUTH_NTLM
|
||||||
|
HTTP NTLM authentication. A proprietary protocol invented and used by
|
||||||
|
Microsoft. It uses a challenge-response and hash concept similar to Digest to
|
||||||
|
prevent the password from being evesdropped.
|
||||||
|
.TP
|
||||||
|
.B CURLAUTH_ANY
|
||||||
|
This is a convenience macro that sets all bits and thus makes libcurl pick any
|
||||||
|
it finds suitable. libcurl will automaticly select the one it finds most
|
||||||
|
secure.
|
||||||
|
.TP
|
||||||
|
.B CURLAUTH_ANYSAFE
|
||||||
|
This is a convenience macro that sets all bits except Basic and thus makes
|
||||||
|
libcurl pick any it finds suitable. libcurl will automaticly select the one it
|
||||||
|
finds most secure.
|
||||||
|
.RE
|
||||||
.PP
|
.PP
|
||||||
.SH HTTP OPTIONS
|
.SH HTTP OPTIONS
|
||||||
.TP 0.4i
|
.TP 0.4i
|
||||||
|
.B CURLOPT_ENCODING
|
||||||
|
Sets the contents of the Accept-Encoding: header sent in an HTTP
|
||||||
|
request, and enables decoding of a response when a Content-Encoding:
|
||||||
|
header is received. Three encodings are supported: \fIidentity\fP,
|
||||||
|
which does nothing, \fIdeflate\fP which requests the server to
|
||||||
|
compress its response using the zlib algorithm, and \fIgzip\fP which
|
||||||
|
requests the gzip algorithm. If a zero-length string is set, then an
|
||||||
|
Accept-Encoding: header containing all supported encodings is sent.
|
||||||
|
|
||||||
|
This is a request, not an order; the server may or may not do it. This
|
||||||
|
option must be set (to any non-NULL value) or else any unsolicited
|
||||||
|
encoding done by the server is ignored. See the special file
|
||||||
|
lib/README.encoding for details.
|
||||||
|
.TP
|
||||||
.B CURLOPT_FOLLOWLOCATION
|
.B CURLOPT_FOLLOWLOCATION
|
||||||
A non-zero parameter tells the library to follow any Location: header that the
|
A non-zero parameter tells the library to follow any Location: header that the
|
||||||
server sends as part of a HTTP header.
|
server sends as part of a HTTP header.
|
||||||
@@ -331,6 +402,11 @@ new location and follow new Location: headers all the way until no more such
|
|||||||
headers are returned. \fICURLOPT_MAXREDIRS\fP can be used to limit the number
|
headers are returned. \fICURLOPT_MAXREDIRS\fP can be used to limit the number
|
||||||
of redirects libcurl will follow.
|
of redirects libcurl will follow.
|
||||||
.TP
|
.TP
|
||||||
|
.B CURLOPT_UNRESTRICTED_AUTH
|
||||||
|
A non-zero parameter tells the library it can continue to send authentication
|
||||||
|
(user+password) when following locations, even when hostname changed. Note
|
||||||
|
that this is meaningful only when setting \fICURLOPT_FOLLOWLOCATION\fP.
|
||||||
|
.TP
|
||||||
.B CURLOPT_MAXREDIRS
|
.B CURLOPT_MAXREDIRS
|
||||||
Pass a long. The set number will be the redirection limit. If that many
|
Pass a long. The set number will be the redirection limit. If that many
|
||||||
redirections have been followed, the next redirect will cause an error
|
redirections have been followed, the next redirect will cause an error
|
||||||
@@ -351,9 +427,14 @@ will imply this option.
|
|||||||
.TP
|
.TP
|
||||||
.B CURLOPT_POSTFIELDS
|
.B CURLOPT_POSTFIELDS
|
||||||
Pass a char * as parameter, which should be the full data to post in a HTTP
|
Pass a char * as parameter, which should be the full data to post in a HTTP
|
||||||
post operation. This is a normal application/x-www-form-urlencoded kind, which
|
post operation. You need to make sure that the data is formatted the way you
|
||||||
is the most commonly used one by HTML forms. See also the CURLOPT_POST. Since
|
want the server to receive it. libcurl will not convert or encode it for
|
||||||
7.8, using CURLOPT_POSTFIELDS implies CURLOPT_POST.
|
you. Most web servers will assume this data to be url-encoded. Take note.
|
||||||
|
|
||||||
|
This POST is a normal application/x-www-form-urlencoded kind (and libcurl will
|
||||||
|
set that Content-Type by default when this option is used), which is the most
|
||||||
|
commonly used one by HTML forms. See also the CURLOPT_POST. Using
|
||||||
|
CURLOPT_POSTFIELDS implies CURLOPT_POST.
|
||||||
|
|
||||||
\fBNote:\fP to make multipart/formdata posts (aka rfc1867-posts), check out
|
\fBNote:\fP to make multipart/formdata posts (aka rfc1867-posts), check out
|
||||||
the \fICURLOPT_HTTPPOST\fP option.
|
the \fICURLOPT_HTTPPOST\fP option.
|
||||||
@@ -395,11 +476,35 @@ list. If you add a header that is otherwise generated and used by libcurl
|
|||||||
internally, your added one will be used instead. If you add a header with no
|
internally, your added one will be used instead. If you add a header with no
|
||||||
contents as in 'Accept:' (no data on the right side of the colon), the
|
contents as in 'Accept:' (no data on the right side of the colon), the
|
||||||
internally used header will get disabled. Thus, using this option you can add
|
internally used header will get disabled. Thus, using this option you can add
|
||||||
new headers, replace internal headers and remove internal headers.
|
new headers, replace internal headers and remove internal headers. The
|
||||||
|
headers included in the linked list must not be CRLF-terminated, because
|
||||||
|
curl adds CRLF after each header item. Failure to comply with this will
|
||||||
|
result in strange bugs because the server will most likely ignore part
|
||||||
|
of the headers you specified.
|
||||||
|
|
||||||
|
The first line in a request (usually containing a GET or POST) is not a header
|
||||||
|
and cannot be replaced using this option. Only the lines following the
|
||||||
|
request-line are headers.
|
||||||
|
|
||||||
\fBNOTE:\fPThe most commonly replaced headers have "shortcuts" in the options
|
\fBNOTE:\fPThe most commonly replaced headers have "shortcuts" in the options
|
||||||
CURLOPT_COOKIE, CURLOPT_USERAGENT and CURLOPT_REFERER.
|
CURLOPT_COOKIE, CURLOPT_USERAGENT and CURLOPT_REFERER.
|
||||||
.TP
|
.TP
|
||||||
|
.B CURLOPT_HTTP200ALIASES
|
||||||
|
Pass a pointer to a linked list of aliases to be treated as valid HTTP 200
|
||||||
|
responses. Some servers respond with a custom header response line. For
|
||||||
|
example, IceCast servers respond with "ICY 200 OK". By including this string
|
||||||
|
in your list of aliases, the response will be treated as a valid HTTP header
|
||||||
|
line such as "HTTP/1.0 200 OK". (Added in 7.10.3)
|
||||||
|
|
||||||
|
The linked list should be a fully valid list of struct curl_slist structs, and
|
||||||
|
be properly filled in. Use \fIcurl_slist_append(3)\fP to create the list and
|
||||||
|
\fIcurl_slist_free_all(3)\fP to clean up an entire list.
|
||||||
|
|
||||||
|
\fBNOTE:\fPThe alias itself is not parsed for any version strings. So if your
|
||||||
|
alias is "MYHTTP/9.9", Libcurl will not treat the server as responding with
|
||||||
|
HTTP version 9.9. Instead Libcurl will use the value set by option
|
||||||
|
\fICURLOPT_HTTP_VERSION\fP.
|
||||||
|
.TP
|
||||||
.B CURLOPT_COOKIE
|
.B CURLOPT_COOKIE
|
||||||
Pass a pointer to a zero terminated string as parameter. It will be used to
|
Pass a pointer to a zero terminated string as parameter. It will be used to
|
||||||
set a cookie in the http request. The format of the string should be
|
set a cookie in the http request. The format of the string should be
|
||||||
@@ -430,6 +535,13 @@ is called. If no cookies are known, no file will be created. Specify "-" to
|
|||||||
instead have the cookies written to stdout. Using this option also enables
|
instead have the cookies written to stdout. Using this option also enables
|
||||||
cookies for this session, so if you for example follow a location it will make
|
cookies for this session, so if you for example follow a location it will make
|
||||||
matching cookies get sent accordingly. (Added in 7.9)
|
matching cookies get sent accordingly. (Added in 7.9)
|
||||||
|
|
||||||
|
.B NOTE
|
||||||
|
If the cookie jar file can't be created or written to (when the
|
||||||
|
curl_easy_cleanup() is called), libcurl will not and cannot report an error
|
||||||
|
for this. Using CURLOPT_VERBOSE or CURLOPT_DEBUGFUNCTION will get a warning to
|
||||||
|
display, but that is the only visible feedback you get about this possibly
|
||||||
|
lethal situation.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_TIMECONDITION
|
.B CURLOPT_TIMECONDITION
|
||||||
Pass a long as parameter. This defines how the CURLOPT_TIMEVALUE time value is
|
Pass a long as parameter. This defines how the CURLOPT_TIMEVALUE time value is
|
||||||
@@ -472,6 +584,9 @@ tells the remote server to connect to our specified IP address. The string may
|
|||||||
be a plain IP address, a host name, an network interface name (under Unix) or
|
be a plain IP address, a host name, an network interface name (under Unix) or
|
||||||
just a '-' letter to let the library use your systems default IP
|
just a '-' letter to let the library use your systems default IP
|
||||||
address. Default FTP operations are passive, and thus won't use PORT.
|
address. Default FTP operations are passive, and thus won't use PORT.
|
||||||
|
|
||||||
|
You disable PORT again and go back to using the passive version by setting
|
||||||
|
this option to NULL.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_QUOTE
|
.B CURLOPT_QUOTE
|
||||||
Pass a pointer to a linked list of FTP commands to pass to the server prior to
|
Pass a pointer to a linked list of FTP commands to pass to the server prior to
|
||||||
@@ -509,6 +624,13 @@ and symbolic links.
|
|||||||
A non-zero parameter tells the library to append to the remote file instead of
|
A non-zero parameter tells the library to append to the remote file instead of
|
||||||
overwrite it. This is only useful when uploading to a ftp site.
|
overwrite it. This is only useful when uploading to a ftp site.
|
||||||
.TP
|
.TP
|
||||||
|
.B CURLOPT_FTP_USE_EPRT
|
||||||
|
Pass a long. If the value is non-zero, it tells curl to use the EPRT (and
|
||||||
|
LPRT) command when doing active FTP downloads (which is enabled by
|
||||||
|
CURLOPT_FTPPORT). Using EPRT means that it will first attempt to use EPRT and
|
||||||
|
then LPRT before using PORT, but if you pass FALSE (zero) to this option, it
|
||||||
|
will not try using EPRT or LPRT, only plain PORT. (Added in 7.10.5)
|
||||||
|
.TP
|
||||||
.B CURLOPT_FTP_USE_EPSV
|
.B CURLOPT_FTP_USE_EPSV
|
||||||
Pass a long. If the value is non-zero, it tells curl to use the EPSV command
|
Pass a long. If the value is non-zero, it tells curl to use the EPSV command
|
||||||
when doing passive FTP downloads (which it always does by default). Using EPSV
|
when doing passive FTP downloads (which it always does by default). Using EPSV
|
||||||
@@ -542,9 +664,18 @@ want the transfer to start from.
|
|||||||
.TP
|
.TP
|
||||||
.B CURLOPT_CUSTOMREQUEST
|
.B CURLOPT_CUSTOMREQUEST
|
||||||
Pass a pointer to a zero terminated string as parameter. It will be user
|
Pass a pointer to a zero terminated string as parameter. It will be user
|
||||||
instead of GET or HEAD when doing the HTTP request. This is useful for doing
|
instead of GET or HEAD when doing a HTTP request, or instead of LIST or NLST
|
||||||
DELETE or other more or less obscure HTTP requests. Don't do this at will,
|
when doing an ftp directory listing. This is useful for doing DELETE or other
|
||||||
make sure your server supports the command first.
|
more or less obscure HTTP requests. Don't do this at will, make sure your
|
||||||
|
server supports the command first.
|
||||||
|
|
||||||
|
NOTE: many people have wrongly used this option to replace the entire request
|
||||||
|
with their own, including multiple headers and POST contents. While that might
|
||||||
|
work in many cases, it will cause libcurl to send invalid requests and it
|
||||||
|
could possibly confuse the remote server badly. Use \fICURLOPT_POST\fP and
|
||||||
|
\fICURLOPT_POSTFIELDS\fP to set POST data. Use \fICURLOPT_HTTPHEADER\fP to
|
||||||
|
replace or extend the set of headers sent by libcurl. Use
|
||||||
|
\fICURLOPT_HTTP_VERSION\fP to change HTTP version.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_FILETIME
|
.B CURLOPT_FILETIME
|
||||||
Pass a long. If it is a non-zero value, libcurl will attempt to get the
|
Pass a long. If it is a non-zero value, libcurl will attempt to get the
|
||||||
@@ -577,7 +708,7 @@ aborting perfectly normal operations. This option will cause curl to use the
|
|||||||
SIGALRM to enable time-outing system calls.
|
SIGALRM to enable time-outing system calls.
|
||||||
|
|
||||||
\fBNOTE:\fP this is not recommended to use in unix multi-threaded programs, as
|
\fBNOTE:\fP this is not recommended to use in unix multi-threaded programs, as
|
||||||
it uses signals unless CURLOPT_NOSIGNAL (see below) is set.
|
it uses signals unless CURLOPT_NOSIGNAL (see above) is set.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_LOW_SPEED_LIMIT
|
.B CURLOPT_LOW_SPEED_LIMIT
|
||||||
Pass a long as parameter. It contains the transfer speed in bytes per second
|
Pass a long as parameter. It contains the transfer speed in bytes per second
|
||||||
@@ -640,7 +771,7 @@ connection timeout (it will then only timeout on the system's internal
|
|||||||
timeouts). See also the \fICURLOPT_TIMEOUT\fP option.
|
timeouts). See also the \fICURLOPT_TIMEOUT\fP option.
|
||||||
|
|
||||||
\fBNOTE:\fP this is not recommended to use in unix multi-threaded programs, as
|
\fBNOTE:\fP this is not recommended to use in unix multi-threaded programs, as
|
||||||
it uses signals unless CURLOPT_NOSIGNAL (see below) is set.
|
it uses signals unless CURLOPT_NOSIGNAL (see above) is set.
|
||||||
.PP
|
.PP
|
||||||
.SH SSL and SECURITY OPTIONS
|
.SH SSL and SECURITY OPTIONS
|
||||||
.TP 0.4i
|
.TP 0.4i
|
||||||
@@ -706,10 +837,13 @@ Pass a long as parameter. Set what version of SSL to attempt to use, 2 or
|
|||||||
servers make this difficult why you at times may have to use this option.
|
servers make this difficult why you at times may have to use this option.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_SSL_VERIFYPEER
|
.B CURLOPT_SSL_VERIFYPEER
|
||||||
Pass a long that is set to a non-zero value to make curl verify the peer's
|
Pass a long that is set to a zero value to stop curl from verifying the peer's
|
||||||
certificate. The certificate to verify against must be specified with the
|
certificate (7.10 starting setting this option to TRUE by default). Alternate
|
||||||
CURLOPT_CAINFO option (Added in 7.4.2) or a certificate directory must be specified
|
certificates to verify against can be specified with the CURLOPT_CAINFO option
|
||||||
with the CURLOPT_CAPATH option (Added in 7.9.8).
|
(Added in 7.4.2) or a certificate directory can be specified with the
|
||||||
|
CURLOPT_CAPATH option (Added in 7.9.8). As of 7.10, curl installs a default
|
||||||
|
bundle. CURLOPT_SSL_VERIFYHOST may also need to be set to 1 or 0 if
|
||||||
|
CURLOPT_SSL_VERIFYPEER is disabled (it defaults to 2).
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_CAINFO
|
.B CURLOPT_CAINFO
|
||||||
Pass a char * to a zero terminated string naming a file holding one or more
|
Pass a char * to a zero terminated string naming a file holding one or more
|
||||||
@@ -736,7 +870,8 @@ socket. It will be used to seed the random engine for SSL.
|
|||||||
.B CURLOPT_SSL_VERIFYHOST
|
.B CURLOPT_SSL_VERIFYHOST
|
||||||
Pass a long. Set if we should verify the Common name from the peer certificate
|
Pass a long. Set if we should verify the Common name from the peer certificate
|
||||||
in the SSL handshake, set 1 to check existence, 2 to ensure that it matches
|
in the SSL handshake, set 1 to check existence, 2 to ensure that it matches
|
||||||
the provided hostname. (Added in 7.8.1)
|
the provided hostname. This is by default set to 2. (Added in 7.8.1, default
|
||||||
|
changed in 7.10)
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_SSL_CIPHER_LIST
|
.B CURLOPT_SSL_CIPHER_LIST
|
||||||
Pass a char *, pointing to a zero terminated string holding the list of
|
Pass a char *, pointing to a zero terminated string holding the list of
|
||||||
@@ -757,6 +892,13 @@ krb4 awareness. This is a string, 'clear', 'safe', 'confidential' or
|
|||||||
will be used. Set the string to NULL to disable kerberos4. The kerberos
|
will be used. Set the string to NULL to disable kerberos4. The kerberos
|
||||||
support only works for FTP. (Added in 7.3)
|
support only works for FTP. (Added in 7.3)
|
||||||
.PP
|
.PP
|
||||||
|
.SH OTHER OPTIONS
|
||||||
|
.TP 0.4i
|
||||||
|
.B CURLOPT_PRIVATE
|
||||||
|
Pass a char * as parameter, pointing to data that should be associated with
|
||||||
|
the curl handle. The pointer can be subsequently retrieved using the
|
||||||
|
CURLINFO_PRIVATE options to curl_easy_getinfo. (Added in 7.10.3)
|
||||||
|
.PP
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
CURLE_OK (zero) means that the option was set properly, non-zero means an
|
CURLE_OK (zero) means that the option was set properly, non-zero means an
|
||||||
error occurred as \fI<curl/curl.h>\fP defines. See the \fIlibcurl-errors.3\fP
|
error occurred as \fI<curl/curl.h>\fP defines. See the \fIlibcurl-errors.3\fP
|
||||||
|
@@ -19,78 +19,104 @@ the \fIfirstitem\fP pointer as parameter to \fBCURLOPT_HTTPPOST\fP.
|
|||||||
\fIlastitem\fP is set after each call and on repeated invokes it should be
|
\fIlastitem\fP is set after each call and on repeated invokes it should be
|
||||||
left as set to allow repeated invokes to find the end of the list faster.
|
left as set to allow repeated invokes to find the end of the list faster.
|
||||||
|
|
||||||
After the \fIlastitem\fP pointer follow the real arguments. (If the following
|
After the \fIlastitem\fP pointer follow the real arguments.
|
||||||
description confuses you, jump directly to the examples):
|
|
||||||
|
|
||||||
\fBCURLFORM_COPYNAME\fP or \fBCURLFORM_PTRNAME\fP followed by a string is used
|
|
||||||
for the name of the section. Optionally one may use \fBCURLFORM_NAMELENGTH\fP
|
|
||||||
to specify the length of the name (allowing null characters within the
|
|
||||||
name). All options that use the word COPY in their names copy the given
|
|
||||||
contents, while the ones with PTR in their names simply points to the (static)
|
|
||||||
data you must make sure remain until curl no longer needs it.
|
|
||||||
|
|
||||||
The options for providing values are: \fBCURLFORM_COPYCONTENTS\fP,
|
|
||||||
\fBCURLFORM_PTRCONTENTS\fP, \fBCURLFORM_FILE\fP, \fBCURLFORM_BUFFER\fP,
|
|
||||||
or \fBCURLFORM_FILECONTENT\fP followed by a char or void pointer
|
|
||||||
(allowed for PTRCONTENTS).
|
|
||||||
|
|
||||||
\fBCURLFORM_FILECONTENT\fP does a normal post like \fBCURLFORM_COPYCONTENTS\fP
|
|
||||||
but the actual value is read from the filename given as a string.
|
|
||||||
|
|
||||||
Other arguments may be \fBCURLFORM_CONTENTTYPE\fP if the user wishes to
|
|
||||||
specify one (for FILE if no type is given the library tries to provide the
|
|
||||||
correct one; for CONTENTS no Content-Type is sent in this case).
|
|
||||||
|
|
||||||
For \fBCURLFORM_PTRCONTENTS\fP or \fBCURLFORM_COPYNAME\fP the user may also
|
|
||||||
add \fBCURLFORM_CONTENTSLENGTH\fP followed by the length as a long (if not
|
|
||||||
given the library will use strlen to determine the length).
|
|
||||||
|
|
||||||
For \fBCURLFORM_FILE\fP the user may send multiple files in one section by
|
|
||||||
providing multiple \fBCURLFORM_FILE\fP arguments each followed by the filename
|
|
||||||
(and each FILE is allowed to have a CONTENTTYPE).
|
|
||||||
|
|
||||||
\fBCURLFORM_BUFFER\fP
|
|
||||||
tells libcurl that a buffer is to be used to upload data instead of using a
|
|
||||||
file. The value of the next parameter is used as the value of the "filename"
|
|
||||||
parameter in the content header.
|
|
||||||
|
|
||||||
\fBCURLFORM_BUFFERPTR\fP
|
|
||||||
tells libcurl that the address of the next parameter is a pointer to the buffer
|
|
||||||
containing data to upload. The buffer containing this data must not be freed
|
|
||||||
until after curl_easy_cleanup is called.
|
|
||||||
|
|
||||||
\fBCURLFORM_BUFFERLENGTH\fP
|
|
||||||
tells libcurl that the length of the buffer to upload is the value of the
|
|
||||||
next parameter.
|
|
||||||
|
|
||||||
Another possibility to send options to curl_formadd() is the
|
|
||||||
\fBCURLFORM_ARRAY\fP option, that passes a struct curl_forms array pointer as
|
|
||||||
its value. Each curl_forms structure element has a CURLformoption and a char
|
|
||||||
pointer. The final element in the array must be a CURLFORM_END. All available
|
|
||||||
options can be used in an array, except the CURLFORM_ARRAY option itself!
|
|
||||||
|
|
||||||
Should you need to specify extra headers for the form POST section, use
|
|
||||||
\fBCURLFORM_CONTENTHEADER\fP. This takes a curl_slist prepared in the usual way
|
|
||||||
using \fBcurl_slist_append\fP and appends the list of headers to those Curl
|
|
||||||
automatically generates for \fBCURLFORM_CONTENTTYPE\fP and the content
|
|
||||||
disposition. The list must exist while the POST occurs, if you free it before
|
|
||||||
the post completes you may experience problems.
|
|
||||||
|
|
||||||
The last argument in such an array must always be \fBCURLFORM_END\fP.
|
|
||||||
|
|
||||||
The pointers \fI*firstitem\fP and \fI*lastitem\fP should both be pointing to
|
The pointers \fI*firstitem\fP and \fI*lastitem\fP should both be pointing to
|
||||||
NULL in the first call to this function. All list-data will be allocated by
|
NULL in the first call to this function. All list-data will be allocated by
|
||||||
the function itself. You must call \fIcurl_formfree\fP after the form post has
|
the function itself. You must call \fIcurl_formfree\fP after the form post has
|
||||||
been done to free the resources again.
|
been done to free the resources again.
|
||||||
|
|
||||||
This function will copy all input data except the data pointed to by the
|
First, there are some basics you need to understand about multipart/formdata
|
||||||
arguments after \fBCURLFORM_PTRNAME\fP and \fBCURLFORM_PTRCONTENTS\fP and keep
|
posts. Each part consists of at least a NAME and a CONTENTS part. If the part
|
||||||
its own version of it allocated until you call \fIcurl_formfree\fP. When
|
is made for file upload, there are also a stored CONTENT-TYPE and a
|
||||||
you've passed the pointer to \fIcurl_easy_setopt\fP, you must not free the
|
FILENAME. Below here, we'll discuss on what options you use to set these
|
||||||
list until after you've called \fIcurl_easy_cleanup\fP for the curl handle. If
|
properties in the parts you want to add to your post.
|
||||||
you provide a pointer as an arguments after \fBCURLFORM_PTRNAME\fP or
|
.SH OPTIONS
|
||||||
\fBCURLFORM_PTRCONTENTS\fP you must ensure that the pointer stays valid until
|
.B CURLFORM_COPYNAME
|
||||||
you call \fIcurl_form_free\fP and \fIcurl_easy_cleanup\fP.
|
followed by string is used to set the name of this part. libcurl copies the
|
||||||
|
given data, so your application doesn't need to keep it around after this
|
||||||
|
function call. If the name isn't zero terminated properly, or if you'd like it
|
||||||
|
to contain zero bytes, you need to set the length of the name with
|
||||||
|
\fBCURLFORM_NAMELENGTH\fP.
|
||||||
|
|
||||||
|
.B CURLFORM_PTRNAME
|
||||||
|
followed by a string is used for the name of this part. libcurl will use the
|
||||||
|
pointer and refer to the data in your application, you must make sure it
|
||||||
|
remains until curl no longer needs it. If the name isn't zero terminated
|
||||||
|
properly, or if you'd like it to contain zero bytes, you need to set the
|
||||||
|
length of the name with \fBCURLFORM_NAMELENGTH\fP.
|
||||||
|
|
||||||
|
.B CURLFORM_COPYCONTENTS
|
||||||
|
followed by a string is used for the contents of this part, the actual data to
|
||||||
|
send away. libcurl copies the given data, so your application doesn't need to
|
||||||
|
keep it around after this function call. If the data isn't zero terminated
|
||||||
|
properly, or if you'd like it to contain zero bytes, you need to set the
|
||||||
|
length of the name with \fBCURLFORM_CONTENTSLENGTH\fP.
|
||||||
|
|
||||||
|
.B CURLFORM_PTRCONTENTS
|
||||||
|
followed by a string is used for the contents of this part, the actual data to
|
||||||
|
send away. libcurl will use the pointer and refer to the data in your
|
||||||
|
application, you must make sure it remains until curl no longer needs it. If
|
||||||
|
the data isn't zero terminated properly, or if you'd like it to contain zero
|
||||||
|
bytes, you need to set the length of the name with
|
||||||
|
\fBCURLFORM_CONTENTSLENGTH\fP.
|
||||||
|
|
||||||
|
.B CURLFORM_FILECONTENT
|
||||||
|
followed by a file name, makes that file read and the contents will be used in
|
||||||
|
as data in this part.
|
||||||
|
|
||||||
|
.B CURLFORM_FILE
|
||||||
|
followed by a file name, makes this part a file upload part. It sets the file
|
||||||
|
name field to the actual file name used here, it gets the contents of the file
|
||||||
|
and passes as data and sets the content-type if the given file match one of
|
||||||
|
the new internally known file extension. For \fBCURLFORM_FILE\fP the user may
|
||||||
|
send one or more files in one part by providing multiple \fBCURLFORM_FILE\fP
|
||||||
|
arguments each followed by the filename (and each CURLFORM_FILE is allowed to
|
||||||
|
have a CURLFORM_CONTENTTYPE).
|
||||||
|
|
||||||
|
.B CURLFORM_CONTENTTYPE
|
||||||
|
followed by a pointer to a string with a content-type will make curl use this
|
||||||
|
given content-type for this file upload part, possibly instead of an
|
||||||
|
internally chosen one.
|
||||||
|
|
||||||
|
.B CURLFORM_FILENAME
|
||||||
|
followed by a pointer to a string to a name, will make libcurl use the given
|
||||||
|
name in the file upload part, intead of the actual file name given to
|
||||||
|
\fICURLFORM_FILE\fP.
|
||||||
|
|
||||||
|
.B BCURLFORM_BUFFER
|
||||||
|
followed by a string, tells libcurl that a buffer is to be used to upload data
|
||||||
|
instead of using a file. The given string is used as the value of the file
|
||||||
|
name field in the content header.
|
||||||
|
|
||||||
|
.B CURLFORM_BUFFERPTR
|
||||||
|
followed by a pointer to a data area, tells libcurl the address of the buffer
|
||||||
|
containing data to upload (as indicated with \fICURLFORM_BUFFER\fP). The
|
||||||
|
buffer containing this data must not be freed until after curl_easy_cleanup is
|
||||||
|
called.
|
||||||
|
|
||||||
|
.B CURLFORM_BUFFERLENGTH
|
||||||
|
followed by a long with the size of the \fICURLFORM_BUFFERPTR\fP data area,
|
||||||
|
tells libcurl the length of the buffer to upload.
|
||||||
|
|
||||||
|
.B CURLFORM_ARRAY
|
||||||
|
Another possibility to send options to curl_formadd() is the
|
||||||
|
\fBCURLFORM_ARRAY\fP option, that passes a struct curl_forms array pointer as
|
||||||
|
its value. Each curl_forms structure element has a CURLformoption and a char
|
||||||
|
pointer. The final element in the array must be a CURLFORM_END. All available
|
||||||
|
options can be used in an array, except the CURLFORM_ARRAY option itself! The
|
||||||
|
last argument in such an array must always be \fBCURLFORM_END\fP.
|
||||||
|
|
||||||
|
.B CURLFORM_CONTENTHEADER
|
||||||
|
specifies extra headers for the form POST section. This takes a curl_slist
|
||||||
|
prepared in the usual way using \fBcurl_slist_append\fP and appends the list
|
||||||
|
of headers to those libcurl automatically generates. The list must exist while
|
||||||
|
the POST occurs, if you free it before the post completes you may experience
|
||||||
|
problems.
|
||||||
|
|
||||||
|
When you've passed the HttpPost pointer to \fIcurl_easy_setopt\fP (using the
|
||||||
|
\fICURLOPT_HTTPPOST\fP option), you must not free the list until after you've
|
||||||
|
called \fIcurl_easy_cleanup\fP for the curl handle.
|
||||||
|
|
||||||
See example below.
|
See example below.
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.TH curl_multi_fdset 3 "3 May 2002" "libcurl 7.9.5" "libcurl Manual"
|
.TH curl_multi_fdset 3 "3 May 2002" "libcurl 7.9.5" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_multi_fdset - add an easy handle to a multi session
|
curl_multi_fdset - extracts file descriptor information from a multi handle
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_multi_info_read 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
|
.TH curl_multi_info_read 3 "27 Feb 2002" "libcurl 7.10.3" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_multi_info_read - read multi stack informationals
|
curl_multi_info_read - read multi stack informationals
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -10,15 +10,15 @@ CURLMsg *curl_multi_info_read( CURLM *multi_handle,
|
|||||||
int *msgs_in_queue);
|
int *msgs_in_queue);
|
||||||
.ad
|
.ad
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Ask the multi handle if there's any messages/informationals from the
|
Ask the multi handle if there are any messages/informationals from the
|
||||||
individual transfers. Messages include informationals such as an error code
|
individual transfers. Messages may include informationals such as an error
|
||||||
from the transfer or just the fact that a transfer is completed. More details
|
code from the transfer or just the fact that a transfer is completed. More
|
||||||
on these should be written down as well.
|
details on these should be written down as well.
|
||||||
|
|
||||||
Repeated calls to this function will return a new struct each time, until a
|
Repeated calls to this function will return a new struct each time, until a
|
||||||
special "end of msgs" struct is returned as a signal that there is no more to
|
NULL is returned as a signal that there is no more to get at this point. The
|
||||||
get at this point. The integer pointed to with \fImsgs_in_queue\fP will
|
integer pointed to with \fImsgs_in_queue\fP will contain the number of
|
||||||
contain the number of remaining messages after this function was called.
|
remaining messages after this function was called.
|
||||||
|
|
||||||
The data the returned pointer points to will not survive calling
|
The data the returned pointer points to will not survive calling
|
||||||
curl_multi_cleanup().
|
curl_multi_cleanup().
|
||||||
@@ -26,10 +26,19 @@ curl_multi_cleanup().
|
|||||||
The 'CURLMsg' struct is very simple and only contain very basic informations.
|
The 'CURLMsg' struct is very simple and only contain very basic informations.
|
||||||
If more involved information is wanted, the particular "easy handle" in
|
If more involved information is wanted, the particular "easy handle" in
|
||||||
present in that struct and can thus be used in subsequent regular
|
present in that struct and can thus be used in subsequent regular
|
||||||
curl_easy_getinfo() calls (or similar).
|
curl_easy_getinfo() calls (or similar):
|
||||||
|
|
||||||
|
struct CURLMsg {
|
||||||
|
CURLMSG msg; /* what this message means */
|
||||||
|
CURL *easy_handle; /* the handle it concerns */
|
||||||
|
union {
|
||||||
|
void *whatever; /* message-specific data */
|
||||||
|
CURLcode result; /* return code for transfer */
|
||||||
|
} data;
|
||||||
|
};
|
||||||
.SH "RETURN VALUE"
|
.SH "RETURN VALUE"
|
||||||
A pointer to a filled-in struct, or NULL if it failed or ran out of
|
A pointer to a filled-in struct, or NULL if it failed or ran out of
|
||||||
structs. It also writes the number of messages left in the queue (after this
|
structs. It also writes the number of messages left in the queue (after this
|
||||||
read) in the integer the second argument points to.
|
read) in the integer the second argument points to.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR curl_multi_cleanup "(3)," curl_multi_init "(3)," curl_multi_perform "(3)"
|
.BR curl_multi_cleanup "(3), " curl_multi_init "(3), " curl_multi_perform "(3)"
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.TH curl_multi_perform 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
|
.TH curl_multi_perform 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_multi_perform - add an easy handle to a multi session
|
curl_multi_perform - reads/writes available data from each easy handle
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
@@ -19,6 +19,12 @@ integer-pointer.
|
|||||||
.SH "RETURN VALUE"
|
.SH "RETURN VALUE"
|
||||||
CURLMcode type, general libcurl multi interface error code.
|
CURLMcode type, general libcurl multi interface error code.
|
||||||
|
|
||||||
|
If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this basicly means that you
|
||||||
|
should call \fIcurl_multi_perform\fP again, before you select() on more
|
||||||
|
actions. You don't have to do it immediately, but the return code means that
|
||||||
|
libcurl may have more data available to return or that there may be more data
|
||||||
|
to send off before it is "satisfied".
|
||||||
|
|
||||||
NOTE that this only returns errors etc regarding the whole multi stack. There
|
NOTE that this only returns errors etc regarding the whole multi stack. There
|
||||||
might still have occurred problems on invidual transfers even when this
|
might still have occurred problems on invidual transfers even when this
|
||||||
function returns OK.
|
function returns OK.
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.TH curl_multi_remove_handle 3 "6 March 2002" "libcurl 7.9.5" "libcurl Manual"
|
.TH curl_multi_remove_handle 3 "6 March 2002" "libcurl 7.9.5" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_multi_remove_handle - add an easy handle to a multi session
|
curl_multi_remove_handle - remove an easy handle from a multi session
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
@@ -14,6 +14,9 @@ specified easy handle be removed from this multi handle's control.
|
|||||||
|
|
||||||
When the easy handle has been removed from a multi stack, it is again
|
When the easy handle has been removed from a multi stack, it is again
|
||||||
perfectly legal to invoke \fIcurl_easy_perform()\fP on this easy handle.
|
perfectly legal to invoke \fIcurl_easy_perform()\fP on this easy handle.
|
||||||
|
|
||||||
|
Removing a handle while being used, will effectively halt all transfers in
|
||||||
|
progress.
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
CURLMcode type, general libcurl multi interface error code.
|
CURLMcode type, general libcurl multi interface error code.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man [file]
|
.\" nroff -man [file]
|
||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_slist_append 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
|
.TH curl_slist_append 3 "19 Jun 2003" "libcurl 7.10.4" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_slist_append - add a string to an slist
|
curl_slist_append - add a string to an slist
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -13,17 +13,27 @@ curl_slist_append - add a string to an slist
|
|||||||
.ad
|
.ad
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
curl_slist_append() appends a specified string to a linked list of
|
curl_slist_append() appends a specified string to a linked list of
|
||||||
strings. The existing
|
strings. The existing \fIlist\fP should be passed as the first argument while
|
||||||
.I list
|
the new list is returned from this function. The specified \fIstring\fP has
|
||||||
should be passed as the first argument while the new list is returned from
|
been appended when this function returns. curl_slist_append() copies the
|
||||||
this function. The specified
|
string.
|
||||||
.I string
|
|
||||||
has been appended when this function returns.
|
The list should be freed again (after usage) with \fBcurl_slist_free_all()\fP.
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
A null pointer is returned if anything went wrong, otherwise the new list
|
A null pointer is returned if anything went wrong, otherwise the new list
|
||||||
pointer is returned.
|
pointer is returned.
|
||||||
|
.SH EXAMPLE
|
||||||
|
CURL handle;
|
||||||
|
curl_slist *slist=NULL;
|
||||||
|
|
||||||
|
slist = curl_slist_append(slist, "pragma:");
|
||||||
|
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
|
||||||
|
|
||||||
|
curl_easy_perform(handle);
|
||||||
|
|
||||||
|
curl_slist_free_all(slist); /* free the list again */
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR curl_slist_free_all "(3), "
|
.BR curl_slist_free_all "(3), "
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
Surely there are some, you tell me!
|
None.
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man [file]
|
.\" nroff -man [file]
|
||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_version_info 3 "30 Sep 2002" "libcurl 7.10" "libcurl Manual"
|
.TH curl_version_info 3 "17 Jun 2003" "libcurl 7.10.6" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_version_info - returns run-time libcurl version info
|
curl_version_info - returns run-time libcurl version info
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -69,6 +69,16 @@ supports SSL (HTTPS/FTPS)
|
|||||||
.TP
|
.TP
|
||||||
.B CURL_VERSION_LIBZ
|
.B CURL_VERSION_LIBZ
|
||||||
supports HTTP deflate using libz
|
supports HTTP deflate using libz
|
||||||
|
.TP
|
||||||
|
.B CURL_VERSION_NTLM
|
||||||
|
supports HTTP NTLM (added in 7.10.6)
|
||||||
|
.TP
|
||||||
|
.B CURL_VERSION_GSSNEGOTIATE
|
||||||
|
supports HTTP GSS-Negotiate (added in 7.10.6)
|
||||||
|
.TP
|
||||||
|
.B CURL_VERSION_DEBUG
|
||||||
|
libcurl was built with extra debug capabilities built-in. This is mainly of
|
||||||
|
interest for libcurl hackers. (added in 7.10.6)
|
||||||
.PP
|
.PP
|
||||||
\fIssl_version\fP is an ascii string for the OpenSSL version used. If libcurl
|
\fIssl_version\fP is an ascii string for the OpenSSL version used. If libcurl
|
||||||
has no SSL support, this is NULL.
|
has no SSL support, this is NULL.
|
||||||
@@ -83,8 +93,6 @@ libcurl has no libz support, this is NULL.
|
|||||||
names protocols that libcurl supports (using lowercase letters). The protocol
|
names protocols that libcurl supports (using lowercase letters). The protocol
|
||||||
names are the same as would be used in URLs. The array is terminated by a NULL
|
names are the same as would be used in URLs. The array is terminated by a NULL
|
||||||
entry.
|
entry.
|
||||||
|
|
||||||
|
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
A pointer to a curl_version_info_data struct.
|
A pointer to a curl_version_info_data struct.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man [file]
|
.\" nroff -man [file]
|
||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH libcurl-errors 3 "10 April 2002" "libcurl 7.9.6" "libcurl errors"
|
.TH libcurl-errors 3 "18 Dec 2002" "libcurl 7.10.3" "libcurl errors"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
error codes in libcurl
|
error codes in libcurl
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
@@ -104,7 +104,7 @@ After a completed file transfer, the FTP server did not respond a proper
|
|||||||
When sending custom "QUOTE" commands to the remote server, one of the commands
|
When sending custom "QUOTE" commands to the remote server, one of the commands
|
||||||
returned an error code that was 400 or higher.
|
returned an error code that was 400 or higher.
|
||||||
.TP
|
.TP
|
||||||
.B CURLE_HTTP_NOT_FOUND (22)
|
.B CURLE_HTTP_RETURNED_ERROR (22)
|
||||||
This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server
|
This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server
|
||||||
returns an error code that is >= 400.
|
returns an error code that is >= 400.
|
||||||
.TP
|
.TP
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man [file]
|
.\" nroff -man [file]
|
||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH libcurl-multi 5 "20 March 2001" "libcurl 7.9.5" "libcurl multi interface"
|
.TH libcurl-multi 5 "13 Oct 2001" "libcurl 7.10.1" "libcurl multi interface"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
libcurl-multi \- how to use the multi interface
|
libcurl-multi \- how to use the multi interface
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
@@ -37,7 +37,7 @@ curl_multi_* functions.
|
|||||||
|
|
||||||
Each single transfer is built up with an easy handle. You must create them,
|
Each single transfer is built up with an easy handle. You must create them,
|
||||||
and setup the appropriate options for each easy handle, as outlined in the
|
and setup the appropriate options for each easy handle, as outlined in the
|
||||||
\fIlibcurl(3)\fP man page.
|
\fIlibcurl(3)\fP man page, using \fIcurl_easy_setopt(3)\fP.
|
||||||
|
|
||||||
When the easy handle is setup for a transfer, then instead of using
|
When the easy handle is setup for a transfer, then instead of using
|
||||||
\fIcurl_easy_perform\fP (as when using the easy interface for transfers), you
|
\fIcurl_easy_perform\fP (as when using the easy interface for transfers), you
|
||||||
@@ -49,11 +49,11 @@ handles.
|
|||||||
Should you change your mind, the easy handle is again removed from the multi
|
Should you change your mind, the easy handle is again removed from the multi
|
||||||
stack using \fIcurl_multi_remove_handle\fP. Once removed from the multi
|
stack using \fIcurl_multi_remove_handle\fP. Once removed from the multi
|
||||||
handle, you can again use other easy interface functions like
|
handle, you can again use other easy interface functions like
|
||||||
curl_easy_perform or whatever you think is necessary.
|
\fIcurl_easy_perform\fP on the handle or whatever you think is necessary.
|
||||||
|
|
||||||
Adding the easy handles to the multi handle does not start any
|
Adding the easy handle to the multi handle does not start the transfer.
|
||||||
transfer. Remember that one of the main ideas with this interface is to let
|
Remember that one of the main ideas with this interface is to let your
|
||||||
your application drive. You drive the transfers by invoking
|
application drive. You drive the transfers by invoking
|
||||||
\fIcurl_multi_perform\fP. libcurl will then transfer data if there is anything
|
\fIcurl_multi_perform\fP. libcurl will then transfer data if there is anything
|
||||||
available to transfer. It'll use the callbacks and everything else you have
|
available to transfer. It'll use the callbacks and everything else you have
|
||||||
setup in the individual easy handles. It'll transfer data on all current
|
setup in the individual easy handles. It'll transfer data on all current
|
||||||
@@ -62,24 +62,39 @@ all, it may be none.
|
|||||||
|
|
||||||
Your application can acquire knowledge from libcurl when it would like to get
|
Your application can acquire knowledge from libcurl when it would like to get
|
||||||
invoked to transfer data, so that you don't have to busy-loop and call that
|
invoked to transfer data, so that you don't have to busy-loop and call that
|
||||||
\fIcurl_multi_perform\fP like a mad man! \fIcurl_multi_fdset\fP offers an
|
\fIcurl_multi_perform\fP like crazy. \fIcurl_multi_fdset\fP offers an
|
||||||
interface using which you can extract fd_sets from libcurl to use in select()
|
interface using which you can extract fd_sets from libcurl to use in select()
|
||||||
or poll() calls in order to get to know when the transfers in the multi stack
|
or poll() calls in order to get to know when the transfers in the multi stack
|
||||||
might need attention. This also makes it very easy for your program to wait
|
might need attention. This also makes it very easy for your program to wait
|
||||||
for input on your own private file descriptors at the same time or perhaps
|
for input on your own private file descriptors at the same time or perhaps
|
||||||
timeout every now and then, should you want that.
|
timeout every now and then, should you want that.
|
||||||
|
|
||||||
|
A little note here about the return codes from the multi functions, and
|
||||||
|
especially the \fIcurl_multi_perform\fP: if you receive
|
||||||
|
\fICURLM_CALL_MULTI_PERFORM\fP, this basicly means that you should call
|
||||||
|
\fIcurl_multi_perform\fP again, before you select() on more actions. You don't
|
||||||
|
have to do it immediately, but the return code means that libcurl may have
|
||||||
|
more data available to return or that there may be more data to send off
|
||||||
|
before it is "satisfied".
|
||||||
|
|
||||||
\fIcurl_multi_perform\fP stores the number of still running transfers in one
|
\fIcurl_multi_perform\fP stores the number of still running transfers in one
|
||||||
of its input arguments, and by reading that you can figure out when all the
|
of its input arguments, and by reading that you can figure out when all the
|
||||||
transfers in the multi handles are done. 'done' does not mean successful. One
|
transfers in the multi handles are done. 'done' does not mean successful. One
|
||||||
or more of the transfers may have failed.
|
or more of the transfers may have failed. Tracking when this number changes,
|
||||||
|
you know when one or more transfers are done.
|
||||||
|
|
||||||
To get information about completed transfers, to figure out success or not and
|
To get information about completed transfers, to figure out success or not and
|
||||||
similar, \fIcurl_multi_info_read\fP should be called. It can return a message
|
similar, \fIcurl_multi_info_read\fP should be called. It can return a message
|
||||||
about a current or previous transfer. Repeated invokes of the function get
|
about a current or previous transfer. Repeated invokes of the function get
|
||||||
more messages until the message queue is empty.
|
more messages until the message queue is empty. The information you receive
|
||||||
|
there includes an easy handle pointer which you may use to identify which easy
|
||||||
|
handle the information regards.
|
||||||
|
|
||||||
When all transfers in the multi stack are done, cleanup the multi handle with
|
When all transfers in the multi stack are done, cleanup the multi handle with
|
||||||
\fIcurl_multi_cleanup\fP. Be careful and please note that you \fBMUST\fP
|
\fIcurl_multi_cleanup\fP. Be careful and please note that you \fBMUST\fP
|
||||||
invoke separate \fIcurl_easy_cleanup\fP calls on every single easy handle to
|
invoke separate \fIcurl_easy_cleanup\fP calls on every single easy handle to
|
||||||
clean them up properly.
|
clean them up properly.
|
||||||
|
|
||||||
|
If you want to re-use an easy handle that was added to the multi handle for
|
||||||
|
transfer, you must first remove it from the multi stack and then re-add it
|
||||||
|
again (possbily after having altered some options at your own choice).
|
||||||
|
@@ -13,3 +13,26 @@ of environment. You should include files from here using...
|
|||||||
|
|
||||||
... style and point the compiler's include path to the directory holding the
|
... style and point the compiler's include path to the directory holding the
|
||||||
curl subdirectory. It makes it more likely to survive future modifications.
|
curl subdirectory. It makes it more likely to survive future modifications.
|
||||||
|
|
||||||
|
NOTE FOR LIBCURL HACKERS
|
||||||
|
|
||||||
|
All the include files in this tree are written and intended to be installed on
|
||||||
|
a system that may serve multiple platforms and multiple applications, all
|
||||||
|
using libcurl (possibly even different libcurl installations using different
|
||||||
|
versions). Therefore, all header files in here must obey these rules:
|
||||||
|
|
||||||
|
* They cannot depend on or use configure-generated results from libcurl's or
|
||||||
|
curl's directories. Other applications may not run configure as (lib)curl
|
||||||
|
does, and using platform dependent info here may break other platforms.
|
||||||
|
|
||||||
|
* We cannot assume anything else but very basic compiler features being
|
||||||
|
present. While libcurl requires an ANSI C compiler to build, some of the
|
||||||
|
earlier ANSI compilers clearly can't deal with some preprocessor operators.
|
||||||
|
|
||||||
|
* Newlines must remain unix-style for older compilers' sake.
|
||||||
|
|
||||||
|
* Comments must be written in the old-style /* unnested C-fashion */
|
||||||
|
|
||||||
|
To figure out how to do good and portable checks for features, operating
|
||||||
|
systems or specific hardwarare, a very good resource is Bjorn Reese's
|
||||||
|
collection at http://predef.sf.net/
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -23,23 +23,39 @@
|
|||||||
* $Id$
|
* $Id$
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
/* If you have problems, all libcurl docs and details are found here:
|
||||||
|
http://curl.haxx.se/libcurl/
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This is the version number of the libcurl package from which this header
|
||||||
|
file origins: */
|
||||||
|
#define LIBCURL_VERSION "7.10.6"
|
||||||
|
|
||||||
|
/* This is the numeric version of the libcurl version number, meant for easier
|
||||||
|
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
|
||||||
|
always follow this syntax:
|
||||||
|
|
||||||
|
0xXXYYZZ
|
||||||
|
|
||||||
|
Where XX, YY and ZZ are the main version, release and patch numbers in
|
||||||
|
hexadecimal. All three numbers are always represented using two digits. 1.2
|
||||||
|
would appear as "0x010200" while version 9.11.7 appears as "0x090b07".
|
||||||
|
|
||||||
|
This 6-digit hexadecimal number does not show pre-release number, and it is
|
||||||
|
always a greater number in a more recent release. It makes comparisons with
|
||||||
|
greater than and less than work.
|
||||||
|
*/
|
||||||
|
#define LIBCURL_VERSION_NUM 0x070a06
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
/* The include stuff here is mainly for time_t! */
|
|
||||||
|
/* The include stuff here below is mainly for time_t! */
|
||||||
#ifdef vms
|
#ifdef vms
|
||||||
# include <types.h>
|
# include <types.h>
|
||||||
# include <time.h>
|
# include <time.h>
|
||||||
#else
|
#else
|
||||||
# include <sys/types.h>
|
# include <sys/types.h>
|
||||||
# ifdef TIME_WITH_SYS_TIME
|
# include <time.h>
|
||||||
# include <sys/time.h>
|
|
||||||
# include <time.h>
|
|
||||||
# else
|
|
||||||
# ifdef HAVE_SYS_TIME_H
|
|
||||||
# include <sys/time.h>
|
|
||||||
# else
|
|
||||||
# include <time.h>
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif /* defined (vms) */
|
#endif /* defined (vms) */
|
||||||
|
|
||||||
#ifndef TRUE
|
#ifndef TRUE
|
||||||
@@ -55,39 +71,36 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* stupid #define trick to preserve functionality with older code, but
|
/* silly trick to preserve functionality with older code, but making it use
|
||||||
making it use our name space for the future */
|
our name space for the future */
|
||||||
#define HttpPost curl_httppost
|
#define HttpPost curl_httppost
|
||||||
|
|
||||||
struct curl_httppost {
|
struct curl_httppost {
|
||||||
struct curl_httppost *next; /* next entry in the list */
|
struct curl_httppost *next; /* next entry in the list */
|
||||||
char *name; /* pointer to allocated name */
|
char *name; /* pointer to allocated name */
|
||||||
long namelength; /* length of name length */
|
long namelength; /* length of name length */
|
||||||
char *contents; /* pointer to allocated data contents */
|
char *contents; /* pointer to allocated data contents */
|
||||||
long contentslength; /* length of contents field */
|
long contentslength; /* length of contents field */
|
||||||
|
char *buffer; /* pointer to allocated buffer contents */
|
||||||
/* CMC: Added support for buffer uploads */
|
long bufferlength; /* length of buffer field */
|
||||||
char *buffer; /* pointer to allocated buffer contents */
|
char *contenttype; /* Content-Type */
|
||||||
long bufferlength; /* length of buffer field */
|
|
||||||
|
|
||||||
char *contenttype; /* Content-Type */
|
|
||||||
struct curl_slist* contentheader; /* list of extra headers for this form */
|
struct curl_slist* contentheader; /* list of extra headers for this form */
|
||||||
struct curl_httppost *more; /* if one field name has more than one file, this
|
struct curl_httppost *more; /* if one field name has more than one
|
||||||
link should link to following files */
|
file, this link should link to following
|
||||||
long flags; /* as defined below */
|
files */
|
||||||
#define HTTPPOST_FILENAME (1<<0) /* specified content is a file name */
|
long flags; /* as defined below */
|
||||||
#define HTTPPOST_READFILE (1<<1) /* specified content is a file name */
|
#define HTTPPOST_FILENAME (1<<0) /* specified content is a file name */
|
||||||
#define HTTPPOST_PTRNAME (1<<2) /* name is only stored pointer
|
#define HTTPPOST_READFILE (1<<1) /* specified content is a file name */
|
||||||
do not free in formfree */
|
#define HTTPPOST_PTRNAME (1<<2) /* name is only stored pointer
|
||||||
|
do not free in formfree */
|
||||||
#define HTTPPOST_PTRCONTENTS (1<<3) /* contents is only stored pointer
|
#define HTTPPOST_PTRCONTENTS (1<<3) /* contents is only stored pointer
|
||||||
do not free in formfree */
|
do not free in formfree */
|
||||||
|
#define HTTPPOST_BUFFER (1<<4) /* upload file from buffer */
|
||||||
|
#define HTTPPOST_PTRBUFFER (1<<5) /* upload file from pointer contents */
|
||||||
|
|
||||||
/* CMC: Added support for buffer uploads */
|
char *showfilename; /* The file name to show. If not set, the
|
||||||
#define HTTPPOST_BUFFER (1<<4) /* upload file from buffer */
|
actual file name will be used (if this
|
||||||
#define HTTPPOST_PTRBUFFER (1<<5) /* upload file from pointer contents */
|
is a file part) */
|
||||||
|
|
||||||
char *showfilename; /* The file name to show. If not set, the actual
|
|
||||||
file name will be used (if this is a file part) */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef int (*curl_progress_callback)(void *clientp,
|
typedef int (*curl_progress_callback)(void *clientp,
|
||||||
@@ -96,7 +109,9 @@ typedef int (*curl_progress_callback)(void *clientp,
|
|||||||
double ultotal,
|
double ultotal,
|
||||||
double ulnow);
|
double ulnow);
|
||||||
|
|
||||||
#define CURL_MAX_WRITE_SIZE 20480
|
/* Tests have proven that 20K is a very bad buffer size for uploads on
|
||||||
|
Windows, while 16K for some odd reason performed a lot better. */
|
||||||
|
#define CURL_MAX_WRITE_SIZE 16384
|
||||||
|
|
||||||
typedef size_t (*curl_write_callback)(char *buffer,
|
typedef size_t (*curl_write_callback)(char *buffer,
|
||||||
size_t size,
|
size_t size,
|
||||||
@@ -128,7 +143,7 @@ typedef int (*curl_debug_callback)
|
|||||||
curl_infotype type, /* what kind of data */
|
curl_infotype type, /* what kind of data */
|
||||||
char *data, /* points to the data */
|
char *data, /* points to the data */
|
||||||
size_t size, /* size of the data pointed to */
|
size_t size, /* size of the data pointed to */
|
||||||
void *userp); /* whatever the user please */
|
void *userptr); /* whatever the user please */
|
||||||
|
|
||||||
/* All possible error codes from all sorts of curl functions. Future versions
|
/* All possible error codes from all sorts of curl functions. Future versions
|
||||||
may return other values, stay prepared.
|
may return other values, stay prepared.
|
||||||
@@ -160,7 +175,7 @@ typedef enum {
|
|||||||
CURLE_FTP_COULDNT_RETR_FILE, /* 19 */
|
CURLE_FTP_COULDNT_RETR_FILE, /* 19 */
|
||||||
CURLE_FTP_WRITE_ERROR, /* 20 */
|
CURLE_FTP_WRITE_ERROR, /* 20 */
|
||||||
CURLE_FTP_QUOTE_ERROR, /* 21 */
|
CURLE_FTP_QUOTE_ERROR, /* 21 */
|
||||||
CURLE_HTTP_NOT_FOUND, /* 22 */
|
CURLE_HTTP_RETURNED_ERROR, /* 22 */
|
||||||
CURLE_WRITE_ERROR, /* 23 */
|
CURLE_WRITE_ERROR, /* 23 */
|
||||||
CURLE_MALFORMAT_USER, /* 24 - user name is illegally specified */
|
CURLE_MALFORMAT_USER, /* 24 - user name is illegally specified */
|
||||||
CURLE_FTP_COULDNT_STOR_FILE, /* 25 - failed FTP upload */
|
CURLE_FTP_COULDNT_STOR_FILE, /* 25 - failed FTP upload */
|
||||||
@@ -205,12 +220,29 @@ typedef enum {
|
|||||||
CURL_LAST /* never use! */
|
CURL_LAST /* never use! */
|
||||||
} CURLcode;
|
} CURLcode;
|
||||||
|
|
||||||
|
typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */
|
||||||
|
void *ssl_ctx, /* actually an
|
||||||
|
OpenSSL SSL_CTX */
|
||||||
|
void *userptr);
|
||||||
|
|
||||||
|
/* Make a spelling correction for the operation timed-out define */
|
||||||
|
#define CURLE_OPERATION_TIMEDOUT CURLE_OPERATION_TIMEOUTED
|
||||||
|
#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CURLPROXY_HTTP = 0,
|
CURLPROXY_HTTP = 0,
|
||||||
CURLPROXY_SOCKS4 = 4,
|
CURLPROXY_SOCKS4 = 4,
|
||||||
CURLPROXY_SOCKS5 = 5
|
CURLPROXY_SOCKS5 = 5
|
||||||
} curl_proxytype;
|
} curl_proxytype;
|
||||||
|
|
||||||
|
#define CURLAUTH_NONE 0 /* nothing */
|
||||||
|
#define CURLAUTH_BASIC (1<<0) /* Basic (default) */
|
||||||
|
#define CURLAUTH_DIGEST (1<<1) /* Digest */
|
||||||
|
#define CURLAUTH_GSSNEGOTIATE (1<<2) /* GSS-Negotiate */
|
||||||
|
#define CURLAUTH_NTLM (1<<3) /* NTLM */
|
||||||
|
#define CURLAUTH_ANY ~0 /* all types set */
|
||||||
|
#define CURLAUTH_ANYSAFE (~CURLAUTH_BASIC)
|
||||||
|
|
||||||
/* this was the error code 50 in 7.7.3 and a few earlier versions, this
|
/* this was the error code 50 in 7.7.3 and a few earlier versions, this
|
||||||
is no longer used by libcurl but is instead #defined here only to not
|
is no longer used by libcurl but is instead #defined here only to not
|
||||||
make programs break */
|
make programs break */
|
||||||
@@ -242,7 +274,15 @@ typedef enum {
|
|||||||
* platforms.
|
* platforms.
|
||||||
*/
|
*/
|
||||||
#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \
|
#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \
|
||||||
defined(__HP_aCC)
|
defined(__HP_aCC) || defined(__BORLANDC__)
|
||||||
|
/* This compiler is believed to have an ISO compatible preprocessor */
|
||||||
|
#define CURL_ISOCPP
|
||||||
|
#else
|
||||||
|
/* This compiler is believed NOT to have an ISO compatible preprocessor */
|
||||||
|
#undef CURL_ISOCPP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CURL_ISOCPP
|
||||||
#define CINIT(name,type,number) CURLOPT_ ## name = CURLOPTTYPE_ ## type + number
|
#define CINIT(name,type,number) CURLOPT_ ## name = CURLOPTTYPE_ ## type + number
|
||||||
#else
|
#else
|
||||||
/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
|
/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
|
||||||
@@ -252,6 +292,12 @@ typedef enum {
|
|||||||
#define CINIT(name,type,number) CURLOPT_/**/name = type + number
|
#define CINIT(name,type,number) CURLOPT_/**/name = type + number
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This macro-mania below setups the CURLOPT_[what] enum, to be used with
|
||||||
|
* curl_easy_setopt(). The first argument in the CINIT() macro is the [what]
|
||||||
|
* word.
|
||||||
|
*/
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CINIT(NOTHING, LONG, 0), /********* the first one is unused ************/
|
CINIT(NOTHING, LONG, 0), /********* the first one is unused ************/
|
||||||
|
|
||||||
@@ -261,24 +307,19 @@ typedef enum {
|
|||||||
/* The full URL to get/put */
|
/* The full URL to get/put */
|
||||||
CINIT(URL, OBJECTPOINT, 2),
|
CINIT(URL, OBJECTPOINT, 2),
|
||||||
|
|
||||||
/* Port number to connect to, if other than default. Specify the CONF_PORT
|
/* Port number to connect to, if other than default. */
|
||||||
flag in the CURLOPT_FLAGS to activate this */
|
|
||||||
CINIT(PORT, LONG, 3),
|
CINIT(PORT, LONG, 3),
|
||||||
|
|
||||||
/* Name of proxy to use. Specify the CONF_PROXY flag in the CURLOPT_FLAGS to
|
/* Name of proxy to use. */
|
||||||
activate this */
|
|
||||||
CINIT(PROXY, OBJECTPOINT, 4),
|
CINIT(PROXY, OBJECTPOINT, 4),
|
||||||
|
|
||||||
/* Name and password to use when fetching. Specify the CONF_USERPWD flag in
|
/* "name:password" to use when fetching. */
|
||||||
the CURLOPT_FLAGS to activate this */
|
|
||||||
CINIT(USERPWD, OBJECTPOINT, 5),
|
CINIT(USERPWD, OBJECTPOINT, 5),
|
||||||
|
|
||||||
/* Name and password to use with Proxy. Specify the CONF_PROXYUSERPWD
|
/* "name:password" to use with proxy. */
|
||||||
flag in the CURLOPT_FLAGS to activate this */
|
|
||||||
CINIT(PROXYUSERPWD, OBJECTPOINT, 6),
|
CINIT(PROXYUSERPWD, OBJECTPOINT, 6),
|
||||||
|
|
||||||
/* Range to get, specified as an ASCII string. Specify the CONF_RANGE flag
|
/* Range to get, specified as an ASCII string. */
|
||||||
in the CURLOPT_FLAGS to activate this */
|
|
||||||
CINIT(RANGE, OBJECTPOINT, 7),
|
CINIT(RANGE, OBJECTPOINT, 7),
|
||||||
|
|
||||||
/* not used */
|
/* not used */
|
||||||
@@ -399,7 +440,6 @@ typedef enum {
|
|||||||
as described elsewhere. */
|
as described elsewhere. */
|
||||||
CINIT(WRITEINFO, OBJECTPOINT, 40),
|
CINIT(WRITEINFO, OBJECTPOINT, 40),
|
||||||
|
|
||||||
/* Previous FLAG bits */
|
|
||||||
CINIT(VERBOSE, LONG, 41), /* talk a lot */
|
CINIT(VERBOSE, LONG, 41), /* talk a lot */
|
||||||
CINIT(HEADER, LONG, 42), /* throw the header out too */
|
CINIT(HEADER, LONG, 42), /* throw the header out too */
|
||||||
CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */
|
CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */
|
||||||
@@ -599,6 +639,35 @@ typedef enum {
|
|||||||
the response to be compressed. */
|
the response to be compressed. */
|
||||||
CINIT(ENCODING, OBJECTPOINT, 102),
|
CINIT(ENCODING, OBJECTPOINT, 102),
|
||||||
|
|
||||||
|
/* Set pointer to private data */
|
||||||
|
CINIT(PRIVATE, OBJECTPOINT, 103),
|
||||||
|
|
||||||
|
/* Set aliases for HTTP 200 in the HTTP Response header */
|
||||||
|
CINIT(HTTP200ALIASES, OBJECTPOINT, 104),
|
||||||
|
|
||||||
|
/* Continue to send authentication (user+password) when following locations,
|
||||||
|
even when hostname changed. This can potentionally send off the name
|
||||||
|
and password to whatever host the server decides. */
|
||||||
|
CINIT(UNRESTRICTED_AUTH, LONG, 105),
|
||||||
|
|
||||||
|
/* Specificly switch on or off the FTP engine's use of the EPRT command ( it
|
||||||
|
also disables the LPRT attempt). By default, those ones will always be
|
||||||
|
attempted before the good old traditional PORT command. */
|
||||||
|
CINIT(FTP_USE_EPRT, LONG, 106),
|
||||||
|
|
||||||
|
/* Set this to a bitmask value to enable the particular authentications
|
||||||
|
methods you like. Use this in combination with CURLOPT_USERPWD.
|
||||||
|
Note that setting multiple bits may cause extra network round-trips. */
|
||||||
|
CINIT(HTTPAUTH, LONG, 107),
|
||||||
|
|
||||||
|
/* Set the ssl context callback function, currently only for OpenSSL ssl_ctx
|
||||||
|
in second argument. The function must be matching the
|
||||||
|
curl_ssl_ctx_callback proto. */
|
||||||
|
CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108),
|
||||||
|
|
||||||
|
/* Set the userdata for the ssl context callback function's third
|
||||||
|
argument */
|
||||||
|
CINIT(SSL_CTX_DATA, OBJECTPOINT, 109),
|
||||||
|
|
||||||
CURLOPT_LASTENTRY /* the last unused */
|
CURLOPT_LASTENTRY /* the last unused */
|
||||||
} CURLoption;
|
} CURLoption;
|
||||||
@@ -668,29 +737,29 @@ typedef enum {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* These functions are in the libcurl, they're here for portable reasons and
|
/* These functions are in libcurl, they're here for portable reasons and they
|
||||||
they are used by the 'curl' client. They really should be moved to some kind
|
are used by the 'curl' client. They really should be moved to some kind of
|
||||||
of "portability library" since it has nothing to do with file transfers and
|
"portability library" since it has nothing to do with file transfers and
|
||||||
might be usable to other programs...
|
might be usable to other programs...
|
||||||
|
|
||||||
NOTE: they return TRUE if the strings match *case insensitively*.
|
NOTE: they return TRUE if the strings match *case insensitively*.
|
||||||
*/
|
*/
|
||||||
extern int (curl_strequal)(const char *s1, const char *s2);
|
extern int (curl_strequal)(const char *s1, const char *s2);
|
||||||
extern int (curl_strnequal)(const char *s1, const char *s2, size_t n);
|
extern int (curl_strnequal)(const char *s1, const char *s2, size_t n);
|
||||||
#define strequal(a,b) curl_strequal(a,b)
|
|
||||||
#define strnequal(a,b,c) curl_strnequal(a,b,c)
|
|
||||||
|
|
||||||
/* DEPRECATED function to build formdata */
|
#ifdef CURL_OLDSTYLE
|
||||||
|
/* DEPRECATED function to build formdata. Stop using this, it will cease
|
||||||
|
to exist. */
|
||||||
int curl_formparse(char *, struct curl_httppost **,
|
int curl_formparse(char *, struct curl_httppost **,
|
||||||
struct curl_httppost **_post);
|
struct curl_httppost **_post);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* name is uppercase CURLFORM_<name> */
|
/* name is uppercase CURLFORM_<name> */
|
||||||
#ifdef CFINIT
|
#ifdef CFINIT
|
||||||
#undef CFINIT
|
#undef CFINIT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \
|
#ifdef CURL_ISOCPP
|
||||||
defined(__HP_aCC)
|
|
||||||
#define CFINIT(name) CURLFORM_ ## name
|
#define CFINIT(name) CURLFORM_ ## name
|
||||||
#else
|
#else
|
||||||
/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
|
/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
|
||||||
@@ -762,47 +831,122 @@ typedef enum {
|
|||||||
CURL_FORMADD_LAST /* last */
|
CURL_FORMADD_LAST /* last */
|
||||||
} CURLFORMcode;
|
} CURLFORMcode;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_formadd()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Pretty advanved function for building multi-part formposts. Each invoke
|
||||||
|
* adds one part that together construct a full post. Then use
|
||||||
|
* CURLOPT_HTTPPOST to send it off to libcurl.
|
||||||
|
*/
|
||||||
CURLFORMcode curl_formadd(struct curl_httppost **httppost,
|
CURLFORMcode curl_formadd(struct curl_httppost **httppost,
|
||||||
struct curl_httppost **last_post,
|
struct curl_httppost **last_post,
|
||||||
...);
|
...);
|
||||||
|
|
||||||
/* cleanup a form: */
|
/*
|
||||||
|
* NAME curl_formfree()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Free a multipart formpost previously built with curl_formadd().
|
||||||
|
*/
|
||||||
void curl_formfree(struct curl_httppost *form);
|
void curl_formfree(struct curl_httppost *form);
|
||||||
|
|
||||||
/* Unix and Win32 getenv function call, this returns a malloc()'ed string that
|
/*
|
||||||
MUST be free()ed after usage is complete. */
|
* NAME curl_getenv()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Returns a malloc()'ed string that MUST be curl_free()ed after usage is
|
||||||
|
* complete.
|
||||||
|
*/
|
||||||
char *curl_getenv(const char *variable);
|
char *curl_getenv(const char *variable);
|
||||||
|
|
||||||
/* Returns a static ascii string of the libcurl version. */
|
/*
|
||||||
|
* NAME curl_version()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Returns a static ascii string of the libcurl version.
|
||||||
|
*/
|
||||||
char *curl_version(void);
|
char *curl_version(void);
|
||||||
|
|
||||||
/* Escape and unescape URL encoding in strings. The functions return a new
|
/*
|
||||||
* allocated string or NULL if an error occurred. */
|
* NAME curl_escape()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Escapes URL strings (converts all letters consider illegal in URLs to their
|
||||||
|
* %XX versions). This function returns a new allocated string or NULL if an
|
||||||
|
* error occurred.
|
||||||
|
*/
|
||||||
char *curl_escape(const char *string, int length);
|
char *curl_escape(const char *string, int length);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_unescape()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Unescapes URL encoding in strings (converts all %XX codes to their 8bit
|
||||||
|
* versions). This function returns a new allocated string or NULL if an error
|
||||||
|
* occurred.
|
||||||
|
*/
|
||||||
char *curl_unescape(const char *string, int length);
|
char *curl_unescape(const char *string, int length);
|
||||||
/* 20020912 WJM. Provide for a de-allocation in the same translation unit
|
|
||||||
that did the allocation. Added in libcurl 7.10 */
|
/*
|
||||||
|
* NAME curl_free()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Provided for de-allocation in the same translation unit that did the
|
||||||
|
* allocation. Added in libcurl 7.10
|
||||||
|
*/
|
||||||
void curl_free(void *p);
|
void curl_free(void *p);
|
||||||
|
|
||||||
/* curl_global_init() should be invoked exactly once for each application that
|
/*
|
||||||
uses libcurl */
|
* NAME curl_global_init()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* curl_global_init() should be invoked exactly once for each application that
|
||||||
|
* uses libcurl
|
||||||
|
*/
|
||||||
CURLcode curl_global_init(long flags);
|
CURLcode curl_global_init(long flags);
|
||||||
|
|
||||||
/* curl_global_cleanup() should be invoked exactly once for each application
|
/*
|
||||||
that uses libcurl */
|
* NAME curl_global_cleanup()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* curl_global_cleanup() should be invoked exactly once for each application
|
||||||
|
* that uses libcurl
|
||||||
|
*/
|
||||||
void curl_global_cleanup(void);
|
void curl_global_cleanup(void);
|
||||||
|
|
||||||
/* This is the version number */
|
|
||||||
#define LIBCURL_VERSION "7.10"
|
|
||||||
#define LIBCURL_VERSION_NUM 0x070a00
|
|
||||||
|
|
||||||
/* linked-list structure for the CURLOPT_QUOTE option (and other) */
|
/* linked-list structure for the CURLOPT_QUOTE option (and other) */
|
||||||
struct curl_slist {
|
struct curl_slist {
|
||||||
char *data;
|
char *data;
|
||||||
struct curl_slist *next;
|
struct curl_slist *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_slist_append()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* Appends a string to a linked list. If no list exists, it will be created
|
||||||
|
* first. Returns the new list, after appending.
|
||||||
|
*/
|
||||||
struct curl_slist *curl_slist_append(struct curl_slist *, const char *);
|
struct curl_slist *curl_slist_append(struct curl_slist *, const char *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME curl_slist_free_all()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* free a previously built curl_slist.
|
||||||
|
*/
|
||||||
void curl_slist_free_all(struct curl_slist *);
|
void curl_slist_free_all(struct curl_slist *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -851,16 +995,13 @@ typedef enum {
|
|||||||
CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19,
|
CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19,
|
||||||
CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20,
|
CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20,
|
||||||
|
|
||||||
|
CURLINFO_PRIVATE = CURLINFO_STRING + 21,
|
||||||
|
|
||||||
/* Fill in new entries here! */
|
/* Fill in new entries here! */
|
||||||
|
|
||||||
CURLINFO_LASTONE = 21
|
CURLINFO_LASTONE = 22
|
||||||
} CURLINFO;
|
} CURLINFO;
|
||||||
|
|
||||||
/* unfortunately, the easy.h and multi.h include files need options and info
|
|
||||||
stuff before they can be included! */
|
|
||||||
#include "easy.h" /* nothing in curl is fun without the easy stuff */
|
|
||||||
#include "multi.h"
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CURLCLOSEPOLICY_NONE, /* first, never use this */
|
CURLCLOSEPOLICY_NONE, /* first, never use this */
|
||||||
|
|
||||||
@@ -884,35 +1025,61 @@ typedef enum {
|
|||||||
* Setup defines, protos etc for the sharing stuff.
|
* Setup defines, protos etc for the sharing stuff.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Different types of locks that a share can aquire */
|
/* Different data locks for a single share */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CURL_LOCK_TYPE_NONE = 0,
|
CURL_LOCK_DATA_NONE = 0,
|
||||||
CURL_LOCK_TYPE_COOKIE = 1<<0,
|
/* CURL_LOCK_DATA_SHARE is used internaly to say that
|
||||||
CURL_LOCK_TYPE_DNS = 1<<1,
|
* the locking is just made to change the internal state of the share
|
||||||
CURL_LOCK_TYPE_SSL_SESSION = 2<<1,
|
* itself.
|
||||||
CURL_LOCK_TYPE_CONNECT = 2<<2,
|
*/
|
||||||
CURL_LOCK_TYPE_LAST
|
CURL_LOCK_DATA_SHARE,
|
||||||
} curl_lock_type;
|
CURL_LOCK_DATA_COOKIE,
|
||||||
|
CURL_LOCK_DATA_DNS,
|
||||||
|
CURL_LOCK_DATA_SSL_SESSION,
|
||||||
|
CURL_LOCK_DATA_CONNECT,
|
||||||
|
CURL_LOCK_DATA_LAST
|
||||||
|
} curl_lock_data;
|
||||||
|
|
||||||
typedef void (*curl_lock_function)(CURL *, curl_lock_type, void *);
|
/* Different lock access types */
|
||||||
typedef void (*curl_unlock_function)(CURL *, curl_lock_type, void *);
|
typedef enum {
|
||||||
|
CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */
|
||||||
|
CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */
|
||||||
|
CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */
|
||||||
|
CURL_LOCK_ACCESS_LAST /* never use */
|
||||||
|
} curl_lock_access;
|
||||||
|
|
||||||
typedef struct {
|
typedef void (*curl_lock_function)(CURL *handle,
|
||||||
unsigned int specifier;
|
curl_lock_data data,
|
||||||
unsigned int locked;
|
curl_lock_access access,
|
||||||
unsigned int dirty;
|
void *userptr);
|
||||||
|
typedef void (*curl_unlock_function)(CURL *handle,
|
||||||
curl_lock_function lockfunc;
|
curl_lock_data data,
|
||||||
curl_unlock_function unlockfunc;
|
void *userptr);
|
||||||
void *clientdata;
|
|
||||||
} curl_share;
|
|
||||||
|
|
||||||
curl_share *curl_share_init (void);
|
typedef void CURLSH;
|
||||||
CURLcode curl_share_setopt (curl_share *, curl_lock_type, int);
|
|
||||||
CURLcode curl_share_set_lock_function (curl_share *, curl_lock_function);
|
typedef enum {
|
||||||
CURLcode curl_share_set_unlock_function (curl_share *, curl_unlock_function);
|
CURLSHE_OK, /* all is fine */
|
||||||
CURLcode curl_share_set_lock_data (curl_share *, void *);
|
CURLSHE_BAD_OPTION, /* 1 */
|
||||||
CURLcode curl_share_destroy (curl_share *);
|
CURLSHE_IN_USE, /* 2 */
|
||||||
|
CURLSHE_INVALID, /* 3 */
|
||||||
|
CURLSHE_LAST /* never use */
|
||||||
|
} CURLSHcode;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CURLSHOPT_NONE, /* don't use */
|
||||||
|
CURLSHOPT_SHARE, /* specify a data type to share */
|
||||||
|
CURLSHOPT_UNSHARE, /* specify shich data type to stop sharing */
|
||||||
|
CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */
|
||||||
|
CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */
|
||||||
|
CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock
|
||||||
|
callback functions */
|
||||||
|
CURLSHOPT_LAST /* never use */
|
||||||
|
} CURLSHoption;
|
||||||
|
|
||||||
|
CURLSH *curl_share_init(void);
|
||||||
|
CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...);
|
||||||
|
CURLSHcode curl_share_cleanup(CURLSH *);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Structures for querying information about the curl library at runtime.
|
* Structures for querying information about the curl library at runtime.
|
||||||
@@ -947,12 +1114,27 @@ typedef struct {
|
|||||||
#define CURL_VERSION_KERBEROS4 (1<<1)
|
#define CURL_VERSION_KERBEROS4 (1<<1)
|
||||||
#define CURL_VERSION_SSL (1<<2)
|
#define CURL_VERSION_SSL (1<<2)
|
||||||
#define CURL_VERSION_LIBZ (1<<3)
|
#define CURL_VERSION_LIBZ (1<<3)
|
||||||
|
#define CURL_VERSION_NTLM (1<<4)
|
||||||
|
#define CURL_VERSION_GSSNEGOTIATE (1<<5)
|
||||||
|
#define CURL_VERSION_DEBUG (1<<6) /* built with debug capabilities */
|
||||||
|
|
||||||
/* returns a pointer to a static copy of the version info struct */
|
/*
|
||||||
|
* NAME curl_version_info()
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
*
|
||||||
|
* This function returns a pointer to a static copy of the version info
|
||||||
|
* struct. See above.
|
||||||
|
*/
|
||||||
curl_version_info_data *curl_version_info(CURLversion);
|
curl_version_info_data *curl_version_info(CURLversion);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* unfortunately, the easy.h and multi.h include files need options and info
|
||||||
|
stuff before they can be included! */
|
||||||
|
#include "easy.h" /* nothing in curl is fun without the easy stuff */
|
||||||
|
#include "multi.h"
|
||||||
|
|
||||||
#endif /* __CURL_CURL_H */
|
#endif /* __CURL_CURL_H */
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -1,54 +1,25 @@
|
|||||||
/*************************************************************************
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
***************************************************************************/
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
|
|
||||||
* CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
|
|
||||||
*
|
|
||||||
*************************************************************************
|
|
||||||
*
|
|
||||||
* Preliminary documentation
|
|
||||||
*
|
|
||||||
* printf conversions:
|
|
||||||
*
|
|
||||||
* conversion ::= '%%' | '%' [position] ( number | float | string )
|
|
||||||
* position ::= digits '$'
|
|
||||||
* number ::= [number-flags] ( 'd' | 'i' | 'o' | 'x' | 'X' | 'u')
|
|
||||||
* number-flags ::= 'h' | 'l' | 'L' ...
|
|
||||||
* float ::= [float-flags] ( 'f' | 'e' | 'E' | 'g' | 'G' )
|
|
||||||
* string ::= [string-flags] 's'
|
|
||||||
* string-flags ::= padding | '#'
|
|
||||||
* digits ::= (digit)+
|
|
||||||
* digit ::= 0-9
|
|
||||||
*
|
|
||||||
* c
|
|
||||||
* p
|
|
||||||
* n
|
|
||||||
*
|
|
||||||
* qualifiers
|
|
||||||
*
|
|
||||||
* - : left adjustment
|
|
||||||
* + : show sign
|
|
||||||
* SPACE : padding
|
|
||||||
* # : alterative
|
|
||||||
* . : precision
|
|
||||||
* * : width
|
|
||||||
* 0 : padding / size
|
|
||||||
* 1-9 : size
|
|
||||||
* h : short
|
|
||||||
* l : long
|
|
||||||
* ll : longlong
|
|
||||||
* L : long double
|
|
||||||
* Z : long / longlong
|
|
||||||
* q : longlong
|
|
||||||
*
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#ifndef H_MPRINTF
|
#ifndef H_MPRINTF
|
||||||
#define H_MPRINTF
|
#define H_MPRINTF
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -44,19 +44,35 @@
|
|||||||
o Enable the application to select() on its own file descriptors and curl's
|
o Enable the application to select() on its own file descriptors and curl's
|
||||||
file descriptors simultaneous easily.
|
file descriptors simultaneous easily.
|
||||||
|
|
||||||
Example sources using this interface is here: ../multi/
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
#if defined(_WIN32) && !defined(WIN32)
|
||||||
|
/* Chris Lewis mentioned that he doesn't get WIN32 defined, only _WIN32 so we
|
||||||
|
make this adjustment to catch this. */
|
||||||
|
#define WIN32 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
|
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
|
||||||
#include <winsock.h>
|
#include <winsock.h>
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
#ifdef _AIX
|
||||||
|
/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish
|
||||||
|
libc5-based Linux systems. Only include it on system that are known to
|
||||||
|
require it! */
|
||||||
|
#include <sys/select.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "curl.h"
|
#include "curl.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef void CURLM;
|
typedef void CURLM;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -71,7 +87,7 @@ typedef enum {
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CURLMSG_NONE, /* first, not used */
|
CURLMSG_NONE, /* first, not used */
|
||||||
CURLMSG_DONE, /* This easy handle has completed. 'whatever' points to
|
CURLMSG_DONE, /* This easy handle has completed. 'result' contains
|
||||||
the CURLcode of the transfer */
|
the CURLcode of the transfer */
|
||||||
CURLMSG_LAST /* last, not used */
|
CURLMSG_LAST /* last, not used */
|
||||||
} CURLMSG;
|
} CURLMSG;
|
||||||
@@ -187,4 +203,8 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle);
|
|||||||
CURLMsg *curl_multi_info_read(CURLM *multi_handle,
|
CURLMsg *curl_multi_info_read(CURLM *multi_handle,
|
||||||
int *msgs_in_queue);
|
int *msgs_in_queue);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* end of extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -23,9 +23,7 @@
|
|||||||
* $Id$
|
* $Id$
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
size_t fread (void *, size_t, size_t, FILE *);
|
size_t fread (void *, size_t, size_t, FILE *);
|
||||||
size_t fwrite (const void *, size_t, size_t, FILE *);
|
size_t fwrite (const void *, size_t, size_t, FILE *);
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -5,4 +5,6 @@ Makefile
|
|||||||
.deps
|
.deps
|
||||||
.libs
|
.libs
|
||||||
config.h
|
config.h
|
||||||
stamp-h1
|
stamp-*
|
||||||
|
ca-bundle.h
|
||||||
|
getdate.c
|
||||||
|
@@ -5,9 +5,10 @@
|
|||||||
AUTOMAKE_OPTIONS = foreign nostdinc
|
AUTOMAKE_OPTIONS = foreign nostdinc
|
||||||
|
|
||||||
EXTRA_DIST = getdate.y Makefile.b32 Makefile.b32.resp Makefile.m32 \
|
EXTRA_DIST = getdate.y Makefile.b32 Makefile.b32.resp Makefile.m32 \
|
||||||
Makefile.vc6 Makefile.riscos libcurl.def dllinit.c curllib.dsp \
|
Makefile.vc6 Makefile.riscos libcurl.def curllib.dsp \
|
||||||
curllib.dsw config-vms.h config-win32.h config-riscos.h config-mac.h \
|
curllib.dsw config-vms.h config-win32.h config-riscos.h config-mac.h \
|
||||||
config.h.in ca-bundle.crt README.encoding
|
config.h.in ca-bundle.crt README.encoding README.memoryleak \
|
||||||
|
makefile.dj config.dj
|
||||||
|
|
||||||
lib_LTLIBRARIES = libcurl.la
|
lib_LTLIBRARIES = libcurl.la
|
||||||
|
|
||||||
@@ -16,7 +17,8 @@ lib_LTLIBRARIES = libcurl.la
|
|||||||
# we use srcdir/lib for the lib-private header files
|
# we use srcdir/lib for the lib-private header files
|
||||||
INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/lib -I$(top_srcdir)/lib
|
INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/lib -I$(top_srcdir)/lib
|
||||||
|
|
||||||
libcurl_la_LDFLAGS = -version-info 2:2:0
|
VERSION=-version-info 2:2:0
|
||||||
|
|
||||||
# This flag accepts an argument of the form current[:revision[:age]]. So,
|
# This flag accepts an argument of the form current[:revision[:age]]. So,
|
||||||
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
|
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
|
||||||
# 1.
|
# 1.
|
||||||
@@ -45,6 +47,16 @@ libcurl_la_LDFLAGS = -version-info 2:2:0
|
|||||||
# set age to 0.
|
# set age to 0.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
if NO_UNDEFINED
|
||||||
|
# The -no-undefined flag is CRUCIAL for this to build fine on Cygwin. If we
|
||||||
|
# find a case in which we need to remove this flag, we should most likely
|
||||||
|
# write a configure check that detects when this flag is needed and when its
|
||||||
|
# not.
|
||||||
|
libcurl_la_LDFLAGS = -no-undefined $(VERSION)
|
||||||
|
else
|
||||||
|
libcurl_la_LDFLAGS = $(VERSION)
|
||||||
|
endif
|
||||||
|
|
||||||
libcurl_la_SOURCES = arpa_telnet.h file.c getpass.h netrc.h timeval.c \
|
libcurl_la_SOURCES = arpa_telnet.h file.c getpass.h netrc.h timeval.c \
|
||||||
base64.c file.h hostip.c progress.c timeval.h base64.h formdata.c \
|
base64.c file.h hostip.c progress.c timeval.h base64.h formdata.c \
|
||||||
hostip.h progress.h cookie.c formdata.h http.c sendf.c cookie.h ftp.c \
|
hostip.h progress.h cookie.c formdata.h http.c sendf.c cookie.h ftp.c \
|
||||||
@@ -55,23 +67,36 @@ getpass.c netrc.c telnet.h getinfo.c getinfo.h transfer.c strequal.c \
|
|||||||
strequal.h easy.c security.h security.c krb4.c krb4.h memdebug.c \
|
strequal.h easy.c security.h security.c krb4.c krb4.h memdebug.c \
|
||||||
memdebug.h inet_ntoa_r.h http_chunks.c http_chunks.h strtok.c strtok.h \
|
memdebug.h inet_ntoa_r.h http_chunks.c http_chunks.h strtok.c strtok.h \
|
||||||
connect.c connect.h llist.c llist.h hash.c hash.h multi.c \
|
connect.c connect.h llist.c llist.h hash.c hash.h multi.c \
|
||||||
content_encoding.c content_encoding.h
|
content_encoding.c content_encoding.h share.c share.h http_digest.c \
|
||||||
|
md5.c md5.h http_digest.h http_negotiate.c http_negotiate.h \
|
||||||
|
http_ntlm.c http_ntlm.h ca-bundle.h
|
||||||
|
|
||||||
noinst_HEADERS = setup.h transfer.h
|
noinst_HEADERS = setup.h transfer.h
|
||||||
|
|
||||||
|
BUILT_SOURCES = $(srcdir)/getdate.c $(srcdir)/ca-bundle.h
|
||||||
|
|
||||||
# Say $(srcdir), so GNU make does not report an ambiguity with the .y.c rule.
|
# Say $(srcdir), so GNU make does not report an ambiguity with the .y.c rule.
|
||||||
$(srcdir)/getdate.c: getdate.y
|
$(srcdir)/getdate.c: getdate.y
|
||||||
cd $(srcdir) && \
|
cd $(srcdir) && \
|
||||||
$(YACC) $(YFLAGS) getdate.y; \
|
$(YACC) $(YFLAGS) getdate.y; \
|
||||||
mv -f y.tab.c getdate.c
|
mv -f y.tab.c getdate.c
|
||||||
|
|
||||||
|
$(srcdir)/ca-bundle.h: Makefile.in Makefile
|
||||||
|
cd $(srcdir) && \
|
||||||
|
echo "/* The file is generated automaticly */" > $@
|
||||||
|
if CABUNDLE
|
||||||
|
echo '#define CURL_CA_BUNDLE @CURL_CA_BUNDLE@' >> $@
|
||||||
|
else
|
||||||
|
echo '#undef CURL_CA_BUNDLE /* unknown */' >> $@
|
||||||
|
endif
|
||||||
|
|
||||||
install-data-hook:
|
install-data-hook:
|
||||||
@if test -n "@CURL_CA_BUNDLE@"; then \
|
@if test -n "@CURL_CA_BUNDLE@"; then \
|
||||||
$(mkinstalldirs) `dirname $(DESTDIR)@CURL_CA_BUNDLE@`; \
|
$(mkinstalldirs) `dirname $(DESTDIR)@CURL_CA_BUNDLE@`; \
|
||||||
@INSTALL_DATA@ ca-bundle.crt $(DESTDIR)@CURL_CA_BUNDLE@; \
|
@INSTALL_DATA@ $(srcdir)/ca-bundle.crt $(DESTDIR)@CURL_CA_BUNDLE@; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# this hook is mainly for non-unix systems to build even if configure
|
# this hook is mainly for non-unix systems to build even if configure
|
||||||
# isn't run
|
# isn't run
|
||||||
dist-hook:
|
dist-hook:
|
||||||
cp $(srcdir)/ca-bundle.h.in $(distdir)/ca-bundle.h
|
echo "/* ca bundle path set in here*/" > $(distdir)/ca-bundle.h
|
||||||
|
@@ -59,7 +59,12 @@ SOURCES = \
|
|||||||
easy.c \
|
easy.c \
|
||||||
strequal.c \
|
strequal.c \
|
||||||
strtok.c \
|
strtok.c \
|
||||||
connect.c
|
connect.c \
|
||||||
|
hash.c \
|
||||||
|
share.c \
|
||||||
|
llist.c \
|
||||||
|
multi.c \
|
||||||
|
content_encoding.c
|
||||||
|
|
||||||
OBJECTS = $(SOURCES:.c=.obj)
|
OBJECTS = $(SOURCES:.c=.obj)
|
||||||
|
|
||||||
|
@@ -28,4 +28,9 @@
|
|||||||
+easy.obj &
|
+easy.obj &
|
||||||
+strequal.obj &
|
+strequal.obj &
|
||||||
+strtok.obj &
|
+strtok.obj &
|
||||||
+connect.obj
|
+connect.obj &
|
||||||
|
+hash.obj &
|
||||||
|
+share.obj &
|
||||||
|
+llist.obj &
|
||||||
|
+multi.obj &
|
||||||
|
+content_encoding.obj
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
#############################################################
|
#############################################################
|
||||||
#
|
#
|
||||||
## Makefile for building libcurl.a with MingW32 (GCC-2.95) and
|
## Makefile for building libcurl.a with MingW32 (GCC-3.2) and
|
||||||
## optionally OpenSSL (0.9.6)
|
## optionally OpenSSL (0.9.6)
|
||||||
## Use: make -f Makefile.m32
|
## Use: make -f Makefile.m32
|
||||||
##
|
##
|
||||||
@@ -9,10 +9,11 @@
|
|||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
AR = ar
|
AR = ar
|
||||||
|
RM = rm -f
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
STRIP = strip -g
|
STRIP = strip -g
|
||||||
OPENSSL_PATH = ../../openssl-0.9.6d
|
OPENSSL_PATH = ../../openssl-0.9.7a
|
||||||
ZLIB_PATH = ../../zlib-1.1.3
|
ZLIB_PATH = ../../zlib-1.1.4
|
||||||
|
|
||||||
########################################################
|
########################################################
|
||||||
## Nothing more to do below this line!
|
## Nothing more to do below this line!
|
||||||
@@ -21,36 +22,40 @@ INCLUDES = -I. -I.. -I../include -I../src
|
|||||||
CFLAGS = -g -O2 -DMINGW32
|
CFLAGS = -g -O2 -DMINGW32
|
||||||
ifdef SSL
|
ifdef SSL
|
||||||
INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl"
|
INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl"
|
||||||
CFLAGS += -DUSE_SSLEAY
|
CFLAGS += -DUSE_SSLEAY -DHAVE_OPENSSL_ENGINE_H
|
||||||
DLL_LIBS = -L$(OPENSSL_PATH)/out -leay32 -lssl32 -lRSAglue
|
DLL_LIBS = -L$(OPENSSL_PATH)/out -leay32 -lssl32
|
||||||
endif
|
endif
|
||||||
ifdef ZLIB
|
ifdef ZLIB
|
||||||
INCLUDES += -I"$(ZLIB_PATH)"
|
INCLUDES += -I"$(ZLIB_PATH)"
|
||||||
CFLAGS += -DHAVE_ZLIB
|
CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
|
||||||
DLL_LIBS += -L$(ZLIB_PATH) -lz
|
DLL_LIBS += -L$(ZLIB_PATH) -lz
|
||||||
endif
|
endif
|
||||||
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
||||||
|
|
||||||
libcurl_a_LIBRARIES = libcurl.a
|
libcurl_a_LIBRARIES = libcurl.a
|
||||||
|
|
||||||
libcurl_a_SOURCES = arpa_telnet.h file.c getpass.h netrc.h timeval.c base64.c \
|
libcurl_a_SOURCES = arpa_telnet.h file.c getpass.h netrc.h timeval.c base64.c \
|
||||||
file.h hostip.c progress.c timeval.h base64.h formdata.c hostip.h progress.h \
|
file.h hostip.c progress.c timeval.h base64.h formdata.c hostip.h \
|
||||||
cookie.c formdata.h http.c sendf.c cookie.h ftp.c http.h sendf.h url.c dict.c \
|
progress.h cookie.c formdata.h http.c sendf.c cookie.h ftp.c \
|
||||||
ftp.h if2ip.c speedcheck.c url.h dict.h getdate.c if2ip.h speedcheck.h \
|
http.h sendf.h url.c dict.c ftp.h if2ip.c speedcheck.c url.h \
|
||||||
urldata.h transfer.c getdate.h ldap.c ssluse.c version.c transfer.h getenv.c \
|
dict.h getdate.c if2ip.h speedcheck.h urldata.h transfer.c getdate.h \
|
||||||
ldap.h ssluse.h escape.c getenv.h mprintf.c telnet.c escape.h getpass.c netrc.c \
|
ldap.c ssluse.c version.c transfer.h getenv.c \
|
||||||
telnet.h getinfo.c strequal.c strequal.h easy.c security.h \
|
ldap.h ssluse.h escape.c getenv.h mprintf.c telnet.c escape.h \
|
||||||
security.c krb4.h krb4.c memdebug.h memdebug.c inet_ntoa_r.h http_chunks.h http_chunks.c \
|
getpass.c netrc.c telnet.h getinfo.c strequal.c strequal.h easy.c \
|
||||||
strtok.c connect.c hash.c llist.c multi.c \
|
security.h security.c krb4.h krb4.c memdebug.h memdebug.c \
|
||||||
content_encoding.h content_encoding.c
|
inet_ntoa_r.h http_chunks.h http_chunks.c \
|
||||||
|
strtok.c connect.c hash.c llist.c multi.c share.c share.h \
|
||||||
|
content_encoding.h content_encoding.c http_digest.h http_digest.c \
|
||||||
|
http_negotiate.c http_negotiate.h http_ntlm.c http_ntlm.h md5.h \
|
||||||
|
md5.c
|
||||||
|
|
||||||
libcurl_a_OBJECTS = file.o timeval.o base64.o hostip.o progress.o \
|
libcurl_a_OBJECTS = file.o timeval.o base64.o hostip.o progress.o \
|
||||||
formdata.o cookie.o http.o sendf.o ftp.o url.o dict.o if2ip.o \
|
formdata.o cookie.o http.o sendf.o ftp.o url.o dict.o if2ip.o \
|
||||||
speedcheck.o getdate.o transfer.o ldap.o ssluse.o version.o \
|
speedcheck.o getdate.o transfer.o ldap.o ssluse.o version.o \
|
||||||
getenv.o escape.o mprintf.o telnet.o getpass.o netrc.o getinfo.o \
|
getenv.o escape.o mprintf.o telnet.o getpass.o netrc.o getinfo.o \
|
||||||
strequal.o easy.o security.o krb4.o memdebug.o http_chunks.o \
|
strequal.o easy.o security.o krb4.o memdebug.o http_chunks.o \
|
||||||
strtok.o connect.o hash.o llist.o multi.o \
|
strtok.o connect.o hash.o llist.o multi.o share.o \
|
||||||
content_encoding.o
|
content_encoding.o http_digest.o http_negotiate.o http_ntlm.o md5.o
|
||||||
|
|
||||||
LIBRARIES = $(libcurl_a_LIBRARIES)
|
LIBRARIES = $(libcurl_a_LIBRARIES)
|
||||||
SOURCES = $(libcurl_a_SOURCES)
|
SOURCES = $(libcurl_a_SOURCES)
|
||||||
@@ -60,16 +65,18 @@ OBJECTS = $(libcurl_a_OBJECTS)
|
|||||||
all: libcurl.a libcurl.dll libcurldll.a
|
all: libcurl.a libcurl.dll libcurldll.a
|
||||||
|
|
||||||
libcurl.a: $(libcurl_a_OBJECTS) $(libcurl_a_DEPENDENCIES)
|
libcurl.a: $(libcurl_a_OBJECTS) $(libcurl_a_DEPENDENCIES)
|
||||||
-@erase libcurl.a
|
$(RM) libcurl.a
|
||||||
$(AR) cru libcurl.a $(libcurl_a_OBJECTS)
|
$(AR) cru libcurl.a $(libcurl_a_OBJECTS)
|
||||||
$(RANLIB) libcurl.a
|
$(RANLIB) libcurl.a
|
||||||
$(STRIP) $@
|
$(STRIP) $@
|
||||||
|
|
||||||
|
DLLINITOBJ =
|
||||||
|
|
||||||
# remove the last line above to keep debug info
|
# remove the last line above to keep debug info
|
||||||
|
|
||||||
libcurl.dll libcurldll.a: libcurl.a libcurl.def dllinit.o
|
libcurl.dll libcurldll.a: libcurl.a libcurl.def $(DLLINITOBJ)
|
||||||
-@erase $@
|
$(RM) $@
|
||||||
dllwrap --dllname $@ --output-lib libcurldll.a --export-all --def libcurl.def $(libcurl_a_LIBRARIES) dllinit.o $(DLL_LIBS) -lwsock32 -lws2_32 -lwinmm
|
dllwrap --dllname $@ --output-lib libcurldll.a --export-all --def libcurl.def $(libcurl_a_LIBRARIES) $(DLLINITOBJ) $(DLL_LIBS) -lwsock32 -lws2_32 -lwinmm
|
||||||
$(STRIP) $@
|
$(STRIP) $@
|
||||||
|
|
||||||
# remove the last line above to keep debug info
|
# remove the last line above to keep debug info
|
||||||
@@ -84,9 +91,9 @@ libcurl.dll libcurldll.a: libcurl.a libcurl.def dllinit.o
|
|||||||
$(COMPILE) -c $<
|
$(COMPILE) -c $<
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
-@erase $(libcurl_a_OBJECTS)
|
$(RM) $(libcurl_a_OBJECTS)
|
||||||
|
|
||||||
distrib: clean
|
distrib: clean
|
||||||
|
|
||||||
-@erase $(libcurl_a_LIBRARIES)
|
$(RM) $(libcurl_a_LIBRARIES)
|
||||||
|
|
||||||
|
@@ -33,7 +33,7 @@
|
|||||||
LIB_NAME = libcurl
|
LIB_NAME = libcurl
|
||||||
LIB_NAME_DEBUG = libcurld
|
LIB_NAME_DEBUG = libcurld
|
||||||
!IFNDEF OPENSSL_PATH
|
!IFNDEF OPENSSL_PATH
|
||||||
OPENSSL_PATH = ../../openssl-0.9.6
|
OPENSSL_PATH = ../../openssl-0.9.7a
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
#############################################################
|
#############################################################
|
||||||
@@ -48,7 +48,8 @@ LNKDLL = link.exe /DLL /def:libcurl.def
|
|||||||
LNKLIB = link.exe -lib
|
LNKLIB = link.exe -lib
|
||||||
LFLAGS = /nologo
|
LFLAGS = /nologo
|
||||||
LINKLIBS = ws2_32.lib winmm.lib
|
LINKLIBS = ws2_32.lib winmm.lib
|
||||||
SSLLIBS = libeay32.lib ssleay32.lib RSAglue.lib
|
SSLLIBS = libeay32.lib ssleay32.lib
|
||||||
|
# RSAglue.lib was formerly needed in the SSLLIBS
|
||||||
CFGSET = FALSE
|
CFGSET = FALSE
|
||||||
|
|
||||||
######################
|
######################
|
||||||
@@ -116,7 +117,7 @@ CFGSET = TRUE
|
|||||||
!IF "$(CFG)" == "debug-dll"
|
!IF "$(CFG)" == "debug-dll"
|
||||||
TARGET =$(LIB_NAME_DEBUG).dll
|
TARGET =$(LIB_NAME_DEBUG).dll
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ =.\$(CFG)
|
||||||
LNK = $(LNKDLL) /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib"
|
LNK = $(LNKDLL) /DEBUG /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib" /PDB:"$(LIB_NAME_DEBUG).pdb"
|
||||||
CC = $(CCDEBUG)
|
CC = $(CCDEBUG)
|
||||||
CFGSET = TRUE
|
CFGSET = TRUE
|
||||||
!ENDIF
|
!ENDIF
|
||||||
@@ -139,7 +140,8 @@ CFGSET = TRUE
|
|||||||
!IF "$(CFG)" == "debug-ssl-dll"
|
!IF "$(CFG)" == "debug-ssl-dll"
|
||||||
TARGET =$(LIB_NAME_DEBUG).dll
|
TARGET =$(LIB_NAME_DEBUG).dll
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ =.\$(CFG)
|
||||||
LNK = $(LNKDLL) $(LFLAGSSSL) /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib"
|
LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)/out32dll
|
||||||
|
LNK = $(LNKDLL) $(LFLAGSSSL) /DEBUG /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib" /PDB:"$(LIB_NAME_DEBUG).pdb"
|
||||||
LINKLIBS = $(LINKLIBS) $(SSLLIBS)
|
LINKLIBS = $(LINKLIBS) $(SSLLIBS)
|
||||||
CC = $(CCDEBUG) $(CFLAGSSSL)
|
CC = $(CCDEBUG) $(CFLAGSSSL)
|
||||||
CFGSET = TRUE
|
CFGSET = TRUE
|
||||||
@@ -199,7 +201,10 @@ X_OBJS= \
|
|||||||
$(DIROBJ)\connect.obj \
|
$(DIROBJ)\connect.obj \
|
||||||
$(DIROBJ)\hash.obj \
|
$(DIROBJ)\hash.obj \
|
||||||
$(DIROBJ)\llist.obj \
|
$(DIROBJ)\llist.obj \
|
||||||
$(DIROBJ)\multi.obj
|
$(DIROBJ)\share.obj \
|
||||||
|
$(DIROBJ)\multi.obj \
|
||||||
|
$(DIROBJ)\http_digest.obj \
|
||||||
|
$(DIROBJ)\md5.obj
|
||||||
|
|
||||||
all : $(TARGET)
|
all : $(TARGET)
|
||||||
|
|
||||||
@@ -221,3 +226,6 @@ clean:
|
|||||||
-@erase $(DIROBJ)\*.obj
|
-@erase $(DIROBJ)\*.obj
|
||||||
-@erase vc60.idb
|
-@erase vc60.idb
|
||||||
-@erase vc60.pch
|
-@erase vc60.pch
|
||||||
|
|
||||||
|
getdate.c: getdate.c.cvs
|
||||||
|
copy getdate.c.cvs getdate.c
|
||||||
|
@@ -5,15 +5,15 @@
|
|||||||
|
|
||||||
HTTP/1.1 [RFC 2616] specifies that a client may request that a server encode
|
HTTP/1.1 [RFC 2616] specifies that a client may request that a server encode
|
||||||
its response. This is usually used to compress a response using one of a set
|
its response. This is usually used to compress a response using one of a set
|
||||||
of commonly available compression techniques. These schemes are `deflate'
|
of commonly available compression techniques. These schemes are `deflate' (the
|
||||||
(the zlib algorithm), `gzip' and `compress' [sec 3.5, RFC 2616]. A client
|
zlib algorithm), `gzip' and `compress' [sec 3.5, RFC 2616]. A client requests
|
||||||
requests that the sever perform an encoding by including an Accept-Encoding
|
that the sever perform an encoding by including an Accept-Encoding header in
|
||||||
header in the request document. The value of the header should be one of the
|
the request document. The value of the header should be one of the recognized
|
||||||
recognized tokens `deflate', ... (there's a way to register new
|
tokens `deflate', ... (there's a way to register new schemes/tokens, see sec
|
||||||
schemes/tokens, see sec 3.5 of the spec). A server MAY honor the client's
|
3.5 of the spec). A server MAY honor the client's encoding request. When a
|
||||||
encoding request. When a response is encoded, the server includes a
|
response is encoded, the server includes a Content-Encoding header in the
|
||||||
Content-Encoding header in the response. The value of the Content-Encoding
|
response. The value of the Content-Encoding header indicates which scheme was
|
||||||
header indicates which scheme was used to encode the data.
|
used to encode the data.
|
||||||
|
|
||||||
A client may tell a server that it can understand several different encoding
|
A client may tell a server that it can understand several different encoding
|
||||||
schemes. In this case the server may choose any one of those and use it to
|
schemes. In this case the server may choose any one of those and use it to
|
||||||
@@ -24,11 +24,10 @@ information on the Accept-Encoding header.
|
|||||||
|
|
||||||
* Current support for content encoding:
|
* Current support for content encoding:
|
||||||
|
|
||||||
I added support for the 'deflate' content encoding to both libcurl and curl.
|
Support for the 'deflate' and 'gzip' content encoding are supported by
|
||||||
Both regular and chunked transfers should work although I've tested only the
|
libcurl. Both regular and chunked transfers should work fine. The library
|
||||||
former. The library zlib is required for this feature. Places where I
|
zlib is required for this feature. 'deflate' support was added by James
|
||||||
modified the source code are commented and typically include my initials and
|
Gallagher, and support for the 'gzip' encoding was added by Dan Fandrich.
|
||||||
the date (e.g., 08/29/02 jhrg).
|
|
||||||
|
|
||||||
* The libcurl interface:
|
* The libcurl interface:
|
||||||
|
|
||||||
@@ -39,15 +38,23 @@ To cause libcurl to request a content encoding use:
|
|||||||
where <string> is the intended value of the Accept-Encoding header.
|
where <string> is the intended value of the Accept-Encoding header.
|
||||||
|
|
||||||
Currently, libcurl only understands how to process responses that use the
|
Currently, libcurl only understands how to process responses that use the
|
||||||
`deflate' Content-Encoding, so the only value for CURLOPT_ENCODING that will
|
"deflate" or "gzip" Content-Encoding, so the only values for CURLOPT_ENCODING
|
||||||
work (besides "identity," which does nothing) is "deflate." If a response is
|
that will work (besides "identity," which does nothing) are "deflate" and
|
||||||
encoded using either the `gzip' or `compress' methods, libcurl will return an
|
"gzip" If a response is encoded using the "compress" or methods, libcurl will
|
||||||
error indicating that the response could not be decoded. If <string> is null
|
return an error indicating that the response could not be decoded. If
|
||||||
or empty no Accept-Encoding header is generated.
|
<string> is NULL no Accept-Encoding header is generated. If <string> is a
|
||||||
|
zero-length string, then an Accept-Encoding header containing all supported
|
||||||
|
encodings will be generated.
|
||||||
|
|
||||||
|
The CURLOPT_ENCODING must be set to any non-NULL value for content to be
|
||||||
|
automatically decoded. If it is not set and the server still sends encoded
|
||||||
|
content (despite not having been asked), the data is returned in its raw form
|
||||||
|
and the Content-Encoding type is not checked.
|
||||||
|
|
||||||
* The curl interface:
|
* The curl interface:
|
||||||
|
|
||||||
Use the --compressed option with curl to cause it to ask servers to compress
|
Use the --compressed option with curl to cause it to ask servers to compress
|
||||||
responses using deflate.
|
responses using deflate.
|
||||||
|
|
||||||
James Gallagher <jgallagher@gso.uri.edu>
|
James Gallagher <jgallagher@gso.uri.edu>
|
||||||
|
Dan Fandrich <dan@coneharvesters.com>
|
||||||
|
56
lib/README.memoryleak
Normal file
56
lib/README.memoryleak
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
$Id$
|
||||||
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
How To Track Down Suspected Memory Leaks in libcurl
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
Single-threaded
|
||||||
|
|
||||||
|
Please note that this memory leak system is not adjusted to work in more
|
||||||
|
than one thread. If you want/need to use it in a multi-threaded app. Please
|
||||||
|
adjust accordingly.
|
||||||
|
|
||||||
|
|
||||||
|
Build
|
||||||
|
|
||||||
|
Rebuild libcurl with -DCURLDEBUG (usually, rerunning configure with
|
||||||
|
--enable-debug fixes this). 'make clean' first, then 'make' so that all
|
||||||
|
files actually are rebuilt properly. It will also make sense to build
|
||||||
|
libcurl with the debug option (usually -g to the compiler) so that debugging
|
||||||
|
it will be easier if you actually do find a leak in the library.
|
||||||
|
|
||||||
|
This will create a library that has memory debugging enabled.
|
||||||
|
|
||||||
|
Modify Your Application
|
||||||
|
|
||||||
|
Add a line in your application code:
|
||||||
|
|
||||||
|
curl_memdebug("filename");
|
||||||
|
|
||||||
|
This will make the malloc debug system output a full trace of all resource
|
||||||
|
using functions to the given file name. Make sure you rebuild your program
|
||||||
|
and that you link with the same libcurl you built for this purpose as
|
||||||
|
described above.
|
||||||
|
|
||||||
|
Run Your Application
|
||||||
|
|
||||||
|
Run your program as usual. Watch the specified memory trace file grow.
|
||||||
|
|
||||||
|
Make your program exit and use the proper libcurl cleanup functions etc. So
|
||||||
|
that all non-leaks are returned/freed properly.
|
||||||
|
|
||||||
|
Analyze the Flow
|
||||||
|
|
||||||
|
Use the tests/memanalyze.pl perl script to analyze the memdump file:
|
||||||
|
|
||||||
|
tests/memanalyze.pl < memdump
|
||||||
|
|
||||||
|
This now outputs a report on what resources that were allocated but never
|
||||||
|
freed etc. This report is very fine for posting to the list!
|
||||||
|
|
||||||
|
If this doesn't produce any output, no leak was detected in libcurl. Then
|
||||||
|
the leak is mostly likely to be in your code.
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -26,15 +26,15 @@
|
|||||||
/*
|
/*
|
||||||
* Telnet option defines. Add more here if in need.
|
* Telnet option defines. Add more here if in need.
|
||||||
*/
|
*/
|
||||||
#define TELOPT_BINARY 0 /* binary 8bit data */
|
#define CURL_TELOPT_BINARY 0 /* binary 8bit data */
|
||||||
#define TELOPT_SGA 3 /* Supress Go Ahead */
|
#define CURL_TELOPT_SGA 3 /* Supress Go Ahead */
|
||||||
#define TELOPT_EXOPL 255 /* EXtended OPtions List */
|
#define CURL_TELOPT_EXOPL 255 /* EXtended OPtions List */
|
||||||
#define TELOPT_TTYPE 24 /* Terminal TYPE */
|
#define CURL_TELOPT_TTYPE 24 /* Terminal TYPE */
|
||||||
#define TELOPT_XDISPLOC 35 /* X DISPlay LOCation */
|
#define CURL_TELOPT_XDISPLOC 35 /* X DISPlay LOCation */
|
||||||
|
|
||||||
#define TELOPT_NEW_ENVIRON 39 /* NEW ENVIRONment variables */
|
#define CURL_TELOPT_NEW_ENVIRON 39 /* NEW ENVIRONment variables */
|
||||||
#define NEW_ENV_VAR 0
|
#define CURL_NEW_ENV_VAR 0
|
||||||
#define NEW_ENV_VALUE 1
|
#define CURL_NEW_ENV_VALUE 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The telnet options represented as strings
|
* The telnet options represented as strings
|
||||||
@@ -53,27 +53,27 @@ static const char *telnetoptions[]=
|
|||||||
"OLD-ENVIRON", "AUTHENTICATION", "ENCRYPT", "NEW-ENVIRON"
|
"OLD-ENVIRON", "AUTHENTICATION", "ENCRYPT", "NEW-ENVIRON"
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TELOPT_MAXIMUM TELOPT_NEW_ENVIRON
|
#define CURL_TELOPT_MAXIMUM CURL_TELOPT_NEW_ENVIRON
|
||||||
|
|
||||||
#define TELOPT_OK(x) ((x) <= TELOPT_MAXIMUM)
|
#define CURL_TELOPT_OK(x) ((x) <= CURL_TELOPT_MAXIMUM)
|
||||||
#define TELOPT(x) telnetoptions[x]
|
#define CURL_TELOPT(x) telnetoptions[x]
|
||||||
|
|
||||||
#define NTELOPTS 40
|
#define CURL_NTELOPTS 40
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First some defines
|
* First some defines
|
||||||
*/
|
*/
|
||||||
#define xEOF 236 /* End Of File */
|
#define CURL_xEOF 236 /* End Of File */
|
||||||
#define SE 240 /* Sub negotiation End */
|
#define CURL_SE 240 /* Sub negotiation End */
|
||||||
#define NOP 241 /* No OPeration */
|
#define CURL_NOP 241 /* No OPeration */
|
||||||
#define DM 242 /* Data Mark */
|
#define CURL_DM 242 /* Data Mark */
|
||||||
#define GA 249 /* Go Ahead, reverse the line */
|
#define CURL_GA 249 /* Go Ahead, reverse the line */
|
||||||
#define SB 250 /* SuBnegotiation */
|
#define CURL_SB 250 /* SuBnegotiation */
|
||||||
#define WILL 251 /* Our side WILL use this option */
|
#define CURL_WILL 251 /* Our side WILL use this option */
|
||||||
#define WONT 252 /* Our side WON'T use this option */
|
#define CURL_WONT 252 /* Our side WON'T use this option */
|
||||||
#define DO 253 /* DO use this option! */
|
#define CURL_DO 253 /* DO use this option! */
|
||||||
#define DONT 254 /* DON'T use this option! */
|
#define CURL_DONT 254 /* DON'T use this option! */
|
||||||
#define IAC 255 /* Interpret As Command */
|
#define CURL_IAC 255 /* Interpret As Command */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Then those numbers represented as strings:
|
* Then those numbers represented as strings:
|
||||||
@@ -86,16 +86,16 @@ static const char *telnetcmds[]=
|
|||||||
"WILL", "WONT", "DO", "DONT", "IAC"
|
"WILL", "WONT", "DO", "DONT", "IAC"
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TELCMD_MINIMUM xEOF /* the first one */
|
#define CURL_TELCMD_MINIMUM CURL_xEOF /* the first one */
|
||||||
#define TELCMD_MAXIMUM IAC /* surprise, 255 is the last one! ;-) */
|
#define CURL_TELCMD_MAXIMUM CURL_IAC /* surprise, 255 is the last one! ;-) */
|
||||||
|
|
||||||
#define TELQUAL_IS 0
|
#define CURL_TELQUAL_IS 0
|
||||||
#define TELQUAL_SEND 1
|
#define CURL_TELQUAL_SEND 1
|
||||||
#define TELQUAL_INFO 2
|
#define CURL_TELQUAL_INFO 2
|
||||||
#define TELQUAL_NAME 3
|
#define CURL_TELQUAL_NAME 3
|
||||||
|
|
||||||
#define TELCMD_OK(x) ( ((unsigned int)(x) >= TELCMD_MINIMUM) && \
|
#define CURL_TELCMD_OK(x) ( ((unsigned int)(x) >= CURL_TELCMD_MINIMUM) && \
|
||||||
((unsigned int)(x) <= TELCMD_MAXIMUM) )
|
((unsigned int)(x) <= CURL_TELCMD_MAXIMUM) )
|
||||||
#define TELCMD(x) telnetcmds[(x)-TELCMD_MINIMUM]
|
#define CURL_TELCMD(x) telnetcmds[(x)-CURL_TELCMD_MINIMUM]
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
128
lib/base64.c
128
lib/base64.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
|
|
||||||
#include "base64.h"
|
#include "base64.h"
|
||||||
|
|
||||||
#ifdef MALLOCDEBUG
|
#ifdef CURLDEBUG
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -61,6 +61,8 @@ static void decodeQuantum(unsigned char *dest, char *src)
|
|||||||
x = (x << 6) + 62;
|
x = (x << 6) + 62;
|
||||||
else if(src[i] == '/')
|
else if(src[i] == '/')
|
||||||
x = (x << 6) + 63;
|
x = (x << 6) + 63;
|
||||||
|
else if(src[i] == '=')
|
||||||
|
x = (x << 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
dest[2] = (unsigned char)(x & 255); x >>= 8;
|
dest[2] = (unsigned char)(x & 255); x >>= 8;
|
||||||
@@ -78,6 +80,7 @@ static void base64Decode(unsigned char *dest, char *src, int *rawLength)
|
|||||||
int length = 0;
|
int length = 0;
|
||||||
int equalsTerm = 0;
|
int equalsTerm = 0;
|
||||||
int i;
|
int i;
|
||||||
|
int numQuantums;
|
||||||
unsigned char lastQuantum[3];
|
unsigned char lastQuantum[3];
|
||||||
|
|
||||||
while((src[length] != '=') && src[length])
|
while((src[length] != '=') && src[length])
|
||||||
@@ -85,16 +88,18 @@ static void base64Decode(unsigned char *dest, char *src, int *rawLength)
|
|||||||
while(src[length+equalsTerm] == '=')
|
while(src[length+equalsTerm] == '=')
|
||||||
equalsTerm++;
|
equalsTerm++;
|
||||||
|
|
||||||
|
numQuantums = (length + equalsTerm) / 4;
|
||||||
if(rawLength)
|
if(rawLength)
|
||||||
*rawLength = (length * 3 / 4) - equalsTerm;
|
*rawLength = (numQuantums * 3) - equalsTerm;
|
||||||
|
|
||||||
for(i = 0; i < length/4 - 1; i++) {
|
for(i = 0; i < numQuantums - 1; i++) {
|
||||||
decodeQuantum(dest, src);
|
decodeQuantum(dest, src);
|
||||||
dest += 3; src += 4;
|
dest += 3; src += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
decodeQuantum(lastQuantum, src);
|
decodeQuantum(lastQuantum, src);
|
||||||
for(i = 0; i < 3 - equalsTerm; i++) dest[i] = lastQuantum[i];
|
for(i = 0; i < 3 - equalsTerm; i++)
|
||||||
|
dest[i] = lastQuantum[i];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +135,7 @@ int Curl_base64_encode(const void *inp, int insize, char **outptr)
|
|||||||
|
|
||||||
while(insize > 0) {
|
while(insize > 0) {
|
||||||
for (i = inputparts = 0; i < 3; i++) {
|
for (i = inputparts = 0; i < 3; i++) {
|
||||||
if(*indata) {
|
if(insize > 0) {
|
||||||
inputparts++;
|
inputparts++;
|
||||||
ibuf[i] = *indata;
|
ibuf[i] = *indata;
|
||||||
indata++;
|
indata++;
|
||||||
@@ -194,77 +199,90 @@ int Curl_base64_decode(const char *str, void *data)
|
|||||||
#define TEST_NEED_SUCK
|
#define TEST_NEED_SUCK
|
||||||
void *suck(int *);
|
void *suck(int *);
|
||||||
|
|
||||||
int main(int argc, char **argv, char **envp) {
|
int main(int argc, char **argv, char **envp)
|
||||||
char *base64;
|
{
|
||||||
int base64Len;
|
char *base64;
|
||||||
unsigned char *data;
|
int base64Len;
|
||||||
int dataLen;
|
unsigned char *data;
|
||||||
|
int dataLen;
|
||||||
|
|
||||||
data = (unsigned char *)suck(&dataLen);
|
data = (unsigned char *)suck(&dataLen);
|
||||||
base64Len = Curl_base64_encode(data, dataLen, &base64);
|
base64Len = Curl_base64_encode(data, dataLen, &base64);
|
||||||
|
|
||||||
fprintf(stderr, "%d\n", base64Len);
|
fprintf(stderr, "%d\n", base64Len);
|
||||||
fprintf(stdout, "%s", base64);
|
fprintf(stdout, "%s", base64);
|
||||||
|
|
||||||
free(base64); free(data);
|
free(base64); free(data);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TEST_DECODE
|
#ifdef TEST_DECODE
|
||||||
/* decoding test harness. Read in a base64 string from stdin and write out the
|
/* decoding test harness. Read in a base64 string from stdin and write out the
|
||||||
* length returned by Curl_base64_decode, followed by the decoded data itself
|
* length returned by Curl_base64_decode, followed by the decoded data itself
|
||||||
|
*
|
||||||
|
* gcc -DTEST_DECODE base64.c -o base64 mprintf.o memdebug.o
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#define TEST_NEED_SUCK
|
#define TEST_NEED_SUCK
|
||||||
void *suck(int *);
|
void *suck(int *);
|
||||||
|
|
||||||
int main(int argc, char **argv, char **envp) {
|
int main(int argc, char **argv, char **envp)
|
||||||
char *base64;
|
{
|
||||||
int base64Len;
|
char *base64;
|
||||||
unsigned char *data;
|
int base64Len;
|
||||||
int dataLen;
|
unsigned char *data;
|
||||||
|
int dataLen;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
base64 = (char *)suck(&base64Len);
|
base64 = (char *)suck(&base64Len);
|
||||||
data = (unsigned char *)malloc(base64Len * 3/4 + 8);
|
data = (unsigned char *)malloc(base64Len * 3/4 + 8);
|
||||||
dataLen = Curl_base64_decode(base64, data);
|
dataLen = Curl_base64_decode(base64, data);
|
||||||
|
|
||||||
|
fprintf(stderr, "%d\n", dataLen);
|
||||||
|
|
||||||
fprintf(stderr, "%d\n", dataLen);
|
for(i=0; i < dataLen; i+=0x10) {
|
||||||
fwrite(data,1,dataLen,stdout);
|
printf("0x%02x: ", i);
|
||||||
|
for(j=0; j < 0x10; j++)
|
||||||
|
if((j+i) < dataLen)
|
||||||
|
printf("%02x ", data[i+j]);
|
||||||
|
else
|
||||||
|
printf(" ");
|
||||||
|
|
||||||
|
printf(" | ");
|
||||||
|
|
||||||
free(base64); free(data);
|
for(j=0; j < 0x10; j++)
|
||||||
return 0;
|
if((j+i) < dataLen)
|
||||||
|
printf("%c", isgraph(data[i+j])?data[i+j]:'.');
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
puts("");
|
||||||
|
}
|
||||||
|
|
||||||
|
free(base64); free(data);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TEST_NEED_SUCK
|
#ifdef TEST_NEED_SUCK
|
||||||
/* this function 'sucks' in as much as possible from stdin */
|
/* this function 'sucks' in as much as possible from stdin */
|
||||||
void *suck(int *lenptr) {
|
void *suck(int *lenptr)
|
||||||
int cursize = 8192;
|
{
|
||||||
unsigned char *buf = NULL;
|
int cursize = 8192;
|
||||||
int lastread;
|
unsigned char *buf = NULL;
|
||||||
int len = 0;
|
int lastread;
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
cursize *= 2;
|
cursize *= 2;
|
||||||
buf = (unsigned char *)realloc(buf, cursize);
|
buf = (unsigned char *)realloc(buf, cursize);
|
||||||
memset(buf + len, 0, cursize - len);
|
memset(buf + len, 0, cursize - len);
|
||||||
lastread = fread(buf + len, 1, cursize - len, stdin);
|
lastread = fread(buf + len, 1, cursize - len, stdin);
|
||||||
len += lastread;
|
len += lastread;
|
||||||
} while(!feof(stdin));
|
} while(!feof(stdin));
|
||||||
|
|
||||||
lenptr[0] = len;
|
lenptr[0] = len;
|
||||||
return (void *)buf;
|
return (void *)buf;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -2287,82 +2287,6 @@ Certificate Ingredients:
|
|||||||
ec:b9:94:6a:aa:12:4f:1a:dd:f5:77:b5:25:8c:f2:8a:0a:f1:
|
ec:b9:94:6a:aa:12:4f:1a:dd:f5:77:b5:25:8c:f2:8a:0a:f1:
|
||||||
fc:52:5b:58
|
fc:52:5b:58
|
||||||
|
|
||||||
TC TrustCenter, Germany, Class 0 CA
|
|
||||||
===================================
|
|
||||||
MD5 Fingerprint: 35:85:49:8E:6E:57:FE:BD:97:F1:C9:46:23:3A:B6:7D
|
|
||||||
PEM Data:
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIENTCCA56gAwIBAgIBATANBgkqhkiG9w0BAQQFADCBvDELMAkGA1UEBhMCREUx
|
|
||||||
EDAOBgNVBAgTB0hhbWJ1cmcxEDAOBgNVBAcTB0hhbWJ1cmcxOjA4BgNVBAoTMVRD
|
|
||||||
IFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgx
|
|
||||||
IjAgBgNVBAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDAgQ0ExKTAnBgkqhkiG9w0B
|
|
||||||
CQEWGmNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlMB4XDTk4MDMwOTEzNTQ0OFoX
|
|
||||||
DTA1MTIzMTEzNTQ0OFowgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdIYW1idXJn
|
|
||||||
MRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
|
|
||||||
U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVz
|
|
||||||
dENlbnRlciBDbGFzcyAwIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0
|
|
||||||
cnVzdGNlbnRlci5kZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA333mvr/V
|
|
||||||
8C9tTg7R4I0LfztU6IrisJ8oxYrGubMzJ/UnyhpMVBJrtLJGsx1Ls/QhC0sCLqHC
|
|
||||||
NJyFoMR4EdvbaycrCSoYTkDMn3EZZ5l0onw/wdiLI8hjO4ohq1zeHvSN3LQYwwVz
|
|
||||||
9Gq0ofoBCCsBD203W6o4hmc51+Vf+uR+zKMCAwEAAaOCAUMwggE/MEAGCWCGSAGG
|
|
||||||
+EIBAwQzFjFodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNr
|
|
||||||
LXJldi5jZ2k/MEAGCWCGSAGG+EIBBAQzFjFodHRwczovL3d3dy50cnVzdGNlbnRl
|
|
||||||
ci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/MDwGCWCGSAGG+EIBBwQvFi1odHRw
|
|
||||||
czovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL1JlbmV3LmNnaT8wPgYJYIZI
|
|
||||||
AYb4QgEIBDEWL2h0dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvZ3VpZGVsaW5lcy9p
|
|
||||||
bmRleC5odG1sMCgGCWCGSAGG+EIBDQQbFhlUQyBUcnVzdENlbnRlciBDbGFzcyAw
|
|
||||||
IENBMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQQFAAOBgQBNB39fCTAZ
|
|
||||||
kqoFR3qUdVQqrs/82AxC4UU4KySVssqHynnEw5eQXmIYxsk4YUxoNdNMFBHrxM2h
|
|
||||||
qdjFnmgnMgc1RQT4XyGgYB4cAEgEWNLFy65tMm49d5WMhcflrlCddUp7/wsneepN
|
|
||||||
pFn/7FrqJqU5g6TReM6nqX683SvKEpMDSg==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
Certificate Ingredients:
|
|
||||||
Data:
|
|
||||||
Version: 3 (0x2)
|
|
||||||
Serial Number: 1 (0x1)
|
|
||||||
Signature Algorithm: md5WithRSAEncryption
|
|
||||||
Issuer: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 0 CA/Email=certificate@trustcenter.de
|
|
||||||
Validity
|
|
||||||
Not Before: Mar 9 13:54:48 1998 GMT
|
|
||||||
Not After : Dec 31 13:54:48 2005 GMT
|
|
||||||
Subject: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 0 CA/Email=certificate@trustcenter.de
|
|
||||||
Subject Public Key Info:
|
|
||||||
Public Key Algorithm: rsaEncryption
|
|
||||||
RSA Public Key: (1024 bit)
|
|
||||||
Modulus (1024 bit):
|
|
||||||
00:df:7d:e6:be:bf:d5:f0:2f:6d:4e:0e:d1:e0:8d:
|
|
||||||
0b:7f:3b:54:e8:8a:e2:b0:9f:28:c5:8a:c6:b9:b3:
|
|
||||||
33:27:f5:27:ca:1a:4c:54:12:6b:b4:b2:46:b3:1d:
|
|
||||||
4b:b3:f4:21:0b:4b:02:2e:a1:c2:34:9c:85:a0:c4:
|
|
||||||
78:11:db:db:6b:27:2b:09:2a:18:4e:40:cc:9f:71:
|
|
||||||
19:67:99:74:a2:7c:3f:c1:d8:8b:23:c8:63:3b:8a:
|
|
||||||
21:ab:5c:de:1e:f4:8d:dc:b4:18:c3:05:73:f4:6a:
|
|
||||||
b4:a1:fa:01:08:2b:01:0f:6d:37:5b:aa:38:86:67:
|
|
||||||
39:d7:e5:5f:fa:e4:7e:cc:a3
|
|
||||||
Exponent: 65537 (0x10001)
|
|
||||||
X509v3 extensions:
|
|
||||||
Netscape Revocation Url:
|
|
||||||
https://www.trustcenter.de/cgi-bin/check-rev.cgi?
|
|
||||||
Netscape CA Revocation Url:
|
|
||||||
https://www.trustcenter.de/cgi-bin/check-rev.cgi?
|
|
||||||
Netscape Renewal Url:
|
|
||||||
https://www.trustcenter.de/cgi-bin/Renew.cgi?
|
|
||||||
Netscape CA Policy Url:
|
|
||||||
http://www.trustcenter.de/guidelines/index.html
|
|
||||||
Netscape Comment:
|
|
||||||
TC TrustCenter Class 0 CA
|
|
||||||
Netscape Cert Type:
|
|
||||||
SSL CA, S/MIME CA, Object Signing CA
|
|
||||||
Signature Algorithm: md5WithRSAEncryption
|
|
||||||
4d:07:7f:5f:09:30:19:92:aa:05:47:7a:94:75:54:2a:ae:cf:
|
|
||||||
fc:d8:0c:42:e1:45:38:2b:24:95:b2:ca:87:ca:79:c4:c3:97:
|
|
||||||
90:5e:62:18:c6:c9:38:61:4c:68:35:d3:4c:14:11:eb:c4:cd:
|
|
||||||
a1:a9:d8:c5:9e:68:27:32:07:35:45:04:f8:5f:21:a0:60:1e:
|
|
||||||
1c:00:48:04:58:d2:c5:cb:ae:6d:32:6e:3d:77:95:8c:85:c7:
|
|
||||||
e5:ae:50:9d:75:4a:7b:ff:0b:27:79:ea:4d:a4:59:ff:ec:5a:
|
|
||||||
ea:26:a5:39:83:a4:d1:78:ce:a7:a9:7e:bc:dd:2b:ca:12:93:
|
|
||||||
03:4a
|
|
||||||
|
|
||||||
TC TrustCenter, Germany, Class 1 CA
|
TC TrustCenter, Germany, Class 1 CA
|
||||||
===================================
|
===================================
|
||||||
MD5 Fingerprint: 64:3F:F8:3E:52:14:4A:59:BA:93:56:04:0B:23:02:D1
|
MD5 Fingerprint: 64:3F:F8:3E:52:14:4A:59:BA:93:56:04:0B:23:02:D1
|
||||||
|
@@ -369,3 +369,13 @@
|
|||||||
|
|
||||||
/* Define if you have the `sigsetjmp' function. */
|
/* Define if you have the `sigsetjmp' function. */
|
||||||
#define HAVE_SIGSETJMP 1
|
#define HAVE_SIGSETJMP 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <setjmp.h> header file. */
|
||||||
|
#define HAVE_SETJMP_H 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This needs to be defined for OpenSSL 0.9.7 and other versions that have the
|
||||||
|
* ENGINE stuff supported. If an include of "openssl/engine.h" fails, then
|
||||||
|
* undefine the define below.
|
||||||
|
*/
|
||||||
|
#define HAVE_OPENSSL_ENGINE_H 1
|
||||||
|
92
lib/config.dj
Normal file
92
lib/config.dj
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
#ifndef _CURL_CONFIG_DJGPP_H
|
||||||
|
#define _CURL_CONFIG_DJGPP_H
|
||||||
|
|
||||||
|
#define OS "djgpp"
|
||||||
|
#define PACKAGE "curl"
|
||||||
|
|
||||||
|
#define CURL_CA_BUNDLE "/dev/env/CURL_CA_BUNDLE"
|
||||||
|
|
||||||
|
#if (DJGPP_MINOR >= 4)
|
||||||
|
/* #define HAVE_DLOPEN 1 maybe not (DXE3) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 1 /* use ioctlsocket() via fsext'ed fcntl() */
|
||||||
|
#define HAVE_O_NONBLOCK 1
|
||||||
|
#else
|
||||||
|
#define HAVE_IOCTLSOCKET 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define HAVE_ALARM 1
|
||||||
|
#define HAVE_ARPA_INET_H 1
|
||||||
|
#define HAVE_CLOSESOCKET 1
|
||||||
|
#define HAVE_FCNTL_H 1
|
||||||
|
#define HAVE_GETHOSTBYADDR 1
|
||||||
|
#define HAVE_GETHOSTNAME 1
|
||||||
|
#define HAVE_GETPASS 1
|
||||||
|
#define HAVE_GETSERVBYNAME 1
|
||||||
|
#define HAVE_GETTIMEOFDAY 1
|
||||||
|
#define HAVE_INET_ADDR 1
|
||||||
|
#define HAVE_INET_NTOA 1
|
||||||
|
#define HAVE_IO_H 1
|
||||||
|
#define HAVE_MALLOC_H 1
|
||||||
|
#define HAVE_MEMORY_H 1
|
||||||
|
#define HAVE_NETDB_H 1
|
||||||
|
#define HAVE_NETINET_IN_H 1
|
||||||
|
#define HAVE_NET_IF_H 1
|
||||||
|
#define HAVE_PERROR 1
|
||||||
|
#define HAVE_SELECT 1
|
||||||
|
#define HAVE_SETJMP_H 1
|
||||||
|
#define HAVE_SETVBUF 1
|
||||||
|
#define HAVE_SIGNAL 1
|
||||||
|
#define HAVE_SIGACTION 1
|
||||||
|
#define HAVE_SIGSETJMP 1
|
||||||
|
#define HAVE_SOCKET 1
|
||||||
|
#define HAVE_STRCASECMP 1
|
||||||
|
#define HAVE_STRDUP 1
|
||||||
|
#define HAVE_STRFTIME 1
|
||||||
|
#define HAVE_STRICMP 1
|
||||||
|
#define HAVE_STRSTR 1
|
||||||
|
#define HAVE_SYS_SOCKET_H 1
|
||||||
|
#define HAVE_SYS_STAT_H 1
|
||||||
|
#define HAVE_SYS_TYPES_H 1
|
||||||
|
#define HAVE_TERMIOS_H 1
|
||||||
|
#define HAVE_TIME_H 1
|
||||||
|
#define HAVE_UNAME 1
|
||||||
|
#define HAVE_UNISTD_H 1
|
||||||
|
#define HAVE_VPRINTF 1
|
||||||
|
|
||||||
|
#define RETSIGTYPE void
|
||||||
|
#define SIZEOF_LONG_DOUBLE 16
|
||||||
|
#define SIZEOF_LONG_LONG 8
|
||||||
|
#define STDC_HEADERS 1
|
||||||
|
#define TIME_WITH_SYS_TIME 1
|
||||||
|
|
||||||
|
#define BSD
|
||||||
|
#define USE_ZLIB
|
||||||
|
|
||||||
|
/* #define MALLOCDEBUG */
|
||||||
|
|
||||||
|
#ifdef HAVE_OPENSSL_ENGINE_H /* on cmd-line */
|
||||||
|
#define HAVE_OPENSSL_X509_H 1
|
||||||
|
#define HAVE_OPENSSL_SSL_H 1
|
||||||
|
#define HAVE_OPENSSL_RSA_H 1
|
||||||
|
#define HAVE_OPENSSL_PEM_H 1
|
||||||
|
#define HAVE_OPENSSL_ERR_H 1
|
||||||
|
#define HAVE_OPENSSL_CRYPTO_H 1
|
||||||
|
#define HAVE_LIBSSL 1
|
||||||
|
#define HAVE_LIBCRYPTO 1
|
||||||
|
#define OPENSSL_NO_KRB5 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define in_addr_t u_long
|
||||||
|
#define socklen_t int
|
||||||
|
#define ssize_t int
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <tcp.h> /* Watt-32 API */
|
||||||
|
|
||||||
|
#undef word
|
||||||
|
|
||||||
|
#endif /* _CURL_CONFIG_DJGPP_H */
|
||||||
|
|
107
lib/connect.c
107
lib/connect.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -77,12 +77,11 @@
|
|||||||
#include "if2ip.h"
|
#include "if2ip.h"
|
||||||
|
|
||||||
/* The last #include file should be: */
|
/* The last #include file should be: */
|
||||||
#ifdef MALLOCDEBUG
|
#ifdef CURLDEBUG
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static
|
int Curl_ourerrno(void)
|
||||||
int geterrno(void)
|
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
return (int)GetLastError();
|
return (int)GetLastError();
|
||||||
@@ -144,7 +143,11 @@ int Curl_nonblock(int socket, /* operate on this */
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return 0 on fine connect, -1 on error and 1 on timeout.
|
* waitconnect() returns:
|
||||||
|
* 0 fine connect
|
||||||
|
* -1 select() error
|
||||||
|
* 1 select() timeout
|
||||||
|
* 2 select() returned with an error condition
|
||||||
*/
|
*/
|
||||||
static
|
static
|
||||||
int waitconnect(int sockfd, /* socket */
|
int waitconnect(int sockfd, /* socket */
|
||||||
@@ -176,10 +179,9 @@ int waitconnect(int sockfd, /* socket */
|
|||||||
/* timeout, no connect today */
|
/* timeout, no connect today */
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if(FD_ISSET(sockfd, &errfd)) {
|
if(FD_ISSET(sockfd, &errfd))
|
||||||
/* error condition caught */
|
/* error condition caught */
|
||||||
return 2;
|
return 2;
|
||||||
}
|
|
||||||
|
|
||||||
/* we have a connect! */
|
/* we have a connect! */
|
||||||
return 0;
|
return 0;
|
||||||
@@ -195,10 +197,6 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
|
|
||||||
#ifdef HAVE_INET_NTOA
|
#ifdef HAVE_INET_NTOA
|
||||||
|
|
||||||
#ifndef INADDR_NONE
|
|
||||||
#define INADDR_NONE (in_addr_t) ~0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
|
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
@@ -206,12 +204,16 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
*************************************************************/
|
*************************************************************/
|
||||||
if (strlen(data->set.device)<255) {
|
if (strlen(data->set.device)<255) {
|
||||||
struct sockaddr_in sa;
|
struct sockaddr_in sa;
|
||||||
Curl_addrinfo *h=NULL;
|
struct Curl_dns_entry *h=NULL;
|
||||||
size_t size;
|
size_t size;
|
||||||
char myhost[256] = "";
|
char myhost[256] = "";
|
||||||
in_addr_t in;
|
in_addr_t in;
|
||||||
|
|
||||||
if(Curl_if2ip(data->set.device, myhost, sizeof(myhost))) {
|
/* First check if the given name is an IP address */
|
||||||
|
in=inet_addr(data->set.device);
|
||||||
|
|
||||||
|
if((in == CURL_INADDR_NONE) &&
|
||||||
|
Curl_if2ip(data->set.device, myhost, sizeof(myhost))) {
|
||||||
/*
|
/*
|
||||||
* We now have the numerical IPv4-style x.y.z.w in the 'myhost' buffer
|
* We now have the numerical IPv4-style x.y.z.w in the 'myhost' buffer
|
||||||
*/
|
*/
|
||||||
@@ -244,17 +246,31 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
infof(data, "We bind local end to %s\n", myhost);
|
infof(data, "We bind local end to %s\n", myhost);
|
||||||
|
|
||||||
in=inet_addr(myhost);
|
in=inet_addr(myhost);
|
||||||
if (INADDR_NONE != in) {
|
if (CURL_INADDR_NONE != in) {
|
||||||
|
|
||||||
if ( h ) {
|
if ( h ) {
|
||||||
memset((char *)&sa, 0, sizeof(sa));
|
Curl_addrinfo *addr = h->addr;
|
||||||
|
|
||||||
|
Curl_resolv_unlock(data, h);
|
||||||
|
/* we don't need it anymore after this function has returned */
|
||||||
|
|
||||||
#ifdef ENABLE_IPV6
|
#ifdef ENABLE_IPV6
|
||||||
memcpy((char *)&sa.sin_addr, h->ai_addr, h->ai_addrlen);
|
(void)sa; /* prevent compiler warning */
|
||||||
sa.sin_family = h->ai_family;
|
if( bind(sockfd, addr->ai_addr, addr->ai_addrlen) >= 0) {
|
||||||
|
/* we succeeded to bind */
|
||||||
|
struct sockaddr_in6 add;
|
||||||
|
|
||||||
|
size = sizeof(add);
|
||||||
|
if(getsockname(sockfd, (struct sockaddr *) &add,
|
||||||
|
(socklen_t *)&size)<0) {
|
||||||
|
failf(data, "getsockname() failed");
|
||||||
|
return CURLE_HTTP_PORT_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
memcpy((char *)&sa.sin_addr, h->h_addr, h->h_length);
|
memset((char *)&sa, 0, sizeof(sa));
|
||||||
|
memcpy((char *)&sa.sin_addr, addr->h_addr, addr->h_length);
|
||||||
sa.sin_family = AF_INET;
|
sa.sin_family = AF_INET;
|
||||||
#endif
|
|
||||||
sa.sin_addr.s_addr = in;
|
sa.sin_addr.s_addr = in;
|
||||||
sa.sin_port = 0; /* get any port */
|
sa.sin_port = 0; /* get any port */
|
||||||
|
|
||||||
@@ -269,6 +285,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
return CURLE_HTTP_PORT_FAILED;
|
return CURLE_HTTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else {
|
else {
|
||||||
switch(errno) {
|
switch(errno) {
|
||||||
case EBADF:
|
case EBADF:
|
||||||
@@ -332,7 +349,7 @@ int socketerror(int sockfd)
|
|||||||
|
|
||||||
if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
|
if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
|
||||||
(void *)&err, &errSize))
|
(void *)&err, &errSize))
|
||||||
err = geterrno();
|
err = Curl_ourerrno();
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -375,6 +392,11 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
|||||||
return CURLE_OPERATION_TIMEOUTED;
|
return CURLE_OPERATION_TIMEOUTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(conn->bits.tcpconnect) {
|
||||||
|
/* we are connected already! */
|
||||||
|
*connected = TRUE;
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/* check for connect without timeout as we want to return immediately */
|
/* check for connect without timeout as we want to return immediately */
|
||||||
rc = waitconnect(sockfd, 0);
|
rc = waitconnect(sockfd, 0);
|
||||||
@@ -387,8 +409,15 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
/* nope, not connected for real */
|
/* nope, not connected for real */
|
||||||
|
failf(data, "Connection failed, socket error: %d", err);
|
||||||
|
return CURLE_COULDNT_CONNECT;
|
||||||
|
}
|
||||||
|
else if(1 != rc) {
|
||||||
|
int error = Curl_ourerrno();
|
||||||
|
failf(data, "Failed connect to %s:%d, errno: %d",
|
||||||
|
conn->hostname, conn->port, error);
|
||||||
|
return CURLE_COULDNT_CONNECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the connection phase is "done" here, we should attempt to connect
|
* If the connection phase is "done" here, we should attempt to connect
|
||||||
* to the "next address" in the Curl_hostaddr structure that we resolved
|
* to the "next address" in the Curl_hostaddr structure that we resolved
|
||||||
@@ -408,7 +437,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
||||||
Curl_addrinfo *remotehost, /* use one in here */
|
struct Curl_dns_entry *remotehost, /* use this one */
|
||||||
int port, /* connect to this */
|
int port, /* connect to this */
|
||||||
int *sockconn, /* the connected socket */
|
int *sockconn, /* the connected socket */
|
||||||
Curl_ipconnect **addr, /* the one we used */
|
Curl_ipconnect **addr, /* the one we used */
|
||||||
@@ -477,7 +506,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
struct addrinfo *ai;
|
struct addrinfo *ai;
|
||||||
port =0; /* prevent compiler warning */
|
port =0; /* prevent compiler warning */
|
||||||
|
|
||||||
for (ai = remotehost; ai; ai = ai->ai_next, aliasindex++) {
|
for (ai = remotehost->addr; ai; ai = ai->ai_next, aliasindex++) {
|
||||||
sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
|
sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
|
||||||
if (sockfd < 0)
|
if (sockfd < 0)
|
||||||
continue;
|
continue;
|
||||||
@@ -496,7 +525,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
rc = connect(sockfd, ai->ai_addr, ai->ai_addrlen);
|
rc = connect(sockfd, ai->ai_addr, ai->ai_addrlen);
|
||||||
|
|
||||||
if(-1 == rc) {
|
if(-1 == rc) {
|
||||||
int error=geterrno();
|
int error=Curl_ourerrno();
|
||||||
|
|
||||||
switch (error) {
|
switch (error) {
|
||||||
case EINPROGRESS:
|
case EINPROGRESS:
|
||||||
@@ -537,6 +566,9 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
failf(data, "socket error: %d", err);
|
failf(data, "socket error: %d", err);
|
||||||
/* we are _not_ connected, it was a false alert, continue please */
|
/* we are _not_ connected, it was a false alert, continue please */
|
||||||
}
|
}
|
||||||
|
else if(2 == rc)
|
||||||
|
/* waitconnect() returned error */
|
||||||
|
;
|
||||||
else if(data->state.used_interface == Curl_if_multi) {
|
else if(data->state.used_interface == Curl_if_multi) {
|
||||||
/* When running the multi interface, we bail out here */
|
/* When running the multi interface, we bail out here */
|
||||||
rc = 0;
|
rc = 0;
|
||||||
@@ -569,7 +601,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
/*
|
/*
|
||||||
* Connecting with IPv4-only support
|
* Connecting with IPv4-only support
|
||||||
*/
|
*/
|
||||||
if(!remotehost->h_addr_list[0]) {
|
if(!remotehost->addr->h_addr_list[0]) {
|
||||||
/* If there is no addresses in the address list, then we return
|
/* If there is no addresses in the address list, then we return
|
||||||
error right away */
|
error right away */
|
||||||
failf(data, "no address available");
|
failf(data, "no address available");
|
||||||
@@ -596,23 +628,23 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
/* This is the loop that attempts to connect to all IP-addresses we
|
/* This is the loop that attempts to connect to all IP-addresses we
|
||||||
know for the given host. One by one. */
|
know for the given host. One by one. */
|
||||||
for(rc=-1, aliasindex=0;
|
for(rc=-1, aliasindex=0;
|
||||||
rc && (struct in_addr *)remotehost->h_addr_list[aliasindex];
|
rc && (struct in_addr *)remotehost->addr->h_addr_list[aliasindex];
|
||||||
aliasindex++) {
|
aliasindex++) {
|
||||||
struct sockaddr_in serv_addr;
|
struct sockaddr_in serv_addr;
|
||||||
|
|
||||||
/* do this nasty work to do the connect */
|
/* do this nasty work to do the connect */
|
||||||
memset((char *) &serv_addr, '\0', sizeof(serv_addr));
|
memset((char *) &serv_addr, '\0', sizeof(serv_addr));
|
||||||
memcpy((char *)&(serv_addr.sin_addr),
|
memcpy((char *)&(serv_addr.sin_addr),
|
||||||
(struct in_addr *)remotehost->h_addr_list[aliasindex],
|
(struct in_addr *)remotehost->addr->h_addr_list[aliasindex],
|
||||||
sizeof(struct in_addr));
|
sizeof(struct in_addr));
|
||||||
serv_addr.sin_family = remotehost->h_addrtype;
|
serv_addr.sin_family = remotehost->addr->h_addrtype;
|
||||||
serv_addr.sin_port = htons((unsigned short)port);
|
serv_addr.sin_port = htons((unsigned short)port);
|
||||||
|
|
||||||
rc = connect(sockfd, (struct sockaddr *)&serv_addr,
|
rc = connect(sockfd, (struct sockaddr *)&serv_addr,
|
||||||
sizeof(serv_addr));
|
sizeof(serv_addr));
|
||||||
|
|
||||||
if(-1 == rc) {
|
if(-1 == rc) {
|
||||||
int error=geterrno();
|
int error=Curl_ourerrno();
|
||||||
|
|
||||||
switch (error) {
|
switch (error) {
|
||||||
case EINPROGRESS:
|
case EINPROGRESS:
|
||||||
@@ -639,6 +671,15 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The '1 == rc' comes from the waitconnect(), and not from connect().
|
||||||
|
We can be sure of this since connect() cannot return 1. */
|
||||||
|
if((1 == rc) && (data->state.used_interface == Curl_if_multi)) {
|
||||||
|
/* Timeout when running the multi interface, we return here with a
|
||||||
|
CURLE_OK return code. */
|
||||||
|
rc = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if(0 == rc) {
|
if(0 == rc) {
|
||||||
int err = socketerror(sockfd);
|
int err = socketerror(sockfd);
|
||||||
if ((0 == err) || (EISCONN == err)) {
|
if ((0 == err) || (EISCONN == err)) {
|
||||||
@@ -651,12 +692,6 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(0 != rc) {
|
if(0 != rc) {
|
||||||
if(data->state.used_interface == Curl_if_multi) {
|
|
||||||
/* When running the multi interface, we bail out here */
|
|
||||||
rc = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get a new timeout for next attempt */
|
/* get a new timeout for next attempt */
|
||||||
after = Curl_tvnow();
|
after = Curl_tvnow();
|
||||||
timeout_ms -= Curl_tvdiff(after, before);
|
timeout_ms -= Curl_tvdiff(after, before);
|
||||||
@@ -681,7 +716,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
|
|
||||||
if(addr)
|
if(addr)
|
||||||
/* this is the address we've connected to */
|
/* this is the address we've connected to */
|
||||||
*addr = (struct in_addr *)remotehost->h_addr_list[aliasindex];
|
*addr = (struct in_addr *)remotehost->addr->h_addr_list[aliasindex];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* allow NULL-pointers to get passed in */
|
/* allow NULL-pointers to get passed in */
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -31,10 +31,12 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
|||||||
bool *connected);
|
bool *connected);
|
||||||
|
|
||||||
CURLcode Curl_connecthost(struct connectdata *conn,
|
CURLcode Curl_connecthost(struct connectdata *conn,
|
||||||
Curl_addrinfo *host, /* connect to this */
|
struct Curl_dns_entry *host, /* connect to this */
|
||||||
int port, /* connect to this port number */
|
int port, /* connect to this port number */
|
||||||
int *sockconn, /* not set if error is returned */
|
int *sockconn, /* not set if error is returned */
|
||||||
Curl_ipconnect **addr, /* the one we used */
|
Curl_ipconnect **addr, /* the one we used */
|
||||||
bool *connected /* truly connected? */
|
bool *connected /* truly connected? */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
int Curl_ourerrno(void);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,16 +1,16 @@
|
|||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* _ _ ____ _
|
* _ _ ____ _
|
||||||
* Project ___| | | | _ \| |
|
* Project ___| | | | _ \| |
|
||||||
* / __| | | | |_) | |
|
* / __| | | | |_) | |
|
||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
* are also available at http://curl.haxx.se/docs/copyright.html.
|
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
*
|
*
|
||||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
* copies of the Software, and permit persons to whom the Software is
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
* furnished to do so, under the terms of the COPYING file.
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
@@ -25,13 +25,26 @@
|
|||||||
|
|
||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "urldata.h"
|
#include "urldata.h"
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include <curl/types.h>
|
#include <curl/types.h>
|
||||||
#include "sendf.h"
|
#include "sendf.h"
|
||||||
|
|
||||||
#define DSIZ 4096 /* buffer size for decompressed data */
|
#define DSIZ 0x10000 /* buffer size for decompressed data */
|
||||||
|
|
||||||
|
#define GZIP_MAGIC_0 0x1f
|
||||||
|
#define GZIP_MAGIC_1 0x8b
|
||||||
|
|
||||||
|
/* gzip flag byte */
|
||||||
|
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
|
||||||
|
#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */
|
||||||
|
#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
|
||||||
|
#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
|
||||||
|
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
||||||
|
#define RESERVED 0xE0 /* bits 5..7: reserved */
|
||||||
|
|
||||||
static CURLcode
|
static CURLcode
|
||||||
process_zlib_error(struct SessionHandle *data, z_stream *z)
|
process_zlib_error(struct SessionHandle *data, z_stream *z)
|
||||||
@@ -55,7 +68,7 @@ exit_zlib(z_stream *z, bool *zlib_init, CURLcode result)
|
|||||||
}
|
}
|
||||||
|
|
||||||
CURLcode
|
CURLcode
|
||||||
Curl_unencode_deflate_write(struct SessionHandle *data,
|
Curl_unencode_deflate_write(struct SessionHandle *data,
|
||||||
struct Curl_transfer_keeper *k,
|
struct Curl_transfer_keeper *k,
|
||||||
ssize_t nread)
|
ssize_t nread)
|
||||||
{
|
{
|
||||||
@@ -63,7 +76,7 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
|
|||||||
int result; /* Curl_client_write status */
|
int result; /* Curl_client_write status */
|
||||||
char decomp[DSIZ]; /* Put the decompressed data here. */
|
char decomp[DSIZ]; /* Put the decompressed data here. */
|
||||||
z_stream *z = &k->z; /* zlib state structure */
|
z_stream *z = &k->z; /* zlib state structure */
|
||||||
|
|
||||||
/* Initialize zlib? */
|
/* Initialize zlib? */
|
||||||
if (!k->zlib_init) {
|
if (!k->zlib_init) {
|
||||||
z->zalloc = (alloc_func)Z_NULL;
|
z->zalloc = (alloc_func)Z_NULL;
|
||||||
@@ -74,7 +87,7 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
|
|||||||
k->zlib_init = 1;
|
k->zlib_init = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the compressed input when this fucntion is called */
|
/* Set the compressed input when this function is called */
|
||||||
z->next_in = (Bytef *)k->str;
|
z->next_in = (Bytef *)k->str;
|
||||||
z->avail_in = nread;
|
z->avail_in = nread;
|
||||||
|
|
||||||
@@ -87,11 +100,12 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
|
|||||||
|
|
||||||
status = inflate(z, Z_SYNC_FLUSH);
|
status = inflate(z, Z_SYNC_FLUSH);
|
||||||
if (status == Z_OK || status == Z_STREAM_END) {
|
if (status == Z_OK || status == Z_STREAM_END) {
|
||||||
result = Curl_client_write(data, CLIENTWRITE_BODY, decomp,
|
if (DSIZ - z->avail_out) {
|
||||||
DSIZ - z->avail_out);
|
result = Curl_client_write(data, CLIENTWRITE_BODY, decomp,
|
||||||
/* if !CURLE_OK, clean up, return */
|
DSIZ - z->avail_out);
|
||||||
if (result) {
|
/* if !CURLE_OK, clean up, return */
|
||||||
return exit_zlib(z, &k->zlib_init, result);
|
if (result)
|
||||||
|
return exit_zlib(z, &k->zlib_init, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Done?; clean up, return */
|
/* Done?; clean up, return */
|
||||||
@@ -103,7 +117,233 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Done with these bytes, exit */
|
/* Done with these bytes, exit */
|
||||||
if (status == Z_OK && z->avail_in == 0 && z->avail_out > 0)
|
if (status == Z_OK && z->avail_in == 0 && z->avail_out > 0)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else { /* Error; exit loop, handle below */
|
||||||
|
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip over the gzip header */
|
||||||
|
static enum {
|
||||||
|
GZIP_OK,
|
||||||
|
GZIP_BAD,
|
||||||
|
GZIP_UNDERFLOW
|
||||||
|
} check_gzip_header(unsigned char const *data, ssize_t len, ssize_t *headerlen)
|
||||||
|
{
|
||||||
|
int method, flags;
|
||||||
|
const ssize_t totallen = len;
|
||||||
|
|
||||||
|
/* The shortest header is 10 bytes */
|
||||||
|
if (len < 10)
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
if ((data[0] != GZIP_MAGIC_0) || (data[1] != GZIP_MAGIC_1))
|
||||||
|
return GZIP_BAD;
|
||||||
|
|
||||||
|
method = data[2];
|
||||||
|
flags = data[3];
|
||||||
|
|
||||||
|
if (method != Z_DEFLATED || (flags & RESERVED) != 0) {
|
||||||
|
/* Can't handle this compression method or unknown flag */
|
||||||
|
return GZIP_BAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip over time, xflags, OS code and all previous bytes */
|
||||||
|
len -= 10;
|
||||||
|
data += 10;
|
||||||
|
|
||||||
|
if (flags & EXTRA_FIELD) {
|
||||||
|
ssize_t extra_len;
|
||||||
|
|
||||||
|
if (len < 2)
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
extra_len = (data[1] << 8) | data[0];
|
||||||
|
|
||||||
|
if (len < (extra_len+2))
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
len -= (extra_len + 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & ORIG_NAME) {
|
||||||
|
/* Skip over NUL-terminated file name */
|
||||||
|
while (len && *data) {
|
||||||
|
--len;
|
||||||
|
++data;
|
||||||
|
}
|
||||||
|
if (!len || *data)
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
/* Skip over the NUL */
|
||||||
|
--len;
|
||||||
|
++data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & COMMENT) {
|
||||||
|
/* Skip over NUL-terminated comment */
|
||||||
|
while (len && *data) {
|
||||||
|
--len;
|
||||||
|
++data;
|
||||||
|
}
|
||||||
|
if (!len || *data)
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
/* Skip over the NUL */
|
||||||
|
--len;
|
||||||
|
++data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & HEAD_CRC) {
|
||||||
|
if (len < 2)
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
len -= 2;
|
||||||
|
data += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
*headerlen = totallen - len;
|
||||||
|
return GZIP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
CURLcode
|
||||||
|
Curl_unencode_gzip_write(struct SessionHandle *data,
|
||||||
|
struct Curl_transfer_keeper *k,
|
||||||
|
ssize_t nread)
|
||||||
|
{
|
||||||
|
int status; /* zlib status */
|
||||||
|
int result; /* Curl_client_write status */
|
||||||
|
char decomp[DSIZ]; /* Put the decompressed data here. */
|
||||||
|
z_stream *z = &k->z; /* zlib state structure */
|
||||||
|
|
||||||
|
/* Initialize zlib? */
|
||||||
|
if (!k->zlib_init) {
|
||||||
|
z->zalloc = (alloc_func)Z_NULL;
|
||||||
|
z->zfree = (free_func)Z_NULL;
|
||||||
|
z->opaque = 0; /* of dubious use 08/27/02 jhrg */
|
||||||
|
if (inflateInit2(z, -MAX_WBITS) != Z_OK)
|
||||||
|
return process_zlib_error(data, z);
|
||||||
|
k->zlib_init = 1; /* Initial call state */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This next mess is to get around the potential case where there isn't
|
||||||
|
enough data passed in to skip over the gzip header. If that happens,
|
||||||
|
we malloc a block and copy what we have then wait for the next call. If
|
||||||
|
there still isn't enough (this is definitely a worst-case scenario), we
|
||||||
|
make the block bigger, copy the next part in and keep waiting. */
|
||||||
|
|
||||||
|
/* Skip over gzip header? */
|
||||||
|
if (k->zlib_init == 1) {
|
||||||
|
/* Initial call state */
|
||||||
|
ssize_t hlen;
|
||||||
|
|
||||||
|
switch (check_gzip_header((unsigned char *)k->str, nread, &hlen)) {
|
||||||
|
case GZIP_OK:
|
||||||
|
z->next_in = (Bytef *)k->str + hlen;
|
||||||
|
z->avail_in = nread - hlen;
|
||||||
|
k->zlib_init = 3; /* Inflating stream state */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GZIP_UNDERFLOW:
|
||||||
|
/* We need more data so we can find the end of the gzip header.
|
||||||
|
It's possible that the memory block we malloc here will never be
|
||||||
|
freed if the transfer abruptly aborts after this point. Since it's
|
||||||
|
unlikely that circumstances will be right for this code path to be
|
||||||
|
followed in the first place, and it's even more unlikely for a transfer
|
||||||
|
to fail immediately afterwards, it should seldom be a problem. */
|
||||||
|
z->avail_in = nread;
|
||||||
|
z->next_in = malloc(z->avail_in);
|
||||||
|
if (z->next_in == NULL) {
|
||||||
|
return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
memcpy(z->next_in, k->str, z->avail_in);
|
||||||
|
k->zlib_init = 2; /* Need more gzip header data state */
|
||||||
|
/* We don't have any data to inflate yet */
|
||||||
|
return CURLE_OK;
|
||||||
|
|
||||||
|
case GZIP_BAD:
|
||||||
|
default:
|
||||||
|
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (k->zlib_init == 2) {
|
||||||
|
/* Need more gzip header data state */
|
||||||
|
ssize_t hlen;
|
||||||
|
unsigned char *oldblock = z->next_in;
|
||||||
|
|
||||||
|
z->avail_in += nread;
|
||||||
|
z->next_in = realloc(z->next_in, z->avail_in);
|
||||||
|
if (z->next_in == NULL) {
|
||||||
|
free(oldblock);
|
||||||
|
return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
/* Append the new block of data to the previous one */
|
||||||
|
memcpy(z->next_in + z->avail_in - nread, k->str, nread);
|
||||||
|
|
||||||
|
switch (check_gzip_header(z->next_in, z->avail_in, &hlen)) {
|
||||||
|
case GZIP_OK:
|
||||||
|
/* This is the zlib stream data */
|
||||||
|
free(z->next_in);
|
||||||
|
/* Don't point into the malloced block since we just freed it */
|
||||||
|
z->next_in = (Bytef *)k->str + hlen + nread - z->avail_in;
|
||||||
|
z->avail_in = z->avail_in - hlen;
|
||||||
|
k->zlib_init = 3; /* Inflating stream state */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GZIP_UNDERFLOW:
|
||||||
|
/* We still don't have any data to inflate! */
|
||||||
|
return CURLE_OK;
|
||||||
|
|
||||||
|
case GZIP_BAD:
|
||||||
|
default:
|
||||||
|
free(z->next_in);
|
||||||
|
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Inflating stream state */
|
||||||
|
z->next_in = (Bytef *)k->str;
|
||||||
|
z->avail_in = nread;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (z->avail_in == 0) {
|
||||||
|
/* We don't have any data to inflate; wait until next time */
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* because the buffer size is fixed, iteratively decompress
|
||||||
|
and transfer to the client via client_write. */
|
||||||
|
for (;;) {
|
||||||
|
/* (re)set buffer for decompressed output for every iteration */
|
||||||
|
z->next_out = (Bytef *)&decomp[0];
|
||||||
|
z->avail_out = DSIZ;
|
||||||
|
|
||||||
|
status = inflate(z, Z_SYNC_FLUSH);
|
||||||
|
if (status == Z_OK || status == Z_STREAM_END) {
|
||||||
|
if(DSIZ - z->avail_out) {
|
||||||
|
result = Curl_client_write(data, CLIENTWRITE_BODY, decomp,
|
||||||
|
DSIZ - z->avail_out);
|
||||||
|
/* if !CURLE_OK, clean up, return */
|
||||||
|
if (result)
|
||||||
|
return exit_zlib(z, &k->zlib_init, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Done?; clean up, return */
|
||||||
|
/* We should really check the gzip CRC here */
|
||||||
|
if (status == Z_STREAM_END) {
|
||||||
|
if (inflateEnd(z) == Z_OK)
|
||||||
|
return exit_zlib(z, &k->zlib_init, result);
|
||||||
|
else
|
||||||
|
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Done with these bytes, exit */
|
||||||
|
if (status == Z_OK && z->avail_in == 0 && z->avail_out > 0)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
else { /* Error; exit loop, handle below */
|
else { /* Error; exit loop, handle below */
|
||||||
@@ -112,11 +352,3 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* HAVE_LIBZ */
|
#endif /* HAVE_LIBZ */
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -20,15 +20,22 @@
|
|||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
#include "setup.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Comma-separated list all supported Content-Encodings ('identity' is implied)
|
||||||
|
*/
|
||||||
|
#ifdef HAVE_LIBZ
|
||||||
|
#define ALL_CONTENT_ENCODINGS "deflate, gzip"
|
||||||
|
#else
|
||||||
|
#define ALL_CONTENT_ENCODINGS "identity"
|
||||||
|
#endif
|
||||||
|
|
||||||
CURLcode Curl_unencode_deflate_write(struct SessionHandle *data,
|
CURLcode Curl_unencode_deflate_write(struct SessionHandle *data,
|
||||||
struct Curl_transfer_keeper *k,
|
struct Curl_transfer_keeper *k,
|
||||||
ssize_t nread);
|
ssize_t nread);
|
||||||
|
|
||||||
/*
|
CURLcode
|
||||||
* local variables:
|
Curl_unencode_gzip_write(struct SessionHandle *data,
|
||||||
* eval: (load-file "../curl-mode.el")
|
struct Curl_transfer_keeper *k,
|
||||||
* end:
|
ssize_t nread);
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
211
lib/cookie.c
211
lib/cookie.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -77,6 +77,7 @@ Example set of cookies:
|
|||||||
13-Jun-1988 03:04:55 GMT; domain=.fidelity.com; path=/; secure
|
13-Jun-1988 03:04:55 GMT; domain=.fidelity.com; path=/; secure
|
||||||
****/
|
****/
|
||||||
|
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
#ifndef CURL_DISABLE_HTTP
|
#ifndef CURL_DISABLE_HTTP
|
||||||
@@ -91,7 +92,7 @@ Example set of cookies:
|
|||||||
#include "strtok.h"
|
#include "strtok.h"
|
||||||
|
|
||||||
/* The last #include file should be: */
|
/* The last #include file should be: */
|
||||||
#ifdef MALLOCDEBUG
|
#ifdef CURLDEBUG
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -110,6 +111,17 @@ free_cookiemess(struct Cookie *co)
|
|||||||
free(co);
|
free(co);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool tailmatch(const char *little, const char *bigone)
|
||||||
|
{
|
||||||
|
unsigned int littlelen = strlen(little);
|
||||||
|
unsigned int biglen = strlen(bigone);
|
||||||
|
|
||||||
|
if(littlelen > biglen)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return strequal(little, bigone+biglen-littlelen);
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
*
|
*
|
||||||
* Curl_cookie_add()
|
* Curl_cookie_add()
|
||||||
@@ -122,7 +134,10 @@ struct Cookie *
|
|||||||
Curl_cookie_add(struct CookieInfo *c,
|
Curl_cookie_add(struct CookieInfo *c,
|
||||||
bool httpheader, /* TRUE if HTTP header-style line */
|
bool httpheader, /* TRUE if HTTP header-style line */
|
||||||
char *lineptr, /* first character of the line */
|
char *lineptr, /* first character of the line */
|
||||||
char *domain) /* default domain */
|
char *domain, /* default domain */
|
||||||
|
char *path) /* full path used when this cookie is set,
|
||||||
|
used to get default path for the cookie
|
||||||
|
unless set */
|
||||||
{
|
{
|
||||||
struct Cookie *clist;
|
struct Cookie *clist;
|
||||||
char what[MAX_COOKIE_LINE];
|
char what[MAX_COOKIE_LINE];
|
||||||
@@ -133,6 +148,7 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
struct Cookie *lastc=NULL;
|
struct Cookie *lastc=NULL;
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
bool replace_old = FALSE;
|
bool replace_old = FALSE;
|
||||||
|
bool badcookie = FALSE; /* cookies are good by default. mmmmm yummy */
|
||||||
|
|
||||||
/* First, alloc and init a new struct for it */
|
/* First, alloc and init a new struct for it */
|
||||||
co = (struct Cookie *)malloc(sizeof(struct Cookie));
|
co = (struct Cookie *)malloc(sizeof(struct Cookie));
|
||||||
@@ -185,8 +201,63 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
co->path=strdup(whatptr);
|
co->path=strdup(whatptr);
|
||||||
}
|
}
|
||||||
else if(strequal("domain", name)) {
|
else if(strequal("domain", name)) {
|
||||||
co->domain=strdup(whatptr);
|
/* note that this name may or may not have a preceeding dot, but
|
||||||
co->field1= (whatptr[0]=='.')?2:1;
|
we don't care about that, we treat the names the same anyway */
|
||||||
|
|
||||||
|
char *ptr=whatptr;
|
||||||
|
int dotcount=1;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
static const char *seventhree[]= {
|
||||||
|
"com", "edu", "net", "org", "gov", "mil", "int"
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Count the dots, we need to make sure that there are THREE dots
|
||||||
|
in the normal domains, or TWO in the seventhree-domains. */
|
||||||
|
|
||||||
|
if('.' == whatptr[0])
|
||||||
|
/* don't count the initial dot, assume it */
|
||||||
|
ptr++;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ptr = strchr(ptr, '.');
|
||||||
|
if(ptr) {
|
||||||
|
ptr++;
|
||||||
|
dotcount++;
|
||||||
|
}
|
||||||
|
} while(ptr);
|
||||||
|
|
||||||
|
for(i=0;
|
||||||
|
i<sizeof(seventhree)/sizeof(seventhree[0]); i++) {
|
||||||
|
if(tailmatch(seventhree[i], whatptr)) {
|
||||||
|
dotcount++; /* we allow one dot less for these */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dotcount < 3) {
|
||||||
|
/* Received and skipped a cookie with a domain using too few
|
||||||
|
dots. */
|
||||||
|
badcookie=TRUE; /* mark this as a bad cookie */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Now, we make sure that our host is within the given domain,
|
||||||
|
or the given domain is not valid and thus cannot be set. */
|
||||||
|
|
||||||
|
if(!domain || tailmatch(whatptr, domain)) {
|
||||||
|
char *ptr=whatptr;
|
||||||
|
if(ptr[0] == '.')
|
||||||
|
ptr++;
|
||||||
|
co->domain=strdup(ptr); /* dont prefix with dots internally */
|
||||||
|
co->tailmatch=TRUE; /* we always do that if the domain name was
|
||||||
|
given */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* we did not get a tailmatch and then the attempted set domain
|
||||||
|
is not a domain to which the current host belongs. Mark as
|
||||||
|
bad. */
|
||||||
|
badcookie=TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(strequal("version", name)) {
|
else if(strequal("version", name)) {
|
||||||
co->version=strdup(whatptr);
|
co->version=strdup(whatptr);
|
||||||
@@ -248,8 +319,11 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
semiptr=strchr(ptr, '\0');
|
semiptr=strchr(ptr, '\0');
|
||||||
} while(semiptr);
|
} while(semiptr);
|
||||||
|
|
||||||
if(NULL == co->name) {
|
if(badcookie || (NULL == co->name)) {
|
||||||
/* we didn't get a cookie name, this is an illegal line, bail out */
|
/* we didn't get a cookie name or a bad one,
|
||||||
|
this is an illegal line, bail out */
|
||||||
|
if(co->expirestr)
|
||||||
|
free(co->expirestr);
|
||||||
if(co->domain)
|
if(co->domain)
|
||||||
free(co->domain);
|
free(co->domain);
|
||||||
if(co->path)
|
if(co->path)
|
||||||
@@ -263,8 +337,20 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(NULL == co->domain)
|
if(NULL == co->domain)
|
||||||
/* no domain given in the header line, set the default now */
|
/* no domain was given in the header line, set the default now */
|
||||||
co->domain=domain?strdup(domain):NULL;
|
co->domain=domain?strdup(domain):NULL;
|
||||||
|
if((NULL == co->path) && path) {
|
||||||
|
/* no path was given in the header line, set the default now */
|
||||||
|
char *endslash = strrchr(path, '/');
|
||||||
|
if(endslash) {
|
||||||
|
int pathlen = endslash-path+1; /* include the ending slash */
|
||||||
|
co->path=malloc(pathlen+1); /* one extra for the zero byte */
|
||||||
|
if(co->path) {
|
||||||
|
memcpy(co->path, path, pathlen);
|
||||||
|
co->path[pathlen]=0; /* zero terminate */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* This line is NOT a HTTP header style line, we do offer support for
|
/* This line is NOT a HTTP header style line, we do offer support for
|
||||||
@@ -296,9 +382,12 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
|
|
||||||
/* Now loop through the fields and init the struct we already have
|
/* Now loop through the fields and init the struct we already have
|
||||||
allocated */
|
allocated */
|
||||||
for(ptr=firstptr, fields=0; ptr; ptr=strtok_r(NULL, "\t", &tok_buf), fields++) {
|
for(ptr=firstptr, fields=0; ptr;
|
||||||
|
ptr=strtok_r(NULL, "\t", &tok_buf), fields++) {
|
||||||
switch(fields) {
|
switch(fields) {
|
||||||
case 0:
|
case 0:
|
||||||
|
if(ptr[0]=='.') /* skip preceeding dots */
|
||||||
|
ptr++;
|
||||||
co->domain = strdup(ptr);
|
co->domain = strdup(ptr);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
@@ -311,10 +400,8 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
|
|
||||||
As far as I can see, it is set to true when the cookie says
|
As far as I can see, it is set to true when the cookie says
|
||||||
.domain.com and to false when the domain is complete www.domain.com
|
.domain.com and to false when the domain is complete www.domain.com
|
||||||
|
|
||||||
We don't currently take advantage of this knowledge.
|
|
||||||
*/
|
*/
|
||||||
co->field1=strequal(ptr, "TRUE")+1; /* store information */
|
co->tailmatch=strequal(ptr, "TRUE"); /* store information */
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
/* It turns out, that sometimes the file format allows the path
|
/* It turns out, that sometimes the file format allows the path
|
||||||
@@ -373,13 +460,8 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
/* the names are identical */
|
/* the names are identical */
|
||||||
|
|
||||||
if(clist->domain && co->domain) {
|
if(clist->domain && co->domain) {
|
||||||
if(strequal(clist->domain, co->domain) ||
|
if(strequal(clist->domain, co->domain))
|
||||||
(clist->domain[0]=='.' &&
|
/* The domains are identical */
|
||||||
strequal(&(clist->domain[1]), co->domain)) ||
|
|
||||||
(co->domain[0]=='.' &&
|
|
||||||
strequal(clist->domain, &(co->domain[1]))) )
|
|
||||||
/* The domains are identical, or at least identical if you skip the
|
|
||||||
preceeding dot */
|
|
||||||
replace_old=TRUE;
|
replace_old=TRUE;
|
||||||
}
|
}
|
||||||
else if(!clist->domain && !co->domain)
|
else if(!clist->domain && !co->domain)
|
||||||
@@ -469,7 +551,6 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
}
|
}
|
||||||
|
|
||||||
c->numcookies++; /* one more cookie in the jar */
|
c->numcookies++; /* one more cookie in the jar */
|
||||||
|
|
||||||
return co;
|
return co;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -519,7 +600,7 @@ struct CookieInfo *Curl_cookie_init(char *file,
|
|||||||
char *lineptr;
|
char *lineptr;
|
||||||
bool headerline;
|
bool headerline;
|
||||||
while(fgets(line, MAX_COOKIE_LINE, fp)) {
|
while(fgets(line, MAX_COOKIE_LINE, fp)) {
|
||||||
if(strnequal("Set-Cookie:", line, 11)) {
|
if(checkprefix("Set-Cookie:", line)) {
|
||||||
/* This is a cookie line, get it! */
|
/* This is a cookie line, get it! */
|
||||||
lineptr=&line[11];
|
lineptr=&line[11];
|
||||||
headerline=TRUE;
|
headerline=TRUE;
|
||||||
@@ -531,7 +612,7 @@ struct CookieInfo *Curl_cookie_init(char *file,
|
|||||||
while(*lineptr && isspace((int)*lineptr))
|
while(*lineptr && isspace((int)*lineptr))
|
||||||
lineptr++;
|
lineptr++;
|
||||||
|
|
||||||
Curl_cookie_add(c, headerline, lineptr, NULL);
|
Curl_cookie_add(c, headerline, lineptr, NULL, NULL);
|
||||||
}
|
}
|
||||||
if(fromfile)
|
if(fromfile)
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@@ -560,9 +641,6 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c,
|
|||||||
struct Cookie *newco;
|
struct Cookie *newco;
|
||||||
struct Cookie *co;
|
struct Cookie *co;
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
int hostlen=strlen(host);
|
|
||||||
int domlen;
|
|
||||||
|
|
||||||
struct Cookie *mainco=NULL;
|
struct Cookie *mainco=NULL;
|
||||||
|
|
||||||
if(!c || !c->cookies)
|
if(!c || !c->cookies)
|
||||||
@@ -571,43 +649,42 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c,
|
|||||||
co = c->cookies;
|
co = c->cookies;
|
||||||
|
|
||||||
while(co) {
|
while(co) {
|
||||||
/* only process this cookie if it is not expired or had no expire
|
/* only process this cookie if it is not expired or had no expire
|
||||||
date AND that if the cookie requires we're secure we must only
|
date AND that if the cookie requires we're secure we must only
|
||||||
continue if we are! */
|
continue if we are! */
|
||||||
if( (co->expires<=0 || (co->expires> now)) &&
|
if( (co->expires<=0 || (co->expires> now)) &&
|
||||||
(co->secure?secure:TRUE) ) {
|
(co->secure?secure:TRUE) ) {
|
||||||
|
|
||||||
|
/* now check if the domain is correct */
|
||||||
|
if(!co->domain ||
|
||||||
|
(co->tailmatch && tailmatch(co->domain, host)) ||
|
||||||
|
(!co->tailmatch && strequal(host, co->domain)) ) {
|
||||||
|
/* the right part of the host matches the domain stuff in the
|
||||||
|
cookie data */
|
||||||
|
|
||||||
|
/* now check the left part of the path with the cookies path
|
||||||
|
requirement */
|
||||||
|
if(!co->path ||
|
||||||
|
checkprefix(co->path, path) ) {
|
||||||
|
|
||||||
/* now check if the domain is correct */
|
/* and now, we know this is a match and we should create an
|
||||||
domlen=co->domain?strlen(co->domain):0;
|
entry for the return-linked-list */
|
||||||
if(!co->domain ||
|
|
||||||
((domlen<=hostlen) &&
|
newco = (struct Cookie *)malloc(sizeof(struct Cookie));
|
||||||
strequal(host+(hostlen-domlen), co->domain)) ) {
|
if(newco) {
|
||||||
/* the right part of the host matches the domain stuff in the
|
/* first, copy the whole source cookie: */
|
||||||
cookie data */
|
memcpy(newco, co, sizeof(struct Cookie));
|
||||||
|
|
||||||
/* now check the left part of the path with the cookies path
|
/* then modify our next */
|
||||||
requirement */
|
newco->next = mainco;
|
||||||
if(!co->path ||
|
|
||||||
strnequal(path, co->path, strlen(co->path))) {
|
/* point the main to us */
|
||||||
|
mainco = newco;
|
||||||
/* and now, we know this is a match and we should create an
|
}
|
||||||
entry for the return-linked-list */
|
}
|
||||||
|
}
|
||||||
newco = (struct Cookie *)malloc(sizeof(struct Cookie));
|
}
|
||||||
if(newco) {
|
co = co->next;
|
||||||
/* first, copy the whole source cookie: */
|
|
||||||
memcpy(newco, co, sizeof(struct Cookie));
|
|
||||||
|
|
||||||
/* then modify our next */
|
|
||||||
newco->next = mainco;
|
|
||||||
|
|
||||||
/* point the main to us */
|
|
||||||
mainco = newco;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
co = co->next;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return mainco; /* return the new list */
|
return mainco; /* return the new list */
|
||||||
@@ -715,15 +792,19 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
|
|||||||
|
|
||||||
while(co) {
|
while(co) {
|
||||||
fprintf(out,
|
fprintf(out,
|
||||||
"%s\t" /* domain */
|
"%s%s\t" /* domain */
|
||||||
"%s\t" /* field1 */
|
"%s\t" /* tailmatch */
|
||||||
"%s\t" /* path */
|
"%s\t" /* path */
|
||||||
"%s\t" /* secure */
|
"%s\t" /* secure */
|
||||||
"%u\t" /* expires */
|
"%u\t" /* expires */
|
||||||
"%s\t" /* name */
|
"%s\t" /* name */
|
||||||
"%s\n", /* value */
|
"%s\n", /* value */
|
||||||
|
|
||||||
|
/* Make sure all domains are prefixed with a dot if they allow
|
||||||
|
tailmatching. This is Mozilla-style. */
|
||||||
|
(co->tailmatch && co->domain && co->domain[0] != '.')? ".":"",
|
||||||
co->domain?co->domain:"unknown",
|
co->domain?co->domain:"unknown",
|
||||||
co->field1==2?"TRUE":"FALSE",
|
co->tailmatch?"TRUE":"FALSE",
|
||||||
co->path?co->path:"/",
|
co->path?co->path:"/",
|
||||||
co->secure?"TRUE":"FALSE",
|
co->secure?"TRUE":"FALSE",
|
||||||
(unsigned int)co->expires,
|
(unsigned int)co->expires,
|
||||||
@@ -768,11 +849,3 @@ int main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* CURL_DISABLE_HTTP */
|
#endif /* CURL_DISABLE_HTTP */
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
11
lib/cookie.h
11
lib/cookie.h
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -40,8 +40,7 @@ struct Cookie {
|
|||||||
char *domain; /* domain = <this> */
|
char *domain; /* domain = <this> */
|
||||||
long expires; /* expires = <this> */
|
long expires; /* expires = <this> */
|
||||||
char *expirestr; /* the plain text version */
|
char *expirestr; /* the plain text version */
|
||||||
|
bool tailmatch; /* weather we do tail-matchning of the domain name */
|
||||||
char field1; /* read from a cookie file, 1 => FALSE, 2=> TRUE */
|
|
||||||
|
|
||||||
/* RFC 2109 keywords. Version=1 means 2109-compliant cookie sending */
|
/* RFC 2109 keywords. Version=1 means 2109-compliant cookie sending */
|
||||||
char *version; /* Version = <value> */
|
char *version; /* Version = <value> */
|
||||||
@@ -70,11 +69,11 @@ struct CookieInfo {
|
|||||||
#define MAX_NAME_TXT "255"
|
#define MAX_NAME_TXT "255"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add a cookie to the internal list of cookies. The domain argument is only
|
* Add a cookie to the internal list of cookies. The domain and path arguments
|
||||||
* used if the header boolean is TRUE.
|
* are only used if the header boolean is TRUE.
|
||||||
*/
|
*/
|
||||||
struct Cookie *Curl_cookie_add(struct CookieInfo *, bool header, char *line,
|
struct Cookie *Curl_cookie_add(struct CookieInfo *, bool header, char *line,
|
||||||
char *domain);
|
char *domain, char *path);
|
||||||
|
|
||||||
struct CookieInfo *Curl_cookie_init(char *, struct CookieInfo *, bool);
|
struct CookieInfo *Curl_cookie_init(char *, struct CookieInfo *, bool);
|
||||||
struct Cookie *Curl_cookie_getlist(struct CookieInfo *, char *, char *, bool);
|
struct Cookie *Curl_cookie_getlist(struct CookieInfo *, char *, char *, bool);
|
||||||
|
@@ -31,19 +31,19 @@ RSC=rc.exe
|
|||||||
|
|
||||||
!IF "$(CFG)" == "curllib - Win32 Release"
|
!IF "$(CFG)" == "curllib - Win32 Release"
|
||||||
|
|
||||||
# PROP BASE Use_MFC 6
|
# PROP BASE Use_MFC 0
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
# PROP BASE Use_Debug_Libraries 0
|
||||||
# PROP BASE Output_Dir "Release"
|
# PROP BASE Output_Dir "Release"
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
# PROP BASE Intermediate_Dir "Release"
|
||||||
# PROP BASE Target_Dir ""
|
# PROP BASE Target_Dir ""
|
||||||
# PROP Use_MFC 6
|
# PROP Use_MFC 0
|
||||||
# PROP Use_Debug_Libraries 0
|
# PROP Use_Debug_Libraries 0
|
||||||
# PROP Output_Dir "Release"
|
# PROP Output_Dir "Release"
|
||||||
# PROP Intermediate_Dir "Release"
|
# PROP Intermediate_Dir "Release"
|
||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /c
|
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /c
|
||||||
# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /FR /FD /c
|
# ADD CPP /nologo /MT /W3 /GX /Zi /O2 /I "..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /D "_WINDLL" /FR /FD /c
|
||||||
# SUBTRACT CPP /YX
|
# SUBTRACT CPP /YX
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||||
@@ -70,7 +70,7 @@ LINK32=link.exe
|
|||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /GZ /c
|
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /GZ /c
|
||||||
# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /FR /FD /GZ /c
|
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /FR /FD /GZ /c
|
||||||
# SUBTRACT CPP /WX /YX
|
# SUBTRACT CPP /WX /YX
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
@@ -111,10 +111,6 @@ SOURCE=.\dict.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\dllinit.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\easy.c
|
SOURCE=.\easy.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
@@ -247,6 +243,10 @@ SOURCE=.\url.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\share.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\version.c
|
SOURCE=.\version.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# End Group
|
# End Group
|
||||||
@@ -389,6 +389,22 @@ SOURCE=.\url.h
|
|||||||
|
|
||||||
SOURCE=.\urldata.h
|
SOURCE=.\urldata.h
|
||||||
# End Source File
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\http_digest.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\md5.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\http_digest.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\md5.h
|
||||||
|
# End Source File
|
||||||
# End Group
|
# End Group
|
||||||
# Begin Group "Resource Files"
|
# Begin Group "Resource Files"
|
||||||
|
|
||||||
|
11
lib/dict.c
11
lib/dict.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/resource.h>
|
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -231,11 +230,3 @@ CURLcode Curl_dict(struct connectdata *conn)
|
|||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -1,99 +0,0 @@
|
|||||||
#ifdef WIN32
|
|
||||||
/* dllinit.c -- Portable DLL initialization.
|
|
||||||
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
|
||||||
Contributed by Mumit Khan (khan@xraylith.wisc.edu).
|
|
||||||
|
|
||||||
I've used DllMain as the DLL "main" since that's the most common
|
|
||||||
usage. MSVC and Mingw32 both default to DllMain as the standard
|
|
||||||
callback from the linker entry point. Cygwin, as of b20.1, also
|
|
||||||
uses DllMain as the default callback from the entry point.
|
|
||||||
|
|
||||||
The real entry point is typically always defined by the runtime
|
|
||||||
library, and usually never overridden by (casual) user. What you can
|
|
||||||
override however is the callback routine that the entry point calls,
|
|
||||||
and this file provides such a callback function, DllMain.
|
|
||||||
|
|
||||||
Mingw32: The default entry point for mingw32 is DllMainCRTStartup
|
|
||||||
which is defined in libmingw32.a This in turn calls DllMain which is
|
|
||||||
defined here. If not defined, there is a stub in libmingw32.a which
|
|
||||||
does nothing.
|
|
||||||
|
|
||||||
Cygwin: The default entry point for Cygwin b20.1 or newer is
|
|
||||||
__cygwin_dll_entry which is defined in libcygwin.a. This in turn
|
|
||||||
calls the routine DllMain. If not defined, there is a stub in
|
|
||||||
libcygwin.a which does nothing.
|
|
||||||
|
|
||||||
MSVC: MSVC runtime calls DllMain, just like Mingw32.
|
|
||||||
|
|
||||||
Summary: If you need to do anything special in DllMain, just add it
|
|
||||||
here. Otherwise, the default setup should be just fine for 99%+ of
|
|
||||||
the time. I strongly suggest that you *not* change the entry point,
|
|
||||||
but rather change DllMain as appropriate.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#include <windows.h>
|
|
||||||
#undef WIN32_LEAN_AND_MEAN
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason,
|
|
||||||
LPVOID reserved /* Not used. */ );
|
|
||||||
|
|
||||||
/*
|
|
||||||
*----------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* DllMain --
|
|
||||||
*
|
|
||||||
* This routine is called by the Mingw32, Cygwin32 or VC++ C run
|
|
||||||
* time library init code, or the Borland DllEntryPoint routine. It
|
|
||||||
* is responsible for initializing various dynamically loaded
|
|
||||||
* libraries.
|
|
||||||
*
|
|
||||||
* Results:
|
|
||||||
* TRUE on sucess, FALSE on failure.
|
|
||||||
*
|
|
||||||
* Side effects:
|
|
||||||
*
|
|
||||||
*----------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
BOOL APIENTRY
|
|
||||||
DllMain (
|
|
||||||
HINSTANCE hInst /* Library instance handle. */ ,
|
|
||||||
DWORD reason /* Reason this function is being called. */ ,
|
|
||||||
LPVOID reserved /* Not used. */ )
|
|
||||||
{
|
|
||||||
/* prevent compiler warnings */
|
|
||||||
(void) hInst;
|
|
||||||
(void) reserved;
|
|
||||||
|
|
||||||
switch (reason)
|
|
||||||
{
|
|
||||||
case DLL_PROCESS_ATTACH:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DLL_PROCESS_DETACH:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DLL_THREAD_ATTACH:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DLL_THREAD_DETACH:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#ifdef VMS
|
|
||||||
int VOID_VAR_DLLINIT;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
34
lib/easy.c
34
lib/easy.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -46,7 +46,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/resource.h>
|
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -200,6 +199,7 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
|
|||||||
long param_long = 0;
|
long param_long = 0;
|
||||||
void *param_obj = NULL;
|
void *param_obj = NULL;
|
||||||
struct SessionHandle *data = curl;
|
struct SessionHandle *data = curl;
|
||||||
|
CURLcode ret=CURLE_FAILED_INIT;
|
||||||
|
|
||||||
va_start(arg, tag);
|
va_start(arg, tag);
|
||||||
|
|
||||||
@@ -213,35 +213,37 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
|
|||||||
if(tag < CURLOPTTYPE_OBJECTPOINT) {
|
if(tag < CURLOPTTYPE_OBJECTPOINT) {
|
||||||
/* This is a LONG type */
|
/* This is a LONG type */
|
||||||
param_long = va_arg(arg, long);
|
param_long = va_arg(arg, long);
|
||||||
Curl_setopt(data, tag, param_long);
|
ret = Curl_setopt(data, tag, param_long);
|
||||||
}
|
}
|
||||||
else if(tag < CURLOPTTYPE_FUNCTIONPOINT) {
|
else if(tag < CURLOPTTYPE_FUNCTIONPOINT) {
|
||||||
/* This is a object pointer type */
|
/* This is a object pointer type */
|
||||||
param_obj = va_arg(arg, void *);
|
param_obj = va_arg(arg, void *);
|
||||||
Curl_setopt(data, tag, param_obj);
|
ret = Curl_setopt(data, tag, param_obj);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
param_func = va_arg(arg, func_T );
|
param_func = va_arg(arg, func_T );
|
||||||
Curl_setopt(data, tag, param_func);
|
ret = Curl_setopt(data, tag, param_func);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
return CURLE_OK;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
CURLcode curl_easy_perform(CURL *curl)
|
CURLcode curl_easy_perform(CURL *curl)
|
||||||
{
|
{
|
||||||
struct SessionHandle *data = (struct SessionHandle *)curl;
|
struct SessionHandle *data = (struct SessionHandle *)curl;
|
||||||
|
|
||||||
if (!data->hostcache) {
|
if (Curl_global_host_cache_use(data) && data->hostcache != Curl_global_host_cache_get()) {
|
||||||
if (Curl_global_host_cache_use(data)) {
|
if (data->hostcache) {
|
||||||
data->hostcache = Curl_global_host_cache_get();
|
Curl_hash_destroy(data->hostcache);
|
||||||
}
|
|
||||||
else {
|
|
||||||
data->hostcache = Curl_hash_alloc(7, Curl_freeaddrinfo);
|
|
||||||
}
|
}
|
||||||
|
data->hostcache = Curl_global_host_cache_get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!data->hostcache) {
|
||||||
|
data->hostcache = Curl_hash_alloc(7, Curl_freednsinfo);
|
||||||
|
}
|
||||||
|
|
||||||
return Curl_perform(data);
|
return Curl_perform(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,11 +333,3 @@ CURL *curl_easy_duphandle(CURL *incurl)
|
|||||||
|
|
||||||
return outcurl;
|
return outcurl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
54
lib/escape.c
54
lib/escape.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
/* The last #include file should be: */
|
/* The last #include file should be: */
|
||||||
#ifdef MALLOCDEBUG
|
#ifdef CURLDEBUG
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -41,6 +41,7 @@ char *curl_escape(const char *string, int length)
|
|||||||
{
|
{
|
||||||
int alloc = (length?length:(int)strlen(string))+1;
|
int alloc = (length?length:(int)strlen(string))+1;
|
||||||
char *ns = malloc(alloc);
|
char *ns = malloc(alloc);
|
||||||
|
char *testing_ptr = NULL;
|
||||||
unsigned char in;
|
unsigned char in;
|
||||||
int newlen = alloc;
|
int newlen = alloc;
|
||||||
int index=0;
|
int index=0;
|
||||||
@@ -55,9 +56,14 @@ char *curl_escape(const char *string, int length)
|
|||||||
newlen += 2; /* the size grows with two, since this'll become a %XX */
|
newlen += 2; /* the size grows with two, since this'll become a %XX */
|
||||||
if(newlen > alloc) {
|
if(newlen > alloc) {
|
||||||
alloc *= 2;
|
alloc *= 2;
|
||||||
ns = realloc(ns, alloc);
|
testing_ptr = realloc(ns, alloc);
|
||||||
if(!ns)
|
if(!testing_ptr) {
|
||||||
|
free( ns );
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ns = testing_ptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sprintf(&ns[index], "%%%02X", in);
|
sprintf(&ns[index], "%%%02X", in);
|
||||||
|
|
||||||
@@ -73,6 +79,10 @@ char *curl_escape(const char *string, int length)
|
|||||||
return ns;
|
return ns;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ishex(in) ((in >= 'a' && in <= 'f') || \
|
||||||
|
(in >= 'A' && in <= 'F') || \
|
||||||
|
(in >= '0' && in <= '9'))
|
||||||
|
|
||||||
char *curl_unescape(const char *string, int length)
|
char *curl_unescape(const char *string, int length)
|
||||||
{
|
{
|
||||||
int alloc = (length?length:(int)strlen(string))+1;
|
int alloc = (length?length:(int)strlen(string))+1;
|
||||||
@@ -80,16 +90,26 @@ char *curl_unescape(const char *string, int length)
|
|||||||
unsigned char in;
|
unsigned char in;
|
||||||
int index=0;
|
int index=0;
|
||||||
unsigned int hex;
|
unsigned int hex;
|
||||||
|
|
||||||
|
if( !ns ) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
while(--alloc > 0) {
|
while(--alloc > 0) {
|
||||||
in = *string;
|
in = *string;
|
||||||
if('%' == in) {
|
if(('%' == in) && ishex(string[1]) && ishex(string[2])) {
|
||||||
/* encoded part */
|
/* this is two hexadecimal digits following a '%' */
|
||||||
if(sscanf(string+1, "%02X", &hex)) {
|
char hexstr[3];
|
||||||
in = hex;
|
char *ptr;
|
||||||
string+=2;
|
hexstr[0] = string[1];
|
||||||
alloc-=2;
|
hexstr[1] = string[2];
|
||||||
}
|
hexstr[2] = 0;
|
||||||
|
|
||||||
|
hex = strtol(hexstr, &ptr, 16);
|
||||||
|
|
||||||
|
in = hex;
|
||||||
|
string+=2;
|
||||||
|
alloc-=2;
|
||||||
}
|
}
|
||||||
|
|
||||||
ns[index++] = in;
|
ns[index++] = in;
|
||||||
@@ -97,18 +117,12 @@ char *curl_unescape(const char *string, int length)
|
|||||||
}
|
}
|
||||||
ns[index]=0; /* terminate it */
|
ns[index]=0; /* terminate it */
|
||||||
return ns;
|
return ns;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* For operating systems/environments that use different malloc/free
|
||||||
|
ssystems for the app and for this library, we provide a free that uses
|
||||||
|
the library's memory system */
|
||||||
void curl_free(void *p)
|
void curl_free(void *p)
|
||||||
{
|
{
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
13
lib/file.c
13
lib/file.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -48,7 +48,6 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#endif
|
#endif
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/resource.h>
|
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -88,7 +87,7 @@
|
|||||||
#include <curl/mprintf.h>
|
#include <curl/mprintf.h>
|
||||||
|
|
||||||
/* The last #include file should be: */
|
/* The last #include file should be: */
|
||||||
#ifdef MALLOCDEBUG
|
#ifdef CURLDEBUG
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -211,12 +210,4 @@ CURLcode Curl_file(struct connectdata *conn)
|
|||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user