Compare commits
1763 Commits
curl-7_21_
...
curl-7_26_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c262c35676 | ||
![]() |
ef60fdbd73 | ||
![]() |
b1f081f6e6 | ||
![]() |
6cc066a2c5 | ||
![]() |
0fd7fa7daf | ||
![]() |
9258b84673 | ||
![]() |
fdf2517bd9 | ||
![]() |
cc36756aa2 | ||
![]() |
1c58f291cc | ||
![]() |
8ae1e657e8 | ||
![]() |
7ba07c80a1 | ||
![]() |
fec096f153 | ||
![]() |
499ffe2f8c | ||
![]() |
cf41ee3ac9 | ||
![]() |
e315927a1a | ||
![]() |
03c1bcf4bd | ||
![]() |
92f841aef7 | ||
![]() |
9fafa68533 | ||
![]() |
e7257dcf2e | ||
![]() |
3ebcfdda36 | ||
![]() |
77bac26587 | ||
![]() |
d6773834f2 | ||
![]() |
6f998400d9 | ||
![]() |
64f48e884e | ||
![]() |
e146a5f132 | ||
![]() |
1beda0cbb7 | ||
![]() |
72b72fe8ed | ||
![]() |
bd9eb30ffd | ||
![]() |
dd18e714ff | ||
![]() |
d6c449e3b4 | ||
![]() |
071f8d4182 | ||
![]() |
d83233501f | ||
![]() |
419a50f817 | ||
![]() |
975d23480c | ||
![]() |
13211705cd | ||
![]() |
9ec0b7e0c4 | ||
![]() |
412510f974 | ||
![]() |
683bfa60ad | ||
![]() |
77172a242f | ||
![]() |
46cd5f1dad | ||
![]() |
2976de4808 | ||
![]() |
560cd62272 | ||
![]() |
0f54880277 | ||
![]() |
5cd524df18 | ||
![]() |
94111bbbd4 | ||
![]() |
df4205c10a | ||
![]() |
9421b06397 | ||
![]() |
09690be8de | ||
![]() |
ce8a321dd0 | ||
![]() |
3833765ba5 | ||
![]() |
4d28a59fc2 | ||
![]() |
a498daa0e0 | ||
![]() |
bd12c44d35 | ||
![]() |
4c385cf896 | ||
![]() |
7d4ed0b10e | ||
![]() |
48d13b44c6 | ||
![]() |
8b63b48627 | ||
![]() |
b9ac64c2cb | ||
![]() |
4d2c3f0a4d | ||
![]() |
c156b916a4 | ||
![]() |
865893fb14 | ||
![]() |
a60edcc6d4 | ||
![]() |
20cb12db8d | ||
![]() |
42aa796150 | ||
![]() |
2a902738fb | ||
![]() |
bb5d4234e3 | ||
![]() |
930781e168 | ||
![]() |
1c3a99b52c | ||
![]() |
5f04843e5b | ||
![]() |
8c29bf5640 | ||
![]() |
82306ebfba | ||
![]() |
03d4b9f078 | ||
![]() |
51114f07f1 | ||
![]() |
e19917296f | ||
![]() |
8ed40acac6 | ||
![]() |
38ae6ec1a2 | ||
![]() |
9e24b9c7af | ||
![]() |
a144bb8b76 | ||
![]() |
4d3fb91fb4 | ||
![]() |
bbfe118209 | ||
![]() |
e5c14674f0 | ||
![]() |
6dba7608bf | ||
![]() |
21423497ef | ||
![]() |
01b0f1061d | ||
![]() |
3d8c093145 | ||
![]() |
919c97fa65 | ||
![]() |
376b4d48fe | ||
![]() |
118e73306d | ||
![]() |
1dd69921d3 | ||
![]() |
29e68b200c | ||
![]() |
0b516b7162 | ||
![]() |
a0b3535735 | ||
![]() |
5e852ab9d1 | ||
![]() |
f9bb5d2984 | ||
![]() |
ad595c3ba9 | ||
![]() |
7031ff23bb | ||
![]() |
9753c6bec5 | ||
![]() |
b16e3da12a | ||
![]() |
e7661d198f | ||
![]() |
13c7b91133 | ||
![]() |
950b0b770e | ||
![]() |
15e1227ed4 | ||
![]() |
ddfe821bcf | ||
![]() |
54866b68cd | ||
![]() |
05a443adf2 | ||
![]() |
ebf315e6f3 | ||
![]() |
c44d45db86 | ||
![]() |
7a2647e162 | ||
![]() |
9bae9ddad9 | ||
![]() |
004d7251ab | ||
![]() |
33d044a862 | ||
![]() |
a9086e8a4b | ||
![]() |
761c3c5446 | ||
![]() |
66c0e26e28 | ||
![]() |
7d1b715605 | ||
![]() |
9f494fe423 | ||
![]() |
809c809281 | ||
![]() |
0580b60622 | ||
![]() |
4bdb664c33 | ||
![]() |
459435dca1 | ||
![]() |
3fdb7808ef | ||
![]() |
97ff646fc1 | ||
![]() |
9801596fb3 | ||
![]() |
982315573c | ||
![]() |
9f96e6da28 | ||
![]() |
01690ed2bc | ||
![]() |
2da89708ec | ||
![]() |
5c62a551c4 | ||
![]() |
602a8a565c | ||
![]() |
c4a8446c70 | ||
![]() |
456d8db35e | ||
![]() |
e952a7e710 | ||
![]() |
682f0840e7 | ||
![]() |
f85ec43f24 | ||
![]() |
b5713887ae | ||
![]() |
c1babfad8a | ||
![]() |
b8b2cf612b | ||
![]() |
fe93b0a874 | ||
![]() |
e8a32438c2 | ||
![]() |
97b66ebefe | ||
![]() |
d2e5222ebc | ||
![]() |
3aab542e77 | ||
![]() |
3c80309c27 | ||
![]() |
c83de6d076 | ||
![]() |
805788e043 | ||
![]() |
dddcd3b042 | ||
![]() |
c6825b7a6b | ||
![]() |
e6a89cb6c4 | ||
![]() |
fe7613932e | ||
![]() |
ffb67599b3 | ||
![]() |
47236d89c0 | ||
![]() |
ad77420ac7 | ||
![]() |
804da995c5 | ||
![]() |
ede9ad43fc | ||
![]() |
0c8e36c18a | ||
![]() |
862bb7bade | ||
![]() |
b329fc7023 | ||
![]() |
8af4b657d0 | ||
![]() |
97386c3c84 | ||
![]() |
e25590a2b3 | ||
![]() |
79afcbefb4 | ||
![]() |
e650dbde86 | ||
![]() |
b50e9e9e9e | ||
![]() |
9f0e1689f1 | ||
![]() |
f7e2ab629e | ||
![]() |
2764bf2c5b | ||
![]() |
41b0237834 | ||
![]() |
cabd010dd4 | ||
![]() |
c55a0809bb | ||
![]() |
4ee2df4b46 | ||
![]() |
4d71d1b17f | ||
![]() |
d185960a6d | ||
![]() |
79b6f4a2d3 | ||
![]() |
5430007222 | ||
![]() |
779fa13ef9 | ||
![]() |
1a7bba1975 | ||
![]() |
21130dab4f | ||
![]() |
c3cae332c5 | ||
![]() |
9954242980 | ||
![]() |
2f1ad7d6e2 | ||
![]() |
30c44edad3 | ||
![]() |
77a21ff623 | ||
![]() |
035ef06bda | ||
![]() |
3d98aed5b3 | ||
![]() |
4cf742f34f | ||
![]() |
4bf3131979 | ||
![]() |
5c409d03ec | ||
![]() |
a053560cfa | ||
![]() |
674699b212 | ||
![]() |
154c0d4b93 | ||
![]() |
b685481d52 | ||
![]() |
0cf0ab6f30 | ||
![]() |
ee7e4fc1d1 | ||
![]() |
0201280533 | ||
![]() |
69406f0be7 | ||
![]() |
ea4ceca222 | ||
![]() |
714accd090 | ||
![]() |
35e965c9a0 | ||
![]() |
2b26eb9857 | ||
![]() |
e71ac0c6fa | ||
![]() |
7ed25fcc5c | ||
![]() |
ecc93caaeb | ||
![]() |
ebf3138992 | ||
![]() |
8ef8a2b5ac | ||
![]() |
62d15f159e | ||
![]() |
2a699bc6e9 | ||
![]() |
2a266c1c7c | ||
![]() |
705f0f7a5b | ||
![]() |
ea055407fa | ||
![]() |
4405039fdc | ||
![]() |
65103efe49 | ||
![]() |
466150bc64 | ||
![]() |
f710aa40b3 | ||
![]() |
f4d3c0cbfb | ||
![]() |
4d2737bcb2 | ||
![]() |
8ee2576b6f | ||
![]() |
575f3c30ed | ||
![]() |
cf9fb08ca4 | ||
![]() |
5a53409e2c | ||
![]() |
e277d3b52b | ||
![]() |
93e344bbf4 | ||
![]() |
75b6f7d9ef | ||
![]() |
a8e063b087 | ||
![]() |
70f71bb99f | ||
![]() |
c11c30a8c8 | ||
![]() |
75ca568fa1 | ||
![]() |
db1a856b4f | ||
![]() |
ee57e9dea6 | ||
![]() |
6e2fd2c9ea | ||
![]() |
5d7a319a55 | ||
![]() |
7883cd5af3 | ||
![]() |
d7af7de5b2 | ||
![]() |
a7e8f4aabc | ||
![]() |
e64d332e79 | ||
![]() |
00e615de7e | ||
![]() |
b2aaf3c2ad | ||
![]() |
c41f304c43 | ||
![]() |
d56b4c3f89 | ||
![]() |
d1becc3231 | ||
![]() |
f55f95d49c | ||
![]() |
61d31a3caf | ||
![]() |
4b9af77d54 | ||
![]() |
5d70a61b94 | ||
![]() |
51c485342b | ||
![]() |
4563eeb9f4 | ||
![]() |
2cafb0e97c | ||
![]() |
6ea7acf5a9 | ||
![]() |
a20daf90e3 | ||
![]() |
24526d0c0f | ||
![]() |
a752850acc | ||
![]() |
2b9fafd622 | ||
![]() |
0ce2bca741 | ||
![]() |
b15024be4d | ||
![]() |
21401840fa | ||
![]() |
e3e24e5b36 | ||
![]() |
18c6c8a5e7 | ||
![]() |
c731fc58ea | ||
![]() |
6d62c5a6fc | ||
![]() |
f1092b387e | ||
![]() |
8e82ef9c32 | ||
![]() |
d016f5f5f5 | ||
![]() |
d4bf87dc0e | ||
![]() |
54dede4166 | ||
![]() |
9f20379fe4 | ||
![]() |
123c92c904 | ||
![]() |
d28411c3cc | ||
![]() |
2705af6267 | ||
![]() |
f34ddb90e6 | ||
![]() |
dd69a3e868 | ||
![]() |
812fa73057 | ||
![]() |
52824ed1ab | ||
![]() |
4897f4e517 | ||
![]() |
81524cbfa0 | ||
![]() |
8ef7a5706e | ||
![]() |
c358bab809 | ||
![]() |
4bc6c1a026 | ||
![]() |
3a55daee3d | ||
![]() |
7bd2add06f | ||
![]() |
3b06f1fb36 | ||
![]() |
db4f69ef06 | ||
![]() |
277022b2e4 | ||
![]() |
0f8239d5b4 | ||
![]() |
a4202be655 | ||
![]() |
2f4a487a68 | ||
![]() |
82180643f4 | ||
![]() |
585b89a6c3 | ||
![]() |
cc69e56ce3 | ||
![]() |
8e25d1b93b | ||
![]() |
63e2718f8d | ||
![]() |
7f472618de | ||
![]() |
08107111ac | ||
![]() |
a3403db02f | ||
![]() |
c9a3cab6c4 | ||
![]() |
f4949e56eb | ||
![]() |
81ebdd9e28 | ||
![]() |
207cf15032 | ||
![]() |
5e0a44e4d5 | ||
![]() |
9e3f8c4850 | ||
![]() |
90343c76c6 | ||
![]() |
ecd75e8cb8 | ||
![]() |
e63c9f8ff3 | ||
![]() |
ed0364343d | ||
![]() |
5c0ad9581d | ||
![]() |
e99128a5c9 | ||
![]() |
33c2e1cafc | ||
![]() |
84f736981c | ||
![]() |
82c344a347 | ||
![]() |
9f7f6a62ff | ||
![]() |
98292bcdd0 | ||
![]() |
996f2454ba | ||
![]() |
99a12baa34 | ||
![]() |
4f8db8bf95 | ||
![]() |
5ac9ec7205 | ||
![]() |
f8cd217f04 | ||
![]() |
84e7ea2ffc | ||
![]() |
2caa454dc1 | ||
![]() |
3e4181f88e | ||
![]() |
e71e226f6b | ||
![]() |
b0eb963bc7 | ||
![]() |
2cf9e78a22 | ||
![]() |
430527a1d7 | ||
![]() |
1afbccc676 | ||
![]() |
1dd654644a | ||
![]() |
ba238e3a18 | ||
![]() |
4bb140bfc9 | ||
![]() |
926916e28e | ||
![]() |
3d6e2ec925 | ||
![]() |
380bade777 | ||
![]() |
26ce3ac328 | ||
![]() |
130fac6c16 | ||
![]() |
6222ef8052 | ||
![]() |
b06ed249d2 | ||
![]() |
377471f387 | ||
![]() |
dfdac61522 | ||
![]() |
c834213ad5 | ||
![]() |
5527417afa | ||
![]() |
bedfafe38e | ||
![]() |
e9040f2954 | ||
![]() |
51d4885ca0 | ||
![]() |
ce896875f8 | ||
![]() |
eb6e9593c4 | ||
![]() |
5c71544fc6 | ||
![]() |
7799ac434e | ||
![]() |
7cc2e8b349 | ||
![]() |
3c18b38dcc | ||
![]() |
1fc5cd6a1a | ||
![]() |
af9bc1604c | ||
![]() |
b235d5ade8 | ||
![]() |
ee3d3adc6f | ||
![]() |
583a902789 | ||
![]() |
7b8590d1f5 | ||
![]() |
9b185aac43 | ||
![]() |
34f9ec0c54 | ||
![]() |
7111ca6f5f | ||
![]() |
612a61b267 | ||
![]() |
cd4cd66839 | ||
![]() |
4c4e8ba1f0 | ||
![]() |
de6f4f356e | ||
![]() |
66c5076252 | ||
![]() |
b9b772fefe | ||
![]() |
07efe110cc | ||
![]() |
6e4835c795 | ||
![]() |
ba057c2e19 | ||
![]() |
1259ccf747 | ||
![]() |
07e3b7512c | ||
![]() |
50d88bf4b5 | ||
![]() |
1cacf853da | ||
![]() |
9dbe6565d4 | ||
![]() |
2b24dd870e | ||
![]() |
46724b87b7 | ||
![]() |
82a4d26e7f | ||
![]() |
2b0e09b0f9 | ||
![]() |
361cd03d58 | ||
![]() |
7e4daaf908 | ||
![]() |
3bbe219be2 | ||
![]() |
347f951c39 | ||
![]() |
c50dbf670f | ||
![]() |
0cf05af744 | ||
![]() |
d5b5f64bce | ||
![]() |
088ba97a24 | ||
![]() |
9109cdec11 | ||
![]() |
5971d401d4 | ||
![]() |
62d3652b43 | ||
![]() |
d81f5ea3e0 | ||
![]() |
adc88ca203 | ||
![]() |
83350c9cc4 | ||
![]() |
bdb647814e | ||
![]() |
c92234c3bc | ||
![]() |
7e02f7fdee | ||
![]() |
bd94807003 | ||
![]() |
1038d0aa16 | ||
![]() |
f80a508297 | ||
![]() |
af64666434 | ||
![]() |
2d72489f0f | ||
![]() |
dda815b776 | ||
![]() |
8d3efb6be0 | ||
![]() |
11e52ef0a1 | ||
![]() |
71ce2470dc | ||
![]() |
874855b743 | ||
![]() |
ac54d27d4b | ||
![]() |
2d833852f6 | ||
![]() |
0604b2fb90 | ||
![]() |
8f50a5c7e5 | ||
![]() |
703fa0a6a8 | ||
![]() |
97d7a9260e | ||
![]() |
4a4d04446d | ||
![]() |
b9223a17b8 | ||
![]() |
f712ace9d7 | ||
![]() |
2c905fd1f8 | ||
![]() |
4403e82f32 | ||
![]() |
c482e946f7 | ||
![]() |
46bd8b330a | ||
![]() |
78feaff9d8 | ||
![]() |
28bac99674 | ||
![]() |
7248439fec | ||
![]() |
c532604b13 | ||
![]() |
64f328c787 | ||
![]() |
c0db5ff678 | ||
![]() |
66617b79d7 | ||
![]() |
f64812ca63 | ||
![]() |
10ecdf5078 | ||
![]() |
bb4eb58996 | ||
![]() |
fc8809f993 | ||
![]() |
35f61c404d | ||
![]() |
97b73fec7a | ||
![]() |
8d0a504f0d | ||
![]() |
967b2f87a8 | ||
![]() |
b9660dc4b2 | ||
![]() |
591c29aa49 | ||
![]() |
5e0aa3aac9 | ||
![]() |
7cfd10e255 | ||
![]() |
95ddbdb1db | ||
![]() |
6c4216b2a7 | ||
![]() |
10120e6ab5 | ||
![]() |
082e8a3b03 | ||
![]() |
fd765c627f | ||
![]() |
c8ffb4049a | ||
![]() |
e3166df1bb | ||
![]() |
06a83e8050 | ||
![]() |
2c09d21fdf | ||
![]() |
4851dafcf1 | ||
![]() |
73029dca5a | ||
![]() |
5b57c54416 | ||
![]() |
7fe9a50ab5 | ||
![]() |
6fa6567b92 | ||
![]() |
93e57d0628 | ||
![]() |
a873b95c21 | ||
![]() |
6bdeca967d | ||
![]() |
3f5e267b9d | ||
![]() |
f7dfe2b87a | ||
![]() |
af425efe83 | ||
![]() |
9cfc0c73a7 | ||
![]() |
49e3b2e03a | ||
![]() |
8bfc3a800a | ||
![]() |
b24c28e6c2 | ||
![]() |
0b315c1cf1 | ||
![]() |
e2928e1555 | ||
![]() |
f5bb370186 | ||
![]() |
bae4e3f035 | ||
![]() |
3676ec9680 | ||
![]() |
8ccf7bf8d7 | ||
![]() |
c761fcb055 | ||
![]() |
ddeab48245 | ||
![]() |
b0d42da26b | ||
![]() |
120025b7f8 | ||
![]() |
692f344118 | ||
![]() |
51e5a2bf3f | ||
![]() |
8165e05f29 | ||
![]() |
4c88866737 | ||
![]() |
4464583a6e | ||
![]() |
22502c9550 | ||
![]() |
39c6d18d9c | ||
![]() |
f4405d30e0 | ||
![]() |
e8d8843a02 | ||
![]() |
134e87c53b | ||
![]() |
515f11e79b | ||
![]() |
5850cc4808 | ||
![]() |
c295565569 | ||
![]() |
e771344611 | ||
![]() |
a4471045bb | ||
![]() |
cc76bbe79b | ||
![]() |
d7934b8bd4 | ||
![]() |
d67b75c9f9 | ||
![]() |
95d23d1ceb | ||
![]() |
a4758c3276 | ||
![]() |
9d0d1ada05 | ||
![]() |
629d2e3450 | ||
![]() |
90fcad63cb | ||
![]() |
1399c3da0d | ||
![]() |
ff0a295cdb | ||
![]() |
4fa0166173 | ||
![]() |
adaa3f6e14 | ||
![]() |
cf0f6729e7 | ||
![]() |
8036da870c | ||
![]() |
2621dd42a4 | ||
![]() |
2c8c46619b | ||
![]() |
ecbb08cea3 | ||
![]() |
491c5a497c | ||
![]() |
06e6755e87 | ||
![]() |
052a08ff59 | ||
![]() |
f6980bbf24 | ||
![]() |
d47d95ac3b | ||
![]() |
b229c8ca8b | ||
![]() |
337252bdd4 | ||
![]() |
840eff44f2 | ||
![]() |
ff03ee2a3c | ||
![]() |
62bcf005f4 | ||
![]() |
1a416cd27a | ||
![]() |
54ef47a5a0 | ||
![]() |
8af94de50a | ||
![]() |
1bab38780b | ||
![]() |
fd10c047df | ||
![]() |
ea12c72d12 | ||
![]() |
47e4537ac6 | ||
![]() |
03adff1eba | ||
![]() |
34770b8ab0 | ||
![]() |
880cf0bedc | ||
![]() |
bff78cc18e | ||
![]() |
584dc8b8af | ||
![]() |
a84b8a3922 | ||
![]() |
acaf466401 | ||
![]() |
71c9453393 | ||
![]() |
17f48fe879 | ||
![]() |
b82bd05354 | ||
![]() |
1958fe5745 | ||
![]() |
f7bfdbabf2 | ||
![]() |
7afccf7a1e | ||
![]() |
4a57bf6d10 | ||
![]() |
7296b2aa25 | ||
![]() |
6c849321d7 | ||
![]() |
0f19e0145a | ||
![]() |
ec73fd89ed | ||
![]() |
5bf0d74120 | ||
![]() |
fd87d9d2b9 | ||
![]() |
0572ad6d01 | ||
![]() |
aa7d5b946a | ||
![]() |
49b79b7631 | ||
![]() |
ca2c326361 | ||
![]() |
5c809178c2 | ||
![]() |
fa77f54a03 | ||
![]() |
bc007d8ef5 | ||
![]() |
d0dbd1e98e | ||
![]() |
4d327d20c6 | ||
![]() |
185ed3409a | ||
![]() |
d54bcebad4 | ||
![]() |
0435800f65 | ||
![]() |
56ed07f7df | ||
![]() |
381459fa65 | ||
![]() |
15e3e45170 | ||
![]() |
9dd85bced5 | ||
![]() |
5d45285cf3 | ||
![]() |
3d19e1eedf | ||
![]() |
7be872c389 | ||
![]() |
0c903ea189 | ||
![]() |
affed6725e | ||
![]() |
7f304ab84f | ||
![]() |
e709cc8627 | ||
![]() |
db060304de | ||
![]() |
5898a6a09b | ||
![]() |
57fffa728b | ||
![]() |
421a460278 | ||
![]() |
5793bc370c | ||
![]() |
ff5ba6e43d | ||
![]() |
9f2f8d5122 | ||
![]() |
bd158607ca | ||
![]() |
a2d4a98ddd | ||
![]() |
b4fccc1d8e | ||
![]() |
e2be8ceed9 | ||
![]() |
d439830621 | ||
![]() |
f4853db5e6 | ||
![]() |
d9f686db88 | ||
![]() |
a1087db5c6 | ||
![]() |
400055bfaa | ||
![]() |
5801ddb85c | ||
![]() |
38b5744266 | ||
![]() |
bc28a35dbc | ||
![]() |
d2a47021c0 | ||
![]() |
119f43360b | ||
![]() |
e276802ff8 | ||
![]() |
2d6796aac5 | ||
![]() |
bb94b92894 | ||
![]() |
230459dd00 | ||
![]() |
745014b726 | ||
![]() |
b3ea4881a8 | ||
![]() |
c6702c7d3f | ||
![]() |
8bab6700d9 | ||
![]() |
081e289315 | ||
![]() |
5f0764870f | ||
![]() |
87a45c7998 | ||
![]() |
dafa2fc944 | ||
![]() |
ef3f1f3146 | ||
![]() |
ba52e0a93b | ||
![]() |
40c27e299f | ||
![]() |
fa775b56de | ||
![]() |
fb3845a438 | ||
![]() |
3c3aa09c65 | ||
![]() |
01c172f5e8 | ||
![]() |
e9cf4cb791 | ||
![]() |
322f3d5af7 | ||
![]() |
c1057fc9aa | ||
![]() |
62b0fdca9e | ||
![]() |
3317160c19 | ||
![]() |
28526ed6e0 | ||
![]() |
e4172d934d | ||
![]() |
977825a68c | ||
![]() |
a6b69b64ad | ||
![]() |
9ecf53e154 | ||
![]() |
84221006c9 | ||
![]() |
a6c168b893 | ||
![]() |
dee7a08f64 | ||
![]() |
cd3cf55b47 | ||
![]() |
98a61d8e2e | ||
![]() |
81b41095ef | ||
![]() |
49c35a7f9f | ||
![]() |
57119495da | ||
![]() |
fdecb56cbf | ||
![]() |
00532341b5 | ||
![]() |
dae0b7d1aa | ||
![]() |
42be24af89 | ||
![]() |
260b0f4d0c | ||
![]() |
f50d4647d0 | ||
![]() |
805b4740c7 | ||
![]() |
a75888f1d3 | ||
![]() |
b4b642eb45 | ||
![]() |
c0159d0edc | ||
![]() |
93579cc363 | ||
![]() |
4322d512ea | ||
![]() |
e4819ae1ef | ||
![]() |
43c59765e1 | ||
![]() |
e533f59025 | ||
![]() |
e6697ef59c | ||
![]() |
ff9d858722 | ||
![]() |
f7583b2dea | ||
![]() |
6b33873c57 | ||
![]() |
90080da5fe | ||
![]() |
0216e517d0 | ||
![]() |
aff70e2e95 | ||
![]() |
6790a543d4 | ||
![]() |
2411adb40b | ||
![]() |
d52cd3bd17 | ||
![]() |
64c613c27a | ||
![]() |
73b18a9d24 | ||
![]() |
1bac153ea3 | ||
![]() |
432044b774 | ||
![]() |
9dfd7a3d13 | ||
![]() |
deb3321092 | ||
![]() |
68253ca52e | ||
![]() |
50c3c20416 | ||
![]() |
4e9a1c5bba | ||
![]() |
587ed3234b | ||
![]() |
94d64f8d4c | ||
![]() |
0d3584c482 | ||
![]() |
2a9fec16cc | ||
![]() |
777f9aea13 | ||
![]() |
72c14bd6f0 | ||
![]() |
0413e24891 | ||
![]() |
be8e68494c | ||
![]() |
a7d8894291 | ||
![]() |
08a5a9b68d | ||
![]() |
303c90074d | ||
![]() |
443ab77e1f | ||
![]() |
7b7c45879e | ||
![]() |
81ead2c4e7 | ||
![]() |
28d09cb0f5 | ||
![]() |
2147492050 | ||
![]() |
58a7c51362 | ||
![]() |
450975b0c3 | ||
![]() |
5658aa9574 | ||
![]() |
6539047694 | ||
![]() |
774ad4e31d | ||
![]() |
f764da8afb | ||
![]() |
c8ba8740b9 | ||
![]() |
46df51a391 | ||
![]() |
e9e894905c | ||
![]() |
a50210710a | ||
![]() |
eb44ac0138 | ||
![]() |
d52f3eb598 | ||
![]() |
8e154225b5 | ||
![]() |
196e0d699f | ||
![]() |
809cde5416 | ||
![]() |
476f194d7f | ||
![]() |
bdc311cf98 | ||
![]() |
a405a8976d | ||
![]() |
6b75d2c2df | ||
![]() |
2be65bb0c5 | ||
![]() |
f02325ea65 | ||
![]() |
b98594c8bf | ||
![]() |
ded3638d97 | ||
![]() |
9194e17003 | ||
![]() |
749dbfbc87 | ||
![]() |
6b59bc1805 | ||
![]() |
0a5bbb2ac1 | ||
![]() |
f2285a6d39 | ||
![]() |
fdf157abdf | ||
![]() |
437848d754 | ||
![]() |
38fff918f9 | ||
![]() |
5ea65fbc79 | ||
![]() |
0b018a0a05 | ||
![]() |
d20408e816 | ||
![]() |
c06de20025 | ||
![]() |
e495f82f86 | ||
![]() |
3445fa2e3f | ||
![]() |
5a45dc4a29 | ||
![]() |
78199b6030 | ||
![]() |
05ef245170 | ||
![]() |
662c1d87f3 | ||
![]() |
135f694058 | ||
![]() |
260ee6b7bf | ||
![]() |
b976d108f1 | ||
![]() |
b4f6319cf7 | ||
![]() |
e18c3f447e | ||
![]() |
0fd2bf3726 | ||
![]() |
407e08baad | ||
![]() |
186463e7fa | ||
![]() |
d535cff775 | ||
![]() |
f5ad192d23 | ||
![]() |
e83421baf4 | ||
![]() |
aa5c72af15 | ||
![]() |
b9c63b9a73 | ||
![]() |
cb5e72bf62 | ||
![]() |
e882416e75 | ||
![]() |
fd00b382b2 | ||
![]() |
cce6508242 | ||
![]() |
af809923e4 | ||
![]() |
006b011cdf | ||
![]() |
a659cc4794 | ||
![]() |
1c400b4e5e | ||
![]() |
61ae7e9ce7 | ||
![]() |
838dd8f594 | ||
![]() |
aaab5fa299 | ||
![]() |
2d7c79af76 | ||
![]() |
38c5e81a67 | ||
![]() |
3af9ba166c | ||
![]() |
7b054a42aa | ||
![]() |
b998d95b4d | ||
![]() |
d44896508c | ||
![]() |
9afb343368 | ||
![]() |
1833984664 | ||
![]() |
31a1af5ebb | ||
![]() |
9710f387c4 | ||
![]() |
4ed7abb537 | ||
![]() |
ef2059a44c | ||
![]() |
93ba8b9560 | ||
![]() |
ade87b32c7 | ||
![]() |
d6f319fb64 | ||
![]() |
b9d5e72adc | ||
![]() |
6a7ce5cc76 | ||
![]() |
7d738baeb5 | ||
![]() |
44b44a751d | ||
![]() |
2828b8ef9e | ||
![]() |
e575cbc815 | ||
![]() |
f0c59c6c2c | ||
![]() |
dfb18da5dc | ||
![]() |
0c4ec8033b | ||
![]() |
dc4f9d185d | ||
![]() |
98fb0ef73e | ||
![]() |
08b05efd20 | ||
![]() |
b4d6db83de | ||
![]() |
e209f3f176 | ||
![]() |
a30ede868a | ||
![]() |
40afeea2fb | ||
![]() |
e40c663d36 | ||
![]() |
c8766ed3fb | ||
![]() |
1e4187f8bf | ||
![]() |
8bd877d179 | ||
![]() |
5538904d77 | ||
![]() |
a472ceb174 | ||
![]() |
092189c664 | ||
![]() |
301e907aed | ||
![]() |
3293150da2 | ||
![]() |
784971743d | ||
![]() |
448f982d54 | ||
![]() |
f396d94736 | ||
![]() |
657d02fbac | ||
![]() |
8e2de86723 | ||
![]() |
4b48adb876 | ||
![]() |
c7fb556f26 | ||
![]() |
5ed17de326 | ||
![]() |
209cf2df37 | ||
![]() |
7c21c1c4f9 | ||
![]() |
f8831d55e0 | ||
![]() |
43d2c66454 | ||
![]() |
27dbc3f526 | ||
![]() |
9f10dabc43 | ||
![]() |
45d883d88d | ||
![]() |
3ef6418b61 | ||
![]() |
56ef3e295f | ||
![]() |
3dcc0df5cc | ||
![]() |
da3ae20da5 | ||
![]() |
73548e1d22 | ||
![]() |
56a0635216 | ||
![]() |
967deb43f8 | ||
![]() |
3d919440c8 | ||
![]() |
339fef4440 | ||
![]() |
15379f0614 | ||
![]() |
f2a6373629 | ||
![]() |
2ccffbb37e | ||
![]() |
1db023d3cb | ||
![]() |
91ad42412f | ||
![]() |
7d69e31023 | ||
![]() |
704dc18440 | ||
![]() |
b0f18c4beb | ||
![]() |
40e1d03c5d | ||
![]() |
c95fec5e5b | ||
![]() |
817b863466 | ||
![]() |
f6272dd9b8 | ||
![]() |
40597fd942 | ||
![]() |
f0fae85acd | ||
![]() |
e1f3536bac | ||
![]() |
afe88d85f4 | ||
![]() |
17f343290c | ||
![]() |
75fa3d2d6e | ||
![]() |
9812446c65 | ||
![]() |
5eb2396cd1 | ||
![]() |
86b50a1fe5 | ||
![]() |
8f890470f1 | ||
![]() |
a6ed2b8426 | ||
![]() |
b56bbabee0 | ||
![]() |
a04912bb65 | ||
![]() |
519d0c0dd2 | ||
![]() |
d2c22411af | ||
![]() |
c4142034ff | ||
![]() |
efc8ef7cc4 | ||
![]() |
b698f90051 | ||
![]() |
ddf0b30ffd | ||
![]() |
a7864c41db | ||
![]() |
ebf42c4be7 | ||
![]() |
7688a99bef | ||
![]() |
10a0bed485 | ||
![]() |
cc3e01cfae | ||
![]() |
65cc163195 | ||
![]() |
9417e71f4a | ||
![]() |
bc6e6a465a | ||
![]() |
ad8193fbb9 | ||
![]() |
bcbac913d6 | ||
![]() |
5cdbfa1837 | ||
![]() |
c01c000b16 | ||
![]() |
35051d274f | ||
![]() |
9779553221 | ||
![]() |
435e2bc757 | ||
![]() |
99848d3dab | ||
![]() |
02e59579ef | ||
![]() |
dddf9aa610 | ||
![]() |
4eb08ac1c0 | ||
![]() |
6ac4eeab2f | ||
![]() |
8350fb8f2f | ||
![]() |
cfcca89b76 | ||
![]() |
41c6c78a08 | ||
![]() |
78bbd0eecf | ||
![]() |
f1586cb477 | ||
![]() |
983f3d70f9 | ||
![]() |
0337b87197 | ||
![]() |
0a26b0e3e7 | ||
![]() |
ef2176109f | ||
![]() |
27b8814017 | ||
![]() |
dcc8481a13 | ||
![]() |
3f9b4afdfd | ||
![]() |
d007c3ca76 | ||
![]() |
0ae15092d4 | ||
![]() |
b9313af838 | ||
![]() |
d0d36f312f | ||
![]() |
d95f45cd40 | ||
![]() |
177fd0a14c | ||
![]() |
aa26c2751a | ||
![]() |
a6d4807d02 | ||
![]() |
650a504b2f | ||
![]() |
e3a9804d3a | ||
![]() |
9c1f50c583 | ||
![]() |
6e3285d5b1 | ||
![]() |
44b5847237 | ||
![]() |
ee4ed46128 | ||
![]() |
2af0287856 | ||
![]() |
20485a4885 | ||
![]() |
6488e03f44 | ||
![]() |
b680fd180b | ||
![]() |
dc97475ded | ||
![]() |
c6e3081090 | ||
![]() |
902d3dc33d | ||
![]() |
c7a4df16e0 | ||
![]() |
bcf50283fc | ||
![]() |
3e16c3e73e | ||
![]() |
3e71ebe4eb | ||
![]() |
bfca0e2f50 | ||
![]() |
2e2e5f247a | ||
![]() |
ac28971aa6 | ||
![]() |
fb48e2050b | ||
![]() |
78480892cd | ||
![]() |
b7e242de0e | ||
![]() |
17a2d70dc4 | ||
![]() |
43ce5580a8 | ||
![]() |
0215f7cb4d | ||
![]() |
67f28662e1 | ||
![]() |
57d51be60c | ||
![]() |
8da5da9b65 | ||
![]() |
42c6b7577f | ||
![]() |
e5010ec3ff | ||
![]() |
5c314c6bb4 | ||
![]() |
9016958aa8 | ||
![]() |
1614dc0745 | ||
![]() |
af6dcc92d5 | ||
![]() |
57064e4a0d | ||
![]() |
d9e71809cb | ||
![]() |
a7cc54a5a8 | ||
![]() |
c9a82f39e2 | ||
![]() |
e4bca6a01c | ||
![]() |
56e5302b53 | ||
![]() |
4cbc6fc6ab | ||
![]() |
c9f16e67ef | ||
![]() |
f851f76857 | ||
![]() |
0126b4a959 | ||
![]() |
49a8fe5142 | ||
![]() |
8fc4be9e7b | ||
![]() |
70eee054f2 | ||
![]() |
0aedccc18a | ||
![]() |
85881f9f35 | ||
![]() |
84e13f2e07 | ||
![]() |
832e827518 | ||
![]() |
a6fa7fc38e | ||
![]() |
b122f8be61 | ||
![]() |
950fb3efcc | ||
![]() |
ee015947d4 | ||
![]() |
a2a2863306 | ||
![]() |
b688f2c260 | ||
![]() |
c4dd8df081 | ||
![]() |
0f7bea7c3a | ||
![]() |
d5cc77b744 | ||
![]() |
36a22f9074 | ||
![]() |
6e0dd48f97 | ||
![]() |
cb2f300364 | ||
![]() |
7530a28878 | ||
![]() |
e8d73c9c2d | ||
![]() |
8a3c0fe56c | ||
![]() |
f551aa5c16 | ||
![]() |
377f88364e | ||
![]() |
c0b9dd27b5 | ||
![]() |
6aff805942 | ||
![]() |
b772f3a321 | ||
![]() |
7559b77727 | ||
![]() |
4f170ee8f9 | ||
![]() |
fba00c9f7b | ||
![]() |
10a7d05be3 | ||
![]() |
9776f3445d | ||
![]() |
adeac15d8e | ||
![]() |
5d4e5593d5 | ||
![]() |
c2eb8c932d | ||
![]() |
a6f14e17b7 | ||
![]() |
b3740f0e09 | ||
![]() |
2a31dde76c | ||
![]() |
bf749bb2c5 | ||
![]() |
65a9fa59dc | ||
![]() |
9eea43dce2 | ||
![]() |
910d7953aa | ||
![]() |
970117ef2d | ||
![]() |
aa76dec33a | ||
![]() |
d6bb8dcc23 | ||
![]() |
685359d4c3 | ||
![]() |
a689072f33 | ||
![]() |
3d64ed25df | ||
![]() |
ecfe0b5b18 | ||
![]() |
9460896cbe | ||
![]() |
a87102c792 | ||
![]() |
2e7a2027f1 | ||
![]() |
ae677edf90 | ||
![]() |
f5d78919af | ||
![]() |
f3d77f772d | ||
![]() |
7dd449d843 | ||
![]() |
f461c6e61d | ||
![]() |
3c9ff41a1f | ||
![]() |
c8c8816a97 | ||
![]() |
5d39dea3b3 | ||
![]() |
9f390a356e | ||
![]() |
017ee34bba | ||
![]() |
340228cc81 | ||
![]() |
edf282c096 | ||
![]() |
a947a9ac62 | ||
![]() |
9b5343054a | ||
![]() |
b735717606 | ||
![]() |
ec33742d1b | ||
![]() |
2ea31b0e6f | ||
![]() |
de70ddb749 | ||
![]() |
a41c7f9736 | ||
![]() |
512b2f7740 | ||
![]() |
8bdc48eddb | ||
![]() |
328600e02b | ||
![]() |
e2747ebbc0 | ||
![]() |
41ebda02b2 | ||
![]() |
30c9799f72 | ||
![]() |
bed6b89a2f | ||
![]() |
3e70c28ce5 | ||
![]() |
79cc6c244a | ||
![]() |
d30ddd9977 | ||
![]() |
8b849265d8 | ||
![]() |
fce7276f54 | ||
![]() |
004d84fcc1 | ||
![]() |
02f3ff3b0a | ||
![]() |
3f6ffcd26d | ||
![]() |
3912e7bde3 | ||
![]() |
488521427f | ||
![]() |
e83816bfcf | ||
![]() |
b578534508 | ||
![]() |
5db30a1d8c | ||
![]() |
664ff30650 | ||
![]() |
873d70a6d8 | ||
![]() |
6dfa16c3c4 | ||
![]() |
60f0ebbdc9 | ||
![]() |
b5d170b551 | ||
![]() |
d4e000906a | ||
![]() |
bb7ff942d3 | ||
![]() |
48a40f0402 | ||
![]() |
0c8e6f598a | ||
![]() |
2ef7a28a71 | ||
![]() |
2a02c07a15 | ||
![]() |
212d8c8f65 | ||
![]() |
b996b202c4 | ||
![]() |
32001ac414 | ||
![]() |
9c629e5348 | ||
![]() |
f0612f166a | ||
![]() |
e34131db78 | ||
![]() |
335dfa793c | ||
![]() |
574aecee20 | ||
![]() |
51075a6777 | ||
![]() |
4508ea103f | ||
![]() |
558f997e99 | ||
![]() |
fda0985bfd | ||
![]() |
93ec4555ff | ||
![]() |
61877b569f | ||
![]() |
dc15a88076 | ||
![]() |
adae5926dd | ||
![]() |
ade337d79e | ||
![]() |
365db94e0a | ||
![]() |
d4ebf3c6b0 | ||
![]() |
f78fa6a57d | ||
![]() |
038a631274 | ||
![]() |
7d94af497d | ||
![]() |
a490961b10 | ||
![]() |
821301de15 | ||
![]() |
3440f4d374 | ||
![]() |
f83c36934f | ||
![]() |
c4bc1d473f | ||
![]() |
5b7e1f9efe | ||
![]() |
c33aee1667 | ||
![]() |
3b1b26578f | ||
![]() |
2cbe885c1a | ||
![]() |
4a42e5cdaa | ||
![]() |
53ef3493bf | ||
![]() |
cbd98b2c28 | ||
![]() |
4685db9462 | ||
![]() |
45de057920 | ||
![]() |
aa87f0ab15 | ||
![]() |
6a6981503e | ||
![]() |
889d1e973f | ||
![]() |
1b758b01c1 | ||
![]() |
7ddcc8fea4 | ||
![]() |
068d656c6d | ||
![]() |
92f722017c | ||
![]() |
9869668884 | ||
![]() |
b903186fa0 | ||
![]() |
592eda8e3f | ||
![]() |
6d013b0aab | ||
![]() |
bcc29cda8e | ||
![]() |
4235457129 | ||
![]() |
e9542ccab6 | ||
![]() |
7de2f9271c | ||
![]() |
24d84da073 | ||
![]() |
ca015f1a45 | ||
![]() |
722f286f80 | ||
![]() |
f20b4606de | ||
![]() |
c985a8df51 | ||
![]() |
a0fad3017e | ||
![]() |
2a05025510 | ||
![]() |
d8373cb992 | ||
![]() |
17df5d8caa | ||
![]() |
210278d9a1 | ||
![]() |
5942362847 | ||
![]() |
7d86e467fa | ||
![]() |
7609b32e7c | ||
![]() |
1702a2c08d | ||
![]() |
9230be0797 | ||
![]() |
7872c8d5a2 | ||
![]() |
37b9fe104a | ||
![]() |
3242abd87a | ||
![]() |
1b6df743f6 | ||
![]() |
c2c8948190 | ||
![]() |
c6a0abdd97 | ||
![]() |
9039d19f01 | ||
![]() |
c828646f60 | ||
![]() |
eb65a49bef | ||
![]() |
b2140a09f8 | ||
![]() |
519bec7c91 | ||
![]() |
24e5a40156 | ||
![]() |
2d1b6242f2 | ||
![]() |
a5db4a46ac | ||
![]() |
65aadf2118 | ||
![]() |
24667466f0 | ||
![]() |
5aae3c13e2 | ||
![]() |
8e4fb01e64 | ||
![]() |
ebb37eac8b | ||
![]() |
9d191a6a40 | ||
![]() |
be973b6f91 | ||
![]() |
2db6f7e703 | ||
![]() |
0790b27910 | ||
![]() |
e80b957789 | ||
![]() |
213939c8ba | ||
![]() |
82ecc85d9e | ||
![]() |
84f809e7a8 | ||
![]() |
cae351e9f5 | ||
![]() |
909acfbbba | ||
![]() |
a5ee8d50c3 | ||
![]() |
c91c48723a | ||
![]() |
b40c8f9249 | ||
![]() |
714215f283 | ||
![]() |
6cfbf21acf | ||
![]() |
72da921942 | ||
![]() |
6ff4ebbc80 | ||
![]() |
fa81193bf0 | ||
![]() |
fb80a0a082 | ||
![]() |
e84730948d | ||
![]() |
996630d5ed | ||
![]() |
fde795894f | ||
![]() |
6710970bce | ||
![]() |
f01df19798 | ||
![]() |
b2e06ea166 | ||
![]() |
c66b0b32fb | ||
![]() |
2064ea9612 | ||
![]() |
1a6e7da13d | ||
![]() |
23544f35fd | ||
![]() |
2f6924032a | ||
![]() |
aeb214f3e8 | ||
![]() |
89fa3b3efb | ||
![]() |
e9afbe2a65 | ||
![]() |
c48849ef97 | ||
![]() |
d54668eb00 | ||
![]() |
ee4c1206de | ||
![]() |
c22c258029 | ||
![]() |
6eb484942b | ||
![]() |
5b716b7c91 | ||
![]() |
01f05d0c75 | ||
![]() |
8321a367ee | ||
![]() |
8e9e19b0d5 | ||
![]() |
db59b6202d | ||
![]() |
e7837bfd03 | ||
![]() |
e71642003c | ||
![]() |
02dbfa2192 | ||
![]() |
9d1e914a56 | ||
![]() |
d3408d0593 | ||
![]() |
318c5c802b | ||
![]() |
c2459c4328 | ||
![]() |
c37ad9e909 | ||
![]() |
5eda4bf726 | ||
![]() |
e02c90dc19 | ||
![]() |
f1c6cd42f4 | ||
![]() |
2a0c7ea4cc | ||
![]() |
4913a08cb6 | ||
![]() |
2531cd94a5 | ||
![]() |
40256ec4d3 | ||
![]() |
11c2db2aa2 | ||
![]() |
d02f444759 | ||
![]() |
cc9e4321d3 | ||
![]() |
970587567e | ||
![]() |
3a158f30b5 | ||
![]() |
67eb679264 | ||
![]() |
9680df4807 | ||
![]() |
0addc57188 | ||
![]() |
34ef39015e | ||
![]() |
252d70a1ed | ||
![]() |
a374d8f85d | ||
![]() |
058fb33557 | ||
![]() |
0355e33b5f | ||
![]() |
e765afccb6 | ||
![]() |
8702ebff74 | ||
![]() |
0f07142509 | ||
![]() |
3a87dd8b20 | ||
![]() |
7f57fb359d | ||
![]() |
663a52c2f8 | ||
![]() |
4b51484a68 | ||
![]() |
89d412b5e7 | ||
![]() |
92774ac1f3 | ||
![]() |
0c05ee3a33 | ||
![]() |
ef1c18b952 | ||
![]() |
409867e62b | ||
![]() |
929aeed386 | ||
![]() |
42d95bcc44 | ||
![]() |
93290f69d0 | ||
![]() |
e38a7880e1 | ||
![]() |
e114648991 | ||
![]() |
b8118dd495 | ||
![]() |
025b9368f8 | ||
![]() |
521e88e009 | ||
![]() |
88e825de86 | ||
![]() |
14e8b13a45 | ||
![]() |
36cb24ec19 | ||
![]() |
806dbb022b | ||
![]() |
5a433a033f | ||
![]() |
511f491cf2 | ||
![]() |
cc228ea6f6 | ||
![]() |
211504ba8a | ||
![]() |
2bbaddb05a | ||
![]() |
13b64d7558 | ||
![]() |
8831000bc0 | ||
![]() |
ed8749e308 | ||
![]() |
7711086536 | ||
![]() |
fdaa8da75d | ||
![]() |
c40ae2cbd2 | ||
![]() |
3e00af34c8 | ||
![]() |
3eac14b43c | ||
![]() |
60406ff7f8 | ||
![]() |
6c5448d59f | ||
![]() |
ca37692bf4 | ||
![]() |
176092d760 | ||
![]() |
e649a7baae | ||
![]() |
c8fba59731 | ||
![]() |
4d1d1b8518 | ||
![]() |
05ebc6f0cc | ||
![]() |
6f0ee717c3 | ||
![]() |
0718b7e31e | ||
![]() |
60172a0446 | ||
![]() |
c042340b2a | ||
![]() |
b847818740 | ||
![]() |
bec9692a77 | ||
![]() |
a07a865d5d | ||
![]() |
cccba72920 | ||
![]() |
7612ca2a7e | ||
![]() |
029136da60 | ||
![]() |
1aeb635cdd | ||
![]() |
70cb3f204d | ||
![]() |
9da4698fd2 | ||
![]() |
08221e738d | ||
![]() |
16dcd13a2a | ||
![]() |
8a26a8d833 | ||
![]() |
a9aeedcdbe | ||
![]() |
d6b9f76943 | ||
![]() |
9e60d8fd9e | ||
![]() |
a8f30fa555 | ||
![]() |
0354cd5f77 | ||
![]() |
0d0f8084e3 | ||
![]() |
3d3735d9a1 | ||
![]() |
29f0898525 | ||
![]() |
0e74e1d8d8 | ||
![]() |
3f7b7dea1e | ||
![]() |
c9ee341bfb | ||
![]() |
c60a6153be | ||
![]() |
80225b08cd | ||
![]() |
bfc491a2d2 | ||
![]() |
fb199cd29d | ||
![]() |
a8aab6e7d4 | ||
![]() |
32aedf1d3d | ||
![]() |
8511b6436c | ||
![]() |
17de1cc382 | ||
![]() |
5719e56168 | ||
![]() |
d7846237a4 | ||
![]() |
386afdf607 | ||
![]() |
2345c1dd66 | ||
![]() |
7aa2d10e0d | ||
![]() |
10cea49a46 | ||
![]() |
073ce06379 | ||
![]() |
0b8cdc0635 | ||
![]() |
9f8e960a1a | ||
![]() |
06fc3569d2 | ||
![]() |
dd3760f2eb | ||
![]() |
45ca048f44 | ||
![]() |
c4369f34b9 | ||
![]() |
d85cae9225 | ||
![]() |
05895927f5 | ||
![]() |
d9805c5b2b | ||
![]() |
2f421f9aa1 | ||
![]() |
4c33b0a200 | ||
![]() |
1c3c0162c6 | ||
![]() |
a40f58d2ef | ||
![]() |
66582c04b1 | ||
![]() |
fae0e2f968 | ||
![]() |
a12918bc28 | ||
![]() |
827f0a318c | ||
![]() |
b66eeb8bf8 | ||
![]() |
c3a6116dc9 | ||
![]() |
f19ace8d33 | ||
![]() |
c2dff28c41 | ||
![]() |
e36c039a07 | ||
![]() |
96ea650ec7 | ||
![]() |
3bb1291fbd | ||
![]() |
61fc9044c7 | ||
![]() |
311bd4c7b1 | ||
![]() |
39d0d787d2 | ||
![]() |
3cffcba3d0 | ||
![]() |
ae7fe3b7f4 | ||
![]() |
b370fcd300 | ||
![]() |
5348e8f276 | ||
![]() |
266bcb06d7 | ||
![]() |
fe165c69de | ||
![]() |
4e2ac742c9 | ||
![]() |
0696260122 | ||
![]() |
54d9f060b4 | ||
![]() |
2cacd82661 | ||
![]() |
ec7978c512 | ||
![]() |
0e9626ba39 | ||
![]() |
73eb9965cf | ||
![]() |
08a77025c6 | ||
![]() |
7a4b5079c6 | ||
![]() |
7a53c77cb5 | ||
![]() |
b89122a2bf | ||
![]() |
99dcb11ed8 | ||
![]() |
819dfddc58 | ||
![]() |
32a050ec7e | ||
![]() |
76ac6b94ed | ||
![]() |
28c830efd8 | ||
![]() |
7ba5e88053 | ||
![]() |
ef19e30985 | ||
![]() |
2d356ba168 | ||
![]() |
dc0a7161f8 | ||
![]() |
77cbfe2274 | ||
![]() |
20690e412d | ||
![]() |
dbcaa00657 | ||
![]() |
4b837a7e15 | ||
![]() |
73b518f269 | ||
![]() |
3427bece89 | ||
![]() |
e79c1e39e9 | ||
![]() |
77f0fcae0e | ||
![]() |
03be2c99ba | ||
![]() |
b77a3b9a35 | ||
![]() |
c0a2ee65a4 | ||
![]() |
4ba3d8bd00 | ||
![]() |
511031c8d8 | ||
![]() |
59cf93ccdb | ||
![]() |
4f13340ab8 | ||
![]() |
b0940753c6 | ||
![]() |
b35622f387 | ||
![]() |
ce24fdaa2c | ||
![]() |
02c99899a2 | ||
![]() |
7fcbdd68b9 | ||
![]() |
fc77790bcd | ||
![]() |
ef46fcdd90 | ||
![]() |
0243aa9eb0 | ||
![]() |
8fa7b8cb9b | ||
![]() |
fd6b4b3e9b | ||
![]() |
1da65c3d4d | ||
![]() |
d541085407 | ||
![]() |
c73e5e839d | ||
![]() |
db2e425346 | ||
![]() |
6aa5206042 | ||
![]() |
61623b74e3 | ||
![]() |
5f7d34811a | ||
![]() |
42f5e8a0f1 | ||
![]() |
c5d9cd5c1b | ||
![]() |
b5cc77bd25 | ||
![]() |
3d81320426 | ||
![]() |
308db9d780 | ||
![]() |
03ea06b8e3 | ||
![]() |
08a65b10fb | ||
![]() |
1238edaeaf | ||
![]() |
a9cd4f4ed4 | ||
![]() |
1d28efb9d1 | ||
![]() |
9ba42a023d | ||
![]() |
ebb9c7ae04 | ||
![]() |
53014175e8 | ||
![]() |
651c0bcdf2 | ||
![]() |
d45ed0ecf5 | ||
![]() |
e21b103c3e | ||
![]() |
0029b2f042 | ||
![]() |
7c5d888ea6 | ||
![]() |
adb49ad8bb | ||
![]() |
a2c8966d50 | ||
![]() |
d8f6d1c334 | ||
![]() |
1e52ea92eb | ||
![]() |
28888a0b41 | ||
![]() |
1022e754f4 | ||
![]() |
703573c72b | ||
![]() |
7af54ef9a5 | ||
![]() |
1602ed6ba1 | ||
![]() |
9e46318a03 | ||
![]() |
c0c89cd44e | ||
![]() |
6cf35852ad | ||
![]() |
83e9fb21aa | ||
![]() |
5c42b2ceae | ||
![]() |
82aa386732 | ||
![]() |
c43ad0f972 | ||
![]() |
53640a3ce0 | ||
![]() |
35e1d6538a | ||
![]() |
45cea71968 | ||
![]() |
569202c9a4 | ||
![]() |
2b3fbc8cdb | ||
![]() |
1ad5764feb | ||
![]() |
ae29142198 | ||
![]() |
cd045e24a0 | ||
![]() |
0dc8479b89 | ||
![]() |
420eac5542 | ||
![]() |
15aeb94f3f | ||
![]() |
b6a3e2be8e | ||
![]() |
9f64bbd6d8 | ||
![]() |
879914def3 | ||
![]() |
6076549304 | ||
![]() |
49465fffdb | ||
![]() |
5825aa149d | ||
![]() |
7dc9393d3b | ||
![]() |
2dded8fedb | ||
![]() |
be16b227b7 | ||
![]() |
e6d99f4ba7 | ||
![]() |
16c4314a21 | ||
![]() |
375aa41ba1 | ||
![]() |
5f829456c1 | ||
![]() |
a834e00454 | ||
![]() |
0e944fb24e | ||
![]() |
f37d681166 | ||
![]() |
30bd7427ea | ||
![]() |
71ab0ceaa0 | ||
![]() |
9acac91960 | ||
![]() |
af54fbbcb5 | ||
![]() |
1e739e781e | ||
![]() |
8d569c7bb0 | ||
![]() |
7f3b87d878 | ||
![]() |
6b5dc72575 | ||
![]() |
8ab137b2bc | ||
![]() |
bcfb9ea34c | ||
![]() |
f0aad0089e | ||
![]() |
d2395f962d | ||
![]() |
476b1a079b | ||
![]() |
9583b4af90 | ||
![]() |
8219bc9e19 | ||
![]() |
57523e3578 | ||
![]() |
37a22d4749 | ||
![]() |
1df74d886d | ||
![]() |
76c54bd129 | ||
![]() |
8f50a404f9 | ||
![]() |
f6ebae65d6 | ||
![]() |
a0a70dc21d | ||
![]() |
5e37689a1a | ||
![]() |
c75a9fef59 | ||
![]() |
9035709e25 | ||
![]() |
b88ead62e7 | ||
![]() |
b998b04c02 | ||
![]() |
68b2a9818b | ||
![]() |
a7cf30f808 | ||
![]() |
be312336f6 | ||
![]() |
6761cf49f2 | ||
![]() |
108d7693a4 | ||
![]() |
00a5bd41be | ||
![]() |
6d7d0eba6d | ||
![]() |
a865bd9fba | ||
![]() |
0fd439ebac | ||
![]() |
012f9b7f04 | ||
![]() |
573a2900cd | ||
![]() |
c28443c551 | ||
![]() |
0b5901bec6 | ||
![]() |
5965d4554d | ||
![]() |
34127c7adc | ||
![]() |
315e5277dc | ||
![]() |
5c7c9a768d | ||
![]() |
bf1c102b80 | ||
![]() |
2271b60b71 | ||
![]() |
c2bfe60086 | ||
![]() |
63598059cd | ||
![]() |
c1901f7ed0 | ||
![]() |
9c4ff4874e | ||
![]() |
46a0062dff | ||
![]() |
d97fa56fd4 | ||
![]() |
d534cd0027 | ||
![]() |
afd6e738f7 | ||
![]() |
de670efeab | ||
![]() |
421d918da3 | ||
![]() |
99a07a1fdf | ||
![]() |
81c16c2e30 | ||
![]() |
dd5d3518e4 | ||
![]() |
07f60235b0 | ||
![]() |
5580fb2b9c | ||
![]() |
7e3f0bffe5 | ||
![]() |
5d47bf3776 | ||
![]() |
11cddb68e0 | ||
![]() |
1b2b93e074 | ||
![]() |
c328214a2d | ||
![]() |
f6f5d7874f | ||
![]() |
5db0a412ff | ||
![]() |
cbe67a1b71 | ||
![]() |
23245ca83a | ||
![]() |
3590874999 | ||
![]() |
e39ab6f203 | ||
![]() |
c9081a8280 | ||
![]() |
5088e3709d | ||
![]() |
c2ba8ca81f | ||
![]() |
ef24ecde68 | ||
![]() |
e8bc33d0a3 | ||
![]() |
5087f89ac8 | ||
![]() |
b3d39275f5 | ||
![]() |
1d75d30816 | ||
![]() |
6fe18add71 | ||
![]() |
d212fe43af | ||
![]() |
13d537e404 | ||
![]() |
46041ee918 | ||
![]() |
1bb05ac16f | ||
![]() |
091c52fef7 | ||
![]() |
a83870ef9d | ||
![]() |
a768e39b2d | ||
![]() |
1c4fa240be | ||
![]() |
5046dd02b9 | ||
![]() |
4d6c0bdf74 | ||
![]() |
cbf4961bf3 | ||
![]() |
add5766dd4 | ||
![]() |
8d59d69449 | ||
![]() |
465865c3cb | ||
![]() |
c539b83138 | ||
![]() |
0a2edfc348 | ||
![]() |
64520e43d4 | ||
![]() |
c79f816c32 | ||
![]() |
c8a7df108f | ||
![]() |
8636742256 | ||
![]() |
a1f32ffee5 | ||
![]() |
fec5f03e22 | ||
![]() |
2b2ac9068e | ||
![]() |
890425ecd7 | ||
![]() |
1df1032444 | ||
![]() |
b1e4dce671 | ||
![]() |
0b20de0194 | ||
![]() |
d596a523b9 | ||
![]() |
592df29f9c | ||
![]() |
f1db21218b | ||
![]() |
892cacef43 | ||
![]() |
12b2412c52 | ||
![]() |
7d8343934b | ||
![]() |
7cebf22d57 | ||
![]() |
c6b97a8278 | ||
![]() |
f96a2641fc | ||
![]() |
fc6c4c10f9 | ||
![]() |
152578fb33 | ||
![]() |
0a41318f1d | ||
![]() |
4bde456f73 | ||
![]() |
689ee8345c | ||
![]() |
5d4355f19b | ||
![]() |
710ecb6946 | ||
![]() |
1b24b89cca | ||
![]() |
dc3e7df1c9 | ||
![]() |
1171bc5c8a | ||
![]() |
3adb68c605 | ||
![]() |
34498c13be | ||
![]() |
517d3eb0a4 | ||
![]() |
6a07e704ca | ||
![]() |
95719fbea6 | ||
![]() |
fbf51696ef | ||
![]() |
1786950759 | ||
![]() |
87374a47c9 | ||
![]() |
368f5a8547 | ||
![]() |
68a485b00a | ||
![]() |
7b823badbc | ||
![]() |
b0fd03f5b8 | ||
![]() |
4b2fbe1e97 | ||
![]() |
afecd1aa13 | ||
![]() |
68cde058f6 | ||
![]() |
809a748124 | ||
![]() |
542318b113 | ||
![]() |
909e711e74 | ||
![]() |
d95b67f409 | ||
![]() |
96945c98d5 | ||
![]() |
1db61aca3b | ||
![]() |
bbb6eb3aaa | ||
![]() |
a4765b0551 | ||
![]() |
29de7dd288 | ||
![]() |
52e3c60c86 | ||
![]() |
282b41c69b | ||
![]() |
13e9571dd0 | ||
![]() |
36420330de | ||
![]() |
cc87913294 | ||
![]() |
ca9f9cb875 | ||
![]() |
0c8e5f7e6a | ||
![]() |
59db31902c | ||
![]() |
c36b00a166 | ||
![]() |
59f07ddf28 | ||
![]() |
e214cd4a73 | ||
![]() |
5997f54a71 | ||
![]() |
e8c442952d | ||
![]() |
98d9dc7840 | ||
![]() |
6164d40fce | ||
![]() |
65ca4b547b | ||
![]() |
d09a905751 | ||
![]() |
0152dbbe23 | ||
![]() |
2261ddf9db | ||
![]() |
295496fa34 | ||
![]() |
09a2d93a0f | ||
![]() |
b0ccd24a72 | ||
![]() |
11e131c9f9 | ||
![]() |
4b0c411ce6 | ||
![]() |
0f2e35b305 | ||
![]() |
0cb3d7913c | ||
![]() |
7e46061cac | ||
![]() |
7b79c8bf96 | ||
![]() |
04ae23afff | ||
![]() |
987168d6b9 | ||
![]() |
ea07fde40b | ||
![]() |
e3df610ada | ||
![]() |
72d9c96ad5 | ||
![]() |
d371458348 | ||
![]() |
ecd624b8e7 | ||
![]() |
81f151c912 | ||
![]() |
b804906414 | ||
![]() |
2869b6ea2b | ||
![]() |
2d3c7b7e01 | ||
![]() |
edf9566c3b | ||
![]() |
331531f70e | ||
![]() |
51b8d30dc4 | ||
![]() |
450c994a49 | ||
![]() |
6a43ffa0d5 | ||
![]() |
6a90aa3f3d | ||
![]() |
1998de9993 | ||
![]() |
61f4cdb73a | ||
![]() |
cda02fb78b | ||
![]() |
a5f96b49d1 | ||
![]() |
18e7b52e8e | ||
![]() |
6d272e53a2 | ||
![]() |
9bce615f46 | ||
![]() |
81e107010e | ||
![]() |
70e8814e44 | ||
![]() |
fc137ee272 | ||
![]() |
79cd7ef9ab | ||
![]() |
4b69f641a6 | ||
![]() |
2ae6c47d5d | ||
![]() |
15622e69a9 | ||
![]() |
8500586251 | ||
![]() |
3aef3ed8f6 | ||
![]() |
488f9545a2 | ||
![]() |
588402585b | ||
![]() |
750c9179ca | ||
![]() |
5f0ae7a062 | ||
![]() |
8fa519dce4 | ||
![]() |
5fb4279ec7 | ||
![]() |
67c83eb9eb | ||
![]() |
9e1083488f | ||
![]() |
dfaaa99ded | ||
![]() |
87badbef84 | ||
![]() |
e3811ed7c3 | ||
![]() |
dacc44ddc2 | ||
![]() |
fc9f369829 | ||
![]() |
bfbc4c7e00 | ||
![]() |
05b72a6af2 | ||
![]() |
1e2056fecb | ||
![]() |
5df13c3173 | ||
![]() |
ed4eecc05e | ||
![]() |
7e1a45e224 | ||
![]() |
e329586489 | ||
![]() |
397e61128f | ||
![]() |
578e833d3b | ||
![]() |
4d58f97f60 | ||
![]() |
33c3bb057b | ||
![]() |
6bf2014745 | ||
![]() |
a10f5b34ff | ||
![]() |
b1df37c60e | ||
![]() |
31d59fb2cc | ||
![]() |
562d40e671 | ||
![]() |
612832e4c0 | ||
![]() |
3c69a08e3b | ||
![]() |
5ea9e78bd7 | ||
![]() |
69d7c48072 | ||
![]() |
7d4f8c2809 | ||
![]() |
d23c59ecfc | ||
![]() |
1d95a48fe9 | ||
![]() |
512a82d395 | ||
![]() |
fbb38de415 | ||
![]() |
0006cdddee | ||
![]() |
b684ccd8b1 | ||
![]() |
3f64d05d34 | ||
![]() |
e4128f90ba | ||
![]() |
e991a3536d | ||
![]() |
8665d4e593 | ||
![]() |
0e36bb71f2 | ||
![]() |
19f45eaa79 | ||
![]() |
70a025f3df | ||
![]() |
95e230c591 | ||
![]() |
5fcc4332d6 | ||
![]() |
7d84113e1d | ||
![]() |
f3df524b62 | ||
![]() |
c47148f142 | ||
![]() |
8a00c94b0f | ||
![]() |
9de4b26643 | ||
![]() |
3208757c1a | ||
![]() |
fae19aed8d | ||
![]() |
c59dba338e | ||
![]() |
a76f852ca4 | ||
![]() |
3880dd3741 | ||
![]() |
d8041a7ea5 | ||
![]() |
abde4c9d84 | ||
![]() |
6d88d58dd5 | ||
![]() |
fbefd816e4 | ||
![]() |
296b246b9c | ||
![]() |
5393f08df8 | ||
![]() |
b5da54e6c9 | ||
![]() |
22085f7d6e | ||
![]() |
2c1b4e74e4 | ||
![]() |
aca67e2775 | ||
![]() |
8e2f16e66f | ||
![]() |
a7f6747019 | ||
![]() |
c3c4626fab | ||
![]() |
9808480860 | ||
![]() |
6ce76e6996 | ||
![]() |
64f12a3b9f | ||
![]() |
18a758d907 | ||
![]() |
7aea2d522d | ||
![]() |
f3e3f5f1b2 | ||
![]() |
62ef465262 | ||
![]() |
c6fa1952a1 | ||
![]() |
d47bd396ce | ||
![]() |
6882ae8dee | ||
![]() |
a00297158e | ||
![]() |
413cbdce3c | ||
![]() |
864d5add0d | ||
![]() |
3238ef5b69 | ||
![]() |
ca10e28f06 | ||
![]() |
5e92015711 | ||
![]() |
ce00c2ef5d | ||
![]() |
0db9140747 | ||
![]() |
55c266de6d | ||
![]() |
3af696f7c4 | ||
![]() |
09cee1633b | ||
![]() |
8d121b6f8f | ||
![]() |
892d6930e7 | ||
![]() |
200e9b5dd1 | ||
![]() |
b0873cb657 | ||
![]() |
19d2bf4ee4 | ||
![]() |
ae467115bb | ||
![]() |
f43ecac175 | ||
![]() |
d2a7fd2fe6 | ||
![]() |
29439acfeb | ||
![]() |
a049528e94 | ||
![]() |
2fbbddbe85 | ||
![]() |
ecb3fe63d7 | ||
![]() |
6ed72fd7fa | ||
![]() |
40e1623649 | ||
![]() |
53151db167 | ||
![]() |
cb64c987a0 | ||
![]() |
67d1616018 | ||
![]() |
65629f2915 | ||
![]() |
795107453d | ||
![]() |
201637d468 | ||
![]() |
6b6a3bcb61 | ||
![]() |
0cbdcd07a8 | ||
![]() |
d106189a47 | ||
![]() |
ddb810ab70 | ||
![]() |
77ba147e76 | ||
![]() |
bed311eda2 | ||
![]() |
9a0b6e42af | ||
![]() |
cfdc4aca45 | ||
![]() |
ab6681c2c8 | ||
![]() |
eeb2cb05a1 | ||
![]() |
daa96f9928 | ||
![]() |
f37affab8c | ||
![]() |
dc4adc484f | ||
![]() |
d0dea8f869 | ||
![]() |
ab81f6c7c4 | ||
![]() |
ebbe694e78 | ||
![]() |
70baf46d8d | ||
![]() |
280d2cff2e | ||
![]() |
ac20f52ed3 | ||
![]() |
59842d4d5f | ||
![]() |
2b6208a6de | ||
![]() |
2f0532a072 | ||
![]() |
6b490ed33c | ||
![]() |
4d703ee100 | ||
![]() |
13b8fc46a3 | ||
![]() |
9f4a174698 | ||
![]() |
8f6189600f | ||
![]() |
41572648db | ||
![]() |
b980c9a027 | ||
![]() |
9124bfba45 | ||
![]() |
232ad6549a | ||
![]() |
03da3ba1c0 | ||
![]() |
4d53dc5d80 | ||
![]() |
5907777153 | ||
![]() |
72da720b4a | ||
![]() |
a6e088e855 | ||
![]() |
4342a2087a |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -14,6 +14,7 @@ Makefile
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
autom4te.cache
|
||||
config.cache
|
||||
config.guess
|
||||
config.log
|
||||
config.status
|
||||
|
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# Place the curl source (including this makefile) into external/curl/ in the
|
||||
# Android source tree. Then build them with 'make curl' or just 'make libcurl'
|
||||
# from the Android root. Tested with Android 1.5 and 2.1
|
||||
# from the Android root. Tested with Android versions 1.5, 2.1-2.3
|
||||
#
|
||||
# Note: you must first create a curl_config.h file by running configure in the
|
||||
# Android environment. The only way I've found to do this is tricky. Perform a
|
||||
@@ -42,7 +42,7 @@
|
||||
# into the right place (but see the note about this below).
|
||||
#
|
||||
# Dan Fandrich
|
||||
# August 2010
|
||||
# November 2011
|
||||
|
||||
LOCAL_PATH:= $(call my-dir)
|
||||
|
||||
@@ -62,8 +62,7 @@ CURL_HEADERS := \
|
||||
mprintf.h \
|
||||
multi.h \
|
||||
stdcheaders.h \
|
||||
typecheck-gcc.h \
|
||||
types.h
|
||||
typecheck-gcc.h
|
||||
|
||||
LOCAL_SRC_FILES := $(addprefix lib/,$(CSOURCES))
|
||||
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/
|
||||
@@ -73,6 +72,7 @@ LOCAL_COPY_HEADERS_TO := libcurl/curl
|
||||
LOCAL_COPY_HEADERS := $(addprefix include/curl/,$(CURL_HEADERS))
|
||||
|
||||
LOCAL_MODULE:= libcurl
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
# Copy the licence to a place where Android will find it.
|
||||
# Actually, this doesn't quite work because the build system searches
|
||||
@@ -93,6 +93,7 @@ include $(LOCAL_PATH)/src/Makefile.inc
|
||||
LOCAL_SRC_FILES := $(addprefix src/,$(CURL_CFILES))
|
||||
|
||||
LOCAL_MODULE := curl
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
LOCAL_STATIC_LIBRARIES := libcurl
|
||||
LOCAL_SYSTEM_SHARED_LIBRARIES := libc
|
||||
|
||||
|
16
CHANGES.0
16
CHANGES.0
@@ -146,7 +146,7 @@ Daniel Stenberg (14 May 2010)
|
||||
compressed Content-Encoding!
|
||||
|
||||
(http://curl.haxx.se/bug/view.cgi?id=3000056)
|
||||
|
||||
|
||||
Daniel Stenberg (12 May 2010)
|
||||
- Howard Chu brought support for RTMP. This is powered by the underlying
|
||||
librtmp library. It supports a range of variations and "sub-protocols"
|
||||
@@ -181,14 +181,14 @@ Daniel Stenberg (7 May 2010)
|
||||
That situation is subject for some closer inspection in the future.
|
||||
|
||||
- Howard Chu split the I/O handling functions into private handlers.
|
||||
|
||||
|
||||
Howard Chu brought the bulk work of this patch that properly moves out the
|
||||
sending and recving of data to the parts of the code that are properly
|
||||
responsible for the various ways of doing so.
|
||||
|
||||
|
||||
Daniel Stenberg assisted with polishing a few bits and fixed some minor
|
||||
flaws in the original patch.
|
||||
|
||||
|
||||
Another upside of this patch is that we now abuse CURLcodes less with the
|
||||
"magic" -1 return codes and instead use CURLE_AGAIN more consistently.
|
||||
|
||||
@@ -296,7 +296,7 @@ Daniel Stenberg (28 Mar 2010)
|
||||
- Ben Greear: If you pass a URL to pop3 that does not contain a message ID as
|
||||
part of the URL, it would previously ask for 'INBOX' which just causes the
|
||||
pop3 server to return an error.
|
||||
|
||||
|
||||
Now libcurl treats en empty message ID as a request for LIST (list of pop3
|
||||
message IDs). User's code could then parse this and download individual
|
||||
messages as desired.
|
||||
@@ -318,7 +318,7 @@ Daniel Stenberg (24 Mar 2010)
|
||||
the last packet received constitutes the end of the response body, libcurl
|
||||
still treats it as a timeout condition and reports a message like:
|
||||
|
||||
"Operation timed out after 3000 milliseconds with 876 out of 876 bytes
|
||||
"Operation timed out after 3000 milliseconds with 876 out of 876 bytes
|
||||
received"
|
||||
|
||||
It should only a timeout if the timer lapsed and we DIDN'T receive the end
|
||||
@@ -368,7 +368,7 @@ Daniel Stenberg (22 Mar 2010)
|
||||
case of a timeout, the signal handler for SIGALRM never gets removed. I
|
||||
think that in my case it gets executed at some point later on when execution
|
||||
has long left Curl_resolv_timeout() or even the cURL library.
|
||||
|
||||
|
||||
The code that is jumped to with siglongjmp() simply sets the error message
|
||||
to "name lookup timed out" and then returns with CURLRESOLV_ERROR. I guess
|
||||
that instead of simply returning without cleaning up, the code should have a
|
||||
@@ -17288,7 +17288,7 @@ Version 5.1 (not publicly released)
|
||||
|
||||
They should be set for protocol-specific proxies. General proxy should be
|
||||
set with
|
||||
|
||||
|
||||
ALL_PROXY
|
||||
|
||||
And a comma-separated list of host names that shouldn't go through any
|
||||
|
@@ -1,44 +0,0 @@
|
||||
#cmakedefine CHECK_TYPE_SIZE_TYPE @CHECK_TYPE_SIZE_TYPE@
|
||||
#ifdef CHECK_TYPE_SIZE_TYPE
|
||||
|
||||
@CHECK_TYPE_SIZE_PREINCLUDE@
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
#endif /* HAVE_SYS_TYPES_H */
|
||||
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
# include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
# include <winsock2.h>
|
||||
# include <ws2tcpip.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
# include <stdint.h>
|
||||
#endif /* HAVE_STDINT_H */
|
||||
|
||||
#ifdef HAVE_STDDEF_H
|
||||
# include <stddef.h>
|
||||
#endif /* HAVE_STDDEF_H */
|
||||
|
||||
@CHECK_TYPE_SIZE_PREMAIN@
|
||||
|
||||
#ifdef __CLASSIC_C__
|
||||
int main(){
|
||||
int ac;
|
||||
char*av[];
|
||||
#else
|
||||
int main(int ac, char*av[]){
|
||||
#endif
|
||||
if(ac > 1000){return *av[0];}
|
||||
return sizeof(CHECK_TYPE_SIZE_TYPE);
|
||||
}
|
||||
|
||||
#else /* CHECK_TYPE_SIZE_TYPE */
|
||||
|
||||
# error "CHECK_TYPE_SIZE_TYPE has to specify the type"
|
||||
|
||||
#endif /* CHECK_TYPE_SIZE_TYPE */
|
@@ -1,57 +0,0 @@
|
||||
# - Check sizeof a type
|
||||
# CHECK_TYPE_SIZE(TYPE VARIABLE)
|
||||
# Check if the type exists and determine size of type. if the type
|
||||
# exists, the size will be stored to the variable.
|
||||
#
|
||||
# VARIABLE - variable to store size if the type exists.
|
||||
# HAVE_${VARIABLE} - does the variable exists or not
|
||||
|
||||
macro(CHECK_TYPE_SIZE TYPE VARIABLE)
|
||||
set(CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS 1)
|
||||
if(NOT DEFINED ${VARIABLE})
|
||||
if("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
|
||||
set(CHECK_TYPE_SIZE_TYPE "${TYPE}")
|
||||
set(MACRO_CHECK_TYPE_SIZE_FLAGS
|
||||
"${CMAKE_REQUIRED_FLAGS}")
|
||||
foreach(def HAVE_SYS_TYPES_H
|
||||
HAVE_STDINT_H HAVE_STDDEF_H HAVE_SYS_SOCKET_H)
|
||||
if("${def}")
|
||||
set(MACRO_CHECK_TYPE_SIZE_FLAGS
|
||||
"${MACRO_CHECK_TYPE_SIZE_FLAGS} -D${def}")
|
||||
endif("${def}")
|
||||
endforeach(def)
|
||||
set(CHECK_TYPE_SIZE_PREMAIN)
|
||||
foreach(def ${CMAKE_EXTRA_INCLUDE_FILES})
|
||||
set(CHECK_TYPE_SIZE_PREMAIN "${CHECK_TYPE_SIZE_PREMAIN}#include \"${def}\"\n")
|
||||
endforeach(def)
|
||||
configure_file(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/CheckTypeSize.c.in"
|
||||
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSize.c"
|
||||
IMMEDIATE @ONLY)
|
||||
file(READ
|
||||
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSize.c"
|
||||
CHECK_TYPE_SIZE_FILE_CONTENT)
|
||||
message(STATUS "Check size of ${TYPE}")
|
||||
if(CMAKE_REQUIRED_LIBRARIES)
|
||||
set(CHECK_TYPE_SIZE_ADD_LIBRARIES
|
||||
"-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
|
||||
endif(CMAKE_REQUIRED_LIBRARIES)
|
||||
try_run(${VARIABLE} HAVE_${VARIABLE}
|
||||
${CMAKE_BINARY_DIR}
|
||||
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSize.c"
|
||||
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_TYPE_SIZE_FLAGS}
|
||||
"${CHECK_TYPE_SIZE_ADD_LIBRARIES}"
|
||||
OUTPUT_VARIABLE OUTPUT)
|
||||
if(HAVE_${VARIABLE})
|
||||
message(STATUS "Check size of ${TYPE} - done")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
||||
"Determining size of ${TYPE} passed with the following output:\n${OUTPUT}\n\n")
|
||||
else(HAVE_${VARIABLE})
|
||||
message(STATUS "Check size of ${TYPE} - failed")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
||||
"Determining size of ${TYPE} failed with the following output:\n${OUTPUT}\nCheckTypeSize.c:\n${CHECK_TYPE_SIZE_FILE_CONTENT}\n\n")
|
||||
endif(HAVE_${VARIABLE})
|
||||
endif("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
|
||||
endif(NOT DEFINED ${VARIABLE})
|
||||
set(CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS )
|
||||
endmacro(CHECK_TYPE_SIZE)
|
@@ -1,3 +1,24 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#ifdef TIME_WITH_SYS_TIME
|
||||
/* Time with sys/time test */
|
||||
|
||||
|
2
CMake/FindCARES.cmake
Executable file → Normal file
2
CMake/FindCARES.cmake
Executable file → Normal file
@@ -11,7 +11,7 @@ FIND_PATH(CARES_INCLUDE_DIR ares.h
|
||||
/usr/local/include
|
||||
/usr/include
|
||||
)
|
||||
|
||||
|
||||
SET(CARES_NAMES ${CARES_NAMES} cares)
|
||||
FIND_LIBRARY(CARES_LIBRARY
|
||||
NAMES ${CARES_NAMES}
|
||||
|
119
CMakeLists.txt
119
CMakeLists.txt
@@ -23,7 +23,6 @@ include(Utilities)
|
||||
|
||||
project( CURL C )
|
||||
|
||||
|
||||
file (READ ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS)
|
||||
string (REGEX MATCH "LIBCURL_VERSION_MAJOR[ \t]+([0-9]+)"
|
||||
LIBCURL_VERSION_MJ ${CURL_VERSION_H_CONTENTS})
|
||||
@@ -58,10 +57,6 @@ set(OS "\"${CMAKE_SYSTEM_NAME}\"")
|
||||
include_directories(${PROJECT_BINARY_DIR}/include/curl)
|
||||
include_directories( ${CURL_SOURCE_DIR}/include )
|
||||
|
||||
if(WIN32)
|
||||
set(NATIVE_WINDOWS ON)
|
||||
endif()
|
||||
|
||||
option(BUILD_CURL_EXE "Set to ON to build cURL executable." ON)
|
||||
option(BUILD_CURL_TESTS "Set to ON to build cURL tests." ON)
|
||||
option(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF)
|
||||
@@ -114,22 +109,11 @@ mark_as_advanced(CURL_DISABLE_HTTP)
|
||||
|
||||
option(CURL_DISABLE_LDAPS "to disable LDAPS" OFF)
|
||||
mark_as_advanced(CURL_DISABLE_LDAPS)
|
||||
if(WIN32)
|
||||
set(CURL_DEFAULT_DISABLE_LDAP OFF)
|
||||
# some windows compilers do not have wldap32
|
||||
if( NOT HAVE_WLDAP32)
|
||||
set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
|
||||
message(STATUS "wldap32 not found CURL_DISABLE_LDAP set ON")
|
||||
option(CURL_LDAP_WIN "Use Windows LDAP implementation" OFF)
|
||||
else()
|
||||
option(CURL_LDAP_WIN "Use Windows LDAP implementation" ON)
|
||||
endif()
|
||||
mark_as_advanced(CURL_LDAP_WIN)
|
||||
endif()
|
||||
|
||||
if(HTTP_ONLY)
|
||||
set(CURL_DISABLE_FTP ON)
|
||||
set(CURL_DISABLE_LDAP ON)
|
||||
set(CURL_DISABLE_LDAPS ON)
|
||||
set(CURL_DISABLE_TELNET ON)
|
||||
set(CURL_DISABLE_DICT ON)
|
||||
set(CURL_DISABLE_FILE ON)
|
||||
@@ -149,6 +133,8 @@ option(ENABLE_IPV6 "Define if you want to enable IPv6 support" OFF)
|
||||
mark_as_advanced(ENABLE_IPV6)
|
||||
|
||||
if(WIN32)
|
||||
# Windows standard libraries are located in C:/Program Files/Microsoft SDKs/[...]
|
||||
# They are already included in the default MSVC LIBPATH => no find_library is needed!
|
||||
list_spaces_append_once(CMAKE_C_STANDARD_LIBRARIES wsock32.lib ws2_32.lib) # bufferoverflowu.lib
|
||||
if(CURL_DISABLE_LDAP)
|
||||
# Remove wldap32.lib from space-separated list
|
||||
@@ -183,13 +169,7 @@ include (CheckIncludeFile)
|
||||
include (CheckIncludeFiles)
|
||||
include (CheckLibraryExists)
|
||||
include (CheckSymbolExists)
|
||||
# if crosscompiling is on, the CHECK_TYPE_SIZE macro coming with cmake uses
|
||||
# TRY_COMPILE instead of TRY_RUN which makes crosscompiling easier, Alex
|
||||
if(CMAKE_CROSSCOMPILING)
|
||||
include ("${CMAKE_MODULE_PATH}/CheckTypeSize.cmake")
|
||||
else(CMAKE_CROSSCOMPILING)
|
||||
include (CheckTypeSize)
|
||||
endif(CMAKE_CROSSCOMPILING)
|
||||
include (CheckTypeSize)
|
||||
|
||||
# On windows preload settings
|
||||
if(WIN32)
|
||||
@@ -197,12 +177,12 @@ if(WIN32)
|
||||
endif(WIN32)
|
||||
|
||||
# This macro checks if the symbol exists in the library and if it
|
||||
# does, it appends library to the list.
|
||||
# does, it prepends library to the list.
|
||||
macro(CHECK_LIBRARY_EXISTS_CONCAT LIBRARY SYMBOL VARIABLE)
|
||||
check_library_exists("${LIBRARY};${CURL_LIBS}" ${SYMBOL} ""
|
||||
check_library_exists("${LIBRARY};${CURL_LIBS}" ${SYMBOL} "${CMAKE_LIBRARY_PATH}"
|
||||
${VARIABLE})
|
||||
if(${VARIABLE})
|
||||
set(CURL_LIBS ${CURL_LIBS} ${LIBRARY})
|
||||
set(CURL_LIBS ${LIBRARY} ${CURL_LIBS})
|
||||
endif(${VARIABLE})
|
||||
endmacro(CHECK_LIBRARY_EXISTS_CONCAT)
|
||||
|
||||
@@ -226,29 +206,24 @@ check_library_exists_concat("ws2_32" getch HAVE_LIBWS2_32)
|
||||
check_library_exists_concat("winmm" getch HAVE_LIBWINMM)
|
||||
check_library_exists("wldap32" cldap_open "" HAVE_WLDAP32)
|
||||
|
||||
if(WIN32)
|
||||
set(CURL_DEFAULT_DISABLE_LDAP OFF)
|
||||
# some windows compilers do not have wldap32
|
||||
if(NOT HAVE_WLDAP32)
|
||||
set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
|
||||
message(STATUS "wldap32 not found CURL_DISABLE_LDAP set ON")
|
||||
option(CURL_LDAP_WIN "Use Windows LDAP implementation" OFF)
|
||||
else()
|
||||
option(CURL_LDAP_WIN "Use Windows LDAP implementation" ON)
|
||||
endif()
|
||||
mark_as_advanced(CURL_LDAP_WIN)
|
||||
endif()
|
||||
|
||||
|
||||
# IF(NOT CURL_SPECIAL_LIBZ)
|
||||
# CHECK_LIBRARY_EXISTS_CONCAT("z" inflateEnd HAVE_LIBZ)
|
||||
# ENDIF(NOT CURL_SPECIAL_LIBZ)
|
||||
|
||||
option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ON)
|
||||
mark_as_advanced(CMAKE_USE_OPENSSL)
|
||||
if(CMAKE_USE_OPENSSL)
|
||||
if(WIN32)
|
||||
find_package(OpenSSL)
|
||||
if(OPENSSL_FOUND)
|
||||
set(USE_SSLEAY TRUE)
|
||||
set(USE_OPENSSL TRUE)
|
||||
list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES} )
|
||||
else()
|
||||
set(CMAKE_USE_OPENSSL FALSE)
|
||||
message(STATUS "OpenSSL NOT Found, disabling CMAKE_USE_OPENSSL")
|
||||
endif()
|
||||
else(WIN32)
|
||||
check_library_exists_concat("crypto" CRYPTO_lock HAVE_LIBCRYPTO)
|
||||
check_library_exists_concat("ssl" SSL_connect HAVE_LIBSSL)
|
||||
endif(WIN32)
|
||||
endif(CMAKE_USE_OPENSSL)
|
||||
|
||||
# Check for idn
|
||||
check_library_exists_concat("idn" idna_to_ascii_lz HAVE_LIBIDN)
|
||||
|
||||
@@ -277,6 +252,25 @@ if(CURL_ZLIB) # AND CURL_CONFIG_HAS_BEEN_RUN_BEFORE
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ON)
|
||||
mark_as_advanced(CMAKE_USE_OPENSSL)
|
||||
if(CMAKE_USE_OPENSSL)
|
||||
if(WIN32)
|
||||
find_package(OpenSSL)
|
||||
if(OPENSSL_FOUND)
|
||||
set(USE_SSLEAY TRUE)
|
||||
set(USE_OPENSSL TRUE)
|
||||
list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES} )
|
||||
else()
|
||||
set(CMAKE_USE_OPENSSL FALSE)
|
||||
message(STATUS "OpenSSL NOT Found, disabling CMAKE_USE_OPENSSL")
|
||||
endif()
|
||||
else(WIN32)
|
||||
check_library_exists_concat("crypto" CRYPTO_lock HAVE_LIBCRYPTO)
|
||||
check_library_exists_concat("ssl" SSL_connect HAVE_LIBSSL)
|
||||
endif(WIN32)
|
||||
endif(CMAKE_USE_OPENSSL)
|
||||
|
||||
# If we have features.h, then do the _BSD_SOURCE magic
|
||||
check_include_file("features.h" HAVE_FEATURES_H)
|
||||
|
||||
@@ -387,11 +381,18 @@ if(CMAKE_USE_OPENSSL)
|
||||
check_include_file_concat("openssl/rand.h" HAVE_OPENSSL_RAND_H)
|
||||
endif(CMAKE_USE_OPENSSL)
|
||||
|
||||
if(NOT HAVE_LDAP_H)
|
||||
if(NOT HAVE_LDAP_H)
|
||||
message(STATUS "LDAP_H not found CURL_DISABLE_LDAP set ON")
|
||||
set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
|
||||
endif()
|
||||
|
||||
# No ldap, no ldaps.
|
||||
if(CURL_DISABLE_LDAP)
|
||||
if(NOT CURL_DISABLE_LDAPS)
|
||||
message(STATUS "LDAP needs to be enabled to support LDAPS")
|
||||
set(CURL_DISABLE_LDAPS ON CACHE BOOL "" FORCE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
check_type_size(size_t SIZEOF_SIZE_T)
|
||||
check_type_size(ssize_t SIZEOF_SSIZE_T)
|
||||
@@ -431,7 +432,7 @@ if(SIZEOF_LONG EQUAL 8)
|
||||
set(CURL_FORMAT_CURL_OFF_TU "lu")
|
||||
set(CURL_FORMAT_OFF_T "%ld")
|
||||
set(CURL_SUFFIX_CURL_OFF_T L)
|
||||
set(CURL_SUFFIX_CURL_OFF_TU LU)
|
||||
set(CURL_SUFFIX_CURL_OFF_TU UL)
|
||||
endif(SIZEOF_LONG EQUAL 8)
|
||||
|
||||
if(SIZEOF_LONG_LONG EQUAL 8)
|
||||
@@ -441,7 +442,7 @@ if(SIZEOF_LONG_LONG EQUAL 8)
|
||||
set(CURL_FORMAT_CURL_OFF_TU "llu")
|
||||
set(CURL_FORMAT_OFF_T "%lld")
|
||||
set(CURL_SUFFIX_CURL_OFF_T LL)
|
||||
set(CURL_SUFFIX_CURL_OFF_TU LLU)
|
||||
set(CURL_SUFFIX_CURL_OFF_TU ULL)
|
||||
endif(SIZEOF_LONG_LONG EQUAL 8)
|
||||
|
||||
if(NOT CURL_TYPEOF_CURL_OFF_T)
|
||||
@@ -781,9 +782,15 @@ endif(CMAKE_COMPILER_IS_GNUCC AND APPLE)
|
||||
|
||||
if(HAVE_SOCKLEN_T)
|
||||
set(CURL_TYPEOF_CURL_SOCKLEN_T "socklen_t")
|
||||
if(WIN32)
|
||||
set(CMAKE_EXTRA_INCLUDE_FILES "winsock2.h;ws2tcpip.h")
|
||||
elseif(HAVE_SYS_SOCKET_H)
|
||||
set(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h")
|
||||
endif()
|
||||
check_type_size("socklen_t" CURL_SIZEOF_CURL_SOCKLEN_T)
|
||||
set(CMAKE_EXTRA_INCLUDE_FILES)
|
||||
if(NOT HAVE_CURL_SIZEOF_CURL_SOCKLEN_T)
|
||||
message(FATAL_ERROR
|
||||
message(FATAL_ERROR
|
||||
"Check for sizeof socklen_t failed, see CMakeFiles/CMakerror.log")
|
||||
endif()
|
||||
else()
|
||||
@@ -831,7 +838,7 @@ function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
|
||||
string(REPLACE "$(top_builddir)" "\${CURL_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
|
||||
|
||||
string(REGEX REPLACE "\\\\\n" "<22>!<21>" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
|
||||
string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*\n)" "SET(\\1 \\2)\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
|
||||
string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
|
||||
string(REPLACE "<22>!<21>" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
|
||||
|
||||
string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace $() with ${}
|
||||
@@ -852,3 +859,13 @@ endif()
|
||||
if(NOT CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
|
||||
set(CURL_CONFIG_HAS_BEEN_RUN_BEFORE 1 CACHE INTERNAL "Flag to track whether this is the first time running CMake or if CMake has been configured before")
|
||||
endif()
|
||||
|
||||
# Installation.
|
||||
# First, install generated curlbuild.h
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/curl/curlbuild.h"
|
||||
DESTINATION include/curl )
|
||||
# Next, install other headers excluding curlbuild.h
|
||||
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/curl"
|
||||
DESTINATION include
|
||||
FILES_MATCHING PATTERN "*.h"
|
||||
PATTERN "curlbuild.h" EXCLUDE)
|
||||
|
2
COPYING
2
COPYING
@@ -1,6 +1,6 @@
|
||||
COPYRIGHT AND PERMISSION NOTICE
|
||||
|
||||
Copyright (c) 1996 - 2010, Daniel Stenberg, <daniel@haxx.se>.
|
||||
Copyright (c) 1996 - 2012, Daniel Stenberg, <daniel@haxx.se>.
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
118
MacOSX-Framework
118
MacOSX-Framework
@@ -1,26 +1,76 @@
|
||||
#!/bin/bash
|
||||
# This script performs all of the steps needed to build a
|
||||
# universal binary libcurl.framework for Mac OS X 10.4 or greater.
|
||||
#
|
||||
# Hendrik Visage:
|
||||
# Generalizations added since Snowleopard (10.6) do not include
|
||||
# the 10.4u SDK.
|
||||
#
|
||||
# Also note:
|
||||
# 10.5 is the *ONLY* SDK that support PPC64 :( -- 10.6 do not have ppc64 support
|
||||
#If you need to have PPC64 support then change below to 1
|
||||
PPC64_NEEDED=0
|
||||
|
||||
# For me the default is to develop for the platform I am on, and if you
|
||||
#desire compatibility with older versions then change USE_OLD to 1 :)
|
||||
USE_OLD=0
|
||||
|
||||
VERSION=`/usr/bin/sed -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' include/curl/curlver.h`
|
||||
FRAMEWORK_VERSION=Versions/Release-$VERSION
|
||||
|
||||
SDK32='/Developer/SDKs/MacOSX10.4u.sdk'
|
||||
#I also wanted to "copy over" the system, and thus the reason I added the
|
||||
# version to Versions/Release-7.20.1 etc.
|
||||
# now a simple rsync -vaP libcurl.framework /Library/Frameworks will install it
|
||||
# and setup the right paths to this version, leaving the system version
|
||||
# "intact", so you can "fix" it later with the links to Versions/A/...
|
||||
|
||||
MINVER32='-mmacosx-version-min=10.4'
|
||||
|
||||
ARCHES32='-arch ppc -arch i386'
|
||||
OLD_SDK=`ls /Developer/SDKs|head -1`
|
||||
NEW_SDK=`ls -r /Developer/SDKs|head -1`
|
||||
|
||||
SDK64='/Developer/SDKs/MacOSX10.5.sdk'
|
||||
if test "0"$USE_OLD -gt 0
|
||||
then
|
||||
SDK32=$OLD_SDK
|
||||
else
|
||||
SDK32=$NEW_SDK
|
||||
fi
|
||||
|
||||
MINVER64='-mmacosx-version-min=10.5'
|
||||
MACVER=`echo $SDK32|sed -e s/[a-zA-Z]//g -e s/.\$//`
|
||||
|
||||
ARCHES64='-arch ppc64 -arch x86_64'
|
||||
SDK32_DIR='/Developer/SDKs/'$SDK32
|
||||
MINVER32='-mmacosx-version-min='$MACVER
|
||||
ARCHES32='-arch i386 -arch ppc'
|
||||
|
||||
if test -d $SDK32; then
|
||||
|
||||
if test $PPC64_NEEDED -gt 0
|
||||
then
|
||||
SDK64=10.5
|
||||
ARCHES64='-arch x86_64 -arch ppc64'
|
||||
SDK64=`ls /Developer/SDKs|grep 10.5|head -1`
|
||||
else
|
||||
ARCHES64='-arch x86_64'
|
||||
#We "know" that 10.4 and earlier do not support 64bit
|
||||
OLD_SDK64=`ls /Developer/SDKs|egrep -v "10.[0-4]"|head -1`
|
||||
NEW_SDK64=`ls -r /Developer/SDKs|egrep -v "10.[0-4]"|head -1`
|
||||
if test $USE_OLD -gt 0
|
||||
then
|
||||
SDK64=$OLD_SDK64
|
||||
else
|
||||
SDK64=$NEW_SDK64
|
||||
fi
|
||||
fi
|
||||
|
||||
SDK64_DIR='/Developer/SDKs/'$SDK64
|
||||
MACVER64=`echo $SDK64|sed -e s/[a-zA-Z]//g -e s/.\$//`
|
||||
|
||||
MINVER64='-mmacosx-version-min='$MACVER64
|
||||
|
||||
if test ! -z $SDK32; then
|
||||
echo "----Configuring libcurl for 32 bit universal framework..."
|
||||
make clean
|
||||
./configure --disable-dependency-tracking --disable-static --with-gssapi \
|
||||
CFLAGS="-Os -isysroot $SDK32 $ARCHES32 $MINVER32" \
|
||||
LDFLAGS="-Wl,-syslibroot,$SDK32 $ARCHES32 $MINVER32 -Wl,-headerpad_max_install_names" \
|
||||
CFLAGS="-Os -isysroot $SDK32_DIR $ARCHES32 $MINVER32" \
|
||||
LDFLAGS="-Wl,-syslibroot,$SDK32_DIR $ARCHES32 $MINVER32 -Wl,-headerpad_max_install_names" \
|
||||
CC=$CC
|
||||
|
||||
echo "----Building 32 bit libcurl..."
|
||||
@@ -28,40 +78,43 @@ if test -d $SDK32; then
|
||||
|
||||
echo "----Creating 32 bit framework..."
|
||||
rm -r libcurl.framework
|
||||
mkdir -p libcurl.framework/Versions/A/Resources
|
||||
cp lib/.libs/libcurl.dylib libcurl.framework/Versions/A/libcurl
|
||||
install_name_tool -id @executable_path/../Frameworks/libcurl.framework/Versions/A/libcurl libcurl.framework/Versions/A/libcurl
|
||||
/usr/bin/sed -e "s/7\.12\.3/$VERSION/" lib/libcurl.plist >libcurl.framework/Versions/A/Resources/Info.plist
|
||||
mkdir -p libcurl.framework/Versions/A/Headers/curl
|
||||
cp include/curl/*.h libcurl.framework/Versions/A/Headers/curl
|
||||
mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Resources
|
||||
cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl
|
||||
install_name_tool -id @executable_path/../Frameworks/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl
|
||||
/usr/bin/sed -e "s/7\.12\.3/$VERSION/" lib/libcurl.plist >libcurl.framework/${FRAMEWORK_VERSION}/Resources/Info.plist
|
||||
mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl
|
||||
cp include/curl/*.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl
|
||||
pushd libcurl.framework
|
||||
ln -fs Versions/A/libcurl libcurl
|
||||
ln -fs Versions/A/Resources Resources
|
||||
ln -fs Versions/A/Headers Headers
|
||||
ln -fs ${FRAMEWORK_VERSION}/libcurl libcurl
|
||||
ln -fs ${FRAMEWORK_VERSION}/Resources Resources
|
||||
ln -fs ${FRAMEWORK_VERSION}/Headers Headers
|
||||
cd Versions
|
||||
ln -fs A Current
|
||||
ln -fs ${FRAMEWORK_VERSION} Current
|
||||
|
||||
if test -d $SDK64; then
|
||||
echo TEsting for SDK64
|
||||
if test -d $SDK64_DIR; then
|
||||
echo entering...
|
||||
popd
|
||||
make clean
|
||||
echo "----Configuring libcurl for 64 bit universal framework..."
|
||||
./configure --disable-dependency-tracking --disable-static --with-gssapi \
|
||||
CFLAGS="-Os -isysroot $SDK64 $ARCHES64 $MINVER64" \
|
||||
LDFLAGS="-Wl,-syslibroot,$SDK64 $ARCHES64 $MINVER64 -Wl,-headerpad_max_install_names" \
|
||||
CFLAGS="-Os -isysroot $SDK64_DIR $ARCHES64 $MINVER64" \
|
||||
LDFLAGS="-Wl,-syslibroot,$SDK64_DIR $ARCHES64 $MINVER64 -Wl,-headerpad_max_install_names" \
|
||||
CC=$CC
|
||||
|
||||
echo "----Building 64 bit libcurl..."
|
||||
make
|
||||
|
||||
echo "----Appending 64 bit framework to 32 bit framework..."
|
||||
cp lib/.libs/libcurl.dylib libcurl.framework/Versions/A/libcurl64
|
||||
install_name_tool -id @executable_path/../Frameworks/libcurl.framework/Versions/A/libcurl libcurl.framework/Versions/A/libcurl64
|
||||
cp libcurl.framework/Versions/A/libcurl libcurl.framework/Versions/A/libcurl32
|
||||
lipo libcurl.framework/Versions/A/libcurl32 libcurl.framework/Versions/A/libcurl64 -create -output libcurl.framework/Versions/A/libcurl
|
||||
rm libcurl.framework/Versions/A/libcurl32 libcurl.framework/Versions/A/libcurl64
|
||||
cp libcurl.framework/Versions/A/Headers/curl/curlbuild.h libcurl.framework/Versions/A/Headers/curl/curlbuild32.h
|
||||
cp include/curl/curlbuild.h libcurl.framework/Versions/A/Headers/curl/curlbuild64.h
|
||||
cat >libcurl.framework/Versions/A/Headers/curl/curlbuild.h <<EOF
|
||||
cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl64
|
||||
install_name_tool -id @executable_path/../Frameworks/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl64
|
||||
cp libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl32
|
||||
pwd
|
||||
lipo libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 -create -output libcurl.framework/${FRAMEWORK_VERSION}/libcurl
|
||||
rm libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64
|
||||
cp libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild32.h
|
||||
cp include/curl/curlbuild.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild64.h
|
||||
cat >libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild.h <<EOF
|
||||
#ifdef __LP64__
|
||||
#include "curl/curlbuild64.h"
|
||||
#else
|
||||
@@ -70,9 +123,10 @@ if test -d $SDK32; then
|
||||
EOF
|
||||
fi
|
||||
|
||||
lipo -info libcurl.framework/Versions/A/libcurl
|
||||
pwd
|
||||
lipo -info libcurl.framework/${FRAMEWORK_VERSION}/libcurl
|
||||
echo "libcurl.framework is built and can now be included in other projects."
|
||||
echo "Copy libcurl.framework to your bundle's Contents/Frameworks folder, ~/Library/Frameworks or /Library/Frameworks."
|
||||
else
|
||||
echo "Building libcurl.framework requires Mac OS X 10.4 or later with the MacOSX10.4u SDK installed."
|
||||
echo "Building libcurl.framework requires Mac OS X 10.4 or later with the MacOSX10.4/5/6 SDK installed."
|
||||
fi
|
||||
|
24
Makefile.am
24
Makefile.am
@@ -5,7 +5,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2011, 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
|
||||
@@ -24,20 +24,24 @@ AUTOMAKE_OPTIONS = foreign
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
CMAKE_DIST = CMakeLists.txt CMake/CheckTypeSize.c.in CMake/CheckTypeSize.cmake \
|
||||
CMake/CMakeConfigurableFile.in CMake/CurlCheckCSourceCompiles.cmake \
|
||||
CMake/CurlCheckCSourceRuns.cmake CMake/CurlTests.c CMake/FindOpenSSL.cmake \
|
||||
CMake/FindZLIB.cmake CMake/OtherTests.cmake CMake/Platforms/WindowsCache.cmake \
|
||||
CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \
|
||||
CMake/CurlCheckCSourceCompiles.cmake CMake/CurlCheckCSourceRuns.cmake \
|
||||
CMake/CurlTests.c CMake/FindOpenSSL.cmake CMake/FindZLIB.cmake \
|
||||
CMake/OtherTests.cmake CMake/Platforms/WindowsCache.cmake \
|
||||
CMake/Utilities.cmake include/curl/curlbuild.h.cmake
|
||||
|
||||
WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
|
||||
winbuild/MakefileBuild.vc winbuild/Makefile.vc
|
||||
|
||||
EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
|
||||
curl-style.el sample.emacs RELEASE-NOTES buildconf \
|
||||
libcurl.pc.in vc6curl.dsw MacOSX-Framework Android.mk $(CMAKE_DIST)
|
||||
libcurl.pc.in vc6curl.dsw MacOSX-Framework Android.mk $(CMAKE_DIST) \
|
||||
Makefile.msvc.names $(WINBUILD_DIST) lib/libcurl.vers.in
|
||||
|
||||
bin_SCRIPTS = curl-config
|
||||
|
||||
SUBDIRS = lib src
|
||||
DIST_SUBDIRS = $(SUBDIRS) tests include packages docs
|
||||
SUBDIRS = lib src include
|
||||
DIST_SUBDIRS = $(SUBDIRS) tests packages docs
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = libcurl.pc
|
||||
@@ -151,3 +155,7 @@ ca-bundle: lib/mk-ca-bundle.pl
|
||||
ca-firefox: lib/firefox-db2pem.sh
|
||||
@echo "generate a fresh ca-bundle.crt"
|
||||
./lib/firefox-db2pem.sh lib/ca-bundle.crt
|
||||
|
||||
checksrc:
|
||||
cd lib && $(MAKE) checksrc
|
||||
cd src && $(MAKE) checksrc
|
||||
|
141
Makefile.dist
141
Makefile.dist
@@ -32,77 +32,68 @@ ssl:
|
||||
|
||||
borland:
|
||||
cd lib
|
||||
make -f Makefile.b32
|
||||
$(MAKE) -f Makefile.b32
|
||||
cd ..\src
|
||||
make -f Makefile.b32
|
||||
$(MAKE) -f Makefile.b32
|
||||
|
||||
borland-ssl:
|
||||
cd lib
|
||||
make -f Makefile.b32 WITH_SSL=1
|
||||
$(MAKE) -f Makefile.b32 WITH_SSL=1
|
||||
cd ..\src
|
||||
make -f Makefile.b32 WITH_SSL=1
|
||||
$(MAKE) -f Makefile.b32 WITH_SSL=1
|
||||
|
||||
borland-ssl-zlib:
|
||||
cd lib
|
||||
make -f Makefile.b32 WITH_SSL=1 WITH_ZLIB=1
|
||||
$(MAKE) -f Makefile.b32 WITH_SSL=1 WITH_ZLIB=1
|
||||
cd ..\src
|
||||
make -f Makefile.b32 WITH_SSL=1 WITH_ZLIB=1
|
||||
$(MAKE) -f Makefile.b32 WITH_SSL=1 WITH_ZLIB=1
|
||||
|
||||
borland-clean:
|
||||
cd lib
|
||||
make -f Makefile.b32 clean
|
||||
$(MAKE) -f Makefile.b32 clean
|
||||
cd ..\src
|
||||
make -f Makefile.b32 clean
|
||||
$(MAKE) -f Makefile.b32 clean
|
||||
|
||||
watcom: .SYMBOLIC
|
||||
cd lib
|
||||
wmake -u -f Makefile.Watcom
|
||||
cd ..\src
|
||||
wmake -u -f Makefile.Watcom
|
||||
cd lib && $(MAKE) -u -f Makefile.Watcom
|
||||
cd src && $(MAKE) -u -f Makefile.Watcom
|
||||
|
||||
watcom-clean: .SYMBOLIC
|
||||
cd lib
|
||||
wmake -u -f Makefile.Watcom clean
|
||||
cd ..\src
|
||||
wmake -u -f Makefile.Watcom clean
|
||||
cd lib && $(MAKE) -u -f Makefile.Watcom clean
|
||||
cd src && $(MAKE) -u -f Makefile.Watcom clean
|
||||
|
||||
watcom-vclean: .SYMBOLIC
|
||||
cd lib
|
||||
wmake -u -f Makefile.Watcom vclean
|
||||
cd ..\src
|
||||
wmake -u -f Makefile.Watcom vclean
|
||||
cd lib && $(MAKE) -u -f Makefile.Watcom vclean
|
||||
cd src && $(MAKE) -u -f Makefile.Watcom vclean
|
||||
|
||||
mingw32:
|
||||
$(MAKE) -C lib -f Makefile.m32
|
||||
$(MAKE) -C src -f Makefile.m32
|
||||
|
||||
mingw32-zlib:
|
||||
$(MAKE) -C lib -f Makefile.m32 ZLIB=1
|
||||
$(MAKE) -C src -f Makefile.m32 ZLIB=1
|
||||
|
||||
mingw32-ssl-zlib:
|
||||
$(MAKE) -C lib -f Makefile.m32 SSL=1 ZLIB=1
|
||||
$(MAKE) -C src -f Makefile.m32 SSL=1 ZLIB=1
|
||||
|
||||
mingw32-ssh2-ssl-zlib:
|
||||
$(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 ZLIB=1
|
||||
$(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 ZLIB=1
|
||||
|
||||
mingw32-ssh2-ssl-sspi-zlib:
|
||||
$(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1
|
||||
$(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1
|
||||
|
||||
mingw32-clean:
|
||||
$(MAKE) -C lib -f Makefile.m32 clean
|
||||
$(MAKE) -C src -f Makefile.m32 clean
|
||||
$(MAKE) -C docs/examples -f Makefile.m32 clean
|
||||
|
||||
vc-clean:
|
||||
mingw32-vclean mingw32-distclean:
|
||||
$(MAKE) -C lib -f Makefile.m32 vclean
|
||||
$(MAKE) -C src -f Makefile.m32 vclean
|
||||
$(MAKE) -C docs/examples -f Makefile.m32 vclean
|
||||
|
||||
mingw32-examples%:
|
||||
$(MAKE) -C docs/examples -f Makefile.m32 CFG=$@
|
||||
|
||||
mingw32%:
|
||||
$(MAKE) -C lib -f Makefile.m32 CFG=$@
|
||||
$(MAKE) -C src -f Makefile.m32 CFG=$@
|
||||
|
||||
vc-clean: $(VC)
|
||||
cd lib
|
||||
nmake -f Makefile.$(VC) clean
|
||||
cd ..\src
|
||||
nmake -f Makefile.$(VC) clean
|
||||
|
||||
vc-all:
|
||||
vc-all: $(VC)
|
||||
cd lib
|
||||
nmake -f Makefile.$(VC) cfg=release
|
||||
nmake -f Makefile.$(VC) cfg=release-ssl
|
||||
@@ -127,85 +118,85 @@ vc-all:
|
||||
nmake -f Makefile.$(VC) cfg=debug-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll-zlib-dll
|
||||
|
||||
vc:
|
||||
vc: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC)
|
||||
|
||||
vc-x64:
|
||||
vc-x64: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release
|
||||
|
||||
vc-zlib:
|
||||
vc-zlib: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib
|
||||
|
||||
vc-ssl:
|
||||
vc-ssl: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl
|
||||
|
||||
vc-ssl-zlib:
|
||||
vc-ssl-zlib: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-zlib
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-zlib
|
||||
|
||||
vc-x64-ssl-zlib:
|
||||
vc-x64-ssl-zlib: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib
|
||||
|
||||
vc-ssl-dll:
|
||||
vc-ssl-dll: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll
|
||||
|
||||
vc-dll-ssl-dll:
|
||||
vc-dll-ssl-dll: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
|
||||
|
||||
vc-dll:
|
||||
vc-dll: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-dll
|
||||
|
||||
vc-dll-zlib-dll:
|
||||
vc-dll-zlib-dll: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll
|
||||
|
||||
vc-dll-ssl-dll-zlib-dll:
|
||||
vc-dll-ssl-dll-zlib-dll: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
|
||||
|
||||
vc-ssl-dll-zlib-dll:
|
||||
vc-ssl-dll-zlib-dll: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
|
||||
|
||||
vc-zlib-dll:
|
||||
vc-zlib-dll: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib-dll
|
||||
|
||||
vc-sspi:
|
||||
vc-sspi: $(VC)
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1
|
||||
cd ..\src
|
||||
@@ -231,34 +222,27 @@ netware:
|
||||
$(MAKE) -C lib -f Makefile.netware
|
||||
$(MAKE) -C src -f Makefile.netware
|
||||
|
||||
netware-ares:
|
||||
$(MAKE) -C lib -f Makefile.netware WITH_ARES=1
|
||||
$(MAKE) -C src -f Makefile.netware WITH_ARES=1
|
||||
|
||||
netware-ssl:
|
||||
$(MAKE) -C lib -f Makefile.netware WITH_SSL=1
|
||||
$(MAKE) -C src -f Makefile.netware WITH_SSL=1
|
||||
|
||||
netware-ssl-zlib:
|
||||
$(MAKE) -C lib -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
|
||||
$(MAKE) -C src -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
|
||||
|
||||
netware-ssh2-ssl-zlib:
|
||||
$(MAKE) -C lib -f Makefile.netware WITH_SSH2=1 WITH_SSL=1 WITH_ZLIB=1
|
||||
$(MAKE) -C src -f Makefile.netware WITH_SSH2=1 WITH_SSL=1 WITH_ZLIB=1
|
||||
|
||||
netware-zlib:
|
||||
$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1
|
||||
$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1
|
||||
|
||||
netware-clean:
|
||||
$(MAKE) -C lib -f Makefile.netware clean
|
||||
$(MAKE) -C src -f Makefile.netware clean
|
||||
$(MAKE) -C docs/examples -f Makefile.netware clean
|
||||
|
||||
netware-vclean netware-distclean:
|
||||
$(MAKE) -C lib -f Makefile.netware vclean
|
||||
$(MAKE) -C src -f Makefile.netware vclean
|
||||
$(MAKE) -C docs/examples -f Makefile.netware vclean
|
||||
|
||||
netware-install:
|
||||
$(MAKE) -C lib -f Makefile.netware install
|
||||
$(MAKE) -C src -f Makefile.netware install
|
||||
|
||||
netware-examples-%:
|
||||
$(MAKE) -C docs/examples -f Makefile.netware CFG=$@
|
||||
|
||||
netware-%:
|
||||
$(MAKE) -C lib -f Makefile.netware CFG=$@
|
||||
$(MAKE) -C src -f Makefile.netware CFG=$@
|
||||
|
||||
unix: all
|
||||
|
||||
unix-ssl: ssl
|
||||
@@ -267,6 +251,8 @@ linux: all
|
||||
|
||||
linux-ssl: ssl
|
||||
|
||||
# We don't need to do anything for vc6.
|
||||
vc6:
|
||||
|
||||
vc8: lib/Makefile.vc8 src/Makefile.vc8
|
||||
|
||||
@@ -289,6 +275,17 @@ src/Makefile.vc9: src/Makefile.vc6
|
||||
@echo "generate $@"
|
||||
@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc9/g" -e "s/VC6/VC9/g" src/Makefile.vc6 > src/Makefile.vc9
|
||||
|
||||
# VC10 makefiles are for use with VS2010
|
||||
vc10: lib/Makefile.vc10 src/Makefile.vc10
|
||||
|
||||
lib/Makefile.vc10: lib/Makefile.vc6
|
||||
@echo "generate $@"
|
||||
@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc10/g" -e "s/VC6/VC10/g" lib/Makefile.vc6 > lib/Makefile.vc10
|
||||
|
||||
src/Makefile.vc10: src/Makefile.vc6
|
||||
@echo "generate $@"
|
||||
@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc10/g" -e "s/VC6/VC10/g" src/Makefile.vc6 > src/Makefile.vc10
|
||||
|
||||
ca-bundle: lib/mk-ca-bundle.pl
|
||||
@echo "generate a fresh ca-bundle.crt"
|
||||
@perl $< -b -l -u lib/ca-bundle.crt
|
||||
|
81
Makefile.msvc.names
Normal file
81
Makefile.msvc.names
Normal file
@@ -0,0 +1,81 @@
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# Project ___| | | | _ \| |
|
||||
# / __| | | | |_) | |
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1999 - 2010, 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.
|
||||
#
|
||||
#***************************************************************************
|
||||
|
||||
#
|
||||
# This file is included from MSVC makefiles located in lib and src,
|
||||
# providing libcurl common file names required by these makefiles.
|
||||
#
|
||||
|
||||
# ------------------
|
||||
# libcurl base name
|
||||
# ------------------
|
||||
|
||||
!IF !DEFINED(LIB_NAME) || "$(LIB_NAME)" == ""
|
||||
LIB_NAME = libcurl
|
||||
!ENDIF
|
||||
|
||||
# -------------------------------------------------
|
||||
# libcurl static and dynamic libraries common base
|
||||
# file names for release and debug configurations
|
||||
# -------------------------------------------------
|
||||
|
||||
!IF !DEFINED(LIB_NAME_STA_REL) || "$(LIB_NAME_STA_REL)" == ""
|
||||
LIB_NAME_STA_REL = $(LIB_NAME)
|
||||
!ENDIF
|
||||
|
||||
!IF !DEFINED(LIB_NAME_STA_DBG) || "$(LIB_NAME_STA_DBG)" == ""
|
||||
LIB_NAME_STA_DBG = $(LIB_NAME_STA_REL)d
|
||||
!ENDIF
|
||||
|
||||
!IF !DEFINED(LIB_NAME_DYN_REL) || "$(LIB_NAME_DYN_REL)" == ""
|
||||
LIB_NAME_DYN_REL = $(LIB_NAME)
|
||||
!ENDIF
|
||||
|
||||
!IF !DEFINED(LIB_NAME_DYN_DBG) || "$(LIB_NAME_DYN_DBG)" == ""
|
||||
LIB_NAME_DYN_DBG = $(LIB_NAME_DYN_REL)d
|
||||
!ENDIF
|
||||
|
||||
# --------------------------------------------
|
||||
# Base names for libcurl DLL import libraries
|
||||
# --------------------------------------------
|
||||
|
||||
!IF !DEFINED(LIB_NAME_IMP_REL) || "$(LIB_NAME_IMP_REL)" == ""
|
||||
LIB_NAME_IMP_REL = $(LIB_NAME_DYN_REL)_imp
|
||||
!ENDIF
|
||||
|
||||
!IF !DEFINED(LIB_NAME_IMP_DBG) || "$(LIB_NAME_IMP_DBG)" == ""
|
||||
LIB_NAME_IMP_DBG = $(LIB_NAME_DYN_DBG)_imp
|
||||
!ENDIF
|
||||
|
||||
# --------------------------------------
|
||||
# File names with extension and no path
|
||||
# --------------------------------------
|
||||
|
||||
LIBCURL_STA_LIB_REL = $(LIB_NAME_STA_REL).lib
|
||||
LIBCURL_STA_LIB_DBG = $(LIB_NAME_STA_DBG).lib
|
||||
LIBCURL_DYN_LIB_REL = $(LIB_NAME_DYN_REL).dll
|
||||
LIBCURL_DYN_LIB_DBG = $(LIB_NAME_DYN_DBG).dll
|
||||
LIBCURL_IMP_LIB_REL = $(LIB_NAME_IMP_REL).lib
|
||||
LIBCURL_IMP_LIB_DBG = $(LIB_NAME_IMP_DBG).lib
|
||||
LIBCURL_DYN_LIB_PDB = $(LIB_NAME_IMP_DBG).pdb
|
||||
|
||||
# End of Makefile.msvc.names
|
118
RELEASE-NOTES
118
RELEASE-NOTES
@@ -1,58 +1,54 @@
|
||||
Curl and libcurl 7.21.1
|
||||
Curl and libcurl 7.26.0
|
||||
|
||||
Public curl releases: 117
|
||||
Command line options: 138
|
||||
curl_easy_setopt() options: 180
|
||||
Public curl releases: 127
|
||||
Command line options: 151
|
||||
curl_easy_setopt() options: 199
|
||||
Public functions in libcurl: 58
|
||||
Known libcurl bindings: 39
|
||||
Contributors: 808
|
||||
Contributors: 929
|
||||
|
||||
This release includes the following changes:
|
||||
|
||||
o maketgz: produce CHANGES automatically
|
||||
o added support for NTLM authentication when compiled with NSS
|
||||
o build: Enable configure --enable-werror
|
||||
o curl-config: --built-shared returns shared info
|
||||
o nss: the minimal supported version of NSS bumped to 3.12.x
|
||||
o nss: human-readable names are now provided for NSS errors if available
|
||||
o add a manual page for mk-ca-bundle
|
||||
o added --post303 and the CURL_REDIR_POST_303 option for CURLOPT_POSTREDIR
|
||||
o smtp: Add support for DIGEST-MD5 authentication
|
||||
o pop3: Added support for additional pop3 commands
|
||||
|
||||
This release includes the following bugfixes:
|
||||
|
||||
o configure: spell --disable-threaded-resolver correctly
|
||||
o multi: call the progress callback in all states
|
||||
o multi: unmark handle as used when no longer head of pipeline
|
||||
o sendrecv: treat all negative values from send/recv as errors
|
||||
o ftp-wildcard: avoid tight loop when used without any pattern
|
||||
o multi_socket: re-use of same socket without notifying app
|
||||
o ftp wildcard: FTP LIST parser FIX
|
||||
o urlglobbing backslash escaping bug
|
||||
o build: add enable IPV6 option for the VC makefiles
|
||||
o multi: CURLINFO_LASTSOCKET doesn't work after remove_handle
|
||||
o --libcurl: use *_LARGE options with typecasted constants
|
||||
o --libcurl: hide setopt() calls setting default options
|
||||
o curl: avoid setting libcurl options to its default
|
||||
o --libcurl: list the tricky options instead of using [REMARK]
|
||||
o http: don't enable chunked during authentication negotiations
|
||||
o upload: warn users trying to upload from stdin with anyauth
|
||||
o configure: allow environments variable to override internals
|
||||
o threaded resolver: fix timeout issue
|
||||
o multi: fix condition that remove timers before trigger
|
||||
o examples: add curl_multi_timeout
|
||||
o --retry: access violation with URL part sets continued
|
||||
o ssh: Fix compile error on 64-bit systems.
|
||||
o remote-header-name: chop filename at next semicolon
|
||||
o ftp: response timeout bug in "quote" sending
|
||||
o CUSTOMREQUEST: shouldn't be disabled when HTTP is disabled
|
||||
o Watcom makefiles overhaul.
|
||||
o NTLM tests: boost coverage by forcing the hostname
|
||||
o multi: fix FTPS connecting the data connection with OpenSSL
|
||||
o retry: consider retrying even if -f is used
|
||||
o fix SOCKS problem when using multi interface
|
||||
o typecheck-gcc: add checks for recently added options
|
||||
o SCP: send large files properly with new enough libssh2
|
||||
o multi_socket: set timeout for 100-continue
|
||||
o ";type=" URL suffix over HTTP proxy
|
||||
o acknowledge progress callback error returns during connect
|
||||
o Watcom makefile fixes
|
||||
o runtests: clear old setenv remainders before test
|
||||
o nss: libcurl now uses NSS_InitContext() to prevent collisions if available
|
||||
[1]
|
||||
o URL parse: reject numerical IPv6 addresses outside brackets [4]
|
||||
o MD5: fix OOM memory leak [5]
|
||||
o OpenSSL cert: provide more details when cert check fails
|
||||
o HTTP: empty chunked POST ended up in two zero size chunks [6]
|
||||
o fixed a regression when curl resolved to multiple addresses and the first
|
||||
isn't supported [7]
|
||||
o -# progress meter: avoid superfluous updates and duplicate lines [8]
|
||||
o headers: surround GCC attribute names with double underscores [9]
|
||||
o PolarSSL: correct return code for CRL matches
|
||||
o PolarSSL: include version number in version string
|
||||
o PolarSSL: add support for asynchronous connect
|
||||
o mk-ca-bundle: revert the LWP usage [12]
|
||||
o IPv6 cookie domain: get rid of the first bracket before the second
|
||||
o connect.c: return changed to CURLE_COULDNT_CONNECT when opensocket fails
|
||||
o OpenSSL: Made cert hostname check conform to RFC 6125 [10]
|
||||
o HTTP: reset expected DL/UL sizes on redirects [11]
|
||||
o CMake: fix Windows LDAP/LDAPS option handling [2]
|
||||
o CMake: fix MS Visual Studio x64 unsigned long long literal suffix [3]
|
||||
o configure: update detection logic of getaddrinfo() thread-safeness
|
||||
o configure: check for gethostbyname in the watt lib
|
||||
o curl-config.1: fix curl-config usage in example [13]
|
||||
o smtp: Fixed non-escaping of dot character at beginning of line
|
||||
o MakefileBuild.vc: use the correct IDN variable
|
||||
o autoconf: improve handling of versioned symbols
|
||||
o curl.1: clarify -x usage
|
||||
o curl: shorten user-agent
|
||||
o smtp: issue with the multi-interface always sending postdata [14]
|
||||
o compile error with GnuTLS+Nettle fixed
|
||||
o winbuild: fix IPv6 enabled build
|
||||
|
||||
This release includes the following known bugs:
|
||||
|
||||
@@ -61,11 +57,29 @@ This release includes the following known bugs:
|
||||
This release would not have looked like this without help, code, reports and
|
||||
advice from friends like these:
|
||||
|
||||
Dan Fandrich, Kamil Dudka, Krister Johansen, Pavel Raiskup, Jon Sargeant,
|
||||
Pierre Joye, Tor Arntsen, Constantine Sapuntzakis, Sidney San Martin,
|
||||
Jeff Pohlmeyer, Jan Van Boghout, Ben Greear, Guenter Knauf, Adam Light,
|
||||
Georg Lippitsch, Mike Power, Robin Cornelius, Mikael Johansson,
|
||||
Yang Tse, Ben Darnell
|
||||
|
||||
Andrei Cipu, Armel Asselin, Benjamin Johnson, Dag Ekengren, Dave Reisner,
|
||||
Gokhan Sengun, Guenter Knauf, Jan Schaumann, Jonathan Nieder, Kamil Dudka,
|
||||
Lijo Antony, Olaf Flebbe, Rodrigo Silva, Steve Holme, Tatsuhiro Tsujikawa,
|
||||
Tim Heckman, Yang Tse, Arnaud Compan, Blaise Potard, Daniel Theron,
|
||||
Michael Mueller, Michael Wallner, Tim Heckman, Roman Mamedov, Julian Taylor,
|
||||
Claes Jakobsson, Pierre Chapuis, Jan Ehrhardt
|
||||
|
||||
Thanks! (and sorry if I forgot to mention someone)
|
||||
|
||||
References to bug reports and discussions on issues:
|
||||
|
||||
[1] = https://bugzilla.redhat.com/738456
|
||||
[2] = http://curl.haxx.se/mail/lib-2012-03/0278.html
|
||||
[3] = http://curl.haxx.se/mail/lib-2012-03/0255.html
|
||||
[4] = http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=670126
|
||||
[5] = http://curl.haxx.se/mail/lib-2012-04/0246.html
|
||||
[6] = http://curl.haxx.se/mail/archive-2012-04/0060.html
|
||||
[7] = http://curl.haxx.se/bug/view.cgi?id=3516508
|
||||
[8] = http://curl.haxx.se/bug/view.cgi?id=3517418
|
||||
[9] = http://curl.haxx.se/mail/lib-2012-04/0127.html
|
||||
[10] = http://tools.ietf.org/html/rfc6125#section-6.4.3
|
||||
[11] = http://curl.haxx.se/bug/view.cgi?id=3510057
|
||||
[12] = http://curl.haxx.se/mail/lib-2012-03/0238.html
|
||||
[13] = http://curl.haxx.se/bug/view.cgi?id=3528241
|
||||
[14] = http://curl.haxx.se/mail/lib-2012-05/0108.html
|
||||
|
12
TODO-RELEASE
12
TODO-RELEASE
@@ -1,4 +1,10 @@
|
||||
To be addressed in 7.XX.X
|
||||
=========================
|
||||
To be addressed in 7.27
|
||||
=======================
|
||||
|
||||
261 -
|
||||
309 - metalink support for the curl tool
|
||||
|
||||
310 - a new authentication callback
|
||||
|
||||
311 - support for SSPI schannel for SSL on windows
|
||||
|
||||
312 -
|
||||
|
78
acinclude.m4
78
acinclude.m4
@@ -5,7 +5,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2012, 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
|
||||
@@ -51,7 +51,7 @@ CURL_DEF_TOKEN $1
|
||||
],[
|
||||
tmp_exp=`eval "$ac_cpp conftest.$ac_ext" 2>/dev/null | \
|
||||
"$GREP" CURL_DEF_TOKEN 2>/dev/null | \
|
||||
"$SED" 's/.*CURL_DEF_TOKEN[[ ]]//' 2>/dev/null | \
|
||||
"$SED" 's/.*CURL_DEF_TOKEN[[ ]][[ ]]*//' 2>/dev/null | \
|
||||
"$SED" 's/[["]][[ ]]*[["]]//g' 2>/dev/null`
|
||||
if test -z "$tmp_exp" || test "$tmp_exp" = "$1"; then
|
||||
tmp_exp=""
|
||||
@@ -228,12 +228,7 @@ AC_DEFUN([CURL_CHECK_NATIVE_WINDOWS], [
|
||||
])
|
||||
fi
|
||||
])
|
||||
case "$ac_cv_native_windows" in
|
||||
yes)
|
||||
AC_DEFINE_UNQUOTED(NATIVE_WINDOWS, 1,
|
||||
[Define to 1 if you are building a native Windows target.])
|
||||
;;
|
||||
esac
|
||||
AM_CONDITIONAL(DOING_NATIVE_WINDOWS, test "x$ac_cv_native_windows" = xyes)
|
||||
])
|
||||
|
||||
|
||||
@@ -1663,7 +1658,7 @@ AC_DEFUN([CURL_CHECK_FUNC_RECVFROM], [
|
||||
for recvfrom_arg2 in 'char *' 'void *'; do
|
||||
for recvfrom_arg3 in 'size_t' 'int' 'socklen_t' 'unsigned int'; do
|
||||
for recvfrom_arg4 in 'int' 'unsigned int'; do
|
||||
for recvfrom_arg5 in 'struct sockaddr *' 'void *'; do
|
||||
for recvfrom_arg5 in 'struct sockaddr *' 'void *' 'const struct sockaddr *'; do
|
||||
for recvfrom_arg6 in 'socklen_t *' 'int *' 'unsigned int *' 'size_t *' 'void *'; do
|
||||
if test "$curl_cv_func_recvfrom_args" = "unknown"; then
|
||||
AC_COMPILE_IFELSE([
|
||||
@@ -1731,7 +1726,7 @@ AC_DEFUN([CURL_CHECK_FUNC_RECVFROM], [
|
||||
shift
|
||||
#
|
||||
recvfrom_ptrt_arg2=$[2]
|
||||
recvfrom_ptrt_arg5=$[5]
|
||||
recvfrom_qual_ptrt_arg5=$[5]
|
||||
recvfrom_ptrt_arg6=$[6]
|
||||
#
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG1, $[1],
|
||||
@@ -1753,12 +1748,25 @@ AC_DEFUN([CURL_CHECK_FUNC_RECVFROM], [
|
||||
;;
|
||||
esac
|
||||
#
|
||||
case "$recvfrom_qual_ptrt_arg5" in
|
||||
const*)
|
||||
recvfrom_qual_arg5=const
|
||||
recvfrom_ptrt_arg5=`echo $recvfrom_qual_ptrt_arg5 | sed 's/^const //'`
|
||||
;;
|
||||
*)
|
||||
recvfrom_qual_arg5=
|
||||
recvfrom_ptrt_arg5=$recvfrom_qual_ptrt_arg5
|
||||
;;
|
||||
esac
|
||||
#
|
||||
recvfrom_type_arg2=`echo $recvfrom_ptrt_arg2 | sed 's/ \*//'`
|
||||
recvfrom_type_arg5=`echo $recvfrom_ptrt_arg5 | sed 's/ \*//'`
|
||||
recvfrom_type_arg6=`echo $recvfrom_ptrt_arg6 | sed 's/ \*//'`
|
||||
#
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG2, $recvfrom_type_arg2,
|
||||
[Define to the type pointed by arg 2 for recvfrom.])
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_QUAL_ARG5, $recvfrom_qual_arg5,
|
||||
[Define to the type qualifier pointed by arg 5 for recvfrom.])
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG5, $recvfrom_type_arg5,
|
||||
[Define to the type pointed by arg 5 for recvfrom.])
|
||||
AC_DEFINE_UNQUOTED(RECVFROM_TYPE_ARG6, $recvfrom_type_arg6,
|
||||
@@ -2145,6 +2153,7 @@ AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [
|
||||
else
|
||||
LIBS="$curl_cv_gclk_LIBS $curl_cv_save_LIBS"
|
||||
fi
|
||||
CURL_LIBS="$CURL_LIBS $curl_cv_gclk_LIBS"
|
||||
AC_MSG_RESULT([$curl_cv_gclk_LIBS])
|
||||
ac_cv_func_clock_gettime="yes"
|
||||
;;
|
||||
@@ -2842,7 +2851,7 @@ AC_DEFUN([DO_CURL_OFF_T_CHECK], [
|
||||
tmp_includes=""
|
||||
tmp_source=""
|
||||
tmp_fmt=""
|
||||
case AS_TR_SH([$1]) in
|
||||
case XC_SH_TR_SH([$1]) in
|
||||
int64_t)
|
||||
tmp_includes="$curl_includes_inttypes"
|
||||
tmp_source="char f@<:@@:>@ = PRId64;"
|
||||
@@ -2900,7 +2909,7 @@ AC_DEFUN([DO_CURL_OFF_T_SUFFIX_CHECK], [
|
||||
curl_suffix_curl_off_t="unknown"
|
||||
curl_suffix_curl_off_tu="unknown"
|
||||
#
|
||||
case AS_TR_SH([$1]) in
|
||||
case XC_SH_TR_SH([$1]) in
|
||||
long_long | __longlong | __longlong_t)
|
||||
tst_suffixes="LL::"
|
||||
;;
|
||||
@@ -3072,7 +3081,7 @@ AC_DEFUN([CURL_CONFIGURE_CURL_OFF_T], [
|
||||
curl_format_curl_off_tu=`echo "$curl_format_curl_off_tu" | "$SED" 's/D$/U/'`
|
||||
else
|
||||
x_pull_headers="no"
|
||||
case AS_TR_SH([$curl_typeof_curl_off_t]) in
|
||||
case XC_SH_TR_SH([$curl_typeof_curl_off_t]) in
|
||||
long_long | __longlong | __longlong_t)
|
||||
curl_format_curl_off_t="lld"
|
||||
curl_format_curl_off_tu="llu"
|
||||
@@ -3180,7 +3189,7 @@ AC_DEFUN([CURL_CHECK_WIN32_LARGEFILE], [
|
||||
;;
|
||||
win32_small_files)
|
||||
AC_MSG_RESULT([yes (large file disabled)])
|
||||
AC_DEFINE_UNQUOTED(USE_WIN32_LARGE_FILES, 1,
|
||||
AC_DEFINE_UNQUOTED(USE_WIN32_SMALL_FILES, 1,
|
||||
[Define to 1 if you are building a Windows target without large file support.])
|
||||
;;
|
||||
*)
|
||||
@@ -3245,3 +3254,44 @@ AC_DEFUN([CURL_CHECK_PKGCONFIG], [
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_GENERATE_CONFIGUREHELP_PM
|
||||
dnl -------------------------------------------------
|
||||
dnl Generate test harness configurehelp.pm module, defining and
|
||||
dnl initializing some perl variables with values which are known
|
||||
dnl when the configure script runs. For portability reasons, test
|
||||
dnl harness needs information on how to run the C preprocessor.
|
||||
|
||||
AC_DEFUN([CURL_GENERATE_CONFIGUREHELP_PM], [
|
||||
AC_REQUIRE([AC_PROG_CPP])dnl
|
||||
tmp_cpp=`eval echo "$ac_cpp" 2>/dev/null`
|
||||
if test -z "$tmp_cpp"; then
|
||||
tmp_cpp='cpp'
|
||||
fi
|
||||
cat >./tests/configurehelp.pm <<_EOF
|
||||
[@%:@] This is a generated file. Do not edit.
|
||||
|
||||
package configurehelp;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Exporter;
|
||||
|
||||
use vars qw(
|
||||
@ISA
|
||||
@EXPORT_OK
|
||||
\$Cpreprocessor
|
||||
);
|
||||
|
||||
@ISA = qw(Exporter);
|
||||
|
||||
@EXPORT_OK = qw(
|
||||
\$Cpreprocessor
|
||||
);
|
||||
|
||||
\$Cpreprocessor = '$tmp_cpp';
|
||||
|
||||
1;
|
||||
_EOF
|
||||
])
|
||||
|
198
buildconf
198
buildconf
@@ -6,7 +6,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -21,9 +21,12 @@
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# die prints argument string to stdout and exits this shell script.
|
||||
#
|
||||
die(){
|
||||
echo "$@"
|
||||
exit
|
||||
echo "buildconf: $@"
|
||||
exit 1
|
||||
}
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
@@ -33,11 +36,8 @@ die(){
|
||||
findtool(){
|
||||
file="$1"
|
||||
|
||||
if { echo $file | grep "/" >/dev/null 2>&1; } then
|
||||
# we only check for the explicit file name if the file is given
|
||||
# including a slash. Use ./ for current dir. Previously this would
|
||||
# otherwise always cause findtool to search the local dir first, which
|
||||
# is wrong.
|
||||
if { echo "$file" | grep "/" >/dev/null 2>&1; } then
|
||||
# when file is given with a path check it first
|
||||
if test -f "$file"; then
|
||||
echo "$file"
|
||||
return
|
||||
@@ -80,16 +80,19 @@ removethis(){
|
||||
# Ensure that buildconf runs from the subdirectory where configure.ac lives
|
||||
#
|
||||
if test ! -f configure.ac ||
|
||||
test ! -f src/main.c ||
|
||||
test ! -f src/tool_main.c ||
|
||||
test ! -f lib/urldata.h ||
|
||||
test ! -f include/curl/curl.h; then
|
||||
test ! -f include/curl/curl.h ||
|
||||
test ! -f m4/curl-functions.m4; then
|
||||
echo "Can not run buildconf from outside of curl's source subdirectory!"
|
||||
echo "Change to the subdirectory where buildconf is found, and try again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# autoconf 2.57 or newer
|
||||
# autoconf 2.57 or newer. Unpatched version 2.67 does not generate proper
|
||||
# configure script. Unpatched version 2.68 is simply unusable, we should
|
||||
# disallow 2.68 usage.
|
||||
#
|
||||
need_autoconf="2.57"
|
||||
ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
||||
@@ -108,7 +111,15 @@ if test "$1" = "2" -a "$2" -lt "57" || test "$1" -lt "2"; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "buildconf: autoconf version $ac_version (ok)"
|
||||
if test "$1" = "2" -a "$2" -eq "67"; then
|
||||
echo "buildconf: autoconf version $ac_version (BAD)"
|
||||
echo " Unpatched version generates broken configure script."
|
||||
elif test "$1" = "2" -a "$2" -eq "68"; then
|
||||
echo "buildconf: autoconf version $ac_version (BAD)"
|
||||
echo " Unpatched version generates unusable configure script."
|
||||
else
|
||||
echo "buildconf: autoconf version $ac_version (ok)"
|
||||
fi
|
||||
|
||||
am4te_version=`${AUTOM4TE:-autom4te} --version 2>/dev/null|head -n 1| sed -e 's/autom4te\(.*\)/\1/' -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
||||
if test -z "$am4te_version"; then
|
||||
@@ -178,27 +189,24 @@ else
|
||||
fi
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# libtool check
|
||||
# GNU libtool preliminary check
|
||||
#
|
||||
LIBTOOL_WANTED_MAJOR=1
|
||||
LIBTOOL_WANTED_MINOR=4
|
||||
LIBTOOL_WANTED_PATCH=2
|
||||
LIBTOOL_WANTED_VERSION=1.4.2
|
||||
want_lt_major=1
|
||||
want_lt_minor=4
|
||||
want_lt_patch=2
|
||||
want_lt_version=1.4.2
|
||||
|
||||
# This approach that tries 'glibtool' first is intended for systems that
|
||||
# have GNU libtool named as 'glibtool' and libtool not being GNU's.
|
||||
|
||||
# this approach that tries 'glibtool' first is some kind of work-around for
|
||||
# some BSD-systems I believe that use to provide the GNU libtool named
|
||||
# glibtool, with 'libtool' being something completely different.
|
||||
libtool=`findtool glibtool 2>/dev/null`
|
||||
if test ! -x "$libtool"; then
|
||||
libtool=`findtool ${LIBTOOL:-libtool}`
|
||||
fi
|
||||
|
||||
if test -z "$LIBTOOLIZE"; then
|
||||
# set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found
|
||||
# $libtool is already the full path
|
||||
libtoolize="${libtool}ize"
|
||||
else
|
||||
libtoolize=`findtool $LIBTOOLIZE`
|
||||
if test -z "$libtool"; then
|
||||
echo "buildconf: libtool not found."
|
||||
echo " You need GNU libtool $want_lt_version or newer installed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
lt_pver=`$libtool --version 2>/dev/null|head -n 1`
|
||||
@@ -206,55 +214,72 @@ lt_qver=`echo $lt_pver|sed -e "s/([^)]*)//g" -e "s/^[^0-9]*//g"`
|
||||
lt_version=`echo $lt_qver|sed -e "s/[- ].*//" -e "s/\([a-z]*\)$//"`
|
||||
if test -z "$lt_version"; then
|
||||
echo "buildconf: libtool not found."
|
||||
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
|
||||
echo " You need GNU libtool $want_lt_version or newer installed."
|
||||
exit 1
|
||||
fi
|
||||
old_IFS=$IFS; IFS='.'; set $lt_version; IFS=$old_IFS
|
||||
lt_major=$1
|
||||
lt_minor=$2
|
||||
lt_patch=$3
|
||||
lt_status="good"
|
||||
|
||||
if test "$lt_major" = "$LIBTOOL_WANTED_MAJOR"; then
|
||||
if test "$lt_minor" -lt "$LIBTOOL_WANTED_MINOR"; then
|
||||
lt_status="bad"
|
||||
elif test -n "$LIBTOOL_WANTED_PATCH"; then
|
||||
if test "$lt_minor" -gt "$LIBTOOL_WANTED_MINOR"; then
|
||||
lt_status="good"
|
||||
elif test -n "$lt_patch"; then
|
||||
if test "$lt_patch" -lt "$LIBTOOL_WANTED_PATCH"; then
|
||||
lt_status="bad"
|
||||
fi
|
||||
else
|
||||
lt_status="bad"
|
||||
fi
|
||||
fi
|
||||
if test -z "$lt_major"; then
|
||||
lt_status="bad"
|
||||
elif test "$lt_major" -gt "$want_lt_major"; then
|
||||
lt_status="good"
|
||||
elif test "$lt_major" -lt "$want_lt_major"; then
|
||||
lt_status="bad"
|
||||
elif test -z "$lt_minor"; then
|
||||
lt_status="bad"
|
||||
elif test "$lt_minor" -gt "$want_lt_minor"; then
|
||||
lt_status="good"
|
||||
elif test "$lt_minor" -lt "$want_lt_minor"; then
|
||||
lt_status="bad"
|
||||
elif test -z "$lt_patch"; then
|
||||
lt_status="bad"
|
||||
elif test "$lt_patch" -gt "$want_lt_patch"; then
|
||||
lt_status="good"
|
||||
elif test "$lt_patch" -lt "$want_lt_patch"; then
|
||||
lt_status="bad"
|
||||
else
|
||||
lt_status="good"
|
||||
fi
|
||||
if test $lt_status != "good"; then
|
||||
if test "$lt_status" != "good"; then
|
||||
echo "buildconf: libtool version $lt_version found."
|
||||
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
|
||||
echo " You need GNU libtool $want_lt_version or newer installed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "buildconf: libtool version $lt_version (ok)"
|
||||
|
||||
if test -f "$libtoolize"; then
|
||||
echo "buildconf: libtoolize found"
|
||||
#--------------------------------------------------------------------------
|
||||
# GNU libtoolize check
|
||||
#
|
||||
if test -z "$LIBTOOLIZE"; then
|
||||
# use (g)libtoolize from same location as (g)libtool
|
||||
libtoolize="${libtool}ize"
|
||||
else
|
||||
echo "buildconf: libtoolize not found. Weird libtool installation!"
|
||||
libtoolize=`findtool $LIBTOOLIZE`
|
||||
fi
|
||||
if test ! -f "$libtoolize"; then
|
||||
echo "buildconf: libtoolize not found."
|
||||
echo " You need GNU libtoolize $want_lt_version or newer installed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# m4 check
|
||||
#
|
||||
m4=`${M4:-m4} --version 2>/dev/null|head -n 1`;
|
||||
m4=`(${M4:-m4} --version || ${M4:-gm4} --version) 2>/dev/null | head -n 1`;
|
||||
m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
||||
|
||||
if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then
|
||||
echo "buildconf: GNU m4 version $m4_version (ok)"
|
||||
else
|
||||
echo "buildconf: m4 version $m4 found. You need a GNU m4 installed!"
|
||||
if test -z "$m4"; then
|
||||
echo "buildconf: m4 version not recognized. You need a GNU m4 installed!"
|
||||
else
|
||||
echo "buildconf: m4 version $m4 found. You need a GNU m4 installed!"
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -262,6 +287,10 @@ fi
|
||||
# perl check
|
||||
#
|
||||
PERL=`findtool ${PERL:-perl}`
|
||||
if test -z "$PERL"; then
|
||||
echo "buildconf: perl not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Remove files generated on previous buildconf/configure run.
|
||||
@@ -289,6 +318,7 @@ for fname in .deps \
|
||||
config.status \
|
||||
config.sub \
|
||||
configure \
|
||||
configurehelp.pm \
|
||||
curl-config \
|
||||
curlbuild.h \
|
||||
depcomp \
|
||||
@@ -296,6 +326,7 @@ for fname in .deps \
|
||||
libcurl.pc \
|
||||
libtool \
|
||||
libtool.m4 \
|
||||
libtool.m4.tmp \
|
||||
ltmain.sh \
|
||||
ltoptions.m4 \
|
||||
ltsugar.m4 \
|
||||
@@ -312,32 +343,49 @@ done
|
||||
#
|
||||
|
||||
echo "buildconf: running libtoolize"
|
||||
$libtoolize --copy --automake --force || die "The libtoolize command failed"
|
||||
${libtoolize} --copy --automake --force || die "libtoolize command failed"
|
||||
|
||||
if test ! -f m4/curl-functions.m4; then
|
||||
echo "buildconf: cURL m4 macros not found"
|
||||
exit 1
|
||||
# When using libtool 1.5.X (X < 26) we copy libtool.m4 to our local m4
|
||||
# subdirectory and this local copy is patched to fix some warnings that
|
||||
# are triggered when running aclocal and using autoconf 2.62 or later.
|
||||
|
||||
if test "$lt_major" = "1" && test "$lt_minor" = "5"; then
|
||||
if test -z "$lt_patch" || test "$lt_patch" -lt "26"; then
|
||||
echo "buildconf: copying libtool.m4 to local m4 subdir"
|
||||
ac_dir=`${ACLOCAL:-aclocal} --print-ac-dir`
|
||||
if test -f $ac_dir/libtool.m4; then
|
||||
cp -f $ac_dir/libtool.m4 m4/libtool.m4
|
||||
else
|
||||
echo "buildconf: $ac_dir/libtool.m4 not found"
|
||||
fi
|
||||
if test -f m4/libtool.m4; then
|
||||
echo "buildconf: renaming some variables in local m4/libtool.m4"
|
||||
$PERL -i.tmp -pe \
|
||||
's/lt_prog_compiler_pic_works/lt_cv_prog_compiler_pic_works/g; \
|
||||
s/lt_prog_compiler_static_works/lt_cv_prog_compiler_static_works/g;' \
|
||||
m4/libtool.m4
|
||||
rm -f m4/libtool.m4.tmp
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -f m4/libtool.m4; then
|
||||
echo "buildconf: converting all mv to mv -f in local m4/libtool.m4"
|
||||
$PERL -i.tmp -pe 's/\bmv +([^-\s])/mv -f $1/g' m4/libtool.m4
|
||||
rm -f m4/libtool.m4.tmp
|
||||
fi
|
||||
|
||||
echo "buildconf: running aclocal"
|
||||
${ACLOCAL:-aclocal} -I m4 $ACLOCAL_FLAGS || die "The aclocal command line failed"
|
||||
${ACLOCAL:-aclocal} -I m4 $ACLOCAL_FLAGS || die "aclocal command failed"
|
||||
|
||||
if test -n "$PERL"; then
|
||||
echo "buildconf: running aclocal hack to convert all mv to mv -f"
|
||||
$PERL -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4
|
||||
else
|
||||
echo "buildconf: perl not found"
|
||||
exit 1
|
||||
fi
|
||||
echo "buildconf: converting all mv to mv -f in local aclocal.m4"
|
||||
$PERL -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4
|
||||
|
||||
echo "buildconf: running autoheader"
|
||||
${AUTOHEADER:-autoheader} || die "The autoheader command failed"
|
||||
|
||||
echo "buildconf: cp lib/curl_config.h.in src/curl_config.h.in"
|
||||
cp lib/curl_config.h.in src/curl_config.h.in
|
||||
${AUTOHEADER:-autoheader} || die "autoheader command failed"
|
||||
|
||||
echo "buildconf: running autoconf"
|
||||
${AUTOCONF:-autoconf} || die "The autoconf command failed"
|
||||
${AUTOCONF:-autoconf} || die "autoconf command failed"
|
||||
|
||||
if test -d ares; then
|
||||
cd ares
|
||||
@@ -347,19 +395,26 @@ if test -d ares; then
|
||||
fi
|
||||
|
||||
echo "buildconf: running automake"
|
||||
${AUTOMAKE:-automake} -a -c || die "The automake command failed"
|
||||
${AUTOMAKE:-automake} --add-missing --copy || die "automake command failed"
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# GNU libtool complementary check
|
||||
#
|
||||
# Depending on the libtool and automake versions being used, config.guess
|
||||
# might not be installed in the subdirectory until automake has finished.
|
||||
# So we can not attempt to use it until this very last buildconf stage.
|
||||
#
|
||||
|
||||
if test ! -f ./config.guess; then
|
||||
echo "buildconf: config.guess not found"
|
||||
else
|
||||
buildhost=`./config.guess 2>/dev/null|head -n 1`
|
||||
case $buildhost in
|
||||
*-*-darwin*)
|
||||
need_lt_major=1
|
||||
need_lt_minor=5
|
||||
need_lt_patch=26
|
||||
need_lt_check="yes"
|
||||
;;
|
||||
*-*-hpux*)
|
||||
need_lt_major=1
|
||||
need_lt_minor=5
|
||||
@@ -392,7 +447,7 @@ else
|
||||
if test "$lt_status" != "good"; then
|
||||
need_lt_version="$need_lt_major.$need_lt_minor.$need_lt_patch"
|
||||
echo "buildconf: libtool version $lt_version found."
|
||||
echo " $buildhost requires libtool $need_lt_version or newer installed."
|
||||
echo " $buildhost requires GNU libtool $need_lt_version or newer installed."
|
||||
rm -f configure
|
||||
exit 1
|
||||
fi
|
||||
@@ -400,8 +455,7 @@ else
|
||||
fi
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Finished succesfully.
|
||||
# Finished successfully.
|
||||
#
|
||||
|
||||
echo "buildconf: OK"
|
||||
exit 0
|
||||
|
859
configure.ac
859
configure.ac
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 2001 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 2001 - 2011, 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
|
||||
@@ -94,7 +94,7 @@ while test $# -gt 0; do
|
||||
;;
|
||||
|
||||
--version)
|
||||
echo libcurl @VERSION@
|
||||
echo libcurl @CURLVERSION@
|
||||
exit 0
|
||||
;;
|
||||
|
||||
@@ -113,7 +113,7 @@ while test $# -gt 0; do
|
||||
# silent success
|
||||
exit 0
|
||||
else
|
||||
echo "requested version $checkfor is newer than existing @VERSION@"
|
||||
echo "requested version $checkfor is newer than existing @CURLVERSION@"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
@@ -142,9 +142,9 @@ while test $# -gt 0; do
|
||||
CURLLIBDIR=""
|
||||
fi
|
||||
if test "X@REQUIRE_LIB_DEPS@" = "Xyes"; then
|
||||
echo ${CURLLIBDIR}-lcurl @LDFLAGS@ @LIBCURL_LIBS@ @LIBS@
|
||||
echo ${CURLLIBDIR}-lcurl @LIBCURL_LIBS@ @LIBS@
|
||||
else
|
||||
echo ${CURLLIBDIR}-lcurl @LDFLAGS@ @LIBS@
|
||||
echo ${CURLLIBDIR}-lcurl @LIBS@
|
||||
fi
|
||||
;;
|
||||
|
||||
|
83
docs/BUGS
83
docs/BUGS
@@ -6,21 +6,34 @@
|
||||
|
||||
BUGS
|
||||
|
||||
1. Bugs
|
||||
1.1 There are still bugs
|
||||
1.2 Where to report
|
||||
1.3 What to report
|
||||
1.4 libcurl problems
|
||||
1.5 Who will fix the problems
|
||||
1.6 How to get a stack trace
|
||||
1.7 Bugs in libcurl bindings
|
||||
|
||||
==============================================================================
|
||||
|
||||
1.1 There are still bugs
|
||||
|
||||
Curl and libcurl have grown substantially since the beginning. At the time
|
||||
of writing (July 2007), there are about 47000 lines of source code, and by
|
||||
the time you read this it has probably grown even more.
|
||||
of writing (September 2011), there are about 66000 lines of source code, and
|
||||
by the time you read this it has probably grown even more.
|
||||
|
||||
Of course there are lots of bugs left. And lots of misfeatures.
|
||||
|
||||
To help us make curl the stable and solid product we want it to be, we need
|
||||
bug reports and bug fixes.
|
||||
|
||||
WHERE TO REPORT
|
||||
1.2 Where to report
|
||||
|
||||
If you can't fix a bug yourself and submit a fix for it, try to report an as
|
||||
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
|
||||
tracking system over at
|
||||
have a go at a solution. You can optionally also post your bug/problem at
|
||||
curl's bug tracking system over at
|
||||
|
||||
http://sourceforge.net/bugs/?group_id=976
|
||||
|
||||
@@ -29,16 +42,18 @@ WHERE TO REPORT
|
||||
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
|
||||
1.3 What to report
|
||||
|
||||
When reporting a bug, you should include all information that will help us
|
||||
understand what's wrong, what you expected to happen and how to repeat the
|
||||
bad behavior. You therefore need to tell us:
|
||||
|
||||
- your operating system's name and version number (uname -a under a unix
|
||||
is fine)
|
||||
- your operating system's name and version number
|
||||
|
||||
- what version of curl you're using (curl -V is fine)
|
||||
|
||||
- versions of the used libraries that libcurl is built to use
|
||||
|
||||
- what URL you were working with (if possible), at least which protocol
|
||||
|
||||
and anything and everything else you think matters. Tell us what you
|
||||
@@ -59,7 +74,48 @@ WHAT TO REPORT
|
||||
The address and how to subscribe to the mailing lists are detailed in the
|
||||
MANUAL file.
|
||||
|
||||
HOW TO GET A STACK TRACE
|
||||
1.4 libcurl problems
|
||||
|
||||
First, post all libcurl problems on the curl-library mailing list.
|
||||
|
||||
When you've written your own application with libcurl to perform transfers,
|
||||
it is even more important to be specific and detailed when reporting bugs.
|
||||
|
||||
Tell us the libcurl version and your operating system. Tell us the name and
|
||||
version of all relevant sub-components like for example the SSL library
|
||||
you're using and what name resolving your libcurl uses. If you use SFTP or
|
||||
SCP, the libssh2 version is relevant etc.
|
||||
|
||||
Showing us a real source code example repeating your problem is the best way
|
||||
to get our attention and it will greatly increase our chances to understand
|
||||
your problem and to work on a fix (if we agree it truly is a problem).
|
||||
|
||||
Lots of problems that appear to be libcurl problems are actually just abuses
|
||||
of the libcurl API or other malfunctions in your applications. It is adviced
|
||||
that you run your problematic program using a memory debug tool like
|
||||
valgrind or similar before you post memory-related or "crashing" problems to
|
||||
us.
|
||||
|
||||
1.5 Who will fix the problems
|
||||
|
||||
If the problems or bugs you describe are considered to be bugs, we want to
|
||||
have the problems fixed.
|
||||
|
||||
There are no developers in the curl project that are paid to work on bugs.
|
||||
All developers that take on reported bugs do this on a voluntary basis. We
|
||||
do it out of an ambition to keep curl and libcurl excellent products and out
|
||||
of pride.
|
||||
|
||||
But please do not assume that you can just lump over something to us and it
|
||||
will then magically be fixed after some given time. Most often we need
|
||||
feedback and help to understand what you've experienced and how to repeat a
|
||||
problem. Then we may only be able to assist YOU to debug the problem and to
|
||||
track down the proper fix.
|
||||
|
||||
We get reports from many people every month and each report can take a
|
||||
considerable amount of time to really go to the bottom with.
|
||||
|
||||
1.6 How to get a stack trace
|
||||
|
||||
First, you must make sure that you compile all sources with -g and that you
|
||||
don't 'strip' the final executable. Try to avoid optimizing the code as
|
||||
@@ -79,3 +135,12 @@ HOW TO GET A STACK TRACE
|
||||
crashed. Include the stack trace with your detailed bug report. It'll help a
|
||||
lot.
|
||||
|
||||
1.7 Bugs in libcurl bindings
|
||||
|
||||
There will of course pop up bugs in libcurl bindings. You should then
|
||||
primarily approach the team that works on that particular binding and see
|
||||
what you can do to help them fix the problem.
|
||||
|
||||
If you suspect that the problem exists in the underlying libcurl, then
|
||||
please convert your program over to plain C and follow the steps outlined
|
||||
above.
|
||||
|
@@ -34,6 +34,7 @@
|
||||
3.3 How To Make a Patch without git
|
||||
3.4 How to get your changes into the main sources
|
||||
3.5 Write good commit messages
|
||||
3.6 Please don't send pull requests
|
||||
|
||||
==============================================================================
|
||||
|
||||
@@ -189,7 +190,7 @@
|
||||
|
||||
3.2 How To Make a Patch with git
|
||||
|
||||
You need to first checkout the respository:
|
||||
You need to first checkout the repository:
|
||||
|
||||
git clone git://github.com/bagder/curl.git
|
||||
|
||||
@@ -233,47 +234,70 @@
|
||||
|
||||
For unix-like operating systems:
|
||||
|
||||
http://www.gnu.org/software/patch/patch.html
|
||||
http://www.gnu.org/directory/diffutils.html
|
||||
http://www.gnu.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
|
||||
http://gnuwin32.sourceforge.net/packages/patch.htm
|
||||
http://gnuwin32.sourceforge.net/packages/diffutils.htm
|
||||
|
||||
3.4 How to get your changes into the main sources
|
||||
|
||||
1. Submit your patch to the curl-library mailing list
|
||||
Submit your patch to the curl-library mailing list.
|
||||
|
||||
2. Make the patch against as recent sources as possible.
|
||||
Make the patch against as recent sources as possible.
|
||||
|
||||
3. Make sure your patch adheres to the source indent and coding style of
|
||||
already existing source code. Failing to do so just adds more work for me.
|
||||
Make sure your patch adheres to the source indent and coding style of already
|
||||
existing source code. Failing to do so just adds more work for me.
|
||||
|
||||
4. Respond to replies on the list about the patch and answer questions and/or
|
||||
fix nits/flaws. This is very important. I will take lack of replies as a
|
||||
sign that you're not very anxious to get your patch accepted and I tend to
|
||||
simply drop such patches from my TODO list.
|
||||
Respond to replies on the list about the patch and answer questions and/or
|
||||
fix nits/flaws. This is very important. I will take lack of replies as a sign
|
||||
that you're not very anxious to get your patch accepted and I tend to simply
|
||||
drop such patches from my TODO list.
|
||||
|
||||
5. If you've followed the above mentioned paragraphs and your patch still
|
||||
hasn't been incorporated after some weeks, consider resubmitting it to the
|
||||
list.
|
||||
If you've followed the above paragraphs and your patch still hasn't been
|
||||
incorporated after some weeks, consider resubmitting it to the list.
|
||||
|
||||
3.5 Write good commit messages
|
||||
|
||||
A short guide to how to do fine commit messages in the curl project.
|
||||
A short guide to how to do fine commit messages in the curl project.
|
||||
|
||||
---- start ----
|
||||
[area]: [short line describing the main effect]
|
||||
---- start ----
|
||||
[area]: [short line describing the main effect]
|
||||
|
||||
[separate the above single line from the rest with an empty line]
|
||||
[separate the above single line from the rest with an empty line]
|
||||
|
||||
[full description, no wider than 72 columns that describe as much as
|
||||
possible as to why this change is made, and possibly what things
|
||||
it fixes and everything else that is related]
|
||||
---- stop ----
|
||||
[full description, no wider than 72 columns that describe as much as
|
||||
possible as to why this change is made, and possibly what things
|
||||
it fixes and everything else that is related]
|
||||
---- stop ----
|
||||
|
||||
Don't forget to use commit --author="" if you commit someone else's work,
|
||||
and make sure that you have your own user and email setup correctly in git
|
||||
before you commit
|
||||
Don't forget to use commit --author="" if you commit someone else's work,
|
||||
and make sure that you have your own user and email setup correctly in git
|
||||
before you commit
|
||||
|
||||
3.6 Please don't send pull requests
|
||||
|
||||
With git (and expecially github) it is easy and tempting to send a pull
|
||||
request to one or more people in the curl project to have changes merged this
|
||||
way instead of mailing patches to the curl-library mailing list.
|
||||
|
||||
We don't like that. We want them mailed for these reasons:
|
||||
|
||||
- Peer review. Anyone and everyone on the list can review, comment and
|
||||
improve on the patch. Pull requests limit this ability.
|
||||
|
||||
- Anyone can merge the patch into their own trees for testing and those who
|
||||
have push rights can push it to the main repo. It doesn't have to be anyone
|
||||
the patch author knows beforehand.
|
||||
|
||||
- Commit messages can be tweaked and changed if merged locally instead of
|
||||
using github. Merges directly on github requires the changes to be perfect
|
||||
already, which they seldomly are.
|
||||
|
||||
- Merges on github prevents rebases and even enforces --no-ff which is a git
|
||||
style we don't otherwise use in the project
|
||||
|
||||
However: once patches have been reviewed and deemed fine on list they are
|
||||
perfectly OK to be pulled from a published git tree.
|
||||
|
262
docs/FAQ
262
docs/FAQ
@@ -1,4 +1,4 @@
|
||||
Updated: June 30, 2010 (http://curl.haxx.se/docs/faq.html)
|
||||
Updated: December 7, 2011 (http://curl.haxx.se/docs/faq.html)
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
@@ -20,6 +20,8 @@ FAQ
|
||||
1.10 How many are using curl?
|
||||
1.11 Why don't you update ca-bundle.crt
|
||||
1.12 I have a problem who can I chat with?
|
||||
1.13 curl's ECCN number?
|
||||
1.14 How do I submit my patch?
|
||||
|
||||
2. Install Related Problems
|
||||
2.1 configure doesn't find OpenSSL even when it is installed
|
||||
@@ -34,7 +36,7 @@ FAQ
|
||||
3.2 How do I tell curl to resume a transfer?
|
||||
3.3 Why doesn't my posting using -F work?
|
||||
3.4 How do I tell curl to run custom FTP commands?
|
||||
3.5 How can I disable the Pragma: nocache header?
|
||||
3.5 How can I disable the Accept: */* header?
|
||||
3.6 Does curl support ASP, XML, XHTML or HTML version Y?
|
||||
3.7 Can I use curl to delete/rename a file through FTP?
|
||||
3.8 How do I tell curl to follow HTTP redirects?
|
||||
@@ -48,6 +50,9 @@ FAQ
|
||||
3.16 What certificates do I need when I use SSL?
|
||||
3.17 How do I list the root dir of an FTP server?
|
||||
3.18 Can I use curl to send a POST/PUT and not wait for a response?
|
||||
3.19 How do I get HTTP from a host using a specific IP address?
|
||||
3.20 How to SFTP from my user's home directory?
|
||||
3.21 Protocol xxx not supported or disabled in libcurl
|
||||
|
||||
4. Running Problems
|
||||
4.1 Problems connecting to SSL servers.
|
||||
@@ -104,7 +109,7 @@ FAQ
|
||||
|
||||
7. PHP/CURL Issues
|
||||
7.1 What is PHP/CURL?
|
||||
7.2 Who write PHP/CURL?
|
||||
7.2 Who wrote PHP/CURL?
|
||||
7.3 Can I perform multiple requests using the same handle?
|
||||
|
||||
==============================================================================
|
||||
@@ -123,8 +128,10 @@ FAQ
|
||||
|
||||
libcurl
|
||||
|
||||
A free and easy-to-use client-side URL transfer library, supporting FTP,
|
||||
FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE, LDAP and LDAPS.
|
||||
A free and easy-to-use client-side URL transfer library, supporting DICT,
|
||||
FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3,
|
||||
POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP.
|
||||
|
||||
libcurl supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading,
|
||||
kerberos, HTTP form based upload, proxies, cookies, user+password
|
||||
authentication, file transfer resume, http proxy tunneling and more!
|
||||
@@ -142,9 +149,8 @@ FAQ
|
||||
|
||||
A command line tool for getting or sending files using URL syntax.
|
||||
|
||||
Since curl uses libcurl, it supports a range of common Internet protocols,
|
||||
currently including HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, LDAPS,
|
||||
DICT, TELNET and FILE.
|
||||
Since curl uses libcurl, curl supports the same wide range of common
|
||||
Internet protocols that libcurl does.
|
||||
|
||||
We pronounce curl and cURL with an initial k sound: [kurl].
|
||||
|
||||
@@ -300,34 +306,10 @@ FAQ
|
||||
We don't know how many users that downloaded or installed curl and then
|
||||
never use it.
|
||||
|
||||
Some facts to use as input to the math:
|
||||
In May 2012 Daniel did a counting game and came up with a number that may
|
||||
be completely wrong or somewhat accurate. 300 million!
|
||||
|
||||
curl packages are downloaded from the curl.haxx.se and mirrors over a
|
||||
million times per year. curl is installed by default with most Linux
|
||||
distributions. curl is installed by default with Mac OS X. curl and libcurl
|
||||
as used by numerous applications that include libcurl binaries in their
|
||||
distribution packages (like Adobe Acrobat Reader and Google Earth).
|
||||
|
||||
More than 90 known named companies use curl in commercial environments and
|
||||
products. More than 100 known named open source projects depend on
|
||||
(lib)curl.
|
||||
|
||||
In a poll on the curl web site mid-2005, more than 50% of the 300+ answers
|
||||
estimated a user base of one million users or more.
|
||||
|
||||
In March 2005, the "Linux Counter project" estimated a total Linux user base
|
||||
of some 29 millions, while Netcraft detected some 4 million "active" Linux
|
||||
based web servers. A guess is that a fair amount of these Linux
|
||||
installations have curl installed.
|
||||
|
||||
All this taken together, there is no doubt that there are millions of
|
||||
(lib)curl users.
|
||||
|
||||
http://curl.haxx.se/docs/companies.html
|
||||
http://curl.haxx.se/docs/programs.html
|
||||
http://curl.haxx.se/libcurl/using/apps.html
|
||||
http://counter.li.org/estimates.php
|
||||
http://news.netcraft.com/archives/2005/03/14/fedora_makes_rapid_progress.html
|
||||
See http://daniel.haxx.se/blog/2012/05/16/300m-users/
|
||||
|
||||
1.11 Why don't you update ca-bundle.crt
|
||||
|
||||
@@ -358,6 +340,41 @@ FAQ
|
||||
IRC network irc.freenode.net. If you're polite and nice, chances are big
|
||||
that you can get -- or provide -- help instantly.
|
||||
|
||||
1.13 curl's ECCN number?
|
||||
|
||||
The US government restricts exports of software that contains or uses
|
||||
cryptography. When doing so, the Export Control Classification Number (ECCN)
|
||||
is used to identify the level of export control etc.
|
||||
|
||||
ASF gives a good explanation at http://www.apache.org/dev/crypto.html
|
||||
|
||||
We believe curl's number might be ECCN 5D002, another possibility is
|
||||
5D992. It seems necessary to write them, asking to confirm.
|
||||
|
||||
Comprehensible explanations of the meaning of such numbers and how to
|
||||
obtain them (resp.) are here
|
||||
|
||||
http://www.bis.doc.gov/licensing/exportingbasics.htm
|
||||
http://www.bis.doc.gov/licensing/do_i_needaneccn.html
|
||||
|
||||
An incomprehensible description of the two numbers above is here
|
||||
http://www.access.gpo.gov/bis/ear/pdf/ccl5-pt2.pdf
|
||||
|
||||
1.14 How do I submit my patch?
|
||||
|
||||
When you have made a patch or a change of whatever sort, and want to submit
|
||||
that to the project, there are a few different ways we prefer:
|
||||
|
||||
o send a patch to the curl-library mailing list. We're many subscribers
|
||||
there and there are lots of people who can review patches, comment on them
|
||||
and "receive" them properly.
|
||||
|
||||
o if your patch changes or fixes a bug, you can also opt to submit a bug
|
||||
report in the bug tracker and attach your patch there. There are less
|
||||
people involved there.
|
||||
|
||||
Lots of more details are found in the CONTRIBUTE and INTERNALS docs.
|
||||
|
||||
|
||||
2. Install Related Problems
|
||||
|
||||
@@ -400,10 +417,10 @@ FAQ
|
||||
|
||||
2.2 Does curl work/build with other SSL libraries?
|
||||
|
||||
Curl has been written to use OpenSSL, GnuTLS, yassl, NSS or PolarSSL,
|
||||
although there should not be many problems using a different library. If
|
||||
anyone does "port" curl to use a different SSL library, we are of course
|
||||
very interested in getting the patch!
|
||||
Curl has been written to use OpenSSL, GnuTLS, yassl, NSS, PolarSSL, axTLS or
|
||||
qssl, although there should not be many problems using a different
|
||||
library. If anyone does "port" curl to use a different SSL library, we are
|
||||
of course very interested in getting the patch!
|
||||
|
||||
2.3 Where can I find a copy of LIBEAY32.DLL?
|
||||
|
||||
@@ -424,9 +441,13 @@ FAQ
|
||||
3.1 curl: (1) SSL is disabled, https: not supported
|
||||
|
||||
If you get this output when trying to get anything from a https:// server,
|
||||
it means that the configure script couldn't find all libs and include files
|
||||
it requires for SSL to work. If the configure script fails to find them,
|
||||
curl is simply built without SSL support.
|
||||
it means that the instance of curl/libcurl that you're using was built
|
||||
without support for this protocol.
|
||||
|
||||
This could've happened if the configure script that was run at build time
|
||||
couldn't find all libs and include files curl requires for SSL to work. If
|
||||
the configure script fails to find them, curl is simply built without SSL
|
||||
support.
|
||||
|
||||
To get the https:// support into a curl that was previously built but that
|
||||
reports that https:// is not supported, you should dig through the document
|
||||
@@ -439,7 +460,6 @@ FAQ
|
||||
3.2 How do I tell curl to resume a transfer?
|
||||
|
||||
Curl supports resumed transfers both ways on both FTP and HTTP.
|
||||
|
||||
Try the -C option.
|
||||
|
||||
3.3 Why doesn't my posting using -F work?
|
||||
@@ -465,11 +485,11 @@ FAQ
|
||||
FTP commands without transferring anything. Therefore you must always specify
|
||||
a URL to transfer to/from even when doing custom FTP commands.
|
||||
|
||||
3.5 How can I disable the Pragma: nocache header?
|
||||
3.5 How can I disable the Accept: */* header?
|
||||
|
||||
You can change all internally generated headers by adding a replacement with
|
||||
the -H/--header option. By adding a header with empty contents you safely
|
||||
disable that one. Use -H "Pragma:" to disable that specific header.
|
||||
disable that one. Use -H "Accept:" to disable that specific header.
|
||||
|
||||
3.6 Does curl support ASP, XML, XHTML or HTML version Y?
|
||||
|
||||
@@ -513,6 +533,12 @@ FAQ
|
||||
install and use them, in the libcurl section of the curl web site:
|
||||
http://curl.haxx.se/libcurl/
|
||||
|
||||
All the various bindings to libcurl are made by other projects and people,
|
||||
outside of the cURL project. The cURL project itself only produces libcurl
|
||||
with its plain C API. If you don't find anywhere else to ask you can ask
|
||||
about bindings on the curl-library list too, but be prepared that people on
|
||||
that list may not know anything about bindings.
|
||||
|
||||
In October 2009, there were interfaces available for the following
|
||||
languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Dylan, Eiffel, Euphoria,
|
||||
Ferite, Gambas, glib/GTK+, Haskell, ILE/RPG, Java, Lisp, Lua, Mono, .NET,
|
||||
@@ -615,6 +641,9 @@ FAQ
|
||||
provide this in order to prove that you actually are who you claim to be.
|
||||
If the server doesn't require this, you don't need a client certificate.
|
||||
|
||||
A client certificate is always used together with a private key, and the
|
||||
private key has a pass phrase that protects it.
|
||||
|
||||
- Server certificate. The server you communicate with has a server
|
||||
certificate. You can and should verify this certificate to make sure that
|
||||
you are truly talking to the real server and not a server impersonating
|
||||
@@ -622,8 +651,9 @@ FAQ
|
||||
|
||||
- Certificate Authority certificate ("CA cert"). You often have several CA
|
||||
certs in a CA cert bundle that can be used to verify a server certificate
|
||||
that was signed by one of the authorities in the bundle. curl comes with a
|
||||
default CA cert bundle. You can override the default.
|
||||
that was signed by one of the authorities in the bundle. curl does not
|
||||
come with a CA cert bundle but most curl installs provide one. You can
|
||||
also override the default.
|
||||
|
||||
The server certificate verification process is made by using a Certificate
|
||||
Authority certificate ("CA cert") that was used to sign the server
|
||||
@@ -654,6 +684,52 @@ FAQ
|
||||
|
||||
But you could easily write your own program using libcurl to do such stunts.
|
||||
|
||||
3.19 How do I get HTTP from a host using a specific IP address?
|
||||
|
||||
For example, you may be trying out a web site installation that isn't yet in
|
||||
the DNS. Or you have a site using multiple IP addresses for a given host
|
||||
name and you want to address a specific one out of the set.
|
||||
|
||||
Set a custom Host: header that identifies the server name you want to reach
|
||||
but use the target IP address in the URL:
|
||||
|
||||
curl --header "Host: www.example.com" http://127.0.0.1/
|
||||
|
||||
You can also opt to add faked host name entries to curl with the --resolve
|
||||
option. That has the added benefit that things like redirects will also work
|
||||
properly. The above operation would instead be done as:
|
||||
|
||||
curl --resolve www.example.com:80:127.0.0.1 http://www.example.com/
|
||||
|
||||
3.20 How to SFTP from my user's home directory?
|
||||
|
||||
Contrary to how FTP works, SFTP and SCP URLs specify the exact directory to
|
||||
work with. It means that if you don't specify that you want the user's home
|
||||
directory, you get the actual root directory.
|
||||
|
||||
To specify a file in your user's home directory, you need to use the correct
|
||||
URL syntax which for sftp might look similar to:
|
||||
|
||||
curl -O -u user:password sftp://example.com/~/file.txt
|
||||
|
||||
and for SCP it is just a different protocol prefix:
|
||||
|
||||
curl -O -u user:password scp://example.com/~/file.txt
|
||||
|
||||
3.21 Protocol xxx not supported or disabled in libcurl
|
||||
|
||||
When passing on a URL to curl to use, it may respond that the particular
|
||||
protocol is not supported or disabled. The particular way this error message
|
||||
is phrased is because curl doesn't make a distinction internally of whether
|
||||
a particular protocol is not supported (ie never got any code added that
|
||||
knows how to speak that protocol) or if it was explicitly disabled. curl can
|
||||
be built to only support a given set of protocols, and the rest would then
|
||||
be disabled or not supported.
|
||||
|
||||
Note that this error will also occur if you pass a wrongly spelled protocol
|
||||
part as in "htpt://example.com" or as in the less evident case if you prefix
|
||||
the protocol part with a space as in " http://example.com/".
|
||||
|
||||
|
||||
4. Running Problems
|
||||
|
||||
@@ -802,10 +878,8 @@ FAQ
|
||||
|
||||
4.9 Curl can't authenticate to the server that requires NTLM?
|
||||
|
||||
This is supported in curl 7.10.6 or later. No earlier curl version knows
|
||||
of this magic. Later versions require the OpenSSL, GnuTLS or Microsoft
|
||||
Windows libraries to provide this functionality. Using the NSS library
|
||||
will not provide NTLM authentication functionality in curl.
|
||||
NTLM support requires OpenSSL, GnuTLS, NSS or Microsoft Windows libraries at
|
||||
build-time to provide this functionality.
|
||||
|
||||
NTLM is a Microsoft proprietary protocol. Proprietary formats are evil. You
|
||||
should not use such ones.
|
||||
@@ -1058,6 +1132,11 @@ FAQ
|
||||
libcurl will reuse connections for all transfers that are made using the
|
||||
same libcurl handle.
|
||||
|
||||
When you use the easy interface, the connection cache is kept within the
|
||||
easy handle. If you instead use the multi interface, the connection cache
|
||||
will be kept within the multi handle and will be shared among all the easy
|
||||
handles that are used within the same multi handle.
|
||||
|
||||
5.7 Link errors when building libcurl on Windows!
|
||||
|
||||
You need to make sure that your project, and all the libraries (both static
|
||||
@@ -1070,19 +1149,21 @@ FAQ
|
||||
|
||||
When building an application that uses the static libcurl library, you must
|
||||
add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
|
||||
dynamic import symbols. If you get linker error like "unknown symbol
|
||||
__imp__curl_easy_init ..." you have linked against the wrong (static)
|
||||
library. If you want to use the libcurl.dll and import lib, you don't need
|
||||
any extra CFLAGS, but use one of the import libraries below. These are the
|
||||
libraries produced by the various lib/Makefile.* files:
|
||||
dynamic import symbols. If you're using Visual Studio, you need to instead
|
||||
add CURL_STATICLIB in the "Preprocessor Definitions" section.
|
||||
|
||||
Target: static lib. import lib for libcurl*.dll.
|
||||
-----------------------------------------------------------
|
||||
MingW: libcurl.a libcurldll.a
|
||||
MSVC (release): libcurl.lib libcurl_imp.lib
|
||||
MSVC (debug): libcurld.lib libcurld_imp.lib
|
||||
Borland: libcurl.lib libcurl_imp.lib
|
||||
If you get linker error like "unknown symbol __imp__curl_easy_init ..." you
|
||||
have linked against the wrong (static) library. If you want to use the
|
||||
libcurl.dll and import lib, you don't need any extra CFLAGS, but use one of
|
||||
the import libraries below. These are the libraries produced by the various
|
||||
lib/Makefile.* files:
|
||||
|
||||
Target: static lib. import lib for libcurl*.dll.
|
||||
-----------------------------------------------------------
|
||||
MingW: libcurl.a libcurldll.a
|
||||
MSVC (release): libcurl.lib libcurl_imp.lib
|
||||
MSVC (debug): libcurld.lib libcurld_imp.lib
|
||||
Borland: libcurl.lib libcurl_imp.lib
|
||||
|
||||
5.8 libcurl.so.X: open failed: No such file or directory
|
||||
|
||||
@@ -1116,21 +1197,20 @@ FAQ
|
||||
- The non-ipv6 resolver that can use one out of four host name resolve calls
|
||||
(depending on what your system supports):
|
||||
|
||||
A - gethostbyname()
|
||||
B - gethostbyname_r() with 3 arguments
|
||||
C - gethostbyname_r() with 5 arguments
|
||||
D - gethostbyname_r() with 6 arguments
|
||||
A - gethostbyname()
|
||||
B - gethostbyname_r() with 3 arguments
|
||||
C - gethostbyname_r() with 5 arguments
|
||||
D - gethostbyname_r() with 6 arguments
|
||||
|
||||
- The ipv6-resolver that uses getaddrinfo()
|
||||
|
||||
- The c-ares based name resolver that uses the c-ares library for resolves.
|
||||
Using this offers asynchronous name resolves but it currently has no IPv6
|
||||
support.
|
||||
Using this offers asynchronous name resolves.
|
||||
|
||||
- The threaded resolver (default option on Windows). It uses:
|
||||
|
||||
A - gethostbyname() on plain ipv4 hosts
|
||||
B - getaddrinfo() on ipv6-enabled hosts
|
||||
A - gethostbyname() on plain ipv4 hosts
|
||||
B - getaddrinfo() on ipv6-enabled hosts
|
||||
|
||||
Also note that libcurl never resolves or reverse-lookups addresses given as
|
||||
pure numbers, such as 127.0.0.1 or ::1.
|
||||
@@ -1162,16 +1242,17 @@ FAQ
|
||||
|
||||
5.13 How do I stop an ongoing transfer?
|
||||
|
||||
There are several ways, but none of them are instant. There is no function
|
||||
you can call from another thread or similar that will stop it immediately.
|
||||
Instead you need to make sure that one of the callbacks you use return an
|
||||
appropriate value that will stop the transfer.
|
||||
With the easy interface you make sure to return the correct error code from
|
||||
one of the callbacks, but none of them are instant. There is no function you
|
||||
can call from another thread or similar that will stop it immediately.
|
||||
Instead, you need to make sure that one of the callbacks you use returns an
|
||||
appropriate value that will stop the transfer. Suitable callbacks that you
|
||||
can do this with include the progress callback, the read callback and the
|
||||
write callback.
|
||||
|
||||
Suitable callbacks that you can do this with include the progress callback,
|
||||
the read callback and the write callback.
|
||||
|
||||
If you're using the multi interface, you also stop a transfer by removing
|
||||
the particular easy handle from the multi stack.
|
||||
If you're using the multi interface, you can also stop a transfer by
|
||||
removing the particular easy handle from the multi stack at any moment you
|
||||
think the transfer is done.
|
||||
|
||||
5.14 Using C++ non-static functions for callbacks?
|
||||
|
||||
@@ -1181,14 +1262,14 @@ FAQ
|
||||
member function that is passed a pointer to the class:
|
||||
|
||||
// f is the pointer to your object.
|
||||
static YourClass::staticFunction(void *buffer, size_t sz, size_t n, void *f)
|
||||
static YourClass::func(void *buffer, size_t sz, size_t n, void *f)
|
||||
{
|
||||
// Call non-static member function.
|
||||
static_cast<YourClass*>(f)->nonStaticFunction();
|
||||
}
|
||||
|
||||
// This is how you pass pointer to the static function:
|
||||
curl_easy_setopt(hcurl, CURLOPT_WRITEFUNCTION, YourClass:staticFunction);
|
||||
curl_easy_setopt(hcurl, CURLOPT_WRITEFUNCTION, YourClass:func);
|
||||
curl_easy_setopt(hcurl, CURLOPT_WRITEDATA, this);
|
||||
|
||||
5.15 How do I get an FTP directory listing?
|
||||
@@ -1222,7 +1303,10 @@ FAQ
|
||||
this section was much enhanced by Bjorn Reese.)
|
||||
|
||||
We are not lawyers and this is not legal advice. You should probably consult
|
||||
one if you want true and accurate legal insights without our prejudice.
|
||||
one if you want true and accurate legal insights without our prejudice. Note
|
||||
especially that this section concerns the libcurl license only; compiling in
|
||||
features of libcurl that depend on other libraries (e.g. OpenSSL) may affect
|
||||
the licensing obligations of your application.
|
||||
|
||||
6.1 I have a GPL program, can I use the libcurl library?
|
||||
|
||||
@@ -1280,12 +1364,16 @@ FAQ
|
||||
You do not have to reveal or make public any changes to the libcurl source
|
||||
code.
|
||||
|
||||
You do not have to reveal or make public that you are using libcurl within
|
||||
You do not have to broadcast to the world that you are using libcurl within
|
||||
your app.
|
||||
|
||||
As can be seen here: http://curl.haxx.se/docs/companies.html and
|
||||
elsewhere, more and more companies are discovering the power
|
||||
of libcurl and take advantage of it even in commercial environments.
|
||||
All we ask is that you disclose "the copyright notice and this permission
|
||||
notice" somewhere. Most probably like in the documentation or in the section
|
||||
where other third party dependencies already are mentioned and acknowledged.
|
||||
|
||||
As can be seen here: http://curl.haxx.se/docs/companies.html and elsewhere,
|
||||
more and more companies are discovering the power of libcurl and take
|
||||
advantage of it even in commercial environments.
|
||||
|
||||
|
||||
7. PHP/CURL Issues
|
||||
@@ -1301,7 +1389,7 @@ FAQ
|
||||
CURL (often using all caps) or sometimes ext/curl, but both cause much
|
||||
confusion to users which in turn gives us a higher question load.
|
||||
|
||||
7.2 Who write PHP/CURL?
|
||||
7.2 Who wrote PHP/CURL?
|
||||
|
||||
PHP/CURL is a module that comes with the regular PHP package. It depends and
|
||||
uses libcurl, so you need to have libcurl installed properly first before
|
||||
|
@@ -125,7 +125,7 @@ FILE
|
||||
FOOTNOTES
|
||||
=========
|
||||
|
||||
*1 = requires OpenSSL, GnuTLS, NSS, yassl or PolarSSL
|
||||
*1 = requires OpenSSL, GnuTLS, NSS, yassl, axTLS or PolarSSL
|
||||
*2 = requires OpenLDAP
|
||||
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
||||
*4 = requires FBopenssl
|
||||
|
@@ -161,6 +161,12 @@ December 2005:
|
||||
|
||||
security vulnerability: libcurl URL Buffer Overflow
|
||||
|
||||
January 2006:
|
||||
|
||||
We dropped support for Gopher. We found bugs in the implementation that
|
||||
turned out having been introduced years ago, so with the conclusion that
|
||||
nobody had found out in all this time we removed it instead of fixing it.
|
||||
|
||||
March 2006:
|
||||
|
||||
security vulnerability: libcurl TFTP Packet Buffer Overflow
|
||||
@@ -235,3 +241,4 @@ August 2010:
|
||||
Known libcurl bindings: 39
|
||||
Contributors: 808
|
||||
|
||||
Gopher support added (re-added actually)
|
||||
|
158
docs/INSTALL
158
docs/INSTALL
@@ -14,6 +14,12 @@ Installing Binary Packages
|
||||
binary package. This document describes how to compile, build and install
|
||||
curl and libcurl from source code.
|
||||
|
||||
Building from git
|
||||
=================
|
||||
|
||||
If you get your code off a git repository, see the GIT-INFO file in the
|
||||
root directory for specific instructions on how to proceed.
|
||||
|
||||
UNIX
|
||||
====
|
||||
A normal unix installation is made in three or four steps (after you've
|
||||
@@ -142,6 +148,9 @@ UNIX
|
||||
To build with PolarSSL support instead of OpenSSL for SSL/TLS, note that
|
||||
you need to use both --without-ssl and --with-polarssl.
|
||||
|
||||
To build with axTLS support instead of OpenSSL for TLS, note that you
|
||||
need to use both --without-ssl and --with-axtls.
|
||||
|
||||
To get GSSAPI support, build with --with-gssapi and have the MIT or
|
||||
Heimdal Kerberos 5 packages installed.
|
||||
|
||||
@@ -208,9 +217,9 @@ Win32
|
||||
adjust as necessary. It is also possible to override these paths with
|
||||
environment variables, for example:
|
||||
|
||||
set ZLIB_PATH=c:\zlib-1.2.3
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8k
|
||||
set LIBSSH2_PATH=c:\libssh2-1.1
|
||||
set ZLIB_PATH=c:\zlib-1.2.7
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8x
|
||||
set LIBSSH2_PATH=c:\libssh2-1.4.2
|
||||
|
||||
ATTENTION: if you want to build with libssh2 support you have to use latest
|
||||
version 0.17 - previous versions will NOT work with 7.17.0 and later!
|
||||
@@ -229,7 +238,7 @@ Win32
|
||||
|
||||
If you want to enable LDAPS support then set LDAPS=1.
|
||||
|
||||
- optional MingW32-built OpenlDAP SDK available from:
|
||||
- optional MingW32-built OpenLDAP SDK available from:
|
||||
http://www.gknw.net/mirror/openldap/
|
||||
- optional recent Novell CLDAP SDK available from:
|
||||
http://developer.novell.com/ndk/cldap.htm
|
||||
@@ -311,7 +320,7 @@ Win32
|
||||
documentation on how to compile zlib. Define the ZLIB_PATH environment
|
||||
variable to the location of zlib.h and zlib.lib, for example:
|
||||
|
||||
set ZLIB_PATH=c:\zlib-1.2.3
|
||||
set ZLIB_PATH=c:\zlib-1.2.7
|
||||
|
||||
Then run 'nmake vc-zlib' in curl's root directory.
|
||||
|
||||
@@ -325,7 +334,7 @@ Win32
|
||||
Before running nmake define the OPENSSL_PATH environment variable with
|
||||
the root/base directory of OpenSSL, for example:
|
||||
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8k
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8x
|
||||
|
||||
Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root
|
||||
directory. 'nmake vc-ssl' will create a libcurl static and dynamic
|
||||
@@ -374,30 +383,49 @@ Win32
|
||||
Borland C++ compiler
|
||||
---------------------
|
||||
|
||||
compile openssl
|
||||
Ensure that your build environment is properly set up to use the compiler
|
||||
and associated tools. PATH environment variable must include the path to
|
||||
bin subdirectory of your compiler installation, eg: c:\Borland\BCC55\bin
|
||||
|
||||
Make sure you include the paths to curl/include and openssl/inc32 in
|
||||
your bcc32.cnf file
|
||||
It is advisable to set environment variable BCCDIR to the base path of
|
||||
the compiler installation.
|
||||
|
||||
eg : -I"c:\Bcc55\include;c:\path_curl\include;c:\path_openssl\inc32"
|
||||
set BCCDIR=c:\Borland\BCC55
|
||||
|
||||
Check to make sure that all of the sources listed in lib/Makefile.b32
|
||||
are present in the /path_to_curl/lib directory. (Check the src
|
||||
directory for missing ones.)
|
||||
In order to build a plain vanilla version of curl and libcurl run the
|
||||
following command from curl's root directory:
|
||||
|
||||
Make sure the environment variable "BCCDIR" is set to the install
|
||||
location for the compiler eg : c:\Borland\BCC55
|
||||
make borland
|
||||
|
||||
command line:
|
||||
make -f /path_to_curl/lib/Makefile-ssl.b32
|
||||
To build curl and libcurl with zlib and OpenSSL support set environment
|
||||
variables ZLIB_PATH and OPENSSL_PATH to the base subdirectories of the
|
||||
already built zlib and OpenSSL libraries and from curl's root directory
|
||||
run command:
|
||||
|
||||
compile simplessl.c with appropriate links
|
||||
make borland-ssl-zlib
|
||||
|
||||
libcurl library will be built in 'lib' subdirectory while curl tool
|
||||
is built in 'src' subdirectory. In order to use libcurl library it is
|
||||
advisable to modify compiler's configuration file bcc32.cfg located
|
||||
in c:\Borland\BCC55\bin to reflect the location of libraries include
|
||||
paths for example the '-I' line could result in something like:
|
||||
|
||||
-I"c:\Borland\BCC55\include;c:\curl\include;c:\openssl\inc32"
|
||||
|
||||
bcc3.cfg '-L' line could also be modified to reflect the location of
|
||||
of libcurl library resulting for example:
|
||||
|
||||
-L"c:\Borland\BCC55\lib;c:\curl\lib;c:\openssl\out32"
|
||||
|
||||
In order to build sample program 'simple.c' from the docs\examples
|
||||
subdirectory run following command from mentioned subdirectory:
|
||||
|
||||
bcc32 simple.c libcurl.lib cw32mt.lib
|
||||
|
||||
In order to build sample program simplessl.c an SSL enabled libcurl
|
||||
is required, as well as the OpenSSL libeay32.lib and ssleay32.lib
|
||||
libraries.
|
||||
|
||||
c:\curl\docs\examples\> bcc32 -L c:\path_to_curl\lib\libcurl.lib
|
||||
-L c:\borland\bcc55\lib\psdk\ws2_32.lib
|
||||
-L c:\openssl\out32\libeay32.lib
|
||||
-L c:\openssl\out32\ssleay32.lib
|
||||
simplessl.c
|
||||
|
||||
OTHER MSVC IDEs
|
||||
---------------
|
||||
@@ -439,6 +467,34 @@ Win32
|
||||
in the vc6libcurl.dsw/vc6libcurl.dsp Visual C++ 6 IDE project.
|
||||
|
||||
|
||||
Using BSD-style lwIP instead of Winsock TCP/IP stack in Win32 builds
|
||||
--------------------------------------------------------------------
|
||||
|
||||
In order to compile libcurl and curl using BSD-style lwIP TCP/IP stack
|
||||
it is necessary to make definition of preprocessor symbol USE_LWIPSOCK
|
||||
visible to libcurl and curl compilation processes. To set this definition
|
||||
you have the following alternatives:
|
||||
|
||||
- Modify lib/config-win32.h and src/config-win32.h
|
||||
- Modify lib/Makefile.vc6
|
||||
- Add definition to Project/Settings/C/C++/General/Preprocessor Definitions
|
||||
in the vc6libcurl.dsw/vc6libcurl.dsp Visual C++ 6 IDE project.
|
||||
|
||||
Once that libcurl has been built with BSD-style lwIP TCP/IP stack support,
|
||||
in order to use it with your program it is mandatory that your program
|
||||
includes lwIP header file <lwip/opt.h> (or another lwIP header that includes
|
||||
this) before including any libcurl header. Your program does not need the
|
||||
USE_LWIPSOCK preprocessor definition which is for libcurl internals only.
|
||||
|
||||
Compilation has been verified with lwIP 1.4.0 and contrib-1.4.0 from:
|
||||
|
||||
http://download.savannah.gnu.org/releases/lwip/lwip-1.4.0.zip
|
||||
http://download.savannah.gnu.org/releases/lwip/contrib-1.4.0.zip
|
||||
|
||||
This BSD-style lwIP TCP/IP stack support must be considered experimental
|
||||
given that it has been verified that lwIP 1.4.0 still needs some polish,
|
||||
and libcurl might yet need some additional adjustment, caveat emptor.
|
||||
|
||||
Important static libcurl usage note
|
||||
-----------------------------------
|
||||
|
||||
@@ -638,7 +694,7 @@ NetWare
|
||||
Builds automatically created 8 times a day from current git are here:
|
||||
http://www.gknw.net/mirror/curl/autobuilds/
|
||||
the status of these builds can be viewed at the autobuild table:
|
||||
http://curl.haxx.se/auto/
|
||||
http://curl.haxx.se/dev/builds.html
|
||||
|
||||
|
||||
eCos
|
||||
@@ -784,7 +840,30 @@ VxWorks
|
||||
|
||||
Android
|
||||
=======
|
||||
See the build notes in the Android.mk file.
|
||||
Method using the static makefile:
|
||||
- see the build notes in the Android.mk file.
|
||||
|
||||
Method using a configure cross-compile (tested with Android NDK r7b):
|
||||
- prepare the toolchain of the Android NDK for standalone use; this can
|
||||
be done by invoking the script:
|
||||
./tools/make-standalone-toolchain.sh
|
||||
which creates a usual cross-compile toolchain. Lets assume that you put
|
||||
this toolchain below /opt then invoke configure with something like:
|
||||
export PATH=/opt/arm-linux-androideabi-4.4.3/bin:$PATH
|
||||
./configure --host=arm-linux-androideabi [more configure options]
|
||||
make
|
||||
- if you want to compile directly from our GIT repo you might run into
|
||||
this issue with older automake stuff:
|
||||
checking host system type...
|
||||
Invalid configuration `arm-linux-androideabi':
|
||||
system `androideabi' not recognized
|
||||
configure: error: /bin/sh ./config.sub arm-linux-androideabi failed
|
||||
this issue can be fixed with using more recent versions of config.sub
|
||||
and config.guess which can be obtained here:
|
||||
http://git.savannah.gnu.org/gitweb/?p=config.git;a=tree
|
||||
you need to replace your system-own versions which usually can be
|
||||
found in your automake folder:
|
||||
find /usr -name config.sub
|
||||
|
||||
|
||||
CROSS COMPILE
|
||||
@@ -882,9 +961,9 @@ REDUCING SIZE
|
||||
.comment section).
|
||||
|
||||
Using these techniques it is possible to create a basic HTTP-only shared
|
||||
libcurl library for i386 Linux platforms that is only 98 KiB in size, and
|
||||
an FTP-only library that is 94 KiB in size (as of libcurl version 7.20.0,
|
||||
using gcc 4.3.3).
|
||||
libcurl library for i386 Linux platforms that is only 101 KiB in size, and
|
||||
an FTP-only library that is 105 KiB in size (as of libcurl version 7.21.5,
|
||||
using gcc 4.4.3).
|
||||
|
||||
You may find that statically linking libcurl to your application will
|
||||
result in a lower total size than dynamically linking.
|
||||
@@ -980,10 +1059,21 @@ PORTS
|
||||
Useful URLs
|
||||
===========
|
||||
|
||||
OpenSSL http://www.openssl.org
|
||||
MingW http://www.mingw.org
|
||||
OpenLDAP http://www.openldap.org
|
||||
Zlib http://www.gzip.org/zlib/
|
||||
libssh2 http://www.libssh2.org
|
||||
|
||||
axTLS http://axtls.sourceforge.net/
|
||||
c-ares http://c-ares.haxx.se/
|
||||
GNU GSS http://www.gnu.org/software/gss/
|
||||
GnuTLS http://www.gnu.org/software/gnutls/
|
||||
Heimdal http://www.pdc.kth.se/heimdal/
|
||||
libidn http://www.gnu.org/software/libidn/
|
||||
libssh2 http://www.libssh2.org/
|
||||
MIT Kerberos http://web.mit.edu/kerberos/www/dist/
|
||||
NSS http://www.mozilla.org/projects/security/pki/nss/
|
||||
OpenLDAP http://www.openldap.org/
|
||||
OpenSSL http://www.openssl.org/
|
||||
PolarSSL http://polarssl.org/
|
||||
yassl http://www.yassl.com/
|
||||
Zlib http://www.zlib.net/
|
||||
|
||||
MingW http://www.mingw.org/
|
||||
MinGW-w64 http://mingw-w64.sourceforge.net/
|
||||
OpenWatcom http://www.openwatcom.org/
|
||||
|
16
docs/INSTALL.cmake
Executable file → Normal file
16
docs/INSTALL.cmake
Executable file → Normal file
@@ -18,6 +18,17 @@ Building with CMake
|
||||
CMake builds can be configured either from the command line, or from one
|
||||
of CMake's GUI's.
|
||||
|
||||
Important notice
|
||||
==================
|
||||
If you got your curl sources from a distribution tarball, make sure to
|
||||
delete the generic 'include/curl/curlbuild.h' file that comes with it:
|
||||
rm -f curl/include/curl/curlbuild.h
|
||||
|
||||
The purpose of this file is to provide reasonable definitions for systems
|
||||
where autoconfiguration is not available. CMake will create its own
|
||||
version of this file in its build directory. If the "generic" version
|
||||
is not deleted, weird build errors may occur on some systems.
|
||||
|
||||
Command Line CMake
|
||||
==================
|
||||
A command line build of Curl is similar to the autotools build of Curl. It
|
||||
@@ -32,9 +43,10 @@ Command Line CMake
|
||||
# variable prior to running CMake.
|
||||
cmake ../curl
|
||||
make
|
||||
# currently make test and make install are not implemented
|
||||
# currently make test is not implemented
|
||||
#make test
|
||||
#make install
|
||||
# Install to default location:
|
||||
make install
|
||||
|
||||
ccmake
|
||||
=========
|
||||
|
@@ -15,7 +15,7 @@ INTERNALS
|
||||
GIT
|
||||
===
|
||||
All changes to the sources are committed to the git repository as soon as
|
||||
they're somewhat verified to work. Changes shall be commited as independently
|
||||
they're somewhat verified to work. Changes shall be committed as independently
|
||||
as possible so that individual changes can be easier spotted and tracked
|
||||
afterwards.
|
||||
|
||||
@@ -37,13 +37,14 @@ Portability
|
||||
GnuTLS 1.2
|
||||
zlib 1.1.4
|
||||
libssh2 0.16
|
||||
c-ares 1.5.0
|
||||
c-ares 1.6.0
|
||||
libidn 0.4.1
|
||||
*yassl 1.4.0 (http://curl.haxx.se/mail/lib-2008-02/0093.html)
|
||||
cyassl 2.0.0
|
||||
openldap 2.0
|
||||
MIT krb5 lib 1.2.4
|
||||
qsossl V5R2M0
|
||||
NSS 3.11.x
|
||||
NSS 3.12.x
|
||||
axTLS 1.2.7
|
||||
Heimdal ?
|
||||
|
||||
* = only partly functional, but that's due to bugs in the third party lib, not
|
||||
@@ -67,7 +68,7 @@ Portability
|
||||
GNU Autoconf 2.57
|
||||
GNU Automake 1.7 (we currently avoid 1.10 due to Solaris-related bugs)
|
||||
GNU M4 1.4
|
||||
perl 4
|
||||
perl 5.004
|
||||
roffit 0.5
|
||||
groff ? (any version that supports "groff -Tps -man [in] [out]")
|
||||
ps2pdf (gs) ?
|
||||
@@ -90,7 +91,7 @@ Windows vs Unix
|
||||
do it etc there might be reasons for applications to alter that behaviour.
|
||||
|
||||
3. The file descriptors for network communication and file operations are
|
||||
not easily interchangable as in unix.
|
||||
not easily interchangeable as in unix.
|
||||
|
||||
We avoid this by not trying any funny tricks on file descriptors.
|
||||
|
||||
@@ -103,9 +104,9 @@ Windows vs Unix
|
||||
Inside the source code, We make an effort to avoid '#ifdef [Your OS]'. All
|
||||
conditionals that deal with features *should* instead be in the format
|
||||
'#ifdef HAVE_THAT_WEIRD_FUNCTION'. Since Windows can't run configure scripts,
|
||||
we maintain two curl_config-win32.h files (one in lib/ and one in src/) that
|
||||
are supposed to look exactly as a curl_config.h file would have looked like on
|
||||
a Windows machine!
|
||||
we maintain a curl_config-win32.h file in lib directory that is supposed to
|
||||
look exactly as a curl_config.h file would have looked like on a Windows
|
||||
machine!
|
||||
|
||||
Generally speaking: always remember that this will be compiled on dozens of
|
||||
operating systems. Don't walk on the edge.
|
||||
@@ -182,7 +183,7 @@ Library
|
||||
|
||||
Some time during the DO function, the Curl_setup_transfer() function must
|
||||
be called with some basic info about the upcoming transfer: what socket(s)
|
||||
to read/write and the expected file tranfer sizes (if known).
|
||||
to read/write and the expected file transfer sizes (if known).
|
||||
|
||||
o Transfer()
|
||||
|
||||
@@ -224,15 +225,15 @@ Library
|
||||
A quick roundup on internal function sequences (many of these call
|
||||
protocol-specific function-pointers):
|
||||
|
||||
curl_connect - connects to a remote site and does initial connect fluff
|
||||
Curl_connect - connects to a remote site and does initial connect fluff
|
||||
This also checks for an existing connection to the requested site and uses
|
||||
that one if it is possible.
|
||||
|
||||
curl_do - starts a transfer
|
||||
curl_transfer() - transfers data
|
||||
curl_done - ends a transfer
|
||||
Curl_do - starts a transfer
|
||||
Curl_handler::do_it() - transfers data
|
||||
Curl_done - ends a transfer
|
||||
|
||||
curl_disconnect - disconnects from a remote site. This is called when the
|
||||
Curl_disconnect - disconnects from a remote site. This is called when the
|
||||
disconnect is really requested, which doesn't necessarily have to be
|
||||
exactly after curl_done in case we want to keep the connection open for
|
||||
a while.
|
||||
@@ -249,16 +250,16 @@ Library
|
||||
HTTPS uses in almost every means the same procedure as HTTP, with only two
|
||||
exceptions: the connect procedure is different and the function used to read
|
||||
or write from the socket is different, although the latter fact is hidden in
|
||||
the source by the use of curl_read() for reading and curl_write() for writing
|
||||
the source by the use of Curl_read() for reading and Curl_write() for writing
|
||||
data to the remote server.
|
||||
|
||||
http_chunks.c contains functions that understands HTTP 1.1 chunked transfer
|
||||
encoding.
|
||||
|
||||
An interesting detail with the HTTP(S) request, is the add_buffer() series of
|
||||
functions we use. They append data to one single buffer, and when the
|
||||
building is done the entire request is sent off in one single write. This is
|
||||
done this way to overcome problems with flawed firewalls and lame servers.
|
||||
An interesting detail with the HTTP(S) request, is the Curl_add_buffer()
|
||||
series of functions we use. They append data to one single buffer, and when
|
||||
the building is done the entire request is sent off in one single write. This
|
||||
is done this way to overcome problems with flawed firewalls and lame servers.
|
||||
|
||||
FTP
|
||||
|
||||
@@ -284,14 +285,14 @@ Library
|
||||
|
||||
LDAP
|
||||
|
||||
Everything LDAP is in lib/ldap.c.
|
||||
Everything LDAP is in lib/ldap.c and lib/openldap.c
|
||||
|
||||
GENERAL
|
||||
|
||||
URL encoding and decoding, called escaping and unescaping in the source code,
|
||||
is found in lib/escape.c.
|
||||
|
||||
While transfering data in Transfer() a few functions might get used.
|
||||
While transferring data in Transfer() a few functions might get used.
|
||||
curl_getdate() in lib/parsedate.c is for HTTP date comparisons (and more).
|
||||
|
||||
lib/getenv.c offers curl_getenv() which is for reading environment variables
|
||||
@@ -303,7 +304,7 @@ Library
|
||||
lib/netrc.c holds the .netrc parser
|
||||
|
||||
lib/timeval.c features replacement functions for systems that don't have
|
||||
gettimeofday() and a few support functions for timeval convertions.
|
||||
gettimeofday() and a few support functions for timeval conversions.
|
||||
|
||||
A function named curl_version() that returns the full curl version string is
|
||||
found in lib/version.c.
|
||||
@@ -356,8 +357,10 @@ multi interface/non-blocking
|
||||
|
||||
The FTP and the SFTP/SCP protocols are thus perfect examples of how we adapt
|
||||
and adjust the code to allow non-blocking operations even on multi-stage
|
||||
protocols. The DICT, LDAP and TELNET are crappy examples and they are subject
|
||||
for rewrite in the future to better fit the libcurl protocol family.
|
||||
protocols. They are built around state machines that return when they could
|
||||
block waiting for data. The DICT, LDAP and TELNET protocols are crappy
|
||||
examples and they are subject for rewrite in the future to better fit the
|
||||
libcurl protocol family.
|
||||
|
||||
SSL libraries
|
||||
=============
|
||||
@@ -379,7 +382,9 @@ Library Symbols
|
||||
All symbols used internally in libcurl must use a 'Curl_' prefix if they're
|
||||
used in more than a single file. Single-file symbols must be made static.
|
||||
Public ("exported") symbols must use a 'curl_' prefix. (There are exceptions,
|
||||
but they are to be changed to follow this pattern in future versions.)
|
||||
but they are to be changed to follow this pattern in future versions.) Public
|
||||
API functions are marked with CURL_EXTERN in the public header files so that
|
||||
all others can be hidden on platforms where this is possible.
|
||||
|
||||
Return Codes and Informationals
|
||||
===============================
|
||||
@@ -458,31 +463,43 @@ Memory Debugging
|
||||
Test Suite
|
||||
==========
|
||||
|
||||
Since November 2000, a test suite has evolved. It is placed in its own
|
||||
subdirectory directly off the root in the curl archive tree, and it contains
|
||||
a bunch of scripts and a lot of test case data.
|
||||
The test suite is placed in its own subdirectory directly off the root in the
|
||||
curl archive tree, and it contains a bunch of scripts and a lot of test case
|
||||
data.
|
||||
|
||||
The main test script is runtests.pl that will invoke the two servers
|
||||
The main test script is runtests.pl that will invoke test servers like
|
||||
httpserver.pl and ftpserver.pl before all the test cases are performed. The
|
||||
test suite currently only runs on unix-like platforms.
|
||||
|
||||
You'll find a complete description of the test case data files in the
|
||||
tests/README file.
|
||||
You'll find a description of the test suite in the tests/README file, and the
|
||||
test case data files in the tests/FILEFORMAT file.
|
||||
|
||||
The test suite automatically detects if curl was built with the memory
|
||||
debugging enabled, and if it was it will detect memory leaks too.
|
||||
debugging enabled, and if it was it will detect memory leaks, too.
|
||||
|
||||
Building Releases
|
||||
=================
|
||||
|
||||
There's no magic to this. When you consider everything stable enough to be
|
||||
released, run the 'maketgz' script (using 'make distcheck' will give you a
|
||||
pretty good view on the status of the current sources). maketgz prompts for
|
||||
version number of the client and the library before it creates a release
|
||||
archive. maketgz uses 'make dist' for the actual archive building, why you
|
||||
need to fill in the Makefile.am files properly for which files that should
|
||||
be included in the release archives.
|
||||
released, do this:
|
||||
|
||||
NOTE: you need to have curl checked out from git to be able to do a proper
|
||||
1. Tag the source code accordingly.
|
||||
|
||||
2. run the 'maketgz' script (using 'make distcheck' will give you a pretty
|
||||
good view on the status of the current sources). maketgz requires a
|
||||
version number and creates the release archive. maketgz uses 'make dist'
|
||||
for the actual archive building, why you need to fill in the Makefile.am
|
||||
files properly for which files that should be included in the release
|
||||
archives.
|
||||
|
||||
3. When that's complete, sign the output files.
|
||||
|
||||
4. Upload
|
||||
|
||||
5. Update web site and changelog on site
|
||||
|
||||
6. Send announcement to the mailing lists
|
||||
|
||||
NOTE: you must have curl checked out from git to be able to do a proper
|
||||
release build. The release tarballs do not have everything setup in order to
|
||||
do releases properly.
|
||||
|
@@ -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
|
||||
may have been fixed since this was written!
|
||||
|
||||
78. curl and libcurl don't always signal the client properly when "sending"
|
||||
zero bytes files - it makes for example the command line client not creating
|
||||
any file at all. Like when using FTP.
|
||||
http://curl.haxx.se/bug/view.cgi?id=3438362
|
||||
|
||||
77. CURLOPT_FORBID_REUSE on a handle prevents NTLM from working since it
|
||||
"absuses" the underlying connection re-use system and if connections are
|
||||
forced to close they break the NTLM support.
|
||||
|
||||
76. The SOCKET type in Win64 is 64 bits large (and thus so is curl_socket_t on
|
||||
that platform), and long is only 32 bits. It makes it impossible for
|
||||
curl_easy_getinfo() to return a socket properly with the CURLINFO_LASTSOCKET
|
||||
@@ -12,12 +21,6 @@ may have been fixed since this was written!
|
||||
http://curl.haxx.se/mail/lib-2009-10/0024.html
|
||||
http://curl.haxx.se/bug/view.cgi?id=2944325
|
||||
|
||||
74. The HTTP spec allows headers to be merged and become comma-separated
|
||||
instead of being repeated several times. This also include Authenticate: and
|
||||
Proxy-Authenticate: headers and while this hardly every happens in real life
|
||||
it will confuse libcurl which does not properly support it for all headers -
|
||||
like those Authenticate headers.
|
||||
|
||||
73. if a connection is made to a FTP server but the server then just never
|
||||
sends the 220 response or otherwise is dead slow, libcurl will not
|
||||
acknowledge the connection timeout during that phase but only the "real"
|
||||
@@ -54,11 +57,6 @@ may have been fixed since this was written!
|
||||
handle with curl_easy_cleanup() and create a new. Some more details:
|
||||
http://curl.haxx.se/mail/lib-2009-04/0300.html
|
||||
|
||||
62. CURLOPT_TIMEOUT does not work properly with the regular multi and
|
||||
multi_socket interfaces. The work-around for apps is to simply remove the
|
||||
easy handle once the time is up. See also:
|
||||
http://curl.haxx.se/bug/view.cgi?id=2501457
|
||||
|
||||
61. If an upload using Expect: 100-continue receives an HTTP 417 response,
|
||||
it ought to be automatically resent without the Expect:. A workaround is
|
||||
for the client application to redo the transfer after disabling Expect:.
|
||||
|
@@ -55,6 +55,10 @@ NSS http://www.mozilla.org/projects/security/pki/nss/
|
||||
grant you different permissions and impose different obligations. You
|
||||
should select the license that best meets your needs.
|
||||
|
||||
axTLS http://axtls.sourceforge.net/
|
||||
|
||||
(May be used for SSL/TLS support) Uses a Modified BSD-style license.
|
||||
|
||||
c-ares http://daniel.haxx.se/projects/c-ares/license.html
|
||||
|
||||
(Used for asynchronous name resolves) Uses an MIT license that is very
|
||||
|
228
docs/MAIL-ETIQUETTE
Normal file
228
docs/MAIL-ETIQUETTE
Normal file
@@ -0,0 +1,228 @@
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
MAIL ETIQUETTE
|
||||
|
||||
1. About the lists
|
||||
1.1 Mailing Lists
|
||||
1.2 Netiquette
|
||||
1.3 Do Not Mail a Single Individual
|
||||
1.4 Subscription Required
|
||||
1.5 Moderation of new posters
|
||||
1.6 Handling trolls and spam
|
||||
1.7 How to unsubscribe
|
||||
|
||||
2. Sending mail
|
||||
2.1 Reply or New Mail
|
||||
2.2 Reply to the List
|
||||
2.3 Use a Sensible Subject
|
||||
2.4 Do Not Top-Post
|
||||
2.5 HTML is not for mails
|
||||
2.6 Quoting
|
||||
2.7 Digest
|
||||
2.8 Please Tell Us How You Solved The Problem!
|
||||
|
||||
==============================================================================
|
||||
|
||||
1. About the lists
|
||||
|
||||
1.1 Mailing Lists
|
||||
|
||||
The mailing lists we have are all listed and described at
|
||||
http://curl.haxx.se/mail/
|
||||
|
||||
Each mailing list is targeted to a specific set of users and subjects,
|
||||
please use the one or the ones that suit you the most.
|
||||
|
||||
Each mailing list have hundreds up to thousands of readers, meaning that
|
||||
each mail sent will be received and read by a very large amount of people.
|
||||
People from various cultures, regions, religions and continents.
|
||||
|
||||
1.2 Netiquette
|
||||
|
||||
Netiquette is a common name for how to behave on the internet. Of course, in
|
||||
each particular group and subculture there will be differences in what is
|
||||
acceptable and what is considered good manners.
|
||||
|
||||
This document outlines what we in the cURL project considers to be good
|
||||
etiquette, and primarily this focus on how to behave on and how to use our
|
||||
mailing lists.
|
||||
|
||||
1.3 Do Not Mail a Single Individual
|
||||
|
||||
Many people send one question to one person. One person gets many mails, and
|
||||
there is only one person who can give you a reply. The question may be
|
||||
something that other people are also wanting to ask. These other people have
|
||||
no way to read the reply, but to ask the one person the question. The one
|
||||
person consequently gets overloaded with mail.
|
||||
|
||||
If you really want to contact an individual and perhaps pay for his or her's
|
||||
services, by all means go ahead, but if it's just another curl question,
|
||||
take it to a suitable list instead.
|
||||
|
||||
1.4 Subscription Required
|
||||
|
||||
All curl mailing lists require that you are subscribed to allow a mail to go
|
||||
through to all the subscribers.
|
||||
|
||||
If you post without being subscribed (or from a different mail address than
|
||||
the one you are subscribed with), your mail will simply be silently
|
||||
discarded. You have to subscribe first, then post.
|
||||
|
||||
The reason for this unfortunate and strict subscription policy is of course
|
||||
to stop spam from pestering the lists.
|
||||
|
||||
1.5 Moderation of new posters
|
||||
|
||||
Several of the curl mailing lists automatically make all posts from new
|
||||
subscribers require moderation. This means that after you've subscribed and
|
||||
send your first mail to a list, that mail will not be let through to the
|
||||
list until a mailing list administrator has verified that it is OK and
|
||||
permits it to get posted.
|
||||
|
||||
Once a first post has been made that proves the sender is actually talking
|
||||
about curl-related subjects, the moderation "flag" will be switched off and
|
||||
future posts will go through without being moderated.
|
||||
|
||||
The reason for this moderation policy is that we do suffer from spammers who
|
||||
actually subscribe and send spam to our lists.
|
||||
|
||||
1.6 Handling trolls and spam
|
||||
|
||||
Despite our good intensions and hard work to keep spam off the lists and to
|
||||
maintain a friendly and positive atmosphere, there will be times when spam
|
||||
and or trolls get through.
|
||||
|
||||
Troll - "someone who posts inflammatory, extraneous, or off-topic messages
|
||||
in an online community"
|
||||
|
||||
Spam - "use of electronic messaging systems to send unsolicited bulk
|
||||
messages"
|
||||
|
||||
No matter what, we NEVER EVER respond to trolls or spammers on the list. If
|
||||
you believe the list admin should do something particular, contact him/her
|
||||
off-list. The subject will be taken care of as good as possible to prevent
|
||||
repeated offences, but responding on the list to such messages never lead to
|
||||
anything good and only puts the light even more on the offender: which was
|
||||
the entire purpose of it getting to the list in the first place.
|
||||
|
||||
Don't feed the trolls!
|
||||
|
||||
1.7 How to unsubscribe
|
||||
|
||||
You unsubscribe the same way you subscribed in the first place. You go to
|
||||
the page for the particular mailing list you're subscribed to and you enter
|
||||
your email address and password and press the unsubscribe button.
|
||||
|
||||
Also, this information is included in the headers of every mail that is sent
|
||||
out to all curl related mailing lists and there's footer in each mail that
|
||||
links to the "admin" page on which you can unsubscribe and change other
|
||||
options.
|
||||
|
||||
You NEVER EVER email the mailing list requesting someone else to get you off
|
||||
the list.
|
||||
|
||||
|
||||
2. Sending mail
|
||||
|
||||
2.1 Reply or New Mail
|
||||
|
||||
Please do not reply to an existing message as a short-cut to post a message
|
||||
to the lists.
|
||||
|
||||
Many mail programs and web archivers use information within mails to keep
|
||||
them together as "threads", as collections of posts that discuss a certain
|
||||
subject. If you don't intend to reply on the same or similar subject, don't
|
||||
just hit reply on an existing mail and change subject, create a new mail.
|
||||
|
||||
2.2 Reply to the List
|
||||
|
||||
When replying to a message from the list, make sure that you do "group
|
||||
reply" or "reply to all", and not just reply to the author of the single
|
||||
mail you reply to.
|
||||
|
||||
We're actively discouraging replying back to the single person by setting
|
||||
the Reply-To: field in outgoing mails back to the mailing list address,
|
||||
making it harder for people to mail the author only by mistake.
|
||||
|
||||
2.3 Use a Sensible Subject
|
||||
|
||||
Please use a subject of the mail that makes sense and that is related to the
|
||||
contents of your mail. It makes it a lot easier to find your mail afterwards
|
||||
and it makes it easier to track mail threads and topics.
|
||||
|
||||
2.4 Do Not Top-Post
|
||||
|
||||
If you reply to a message, don't use top-posting. Top-posting is when you
|
||||
write the new text at the top of a mail and you insert the previous quoted
|
||||
mail conversation below. It forces users to read the mail in a backwards
|
||||
order to properly understand it.
|
||||
|
||||
This is why top posting is so bad:
|
||||
|
||||
A: Because it messes up the order in which people normally read
|
||||
text.
|
||||
Q: Why is top-posting such a bad thing?
|
||||
A: Top-posting.
|
||||
Q: What is the most annoying thing in e-mail?
|
||||
|
||||
Apart from the screwed up read order (especially when mixed together in a
|
||||
thread when some responds doing the mandaded bottom-posting style), it also
|
||||
makes it impossible to quote only parts of the original mail.
|
||||
|
||||
When you reply to a mail. You let the mail client insert the previous mail
|
||||
quoted. Then you put the cursor on the first line of the mail and you move
|
||||
down through the mail, deleting all parts of the quotes that don't add
|
||||
context for your comments. When you want to add a comment you do so, inline,
|
||||
right after the quotes that relate to your comment. Then you continue
|
||||
downwards again.
|
||||
|
||||
When most of the quotes have been removed and you've added your own words,
|
||||
you're done!
|
||||
|
||||
2.5 HTML is not for mails
|
||||
|
||||
Please switch off those HTML encoded messages. You can mail all those funny
|
||||
mails to your friends. We speak plain text mails.
|
||||
|
||||
2.6 Quoting
|
||||
|
||||
Quote as little as possible. Just enough to provide the context you cannot
|
||||
leave out. A lengthy description can be found here:
|
||||
|
||||
http://www.netmeister.org/news/learn2quote.html
|
||||
|
||||
2.7 Digest
|
||||
|
||||
We allow subscribers to subscribe to the "digest" version of the mailing
|
||||
lists. A digest is a collection of mails lumped together in one single mail.
|
||||
|
||||
Should you decide to reply to a mail sent out as a digest, there are two
|
||||
things you MUST consider if you really really cannot subscribe normally
|
||||
instead:
|
||||
|
||||
Cut off all mails and chatter that is not related to the mail you want to
|
||||
reply to.
|
||||
|
||||
Change the subject name to something sensible and related to the subject,
|
||||
preferably even the actual subject of the single mail you wanted to reply to
|
||||
|
||||
2.8 Please Tell Us How You Solved The Problem!
|
||||
|
||||
Many people mail questions to the list, people spend some of their time and
|
||||
make an effort in providing good answers to these questions.
|
||||
|
||||
If you are the one who asks, please consider responding once more in case
|
||||
one of the hints was what solved your problems. The guys who write answers
|
||||
feel good to know that they provided a good answer and that you fixed the
|
||||
problem. Far too often, the person who asked the question is never heard of
|
||||
again, and we never get to know if he/she is gone because the problem was
|
||||
solved or perhaps because the problem was unsolvable!
|
||||
|
||||
Getting the solution posted also helps other users that experience the same
|
||||
problem(s). They get to see (possibly in the web archives) that the
|
||||
suggested fixes actually has helped at least one person.
|
||||
|
26
docs/MANUAL
26
docs/MANUAL
@@ -123,7 +123,13 @@ USING PASSWORDS
|
||||
|
||||
PROXY
|
||||
|
||||
Get an ftp file using a proxy named my-proxy that uses port 888:
|
||||
curl supports both HTTP and SOCKS proxy servers, with optional authentication.
|
||||
It does not have special support for FTP proxy servers since there are no
|
||||
standards for those, but it can still be made to work with many of them. You
|
||||
can also use both HTTP and SOCKS proxies to transfer files to and from FTP
|
||||
servers.
|
||||
|
||||
Get an ftp file using an HTTP proxy named my-proxy that uses port 888:
|
||||
|
||||
curl -x my-proxy:888 ftp://ftp.leachsite.com/README
|
||||
|
||||
@@ -146,9 +152,23 @@ PROXY
|
||||
|
||||
curl also supports SOCKS4 and SOCKS5 proxies with --socks4 and --socks5.
|
||||
|
||||
See also the environment variables Curl support that offer further proxy
|
||||
See also the environment variables Curl supports that offer further proxy
|
||||
control.
|
||||
|
||||
Most FTP proxy servers are set up to appear as a normal FTP server from the
|
||||
client's perspective, with special commands to select the remote FTP server.
|
||||
curl supports the -u, -Q and --ftp-account options that can be used to
|
||||
set up transfers through many FTP proxies. For example, a file can be
|
||||
uploaded to a remote FTP server using a Blue Coat FTP proxy with the
|
||||
options:
|
||||
|
||||
curl -u "Remote-FTP-Username@remote.ftp.server Proxy-Username:Remote-Pass" \
|
||||
--ftp-account Proxy-Password --upload-file local-file \
|
||||
ftp://my-ftp.proxy.server:21/remote/upload/path/
|
||||
|
||||
See the manual for your FTP proxy to determine the form it expects to set up
|
||||
transfers, and curl's -v option to see exactly what curl is sending.
|
||||
|
||||
RANGES
|
||||
|
||||
With HTTP 1.1 byte-ranges were introduced. Using this, a client can request
|
||||
@@ -308,7 +328,7 @@ POST (HTTP)
|
||||
If the content-type is not specified, curl will try to guess from the file
|
||||
extension (it only knows a few), or use the previously specified type (from
|
||||
an earlier file if several files are specified in a list) or else it will
|
||||
using the default type 'text/plain'.
|
||||
use the default type 'application/octet-stream'.
|
||||
|
||||
Emulate a fill-in form with -F. Let's say you fill in three fields in a
|
||||
form. One field is a file name which to post, one field is your name and one
|
||||
|
@@ -1,11 +1,30 @@
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# Project ___| | | | _ \| |
|
||||
# / __| | | | |_) | |
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2011, 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.
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign no-dependencies
|
||||
|
||||
man_MANS = curl.1 curl-config.1
|
||||
GENHTMLPAGES = curl.html curl-config.html
|
||||
PDFPAGES = curl.pdf curl-config.pdf
|
||||
man_MANS = curl.1 curl-config.1 mk-ca-bundle.1
|
||||
GENHTMLPAGES = curl.html curl-config.html mk-ca-bundle.html
|
||||
PDFPAGES = curl.pdf curl-config.pdf mk-ca-bundle.pdf
|
||||
|
||||
HTMLPAGES = $(GENHTMLPAGES) index.html
|
||||
|
||||
@@ -16,7 +35,8 @@ CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES)
|
||||
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
|
||||
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
|
||||
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
|
||||
$(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp
|
||||
$(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp \
|
||||
MAIL-ETIQUETTE
|
||||
|
||||
MAN2HTML= roffit < $< >$@
|
||||
|
||||
|
0
docs/README.cmake
Executable file → Normal file
0
docs/README.cmake
Executable file → Normal file
129
docs/THANKS
129
docs/THANKS
@@ -5,20 +5,28 @@
|
||||
If you have contributed but are missing here, please let us know!
|
||||
|
||||
Aaron Oneal
|
||||
Aaron Orenstein
|
||||
Adam D. Moss
|
||||
Adam Light
|
||||
Adam Piggott
|
||||
Adam Tkac
|
||||
Adrian Schuur
|
||||
Adriano Meirelles
|
||||
Akos Pasztory
|
||||
Alan Pinstein
|
||||
Albert Chin
|
||||
Albert Chin-A-Young
|
||||
Albert Choy
|
||||
Ale Vesely
|
||||
Alejandro Alvarez
|
||||
Aleksandar Milivojevic
|
||||
Alessandro Ghedini
|
||||
Alessandro Vesely
|
||||
Alex Bligh
|
||||
Alex Fishman
|
||||
Alex Neblett
|
||||
Alex Suykov
|
||||
Alex Vinnik
|
||||
Alex aka WindEagle
|
||||
Alexander Beedie
|
||||
Alexander Kourakos
|
||||
@@ -28,9 +36,12 @@ Alexander Zhuravlev
|
||||
Alexey Borzov
|
||||
Alexey Pesternikov
|
||||
Alexey Simak
|
||||
Alexey Zakhlestin
|
||||
Alexis Carvalho
|
||||
Alfred Gebert
|
||||
Allen Pulsifer
|
||||
Amol Pattekar
|
||||
Amr Shahin
|
||||
Anatoli Tubman
|
||||
Anders Gustafsson
|
||||
Andi Jahja
|
||||
@@ -44,6 +55,7 @@ Andreas Rieke
|
||||
Andreas Schuldei
|
||||
Andreas Wurf
|
||||
Andrei Benea
|
||||
Andrei Cipu
|
||||
Andres Garcia
|
||||
Andrew Benham
|
||||
Andrew Biggs
|
||||
@@ -60,10 +72,12 @@ Andy Tsouladze
|
||||
Angus Mackay
|
||||
Anthony Bryan
|
||||
Antoine Calando
|
||||
Anton Bychkov
|
||||
Anton Kalmykov
|
||||
Arkadiusz Miskiewicz
|
||||
Armel Asselin
|
||||
Arnaud Ebalard
|
||||
Arthur Murray
|
||||
Arve Knudsen
|
||||
Ates Goral
|
||||
Augustus Saunders
|
||||
@@ -72,15 +86,20 @@ Axel Tillequin
|
||||
Balint Szilakszi
|
||||
Bart Whiteley
|
||||
Bas Mevissen
|
||||
Ben Darnell
|
||||
Ben Greear
|
||||
Ben Madsen
|
||||
Ben Noordhuis
|
||||
Ben Van Hof
|
||||
Ben Winslow
|
||||
Benbuck Nason
|
||||
Benjamin Gerard
|
||||
Bernard Leak
|
||||
Bernhard Reutner-Fischer
|
||||
Bertrand Demiddelaer
|
||||
Bill Egert
|
||||
Bill Hoffman
|
||||
Bjoern Sikora
|
||||
Bjorn Augustsson
|
||||
Bjorn Reese
|
||||
Bj<EFBFBD>rn Stenberg
|
||||
@@ -88,7 +107,10 @@ Bob Richmond
|
||||
Bob Schader
|
||||
Bogdan Nicula
|
||||
Brad Burdick
|
||||
Brad Hards
|
||||
Brad King
|
||||
Bradford Bruce
|
||||
Brandon Wang
|
||||
Brendan Jurd
|
||||
Brent Beardsley
|
||||
Brian Akins
|
||||
@@ -100,11 +122,14 @@ Brock Noland
|
||||
Bruce Mitchener
|
||||
Bryan Henderson
|
||||
Bryan Kemp
|
||||
Cameron Kaiser
|
||||
Camille Moncelier
|
||||
Caolan McNamara
|
||||
Carsten Lange
|
||||
Casey O'Donnell
|
||||
Cedric Deltheil
|
||||
Chad Monroe
|
||||
Chandrakant Bagul
|
||||
Charles Kerr
|
||||
Chih-Chung Chang
|
||||
Chris "Bob Bob"
|
||||
@@ -115,6 +140,9 @@ Chris Flerackers
|
||||
Chris Gaukroger
|
||||
Chris Maltby
|
||||
Chris Mumford
|
||||
Chris Smowton
|
||||
Christian Grothoff
|
||||
Christian Hagele
|
||||
Christian Krause
|
||||
Christian Kurz
|
||||
Christian Robottom Reis
|
||||
@@ -125,6 +153,7 @@ Christophe Legry
|
||||
Christopher Conroy
|
||||
Christopher Palow
|
||||
Christopher R. Palmer
|
||||
Christopher Stone
|
||||
Ciprian Badescu
|
||||
Claes Jakobsson
|
||||
Clarence Gardner
|
||||
@@ -139,12 +168,15 @@ Craig A West
|
||||
Craig Davison
|
||||
Craig Markwardt
|
||||
Cris Bailiff
|
||||
Cristian Rodriguez
|
||||
Curt Bogmine
|
||||
Cyrill Osterwalder
|
||||
Dagobert Michelsen
|
||||
Damien Adant
|
||||
Dan Becker
|
||||
Dan C
|
||||
Dan Fandrich
|
||||
Dan Locks
|
||||
Dan Nelson
|
||||
Dan Petitt
|
||||
Dan Torop
|
||||
@@ -154,14 +186,17 @@ Daniel Cater
|
||||
Daniel Egger
|
||||
Daniel Fandrich
|
||||
Daniel Johnson
|
||||
Daniel Mentz
|
||||
Daniel Steinberg
|
||||
Daniel Stenberg
|
||||
Daniel at touchtunes
|
||||
Darryl House
|
||||
Darshan Mody
|
||||
Dave Dribin
|
||||
Dave Halbakken
|
||||
Dave Hamilton
|
||||
Dave May
|
||||
Dave Reisner
|
||||
Dave Vasilevsky
|
||||
David Bau
|
||||
David Binderman
|
||||
@@ -190,10 +225,12 @@ Detlef Schmier
|
||||
Didier Brisebourg
|
||||
Diego Casorran
|
||||
Dima Barsky
|
||||
Dimitre Dimitrov
|
||||
Dimitris Sarris
|
||||
Dinar
|
||||
Dirk Eddelbuettel
|
||||
Dirk Manske
|
||||
Dmitri Shubin
|
||||
Dmitriy Sergeyev
|
||||
Dmitry Bartsevich
|
||||
Dmitry Kurochkin
|
||||
@@ -202,6 +239,7 @@ Dmitry Rechkin
|
||||
Dolbneff A.V
|
||||
Domenico Andreoli
|
||||
Dominick Meglio
|
||||
Dominique Leuenberger
|
||||
Doug Kaufman
|
||||
Doug Porter
|
||||
Douglas E. Wegscheid
|
||||
@@ -226,6 +264,7 @@ Emiliano Ida
|
||||
Enrico Scholz
|
||||
Enrik Berkhan
|
||||
Eric Cooper
|
||||
Eric Hu
|
||||
Eric Landes
|
||||
Eric Lavigne
|
||||
Eric Melville
|
||||
@@ -241,6 +280,7 @@ Erwin Authried
|
||||
Eugene Kotlyarov
|
||||
Evan Jordan
|
||||
Eygene Ryabinkin
|
||||
Fabian Hiernaux
|
||||
Fabian Keil
|
||||
Fabrizio Ammollo
|
||||
Fedor Karpelevitch
|
||||
@@ -253,11 +293,13 @@ Frank Keeney
|
||||
Frank McGeough
|
||||
Frank Meier
|
||||
Frank Ticheler
|
||||
Frank Van Uffelen
|
||||
Fred Machado
|
||||
Fred New
|
||||
Fred Noz
|
||||
Frederic Lepied
|
||||
Gabriel Kuri
|
||||
Garrett Holmstrom
|
||||
Gary Maxwell
|
||||
Gautam Kachroo
|
||||
Gautam Mani
|
||||
@@ -281,6 +323,7 @@ Giuseppe Attardi
|
||||
Giuseppe D'Ambrosio
|
||||
Glen Nakamura
|
||||
Glen Scott
|
||||
Gokhan Sengun
|
||||
Grant Erickson
|
||||
Greg Hewgill
|
||||
Greg Morse
|
||||
@@ -302,11 +345,17 @@ Hardeep Singh
|
||||
Harshal Pradhan
|
||||
Hauke Duden
|
||||
Heikki Korpela
|
||||
Heinrich Ko
|
||||
Hendrik Visage
|
||||
Henrik Storner
|
||||
Henry Ludemann
|
||||
Herve Amblard
|
||||
Hidemoto Nakada
|
||||
Hoi-Ho Chan
|
||||
Hongli Lai
|
||||
Howard Chu
|
||||
Hzhijun
|
||||
Ian D Allen
|
||||
Ian Ford
|
||||
Ian Gulliver
|
||||
Ian Lynagh
|
||||
@@ -339,8 +388,11 @@ Jamie Lokier
|
||||
Jamie Newton
|
||||
Jamie Wilkinson
|
||||
Jan Kunder
|
||||
Jan Van Boghout
|
||||
Jared Lundell
|
||||
Jari Sundell
|
||||
Jason Glasgow
|
||||
Jason Liu
|
||||
Jason McDonald
|
||||
Jason S. Priebe
|
||||
Jay Austin
|
||||
@@ -361,11 +413,13 @@ Jeffrey Pohlmeyer
|
||||
Jeremy Friesner
|
||||
Jerome Muffat-Meridol
|
||||
Jerome Vouillon
|
||||
Jerry Wu
|
||||
Jes Badwal
|
||||
Jesper Jensen
|
||||
Jesse Noller
|
||||
Jim Drash
|
||||
Jim Freeman
|
||||
Jim Hollinger
|
||||
Jim Meyering
|
||||
Jocelyn Jaubert
|
||||
Joe Halpin
|
||||
@@ -375,10 +429,13 @@ Jofell Gallardo
|
||||
Johan Anderson
|
||||
Johan Nilsson
|
||||
Johan van Selst
|
||||
Johannes Bauer
|
||||
John Bradshaw
|
||||
John Crow
|
||||
John Dennis
|
||||
John E. Malmberg
|
||||
John Janssen
|
||||
John Joseph Bachir
|
||||
John Kelly
|
||||
John Lask
|
||||
John Lightsey
|
||||
@@ -389,9 +446,11 @@ John-Mark Bell
|
||||
Johnny Luong
|
||||
Jon Grubbs
|
||||
Jon Nelson
|
||||
Jon Sargeant
|
||||
Jon Travis
|
||||
Jon Turner
|
||||
Jonas Forsman
|
||||
Jonas Schnelli
|
||||
Jonatan Lander
|
||||
Jonathan Hseu
|
||||
Jongki Suwandi
|
||||
@@ -399,6 +458,8 @@ Jose Kahan
|
||||
Josef Wolf
|
||||
Josh Kapell
|
||||
Joshua Kwan
|
||||
Josue Andrade Gomes
|
||||
Juan Barreto
|
||||
Juan F. Codagnone
|
||||
Juan Ignacio Herv<72>s
|
||||
Judson Bishop
|
||||
@@ -406,6 +467,7 @@ Juergen Wilke
|
||||
Jukka Pihl
|
||||
Julian Noble
|
||||
Julien Chaffraix
|
||||
Julien Royer
|
||||
Jun-ichiro itojun Hagino
|
||||
Jurij Smakov
|
||||
Justin Fletcher
|
||||
@@ -416,6 +478,7 @@ Kai-Uwe Rommel
|
||||
Kalle Vahlman
|
||||
Kamil Dudka
|
||||
Kang-Jin Lee
|
||||
Karl M
|
||||
Karl Moerder
|
||||
Karol Pietrzak
|
||||
Kaspar Brand
|
||||
@@ -471,19 +534,27 @@ Luca Altea
|
||||
Luca Alteas
|
||||
Lucas Adamski
|
||||
Lukasz Czekierda
|
||||
Luke Amery
|
||||
Luke Call
|
||||
Luong Dinh Dung
|
||||
Maciej Karpiuk
|
||||
Maciej W. Rozycki
|
||||
Mamoru Tasaka
|
||||
Mandy Wu
|
||||
Manfred Schwarb
|
||||
Manuel Massing
|
||||
Marc Boucher
|
||||
Marc Kleine-Budde
|
||||
Marcel Roelofs
|
||||
Marcelo Juchem
|
||||
Marcin Adamski
|
||||
Marcin Konicki
|
||||
Marco G. Salvagno
|
||||
Marco Maggi
|
||||
Marcus Sundberg
|
||||
Marcus Webster
|
||||
Mario Schroeder
|
||||
Mark Brand
|
||||
Mark Butler
|
||||
Mark Davies
|
||||
Mark Eichin
|
||||
@@ -499,6 +570,7 @@ Martin C. Martin
|
||||
Martin Drasar
|
||||
Martin Hager
|
||||
Martin Hedenfalk
|
||||
Martin Lemke
|
||||
Martin Skinner
|
||||
Martin Storsjo
|
||||
Marty Kuhrt
|
||||
@@ -512,34 +584,44 @@ Matt Kraai
|
||||
Matt Veenstra
|
||||
Matt Witherspoon
|
||||
Matt Wixson
|
||||
Matteo Rocco
|
||||
Matthew Blain
|
||||
Matthew Clarke
|
||||
Matthias Bolte
|
||||
Maurice Barnum
|
||||
Mauro Iorio
|
||||
Max Katsev
|
||||
Maxim Ivanov
|
||||
Maxim Perenesenko
|
||||
Maxim Prohorov
|
||||
Mehmet Bozkurt
|
||||
Mekonikum
|
||||
Mettgut Jamalla
|
||||
Michael Benedict
|
||||
Michael Calmer
|
||||
Michael Cronenworth
|
||||
Michael Curtis
|
||||
Michael Day
|
||||
Michael Goffioul
|
||||
Michael Jahn
|
||||
Michael Jerris
|
||||
Michael Mealling
|
||||
Michael Mueller
|
||||
Michael Smith
|
||||
Michael Stillwell
|
||||
Michael Wallner
|
||||
Michal Bonino
|
||||
Michal Gorny
|
||||
Michal Marek
|
||||
Michele Bini
|
||||
Mihai Ionescu
|
||||
Mikael Johansson
|
||||
Mikael Sennerholm
|
||||
Mike Bytnar
|
||||
Mike Crowe
|
||||
Mike Dobbs
|
||||
Mike Hommey
|
||||
Mike Power
|
||||
Mike Protts
|
||||
Mike Revi
|
||||
Miklos Nemeth
|
||||
@@ -550,10 +632,12 @@ Moonesamy
|
||||
Nathan Coulter
|
||||
Nathan O'Sullivan
|
||||
Nathanael Nerode
|
||||
Naveen Chandran
|
||||
Naveen Noel
|
||||
Neil Dunbar
|
||||
Neil Spring
|
||||
Nic Roets
|
||||
Nicholas Maniscalco
|
||||
Nick Gimbrone
|
||||
Nick Humfrey
|
||||
Nick Zitzmann
|
||||
@@ -566,6 +650,8 @@ Nikita Schmidt
|
||||
Nikitinskit Dmitriy
|
||||
Niklas Angebrand
|
||||
Nikolai Kondrashov
|
||||
Nikos Mavrogiannopoulos
|
||||
Ning Dong
|
||||
Nir Soffer
|
||||
Nis Jorgensen
|
||||
Nodak Sodak
|
||||
@@ -575,14 +661,19 @@ Ofer
|
||||
Olaf Stueben
|
||||
Olaf St<53>ben
|
||||
Oren Tirosh
|
||||
Ori Avtalion
|
||||
P R Schaffner
|
||||
Paolo Piacentini
|
||||
Pascal Terjan
|
||||
Pasha Kuznetsov
|
||||
Pat Ray
|
||||
Patrice Guerin
|
||||
Patrick Bihan-Faou
|
||||
Patrick Monnerat
|
||||
Patrick Scott
|
||||
Patrick Smith
|
||||
Patrik Thunstrom
|
||||
Pau Garcia i Quiles
|
||||
Paul Harrington
|
||||
Paul Howarth
|
||||
Paul Marquis
|
||||
@@ -594,11 +685,13 @@ Pavel Orehov
|
||||
Pavel Raiskup
|
||||
Pawel A. Gajda
|
||||
Pawel Kierski
|
||||
Pedro Larroy
|
||||
Pedro Neves
|
||||
Pete Su
|
||||
Peter Bray
|
||||
Peter Forret
|
||||
Peter Heuchert
|
||||
Peter Hjalmarsson
|
||||
Peter Korsgaard
|
||||
Peter Lamberg
|
||||
Peter O'Gorman
|
||||
@@ -621,14 +714,19 @@ Philippe Raoult
|
||||
Philippe Vaucher
|
||||
Pierre
|
||||
Pierre Brico
|
||||
Pierre Joye
|
||||
Pierre Ynard
|
||||
Pooyan McSporran
|
||||
Pramod Sharma
|
||||
Puneet Pawaia
|
||||
Quagmire
|
||||
Quanah Gibson-Mount
|
||||
Quinn Slack
|
||||
Rafa Muyo
|
||||
Rafael Sagula
|
||||
Rainer Canavan
|
||||
Rainer Koenig
|
||||
Rajesh Naganathan
|
||||
Ralf S. Engelschall
|
||||
Ralph Beckmann
|
||||
Ralph Mitchell
|
||||
@@ -644,6 +742,7 @@ Renaud Duhaut
|
||||
Rene Bernhardt
|
||||
Rene Rebe
|
||||
Reuven Wachtfogel
|
||||
Reza Arbab
|
||||
Ricardo Cadime
|
||||
Rich Gray
|
||||
Rich Rauenzahn
|
||||
@@ -654,17 +753,21 @@ Richard Clayton
|
||||
Richard Cooper
|
||||
Richard Gorton
|
||||
Richard Prescott
|
||||
Richard Silverman
|
||||
Rick Jones
|
||||
Rick Richardson
|
||||
Rob Crittenden
|
||||
Rob Jones
|
||||
Rob Stanzel
|
||||
Rob Ward
|
||||
Robert A. Monat
|
||||
Robert D. Young
|
||||
Robert Foreman
|
||||
Robert Iakobashvili
|
||||
Robert Olson
|
||||
Robert Schumann
|
||||
Robert Weaver
|
||||
Robin Cornelius
|
||||
Robin Johnson
|
||||
Robin Kay
|
||||
Robson Braga Araujo
|
||||
@@ -679,8 +782,10 @@ Rosimildo da Silva
|
||||
Roy Shan
|
||||
Rune Kleveland
|
||||
Ruslan Gazizov
|
||||
Rutger Hofman
|
||||
Ryan Chan
|
||||
Ryan Nelson
|
||||
Ryan Schmidt
|
||||
S. Moonesamy
|
||||
Salvador D<>vila
|
||||
Salvatore Sorrentino
|
||||
@@ -688,8 +793,10 @@ Sam Listopad
|
||||
Sampo Kellomaki
|
||||
Samuel D<>az Garc<72>a
|
||||
Samuel Listopad
|
||||
Samuel Thibault
|
||||
Sander Gates
|
||||
Sandor Feldi
|
||||
Saqib Ali
|
||||
Saul good
|
||||
Scott Barrett
|
||||
Scott Cantor
|
||||
@@ -705,6 +812,7 @@ Shard
|
||||
Shawn Poulson
|
||||
Shmulik Regev
|
||||
Siddhartha Prakash Jain
|
||||
Sidney San Martin
|
||||
Siegfried Gyuricsko
|
||||
Simon Dick
|
||||
Simon Josefsson
|
||||
@@ -718,6 +826,7 @@ Stan van de Burgt
|
||||
Stefan Esser
|
||||
Stefan Krause
|
||||
Stefan Teleman
|
||||
Stefan Tomanek
|
||||
Stefan Ulrich
|
||||
Stephan Bergmann
|
||||
Stephen Collyer
|
||||
@@ -725,6 +834,8 @@ Stephen Kick
|
||||
Stephen More
|
||||
Sterling Hughes
|
||||
Steve Green
|
||||
Steve H Truong
|
||||
Steve Holme
|
||||
Steve Lhomme
|
||||
Steve Little
|
||||
Steve Marx
|
||||
@@ -733,6 +844,7 @@ Steve Roskowski
|
||||
Steven Bazyl
|
||||
Steven G. Johnson
|
||||
Steven M. Schweda
|
||||
Steven Parkes
|
||||
Stoned Elipot
|
||||
Sven Anders
|
||||
Sven Neuhaus
|
||||
@@ -740,10 +852,12 @@ Sven Wegener
|
||||
S<EFBFBD>bastien Willemijns
|
||||
T. Bharath
|
||||
T. Yamada
|
||||
Taneli Vahakangas
|
||||
Tanguy Fautre
|
||||
Temprimus
|
||||
Thomas J. Moore
|
||||
Thomas Klausner
|
||||
Thomas L. Shinnick
|
||||
Thomas Lopatic
|
||||
Thomas Schwinge
|
||||
Thomas Tonino
|
||||
@@ -752,10 +866,15 @@ Tim Baker
|
||||
Tim Bartley
|
||||
Tim Chen
|
||||
Tim Costello
|
||||
Tim Harder
|
||||
Tim Newsome
|
||||
Tim Sneddon
|
||||
Tinus van den Berg
|
||||
Tobias Rundstr<74>m
|
||||
Toby Peterson
|
||||
Todd A Ouska
|
||||
Todd Kulesza
|
||||
Todd Ouska
|
||||
Todd Vierling
|
||||
Tom Benoist
|
||||
Tom Donovan
|
||||
@@ -764,12 +883,15 @@ Tom Mattison
|
||||
Tom Moers
|
||||
Tom Mueller
|
||||
Tom Regner
|
||||
Tom Wright
|
||||
Tom Zerucha
|
||||
Tomas Pospisek
|
||||
Tomas Szepe
|
||||
Tomasz Lacki
|
||||
Tommie Gannert
|
||||
Tommy Tam
|
||||
Ton Voon
|
||||
Toni Moreno
|
||||
Toon Verwaest
|
||||
Tor Arntsen
|
||||
Torsten Foertsch
|
||||
@@ -789,11 +911,16 @@ Vincent Bronner
|
||||
Vincent Le Normand
|
||||
Vincent Penquerc'h
|
||||
Vincent Sanders
|
||||
Vincent Torri
|
||||
Vlad Grachov
|
||||
Vlad Ureche
|
||||
Vladimir Grishchenko
|
||||
Vladimir Lazarenko
|
||||
Vojtech Janota
|
||||
Vojtech Minarik
|
||||
Vsevolod Novikov
|
||||
Walter J. Mack
|
||||
Ward Willats
|
||||
Wayne Haigh
|
||||
Werner Koch
|
||||
Wesley Laxton
|
||||
@@ -801,10 +928,12 @@ Wesley Miaw
|
||||
Wez Furlong
|
||||
Wilfredo Sanchez
|
||||
Wojciech Zwiefka
|
||||
Wu Yongzheng
|
||||
Xavier Bouchoux
|
||||
Yang Tse
|
||||
Yarram Sunil
|
||||
Yehoshua Hershberg
|
||||
Yukihiro Kawada
|
||||
Yuriy Sosov
|
||||
Yves Lejeune
|
||||
Zmey Petroff
|
||||
|
316
docs/TODO
316
docs/TODO
@@ -12,17 +12,17 @@
|
||||
All bugs documented in the KNOWN_BUGS document are subject for fixing!
|
||||
|
||||
1. libcurl
|
||||
1.1 Zero-copy interface
|
||||
1.2 More data sharing
|
||||
1.3 struct lifreq
|
||||
1.4 signal-based resolver timeouts
|
||||
1.5 get rid of PATH_MAX
|
||||
1.6 progress callback without doubles
|
||||
1.7 Happy Eyeball dual stack connect
|
||||
|
||||
2. libcurl - multi interface
|
||||
2.1 More non-blocking
|
||||
2.2 Remove easy interface internally
|
||||
2.3 Avoid having to remove/readd handles
|
||||
2.4 Fix HTTP Pipelining for PUT
|
||||
2.5 Make curl_multi_info_read faster
|
||||
|
||||
3. Documentation
|
||||
3.1 More and better
|
||||
@@ -54,64 +54,69 @@
|
||||
7.5 Export session ids
|
||||
7.6 Provide callback for cert verification
|
||||
7.7 Support other SSL libraries
|
||||
7.8 Support SRP on the TLS layer
|
||||
7.9 improve configure --with-ssl
|
||||
7.10 Make NTLM work with other crypto functions
|
||||
|
||||
8. GnuTLS
|
||||
8.1 SSL engine stuff
|
||||
8.2 SRP
|
||||
8.3 check connection
|
||||
8.4 non-gcrypt
|
||||
|
||||
9. Other protocols
|
||||
9. SMTP
|
||||
9.1 Other authentication mechanims
|
||||
9.2 Specify the preferred authentication mechanism
|
||||
9.3 Initial response
|
||||
9.4 Pipelining
|
||||
|
||||
10. POP3
|
||||
10.1 APOP Authentication
|
||||
10.2 Other authentication mechanims
|
||||
10.3 auth= in URLs
|
||||
|
||||
11. Other protocols
|
||||
|
||||
10. New protocols
|
||||
10.1 RSYNC
|
||||
10.2 RTMP
|
||||
12. New protocols
|
||||
12.1 RSYNC
|
||||
|
||||
11. Client
|
||||
11.1 sync
|
||||
11.2 glob posts
|
||||
11.3 prevent file overwriting
|
||||
11.4 simultaneous parallel transfers
|
||||
11.5 provide formpost headers
|
||||
11.6 url-specific options
|
||||
11.7 metalink support
|
||||
11.8 warning when setting an option
|
||||
13. Client
|
||||
13.1 sync
|
||||
13.2 glob posts
|
||||
13.3 prevent file overwriting
|
||||
13.4 simultaneous parallel transfers
|
||||
13.5 provide formpost headers
|
||||
13.6 url-specific options
|
||||
13.7 metalink support
|
||||
13.8 warning when setting an option
|
||||
13.9 IPv6 addresses with globbing
|
||||
|
||||
12. Build
|
||||
12.1 roffit
|
||||
14. Build
|
||||
14.1 roffit
|
||||
|
||||
13. Test suite
|
||||
13.1 SSL tunnel
|
||||
13.2 nicer lacking perl message
|
||||
13.3 more protocols supported
|
||||
13.4 more platforms supported
|
||||
15. Test suite
|
||||
15.1 SSL tunnel
|
||||
15.2 nicer lacking perl message
|
||||
15.3 more protocols supported
|
||||
15.4 more platforms supported
|
||||
|
||||
14. Next SONAME bump
|
||||
14.1 http-style HEAD output for ftp
|
||||
14.2 combine error codes
|
||||
14.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
||||
16. Next SONAME bump
|
||||
16.1 http-style HEAD output for ftp
|
||||
16.2 combine error codes
|
||||
16.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
||||
|
||||
15. Next major release
|
||||
15.1 cleanup return codes
|
||||
15.2 remove obsolete defines
|
||||
15.3 size_t
|
||||
15.4 remove several functions
|
||||
15.5 remove CURLOPT_FAILONERROR
|
||||
15.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
|
||||
15.7 remove progress meter from libcurl
|
||||
17. Next major release
|
||||
17.1 cleanup return codes
|
||||
17.2 remove obsolete defines
|
||||
17.3 size_t
|
||||
17.4 remove several functions
|
||||
17.5 remove CURLOPT_FAILONERROR
|
||||
17.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
|
||||
17.7 remove progress meter from libcurl
|
||||
17.8 remove 'curl_httppost' from public
|
||||
17.9 have form functions use CURL handle argument
|
||||
|
||||
==============================================================================
|
||||
|
||||
1. libcurl
|
||||
|
||||
1.1 Zero-copy interface
|
||||
|
||||
Introduce another callback interface for upload/download that makes one less
|
||||
copy of data and thus a faster operation.
|
||||
[http://curl.haxx.se/dev/no_copy_callbacks.txt]
|
||||
|
||||
1.2 More data sharing
|
||||
|
||||
curl_share_* functions already exist and work, and they can be extended to
|
||||
@@ -136,6 +141,37 @@
|
||||
Also, alarm() provides timeout resolution only to the nearest second. alarm
|
||||
ought to be replaced by setitimer on systems that support it.
|
||||
|
||||
1.5 get rid of PATH_MAX
|
||||
|
||||
Having code use and rely on PATH_MAX is not nice:
|
||||
http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
|
||||
|
||||
Currently the SSH based code uses it a bit, but to remove PATH_MAX from there
|
||||
we need libssh2 to properly tell us when we pass in a too small buffer and
|
||||
its current API (as of libssh2 1.2.7) doesn't.
|
||||
|
||||
1.6 progress callback without doubles
|
||||
|
||||
The progress callback was introduced way back in the days and the choice to
|
||||
use doubles in the arguments was possibly good at the time. Today the doubles
|
||||
only confuse users and make the amounts less precise. We should introduce
|
||||
another progress callback option that take precedence over the old one and
|
||||
have both co-exist for a forseeable time until we can remove the double-using
|
||||
one.
|
||||
|
||||
1.7 Happy Eyeball dual stack connect
|
||||
|
||||
In order to make alternative technologies not suffer when transitioning, like
|
||||
when introducing IPv6 as an alternative to IPv4 and there are more than one
|
||||
option existing simultaneously there are reasons to reconsider internal
|
||||
choices.
|
||||
|
||||
To make libcurl do blazing fast IPv6 in a dual-stack configuration, this needs
|
||||
to be addressed:
|
||||
|
||||
http://tools.ietf.org/html/rfc6555
|
||||
|
||||
|
||||
2. libcurl - multi interface
|
||||
|
||||
2.1 More non-blocking
|
||||
@@ -145,7 +181,6 @@
|
||||
|
||||
- Name resolves on non-windows unless c-ares is used
|
||||
- NSS SSL connections
|
||||
- Active FTP connections
|
||||
- HTTP proxy CONNECT operations
|
||||
- SOCKS proxy handshakes
|
||||
- file:// transfers
|
||||
@@ -162,34 +197,12 @@
|
||||
internally use and assume the multi interface. The select()-loop should use
|
||||
curl_multi_socket().
|
||||
|
||||
2.3 Avoid having to remove/readd handles
|
||||
|
||||
curl_multi_handle_control() - this can control the easy handle (while) added
|
||||
to a multi handle in various ways:
|
||||
|
||||
o RESTART, unconditionally restart this easy handle's transfer from the
|
||||
start, re-init the state
|
||||
|
||||
o RESTART_COMPLETED, restart this easy handle's transfer but only if the
|
||||
existing transfer has already completed and it is in a "finished state".
|
||||
|
||||
o STOP, just stop this transfer and consider it completed
|
||||
|
||||
o PAUSE?
|
||||
|
||||
o RESUME?
|
||||
|
||||
2.4 Fix HTTP Pipelining for PUT
|
||||
|
||||
HTTP Pipelining can be a way to greatly enhance performance for multiple
|
||||
serial requests and currently libcurl only supports that for HEAD and GET
|
||||
requests but it should also be possible for PUT.
|
||||
|
||||
2.5 Make curl_multi_info_read faster
|
||||
|
||||
When checking if there's info to return, this function scans over ALL added
|
||||
easy handles every time. That makes this function unnecessary heavy and slow.
|
||||
|
||||
3. Documentation
|
||||
|
||||
3.1 More and better
|
||||
@@ -331,59 +344,92 @@ to provide the data to send.
|
||||
Make curl's SSL layer capable of using other free SSL libraries. Such as
|
||||
MatrixSSL (http://www.matrixssl.org/).
|
||||
|
||||
7.8 Support SRP on the TLS layer
|
||||
|
||||
Peter Sylvester's patch for SRP on the TLS layer. Awaits OpenSSL support for
|
||||
this, no need to support this in libcurl before there's an OpenSSL release
|
||||
that does it.
|
||||
|
||||
7.9 improve configure --with-ssl
|
||||
|
||||
make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
|
||||
then NSS...
|
||||
|
||||
7.10 Make NTLM work with other crypto functions
|
||||
|
||||
Get NTLM working using the functions provided by NSS etc. Not strictly
|
||||
SSL/TLS related, but hey... Another option is to get available DES and MD4
|
||||
source code from the cryptopp library. They are fine license-wise, but are
|
||||
C++. NTLM currenly only works when libcurl is built with OpenSSL or GnuTLS
|
||||
support.
|
||||
|
||||
8. GnuTLS
|
||||
|
||||
8.1 SSL engine stuff
|
||||
|
||||
Is this even possible?
|
||||
|
||||
8.2 SRP
|
||||
|
||||
Work out a common method with Peter Sylvester's OpenSSL-patch for SRP on the
|
||||
TLS to provide name and password. GnuTLS already supports it...
|
||||
|
||||
8.3 check connection
|
||||
|
||||
Add a way to check if the connection seems to be alive, to correspond to the
|
||||
SSL_peak() way we use with OpenSSL.
|
||||
|
||||
9. Other protocols
|
||||
8.4 non-gcrypt
|
||||
|
||||
10. New protocols
|
||||
libcurl assumes that there are gcrypt functions available when
|
||||
GnuTLS is.
|
||||
|
||||
10.1 RSYNC
|
||||
GnuTLS can be built to use libnettle instead as crypto library,
|
||||
which breaks the previously mentioned assumption
|
||||
|
||||
There's no RFC for protocol nor URI/URL format. An implementation should
|
||||
most probably use an existing rsync library, such as librsync.
|
||||
The correct fix would be to detect which crypto layer that is in use and
|
||||
adapt our code to use that instead of blindly assuming gcrypt.
|
||||
|
||||
10.2 RTMP
|
||||
9. SMTP
|
||||
|
||||
There exists a patch that claims to introduce this protocol:
|
||||
http://osdir.com/ml/gnu.gnash.devel2/2006-11/msg00278.html, further details
|
||||
in the feature-request: http://curl.haxx.se/bug/feature.cgi?id=1843469
|
||||
9.1 Other authentication mechanims
|
||||
|
||||
11. Client
|
||||
Add support for other authentication mechanisms such as digest-md5 and
|
||||
gssapi.
|
||||
|
||||
11.1 sync
|
||||
9.2 Specify the preferred authentication mechanism
|
||||
|
||||
Add the ability to specify the preferred authentication mechanism or a list
|
||||
of mechanims that should be used. Not only that, but the order that is
|
||||
returned by the server during the EHLO response should be honored by curl.
|
||||
|
||||
9.3 Initial response
|
||||
|
||||
Add the ability for the user to specify whether the initial response is
|
||||
included in the AUTH command. Some email servers, such as Microsoft
|
||||
Exchange, can work with either whilst others need to have the initial
|
||||
response sent separately:
|
||||
|
||||
http://curl.haxx.se/mail/lib-2012-03/0114.html
|
||||
|
||||
9.4 Pipelining
|
||||
|
||||
Add support for pipelining emails.
|
||||
|
||||
10. POP3
|
||||
|
||||
10.1 APOP Authentication
|
||||
|
||||
Add support for the APOP command rather than using plain text authentication
|
||||
(USER and PASS) as this is very week security wise. Note: The APOP command
|
||||
is specified as "APOP <username> <md5 password>", however, it isn't
|
||||
supported by all mail servers.
|
||||
|
||||
10.2 Other authentication mechanims
|
||||
|
||||
SASL offers support for additional authentication mechanisms via the AUTH
|
||||
command. Detection of an email server's support for SASL authentication
|
||||
can be detected via the CAPA command whilst a list of supported mechanisms
|
||||
can be retrieved with an empty AUTH command.
|
||||
|
||||
10.3 auth= in URLs
|
||||
|
||||
Being able to specify the preferred authentication mechanim in the URL as
|
||||
per RFC-2384 (http://tools.ietf.org/html/rfc2384).
|
||||
|
||||
11. Other protocols
|
||||
|
||||
12. New protocols
|
||||
|
||||
12.1 RSYNC
|
||||
|
||||
There's no RFC for the protocol or an URI/URL format. An implementation
|
||||
should most probably use an existing rsync library, such as librsync.
|
||||
|
||||
13. Client
|
||||
|
||||
13.1 sync
|
||||
|
||||
"curl --sync http://example.com/feed[1-100].rss" or
|
||||
"curl --sync http://example.net/{index,calendar,history}.html"
|
||||
@@ -392,12 +438,12 @@ to provide the data to send.
|
||||
remote file is newer than the local file. A Last-Modified HTTP date header
|
||||
should also be used to set the mod date on the downloaded file.
|
||||
|
||||
11.2 glob posts
|
||||
13.2 glob posts
|
||||
|
||||
Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
|
||||
This is easily scripted though.
|
||||
|
||||
11.3 prevent file overwriting
|
||||
13.3 prevent file overwriting
|
||||
|
||||
Add an option that prevents cURL from overwriting existing local files. When
|
||||
used, and there already is an existing file with the target file name
|
||||
@@ -405,14 +451,14 @@ to provide the data to send.
|
||||
existing). So that index.html becomes first index.html.1 and then
|
||||
index.html.2 etc.
|
||||
|
||||
11.4 simultaneous parallel transfers
|
||||
13.4 simultaneous parallel transfers
|
||||
|
||||
The client could be told to use maximum N simultaneous parallel transfers and
|
||||
then just make sure that happens. It should of course not make more than one
|
||||
connection to the same remote host. This would require the client to use the
|
||||
multi interface. http://curl.haxx.se/bug/feature.cgi?id=1558595
|
||||
|
||||
11.5 provide formpost headers
|
||||
13.5 provide formpost headers
|
||||
|
||||
Extending the capabilities of the multipart formposting. How about leaving
|
||||
the ';type=foo' syntax as it is and adding an extra tag (headers) which
|
||||
@@ -426,7 +472,7 @@ to provide the data to send.
|
||||
which should overwrite the program reasonable defaults (plain/text,
|
||||
8bit...)
|
||||
|
||||
11.6 url-specific options
|
||||
13.6 url-specific options
|
||||
|
||||
Provide a way to make options bound to a specific URL among several on the
|
||||
command line. Possibly by letting ':' separate options between URLs,
|
||||
@@ -440,55 +486,62 @@ to provide the data to send.
|
||||
|
||||
The example would do a POST-GET-POST combination on a single command line.
|
||||
|
||||
11.7 metalink support
|
||||
13.7 metalink support
|
||||
|
||||
Add metalink support to curl (http://www.metalinker.org/). This is most useful
|
||||
with simultaneous parallel transfers (11.6) but not necessary.
|
||||
|
||||
11.8 warning when setting an option
|
||||
13.8 warning when setting an option
|
||||
|
||||
Display a warning when libcurl returns an error when setting an option.
|
||||
This can be useful to tell when support for a particular feature hasn't been
|
||||
compiled into the library.
|
||||
|
||||
12. Build
|
||||
13.9 IPv6 addresses with globbing
|
||||
|
||||
12.1 roffit
|
||||
Currently the command line client needs to get url globbing disabled (with
|
||||
-g) for it to support IPv6 numerical addresses. This is a rather silly flaw
|
||||
that should be corrected. It probably involves a smarter detection of the
|
||||
'[' and ']' letters.
|
||||
|
||||
14. Build
|
||||
|
||||
14.1 roffit
|
||||
|
||||
Consider extending 'roffit' to produce decent ASCII output, and use that
|
||||
instead of (g)nroff when building src/hugehelp.c
|
||||
|
||||
13. Test suite
|
||||
15. Test suite
|
||||
|
||||
13.1 SSL tunnel
|
||||
15.1 SSL tunnel
|
||||
|
||||
Make our own version of stunnel for simple port forwarding to enable HTTPS
|
||||
and FTP-SSL tests without the stunnel dependency, and it could allow us to
|
||||
provide test tools built with either OpenSSL or GnuTLS
|
||||
|
||||
13.2 nicer lacking perl message
|
||||
15.2 nicer lacking perl message
|
||||
|
||||
If perl wasn't found by the configure script, don't attempt to run the tests
|
||||
but explain something nice why it doesn't.
|
||||
|
||||
13.3 more protocols supported
|
||||
15.3 more protocols supported
|
||||
|
||||
Extend the test suite to include more protocols. The telnet could just do ftp
|
||||
or http operations (for which we have test servers).
|
||||
|
||||
13.4 more platforms supported
|
||||
15.4 more platforms supported
|
||||
|
||||
Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
|
||||
fork()s and it should become even more portable.
|
||||
|
||||
14. Next SONAME bump
|
||||
16. Next SONAME bump
|
||||
|
||||
14.1 http-style HEAD output for ftp
|
||||
16.1 http-style HEAD output for ftp
|
||||
|
||||
#undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers
|
||||
from being output in NOBODY requests over ftp
|
||||
|
||||
14.2 combine error codes
|
||||
16.2 combine error codes
|
||||
|
||||
Combine some of the error codes to remove duplicates. The original
|
||||
numbering should not be changed, and the old identifiers would be
|
||||
@@ -506,29 +559,29 @@ to provide the data to send.
|
||||
CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND
|
||||
CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED
|
||||
|
||||
14.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
||||
16.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
||||
|
||||
The current prototype only provides 'purpose' that tells what the
|
||||
connection/socket is for, but not any protocol or similar. It makes it hard
|
||||
for applications to differentiate on TCP vs UDP and even HTTP vs FTP and
|
||||
similar.
|
||||
|
||||
15. Next major release
|
||||
17. Next major release
|
||||
|
||||
15.1 cleanup return codes
|
||||
17.1 cleanup return codes
|
||||
|
||||
curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a
|
||||
CURLMcode. These should be changed to be the same.
|
||||
|
||||
15.2 remove obsolete defines
|
||||
17.2 remove obsolete defines
|
||||
|
||||
remove obsolete defines from curl/curl.h
|
||||
|
||||
15.3 size_t
|
||||
17.3 size_t
|
||||
|
||||
make several functions use size_t instead of int in their APIs
|
||||
|
||||
15.4 remove several functions
|
||||
17.4 remove several functions
|
||||
|
||||
remove the following functions from the public API:
|
||||
|
||||
@@ -549,18 +602,18 @@ to provide the data to send.
|
||||
|
||||
curl_multi_socket_all
|
||||
|
||||
15.5 remove CURLOPT_FAILONERROR
|
||||
17.5 remove CURLOPT_FAILONERROR
|
||||
|
||||
Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
|
||||
internally. Let the app judge success or not for itself.
|
||||
|
||||
15.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
|
||||
17.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
|
||||
|
||||
Remove support for a global DNS cache. Anything global is silly, and we
|
||||
already offer the share interface for the same functionality but done
|
||||
"right".
|
||||
|
||||
15.7 remove progress meter from libcurl
|
||||
17.7 remove progress meter from libcurl
|
||||
|
||||
The internally provided progress meter output doesn't belong in the library.
|
||||
Basically no application wants it (apart from curl) but instead applications
|
||||
@@ -569,3 +622,20 @@ to provide the data to send.
|
||||
The progress callback should then be bumped as well to get proper 64bit
|
||||
variable types passed to it instead of doubles so that big files work
|
||||
correctly.
|
||||
|
||||
17.8 remove 'curl_httppost' from public
|
||||
|
||||
curl_formadd() was made to fill in a public struct, but the fact that the
|
||||
struct is public is never really used by application for their own advantage
|
||||
but instead often restricts how the form functions can or can't be modified.
|
||||
|
||||
Changing them to return a private handle will benefit the implementation and
|
||||
allow us much greater freedoms while still maintining a solid API and ABI.
|
||||
|
||||
17.9 have form functions use CURL handle argument
|
||||
|
||||
curl_formadd() and curl_formget() both currently have no CURL handle
|
||||
argument, but both can use a callback that is set in the easy handle, and
|
||||
thus curl_formget() with callback cannot function without first having
|
||||
curl_easy_perform() (or similar) called - which is hard to grasp and a design
|
||||
mistake.
|
||||
|
@@ -1,5 +1,5 @@
|
||||
Online: http://curl.haxx.se/docs/httpscripting.html
|
||||
Date: May 28, 2008
|
||||
Date: Jan 19, 2011
|
||||
|
||||
The Art Of Scripting HTTP Requests Using Curl
|
||||
=============================================
|
||||
@@ -38,10 +38,26 @@ Date: May 28, 2008
|
||||
request a particular action, and then the server replies a few text lines
|
||||
before the actual requested content is sent to the client.
|
||||
|
||||
Using curl's option -v will display what kind of commands curl sends to the
|
||||
server, as well as a few other informational texts. -v is the single most
|
||||
useful option when it comes to debug or even understand the curl<->server
|
||||
interaction.
|
||||
The client, curl, sends a HTTP request. The request contains a method (like
|
||||
GET, POST, HEAD etc), a number of request headers and sometimes a request
|
||||
body. The HTTP server responds with a status line (indicating if things went
|
||||
well), response headers and most often also a response body. The "body" part
|
||||
is the plain data you requested, like the actual HTML or the image etc.
|
||||
|
||||
1.1 See the Protocol
|
||||
|
||||
Using curl's option --verbose (-v as a short option) will display what kind
|
||||
of commands curl sends to the server, as well as a few other informational
|
||||
texts.
|
||||
|
||||
--verbose is the single most useful option when it comes to debug or even
|
||||
understand the curl<->server interaction.
|
||||
|
||||
Sometimes even --verbose is not enough. Then --trace and --trace-ascii offer
|
||||
even more details as they show EVERYTHING curl sends and receives. Use it
|
||||
like this:
|
||||
|
||||
curl --trace-ascii debugdump.txt http://www.example.com/
|
||||
|
||||
2. URL
|
||||
|
||||
@@ -61,10 +77,10 @@ Date: May 28, 2008
|
||||
you get a web page returned in your terminal window. The entire HTML document
|
||||
that that URL holds.
|
||||
|
||||
All HTTP replies contain a set of headers that are normally hidden, use
|
||||
curl's -i option to display them as well as the rest of the document. You can
|
||||
also ask the remote server for ONLY the headers by using the -I option (which
|
||||
will make curl issue a HEAD request).
|
||||
All HTTP replies contain a set of response headers that are normally hidden,
|
||||
use curl's --include (-i) option to display them as well as the rest of the
|
||||
document. You can also ask the remote server for ONLY the headers by using
|
||||
the --head (-I) option (which will make curl issue a HEAD request).
|
||||
|
||||
4. Forms
|
||||
|
||||
@@ -103,7 +119,7 @@ Date: May 28, 2008
|
||||
To make curl do the GET form post for you, just enter the expected created
|
||||
URL:
|
||||
|
||||
curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"
|
||||
curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"
|
||||
|
||||
4.2 POST
|
||||
|
||||
@@ -127,7 +143,8 @@ Date: May 28, 2008
|
||||
And to use curl to post this form with the same data filled in as before, we
|
||||
could do it like:
|
||||
|
||||
curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi
|
||||
curl --data "birthyear=1905&press=%20OK%20" \
|
||||
http://www.example.com/when.cgi
|
||||
|
||||
This kind of POST will use the Content-Type
|
||||
application/x-www-form-urlencoded and is the most widely used POST kind.
|
||||
@@ -139,7 +156,7 @@ Date: May 28, 2008
|
||||
|
||||
Recent curl versions can in fact url-encode POST data for you, like this:
|
||||
|
||||
curl --data-urlencode "name=I am Daniel" www.example.com
|
||||
curl --data-urlencode "name=I am Daniel" http://www.example.com
|
||||
|
||||
4.3 File Upload POST
|
||||
|
||||
@@ -160,7 +177,7 @@ Date: May 28, 2008
|
||||
|
||||
To post to a form like this with curl, you enter a command line like:
|
||||
|
||||
curl -F upload=@localfilename -F press=OK [URL]
|
||||
curl --form upload=@localfilename --form press=OK [URL]
|
||||
|
||||
4.4 Hidden Fields
|
||||
|
||||
@@ -181,7 +198,7 @@ Date: May 28, 2008
|
||||
To post this with curl, you won't have to think about if the fields are
|
||||
hidden or not. To curl they're all the same:
|
||||
|
||||
curl -d "birthyear=1905&press=OK&person=daniel" [URL]
|
||||
curl --data "birthyear=1905&press=OK&person=daniel" [URL]
|
||||
|
||||
4.5 Figure Out What A POST Looks Like
|
||||
|
||||
@@ -204,7 +221,7 @@ Date: May 28, 2008
|
||||
|
||||
Put a file to a HTTP server with curl:
|
||||
|
||||
curl -T uploadfile www.uploadhttp.com/receive.cgi
|
||||
curl --upload-file uploadfile http://www.example.com/receive.cgi
|
||||
|
||||
6. HTTP Authentication
|
||||
|
||||
@@ -217,7 +234,7 @@ Date: May 28, 2008
|
||||
|
||||
To tell curl to use a user and password for authentication:
|
||||
|
||||
curl -u name:password www.secrets.com
|
||||
curl --user name:password http://www.example.com
|
||||
|
||||
The site might require a different authentication method (check the headers
|
||||
returned by the server), and then --ntlm, --digest, --negotiate or even
|
||||
@@ -228,7 +245,7 @@ Date: May 28, 2008
|
||||
may require its own user and password to allow the client to get through to
|
||||
the Internet. To specify those with curl, run something like:
|
||||
|
||||
curl -U proxyuser:proxypassword curl.haxx.se
|
||||
curl --proxy-user proxyuser:proxypassword curl.haxx.se
|
||||
|
||||
If your proxy requires the authentication to be done using the NTLM method,
|
||||
use --proxy-ntlm, if it requires Digest use --proxy-digest.
|
||||
@@ -257,7 +274,7 @@ Date: May 28, 2008
|
||||
|
||||
Use curl to set the referer field with:
|
||||
|
||||
curl -e http://curl.haxx.se daniel.haxx.se
|
||||
curl --referer http://www.example.come http://www.example.com
|
||||
|
||||
8. User Agent
|
||||
|
||||
@@ -273,13 +290,13 @@ Date: May 28, 2008
|
||||
is time to set the User Agent field to fool the server into thinking you're
|
||||
one of those browsers.
|
||||
|
||||
To make curl look like Internet Explorer on a Windows 2000 box:
|
||||
To make curl look like Internet Explorer 5 on a Windows 2000 box:
|
||||
|
||||
curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]
|
||||
curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]
|
||||
|
||||
Or why not look like you're using Netscape 4.73 on a Linux (PIII) box:
|
||||
Or why not look like you're using Netscape 4.73 on an old Linux box:
|
||||
|
||||
curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
|
||||
curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
|
||||
|
||||
9. Redirects
|
||||
|
||||
@@ -294,11 +311,12 @@ Date: May 28, 2008
|
||||
|
||||
To tell curl to follow a Location:
|
||||
|
||||
curl -L www.sitethatredirects.com
|
||||
curl --location http://www.example.com
|
||||
|
||||
If you use curl to POST to a site that immediately redirects you to another
|
||||
page, you can safely use -L and -d/-F together. Curl will only use POST in
|
||||
the first request, and then revert to GET in the following operations.
|
||||
page, you can safely use --location (-L) and --data/--form together. Curl will
|
||||
only use POST in the first request, and then revert to GET in the following
|
||||
operations.
|
||||
|
||||
10. Cookies
|
||||
|
||||
@@ -320,16 +338,16 @@ Date: May 28, 2008
|
||||
The simplest way to send a few cookies to the server when getting a page with
|
||||
curl is to add them on the command line like:
|
||||
|
||||
curl -b "name=Daniel" www.cookiesite.com
|
||||
curl --cookie "name=Daniel" http://www.example.com
|
||||
|
||||
Cookies are sent as common HTTP headers. This is practical as it allows curl
|
||||
to record cookies simply by recording headers. Record cookies with curl by
|
||||
using the -D option like:
|
||||
using the --dump-header (-D) option like:
|
||||
|
||||
curl -D headers_and_cookies www.cookiesite.com
|
||||
curl --dump-header headers_and_cookies http://www.example.com
|
||||
|
||||
(Take note that the -c option described below is a better way to store
|
||||
cookies.)
|
||||
(Take note that the --cookie-jar option described below is a better way to
|
||||
store cookies.)
|
||||
|
||||
Curl has a full blown cookie parsing engine built-in that comes to use if you
|
||||
want to reconnect to a server and use cookies that were stored from a
|
||||
@@ -337,24 +355,25 @@ Date: May 28, 2008
|
||||
believing you had a previous connection). To use previously stored cookies,
|
||||
you run curl like:
|
||||
|
||||
curl -b stored_cookies_in_file www.cookiesite.com
|
||||
curl --cookie stored_cookies_in_file http://www.example.com
|
||||
|
||||
Curl's "cookie engine" gets enabled when you use the -b option. If you only
|
||||
want curl to understand received cookies, use -b with a file that doesn't
|
||||
exist. Example, if you want to let curl understand cookies from a page and
|
||||
follow a location (and thus possibly send back cookies it received), you can
|
||||
invoke it like:
|
||||
Curl's "cookie engine" gets enabled when you use the --cookie option. If you
|
||||
only want curl to understand received cookies, use --cookie with a file that
|
||||
doesn't exist. Example, if you want to let curl understand cookies from a
|
||||
page and follow a location (and thus possibly send back cookies it received),
|
||||
you can invoke it like:
|
||||
|
||||
curl -b nada -L www.cookiesite.com
|
||||
curl --cookie nada --location http://www.example.com
|
||||
|
||||
Curl has the ability to read and write cookie files that use the same file
|
||||
format that Netscape and Mozilla do. It is a convenient way to share cookies
|
||||
between browsers and automatic scripts. The -b switch automatically detects
|
||||
if a given file is such a cookie file and parses it, and by using the
|
||||
-c/--cookie-jar option you'll make curl write a new cookie file at the end of
|
||||
an operation:
|
||||
between browsers and automatic scripts. The --cookie (-b) switch
|
||||
automatically detects if a given file is such a cookie file and parses it,
|
||||
and by using the --cookie-jar (-c) option you'll make curl write a new cookie
|
||||
file at the end of an operation:
|
||||
|
||||
curl -b cookies.txt -c newcookies.txt www.cookiesite.com
|
||||
curl --cookie cookies.txt --cookie-jar newcookies.txt \
|
||||
http://www.example.com
|
||||
|
||||
11. HTTPS
|
||||
|
||||
@@ -370,7 +389,7 @@ Date: May 28, 2008
|
||||
Curl supports encrypted fetches thanks to the freely available OpenSSL
|
||||
libraries. To get a page from a HTTPS server, simply run curl like:
|
||||
|
||||
curl https://that.secure.server.com
|
||||
curl https://secure.example.com
|
||||
|
||||
11.1 Certificates
|
||||
|
||||
@@ -381,13 +400,13 @@ Date: May 28, 2008
|
||||
can be specified on the command line or if not, entered interactively when
|
||||
curl queries for it. Use a certificate with curl on a HTTPS server like:
|
||||
|
||||
curl -E mycert.pem https://that.secure.server.com
|
||||
curl --cert mycert.pem https://secure.example.com
|
||||
|
||||
curl also tries to verify that the server is who it claims to be, by
|
||||
verifying the server's certificate against a locally stored CA cert
|
||||
bundle. Failing the verification will cause curl to deny the connection. You
|
||||
must then use -k in case you want to tell curl to ignore that the server
|
||||
can't be verified.
|
||||
must then use --insecure (-k) in case you want to tell curl to ignore that
|
||||
the server can't be verified.
|
||||
|
||||
More about server certificate verification and ca cert bundles can be read
|
||||
in the SSLCERTS document, available online here:
|
||||
@@ -402,17 +421,18 @@ Date: May 28, 2008
|
||||
For example, you can change the POST request to a PROPFIND and send the data
|
||||
as "Content-Type: text/xml" (instead of the default Content-Type) like this:
|
||||
|
||||
curl -d "<xml>" -H "Content-Type: text/xml" -X PROPFIND url.com
|
||||
curl --data "<xml>" --header "Content-Type: text/xml" \
|
||||
--request PROPFIND url.com
|
||||
|
||||
You can delete a default header by providing one without content. Like you
|
||||
can ruin the request by chopping off the Host: header:
|
||||
|
||||
curl -H "Host:" http://mysite.com
|
||||
curl --header "Host:" http://www.example.com
|
||||
|
||||
You can add headers the same way. Your server may want a "Destination:"
|
||||
header, and you can add it:
|
||||
|
||||
curl -H "Destination: http://moo.com/nowhere" http://url.com
|
||||
curl --header "Destination: http://nowhere" http://example.com
|
||||
|
||||
13. Web Login
|
||||
|
||||
@@ -443,7 +463,6 @@ Date: May 28, 2008
|
||||
to do a proper login POST. Remember that the contents need to be URL encoded
|
||||
when sent in a normal POST.
|
||||
|
||||
|
||||
14. Debug
|
||||
|
||||
Many times when you run curl on a site, you'll notice that the site doesn't
|
||||
@@ -456,8 +475,8 @@ Date: May 28, 2008
|
||||
* Use the --trace-ascii option to store fully detailed logs of the requests
|
||||
for easier analyzing and better understanding
|
||||
|
||||
* Make sure you check for and use cookies when needed (both reading with -b
|
||||
and writing with -c)
|
||||
* Make sure you check for and use cookies when needed (both reading with
|
||||
--cookie and writing with --cookie-jar)
|
||||
|
||||
* Set user-agent to one like a recent popular browser does
|
||||
|
||||
@@ -479,12 +498,10 @@ Date: May 28, 2008
|
||||
RFC 2616 is a must to read if you want in-depth understanding of the HTTP
|
||||
protocol.
|
||||
|
||||
RFC 2396 explains the URL syntax.
|
||||
RFC 3986 explains the URL syntax.
|
||||
|
||||
RFC 2109 defines how cookies are supposed to work.
|
||||
|
||||
RFC 1867 defines the HTTP post upload format.
|
||||
|
||||
http://www.openssl.org is the home of the OpenSSL project
|
||||
|
||||
http://curl.haxx.se is the home of the cURL project
|
||||
|
@@ -11,32 +11,25 @@ Version Numbers and Releases
|
||||
|
||||
The version numbering is always built up using the same system:
|
||||
|
||||
X.Y[.Z][-preN]
|
||||
X.Y[.Z]
|
||||
|
||||
Where
|
||||
X is main version number
|
||||
Y is release number
|
||||
Z is patch number
|
||||
N is pre-release number
|
||||
|
||||
One of these numbers will get bumped in each new release. The numbers to the
|
||||
right of a bumped number will be reset to zero. If Z is zero, it may not be
|
||||
included in the version number. The pre release number is only included in
|
||||
pre releases (they're never used in public, official, releases).
|
||||
included in the version number.
|
||||
|
||||
The main version number will get bumped when *really* big, world colliding
|
||||
changes are made. The release number is bumped when big changes are
|
||||
performed. The patch number is bumped when the changes are mere bugfixes and
|
||||
only minor feature changes. The pre-release is a counter, to identify which
|
||||
pre-release a certain release is.
|
||||
|
||||
When reaching the end of a pre-release period, the version without the
|
||||
pre-release part will be released as a public release.
|
||||
changes are made. The release number is bumped when changes are performed or
|
||||
things/features are added. The patch number is bumped when the changes are
|
||||
mere bugfixes.
|
||||
|
||||
It means that after release 1.2.3, we can release 2.0 if something really big
|
||||
has been made, 1.3 if not that big changes were made or 1.2.4 if mostly bugs
|
||||
were fixed. Before 1.2.4 is released, we might release a 1.2.4-pre1 release
|
||||
for the brave people to try before the actual release.
|
||||
were fixed.
|
||||
|
||||
Bumping, as in increasing the number with 1, is unconditionally only
|
||||
affecting one of the numbers (except the ones to the right of it, that may be
|
||||
@@ -56,12 +49,12 @@ Version Numbers and Releases
|
||||
#define LIBCURL_VERSION_NUM 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".
|
||||
hexadecimal. All three number fields are always represented using two digits
|
||||
(eight bits each). 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.
|
||||
This 6-digit hexadecimal number is always a greater number in a more recent
|
||||
release. It makes comparisons with greater than and less than work.
|
||||
|
||||
This number is also available as three separate defines:
|
||||
LIBCURL_VERSION_MAJOR, LIBCURL_VERSION_MINOR and LIBCURL_VERSION_PATCH.
|
||||
|
@@ -5,7 +5,7 @@
|
||||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2012, 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
|
||||
@@ -93,7 +93,6 @@ What's the installed libcurl version?
|
||||
|
||||
How do I build a single file with a one-line command?
|
||||
|
||||
$ `curl-config --cc --cflags --libs` -o example example.c
|
||||
|
||||
$ `curl-config --cc --cflags` -o example example.c `curl-config --libs`
|
||||
.SH "SEE ALSO"
|
||||
.BR curl (1)
|
||||
|
1073
docs/curl.1
1073
docs/curl.1
File diff suppressed because it is too large
Load Diff
11
docs/examples/.gitignore
vendored
11
docs/examples/.gitignore
vendored
@@ -4,6 +4,7 @@ certinfo
|
||||
chkspeed
|
||||
cookie_interface
|
||||
debug
|
||||
externalsocket
|
||||
fileupload
|
||||
fopen
|
||||
ftp-wildcard
|
||||
@@ -17,16 +18,26 @@ http-post
|
||||
httpcustomheader
|
||||
httpput
|
||||
https
|
||||
imap
|
||||
multi-app
|
||||
multi-debugcallback
|
||||
multi-double
|
||||
multi-post
|
||||
multi-single
|
||||
persistant
|
||||
pop3s
|
||||
pop3slist
|
||||
post-callback
|
||||
postit2
|
||||
progressfunc
|
||||
resolve
|
||||
rtsp
|
||||
sendrecv
|
||||
sepheaders
|
||||
simple
|
||||
simplepost
|
||||
simplesmtp
|
||||
simplessl
|
||||
smtp-multi
|
||||
smtp-tls
|
||||
url2file
|
||||
|
@@ -1,12 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* Example application source code using the multi interface to download many
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Example application source code using the multi interface to download many
|
||||
* files, but with a capped maximum amount of simultaneous transfers.
|
||||
*
|
||||
* Written by Michael Wallner
|
||||
@@ -119,7 +132,7 @@ int main(void)
|
||||
}
|
||||
|
||||
while (U) {
|
||||
while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(cm, &U));
|
||||
curl_multi_perform(cm, &U);
|
||||
|
||||
if (U) {
|
||||
FD_ZERO(&R);
|
||||
|
@@ -1,10 +1,29 @@
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# Project ___| | | | _ \| |
|
||||
# / __| | | | |_) | |
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2012, 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.
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign nostdinc
|
||||
|
||||
EXTRA_DIST = README Makefile.example Makefile.inc Makefile.m32 \
|
||||
makefile.dj $(COMPLICATED_EXAMPLES)
|
||||
Makefile.netware makefile.dj $(COMPLICATED_EXAMPLES)
|
||||
|
||||
# Specify our include paths here, and do it relative to $(top_srcdir) and
|
||||
# $(top_builddir), to ensure that these paths which belong to the library
|
||||
@@ -21,12 +40,12 @@ INCLUDES = -I$(top_builddir)/include/curl \
|
||||
|
||||
LIBDIR = $(top_builddir)/lib
|
||||
|
||||
if STATICLIB
|
||||
# we need this define when building with a static lib on Windows
|
||||
STATICCPPFLAGS = -DCURL_STATICLIB
|
||||
endif
|
||||
AM_CPPFLAGS = -DCURL_NO_OLDIES
|
||||
|
||||
CPPFLAGS = -DCURL_NO_OLDIES $(STATICCPPFLAGS)
|
||||
# Mostly for Windows build targets, when using static libcurl
|
||||
if USE_CPPFLAG_CURL_STATICLIB
|
||||
AM_CPPFLAGS += -DCURL_STATICLIB
|
||||
endif
|
||||
|
||||
# Dependencies
|
||||
LDADD = $(LIBDIR)/libcurl.la
|
||||
@@ -34,4 +53,4 @@ LDADD = $(LIBDIR)/libcurl.la
|
||||
# Makefile.inc provides the check_PROGRAMS and COMPLICATED_EXAMPLES defines
|
||||
include Makefile.inc
|
||||
|
||||
|
||||
all: $(check_PROGRAMS)
|
||||
|
@@ -1,11 +1,24 @@
|
||||
#############################################################################
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# Project ___| | | | _ \| |
|
||||
# / __| | | | |_) | |
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2011, 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.
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
# What to call the final executable
|
||||
TARGET = example
|
||||
|
@@ -3,10 +3,13 @@ check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \
|
||||
fopen ftpget ftpgetresp ftpupload getinfo getinmemory http-post httpput \
|
||||
https multi-app multi-debugcallback multi-double multi-post multi-single \
|
||||
persistant post-callback postit2 sepheaders simple simplepost simplessl \
|
||||
sendrecv httpcustomheader certinfo chkspeed ftpgetinfo ftp-wildcard
|
||||
sendrecv httpcustomheader certinfo chkspeed ftpgetinfo ftp-wildcard \
|
||||
smtp-multi simplesmtp smtp-tls rtsp externalsocket resolve \
|
||||
progressfunc pop3s pop3slist imap url2file
|
||||
|
||||
# These examples require external dependencies that may not be commonly
|
||||
# available on POSIX systems, so don't bother attempting to compile them here.
|
||||
COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cc cacertinmem.c \
|
||||
ftpuploadresume.c ghiper.c hiperfifo.c htmltidy.c multithread.c \
|
||||
opensslthreadlock.c sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c
|
||||
opensslthreadlock.c sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \
|
||||
smooth-gtk-thread.c version-check.pl
|
||||
|
@@ -1,28 +1,68 @@
|
||||
#########################################################################
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# Project ___| | | | _ \| |
|
||||
# / __| | | | |_) | |
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
## Makefile for building curl examples with MingW32
|
||||
## and optionally OpenSSL (0.9.8), libssh2 (0.18), zlib (1.2.3)
|
||||
# Copyright (C) 1998 - 2011, 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.
|
||||
#
|
||||
###########################################################################
|
||||
#
|
||||
## Makefile for building curl examples with MingW (GCC-3.2 or later)
|
||||
## and optionally OpenSSL (0.9.8), libssh2 (1.3), zlib (1.2.5), librtmp (2.3)
|
||||
##
|
||||
## Usage:
|
||||
## mingw32-make -f Makefile.m32 [SSL=1] [SSH2=1] [ZLIB=1] [SSPI=1] [IPV6=1] [DYN=1]
|
||||
## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
|
||||
## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-spi-winidn
|
||||
##
|
||||
## Hint: you can also set environment vars to control the build, f.e.:
|
||||
## set ZLIB_PATH=c:/zlib-1.2.3
|
||||
## set ZLIB_PATH=c:/zlib-1.2.7
|
||||
## set ZLIB=1
|
||||
##
|
||||
#########################################################################
|
||||
#
|
||||
###########################################################################
|
||||
|
||||
# Edit the path below to point to the base of your Zlib sources.
|
||||
ifndef ZLIB_PATH
|
||||
ZLIB_PATH = ../../zlib-1.2.3
|
||||
ZLIB_PATH = ../../../zlib-1.2.7
|
||||
endif
|
||||
# Edit the path below to point to the base of your OpenSSL package.
|
||||
ifndef OPENSSL_PATH
|
||||
OPENSSL_PATH = ../../openssl-0.9.8k
|
||||
OPENSSL_PATH = ../../../openssl-0.9.8x
|
||||
endif
|
||||
ifndef OPENSSL_LIBPATH
|
||||
OPENSSL_LIBPATH = $(OPENSSL_PATH)/out
|
||||
endif
|
||||
ifndef OPENSSL_LIBS
|
||||
OPENSSL_LIBS = -leay32 -lssl32
|
||||
endif
|
||||
# Edit the path below to point to the base of your LibSSH2 package.
|
||||
ifndef LIBSSH2_PATH
|
||||
LIBSSH2_PATH = ../../libssh2-1.2
|
||||
LIBSSH2_PATH = ../../../libssh2-1.4.2
|
||||
endif
|
||||
# Edit the path below to point to the base of your librtmp package.
|
||||
ifndef LIBRTMP_PATH
|
||||
LIBRTMP_PATH = ../../../librtmp-2.3
|
||||
endif
|
||||
# Edit the path below to point to the base of your libidn package.
|
||||
ifndef LIBIDN_PATH
|
||||
LIBIDN_PATH = ../../../libidn-1.18
|
||||
endif
|
||||
# Edit the path below to point to the base of your MS IDN package.
|
||||
# Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1
|
||||
# http://www.microsoft.com/downloads/en/details.aspx?FamilyID=ad6158d7-ddba-416a-9109-07607425a815
|
||||
ifndef WINIDN_PATH
|
||||
WINIDN_PATH = ../../../Microsoft IDN Mitigation APIs
|
||||
endif
|
||||
# Edit the path below to point to the base of your Novell LDAP NDK.
|
||||
ifndef LDAP_SDK
|
||||
@@ -30,25 +70,76 @@ LDAP_SDK = c:/novell/ndk/cldapsdk/win32
|
||||
endif
|
||||
|
||||
PROOT = ../..
|
||||
ARES_LIB = $(PROOT)/ares
|
||||
|
||||
SSL = 1
|
||||
ZLIB = 1
|
||||
# Edit the path below to point to the base of your c-ares package.
|
||||
ifndef LIBCARES_PATH
|
||||
LIBCARES_PATH = $(PROOT)/ares
|
||||
endif
|
||||
|
||||
# Edit the var below to set to your architecture or set environment var.
|
||||
ifndef ARCH
|
||||
ARCH = w32
|
||||
endif
|
||||
|
||||
CC = gcc
|
||||
CFLAGS = -g -O2 -Wall
|
||||
CFLAGS += -fno-strict-aliasing
|
||||
ifeq ($(ARCH),w64)
|
||||
CFLAGS += -D_AMD64_
|
||||
endif
|
||||
# comment LDFLAGS below to keep debug info
|
||||
LDFLAGS = -s
|
||||
RC = windres
|
||||
RCFLAGS = --include-dir=$(PROOT)/include -O COFF -i
|
||||
RM = del /q /f > NUL 2>&1
|
||||
|
||||
RM = del /q /f 2>NUL
|
||||
CP = copy
|
||||
|
||||
########################################################
|
||||
## Nothing more to do below this line!
|
||||
|
||||
ifeq ($(findstring -dyn,$(CFG)),-dyn)
|
||||
DYN = 1
|
||||
endif
|
||||
ifeq ($(findstring -ares,$(CFG)),-ares)
|
||||
ARES = 1
|
||||
endif
|
||||
ifeq ($(findstring -rtmp,$(CFG)),-rtmp)
|
||||
RTMP = 1
|
||||
SSL = 1
|
||||
ZLIB = 1
|
||||
endif
|
||||
ifeq ($(findstring -ssh2,$(CFG)),-ssh2)
|
||||
SSH2 = 1
|
||||
SSL = 1
|
||||
ZLIB = 1
|
||||
endif
|
||||
ifeq ($(findstring -ssl,$(CFG)),-ssl)
|
||||
SSL = 1
|
||||
endif
|
||||
ifeq ($(findstring -zlib,$(CFG)),-zlib)
|
||||
ZLIB = 1
|
||||
endif
|
||||
ifeq ($(findstring -idn,$(CFG)),-idn)
|
||||
IDN = 1
|
||||
endif
|
||||
ifeq ($(findstring -winidn,$(CFG)),-winidn)
|
||||
WINIDN = 1
|
||||
endif
|
||||
ifeq ($(findstring -sspi,$(CFG)),-sspi)
|
||||
SSPI = 1
|
||||
endif
|
||||
ifeq ($(findstring -spnego,$(CFG)),-spnego)
|
||||
SPNEGO = 1
|
||||
endif
|
||||
ifeq ($(findstring -ldaps,$(CFG)),-ldaps)
|
||||
LDAPS = 1
|
||||
endif
|
||||
ifeq ($(findstring -ipv6,$(CFG)),-ipv6)
|
||||
IPV6 = 1
|
||||
endif
|
||||
|
||||
INCLUDES = -I. -I$(PROOT) -I$(PROOT)/include -I$(PROOT)/lib
|
||||
LINK = $(CC) $(LDFLAGS) -o $@
|
||||
|
||||
ifdef DYN
|
||||
curl_DEPENDENCIES = $(PROOT)/lib/libcurldll.a $(PROOT)/lib/libcurl.dll
|
||||
@@ -60,34 +151,45 @@ else
|
||||
endif
|
||||
ifdef ARES
|
||||
ifndef DYN
|
||||
curl_DEPENDENCIES += $(ARES_LIB)/libcares.a
|
||||
curl_DEPENDENCIES += $(LIBCARES_PATH)/libcares.a
|
||||
endif
|
||||
CFLAGS += -DUSE_ARES
|
||||
curl_LDADD += -L$(ARES_LIB) -lcares
|
||||
curl_LDADD += -L"$(LIBCARES_PATH)" -lcares
|
||||
endif
|
||||
ifdef RTMP
|
||||
CFLAGS += -DUSE_LIBRTMP
|
||||
curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm
|
||||
endif
|
||||
ifdef SSH2
|
||||
CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
|
||||
curl_LDADD += -L$(LIBSSH2_PATH)/win32 -lssh2
|
||||
curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2
|
||||
endif
|
||||
ifdef SSL
|
||||
INCLUDES += -I"$(OPENSSL_PATH)/outinc"
|
||||
CFLAGS += -DUSE_SSLEAY -DHAVE_OPENSSL_ENGINE_H
|
||||
ifdef DYN
|
||||
curl_LDADD += -L$(OPENSSL_PATH)/out -leay32 -lssl32
|
||||
else
|
||||
curl_LDADD += -L$(OPENSSL_PATH)/out -lssl -lcrypto -lgdi32
|
||||
endif
|
||||
curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
|
||||
endif
|
||||
ifdef ZLIB
|
||||
INCLUDES += -I"$(ZLIB_PATH)"
|
||||
CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
|
||||
curl_LDADD += -L$(ZLIB_PATH) -lz
|
||||
curl_LDADD += -L"$(ZLIB_PATH)" -lz
|
||||
endif
|
||||
ifdef IDN
|
||||
CFLAGS += -DUSE_LIBIDN
|
||||
curl_LDADD += -L"$(LIBIDN_PATH)/lib" -lidn
|
||||
else
|
||||
ifdef WINIDN
|
||||
CFLAGS += -DUSE_WIN32_IDN
|
||||
curl_LDADD += -L"$(WINIDN_PATH)" -lnormaliz
|
||||
endif
|
||||
endif
|
||||
ifdef SSPI
|
||||
CFLAGS += -DUSE_WINDOWS_SSPI
|
||||
endif
|
||||
ifdef SPNEGO
|
||||
CFLAGS += -DHAVE_SPNEGO
|
||||
endif
|
||||
ifdef IPV6
|
||||
CFLAGS += -DENABLE_IPV6
|
||||
CFLAGS += -DENABLE_IPV6 -D_WIN32_WINNT=0x0501
|
||||
endif
|
||||
ifdef LDAPS
|
||||
CFLAGS += -DHAVE_LDAP_SSL
|
||||
@@ -102,32 +204,32 @@ ifdef USE_LDAP_OPENLDAP
|
||||
endif
|
||||
ifndef USE_LDAP_NOVELL
|
||||
ifndef USE_LDAP_OPENLDAP
|
||||
curl_LDADD += -lwldap32
|
||||
curl_LDADD += -lwldap32
|
||||
endif
|
||||
endif
|
||||
curl_LDADD += -lws2_32
|
||||
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
||||
|
||||
# Makefile.inc provides the check_PROGRAMS and COMPLICATED_EXAMPLES defines
|
||||
include Makefile.inc
|
||||
|
||||
example_PROGRAMS := $(patsubst %,%.exe,$(strip $(check_PROGRAMS)))
|
||||
|
||||
.SUFFIXES: .rc .res .o .exe
|
||||
check_PROGRAMS := $(patsubst %,%.exe,$(strip $(check_PROGRAMS)))
|
||||
check_PROGRAMS += ftpuploadresume.exe synctime.exe
|
||||
|
||||
|
||||
all: $(example_PROGRAMS)
|
||||
all: $(check_PROGRAMS)
|
||||
|
||||
.o.exe: $(curl_DEPENDENCIES)
|
||||
$(LINK) $< $(curl_LDADD)
|
||||
%.exe: %.o $(curl_DEPENDENCIES)
|
||||
$(CC) $(LDFLAGS) -o $@ $< $(curl_LDADD)
|
||||
|
||||
.c.o:
|
||||
$(COMPILE) -c $<
|
||||
%.o: %.c
|
||||
$(CC) $(INCLUDES) $(CFLAGS) -c $<
|
||||
|
||||
.rc.res:
|
||||
%.res: %.rc
|
||||
$(RC) $(RCFLAGS) $< -o $@
|
||||
|
||||
clean:
|
||||
$(RM) $(example_PROGRAMS)
|
||||
-$(RM) $(check_PROGRAMS:.exe=.o)
|
||||
|
||||
distclean vclean: clean
|
||||
-$(RM) $(check_PROGRAMS)
|
||||
|
||||
|
441
docs/examples/Makefile.netware
Normal file
441
docs/examples/Makefile.netware
Normal file
@@ -0,0 +1,441 @@
|
||||
#################################################################
|
||||
#
|
||||
## Makefile for building curl.nlm (NetWare version - gnu make)
|
||||
## Use: make -f Makefile.netware
|
||||
##
|
||||
## Comments to: Guenter Knauf http://www.gknw.net/phpbb
|
||||
#
|
||||
#################################################################
|
||||
|
||||
# Edit the path below to point to the base of your Novell NDK.
|
||||
ifndef NDKBASE
|
||||
NDKBASE = c:/novell
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your Zlib sources.
|
||||
ifndef ZLIB_PATH
|
||||
ZLIB_PATH = ../../../zlib-1.2.7
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your OpenSSL package.
|
||||
ifndef OPENSSL_PATH
|
||||
OPENSSL_PATH = ../../../openssl-0.9.8x
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your LibSSH2 package.
|
||||
ifndef LIBSSH2_PATH
|
||||
LIBSSH2_PATH = ../../../libssh2-1.4.2
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your axTLS package.
|
||||
ifndef AXTLS_PATH
|
||||
AXTLS_PATH = ../../../axTLS-1.2.7
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your libidn package.
|
||||
ifndef LIBIDN_PATH
|
||||
LIBIDN_PATH = ../../../libidn-1.18
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your librtmp package.
|
||||
ifndef LIBRTMP_PATH
|
||||
LIBRTMP_PATH = ../../../librtmp-2.3
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your fbopenssl package.
|
||||
ifndef FBOPENSSL_PATH
|
||||
FBOPENSSL_PATH = ../../fbopenssl-0.4
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your c-ares package.
|
||||
ifndef LIBCARES_PATH
|
||||
LIBCARES_PATH = ../../ares
|
||||
endif
|
||||
|
||||
ifndef INSTDIR
|
||||
INSTDIR = ..$(DS)..$(DS)curl-$(LIBCURL_VERSION_STR)-bin-nw
|
||||
endif
|
||||
|
||||
# Edit the vars below to change NLM target settings.
|
||||
TARGET = examples
|
||||
VERSION = $(LIBCURL_VERSION)
|
||||
COPYR = Copyright (C) $(LIBCURL_COPYRIGHT_STR)
|
||||
DESCR = cURL ($(LIBARCH))
|
||||
MTSAFE = YES
|
||||
STACK = 8192
|
||||
SCREEN = Example Program
|
||||
# Comment the line below if you dont want to load protected automatically.
|
||||
# LDRING = 3
|
||||
|
||||
# Uncomment the next line to enable linking with POSIX semantics.
|
||||
# POSIXFL = 1
|
||||
|
||||
# Edit the var below to point to your lib architecture.
|
||||
ifndef LIBARCH
|
||||
LIBARCH = LIBC
|
||||
endif
|
||||
|
||||
# must be equal to NDEBUG or DEBUG, CURLDEBUG
|
||||
ifndef DB
|
||||
DB = NDEBUG
|
||||
endif
|
||||
# Optimization: -O<n> or debugging: -g
|
||||
ifeq ($(DB),NDEBUG)
|
||||
OPT = -O2
|
||||
OBJDIR = release
|
||||
else
|
||||
OPT = -g
|
||||
OBJDIR = debug
|
||||
endif
|
||||
|
||||
# The following lines defines your compiler.
|
||||
ifdef CWFolder
|
||||
METROWERKS = $(CWFolder)
|
||||
endif
|
||||
ifdef METROWERKS
|
||||
# MWCW_PATH = $(subst \,/,$(METROWERKS))/Novell Support
|
||||
MWCW_PATH = $(subst \,/,$(METROWERKS))/Novell Support/Metrowerks Support
|
||||
CC = mwccnlm
|
||||
else
|
||||
CC = gcc
|
||||
endif
|
||||
PERL = perl
|
||||
# Here you can find a native Win32 binary of the original awk:
|
||||
# http://www.gknw.net/development/prgtools/awk-20100523.zip
|
||||
AWK = awk
|
||||
CP = cp -afv
|
||||
MKDIR = mkdir
|
||||
# RM = rm -f
|
||||
# If you want to mark the target as MTSAFE you will need a tool for
|
||||
# generating the xdc data for the linker; here's a minimal tool:
|
||||
# http://www.gknw.net/development/prgtools/mkxdc.zip
|
||||
MPKXDC = mkxdc
|
||||
|
||||
# LIBARCH_U = $(shell $(AWK) 'BEGIN {print toupper(ARGV[1])}' $(LIBARCH))
|
||||
LIBARCH_L = $(shell $(AWK) 'BEGIN {print tolower(ARGV[1])}' $(LIBARCH))
|
||||
|
||||
# Include the version info retrieved from curlver.h
|
||||
-include $(OBJDIR)/version.inc
|
||||
|
||||
# Global flags for all compilers
|
||||
CFLAGS += $(OPT) -D$(DB) -DNETWARE -DHAVE_CONFIG_H -nostdinc
|
||||
|
||||
ifeq ($(CC),mwccnlm)
|
||||
LD = mwldnlm
|
||||
LDFLAGS = -nostdlib $< $(PRELUDE) $(LDLIBS) -o $@ -commandfile
|
||||
LIBEXT = lib
|
||||
CFLAGS += -gccinc -inline off -opt nointrinsics -proc 586
|
||||
CFLAGS += -relax_pointers
|
||||
#CFLAGS += -w on
|
||||
ifeq ($(LIBARCH),LIBC)
|
||||
ifeq ($(POSIXFL),1)
|
||||
PRELUDE = $(NDK_LIBC)/imports/posixpre.o
|
||||
else
|
||||
PRELUDE = $(NDK_LIBC)/imports/libcpre.o
|
||||
endif
|
||||
CFLAGS += -align 4
|
||||
else
|
||||
# PRELUDE = $(NDK_CLIB)/imports/clibpre.o
|
||||
# to avoid the __init_* / __deinit_* whoes dont use prelude from NDK
|
||||
PRELUDE = "$(MWCW_PATH)/libraries/runtime/prelude.obj"
|
||||
# CFLAGS += -include "$(MWCW_PATH)/headers/nlm_clib_prefix.h"
|
||||
CFLAGS += -align 1
|
||||
endif
|
||||
else
|
||||
LD = nlmconv
|
||||
LDFLAGS = -T
|
||||
LIBEXT = a
|
||||
CFLAGS += -m32
|
||||
CFLAGS += -fno-builtin -fno-strict-aliasing
|
||||
ifeq ($(findstring gcc,$(CC)),gcc)
|
||||
CFLAGS += -fpcc-struct-return
|
||||
endif
|
||||
CFLAGS += -Wall # -pedantic
|
||||
ifeq ($(LIBARCH),LIBC)
|
||||
ifeq ($(POSIXFL),1)
|
||||
PRELUDE = $(NDK_LIBC)/imports/posixpre.gcc.o
|
||||
else
|
||||
PRELUDE = $(NDK_LIBC)/imports/libcpre.gcc.o
|
||||
endif
|
||||
else
|
||||
# PRELUDE = $(NDK_CLIB)/imports/clibpre.gcc.o
|
||||
# to avoid the __init_* / __deinit_* whoes dont use prelude from NDK
|
||||
# http://www.gknw.net/development/mk_nlm/gcc_pre.zip
|
||||
PRELUDE = $(NDK_ROOT)/pre/prelude.o
|
||||
CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h
|
||||
endif
|
||||
endif
|
||||
|
||||
NDK_ROOT = $(NDKBASE)/ndk
|
||||
ifndef NDK_CLIB
|
||||
NDK_CLIB = $(NDK_ROOT)/nwsdk
|
||||
endif
|
||||
ifndef NDK_LIBC
|
||||
NDK_LIBC = $(NDK_ROOT)/libc
|
||||
endif
|
||||
ifndef NDK_LDAP
|
||||
NDK_LDAP = $(NDK_ROOT)/cldapsdk/netware
|
||||
endif
|
||||
CURL_INC = ../../include
|
||||
CURL_LIB = ../../lib
|
||||
|
||||
INCLUDES = -I$(CURL_INC)
|
||||
|
||||
ifeq ($(findstring -static,$(CFG)),-static)
|
||||
LINK_STATIC = 1
|
||||
endif
|
||||
ifeq ($(findstring -ares,$(CFG)),-ares)
|
||||
WITH_ARES = 1
|
||||
endif
|
||||
ifeq ($(findstring -rtmp,$(CFG)),-rtmp)
|
||||
WITH_RTMP = 1
|
||||
WITH_SSL = 1
|
||||
WITH_ZLIB = 1
|
||||
endif
|
||||
ifeq ($(findstring -ssh2,$(CFG)),-ssh2)
|
||||
WITH_SSH2 = 1
|
||||
WITH_SSL = 1
|
||||
WITH_ZLIB = 1
|
||||
endif
|
||||
ifeq ($(findstring -axtls,$(CFG)),-axtls)
|
||||
WITH_AXTLS = 1
|
||||
WITH_SSL =
|
||||
else
|
||||
ifeq ($(findstring -ssl,$(CFG)),-ssl)
|
||||
WITH_SSL = 1
|
||||
endif
|
||||
endif
|
||||
ifeq ($(findstring -zlib,$(CFG)),-zlib)
|
||||
WITH_ZLIB = 1
|
||||
endif
|
||||
ifeq ($(findstring -idn,$(CFG)),-idn)
|
||||
WITH_IDN = 1
|
||||
endif
|
||||
ifeq ($(findstring -spnego,$(CFG)),-spnego)
|
||||
WITH_SPNEGO = 1
|
||||
endif
|
||||
ifeq ($(findstring -ipv6,$(CFG)),-ipv6)
|
||||
ENABLE_IPV6 = 1
|
||||
endif
|
||||
|
||||
ifdef LINK_STATIC
|
||||
LDLIBS = $(CURL_LIB)/libcurl.$(LIBEXT)
|
||||
ifdef WITH_ARES
|
||||
LDLIBS += $(LIBCARES_PATH)/libcares.$(LIBEXT)
|
||||
endif
|
||||
else
|
||||
MODULES = libcurl.nlm
|
||||
IMPORTS = @$(CURL_LIB)/libcurl.imp
|
||||
endif
|
||||
ifdef WITH_SSH2
|
||||
# INCLUDES += -I$(LIBSSH2_PATH)/include
|
||||
ifdef LINK_STATIC
|
||||
LDLIBS += $(LIBSSH2_PATH)/nw/libssh2.$(LIBEXT)
|
||||
else
|
||||
MODULES += libssh2.nlm
|
||||
IMPORTS += @$(LIBSSH2_PATH)/nw/libssh2.imp
|
||||
endif
|
||||
endif
|
||||
ifdef WITH_RTMP
|
||||
# INCLUDES += -I$(LIBRTMP_PATH)
|
||||
ifdef LINK_STATIC
|
||||
LDLIBS += $(LIBRTMP_PATH)/librtmp/librtmp.$(LIBEXT)
|
||||
endif
|
||||
endif
|
||||
ifdef WITH_SSL
|
||||
INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L)
|
||||
LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT)
|
||||
LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT)
|
||||
IMPORTS += GetProcessSwitchCount RunningProcess
|
||||
ifdef WITH_SPNEGO
|
||||
# INCLUDES += -I$(FBOPENSSL_PATH)/include
|
||||
LDLIBS += $(FBOPENSSL_PATH)/nw/fbopenssl.$(LIBEXT)
|
||||
endif
|
||||
else
|
||||
ifdef WITH_AXTLS
|
||||
INCLUDES += -I$(AXTLS_PATH)/inc
|
||||
ifdef LINK_STATIC
|
||||
LDLIBS += $(AXTLS_PATH)/lib/libaxtls.$(LIBEXT)
|
||||
else
|
||||
MODULES += libaxtls.nlm
|
||||
IMPORTS += $(AXTLS_PATH)/lib/libaxtls.imp
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
ifdef WITH_ZLIB
|
||||
# INCLUDES += -I$(ZLIB_PATH)
|
||||
ifdef LINK_STATIC
|
||||
LDLIBS += $(ZLIB_PATH)/nw/$(LIBARCH)/libz.$(LIBEXT)
|
||||
else
|
||||
MODULES += libz.nlm
|
||||
IMPORTS += @$(ZLIB_PATH)/nw/$(LIBARCH)/libz.imp
|
||||
endif
|
||||
endif
|
||||
ifdef WITH_IDN
|
||||
# INCLUDES += -I$(LIBIDN_PATH)/include
|
||||
LDLIBS += $(LIBIDN_PATH)/lib/libidn.$(LIBEXT)
|
||||
endif
|
||||
|
||||
ifeq ($(LIBARCH),LIBC)
|
||||
INCLUDES += -I$(NDK_LIBC)/include
|
||||
# INCLUDES += -I$(NDK_LIBC)/include/nks
|
||||
# INCLUDES += -I$(NDK_LIBC)/include/winsock
|
||||
CFLAGS += -D_POSIX_SOURCE
|
||||
else
|
||||
INCLUDES += -I$(NDK_CLIB)/include/nlm
|
||||
# INCLUDES += -I$(NDK_CLIB)/include
|
||||
endif
|
||||
ifndef DISABLE_LDAP
|
||||
# INCLUDES += -I$(NDK_LDAP)/$(LIBARCH_L)/inc
|
||||
endif
|
||||
CFLAGS += $(INCLUDES)
|
||||
|
||||
ifeq ($(MTSAFE),YES)
|
||||
XDCOPT = -n
|
||||
endif
|
||||
ifeq ($(MTSAFE),NO)
|
||||
XDCOPT = -u
|
||||
endif
|
||||
ifdef XDCOPT
|
||||
XDCDATA = $(OBJDIR)/$(TARGET).xdc
|
||||
endif
|
||||
|
||||
ifeq ($(findstring /sh,$(SHELL)),/sh)
|
||||
DL = '
|
||||
DS = /
|
||||
PCT = %
|
||||
#-include $(NDKBASE)/nlmconv/ncpfs.inc
|
||||
else
|
||||
DS = \\
|
||||
PCT = %%
|
||||
endif
|
||||
|
||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||
include Makefile.inc
|
||||
|
||||
check_PROGRAMS := $(patsubst %,%.nlm,$(strip $(check_PROGRAMS)))
|
||||
|
||||
.PRECIOUS: $(OBJDIR)/%.o $(OBJDIR)/%.def $(OBJDIR)/%.xdc
|
||||
|
||||
|
||||
all: prebuild $(check_PROGRAMS)
|
||||
|
||||
prebuild: $(OBJDIR) $(OBJDIR)/version.inc
|
||||
|
||||
$(OBJDIR)/%.o: %.c
|
||||
@echo Compiling $<
|
||||
$(CC) $(CFLAGS) -c $< -o $@
|
||||
|
||||
$(OBJDIR)/version.inc: $(CURL_INC)/curl/curlver.h $(OBJDIR)
|
||||
@echo Creating $@
|
||||
@$(AWK) -f ../../packages/NetWare/get_ver.awk $< > $@
|
||||
|
||||
install: $(INSTDIR) all
|
||||
@$(CP) $(check_PROGRAMS) $(INSTDIR)
|
||||
|
||||
clean:
|
||||
-$(RM) -r $(OBJDIR)
|
||||
|
||||
distclean vclean: clean
|
||||
-$(RM) $(check_PROGRAMS)
|
||||
|
||||
$(OBJDIR) $(INSTDIR):
|
||||
@$(MKDIR) $@
|
||||
|
||||
%.nlm: $(OBJDIR)/%.o $(OBJDIR)/%.def $(XDCDATA)
|
||||
@echo Linking $@
|
||||
@-$(RM) $@
|
||||
@$(LD) $(LDFLAGS) $(OBJDIR)/$(@:.nlm=.def)
|
||||
|
||||
$(OBJDIR)/%.xdc: Makefile.netware
|
||||
@echo Creating $@
|
||||
@$(MPKXDC) $(XDCOPT) $@
|
||||
|
||||
$(OBJDIR)/%.def: Makefile.netware
|
||||
@echo $(DL)# DEF file for linking with $(LD)$(DL) > $@
|
||||
@echo $(DL)# Do not edit this file - it is created by Make!$(DL) >> $@
|
||||
@echo $(DL)# All your changes will be lost!!$(DL) >> $@
|
||||
@echo $(DL)#$(DL) >> $@
|
||||
@echo $(DL)copyright "$(COPYR)"$(DL) >> $@
|
||||
@echo $(DL)description "$(DESCR) $(notdir $(@:.def=)) Example"$(DL) >> $@
|
||||
@echo $(DL)version $(VERSION)$(DL) >> $@
|
||||
ifdef NLMTYPE
|
||||
@echo $(DL)type $(NLMTYPE)$(DL) >> $@
|
||||
endif
|
||||
ifdef STACK
|
||||
@echo $(DL)stack $(STACK)$(DL) >> $@
|
||||
endif
|
||||
ifdef SCREEN
|
||||
@echo $(DL)screenname "$(DESCR) $(notdir $(@:.def=)) $(SCREEN)"$(DL) >> $@
|
||||
else
|
||||
@echo $(DL)screenname "DEFAULT"$(DL) >> $@
|
||||
endif
|
||||
ifneq ($(DB),NDEBUG)
|
||||
@echo $(DL)debug$(DL) >> $@
|
||||
endif
|
||||
@echo $(DL)threadname "_$(notdir $(@:.def=))"$(DL) >> $@
|
||||
ifdef XDCDATA
|
||||
@echo $(DL)xdcdata $(XDCDATA)$(DL) >> $@
|
||||
endif
|
||||
ifeq ($(LDRING),0)
|
||||
@echo $(DL)flag_on 16$(DL) >> $@
|
||||
endif
|
||||
ifeq ($(LDRING),3)
|
||||
@echo $(DL)flag_on 512$(DL) >> $@
|
||||
endif
|
||||
ifeq ($(LIBARCH),CLIB)
|
||||
@echo $(DL)start _Prelude$(DL) >> $@
|
||||
@echo $(DL)exit _Stop$(DL) >> $@
|
||||
@echo $(DL)import @$(NDK_CLIB)/imports/clib.imp$(DL) >> $@
|
||||
@echo $(DL)import @$(NDK_CLIB)/imports/threads.imp$(DL) >> $@
|
||||
@echo $(DL)import @$(NDK_CLIB)/imports/nlmlib.imp$(DL) >> $@
|
||||
@echo $(DL)import @$(NDK_CLIB)/imports/socklib.imp$(DL) >> $@
|
||||
@echo $(DL)module clib$(DL) >> $@
|
||||
ifndef DISABLE_LDAP
|
||||
@echo $(DL)import @$(NDK_LDAP)/clib/imports/ldapsdk.imp$(DL) >> $@
|
||||
@echo $(DL)import @$(NDK_LDAP)/clib/imports/ldapssl.imp$(DL) >> $@
|
||||
# @echo $(DL)import @$(NDK_LDAP)/clib/imports/ldapx.imp$(DL) >> $@
|
||||
@echo $(DL)module ldapsdk ldapssl$(DL) >> $@
|
||||
endif
|
||||
else
|
||||
ifeq ($(POSIXFL),1)
|
||||
@echo $(DL)flag_on 4194304$(DL) >> $@
|
||||
endif
|
||||
@echo $(DL)flag_on 64$(DL) >> $@
|
||||
@echo $(DL)pseudopreemption$(DL) >> $@
|
||||
ifeq ($(findstring posixpre,$(PRELUDE)),posixpre)
|
||||
@echo $(DL)start POSIX_Start$(DL) >> $@
|
||||
@echo $(DL)exit POSIX_Stop$(DL) >> $@
|
||||
@echo $(DL)check POSIX_CheckUnload$(DL) >> $@
|
||||
else
|
||||
@echo $(DL)start _LibCPrelude$(DL) >> $@
|
||||
@echo $(DL)exit _LibCPostlude$(DL) >> $@
|
||||
@echo $(DL)check _LibCCheckUnload$(DL) >> $@
|
||||
endif
|
||||
@echo $(DL)import @$(NDK_LIBC)/imports/libc.imp$(DL) >> $@
|
||||
@echo $(DL)import @$(NDK_LIBC)/imports/netware.imp$(DL) >> $@
|
||||
@echo $(DL)module libc$(DL) >> $@
|
||||
ifndef DISABLE_LDAP
|
||||
@echo $(DL)import @$(NDK_LDAP)/libc/imports/lldapsdk.imp$(DL) >> $@
|
||||
@echo $(DL)import @$(NDK_LDAP)/libc/imports/lldapssl.imp$(DL) >> $@
|
||||
# @echo $(DL)import @$(NDK_LDAP)/libc/imports/lldapx.imp$(DL) >> $@
|
||||
@echo $(DL)module lldapsdk lldapssl$(DL) >> $@
|
||||
endif
|
||||
endif
|
||||
ifdef MODULES
|
||||
@echo $(DL)module $(MODULES)$(DL) >> $@
|
||||
endif
|
||||
ifdef EXPORTS
|
||||
@echo $(DL)export $(EXPORTS)$(DL) >> $@
|
||||
endif
|
||||
ifdef IMPORTS
|
||||
@echo $(DL)import $(IMPORTS)$(DL) >> $@
|
||||
endif
|
||||
ifeq ($(findstring nlmconv,$(LD)),nlmconv)
|
||||
@echo $(DL)input $(PRELUDE)$(DL) >> $@
|
||||
@echo $(DL)input $(@:.def=.o)$(DL) >> $@
|
||||
ifdef LDLIBS
|
||||
@echo $(DL)input $(LDLIBS)$(DL) >> $@
|
||||
endif
|
||||
@echo $(DL)output $(notdir $(@:.def=.nlm))$(DL) >> $@
|
||||
endif
|
@@ -55,6 +55,7 @@ htmltitle.cc - download a HTML file and extract the <title> tag from a HTML
|
||||
http-post.c - HTTP POST
|
||||
httpput.c - HTTP PUT a local file
|
||||
https.c - simple HTTPS transfer
|
||||
imap.c - simple IMAP transfer
|
||||
multi-app.c - a multi-interface app
|
||||
multi-debugcallback.c - a multi-interface app using the debug callback
|
||||
multi-double.c - a multi-interface app doing two simultaneous transfers
|
||||
@@ -63,6 +64,8 @@ multi-single.c - a multi-interface app getting a single file
|
||||
multithread.c - an example using multi-treading transferring multiple files
|
||||
opensslthreadlock.c - show how to do locking when using OpenSSL multi-threaded
|
||||
persistant.c - request two URLs with a persistent connection
|
||||
pop3s.c - POP3S transfer
|
||||
pop3slist.c - POP3S LIST
|
||||
post-callback.c - send a HTTP POST using a callback
|
||||
postit2.c - send a HTTP multipart formpost
|
||||
sampleconv.c - showing how a program on a non-ASCII platform would invoke
|
||||
@@ -73,4 +76,5 @@ simple.c - the most simple download a URL source
|
||||
simplepost.c - HTTP POST
|
||||
simplessl.c - HTTPS example with certificates many options set
|
||||
synctime.c - Sync local time by extracting date from remote HTTP servers
|
||||
url2file.c - download a document and store it in a file
|
||||
10-at-a-time.c - Download many files simultaneously, 10 at a time.
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2012, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef WIN32
|
||||
@@ -14,9 +26,8 @@
|
||||
#else
|
||||
# ifdef __VMS
|
||||
typedef int intptr_t;
|
||||
# else
|
||||
# include <stdint.h>
|
||||
# endif
|
||||
# include <stdint.h>
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
@@ -77,12 +88,16 @@ static curlioerr my_ioctl(CURL *handle, curliocmd cmd, void *userp)
|
||||
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
size_t retcode;
|
||||
curl_off_t nread;
|
||||
|
||||
intptr_t fd = (intptr_t)stream;
|
||||
|
||||
retcode = read(fd, ptr, size * nmemb);
|
||||
|
||||
fprintf(stderr, "*** We read %d bytes from file\n", retcode);
|
||||
nread = (curl_off_t)retcode;
|
||||
|
||||
fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
|
||||
" bytes from file\n", nread);
|
||||
|
||||
return retcode;
|
||||
}
|
||||
|
@@ -1,12 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* Example using a "in core" PEM certificate to retrieve a https page.
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Example using a "in core" PEM certificate to retrieve a https page.
|
||||
* Written by Theo Borm
|
||||
*/
|
||||
|
||||
@@ -111,7 +124,7 @@ int main(void)
|
||||
rv=curl_easy_setopt(ch,CURLOPT_WRITEHEADER, stderr);
|
||||
rv=curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM");
|
||||
rv=curl_easy_setopt(ch,CURLOPT_SSL_VERIFYPEER,1L);
|
||||
rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.cacert.org/");
|
||||
rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
|
||||
|
||||
/* first try: retrieve page without cacerts' certificate -> will fail
|
||||
*/
|
||||
|
@@ -1,17 +1,36 @@
|
||||
/*****************************************************************************
|
||||
*/
|
||||
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h>
|
||||
#include <curl/easy.h>
|
||||
|
||||
static size_t wrfu(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
(void)stream;
|
||||
(void)ptr;
|
||||
return size * nmemb;
|
||||
}
|
||||
int main(int argc, char **argv)
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
@@ -20,7 +39,7 @@ int main(int argc, char **argv)
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://www.networking4all.com/");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wrfu);
|
||||
|
||||
|
@@ -1,12 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* Example source code to show how the callback function can be used to
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Example source code to show how the callback function can be used to
|
||||
* download data into a chunk of memory instead of storing it in a file.
|
||||
* After successful download we use curl_easy_getinfo() calls to get the
|
||||
* amount of downloaded bytes, the time used for the whole download, and
|
||||
@@ -22,8 +35,6 @@
|
||||
#include <time.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h>
|
||||
#include <curl/easy.h>
|
||||
|
||||
#define URL_BASE "http://speedtest.your.domain/"
|
||||
#define URL_1M URL_BASE "file_1M.bin"
|
||||
@@ -71,7 +82,7 @@ int main(int argc, char *argv[])
|
||||
} else if (strncasecmp(*argv, "-T", 2) == 0) {
|
||||
prttime = 1;
|
||||
} else if (strncasecmp(*argv, "-M=", 3) == 0) {
|
||||
int m = atoi(*argv + 3);
|
||||
long m = strtol((*argv)+3, NULL, 10);
|
||||
switch(m) {
|
||||
case 1: url = URL_1M;
|
||||
break;
|
||||
|
@@ -1,12 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* This example shows usage of simple cookie interface.
|
||||
*/
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* This example shows usage of simple cookie interface. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@@ -53,7 +66,7 @@ main(void)
|
||||
if (curl) {
|
||||
char nline[256];
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com/"); /* google.com sets "PREF" cookie */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* just to start the cookie engine */
|
||||
res = curl_easy_perform(curl);
|
||||
|
@@ -13,8 +13,6 @@
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h> /* new for v7 */
|
||||
#include <curl/easy.h> /* new for v7 */
|
||||
|
||||
GtkWidget *Bar;
|
||||
|
||||
|
@@ -239,8 +239,7 @@ static CURLcode sslctxfun(CURL * curl, void * sslctx, void * parm) {
|
||||
SSL_CTX_set_cipher_list(ctx,"RC4-MD5");
|
||||
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
|
||||
|
||||
X509_STORE_add_cert(ctx->cert_store,sk_X509_value(p->ca,
|
||||
sk_X509_num(p->ca)-1));
|
||||
X509_STORE_add_cert(SSL_CTX_get_cert_store(ctx), sk_X509_value(p->ca, sk_X509_num(p->ca)-1));
|
||||
|
||||
SSL_CTX_set_verify_depth(ctx,2);
|
||||
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
@@ -28,12 +40,12 @@ void dump(const char *text,
|
||||
/* without the hex output, we can fit more on screen */
|
||||
width = 0x40;
|
||||
|
||||
fprintf(stream, "%s, %010.10ld bytes (0x%08.8lx)\n",
|
||||
fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n",
|
||||
text, (long)size, (long)size);
|
||||
|
||||
for(i=0; i<size; i+= width) {
|
||||
|
||||
fprintf(stream, "%04.4lx: ", (long)i);
|
||||
fprintf(stream, "%4.4lx: ", (long)i);
|
||||
|
||||
if(!nohex) {
|
||||
/* hex not disabled, show it */
|
||||
@@ -118,7 +130,7 @@ int main(void)
|
||||
/* the DEBUGFUNCTION has no effect until we enable VERBOSE */
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* always cleanup */
|
||||
|
@@ -1,12 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* Example application source code using the multi socket interface to
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Example application source code using the multi socket interface to
|
||||
* download many files at once.
|
||||
*
|
||||
* This example features the same basic functionality as hiperfifo.c does,
|
||||
@@ -68,7 +81,6 @@ typedef struct _GlobalInfo
|
||||
struct ev_io fifo_event;
|
||||
struct ev_timer timer_event;
|
||||
CURLM *multi;
|
||||
int prev_running;
|
||||
int still_running;
|
||||
FILE* input;
|
||||
} GlobalInfo;
|
||||
@@ -122,7 +134,6 @@ static void mcode_or_die(const char *where, CURLMcode code)
|
||||
switch ( code )
|
||||
{
|
||||
case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break;
|
||||
case CURLM_OK: s="CURLM_OK"; break;
|
||||
case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
|
||||
case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
|
||||
case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
|
||||
@@ -144,54 +155,33 @@ static void mcode_or_die(const char *where, CURLMcode code)
|
||||
|
||||
|
||||
/* Check for completed transfers, and remove their easy handles */
|
||||
static void check_run_count(GlobalInfo *g)
|
||||
static void check_multi_info(GlobalInfo *g)
|
||||
{
|
||||
DPRINT("%s prev %i still %i\n", __PRETTY_FUNCTION__,
|
||||
g->prev_running, g->still_running);
|
||||
if ( g->prev_running > g->still_running )
|
||||
{
|
||||
char *eff_url=NULL;
|
||||
CURLMsg *msg;
|
||||
int msgs_left;
|
||||
ConnInfo *conn=NULL;
|
||||
CURL*easy;
|
||||
CURLcode res;
|
||||
char *eff_url;
|
||||
CURLMsg *msg;
|
||||
int msgs_left;
|
||||
ConnInfo *conn;
|
||||
CURL *easy;
|
||||
CURLcode res;
|
||||
|
||||
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
|
||||
/*
|
||||
I am still uncertain whether it is safe to remove an easy
|
||||
handle from inside the curl_multi_info_read loop, so here I
|
||||
will search for completed transfers in the inner "while"
|
||||
loop, and then remove them in the outer "do-while" loop...
|
||||
*/
|
||||
do
|
||||
{
|
||||
easy=NULL;
|
||||
while ( (msg = curl_multi_info_read(g->multi, &msgs_left)) )
|
||||
{
|
||||
if ( msg->msg == CURLMSG_DONE )
|
||||
{
|
||||
easy=msg->easy_handle;
|
||||
res=msg->data.result;
|
||||
}
|
||||
|
||||
if ( easy )
|
||||
{
|
||||
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||
curl_multi_remove_handle(g->multi, easy);
|
||||
free(conn->url);
|
||||
curl_easy_cleanup(easy);
|
||||
free(conn);
|
||||
}
|
||||
}
|
||||
} while ( easy );
|
||||
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
|
||||
while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
|
||||
if (msg->msg == CURLMSG_DONE) {
|
||||
easy = msg->easy_handle;
|
||||
res = msg->data.result;
|
||||
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||
curl_multi_remove_handle(g->multi, easy);
|
||||
free(conn->url);
|
||||
curl_easy_cleanup(easy);
|
||||
free(conn);
|
||||
}
|
||||
}
|
||||
g->prev_running = g->still_running;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Called by libevent when we get action on a multi socket */
|
||||
static void event_cb(EV_P_ struct ev_io *w, int revents)
|
||||
{
|
||||
@@ -201,12 +191,9 @@ static void event_cb(EV_P_ struct ev_io *w, int revents)
|
||||
|
||||
int action = (revents&EV_READ?CURL_POLL_IN:0)|
|
||||
(revents&EV_WRITE?CURL_POLL_OUT:0);
|
||||
do
|
||||
{
|
||||
rc = curl_multi_socket_action(g->multi, w->fd, action, &g->still_running);
|
||||
} while ( rc == CURLM_CALL_MULTI_PERFORM );
|
||||
mcode_or_die("event_cb: curl_multi_socket", rc);
|
||||
check_run_count(g);
|
||||
rc = curl_multi_socket_action(g->multi, w->fd, action, &g->still_running);
|
||||
mcode_or_die("event_cb: curl_multi_socket_action", rc);
|
||||
check_multi_info(g);
|
||||
if ( g->still_running <= 0 )
|
||||
{
|
||||
fprintf(MSG_OUT, "last transfer done, kill timeout\n");
|
||||
@@ -222,12 +209,9 @@ static void timer_cb(EV_P_ struct ev_timer *w, int revents)
|
||||
GlobalInfo *g = (GlobalInfo *)w->data;
|
||||
CURLMcode rc;
|
||||
|
||||
do
|
||||
{
|
||||
rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0, &g->still_running);
|
||||
} while ( rc == CURLM_CALL_MULTI_PERFORM );
|
||||
mcode_or_die("timer_cb: curl_multi_socket", rc);
|
||||
check_run_count(g);
|
||||
rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0, &g->still_running);
|
||||
mcode_or_die("timer_cb: curl_multi_socket_action", rc);
|
||||
check_multi_info(g);
|
||||
}
|
||||
|
||||
/* Clean up the SockInfo structure */
|
||||
@@ -364,11 +348,11 @@ static void new_conn(char *url, GlobalInfo *g )
|
||||
|
||||
fprintf(MSG_OUT,
|
||||
"Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
|
||||
rc =curl_multi_add_handle(g->multi, conn->easy);
|
||||
rc = curl_multi_add_handle(g->multi, conn->easy);
|
||||
mcode_or_die("new_conn: curl_multi_add_handle", rc);
|
||||
|
||||
mcode_or_die("new_conn: curl_multi_socket_all", rc);
|
||||
check_run_count(g);
|
||||
/* note that the add_handle() will set a time-out to trigger very soon so
|
||||
that the necessary socket_action() call will be called by this app */
|
||||
}
|
||||
|
||||
/* This gets called whenever data is received from the fifo */
|
||||
@@ -396,7 +380,7 @@ static int init_fifo (GlobalInfo *g)
|
||||
{
|
||||
struct stat st;
|
||||
static const char *fifo = "hiper.fifo";
|
||||
int sockfd;
|
||||
curl_socket_t sockfd;
|
||||
|
||||
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
|
||||
if ( lstat (fifo, &st) == 0 )
|
||||
@@ -448,10 +432,9 @@ int main(int argc, char **argv)
|
||||
curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g);
|
||||
curl_multi_setopt(g.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb);
|
||||
curl_multi_setopt(g.multi, CURLMOPT_TIMERDATA, &g);
|
||||
do
|
||||
{
|
||||
rc = curl_multi_socket_all(g.multi, &g.still_running);
|
||||
} while ( CURLM_CALL_MULTI_PERFORM == rc );
|
||||
|
||||
/* we don't call any curl_multi_socket*() function yet as we have no handles
|
||||
added! */
|
||||
|
||||
ev_loop(g.loop, 0);
|
||||
curl_multi_cleanup(g.multi);
|
||||
|
149
docs/examples/externalsocket.c
Normal file
149
docs/examples/externalsocket.c
Normal file
@@ -0,0 +1,149 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2012, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/*
|
||||
* This is an example demonstrating how an application can pass in a custom
|
||||
* socket to libcurl to use. This example also handles the connect itself.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#define close closesocket
|
||||
#else
|
||||
#include <sys/types.h> /* socket types */
|
||||
#include <sys/socket.h> /* socket definitions */
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h> /* inet (3) funtions */
|
||||
#include <unistd.h> /* misc. UNIX functions */
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
/* The IP address and port number to connect to */
|
||||
#define IPADDR "127.0.0.1"
|
||||
#define PORTNUM 80
|
||||
|
||||
static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
int written = fwrite(ptr, size, nmemb, (FILE *)stream);
|
||||
return written;
|
||||
}
|
||||
|
||||
static curl_socket_t opensocket(void *clientp,
|
||||
curlsocktype purpose,
|
||||
struct curl_sockaddr *address)
|
||||
{
|
||||
curl_socket_t sockfd;
|
||||
(void)purpose;
|
||||
(void)address;
|
||||
sockfd = *(curl_socket_t *)clientp;
|
||||
/* the actual externally set socket is passed in via the OPENSOCKETDATA
|
||||
option */
|
||||
return sockfd;
|
||||
}
|
||||
|
||||
static int sockopt_callback(void *clientp, curl_socket_t curlfd,
|
||||
curlsocktype purpose)
|
||||
{
|
||||
(void)clientp;
|
||||
(void)curlfd;
|
||||
(void)purpose;
|
||||
/* This return code was added in libcurl 7.21.5 */
|
||||
return CURL_SOCKOPT_ALREADY_CONNECTED;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
struct sockaddr_in servaddr; /* socket address structure */
|
||||
curl_socket_t sockfd;
|
||||
|
||||
#ifdef WIN32
|
||||
WSADATA wsaData;
|
||||
int initwsa;
|
||||
|
||||
if((initwsa = WSAStartup(MAKEWORD(2,0), &wsaData)) != 0) {
|
||||
printf("WSAStartup failed: %d\n", initwsa);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/*
|
||||
* Note that libcurl will internally think that you connect to the host
|
||||
* and port that you specify in the URL option.
|
||||
*/
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://99.99.99.99:9999");
|
||||
|
||||
/* Create the socket "manually" */
|
||||
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == CURL_SOCKET_BAD ) {
|
||||
printf("Error creating listening socket.\n");
|
||||
return 3;
|
||||
}
|
||||
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
servaddr.sin_family = AF_INET;
|
||||
servaddr.sin_port = htons(PORTNUM);
|
||||
|
||||
if (INADDR_NONE == (servaddr.sin_addr.s_addr = inet_addr(IPADDR)))
|
||||
return 2;
|
||||
|
||||
if(connect(sockfd,(struct sockaddr *) &servaddr, sizeof(servaddr)) ==
|
||||
-1) {
|
||||
close(sockfd);
|
||||
printf("client error: connect: %s\n", strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* no progress meter please */
|
||||
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
|
||||
|
||||
/* send all data to this function */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
|
||||
|
||||
/* call this function to get a socket */
|
||||
curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, opensocket);
|
||||
curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sockfd);
|
||||
|
||||
/* call this function to set options for the socket */
|
||||
curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
if(res) {
|
||||
printf("libcurl error: %d\n", res);
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
#include <sys/stat.h>
|
||||
|
@@ -53,20 +53,24 @@
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
enum fcurl_type_e { CFTYPE_NONE=0, CFTYPE_FILE=1, CFTYPE_CURL=2 };
|
||||
enum fcurl_type_e {
|
||||
CFTYPE_NONE=0,
|
||||
CFTYPE_FILE=1,
|
||||
CFTYPE_CURL=2
|
||||
};
|
||||
|
||||
struct fcurl_data
|
||||
{
|
||||
enum fcurl_type_e type; /* type of handle */
|
||||
union {
|
||||
CURL *curl;
|
||||
FILE *file;
|
||||
} handle; /* handle */
|
||||
enum fcurl_type_e type; /* type of handle */
|
||||
union {
|
||||
CURL *curl;
|
||||
FILE *file;
|
||||
} handle; /* handle */
|
||||
|
||||
char *buffer; /* buffer to store cached data*/
|
||||
int buffer_len; /* currently allocated buffers length */
|
||||
int buffer_pos; /* end of data in buffer*/
|
||||
int still_running; /* Is background url fetch still in progress */
|
||||
char *buffer; /* buffer to store cached data*/
|
||||
size_t buffer_len; /* currently allocated buffers length */
|
||||
size_t buffer_pos; /* end of data in buffer*/
|
||||
int still_running; /* Is background url fetch still in progress */
|
||||
};
|
||||
|
||||
typedef struct fcurl_data URL_FILE;
|
||||
@@ -76,504 +80,448 @@ URL_FILE *url_fopen(const char *url,const char *operation);
|
||||
int url_fclose(URL_FILE *file);
|
||||
int url_feof(URL_FILE *file);
|
||||
size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file);
|
||||
char * url_fgets(char *ptr, int size, URL_FILE *file);
|
||||
char * url_fgets(char *ptr, size_t size, URL_FILE *file);
|
||||
void url_rewind(URL_FILE *file);
|
||||
|
||||
/* we use a global one for convenience */
|
||||
CURLM *multi_handle;
|
||||
|
||||
/* curl calls this routine to get more data */
|
||||
static size_t
|
||||
write_callback(char *buffer,
|
||||
size_t size,
|
||||
size_t nitems,
|
||||
void *userp)
|
||||
static size_t write_callback(char *buffer,
|
||||
size_t size,
|
||||
size_t nitems,
|
||||
void *userp)
|
||||
{
|
||||
char *newbuff;
|
||||
int rembuff;
|
||||
char *newbuff;
|
||||
size_t rembuff;
|
||||
|
||||
URL_FILE *url = (URL_FILE *)userp;
|
||||
size *= nitems;
|
||||
URL_FILE *url = (URL_FILE *)userp;
|
||||
size *= nitems;
|
||||
|
||||
rembuff=url->buffer_len - url->buffer_pos; /* remaining space in buffer */
|
||||
rembuff=url->buffer_len - url->buffer_pos; /* remaining space in buffer */
|
||||
|
||||
if(size > rembuff)
|
||||
{
|
||||
/* not enough space in buffer */
|
||||
newbuff=realloc(url->buffer,url->buffer_len + (size - rembuff));
|
||||
if(newbuff==NULL)
|
||||
{
|
||||
fprintf(stderr,"callback buffer grow failed\n");
|
||||
size=rembuff;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* realloc suceeded increase buffer size*/
|
||||
url->buffer_len+=size - rembuff;
|
||||
url->buffer=newbuff;
|
||||
|
||||
/*printf("Callback buffer grown to %d bytes\n",url->buffer_len);*/
|
||||
}
|
||||
if(size > rembuff) {
|
||||
/* not enough space in buffer */
|
||||
newbuff=realloc(url->buffer,url->buffer_len + (size - rembuff));
|
||||
if(newbuff==NULL) {
|
||||
fprintf(stderr,"callback buffer grow failed\n");
|
||||
size=rembuff;
|
||||
}
|
||||
else {
|
||||
/* realloc suceeded increase buffer size*/
|
||||
url->buffer_len+=size - rembuff;
|
||||
url->buffer=newbuff;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(&url->buffer[url->buffer_pos], buffer, size);
|
||||
url->buffer_pos += size;
|
||||
memcpy(&url->buffer[url->buffer_pos], buffer, size);
|
||||
url->buffer_pos += size;
|
||||
|
||||
/*fprintf(stderr, "callback %d size bytes\n", size);*/
|
||||
|
||||
return size;
|
||||
return size;
|
||||
}
|
||||
|
||||
/* use to attempt to fill the read buffer up to requested number of bytes */
|
||||
static int
|
||||
fill_buffer(URL_FILE *file,int want,int waittime)
|
||||
static int fill_buffer(URL_FILE *file, size_t want)
|
||||
{
|
||||
fd_set fdread;
|
||||
fd_set fdwrite;
|
||||
fd_set fdexcep;
|
||||
struct timeval timeout;
|
||||
int rc;
|
||||
fd_set fdread;
|
||||
fd_set fdwrite;
|
||||
fd_set fdexcep;
|
||||
struct timeval timeout;
|
||||
int rc;
|
||||
|
||||
/* only attempt to fill buffer if transactions still running and buffer
|
||||
* doesnt exceed required size already
|
||||
*/
|
||||
if((!file->still_running) || (file->buffer_pos > want))
|
||||
return 0;
|
||||
/* only attempt to fill buffer if transactions still running and buffer
|
||||
* doesnt exceed required size already
|
||||
*/
|
||||
if((!file->still_running) || (file->buffer_pos > want))
|
||||
return 0;
|
||||
|
||||
/* attempt to fill buffer */
|
||||
do
|
||||
{
|
||||
int maxfd = -1;
|
||||
long curl_timeo = -1;
|
||||
/* attempt to fill buffer */
|
||||
do {
|
||||
int maxfd = -1;
|
||||
long curl_timeo = -1;
|
||||
|
||||
FD_ZERO(&fdread);
|
||||
FD_ZERO(&fdwrite);
|
||||
FD_ZERO(&fdexcep);
|
||||
FD_ZERO(&fdread);
|
||||
FD_ZERO(&fdwrite);
|
||||
FD_ZERO(&fdexcep);
|
||||
|
||||
/* set a suitable timeout to fail on */
|
||||
timeout.tv_sec = 60; /* 1 minute */
|
||||
timeout.tv_usec = 0;
|
||||
/* set a suitable timeout to fail on */
|
||||
timeout.tv_sec = 60; /* 1 minute */
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
curl_multi_timeout(multi_handle, &curl_timeo);
|
||||
if(curl_timeo >= 0) {
|
||||
timeout.tv_sec = curl_timeo / 1000;
|
||||
if(timeout.tv_sec > 1)
|
||||
timeout.tv_sec = 1;
|
||||
else
|
||||
timeout.tv_usec = (curl_timeo % 1000) * 1000;
|
||||
}
|
||||
curl_multi_timeout(multi_handle, &curl_timeo);
|
||||
if(curl_timeo >= 0) {
|
||||
timeout.tv_sec = curl_timeo / 1000;
|
||||
if(timeout.tv_sec > 1)
|
||||
timeout.tv_sec = 1;
|
||||
else
|
||||
timeout.tv_usec = (curl_timeo % 1000) * 1000;
|
||||
}
|
||||
|
||||
/* get file descriptors from the transfers */
|
||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||
/* get file descriptors from the transfers */
|
||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||
|
||||
/* In a real-world program you OF COURSE check the return code of the
|
||||
function calls. On success, the value of maxfd is guaranteed to be
|
||||
greater or equal than -1. We call select(maxfd + 1, ...), specially
|
||||
in case of (maxfd == -1), we call select(0, ...), which is basically
|
||||
equal to sleep. */
|
||||
/* In a real-world program you OF COURSE check the return code of the
|
||||
function calls. On success, the value of maxfd is guaranteed to be
|
||||
greater or equal than -1. We call select(maxfd + 1, ...), specially
|
||||
in case of (maxfd == -1), we call select(0, ...), which is basically
|
||||
equal to sleep. */
|
||||
|
||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||
|
||||
switch(rc) {
|
||||
case -1:
|
||||
/* select error */
|
||||
break;
|
||||
switch(rc) {
|
||||
case -1:
|
||||
/* select error */
|
||||
break;
|
||||
|
||||
case 0:
|
||||
break;
|
||||
|
||||
default:
|
||||
/* timeout or readable/writable sockets */
|
||||
/* note we *could* be more efficient and not wait for
|
||||
* CURLM_CALL_MULTI_PERFORM to clear here and check it on re-entry
|
||||
* but that gets messy */
|
||||
while(curl_multi_perform(multi_handle, &file->still_running) ==
|
||||
CURLM_CALL_MULTI_PERFORM);
|
||||
|
||||
break;
|
||||
}
|
||||
} while(file->still_running && (file->buffer_pos < want));
|
||||
return 1;
|
||||
case 0:
|
||||
default:
|
||||
/* timeout or readable/writable sockets */
|
||||
curl_multi_perform(multi_handle, &file->still_running);
|
||||
break;
|
||||
}
|
||||
} while(file->still_running && (file->buffer_pos < want));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* use to remove want bytes from the front of a files buffer */
|
||||
static int
|
||||
use_buffer(URL_FILE *file,int want)
|
||||
static int use_buffer(URL_FILE *file,int want)
|
||||
{
|
||||
/* sort out buffer */
|
||||
if((file->buffer_pos - want) <=0)
|
||||
{
|
||||
/* ditch buffer - write will recreate */
|
||||
if(file->buffer)
|
||||
free(file->buffer);
|
||||
|
||||
file->buffer=NULL;
|
||||
file->buffer_pos=0;
|
||||
file->buffer_len=0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* move rest down make it available for later */
|
||||
memmove(file->buffer,
|
||||
&file->buffer[want],
|
||||
(file->buffer_pos - want));
|
||||
|
||||
file->buffer_pos -= want;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
URL_FILE *
|
||||
url_fopen(const char *url,const char *operation)
|
||||
{
|
||||
/* this code could check for URLs or types in the 'url' and
|
||||
basicly use the real fopen() for standard files */
|
||||
|
||||
URL_FILE *file;
|
||||
(void)operation;
|
||||
|
||||
file = malloc(sizeof(URL_FILE));
|
||||
if(!file)
|
||||
return NULL;
|
||||
|
||||
memset(file, 0, sizeof(URL_FILE));
|
||||
|
||||
if((file->handle.file=fopen(url,operation)))
|
||||
{
|
||||
file->type = CFTYPE_FILE; /* marked as URL */
|
||||
}
|
||||
else
|
||||
{
|
||||
file->type = CFTYPE_CURL; /* marked as URL */
|
||||
file->handle.curl = curl_easy_init();
|
||||
|
||||
curl_easy_setopt(file->handle.curl, CURLOPT_URL, url);
|
||||
curl_easy_setopt(file->handle.curl, CURLOPT_WRITEDATA, file);
|
||||
curl_easy_setopt(file->handle.curl, CURLOPT_VERBOSE, 0L);
|
||||
curl_easy_setopt(file->handle.curl, CURLOPT_WRITEFUNCTION, write_callback);
|
||||
|
||||
if(!multi_handle)
|
||||
multi_handle = curl_multi_init();
|
||||
|
||||
curl_multi_add_handle(multi_handle, file->handle.curl);
|
||||
|
||||
/* lets start the fetch */
|
||||
while(curl_multi_perform(multi_handle, &file->still_running) ==
|
||||
CURLM_CALL_MULTI_PERFORM );
|
||||
|
||||
if((file->buffer_pos == 0) && (!file->still_running))
|
||||
{
|
||||
/* if still_running is 0 now, we should return NULL */
|
||||
|
||||
/* make sure the easy handle is not in the multi handle anymore */
|
||||
curl_multi_remove_handle(multi_handle, file->handle.curl);
|
||||
|
||||
/* cleanup */
|
||||
curl_easy_cleanup(file->handle.curl);
|
||||
|
||||
free(file);
|
||||
|
||||
file = NULL;
|
||||
}
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
int
|
||||
url_fclose(URL_FILE *file)
|
||||
{
|
||||
int ret=0;/* default is good return */
|
||||
|
||||
switch(file->type)
|
||||
{
|
||||
case CFTYPE_FILE:
|
||||
ret=fclose(file->handle.file); /* passthrough */
|
||||
break;
|
||||
|
||||
case CFTYPE_CURL:
|
||||
/* make sure the easy handle is not in the multi handle anymore */
|
||||
curl_multi_remove_handle(multi_handle, file->handle.curl);
|
||||
|
||||
/* cleanup */
|
||||
curl_easy_cleanup(file->handle.curl);
|
||||
break;
|
||||
|
||||
default: /* unknown or supported type - oh dear */
|
||||
ret=EOF;
|
||||
errno=EBADF;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
/* sort out buffer */
|
||||
if((file->buffer_pos - want) <=0) {
|
||||
/* ditch buffer - write will recreate */
|
||||
if(file->buffer)
|
||||
free(file->buffer);/* free any allocated buffer space */
|
||||
free(file->buffer);
|
||||
|
||||
free(file);
|
||||
file->buffer=NULL;
|
||||
file->buffer_pos=0;
|
||||
file->buffer_len=0;
|
||||
}
|
||||
else {
|
||||
/* move rest down make it available for later */
|
||||
memmove(file->buffer,
|
||||
&file->buffer[want],
|
||||
(file->buffer_pos - want));
|
||||
|
||||
return ret;
|
||||
file->buffer_pos -= want;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
url_feof(URL_FILE *file)
|
||||
URL_FILE *url_fopen(const char *url,const char *operation)
|
||||
{
|
||||
int ret=0;
|
||||
/* this code could check for URLs or types in the 'url' and
|
||||
basicly use the real fopen() for standard files */
|
||||
|
||||
switch(file->type)
|
||||
{
|
||||
case CFTYPE_FILE:
|
||||
ret=feof(file->handle.file);
|
||||
break;
|
||||
URL_FILE *file;
|
||||
(void)operation;
|
||||
|
||||
case CFTYPE_CURL:
|
||||
if((file->buffer_pos == 0) && (!file->still_running))
|
||||
ret = 1;
|
||||
break;
|
||||
default: /* unknown or supported type - oh dear */
|
||||
ret=-1;
|
||||
errno=EBADF;
|
||||
break;
|
||||
file = malloc(sizeof(URL_FILE));
|
||||
if(!file)
|
||||
return NULL;
|
||||
|
||||
memset(file, 0, sizeof(URL_FILE));
|
||||
|
||||
if((file->handle.file=fopen(url,operation)))
|
||||
file->type = CFTYPE_FILE; /* marked as URL */
|
||||
|
||||
else {
|
||||
file->type = CFTYPE_CURL; /* marked as URL */
|
||||
file->handle.curl = curl_easy_init();
|
||||
|
||||
curl_easy_setopt(file->handle.curl, CURLOPT_URL, url);
|
||||
curl_easy_setopt(file->handle.curl, CURLOPT_WRITEDATA, file);
|
||||
curl_easy_setopt(file->handle.curl, CURLOPT_VERBOSE, 0L);
|
||||
curl_easy_setopt(file->handle.curl, CURLOPT_WRITEFUNCTION, write_callback);
|
||||
|
||||
if(!multi_handle)
|
||||
multi_handle = curl_multi_init();
|
||||
|
||||
curl_multi_add_handle(multi_handle, file->handle.curl);
|
||||
|
||||
/* lets start the fetch */
|
||||
curl_multi_perform(multi_handle, &file->still_running);
|
||||
|
||||
if((file->buffer_pos == 0) && (!file->still_running)) {
|
||||
/* if still_running is 0 now, we should return NULL */
|
||||
|
||||
/* make sure the easy handle is not in the multi handle anymore */
|
||||
curl_multi_remove_handle(multi_handle, file->handle.curl);
|
||||
|
||||
/* cleanup */
|
||||
curl_easy_cleanup(file->handle.curl);
|
||||
|
||||
free(file);
|
||||
|
||||
file = NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
size_t
|
||||
url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
|
||||
int url_fclose(URL_FILE *file)
|
||||
{
|
||||
size_t want;
|
||||
int ret=0;/* default is good return */
|
||||
|
||||
switch(file->type)
|
||||
{
|
||||
case CFTYPE_FILE:
|
||||
want=fread(ptr,size,nmemb,file->handle.file);
|
||||
break;
|
||||
switch(file->type) {
|
||||
case CFTYPE_FILE:
|
||||
ret=fclose(file->handle.file); /* passthrough */
|
||||
break;
|
||||
|
||||
case CFTYPE_CURL:
|
||||
want = nmemb * size;
|
||||
case CFTYPE_CURL:
|
||||
/* make sure the easy handle is not in the multi handle anymore */
|
||||
curl_multi_remove_handle(multi_handle, file->handle.curl);
|
||||
|
||||
fill_buffer(file,want,1);
|
||||
/* cleanup */
|
||||
curl_easy_cleanup(file->handle.curl);
|
||||
break;
|
||||
|
||||
/* check if theres data in the buffer - if not fill_buffer()
|
||||
* either errored or EOF */
|
||||
if(!file->buffer_pos)
|
||||
return 0;
|
||||
default: /* unknown or supported type - oh dear */
|
||||
ret=EOF;
|
||||
errno=EBADF;
|
||||
break;
|
||||
}
|
||||
|
||||
/* ensure only available data is considered */
|
||||
if(file->buffer_pos < want)
|
||||
want = file->buffer_pos;
|
||||
if(file->buffer)
|
||||
free(file->buffer);/* free any allocated buffer space */
|
||||
|
||||
/* xfer data to caller */
|
||||
memcpy(ptr, file->buffer, want);
|
||||
free(file);
|
||||
|
||||
use_buffer(file,want);
|
||||
|
||||
want = want / size; /* number of items - nb correct op - checked
|
||||
* with glibc code*/
|
||||
|
||||
/*printf("(fread) return %d bytes %d left\n", want,file->buffer_pos);*/
|
||||
break;
|
||||
|
||||
default: /* unknown or supported type - oh dear */
|
||||
want=0;
|
||||
errno=EBADF;
|
||||
break;
|
||||
|
||||
}
|
||||
return want;
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *
|
||||
url_fgets(char *ptr, int size, URL_FILE *file)
|
||||
int url_feof(URL_FILE *file)
|
||||
{
|
||||
int want = size - 1;/* always need to leave room for zero termination */
|
||||
int loop;
|
||||
int ret=0;
|
||||
|
||||
switch(file->type)
|
||||
{
|
||||
case CFTYPE_FILE:
|
||||
ptr = fgets(ptr,size,file->handle.file);
|
||||
break;
|
||||
|
||||
case CFTYPE_CURL:
|
||||
fill_buffer(file,want,1);
|
||||
|
||||
/* check if theres data in the buffer - if not fill either errored or
|
||||
* EOF */
|
||||
if(!file->buffer_pos)
|
||||
return NULL;
|
||||
|
||||
/* ensure only available data is considered */
|
||||
if(file->buffer_pos < want)
|
||||
want = file->buffer_pos;
|
||||
|
||||
/*buffer contains data */
|
||||
/* look for newline or eof */
|
||||
for(loop=0;loop < want;loop++)
|
||||
{
|
||||
if(file->buffer[loop] == '\n')
|
||||
{
|
||||
want=loop+1;/* include newline */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* xfer data to caller */
|
||||
memcpy(ptr, file->buffer, want);
|
||||
ptr[want]=0;/* allways null terminate */
|
||||
|
||||
use_buffer(file,want);
|
||||
|
||||
/*printf("(fgets) return %d bytes %d left\n", want,file->buffer_pos);*/
|
||||
break;
|
||||
|
||||
default: /* unknown or supported type - oh dear */
|
||||
ptr=NULL;
|
||||
errno=EBADF;
|
||||
switch(file->type) {
|
||||
case CFTYPE_FILE:
|
||||
ret=feof(file->handle.file);
|
||||
break;
|
||||
|
||||
case CFTYPE_CURL:
|
||||
if((file->buffer_pos == 0) && (!file->still_running))
|
||||
ret = 1;
|
||||
break;
|
||||
|
||||
default: /* unknown or supported type - oh dear */
|
||||
ret=-1;
|
||||
errno=EBADF;
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
|
||||
{
|
||||
size_t want;
|
||||
|
||||
switch(file->type) {
|
||||
case CFTYPE_FILE:
|
||||
want=fread(ptr,size,nmemb,file->handle.file);
|
||||
break;
|
||||
|
||||
case CFTYPE_CURL:
|
||||
want = nmemb * size;
|
||||
|
||||
fill_buffer(file,want);
|
||||
|
||||
/* check if theres data in the buffer - if not fill_buffer()
|
||||
* either errored or EOF */
|
||||
if(!file->buffer_pos)
|
||||
return 0;
|
||||
|
||||
/* ensure only available data is considered */
|
||||
if(file->buffer_pos < want)
|
||||
want = file->buffer_pos;
|
||||
|
||||
/* xfer data to caller */
|
||||
memcpy(ptr, file->buffer, want);
|
||||
|
||||
use_buffer(file,want);
|
||||
|
||||
want = want / size; /* number of items */
|
||||
break;
|
||||
|
||||
default: /* unknown or supported type - oh dear */
|
||||
want=0;
|
||||
errno=EBADF;
|
||||
break;
|
||||
|
||||
}
|
||||
return want;
|
||||
}
|
||||
|
||||
char *url_fgets(char *ptr, size_t size, URL_FILE *file)
|
||||
{
|
||||
size_t want = size - 1;/* always need to leave room for zero termination */
|
||||
size_t loop;
|
||||
|
||||
switch(file->type) {
|
||||
case CFTYPE_FILE:
|
||||
ptr = fgets(ptr,size,file->handle.file);
|
||||
break;
|
||||
|
||||
case CFTYPE_CURL:
|
||||
fill_buffer(file,want);
|
||||
|
||||
/* check if theres data in the buffer - if not fill either errored or
|
||||
* EOF */
|
||||
if(!file->buffer_pos)
|
||||
return NULL;
|
||||
|
||||
/* ensure only available data is considered */
|
||||
if(file->buffer_pos < want)
|
||||
want = file->buffer_pos;
|
||||
|
||||
/*buffer contains data */
|
||||
/* look for newline or eof */
|
||||
for(loop=0;loop < want;loop++) {
|
||||
if(file->buffer[loop] == '\n') {
|
||||
want=loop+1;/* include newline */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ptr;/*success */
|
||||
/* xfer data to caller */
|
||||
memcpy(ptr, file->buffer, want);
|
||||
ptr[want]=0;/* allways null terminate */
|
||||
|
||||
use_buffer(file,want);
|
||||
|
||||
break;
|
||||
|
||||
default: /* unknown or supported type - oh dear */
|
||||
ptr=NULL;
|
||||
errno=EBADF;
|
||||
break;
|
||||
}
|
||||
|
||||
return ptr;/*success */
|
||||
}
|
||||
|
||||
void
|
||||
url_rewind(URL_FILE *file)
|
||||
void url_rewind(URL_FILE *file)
|
||||
{
|
||||
switch(file->type)
|
||||
{
|
||||
case CFTYPE_FILE:
|
||||
rewind(file->handle.file); /* passthrough */
|
||||
break;
|
||||
switch(file->type) {
|
||||
case CFTYPE_FILE:
|
||||
rewind(file->handle.file); /* passthrough */
|
||||
break;
|
||||
|
||||
case CFTYPE_CURL:
|
||||
/* halt transaction */
|
||||
curl_multi_remove_handle(multi_handle, file->handle.curl);
|
||||
case CFTYPE_CURL:
|
||||
/* halt transaction */
|
||||
curl_multi_remove_handle(multi_handle, file->handle.curl);
|
||||
|
||||
/* restart */
|
||||
curl_multi_add_handle(multi_handle, file->handle.curl);
|
||||
/* restart */
|
||||
curl_multi_add_handle(multi_handle, file->handle.curl);
|
||||
|
||||
/* ditch buffer - write will recreate - resets stream pos*/
|
||||
if(file->buffer)
|
||||
free(file->buffer);
|
||||
/* ditch buffer - write will recreate - resets stream pos*/
|
||||
if(file->buffer)
|
||||
free(file->buffer);
|
||||
|
||||
file->buffer=NULL;
|
||||
file->buffer_pos=0;
|
||||
file->buffer_len=0;
|
||||
file->buffer=NULL;
|
||||
file->buffer_pos=0;
|
||||
file->buffer_len=0;
|
||||
|
||||
break;
|
||||
|
||||
default: /* unknown or supported type - oh dear */
|
||||
break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
default: /* unknown or supported type - oh dear */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Small main program to retrive from a url using fgets and fread saving the
|
||||
* output to two test files (note the fgets method will corrupt binary files if
|
||||
* they contain 0 chars */
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
URL_FILE *handle;
|
||||
FILE *outf;
|
||||
URL_FILE *handle;
|
||||
FILE *outf;
|
||||
|
||||
int nread;
|
||||
char buffer[256];
|
||||
const char *url;
|
||||
int nread;
|
||||
char buffer[256];
|
||||
const char *url;
|
||||
|
||||
if(argc < 2)
|
||||
{
|
||||
url="http://192.168.7.3/testfile";/* default to testurl */
|
||||
}
|
||||
else
|
||||
{
|
||||
url=argv[1];/* use passed url */
|
||||
}
|
||||
if(argc < 2)
|
||||
url="http://192.168.7.3/testfile";/* default to testurl */
|
||||
else
|
||||
url=argv[1];/* use passed url */
|
||||
|
||||
/* copy from url line by line with fgets */
|
||||
outf=fopen("fgets.test","w+");
|
||||
if(!outf)
|
||||
{
|
||||
perror("couldn't open fgets output file\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
handle = url_fopen(url, "r");
|
||||
if(!handle)
|
||||
{
|
||||
printf("couldn't url_fopen() %s\n", url);
|
||||
fclose(outf);
|
||||
return 2;
|
||||
}
|
||||
|
||||
while(!url_feof(handle))
|
||||
{
|
||||
url_fgets(buffer,sizeof(buffer),handle);
|
||||
fwrite(buffer,1,strlen(buffer),outf);
|
||||
}
|
||||
|
||||
url_fclose(handle);
|
||||
/* copy from url line by line with fgets */
|
||||
outf=fopen("fgets.test","w+");
|
||||
if(!outf) {
|
||||
perror("couldn't open fgets output file\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
handle = url_fopen(url, "r");
|
||||
if(!handle) {
|
||||
printf("couldn't url_fopen() %s\n", url);
|
||||
fclose(outf);
|
||||
return 2;
|
||||
}
|
||||
|
||||
while(!url_feof(handle)) {
|
||||
url_fgets(buffer,sizeof(buffer),handle);
|
||||
fwrite(buffer,1,strlen(buffer),outf);
|
||||
}
|
||||
|
||||
url_fclose(handle);
|
||||
|
||||
fclose(outf);
|
||||
|
||||
|
||||
/* Copy from url with fread */
|
||||
outf=fopen("fread.test","w+");
|
||||
if(!outf)
|
||||
{
|
||||
perror("couldn't open fread output file\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
handle = url_fopen("testfile", "r");
|
||||
if(!handle) {
|
||||
printf("couldn't url_fopen() testfile\n");
|
||||
fclose(outf);
|
||||
return 2;
|
||||
}
|
||||
|
||||
do {
|
||||
nread = url_fread(buffer, 1,sizeof(buffer), handle);
|
||||
fwrite(buffer,1,nread,outf);
|
||||
} while(nread);
|
||||
|
||||
url_fclose(handle);
|
||||
/* Copy from url with fread */
|
||||
outf=fopen("fread.test","w+");
|
||||
if(!outf) {
|
||||
perror("couldn't open fread output file\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
handle = url_fopen("testfile", "r");
|
||||
if(!handle) {
|
||||
printf("couldn't url_fopen() testfile\n");
|
||||
fclose(outf);
|
||||
return 2;
|
||||
}
|
||||
|
||||
do {
|
||||
nread = url_fread(buffer, 1,sizeof(buffer), handle);
|
||||
fwrite(buffer,1,nread,outf);
|
||||
} while(nread);
|
||||
|
||||
url_fclose(handle);
|
||||
|
||||
fclose(outf);
|
||||
|
||||
|
||||
/* Test rewind */
|
||||
outf=fopen("rewind.test","w+");
|
||||
if(!outf)
|
||||
{
|
||||
perror("couldn't open fread output file\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
handle = url_fopen("testfile", "r");
|
||||
if(!handle) {
|
||||
printf("couldn't url_fopen() testfile\n");
|
||||
fclose(outf);
|
||||
return 2;
|
||||
}
|
||||
|
||||
nread = url_fread(buffer, 1,sizeof(buffer), handle);
|
||||
fwrite(buffer,1,nread,outf);
|
||||
url_rewind(handle);
|
||||
|
||||
buffer[0]='\n';
|
||||
fwrite(buffer,1,1,outf);
|
||||
|
||||
nread = url_fread(buffer, 1,sizeof(buffer), handle);
|
||||
fwrite(buffer,1,nread,outf);
|
||||
|
||||
|
||||
url_fclose(handle);
|
||||
/* Test rewind */
|
||||
outf=fopen("rewind.test","w+");
|
||||
if(!outf) {
|
||||
perror("couldn't open fread output file\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
handle = url_fopen("testfile", "r");
|
||||
if(!handle) {
|
||||
printf("couldn't url_fopen() testfile\n");
|
||||
fclose(outf);
|
||||
return 2;
|
||||
}
|
||||
|
||||
nread = url_fread(buffer, 1,sizeof(buffer), handle);
|
||||
fwrite(buffer,1,nread,outf);
|
||||
url_rewind(handle);
|
||||
|
||||
buffer[0]='\n';
|
||||
fwrite(buffer,1,1,outf);
|
||||
|
||||
nread = url_fread(buffer, 1,sizeof(buffer), handle);
|
||||
fwrite(buffer,1,nread,outf);
|
||||
|
||||
|
||||
return 0;/* all done */
|
||||
url_fclose(handle);
|
||||
|
||||
fclose(outf);
|
||||
|
||||
|
||||
return 0;/* all done */
|
||||
}
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2012, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <curl/curl.h>
|
||||
#include <stdio.h>
|
||||
|
||||
@@ -21,7 +33,7 @@ static long file_is_comming(struct curl_fileinfo *finfo,
|
||||
static long file_is_downloaded(struct callback_data *data);
|
||||
|
||||
static size_t write_it(char *buff, size_t size, size_t nmemb,
|
||||
struct callback_data *data);
|
||||
void *cb_data);
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
@@ -67,8 +79,7 @@ int main(int argc, char **argv)
|
||||
if(argc == 2)
|
||||
curl_easy_setopt(handle, CURLOPT_URL, argv[1]);
|
||||
else
|
||||
curl_easy_setopt(handle, CURLOPT_URL,
|
||||
"ftp://curltest.howto.cz:123456@curltest.howto.cz/test/*");
|
||||
curl_easy_setopt(handle, CURLOPT_URL, "ftp://example.com/test/*");
|
||||
|
||||
/* and start transfer! */
|
||||
rc = curl_easy_perform(handle);
|
||||
@@ -124,8 +135,9 @@ static long file_is_downloaded(struct callback_data *data)
|
||||
}
|
||||
|
||||
static size_t write_it(char *buff, size_t size, size_t nmemb,
|
||||
struct callback_data *data)
|
||||
void *cb_data)
|
||||
{
|
||||
struct callback_data *data = cb_data;
|
||||
size_t written = 0;
|
||||
if(data->output)
|
||||
written = fwrite(buff, size, nmemb, data->output);
|
||||
|
@@ -1,17 +1,27 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h>
|
||||
#include <curl/easy.h>
|
||||
|
||||
/*
|
||||
* This is an example showing how to get a single file from an FTP server.
|
||||
@@ -52,12 +62,10 @@ int main(void)
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/*
|
||||
* Get curl 7.9.2 from sunet.se's FTP site. curl 7.9.2 is most likely not
|
||||
* present there by the time you read this, so you'd better replace the
|
||||
* URL with one that works!
|
||||
* You better replace the URL with one that works!
|
||||
*/
|
||||
curl_easy_setopt(curl, CURLOPT_URL,
|
||||
"ftp://ftp.sunet.se/pub/www/utilities/curl/curl-7.9.2.tar.gz");
|
||||
"ftp://ftp.example.com/pub/www/utilities/curl/curl-7.9.2.tar.gz");
|
||||
/* Define our callback to get called when there's data to be written */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
|
||||
/* Set a pointer to our struct to pass to the callback */
|
||||
|
@@ -1,18 +1,28 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h>
|
||||
#include <curl/easy.h>
|
||||
|
||||
/*
|
||||
* This is an example showing how to check a single file's size and mtime
|
||||
@@ -21,6 +31,8 @@
|
||||
|
||||
static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data)
|
||||
{
|
||||
(void)ptr;
|
||||
(void)data;
|
||||
/* we are not interested in the headers itself,
|
||||
so we only return the size we would have saved ... */
|
||||
return (size_t)(size * nmemb);
|
||||
@@ -28,8 +40,7 @@ static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data)
|
||||
|
||||
int main(void)
|
||||
{
|
||||
/* Check for binutils 2.19.1 from ftp.gnu.org's FTP site. */
|
||||
char ftpurl[] = "ftp://ftp.gnu.org/gnu/binutils/binutils-2.19.1.tar.bz2";
|
||||
char ftpurl[] = "ftp://ftp.example.com/gnu/binutils/binutils-2.19.1.tar.bz2";
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
const time_t filetime;
|
||||
@@ -59,7 +70,7 @@ int main(void)
|
||||
if((CURLE_OK == res) && filetime)
|
||||
printf("filetime %s: %s", filename, ctime(&filetime));
|
||||
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &filesize);
|
||||
if((CURLE_OK == res) && filesize)
|
||||
if((CURLE_OK == res) && (filesize>0))
|
||||
printf("filesize %s: %0.0f bytes\n", filename, filesize);
|
||||
} else {
|
||||
/* we failed */
|
||||
|
@@ -1,17 +1,27 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h>
|
||||
#include <curl/easy.h>
|
||||
|
||||
/*
|
||||
* Similar to ftpget.c but this also stores the received response-lines
|
||||
@@ -27,7 +37,7 @@ write_response(void *ptr, size_t size, size_t nmemb, void *data)
|
||||
return fwrite(ptr, size, nmemb, writehere);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
@@ -43,7 +53,7 @@ int main(int argc, char **argv)
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* Get a file listing from sunet */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.sunet.se/");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.example.com/");
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftpfile);
|
||||
/* If you intend to use this on windows with a libcurl DLL, you must use
|
||||
CURLOPT_WRITEFUNCTION as well */
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2012, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
@@ -30,7 +42,7 @@
|
||||
|
||||
#define LOCAL_FILE "/tmp/uploadthis.txt"
|
||||
#define UPLOAD_FILE_AS "while-uploading.txt"
|
||||
#define REMOTE_URL "ftp://localhost/" UPLOAD_FILE_AS
|
||||
#define REMOTE_URL "ftp://example.com/" UPLOAD_FILE_AS
|
||||
#define RENAME_FILE_TO "renamed-and-fine.txt"
|
||||
|
||||
/* NOTE: if you want this example to work on Windows with libcurl as a
|
||||
@@ -39,16 +51,20 @@
|
||||
variable's memory when passed in to it from an app like this. */
|
||||
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
curl_off_t nread;
|
||||
/* in real-world cases, this would probably get this data differently
|
||||
as this fread() stuff is exactly what the library already would do
|
||||
by default internally */
|
||||
size_t retcode = fread(ptr, size, nmemb, stream);
|
||||
|
||||
fprintf(stderr, "*** We read %d bytes from file\n", retcode);
|
||||
nread = (curl_off_t)retcode;
|
||||
|
||||
fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
|
||||
" bytes from file\n", nread);
|
||||
return retcode;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
|
@@ -1,12 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* Upload to FTP, resuming failed transfers
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Upload to FTP, resuming failed transfers
|
||||
*
|
||||
* Compile for MinGW like this:
|
||||
* gcc -Wall -pedantic -std=c99 ftpuploadwithresume.c -o ftpuploadresume.exe
|
||||
@@ -26,13 +39,14 @@
|
||||
|
||||
/* The MinGW headers are missing a few Win32 function definitions,
|
||||
you shouldn't need this if you use VC++ */
|
||||
#ifdef __MINGW32__
|
||||
#if defined(__MINGW32__) && !defined(__MINGW64__)
|
||||
int __cdecl _snscanf(const char * input, size_t length, const char * format, ...);
|
||||
#endif
|
||||
|
||||
|
||||
/* parse headers for Content-Length */
|
||||
size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream) {
|
||||
size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
int r;
|
||||
long len = 0;
|
||||
|
||||
@@ -46,7 +60,8 @@ size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
}
|
||||
|
||||
/* discard downloaded data */
|
||||
size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream) {
|
||||
size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
return size * nmemb;
|
||||
}
|
||||
|
||||
@@ -143,13 +158,14 @@ int upload(CURL *curlhandle, const char * remotepath, const char * localpath,
|
||||
}
|
||||
}
|
||||
|
||||
int main(int c, char **argv) {
|
||||
int main(int c, char **argv)
|
||||
{
|
||||
CURL *curlhandle = NULL;
|
||||
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
curlhandle = curl_easy_init();
|
||||
|
||||
upload(curlhandle, "ftp://user:pass@host/path/file", "C:\\file", 0, 3);
|
||||
upload(curlhandle, "ftp://user:pass@example.com/path/file", "C:\\file", 0, 3);
|
||||
|
||||
curl_easy_cleanup(curlhandle);
|
||||
curl_global_cleanup();
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
@@ -19,7 +31,7 @@ int main(void)
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTURL */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");
|
||||
/* http://curl.haxx.se/libcurl/c/curl_easy_perform.html */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
|
@@ -1,15 +1,26 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* Example source code to show how the callback function can be used to
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Example source code to show how the callback function can be used to
|
||||
* download data into a chunk of memory instead of storing it in a file.
|
||||
*
|
||||
* This exact source code has not been verified to work.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -17,48 +28,41 @@
|
||||
#include <string.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h>
|
||||
#include <curl/easy.h>
|
||||
|
||||
struct MemoryStruct {
|
||||
char *memory;
|
||||
size_t size;
|
||||
};
|
||||
|
||||
static void *myrealloc(void *ptr, size_t size);
|
||||
|
||||
static void *myrealloc(void *ptr, size_t size)
|
||||
{
|
||||
/* There might be a realloc() out there that doesn't like reallocing
|
||||
NULL pointers, so we take care of it here */
|
||||
if(ptr)
|
||||
return realloc(ptr, size);
|
||||
else
|
||||
return malloc(size);
|
||||
}
|
||||
|
||||
static size_t
|
||||
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
|
||||
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
size_t realsize = size * nmemb;
|
||||
struct MemoryStruct *mem = (struct MemoryStruct *)data;
|
||||
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
|
||||
|
||||
mem->memory = myrealloc(mem->memory, mem->size + realsize + 1);
|
||||
if (mem->memory) {
|
||||
memcpy(&(mem->memory[mem->size]), ptr, realsize);
|
||||
mem->size += realsize;
|
||||
mem->memory[mem->size] = 0;
|
||||
mem->memory = realloc(mem->memory, mem->size + realsize + 1);
|
||||
if (mem->memory == NULL) {
|
||||
/* out of memory! */
|
||||
printf("not enough memory (realloc returned NULL)\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
memcpy(&(mem->memory[mem->size]), contents, realsize);
|
||||
mem->size += realsize;
|
||||
mem->memory[mem->size] = 0;
|
||||
|
||||
return realsize;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl_handle;
|
||||
|
||||
struct MemoryStruct chunk;
|
||||
|
||||
chunk.memory=NULL; /* we expect realloc(NULL, size) to work */
|
||||
chunk.memory = malloc(1); /* will be grown as needed by the realloc above */
|
||||
chunk.size = 0; /* no data at this point */
|
||||
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
@@ -67,7 +71,7 @@ int main(int argc, char **argv)
|
||||
curl_handle = curl_easy_init();
|
||||
|
||||
/* specify URL to get */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://cool.haxx.se/");
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.example.com/");
|
||||
|
||||
/* send all data to this function */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
|
||||
@@ -96,6 +100,8 @@ int main(int argc, char **argv)
|
||||
* you're done with it, you should free() it as a nice application.
|
||||
*/
|
||||
|
||||
printf("%lu bytes retrieved\n", (long)chunk.size);
|
||||
|
||||
if(chunk.memory)
|
||||
free(chunk.memory);
|
||||
|
||||
|
@@ -1,12 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* Example application source code using the multi socket interface to
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Example application source code using the multi socket interface to
|
||||
* download many files at once.
|
||||
*
|
||||
* Written by Jeff Pohlmeyer
|
||||
@@ -58,10 +71,7 @@ callback.
|
||||
typedef struct _GlobalInfo {
|
||||
CURLM *multi;
|
||||
guint timer_event;
|
||||
int prev_running;
|
||||
int still_running;
|
||||
int requested; /* count: curl_easy_init() */
|
||||
int completed; /* count: curl_easy_cleanup() */
|
||||
} GlobalInfo;
|
||||
|
||||
|
||||
@@ -95,7 +105,6 @@ static void mcode_or_die(const char *where, CURLMcode code) {
|
||||
const char *s;
|
||||
switch (code) {
|
||||
case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break;
|
||||
case CURLM_OK: s="CURLM_OK"; break;
|
||||
case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
|
||||
case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
|
||||
case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
|
||||
@@ -113,62 +122,43 @@ static void mcode_or_die(const char *where, CURLMcode code) {
|
||||
|
||||
|
||||
/* Check for completed transfers, and remove their easy handles */
|
||||
static void check_run_count(GlobalInfo *g)
|
||||
static void check_multi_info(GlobalInfo *g)
|
||||
{
|
||||
if (g->prev_running > g->still_running) {
|
||||
char *eff_url=NULL;
|
||||
CURLMsg *msg;
|
||||
int msgs_left;
|
||||
ConnInfo *conn=NULL;
|
||||
CURL*easy;
|
||||
CURLcode res;
|
||||
char *eff_url;
|
||||
CURLMsg *msg;
|
||||
int msgs_left;
|
||||
ConnInfo *conn;
|
||||
CURL *easy;
|
||||
CURLcode res;
|
||||
|
||||
MSG_OUT("REMAINING: %d\n", g->still_running);
|
||||
/*
|
||||
I am still uncertain whether it is safe to remove an easy handle
|
||||
from inside the curl_multi_info_read loop, so here I will search
|
||||
for completed transfers in the inner "while" loop, and then remove
|
||||
them in the outer "do-while" loop...
|
||||
*/
|
||||
do {
|
||||
easy=NULL;
|
||||
while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
|
||||
if (msg->msg == CURLMSG_DONE) {
|
||||
easy=msg->easy_handle;
|
||||
res=msg->data.result;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (easy) {
|
||||
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
MSG_OUT("DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||
curl_multi_remove_handle(g->multi, easy);
|
||||
g_free(conn->url);
|
||||
curl_easy_cleanup(easy);
|
||||
g_free(conn);
|
||||
g->completed++;
|
||||
}
|
||||
} while ( easy );
|
||||
MSG_OUT("Requested: %d Completed:%d\n", g->requested, g->completed);
|
||||
MSG_OUT("REMAINING: %d\n", g->still_running);
|
||||
while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
|
||||
if (msg->msg == CURLMSG_DONE) {
|
||||
easy = msg->easy_handle;
|
||||
res = msg->data.result;
|
||||
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
MSG_OUT("DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||
curl_multi_remove_handle(g->multi, easy);
|
||||
free(conn->url);
|
||||
curl_easy_cleanup(easy);
|
||||
free(conn);
|
||||
}
|
||||
}
|
||||
g->prev_running = g->still_running;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Called by glib when our timeout expires */
|
||||
static gboolean timer_cb(gpointer data)
|
||||
{
|
||||
GlobalInfo *g = (GlobalInfo *)data;
|
||||
CURLMcode rc;
|
||||
|
||||
do {
|
||||
rc = curl_multi_socket(g->multi, CURL_SOCKET_TIMEOUT, &g->still_running);
|
||||
} while (rc == CURLM_CALL_MULTI_PERFORM);
|
||||
mcode_or_die("timer_cb: curl_multi_socket", rc);
|
||||
check_run_count(g);
|
||||
rc = curl_multi_socket_action(g->multi,
|
||||
CURL_SOCKET_TIMEOUT, 0, &g->still_running);
|
||||
mcode_or_die("timer_cb: curl_multi_socket_action", rc);
|
||||
check_multi_info(g);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -198,11 +188,15 @@ static gboolean event_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
|
||||
GlobalInfo *g = (GlobalInfo*) data;
|
||||
CURLMcode rc;
|
||||
int fd=g_io_channel_unix_get_fd(ch);
|
||||
do {
|
||||
rc = curl_multi_socket(g->multi, fd, &g->still_running);
|
||||
} while (rc == CURLM_CALL_MULTI_PERFORM);
|
||||
mcode_or_die("event_cb: curl_multi_socket", rc);
|
||||
check_run_count(g);
|
||||
|
||||
int action =
|
||||
(condition & G_IO_IN ? CURL_CSELECT_IN : 0) |
|
||||
(condition & G_IO_OUT ? CURL_CSELECT_OUT : 0);
|
||||
|
||||
rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
|
||||
mcode_or_die("event_cb: curl_multi_socket_action", rc);
|
||||
|
||||
check_multi_info(g);
|
||||
if(g->still_running) {
|
||||
return TRUE;
|
||||
} else {
|
||||
@@ -338,12 +332,9 @@ static void new_conn(char *url, GlobalInfo *g )
|
||||
MSG_OUT("Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
|
||||
rc =curl_multi_add_handle(g->multi, conn->easy);
|
||||
mcode_or_die("new_conn: curl_multi_add_handle", rc);
|
||||
g->requested++;
|
||||
do {
|
||||
rc = curl_multi_socket_all(g->multi, &g->still_running);
|
||||
} while (CURLM_CALL_MULTI_PERFORM == rc);
|
||||
mcode_or_die("new_conn: curl_multi_socket_all", rc);
|
||||
check_run_count(g);
|
||||
|
||||
/* note that the add_handle() will set a time-out to trigger very soon so
|
||||
that the necessary socket_action() call will be called by this app */
|
||||
}
|
||||
|
||||
|
||||
@@ -451,9 +442,10 @@ int main(int argc, char **argv)
|
||||
curl_multi_setopt(g->multi, CURLMOPT_SOCKETDATA, g);
|
||||
curl_multi_setopt(g->multi, CURLMOPT_TIMERFUNCTION, update_timeout_cb);
|
||||
curl_multi_setopt(g->multi, CURLMOPT_TIMERDATA, g);
|
||||
do {
|
||||
rc = curl_multi_socket_all(g->multi, &g->still_running);
|
||||
} while (CURLM_CALL_MULTI_PERFORM == rc);
|
||||
|
||||
/* we don't call any curl_multi_socket*() function yet as we have no handles
|
||||
added! */
|
||||
|
||||
g_main_loop_run(gmain);
|
||||
curl_multi_cleanup(g->multi);
|
||||
return 0;
|
||||
|
@@ -1,15 +1,28 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* Example application source code using the multi socket interface to
|
||||
* download many files at once.
|
||||
* 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.
|
||||
*
|
||||
* Written by Jeff Pohlmeyer
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Example application source code using the multi socket interface to
|
||||
download many files at once.
|
||||
|
||||
Written by Jeff Pohlmeyer
|
||||
|
||||
Requires libevent and a (POSIX?) system that has mkfifo().
|
||||
|
||||
@@ -62,7 +75,6 @@ typedef struct _GlobalInfo {
|
||||
struct event fifo_event;
|
||||
struct event timer_event;
|
||||
CURLM *multi;
|
||||
int prev_running;
|
||||
int still_running;
|
||||
FILE* input;
|
||||
} GlobalInfo;
|
||||
@@ -110,7 +122,6 @@ static void mcode_or_die(const char *where, CURLMcode code)
|
||||
const char *s;
|
||||
switch (code) {
|
||||
case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break;
|
||||
case CURLM_OK: s="CURLM_OK"; break;
|
||||
case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
|
||||
case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
|
||||
case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
|
||||
@@ -132,44 +143,29 @@ static void mcode_or_die(const char *where, CURLMcode code)
|
||||
|
||||
|
||||
/* Check for completed transfers, and remove their easy handles */
|
||||
static void check_run_count(GlobalInfo *g)
|
||||
static void check_multi_info(GlobalInfo *g)
|
||||
{
|
||||
if (g->prev_running > g->still_running) {
|
||||
char *eff_url=NULL;
|
||||
CURLMsg *msg;
|
||||
int msgs_left;
|
||||
ConnInfo *conn=NULL;
|
||||
CURL*easy;
|
||||
CURLcode res;
|
||||
char *eff_url;
|
||||
CURLMsg *msg;
|
||||
int msgs_left;
|
||||
ConnInfo *conn;
|
||||
CURL *easy;
|
||||
CURLcode res;
|
||||
|
||||
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
|
||||
/*
|
||||
I am still uncertain whether it is safe to remove an easy handle
|
||||
from inside the curl_multi_info_read loop, so here I will search
|
||||
for completed transfers in the inner "while" loop, and then remove
|
||||
them in the outer "do-while" loop...
|
||||
*/
|
||||
do {
|
||||
easy=NULL;
|
||||
while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
|
||||
if (msg->msg == CURLMSG_DONE) {
|
||||
easy=msg->easy_handle;
|
||||
res=msg->data.result;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (easy) {
|
||||
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||
curl_multi_remove_handle(g->multi, easy);
|
||||
free(conn->url);
|
||||
curl_easy_cleanup(easy);
|
||||
free(conn);
|
||||
}
|
||||
} while ( easy );
|
||||
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
|
||||
while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
|
||||
if (msg->msg == CURLMSG_DONE) {
|
||||
easy = msg->easy_handle;
|
||||
res = msg->data.result;
|
||||
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||
fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||
curl_multi_remove_handle(g->multi, easy);
|
||||
free(conn->url);
|
||||
curl_easy_cleanup(easy);
|
||||
free(conn);
|
||||
}
|
||||
}
|
||||
g->prev_running = g->still_running;
|
||||
}
|
||||
|
||||
|
||||
@@ -181,16 +177,13 @@ static void event_cb(int fd, short kind, void *userp)
|
||||
CURLMcode rc;
|
||||
|
||||
int action =
|
||||
(kind&EV_READ?CURL_CSELECT_IN:0)|
|
||||
(kind&EV_WRITE?CURL_CSELECT_OUT:0);
|
||||
|
||||
do {
|
||||
rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
|
||||
} while (rc == CURLM_CALL_MULTI_PERFORM);
|
||||
(kind & EV_READ ? CURL_CSELECT_IN : 0) |
|
||||
(kind & EV_WRITE ? CURL_CSELECT_OUT : 0);
|
||||
|
||||
rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
|
||||
mcode_or_die("event_cb: curl_multi_socket_action", rc);
|
||||
|
||||
check_run_count(g);
|
||||
check_multi_info(g);
|
||||
if ( g->still_running <= 0 ) {
|
||||
fprintf(MSG_OUT, "last transfer done, kill timeout\n");
|
||||
if (evtimer_pending(&g->timer_event, NULL)) {
|
||||
@@ -209,12 +202,10 @@ static void timer_cb(int fd, short kind, void *userp)
|
||||
(void)fd;
|
||||
(void)kind;
|
||||
|
||||
do {
|
||||
rc = curl_multi_socket_action(g->multi,
|
||||
rc = curl_multi_socket_action(g->multi,
|
||||
CURL_SOCKET_TIMEOUT, 0, &g->still_running);
|
||||
} while (rc == CURLM_CALL_MULTI_PERFORM);
|
||||
mcode_or_die("timer_cb: curl_multi_socket_action", rc);
|
||||
check_run_count(g);
|
||||
check_multi_info(g);
|
||||
}
|
||||
|
||||
|
||||
@@ -340,7 +331,7 @@ static void new_conn(char *url, GlobalInfo *g )
|
||||
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
|
||||
fprintf(MSG_OUT,
|
||||
"Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
|
||||
rc =curl_multi_add_handle(g->multi, conn->easy);
|
||||
rc = curl_multi_add_handle(g->multi, conn->easy);
|
||||
mcode_or_die("new_conn: curl_multi_add_handle", rc);
|
||||
|
||||
/* note that the add_handle() will set a time-out to trigger very soon so
|
||||
@@ -372,7 +363,7 @@ static int init_fifo (GlobalInfo *g)
|
||||
{
|
||||
struct stat st;
|
||||
static const char *fifo = "hiper.fifo";
|
||||
int sockfd;
|
||||
curl_socket_t sockfd;
|
||||
|
||||
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
|
||||
if (lstat (fifo, &st) == 0) {
|
||||
|
@@ -1,12 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* Download a document and use libtidy to parse the HTML.
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Download a document and use libtidy to parse the HTML.
|
||||
* Written by Jeff Pohlmeyer
|
||||
*
|
||||
* LibTidy => http://tidy.sourceforge.net
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
// Get a web page, parse it with libxml.
|
||||
//
|
||||
// Written by Lars Nilsson
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2012, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
@@ -27,13 +39,17 @@
|
||||
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
size_t retcode;
|
||||
curl_off_t nread;
|
||||
|
||||
/* in real-world cases, this would probably get this data differently
|
||||
as this fread() stuff is exactly what the library already would do
|
||||
by default internally */
|
||||
retcode = fread(ptr, size, nmemb, stream);
|
||||
|
||||
fprintf(stderr, "*** We read %d bytes from file\n", retcode);
|
||||
nread = (curl_off_t)retcode;
|
||||
|
||||
fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
|
||||
" bytes from file\n", nread);
|
||||
|
||||
return retcode;
|
||||
}
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
@@ -17,7 +29,7 @@ int main(void)
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://sourceforge.net/");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
|
||||
|
||||
#ifdef SKIP_PEER_VERIFICATION
|
||||
/*
|
||||
|
44
docs/examples/imap.c
Normal file
44
docs/examples/imap.c
Normal file
@@ -0,0 +1,44 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2012, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res = CURLE_OK;
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* Set username and password */
|
||||
curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
|
||||
|
||||
/* This will fetch the mailbox named "foobar" */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/foobar");
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
return (int)res;
|
||||
}
|
@@ -1,6 +1,27 @@
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# Project ___| | | | _ \| |
|
||||
# / __| | | | |_) | |
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2011, 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.
|
||||
#
|
||||
###########################################################################
|
||||
#
|
||||
# Adapted for djgpp / Watt-32 / DOS by
|
||||
# Gisle Vanem <giva@bgnett.no>
|
||||
# Gisle Vanem <gvanem@broadpark.no>
|
||||
#
|
||||
|
||||
TOPDIR = ../..
|
||||
|
@@ -1,13 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This is an example application source code using the multi interface.
|
||||
*/
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* This is an example application source code using the multi interface. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@@ -27,7 +39,7 @@
|
||||
#define HTTP_HANDLE 0 /* Index for the HTTP transfer */
|
||||
#define FTP_HANDLE 1 /* Index for the FTP transfer */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int main(void)
|
||||
{
|
||||
CURL *handles[HANDLECOUNT];
|
||||
CURLM *multi_handle;
|
||||
@@ -43,9 +55,9 @@ int main(int argc, char **argv)
|
||||
handles[i] = curl_easy_init();
|
||||
|
||||
/* set the options (I left out a few, you'll get the point anyway) */
|
||||
curl_easy_setopt(handles[HTTP_HANDLE], CURLOPT_URL, "http://website.com");
|
||||
curl_easy_setopt(handles[HTTP_HANDLE], CURLOPT_URL, "http://example.com");
|
||||
|
||||
curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_URL, "ftp://ftpsite.com");
|
||||
curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_URL, "ftp://example.com");
|
||||
curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_UPLOAD, 1L);
|
||||
|
||||
/* init a multi stack */
|
||||
@@ -56,8 +68,7 @@ int main(int argc, char **argv)
|
||||
curl_multi_add_handle(multi_handle, handles[i]);
|
||||
|
||||
/* we start some action by calling perform right away */
|
||||
while(CURLM_CALL_MULTI_PERFORM ==
|
||||
curl_multi_perform(multi_handle, &still_running));
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
|
||||
while(still_running) {
|
||||
struct timeval timeout;
|
||||
@@ -102,14 +113,9 @@ int main(int argc, char **argv)
|
||||
case -1:
|
||||
/* select error */
|
||||
break;
|
||||
case 0:
|
||||
/* timeout, do something else */
|
||||
break;
|
||||
default:
|
||||
/* one or more of curl's file descriptors say there's data to read
|
||||
or write */
|
||||
while(CURLM_CALL_MULTI_PERFORM ==
|
||||
curl_multi_perform(multi_handle, &still_running));
|
||||
case 0: /* timeout */
|
||||
default: /* action */
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -1,14 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This is a very simple example using the multi interface and the debug
|
||||
* callback.
|
||||
*/
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* This is an example showing the multi interface and the debug callback. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@@ -37,12 +48,12 @@ void dump(const char *text,
|
||||
/* without the hex output, we can fit more on screen */
|
||||
width = 0x40;
|
||||
|
||||
fprintf(stream, "%s, %010.10ld bytes (0x%08.8lx)\n",
|
||||
fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n",
|
||||
text, (long)size, (long)size);
|
||||
|
||||
for(i=0; i<size; i+= width) {
|
||||
|
||||
fprintf(stream, "%04.4lx: ", (long)i);
|
||||
fprintf(stream, "%4.4lx: ", (long)i);
|
||||
|
||||
if(!nohex) {
|
||||
/* hex not disabled, show it */
|
||||
@@ -79,6 +90,7 @@ int my_trace(CURL *handle, curl_infotype type,
|
||||
{
|
||||
const char *text;
|
||||
|
||||
(void)userp;
|
||||
(void)handle; /* prevent compiler warning */
|
||||
|
||||
switch (type) {
|
||||
@@ -108,7 +120,7 @@ int my_trace(CURL *handle, curl_infotype type,
|
||||
/*
|
||||
* Simply download a HTTP file.
|
||||
*/
|
||||
int main(int argc, char **argv)
|
||||
int main(void)
|
||||
{
|
||||
CURL *http_handle;
|
||||
CURLM *multi_handle;
|
||||
@@ -118,7 +130,7 @@ int main(int argc, char **argv)
|
||||
http_handle = curl_easy_init();
|
||||
|
||||
/* set the options (I left out a few, you'll get the point anyway) */
|
||||
curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.haxx.se/");
|
||||
curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.example.com/");
|
||||
|
||||
curl_easy_setopt(http_handle, CURLOPT_DEBUGFUNCTION, my_trace);
|
||||
curl_easy_setopt(http_handle, CURLOPT_VERBOSE, 1L);
|
||||
@@ -130,8 +142,7 @@ int main(int argc, char **argv)
|
||||
curl_multi_add_handle(multi_handle, http_handle);
|
||||
|
||||
/* we start some action by calling perform right away */
|
||||
while(CURLM_CALL_MULTI_PERFORM ==
|
||||
curl_multi_perform(multi_handle, &still_running));
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
|
||||
while(still_running) {
|
||||
struct timeval timeout;
|
||||
@@ -181,8 +192,7 @@ int main(int argc, char **argv)
|
||||
case 0:
|
||||
default:
|
||||
/* timeout or readable/writable sockets */
|
||||
while(CURLM_CALL_MULTI_PERFORM ==
|
||||
curl_multi_perform(multi_handle, &still_running));
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -1,14 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This is a very simple example using the multi interface.
|
||||
*/
|
||||
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
@@ -22,7 +32,7 @@
|
||||
/*
|
||||
* Simply download two HTTP files!
|
||||
*/
|
||||
int main(int argc, char **argv)
|
||||
int main(void)
|
||||
{
|
||||
CURL *http_handle;
|
||||
CURL *http_handle2;
|
||||
@@ -34,7 +44,7 @@ int main(int argc, char **argv)
|
||||
http_handle2 = curl_easy_init();
|
||||
|
||||
/* set options */
|
||||
curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.haxx.se/");
|
||||
curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.example.com/");
|
||||
|
||||
/* set options */
|
||||
curl_easy_setopt(http_handle2, CURLOPT_URL, "http://localhost/");
|
||||
@@ -47,8 +57,7 @@ int main(int argc, char **argv)
|
||||
curl_multi_add_handle(multi_handle, http_handle2);
|
||||
|
||||
/* we start some action by calling perform right away */
|
||||
while(CURLM_CALL_MULTI_PERFORM ==
|
||||
curl_multi_perform(multi_handle, &still_running));
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
|
||||
while(still_running) {
|
||||
struct timeval timeout;
|
||||
@@ -96,8 +105,7 @@ int main(int argc, char **argv)
|
||||
case 0:
|
||||
default:
|
||||
/* timeout or readable/writable sockets */
|
||||
while(CURLM_CALL_MULTI_PERFORM ==
|
||||
curl_multi_perform(multi_handle, &still_running));
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -1,21 +1,33 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This is an example application source code using the multi interface
|
||||
* to do a multipart formpost without "blocking".
|
||||
*/
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* This is an example application source code using the multi interface
|
||||
* to do a multipart formpost without "blocking". */
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
|
||||
@@ -58,8 +70,7 @@ int main(int argc, char *argv[])
|
||||
if(curl && multi_handle) {
|
||||
|
||||
/* what URL that receives this POST */
|
||||
curl_easy_setopt(curl, CURLOPT_URL,
|
||||
"http://www.fillinyoururl.com/upload.cgi");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/upload.cgi");
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
|
||||
@@ -67,8 +78,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
curl_multi_add_handle(multi_handle, curl);
|
||||
|
||||
while(CURLM_CALL_MULTI_PERFORM ==
|
||||
curl_multi_perform(multi_handle, &still_running));
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
|
||||
while(still_running) {
|
||||
struct timeval timeout;
|
||||
@@ -114,12 +124,10 @@ int main(int argc, char *argv[])
|
||||
/* select error */
|
||||
break;
|
||||
case 0:
|
||||
printf("timeout!\n");
|
||||
default:
|
||||
/* timeout or readable/writable sockets */
|
||||
printf("perform!\n");
|
||||
while(CURLM_CALL_MULTI_PERFORM ==
|
||||
curl_multi_perform(multi_handle, &still_running));
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
printf("running: %d!\n", still_running);
|
||||
break;
|
||||
}
|
||||
|
@@ -1,13 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This is a very simple example using the multi interface.
|
||||
*/
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* This is a very simple example using the multi interface. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@@ -22,7 +34,7 @@
|
||||
/*
|
||||
* Simply download a HTTP file.
|
||||
*/
|
||||
int main(int argc, char **argv)
|
||||
int main(void)
|
||||
{
|
||||
CURL *http_handle;
|
||||
CURLM *multi_handle;
|
||||
@@ -32,7 +44,7 @@ int main(int argc, char **argv)
|
||||
http_handle = curl_easy_init();
|
||||
|
||||
/* set the options (I left out a few, you'll get the point anyway) */
|
||||
curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.haxx.se/");
|
||||
curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.example.com/");
|
||||
|
||||
/* init a multi stack */
|
||||
multi_handle = curl_multi_init();
|
||||
@@ -41,8 +53,7 @@ int main(int argc, char **argv)
|
||||
curl_multi_add_handle(multi_handle, http_handle);
|
||||
|
||||
/* we start some action by calling perform right away */
|
||||
while(CURLM_CALL_MULTI_PERFORM ==
|
||||
curl_multi_perform(multi_handle, &still_running));
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
|
||||
while(still_running) {
|
||||
struct timeval timeout;
|
||||
@@ -92,8 +103,7 @@ int main(int argc, char **argv)
|
||||
case 0:
|
||||
default:
|
||||
/* timeout or readable/writable sockets */
|
||||
while(CURLM_CALL_MULTI_PERFORM ==
|
||||
curl_multi_perform(multi_handle, &still_running));
|
||||
curl_multi_perform(multi_handle, &still_running);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* A multi-threaded example that uses pthreads extensively to fetch
|
||||
* X remote files at once */
|
||||
|
||||
|
@@ -1,12 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* Example source code to show one way to set the necessary OpenSSL locking
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Example source code to show one way to set the necessary OpenSSL locking
|
||||
* callbacks if you want to do multi-threaded transfers with HTTPS/FTPS with
|
||||
* libcurl built to use OpenSSL.
|
||||
*
|
||||
|
@@ -1,17 +1,29 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
@@ -24,12 +36,12 @@ int main(int argc, char **argv)
|
||||
curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
|
||||
|
||||
/* get the first document */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://curl.haxx.se/");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* get another document from the same server using the same
|
||||
connection */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://curl.haxx.se/docs/");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/docs/");
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* always cleanup */
|
||||
|
68
docs/examples/pop3s.c
Normal file
68
docs/examples/pop3s.c
Normal file
@@ -0,0 +1,68 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* Set username and password */
|
||||
curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
|
||||
|
||||
/* This will only fetch the message with ID "1" of the given mailbox */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "pop3s://user@pop.example.com/1");
|
||||
|
||||
#ifdef SKIP_PEER_VERIFICATION
|
||||
/*
|
||||
* If you want to connect to a site who isn't using a certificate that is
|
||||
* signed by one of the certs in the CA bundle you have, you can skip the
|
||||
* verification of the server's certificate. This makes the connection
|
||||
* A LOT LESS SECURE.
|
||||
*
|
||||
* If you have a CA cert for the server stored someplace else than in the
|
||||
* default bundle, then the CURLOPT_CAPATH option might come handy for
|
||||
* you.
|
||||
*/
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
#endif
|
||||
|
||||
#ifdef SKIP_HOSTNAME_VERFICATION
|
||||
/*
|
||||
* If the site you're connecting to uses a different host name that what
|
||||
* they have mentioned in their server certificate's commonName (or
|
||||
* subjectAltName) fields, libcurl will refuse to connect. You can skip
|
||||
* this check, but this will make the connection less secure.
|
||||
*/
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
#endif
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
return 0;
|
||||
}
|
68
docs/examples/pop3slist.c
Normal file
68
docs/examples/pop3slist.c
Normal file
@@ -0,0 +1,68 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* Set username and password */
|
||||
curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
|
||||
|
||||
/* This will list every message of the given mailbox */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "pop3s://user@pop.example.com/");
|
||||
|
||||
#ifdef SKIP_PEER_VERIFICATION
|
||||
/*
|
||||
* If you want to connect to a site who isn't using a certificate that is
|
||||
* signed by one of the certs in the CA bundle you have, you can skip the
|
||||
* verification of the server's certificate. This makes the connection
|
||||
* A LOT LESS SECURE.
|
||||
*
|
||||
* If you have a CA cert for the server stored someplace else than in the
|
||||
* default bundle, then the CURLOPT_CAPATH option might come handy for
|
||||
* you.
|
||||
*/
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
#endif
|
||||
|
||||
#ifdef SKIP_HOSTNAME_VERFICATION
|
||||
/*
|
||||
* If the site you're connecting to uses a different host name that what
|
||||
* they have mentioned in their server certificate's commonName (or
|
||||
* subjectAltName) fields, libcurl will refuse to connect. You can skip
|
||||
* this check, but this will make the connection less secure.
|
||||
*/
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
||||
#endif
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
return 0;
|
||||
}
|
@@ -1,14 +1,26 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* An example source code that issues a HTTP POST and we provide the actual
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* An example source code that issues a HTTP POST and we provide the actual
|
||||
* data through a read callback.
|
||||
*
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@@ -18,7 +30,7 @@ const char data[]="this is what we post to the silly web server";
|
||||
|
||||
struct WriteThis {
|
||||
const char *readptr;
|
||||
int sizeleft;
|
||||
long sizeleft;
|
||||
};
|
||||
|
||||
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
|
||||
@@ -51,8 +63,8 @@ int main(void)
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* First set the URL that is about to receive our POST. */
|
||||
curl_easy_setopt(curl, CURLOPT_URL,
|
||||
"http://receivingsite.com.pooh/index.cgi");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/index.cgi");
|
||||
|
||||
/* Now specify we want to POST data */
|
||||
curl_easy_setopt(curl, CURLOPT_POST, 1L);
|
||||
|
||||
@@ -84,7 +96,7 @@ int main(void)
|
||||
#else
|
||||
/* Set the expected POST size. If you want to POST large amounts of data,
|
||||
consider CURLOPT_POSTFIELDSIZE_LARGE */
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (curl_off_t)pooh.sizeleft);
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, pooh.sizeleft);
|
||||
#endif
|
||||
|
||||
#ifdef DISABLE_EXPECT
|
||||
|
@@ -1,12 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* Example code that uploads a file name 'foo' to a remote script that accepts
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* Example code that uploads a file name 'foo' to a remote script that accepts
|
||||
* "HTML form based" (as described in RFC1738) uploads using HTTP POST.
|
||||
*
|
||||
* The imaginary form we'll fill in looks like:
|
||||
@@ -24,8 +37,6 @@
|
||||
#include <string.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h>
|
||||
#include <curl/easy.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
@@ -67,7 +78,7 @@ int main(int argc, char *argv[])
|
||||
headerlist = curl_slist_append(headerlist, buf);
|
||||
if(curl) {
|
||||
/* what URL that receives this POST */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://curl.haxx.se/examplepost.cgi");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/examplepost.cgi");
|
||||
if ( (argc == 2) && (!strcmp(argv[1], "noexpectheader")) )
|
||||
/* only disable 100-continue header if explicitly requested */
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
|
||||
|
84
docs/examples/progressfunc.c
Normal file
84
docs/examples/progressfunc.c
Normal file
@@ -0,0 +1,84 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
#define STOP_DOWNLOAD_AFTER_THIS_MANY_BYTES 6000
|
||||
#define MINIMAL_PROGRESS_FUNCTIONALITY_INTERVAL 3
|
||||
|
||||
struct myprogress {
|
||||
double lastruntime;
|
||||
CURL *curl;
|
||||
};
|
||||
|
||||
static int progress(void *p,
|
||||
double dltotal, double dlnow,
|
||||
double ultotal, double ulnow)
|
||||
{
|
||||
struct myprogress *myp = (struct myprogress *)p;
|
||||
CURL *curl = myp->curl;
|
||||
double curtime = 0;
|
||||
|
||||
curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &curtime);
|
||||
|
||||
/* under certain circumstances it may be desirable for certain functionality
|
||||
to only run every N seconds, in order to do this the transaction time can
|
||||
be used */
|
||||
if((curtime - myp->lastruntime) >= MINIMAL_PROGRESS_FUNCTIONALITY_INTERVAL) {
|
||||
myp->lastruntime = curtime;
|
||||
fprintf(stderr, "TOTAL TIME: %f \r\n", curtime);
|
||||
}
|
||||
|
||||
fprintf(stderr, "UP: %g of %g DOWN: %g of %g\r\n",
|
||||
ulnow, ultotal, dlnow, dltotal);
|
||||
|
||||
if(dlnow > STOP_DOWNLOAD_AFTER_THIS_MANY_BYTES)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res=0;
|
||||
struct myprogress prog;
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
prog.lastruntime = 0;
|
||||
prog.curl = curl;
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
|
||||
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress);
|
||||
/* pass the struct pointer into the progress function */
|
||||
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &prog);
|
||||
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
if(res)
|
||||
fprintf(stderr, "%s\n", curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
return (int)res;
|
||||
}
|
51
docs/examples/resolve.c
Normal file
51
docs/examples/resolve.c
Normal file
@@ -0,0 +1,51 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res = CURLE_OK;
|
||||
struct curl_slist *host = NULL;
|
||||
|
||||
/* Each single name resolve string should be written using the format
|
||||
HOST:PORT:ADDRESS where HOST is the name libcurl will try to resolve,
|
||||
PORT is the port number of the service where libcurl wants to connect to
|
||||
the HOST and ADDRESS is the numerical IP address
|
||||
*/
|
||||
host = curl_slist_append(NULL, "example.com:80:127.0.0.1");
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_RESOLVE, host);
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
curl_slist_free_all(host);
|
||||
|
||||
return (int)res;
|
||||
}
|
271
docs/examples/rtsp.c
Normal file
271
docs/examples/rtsp.c
Normal file
@@ -0,0 +1,271 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Jim Hollinger
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of Jim Hollinger nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined (WIN32)
|
||||
# include <conio.h> /* _getch() */
|
||||
#else
|
||||
# include <termios.h>
|
||||
# include <unistd.h>
|
||||
|
||||
static int _getch(void)
|
||||
{
|
||||
struct termios oldt, newt;
|
||||
int ch;
|
||||
tcgetattr( STDIN_FILENO, &oldt );
|
||||
newt = oldt;
|
||||
newt.c_lflag &= ~( ICANON | ECHO );
|
||||
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
|
||||
ch = getchar();
|
||||
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
|
||||
return ch;
|
||||
}
|
||||
#endif
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
#define VERSION_STR "V1.0"
|
||||
|
||||
/* error handling macros */
|
||||
#define my_curl_easy_setopt(A, B, C) \
|
||||
if ((res = curl_easy_setopt((A), (B), (C))) != CURLE_OK) \
|
||||
fprintf(stderr, "curl_easy_setopt(%s, %s, %s) failed: %d\n", \
|
||||
#A, #B, #C, res);
|
||||
|
||||
#define my_curl_easy_perform(A) \
|
||||
if ((res = curl_easy_perform((A))) != CURLE_OK) \
|
||||
fprintf(stderr, "curl_easy_perform(%s) failed: %d\n", #A, res);
|
||||
|
||||
|
||||
/* send RTSP OPTIONS request */
|
||||
static void rtsp_options(CURL *curl, const char *uri)
|
||||
{
|
||||
CURLcode res = CURLE_OK;
|
||||
printf("\nRTSP: OPTIONS %s\n", uri);
|
||||
my_curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI, uri);
|
||||
my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_OPTIONS);
|
||||
my_curl_easy_perform(curl);
|
||||
}
|
||||
|
||||
|
||||
/* send RTSP DESCRIBE request and write sdp response to a file */
|
||||
static void rtsp_describe(CURL *curl, const char *uri,
|
||||
const char *sdp_filename)
|
||||
{
|
||||
CURLcode res = CURLE_OK;
|
||||
FILE *sdp_fp = fopen(sdp_filename, "wt");
|
||||
printf("\nRTSP: DESCRIBE %s\n", uri);
|
||||
if (sdp_fp == NULL) {
|
||||
fprintf(stderr, "Could not open '%s' for writing\n", sdp_filename);
|
||||
sdp_fp = stdout;
|
||||
}
|
||||
else {
|
||||
printf("Writing SDP to '%s'\n", sdp_filename);
|
||||
}
|
||||
my_curl_easy_setopt(curl, CURLOPT_WRITEDATA, sdp_fp);
|
||||
my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_DESCRIBE);
|
||||
my_curl_easy_perform(curl);
|
||||
my_curl_easy_setopt(curl, CURLOPT_WRITEDATA, stdout);
|
||||
if (sdp_fp != stdout) {
|
||||
fclose(sdp_fp);
|
||||
}
|
||||
}
|
||||
|
||||
/* send RTSP SETUP request */
|
||||
static void rtsp_setup(CURL *curl, const char *uri, const char *transport)
|
||||
{
|
||||
CURLcode res = CURLE_OK;
|
||||
printf("\nRTSP: SETUP %s\n", uri);
|
||||
printf(" TRANSPORT %s\n", transport);
|
||||
my_curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI, uri);
|
||||
my_curl_easy_setopt(curl, CURLOPT_RTSP_TRANSPORT, transport);
|
||||
my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_SETUP);
|
||||
my_curl_easy_perform(curl);
|
||||
}
|
||||
|
||||
|
||||
/* send RTSP PLAY request */
|
||||
static void rtsp_play(CURL *curl, const char *uri, const char *range)
|
||||
{
|
||||
CURLcode res = CURLE_OK;
|
||||
printf("\nRTSP: PLAY %s\n", uri);
|
||||
my_curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI, uri);
|
||||
my_curl_easy_setopt(curl, CURLOPT_RANGE, range);
|
||||
my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_PLAY);
|
||||
my_curl_easy_perform(curl);
|
||||
}
|
||||
|
||||
|
||||
/* send RTSP TEARDOWN request */
|
||||
static void rtsp_teardown(CURL *curl, const char *uri)
|
||||
{
|
||||
CURLcode res = CURLE_OK;
|
||||
printf("\nRTSP: TEARDOWN %s\n", uri);
|
||||
my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_TEARDOWN);
|
||||
my_curl_easy_perform(curl);
|
||||
}
|
||||
|
||||
|
||||
/* convert url into an sdp filename */
|
||||
static void get_sdp_filename(const char *url, char *sdp_filename)
|
||||
{
|
||||
const char *s = strrchr(url, '/');
|
||||
strcpy(sdp_filename, "video.sdp");
|
||||
if (s != NULL) {
|
||||
s++;
|
||||
if (s[0] != '\0') {
|
||||
sprintf(sdp_filename, "%s.sdp", s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* scan sdp file for media control attribute */
|
||||
static void get_media_control_attribute(const char *sdp_filename,
|
||||
char *control)
|
||||
{
|
||||
int max_len = 256;
|
||||
char *s = malloc(max_len);
|
||||
FILE *sdp_fp = fopen(sdp_filename, "rt");
|
||||
control[0] = '\0';
|
||||
if (sdp_fp != NULL) {
|
||||
while (fgets(s, max_len - 2, sdp_fp) != NULL) {
|
||||
sscanf(s, " a = control: %s", control);
|
||||
}
|
||||
fclose(sdp_fp);
|
||||
}
|
||||
free(s);
|
||||
}
|
||||
|
||||
|
||||
/* main app */
|
||||
int main(int argc, char * const argv[])
|
||||
{
|
||||
#if 1
|
||||
const char *transport = "RTP/AVP;unicast;client_port=1234-1235"; /* UDP */
|
||||
#else
|
||||
const char *transport = "RTP/AVP/TCP;unicast;client_port=1234-1235"; /* TCP */
|
||||
#endif
|
||||
const char *range = "0.000-";
|
||||
int rc = EXIT_SUCCESS;
|
||||
char *basename = NULL;
|
||||
|
||||
printf("\nRTSP request %s\n", VERSION_STR);
|
||||
printf(" Project web site: http://code.google.com/p/rtsprequest/\n");
|
||||
printf(" Requires cURL V7.20 or greater\n\n");
|
||||
|
||||
/* check command line */
|
||||
if ((argc != 2) && (argc != 3)) {
|
||||
basename = strrchr(argv[0], '/');
|
||||
if (basename == NULL) {
|
||||
basename = strrchr(argv[0], '\\');
|
||||
}
|
||||
if (basename == NULL) {
|
||||
basename = argv[0];
|
||||
} else {
|
||||
basename++;
|
||||
}
|
||||
printf("Usage: %s url [transport]\n", basename);
|
||||
printf(" url of video server\n");
|
||||
printf(" transport (optional) specifier for media stream protocol\n");
|
||||
printf(" default transport: %s\n", transport);
|
||||
printf("Example: %s rtsp://192.168.0.2/media/video1\n\n", basename);
|
||||
rc = EXIT_FAILURE;
|
||||
} else {
|
||||
const char *url = argv[1];
|
||||
char *uri = malloc(strlen(url) + 32);
|
||||
char *sdp_filename = malloc(strlen(url) + 32);
|
||||
char *control = malloc(strlen(url) + 32);
|
||||
CURLcode res;
|
||||
get_sdp_filename(url, sdp_filename);
|
||||
if (argc == 3) {
|
||||
transport = argv[2];
|
||||
}
|
||||
|
||||
/* initialize curl */
|
||||
res = curl_global_init(CURL_GLOBAL_ALL);
|
||||
if (res == CURLE_OK) {
|
||||
curl_version_info_data *data = curl_version_info(CURLVERSION_NOW);
|
||||
CURL *curl;
|
||||
fprintf(stderr, " cURL V%s loaded\n", data->version);
|
||||
|
||||
/* initialize this curl session */
|
||||
curl = curl_easy_init();
|
||||
if (curl != NULL) {
|
||||
my_curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
|
||||
my_curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
|
||||
my_curl_easy_setopt(curl, CURLOPT_WRITEHEADER, stdout);
|
||||
my_curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
|
||||
/* request server options */
|
||||
sprintf(uri, "%s", url);
|
||||
rtsp_options(curl, uri);
|
||||
|
||||
/* request session description and write response to sdp file */
|
||||
rtsp_describe(curl, uri, sdp_filename);
|
||||
|
||||
/* get media control attribute from sdp file */
|
||||
get_media_control_attribute(sdp_filename, control);
|
||||
|
||||
/* setup media stream */
|
||||
sprintf(uri, "%s/%s", url, control);
|
||||
rtsp_setup(curl, uri, transport);
|
||||
|
||||
/* start playing media stream */
|
||||
sprintf(uri, "%s/", url);
|
||||
rtsp_play(curl, uri, range);
|
||||
printf("Playing video, press any key to stop ...");
|
||||
_getch();
|
||||
printf("\n");
|
||||
|
||||
/* teardown session */
|
||||
rtsp_teardown(curl, uri);
|
||||
|
||||
/* cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
curl = NULL;
|
||||
} else {
|
||||
fprintf(stderr, "curl_easy_init() failed\n");
|
||||
}
|
||||
curl_global_cleanup();
|
||||
} else {
|
||||
fprintf(stderr, "curl_global_init(%s) failed: %d\n",
|
||||
"CURL_GLOBAL_ALL", res);
|
||||
}
|
||||
free(control);
|
||||
free(sdp_filename);
|
||||
free(uri);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
@@ -1,11 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/*
|
||||
This is a simple example showing how a program on a non-ASCII platform
|
||||
would invoke callbacks to do its own codeset conversions instead of
|
||||
@@ -75,7 +88,7 @@ int main(void)
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
|
||||
|
||||
/* use platform-specific functions for codeset conversions */
|
||||
curl_easy_setopt(curl, CURLOPT_CONV_FROM_NETWORK_FUNCTION,
|
||||
|
@@ -1,20 +1,32 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* An example of curl_easy_send() and curl_easy_recv() usage.
|
||||
* Copyright (C) 1998 - 2012, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* An example of curl_easy_send() and curl_easy_recv() usage. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
/* Auxiliary function that waits on the socket. */
|
||||
static int wait_on_socket(int sockfd, int for_recv, long timeout_ms)
|
||||
static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
|
||||
{
|
||||
struct timeval tv;
|
||||
fd_set infd, outfd, errfd;
|
||||
@@ -48,13 +60,15 @@ int main(void)
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
/* Minimalistic http request */
|
||||
const char *request = "GET / HTTP/1.0\r\nHost: curl.haxx.se\r\n\r\n";
|
||||
int sockfd; /* socket */
|
||||
const char *request = "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n";
|
||||
curl_socket_t sockfd; /* socket */
|
||||
long sockextr;
|
||||
size_t iolen;
|
||||
curl_off_t nread;
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
|
||||
/* Do not do the transfer - only connect to host */
|
||||
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
|
||||
res = curl_easy_perform(curl);
|
||||
@@ -65,9 +79,11 @@ int main(void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Extract the socket from the curl handle - we'll need it
|
||||
* for waiting */
|
||||
res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockfd);
|
||||
/* Extract the socket from the curl handle - we'll need it for waiting.
|
||||
* Note that this API takes a pointer to a 'long' while we use
|
||||
* curl_socket_t for sockets otherwise.
|
||||
*/
|
||||
res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockextr);
|
||||
|
||||
if(CURLE_OK != res)
|
||||
{
|
||||
@@ -75,6 +91,8 @@ int main(void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
sockfd = sockextr;
|
||||
|
||||
/* wait for the socket to become ready for sending */
|
||||
if(!wait_on_socket(sockfd, 0, 60000L))
|
||||
{
|
||||
@@ -105,7 +123,9 @@ int main(void)
|
||||
if(CURLE_OK != res)
|
||||
break;
|
||||
|
||||
printf("Received %u bytes.\n", iolen);
|
||||
nread = (curl_off_t)iolen;
|
||||
|
||||
printf("Received %" CURL_FORMAT_CURL_OFF_T " bytes.\n", nread);
|
||||
}
|
||||
|
||||
/* always cleanup */
|
||||
|
@@ -1,19 +1,29 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h>
|
||||
#include <curl/easy.h>
|
||||
|
||||
static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
@@ -21,7 +31,7 @@ static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
return written;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl_handle;
|
||||
static const char *headerfilename = "head.out";
|
||||
@@ -35,7 +45,7 @@ int main(int argc, char **argv)
|
||||
curl_handle = curl_easy_init();
|
||||
|
||||
/* set URL to get */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://curl.haxx.se");
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://example.com");
|
||||
|
||||
/* no progress meter please */
|
||||
curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
@@ -17,7 +29,7 @@ int main(void)
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* always cleanup */
|
||||
|
@@ -1,12 +1,24 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <curl/curl.h>
|
||||
@@ -20,7 +32,7 @@ int main(void)
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://posthere.com");
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis);
|
||||
|
||||
/* if we don't provide POSTFIELDSIZE, libcurl will strlen() by
|
||||
|
83
docs/examples/simplesmtp.c
Normal file
83
docs/examples/simplesmtp.c
Normal file
@@ -0,0 +1,83 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
struct curl_slist *recipients = NULL;
|
||||
|
||||
/* value for envelope reverse-path */
|
||||
static const char *from = "<bradh@example.com>";
|
||||
|
||||
/* this becomes the envelope forward-path */
|
||||
static const char *to = "<bradh@example.net>";
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* this is the URL for your mailserver - you can also use an smtps:// URL
|
||||
* here */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.net.");
|
||||
|
||||
/* Note that this option isn't strictly required, omitting it will result in
|
||||
* libcurl will sent the MAIL FROM command with no sender data. All
|
||||
* autoresponses should have an empty reverse-path, and should be directed
|
||||
* to the address in the reverse-path which triggered them. Otherwise, they
|
||||
* could cause an endless loop. See RFC 5321 Section 4.5.5 for more details.
|
||||
*/
|
||||
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, from);
|
||||
|
||||
/* Note that the CURLOPT_MAIL_RCPT takes a list, not a char array. */
|
||||
recipients = curl_slist_append(recipients, to);
|
||||
curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
|
||||
|
||||
/* You provide the payload (headers and the body of the message) as the
|
||||
* "data" element. There are two choices, either:
|
||||
* - provide a callback function and specify the function name using the
|
||||
* CURLOPT_READFUNCTION option; or
|
||||
* - just provide a FILE pointer that can be used to read the data from.
|
||||
* The easiest case is just to read from standard input, (which is available
|
||||
* as a FILE pointer) as shown here.
|
||||
*/
|
||||
curl_easy_setopt(curl, CURLOPT_READDATA, stdin);
|
||||
|
||||
/* send the message (including headers) */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* free the list of recipients */
|
||||
curl_slist_free_all(recipients);
|
||||
|
||||
/* curl won't send the QUIT command until you call cleanup, so you should be
|
||||
* able to re-use this connection for additional messages (setting
|
||||
* CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling
|
||||
* curl_easy_perform() again. It may not be a good idea to keep the
|
||||
* connection open for a very long time though (more than a few minutes may
|
||||
* result in the server timing out the connection), and you do want to clean
|
||||
* up in the end.
|
||||
*/
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
return 0;
|
||||
}
|
@@ -1,18 +1,27 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
*/
|
||||
|
||||
* Copyright (C) 1998 - 2011, 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
#include <stdio.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h>
|
||||
#include <curl/easy.h>
|
||||
|
||||
|
||||
/* some requirements for this to work:
|
||||
1. set pCertFile to the file with the client certificate
|
||||
@@ -32,7 +41,7 @@
|
||||
|
||||
*/
|
||||
|
||||
int main(int argc, char **argv)
|
||||
int main(void)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
@@ -47,7 +56,7 @@ int main(int argc, char **argv)
|
||||
|
||||
const char *pEngine;
|
||||
|
||||
#if USE_ENGINE
|
||||
#ifdef USE_ENGINE
|
||||
pKeyName = "rsa_test";
|
||||
pKeyType = "ENG";
|
||||
pEngine = "chil"; /* for nChiper HSM... */
|
||||
|
@@ -1,12 +1,25 @@
|
||||
/*****************************************************************************
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This is a multi threaded application that uses a progress bar to show
|
||||
* 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.
|
||||
*
|
||||
***************************************************************************/
|
||||
/* This is a multi threaded application that uses a progress bar to show
|
||||
* status. It uses Gtk+ to make a smooth pulse.
|
||||
*
|
||||
* Written by Jud Bishop after studying the other examples provided with
|
||||
@@ -24,8 +37,6 @@
|
||||
#include <pthread.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h> /* new for v7 */
|
||||
#include <curl/easy.h> /* new for v7 */
|
||||
|
||||
#define NUMT 4
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user