Compare commits
1117 Commits
curl-7_13_
...
curl-7_15_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c7e9e60b05 | ||
|
|
47f2e1da73 | ||
|
|
5975229919 | ||
|
|
38295e8a75 | ||
|
|
f9612b5eaf | ||
|
|
5cf2ef2ef7 | ||
|
|
938b5c886e | ||
|
|
0618e68200 | ||
|
|
bac52f3969 | ||
|
|
d494d62953 | ||
|
|
7206181385 | ||
|
|
3f22901a43 | ||
|
|
f70f11fc70 | ||
|
|
cffebd7fd6 | ||
|
|
b8c8e7349f | ||
|
|
8bba99ae56 | ||
|
|
b5c5f57613 | ||
|
|
33df856925 | ||
|
|
ce09cedd2e | ||
|
|
7d68101f83 | ||
|
|
aa50a00898 | ||
|
|
26f112ba55 | ||
|
|
159b9162f8 | ||
|
|
d7999f9fcb | ||
|
|
f13eba4c78 | ||
|
|
050e82e088 | ||
|
|
88377e5b61 | ||
|
|
241af465fd | ||
|
|
59510a554d | ||
|
|
b10aa95d28 | ||
|
|
097bee681a | ||
|
|
8548c2fc61 | ||
|
|
dc4fbd2e97 | ||
|
|
60b029869f | ||
|
|
f592ea6c30 | ||
|
|
a39ac3d94a | ||
|
|
4b23ddc002 | ||
|
|
4486d336a6 | ||
|
|
45e4b811b0 | ||
|
|
0e6a1a4420 | ||
|
|
b8bf708db9 | ||
|
|
6fdbb01194 | ||
|
|
d29147565c | ||
|
|
75c9430559 | ||
|
|
9ac99a80c3 | ||
|
|
a15d107dde | ||
|
|
09897b8146 | ||
|
|
29e446e508 | ||
|
|
10beb36b1c | ||
|
|
a65a888866 | ||
|
|
98180b5cc7 | ||
|
|
92009181af | ||
|
|
831bdb9f63 | ||
|
|
50a4dbbb5e | ||
|
|
ad6511c313 | ||
|
|
7a37fa4aef | ||
|
|
dcee24191f | ||
|
|
87bcb6f377 | ||
|
|
b0bc2f00d2 | ||
|
|
3b19c7d0d9 | ||
|
|
12f5c67bf5 | ||
|
|
d7a83d8995 | ||
|
|
7725729d90 | ||
|
|
e96445bd02 | ||
|
|
da2c124675 | ||
|
|
8cb695a963 | ||
|
|
54cbd7e154 | ||
|
|
5994b62930 | ||
|
|
2fbf94b0f3 | ||
|
|
32bc30e210 | ||
|
|
f3bc8e6ce1 | ||
|
|
16f3a32bec | ||
|
|
c44d2498e3 | ||
|
|
2aed209efa | ||
|
|
b55b780d7b | ||
|
|
8d4eb2bc1f | ||
|
|
67bf4f28ff | ||
|
|
803582f8ac | ||
|
|
03603f392a | ||
|
|
fcfd6d9504 | ||
|
|
c31451cf13 | ||
|
|
5deff1a179 | ||
|
|
e236a1c99b | ||
|
|
a2f3094eb0 | ||
|
|
65afc576ea | ||
|
|
8971f656b4 | ||
|
|
394ce9ee39 | ||
|
|
67a83c1b34 | ||
|
|
1e8d094274 | ||
|
|
4c35a40858 | ||
|
|
802b2aaf6a | ||
|
|
0e79a8944b | ||
|
|
bebf70667d | ||
|
|
d9bd5de0b1 | ||
|
|
31c7aa0ba4 | ||
|
|
fc2388189f | ||
|
|
4431338691 | ||
|
|
bda1e9aeab | ||
|
|
4969ca768d | ||
|
|
2acd1c1642 | ||
|
|
e1e753179a | ||
|
|
f4cc8153ae | ||
|
|
e4d8cb4ee0 | ||
|
|
723a78ae3f | ||
|
|
cd9d0d7dec | ||
|
|
665d4f08c8 | ||
|
|
00c7780fcb | ||
|
|
15ab13dc42 | ||
|
|
8a0ca3066e | ||
|
|
ea01755bb4 | ||
|
|
69c2084a18 | ||
|
|
99c0a1a7d0 | ||
|
|
5acf997e69 | ||
|
|
dd87e4ed39 | ||
|
|
2f8c26ba8a | ||
|
|
81b9793807 | ||
|
|
7278f17e8f | ||
|
|
66c7427df0 | ||
|
|
c1a06d858d | ||
|
|
53b5fdbe9e | ||
|
|
687cf0235e | ||
|
|
b6e9229cf0 | ||
|
|
089e4848d8 | ||
|
|
58d2e7c6d1 | ||
|
|
fa18d6fb76 | ||
|
|
4dcb930247 | ||
|
|
74a299fd08 | ||
|
|
532a560d87 | ||
|
|
0040a60559 | ||
|
|
cc34342790 | ||
|
|
bdbf6e9d19 | ||
|
|
db86f765eb | ||
|
|
b11dec5dd5 | ||
|
|
86becc7591 | ||
|
|
8922bc038b | ||
|
|
009f5790a4 | ||
|
|
0536b6c459 | ||
|
|
0e3ebd9841 | ||
|
|
598965a606 | ||
|
|
d7a2938849 | ||
|
|
a683658675 | ||
|
|
25169f68b7 | ||
|
|
e5247ae65d | ||
|
|
a718cb05ff | ||
|
|
b466ef2581 | ||
|
|
c7a634641f | ||
|
|
e4388643f1 | ||
|
|
bc4208201c | ||
|
|
a0d69d52a1 | ||
|
|
c23a1be139 | ||
|
|
9799f7afb0 | ||
|
|
6358b24fac | ||
|
|
b58634316f | ||
|
|
e3657644d6 | ||
|
|
7d1e3ebeed | ||
|
|
9e61dfe85e | ||
|
|
7b51aafa86 | ||
|
|
5f487123df | ||
|
|
f1f32477e3 | ||
|
|
df2b1251a0 | ||
|
|
02c7cf6fa5 | ||
|
|
60006ff993 | ||
|
|
f3af5d7b8e | ||
|
|
d551412a32 | ||
|
|
6de67a134e | ||
|
|
8ec31398e0 | ||
|
|
fd0d560b47 | ||
|
|
cc542269a1 | ||
|
|
7b488a3bef | ||
|
|
f448168501 | ||
|
|
80a8fb98db | ||
|
|
898bb397b1 | ||
|
|
74ed5b5ebd | ||
|
|
178afd81a9 | ||
|
|
d6eb1a7b98 | ||
|
|
4ff56b15e9 | ||
|
|
e6b98d3152 | ||
|
|
5fd8dd2dce | ||
|
|
0ad3e046a4 | ||
|
|
d6c5d24af3 | ||
|
|
8a3280a2de | ||
|
|
450a0a647a | ||
|
|
676c0cf123 | ||
|
|
a731319321 | ||
|
|
81b06a09b7 | ||
|
|
23b34744d9 | ||
|
|
bc8590aa12 | ||
|
|
939d368d5f | ||
|
|
336e3b8baf | ||
|
|
47c06fa308 | ||
|
|
b7f447f8d8 | ||
|
|
03af76b631 | ||
|
|
e105d5c28f | ||
|
|
d6ffb4c177 | ||
|
|
6dbfce1031 | ||
|
|
fea5ddf585 | ||
|
|
b9f39c2711 | ||
|
|
5acac0309a | ||
|
|
78febad718 | ||
|
|
a6a5bba0a9 | ||
|
|
51581c034d | ||
|
|
8f25a95b47 | ||
|
|
7f5d092223 | ||
|
|
2e5cccd1b6 | ||
|
|
2645782f89 | ||
|
|
9533092511 | ||
|
|
6005a461bb | ||
|
|
e2df946eee | ||
|
|
d14588120f | ||
|
|
ab31cfa664 | ||
|
|
af1c397969 | ||
|
|
947f9deed5 | ||
|
|
ce95eee903 | ||
|
|
b15f3bb969 | ||
|
|
998e8cba19 | ||
|
|
e3f523ab2a | ||
|
|
36485e56ed | ||
|
|
b4113360f6 | ||
|
|
2d71e22f08 | ||
|
|
2ae67c431c | ||
|
|
4b1a91b64f | ||
|
|
4f69318e12 | ||
|
|
1cc98ab50f | ||
|
|
a6494602fd | ||
|
|
50ec78b488 | ||
|
|
7d044d14f9 | ||
|
|
df03d5a8b2 | ||
|
|
6a0ed81e67 | ||
|
|
c94f3e8188 | ||
|
|
1e5f6cc1dc | ||
|
|
b1fece74e3 | ||
|
|
fdbe0df6e7 | ||
|
|
93d59520e4 | ||
|
|
b68d3a073b | ||
|
|
2100311f41 | ||
|
|
e1269e3156 | ||
|
|
c88d61b044 | ||
|
|
f49df54a36 | ||
|
|
952bbc4410 | ||
|
|
1eb4b85d72 | ||
|
|
59b6cb9e91 | ||
|
|
e06afaeb7a | ||
|
|
8c6f654b26 | ||
|
|
1d8212e53a | ||
|
|
083c5e17e1 | ||
|
|
272231fb09 | ||
|
|
67b4d9b232 | ||
|
|
21709e1557 | ||
|
|
9c312637d1 | ||
|
|
feacad7f68 | ||
|
|
6513303498 | ||
|
|
3e2a52b034 | ||
|
|
176d4e85e9 | ||
|
|
84d30dffb6 | ||
|
|
0fd282b078 | ||
|
|
cdf4afbe50 | ||
|
|
b222b2304e | ||
|
|
fdf9900114 | ||
|
|
5867eb2dd2 | ||
|
|
61f145e3de | ||
|
|
b97e7fc730 | ||
|
|
01cbf08064 | ||
|
|
fec632e948 | ||
|
|
6aab5b57e1 | ||
|
|
d2a27e02ce | ||
|
|
b55506a76d | ||
|
|
afc2aa2b3f | ||
|
|
d055b269ed | ||
|
|
8a246a4a9f | ||
|
|
2f684351bf | ||
|
|
74e5beab9d | ||
|
|
b41765f441 | ||
|
|
05a6013f42 | ||
|
|
cfff544d67 | ||
|
|
599d9642ca | ||
|
|
0264faaa4e | ||
|
|
4022a60ea7 | ||
|
|
39e366fc11 | ||
|
|
096675824f | ||
|
|
80bfa76ac9 | ||
|
|
b2e553a82e | ||
|
|
772b64d9d3 | ||
|
|
92c0de518e | ||
|
|
ff96456513 | ||
|
|
e89adbef51 | ||
|
|
22a6a6cf81 | ||
|
|
fd870e4e8a | ||
|
|
d52ed3fff2 | ||
|
|
bac17ab7d8 | ||
|
|
9ace303528 | ||
|
|
7e81c35cdc | ||
|
|
0f125d9bcf | ||
|
|
d4714517c0 | ||
|
|
280e4bf4c3 | ||
|
|
adf462fe05 | ||
|
|
c2862742ab | ||
|
|
8a712eb5af | ||
|
|
d58790af17 | ||
|
|
9ef7a13403 | ||
|
|
a5da1219bb | ||
|
|
be524fed38 | ||
|
|
042016b85e | ||
|
|
f6da574324 | ||
|
|
b09d5c3135 | ||
|
|
ec65c3fd53 | ||
|
|
7ca2f31c8d | ||
|
|
2275737a5d | ||
|
|
5e3836055f | ||
|
|
37a6a0bb3e | ||
|
|
6bcca3eca9 | ||
|
|
ce40b8d531 | ||
|
|
9f109b94b8 | ||
|
|
89024febde | ||
|
|
b7a673c6e2 | ||
|
|
7f68be770d | ||
|
|
4f173f35db | ||
|
|
ae9fbe573e | ||
|
|
29676f473d | ||
|
|
a5fcb26ab1 | ||
|
|
d68b1a1e8c | ||
|
|
bd8baed138 | ||
|
|
00a7dda273 | ||
|
|
4dba07c384 | ||
|
|
4d39c6b7cc | ||
|
|
7d6f6158c9 | ||
|
|
6863dbbc0c | ||
|
|
28b96efd8b | ||
|
|
0f82af0f49 | ||
|
|
f0d839436f | ||
|
|
f1aa4b4127 | ||
|
|
ccdb43f7f1 | ||
|
|
72900f0f90 | ||
|
|
3ad958ddb1 | ||
|
|
2c77cc90f4 | ||
|
|
db4c33b4fb | ||
|
|
3fb04115fc | ||
|
|
4faaa32aef | ||
|
|
cab59b4c32 | ||
|
|
931eff89f5 | ||
|
|
175335808b | ||
|
|
e00216581e | ||
|
|
23951ec00c | ||
|
|
a8fc5d0f9f | ||
|
|
f5e85bab1c | ||
|
|
9a44fa83dc | ||
|
|
6b1e54da62 | ||
|
|
b91421b107 | ||
|
|
43b3954fa5 | ||
|
|
80f2e3f263 | ||
|
|
9ea423b4c1 | ||
|
|
b259c9c535 | ||
|
|
80f481a5f7 | ||
|
|
115fe1b577 | ||
|
|
06d6ea651e | ||
|
|
966fa848a0 | ||
|
|
6f8fe67ace | ||
|
|
d49edc8e09 | ||
|
|
3b9c20fe31 | ||
|
|
bd72c5eacf | ||
|
|
9d152a77fd | ||
|
|
33dc28b905 | ||
|
|
43ce64dcca | ||
|
|
9e0882ba98 | ||
|
|
c890149c8c | ||
|
|
1a1ab2e2e8 | ||
|
|
715b706caa | ||
|
|
bfa9c42c25 | ||
|
|
9d98f97e1b | ||
|
|
5eb5ce6ff3 | ||
|
|
be9c873a6e | ||
|
|
034d80f6cd | ||
|
|
021e786c71 | ||
|
|
0c6bb8cb66 | ||
|
|
4d7f08a99e | ||
|
|
fdef584681 | ||
|
|
f335bac8a3 | ||
|
|
51369753bb | ||
|
|
82a4c2bce3 | ||
|
|
e73c6e039e | ||
|
|
19bad0844f | ||
|
|
96cec4dfd7 | ||
|
|
943aea6267 | ||
|
|
b433e4a1e7 | ||
|
|
20f1966c0e | ||
|
|
ab1f5c3edd | ||
|
|
b2be6799f2 | ||
|
|
ea2618fc6f | ||
|
|
62fdf8eaed | ||
|
|
d3569a3572 | ||
|
|
89df76e449 | ||
|
|
e5b2f33b4f | ||
|
|
934d312f50 | ||
|
|
68917eb517 | ||
|
|
3beb2f6b5d | ||
|
|
b29017f15b | ||
|
|
db83a0ebbc | ||
|
|
6d9fddb95d | ||
|
|
4284190cc4 | ||
|
|
5e4cbd2d24 | ||
|
|
06c3bec65d | ||
|
|
e8c3bb45ba | ||
|
|
4ec55a964d | ||
|
|
b9420864c0 | ||
|
|
bf6588b6a7 | ||
|
|
e43217e664 | ||
|
|
e19ee2d102 | ||
|
|
b4c53e2cfd | ||
|
|
a2902de67c | ||
|
|
da192f7955 | ||
|
|
a2210d23c3 | ||
|
|
bd5a622400 | ||
|
|
b9494cb0d6 | ||
|
|
0f73af4470 | ||
|
|
45e26b5c02 | ||
|
|
6af5ea38ce | ||
|
|
b6f0aa4394 | ||
|
|
774dab58f6 | ||
|
|
e3bdb98f7a | ||
|
|
58d628c9f8 | ||
|
|
1e69394545 | ||
|
|
1cf798ad14 | ||
|
|
da3992d2e9 | ||
|
|
48908e4633 | ||
|
|
f5ae149338 | ||
|
|
3fe5311967 | ||
|
|
6a48639c68 | ||
|
|
e7093b3ca8 | ||
|
|
d0a4104c0c | ||
|
|
90559bed53 | ||
|
|
973a18cf03 | ||
|
|
3c666ce57a | ||
|
|
a1287ec64f | ||
|
|
5fbfa1bfa8 | ||
|
|
da3ecc91f8 | ||
|
|
09c8f558f7 | ||
|
|
528a149def | ||
|
|
29e36afb6b | ||
|
|
0e39543d35 | ||
|
|
0de20d8ee6 | ||
|
|
cd5de5c0e5 | ||
|
|
bd5afc26bd | ||
|
|
9542dfdcdc | ||
|
|
97a6d7b1a8 | ||
|
|
209b9d4374 | ||
|
|
0b8ccd0ae7 | ||
|
|
0b7f5ad508 | ||
|
|
8a38805e82 | ||
|
|
836d88a4b8 | ||
|
|
d5268ed511 | ||
|
|
0e7d93858d | ||
|
|
2164d760b7 | ||
|
|
b9c8de598b | ||
|
|
9889a811db | ||
|
|
9e38d882b9 | ||
|
|
e8635044b5 | ||
|
|
56dea0ac9a | ||
|
|
e8b77477c7 | ||
|
|
64298e528d | ||
|
|
4f1465e7c7 | ||
|
|
6120041b69 | ||
|
|
8c1213627d | ||
|
|
3e6ae6eeb8 | ||
|
|
291e9aeabd | ||
|
|
a3d776187a | ||
|
|
e55f502e2f | ||
|
|
e369270f88 | ||
|
|
7e845e7cfd | ||
|
|
56d9624b56 | ||
|
|
911d135deb | ||
|
|
8107b90678 | ||
|
|
7722452b98 | ||
|
|
6e1a986e0f | ||
|
|
e0785ade35 | ||
|
|
0177ed6f03 | ||
|
|
c62635a3b5 | ||
|
|
0177476fd2 | ||
|
|
76d7dface7 | ||
|
|
982ba21460 | ||
|
|
6081c60556 | ||
|
|
2fe3c22108 | ||
|
|
75dbb3189a | ||
|
|
32330300a9 | ||
|
|
64414df27e | ||
|
|
f98ec86798 | ||
|
|
87bbd13899 | ||
|
|
51a4493add | ||
|
|
5effe8f336 | ||
|
|
296eb2bd61 | ||
|
|
9853acba66 | ||
|
|
09cb9c782d | ||
|
|
575ce905b2 | ||
|
|
54887af471 | ||
|
|
573350637e | ||
|
|
49a16f7121 | ||
|
|
a4773fcbbb | ||
|
|
1e038c4bc6 | ||
|
|
6ba19692a3 | ||
|
|
432dfe2b8f | ||
|
|
a142372750 | ||
|
|
f14195f786 | ||
|
|
9d54f9a6b7 | ||
|
|
ebb91191bf | ||
|
|
8742e294d4 | ||
|
|
8882d1fa1b | ||
|
|
0c37ab5255 | ||
|
|
747a05844d | ||
|
|
c7b7bf32f8 | ||
|
|
710ee3b0e0 | ||
|
|
7a8993892d | ||
|
|
5e16a77fa9 | ||
|
|
ef35519696 | ||
|
|
d5baaf7756 | ||
|
|
2a94387fc3 | ||
|
|
6a5c2b0fc3 | ||
|
|
fc281d6440 | ||
|
|
e22ac39da4 | ||
|
|
34cadb1e54 | ||
|
|
94692b904e | ||
|
|
18f3087afd | ||
|
|
15bc228ae9 | ||
|
|
2b7a38d032 | ||
|
|
90e1a6905a | ||
|
|
c36af24cbd | ||
|
|
a676c18502 | ||
|
|
362912ff83 | ||
|
|
46ff13f243 | ||
|
|
340a67a6f8 | ||
|
|
9294c1e76c | ||
|
|
fd704f8de0 | ||
|
|
d9ca9154d1 | ||
|
|
35110eca73 | ||
|
|
9ad92b3007 | ||
|
|
2f78c96330 | ||
|
|
639857ceb2 | ||
|
|
162f58c53c | ||
|
|
84c4d96e71 | ||
|
|
c0d343d56d | ||
|
|
6d14a80608 | ||
|
|
f451bb7c49 | ||
|
|
20b17d6b04 | ||
|
|
bb2317b63c | ||
|
|
189461dc98 | ||
|
|
69af552bc1 | ||
|
|
0ae6ff9f72 | ||
|
|
8b571fbbb1 | ||
|
|
f3fcd409d5 | ||
|
|
a47532f88a | ||
|
|
6c157a404b | ||
|
|
4f8a49143d | ||
|
|
493d6033aa | ||
|
|
8f219af884 | ||
|
|
aeb04136f7 | ||
|
|
0b8f57bf06 | ||
|
|
6508d446e1 | ||
|
|
82cb462bb4 | ||
|
|
9a264bf610 | ||
|
|
57007e80a9 | ||
|
|
b6c876bdb6 | ||
|
|
57afae79eb | ||
|
|
84c2184909 | ||
|
|
e358a24a75 | ||
|
|
9da9d00c62 | ||
|
|
ec3f269d1f | ||
|
|
1c388a52a5 | ||
|
|
34a827bbfe | ||
|
|
726b9e2240 | ||
|
|
2236ba0d20 | ||
|
|
463c0f7096 | ||
|
|
e49a7e361c | ||
|
|
6e87cf5b30 | ||
|
|
5872e8dd7e | ||
|
|
e81d4ac8c8 | ||
|
|
4922904991 | ||
|
|
decae2dcda | ||
|
|
16bbd13af7 | ||
|
|
ee0666c8df | ||
|
|
a8a8ae2e92 | ||
|
|
fd1148a728 | ||
|
|
74c7b41ee7 | ||
|
|
465e19dbe9 | ||
|
|
86660c73e5 | ||
|
|
6d8a208df2 | ||
|
|
c3a826fdce | ||
|
|
c5d6a42abf | ||
|
|
d49c144297 | ||
|
|
e7de7d5eb3 | ||
|
|
20005a83d2 | ||
|
|
27926030f9 | ||
|
|
701de67b79 | ||
|
|
883479f01e | ||
|
|
b37a0b0512 | ||
|
|
5c5d5270d2 | ||
|
|
36461fb2aa | ||
|
|
d8dcd5e472 | ||
|
|
c51b46c982 | ||
|
|
b1b63c1dd1 | ||
|
|
30c93d66eb | ||
|
|
3b60bb7259 | ||
|
|
c73f8e835f | ||
|
|
93558c4299 | ||
|
|
396cff5779 | ||
|
|
336154e729 | ||
|
|
bb0aba34fa | ||
|
|
1dc0ce9562 | ||
|
|
e4aee168b5 | ||
|
|
2c10c895da | ||
|
|
c04fae3096 | ||
|
|
a214af0830 | ||
|
|
f21bc46e82 | ||
|
|
044327a488 | ||
|
|
c4bbcc83b6 | ||
|
|
eb162b73c2 | ||
|
|
29aafb9cea | ||
|
|
40eb7d0d48 | ||
|
|
1dcb2b7e65 | ||
|
|
5470b9aa73 | ||
|
|
050bd7dd0b | ||
|
|
f75038634f | ||
|
|
300b4a9158 | ||
|
|
52071f3476 | ||
|
|
42ddd745f8 | ||
|
|
a7846189cd | ||
|
|
4762995d1f | ||
|
|
e3a530eb61 | ||
|
|
d1235ff058 | ||
|
|
4370e92dbd | ||
|
|
50e9522a06 | ||
|
|
b5bb9aa8e3 | ||
|
|
cf2e365f23 | ||
|
|
72e532cb67 | ||
|
|
ac5635f77d | ||
|
|
640d67c119 | ||
|
|
3e79693e3b | ||
|
|
d55d3c2fd0 | ||
|
|
3aced17c75 | ||
|
|
bac63914db | ||
|
|
6a63c51f7c | ||
|
|
632cf13767 | ||
|
|
e7012a515c | ||
|
|
6b638af92f | ||
|
|
c654b79c53 | ||
|
|
bee7b874ea | ||
|
|
9c3fc592f7 | ||
|
|
4eab7a1ebc | ||
|
|
3d985688e4 | ||
|
|
17ea2631cd | ||
|
|
b749910e6c | ||
|
|
eff36caea8 | ||
|
|
6ff092f140 | ||
|
|
28bb36e53d | ||
|
|
4a091bbd8a | ||
|
|
e99a6b813e | ||
|
|
b9e5302f27 | ||
|
|
dd7b6aef39 | ||
|
|
910b8b6a69 | ||
|
|
c3207e215f | ||
|
|
f83be11b85 | ||
|
|
45bce1062a | ||
|
|
8cb344bf3c | ||
|
|
fcc4518cdc | ||
|
|
c84839eb91 | ||
|
|
1f878aee69 | ||
|
|
84fd4686e2 | ||
|
|
ede9fb4fcc | ||
|
|
723aef71e8 | ||
|
|
48964a911e | ||
|
|
6a35cb60fd | ||
|
|
1e51c3a832 | ||
|
|
205dda2b39 | ||
|
|
1c18d19da0 | ||
|
|
645729e943 | ||
|
|
f425a25c98 | ||
|
|
aaace2e802 | ||
|
|
3f16d9fbc9 | ||
|
|
3afc57bab8 | ||
|
|
55225106b6 | ||
|
|
1a31bff9fe | ||
|
|
4eaa3329ec | ||
|
|
028d78b993 | ||
|
|
944af98be6 | ||
|
|
2789b2b0ad | ||
|
|
7dded571de | ||
|
|
95fe8372e8 | ||
|
|
ecdcb0ef67 | ||
|
|
6a04a03eb5 | ||
|
|
0c96056a94 | ||
|
|
f518a5e231 | ||
|
|
f581c1062e | ||
|
|
0b3deceea3 | ||
|
|
fa4cd8868c | ||
|
|
8c573ca7f3 | ||
|
|
5a5cf3a51d | ||
|
|
3f23e8443e | ||
|
|
a00f9b093c | ||
|
|
5f538ce3f8 | ||
|
|
ebcaa3d579 | ||
|
|
60e26199a2 | ||
|
|
11defd180c | ||
|
|
c82c1691ee | ||
|
|
364562f209 | ||
|
|
5d9fc28fa7 | ||
|
|
e5ec5c284f | ||
|
|
a90e33ad71 | ||
|
|
62ab21ce7d | ||
|
|
cc8e8db1e5 | ||
|
|
b19cba2016 | ||
|
|
315a9c95d5 | ||
|
|
e010ac9706 | ||
|
|
e4c0a85da0 | ||
|
|
d3e4cdd5b0 | ||
|
|
763b812dc7 | ||
|
|
3269dfb4ab | ||
|
|
e816bd259f | ||
|
|
a295408e09 | ||
|
|
42a34c7cd7 | ||
|
|
9a72751958 | ||
|
|
314e6fa80b | ||
|
|
b2b66f749a | ||
|
|
708ed6fded | ||
|
|
5c30fa50d6 | ||
|
|
fc33c424d9 | ||
|
|
b04d6dd0b1 | ||
|
|
9c5f79c56a | ||
|
|
ef5eea689a | ||
|
|
fd191deb49 | ||
|
|
e1da1ff7d3 | ||
|
|
2b00ed7ef8 | ||
|
|
d960ea959d | ||
|
|
274842ec41 | ||
|
|
c06da7c84a | ||
|
|
cea117b509 | ||
|
|
6078c938b2 | ||
|
|
9e95dd4821 | ||
|
|
0cc8b57d4f | ||
|
|
2179e6e797 | ||
|
|
7dde3d1825 | ||
|
|
a0fe950b75 | ||
|
|
44985e8884 | ||
|
|
f03366bcbf | ||
|
|
d43ea83033 | ||
|
|
11bdba0007 | ||
|
|
07e58aaa79 | ||
|
|
a31ddd363b | ||
|
|
ed9e10f2d8 | ||
|
|
02ae3c2810 | ||
|
|
669ebb5f71 | ||
|
|
9a3e0e52cb | ||
|
|
b0f856213d | ||
|
|
6f4ff1f2bf | ||
|
|
d3eea61f1f | ||
|
|
d59d81fae8 | ||
|
|
329ca40b6f | ||
|
|
e71bd416f4 | ||
|
|
ad66fc6cc2 | ||
|
|
d12b44204b | ||
|
|
4be2136de4 | ||
|
|
c4dbed040b | ||
|
|
366b62af2d | ||
|
|
a6955aa486 | ||
|
|
ad30341fa2 | ||
|
|
23da55a9f1 | ||
|
|
41e6292e7b | ||
|
|
ae1d6f29d9 | ||
|
|
ccfc1ddbef | ||
|
|
002de1eae2 | ||
|
|
63621bae81 | ||
|
|
85f9e6c4b9 | ||
|
|
967ec296c0 | ||
|
|
c6aae9b1d7 | ||
|
|
913c370c25 | ||
|
|
e5472bbd21 | ||
|
|
957c258c6d | ||
|
|
abee109cd1 | ||
|
|
502e5ae6e1 | ||
|
|
b8417be1f2 | ||
|
|
9e037431b4 | ||
|
|
f71b3676bb | ||
|
|
50fe7b5e35 | ||
|
|
9fb253388b | ||
|
|
8cf1786296 | ||
|
|
51b17b299c | ||
|
|
78882e4642 | ||
|
|
8465a367a4 | ||
|
|
3bcfe678ab | ||
|
|
d5403f3a5b | ||
|
|
26abb48533 | ||
|
|
177848ed27 | ||
|
|
656a2e93d7 | ||
|
|
6b1220b61d | ||
|
|
9d7330d879 | ||
|
|
26a5954fa0 | ||
|
|
01165e08e0 | ||
|
|
6e1633a6c5 | ||
|
|
a8ff0a21bf | ||
|
|
b8bc6bed97 | ||
|
|
1a4402038c | ||
|
|
5ac51cc9b5 | ||
|
|
c12159ce21 | ||
|
|
4485503ecc | ||
|
|
200ac588cc | ||
|
|
0bb040822d | ||
|
|
543fbe14ee | ||
|
|
e02ab66120 | ||
|
|
76c7c694c5 | ||
|
|
f0057977b7 | ||
|
|
e8e43f06af | ||
|
|
04b35e86d5 | ||
|
|
64ab85da4f | ||
|
|
b8d7a13ea3 | ||
|
|
78a76dc905 | ||
|
|
5fa5fff0e9 | ||
|
|
d323b3d816 | ||
|
|
b685b5672a | ||
|
|
8f6c2f87c8 | ||
|
|
f30e8b11eb | ||
|
|
8bd6d6a4de | ||
|
|
b3a8f438fc | ||
|
|
e78ddf0a95 | ||
|
|
5f0366c2cb | ||
|
|
779ca09775 | ||
|
|
313f1a1e83 | ||
|
|
21337f4776 | ||
|
|
53a8e5655b | ||
|
|
2d85585ae1 | ||
|
|
63d109f7be | ||
|
|
c904b6b5bf | ||
|
|
6a27449922 | ||
|
|
9a9c07f571 | ||
|
|
4382204e1b | ||
|
|
6d3114efe2 | ||
|
|
b62baaed95 | ||
|
|
9b391e531b | ||
|
|
a0c7a6d22b | ||
|
|
14424f7058 | ||
|
|
6063dff8d0 | ||
|
|
7fba9ed398 | ||
|
|
53280a196b | ||
|
|
0bf9a5704b | ||
|
|
8182d17ae1 | ||
|
|
69b1ac7dcd | ||
|
|
b15507aac3 | ||
|
|
6c2f583f51 | ||
|
|
a72eaddda3 | ||
|
|
dc050e45df | ||
|
|
2fcbf13920 | ||
|
|
099ae31523 | ||
|
|
c2fcdf3a02 | ||
|
|
2056a538b9 | ||
|
|
cd1144dc24 | ||
|
|
e9d068b913 | ||
|
|
ec2ad57c32 | ||
|
|
316adac511 | ||
|
|
d7b11d4c33 | ||
|
|
c52aa6df33 | ||
|
|
a19b23b59f | ||
|
|
4e26b2a65b | ||
|
|
7c4feac6db | ||
|
|
e01e364c37 | ||
|
|
c13a3d7b84 | ||
|
|
67805b6dc5 | ||
|
|
0050ab2a3d | ||
|
|
60e66c6cbf | ||
|
|
5ad2a253e8 | ||
|
|
b5d50e9298 | ||
|
|
37f7362aca | ||
|
|
bee198def5 | ||
|
|
f09e479fd6 | ||
|
|
80fe93bc33 | ||
|
|
ea03ad3bee | ||
|
|
feec421744 | ||
|
|
634982840e | ||
|
|
fb3c85ab2f | ||
|
|
a9b7c3531c | ||
|
|
a7ba0d908d | ||
|
|
2fc70e2c5d | ||
|
|
7ae3f0e70c | ||
|
|
9afaa51e3f | ||
|
|
c736a719f1 | ||
|
|
37a547842b | ||
|
|
b9f1d43921 | ||
|
|
bec6423c02 | ||
|
|
241b2b4ae3 | ||
|
|
14d9b56937 | ||
|
|
1c3766eb46 | ||
|
|
70024d61eb | ||
|
|
2085f133d6 | ||
|
|
2a045dfceb | ||
|
|
893cbaaf2f | ||
|
|
6e61939382 | ||
|
|
015a618172 | ||
|
|
2a8b91cdb9 | ||
|
|
bebd5dbc5a | ||
|
|
018dbfe058 | ||
|
|
c6ea597817 | ||
|
|
175b00c0a2 | ||
|
|
5ebc6e305e | ||
|
|
993600761f | ||
|
|
1d9fff80b7 | ||
|
|
c712b84dd5 | ||
|
|
dcf8dd4b5e | ||
|
|
ba26c3fb22 | ||
|
|
41563607a8 | ||
|
|
2d4dcfb740 | ||
|
|
34854e70cf | ||
|
|
758d9fe852 | ||
|
|
6a6c0e7a73 | ||
|
|
ee44eec3e1 | ||
|
|
eccd0d8e37 | ||
|
|
983be0ec60 | ||
|
|
243a45d840 | ||
|
|
60ec804047 | ||
|
|
c53e9ccf4a | ||
|
|
6e8e0418fc | ||
|
|
e9eb52305f | ||
|
|
8501ae748c | ||
|
|
da59692067 | ||
|
|
bae77c0a46 | ||
|
|
b42bc7329e | ||
|
|
9b3c2b6ae2 | ||
|
|
833b6df969 | ||
|
|
0b45431139 | ||
|
|
5d1349031c | ||
|
|
82388a5e4c | ||
|
|
74816fed6c | ||
|
|
b4c9789d5f | ||
|
|
f96fadc074 | ||
|
|
f6b1173437 | ||
|
|
346992c366 | ||
|
|
ab4086bc24 | ||
|
|
d8e7f2b2c7 | ||
|
|
93fcb94b62 | ||
|
|
32a446cf19 | ||
|
|
94459cab98 | ||
|
|
158588640a | ||
|
|
f00f050d1b | ||
|
|
c4f34c60a5 | ||
|
|
371ef80dc3 | ||
|
|
84b4e9ff7c | ||
|
|
677a74fa1b | ||
|
|
8a076d1dba | ||
|
|
970722483c | ||
|
|
31443724c6 | ||
|
|
0e7614919b | ||
|
|
2bf72937d2 | ||
|
|
4e555c7b32 | ||
|
|
bd7021d05b | ||
|
|
1a14555605 | ||
|
|
cb3fb371ea | ||
|
|
6c6dda1b74 | ||
|
|
a712808006 | ||
|
|
e19c203728 | ||
|
|
8817779f23 | ||
|
|
3e5a32671c | ||
|
|
d34f32b39e | ||
|
|
c85a77e0b1 | ||
|
|
9406e517e6 | ||
|
|
4a56049225 | ||
|
|
04ea4b4d75 | ||
|
|
5b6b6283f3 | ||
|
|
38f07ce0fb | ||
|
|
987cdebefb | ||
|
|
6b978db369 | ||
|
|
5840c8cb70 | ||
|
|
44f2024bab | ||
|
|
410942e9df | ||
|
|
5b3730feae | ||
|
|
38f797ccd6 | ||
|
|
553c5a7501 | ||
|
|
bbba9d568f | ||
|
|
11e43dd021 | ||
|
|
e8ddf84871 | ||
|
|
67f04d2d5f | ||
|
|
8f646eef45 | ||
|
|
d26e932858 | ||
|
|
73b9d0840c | ||
|
|
2ea4326c40 | ||
|
|
8b80ac2877 | ||
|
|
233237740d | ||
|
|
f5cdac38bd | ||
|
|
760565dcad | ||
|
|
b5d97b3d94 | ||
|
|
4a6cc54eb5 | ||
|
|
61133545f6 | ||
|
|
bf87d13f5b | ||
|
|
efaf688650 | ||
|
|
9a5c21c16f | ||
|
|
06ffb47ef2 | ||
|
|
1acbda97e0 | ||
|
|
d6460aff36 | ||
|
|
a357f77c4c | ||
|
|
d5bdd2b2f9 | ||
|
|
562d2de303 | ||
|
|
1f68fa19c7 | ||
|
|
677ddd6160 | ||
|
|
228e627475 | ||
|
|
ec4e653c6f | ||
|
|
3916d1e6cb | ||
|
|
387aaba810 | ||
|
|
9f3d9da119 | ||
|
|
76c24a0d82 | ||
|
|
ffd65a1956 | ||
|
|
de8947f92f | ||
|
|
d2b4dedbe4 | ||
|
|
34865ffb4a | ||
|
|
62970da675 | ||
|
|
8ed31c48e0 | ||
|
|
13d40e33a4 | ||
|
|
c765213aaa | ||
|
|
983bf93a24 | ||
|
|
2f8085af15 | ||
|
|
88a4dc2795 | ||
|
|
b5112096d7 | ||
|
|
fc80c714e8 | ||
|
|
84bc23b92f | ||
|
|
d90472dd64 | ||
|
|
3b63ed8230 | ||
|
|
e75441e027 | ||
|
|
0ae8b51230 | ||
|
|
547c136b4f | ||
|
|
4ed13bde55 | ||
|
|
80e01deba0 | ||
|
|
fb9ae9d0e2 | ||
|
|
dd54d8551b | ||
|
|
205f8b266c | ||
|
|
c4ce9ac4de | ||
|
|
0e4e28fdda | ||
|
|
db2370a12f | ||
|
|
d1d35ba85f | ||
|
|
2ab2e7675c | ||
|
|
0472629222 | ||
|
|
c4f7570a23 | ||
|
|
d26cfd5791 | ||
|
|
b7ffc6bb45 | ||
|
|
8a96aec567 | ||
|
|
5cd9f57137 | ||
|
|
702664e959 | ||
|
|
18d87edd6d | ||
|
|
dc59795629 | ||
|
|
cb9bb31f7d | ||
|
|
02706bec94 | ||
|
|
7657186bf6 | ||
|
|
42ac24448c | ||
|
|
31891b55a4 | ||
|
|
aa47ac4c06 | ||
|
|
b01151e81c | ||
|
|
67bd6f9ccd | ||
|
|
4869fa285b | ||
|
|
d221e01406 | ||
|
|
874fc8228a | ||
|
|
6f752c64bc | ||
|
|
ccb7950c4c | ||
|
|
750e771376 | ||
|
|
7012a4a291 | ||
|
|
40ab20a252 | ||
|
|
6af315e50c | ||
|
|
861b5e608b | ||
|
|
f61917594e | ||
|
|
0ddab51ad8 | ||
|
|
9798432f56 | ||
|
|
5faf52619d | ||
|
|
f8b4ba80e0 | ||
|
|
527f70e540 | ||
|
|
19f66c7575 | ||
|
|
b7721deb02 | ||
|
|
5ba188ab2d | ||
|
|
eadfd78c2e | ||
|
|
4d815c9990 | ||
|
|
176981b529 | ||
|
|
85baebd0d4 | ||
|
|
ac022b2e30 | ||
|
|
f169b750b8 | ||
|
|
86295eef13 | ||
|
|
32d60b2714 | ||
|
|
0a3065a2f2 | ||
|
|
b98faaa8c0 | ||
|
|
73772323c9 | ||
|
|
98389066e2 | ||
|
|
fb53ed4c1f | ||
|
|
e719eb5b81 | ||
|
|
3858063bcd | ||
|
|
d4f5fea840 | ||
|
|
22c1d48cb2 | ||
|
|
e7cefd684b | ||
|
|
d2485e4f20 | ||
|
|
160d6b26b0 | ||
|
|
17d61e4f29 | ||
|
|
446b9467da | ||
|
|
3970a7056c | ||
|
|
74068a6d1b | ||
|
|
8c83422fe2 | ||
|
|
61a1e3cd01 | ||
|
|
89cac6f25c | ||
|
|
62082293c5 | ||
|
|
153fd2752c | ||
|
|
e649a40f5d | ||
|
|
32d76a5b57 | ||
|
|
14aa3fa258 | ||
|
|
f5394cccb1 | ||
|
|
64dd9c7656 | ||
|
|
16ae0c6466 | ||
|
|
6a2e21ec8c | ||
|
|
120f17ce04 | ||
|
|
ab938bb9bd | ||
|
|
33820cd2ac | ||
|
|
41def21f91 | ||
|
|
d118312922 | ||
|
|
82b93e4945 | ||
|
|
e36fb1ecda | ||
|
|
e4a1788614 | ||
|
|
7b23eff9cf | ||
|
|
67ff8e3ea3 | ||
|
|
2248599ae1 | ||
|
|
29350b363b | ||
|
|
83c470a443 | ||
|
|
ab96e2d6e9 | ||
|
|
6b81cf4bc9 | ||
|
|
0d9301539e |
@@ -12,3 +12,4 @@ depcomp
|
|||||||
config.guess
|
config.guess
|
||||||
config.sub
|
config.sub
|
||||||
ltmain.sh
|
ltmain.sh
|
||||||
|
libcurl.pc
|
||||||
|
|||||||
1994
CHANGES.2004
Normal file
1994
CHANGES.2004
Normal file
File diff suppressed because it is too large
Load Diff
2
COPYING
2
COPYING
@@ -1,6 +1,6 @@
|
|||||||
COPYRIGHT AND PERMISSION NOTICE
|
COPYRIGHT AND PERMISSION NOTICE
|
||||||
|
|
||||||
Copyright (c) 1996 - 2004, Daniel Stenberg, <daniel@haxx.se>.
|
Copyright (c) 1996 - 2006, Daniel Stenberg, <daniel@haxx.se>.
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|||||||
16
Makefile.am
16
Makefile.am
@@ -5,7 +5,7 @@
|
|||||||
# | (__| |_| | _ <| |___
|
# | (__| |_| | _ <| |___
|
||||||
# \___|\___/|_| \_\_____|
|
# \___|\___/|_| \_\_____|
|
||||||
#
|
#
|
||||||
# Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
|
# Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
#
|
#
|
||||||
# This software is licensed as described in the file COPYING, which
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -31,6 +31,9 @@ bin_SCRIPTS = curl-config
|
|||||||
SUBDIRS = lib src
|
SUBDIRS = lib src
|
||||||
DIST_SUBDIRS = $(SUBDIRS) tests include packages docs
|
DIST_SUBDIRS = $(SUBDIRS) tests include packages docs
|
||||||
|
|
||||||
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
pkgconfig_DATA = libcurl.pc
|
||||||
|
|
||||||
dist-hook:
|
dist-hook:
|
||||||
rm -rf $(top_builddir)/tests/log
|
rm -rf $(top_builddir)/tests/log
|
||||||
find $(distdir) -name "*.dist" -exec rm {} \;
|
find $(distdir) -name "*.dist" -exec rm {} \;
|
||||||
@@ -48,6 +51,15 @@ pdf:
|
|||||||
|
|
||||||
check: test
|
check: test
|
||||||
|
|
||||||
|
if CROSSCOMPILING
|
||||||
|
test-full: test
|
||||||
|
test-torture: test
|
||||||
|
|
||||||
|
test:
|
||||||
|
@echo "NOTICE: we can't run the tests when cross-compiling!"
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
test:
|
test:
|
||||||
@(cd tests; $(MAKE) all quiet-test)
|
@(cd tests; $(MAKE) all quiet-test)
|
||||||
|
|
||||||
@@ -57,6 +69,8 @@ test-full:
|
|||||||
test-torture:
|
test-torture:
|
||||||
@(cd tests; $(MAKE) all torture-test)
|
@(cd tests; $(MAKE) all torture-test)
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
#
|
#
|
||||||
# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros
|
# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros
|
||||||
# must contain the following line:
|
# must contain the following line:
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
# | (__| |_| | _ <| |___
|
# | (__| |_| | _ <| |___
|
||||||
# \___|\___/|_| \_\_____|
|
# \___|\___/|_| \_\_____|
|
||||||
#
|
#
|
||||||
# Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
|
# Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
#
|
#
|
||||||
# This software is licensed as described in the file COPYING, which
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -174,6 +174,12 @@ vc-zlib-dll:
|
|||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6 cfg=release-zlib-dll
|
nmake /f Makefile.vc6 cfg=release-zlib-dll
|
||||||
|
|
||||||
|
vc-sspi:
|
||||||
|
cd lib
|
||||||
|
nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1
|
||||||
|
cd ..\src
|
||||||
|
nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1
|
||||||
|
|
||||||
djgpp:
|
djgpp:
|
||||||
$(MAKE) -C lib -f Makefile.dj
|
$(MAKE) -C lib -f Makefile.dj
|
||||||
$(MAKE) -C src -f Makefile.dj
|
$(MAKE) -C src -f Makefile.dj
|
||||||
@@ -194,9 +200,21 @@ netware:
|
|||||||
$(MAKE) -C lib -f Makefile.netware
|
$(MAKE) -C lib -f Makefile.netware
|
||||||
$(MAKE) -C src -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:
|
netware-ssl:
|
||||||
$(MAKE) -C lib -f Makefile.netware SSL=1
|
$(MAKE) -C lib -f Makefile.netware WITH_SSL=1
|
||||||
$(MAKE) -C src -f Makefile.netware 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-zlib:
|
||||||
|
$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1
|
||||||
|
$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1
|
||||||
|
|
||||||
netware-clean:
|
netware-clean:
|
||||||
$(MAKE) -C lib -f Makefile.netware clean
|
$(MAKE) -C lib -f Makefile.netware clean
|
||||||
|
|||||||
71
README
71
README
@@ -26,50 +26,41 @@ CONTACT
|
|||||||
If you have problems, questions, ideas or suggestions, please contact us
|
If you have problems, questions, ideas or suggestions, please contact us
|
||||||
by posting to a suitable mailing list. See http://curl.haxx.se/mail/
|
by posting to a suitable mailing list. See http://curl.haxx.se/mail/
|
||||||
|
|
||||||
Many major contributors to the project are listed in the THANKS document.
|
All contributors to the project are listed in the THANKS document.
|
||||||
|
|
||||||
WEB SITE
|
WEB SITE
|
||||||
|
|
||||||
Visit the curl web site or mirrors for the latest news:
|
Visit the curl web site or mirrors for the latest news and downloads:
|
||||||
|
|
||||||
Sweden -- http://curl.haxx.se/
|
Sweden http://curl.haxx.se/
|
||||||
Australia -- http://curl.planetmirror.com/
|
Australia http://curl.planetmirror.com/
|
||||||
Austria -- http://curl.gds.tuwien.ac.at/
|
Austria http://curl.gds.tuwien.ac.at/
|
||||||
Denmark -- http://curl.cofman.dk/
|
Denmark http://curl.cofman.dk/
|
||||||
Estonia -- http://curl.wildyou.net/
|
France http://curl.fastmirror.net/
|
||||||
France -- http://curl.mirror.internet.tp/
|
Germany http://curl.freemirror.de/
|
||||||
Germany -- http://curl.kgt.org/
|
Germany http://curl.mirror-server.net/
|
||||||
Germany -- http://curl.mirror.at.stealer.net/
|
Germany http://curl.mirror.at.stealer.net/
|
||||||
Germany -- http://curl.netmirror.org/
|
Germany http://curl.mirroring.de/
|
||||||
Russia -- http://curl.tsuren.net/
|
Germany http://curl.miscellaneousmirror.org/
|
||||||
Taiwan -- http://curl.cs.pu.edu.tw/
|
Germany http://curl.mons-new-media.de/
|
||||||
Thailand -- http://curl.siamu.ac.th/
|
Germany http://curl.storemypix.com/
|
||||||
US (CA) -- http://curl.mirror.redwire.net/
|
Germany http://curl.triplemind.com/
|
||||||
US (CA) -- http://curl.mirrormonster.com/
|
Hong Kong http://curl.hkmirror.org/
|
||||||
US (CA) -- http://curl.signal42.com/
|
Japan http://curl.s-lines.net/
|
||||||
US (TX) -- http://curl.109k.com/
|
Netherlands http://curl.nedmirror.nl/
|
||||||
|
Russia http://curl.tsuren.net/
|
||||||
DOWNLOAD
|
Taiwan http://curl.cs.pu.edu.tw/
|
||||||
|
Thailand http://curl.siamu.ac.th/
|
||||||
The official download mirror sites are:
|
US (AZ) http://curl.islandofpoker.com/
|
||||||
|
US (CA) http://curl.meulie.net/
|
||||||
Australia -- http://curl.planetmirror.com/download.html
|
US (CA) http://curl.mirror.redwire.net/
|
||||||
Austria -- http://curl.gds.tuwien.ac.at/download.html
|
US (CA) http://curl.mirrormonster.com/
|
||||||
Estonia -- http://curl.wildyou.net/download.html
|
US (CA) http://curl.signal42.com/
|
||||||
Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
|
US (FL) http://curl.hoxt.com/
|
||||||
Germany -- http://curl.mirror.at.stealer.net/download.html
|
US (TX) http://curl.109k.com/
|
||||||
Germany -- http://curl.netmirror.org/download.html
|
US (TX) http://curl.hostingzero.com/
|
||||||
Germany -- http://www.mirrorspace.org/curl/
|
US (TX) http://curl.mirrors.cyberservers.net/
|
||||||
Hongkong -- http://www.execve.net/curl/
|
US (TX) http://curl.seekmeup.com/
|
||||||
Russia -- http://curl.tsuren.net/download.html
|
|
||||||
Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/
|
|
||||||
Sweden -- http://cool.haxx.se/curl/
|
|
||||||
Taiwan -- http://curl.cs.pu.edu.tw/download.html
|
|
||||||
Thailand -- http://curl.siamu.ac.th/download.html
|
|
||||||
US (CA) -- http://curl.mirror.redwire.net/download.html
|
|
||||||
US (CA) -- http://curl.mirrormonster.com/download.html
|
|
||||||
US (CA) -- http://curl.signal42.com/download.html
|
|
||||||
US (TX) -- http://curl.109k.com/download.html
|
|
||||||
|
|
||||||
CVS
|
CVS
|
||||||
|
|
||||||
|
|||||||
@@ -1,60 +1,40 @@
|
|||||||
Curl and libcurl 7.13.0
|
Curl and libcurl 7.15.3
|
||||||
|
|
||||||
Public curl release number: 85
|
Public curl release number: 93
|
||||||
Releases counted from the very beginning: 112
|
Releases counted from the very beginning: 120
|
||||||
Available command line options: 104
|
Available command line options: 112
|
||||||
Available curl_easy_setopt() options: 122
|
Available curl_easy_setopt() options: 129
|
||||||
Number of public functions in libcurl: 46
|
Number of public functions in libcurl: 46
|
||||||
Amount of public web site mirrors: 15
|
Amount of public web site mirrors: 31
|
||||||
Number of known libcurl bindings: 29
|
Number of known libcurl bindings: 32
|
||||||
|
Number of contributors: 487
|
||||||
|
|
||||||
This release includes the following changes:
|
This release includes the following changes:
|
||||||
|
|
||||||
o added --ftp-account and CURLOPT_FTP_ACCOUNT
|
o added docs for --ftp-method and CURLOPT_FTP_FILEMETHOD
|
||||||
o added CURLOPT_SOURCE_URL and CURLOPT_SOURCE_QUOTE
|
|
||||||
o obsoleted CURLOPT_SOURCE_HOST, CURLOPT_SOURCE_PATH, CURLOPT_SOURCE_PORT
|
|
||||||
and CURLOPT_PASV_HOST
|
|
||||||
o added --3p-url, --3p-user and --3p-quote
|
|
||||||
o -Q "+[command]" was added
|
|
||||||
o src/getpass.c license issue sorted (code was rewritten)
|
|
||||||
o curl -w now supports 'http_connect' for the proxy's response to CONNECT
|
|
||||||
o introducing "curl-config --protocols"
|
|
||||||
|
|
||||||
This release includes the following bugfixes:
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
o re-sending a request when retrying on a fresh connection with multi
|
o TFTP Packet Buffer Overflow Vulnerability:
|
||||||
interface
|
http://curl.haxx.se/docs/adv_20060320.html
|
||||||
o improved valgrind report parser in the test suite
|
o properly detecting problems with sending the FTP command USER
|
||||||
o several valgrind reports
|
o wrong error message shown when certificate verification failed
|
||||||
o CURLOPT_FTPPORT and -P work when built ipv6-enabled
|
o multi-part formpost with multi interface crash
|
||||||
o FTP third party transfers was much improved
|
o the CURLFTPSSL_CONTROL setting for CURLOPT_FTP_SSL is acknowledged
|
||||||
o proxy environment variables are now ignored when built HTTP-disabled
|
o "SSL: couldn't set callback" is now treated as a less serious problem
|
||||||
o CURLOPT_PROXY can now disable HTTP proxy even when built HTTP-disabled
|
o Interix build fix
|
||||||
o "curl dictionary.com" no longer assumes DICT protocol
|
o fixed curl "hang" when out of file handles at start
|
||||||
o re-invoke some system calls on EINTR
|
o prevent FTP uploads to URLs with trailing slash
|
||||||
o duplicate Host: when failed connection re-use
|
|
||||||
o SOCKS5 version check
|
|
||||||
o memory problem with cleaning up multi interface
|
|
||||||
o SSL certificate name memory leak
|
|
||||||
o -d with -G to multiple URLs crashed
|
|
||||||
o double va_list access crash fixed
|
|
||||||
o minor memory leak when "version" is set in a cookie header
|
|
||||||
o builds fine on BeOS and NetBSD
|
|
||||||
o builds and runs fine on FreeBSD
|
|
||||||
|
|
||||||
Other curl-related news since the previous public release:
|
Other curl-related news since the previous public release:
|
||||||
|
|
||||||
o cURLpp 0.3.2 - https://rrette.com/curlpp.html
|
o pycurl-7.15.2 has been released: http://pycurl.sf.net
|
||||||
o pycURL 7.12.3 - http://pycurl.sourceforge.net/
|
o http://curl.download.nextag.com/ is a new US curl web mirror!
|
||||||
o new web mirror: http://curl.mirrormonster.com/ (US, California)
|
|
||||||
|
|
||||||
This release would not have looked like this without help, code, reports and
|
This release would not have looked like this without help, code, reports and
|
||||||
advice from friends like these:
|
advice from friends like these:
|
||||||
|
|
||||||
Dan Fandrich, Peter Pentchev, Marcin Konicki, Rune Kleveland, David Shaw,
|
Gisle Vanem, Dan Fandrich, Thomas Klausner, Todd Vierling, Peter Heuchert,
|
||||||
Werner Koch, Gisle Vanem, Alex Neblett, Kai Sommerfeld, Marty Kuhrt,
|
Markus Koetter, David McCreedy, Tor Arntsen
|
||||||
Hzhijun, Pavel Orehov, Bruce Mitchener, Cyrill Osterwalder, Dan Torop,
|
|
||||||
Martijn Koster, Alex aka WindEagle, Cody Jones, Samuel D<>az Garc<72>a,
|
|
||||||
Stephan Bergmann, Philippe Hameau, Ian Ford, Stephen More, Lars Nilsson
|
|
||||||
|
|
||||||
Thanks! (and sorry if I forgot to mention someone)
|
Thanks! (and sorry if I forgot to mention someone)
|
||||||
|
|||||||
36
TODO-RELEASE
36
TODO-RELEASE
@@ -1,36 +1,4 @@
|
|||||||
Issues not sorted in any particular order.
|
To get fixed in 7.15.2 (planned release: Febrary 2006)
|
||||||
|
|
||||||
To get fixed in 7.13.1 (planned release: April 2005)
|
|
||||||
======================
|
======================
|
||||||
|
|
||||||
58 - Fix KNOWN_BUGS #19: "FTP 3rd party transfers with the multi interface
|
65 -
|
||||||
doesn't work"
|
|
||||||
|
|
||||||
59 - Figure out a fix for David Byron's SSL problems:
|
|
||||||
http://curl.haxx.se/mail/lib-2005-01/0240.html
|
|
||||||
|
|
||||||
47 - 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.
|
|
||||||
|
|
||||||
54 - Turn the FTP code into a state machine to support the multi interface
|
|
||||||
100% non-blocking.
|
|
||||||
|
|
||||||
To get fixed in 7.14.0
|
|
||||||
======================
|
|
||||||
|
|
||||||
55 - Add a function to the multi interface that gets file descriptors, as an
|
|
||||||
alternative to the curl_multi_fdset(). This is necessary to allow apps to
|
|
||||||
properly avoid the FD_SETSIZE problem.
|
|
||||||
|
|
||||||
56 - Make curl_easy_perform() a wrapper-function that simply creates a multi
|
|
||||||
handle, adds the easy handle to it, runs curl_multi_perform() until the
|
|
||||||
transfer is done, then detach the easy handle, destroy the multi handle
|
|
||||||
and return the easy handle's return code. This will thus make everything
|
|
||||||
internally use and assume the multi interface. The select()-loop should
|
|
||||||
use the new function from (55).
|
|
||||||
|
|
||||||
57 - Add an interface to libcurl for getting and setting cookies from an easy
|
|
||||||
handle. One idea: http://curl.haxx.se/mail/lib-2004-12/0195.html the
|
|
||||||
older idea: http://curl.haxx.se/dev/COOKIES. We need to settle on some
|
|
||||||
middle ground I guess.
|
|
||||||
|
|||||||
726
acinclude.m4
726
acinclude.m4
@@ -1,3 +1,393 @@
|
|||||||
|
#***************************************************************************
|
||||||
|
# _ _ ____ _
|
||||||
|
# Project ___| | | | _ \| |
|
||||||
|
# / __| | | | |_) | |
|
||||||
|
# | (__| |_| | _ <| |___
|
||||||
|
# \___|\___/|_| \_\_____|
|
||||||
|
#
|
||||||
|
# Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
#
|
||||||
|
# This software is licensed as described in the file COPYING, which
|
||||||
|
# you should have received as part of this distribution. The terms
|
||||||
|
# are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
|
#
|
||||||
|
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
# copies of the Software, and permit persons to whom the Software is
|
||||||
|
# furnished to do so, under the terms of the COPYING file.
|
||||||
|
#
|
||||||
|
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
# KIND, either express or implied.
|
||||||
|
#
|
||||||
|
# $Id$
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
dnl CURL_CHECK_HEADER_WINDOWS
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for compilable and valid windows.h header
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [
|
||||||
|
AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
],[
|
||||||
|
int dummy=2*WINVER;
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
ac_cv_header_windows_h="yes"
|
||||||
|
],[
|
||||||
|
ac_cv_header_windows_h="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
if test "x$ac_cv_header_windows_h" = "xyes"; then
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1,
|
||||||
|
[Define to 1 if you have the windows.h header file.])
|
||||||
|
AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1,
|
||||||
|
[Define to avoid automatic inclusion of winsock.h])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_HEADER_WINSOCK
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for compilable and valid winsock.h header
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
|
||||||
|
AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winsock.h>
|
||||||
|
],[
|
||||||
|
int dummy=WSACleanup();
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
ac_cv_header_winsock_h="yes"
|
||||||
|
],[
|
||||||
|
ac_cv_header_winsock_h="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
if test "x$ac_cv_header_winsock_h" = "xyes"; then
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1,
|
||||||
|
[Define to 1 if you have the winsock.h header file.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_HEADER_WINSOCK2
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for compilable and valid winsock2.h header
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
|
||||||
|
AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winsock2.h>
|
||||||
|
],[
|
||||||
|
int dummy=2*IPPROTO_ESP;
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
ac_cv_header_winsock2_h="yes"
|
||||||
|
],[
|
||||||
|
ac_cv_header_winsock2_h="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
if test "x$ac_cv_header_winsock2_h" = "xyes"; then
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1,
|
||||||
|
[Define to 1 if you have the winsock2.h header file.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_HEADER_WS2TCPIP
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for compilable and valid ws2tcpip.h header
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
|
||||||
|
AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
],[
|
||||||
|
int dummy=2*IP_PKTINFO;
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
ac_cv_header_ws2tcpip_h="yes"
|
||||||
|
],[
|
||||||
|
ac_cv_header_ws2tcpip_h="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
if test "x$ac_cv_header_ws2tcpip_h" = "xyes"; then
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1,
|
||||||
|
[Define to 1 if you have the ws2tcpip.h header file.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_TYPE_SOCKLEN_T
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for existing socklen_t type, and provide
|
||||||
|
dnl an equivalent type if socklen_t not available
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
|
||||||
|
AC_CHECK_TYPE([socklen_t], ,[
|
||||||
|
AC_CACHE_CHECK([for socklen_t equivalent],
|
||||||
|
[curl_cv_socklen_t_equiv], [
|
||||||
|
curl_cv_socklen_t_equiv="unknown"
|
||||||
|
for arg2 in "struct sockaddr" void; do
|
||||||
|
for t in int size_t unsigned long "unsigned long"; do
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
int getpeername (int, $arg2 *, $t *);
|
||||||
|
],[
|
||||||
|
$t len=0;
|
||||||
|
getpeername(0,0,&len);
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
curl_cv_socklen_t_equiv="$t"
|
||||||
|
break 2
|
||||||
|
])
|
||||||
|
done
|
||||||
|
done
|
||||||
|
])
|
||||||
|
if test "$curl_cv_socklen_t_equiv" = "unknown"; then
|
||||||
|
AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
|
||||||
|
else
|
||||||
|
AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
|
||||||
|
[type to use in place of socklen_t if not defined])
|
||||||
|
fi
|
||||||
|
],[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_FUNC_GETNAMEINFO
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Test if the getnameinfo function is available,
|
||||||
|
dnl and check the types of five of its arguments.
|
||||||
|
dnl If the function succeeds HAVE_GETNAMEINFO will be
|
||||||
|
dnl defined, defining the types of the arguments in
|
||||||
|
dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2,
|
||||||
|
dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7.
|
||||||
|
dnl This function is experimental and its results shall
|
||||||
|
dnl not be trusted while this notice is in place ------
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
|
||||||
|
AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl
|
||||||
|
AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h)
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING([for getnameinfo])
|
||||||
|
AC_LINK_IFELSE([
|
||||||
|
AC_LANG_FUNC_LINK_TRY([getnameinfo])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
curl_cv_getnameinfo="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
curl_cv_getnameinfo="no"
|
||||||
|
])
|
||||||
|
#
|
||||||
|
if test "$curl_cv_getnameinfo" != "yes"; then
|
||||||
|
AC_MSG_CHECKING([deeper for getnameinfo])
|
||||||
|
AC_TRY_LINK([
|
||||||
|
],[
|
||||||
|
getnameinfo();
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
curl_cv_getnameinfo="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([but still no])
|
||||||
|
curl_cv_getnameinfo="no"
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
if test "$curl_cv_getnameinfo" != "yes"; then
|
||||||
|
AC_MSG_CHECKING([deeper and deeper for getnameinfo])
|
||||||
|
AC_TRY_LINK([
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETDB_H
|
||||||
|
#include <netdb.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
],[
|
||||||
|
getnameinfo(0, 0, 0, 0, 0, 0, 0);
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
curl_cv_getnameinfo="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([but still no])
|
||||||
|
curl_cv_getnameinfo="no"
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
if test "$curl_cv_getnameinfo" = "yes"; then
|
||||||
|
AC_CACHE_CHECK([types of arguments for getnameinfo],
|
||||||
|
[curl_cv_func_getnameinfo_args], [
|
||||||
|
curl_cv_func_getnameinfo_args="unknown"
|
||||||
|
for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
|
||||||
|
for gni_arg2 in 'socklen_t' 'size_t' 'int'; do
|
||||||
|
for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int' 'DWORD'; do
|
||||||
|
for gni_arg7 in 'int' 'unsigned int'; do
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501)
|
||||||
|
#undef _WIN32_WINNT
|
||||||
|
#define _WIN32_WINNT 0x0501
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#define GNICALLCONV WSAAPI
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETDB_H
|
||||||
|
#include <netdb.h>
|
||||||
|
#endif
|
||||||
|
#define GNICALLCONV
|
||||||
|
#endif
|
||||||
|
extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2,
|
||||||
|
char *, $gni_arg46,
|
||||||
|
char *, $gni_arg46,
|
||||||
|
$gni_arg7);
|
||||||
|
],[
|
||||||
|
$gni_arg2 salen=0;
|
||||||
|
$gni_arg46 hostlen=0;
|
||||||
|
$gni_arg46 servlen=0;
|
||||||
|
$gni_arg7 flags=0;
|
||||||
|
int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags);
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7"
|
||||||
|
break 4
|
||||||
|
])
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done
|
||||||
|
]) # AC_CACHE_CHECK
|
||||||
|
if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
|
||||||
|
AC_MSG_WARN([Cannot find proper types to use for getnameinfo args])
|
||||||
|
AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined])
|
||||||
|
else
|
||||||
|
gni_prev_IFS=$IFS; IFS=','
|
||||||
|
set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'`
|
||||||
|
IFS=$gni_prev_IFS
|
||||||
|
shift
|
||||||
|
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $[1],
|
||||||
|
[Define to the type of arg 1 for getnameinfo.])
|
||||||
|
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2],
|
||||||
|
[Define to the type of arg 2 for getnameinfo.])
|
||||||
|
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3],
|
||||||
|
[Define to the type of args 4 and 6 for getnameinfo.])
|
||||||
|
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4],
|
||||||
|
[Define to the type of arg 7 for getnameinfo.])
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1,
|
||||||
|
[Define to 1 if you have the getnameinfo function.])
|
||||||
|
ac_cv_func_getnameinfo="yes"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
]) # AC_DEFUN
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_NONBLOCKING_SOCKET
|
||||||
|
dnl -------------------------------------------------
|
||||||
dnl Check for how to set a socket to non-blocking state. There seems to exist
|
dnl Check for how to set a socket to non-blocking state. There seems to exist
|
||||||
dnl four known different ways, with the one used almost everywhere being POSIX
|
dnl four known different ways, with the one used almost everywhere being POSIX
|
||||||
dnl and XPG3, while the other different ways for different systems (old BSD,
|
dnl and XPG3, while the other different ways for different systems (old BSD,
|
||||||
@@ -59,12 +449,27 @@ dnl FIONBIO test was also bad
|
|||||||
dnl the code was bad, try a different program now, test 3
|
dnl the code was bad, try a different program now, test 3
|
||||||
|
|
||||||
AC_TRY_COMPILE([
|
AC_TRY_COMPILE([
|
||||||
/* headers for ioctlsocket test (cygwin?) */
|
/* headers for ioctlsocket test (Windows) */
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
],[
|
],[
|
||||||
/* ioctlsocket source code */
|
/* ioctlsocket source code */
|
||||||
int socket;
|
SOCKET sd;
|
||||||
unsigned long flags = ioctlsocket(socket, FIONBIO, &flags);
|
unsigned long flags = 0;
|
||||||
|
sd = socket(0, 0, 0);
|
||||||
|
ioctlsocket(sd, FIONBIO, &flags);
|
||||||
],[
|
],[
|
||||||
dnl ioctlsocket test was good
|
dnl ioctlsocket test was good
|
||||||
nonblock="ioctlsocket"
|
nonblock="ioctlsocket"
|
||||||
@@ -122,54 +527,48 @@ dnl end of non-blocking try-compile test
|
|||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl Check for socklen_t: historically on BSD it is an int, and in
|
|
||||||
dnl POSIX 1g it is a type of its own, but some platforms use different
|
dnl TYPE_SOCKADDR_STORAGE
|
||||||
dnl types for the argument to getsockopt, getpeername, etc. So we
|
dnl -------------------------------------------------
|
||||||
dnl have to test to find something that will work.
|
dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but
|
||||||
AC_DEFUN([TYPE_SOCKLEN_T],
|
dnl AIX 4.3 is one known exception.
|
||||||
|
AC_DEFUN([TYPE_SOCKADDR_STORAGE],
|
||||||
[
|
[
|
||||||
AC_CHECK_TYPE([socklen_t], ,[
|
AC_CHECK_TYPE([struct sockaddr_storage],
|
||||||
AC_MSG_CHECKING([for socklen_t equivalent])
|
AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
|
||||||
AC_CACHE_VAL([curl_cv_socklen_t_equiv],
|
[if struct sockaddr_storage is defined]), ,
|
||||||
[
|
[
|
||||||
# Systems have either "struct sockaddr *" or
|
#undef inline
|
||||||
# "void *" as the second argument to getpeername
|
#ifdef HAVE_WINDOWS_H
|
||||||
curl_cv_socklen_t_equiv=
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
for arg2 in "struct sockaddr" void; do
|
#define WIN32_LEAN_AND_MEAN
|
||||||
for t in int size_t unsigned long "unsigned long"; do
|
#endif
|
||||||
AC_TRY_COMPILE([
|
#include <windows.h>
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
#ifdef HAVE_WINSOCK2_H
|
||||||
#include <sys/types.h>
|
#include <winsock2.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#else
|
||||||
#include <sys/socket.h>
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
#endif
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
int getpeername (int, $arg2 *, $t *);
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
],[
|
#include <sys/socket.h>
|
||||||
$t len;
|
#endif
|
||||||
getpeername(0,0,&len);
|
#ifdef HAVE_NETINET_IN_H
|
||||||
],[
|
#include <netinet/in.h>
|
||||||
curl_cv_socklen_t_equiv="$t"
|
#endif
|
||||||
break
|
#ifdef HAVE_ARPA_INET_H
|
||||||
])
|
#include <arpa/inet.h>
|
||||||
done
|
#endif
|
||||||
done
|
#endif
|
||||||
|
])
|
||||||
if test "x$curl_cv_socklen_t_equiv" = x; then
|
|
||||||
AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
AC_MSG_RESULT($curl_cv_socklen_t_equiv)
|
|
||||||
AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
|
|
||||||
[type to use in place of socklen_t if not defined])],
|
|
||||||
[#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>])
|
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl TYPE_IN_ADDR_T
|
||||||
|
dnl -------------------------------------------------
|
||||||
dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
|
dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
|
||||||
dnl and a few other things. If not found, we set it to unsigned int, as even
|
dnl and a few other things.
|
||||||
dnl 64-bit implementations use to set it to a 32-bit type.
|
|
||||||
AC_DEFUN([TYPE_IN_ADDR_T],
|
AC_DEFUN([TYPE_IN_ADDR_T],
|
||||||
[
|
[
|
||||||
AC_CHECK_TYPE([in_addr_t], ,[
|
AC_CHECK_TYPE([in_addr_t], ,[
|
||||||
@@ -179,15 +578,33 @@ AC_DEFUN([TYPE_IN_ADDR_T],
|
|||||||
curl_cv_in_addr_t_equiv=
|
curl_cv_in_addr_t_equiv=
|
||||||
for t in "unsigned long" int size_t unsigned long; do
|
for t in "unsigned long" int size_t unsigned long; do
|
||||||
AC_TRY_COMPILE([
|
AC_TRY_COMPILE([
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
#undef inline
|
||||||
#include <sys/types.h>
|
#ifdef HAVE_WINDOWS_H
|
||||||
#endif
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <sys/socket.h>
|
#endif
|
||||||
#endif
|
#include <windows.h>
|
||||||
#ifdef HAVE_ARPA_INET_H
|
#ifdef HAVE_WINSOCK2_H
|
||||||
#include <arpa/inet.h>
|
#include <winsock2.h>
|
||||||
#endif
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_INET_H
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
],[
|
],[
|
||||||
$t data = inet_addr ("1.2.3.4");
|
$t data = inet_addr ("1.2.3.4");
|
||||||
],[
|
],[
|
||||||
@@ -203,10 +620,36 @@ AC_DEFUN([TYPE_IN_ADDR_T],
|
|||||||
AC_MSG_RESULT($curl_cv_in_addr_t_equiv)
|
AC_MSG_RESULT($curl_cv_in_addr_t_equiv)
|
||||||
AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
|
AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
|
||||||
[type to use in place of in_addr_t if not defined])],
|
[type to use in place of in_addr_t if not defined])],
|
||||||
[#include <sys/types.h>
|
[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <arpa/inet.h>])
|
#endif
|
||||||
])
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_INET_H
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
]) dnl AC_CHECK_TYPE
|
||||||
|
]) dnl AC_DEFUN
|
||||||
|
|
||||||
dnl ************************************************************
|
dnl ************************************************************
|
||||||
dnl check for "localhost", if it doesn't exist, we can't do the
|
dnl check for "localhost", if it doesn't exist, we can't do the
|
||||||
@@ -234,7 +677,7 @@ exit (h == NULL ? 1 : 0); }],[
|
|||||||
])
|
])
|
||||||
|
|
||||||
dnl ************************************************************
|
dnl ************************************************************
|
||||||
dnl check for working getaddrinfo()
|
dnl check for working getaddrinfo() that works with AI_NUMERICHOST
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN([CURL_CHECK_WORKING_GETADDRINFO],[
|
AC_DEFUN([CURL_CHECK_WORKING_GETADDRINFO],[
|
||||||
AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[
|
AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[
|
||||||
@@ -249,6 +692,7 @@ int main(void)
|
|||||||
int error;
|
int error;
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(hints));
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_flags = AI_NUMERICHOST;
|
||||||
hints.ai_family = AF_UNSPEC;
|
hints.ai_family = AF_UNSPEC;
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
error = getaddrinfo("127.0.0.1", "8080", &hints, &ai);
|
error = getaddrinfo("127.0.0.1", "8080", &hints, &ai);
|
||||||
@@ -322,8 +766,24 @@ dnl program worked:
|
|||||||
[ ac_cv_working_ni_withscopeid="yes" ],
|
[ ac_cv_working_ni_withscopeid="yes" ],
|
||||||
dnl program failed:
|
dnl program failed:
|
||||||
[ ac_cv_working_ni_withscopeid="no" ],
|
[ ac_cv_working_ni_withscopeid="no" ],
|
||||||
dnl we cross-compile:
|
dnl we cross-compile, check the headers using the preprocessor
|
||||||
[ ac_cv_working_ni_withscopeid="yes" ]
|
[
|
||||||
|
|
||||||
|
AC_EGREP_CPP(WORKS,
|
||||||
|
[
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
|
||||||
|
#ifdef NI_WITHSCOPEID
|
||||||
|
WORKS
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
ac_cv_working_ni_withscopeid="yes",
|
||||||
|
ac_cv_working_ni_withscopeid="no" )
|
||||||
|
|
||||||
|
]
|
||||||
) dnl end of AC_RUN_IFELSE
|
) dnl end of AC_RUN_IFELSE
|
||||||
|
|
||||||
]) dnl end of AC_CACHE_CHECK
|
]) dnl end of AC_CACHE_CHECK
|
||||||
@@ -376,34 +836,25 @@ dnl int strerror_r(int errnum, char *buf, size_t n);
|
|||||||
dnl
|
dnl
|
||||||
AC_DEFUN([CURL_CHECK_STRERROR_R],
|
AC_DEFUN([CURL_CHECK_STRERROR_R],
|
||||||
[
|
[
|
||||||
dnl determine of strerror_r is present
|
AC_CHECK_FUNCS(strerror_r)
|
||||||
AC_CHECK_FUNCS(strerror_r,[
|
|
||||||
|
if test "x$ac_cv_func_strerror_r" = "xyes"; then
|
||||||
|
|
||||||
AC_MSG_CHECKING(whether strerror_r is declared)
|
AC_MSG_CHECKING(whether strerror_r is declared)
|
||||||
AC_EGREP_CPP(strerror_r,[
|
AC_EGREP_CPP(strerror_r,[
|
||||||
#include <string.h>],[
|
#include <string.h>],[
|
||||||
strerror_r="yes"
|
|
||||||
AC_MSG_RESULT(yes)],[
|
AC_MSG_RESULT(yes)],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(whether strerror_r with -D_THREAD_SAFE is declared)
|
AC_MSG_CHECKING(whether strerror_r with -D_REENTRANT is declared)
|
||||||
AC_EGREP_CPP(strerror_r,[
|
AC_EGREP_CPP(strerror_r,[
|
||||||
#define _THREAD_SAFE
|
#define _REENTRANT
|
||||||
#include <string.h>],[
|
#include <string.h>],[
|
||||||
strerror_r="yes"
|
CPPFLAGS="-D_REENTRANT $CPPFLAGS"
|
||||||
CPPFLAGS="-D_THREAD_SAFE $CPPFLAGS"
|
|
||||||
AC_MSG_RESULT(yes)],
|
AC_MSG_RESULT(yes)],
|
||||||
AC_MSG_RESULT(no))])])
|
AC_MSG_RESULT(no)
|
||||||
|
AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto])
|
||||||
if test "x$strerror_r" = "xyes"; then
|
) dnl with _THREAD_SAFE
|
||||||
|
]) dnl plain cpp for it
|
||||||
dnl check if strerror_r is properly declared in the headers
|
|
||||||
AC_CHECK_DECL(strerror_r, ,
|
|
||||||
AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto])
|
|
||||||
,
|
|
||||||
[#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl determine if this strerror_r() is glibc or POSIX
|
dnl determine if this strerror_r() is glibc or POSIX
|
||||||
AC_MSG_CHECKING([for a glibc strerror_r API])
|
AC_MSG_CHECKING([for a glibc strerror_r API])
|
||||||
@@ -425,8 +876,20 @@ main () {
|
|||||||
AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
|
AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
|
||||||
AC_MSG_RESULT([yes]),
|
AC_MSG_RESULT([yes]),
|
||||||
AC_MSG_RESULT([no]),
|
AC_MSG_RESULT([no]),
|
||||||
dnl cross-compiling!
|
|
||||||
AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
|
dnl Use an inferior method of strerror_r detection while cross-compiling
|
||||||
|
AC_EGREP_CPP(yes, [
|
||||||
|
#include <features.h>
|
||||||
|
#ifdef __GLIBC__
|
||||||
|
yes
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
dnl looks like glibc, so assume a glibc-style strerror_r()
|
||||||
|
GLIBC_STRERROR_R="1"
|
||||||
|
AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
|
||||||
|
AC_MSG_RESULT([yes]),
|
||||||
|
AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
|
||||||
|
) dnl while cross-compiling
|
||||||
)
|
)
|
||||||
|
|
||||||
if test -z "$GLIBC_STRERROR_R"; then
|
if test -z "$GLIBC_STRERROR_R"; then
|
||||||
@@ -641,6 +1104,7 @@ if test "$ac_cv_func_gethostbyname_r" = "yes"; then
|
|||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
dnl We create a function for detecting which compiler we use and then set as
|
dnl We create a function for detecting which compiler we use and then set as
|
||||||
dnl pendantic compiler options as possible for that particular compiler. The
|
dnl pendantic compiler options as possible for that particular compiler. The
|
||||||
dnl options are only used for debug-builds.
|
dnl options are only used for debug-builds.
|
||||||
@@ -715,15 +1179,18 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
||||||
dnl on i686-Linux as it gives us heaps with false positives
|
dnl on i686-Linux as it gives us heaps with false positives.
|
||||||
|
dnl Also, on gcc 4.0.X it is totally unbearable and complains all
|
||||||
|
dnl over making it unusable for generic purposes. Let's not use it.
|
||||||
|
|
||||||
if test "$gccnum" -ge "303"; then
|
if test "$gccnum" -ge "303"; then
|
||||||
dnl gcc 3.3 and later
|
dnl gcc 3.3 and later
|
||||||
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
|
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$gccnum" -ge "304"; then
|
if test "$gccnum" -ge "304"; then
|
||||||
# try -Wunreachable-code on gcc 3.4
|
# try these on gcc 3.4
|
||||||
WARN="$WARN -Wunreachable-code"
|
WARN="$WARN -Wdeclaration-after-statement"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for flag in $CPPFLAGS; do
|
for flag in $CPPFLAGS; do
|
||||||
@@ -766,3 +1233,88 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
|||||||
|
|
||||||
]) dnl end of AC_DEFUN()
|
]) dnl end of AC_DEFUN()
|
||||||
|
|
||||||
|
|
||||||
|
dnl Determine the name of the library to pass to dlopen() based on the name
|
||||||
|
dnl that would normally be given to AC_CHECK_LIB. The preprocessor symbol
|
||||||
|
dnl given is set to the quoted library file name.
|
||||||
|
dnl The standard dynamic library file name is first generated, based on the
|
||||||
|
dnl current system type, then a search is performed for that file on the
|
||||||
|
dnl standard dynamic library path. If it is a symbolic link, the destination
|
||||||
|
dnl of the link is used as the file name, after stripping off any minor
|
||||||
|
dnl version numbers. If a library file can't be found, a guess is made.
|
||||||
|
dnl This macro assumes AC_PROG_LIBTOOL has been called and requires perl
|
||||||
|
dnl to be available in the PATH, or $PERL to be set to its location.
|
||||||
|
dnl
|
||||||
|
dnl CURL_DLLIB_NAME(VARIABLE, library_name)
|
||||||
|
dnl e.g. CURL_DLLIB_NAME(LDAP_NAME, ldap) on a Linux system might result
|
||||||
|
dnl in LDAP_NAME holding the string "libldap.so.2".
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_DLLIB_NAME],
|
||||||
|
[
|
||||||
|
AC_MSG_CHECKING([name of dynamic library $2])
|
||||||
|
dnl The shared library extension variable name changes from version to
|
||||||
|
dnl version of libtool. Try a few names then just set one statically.
|
||||||
|
test -z "$shared_ext" && shared_ext="$shrext_cmds"
|
||||||
|
test -z "$shared_ext" && shared_ext="$shrext"
|
||||||
|
test -z "$shared_ext" && shared_ext=".so"
|
||||||
|
|
||||||
|
dnl Create the library link name of the correct form for this platform
|
||||||
|
LIBNAME_LINK_SPEC=`echo "$library_names_spec" | $SED 's/^.* //'`
|
||||||
|
DLGUESSLIB=`name=$2 eval echo "$libname_spec"`
|
||||||
|
DLGUESSFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$LIBNAME_LINK_SPEC"`
|
||||||
|
|
||||||
|
dnl Synthesize a likely dynamic library name in case we can't find an actual one
|
||||||
|
SO_NAME_SPEC="$soname_spec"
|
||||||
|
dnl soname_spec undefined when identical to the 1st entry in library_names_spec
|
||||||
|
test -z "$SO_NAME_SPEC" && SO_NAME_SPEC=`echo "$library_names_spec" | $SED 's/ .*$//'`
|
||||||
|
DLGUESSSOFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$SO_NAME_SPEC"`
|
||||||
|
|
||||||
|
if test "$cross_compiling" = yes; then
|
||||||
|
dnl Can't look at filesystem when cross-compiling
|
||||||
|
AC_DEFINE_UNQUOTED($1, "$DLGUESSSOFILE", [$2 dynamic library file])
|
||||||
|
AC_MSG_RESULT([$DLGUESSSOFILE (guess while cross-compiling)])
|
||||||
|
else
|
||||||
|
|
||||||
|
DLFOUNDFILE=""
|
||||||
|
if test "$sys_lib_dlsearch_path_spec" ; then
|
||||||
|
dnl Search for the link library name and see what it points to.
|
||||||
|
for direc in $sys_lib_dlsearch_path_spec ; do
|
||||||
|
DLTRYFILE="$direc/$DLGUESSFILE"
|
||||||
|
dnl Find where the symbolic link for this name points
|
||||||
|
changequote(<<, >>)dnl
|
||||||
|
<<
|
||||||
|
DLFOUNDFILE=`${PERL:-perl} -e 'use File::Basename; (basename(readlink($ARGV[0])) =~ /^(.*[^\d]\.\d+)[\d\.]*$/ && print ${1}) || exit 1;' "$DLTRYFILE" 2>&5`
|
||||||
|
>>
|
||||||
|
changequote([, ])dnl
|
||||||
|
if test "$?" -eq "0"; then
|
||||||
|
dnl Found the file link
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$DLFOUNDFILE" ; then
|
||||||
|
dnl Couldn't find a link library, so guess at a name.
|
||||||
|
DLFOUNDFILE="$DLGUESSSOFILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_DEFINE_UNQUOTED($1, "$DLFOUNDFILE", [$2 dynamic library file])
|
||||||
|
AC_MSG_RESULT($DLFOUNDFILE)
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# This is only a temporary fix. This macro is here to replace the broken one
|
||||||
|
# delivered by the automake project (including the 1.9.6 release). As soon as
|
||||||
|
# they ship a working version we SHOULD remove this work-around.
|
||||||
|
|
||||||
|
AC_DEFUN([AM_MISSING_HAS_RUN],
|
||||||
|
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||||
|
test x"${MISSING+set}" = xset || MISSING="\${SHELL} \"$am_aux_dir/missing\""
|
||||||
|
# Use eval to expand $SHELL
|
||||||
|
if eval "$MISSING --run true"; then
|
||||||
|
am_missing_run="$MISSING --run "
|
||||||
|
else
|
||||||
|
am_missing_run=
|
||||||
|
AC_MSG_WARN([`missing' script is too old or missing])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|||||||
14
ares/AUTHORS
Normal file
14
ares/AUTHORS
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
c-ares is based on ares, and these are the people that have worked on it since
|
||||||
|
the fork was made:
|
||||||
|
|
||||||
|
Daniel Stenberg
|
||||||
|
Dominick Meglio
|
||||||
|
liren at vivisimo.com
|
||||||
|
James Bursa
|
||||||
|
Duncan Wilcox
|
||||||
|
Dirk Manske
|
||||||
|
Dan Fandrich
|
||||||
|
Gisle Vanem
|
||||||
|
Gunter Knauf
|
||||||
|
Henrik Stoerner
|
||||||
|
Yang Tse
|
||||||
108
ares/CHANGES
108
ares/CHANGES
@@ -1,5 +1,113 @@
|
|||||||
Changelog for the c-ares project
|
Changelog for the c-ares project
|
||||||
|
|
||||||
|
* January 9, 2006
|
||||||
|
|
||||||
|
- Alexander Lazic improved the getservbyport_r() configure check.
|
||||||
|
|
||||||
|
* January 6, 2006
|
||||||
|
|
||||||
|
- Alexander Lazic pointed out that the buildconf should use the ACLOCAL_FLAGS
|
||||||
|
variable for easier controlling what it does and how it runs.
|
||||||
|
|
||||||
|
* January 5, 2006
|
||||||
|
|
||||||
|
- James Bursa fixed c-ares to find the hosts file on RISC OS, and made it
|
||||||
|
build with newer gcc versions that no longer defines "riscos".
|
||||||
|
|
||||||
|
* December 22
|
||||||
|
|
||||||
|
- Daniel Stenberg added ares_getsock() that extracts the set of sockets to
|
||||||
|
wait for action on. Similar to ares_fds() but not restricted to using
|
||||||
|
select() for the waiting.
|
||||||
|
|
||||||
|
* November 25
|
||||||
|
|
||||||
|
- Yang Tse fixed some send() / recv() compiler warnings
|
||||||
|
|
||||||
|
* September 18
|
||||||
|
|
||||||
|
- Added constants that will be used by ares_getaddrinfo
|
||||||
|
|
||||||
|
- Made ares_getnameinfo use the reentrant getservbyport (getservbyport_r) if it is
|
||||||
|
available to ensure it works properly in a threaded environment.
|
||||||
|
|
||||||
|
* September 10
|
||||||
|
|
||||||
|
- configure fix for detecting a member in the sockaddr_in6 struct which failed
|
||||||
|
on ipv6-enabled HP-UX 11.00
|
||||||
|
|
||||||
|
Version 1.3.0 (August 29, 2004)
|
||||||
|
|
||||||
|
* August 21
|
||||||
|
|
||||||
|
- Alfredo Tupone provided a fix for the Windows code in get_iphlpapi_dns_info()
|
||||||
|
when getting the DNS server etc.
|
||||||
|
|
||||||
|
* June 19
|
||||||
|
|
||||||
|
- Added some checks for the addrinfo structure.
|
||||||
|
|
||||||
|
* June 2
|
||||||
|
|
||||||
|
- William Ahern:
|
||||||
|
|
||||||
|
Make UDP sockets non-blocking. I've confirmed that at least on Linux 2.4 a
|
||||||
|
read event can come back from poll() on a valid SOCK_DGRAM socket but
|
||||||
|
recv(2) will still block. This patch doesn't ignore EAGAIN in
|
||||||
|
read_udp_packets(), though maybe it should. (This patch was edited by Daniel
|
||||||
|
Stenberg and a new configure test was added (imported from curl's configure)
|
||||||
|
to properly detect what non-blocking socket approach to use.)
|
||||||
|
|
||||||
|
I'm not quite sure how this was happening, but I've been seeing PTR queries
|
||||||
|
which seem to return empty responses. At least, they were empty when calling
|
||||||
|
ares_expand_name() on the record. Here's a patch which guarantees to
|
||||||
|
NUL-terminate the expanded name. The old behavior failed to NUL-terminate if
|
||||||
|
len was 0, and this was causing strlen() to run past the end of the buffer
|
||||||
|
after calling ares_expand_name() and getting ARES_SUCCESS as the return
|
||||||
|
value. If q is not greater than *s then it's equal and *s is always
|
||||||
|
allocated with at least one byte.
|
||||||
|
|
||||||
|
* May 16
|
||||||
|
|
||||||
|
- Added ares_getnameinfo which mimics the getnameinfo API (another feature
|
||||||
|
that could use testing).
|
||||||
|
|
||||||
|
* May 14
|
||||||
|
|
||||||
|
- Added an inet_ntop function from BIND for systems that do not have it.
|
||||||
|
|
||||||
|
* April 9
|
||||||
|
|
||||||
|
- Made sortlist support IPv6 (this can probably use some testing).
|
||||||
|
|
||||||
|
- Made sortlist support CIDR matching for IPv4.
|
||||||
|
|
||||||
|
* April 8
|
||||||
|
|
||||||
|
- Added preliminary IPv6 support to ares_gethostbyname. Currently, sortlist
|
||||||
|
does not work with IPv6. Also provided an implementation of bitncmp from
|
||||||
|
BIND for systems that do not supply this function. This will be used to add
|
||||||
|
IPv6 support to sortlist.
|
||||||
|
|
||||||
|
- Made ares_gethostbyaddr support IPv6 by specifying AF_INET6 as the family.
|
||||||
|
The function can lookup IPv6 addresses both from files (/etc/hosts) and
|
||||||
|
DNS lookups.
|
||||||
|
|
||||||
|
* April 7
|
||||||
|
|
||||||
|
- Tupone Alfredo fixed includes of arpa/nameser_compat.h to build fine on Mac
|
||||||
|
OS X.
|
||||||
|
|
||||||
|
* April 5
|
||||||
|
|
||||||
|
- Dominick Meglio: Provided implementations of inet_net_pton and inet_pton
|
||||||
|
from BIND for systems that do not include these functions.
|
||||||
|
|
||||||
|
* March 11, 2005
|
||||||
|
|
||||||
|
- Dominick Meglio added ares_parse_aaaa_reply.c and did various
|
||||||
|
adjustments. The first little steps towards IPv6 support!
|
||||||
|
|
||||||
* November 7
|
* November 7
|
||||||
|
|
||||||
- Fixed the VC project and makefile to use ares_cancel and ares_version
|
- Fixed the VC project and makefile to use ares_cancel and ares_version
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ Makefile.in
|
|||||||
Makefile.dj
|
Makefile.dj
|
||||||
Makefile.m32
|
Makefile.m32
|
||||||
Makefile.netware
|
Makefile.netware
|
||||||
|
Makefile.vc6
|
||||||
install-sh
|
install-sh
|
||||||
mkinstalldirs
|
mkinstalldirs
|
||||||
configure
|
configure
|
||||||
|
|||||||
@@ -4,18 +4,17 @@ lib_LTLIBRARIES = libcares.la
|
|||||||
|
|
||||||
man_MANS = $(MANPAGES)
|
man_MANS = $(MANPAGES)
|
||||||
|
|
||||||
MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/adig/adig.mak \
|
MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/vc.dsw vc/ahost/ahost.dep \
|
||||||
vc/adig/adig.plg vc/vc.dsw vc/ahost/ahost.dep vc/ahost/ahost.dsp \
|
vc/ahost/ahost.dsp vc/areslib/areslib.dep vc/areslib/areslib.dsp \
|
||||||
vc/ahost/ahost.mak vc/ahost/ahost.plg vc/areslib/areslib.dep \
|
vc/areslib/areslib.dsw
|
||||||
vc/areslib/areslib.dsp vc/areslib/areslib.mak vc/areslib/areslib.plg
|
|
||||||
|
|
||||||
# adig and ahost are just sample programs and thus not mentioned with the
|
# adig and ahost are just sample programs and thus not mentioned with the
|
||||||
# regular sources and headers
|
# regular sources and headers
|
||||||
EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \
|
EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \
|
||||||
$(MSVCFILES)
|
$(MSVCFILES) AUTHORS
|
||||||
|
|
||||||
|
|
||||||
VER=-version-info 0:0:0
|
VER=-version-info 1:0:0
|
||||||
# This flag accepts an argument of the form current[:revision[:age]]. So,
|
# This flag accepts an argument of the form current[:revision[:age]]. So,
|
||||||
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
|
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
|
||||||
# 1.
|
# 1.
|
||||||
|
|||||||
@@ -9,7 +9,12 @@ include Makefile.inc
|
|||||||
WATT32_ROOT = $(subst \,/,$(WATT_ROOT))
|
WATT32_ROOT = $(subst \,/,$(WATT_ROOT))
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -O2 -Wall -DWATT32 -Dselect=select_s -I$(WATT32_ROOT)/inc
|
CFLAGS = -O2 -Wall -DWATT32 -Dselect=select_s -DHAVE_AF_INET6 \
|
||||||
|
-DHAVE_PF_INET6 -DHAVE_IOCTLSOCKET -DHAVE_STRUCT_IN6_ADDR \
|
||||||
|
-DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \
|
||||||
|
-DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 \
|
||||||
|
-DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID -I$(WATT32_ROOT)/inc
|
||||||
|
|
||||||
LDFLAGS = -s
|
LDFLAGS = -s
|
||||||
EX_LIBS = $(WATT32_ROOT)/lib/libwatt.a
|
EX_LIBS = $(WATT32_ROOT)/lib/libwatt.a
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
CSOURCES = ares_fds.c ares_process.c ares_free_hostent.c ares_query.c \
|
CSOURCES = ares_fds.c ares_getsock.c ares_process.c ares_free_hostent.c \
|
||||||
ares__close_sockets.c ares_free_string.c ares_search.c ares__get_hostent.c \
|
ares_query.c ares__close_sockets.c ares_free_string.c ares_search.c \
|
||||||
ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c \
|
ares__get_hostent.c ares_gethostbyaddr.c ares_send.c ares__read_line.c \
|
||||||
ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c \
|
ares_gethostbyname.c ares_strerror.c ares_cancel.c ares_init.c \
|
||||||
ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c \
|
ares_timeout.c ares_destroy.c ares_mkquery.c ares_version.c \
|
||||||
windows_port.c ares_expand_string.c ares_parse_ptr_reply.c
|
ares_expand_name.c ares_parse_a_reply.c windows_port.c \
|
||||||
|
ares_expand_string.c ares_parse_ptr_reply.c ares_parse_aaaa_reply.c \
|
||||||
|
ares_getnameinfo.c inet_net_pton.c bitncmp.c inet_ntop.c
|
||||||
|
|
||||||
HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h nameser.h
|
HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h \
|
||||||
|
nameser.h inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h
|
||||||
|
|
||||||
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
||||||
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
||||||
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
||||||
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
||||||
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
||||||
ares_version.3 ares_cancel.3
|
ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.3
|
||||||
|
|||||||
@@ -7,29 +7,21 @@
|
|||||||
## Quick hack by Guenter; comments to: /dev/nul
|
## Quick hack by Guenter; comments to: /dev/nul
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
AR = ar
|
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
STRIP = strip -g
|
|
||||||
#RM = rm -f
|
|
||||||
|
|
||||||
########################################################
|
########################################################
|
||||||
## Nothing more to do below this line!
|
## Nothing more to do below this line!
|
||||||
|
|
||||||
LIB=libcares.a
|
LIB=libcares.a
|
||||||
CC=gcc
|
CC=gcc
|
||||||
#CPPFLAGS=@CPPFLAGS@
|
CFLAGS=-O2 -Wall
|
||||||
WARN_FLAGS=-Wall
|
|
||||||
CFLAGS=-O2
|
|
||||||
CFLAGS+=${WARN_CFLAGS} ${ERROR_CFLAGS}
|
|
||||||
DEFS=-DMINGW32
|
|
||||||
LDFLAGS=-s
|
LDFLAGS=-s
|
||||||
LIBS=-lwsock32
|
LIBS=-lwsock32
|
||||||
ALL_CFLAGS=${CPPFLAGS} ${CFLAGS} ${DEFS}
|
|
||||||
|
|
||||||
MANPAGES := $(patsubst %.c,%.o,$(wildcard ares_*.3))
|
MANPAGES := $(patsubst %.c,%.o,$(wildcard ares_*.3))
|
||||||
|
|
||||||
OBJS := $(patsubst %.c,%.o,$(wildcard ares_*.c))
|
OBJS := $(patsubst %.c,%.o,$(wildcard ares_*.c))
|
||||||
OBJS += windows_port.o
|
OBJS += windows_port.o inet_ntop.o inet_net_pton.o bitncmp.o
|
||||||
|
|
||||||
$(LIB): ${OBJS}
|
$(LIB): ${OBJS}
|
||||||
ar cru $@ ${OBJS}
|
ar cru $@ ${OBJS}
|
||||||
@@ -51,7 +43,7 @@ ahost.exe: ahost.o $(LIB)
|
|||||||
${OBJS}: ares.h ares_dns.h ares_private.h
|
${OBJS}: ares.h ares_dns.h ares_private.h
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
${CC} -c ${ALL_CFLAGS} $<
|
${CC} -c ${CFLAGS} $<
|
||||||
|
|
||||||
check:
|
check:
|
||||||
|
|
||||||
@@ -73,3 +65,4 @@ clean:
|
|||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
rm -f config.cache config.log config.status Makefile
|
rm -f config.cache config.log config.status Makefile
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ endif
|
|||||||
TARGETS = adig.nlm ahost.nlm
|
TARGETS = adig.nlm ahost.nlm
|
||||||
LTARGET = libcares.lib
|
LTARGET = libcares.lib
|
||||||
VERSION = $(LIBCARES_VERSION)
|
VERSION = $(LIBCARES_VERSION)
|
||||||
COPYR = Copyright (c) 1996 - 2004, Daniel Stenberg, <daniel@haxx.se>
|
COPYR = Copyright (C) 1996 - 2005, Daniel Stenberg, <daniel@haxx.se>
|
||||||
DESCR = cURL $(subst .def,,$(notdir $@)) $(LIBCARES_VERSION_STR) - http://curl.haxx.se
|
DESCR = cURL $(subst .def,,$(notdir $@)) $(LIBCARES_VERSION_STR) - http://curl.haxx.se
|
||||||
MTSAFE = YES
|
MTSAFE = YES
|
||||||
STACK = 64000
|
STACK = 64000
|
||||||
@@ -89,7 +89,7 @@ LDFLAGS = -T
|
|||||||
AR = ar
|
AR = ar
|
||||||
ARFLAGS = -cq
|
ARFLAGS = -cq
|
||||||
CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing
|
CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing
|
||||||
CFLAGS += -Wall -Wno-format # -pedantic
|
CFLAGS += -Wall -Wno-format -Wno-uninitialized # -pedantic
|
||||||
ifeq ($(LIBARCH),LIBC)
|
ifeq ($(LIBARCH),LIBC)
|
||||||
PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o
|
PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o
|
||||||
else
|
else
|
||||||
@@ -104,7 +104,7 @@ SDK_LIBC = $(NDK_ROOT)/libc
|
|||||||
|
|
||||||
ifeq ($(LIBARCH),LIBC)
|
ifeq ($(LIBARCH),LIBC)
|
||||||
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
||||||
INCLUDES += -I$(SDK_LIBC)/include/winsock
|
# INCLUDES += -I$(SDK_LIBC)/include/winsock
|
||||||
CFLAGS += -D_POSIX_SOURCE
|
CFLAGS += -D_POSIX_SOURCE
|
||||||
# CFLAGS += -D__ANSIC__
|
# CFLAGS += -D__ANSIC__
|
||||||
else
|
else
|
||||||
@@ -126,7 +126,10 @@ DL = '
|
|||||||
#-include $(NDKBASE)/nlmconv/ncpfs.inc
|
#-include $(NDKBASE)/nlmconv/ncpfs.inc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(wildcard ares_*.c))
|
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||||
|
include Makefile.inc
|
||||||
|
|
||||||
|
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES)))
|
||||||
|
|
||||||
.PHONY: lib nlm prebuild dist install clean
|
.PHONY: lib nlm prebuild dist install clean
|
||||||
|
|
||||||
@@ -256,6 +259,7 @@ config.h: Makefile.netware
|
|||||||
@echo $(DL)#define VERSION "$(LIBCURL_VERSION_STR)"$(DL) >> $@
|
@echo $(DL)#define VERSION "$(LIBCURL_VERSION_STR)"$(DL) >> $@
|
||||||
@echo $(DL)#define PACKAGE_BUGREPORT "curl-bug@haxx.se"$(DL) >> $@
|
@echo $(DL)#define PACKAGE_BUGREPORT "curl-bug@haxx.se"$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_ARPA_NAMESER_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@
|
@echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@
|
||||||
@@ -297,6 +301,13 @@ config.h: Makefile.netware
|
|||||||
@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@
|
@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@
|
||||||
@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@
|
@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@
|
||||||
@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@
|
@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
|
||||||
|
@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@
|
||||||
ifdef NW_WINSOCK
|
ifdef NW_WINSOCK
|
||||||
@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@
|
@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@
|
||||||
else
|
else
|
||||||
|
|||||||
190
ares/Makefile.vc6
Normal file
190
ares/Makefile.vc6
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# C-ares makefile for MSVC6+
|
||||||
|
# G. Vanem <giva@bgnett.no>.
|
||||||
|
#
|
||||||
|
|
||||||
|
CFG_MODEL = MD
|
||||||
|
DEBUG_MODEL = d
|
||||||
|
USE_WATT32 = 0
|
||||||
|
|
||||||
|
#
|
||||||
|
# Configurations:
|
||||||
|
# -MD - msvcrt.dll, threads, release (normal)
|
||||||
|
# -MDd - msvcrtd.dll, threads, debug
|
||||||
|
# -ML - libc, no threads, release
|
||||||
|
# -MLd - libc, no threads, debug
|
||||||
|
# -MT - libc, threads, release
|
||||||
|
# -MTd - libc, threads, debug
|
||||||
|
|
||||||
|
CC = cl
|
||||||
|
|
||||||
|
CFLAGS = -nologo -$(CFG_MODEL)$(DEBUG_MODEL) -W3 -Yd -Zi
|
||||||
|
LDFLAGS = -machine:i386 -map
|
||||||
|
|
||||||
|
OBJ_DIR = VC6_obj
|
||||||
|
DEF_FILE = cares.def
|
||||||
|
|
||||||
|
!if "$(USE_WATT32)" == "1"
|
||||||
|
CFLAGS = $(CFLAGS) -UWIN32 -DWATT32 -I$(WATT_ROOT)\inc
|
||||||
|
EX_LIBS = $(WATT_ROOT)\lib\wattcpvc_imp.lib
|
||||||
|
|
||||||
|
!else
|
||||||
|
CFLAGS = $(CFLAGS) -DWIN32 -DWIN32_LEAN_AND_MEAN
|
||||||
|
EX_LIBS = advapi32.lib ws2_32.lib
|
||||||
|
!endif
|
||||||
|
|
||||||
|
!if "$(DEBUG_MODEL)" == "d"
|
||||||
|
CFLAGS = $(CFLAGS) -D_DEBUG -GZ
|
||||||
|
LDFLAGS = $(LDFLAGS) -debug -fixed:no
|
||||||
|
|
||||||
|
!else
|
||||||
|
CFLAGS = $(CFLAGS) -O2 -Og
|
||||||
|
LDFLAGS = $(LDFLAGS) -release
|
||||||
|
!endif
|
||||||
|
|
||||||
|
OBJECTS = $(OBJ_DIR)\ares_fds.obj \
|
||||||
|
$(OBJ_DIR)\ares_process.obj \
|
||||||
|
$(OBJ_DIR)\ares_free_hostent.obj \
|
||||||
|
$(OBJ_DIR)\ares_query.obj \
|
||||||
|
$(OBJ_DIR)\ares__close_sockets.obj \
|
||||||
|
$(OBJ_DIR)\ares_free_string.obj \
|
||||||
|
$(OBJ_DIR)\ares_search.obj \
|
||||||
|
$(OBJ_DIR)\ares__get_hostent.obj \
|
||||||
|
$(OBJ_DIR)\ares_gethostbyaddr.obj \
|
||||||
|
$(OBJ_DIR)\ares_getsock.obj \
|
||||||
|
$(OBJ_DIR)\ares_send.obj \
|
||||||
|
$(OBJ_DIR)\ares__read_line.obj \
|
||||||
|
$(OBJ_DIR)\ares_gethostbyname.obj \
|
||||||
|
$(OBJ_DIR)\ares_getnameinfo.obj \
|
||||||
|
$(OBJ_DIR)\ares_strerror.obj \
|
||||||
|
$(OBJ_DIR)\ares_cancel.obj \
|
||||||
|
$(OBJ_DIR)\ares_init.obj \
|
||||||
|
$(OBJ_DIR)\ares_timeout.obj \
|
||||||
|
$(OBJ_DIR)\ares_destroy.obj \
|
||||||
|
$(OBJ_DIR)\ares_mkquery.obj \
|
||||||
|
$(OBJ_DIR)\ares_version.obj \
|
||||||
|
$(OBJ_DIR)\ares_expand_name.obj \
|
||||||
|
$(OBJ_DIR)\ares_parse_a_reply.obj \
|
||||||
|
$(OBJ_DIR)\ares_parse_aaaa_reply.obj \
|
||||||
|
$(OBJ_DIR)\windows_port.obj \
|
||||||
|
$(OBJ_DIR)\ares_expand_string.obj \
|
||||||
|
$(OBJ_DIR)\ares_parse_ptr_reply.obj \
|
||||||
|
$(OBJ_DIR)\bitncmp.obj \
|
||||||
|
$(OBJ_DIR)\inet_net_pton.obj \
|
||||||
|
$(OBJ_DIR)\inet_ntop.obj
|
||||||
|
|
||||||
|
all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe
|
||||||
|
|
||||||
|
$(OBJ_DIR):
|
||||||
|
mkdir $(OBJ_DIR)
|
||||||
|
|
||||||
|
cares.lib: $(OBJ_DIR) $(OBJECTS)
|
||||||
|
lib -nologo -out:$@ $(OBJECTS)
|
||||||
|
|
||||||
|
cares_imp.lib cares.dll: $(OBJ_DIR) $(DEF_FILE) $(OBJECTS)
|
||||||
|
link $(LDFLAGS) -dll -implib:cares_imp.lib -out:cares.dll \
|
||||||
|
-def:$(DEF_FILE) $(OBJECTS) $(EX_LIBS)
|
||||||
|
|
||||||
|
$(DEF_FILE): $(OBJECTS) Makefile.VC6
|
||||||
|
@echo ; Generated. DO NOT EDIT > $@
|
||||||
|
@echo LIBRARY cares.dll >> $@
|
||||||
|
@echo EXPORTS >> $@
|
||||||
|
@echo ares_cancel >> $@
|
||||||
|
@echo ares_destroy >> $@
|
||||||
|
@echo ares_expand_name >> $@
|
||||||
|
@echo ares_expand_string >> $@
|
||||||
|
@echo ares_fds >> $@
|
||||||
|
@echo ares_free_hostent >> $@
|
||||||
|
@echo ares_free_string >> $@
|
||||||
|
@echo ares_gethostbyaddr >> $@
|
||||||
|
@echo ares_gethostbyname >> $@
|
||||||
|
@echo ares_getsock >> $@
|
||||||
|
@echo ares_init >> $@
|
||||||
|
@echo ares_init_options >> $@
|
||||||
|
@echo ares_mkquery >> $@
|
||||||
|
@echo ares_parse_a_reply >> $@
|
||||||
|
@echo ares_parse_ptr_reply >> $@
|
||||||
|
@echo ares_process >> $@
|
||||||
|
@echo ares_query >> $@
|
||||||
|
@echo ares_search >> $@
|
||||||
|
@echo ares_strerror >> $@
|
||||||
|
@echo ares_strncasecmp >> $@
|
||||||
|
@echo ares_strcasecmp >> $@
|
||||||
|
@echo ares_timeout >> $@
|
||||||
|
@echo ares_version >> $@
|
||||||
|
@echo ares_inet_net_pton >> $@
|
||||||
|
@echo ares_inet_ntop >> $@
|
||||||
|
@echo ares_inet_pton >> $@
|
||||||
|
@echo ares_writev >> $@
|
||||||
|
@echo ares_getnameinfo >> $@
|
||||||
|
@echo ares_gettimeofday >> $@
|
||||||
|
@echo ares_parse_aaaa_reply >> $@
|
||||||
|
|
||||||
|
ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj cares_imp.lib
|
||||||
|
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\ahost.obj cares_imp.lib $(EX_LIBS)
|
||||||
|
|
||||||
|
adig.exe: $(OBJ_DIR) $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib
|
||||||
|
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib $(EX_LIBS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
- del $(OBJ_DIR)\*.obj *.ilk *.pdb *.pbt *.pbi *.pbo *._xe *.map
|
||||||
|
|
||||||
|
vclean realclean: clean
|
||||||
|
- del $(DEF_FILE) cares.lib cares_imp.* cares.dll ahost.exe adig.exe
|
||||||
|
- rd $(OBJ_DIR)
|
||||||
|
|
||||||
|
.c{$(OBJ_DIR)}.obj:
|
||||||
|
$(CC) $(CFLAGS) -Fo$*.obj -c $<
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright "gcc -MM .."
|
||||||
|
#
|
||||||
|
$(OBJ_DIR)\ares_fds.obj: ares_fds.c setup.h ares.h ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_process.obj: ares_process.c setup.h nameser.h ares.h ares_dns.h \
|
||||||
|
ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_free_hostent.obj: ares_free_hostent.c setup.h ares.h ares_private.h \
|
||||||
|
ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_query.obj: ares_query.c setup.h nameser.h ares.h ares_dns.h \
|
||||||
|
ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares__close_sockets.obj: ares__close_sockets.c setup.h ares.h \
|
||||||
|
ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_free_string.obj: ares_free_string.c setup.h ares.h
|
||||||
|
$(OBJ_DIR)\ares_search.obj: ares_search.c setup.h nameser.h ares.h ares_private.h \
|
||||||
|
ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares__get_hostent.obj: ares__get_hostent.c setup.h ares.h ares_private.h \
|
||||||
|
ares_ipv6.h inet_net_pton.h
|
||||||
|
$(OBJ_DIR)\ares_gethostbyaddr.obj: ares_gethostbyaddr.c setup.h nameser.h ares.h \
|
||||||
|
ares_private.h ares_ipv6.h inet_net_pton.h
|
||||||
|
$(OBJ_DIR)\ares_send.obj: ares_send.c setup.h nameser.h ares.h ares_dns.h \
|
||||||
|
ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares__read_line.obj: ares__read_line.c setup.h ares.h ares_private.h \
|
||||||
|
ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_gethostbyname.obj: ares_gethostbyname.c setup.h nameser.h ares.h \
|
||||||
|
ares_private.h ares_ipv6.h inet_net_pton.h bitncmp.h
|
||||||
|
$(OBJ_DIR)\ares_strerror.obj: ares_strerror.c setup.h ares.h
|
||||||
|
$(OBJ_DIR)\ares_cancel.obj: ares_cancel.c setup.h ares.h ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_init.obj: ares_init.c setup.h nameser.h ares.h ares_private.h \
|
||||||
|
ares_ipv6.h inet_net_pton.h
|
||||||
|
$(OBJ_DIR)\ares_timeout.obj: ares_timeout.c setup.h ares.h ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_destroy.obj: ares_destroy.c setup.h ares.h ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_mkquery.obj: ares_mkquery.c setup.h nameser.h ares.h ares_dns.h
|
||||||
|
$(OBJ_DIR)\ares_version.obj: ares_version.c setup.h ares_version.h
|
||||||
|
$(OBJ_DIR)\ares_expand_name.obj: ares_expand_name.c setup.h nameser.h ares.h \
|
||||||
|
ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_parse_a_reply.obj: ares_parse_a_reply.c setup.h nameser.h ares.h \
|
||||||
|
ares_dns.h ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\windows_port.obj: windows_port.c setup.h nameser.h ares.h ares_private.h \
|
||||||
|
ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_expand_string.obj: ares_expand_string.c setup.h nameser.h ares.h \
|
||||||
|
ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_parse_ptr_reply.obj: ares_parse_ptr_reply.c setup.h nameser.h ares.h \
|
||||||
|
ares_dns.h ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_parse_aaaa_reply.obj: ares_parse_aaaa_reply.c setup.h nameser.h ares.h \
|
||||||
|
ares_dns.h inet_net_pton.h ares_private.h ares_ipv6.h
|
||||||
|
$(OBJ_DIR)\ares_getnameinfo.obj: ares_getnameinfo.c setup.h nameser.h ares.h \
|
||||||
|
ares_private.h ares_ipv6.h inet_ntop.h
|
||||||
|
$(OBJ_DIR)\inet_net_pton.obj: inet_net_pton.c setup.h nameser.h ares_ipv6.h \
|
||||||
|
inet_net_pton.h
|
||||||
|
$(OBJ_DIR)\bitncmp.obj: bitncmp.c bitncmp.h
|
||||||
|
$(OBJ_DIR)\inet_ntop.obj: inet_ntop.c setup.h nameser.h ares_ipv6.h inet_ntop.h
|
||||||
@@ -1,4 +1,637 @@
|
|||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_HEADER_WINDOWS
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for compilable and valid windows.h header
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [
|
||||||
|
AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
],[
|
||||||
|
int dummy=2*WINVER;
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
ac_cv_header_windows_h="yes"
|
||||||
|
],[
|
||||||
|
ac_cv_header_windows_h="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
if test "x$ac_cv_header_windows_h" = "xyes"; then
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1,
|
||||||
|
[Define to 1 if you have the windows.h header file.])
|
||||||
|
AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1,
|
||||||
|
[Define to avoid automatic inclusion of winsock.h])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_HEADER_WINSOCK
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for compilable and valid winsock.h header
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
|
||||||
|
AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winsock.h>
|
||||||
|
],[
|
||||||
|
int dummy=WSACleanup();
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
ac_cv_header_winsock_h="yes"
|
||||||
|
],[
|
||||||
|
ac_cv_header_winsock_h="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
if test "x$ac_cv_header_winsock_h" = "xyes"; then
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1,
|
||||||
|
[Define to 1 if you have the winsock.h header file.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_HEADER_WINSOCK2
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for compilable and valid winsock2.h header
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
|
||||||
|
AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winsock2.h>
|
||||||
|
],[
|
||||||
|
int dummy=2*IPPROTO_ESP;
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
ac_cv_header_winsock2_h="yes"
|
||||||
|
],[
|
||||||
|
ac_cv_header_winsock2_h="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
if test "x$ac_cv_header_winsock2_h" = "xyes"; then
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1,
|
||||||
|
[Define to 1 if you have the winsock2.h header file.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_HEADER_WS2TCPIP
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for compilable and valid ws2tcpip.h header
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
|
||||||
|
AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
],[
|
||||||
|
int dummy=2*IP_PKTINFO;
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
ac_cv_header_ws2tcpip_h="yes"
|
||||||
|
],[
|
||||||
|
ac_cv_header_ws2tcpip_h="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
if test "x$ac_cv_header_ws2tcpip_h" = "xyes"; then
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1,
|
||||||
|
[Define to 1 if you have the ws2tcpip.h header file.])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_TYPE_SOCKLEN_T
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for existing socklen_t type, and provide
|
||||||
|
dnl an equivalent type if socklen_t not available
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
|
||||||
|
AC_CHECK_TYPE([socklen_t], ,[
|
||||||
|
AC_CACHE_CHECK([for socklen_t equivalent],
|
||||||
|
[curl_cv_socklen_t_equiv], [
|
||||||
|
curl_cv_socklen_t_equiv="unknown"
|
||||||
|
for arg2 in "struct sockaddr" void; do
|
||||||
|
for t in int size_t unsigned long "unsigned long"; do
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
int getpeername (int, $arg2 *, $t *);
|
||||||
|
],[
|
||||||
|
$t len=0;
|
||||||
|
getpeername(0,0,&len);
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
curl_cv_socklen_t_equiv="$t"
|
||||||
|
break 2
|
||||||
|
])
|
||||||
|
done
|
||||||
|
done
|
||||||
|
])
|
||||||
|
if test "$curl_cv_socklen_t_equiv" = "unknown"; then
|
||||||
|
AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
|
||||||
|
else
|
||||||
|
AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
|
||||||
|
[type to use in place of socklen_t if not defined])
|
||||||
|
fi
|
||||||
|
],[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_FUNC_GETNAMEINFO
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Test if the getnameinfo function is available,
|
||||||
|
dnl and check the types of five of its arguments.
|
||||||
|
dnl If the function succeeds HAVE_GETNAMEINFO will be
|
||||||
|
dnl defined, defining the types of the arguments in
|
||||||
|
dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2,
|
||||||
|
dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7.
|
||||||
|
dnl This function is experimental and its results shall
|
||||||
|
dnl not be trusted while this notice is in place ------
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
|
||||||
|
AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl
|
||||||
|
AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h)
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING([for getnameinfo])
|
||||||
|
AC_LINK_IFELSE([
|
||||||
|
AC_LANG_FUNC_LINK_TRY([getnameinfo])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
curl_cv_getnameinfo="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
curl_cv_getnameinfo="no"
|
||||||
|
])
|
||||||
|
#
|
||||||
|
if test "$curl_cv_getnameinfo" != "yes"; then
|
||||||
|
AC_MSG_CHECKING([deeper for getnameinfo])
|
||||||
|
AC_TRY_LINK([
|
||||||
|
],[
|
||||||
|
getnameinfo();
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
curl_cv_getnameinfo="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([but still no])
|
||||||
|
curl_cv_getnameinfo="no"
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
if test "$curl_cv_getnameinfo" != "yes"; then
|
||||||
|
AC_MSG_CHECKING([deeper and deeper for getnameinfo])
|
||||||
|
AC_TRY_LINK([
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETDB_H
|
||||||
|
#include <netdb.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
],[
|
||||||
|
getnameinfo(0, 0, 0, 0, 0, 0, 0);
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
curl_cv_getnameinfo="yes"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([but still no])
|
||||||
|
curl_cv_getnameinfo="no"
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
if test "$curl_cv_getnameinfo" = "yes"; then
|
||||||
|
AC_CACHE_CHECK([types of arguments for getnameinfo],
|
||||||
|
[curl_cv_func_getnameinfo_args], [
|
||||||
|
curl_cv_func_getnameinfo_args="unknown"
|
||||||
|
for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
|
||||||
|
for gni_arg2 in 'socklen_t' 'size_t' 'int'; do
|
||||||
|
for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int' 'DWORD'; do
|
||||||
|
for gni_arg7 in 'int' 'unsigned int'; do
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501)
|
||||||
|
#undef _WIN32_WINNT
|
||||||
|
#define _WIN32_WINNT 0x0501
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#define GNICALLCONV WSAAPI
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETDB_H
|
||||||
|
#include <netdb.h>
|
||||||
|
#endif
|
||||||
|
#define GNICALLCONV
|
||||||
|
#endif
|
||||||
|
extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2,
|
||||||
|
char *, $gni_arg46,
|
||||||
|
char *, $gni_arg46,
|
||||||
|
$gni_arg7);
|
||||||
|
],[
|
||||||
|
$gni_arg2 salen=0;
|
||||||
|
$gni_arg46 hostlen=0;
|
||||||
|
$gni_arg46 servlen=0;
|
||||||
|
$gni_arg7 flags=0;
|
||||||
|
int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags);
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7"
|
||||||
|
break 4
|
||||||
|
])
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done
|
||||||
|
]) # AC_CACHE_CHECK
|
||||||
|
if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
|
||||||
|
AC_MSG_WARN([Cannot find proper types to use for getnameinfo args])
|
||||||
|
AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined])
|
||||||
|
else
|
||||||
|
gni_prev_IFS=$IFS; IFS=','
|
||||||
|
set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'`
|
||||||
|
IFS=$gni_prev_IFS
|
||||||
|
shift
|
||||||
|
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $[1],
|
||||||
|
[Define to the type of arg 1 for getnameinfo.])
|
||||||
|
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2],
|
||||||
|
[Define to the type of arg 2 for getnameinfo.])
|
||||||
|
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3],
|
||||||
|
[Define to the type of args 4 and 6 for getnameinfo.])
|
||||||
|
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4],
|
||||||
|
[Define to the type of arg 7 for getnameinfo.])
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1,
|
||||||
|
[Define to 1 if you have the getnameinfo function.])
|
||||||
|
ac_cv_func_getnameinfo="yes"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
]) # AC_DEFUN
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_NONBLOCKING_SOCKET
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for how to set a socket to non-blocking state. There seems to exist
|
||||||
|
dnl four known different ways, with the one used almost everywhere being POSIX
|
||||||
|
dnl and XPG3, while the other different ways for different systems (old BSD,
|
||||||
|
dnl Windows and Amiga).
|
||||||
|
dnl
|
||||||
|
dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the
|
||||||
|
dnl O_NONBLOCK define is found but does not work. This condition is attempted
|
||||||
|
dnl to get caught in this script by using an excessive number of #ifdefs...
|
||||||
|
dnl
|
||||||
|
AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],
|
||||||
|
[
|
||||||
|
AC_MSG_CHECKING([non-blocking sockets style])
|
||||||
|
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
/* headers for O_NONBLOCK test */
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
],[
|
||||||
|
/* try to compile O_NONBLOCK */
|
||||||
|
|
||||||
|
#if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
||||||
|
# if defined(__SVR4) || defined(__srv4__)
|
||||||
|
# define PLATFORM_SOLARIS
|
||||||
|
# else
|
||||||
|
# define PLATFORM_SUNOS4
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4)
|
||||||
|
# define PLATFORM_AIX_V3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)
|
||||||
|
#error "O_NONBLOCK does not work on this platform"
|
||||||
|
#endif
|
||||||
|
int socket;
|
||||||
|
int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);
|
||||||
|
],[
|
||||||
|
dnl the O_NONBLOCK test was fine
|
||||||
|
nonblock="O_NONBLOCK"
|
||||||
|
AC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets])
|
||||||
|
],[
|
||||||
|
dnl the code was bad, try a different program now, test 2
|
||||||
|
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
/* headers for FIONBIO test */
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stropts.h>
|
||||||
|
],[
|
||||||
|
/* FIONBIO source test (old-style unix) */
|
||||||
|
int socket;
|
||||||
|
int flags = ioctl(socket, FIONBIO, &flags);
|
||||||
|
],[
|
||||||
|
dnl FIONBIO test was good
|
||||||
|
nonblock="FIONBIO"
|
||||||
|
AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])
|
||||||
|
],[
|
||||||
|
dnl FIONBIO test was also bad
|
||||||
|
dnl the code was bad, try a different program now, test 3
|
||||||
|
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
/* headers for ioctlsocket test (Windows) */
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
],[
|
||||||
|
/* ioctlsocket source code */
|
||||||
|
SOCKET sd;
|
||||||
|
unsigned long flags = 0;
|
||||||
|
sd = socket(0, 0, 0);
|
||||||
|
ioctlsocket(sd, FIONBIO, &flags);
|
||||||
|
],[
|
||||||
|
dnl ioctlsocket test was good
|
||||||
|
nonblock="ioctlsocket"
|
||||||
|
AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])
|
||||||
|
],[
|
||||||
|
dnl ioctlsocket didnt compile!, go to test 4
|
||||||
|
|
||||||
|
AC_TRY_LINK([
|
||||||
|
/* headers for IoctlSocket test (Amiga?) */
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
],[
|
||||||
|
/* IoctlSocket source code */
|
||||||
|
int socket;
|
||||||
|
int flags = IoctlSocket(socket, FIONBIO, (long)1);
|
||||||
|
],[
|
||||||
|
dnl ioctlsocket test was good
|
||||||
|
nonblock="IoctlSocket"
|
||||||
|
AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])
|
||||||
|
],[
|
||||||
|
dnl Ioctlsocket didnt compile, do test 5!
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
/* headers for SO_NONBLOCK test (BeOS) */
|
||||||
|
#include <socket.h>
|
||||||
|
],[
|
||||||
|
/* SO_NONBLOCK source code */
|
||||||
|
long b = 1;
|
||||||
|
int socket;
|
||||||
|
int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
|
||||||
|
],[
|
||||||
|
dnl the SO_NONBLOCK test was good
|
||||||
|
nonblock="SO_NONBLOCK"
|
||||||
|
AC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets])
|
||||||
|
],[
|
||||||
|
dnl test 5 didnt compile!
|
||||||
|
nonblock="nada"
|
||||||
|
AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])
|
||||||
|
])
|
||||||
|
dnl end of fifth test
|
||||||
|
|
||||||
|
])
|
||||||
|
dnl end of forth test
|
||||||
|
|
||||||
|
])
|
||||||
|
dnl end of third test
|
||||||
|
|
||||||
|
])
|
||||||
|
dnl end of second test
|
||||||
|
|
||||||
|
])
|
||||||
|
dnl end of non-blocking try-compile test
|
||||||
|
AC_MSG_RESULT($nonblock)
|
||||||
|
|
||||||
|
if test "$nonblock" = "nada"; then
|
||||||
|
AC_MSG_WARN([non-block sockets disabled])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl TYPE_SOCKADDR_STORAGE
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but
|
||||||
|
dnl AIX 4.3 is one known exception.
|
||||||
|
AC_DEFUN([TYPE_SOCKADDR_STORAGE],
|
||||||
|
[
|
||||||
|
AC_CHECK_TYPE([struct sockaddr_storage],
|
||||||
|
AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
|
||||||
|
[if struct sockaddr_storage is defined]), ,
|
||||||
|
[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_INET_H
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl TYPE_IN_ADDR_T
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
|
||||||
|
dnl and a few other things.
|
||||||
|
AC_DEFUN([TYPE_IN_ADDR_T],
|
||||||
|
[
|
||||||
|
AC_CHECK_TYPE([in_addr_t], ,[
|
||||||
|
AC_MSG_CHECKING([for in_addr_t equivalent])
|
||||||
|
AC_CACHE_VAL([curl_cv_in_addr_t_equiv],
|
||||||
|
[
|
||||||
|
curl_cv_in_addr_t_equiv=
|
||||||
|
for t in "unsigned long" int size_t unsigned long; do
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_INET_H
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
],[
|
||||||
|
$t data = inet_addr ("1.2.3.4");
|
||||||
|
],[
|
||||||
|
curl_cv_in_addr_t_equiv="$t"
|
||||||
|
break
|
||||||
|
])
|
||||||
|
done
|
||||||
|
|
||||||
|
if test "x$curl_cv_in_addr_t_equiv" = x; then
|
||||||
|
AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
AC_MSG_RESULT($curl_cv_in_addr_t_equiv)
|
||||||
|
AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
|
||||||
|
[type to use in place of in_addr_t if not defined])],
|
||||||
|
[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_INET_H
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
]) dnl AC_CHECK_TYPE
|
||||||
|
]) dnl AC_DEFUN
|
||||||
|
|
||||||
|
|
||||||
dnl We create a function for detecting which compiler we use and then set as
|
dnl We create a function for detecting which compiler we use and then set as
|
||||||
dnl pendantic compiler options as possible for that particular compiler. The
|
dnl pendantic compiler options as possible for that particular compiler. The
|
||||||
dnl options are only used for debug-builds.
|
dnl options are only used for debug-builds.
|
||||||
@@ -99,3 +732,97 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
|||||||
|
|
||||||
]) dnl end of AC_DEFUN()
|
]) dnl end of AC_DEFUN()
|
||||||
|
|
||||||
|
|
||||||
|
dnl This macro determines if the specified struct exists in the specified file
|
||||||
|
dnl Syntax:
|
||||||
|
dnl CARES_CHECK_STRUCT(headers, struct name, if found, [if not found])
|
||||||
|
|
||||||
|
AC_DEFUN([CARES_CHECK_STRUCT], [
|
||||||
|
AC_MSG_CHECKING([for struct $2])
|
||||||
|
AC_TRY_COMPILE([$1],
|
||||||
|
[
|
||||||
|
struct $2 struct_instance;
|
||||||
|
], ac_struct="yes", ac_found="no")
|
||||||
|
if test "$ac_struct" = "yes" ; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
$3
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
$4
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl This macro determines if the specified constant exists in the specified file
|
||||||
|
dnl Syntax:
|
||||||
|
dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found])
|
||||||
|
|
||||||
|
AC_DEFUN([CARES_CHECK_CONSTANT], [
|
||||||
|
AC_MSG_CHECKING([for $2])
|
||||||
|
AC_EGREP_CPP(VARIABLEWASDEFINED,
|
||||||
|
[
|
||||||
|
$1
|
||||||
|
|
||||||
|
#ifdef $2
|
||||||
|
VARIABLEWASDEFINED
|
||||||
|
#else
|
||||||
|
NJET
|
||||||
|
#endif
|
||||||
|
], ac_constant="yes", ac_constant="no"
|
||||||
|
)
|
||||||
|
if test "$ac_constant" = "yes" ; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
$3
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
$4
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl This macro determines how many parameters getservbyport_r takes
|
||||||
|
AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [
|
||||||
|
AC_MSG_CHECKING([how many arguments getservbyport_r takes])
|
||||||
|
AC_TRY_LINK(
|
||||||
|
[#include <netdb.h>],
|
||||||
|
[
|
||||||
|
int p1, p5;
|
||||||
|
char *p2, p4[4096];
|
||||||
|
struct servent *p3, *p6;
|
||||||
|
getservbyport_r(p1, p2, p3, p4, p5, &p6);
|
||||||
|
], ac_func_getservbyport_r=6,
|
||||||
|
[AC_TRY_LINK(
|
||||||
|
[#include <netdb.h>],
|
||||||
|
[
|
||||||
|
int p1, p5;
|
||||||
|
char *p2, p4[4096];
|
||||||
|
struct servent *p3;
|
||||||
|
getservbyport_r(p1, p2, p3, p4, p5);
|
||||||
|
], ac_func_getservbyport_r=5,
|
||||||
|
[AC_TRY_LINK(
|
||||||
|
[#include <netdb.h>],
|
||||||
|
[
|
||||||
|
int p1;
|
||||||
|
char *p2;
|
||||||
|
struct servent *p3;
|
||||||
|
struct servent_data p4;
|
||||||
|
getservbyport_r(p1, p2, p3, &p4);
|
||||||
|
], ac_func_getservbyport_r=4, ac_func_getservbyport_r=0
|
||||||
|
)]
|
||||||
|
)]
|
||||||
|
)
|
||||||
|
if test $ac_func_getservbyport_r != "0" ; then
|
||||||
|
AC_MSG_RESULT($ac_func_getservbyport_r)
|
||||||
|
AC_DEFINE(HAVE_GETSERVBYPORT_R, 1, [Specifies whether getservbyport_r is present])
|
||||||
|
AC_DEFINE_UNQUOTED(GETSERVBYPORT_R_ARGS, $ac_func_getservbyport_r, [Specifies the number of arguments to
|
||||||
|
getservbyport_r])
|
||||||
|
if test $ac_func_getservbyport_r = "4" ; then
|
||||||
|
AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, sizeof(struct servent_data), [Specifies the size of the buffer to pass to
|
||||||
|
getservbyport_r])
|
||||||
|
else
|
||||||
|
AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, 4096, [Specifies the size of the buffer to pass to getservbyport_r])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([not found])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|||||||
45
ares/adig.c
45
ares/adig.c
@@ -27,14 +27,23 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_GETOPT_H
|
||||||
|
#include <getopt.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_dns.h"
|
#include "ares_dns.h"
|
||||||
|
#include "inet_ntop.h"
|
||||||
|
|
||||||
|
#ifdef WATT32
|
||||||
|
#undef WIN32 /* Redefined in MingW headers */
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef INADDR_NONE
|
#ifndef INADDR_NONE
|
||||||
#define INADDR_NONE 0xffffffff
|
#define INADDR_NONE 0xffffffff
|
||||||
@@ -45,8 +54,10 @@
|
|||||||
#define T_SRV 33 /* server selection */
|
#define T_SRV 33 /* server selection */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef optind
|
||||||
extern int optind;
|
extern int optind;
|
||||||
extern char *optarg;
|
extern char *optarg;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct nv {
|
struct nv {
|
||||||
const char *name;
|
const char *name;
|
||||||
@@ -216,7 +227,7 @@ int main(int argc, char **argv)
|
|||||||
/* Set the TCP port number. */
|
/* Set the TCP port number. */
|
||||||
if (!isdigit((unsigned char)*optarg))
|
if (!isdigit((unsigned char)*optarg))
|
||||||
usage();
|
usage();
|
||||||
options.tcp_port = strtol(optarg, NULL, 0);
|
options.tcp_port = (unsigned short)strtol(optarg, NULL, 0);
|
||||||
optmask |= ARES_OPT_TCP_PORT;
|
optmask |= ARES_OPT_TCP_PORT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -224,7 +235,7 @@ int main(int argc, char **argv)
|
|||||||
/* Set the UDP port number. */
|
/* Set the UDP port number. */
|
||||||
if (!isdigit((unsigned char)*optarg))
|
if (!isdigit((unsigned char)*optarg))
|
||||||
usage();
|
usage();
|
||||||
options.udp_port = strtol(optarg, NULL, 0);
|
options.udp_port = (unsigned short)strtol(optarg, NULL, 0);
|
||||||
optmask |= ARES_OPT_UDP_PORT;
|
optmask |= ARES_OPT_UDP_PORT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -412,7 +423,7 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
char *name;
|
char *name;
|
||||||
int type, dnsclass, ttl, dlen, status;
|
int type, dnsclass, ttl, dlen, status;
|
||||||
long len;
|
long len;
|
||||||
struct in_addr addr;
|
char addr[46];
|
||||||
|
|
||||||
/* Parse the RR name. */
|
/* Parse the RR name. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &name, &len);
|
status = ares_expand_name(aptr, abuf, alen, &name, &len);
|
||||||
@@ -474,12 +485,12 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
len = *p;
|
len = *p;
|
||||||
if (p + len + 1 > aptr + dlen)
|
if (p + len + 1 > aptr + dlen)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t%.*s", len, p + 1);
|
printf("\t%.*s", (int)len, p + 1);
|
||||||
p += len + 1;
|
p += len + 1;
|
||||||
len = *p;
|
len = *p;
|
||||||
if (p + len + 1 > aptr + dlen)
|
if (p + len + 1 > aptr + dlen)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t%.*s", len, p + 1);
|
printf("\t%.*s", (int)len, p + 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_MINFO:
|
case T_MINFO:
|
||||||
@@ -504,7 +515,7 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
*/
|
*/
|
||||||
if (dlen < 2)
|
if (dlen < 2)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t%d", (aptr[0] << 8) | aptr[1]);
|
printf("\t%d", DNS__16BIT(aptr));
|
||||||
status = ares_expand_name(aptr + 2, abuf, alen, &name, &len);
|
status = ares_expand_name(aptr + 2, abuf, alen, &name, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -531,12 +542,9 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
p += len;
|
p += len;
|
||||||
if (p + 20 > aptr + dlen)
|
if (p + 20 > aptr + dlen)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t\t\t\t\t\t( %d %d %d %d %d )",
|
printf("\t\t\t\t\t\t( %lu %lu %lu %lu %lu )",
|
||||||
(p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3],
|
DNS__32BIT(p), DNS__32BIT(p+4), DNS__32BIT(p+8),
|
||||||
(p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7],
|
DNS__32BIT(p+12), DNS__32BIT(p+16));
|
||||||
(p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11],
|
|
||||||
(p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15],
|
|
||||||
(p[16] << 24) | (p[17] << 16) | (p[18] << 8) | p[19]);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_TXT:
|
case T_TXT:
|
||||||
@@ -548,7 +556,7 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
len = *p;
|
len = *p;
|
||||||
if (p + len + 1 > aptr + dlen)
|
if (p + len + 1 > aptr + dlen)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t%.*s", len, p + 1);
|
printf("\t%.*s", (int)len, p + 1);
|
||||||
p += len + 1;
|
p += len + 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -557,8 +565,14 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
/* The RR data is a four-byte Internet address. */
|
/* The RR data is a four-byte Internet address. */
|
||||||
if (dlen != 4)
|
if (dlen != 4)
|
||||||
return NULL;
|
return NULL;
|
||||||
memcpy(&addr, aptr, sizeof(struct in_addr));
|
printf("\t%s", ares_inet_ntop(AF_INET,aptr,addr,sizeof(addr)));
|
||||||
printf("\t%s", inet_ntoa(addr));
|
break;
|
||||||
|
|
||||||
|
case T_AAAA:
|
||||||
|
/* The RR data is a 16-byte IPv6 address. */
|
||||||
|
if (dlen != 16)
|
||||||
|
return NULL;
|
||||||
|
printf("\t%s", ares_inet_ntop(AF_INET6,aptr,addr,sizeof(addr)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_WKS:
|
case T_WKS:
|
||||||
@@ -583,6 +597,7 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
printf("\t[Unknown RR; cannot parse]");
|
printf("\t[Unknown RR; cannot parse]");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
|
|||||||
48
ares/ahost.c
48
ares/ahost.c
@@ -29,13 +29,23 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_dns.h"
|
#include "ares_dns.h"
|
||||||
|
#include "inet_ntop.h"
|
||||||
|
#include "inet_net_pton.h"
|
||||||
|
|
||||||
#ifndef INADDR_NONE
|
#ifndef INADDR_NONE
|
||||||
#define INADDR_NONE 0xffffffff
|
#define INADDR_NONE 0xffffffff
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_STRUCT_IN6_ADDR
|
||||||
|
struct in6_addr
|
||||||
|
{
|
||||||
|
unsigned char s6_addr[16];
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static void callback(void *arg, int status, struct hostent *host);
|
static void callback(void *arg, int status, struct hostent *host);
|
||||||
static void usage(void);
|
static void usage(void);
|
||||||
|
|
||||||
@@ -45,7 +55,8 @@ int main(int argc, char **argv)
|
|||||||
int status, nfds;
|
int status, nfds;
|
||||||
fd_set read_fds, write_fds;
|
fd_set read_fds, write_fds;
|
||||||
struct timeval *tvp, tv;
|
struct timeval *tvp, tv;
|
||||||
struct in_addr addr;
|
struct in_addr addr4;
|
||||||
|
struct in6_addr addr6;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
WORD wVersionRequested = MAKEWORD(1,1);
|
WORD wVersionRequested = MAKEWORD(1,1);
|
||||||
@@ -66,13 +77,20 @@ int main(int argc, char **argv)
|
|||||||
/* Initiate the queries, one per command-line argument. */
|
/* Initiate the queries, one per command-line argument. */
|
||||||
for (argv++; *argv; argv++)
|
for (argv++; *argv; argv++)
|
||||||
{
|
{
|
||||||
addr.s_addr = inet_addr(*argv);
|
if (ares_inet_pton(AF_INET, *argv, &addr4) == 1)
|
||||||
if (addr.s_addr == INADDR_NONE)
|
{
|
||||||
ares_gethostbyname(channel, *argv, AF_INET, callback, *argv);
|
ares_gethostbyaddr(channel, &addr4, sizeof(addr4), AF_INET, callback,
|
||||||
|
*argv);
|
||||||
|
}
|
||||||
|
else if (ares_inet_pton(AF_INET6, *argv, &addr6) == 1)
|
||||||
|
{
|
||||||
|
ares_gethostbyaddr(channel, &addr6, sizeof(addr6), AF_INET6, callback,
|
||||||
|
*argv);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ares_gethostbyaddr(channel, &addr, sizeof(addr), AF_INET, callback,
|
/* assume user wants A-records */
|
||||||
*argv);
|
ares_gethostbyname(channel, *argv, AF_INET, callback, *argv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,7 +113,6 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
static void callback(void *arg, int status, struct hostent *host)
|
static void callback(void *arg, int status, struct hostent *host)
|
||||||
{
|
{
|
||||||
struct in_addr addr;
|
|
||||||
char **p;
|
char **p;
|
||||||
|
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
@@ -106,8 +123,21 @@ static void callback(void *arg, int status, struct hostent *host)
|
|||||||
|
|
||||||
for (p = host->h_addr_list; *p; p++)
|
for (p = host->h_addr_list; *p; p++)
|
||||||
{
|
{
|
||||||
memcpy(&addr, *p, sizeof(struct in_addr));
|
char addr_buf[46] = "??";
|
||||||
printf("%-32s\t%s\n", host->h_name, inet_ntoa(addr));
|
|
||||||
|
ares_inet_ntop(host->h_addrtype, *p, addr_buf, sizeof(addr_buf));
|
||||||
|
printf("%-32s\t%s", host->h_name, addr_buf);
|
||||||
|
#if 0
|
||||||
|
if (host->h_aliases[0])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
printf (", Aliases: ");
|
||||||
|
for (i = 0; host->h_aliases[i]; i++)
|
||||||
|
printf("%s ", host->h_aliases[i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
puts("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
64
ares/ares.h
64
ares/ares.h
@@ -29,12 +29,14 @@
|
|||||||
|
|
||||||
#if defined(WATT32)
|
#if defined(WATT32)
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
#include <tcp.h>
|
#include <tcp.h>
|
||||||
#elif defined(WIN32)
|
#elif defined(WIN32)
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#else
|
#else
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -64,6 +66,13 @@ extern "C" {
|
|||||||
#define ARES_EDESTRUCTION 16
|
#define ARES_EDESTRUCTION 16
|
||||||
#define ARES_EBADSTR 17
|
#define ARES_EBADSTR 17
|
||||||
|
|
||||||
|
/* ares_getnameinfo error codes */
|
||||||
|
#define ARES_EBADFLAGS 18
|
||||||
|
|
||||||
|
/* ares_getaddrinfo error codes */
|
||||||
|
#define ARES_ENONAME 19
|
||||||
|
#define ARES_EBADHINTS 20
|
||||||
|
|
||||||
/* Flag values */
|
/* Flag values */
|
||||||
#define ARES_FLAG_USEVC (1 << 0)
|
#define ARES_FLAG_USEVC (1 << 0)
|
||||||
#define ARES_FLAG_PRIMARY (1 << 1)
|
#define ARES_FLAG_PRIMARY (1 << 1)
|
||||||
@@ -85,6 +94,47 @@ extern "C" {
|
|||||||
#define ARES_OPT_DOMAINS (1 << 7)
|
#define ARES_OPT_DOMAINS (1 << 7)
|
||||||
#define ARES_OPT_LOOKUPS (1 << 8)
|
#define ARES_OPT_LOOKUPS (1 << 8)
|
||||||
|
|
||||||
|
/* Nameinfo flag values */
|
||||||
|
#define ARES_NI_NOFQDN (1 << 0)
|
||||||
|
#define ARES_NI_NUMERICHOST (1 << 1)
|
||||||
|
#define ARES_NI_NAMEREQD (1 << 2)
|
||||||
|
#define ARES_NI_NUMERICSERV (1 << 3)
|
||||||
|
#define ARES_NI_DGRAM (1 << 4)
|
||||||
|
#define ARES_NI_TCP 0
|
||||||
|
#define ARES_NI_UDP ARES_NI_DGRAM
|
||||||
|
#define ARES_NI_SCTP (1 << 5)
|
||||||
|
#define ARES_NI_DCCP (1 << 6)
|
||||||
|
#define ARES_NI_NUMERICSCOPE (1 << 7)
|
||||||
|
#define ARES_NI_LOOKUPHOST (1 << 8)
|
||||||
|
#define ARES_NI_LOOKUPSERVICE (1 << 9)
|
||||||
|
/* Reserved for future use */
|
||||||
|
#define ARES_NI_IDN (1 << 10)
|
||||||
|
#define ARES_NI_IDN_ALLOW_UNASSIGNED (1 << 11)
|
||||||
|
#define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12)
|
||||||
|
|
||||||
|
/* Addrinfo flag values */
|
||||||
|
#define ARES_AI_CANONNAME (1 << 0)
|
||||||
|
#define ARES_AI_NUMERICHOST (1 << 1)
|
||||||
|
#define ARES_AI_PASSIVE (1 << 2)
|
||||||
|
#define ARES_AI_NUMERICSERV (1 << 3)
|
||||||
|
#define ARES_AI_V4MAPPED (1 << 4)
|
||||||
|
#define ARES_AI_ALL (1 << 5)
|
||||||
|
#define ARES_AI_ADDRCONFIG (1 << 6)
|
||||||
|
/* Reserved for future use */
|
||||||
|
#define ARES_AI_IDN (1 << 10)
|
||||||
|
#define ARES_AI_IDN_ALLOW_UNASSIGNED (1 << 11)
|
||||||
|
#define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12)
|
||||||
|
#define ARES_AI_CANONIDN (1 << 13)
|
||||||
|
|
||||||
|
#define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \
|
||||||
|
ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \
|
||||||
|
ARES_AI_ADDRCONFIG)
|
||||||
|
#define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about this
|
||||||
|
many sockets */
|
||||||
|
#define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num)))
|
||||||
|
#define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \
|
||||||
|
ARES_GETSOCK_MAXNUM)))
|
||||||
|
|
||||||
struct ares_options {
|
struct ares_options {
|
||||||
int flags;
|
int flags;
|
||||||
int timeout;
|
int timeout;
|
||||||
@@ -101,12 +151,15 @@ struct ares_options {
|
|||||||
|
|
||||||
struct hostent;
|
struct hostent;
|
||||||
struct timeval;
|
struct timeval;
|
||||||
|
struct sockaddr;
|
||||||
struct ares_channeldata;
|
struct ares_channeldata;
|
||||||
typedef struct ares_channeldata *ares_channel;
|
typedef struct ares_channeldata *ares_channel;
|
||||||
typedef void (*ares_callback)(void *arg, int status, unsigned char *abuf,
|
typedef void (*ares_callback)(void *arg, int status, unsigned char *abuf,
|
||||||
int alen);
|
int alen);
|
||||||
typedef void (*ares_host_callback)(void *arg, int status,
|
typedef void (*ares_host_callback)(void *arg, int status,
|
||||||
struct hostent *hostent);
|
struct hostent *hostent);
|
||||||
|
typedef void (*ares_nameinfo_callback)(void *arg, int status,
|
||||||
|
char *node, char *service);
|
||||||
|
|
||||||
int ares_init(ares_channel *channelptr);
|
int ares_init(ares_channel *channelptr);
|
||||||
int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||||
@@ -123,8 +176,12 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family,
|
|||||||
ares_host_callback callback, void *arg);
|
ares_host_callback callback, void *arg);
|
||||||
void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
|
void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
|
||||||
int family, ares_host_callback callback, void *arg);
|
int family, ares_host_callback callback, void *arg);
|
||||||
|
void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa,
|
||||||
|
socklen_t salen, int flags,
|
||||||
|
ares_nameinfo_callback callback,
|
||||||
|
void *arg);
|
||||||
int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds);
|
int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds);
|
||||||
|
int ares_getsock(ares_channel channel, int *socks, int numsocks);
|
||||||
struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
||||||
struct timeval *tv);
|
struct timeval *tv);
|
||||||
void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds);
|
void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds);
|
||||||
@@ -137,12 +194,13 @@ int ares_expand_string(const unsigned char *encoded, const unsigned char *abuf,
|
|||||||
int alen, unsigned char **s, long *enclen);
|
int alen, unsigned char **s, long *enclen);
|
||||||
int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||||
struct hostent **host);
|
struct hostent **host);
|
||||||
|
int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||||
|
struct hostent **host);
|
||||||
int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
||||||
int addrlen, int family, struct hostent **host);
|
int addrlen, int family, struct hostent **host);
|
||||||
void ares_free_string(void *str);
|
void ares_free_string(void *str);
|
||||||
void ares_free_hostent(struct hostent *host);
|
void ares_free_hostent(struct hostent *host);
|
||||||
const char *ares_strerror(int code);
|
const char *ares_strerror(int code);
|
||||||
void ares_free_errmem(char *mem);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,12 +30,15 @@
|
|||||||
|
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
#include "inet_net_pton.h"
|
||||||
|
|
||||||
int ares__get_hostent(FILE *fp, struct hostent **host)
|
int ares__get_hostent(FILE *fp, int family, struct hostent **host)
|
||||||
{
|
{
|
||||||
char *line = NULL, *p, *q, *canonical, **alias;
|
char *line = NULL, *p, *q, *canonical, **alias;
|
||||||
int status, linesize, end_at_hostname, naliases;
|
int status, linesize, end_at_hostname, naliases;
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
|
struct in6_addr addr6;
|
||||||
|
int addrlen = sizeof(struct in_addr);
|
||||||
struct hostent *hostent = NULL;
|
struct hostent *hostent = NULL;
|
||||||
|
|
||||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||||
@@ -56,6 +59,17 @@ int ares__get_hostent(FILE *fp, struct hostent **host)
|
|||||||
*p = 0;
|
*p = 0;
|
||||||
addr.s_addr = inet_addr(line);
|
addr.s_addr = inet_addr(line);
|
||||||
if (addr.s_addr == INADDR_NONE)
|
if (addr.s_addr == INADDR_NONE)
|
||||||
|
{
|
||||||
|
if (ares_inet_pton(AF_INET6, line, &addr6) > 0)
|
||||||
|
{
|
||||||
|
if (family != AF_INET6)
|
||||||
|
continue;
|
||||||
|
addrlen = sizeof(struct in6_addr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (family != AF_INET)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Get the canonical hostname. */
|
/* Get the canonical hostname. */
|
||||||
@@ -100,7 +114,7 @@ int ares__get_hostent(FILE *fp, struct hostent **host)
|
|||||||
hostent->h_addr_list = malloc(2 * sizeof(char *));
|
hostent->h_addr_list = malloc(2 * sizeof(char *));
|
||||||
if (!hostent->h_addr_list)
|
if (!hostent->h_addr_list)
|
||||||
break;
|
break;
|
||||||
hostent->h_addr_list[0] = malloc(sizeof(struct in_addr));
|
hostent->h_addr_list[0] = malloc(addrlen);
|
||||||
if (!hostent->h_addr_list[0])
|
if (!hostent->h_addr_list[0])
|
||||||
break;
|
break;
|
||||||
hostent->h_aliases = malloc((naliases + 1) * sizeof(char *));
|
hostent->h_aliases = malloc((naliases + 1) * sizeof(char *));
|
||||||
@@ -134,9 +148,12 @@ int ares__get_hostent(FILE *fp, struct hostent **host)
|
|||||||
}
|
}
|
||||||
hostent->h_aliases[naliases] = NULL;
|
hostent->h_aliases[naliases] = NULL;
|
||||||
|
|
||||||
hostent->h_addrtype = AF_INET;
|
hostent->h_addrtype = family;
|
||||||
hostent->h_length = sizeof(struct in_addr);
|
hostent->h_length = addrlen;
|
||||||
memcpy(hostent->h_addr_list[0], &addr, sizeof(struct in_addr));
|
if (family == AF_INET)
|
||||||
|
memcpy(hostent->h_addr_list[0], &addr, addrlen);
|
||||||
|
else if (family == AF_INET6)
|
||||||
|
memcpy(hostent->h_addr_list[0], &addr6, addrlen);
|
||||||
hostent->h_addr_list[1] = NULL;
|
hostent->h_addr_list[1] = NULL;
|
||||||
*host = hostent;
|
*host = hostent;
|
||||||
free(line);
|
free(line);
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize)
|
|||||||
if ((*buf)[len - 1] == '\n')
|
if ((*buf)[len - 1] == '\n')
|
||||||
{
|
{
|
||||||
(*buf)[len - 1] = 0;
|
(*buf)[len - 1] = 0;
|
||||||
return ARES_SUCCESS;
|
break;
|
||||||
}
|
}
|
||||||
offset = len;
|
offset = len;
|
||||||
|
|
||||||
@@ -61,4 +61,5 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize)
|
|||||||
*buf = newbuf;
|
*buf = newbuf;
|
||||||
*bufsize *= 2;
|
*bufsize *= 2;
|
||||||
}
|
}
|
||||||
|
return ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,6 @@ might have been stored in their arguments.
|
|||||||
.BR ares_init (3)
|
.BR ares_init (3)
|
||||||
.BR ares_destroy (3)
|
.BR ares_destroy (3)
|
||||||
.SH NOTES
|
.SH NOTES
|
||||||
This function is not compatible with ares.
|
This function was added in c-ares 1.2.0
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Dirk Manske
|
Dirk Manske
|
||||||
|
|||||||
@@ -18,6 +18,18 @@
|
|||||||
#ifndef ARES__DNS_H
|
#ifndef ARES__DNS_H
|
||||||
#define ARES__DNS_H
|
#define ARES__DNS_H
|
||||||
|
|
||||||
|
#ifdef ARES_BIG_ENDIAN
|
||||||
|
/* big-endian aware versions */
|
||||||
|
#define DNS__16BIT(p) (((p)[1] << 8) | (p)[0])
|
||||||
|
#define DNS__32BIT(p) (((p)[3] << 24) | ((p)[2] << 16) | \
|
||||||
|
((p)[1] << 8) | (p)[0])
|
||||||
|
#define DNS__SET16BIT(p, v) (((p)[1] = ((v) >> 8) & 0xff), \
|
||||||
|
((p)[0] = (v) & 0xff))
|
||||||
|
#define DNS__SET32BIT(p, v) (((p)[3] = ((v) >> 24) & 0xff), \
|
||||||
|
((p)[2] = ((v) >> 16) & 0xff), \
|
||||||
|
((p)[1] = ((v) >> 8) & 0xff), \
|
||||||
|
((p)[0] = (v) & 0xff))
|
||||||
|
#else
|
||||||
#define DNS__16BIT(p) (((p)[0] << 8) | (p)[1])
|
#define DNS__16BIT(p) (((p)[0] << 8) | (p)[1])
|
||||||
#define DNS__32BIT(p) (((p)[0] << 24) | ((p)[1] << 16) | \
|
#define DNS__32BIT(p) (((p)[0] << 24) | ((p)[1] << 16) | \
|
||||||
((p)[2] << 8) | (p)[3])
|
((p)[2] << 8) | (p)[3])
|
||||||
@@ -27,6 +39,16 @@
|
|||||||
((p)[1] = ((v) >> 16) & 0xff), \
|
((p)[1] = ((v) >> 16) & 0xff), \
|
||||||
((p)[2] = ((v) >> 8) & 0xff), \
|
((p)[2] = ((v) >> 8) & 0xff), \
|
||||||
((p)[3] = (v) & 0xff))
|
((p)[3] = (v) & 0xff))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* we cannot use this approach on systems where we can't access 16/32 bit
|
||||||
|
data on un-aligned addresses */
|
||||||
|
#define DNS__16BIT(p) ntohs(*(unsigned short*)(p))
|
||||||
|
#define DNS__32BIT(p) ntohl(*(unsigned long*)(p))
|
||||||
|
#define DNS__SET16BIT(p, v) *(unsigned short*)(p) = htons(v)
|
||||||
|
#define DNS__SET32BIT(p, v) *(unsigned long*)(p) = htonl(v)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Macros for parsing a DNS header */
|
/* Macros for parsing a DNS header */
|
||||||
#define DNS_HEADER_QID(h) DNS__16BIT(h)
|
#define DNS_HEADER_QID(h) DNS__16BIT(h)
|
||||||
|
|||||||
@@ -21,6 +21,9 @@
|
|||||||
#else
|
#else
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -103,6 +106,8 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
|||||||
/* Nuke the trailing period if we wrote one. */
|
/* Nuke the trailing period if we wrote one. */
|
||||||
if (q > *s)
|
if (q > *s)
|
||||||
*(q - 1) = 0;
|
*(q - 1) = 0;
|
||||||
|
else
|
||||||
|
*q = 0; /* zero terminate */
|
||||||
|
|
||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this
|
* Permission to use, copy, modify, and distribute this
|
||||||
@@ -44,13 +46,13 @@ int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
|
|||||||
nfds = server->udp_socket + 1;
|
nfds = server->udp_socket + 1;
|
||||||
}
|
}
|
||||||
if (server->tcp_socket != ARES_SOCKET_BAD)
|
if (server->tcp_socket != ARES_SOCKET_BAD)
|
||||||
{
|
{
|
||||||
FD_SET(server->tcp_socket, read_fds);
|
FD_SET(server->tcp_socket, read_fds);
|
||||||
if (server->qhead)
|
if (server->qhead)
|
||||||
FD_SET(server->tcp_socket, write_fds);
|
FD_SET(server->tcp_socket, write_fds);
|
||||||
if (server->tcp_socket >= nfds)
|
if (server->tcp_socket >= nfds)
|
||||||
nfds = server->tcp_socket + 1;
|
nfds = server->tcp_socket + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (int)nfds;
|
return (int)nfds;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ The
|
|||||||
.I ares_free_hostent
|
.I ares_free_hostent
|
||||||
function frees a
|
function frees a
|
||||||
.B struct hostent
|
.B struct hostent
|
||||||
allocated by one of the functions \fIares_parse_a_reply(3)\fP or
|
allocated by one of the functions \fIares_parse_a_reply(3)\fP,
|
||||||
\fIares_parse_ptr_reply(3)\fP.
|
\fIares_parse_aaaa_reply(3)\fP, or \fIares_parse_ptr_reply(3)\fP.
|
||||||
.SH NOTES
|
.SH NOTES
|
||||||
It is not necessary (and is not correct) to free the host structure passed to
|
It is not necessary (and is not correct) to free the host structure passed to
|
||||||
the callback functions for \fIares_gethostbyname(3)\fP or
|
the callback functions for \fIares_gethostbyname(3)\fP or
|
||||||
@@ -37,6 +37,7 @@ the callback functions for \fIares_gethostbyname(3)\fP or
|
|||||||
host structures when the callback returns.
|
host structures when the callback returns.
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR ares_parse_a_reply (3),
|
.BR ares_parse_a_reply (3),
|
||||||
|
.BR ares_parse_aaaa_reply (3),
|
||||||
.BR ares_parse_ptr_reply (3)
|
.BR ares_parse_ptr_reply (3)
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Greg Hudson, MIT Information Systems
|
Greg Hudson, MIT Information Systems
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this
|
* Permission to use, copy, modify, and distribute this
|
||||||
@@ -12,7 +14,6 @@
|
|||||||
* this software for any purpose. It is provided "as is"
|
* this software for any purpose. It is provided "as is"
|
||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
@@ -23,6 +24,9 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -31,6 +35,7 @@
|
|||||||
|
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
#include "inet_net_pton.h"
|
||||||
|
|
||||||
#ifdef WATT32
|
#ifdef WATT32
|
||||||
#undef WIN32
|
#undef WIN32
|
||||||
@@ -39,7 +44,8 @@
|
|||||||
struct addr_query {
|
struct addr_query {
|
||||||
/* Arguments passed to ares_gethostbyaddr() */
|
/* Arguments passed to ares_gethostbyaddr() */
|
||||||
ares_channel channel;
|
ares_channel channel;
|
||||||
struct in_addr addr;
|
union ares_addr addr;
|
||||||
|
int family;
|
||||||
ares_host_callback callback;
|
ares_host_callback callback;
|
||||||
void *arg;
|
void *arg;
|
||||||
|
|
||||||
@@ -51,14 +57,21 @@ static void addr_callback(void *arg, int status, unsigned char *abuf,
|
|||||||
int alen);
|
int alen);
|
||||||
static void end_aquery(struct addr_query *aquery, int status,
|
static void end_aquery(struct addr_query *aquery, int status,
|
||||||
struct hostent *host);
|
struct hostent *host);
|
||||||
static int file_lookup(struct in_addr *addr, struct hostent **host);
|
static int file_lookup(union ares_addr *addr, int family, struct hostent **host);
|
||||||
|
|
||||||
void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
|
void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
|
||||||
int family, ares_host_callback callback, void *arg)
|
int family, ares_host_callback callback, void *arg)
|
||||||
{
|
{
|
||||||
struct addr_query *aquery;
|
struct addr_query *aquery;
|
||||||
|
|
||||||
if (family != AF_INET || addrlen != sizeof(struct in_addr))
|
if (family != AF_INET && family != AF_INET6)
|
||||||
|
{
|
||||||
|
callback(arg, ARES_ENOTIMP, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((family == AF_INET && addrlen != sizeof(struct in_addr)) ||
|
||||||
|
(family == AF_INET6 && addrlen != sizeof(struct in6_addr)))
|
||||||
{
|
{
|
||||||
callback(arg, ARES_ENOTIMP, NULL);
|
callback(arg, ARES_ENOTIMP, NULL);
|
||||||
return;
|
return;
|
||||||
@@ -71,7 +84,11 @@ void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
aquery->channel = channel;
|
aquery->channel = channel;
|
||||||
memcpy(&aquery->addr, addr, sizeof(aquery->addr));
|
if (family == AF_INET)
|
||||||
|
memcpy(&aquery->addr.addr4, addr, sizeof(struct in_addr));
|
||||||
|
else
|
||||||
|
memcpy(&aquery->addr.addr6, addr, sizeof(struct in6_addr));
|
||||||
|
aquery->family = family;
|
||||||
aquery->callback = callback;
|
aquery->callback = callback;
|
||||||
aquery->arg = arg;
|
aquery->arg = arg;
|
||||||
aquery->remaining_lookups = channel->lookups;
|
aquery->remaining_lookups = channel->lookups;
|
||||||
@@ -82,7 +99,7 @@ void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
|
|||||||
static void next_lookup(struct addr_query *aquery)
|
static void next_lookup(struct addr_query *aquery)
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
char name[64];
|
char name[128];
|
||||||
int a1, a2, a3, a4, status;
|
int a1, a2, a3, a4, status;
|
||||||
struct hostent *host;
|
struct hostent *host;
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
@@ -92,18 +109,38 @@ static void next_lookup(struct addr_query *aquery)
|
|||||||
switch (*p)
|
switch (*p)
|
||||||
{
|
{
|
||||||
case 'b':
|
case 'b':
|
||||||
addr = ntohl(aquery->addr.s_addr);
|
if (aquery->family == AF_INET)
|
||||||
a1 = (int)((addr >> 24) & 0xff);
|
{
|
||||||
a2 = (int)((addr >> 16) & 0xff);
|
addr = ntohl(aquery->addr.addr4.s_addr);
|
||||||
a3 = (int)((addr >> 8) & 0xff);
|
a1 = (int)((addr >> 24) & 0xff);
|
||||||
a4 = (int)(addr & 0xff);
|
a2 = (int)((addr >> 16) & 0xff);
|
||||||
sprintf(name, "%d.%d.%d.%d.in-addr.arpa", a4, a3, a2, a1);
|
a3 = (int)((addr >> 8) & 0xff);
|
||||||
aquery->remaining_lookups = p + 1;
|
a4 = (int)(addr & 0xff);
|
||||||
ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback,
|
sprintf(name, "%d.%d.%d.%d.in-addr.arpa", a4, a3, a2, a1);
|
||||||
aquery);
|
aquery->remaining_lookups = p + 1;
|
||||||
|
ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback,
|
||||||
|
aquery);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned char *bytes;
|
||||||
|
bytes = (unsigned char *)&aquery->addr.addr6.s6_addr;
|
||||||
|
sprintf(name, "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa",
|
||||||
|
bytes[15]&0xf, bytes[15] >> 4, bytes[14]&0xf, bytes[14] >> 4,
|
||||||
|
bytes[13]&0xf, bytes[13] >> 4, bytes[12]&0xf, bytes[12] >> 4,
|
||||||
|
bytes[11]&0xf, bytes[11] >> 4, bytes[10]&0xf, bytes[10] >> 4,
|
||||||
|
bytes[9]&0xf, bytes[9] >> 4, bytes[8]&0xf, bytes[8] >> 4,
|
||||||
|
bytes[7]&0xf, bytes[7] >> 4, bytes[6]&0xf, bytes[6] >> 4,
|
||||||
|
bytes[5]&0xf, bytes[5] >> 4, bytes[4]&0xf, bytes[4] >> 4,
|
||||||
|
bytes[3]&0xf, bytes[3] >> 4, bytes[2]&0xf, bytes[2] >> 4,
|
||||||
|
bytes[1]&0xf, bytes[1] >> 4, bytes[0]&0xf, bytes[0] >> 4);
|
||||||
|
aquery->remaining_lookups = p + 1;
|
||||||
|
ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback,
|
||||||
|
aquery);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
case 'f':
|
case 'f':
|
||||||
status = file_lookup(&aquery->addr, &host);
|
status = file_lookup(&aquery->addr, aquery->family, &host);
|
||||||
if (status != ARES_ENOTFOUND)
|
if (status != ARES_ENOTFOUND)
|
||||||
{
|
{
|
||||||
end_aquery(aquery, status, host);
|
end_aquery(aquery, status, host);
|
||||||
@@ -122,8 +159,12 @@ static void addr_callback(void *arg, int status, unsigned char *abuf, int alen)
|
|||||||
|
|
||||||
if (status == ARES_SUCCESS)
|
if (status == ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
status = ares_parse_ptr_reply(abuf, alen, &aquery->addr,
|
if (aquery->family == AF_INET)
|
||||||
sizeof(struct in_addr), AF_INET, &host);
|
status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr4,
|
||||||
|
sizeof(struct in_addr), AF_INET, &host);
|
||||||
|
else
|
||||||
|
status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr6,
|
||||||
|
sizeof(struct in6_addr), AF_INET6, &host);
|
||||||
end_aquery(aquery, status, host);
|
end_aquery(aquery, status, host);
|
||||||
}
|
}
|
||||||
else if (status == ARES_EDESTRUCTION)
|
else if (status == ARES_EDESTRUCTION)
|
||||||
@@ -141,27 +182,26 @@ static void end_aquery(struct addr_query *aquery, int status,
|
|||||||
free(aquery);
|
free(aquery);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int file_lookup(struct in_addr *addr, struct hostent **host)
|
static int file_lookup(union ares_addr *addr, int family, struct hostent **host)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
|
||||||
char PATH_HOSTS[MAX_PATH];
|
char PATH_HOSTS[MAX_PATH];
|
||||||
if (IS_NT()) {
|
if (IS_NT()) {
|
||||||
char tmp[MAX_PATH];
|
char tmp[MAX_PATH];
|
||||||
HKEY hkeyHosts;
|
HKEY hkeyHosts;
|
||||||
|
|
||||||
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts)
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts)
|
||||||
== ERROR_SUCCESS)
|
== ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
DWORD dwLength = MAX_PATH;
|
DWORD dwLength = MAX_PATH;
|
||||||
RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, tmp,
|
RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp,
|
||||||
&dwLength);
|
&dwLength);
|
||||||
ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH);
|
ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH);
|
||||||
RegCloseKey(hkeyHosts);
|
RegCloseKey(hkeyHosts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
||||||
@@ -179,11 +219,23 @@ static int file_lookup(struct in_addr *addr, struct hostent **host)
|
|||||||
fp = fopen(PATH_HOSTS, "r");
|
fp = fopen(PATH_HOSTS, "r");
|
||||||
if (!fp)
|
if (!fp)
|
||||||
return ARES_ENOTFOUND;
|
return ARES_ENOTFOUND;
|
||||||
|
while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
|
||||||
while ((status = ares__get_hostent(fp, host)) == ARES_SUCCESS)
|
|
||||||
{
|
{
|
||||||
if (memcmp((*host)->h_addr, addr, sizeof(struct in_addr)) == 0)
|
if (family != (*host)->h_addrtype)
|
||||||
break;
|
{
|
||||||
|
ares_free_hostent(*host);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (family == AF_INET)
|
||||||
|
{
|
||||||
|
if (memcmp((*host)->h_addr, &addr->addr4, sizeof(struct in_addr)) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (family == AF_INET6)
|
||||||
|
{
|
||||||
|
if (memcmp((*host)->h_addr, &addr->addr6, sizeof(struct in6_addr)) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
ares_free_hostent(*host);
|
ares_free_hostent(*host);
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|||||||
@@ -23,8 +23,13 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_H
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -33,6 +38,8 @@
|
|||||||
|
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
#include "inet_net_pton.h"
|
||||||
|
#include "bitncmp.h"
|
||||||
|
|
||||||
#ifdef WATT32
|
#ifdef WATT32
|
||||||
#undef WIN32
|
#undef WIN32
|
||||||
@@ -44,7 +51,7 @@ struct host_query {
|
|||||||
char *name;
|
char *name;
|
||||||
ares_host_callback callback;
|
ares_host_callback callback;
|
||||||
void *arg;
|
void *arg;
|
||||||
|
int family;
|
||||||
const char *remaining_lookups;
|
const char *remaining_lookups;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -53,13 +60,17 @@ static void host_callback(void *arg, int status, unsigned char *abuf,
|
|||||||
int alen);
|
int alen);
|
||||||
static void end_hquery(struct host_query *hquery, int status,
|
static void end_hquery(struct host_query *hquery, int status,
|
||||||
struct hostent *host);
|
struct hostent *host);
|
||||||
static int fake_hostent(const char *name, ares_host_callback callback,
|
static int fake_hostent(const char *name, int family, ares_host_callback callback,
|
||||||
void *arg);
|
void *arg);
|
||||||
static int file_lookup(const char *name, struct hostent **host);
|
static int file_lookup(const char *name, int family, struct hostent **host);
|
||||||
static void sort_addresses(struct hostent *host, struct apattern *sortlist,
|
static void sort_addresses(struct hostent *host, struct apattern *sortlist,
|
||||||
int nsort);
|
int nsort);
|
||||||
|
static void sort6_addresses(struct hostent *host, struct apattern *sortlist,
|
||||||
|
int nsort);
|
||||||
static int get_address_index(struct in_addr *addr, struct apattern *sortlist,
|
static int get_address_index(struct in_addr *addr, struct apattern *sortlist,
|
||||||
int nsort);
|
int nsort);
|
||||||
|
static int get6_address_index(struct in6_addr *addr, struct apattern *sortlist,
|
||||||
|
int nsort);
|
||||||
|
|
||||||
void ares_gethostbyname(ares_channel channel, const char *name, int family,
|
void ares_gethostbyname(ares_channel channel, const char *name, int family,
|
||||||
ares_host_callback callback, void *arg)
|
ares_host_callback callback, void *arg)
|
||||||
@@ -67,13 +78,13 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family,
|
|||||||
struct host_query *hquery;
|
struct host_query *hquery;
|
||||||
|
|
||||||
/* Right now we only know how to look up Internet addresses. */
|
/* Right now we only know how to look up Internet addresses. */
|
||||||
if (family != AF_INET)
|
if (family != AF_INET && family != AF_INET6)
|
||||||
{
|
{
|
||||||
callback(arg, ARES_ENOTIMP, NULL);
|
callback(arg, ARES_ENOTIMP, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fake_hostent(name, callback, arg))
|
if (fake_hostent(name, family, callback, arg))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Allocate and fill in the host query structure. */
|
/* Allocate and fill in the host query structure. */
|
||||||
@@ -85,6 +96,7 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family,
|
|||||||
}
|
}
|
||||||
hquery->channel = channel;
|
hquery->channel = channel;
|
||||||
hquery->name = strdup(name);
|
hquery->name = strdup(name);
|
||||||
|
hquery->family = family;
|
||||||
if (!hquery->name)
|
if (!hquery->name)
|
||||||
{
|
{
|
||||||
free(hquery);
|
free(hquery);
|
||||||
@@ -112,13 +124,17 @@ static void next_lookup(struct host_query *hquery)
|
|||||||
case 'b':
|
case 'b':
|
||||||
/* DNS lookup */
|
/* DNS lookup */
|
||||||
hquery->remaining_lookups = p + 1;
|
hquery->remaining_lookups = p + 1;
|
||||||
ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
|
if (hquery->family == AF_INET6)
|
||||||
hquery);
|
ares_search(hquery->channel, hquery->name, C_IN, T_AAAA, host_callback,
|
||||||
|
hquery);
|
||||||
|
else
|
||||||
|
ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
|
||||||
|
hquery);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case 'f':
|
case 'f':
|
||||||
/* Host file lookup */
|
/* Host file lookup */
|
||||||
status = file_lookup(hquery->name, &host);
|
status = file_lookup(hquery->name, hquery->family, &host);
|
||||||
if (status != ARES_ENOTFOUND)
|
if (status != ARES_ENOTFOUND)
|
||||||
{
|
{
|
||||||
end_hquery(hquery, status, host);
|
end_hquery(hquery, status, host);
|
||||||
@@ -138,11 +154,27 @@ static void host_callback(void *arg, int status, unsigned char *abuf, int alen)
|
|||||||
|
|
||||||
if (status == ARES_SUCCESS)
|
if (status == ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
status = ares_parse_a_reply(abuf, alen, &host);
|
if (hquery->family == AF_INET)
|
||||||
if (host && channel->nsort)
|
{
|
||||||
sort_addresses(host, channel->sortlist, channel->nsort);
|
status = ares_parse_a_reply(abuf, alen, &host);
|
||||||
|
if (host && channel->nsort)
|
||||||
|
sort_addresses(host, channel->sortlist, channel->nsort);
|
||||||
|
}
|
||||||
|
else if (hquery->family == AF_INET6)
|
||||||
|
{
|
||||||
|
status = ares_parse_aaaa_reply(abuf, alen, &host);
|
||||||
|
if (host && channel->nsort)
|
||||||
|
sort6_addresses(host, channel->sortlist, channel->nsort);
|
||||||
|
}
|
||||||
end_hquery(hquery, status, host);
|
end_hquery(hquery, status, host);
|
||||||
}
|
}
|
||||||
|
else if (status == ARES_ENODATA && hquery->family == AF_INET6)
|
||||||
|
{
|
||||||
|
/* There was no AAAA now lookup an A */
|
||||||
|
hquery->family = AF_INET;
|
||||||
|
ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
|
||||||
|
hquery);
|
||||||
|
}
|
||||||
else if (status == ARES_EDESTRUCTION)
|
else if (status == ARES_EDESTRUCTION)
|
||||||
end_hquery(hquery, status, NULL);
|
end_hquery(hquery, status, NULL);
|
||||||
else
|
else
|
||||||
@@ -162,36 +194,34 @@ static void end_hquery(struct host_query *hquery, int status,
|
|||||||
/* If the name looks like an IP address, fake up a host entry, end the
|
/* If the name looks like an IP address, fake up a host entry, end the
|
||||||
* query immediately, and return true. Otherwise return false.
|
* query immediately, and return true. Otherwise return false.
|
||||||
*/
|
*/
|
||||||
static int fake_hostent(const char *name, ares_host_callback callback,
|
static int fake_hostent(const char *name, int family, ares_host_callback callback,
|
||||||
void *arg)
|
void *arg)
|
||||||
{
|
{
|
||||||
struct in_addr addr;
|
|
||||||
struct hostent hostent;
|
struct hostent hostent;
|
||||||
const char *p;
|
|
||||||
char *aliases[1] = { NULL };
|
char *aliases[1] = { NULL };
|
||||||
char *addrs[2];
|
char *addrs[2];
|
||||||
|
int result = 0;
|
||||||
|
struct in_addr in;
|
||||||
|
struct in6_addr in6;
|
||||||
|
|
||||||
/* It only looks like an IP address if it's all numbers and dots. */
|
if (family == AF_INET)
|
||||||
for (p = name; *p; p++)
|
result = ((in.s_addr = inet_addr(name)) == INADDR_NONE ? 0 : 1);
|
||||||
{
|
else if (family == AF_INET6)
|
||||||
if (!isdigit((unsigned char)*p) && *p != '.')
|
result = (ares_inet_pton(AF_INET6, name, &in6) < 1 ? 0 : 1);
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* It also only looks like an IP address if it's non-zero-length and
|
if (!result)
|
||||||
* doesn't end with a dot.
|
|
||||||
*/
|
|
||||||
if (p == name || *(p - 1) == '.')
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* It looks like an IP address. Figure out what IP address it is. */
|
if (family == AF_INET)
|
||||||
addr.s_addr = inet_addr(name);
|
|
||||||
if (addr.s_addr == INADDR_NONE)
|
|
||||||
{
|
{
|
||||||
callback(arg, ARES_EBADNAME, NULL);
|
hostent.h_length = sizeof(struct in_addr);
|
||||||
return 1;
|
addrs[0] = (char *)∈
|
||||||
|
}
|
||||||
|
else if (family == AF_INET6)
|
||||||
|
{
|
||||||
|
hostent.h_length = sizeof(struct in6_addr);
|
||||||
|
addrs[0] = (char *)&in6;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Duplicate the name, to avoid a constness violation. */
|
/* Duplicate the name, to avoid a constness violation. */
|
||||||
hostent.h_name = strdup(name);
|
hostent.h_name = strdup(name);
|
||||||
if (!hostent.h_name)
|
if (!hostent.h_name)
|
||||||
@@ -201,11 +231,9 @@ static int fake_hostent(const char *name, ares_host_callback callback,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Fill in the rest of the host structure and terminate the query. */
|
/* Fill in the rest of the host structure and terminate the query. */
|
||||||
addrs[0] = (char *) &addr;
|
|
||||||
addrs[1] = NULL;
|
addrs[1] = NULL;
|
||||||
hostent.h_aliases = aliases;
|
hostent.h_aliases = aliases;
|
||||||
hostent.h_addrtype = AF_INET;
|
hostent.h_addrtype = family;
|
||||||
hostent.h_length = sizeof(struct in_addr);
|
|
||||||
hostent.h_addr_list = addrs;
|
hostent.h_addr_list = addrs;
|
||||||
callback(arg, ARES_SUCCESS, &hostent);
|
callback(arg, ARES_SUCCESS, &hostent);
|
||||||
|
|
||||||
@@ -213,7 +241,7 @@ static int fake_hostent(const char *name, ares_host_callback callback,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int file_lookup(const char *name, struct hostent **host)
|
static int file_lookup(const char *name, int family, struct hostent **host)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
char **alias;
|
char **alias;
|
||||||
@@ -222,18 +250,18 @@ static int file_lookup(const char *name, struct hostent **host)
|
|||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
char PATH_HOSTS[MAX_PATH];
|
char PATH_HOSTS[MAX_PATH];
|
||||||
if (IS_NT()) {
|
if (IS_NT()) {
|
||||||
char tmp[MAX_PATH];
|
char tmp[MAX_PATH];
|
||||||
HKEY hkeyHosts;
|
HKEY hkeyHosts;
|
||||||
|
|
||||||
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts)
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts)
|
||||||
== ERROR_SUCCESS)
|
== ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
DWORD dwLength = MAX_PATH;
|
DWORD dwLength = MAX_PATH;
|
||||||
RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, tmp,
|
RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp,
|
||||||
&dwLength);
|
&dwLength);
|
||||||
ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH);
|
ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH);
|
||||||
RegCloseKey(hkeyHosts);
|
RegCloseKey(hkeyHosts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
||||||
@@ -252,7 +280,7 @@ static int file_lookup(const char *name, struct hostent **host)
|
|||||||
if (!fp)
|
if (!fp)
|
||||||
return ARES_ENOTFOUND;
|
return ARES_ENOTFOUND;
|
||||||
|
|
||||||
while ((status = ares__get_hostent(fp, host)) == ARES_SUCCESS)
|
while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
if (strcasecmp((*host)->h_name, name) == 0)
|
if (strcasecmp((*host)->h_name, name) == 0)
|
||||||
break;
|
break;
|
||||||
@@ -310,8 +338,66 @@ static int get_address_index(struct in_addr *addr, struct apattern *sortlist,
|
|||||||
|
|
||||||
for (i = 0; i < nsort; i++)
|
for (i = 0; i < nsort; i++)
|
||||||
{
|
{
|
||||||
if ((addr->s_addr & sortlist[i].mask.s_addr) == sortlist[i].addr.s_addr)
|
if (sortlist[i].family != AF_INET)
|
||||||
break;
|
continue;
|
||||||
|
if (sortlist[i].type == PATTERN_MASK)
|
||||||
|
{
|
||||||
|
if ((addr->s_addr & sortlist[i].mask.addr.addr4.s_addr)
|
||||||
|
== sortlist[i].addr.addr4.s_addr)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!ares_bitncmp(&addr->s_addr, &sortlist[i].addr.addr4.s_addr,
|
||||||
|
sortlist[i].mask.bits))
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sort6_addresses(struct hostent *host, struct apattern *sortlist,
|
||||||
|
int nsort)
|
||||||
|
{
|
||||||
|
struct in6_addr a1, a2;
|
||||||
|
int i1, i2, ind1, ind2;
|
||||||
|
|
||||||
|
/* This is a simple insertion sort, not optimized at all. i1 walks
|
||||||
|
* through the address list, with the loop invariant that everything
|
||||||
|
* to the left of i1 is sorted. In the loop body, the value at i1 is moved
|
||||||
|
* back through the list (via i2) until it is in sorted order.
|
||||||
|
*/
|
||||||
|
for (i1 = 0; host->h_addr_list[i1]; i1++)
|
||||||
|
{
|
||||||
|
memcpy(&a1, host->h_addr_list[i1], sizeof(struct in6_addr));
|
||||||
|
ind1 = get6_address_index(&a1, sortlist, nsort);
|
||||||
|
for (i2 = i1 - 1; i2 >= 0; i2--)
|
||||||
|
{
|
||||||
|
memcpy(&a2, host->h_addr_list[i2], sizeof(struct in6_addr));
|
||||||
|
ind2 = get6_address_index(&a2, sortlist, nsort);
|
||||||
|
if (ind2 <= ind1)
|
||||||
|
break;
|
||||||
|
memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in6_addr));
|
||||||
|
}
|
||||||
|
memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in6_addr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find the first entry in sortlist which matches addr. Return nsort
|
||||||
|
* if none of them match.
|
||||||
|
*/
|
||||||
|
static int get6_address_index(struct in6_addr *addr, struct apattern *sortlist,
|
||||||
|
int nsort)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < nsort; i++)
|
||||||
|
{
|
||||||
|
if (sortlist[i].family != AF_INET6)
|
||||||
|
continue;
|
||||||
|
if (!ares_bitncmp(&addr->s6_addr, &sortlist[i].addr.addr6.s6_addr, sortlist[i].mask.bits))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
145
ares/ares_getnameinfo.3
Normal file
145
ares/ares_getnameinfo.3
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
.\" $Id$
|
||||||
|
.\"
|
||||||
|
.\" Copyright 2005 by Dominick Meglio.
|
||||||
|
.\"
|
||||||
|
.\" Permission to use, copy, modify, and distribute this
|
||||||
|
.\" software and its documentation for any purpose and without
|
||||||
|
.\" fee is hereby granted, provided that the above copyright
|
||||||
|
.\" notice appear in all copies and that both that copyright
|
||||||
|
.\" notice and this permission notice appear in supporting
|
||||||
|
.\" documentation, and that the name of M.I.T. not be used in
|
||||||
|
.\" advertising or publicity pertaining to distribution of the
|
||||||
|
.\" software without specific, written prior permission.
|
||||||
|
.\" M.I.T. makes no representations about the suitability of
|
||||||
|
.\" this software for any purpose. It is provided "as is"
|
||||||
|
.\" without express or implied warranty.
|
||||||
|
.\"
|
||||||
|
.TH ARES_GETNAMEINFO 3 "16 May 2005"
|
||||||
|
.SH NAME
|
||||||
|
ares_getnameinfo \- Address-to-nodename translation in protocol-independent manner
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.nf
|
||||||
|
.B #include <ares.h>
|
||||||
|
.PP
|
||||||
|
.B typedef void (*ares_nameinfo_callback)(void *\fIarg\fP, int \fIstatus\fP,
|
||||||
|
.B char *\fInode\fP, char *\fIservice\fP)
|
||||||
|
.PP
|
||||||
|
.B void ares_getnameinfo(ares_channel \fIchannel\fP, const struct sockaddr *\fIsa\fP,
|
||||||
|
.B socklen_t \fIsalen\fP, int \fIflags\fP, ares_nameinfo_callback \fIcallback\fP,
|
||||||
|
.B void *\fIarg\fP)
|
||||||
|
.fi
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The
|
||||||
|
.B ares_getnameinfo
|
||||||
|
function is defined for protocol-independent address translation. The function
|
||||||
|
is a combination of \fIares_gethostbyaddr(3)\fP and \fIgetservbyport(3)\fP. The function will
|
||||||
|
translate the address either by executing a host query on the name service channel
|
||||||
|
identified by
|
||||||
|
.IR channel
|
||||||
|
or it will attempt to resolve it locally if possible.
|
||||||
|
The parameters
|
||||||
|
.I sa
|
||||||
|
and
|
||||||
|
.I len
|
||||||
|
give the address as a sockaddr structure, and
|
||||||
|
.I flags
|
||||||
|
gives the options that the function will use. Valid flags are listed below:
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_NOFQDN
|
||||||
|
Only the nodename portion of the FQDN is returned for local hosts.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_NUMERICHOST
|
||||||
|
The numeric form of the hostname is returned rather than the name.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_NAMEREQD
|
||||||
|
An error is returned if the hostname cannot be found in the DNS.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_NUMERICSERV
|
||||||
|
The numeric form of the service is returned rather than the name.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_TCP
|
||||||
|
The service name is to be looked up for the TCP protocol.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_UDP
|
||||||
|
The service name is to be looked up for the UDP protocol.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_SCTP
|
||||||
|
The service name is to be looked up for the SCTP protocol.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_DCCP
|
||||||
|
The service name is to be looked up for the DCCP protocol.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_NUMERICSCOPE
|
||||||
|
The numeric form of the scope ID is returned rather than the name.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_LOOKUPHOST
|
||||||
|
A hostname lookup is being requested.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_LOOKUPSERVICE
|
||||||
|
A service name lookup is being requested.
|
||||||
|
.PP
|
||||||
|
When the query
|
||||||
|
is complete or has
|
||||||
|
failed, the ares library will invoke \fIcallback\fP. Completion or failure of
|
||||||
|
the query may happen immediately, or may happen during a later call to
|
||||||
|
\fIares_process(3)\fP, \fIares_destroy(3)\fP or \fIares_cancel(3)\fP.
|
||||||
|
.PP
|
||||||
|
The callback argument
|
||||||
|
.I arg
|
||||||
|
is copied from the
|
||||||
|
.B ares_getnameinfo
|
||||||
|
argument
|
||||||
|
.IR arg .
|
||||||
|
The callback argument
|
||||||
|
.I status
|
||||||
|
indicates whether the query succeeded and, if not, how it failed. It
|
||||||
|
may have any of the following values:
|
||||||
|
.TP 19
|
||||||
|
.B ARES_SUCCESS
|
||||||
|
The host lookup completed successfully.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_ENOTIMP
|
||||||
|
The ares library does not know how to look up addresses of type
|
||||||
|
.IR family .
|
||||||
|
.TP 19
|
||||||
|
.B ARES_ENOTFOUND
|
||||||
|
The address
|
||||||
|
.I addr
|
||||||
|
was not found.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_ENOMEM
|
||||||
|
Memory was exhausted.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_EDESTRUCTION
|
||||||
|
The name service channel
|
||||||
|
.I channel
|
||||||
|
is being destroyed; the query will not be completed.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_EBADFLAGS
|
||||||
|
The
|
||||||
|
.I flags
|
||||||
|
parameter contains an illegal value.
|
||||||
|
.PP
|
||||||
|
On successful completion of the query, the callback argument
|
||||||
|
.I node
|
||||||
|
contains a string representing the hostname (assuming
|
||||||
|
.B ARES_NI_LOOKUPHOST
|
||||||
|
was specified). Additionally,
|
||||||
|
.I service
|
||||||
|
contains a string representing the service name (assuming
|
||||||
|
.B ARES_NI_LOOKUPSERVICE
|
||||||
|
was specified).
|
||||||
|
If the query did not complete successfully, or one of the values
|
||||||
|
was not requested,
|
||||||
|
.I node
|
||||||
|
or
|
||||||
|
.I service
|
||||||
|
will be
|
||||||
|
.BR NULL .
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR ares_process (3),
|
||||||
|
.BR ares_getaddrinfo (3)
|
||||||
|
.SH AUTHOR
|
||||||
|
Dominick Meglio
|
||||||
|
.br
|
||||||
|
Copyright 2005 by Dominick Meglio.
|
||||||
382
ares/ares_getnameinfo.c
Normal file
382
ares/ares_getnameinfo.c
Normal file
@@ -0,0 +1,382 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright 2005 by Dominick Meglio
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this
|
||||||
|
* software and its documentation for any purpose and without
|
||||||
|
* fee is hereby granted, provided that the above copyright
|
||||||
|
* notice appear in all copies and that both that copyright
|
||||||
|
* notice and this permission notice appear in supporting
|
||||||
|
* documentation, and that the name of M.I.T. not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* M.I.T. makes no representations about the suitability of
|
||||||
|
* this software for any purpose. It is provided "as is"
|
||||||
|
* without express or implied warranty.
|
||||||
|
*/
|
||||||
|
#include "setup.h"
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
|
#include "nameser.h"
|
||||||
|
#else
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_NET_IF_H
|
||||||
|
#include <net/if.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "ares.h"
|
||||||
|
#include "ares_private.h"
|
||||||
|
#include "ares_ipv6.h"
|
||||||
|
#include "inet_ntop.h"
|
||||||
|
|
||||||
|
#ifdef WATT32
|
||||||
|
#undef WIN32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct nameinfo_query {
|
||||||
|
ares_nameinfo_callback callback;
|
||||||
|
void *arg;
|
||||||
|
union {
|
||||||
|
struct sockaddr_in addr4;
|
||||||
|
struct sockaddr_in6 addr6;
|
||||||
|
} addr;
|
||||||
|
int family;
|
||||||
|
int flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
#define IPBUFSIZ 40+IF_NAMESIZE
|
||||||
|
#else
|
||||||
|
#define IPBUFSIZ 40
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void nameinfo_callback(void *arg, int status, struct hostent *host);
|
||||||
|
static char *lookup_service(unsigned short port, int flags,
|
||||||
|
char *buf, size_t buflen);
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid,
|
||||||
|
char *buf, size_t buflen);
|
||||||
|
#endif
|
||||||
|
static char *ares_striendstr(const char *s1, const char *s2);
|
||||||
|
|
||||||
|
void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t salen,
|
||||||
|
int flags, ares_nameinfo_callback callback, void *arg)
|
||||||
|
{
|
||||||
|
struct sockaddr_in *addr = NULL;
|
||||||
|
struct sockaddr_in6 *addr6 = NULL;
|
||||||
|
struct nameinfo_query *niquery;
|
||||||
|
|
||||||
|
/* Verify the buffer size */
|
||||||
|
if (salen == sizeof(struct sockaddr_in))
|
||||||
|
addr = (struct sockaddr_in *)sa;
|
||||||
|
else if (salen == sizeof(struct sockaddr_in6))
|
||||||
|
addr6 = (struct sockaddr_in6 *)sa;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
callback(arg, ARES_ENOTIMP, NULL, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If neither, assume they want a host */
|
||||||
|
if (!(flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST))
|
||||||
|
flags |= ARES_NI_LOOKUPHOST;
|
||||||
|
|
||||||
|
/* All they want is a service, no need for DNS */
|
||||||
|
if ((flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST))
|
||||||
|
{
|
||||||
|
char buf[33], *service;
|
||||||
|
unsigned int port = 0;
|
||||||
|
|
||||||
|
if (salen == sizeof(struct sockaddr_in))
|
||||||
|
port = addr->sin_port;
|
||||||
|
else
|
||||||
|
port = addr6->sin6_port;
|
||||||
|
service = lookup_service(port, flags, buf, sizeof(buf));
|
||||||
|
callback(arg, ARES_SUCCESS, NULL, service);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* They want a host lookup */
|
||||||
|
if ((flags & ARES_NI_LOOKUPHOST))
|
||||||
|
{
|
||||||
|
/* A numeric host can be handled without DNS */
|
||||||
|
if ((flags & ARES_NI_NUMERICHOST))
|
||||||
|
{
|
||||||
|
unsigned int port = 0;
|
||||||
|
char ipbuf[IPBUFSIZ];
|
||||||
|
char srvbuf[33];
|
||||||
|
char *service = NULL;
|
||||||
|
ipbuf[0] = 0;
|
||||||
|
|
||||||
|
/* Specifying not to lookup a host, but then saying a host
|
||||||
|
* is required has to be illegal.
|
||||||
|
*/
|
||||||
|
if (flags & ARES_NI_NAMEREQD)
|
||||||
|
{
|
||||||
|
callback(arg, ARES_EBADFLAGS, NULL, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (salen == sizeof(struct sockaddr_in6))
|
||||||
|
{
|
||||||
|
ares_inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, IPBUFSIZ);
|
||||||
|
port = addr6->sin6_port;
|
||||||
|
/* If the system supports scope IDs, use it */
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
append_scopeid(addr6, flags, ipbuf, sizeof(ipbuf));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ares_inet_ntop(AF_INET, &addr->sin_addr, ipbuf, IPBUFSIZ);
|
||||||
|
port = addr->sin_port;
|
||||||
|
}
|
||||||
|
/* They also want a service */
|
||||||
|
if (flags & ARES_NI_LOOKUPSERVICE)
|
||||||
|
service = lookup_service(port, flags, srvbuf, sizeof(srvbuf));
|
||||||
|
callback(arg, ARES_SUCCESS, ipbuf, service);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* This is where a DNS lookup becomes necessary */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
niquery = malloc(sizeof(struct nameinfo_query));
|
||||||
|
if (!niquery)
|
||||||
|
{
|
||||||
|
callback(arg, ARES_ENOMEM, NULL, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
niquery->callback = callback;
|
||||||
|
niquery->arg = arg;
|
||||||
|
niquery->flags = flags;
|
||||||
|
if (sa->sa_family == AF_INET)
|
||||||
|
{
|
||||||
|
niquery->family = AF_INET;
|
||||||
|
memcpy(&niquery->addr.addr4, addr, sizeof(addr));
|
||||||
|
ares_gethostbyaddr(channel, &addr->sin_addr, sizeof(struct in_addr), AF_INET,
|
||||||
|
nameinfo_callback, niquery);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
niquery->family = AF_INET6;
|
||||||
|
memcpy(&niquery->addr.addr6, addr6, sizeof(addr6));
|
||||||
|
ares_gethostbyaddr(channel, &addr6->sin6_addr, sizeof(struct in6_addr), AF_INET6,
|
||||||
|
nameinfo_callback, niquery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void nameinfo_callback(void *arg, int status, struct hostent *host)
|
||||||
|
{
|
||||||
|
struct nameinfo_query *niquery = (struct nameinfo_query *) arg;
|
||||||
|
char srvbuf[33];
|
||||||
|
char *service = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
if (status == ARES_SUCCESS)
|
||||||
|
{
|
||||||
|
/* They want a service too */
|
||||||
|
if (niquery->flags & ARES_NI_LOOKUPSERVICE)
|
||||||
|
{
|
||||||
|
if (niquery->family == AF_INET)
|
||||||
|
service = lookup_service(niquery->addr.addr4.sin_port,
|
||||||
|
niquery->flags, srvbuf, sizeof(srvbuf));
|
||||||
|
else
|
||||||
|
service = lookup_service(niquery->addr.addr6.sin6_port,
|
||||||
|
niquery->flags, srvbuf, sizeof(srvbuf));
|
||||||
|
}
|
||||||
|
/* NOFQDN means we have to strip off the domain name portion.
|
||||||
|
We do this by determining our own domain name, then searching the string
|
||||||
|
for this domain name and removing it.
|
||||||
|
*/
|
||||||
|
if (niquery->flags & ARES_NI_NOFQDN)
|
||||||
|
{
|
||||||
|
char buf[255];
|
||||||
|
char *domain;
|
||||||
|
gethostname(buf, 255);
|
||||||
|
if ((domain = strchr(buf, '.')))
|
||||||
|
{
|
||||||
|
char *end = ares_striendstr(host->h_name, domain);
|
||||||
|
if (end)
|
||||||
|
*end = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
niquery->callback(niquery->arg, ARES_SUCCESS, host->h_name, service);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* We couldn't find the host, but it's OK, we can use the IP */
|
||||||
|
else if (status == ARES_ENOTFOUND && !(niquery->flags & ARES_NI_NAMEREQD))
|
||||||
|
{
|
||||||
|
char ipbuf[IPBUFSIZ];
|
||||||
|
if (niquery->family == AF_INET)
|
||||||
|
ares_inet_ntop(AF_INET, &niquery->addr.addr4.sin_addr, ipbuf, IPBUFSIZ);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ares_inet_ntop(AF_INET6, &niquery->addr.addr6.sin6_addr, ipbuf, IPBUFSIZ);
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf, sizeof(ipbuf));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/* They want a service too */
|
||||||
|
if (niquery->flags & ARES_NI_LOOKUPSERVICE)
|
||||||
|
{
|
||||||
|
if (niquery->family == AF_INET)
|
||||||
|
service = lookup_service(niquery->addr.addr4.sin_port,
|
||||||
|
niquery->flags, srvbuf, sizeof(srvbuf));
|
||||||
|
else
|
||||||
|
service = lookup_service(niquery->addr.addr6.sin6_port,
|
||||||
|
niquery->flags, srvbuf, sizeof(srvbuf));
|
||||||
|
}
|
||||||
|
niquery->callback(niquery->arg, ARES_SUCCESS, ipbuf, service);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
niquery->callback(niquery->arg, status, NULL, NULL);
|
||||||
|
free(niquery);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *lookup_service(unsigned short port, int flags,
|
||||||
|
char *buf, size_t buflen)
|
||||||
|
{
|
||||||
|
const char *proto;
|
||||||
|
struct servent *sep;
|
||||||
|
#ifdef HAVE_GETSERVBYPORT_R
|
||||||
|
struct servent se;
|
||||||
|
#endif
|
||||||
|
char tmpbuf[4096];
|
||||||
|
|
||||||
|
if (port)
|
||||||
|
{
|
||||||
|
if (flags & ARES_NI_NUMERICSERV)
|
||||||
|
sep = NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (flags & ARES_NI_UDP)
|
||||||
|
proto = "udp";
|
||||||
|
else if (flags & ARES_NI_SCTP)
|
||||||
|
proto = "sctp";
|
||||||
|
else if (flags & ARES_NI_DCCP)
|
||||||
|
proto = "dccp";
|
||||||
|
else
|
||||||
|
proto = "tcp";
|
||||||
|
#ifdef HAVE_GETSERVBYPORT_R
|
||||||
|
sep = &se;
|
||||||
|
memset(tmpbuf, 0, sizeof(tmpbuf));
|
||||||
|
#if GETSERVBYPORT_R_ARGS == 6
|
||||||
|
if (getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf), &sep) != 0)
|
||||||
|
sep = NULL;
|
||||||
|
#elif GETSERVBYPORT_R_ARGS == 5
|
||||||
|
sep = getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf));
|
||||||
|
#elif GETSERVBYPORT_R_ARGS == 4
|
||||||
|
if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0)
|
||||||
|
sep = NULL;
|
||||||
|
#else
|
||||||
|
/* Lets just hope the OS uses TLS! */
|
||||||
|
sep = getservbyport(port, proto);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
/* Lets just hope the OS uses TLS! */
|
||||||
|
sep = getservbyport(port, proto);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (sep && sep->s_name)
|
||||||
|
/* get service name */
|
||||||
|
strcpy(tmpbuf, sep->s_name);
|
||||||
|
else
|
||||||
|
/* get port as a string */
|
||||||
|
sprintf(tmpbuf, "%u", ntohs(port));
|
||||||
|
if (strlen(tmpbuf) < buflen)
|
||||||
|
/* return it if buffer big enough */
|
||||||
|
strcpy(buf, tmpbuf);
|
||||||
|
else
|
||||||
|
/* avoid reusing previous one */
|
||||||
|
buf[0] = '\0';
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
buf[0] = '\0';
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
|
||||||
|
char *buf, size_t buflen)
|
||||||
|
{
|
||||||
|
char fmt_u[] = "%u";
|
||||||
|
char fmt_lu[] = "%lu";
|
||||||
|
char tmpbuf[IF_NAMESIZE + 2];
|
||||||
|
size_t bufl;
|
||||||
|
char *fmt = (sizeof(addr6->sin6_scope_id) > sizeof(unsigned int))?fmt_lu:fmt_u;
|
||||||
|
|
||||||
|
tmpbuf[0] = '%';
|
||||||
|
|
||||||
|
#ifdef HAVE_IF_INDEXTONAME
|
||||||
|
if ((flags & ARES_NI_NUMERICSCOPE) ||
|
||||||
|
(!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)
|
||||||
|
&& !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr)))
|
||||||
|
{
|
||||||
|
sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL)
|
||||||
|
sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id);
|
||||||
|
(void) flags;
|
||||||
|
#endif
|
||||||
|
tmpbuf[IF_NAMESIZE + 1] = '\0';
|
||||||
|
bufl = strlen(buf);
|
||||||
|
|
||||||
|
if(bufl + strlen(tmpbuf) < buflen)
|
||||||
|
/* only append the scopeid string if it fits in the target buffer */
|
||||||
|
strcpy(&buf[bufl], tmpbuf);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Determines if s1 ends with the string in s2 (case-insensitive) */
|
||||||
|
static char *ares_striendstr(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
const char *c1, *c2, *c1_begin;
|
||||||
|
size_t s1_len = strlen(s1), s2_len = strlen(s2);
|
||||||
|
|
||||||
|
/* If the substr is longer than the full str, it can't match */
|
||||||
|
if (s2_len > s1_len)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Jump to the end of s1 minus the length of s2 */
|
||||||
|
c1_begin = s1+s1_len-s2_len;
|
||||||
|
c1 = (const char *)c1_begin;
|
||||||
|
c2 = s2;
|
||||||
|
while (c2 < s2+s2_len)
|
||||||
|
{
|
||||||
|
if (tolower(*c1) != tolower(*c2))
|
||||||
|
return NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
c1++;
|
||||||
|
c2++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (c2 == c1 && c2 == NULL)
|
||||||
|
return (char *)c1_begin;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
58
ares/ares_getsock.3
Normal file
58
ares/ares_getsock.3
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
.\" $Id$
|
||||||
|
.\"
|
||||||
|
.\" Copyright 1998 by Daniel Stenberg
|
||||||
|
.\"
|
||||||
|
.\" Permission to use, copy, modify, and distribute this
|
||||||
|
.\" software and its documentation for any purpose and without
|
||||||
|
.\" fee is hereby granted, provided that the above copyright
|
||||||
|
.\" notice appear in all copies and that both that copyright
|
||||||
|
.\" notice and this permission notice appear in supporting
|
||||||
|
.\" documentation, and that the name of M.I.T. not be used in
|
||||||
|
.\" advertising or publicity pertaining to distribution of the
|
||||||
|
.\" software without specific, written prior permission.
|
||||||
|
.\" M.I.T. makes no representations about the suitability of
|
||||||
|
.\" this software for any purpose. It is provided "as is"
|
||||||
|
.\" without express or implied warranty.
|
||||||
|
.\"
|
||||||
|
.TH ARES_GETSOCK 3 "22 December 2005"
|
||||||
|
.SH NAME
|
||||||
|
ares_getsock \- get file descriptors to wait on
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.nf
|
||||||
|
.B #include <ares.h>
|
||||||
|
.PP
|
||||||
|
.B int ares_getsock(ares_channel \fIchannel\fP, int *\fIsocks\fP,
|
||||||
|
.B int \fInumsocks\fP);
|
||||||
|
.fi
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The
|
||||||
|
.B ares_getsock
|
||||||
|
function retrieves the set of file descriptors which the calling
|
||||||
|
application should wait on for reading and/or writing for the
|
||||||
|
processing of name service queries pending on the name service channel
|
||||||
|
identified by
|
||||||
|
.IR channel .
|
||||||
|
File descriptors will be set in the integer array pointed to by
|
||||||
|
\fIsocks\fP.
|
||||||
|
\fInumsocks\fP is the size of the given array in number of ints.
|
||||||
|
|
||||||
|
This function can only return information about up to 16 sockets. If more are
|
||||||
|
in use (however unlikely that is), they are simply not reported back.
|
||||||
|
.SH RETURN VALUES
|
||||||
|
\fBares_getsock\fP returns a bitmask for what actions to wait for on the
|
||||||
|
different sockets. The ares.h header file provides these convenience macros to
|
||||||
|
extract the information appropriately:
|
||||||
|
|
||||||
|
.nf
|
||||||
|
#define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about
|
||||||
|
this many sockets */
|
||||||
|
#define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num)))
|
||||||
|
#define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \
|
||||||
|
ARES_GETSOCK_MAXNUM)))
|
||||||
|
.fi
|
||||||
|
.SH NOTES
|
||||||
|
This function was added in c-ares 1.3.1
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR ares_timeout (3),
|
||||||
|
.BR ares_fds (3),
|
||||||
|
.BR ares_process (3)
|
||||||
71
ares/ares_getsock.c
Normal file
71
ares/ares_getsock.c
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright 2005 by Daniel Stenberg.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software and its
|
||||||
|
* documentation for any purpose and without fee is hereby granted, provided
|
||||||
|
* that the above copyright notice appear in all copies and that both that
|
||||||
|
* copyright notice and this permission notice appear in supporting
|
||||||
|
* documentation, and that the name of M.I.T. not be used in advertising or
|
||||||
|
* publicity pertaining to distribution of the software without specific,
|
||||||
|
* written prior permission. M.I.T. makes no representations about the
|
||||||
|
* suitability of this software for any purpose. It is provided "as is"
|
||||||
|
* without express or implied warranty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "ares.h"
|
||||||
|
#include "ares_private.h"
|
||||||
|
|
||||||
|
int ares_getsock(ares_channel channel,
|
||||||
|
int *s,
|
||||||
|
int numsocks) /* size of the 'socks' array */
|
||||||
|
{
|
||||||
|
struct server_state *server;
|
||||||
|
ares_socket_t nfds;
|
||||||
|
int i;
|
||||||
|
int sockindex=0;
|
||||||
|
int bitmap = 0;
|
||||||
|
unsigned int setbits = 0xffffffff;
|
||||||
|
|
||||||
|
ares_socket_t *socks = (ares_socket_t *)s;
|
||||||
|
|
||||||
|
/* No queries, no file descriptors. */
|
||||||
|
if (!channel->queries)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
nfds = 0;
|
||||||
|
for (i = 0; i < channel->nservers; i++)
|
||||||
|
{
|
||||||
|
server = &channel->servers[i];
|
||||||
|
if (server->udp_socket != ARES_SOCKET_BAD)
|
||||||
|
{
|
||||||
|
if(sockindex >= numsocks)
|
||||||
|
break;
|
||||||
|
socks[sockindex] = server->udp_socket;
|
||||||
|
bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
|
||||||
|
sockindex++;
|
||||||
|
}
|
||||||
|
if (server->tcp_socket != ARES_SOCKET_BAD)
|
||||||
|
{
|
||||||
|
if(sockindex >= numsocks)
|
||||||
|
break;
|
||||||
|
socks[sockindex] = server->tcp_socket;
|
||||||
|
bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
|
||||||
|
sockindex++;
|
||||||
|
|
||||||
|
if (server->qhead) {
|
||||||
|
/* then the tcp socket is also writable! */
|
||||||
|
bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (int)nfds;
|
||||||
|
}
|
||||||
135
ares/ares_init.c
135
ares/ares_init.c
@@ -27,10 +27,17 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -44,6 +51,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
#include "inet_net_pton.h"
|
||||||
|
|
||||||
#ifdef WATT32
|
#ifdef WATT32
|
||||||
#undef WIN32 /* Redefined in MingW/MSVC headers */
|
#undef WIN32 /* Redefined in MingW/MSVC headers */
|
||||||
@@ -54,19 +62,23 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
|||||||
static int init_by_environment(ares_channel channel);
|
static int init_by_environment(ares_channel channel);
|
||||||
static int init_by_resolv_conf(ares_channel channel);
|
static int init_by_resolv_conf(ares_channel channel);
|
||||||
static int init_by_defaults(ares_channel channel);
|
static int init_by_defaults(ares_channel channel);
|
||||||
|
|
||||||
|
static int config_nameserver(struct server_state **servers, int *nservers,
|
||||||
|
char *str);
|
||||||
|
static int set_search(ares_channel channel, const char *str);
|
||||||
|
static int set_options(ares_channel channel, const char *str);
|
||||||
|
static const char *try_option(const char *p, const char *q, const char *opt);
|
||||||
|
#ifndef WIN32
|
||||||
|
static int sortlist_alloc(struct apattern **sortlist, int *nsort, struct apattern *pat);
|
||||||
|
static int ip_addr(const char *s, int len, struct in_addr *addr);
|
||||||
|
static void natural_mask(struct apattern *pat);
|
||||||
static int config_domain(ares_channel channel, char *str);
|
static int config_domain(ares_channel channel, char *str);
|
||||||
static int config_lookup(ares_channel channel, const char *str,
|
static int config_lookup(ares_channel channel, const char *str,
|
||||||
const char *bindch, const char *filech);
|
const char *bindch, const char *filech);
|
||||||
static int config_nameserver(struct server_state **servers, int *nservers,
|
|
||||||
char *str);
|
|
||||||
static int config_sortlist(struct apattern **sortlist, int *nsort,
|
static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||||
const char *str);
|
const char *str);
|
||||||
static int set_search(ares_channel channel, const char *str);
|
|
||||||
static int set_options(ares_channel channel, const char *str);
|
|
||||||
static char *try_config(char *s, const char *opt);
|
static char *try_config(char *s, const char *opt);
|
||||||
static const char *try_option(const char *p, const char *q, const char *opt);
|
#endif
|
||||||
static int ip_addr(const char *s, int len, struct in_addr *addr);
|
|
||||||
static void natural_mask(struct apattern *pat);
|
|
||||||
|
|
||||||
int ares_init(ares_channel *channelptr)
|
int ares_init(ares_channel *channelptr)
|
||||||
{
|
{
|
||||||
@@ -264,7 +276,8 @@ static int get_res_nt(HKEY hKey, const char *subkey, char **obuf)
|
|||||||
if (!*obuf)
|
if (!*obuf)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (RegQueryValueEx(hKey, subkey, 0, NULL, *obuf, &size) != ERROR_SUCCESS)
|
if (RegQueryValueEx(hKey, subkey, 0, NULL,
|
||||||
|
(LPBYTE)*obuf, &size) != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
free(*obuf);
|
free(*obuf);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -314,6 +327,7 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
|||||||
size_t ip_size = sizeof("255.255.255.255,")-1;
|
size_t ip_size = sizeof("255.255.255.255,")-1;
|
||||||
size_t left = ret_size;
|
size_t left = ret_size;
|
||||||
char *ret = ret_buf;
|
char *ret = ret_buf;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
if (!fi)
|
if (!fi)
|
||||||
return (0);
|
return (0);
|
||||||
@@ -326,7 +340,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
|||||||
if (!GetNetworkParams)
|
if (!GetNetworkParams)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
if ((*GetNetworkParams) (fi, &size) != ERROR_BUFFER_OVERFLOW)
|
res = (*GetNetworkParams) (fi, &size);
|
||||||
|
if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
fi = alloca (size);
|
fi = alloca (size);
|
||||||
@@ -489,7 +504,7 @@ DhcpNameServer
|
|||||||
if (status == ARES_SUCCESS)
|
if (status == ARES_SUCCESS)
|
||||||
status = ARES_EOF;
|
status = ARES_EOF;
|
||||||
|
|
||||||
#elif defined(riscos)
|
#elif defined(__riscos__)
|
||||||
|
|
||||||
/* Under RISC OS, name servers are listed in the
|
/* Under RISC OS, name servers are listed in the
|
||||||
system variable Inet$Resolvers, space separated. */
|
system variable Inet$Resolvers, space separated. */
|
||||||
@@ -709,6 +724,7 @@ static int init_by_defaults(ares_channel channel)
|
|||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
static int config_domain(ares_channel channel, char *str)
|
static int config_domain(ares_channel channel, char *str)
|
||||||
{
|
{
|
||||||
char *q;
|
char *q;
|
||||||
@@ -749,6 +765,8 @@ static int config_lookup(ares_channel channel, const char *str,
|
|||||||
return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM;
|
return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static int config_nameserver(struct server_state **servers, int *nservers,
|
static int config_nameserver(struct server_state **servers, int *nservers,
|
||||||
char *str)
|
char *str)
|
||||||
{
|
{
|
||||||
@@ -810,39 +828,74 @@ static int config_nameserver(struct server_state **servers, int *nservers,
|
|||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
static int config_sortlist(struct apattern **sortlist, int *nsort,
|
static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||||
const char *str)
|
const char *str)
|
||||||
{
|
{
|
||||||
struct apattern pat, *newsort;
|
struct apattern pat;
|
||||||
const char *q;
|
const char *q;
|
||||||
|
|
||||||
/* Add sortlist entries. */
|
/* Add sortlist entries. */
|
||||||
while (*str && *str != ';')
|
while (*str && *str != ';')
|
||||||
{
|
{
|
||||||
|
int bits;
|
||||||
|
char ipbuf[16], ipbufpfx[32];
|
||||||
|
/* Find just the IP */
|
||||||
q = str;
|
q = str;
|
||||||
while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q))
|
while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q))
|
||||||
q++;
|
q++;
|
||||||
if (ip_addr(str, (int)(q - str), &pat.addr) == 0)
|
memcpy(ipbuf, str, (int)(q-str));
|
||||||
|
ipbuf[(int)(q-str)] = 0;
|
||||||
|
/* Find the prefix */
|
||||||
|
if (*q == '/')
|
||||||
{
|
{
|
||||||
/* We have a pattern address; now determine the mask. */
|
const char *str2 = q+1;
|
||||||
if (*q == '/')
|
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
||||||
|
q++;
|
||||||
|
memcpy(ipbufpfx, str, (int)(q-str));
|
||||||
|
ipbufpfx[(int)(q-str)] = 0;
|
||||||
|
str = str2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ipbufpfx[0] = 0;
|
||||||
|
/* Lets see if it is CIDR */
|
||||||
|
/* First we'll try IPv6 */
|
||||||
|
if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf,
|
||||||
|
&pat.addr.addr6,
|
||||||
|
sizeof(pat.addr.addr6))) > 0)
|
||||||
|
{
|
||||||
|
pat.type = PATTERN_CIDR;
|
||||||
|
pat.mask.bits = bits;
|
||||||
|
pat.family = AF_INET6;
|
||||||
|
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||||
|
return ARES_ENOMEM;
|
||||||
|
}
|
||||||
|
if (ipbufpfx &&
|
||||||
|
(bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addr.addr4,
|
||||||
|
sizeof(pat.addr.addr4))) > 0)
|
||||||
|
{
|
||||||
|
pat.type = PATTERN_CIDR;
|
||||||
|
pat.mask.bits = bits;
|
||||||
|
pat.family = AF_INET;
|
||||||
|
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||||
|
return ARES_ENOMEM;
|
||||||
|
}
|
||||||
|
/* See if it is just a regular IP */
|
||||||
|
else if (ip_addr(ipbuf, (int)(q-str), &pat.addr.addr4) == 0)
|
||||||
|
{
|
||||||
|
if (ipbufpfx)
|
||||||
{
|
{
|
||||||
str = q + 1;
|
memcpy(ipbuf, str, (int)(q-str));
|
||||||
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
ipbuf[(int)(q-str)] = 0;
|
||||||
q++;
|
if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr.addr4) != 0)
|
||||||
if (ip_addr(str, (int)(q - str), &pat.mask) != 0)
|
|
||||||
natural_mask(&pat);
|
natural_mask(&pat);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
natural_mask(&pat);
|
natural_mask(&pat);
|
||||||
|
pat.family = AF_INET;
|
||||||
/* Add this pattern to our list. */
|
pat.type = PATTERN_MASK;
|
||||||
newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern));
|
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||||
if (!newsort)
|
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
newsort[*nsort] = pat;
|
|
||||||
*sortlist = newsort;
|
|
||||||
(*nsort)++;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -856,6 +909,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
|||||||
|
|
||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int set_search(ares_channel channel, const char *str)
|
static int set_search(ares_channel channel, const char *str)
|
||||||
{
|
{
|
||||||
@@ -937,6 +991,7 @@ static int set_options(ares_channel channel, const char *str)
|
|||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
static char *try_config(char *s, const char *opt)
|
static char *try_config(char *s, const char *opt)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
@@ -950,21 +1005,34 @@ static char *try_config(char *s, const char *opt)
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static const char *try_option(const char *p, const char *q, const char *opt)
|
static const char *try_option(const char *p, const char *q, const char *opt)
|
||||||
{
|
{
|
||||||
size_t len = strlen(opt);
|
size_t len = strlen(opt);
|
||||||
return ((size_t)(q - p) > len && !strncmp(p, opt, len)) ? &p[len] : NULL;
|
return ((size_t)(q - p) > len && !strncmp(p, opt, len)) ? &p[len] : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ip_addr(const char *s, int len, struct in_addr *addr)
|
#ifndef WIN32
|
||||||
|
static int sortlist_alloc(struct apattern **sortlist, int *nsort,
|
||||||
|
struct apattern *pat)
|
||||||
|
{
|
||||||
|
struct apattern *newsort;
|
||||||
|
newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern));
|
||||||
|
if (!newsort)
|
||||||
|
return 0;
|
||||||
|
newsort[*nsort] = *pat;
|
||||||
|
*sortlist = newsort;
|
||||||
|
(*nsort)++;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ip_addr(const char *ipbuf, int len, struct in_addr *addr)
|
||||||
{
|
{
|
||||||
char ipbuf[16];
|
|
||||||
|
|
||||||
/* Four octets and three periods yields at most 15 characters. */
|
/* Four octets and three periods yields at most 15 characters. */
|
||||||
if (len > 15)
|
if (len > 15)
|
||||||
return -1;
|
return -1;
|
||||||
memcpy(ipbuf, s, len);
|
|
||||||
ipbuf[len] = 0;
|
|
||||||
|
|
||||||
addr->s_addr = inet_addr(ipbuf);
|
addr->s_addr = inet_addr(ipbuf);
|
||||||
if (addr->s_addr == INADDR_NONE && strcmp(ipbuf, "255.255.255.255") != 0)
|
if (addr->s_addr == INADDR_NONE && strcmp(ipbuf, "255.255.255.255") != 0)
|
||||||
@@ -979,15 +1047,16 @@ static void natural_mask(struct apattern *pat)
|
|||||||
/* Store a host-byte-order copy of pat in a struct in_addr. Icky,
|
/* Store a host-byte-order copy of pat in a struct in_addr. Icky,
|
||||||
* but portable.
|
* but portable.
|
||||||
*/
|
*/
|
||||||
addr.s_addr = ntohl(pat->addr.s_addr);
|
addr.s_addr = ntohl(pat->addr.addr4.s_addr);
|
||||||
|
|
||||||
/* This is out of date in the CIDR world, but some people might
|
/* This is out of date in the CIDR world, but some people might
|
||||||
* still rely on it.
|
* still rely on it.
|
||||||
*/
|
*/
|
||||||
if (IN_CLASSA(addr.s_addr))
|
if (IN_CLASSA(addr.s_addr))
|
||||||
pat->mask.s_addr = htonl(IN_CLASSA_NET);
|
pat->mask.addr.addr4.s_addr = htonl(IN_CLASSA_NET);
|
||||||
else if (IN_CLASSB(addr.s_addr))
|
else if (IN_CLASSB(addr.s_addr))
|
||||||
pat->mask.s_addr = htonl(IN_CLASSB_NET);
|
pat->mask.addr.addr4.s_addr = htonl(IN_CLASSB_NET);
|
||||||
else
|
else
|
||||||
pat->mask.s_addr = htonl(IN_CLASSC_NET);
|
pat->mask.addr.addr4.s_addr = htonl(IN_CLASSC_NET);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
81
ares/ares_ipv6.h
Normal file
81
ares/ares_ipv6.h
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Permission to use, copy, modify, and distribute this
|
||||||
|
* software and its documentation for any purpose and without
|
||||||
|
* fee is hereby granted, provided that the above copyright
|
||||||
|
* notice appear in all copies and that both that copyright
|
||||||
|
* notice and this permission notice appear in supporting
|
||||||
|
* documentation, and that the name of M.I.T. not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* M.I.T. makes no representations about the suitability of
|
||||||
|
* this software for any purpose. It is provided "as is"
|
||||||
|
* without express or implied warranty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ARES_IPV6_H
|
||||||
|
#define ARES_IPV6_H
|
||||||
|
|
||||||
|
#ifndef HAVE_PF_INET6
|
||||||
|
#define PF_INET6 AF_INET6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_STRUCT_IN6_ADDR
|
||||||
|
struct in6_addr
|
||||||
|
{
|
||||||
|
unsigned char s6_addr[16];
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_STRUCT_SOCKADDR_IN6
|
||||||
|
struct sockaddr_in6
|
||||||
|
{
|
||||||
|
unsigned short sin6_family;
|
||||||
|
unsigned short sin6_port;
|
||||||
|
unsigned long sin6_flowinfo;
|
||||||
|
struct in6_addr sin6_addr;
|
||||||
|
unsigned int sin6_scope_id;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_STRUCT_ADDRINFO
|
||||||
|
struct addrinfo
|
||||||
|
{
|
||||||
|
int ai_flags;
|
||||||
|
int ai_family;
|
||||||
|
int ai_socktype;
|
||||||
|
int ai_protocol;
|
||||||
|
size_t ai_addrlen;
|
||||||
|
char *ai_cannonname;
|
||||||
|
struct sockaddr *ai_addr;
|
||||||
|
struct addrinfo *ai_next;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NS_IN6ADDRSZ
|
||||||
|
#if SIZEOF_STRUCT_IN6_ADDR == 0
|
||||||
|
/* We cannot have it set to zero, so we pick a fixed value here */
|
||||||
|
#define NS_IN6ADDRSZ 16
|
||||||
|
#else
|
||||||
|
#define NS_IN6ADDRSZ SIZEOF_STRUCT_IN6_ADDR
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NS_INADDRSZ
|
||||||
|
#define NS_INADDRSZ SIZEOF_STRUCT_IN_ADDR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NS_INT16SZ
|
||||||
|
#define NS_INT16SZ 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef IF_NAMESIZE
|
||||||
|
#ifdef IFNAMSIZ
|
||||||
|
#define IF_NAMESIZE IFNAMSIZ
|
||||||
|
#else
|
||||||
|
#define IF_NAMESIZE 256
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ARES_IPV6_H */
|
||||||
@@ -21,6 +21,9 @@
|
|||||||
#else
|
#else
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|||||||
@@ -24,6 +24,9 @@
|
|||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|||||||
64
ares/ares_parse_aaaa_reply.3
Normal file
64
ares/ares_parse_aaaa_reply.3
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
.\" $Id$
|
||||||
|
.\"
|
||||||
|
.\" Copyright 2005 by Dominick Meglio.
|
||||||
|
.\"
|
||||||
|
.\" Permission to use, copy, modify, and distribute this
|
||||||
|
.\" software and its documentation for any purpose and without
|
||||||
|
.\" fee is hereby granted, provided that the above copyright
|
||||||
|
.\" notice appear in all copies and that both that copyright
|
||||||
|
.\" notice and this permission notice appear in supporting
|
||||||
|
.\" documentation, and that the name of M.I.T. not be used in
|
||||||
|
.\" advertising or publicity pertaining to distribution of the
|
||||||
|
.\" software without specific, written prior permission.
|
||||||
|
.\" M.I.T. makes no representations about the suitability of
|
||||||
|
.\" this software for any purpose. It is provided "as is"
|
||||||
|
.\" without express or implied warranty.
|
||||||
|
.\"
|
||||||
|
.TH ARES_PARSE_AAAA_REPLY 3 "10 March 2005"
|
||||||
|
.SH NAME
|
||||||
|
ares_parse_aaaa_reply \- Parse a reply to a DNS query of type AAAA into a hostent
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.nf
|
||||||
|
.B #include <ares.h>
|
||||||
|
.PP
|
||||||
|
.B int ares_parse_aaaa_reply(const unsigned char *\fIabuf\fP, int \fIalen\fP,
|
||||||
|
.B struct hostent **\fIhost\fP);
|
||||||
|
.fi
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The
|
||||||
|
.B ares_parse_aaaa_reply
|
||||||
|
function parses the response to a query of type AAAA into a
|
||||||
|
.BR "struct hostent" .
|
||||||
|
The parameters
|
||||||
|
.I abuf
|
||||||
|
and
|
||||||
|
.I alen
|
||||||
|
give the contents of the response. The result is stored in allocated
|
||||||
|
memory and a pointer to it stored into the variable pointed to by
|
||||||
|
.IR host .
|
||||||
|
It is the caller's responsibility to free the resulting host structure
|
||||||
|
using
|
||||||
|
.BR ares_free_hostent (3)
|
||||||
|
when it is no longer needed.
|
||||||
|
.SH RETURN VALUES
|
||||||
|
.B ares_parse_aaaa_reply
|
||||||
|
can return any of the following values:
|
||||||
|
.TP 15
|
||||||
|
.B ARES_SUCCESS
|
||||||
|
The response was successfully parsed.
|
||||||
|
.TP 15
|
||||||
|
.B ARES_EBADRESP
|
||||||
|
The response was malformatted.
|
||||||
|
.TP 15
|
||||||
|
.B ARES_ENODATA
|
||||||
|
The response did not contain an answer to the query.
|
||||||
|
.TP 15
|
||||||
|
.B ARES_ENOMEM
|
||||||
|
Memory was exhausted.
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR ares_gethostbyname (3),
|
||||||
|
.BR ares_free_hostent (3)
|
||||||
|
.SH AUTHOR
|
||||||
|
Dominick Meglio
|
||||||
|
.br
|
||||||
|
Copyright 2005 by Dominick Meglio.
|
||||||
179
ares/ares_parse_aaaa_reply.c
Normal file
179
ares/ares_parse_aaaa_reply.c
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
/* Copyright 2005 Dominick Meglio
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this
|
||||||
|
* software and its documentation for any purpose and without
|
||||||
|
* fee is hereby granted, provided that the above copyright
|
||||||
|
* notice appear in all copies and that both that copyright
|
||||||
|
* notice and this permission notice appear in supporting
|
||||||
|
* documentation, and that the name of M.I.T. not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* M.I.T. makes no representations about the suitability of
|
||||||
|
* this software for any purpose. It is provided "as is"
|
||||||
|
* without express or implied warranty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
|
#include "nameser.h"
|
||||||
|
#else
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_H
|
||||||
|
#include <arpa/nameser.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "ares.h"
|
||||||
|
#include "ares_dns.h"
|
||||||
|
#include "inet_net_pton.h"
|
||||||
|
#include "ares_private.h"
|
||||||
|
|
||||||
|
int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||||
|
struct hostent **host)
|
||||||
|
{
|
||||||
|
unsigned int qdcount, ancount;
|
||||||
|
int status, i, rr_type, rr_class, rr_len, naddrs;
|
||||||
|
int naliases;
|
||||||
|
long len;
|
||||||
|
const unsigned char *aptr;
|
||||||
|
char *hostname, *rr_name, *rr_data, **aliases;
|
||||||
|
struct in6_addr *addrs;
|
||||||
|
struct hostent *hostent;
|
||||||
|
|
||||||
|
/* Set *host to NULL for all failure cases. */
|
||||||
|
*host = NULL;
|
||||||
|
|
||||||
|
/* Give up if abuf doesn't have room for a header. */
|
||||||
|
if (alen < HFIXEDSZ)
|
||||||
|
return ARES_EBADRESP;
|
||||||
|
|
||||||
|
/* Fetch the question and answer count from the header. */
|
||||||
|
qdcount = DNS_HEADER_QDCOUNT(abuf);
|
||||||
|
ancount = DNS_HEADER_ANCOUNT(abuf);
|
||||||
|
if (qdcount != 1)
|
||||||
|
return ARES_EBADRESP;
|
||||||
|
|
||||||
|
/* Expand the name from the question, and skip past the question. */
|
||||||
|
aptr = abuf + HFIXEDSZ;
|
||||||
|
status = ares_expand_name(aptr, abuf, alen, &hostname, &len);
|
||||||
|
if (status != ARES_SUCCESS)
|
||||||
|
return status;
|
||||||
|
if (aptr + len + QFIXEDSZ > abuf + alen)
|
||||||
|
{
|
||||||
|
free(hostname);
|
||||||
|
return ARES_EBADRESP;
|
||||||
|
}
|
||||||
|
aptr += len + QFIXEDSZ;
|
||||||
|
|
||||||
|
/* Allocate addresses and aliases; ancount gives an upper bound for both. */
|
||||||
|
addrs = malloc(ancount * sizeof(struct in6_addr));
|
||||||
|
if (!addrs)
|
||||||
|
{
|
||||||
|
free(hostname);
|
||||||
|
return ARES_ENOMEM;
|
||||||
|
}
|
||||||
|
aliases = malloc((ancount + 1) * sizeof(char *));
|
||||||
|
if (!aliases)
|
||||||
|
{
|
||||||
|
free(hostname);
|
||||||
|
free(addrs);
|
||||||
|
return ARES_ENOMEM;
|
||||||
|
}
|
||||||
|
naddrs = 0;
|
||||||
|
naliases = 0;
|
||||||
|
|
||||||
|
/* Examine each answer resource record (RR) in turn. */
|
||||||
|
for (i = 0; i < (int)ancount; i++)
|
||||||
|
{
|
||||||
|
/* Decode the RR up to the data field. */
|
||||||
|
status = ares_expand_name(aptr, abuf, alen, &rr_name, &len);
|
||||||
|
if (status != ARES_SUCCESS)
|
||||||
|
break;
|
||||||
|
aptr += len;
|
||||||
|
if (aptr + RRFIXEDSZ > abuf + alen)
|
||||||
|
{
|
||||||
|
status = ARES_EBADRESP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rr_type = DNS_RR_TYPE(aptr);
|
||||||
|
rr_class = DNS_RR_CLASS(aptr);
|
||||||
|
rr_len = DNS_RR_LEN(aptr);
|
||||||
|
aptr += RRFIXEDSZ;
|
||||||
|
|
||||||
|
if (rr_class == C_IN && rr_type == T_AAAA
|
||||||
|
&& rr_len == sizeof(struct in6_addr)
|
||||||
|
&& strcasecmp(rr_name, hostname) == 0)
|
||||||
|
{
|
||||||
|
memcpy(&addrs[naddrs], aptr, sizeof(struct in6_addr));
|
||||||
|
naddrs++;
|
||||||
|
status = ARES_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rr_class == C_IN && rr_type == T_CNAME)
|
||||||
|
{
|
||||||
|
/* Record the RR name as an alias. */
|
||||||
|
aliases[naliases] = rr_name;
|
||||||
|
naliases++;
|
||||||
|
|
||||||
|
/* Decode the RR data and replace the hostname with it. */
|
||||||
|
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
||||||
|
if (status != ARES_SUCCESS)
|
||||||
|
break;
|
||||||
|
free(hostname);
|
||||||
|
hostname = rr_data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
free(rr_name);
|
||||||
|
|
||||||
|
aptr += rr_len;
|
||||||
|
if (aptr > abuf + alen)
|
||||||
|
{
|
||||||
|
status = ARES_EBADRESP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == ARES_SUCCESS && naddrs == 0)
|
||||||
|
status = ARES_ENODATA;
|
||||||
|
if (status == ARES_SUCCESS)
|
||||||
|
{
|
||||||
|
/* We got our answer. Allocate memory to build the host entry. */
|
||||||
|
aliases[naliases] = NULL;
|
||||||
|
hostent = malloc(sizeof(struct hostent));
|
||||||
|
if (hostent)
|
||||||
|
{
|
||||||
|
hostent->h_addr_list = malloc((naddrs + 1) * sizeof(char *));
|
||||||
|
if (hostent->h_addr_list)
|
||||||
|
{
|
||||||
|
/* Fill in the hostent and return successfully. */
|
||||||
|
hostent->h_name = hostname;
|
||||||
|
hostent->h_aliases = aliases;
|
||||||
|
hostent->h_addrtype = AF_INET6;
|
||||||
|
hostent->h_length = sizeof(struct in6_addr);
|
||||||
|
for (i = 0; i < naddrs; i++)
|
||||||
|
hostent->h_addr_list[i] = (char *) &addrs[i];
|
||||||
|
hostent->h_addr_list[naddrs] = NULL;
|
||||||
|
*host = hostent;
|
||||||
|
return ARES_SUCCESS;
|
||||||
|
}
|
||||||
|
free(hostent);
|
||||||
|
}
|
||||||
|
status = ARES_ENOMEM;
|
||||||
|
}
|
||||||
|
for (i = 0; i < naliases; i++)
|
||||||
|
free(aliases[i]);
|
||||||
|
free(aliases);
|
||||||
|
free(addrs);
|
||||||
|
free(hostname);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
@@ -23,6 +23,9 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|||||||
@@ -33,6 +33,10 @@
|
|||||||
#define writev(s,v,c) writev_s(s,v,c)
|
#define writev(s,v,c) writev_s(s,v,c)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef NETWARE
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DEFAULT_TIMEOUT 5
|
#define DEFAULT_TIMEOUT 5
|
||||||
#define DEFAULT_TRIES 4
|
#define DEFAULT_TRIES 4
|
||||||
#ifndef INADDR_NONE
|
#ifndef INADDR_NONE
|
||||||
@@ -58,6 +62,10 @@
|
|||||||
#define PATH_RESOLV_CONF "sys:/etc/resolv.cfg"
|
#define PATH_RESOLV_CONF "sys:/etc/resolv.cfg"
|
||||||
#define PATH_HOSTS "sys:/etc/hosts"
|
#define PATH_HOSTS "sys:/etc/hosts"
|
||||||
|
|
||||||
|
#elif defined(__riscos__)
|
||||||
|
|
||||||
|
#define PATH_HOSTS "InetDBase:Hosts"
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define PATH_RESOLV_CONF "/etc/resolv.conf"
|
#define PATH_RESOLV_CONF "/etc/resolv.conf"
|
||||||
@@ -69,6 +77,8 @@
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "ares_ipv6.h"
|
||||||
|
|
||||||
struct send_request {
|
struct send_request {
|
||||||
/* Remaining data to send */
|
/* Remaining data to send */
|
||||||
const unsigned char *data;
|
const unsigned char *data;
|
||||||
@@ -124,9 +134,23 @@ struct query {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* An IP address pattern; matches an IP address X if X & mask == addr */
|
/* An IP address pattern; matches an IP address X if X & mask == addr */
|
||||||
|
#define PATTERN_MASK 0x1
|
||||||
|
#define PATTERN_CIDR 0x2
|
||||||
|
|
||||||
|
union ares_addr {
|
||||||
|
struct in_addr addr4;
|
||||||
|
struct in6_addr addr6;
|
||||||
|
};
|
||||||
|
|
||||||
struct apattern {
|
struct apattern {
|
||||||
struct in_addr addr;
|
union ares_addr addr;
|
||||||
struct in_addr mask;
|
union
|
||||||
|
{
|
||||||
|
union ares_addr addr;
|
||||||
|
unsigned short bits;
|
||||||
|
} mask;
|
||||||
|
int family;
|
||||||
|
unsigned short type;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ares_channeldata {
|
struct ares_channeldata {
|
||||||
@@ -156,7 +180,7 @@ struct ares_channeldata {
|
|||||||
|
|
||||||
void ares__send_query(ares_channel channel, struct query *query, time_t now);
|
void ares__send_query(ares_channel channel, struct query *query, time_t now);
|
||||||
void ares__close_sockets(struct server_state *server);
|
void ares__close_sockets(struct server_state *server);
|
||||||
int ares__get_hostent(FILE *fp, struct hostent **host);
|
int ares__get_hostent(FILE *fp, int family, struct hostent **host);
|
||||||
int ares__read_line(FILE *fp, char **buf, int *bufsize);
|
int ares__read_line(FILE *fp, char **buf, int *bufsize);
|
||||||
|
|
||||||
#ifdef CURLDEBUG
|
#ifdef CURLDEBUG
|
||||||
@@ -164,9 +188,5 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize);
|
|||||||
libcurl lowlevel code from within library is ugly and only works when
|
libcurl lowlevel code from within library is ugly and only works when
|
||||||
c-ares is built and linked with a similarly debug-build libcurl, but we do
|
c-ares is built and linked with a similarly debug-build libcurl, but we do
|
||||||
this anyway for convenience. */
|
this anyway for convenience. */
|
||||||
#ifndef CURL_EXTERN
|
|
||||||
/* ugly hack to make this compile */
|
|
||||||
#define CURL_EXTERN
|
|
||||||
#endif
|
|
||||||
#include "../lib/memdebug.h"
|
#include "../lib/memdebug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -27,9 +27,19 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
|
#endif /* WIN32 && !WATT32 */
|
||||||
|
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SYS_IOCTL_H
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#endif
|
||||||
|
#ifdef NETWARE
|
||||||
|
#include <sys/filio.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -42,6 +52,11 @@
|
|||||||
#include "ares_dns.h"
|
#include "ares_dns.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
/* at least Solaris 7 does not have TRUE at this point */
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
|
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
|
||||||
#define GET_ERRNO() WSAGetLastError()
|
#define GET_ERRNO() WSAGetLastError()
|
||||||
#else
|
#else
|
||||||
@@ -89,7 +104,7 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
|||||||
struct iovec *vec;
|
struct iovec *vec;
|
||||||
int i;
|
int i;
|
||||||
ssize_t scount;
|
ssize_t scount;
|
||||||
int wcount;
|
ssize_t wcount;
|
||||||
size_t n;
|
size_t n;
|
||||||
|
|
||||||
for (i = 0; i < channel->nservers; i++)
|
for (i = 0; i < channel->nservers; i++)
|
||||||
@@ -150,7 +165,8 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
|||||||
/* Can't allocate iovecs; just send the first request. */
|
/* Can't allocate iovecs; just send the first request. */
|
||||||
sendreq = server->qhead;
|
sendreq = server->qhead;
|
||||||
|
|
||||||
scount = send(server->tcp_socket, sendreq->data, sendreq->len, 0);
|
scount = send(server->tcp_socket, (void *)sendreq->data,
|
||||||
|
sendreq->len, 0);
|
||||||
|
|
||||||
if (scount < 0)
|
if (scount < 0)
|
||||||
{
|
{
|
||||||
@@ -198,8 +214,8 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now)
|
|||||||
* what's left to read of it).
|
* what's left to read of it).
|
||||||
*/
|
*/
|
||||||
count = recv(server->tcp_socket,
|
count = recv(server->tcp_socket,
|
||||||
server->tcp_lenbuf + server->tcp_buffer_pos,
|
(void *)(server->tcp_lenbuf + server->tcp_lenbuf_pos),
|
||||||
2 - server->tcp_buffer_pos, 0);
|
2 - server->tcp_lenbuf_pos, 0);
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
{
|
{
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
@@ -224,7 +240,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now)
|
|||||||
{
|
{
|
||||||
/* Read data into the allocated buffer. */
|
/* Read data into the allocated buffer. */
|
||||||
count = recv(server->tcp_socket,
|
count = recv(server->tcp_socket,
|
||||||
server->tcp_buffer + server->tcp_buffer_pos,
|
(void *)(server->tcp_buffer + server->tcp_buffer_pos),
|
||||||
server->tcp_length - server->tcp_buffer_pos, 0);
|
server->tcp_length - server->tcp_buffer_pos, 0);
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
{
|
{
|
||||||
@@ -266,7 +282,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds,
|
|||||||
!FD_ISSET(server->udp_socket, read_fds))
|
!FD_ISSET(server->udp_socket, read_fds))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
count = recv(server->udp_socket, buf, sizeof(buf), 0);
|
count = recv(server->udp_socket, (void *)buf, sizeof(buf), 0);
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
|
|
||||||
@@ -451,7 +467,8 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (send(server->udp_socket, query->qbuf, query->qlen, 0) == -1)
|
if (send(server->udp_socket, (void *)query->qbuf,
|
||||||
|
query->qlen, 0) == -1)
|
||||||
{
|
{
|
||||||
query->skip_server[query->server] = 1;
|
query->skip_server[query->server] = 1;
|
||||||
next_server(channel, query, now);
|
next_server(channel, query, now);
|
||||||
@@ -463,10 +480,77 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nonblock() set the given socket to either blocking or non-blocking mode
|
||||||
|
* based on the 'nonblock' boolean argument. This function is highly portable.
|
||||||
|
*/
|
||||||
|
static int nonblock(ares_socket_t sockfd, /* operate on this */
|
||||||
|
int nonblock /* TRUE or FALSE */)
|
||||||
|
{
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 0
|
||||||
|
#ifdef HAVE_O_NONBLOCK
|
||||||
|
/* most recent unix versions */
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
flags = fcntl(sockfd, F_GETFL, 0);
|
||||||
|
if (TRUE == nonblock)
|
||||||
|
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
||||||
|
else
|
||||||
|
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_FIONBIO) && (SETBLOCK == 0)
|
||||||
|
/* older unix versions */
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
flags = nonblock;
|
||||||
|
return ioctl(sockfd, FIONBIO, &flags);
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0)
|
||||||
|
/* Windows? */
|
||||||
|
unsigned long flags;
|
||||||
|
flags = nonblock;
|
||||||
|
|
||||||
|
return ioctlsocket(sockfd, FIONBIO, &flags);
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_IOCTLSOCKET_CASE) && (SETBLOCK == 0)
|
||||||
|
/* presumably for Amiga */
|
||||||
|
return IoctlSocket(sockfd, FIONBIO, (long)nonblock);
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_SO_NONBLOCK) && (SETBLOCK == 0)
|
||||||
|
/* BeOS */
|
||||||
|
long b = nonblock ? 1 : 0;
|
||||||
|
return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_DISABLED_NONBLOCKING
|
||||||
|
return 0; /* returns success */
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (SETBLOCK == 0)
|
||||||
|
#error "no non-blocking method was found/used/set"
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static int open_tcp_socket(ares_channel channel, struct server_state *server)
|
static int open_tcp_socket(ares_channel channel, struct server_state *server)
|
||||||
{
|
{
|
||||||
ares_socket_t s;
|
ares_socket_t s;
|
||||||
int flags;
|
|
||||||
struct sockaddr_in sockin;
|
struct sockaddr_in sockin;
|
||||||
|
|
||||||
/* Acquire a socket. */
|
/* Acquire a socket. */
|
||||||
@@ -475,25 +559,7 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* Set the socket non-blocking. */
|
/* Set the socket non-blocking. */
|
||||||
|
nonblock(s, TRUE);
|
||||||
#if defined(WIN32) || defined(WATT32)
|
|
||||||
flags = 1;
|
|
||||||
ioctlsocket(s, FIONBIO, &flags);
|
|
||||||
#else
|
|
||||||
flags = fcntl(s, F_GETFL, 0);
|
|
||||||
|
|
||||||
if (flags == -1)
|
|
||||||
{
|
|
||||||
closesocket(s);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
flags |= O_NONBLOCK;
|
|
||||||
if (fcntl(s, F_SETFL, flags) == -1)
|
|
||||||
{
|
|
||||||
closesocket(s);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Connect to the server. */
|
/* Connect to the server. */
|
||||||
memset(&sockin, 0, sizeof(sockin));
|
memset(&sockin, 0, sizeof(sockin));
|
||||||
@@ -524,6 +590,9 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
|
|||||||
if (s == ARES_SOCKET_BAD)
|
if (s == ARES_SOCKET_BAD)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
/* Set the socket non-blocking. */
|
||||||
|
nonblock(s, TRUE);
|
||||||
|
|
||||||
/* Connect to the server. */
|
/* Connect to the server. */
|
||||||
memset(&sockin, 0, sizeof(sockin));
|
memset(&sockin, 0, sizeof(sockin));
|
||||||
sockin.sin_family = AF_INET;
|
sockin.sin_family = AF_INET;
|
||||||
|
|||||||
@@ -21,6 +21,9 @@
|
|||||||
#else
|
#else
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|||||||
@@ -21,6 +21,9 @@
|
|||||||
#else
|
#else
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|||||||
@@ -38,7 +38,8 @@ const char *ares_strerror(int code)
|
|||||||
"Error reading file",
|
"Error reading file",
|
||||||
"Out of memory",
|
"Out of memory",
|
||||||
"Channel is being destroyed",
|
"Channel is being destroyed",
|
||||||
"Misformatted string"
|
"Misformatted string",
|
||||||
|
"Illegal flags specified"
|
||||||
};
|
};
|
||||||
|
|
||||||
assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)));
|
assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)));
|
||||||
|
|||||||
@@ -4,12 +4,12 @@
|
|||||||
#define ARES__VERSION_H
|
#define ARES__VERSION_H
|
||||||
|
|
||||||
#define ARES_VERSION_MAJOR 1
|
#define ARES_VERSION_MAJOR 1
|
||||||
#define ARES_VERSION_MINOR 2
|
#define ARES_VERSION_MINOR 3
|
||||||
#define ARES_VERSION_PATCH 0
|
#define ARES_VERSION_PATCH 1
|
||||||
#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\
|
#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\
|
||||||
(ARES_VERSION_MINOR<<8)|\
|
(ARES_VERSION_MINOR<<8)|\
|
||||||
(ARES_VERSION_PATCH))
|
(ARES_VERSION_PATCH))
|
||||||
#define ARES_VERSION_STR "1.2.0"
|
#define ARES_VERSION_STR "1.3.1"
|
||||||
|
|
||||||
const char *ares_version(int *version);
|
const char *ares_version(int *version);
|
||||||
|
|
||||||
|
|||||||
60
ares/bitncmp.c
Normal file
60
ares/bitncmp.c
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
* Copyright (c) 1996,1999 by Internet Software Consortium.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HAVE_BITNCMP
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "bitncmp.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* int
|
||||||
|
* bitncmp(l, r, n)
|
||||||
|
* compare bit masks l and r, for n bits.
|
||||||
|
* return:
|
||||||
|
* -1, 1, or 0 in the libc tradition.
|
||||||
|
* note:
|
||||||
|
* network byte order assumed. this means 192.5.5.240/28 has
|
||||||
|
* 0x11110000 in its fourth octet.
|
||||||
|
* author:
|
||||||
|
* Paul Vixie (ISC), June 1996
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ares_bitncmp(const void *l, const void *r, int n) {
|
||||||
|
unsigned int lb, rb;
|
||||||
|
int x, b;
|
||||||
|
|
||||||
|
b = n / 8;
|
||||||
|
x = memcmp(l, r, b);
|
||||||
|
if (x)
|
||||||
|
return (x);
|
||||||
|
|
||||||
|
lb = ((const unsigned char *)l)[b];
|
||||||
|
rb = ((const unsigned char *)r)[b];
|
||||||
|
for (b = n % 8; b > 0; b--) {
|
||||||
|
if ((lb & 0x80) != (rb & 0x80)) {
|
||||||
|
if (lb & 0x80)
|
||||||
|
return (1);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
lb <<= 1;
|
||||||
|
rb <<= 1;
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
26
ares/bitncmp.h
Normal file
26
ares/bitncmp.h
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Permission to use, copy, modify, and distribute this
|
||||||
|
* software and its documentation for any purpose and without
|
||||||
|
* fee is hereby granted, provided that the above copyright
|
||||||
|
* notice appear in all copies and that both that copyright
|
||||||
|
* notice and this permission notice appear in supporting
|
||||||
|
* documentation, and that the name of M.I.T. not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* M.I.T. makes no representations about the suitability of
|
||||||
|
* this software for any purpose. It is provided "as is"
|
||||||
|
* without express or implied warranty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BITNCMP_H
|
||||||
|
#define BITNCMP_H
|
||||||
|
|
||||||
|
#ifndef HAVE_BITNCMP
|
||||||
|
int ares_bitncmp(const void *l, const void *r, int n);
|
||||||
|
#else
|
||||||
|
#define ares_bitncmp(x,y,z) bitncmp(x,y,z)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* BITNCMP_H */
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
libtoolize --copy --automake --force
|
${LIBTOOLIZE:-libtoolize} --copy --automake --force
|
||||||
aclocal
|
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS
|
||||||
autoheader
|
${AUTOHEADER:-autoheader}
|
||||||
autoconf
|
${AUTOCONF:-autoconf}
|
||||||
automake --add-missing
|
${AUTOMAKE:-automake} --add-missing
|
||||||
|
|||||||
87
ares/config-win32.h
Normal file
87
ares/config-win32.h
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
#ifndef __ARES_CONFIG_WIN32_H
|
||||||
|
#define __ARES_CONFIG_WIN32_H
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright (C) 2004 - 2005 by Daniel Stenberg et al
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software and its
|
||||||
|
* documentation for any purpose and without fee is hereby granted, provided
|
||||||
|
* that the above copyright notice appear in all copies and that both that
|
||||||
|
* copyright notice and this permission notice appear in supporting
|
||||||
|
* documentation, and that the name of M.I.T. not be used in advertising or
|
||||||
|
* publicity pertaining to distribution of the software without specific,
|
||||||
|
* written prior permission. M.I.T. makes no representations about the
|
||||||
|
* suitability of this software for any purpose. It is provided "as is"
|
||||||
|
* without express or implied warranty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ================================================================ */
|
||||||
|
/* ares/config-win32.h - Hand crafted config file for windows */
|
||||||
|
/* ================================================================ */
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* HEADER FILES */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Define if you have the <getopt.h> header file. */
|
||||||
|
#if defined(__MINGW32__)
|
||||||
|
#define HAVE_GETOPT_H 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define if you have the <unistd.h> header file. */
|
||||||
|
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \
|
||||||
|
defined(__POCC__)
|
||||||
|
#define HAVE_UNISTD_H 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define if you have the <windows.h> header file. */
|
||||||
|
#define HAVE_WINDOWS_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <winsock.h> header file. */
|
||||||
|
#define HAVE_WINSOCK_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <winsock2.h> header file. */
|
||||||
|
#define HAVE_WINSOCK2_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <ws2tcpip.h> header file. */
|
||||||
|
#define HAVE_WS2TCPIP_H 1
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* FUNCTIONS */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Define if you have the ioctlsocket function. */
|
||||||
|
#define HAVE_IOCTLSOCKET 1
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* STRUCT RELATED */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Define this if you have struct addrinfo */
|
||||||
|
#define HAVE_STRUCT_ADDRINFO 1
|
||||||
|
|
||||||
|
/* Define this if you have struct sockaddr_storage */
|
||||||
|
#define HAVE_STRUCT_SOCKADDR_STORAGE 1
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* IPV6 COMPATIBILITY */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Define this if you have address family AF_INET6 */
|
||||||
|
#define HAVE_AF_INET6 1
|
||||||
|
|
||||||
|
/* Define this if you have protocol family PF_INET6 */
|
||||||
|
#define HAVE_PF_INET6 1
|
||||||
|
|
||||||
|
/* Define this if you have struct in6_addr */
|
||||||
|
#define HAVE_STRUCT_IN6_ADDR 1
|
||||||
|
|
||||||
|
/* Define this if you have struct sockaddr_in6 */
|
||||||
|
#define HAVE_STRUCT_SOCKADDR_IN6 1
|
||||||
|
|
||||||
|
/* Define this if you have sockaddr_in6 with scopeid */
|
||||||
|
#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __ARES_CONFIG_WIN32_H */
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
|
|
||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
AC_PREREQ(2.57)
|
||||||
AC_INIT(ares_init.c)
|
AC_INIT(ares_init.c)
|
||||||
|
AC_CONFIG_SRCDIR([ares_ipv6.h])
|
||||||
AM_CONFIG_HEADER(config.h)
|
AM_CONFIG_HEADER(config.h)
|
||||||
AM_MAINTAINER_MODE
|
AM_MAINTAINER_MODE
|
||||||
AM_INIT_AUTOMAKE(c-ares, CVS)
|
AM_INIT_AUTOMAKE(c-ares, CVS)
|
||||||
@@ -13,13 +16,12 @@ solaris*)
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# check for ssize_t
|
|
||||||
AC_CHECK_TYPE(ssize_t, ,
|
|
||||||
AC_DEFINE(ssize_t, int, [the signed version of size_t]))
|
|
||||||
|
|
||||||
AC_SEARCH_LIBS(gethostbyname, nsl)
|
AC_SEARCH_LIBS(gethostbyname, nsl)
|
||||||
AC_SEARCH_LIBS(socket, socket)
|
AC_SEARCH_LIBS(socket, socket)
|
||||||
|
|
||||||
|
dnl check for cygwin stuff
|
||||||
|
AC_LIBTOOL_WIN32_DLL
|
||||||
|
|
||||||
dnl ************************************************************
|
dnl ************************************************************
|
||||||
dnl Option to switch on debug options. This makes an assumption that
|
dnl Option to switch on debug options. This makes an assumption that
|
||||||
dnl this is built as an 'ares' subdir in the curl source tree. Subject for
|
dnl this is built as an 'ares' subdir in the curl source tree. Subject for
|
||||||
@@ -38,8 +40,9 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
|||||||
dnl when doing the debug stuff, use static library only
|
dnl when doing the debug stuff, use static library only
|
||||||
AC_DISABLE_SHARED
|
AC_DISABLE_SHARED
|
||||||
|
|
||||||
dnl Checks for standard header files, to make memdebug.h inclusions bettter
|
dnl the entire --enable-debug is a hack that lives and runs on top of
|
||||||
AC_HEADER_STDC
|
dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier
|
||||||
|
AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl])
|
||||||
|
|
||||||
CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include"
|
CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include"
|
||||||
CFLAGS="$CFLAGS -g"
|
CFLAGS="$CFLAGS -g"
|
||||||
@@ -53,14 +56,453 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
|||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
dnl libtool setup
|
||||||
AC_PROG_LIBTOOL
|
AC_PROG_LIBTOOL
|
||||||
|
|
||||||
|
dnl Checks for header files.
|
||||||
|
AC_HEADER_STDC
|
||||||
|
|
||||||
|
dnl **********************************************************************
|
||||||
|
dnl Make sure that our checks for headers windows.h winsock.h winsock2.h
|
||||||
|
dnl and ws2tcpip.h take precedence over any other further checks which
|
||||||
|
dnl could be done later using AC_CHECK_HEADER or AC_CHECK_HEADERS for
|
||||||
|
dnl this specific header files. And do them before its results are used.
|
||||||
|
dnl **********************************************************************
|
||||||
|
|
||||||
|
CURL_CHECK_HEADER_WINDOWS
|
||||||
|
CURL_CHECK_HEADER_WINSOCK
|
||||||
|
CURL_CHECK_HEADER_WINSOCK2
|
||||||
|
CURL_CHECK_HEADER_WS2TCPIP
|
||||||
|
|
||||||
dnl check for a few basic system headers we need
|
dnl check for a few basic system headers we need
|
||||||
AC_CHECK_HEADERS(
|
AC_CHECK_HEADERS(
|
||||||
sys/types.h \
|
sys/types.h \
|
||||||
sys/time.h \
|
sys/time.h \
|
||||||
sys/select.h \
|
sys/select.h \
|
||||||
sys/socket.h \
|
sys/socket.h \
|
||||||
)
|
sys/ioctl.h \
|
||||||
|
netdb.h \
|
||||||
|
netinet/in.h \
|
||||||
|
net/if.h \
|
||||||
|
arpa/nameser.h \
|
||||||
|
arpa/nameser_compat.h \
|
||||||
|
arpa/inet.h,
|
||||||
|
dnl to do if not found
|
||||||
|
[],
|
||||||
|
dnl to do if found
|
||||||
|
[],
|
||||||
|
dnl default includes
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
dnl We do this default-include simply to make sure that the nameser_compat.h
|
||||||
|
dnl header *REALLY* can be include after the new nameser.h. It seems AIX 5.1
|
||||||
|
dnl (and others?) is not designed to allow this.
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_H
|
||||||
|
#include <arpa/nameser.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
dnl *Sigh* these are needed in order for net/if.h to get properly detected.
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
AC_C_CONST
|
||||||
|
AC_TYPE_SIZE_T
|
||||||
|
AC_HEADER_TIME
|
||||||
|
|
||||||
|
AC_CHECK_SIZEOF(curl_off_t, ,[
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "$srcdir/include/curl/curl.h"
|
||||||
|
])
|
||||||
|
AC_CHECK_SIZEOF(size_t)
|
||||||
|
AC_CHECK_SIZEOF(long)
|
||||||
|
AC_CHECK_SIZEOF(time_t)
|
||||||
|
|
||||||
|
AC_CHECK_TYPE(long long,
|
||||||
|
[AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports long long])]
|
||||||
|
longlong="yes"
|
||||||
|
)
|
||||||
|
|
||||||
|
if test "xyes" = "x$longlong"; then
|
||||||
|
AC_MSG_CHECKING([if numberLL works])
|
||||||
|
AC_COMPILE_IFELSE([long long val = 1000LL;],
|
||||||
|
[AC_DEFINE(HAVE_LL, 1, [if your compiler supports LL])]
|
||||||
|
AC_MSG_RESULT(yes),
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# check for ssize_t
|
||||||
|
AC_CHECK_TYPE(ssize_t, ,
|
||||||
|
AC_DEFINE(ssize_t, int, [the signed version of size_t]))
|
||||||
|
|
||||||
|
# Check for socklen_t or equivalent
|
||||||
|
CURL_CHECK_TYPE_SOCKLEN_T
|
||||||
|
|
||||||
|
TYPE_IN_ADDR_T
|
||||||
|
|
||||||
|
TYPE_SOCKADDR_STORAGE
|
||||||
|
|
||||||
|
|
||||||
|
dnl check for AF_INET6
|
||||||
|
CARES_CHECK_CONSTANT(
|
||||||
|
[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
], [PF_INET6],
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.])
|
||||||
|
)
|
||||||
|
|
||||||
|
dnl check for PF_INET6
|
||||||
|
CARES_CHECK_CONSTANT(
|
||||||
|
[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
], [AF_INET6],
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.])
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
dnl check for the in6_addr structure
|
||||||
|
CARES_CHECK_STRUCT(
|
||||||
|
[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
], [in6_addr],
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.])
|
||||||
|
)
|
||||||
|
|
||||||
|
dnl check for the sockaddr_in6 structure
|
||||||
|
CARES_CHECK_STRUCT(
|
||||||
|
[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
], [sockaddr_in6],
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1,
|
||||||
|
[Define to 1 if you have struct sockaddr_in6.]) ac_have_sockaddr_in6=yes
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_CHECK_MEMBER(struct sockaddr_in6.sin6_scope_id,
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID,1,
|
||||||
|
[Define to 1 if your struct sockaddr_in6 has sin6_scope_id.])
|
||||||
|
, ,
|
||||||
|
[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl check for the addrinfo structure
|
||||||
|
AC_CHECK_MEMBER(struct addrinfo.ai_flags,
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1,
|
||||||
|
[Define to 1 if you have struct addrinfo.]),,
|
||||||
|
[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETDB_H
|
||||||
|
#include <netdb.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
AC_CHECK_FUNCS( bitncmp \
|
||||||
|
if_indextoname,
|
||||||
|
dnl if found
|
||||||
|
[],
|
||||||
|
dnl if not found, $ac_func is the name we check for
|
||||||
|
func="$ac_func"
|
||||||
|
AC_MSG_CHECKING([deeper for $func])
|
||||||
|
AC_TRY_LINK( [],
|
||||||
|
[ $func ();],
|
||||||
|
AC_MSG_RESULT(yes!)
|
||||||
|
eval "ac_cv_func_$func=yes"
|
||||||
|
def=`echo "HAVE_$func" | tr 'a-z' 'A-Z'`
|
||||||
|
AC_DEFINE_UNQUOTED($def, 1, [If you have $func]),
|
||||||
|
AC_MSG_RESULT(but still no)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
dnl check for inet_pton
|
||||||
|
AC_CHECK_FUNCS(inet_pton)
|
||||||
|
dnl Some systems have it, but not IPv6
|
||||||
|
if test "$ac_cv_func_inet_pton" = "yes" ; then
|
||||||
|
AC_MSG_CHECKING(if inet_pton supports IPv6)
|
||||||
|
AC_TRY_RUN(
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
struct in6_addr addr6;
|
||||||
|
if (inet_pton(AF_INET6, "::1", &addr6) < 1)
|
||||||
|
exit(1);
|
||||||
|
else
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_INET_PTON_IPV6,1,[Define to 1 if inet_pton supports IPv6.])
|
||||||
|
], AC_MSG_RESULT(no),AC_MSG_RESULT(no))
|
||||||
|
fi
|
||||||
|
dnl Check for inet_net_pton
|
||||||
|
AC_CHECK_FUNCS(inet_net_pton)
|
||||||
|
dnl Again, some systems have it, but not IPv6
|
||||||
|
if test "$ac_cv_func_inet_net_pton" = "yes" ; then
|
||||||
|
AC_MSG_CHECKING(if inet_net_pton supports IPv6)
|
||||||
|
AC_TRY_RUN(
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
struct in6_addr addr6;
|
||||||
|
if (inet_net_pton(AF_INET6, "::1", &addr6, sizeof(addr6)) < 1)
|
||||||
|
exit(1);
|
||||||
|
else
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_INET_NET_PTON_IPV6,1,[Define to 1 if inet_net_pton supports IPv6.])
|
||||||
|
], AC_MSG_RESULT(no),AC_MSG_RESULT(no))
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
dnl Check for inet_ntop
|
||||||
|
AC_CHECK_FUNCS(inet_ntop)
|
||||||
|
dnl Again, some systems have it, but not IPv6
|
||||||
|
if test "$ac_cv_func_inet_ntop" = "yes" ; then
|
||||||
|
AC_MSG_CHECKING(if inet_ntop supports IPv6)
|
||||||
|
AC_TRY_RUN(
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#include <errno.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
struct in6_addr addr6;
|
||||||
|
char buf[128];
|
||||||
|
if (inet_ntop(AF_INET6, &addr6, buf, 128) == 0 && errno == EAFNOSUPPORT)
|
||||||
|
exit(1);
|
||||||
|
else
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_INET_NTOP_IPV6,1,[Define to 1 if inet_ntop supports IPv6.])
|
||||||
|
], AC_MSG_RESULT(no),AC_MSG_RESULT(no))
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_CHECK_SIZEOF(struct in6_addr, ,
|
||||||
|
[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_CHECK_SIZEOF(struct in_addr, ,
|
||||||
|
[
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#ifdef HAVE_WS2TCPIP_H
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
dnl Check if the getnameinfo function is available
|
||||||
|
dnl and get the types of five of its arguments.
|
||||||
|
CURL_CHECK_FUNC_GETNAMEINFO
|
||||||
|
|
||||||
|
|
||||||
|
dnl God bless non-standardized functions! We need to see which getservbyport_r variant is available
|
||||||
|
CARES_CHECK_GETSERVBYPORT_R
|
||||||
|
|
||||||
|
CURL_CHECK_NONBLOCKING_SOCKET
|
||||||
|
|
||||||
|
AC_C_BIGENDIAN(
|
||||||
|
[AC_DEFINE(ARES_BIG_ENDIAN, 1, [define this if ares is built for a big endian system])],
|
||||||
|
,
|
||||||
|
[AC_MSG_WARN([couldn't figure out endianess, assuming little endian!])]
|
||||||
|
)
|
||||||
|
|
||||||
AC_OUTPUT(Makefile)
|
AC_OUTPUT(Makefile)
|
||||||
|
|||||||
439
ares/inet_net_pton.c
Normal file
439
ares/inet_net_pton.c
Normal file
@@ -0,0 +1,439 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||||
|
* Copyright (c) 1996,1999 by Internet Software Consortium.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
|
#include "nameser.h"
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_H
|
||||||
|
#include <arpa/nameser.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_INET_H
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "ares_ipv6.h"
|
||||||
|
#include "inet_net_pton.h"
|
||||||
|
|
||||||
|
#if !defined(HAVE_INET_NET_PTON) || !defined(HAVE_INET_NET_PTON_IPV6) || \
|
||||||
|
!defined(HAVE_INET_PTON) || !defined(HAVE_INET_PTON_IPV6)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* static int
|
||||||
|
* inet_net_pton_ipv4(src, dst, size)
|
||||||
|
* convert IPv4 network number from presentation to network format.
|
||||||
|
* accepts hex octets, hex strings, decimal octets, and /CIDR.
|
||||||
|
* "size" is in bytes and describes "dst".
|
||||||
|
* return:
|
||||||
|
* number of bits, either imputed classfully or specified with /CIDR,
|
||||||
|
* or -1 if some failure occurred (check errno). ENOENT means it was
|
||||||
|
* not an IPv4 network specification.
|
||||||
|
* note:
|
||||||
|
* network byte order assumed. this means 192.5.5.240/28 has
|
||||||
|
* 0b11110000 in its fourth octet.
|
||||||
|
* author:
|
||||||
|
* Paul Vixie (ISC), June 1996
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
||||||
|
{
|
||||||
|
static const char xdigits[] = "0123456789abcdef";
|
||||||
|
static const char digits[] = "0123456789";
|
||||||
|
int n, ch, tmp = 0, dirty, bits;
|
||||||
|
const unsigned char *odst = dst;
|
||||||
|
|
||||||
|
ch = *src++;
|
||||||
|
if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
|
||||||
|
&& isascii((unsigned char)(src[1]))
|
||||||
|
&& isxdigit((unsigned char)(src[1]))) {
|
||||||
|
/* Hexadecimal: Eat nybble string. */
|
||||||
|
if (size <= 0U)
|
||||||
|
goto emsgsize;
|
||||||
|
dirty = 0;
|
||||||
|
src++; /* skip x or X. */
|
||||||
|
while ((ch = *src++) != '\0' && isascii(ch) && isxdigit(ch)) {
|
||||||
|
if (isupper(ch))
|
||||||
|
ch = tolower(ch);
|
||||||
|
n = (int)(strchr(xdigits, ch) - xdigits);
|
||||||
|
if (dirty == 0)
|
||||||
|
tmp = n;
|
||||||
|
else
|
||||||
|
tmp = (tmp << 4) | n;
|
||||||
|
if (++dirty == 2) {
|
||||||
|
if (size-- <= 0U)
|
||||||
|
goto emsgsize;
|
||||||
|
*dst++ = (unsigned char) tmp;
|
||||||
|
dirty = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dirty) { /* Odd trailing nybble? */
|
||||||
|
if (size-- <= 0U)
|
||||||
|
goto emsgsize;
|
||||||
|
*dst++ = (unsigned char) (tmp << 4);
|
||||||
|
}
|
||||||
|
} else if (isascii(ch) && isdigit(ch)) {
|
||||||
|
/* Decimal: eat dotted digit string. */
|
||||||
|
for (;;) {
|
||||||
|
tmp = 0;
|
||||||
|
do {
|
||||||
|
n = (int)(strchr(digits, ch) - digits);
|
||||||
|
tmp *= 10;
|
||||||
|
tmp += n;
|
||||||
|
if (tmp > 255)
|
||||||
|
goto enoent;
|
||||||
|
} while ((ch = *src++) != '\0' &&
|
||||||
|
isascii(ch) && isdigit(ch));
|
||||||
|
if (size-- <= 0U)
|
||||||
|
goto emsgsize;
|
||||||
|
*dst++ = (unsigned char) tmp;
|
||||||
|
if (ch == '\0' || ch == '/')
|
||||||
|
break;
|
||||||
|
if (ch != '.')
|
||||||
|
goto enoent;
|
||||||
|
ch = *src++;
|
||||||
|
if (!isascii(ch) || !isdigit(ch))
|
||||||
|
goto enoent;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
goto enoent;
|
||||||
|
|
||||||
|
bits = -1;
|
||||||
|
if (ch == '/' && isascii((unsigned char)(src[0])) &&
|
||||||
|
isdigit((unsigned char)(src[0])) && dst > odst) {
|
||||||
|
/* CIDR width specifier. Nothing can follow it. */
|
||||||
|
ch = *src++; /* Skip over the /. */
|
||||||
|
bits = 0;
|
||||||
|
do {
|
||||||
|
n = (int)(strchr(digits, ch) - digits);
|
||||||
|
bits *= 10;
|
||||||
|
bits += n;
|
||||||
|
} while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch));
|
||||||
|
if (ch != '\0')
|
||||||
|
goto enoent;
|
||||||
|
if (bits > 32)
|
||||||
|
goto emsgsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Firey death and destruction unless we prefetched EOS. */
|
||||||
|
if (ch != '\0')
|
||||||
|
goto enoent;
|
||||||
|
|
||||||
|
/* If nothing was written to the destination, we found no address. */
|
||||||
|
if (dst == odst)
|
||||||
|
goto enoent;
|
||||||
|
/* If no CIDR spec was given, infer width from net class. */
|
||||||
|
if (bits == -1) {
|
||||||
|
if (*odst >= 240) /* Class E */
|
||||||
|
bits = 32;
|
||||||
|
else if (*odst >= 224) /* Class D */
|
||||||
|
bits = 8;
|
||||||
|
else if (*odst >= 192) /* Class C */
|
||||||
|
bits = 24;
|
||||||
|
else if (*odst >= 128) /* Class B */
|
||||||
|
bits = 16;
|
||||||
|
else /* Class A */
|
||||||
|
bits = 8;
|
||||||
|
/* If imputed mask is narrower than specified octets, widen. */
|
||||||
|
if (bits < ((dst - odst) * 8))
|
||||||
|
bits = (int)(dst - odst) * 8;
|
||||||
|
/*
|
||||||
|
* If there are no additional bits specified for a class D
|
||||||
|
* address adjust bits to 4.
|
||||||
|
*/
|
||||||
|
if (bits == 8 && *odst == 224)
|
||||||
|
bits = 4;
|
||||||
|
}
|
||||||
|
/* Extend network to cover the actual mask. */
|
||||||
|
while (bits > ((dst - odst) * 8)) {
|
||||||
|
if (size-- <= 0U)
|
||||||
|
goto emsgsize;
|
||||||
|
*dst++ = '\0';
|
||||||
|
}
|
||||||
|
return (bits);
|
||||||
|
|
||||||
|
enoent:
|
||||||
|
errno = ENOENT;
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
emsgsize:
|
||||||
|
errno = EMSGSIZE;
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
getbits(const char *src, int *bitsp)
|
||||||
|
{
|
||||||
|
static const char digits[] = "0123456789";
|
||||||
|
int n;
|
||||||
|
int val;
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
val = 0;
|
||||||
|
n = 0;
|
||||||
|
while ((ch = *src++) != '\0') {
|
||||||
|
const char *pch;
|
||||||
|
|
||||||
|
pch = strchr(digits, ch);
|
||||||
|
if (pch != NULL) {
|
||||||
|
if (n++ != 0 && val == 0) /* no leading zeros */
|
||||||
|
return (0);
|
||||||
|
val *= 10;
|
||||||
|
val += (pch - digits);
|
||||||
|
if (val > 128) /* range */
|
||||||
|
return (0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (n == 0)
|
||||||
|
return (0);
|
||||||
|
*bitsp = val;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
getv4(const char *src, unsigned char *dst, int *bitsp)
|
||||||
|
{
|
||||||
|
static const char digits[] = "0123456789";
|
||||||
|
unsigned char *odst = dst;
|
||||||
|
int n;
|
||||||
|
unsigned int val;
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
val = 0;
|
||||||
|
n = 0;
|
||||||
|
while ((ch = *src++) != '\0') {
|
||||||
|
const char *pch;
|
||||||
|
|
||||||
|
pch = strchr(digits, ch);
|
||||||
|
if (pch != NULL) {
|
||||||
|
if (n++ != 0 && val == 0) /* no leading zeros */
|
||||||
|
return (0);
|
||||||
|
val *= 10;
|
||||||
|
val += (pch - digits);
|
||||||
|
if (val > 255) /* range */
|
||||||
|
return (0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (ch == '.' || ch == '/') {
|
||||||
|
if (dst - odst > 3) /* too many octets? */
|
||||||
|
return (0);
|
||||||
|
*dst++ = val;
|
||||||
|
if (ch == '/')
|
||||||
|
return (getbits(src, bitsp));
|
||||||
|
val = 0;
|
||||||
|
n = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (n == 0)
|
||||||
|
return (0);
|
||||||
|
if (dst - odst > 3) /* too many octets? */
|
||||||
|
return (0);
|
||||||
|
*dst++ = val;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
||||||
|
{
|
||||||
|
static const char xdigits_l[] = "0123456789abcdef",
|
||||||
|
xdigits_u[] = "0123456789ABCDEF";
|
||||||
|
unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
|
||||||
|
const char *xdigits, *curtok;
|
||||||
|
int ch, saw_xdigit;
|
||||||
|
unsigned int val;
|
||||||
|
int digits;
|
||||||
|
int bits;
|
||||||
|
size_t bytes;
|
||||||
|
int words;
|
||||||
|
int ipv4;
|
||||||
|
|
||||||
|
memset((tp = tmp), '\0', NS_IN6ADDRSZ);
|
||||||
|
endp = tp + NS_IN6ADDRSZ;
|
||||||
|
colonp = NULL;
|
||||||
|
/* Leading :: requires some special handling. */
|
||||||
|
if (*src == ':')
|
||||||
|
if (*++src != ':')
|
||||||
|
goto enoent;
|
||||||
|
curtok = src;
|
||||||
|
saw_xdigit = 0;
|
||||||
|
val = 0;
|
||||||
|
digits = 0;
|
||||||
|
bits = -1;
|
||||||
|
ipv4 = 0;
|
||||||
|
while ((ch = *src++) != '\0') {
|
||||||
|
const char *pch;
|
||||||
|
|
||||||
|
if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
|
||||||
|
pch = strchr((xdigits = xdigits_u), ch);
|
||||||
|
if (pch != NULL) {
|
||||||
|
val <<= 4;
|
||||||
|
val |= (pch - xdigits);
|
||||||
|
if (++digits > 4)
|
||||||
|
goto enoent;
|
||||||
|
saw_xdigit = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (ch == ':') {
|
||||||
|
curtok = src;
|
||||||
|
if (!saw_xdigit) {
|
||||||
|
if (colonp)
|
||||||
|
goto enoent;
|
||||||
|
colonp = tp;
|
||||||
|
continue;
|
||||||
|
} else if (*src == '\0')
|
||||||
|
goto enoent;
|
||||||
|
if (tp + NS_INT16SZ > endp)
|
||||||
|
return (0);
|
||||||
|
*tp++ = (unsigned char) (val >> 8) & 0xff;
|
||||||
|
*tp++ = (unsigned char) val & 0xff;
|
||||||
|
saw_xdigit = 0;
|
||||||
|
digits = 0;
|
||||||
|
val = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
|
||||||
|
getv4(curtok, tp, &bits) > 0) {
|
||||||
|
tp += NS_INADDRSZ;
|
||||||
|
saw_xdigit = 0;
|
||||||
|
ipv4 = 1;
|
||||||
|
break; /* '\0' was seen by inet_pton4(). */
|
||||||
|
}
|
||||||
|
if (ch == '/' && getbits(src, &bits) > 0)
|
||||||
|
break;
|
||||||
|
goto enoent;
|
||||||
|
}
|
||||||
|
if (saw_xdigit) {
|
||||||
|
if (tp + NS_INT16SZ > endp)
|
||||||
|
goto enoent;
|
||||||
|
*tp++ = (unsigned char) (val >> 8) & 0xff;
|
||||||
|
*tp++ = (unsigned char) val & 0xff;
|
||||||
|
}
|
||||||
|
if (bits == -1)
|
||||||
|
bits = 128;
|
||||||
|
|
||||||
|
words = (bits + 15) / 16;
|
||||||
|
if (words < 2)
|
||||||
|
words = 2;
|
||||||
|
if (ipv4)
|
||||||
|
words = 8;
|
||||||
|
endp = tmp + 2 * words;
|
||||||
|
|
||||||
|
if (colonp != NULL) {
|
||||||
|
/*
|
||||||
|
* Since some memmove()'s erroneously fail to handle
|
||||||
|
* overlapping regions, we'll do the shift by hand.
|
||||||
|
*/
|
||||||
|
const int n = (int)(tp - colonp);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (tp == endp)
|
||||||
|
goto enoent;
|
||||||
|
for (i = 1; i <= n; i++) {
|
||||||
|
endp[- i] = colonp[n - i];
|
||||||
|
colonp[n - i] = 0;
|
||||||
|
}
|
||||||
|
tp = endp;
|
||||||
|
}
|
||||||
|
if (tp != endp)
|
||||||
|
goto enoent;
|
||||||
|
|
||||||
|
bytes = (bits + 7) / 8;
|
||||||
|
if (bytes > size)
|
||||||
|
goto emsgsize;
|
||||||
|
memcpy(dst, tmp, bytes);
|
||||||
|
return (bits);
|
||||||
|
|
||||||
|
enoent:
|
||||||
|
errno = ENOENT;
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
emsgsize:
|
||||||
|
errno = EMSGSIZE;
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* int
|
||||||
|
* inet_net_pton(af, src, dst, size)
|
||||||
|
* convert network number from presentation to network format.
|
||||||
|
* accepts hex octets, hex strings, decimal octets, and /CIDR.
|
||||||
|
* "size" is in bytes and describes "dst".
|
||||||
|
* return:
|
||||||
|
* number of bits, either imputed classfully or specified with /CIDR,
|
||||||
|
* or -1 if some failure occurred (check errno). ENOENT means it was
|
||||||
|
* not a valid network specification.
|
||||||
|
* author:
|
||||||
|
* Paul Vixie (ISC), June 1996
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ares_inet_net_pton(int af, const char *src, void *dst, size_t size)
|
||||||
|
{
|
||||||
|
switch (af) {
|
||||||
|
case AF_INET:
|
||||||
|
return (inet_net_pton_ipv4(src, dst, size));
|
||||||
|
case AF_INET6:
|
||||||
|
return (inet_net_pton_ipv6(src, dst, size));
|
||||||
|
default:
|
||||||
|
errno = EAFNOSUPPORT;
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(HAVE_INET_PTON) || !defined(HAVE_INET_PTON_IPV6)
|
||||||
|
int ares_inet_pton(int af, const char *src, void *dst)
|
||||||
|
{
|
||||||
|
int size, result;
|
||||||
|
|
||||||
|
if (af == AF_INET)
|
||||||
|
size = sizeof(struct in_addr);
|
||||||
|
else if (af == AF_INET6)
|
||||||
|
size = sizeof(struct in6_addr);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errno = EAFNOSUPPORT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
result = ares_inet_net_pton(af, src, dst, size);
|
||||||
|
if (result == -1 && errno == ENOENT)
|
||||||
|
return 0;
|
||||||
|
return (result > -1 ? 1 : -1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
31
ares/inet_net_pton.h
Normal file
31
ares/inet_net_pton.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Permission to use, copy, modify, and distribute this
|
||||||
|
* software and its documentation for any purpose and without
|
||||||
|
* fee is hereby granted, provided that the above copyright
|
||||||
|
* notice appear in all copies and that both that copyright
|
||||||
|
* notice and this permission notice appear in supporting
|
||||||
|
* documentation, and that the name of M.I.T. not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* M.I.T. makes no representations about the suitability of
|
||||||
|
* this software for any purpose. It is provided "as is"
|
||||||
|
* without express or implied warranty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INET_NET_PTON_H
|
||||||
|
#define INET_NET_PTON_H
|
||||||
|
|
||||||
|
#if defined(HAVE_INET_PTON) && defined(HAVE_INET_PTON_IPV6)
|
||||||
|
#define ares_inet_pton(x,y,z) inet_pton(x,y,z)
|
||||||
|
#else
|
||||||
|
int ares_inet_pton(int af, const char *src, void *dst);
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_INET_NET_PTON) && defined(HAVE_INET_NET_PTON_IPV6)
|
||||||
|
#define ares_inet_net_pton(w,x,y,z) inet_net_pton(w,x,y,z)
|
||||||
|
#else
|
||||||
|
int ares_inet_net_pton(int af, const char *src, void *dst, size_t size);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* INET_NET_PTON_H */
|
||||||
220
ares/inet_ntop.c
Normal file
220
ares/inet_ntop.c
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright (c) 1996 by Internet Software Consortium.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||||
|
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||||
|
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||||
|
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||||
|
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
|
#include "nameser.h"
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_H
|
||||||
|
#include <arpa/nameser.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_ARPA_INET_H
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "ares_ipv6.h"
|
||||||
|
#include "inet_ntop.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(HAVE_INET_NTOP) || !defined(HAVE_INET_NTOP_IPV6)
|
||||||
|
|
||||||
|
#ifdef SPRINTF_CHAR
|
||||||
|
# define SPRINTF(x) strlen(sprintf/**/x)
|
||||||
|
#else
|
||||||
|
# define SPRINTF(x) ((size_t)sprintf x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* WARNING: Don't even consider trying to compile this on a system where
|
||||||
|
* sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const char *inet_ntop4(const unsigned char *src, char *dst, size_t size);
|
||||||
|
static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size);
|
||||||
|
|
||||||
|
/* char *
|
||||||
|
* inet_ntop(af, src, dst, size)
|
||||||
|
* convert a network format address to presentation format.
|
||||||
|
* return:
|
||||||
|
* pointer to presentation format address (`dst'), or NULL (see errno).
|
||||||
|
* author:
|
||||||
|
* Paul Vixie, 1996.
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
ares_inet_ntop(int af, const void *src, char *dst, size_t size)
|
||||||
|
{
|
||||||
|
switch (af)
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
return (inet_ntop4(src, dst, size));
|
||||||
|
case AF_INET6:
|
||||||
|
return (inet_ntop6(src, dst, size));
|
||||||
|
default:
|
||||||
|
errno = EAFNOSUPPORT;
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* const char *
|
||||||
|
* inet_ntop4(src, dst, size)
|
||||||
|
* format an IPv4 address, more or less like inet_ntoa()
|
||||||
|
* return:
|
||||||
|
* `dst' (as a const)
|
||||||
|
* notes:
|
||||||
|
* (1) uses no statics
|
||||||
|
* (2) takes a unsigned char* not an in_addr as input
|
||||||
|
* author:
|
||||||
|
* Paul Vixie, 1996.
|
||||||
|
*/
|
||||||
|
static const char *
|
||||||
|
inet_ntop4(const unsigned char *src, char *dst, size_t size)
|
||||||
|
{
|
||||||
|
static const char fmt[] = "%u.%u.%u.%u";
|
||||||
|
char tmp[sizeof "255.255.255.255"];
|
||||||
|
|
||||||
|
if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size)
|
||||||
|
{
|
||||||
|
errno = ENOSPC;
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
strcpy(dst, tmp);
|
||||||
|
return (dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* const char *
|
||||||
|
* inet_ntop6(src, dst, size)
|
||||||
|
* convert IPv6 binary address into presentation (printable) format
|
||||||
|
* author:
|
||||||
|
* Paul Vixie, 1996.
|
||||||
|
*/
|
||||||
|
static const char *
|
||||||
|
inet_ntop6(const unsigned char *src, char *dst, size_t size)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Note that int32_t and int16_t need only be "at least" large enough
|
||||||
|
* to contain a value of the specified size. On some systems, like
|
||||||
|
* Crays, there is no such thing as an integer variable with 16 bits.
|
||||||
|
* Keep this in mind if you think this function should have been coded
|
||||||
|
* to use pointer overlays. All the world's not a VAX.
|
||||||
|
*/
|
||||||
|
char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;
|
||||||
|
struct { int base, len; } best = { 0,0 }, cur = { 0,0 };
|
||||||
|
unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Preprocess:
|
||||||
|
* Copy the input (bytewise) array into a wordwise array.
|
||||||
|
* Find the longest run of 0x00's in src[] for :: shorthanding.
|
||||||
|
*/
|
||||||
|
memset(words, '\0', sizeof words);
|
||||||
|
for (i = 0; i < NS_IN6ADDRSZ; i++)
|
||||||
|
words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
|
||||||
|
best.base = -1;
|
||||||
|
cur.base = -1;
|
||||||
|
for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
|
||||||
|
{
|
||||||
|
if (words[i] == 0)
|
||||||
|
{
|
||||||
|
if (cur.base == -1)
|
||||||
|
cur.base = i, cur.len = 1;
|
||||||
|
else
|
||||||
|
cur.len++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (cur.base != -1)
|
||||||
|
{
|
||||||
|
if (best.base == -1 || cur.len > best.len)
|
||||||
|
best = cur;
|
||||||
|
cur.base = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cur.base != -1)
|
||||||
|
{
|
||||||
|
if (best.base == -1 || cur.len > best.len)
|
||||||
|
best = cur;
|
||||||
|
}
|
||||||
|
if (best.base != -1 && best.len < 2)
|
||||||
|
best.base = -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Format the result.
|
||||||
|
*/
|
||||||
|
tp = tmp;
|
||||||
|
for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
|
||||||
|
{
|
||||||
|
/* Are we inside the best run of 0x00's? */
|
||||||
|
if (best.base != -1 && i >= best.base &&
|
||||||
|
i < (best.base + best.len))
|
||||||
|
{
|
||||||
|
if (i == best.base)
|
||||||
|
*tp++ = ':';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* Are we following an initial run of 0x00s or any real hex? */
|
||||||
|
if (i != 0)
|
||||||
|
*tp++ = ':';
|
||||||
|
/* Is this address an encapsulated IPv4? */
|
||||||
|
if (i == 6 && best.base == 0 &&
|
||||||
|
(best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
|
||||||
|
{
|
||||||
|
if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp)))
|
||||||
|
return (NULL);
|
||||||
|
tp += strlen(tp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
tp += SPRINTF((tp, "%x", words[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Was it a trailing run of 0x00's? */
|
||||||
|
if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ))
|
||||||
|
*tp++ = ':';
|
||||||
|
*tp++ = '\0';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for overflow, copy, and we're done.
|
||||||
|
*/
|
||||||
|
if ((size_t)(tp - tmp) > size)
|
||||||
|
{
|
||||||
|
errno = ENOSPC;
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
strcpy(dst, tmp);
|
||||||
|
return (dst);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
26
ares/inet_ntop.h
Normal file
26
ares/inet_ntop.h
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Permission to use, copy, modify, and distribute this
|
||||||
|
* software and its documentation for any purpose and without
|
||||||
|
* fee is hereby granted, provided that the above copyright
|
||||||
|
* notice appear in all copies and that both that copyright
|
||||||
|
* notice and this permission notice appear in supporting
|
||||||
|
* documentation, and that the name of M.I.T. not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* M.I.T. makes no representations about the suitability of
|
||||||
|
* this software for any purpose. It is provided "as is"
|
||||||
|
* without express or implied warranty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INET_NTOP_H
|
||||||
|
#define INET_NTOP_H
|
||||||
|
|
||||||
|
#ifdef HAVE_INET_NTOP
|
||||||
|
#define ares_inet_ntop(w,x,y,z) inet_ntop(w,x,y,z)
|
||||||
|
#else
|
||||||
|
const char *ares_inet_ntop(int af, const void *src, char *dst, size_t size);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* INET_NET_NTOP_H */
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
#ifndef ARES_NAMESER_H
|
#ifndef ARES_NAMESER_H
|
||||||
#define ARES_NAMESER_H
|
#define ARES_NAMESER_H
|
||||||
|
|
||||||
@@ -16,6 +18,8 @@
|
|||||||
|
|
||||||
#define EINPROGRESS WSAEINPROGRESS
|
#define EINPROGRESS WSAEINPROGRESS
|
||||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||||
|
#define EMSGSIZE WSAEMSGSIZE
|
||||||
|
#define EAFNOSUPPORT WSAEAFNOSUPPORT
|
||||||
|
|
||||||
/* Structure for scatter/gather I/O. */
|
/* Structure for scatter/gather I/O. */
|
||||||
struct iovec
|
struct iovec
|
||||||
@@ -36,8 +40,10 @@ int ares_gettimeofday(struct timeval *tv, struct timezone *tz);
|
|||||||
|
|
||||||
#endif /* !NETWARE */
|
#endif /* !NETWARE */
|
||||||
|
|
||||||
#define NS_CMPRSFLGS 0xc0
|
#define NS_CMPRSFLGS 0xc0
|
||||||
|
#define NS_IN6ADDRSZ 16
|
||||||
|
#define NS_INT16SZ 2
|
||||||
|
#define NS_INADDRSZ 4
|
||||||
|
|
||||||
/* Flag bits indicating name compression. */
|
/* Flag bits indicating name compression. */
|
||||||
#define INDIR_MASK NS_CMPRSFLGS
|
#define INDIR_MASK NS_CMPRSFLGS
|
||||||
@@ -134,7 +140,7 @@ typedef enum __ns_opcode {
|
|||||||
|
|
||||||
#define QUERY ns_o_query
|
#define QUERY ns_o_query
|
||||||
|
|
||||||
#define NS_MAXLABEL 63
|
#define NS_MAXLABEL 63
|
||||||
#define MAXLABEL NS_MAXLABEL
|
#define MAXLABEL NS_MAXLABEL
|
||||||
|
|
||||||
#define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
|
#define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
|
||||||
|
|||||||
104
ares/setup.h
104
ares/setup.h
@@ -1,7 +1,7 @@
|
|||||||
#ifndef ARES_SETUP_H
|
#ifndef __ARES_SETUP_H
|
||||||
#define ARES_SETUP_H
|
#define __ARES_SETUP_H
|
||||||
|
|
||||||
/* Copyright (C) 2004 by Daniel Stenberg et al
|
/* Copyright (C) 2004 - 2005 by Daniel Stenberg et al
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software and its
|
* Permission to use, copy, modify, and distribute this software and its
|
||||||
* documentation for any purpose and without fee is hereby granted, provided
|
* documentation for any purpose and without fee is hereby granted, provided
|
||||||
@@ -14,16 +14,79 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if !defined(WIN32) && defined(__WIN32__)
|
||||||
|
/* Borland fix */
|
||||||
|
#define WIN32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(WIN32) && defined(_WIN32)
|
||||||
|
/* VS2005 on x64 fix */
|
||||||
|
#define WIN32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Include configuration script results or hand-crafted
|
||||||
|
* configuration file for platforms which lack config tool.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#else
|
#else
|
||||||
/* simple work-around for now, for systems without configure support */
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#include "config-win32.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Include header files for windows builds before redefining anything.
|
||||||
|
* Use this preproessor block only to include or exclude windows.h,
|
||||||
|
* winsock2.h, ws2tcpip.h or winsock.h. Any other windows thing belongs
|
||||||
|
* to any other further and independant block.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
# ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
# define WIN32_LEAN_AND_MEAN
|
||||||
|
# endif
|
||||||
|
# include <windows.h>
|
||||||
|
# ifdef HAVE_WINSOCK2_H
|
||||||
|
# include <winsock2.h>
|
||||||
|
# ifdef HAVE_WS2TCPIP_H
|
||||||
|
# include <ws2tcpip.h>
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# ifdef HAVE_WINSOCK_H
|
||||||
|
# include <winsock.h>
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Work-arounds for systems without configure support
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HAVE_CONFIG_H
|
||||||
|
|
||||||
|
#if defined(__DJGPP__) || (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || \
|
||||||
|
defined(__POCC__)
|
||||||
|
#else
|
||||||
#define ssize_t int
|
#define ssize_t int
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Recent autoconf versions define these symbols in config.h. We don't want
|
#ifndef HAVE_WS2TCPIP_H
|
||||||
them (since they collide with the libcurl ones when we build
|
#define socklen_t int
|
||||||
--enable-debug) so we undef them again here. */
|
#endif
|
||||||
|
|
||||||
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Recent autoconf versions define these symbols in config.h. We don't
|
||||||
|
* want them (since they collide with the libcurl ones when we build
|
||||||
|
* --enable-debug) so we undef them again here.
|
||||||
|
*/
|
||||||
|
|
||||||
#undef PACKAGE_STRING
|
#undef PACKAGE_STRING
|
||||||
#undef PACKAGE_TARNAME
|
#undef PACKAGE_TARNAME
|
||||||
#undef PACKAGE_VERSION
|
#undef PACKAGE_VERSION
|
||||||
@@ -32,9 +95,11 @@
|
|||||||
#undef VERSION
|
#undef VERSION
|
||||||
#undef PACKAGE
|
#undef PACKAGE
|
||||||
|
|
||||||
/* now typedef our socket type */
|
/*
|
||||||
|
* Typedef our socket type
|
||||||
|
*/
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include <winsock.h>
|
|
||||||
typedef SOCKET ares_socket_t;
|
typedef SOCKET ares_socket_t;
|
||||||
#define ARES_SOCKET_BAD INVALID_SOCKET
|
#define ARES_SOCKET_BAD INVALID_SOCKET
|
||||||
#else
|
#else
|
||||||
@@ -42,14 +107,16 @@ typedef int ares_socket_t;
|
|||||||
#define ARES_SOCKET_BAD -1
|
#define ARES_SOCKET_BAD -1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Assume a few thing unless they're set by configure
|
/*
|
||||||
|
* Assume a few thing unless they're set by configure
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER)
|
#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER)
|
||||||
#define HAVE_SYS_TIME_H
|
#define HAVE_SYS_TIME_H
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER)
|
#if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER)
|
||||||
#define HAVE_UNISTD_H
|
#define HAVE_UNISTD_H 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS)
|
#if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS)
|
||||||
@@ -57,7 +124,7 @@ typedef int ares_socket_t;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(WIN32) || defined(WATT32)) && \
|
#if (defined(WIN32) || defined(WATT32)) && \
|
||||||
!(defined(__MINGW32__) || defined(NETWARE))
|
!(defined(__MINGW32__) || defined(NETWARE) || defined(__DJGPP__))
|
||||||
/* protos for the functions we provide in windows_port.c */
|
/* protos for the functions we provide in windows_port.c */
|
||||||
int ares_strncasecmp(const char *s1, const char *s2, int n);
|
int ares_strncasecmp(const char *s1, const char *s2, int n);
|
||||||
int ares_strcasecmp(const char *s1, const char *s2);
|
int ares_strcasecmp(const char *s1, const char *s2);
|
||||||
@@ -69,4 +136,13 @@ int ares_strcasecmp(const char *s1, const char *s2);
|
|||||||
#define strcasecmp(a,b) ares_strcasecmp(a,b)
|
#define strcasecmp(a,b) ares_strcasecmp(a,b)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* ARES_SETUP_H */
|
/* IPv6 compatibility */
|
||||||
|
#if !defined(HAVE_AF_INET6)
|
||||||
|
#if defined(HAVE_PF_INET6)
|
||||||
|
#define AF_INET6 PF_INET6
|
||||||
|
#else
|
||||||
|
#define AF_INET6 AF_MAX+1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __ARES_SETUP_H */
|
||||||
|
|||||||
@@ -1,213 +0,0 @@
|
|||||||
# Microsoft Developer Studio Generated NMAKE File, Based on adig.dsp
|
|
||||||
!IF "$(CFG)" == ""
|
|
||||||
CFG=adig - Win32 Debug
|
|
||||||
!MESSAGE No configuration specified. Defaulting to adig - Win32 Debug.
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!IF "$(CFG)" != "adig - Win32 Release" && "$(CFG)" != "adig - Win32 Debug"
|
|
||||||
!MESSAGE Invalid configuration "$(CFG)" specified.
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "adig.mak" CFG="adig - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "adig - Win32 Release" (based on "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE "adig - Win32 Debug" (based on "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE
|
|
||||||
!ERROR An invalid configuration is specified.
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!IF "$(OS)" == "Windows_NT"
|
|
||||||
NULL=
|
|
||||||
!ELSE
|
|
||||||
NULL=nul
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "adig - Win32 Release"
|
|
||||||
|
|
||||||
OUTDIR=.\Release
|
|
||||||
INTDIR=.\Release
|
|
||||||
# Begin Custom Macros
|
|
||||||
OutDir=.\Release
|
|
||||||
# End Custom Macros
|
|
||||||
|
|
||||||
!IF "$(RECURSE)" == "0"
|
|
||||||
|
|
||||||
ALL : "$(OUTDIR)\adig.exe"
|
|
||||||
|
|
||||||
!ELSE
|
|
||||||
|
|
||||||
ALL : "areslib - Win32 Release" "$(OUTDIR)\adig.exe"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!IF "$(RECURSE)" == "1"
|
|
||||||
CLEAN :"areslib - Win32 ReleaseCLEAN"
|
|
||||||
!ELSE
|
|
||||||
CLEAN :
|
|
||||||
!ENDIF
|
|
||||||
-@erase "$(INTDIR)\adig.obj"
|
|
||||||
-@erase "$(INTDIR)\getopt.obj"
|
|
||||||
-@erase "$(INTDIR)\vc60.idb"
|
|
||||||
-@erase "$(OUTDIR)\adig.exe"
|
|
||||||
|
|
||||||
"$(OUTDIR)" :
|
|
||||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
|
||||||
|
|
||||||
CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\adig.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\adig.bsc"
|
|
||||||
BSC32_SBRS= \
|
|
||||||
|
|
||||||
LINK32=link.exe
|
|
||||||
LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\adig.pdb" /machine:I386 /out:"$(OUTDIR)\adig.exe" /libpath:"..\areslib\Release"
|
|
||||||
LINK32_OBJS= \
|
|
||||||
"$(INTDIR)\adig.obj" \
|
|
||||||
"$(INTDIR)\getopt.obj" \
|
|
||||||
"..\areslib\Release\areslib.lib"
|
|
||||||
|
|
||||||
"$(OUTDIR)\adig.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
|
|
||||||
$(LINK32) @<<
|
|
||||||
$(LINK32_FLAGS) $(LINK32_OBJS)
|
|
||||||
<<
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "adig - Win32 Debug"
|
|
||||||
|
|
||||||
OUTDIR=.\Debug
|
|
||||||
INTDIR=.\Debug
|
|
||||||
# Begin Custom Macros
|
|
||||||
OutDir=.\Debug
|
|
||||||
# End Custom Macros
|
|
||||||
|
|
||||||
!IF "$(RECURSE)" == "0"
|
|
||||||
|
|
||||||
ALL : "$(OUTDIR)\adig.exe"
|
|
||||||
|
|
||||||
!ELSE
|
|
||||||
|
|
||||||
ALL : "areslib - Win32 Debug" "$(OUTDIR)\adig.exe"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!IF "$(RECURSE)" == "1"
|
|
||||||
CLEAN :"areslib - Win32 DebugCLEAN"
|
|
||||||
!ELSE
|
|
||||||
CLEAN :
|
|
||||||
!ENDIF
|
|
||||||
-@erase "$(INTDIR)\adig.obj"
|
|
||||||
-@erase "$(INTDIR)\getopt.obj"
|
|
||||||
-@erase "$(INTDIR)\vc60.idb"
|
|
||||||
-@erase "$(INTDIR)\vc60.pdb"
|
|
||||||
-@erase "$(OUTDIR)\adig.exe"
|
|
||||||
-@erase "$(OUTDIR)\adig.ilk"
|
|
||||||
-@erase "$(OUTDIR)\adig.pdb"
|
|
||||||
|
|
||||||
"$(OUTDIR)" :
|
|
||||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
|
||||||
|
|
||||||
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\adig.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\adig.bsc"
|
|
||||||
BSC32_SBRS= \
|
|
||||||
|
|
||||||
LINK32=link.exe
|
|
||||||
LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\adig.pdb" /debug /machine:I386 /out:"$(OUTDIR)\adig.exe" /pdbtype:sept /libpath:"..\areslib\Debug"
|
|
||||||
LINK32_OBJS= \
|
|
||||||
"$(INTDIR)\adig.obj" \
|
|
||||||
"$(INTDIR)\getopt.obj" \
|
|
||||||
"..\areslib\Debug\areslib.lib"
|
|
||||||
|
|
||||||
"$(OUTDIR)\adig.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
|
|
||||||
$(LINK32) @<<
|
|
||||||
$(LINK32_FLAGS) $(LINK32_OBJS)
|
|
||||||
<<
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
.c{$(INTDIR)}.obj::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cpp{$(INTDIR)}.obj::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cxx{$(INTDIR)}.obj::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.c{$(INTDIR)}.sbr::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cpp{$(INTDIR)}.sbr::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cxx{$(INTDIR)}.sbr::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
|
|
||||||
!IF "$(NO_EXTERNAL_DEPS)" != "1"
|
|
||||||
!IF EXISTS("adig.dep")
|
|
||||||
!INCLUDE "adig.dep"
|
|
||||||
!ELSE
|
|
||||||
!MESSAGE Warning: cannot find "adig.dep"
|
|
||||||
!ENDIF
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "adig - Win32 Release" || "$(CFG)" == "adig - Win32 Debug"
|
|
||||||
SOURCE=..\..\adig.c
|
|
||||||
|
|
||||||
"$(INTDIR)\adig.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\getopt.c
|
|
||||||
|
|
||||||
"$(INTDIR)\getopt.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "adig - Win32 Release"
|
|
||||||
|
|
||||||
"areslib - Win32 Release" :
|
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"
|
|
||||||
cd "..\adig"
|
|
||||||
|
|
||||||
"areslib - Win32 ReleaseCLEAN" :
|
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN
|
|
||||||
cd "..\adig"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "adig - Win32 Debug"
|
|
||||||
|
|
||||||
"areslib - Win32 Debug" :
|
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"
|
|
||||||
cd "..\adig"
|
|
||||||
|
|
||||||
"areslib - Win32 DebugCLEAN" :
|
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN
|
|
||||||
cd "..\adig"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
<html>
|
|
||||||
<body>
|
|
||||||
<pre>
|
|
||||||
<h1>Build Log</h1>
|
|
||||||
<h3>
|
|
||||||
--------------------Configuration: areslib - Win32 Release--------------------
|
|
||||||
</h3>
|
|
||||||
<h3>Command Lines</h3>
|
|
||||||
Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615A.tmp" with contents
|
|
||||||
[
|
|
||||||
/nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"Release/areslib.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
|
|
||||||
"Z:\ARES-1.1.1\ares_gethostbyname.c"
|
|
||||||
"Z:\ARES-1.1.1\ares_init.c"
|
|
||||||
]
|
|
||||||
Creating command line "cl.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615A.tmp"
|
|
||||||
Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615B.tmp" with contents
|
|
||||||
[
|
|
||||||
/nologo /out:"Release\areslib.lib"
|
|
||||||
".\Release\ares__close_sockets.obj"
|
|
||||||
".\Release\ares__get_hostent.obj"
|
|
||||||
".\Release\ares__read_line.obj"
|
|
||||||
".\Release\ares_destroy.obj"
|
|
||||||
".\Release\ares_expand_name.obj"
|
|
||||||
".\Release\ares_fds.obj"
|
|
||||||
".\Release\ares_free_errmem.obj"
|
|
||||||
".\Release\ares_free_hostent.obj"
|
|
||||||
".\Release\ares_free_string.obj"
|
|
||||||
".\Release\ares_gethostbyaddr.obj"
|
|
||||||
".\Release\ares_gethostbyname.obj"
|
|
||||||
".\Release\ares_init.obj"
|
|
||||||
".\Release\ares_mkquery.obj"
|
|
||||||
".\Release\ares_parse_a_reply.obj"
|
|
||||||
".\Release\ares_parse_ptr_reply.obj"
|
|
||||||
".\Release\ares_process.obj"
|
|
||||||
".\Release\ares_query.obj"
|
|
||||||
".\Release\ares_search.obj"
|
|
||||||
".\Release\ares_send.obj"
|
|
||||||
".\Release\ares_strerror.obj"
|
|
||||||
".\Release\ares_timeout.obj"
|
|
||||||
".\Release\windows_port.obj"
|
|
||||||
]
|
|
||||||
Creating command line "link.exe -lib @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615B.tmp"
|
|
||||||
<h3>Output Window</h3>
|
|
||||||
Compiling...
|
|
||||||
ares_gethostbyname.c
|
|
||||||
Z:\ARES-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
ares_init.c
|
|
||||||
Z:\ARES-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
Z:\ARES-1.1.1\ares_init.c(141) : warning C4013: '_getpid' undefined; assuming extern returning int
|
|
||||||
Z:\ARES-1.1.1\ares_init.c(236) : warning C4101: 'p' : unreferenced local variable
|
|
||||||
Z:\ARES-1.1.1\ares_init.c(237) : warning C4101: 'linesize' : unreferenced local variable
|
|
||||||
Z:\ARES-1.1.1\ares_init.c(235) : warning C4101: 'fp' : unreferenced local variable
|
|
||||||
Creating library...
|
|
||||||
<h3>
|
|
||||||
--------------------Configuration: adig - Win32 Release--------------------
|
|
||||||
</h3>
|
|
||||||
<h3>Command Lines</h3>
|
|
||||||
Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615C.tmp" with contents
|
|
||||||
[
|
|
||||||
wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"Release/adig.pdb" /machine:I386 /out:"Release/adig.exe" /libpath:"..\areslib\Release"
|
|
||||||
".\Release\adig.obj"
|
|
||||||
".\Release\getopt.obj"
|
|
||||||
"\ARES-1.1.1\vc\areslib\Release\areslib.lib"
|
|
||||||
]
|
|
||||||
Creating command line "link.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615C.tmp"
|
|
||||||
<h3>Output Window</h3>
|
|
||||||
Linking...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Results</h3>
|
|
||||||
adig.exe - 0 error(s), 6 warning(s)
|
|
||||||
</pre>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
# Microsoft Developer Studio Generated Dependency File, included by ahost.mak
|
# Microsoft Developer Studio Generated Dependency File, included by ahost.mak
|
||||||
|
|
||||||
|
|||||||
@@ -7,19 +7,19 @@
|
|||||||
CFG=ahost - Win32 Debug
|
CFG=ahost - Win32 Debug
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||||
!MESSAGE use the Export Makefile command and run
|
!MESSAGE use the Export Makefile command and run
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE NMAKE /f "ahost.mak".
|
!MESSAGE NMAKE /f "ahost.mak".
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
!MESSAGE You can specify a configuration when running NMAKE
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE NMAKE /f "ahost.mak" CFG="ahost - Win32 Debug"
|
!MESSAGE NMAKE /f "ahost.mak" CFG="ahost - Win32 Debug"
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE Possible choices for configuration are:
|
!MESSAGE Possible choices for configuration are:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE "ahost - Win32 Release" (based on "Win32 (x86) Console Application")
|
!MESSAGE "ahost - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||||
!MESSAGE "ahost - Win32 Debug" (based on "Win32 (x86) Console Application")
|
!MESSAGE "ahost - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
|
|
||||||
# Begin Project
|
# Begin Project
|
||||||
# PROP AllowPerConfigDependencies 0
|
# PROP AllowPerConfigDependencies 0
|
||||||
@@ -74,7 +74,7 @@ LINK32=link.exe
|
|||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||||
# ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\areslib\Debug"
|
# ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\areslib\Debug"
|
||||||
|
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
# Begin Target
|
# Begin Target
|
||||||
|
|
||||||
|
|||||||
@@ -1,223 +0,0 @@
|
|||||||
# Microsoft Developer Studio Generated NMAKE File, Based on ahost.dsp
|
|
||||||
!IF "$(CFG)" == ""
|
|
||||||
CFG=ahost - Win32 Debug
|
|
||||||
!MESSAGE No configuration specified. Defaulting to ahost - Win32 Debug.
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!IF "$(CFG)" != "ahost - Win32 Release" && "$(CFG)" != "ahost - Win32 Debug"
|
|
||||||
!MESSAGE Invalid configuration "$(CFG)" specified.
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "ahost.mak" CFG="ahost - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "ahost - Win32 Release" (based on "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE "ahost - Win32 Debug" (based on "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE
|
|
||||||
!ERROR An invalid configuration is specified.
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!IF "$(OS)" == "Windows_NT"
|
|
||||||
NULL=
|
|
||||||
!ELSE
|
|
||||||
NULL=nul
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "ahost - Win32 Release"
|
|
||||||
|
|
||||||
OUTDIR=.\Release
|
|
||||||
INTDIR=.\Release
|
|
||||||
# Begin Custom Macros
|
|
||||||
OutDir=.\Release
|
|
||||||
# End Custom Macros
|
|
||||||
|
|
||||||
!IF "$(RECURSE)" == "0"
|
|
||||||
|
|
||||||
ALL : "$(OUTDIR)\ahost.exe"
|
|
||||||
|
|
||||||
!ELSE
|
|
||||||
|
|
||||||
ALL : "areslib - Win32 Release" "$(OUTDIR)\ahost.exe"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!IF "$(RECURSE)" == "1"
|
|
||||||
CLEAN :"areslib - Win32 ReleaseCLEAN"
|
|
||||||
!ELSE
|
|
||||||
CLEAN :
|
|
||||||
!ENDIF
|
|
||||||
-@erase "$(INTDIR)\ahost.obj"
|
|
||||||
-@erase "$(INTDIR)\vc60.idb"
|
|
||||||
-@erase "$(OUTDIR)\ahost.exe"
|
|
||||||
|
|
||||||
"$(OUTDIR)" :
|
|
||||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
|
||||||
|
|
||||||
CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\ahost.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\ahost.bsc"
|
|
||||||
BSC32_SBRS= \
|
|
||||||
|
|
||||||
LINK32=link.exe
|
|
||||||
LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\ahost.pdb" /machine:I386 /out:"$(OUTDIR)\ahost.exe" /libpath:"..\areslib\Release"
|
|
||||||
LINK32_OBJS= \
|
|
||||||
"$(INTDIR)\ahost.obj" \
|
|
||||||
"..\areslib\Release\areslib.lib"
|
|
||||||
|
|
||||||
"$(OUTDIR)\ahost.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
|
|
||||||
$(LINK32) @<<
|
|
||||||
$(LINK32_FLAGS) $(LINK32_OBJS)
|
|
||||||
<<
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "ahost - Win32 Debug"
|
|
||||||
|
|
||||||
OUTDIR=.\Debug
|
|
||||||
INTDIR=.\Debug
|
|
||||||
# Begin Custom Macros
|
|
||||||
OutDir=.\Debug
|
|
||||||
# End Custom Macros
|
|
||||||
|
|
||||||
!IF "$(RECURSE)" == "0"
|
|
||||||
|
|
||||||
ALL : "$(OUTDIR)\ahost.exe" "$(OUTDIR)\ahost.bsc"
|
|
||||||
|
|
||||||
!ELSE
|
|
||||||
|
|
||||||
ALL : "areslib - Win32 Debug" "$(OUTDIR)\ahost.exe" "$(OUTDIR)\ahost.bsc"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!IF "$(RECURSE)" == "1"
|
|
||||||
CLEAN :"areslib - Win32 DebugCLEAN"
|
|
||||||
!ELSE
|
|
||||||
CLEAN :
|
|
||||||
!ENDIF
|
|
||||||
-@erase "$(INTDIR)\ahost.obj"
|
|
||||||
-@erase "$(INTDIR)\ahost.sbr"
|
|
||||||
-@erase "$(INTDIR)\vc60.idb"
|
|
||||||
-@erase "$(INTDIR)\vc60.pdb"
|
|
||||||
-@erase "$(OUTDIR)\ahost.bsc"
|
|
||||||
-@erase "$(OUTDIR)\ahost.exe"
|
|
||||||
-@erase "$(OUTDIR)\ahost.ilk"
|
|
||||||
-@erase "$(OUTDIR)\ahost.pdb"
|
|
||||||
|
|
||||||
"$(OUTDIR)" :
|
|
||||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
|
||||||
|
|
||||||
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fp"$(INTDIR)\ahost.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\ahost.bsc"
|
|
||||||
BSC32_SBRS= \
|
|
||||||
"$(INTDIR)\ahost.sbr"
|
|
||||||
|
|
||||||
"$(OUTDIR)\ahost.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
|
|
||||||
$(BSC32) @<<
|
|
||||||
$(BSC32_FLAGS) $(BSC32_SBRS)
|
|
||||||
<<
|
|
||||||
|
|
||||||
LINK32=link.exe
|
|
||||||
LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\ahost.pdb" /debug /machine:I386 /out:"$(OUTDIR)\ahost.exe" /pdbtype:sept /libpath:"..\areslib\Debug"
|
|
||||||
LINK32_OBJS= \
|
|
||||||
"$(INTDIR)\ahost.obj" \
|
|
||||||
"..\areslib\Debug\areslib.lib"
|
|
||||||
|
|
||||||
"$(OUTDIR)\ahost.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
|
|
||||||
$(LINK32) @<<
|
|
||||||
$(LINK32_FLAGS) $(LINK32_OBJS)
|
|
||||||
<<
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
.c{$(INTDIR)}.obj::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cpp{$(INTDIR)}.obj::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cxx{$(INTDIR)}.obj::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.c{$(INTDIR)}.sbr::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cpp{$(INTDIR)}.sbr::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cxx{$(INTDIR)}.sbr::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
|
|
||||||
!IF "$(NO_EXTERNAL_DEPS)" != "1"
|
|
||||||
!IF EXISTS("ahost.dep")
|
|
||||||
!INCLUDE "ahost.dep"
|
|
||||||
!ELSE
|
|
||||||
!MESSAGE Warning: cannot find "ahost.dep"
|
|
||||||
!ENDIF
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "ahost - Win32 Release" || "$(CFG)" == "ahost - Win32 Debug"
|
|
||||||
SOURCE=..\..\ahost.c
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "ahost - Win32 Release"
|
|
||||||
|
|
||||||
|
|
||||||
"$(INTDIR)\ahost.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "ahost - Win32 Debug"
|
|
||||||
|
|
||||||
|
|
||||||
"$(INTDIR)\ahost.obj" "$(INTDIR)\ahost.sbr" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "ahost - Win32 Release"
|
|
||||||
|
|
||||||
"areslib - Win32 Release" :
|
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"
|
|
||||||
cd "..\ahost"
|
|
||||||
|
|
||||||
"areslib - Win32 ReleaseCLEAN" :
|
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN
|
|
||||||
cd "..\ahost"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "ahost - Win32 Debug"
|
|
||||||
|
|
||||||
"areslib - Win32 Debug" :
|
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"
|
|
||||||
cd "..\ahost"
|
|
||||||
|
|
||||||
"areslib - Win32 DebugCLEAN" :
|
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN
|
|
||||||
cd "..\ahost"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
<html>
|
|
||||||
<body>
|
|
||||||
<pre>
|
|
||||||
<h1>Build Log</h1>
|
|
||||||
<h3>
|
|
||||||
--------------------Configuration: ahost - Win32 Release--------------------
|
|
||||||
</h3>
|
|
||||||
<h3>Command Lines</h3>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Results</h3>
|
|
||||||
ahost.exe - 0 error(s), 0 warning(s)
|
|
||||||
</pre>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -63,8 +63,8 @@ LIB32=link.exe -lib
|
|||||||
# PROP Output_Dir "Debug"
|
# PROP Output_Dir "Debug"
|
||||||
# PROP Intermediate_Dir "Debug"
|
# PROP Intermediate_Dir "Debug"
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
||||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||||
BSC32=bscmake.exe
|
BSC32=bscmake.exe
|
||||||
@@ -97,6 +97,10 @@ SOURCE=..\..\ares__read_line.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_cancel.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\ares_destroy.c
|
SOURCE=..\..\ares_destroy.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
@@ -137,6 +141,10 @@ SOURCE=..\..\ares_parse_a_reply.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_parse_aaaa_reply.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\ares_parse_ptr_reply.c
|
SOURCE=..\..\ares_parse_ptr_reply.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
@@ -153,14 +161,6 @@ SOURCE=..\..\ares_search.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\ares_cancel.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_version.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_send.c
|
SOURCE=..\..\ares_send.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
@@ -173,6 +173,22 @@ SOURCE=..\..\ares_timeout.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_version.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\bitncmp.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\inet_net_pton.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\inet_ntop.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\windows_port.c
|
SOURCE=..\..\windows_port.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# End Group
|
# End Group
|
||||||
@@ -189,7 +205,7 @@ SOURCE=..\..\ares_dns.h
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\ares_version.h
|
SOURCE=..\..\ares_ipv6.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
@@ -197,6 +213,22 @@ SOURCE=..\..\ares_private.h
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_version.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\bitncmp.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\inet_net_pton.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\inet_ntop.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\nameser.h
|
SOURCE=..\..\nameser.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# End Group
|
# End Group
|
||||||
|
|||||||
29
ares/vc/areslib/areslib.dsw
Normal file
29
ares/vc/areslib/areslib.dsw
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||||
|
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
Project: "areslib"=.\areslib.dsp - Package Owner=<4>
|
||||||
|
|
||||||
|
Package=<5>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Package=<4>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
Global:
|
||||||
|
|
||||||
|
Package=<5>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Package=<3>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
@@ -1,367 +0,0 @@
|
|||||||
# Microsoft Developer Studio Generated NMAKE File, Based on areslib.dsp
|
|
||||||
!IF "$(CFG)" == ""
|
|
||||||
CFG=areslib - Win32 Debug
|
|
||||||
!MESSAGE No configuration specified. Defaulting to areslib - Win32 Debug.
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!IF "$(CFG)" != "areslib - Win32 Release" && "$(CFG)" != "areslib - Win32 Debug"
|
|
||||||
!MESSAGE Invalid configuration "$(CFG)" specified.
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "areslib.mak" CFG="areslib - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "areslib - Win32 Release" (based on "Win32 (x86) Static Library")
|
|
||||||
!MESSAGE "areslib - Win32 Debug" (based on "Win32 (x86) Static Library")
|
|
||||||
!MESSAGE
|
|
||||||
!ERROR An invalid configuration is specified.
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!IF "$(OS)" == "Windows_NT"
|
|
||||||
NULL=
|
|
||||||
!ELSE
|
|
||||||
NULL=nul
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "areslib - Win32 Release"
|
|
||||||
|
|
||||||
OUTDIR=.\Release
|
|
||||||
INTDIR=.\Release
|
|
||||||
# Begin Custom Macros
|
|
||||||
OutDir=.\Release
|
|
||||||
# End Custom Macros
|
|
||||||
|
|
||||||
ALL : "$(OUTDIR)\areslib.lib"
|
|
||||||
|
|
||||||
|
|
||||||
CLEAN :
|
|
||||||
-@erase "$(INTDIR)\ares__close_sockets.obj"
|
|
||||||
-@erase "$(INTDIR)\ares__get_hostent.obj"
|
|
||||||
-@erase "$(INTDIR)\ares__read_line.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_destroy.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_expand_name.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_fds.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_free_hostent.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_free_string.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_gethostbyaddr.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_gethostbyname.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_init.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_mkquery.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_parse_a_reply.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_parse_ptr_reply.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_process.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_query.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_search.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_send.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_strerror.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_timeout.obj"
|
|
||||||
-@erase "$(INTDIR)\vc60.idb"
|
|
||||||
-@erase "$(INTDIR)\windows_port.obj"
|
|
||||||
-@erase "$(OUTDIR)\areslib.lib"
|
|
||||||
|
|
||||||
"$(OUTDIR)" :
|
|
||||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
|
||||||
|
|
||||||
CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc"
|
|
||||||
BSC32_SBRS= \
|
|
||||||
|
|
||||||
LIB32=link.exe -lib
|
|
||||||
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib"
|
|
||||||
LIB32_OBJS= \
|
|
||||||
"$(INTDIR)\ares__close_sockets.obj" \
|
|
||||||
"$(INTDIR)\ares__get_hostent.obj" \
|
|
||||||
"$(INTDIR)\ares__read_line.obj" \
|
|
||||||
"$(INTDIR)\ares_destroy.obj" \
|
|
||||||
"$(INTDIR)\ares_expand_name.obj" \
|
|
||||||
"$(INTDIR)\ares_fds.obj" \
|
|
||||||
"$(INTDIR)\ares_free_hostent.obj" \
|
|
||||||
"$(INTDIR)\ares_free_string.obj" \
|
|
||||||
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
|
||||||
"$(INTDIR)\ares_gethostbyname.obj" \
|
|
||||||
"$(INTDIR)\ares_init.obj" \
|
|
||||||
"$(INTDIR)\ares_mkquery.obj" \
|
|
||||||
"$(INTDIR)\ares_parse_a_reply.obj" \
|
|
||||||
"$(INTDIR)\ares_parse_ptr_reply.obj" \
|
|
||||||
"$(INTDIR)\ares_process.obj" \
|
|
||||||
"$(INTDIR)\ares_query.obj" \
|
|
||||||
"$(INTDIR)\ares_search.obj" \
|
|
||||||
"$(INTDIR)\ares_cancel.obj" \
|
|
||||||
"$(INTDIR)\ares_version.obj" \
|
|
||||||
"$(INTDIR)\ares_send.obj" \
|
|
||||||
"$(INTDIR)\ares_strerror.obj" \
|
|
||||||
"$(INTDIR)\ares_timeout.obj" \
|
|
||||||
"$(INTDIR)\windows_port.obj"
|
|
||||||
|
|
||||||
"$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
|
|
||||||
$(LIB32) @<<
|
|
||||||
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
|
|
||||||
<<
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "areslib - Win32 Debug"
|
|
||||||
|
|
||||||
OUTDIR=.\Debug
|
|
||||||
INTDIR=.\Debug
|
|
||||||
# Begin Custom Macros
|
|
||||||
OutDir=.\Debug
|
|
||||||
# End Custom Macros
|
|
||||||
|
|
||||||
ALL : "$(OUTDIR)\areslib.lib"
|
|
||||||
|
|
||||||
|
|
||||||
CLEAN :
|
|
||||||
-@erase "$(INTDIR)\ares__close_sockets.obj"
|
|
||||||
-@erase "$(INTDIR)\ares__get_hostent.obj"
|
|
||||||
-@erase "$(INTDIR)\ares__read_line.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_destroy.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_expand_name.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_fds.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_free_hostent.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_free_string.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_gethostbyaddr.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_gethostbyname.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_init.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_mkquery.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_parse_a_reply.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_parse_ptr_reply.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_process.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_query.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_search.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_cancel.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_version.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_send.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_strerror.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_timeout.obj"
|
|
||||||
-@erase "$(INTDIR)\vc60.idb"
|
|
||||||
-@erase "$(INTDIR)\vc60.pdb"
|
|
||||||
-@erase "$(INTDIR)\windows_port.obj"
|
|
||||||
-@erase "$(OUTDIR)\areslib.lib"
|
|
||||||
|
|
||||||
"$(OUTDIR)" :
|
|
||||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
|
||||||
|
|
||||||
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc"
|
|
||||||
BSC32_SBRS= \
|
|
||||||
|
|
||||||
LIB32=link.exe -lib
|
|
||||||
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib"
|
|
||||||
LIB32_OBJS= \
|
|
||||||
"$(INTDIR)\ares__close_sockets.obj" \
|
|
||||||
"$(INTDIR)\ares__get_hostent.obj" \
|
|
||||||
"$(INTDIR)\ares__read_line.obj" \
|
|
||||||
"$(INTDIR)\ares_destroy.obj" \
|
|
||||||
"$(INTDIR)\ares_expand_name.obj" \
|
|
||||||
"$(INTDIR)\ares_fds.obj" \
|
|
||||||
"$(INTDIR)\ares_free_hostent.obj" \
|
|
||||||
"$(INTDIR)\ares_free_string.obj" \
|
|
||||||
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
|
||||||
"$(INTDIR)\ares_gethostbyname.obj" \
|
|
||||||
"$(INTDIR)\ares_init.obj" \
|
|
||||||
"$(INTDIR)\ares_mkquery.obj" \
|
|
||||||
"$(INTDIR)\ares_parse_a_reply.obj" \
|
|
||||||
"$(INTDIR)\ares_parse_ptr_reply.obj" \
|
|
||||||
"$(INTDIR)\ares_process.obj" \
|
|
||||||
"$(INTDIR)\ares_query.obj" \
|
|
||||||
"$(INTDIR)\ares_search.obj" \
|
|
||||||
"$(INTDIR)\ares_send.obj" \
|
|
||||||
"$(INTDIR)\ares_strerror.obj" \
|
|
||||||
"$(INTDIR)\ares_timeout.obj" \
|
|
||||||
"$(INTDIR)\windows_port.obj"
|
|
||||||
|
|
||||||
"$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
|
|
||||||
$(LIB32) @<<
|
|
||||||
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
|
|
||||||
<<
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
.c{$(INTDIR)}.obj::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cpp{$(INTDIR)}.obj::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cxx{$(INTDIR)}.obj::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.c{$(INTDIR)}.sbr::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cpp{$(INTDIR)}.sbr::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
.cxx{$(INTDIR)}.sbr::
|
|
||||||
$(CPP) @<<
|
|
||||||
$(CPP_PROJ) $<
|
|
||||||
<<
|
|
||||||
|
|
||||||
|
|
||||||
!IF "$(NO_EXTERNAL_DEPS)" != "1"
|
|
||||||
!IF EXISTS("areslib.dep")
|
|
||||||
!INCLUDE "areslib.dep"
|
|
||||||
!ELSE
|
|
||||||
!MESSAGE Warning: cannot find "areslib.dep"
|
|
||||||
!ENDIF
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "areslib - Win32 Release" || "$(CFG)" == "areslib - Win32 Debug"
|
|
||||||
SOURCE=..\..\ares__close_sockets.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares__close_sockets.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares__get_hostent.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares__get_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares__read_line.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares__read_line.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_destroy.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_destroy.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_expand_name.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_expand_name.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_fds.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_fds.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_free_hostent.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_free_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_free_string.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_free_string.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_gethostbyaddr.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_gethostbyaddr.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_gethostbyname.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_gethostbyname.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_init.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_init.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_mkquery.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_mkquery.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_parse_a_reply.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_parse_a_reply.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_parse_ptr_reply.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_parse_ptr_reply.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_process.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_process.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_query.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_query.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_search.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_search.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_version.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_version.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_cancel.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_cancel.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_send.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_strerror.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_strerror.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_timeout.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_timeout.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\windows_port.c
|
|
||||||
|
|
||||||
"$(INTDIR)\windows_port.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
<html>
|
|
||||||
<body>
|
|
||||||
<pre>
|
|
||||||
<h1>Build Log</h1>
|
|
||||||
<h3>
|
|
||||||
--------------------Configuration: areslib - Win32 Release--------------------
|
|
||||||
</h3>
|
|
||||||
<h3>Command Lines</h3>
|
|
||||||
Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603D.tmp" with contents
|
|
||||||
[
|
|
||||||
/nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"Release/areslib.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c
|
|
||||||
"Z:\ares-1.1.1\ares__close_sockets.c"
|
|
||||||
"Z:\ares-1.1.1\ares__get_hostent.c"
|
|
||||||
"Z:\ares-1.1.1\ares__read_line.c"
|
|
||||||
"Z:\ares-1.1.1\ares_destroy.c"
|
|
||||||
"Z:\ares-1.1.1\ares_expand_name.c"
|
|
||||||
"Z:\ares-1.1.1\ares_fds.c"
|
|
||||||
"Z:\ares-1.1.1\ares_free_errmem.c"
|
|
||||||
"Z:\ares-1.1.1\ares_free_hostent.c"
|
|
||||||
"Z:\ares-1.1.1\ares_free_string.c"
|
|
||||||
"Z:\ares-1.1.1\ares_gethostbyaddr.c"
|
|
||||||
"Z:\ares-1.1.1\ares_gethostbyname.c"
|
|
||||||
"Z:\ares-1.1.1\ares_init.c"
|
|
||||||
"Z:\ares-1.1.1\ares_mkquery.c"
|
|
||||||
"Z:\ares-1.1.1\ares_parse_a_reply.c"
|
|
||||||
"Z:\ares-1.1.1\ares_parse_ptr_reply.c"
|
|
||||||
"Z:\ares-1.1.1\ares_process.c"
|
|
||||||
"Z:\ares-1.1.1\ares_query.c"
|
|
||||||
"Z:\ares-1.1.1\ares_search.c"
|
|
||||||
"Z:\ares-1.1.1\ares_send.c"
|
|
||||||
"Z:\ares-1.1.1\ares_strerror.c"
|
|
||||||
"Z:\ares-1.1.1\ares_timeout.c"
|
|
||||||
"Z:\ares-1.1.1\windows_port.c"
|
|
||||||
]
|
|
||||||
Creating command line "cl.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603D.tmp"
|
|
||||||
Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603E.tmp" with contents
|
|
||||||
[
|
|
||||||
/nologo /out:"Release\areslib.lib"
|
|
||||||
".\Release\ares__close_sockets.obj"
|
|
||||||
".\Release\ares__get_hostent.obj"
|
|
||||||
".\Release\ares__read_line.obj"
|
|
||||||
".\Release\ares_destroy.obj"
|
|
||||||
".\Release\ares_expand_name.obj"
|
|
||||||
".\Release\ares_fds.obj"
|
|
||||||
".\Release\ares_free_errmem.obj"
|
|
||||||
".\Release\ares_free_hostent.obj"
|
|
||||||
".\Release\ares_free_string.obj"
|
|
||||||
".\Release\ares_gethostbyaddr.obj"
|
|
||||||
".\Release\ares_gethostbyname.obj"
|
|
||||||
".\Release\ares_init.obj"
|
|
||||||
".\Release\ares_mkquery.obj"
|
|
||||||
".\Release\ares_parse_a_reply.obj"
|
|
||||||
".\Release\ares_parse_ptr_reply.obj"
|
|
||||||
".\Release\ares_process.obj"
|
|
||||||
".\Release\ares_query.obj"
|
|
||||||
".\Release\ares_search.obj"
|
|
||||||
".\Release\ares_send.obj"
|
|
||||||
".\Release\ares_strerror.obj"
|
|
||||||
".\Release\ares_timeout.obj"
|
|
||||||
".\Release\windows_port.obj"
|
|
||||||
]
|
|
||||||
Creating command line "link.exe -lib @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603E.tmp"
|
|
||||||
<h3>Output Window</h3>
|
|
||||||
Compiling...
|
|
||||||
ares__close_sockets.c
|
|
||||||
Z:\ares-1.1.1\ares__close_sockets.c(46) : warning C4013: 'close' undefined; assuming extern returning int
|
|
||||||
ares__get_hostent.c
|
|
||||||
ares__read_line.c
|
|
||||||
ares_destroy.c
|
|
||||||
ares_expand_name.c
|
|
||||||
Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
ares_fds.c
|
|
||||||
ares_free_errmem.c
|
|
||||||
ares_free_hostent.c
|
|
||||||
ares_free_string.c
|
|
||||||
ares_gethostbyaddr.c
|
|
||||||
Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
ares_gethostbyname.c
|
|
||||||
Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
ares_init.c
|
|
||||||
Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
Z:\ares-1.1.1\ares_init.c(141) : warning C4013: '_getpid' undefined; assuming extern returning int
|
|
||||||
Z:\ares-1.1.1\ares_init.c(236) : warning C4101: 'p' : unreferenced local variable
|
|
||||||
Z:\ares-1.1.1\ares_init.c(237) : warning C4101: 'linesize' : unreferenced local variable
|
|
||||||
Z:\ares-1.1.1\ares_init.c(235) : warning C4101: 'fp' : unreferenced local variable
|
|
||||||
ares_mkquery.c
|
|
||||||
Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
ares_parse_a_reply.c
|
|
||||||
Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
Z:\ares-1.1.1\ares_parse_a_reply.c(90) : warning C4018: '<' : signed/unsigned mismatch
|
|
||||||
ares_parse_ptr_reply.c
|
|
||||||
Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
Z:\ares-1.1.1\ares_parse_ptr_reply.c(71) : warning C4018: '<' : signed/unsigned mismatch
|
|
||||||
ares_process.c
|
|
||||||
Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
ares_query.c
|
|
||||||
Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
ares_search.c
|
|
||||||
Z:\ares-1.1.1\ares_search.c(229) : warning C4013: 'strncasecmp' undefined; assuming extern returning int
|
|
||||||
ares_send.c
|
|
||||||
Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
ares_strerror.c
|
|
||||||
ares_timeout.c
|
|
||||||
windows_port.c
|
|
||||||
Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition
|
|
||||||
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR'
|
|
||||||
Creating library...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Results</h3>
|
|
||||||
areslib.lib - 0 error(s), 19 warning(s)
|
|
||||||
</pre>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
83
buildconf
83
buildconf
@@ -1,4 +1,26 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
#***************************************************************************
|
||||||
|
# _ _ ____ _
|
||||||
|
# Project ___| | | | _ \| |
|
||||||
|
# / __| | | | |_) | |
|
||||||
|
# | (__| |_| | _ <| |___
|
||||||
|
# \___|\___/|_| \_\_____|
|
||||||
|
#
|
||||||
|
# Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
#
|
||||||
|
# This software is licensed as described in the file COPYING, which
|
||||||
|
# you should have received as part of this distribution. The terms
|
||||||
|
# are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
|
#
|
||||||
|
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
# copies of the Software, and permit persons to whom the Software is
|
||||||
|
# furnished to do so, under the terms of the COPYING file.
|
||||||
|
#
|
||||||
|
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
# KIND, either express or implied.
|
||||||
|
#
|
||||||
|
# $Id$
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
die(){
|
die(){
|
||||||
echo "$@"
|
echo "$@"
|
||||||
@@ -13,7 +35,8 @@ findtool(){
|
|||||||
IFS=":"
|
IFS=":"
|
||||||
for path in $PATH
|
for path in $PATH
|
||||||
do
|
do
|
||||||
if test -r "$path/$file"; then
|
# echo "checks for $file in $path" >&2
|
||||||
|
if test -f "$path/$file"; then
|
||||||
echo "$path/$file"
|
echo "$path/$file"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
@@ -24,7 +47,7 @@ findtool(){
|
|||||||
# autoconf 2.57 or newer
|
# autoconf 2.57 or newer
|
||||||
#
|
#
|
||||||
need_autoconf="2.57"
|
need_autoconf="2.57"
|
||||||
ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
||||||
if test -z "$ac_version"; then
|
if test -z "$ac_version"; then
|
||||||
echo "buildconf: autoconf not found."
|
echo "buildconf: autoconf not found."
|
||||||
echo " You need autoconf version $need_autoconf or newer installed."
|
echo " You need autoconf version $need_autoconf or newer installed."
|
||||||
@@ -45,7 +68,7 @@ echo "buildconf: autoconf version $ac_version (ok)"
|
|||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
# autoheader 2.50 or newer
|
# autoheader 2.50 or newer
|
||||||
#
|
#
|
||||||
ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
||||||
if test -z "$ah_version"; then
|
if test -z "$ah_version"; then
|
||||||
echo "buildconf: autoheader not found."
|
echo "buildconf: autoheader not found."
|
||||||
echo " You need autoheader version 2.50 or newer installed."
|
echo " You need autoheader version 2.50 or newer installed."
|
||||||
@@ -67,7 +90,7 @@ echo "buildconf: autoheader version $ah_version (ok)"
|
|||||||
# automake 1.7 or newer
|
# automake 1.7 or newer
|
||||||
#
|
#
|
||||||
need_automake="1.7"
|
need_automake="1.7"
|
||||||
am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'`
|
am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -n 1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'`
|
||||||
if test -z "$am_version"; then
|
if test -z "$am_version"; then
|
||||||
echo "buildconf: automake not found."
|
echo "buildconf: automake not found."
|
||||||
echo " You need automake version $need_automake or newer installed."
|
echo " You need automake version $need_automake or newer installed."
|
||||||
@@ -85,6 +108,13 @@ fi
|
|||||||
|
|
||||||
echo "buildconf: automake version $am_version (ok)"
|
echo "buildconf: automake version $am_version (ok)"
|
||||||
|
|
||||||
|
ac=`findtool ${ACLOCAL:-aclocal}`
|
||||||
|
if test -z "$ac"; then
|
||||||
|
echo "buildconf: aclocal not found. Weird automake installation!"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "buildconf: aclocal found"
|
||||||
|
fi
|
||||||
|
|
||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
# libtool check
|
# libtool check
|
||||||
@@ -99,13 +129,18 @@ LIBTOOL_WANTED_VERSION=1.4.2
|
|||||||
# glibtool, with 'libtool' being something completely different.
|
# glibtool, with 'libtool' being something completely different.
|
||||||
libtool=`findtool glibtool 2>/dev/null`
|
libtool=`findtool glibtool 2>/dev/null`
|
||||||
if test ! -x "$libtool"; then
|
if test ! -x "$libtool"; then
|
||||||
libtool=`findtool libtool`
|
libtool=`findtool ${LIBTOOL:-libtool}`
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found
|
if test -z "$LIBTOOLIZE"; then
|
||||||
LIBTOOLIZE="${libtool}ize"
|
# 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`
|
||||||
|
fi
|
||||||
|
|
||||||
lt_pversion=`$libtool --version 2>/dev/null|head -1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'`
|
lt_pversion=`$libtool --version 2>/dev/null|head -n 1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'`
|
||||||
if test -z "$lt_pversion"; then
|
if test -z "$lt_pversion"; then
|
||||||
echo "buildconf: libtool not found."
|
echo "buildconf: libtool not found."
|
||||||
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
|
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
|
||||||
@@ -142,10 +177,17 @@ fi
|
|||||||
|
|
||||||
echo "buildconf: libtool version $lt_version (ok)"
|
echo "buildconf: libtool version $lt_version (ok)"
|
||||||
|
|
||||||
|
if test -f "$libtoolize"; then
|
||||||
|
echo "buildconf: libtoolize found"
|
||||||
|
else
|
||||||
|
echo "buildconf: libtoolize not found. Weird libtool installation!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
# m4 check
|
# m4 check
|
||||||
#
|
#
|
||||||
m4=`${M4:-m4} --version 2>/dev/null|head -1`;
|
m4=`${M4:-m4} --version 2>/dev/null|head -n 1`;
|
||||||
m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
||||||
|
|
||||||
if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then
|
if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then
|
||||||
@@ -155,17 +197,26 @@ else
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
# perl check
|
||||||
|
#
|
||||||
|
PERL=`findtool ${PERL:-perl}`
|
||||||
|
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
# run the correct scripts now
|
# run the correct scripts now
|
||||||
|
|
||||||
echo "buildconf: running libtoolize"
|
echo "buildconf: running libtoolize"
|
||||||
${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed"
|
$libtoolize --copy --automake --force || die "The libtoolize command failed"
|
||||||
echo "buildconf: running aclocal"
|
echo "buildconf: running aclocal"
|
||||||
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The aclocal command line failed"
|
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The aclocal command line failed"
|
||||||
echo "buildconf: running aclocal hack to convert all mv to mv -f"
|
if test -n "$PERL"; then
|
||||||
perl -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4
|
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: running autoheader"
|
echo "buildconf: running autoheader"
|
||||||
${AUTOHEADER:-autoheader} || die "The autoheader command failed"
|
${AUTOHEADER:-autoheader} || die "The autoheader command failed"
|
||||||
echo "buildconf: cp lib/config.h.in src/config.h.in"
|
echo "buildconf: cp lib/config.h.in src/config.h.in"
|
||||||
@@ -175,15 +226,13 @@ ${AUTOCONF:-autoconf} || die "The autoconf command failed"
|
|||||||
|
|
||||||
if test -d ares; then
|
if test -d ares; then
|
||||||
cd ares
|
cd ares
|
||||||
echo "buildconf: running aclocal in the ares directory"
|
echo "buildconf: running in ares"
|
||||||
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed"
|
./buildconf
|
||||||
echo "buildconf: running autoconf in the ares directory"
|
|
||||||
${AUTOCONF:-autoconf} || die "The ares autoconf command failed"
|
|
||||||
cd ..
|
cd ..
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "buildconf: running automake"
|
echo "buildconf: running automake"
|
||||||
${AUTOMAKE:-automake} -a || die "The automake command failed"
|
${AUTOMAKE:-automake} -a -c || die "The automake command failed"
|
||||||
|
|
||||||
echo "buildconf: OK"
|
echo "buildconf: OK"
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
821
configure.ac
821
configure.ac
File diff suppressed because it is too large
Load Diff
@@ -60,6 +60,9 @@ while test $# -gt 0; do
|
|||||||
--feature|--features)
|
--feature|--features)
|
||||||
if test "@USE_SSLEAY@" = "1"; then
|
if test "@USE_SSLEAY@" = "1"; then
|
||||||
echo "SSL"
|
echo "SSL"
|
||||||
|
NTLM=1 # OpenSSL implies NTLM
|
||||||
|
elif test -n "@USE_GNUTLS@"; then
|
||||||
|
echo "SSL"
|
||||||
fi
|
fi
|
||||||
if test "@KRB4_ENABLED@" = "1"; then
|
if test "@KRB4_ENABLED@" = "1"; then
|
||||||
echo "KRB4"
|
echo "KRB4"
|
||||||
@@ -73,6 +76,16 @@ while test $# -gt 0; do
|
|||||||
if test "@HAVE_ARES@" = "1"; then
|
if test "@HAVE_ARES@" = "1"; then
|
||||||
echo "AsynchDNS"
|
echo "AsynchDNS"
|
||||||
fi
|
fi
|
||||||
|
if test "@IDN_ENABLED@" = "1"; then
|
||||||
|
echo "IDN"
|
||||||
|
fi
|
||||||
|
if test "@USE_WINDOWS_SSPI@" = "1"; then
|
||||||
|
echo "SSPI"
|
||||||
|
NTLM=1
|
||||||
|
fi
|
||||||
|
if test "$NTLM" = "1"; then
|
||||||
|
echo "NTLM"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--protocols)
|
--protocols)
|
||||||
@@ -88,9 +101,6 @@ while test $# -gt 0; do
|
|||||||
echo "FTPS"
|
echo "FTPS"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if test "@CURL_DISABLE_GOPHER@" != "1"; then
|
|
||||||
echo "GOPHER"
|
|
||||||
fi
|
|
||||||
if test "@CURL_DISABLE_FILE@" != "1"; then
|
if test "@CURL_DISABLE_FILE@" != "1"; then
|
||||||
echo "FILE"
|
echo "FILE"
|
||||||
fi
|
fi
|
||||||
@@ -103,6 +113,9 @@ while test $# -gt 0; do
|
|||||||
if test "@CURL_DISABLE_DICT@" != "1"; then
|
if test "@CURL_DISABLE_DICT@" != "1"; then
|
||||||
echo "DICT"
|
echo "DICT"
|
||||||
fi
|
fi
|
||||||
|
if test "@CURL_DISABLE_TFTP@" != "1"; then
|
||||||
|
echo "TFTP"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
--version)
|
--version)
|
||||||
echo libcurl @VERSION@
|
echo libcurl @VERSION@
|
||||||
|
|||||||
@@ -75,10 +75,15 @@ Java
|
|||||||
Maintained by Vic Hanson
|
Maintained by Vic Hanson
|
||||||
http://curl.haxx.se/libcurl/java/
|
http://curl.haxx.se/libcurl/java/
|
||||||
|
|
||||||
|
Lisp
|
||||||
|
|
||||||
|
Written by Liam Healy
|
||||||
|
http://common-lisp.net/project/cl-curl/
|
||||||
|
|
||||||
Lua
|
Lua
|
||||||
|
|
||||||
Written by Steve Dekorte
|
LuaCURL Written by Alexander Marinov
|
||||||
http://curl.haxx.se/libcurl/lua/
|
http://luacurl.luaforge.net/
|
||||||
|
|
||||||
Mono
|
Mono
|
||||||
|
|
||||||
@@ -87,8 +92,8 @@ Mono
|
|||||||
|
|
||||||
.NET
|
.NET
|
||||||
|
|
||||||
Written by Jeffrey Phillips
|
libcurl-net Written by Jeffrey Phillips
|
||||||
http://www.seasideresearch.com/downloads.html
|
http://sourceforge.net/projects/libcurl-net/
|
||||||
|
|
||||||
Object-Pascal
|
Object-Pascal
|
||||||
|
|
||||||
@@ -145,13 +150,23 @@ Scheme
|
|||||||
Bigloo binding written by Kirill Lisovsky
|
Bigloo binding written by Kirill Lisovsky
|
||||||
http://curl.haxx.se/libcurl/scheme/
|
http://curl.haxx.se/libcurl/scheme/
|
||||||
|
|
||||||
|
S-Lang
|
||||||
|
|
||||||
|
S-Lang binding written by John E Davis
|
||||||
|
http://www.jedsoft.org/slang/modules/curl.html
|
||||||
|
|
||||||
Tcl
|
Tcl
|
||||||
|
|
||||||
Tclcurl is written by Andr<64>s Garc<72>a
|
Tclcurl is written by Andr<64>s Garc<72>a
|
||||||
http://personal1.iddeo.es/andresgarci/tclcurl/english/docs.html
|
http://personal1.iddeo.es/andresgarci/tclcurl/english/docs.html
|
||||||
|
|
||||||
Q
|
Visual Basic
|
||||||
|
|
||||||
|
libcurl-vb is written by Jeffrey Phillips
|
||||||
|
http://sourceforge.net/projects/libcurl-vb/
|
||||||
|
|
||||||
|
Q
|
||||||
|
The libcurl module is part of the default install
|
||||||
http://q-lang.sourceforge.net/
|
http://q-lang.sourceforge.net/
|
||||||
|
|
||||||
wxWidgets
|
wxWidgets
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
| (__| |_| | _ <| |___
|
| (__| |_| | _ <| |___
|
||||||
\___|\___/|_| \_\_____|
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
To Think About When Contributing Source Code
|
When Contributing Source Code
|
||||||
|
|
||||||
This document is intended to offer some simple guidelines that can be useful
|
This document is intended to offer guidelines that can be useful to keep in
|
||||||
to keep in mind when you decide to contribute to the project. This concerns
|
mind when you decide to contribute to the project. This concerns new features
|
||||||
new features as well as corrections to existing flaws or bugs.
|
as well as corrections to existing flaws or bugs.
|
||||||
|
|
||||||
Join the Community
|
Join the Community
|
||||||
|
|
||||||
@@ -20,13 +20,26 @@ Join the Community
|
|||||||
The License Issue
|
The License Issue
|
||||||
|
|
||||||
When contributing with code, you agree to put your changes and new code under
|
When contributing with code, you agree to put your changes and new code under
|
||||||
the same license curl and libcurl is already using unless stated otherwise.
|
the same license curl and libcurl is already using unless stated and agreed
|
||||||
|
otherwise.
|
||||||
|
|
||||||
If you add a larger piece of code, you can opt to make that file or set of
|
If you add a larger piece of code, you can opt to make that file or set of
|
||||||
files to use a different license as long as they don't enforce any changes to
|
files to use a different license as long as they don't enforce any changes to
|
||||||
the rest of the package and they make sense. Such "separate parts" can not be
|
the rest of the package and they make sense. Such "separate parts" can not be
|
||||||
GPL (as we don't want the GPL virus to attack users of libcurl) but they must
|
GPL licensed (as we don't want copyleft to affect users of libcurl) but they
|
||||||
use "GPL compatible" licenses.
|
must use "GPL compatible" licenses (as we want to allow users to use libcurl
|
||||||
|
properly in GPL licensed environments).
|
||||||
|
|
||||||
|
When changing existing source code, you do not alter the copyright of the
|
||||||
|
original file(s). The copyright will still be owned by the original
|
||||||
|
creator(s) or those who have been assigned copyright by the original
|
||||||
|
author(s).
|
||||||
|
|
||||||
|
By submitting a patch to the curl project, you are assumed to have the right
|
||||||
|
to the code and to be allowed by your employer or whatever to hand over that
|
||||||
|
patch/code to us. We will credit you for your changes as far as possible, to
|
||||||
|
give credit but also to keep a trace back to who made what changes. Please
|
||||||
|
always provide us with your full real name when contributing!
|
||||||
|
|
||||||
What To Read
|
What To Read
|
||||||
|
|
||||||
|
|||||||
226
docs/DISTRO-DILEMMA
Normal file
226
docs/DISTRO-DILEMMA
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
Date: October 27, 2005
|
||||||
|
Author: Daniel Stenberg <daniel@haxx.se>
|
||||||
|
URL: http://curl.haxx.se/legal/distro-dilemma.html
|
||||||
|
|
||||||
|
Condition
|
||||||
|
|
||||||
|
This document is written to describe the situation as it is right
|
||||||
|
now. libcurl 7.15.0 is currently the latest version available. Things may (or
|
||||||
|
perhaps will) of course change in the future.
|
||||||
|
|
||||||
|
This document reflects my view and understanding of these things. Please tell
|
||||||
|
me where and how you think I'm wrong, and I'll try to correct my mistakes.
|
||||||
|
|
||||||
|
Background
|
||||||
|
|
||||||
|
The Free Software Foundation has deemed the Original BSD license[1] to be
|
||||||
|
"incompatible"[2] with GPL[3]. I'd rather say it is the other way around, but
|
||||||
|
the point is the same: if you distribute a binary version of a GPL program,
|
||||||
|
it MUST NOT be linked with any Original BSD-licensed parts or
|
||||||
|
libraries. Doing so will violate the GPL license. For a long time, very many
|
||||||
|
GPL licensed programs have avoided this license mess by adding an
|
||||||
|
exception[8] to their license. And many others have just closed their eyes
|
||||||
|
for this problem.
|
||||||
|
|
||||||
|
libcurl is MIT-style[4] licensed - how on earth did this dilemma fall onto
|
||||||
|
our plates?
|
||||||
|
|
||||||
|
libcurl is only a little library. libcurl can be built to use OpenSSL for its
|
||||||
|
SSL/TLS capabilities. OpenSSL is basically Original BSD licensed[5].
|
||||||
|
|
||||||
|
If libcurl built to use OpenSSL is used by a GPL-licensed application and you
|
||||||
|
decide to distribute a binary version of it (Linux distros - for example -
|
||||||
|
tend to), you have a clash. GPL vs Original BSD.
|
||||||
|
|
||||||
|
This dilemma is not libcurl-specific nor is it specific to any particular
|
||||||
|
Linux distro. (This article mentions and refers to Debian several times, but
|
||||||
|
only because Debian seems to be the only Linux distro to have faced this
|
||||||
|
issue yet since no other distro is shipping libcurl built with two SSL
|
||||||
|
libraries.)
|
||||||
|
|
||||||
|
Part of the Operating System
|
||||||
|
|
||||||
|
This would not be a problem if the used lib would be considered part of the
|
||||||
|
underlying operating system, as then the GPL license has an exception
|
||||||
|
clause[6] that allows applications to use such libs without having to be
|
||||||
|
allowed to distribute it or its sources. Possibly some distros will claim
|
||||||
|
that OpenSSL is part of their operating system.
|
||||||
|
|
||||||
|
Debian does however not take this stance and has officially(?) claimed that
|
||||||
|
OpenSSL is not a required part of the Debian operating system
|
||||||
|
|
||||||
|
Debian-legal
|
||||||
|
|
||||||
|
In August 2004 I figured I should start pulling people's attention to this to
|
||||||
|
see if anyone has any bright ideas or if they would dismiss my worries based
|
||||||
|
on some elegant writing I had missed somewhere:
|
||||||
|
|
||||||
|
My post to debian-legal on August 12 2004:
|
||||||
|
|
||||||
|
http://lists.debian.org/debian-legal/2004/08/msg00279.html
|
||||||
|
|
||||||
|
Several people agreed then that this is a known and rather big problem, but
|
||||||
|
the following discussion didn't result in much.
|
||||||
|
|
||||||
|
GnuTLS
|
||||||
|
|
||||||
|
With the release of libcurl 7.14.0 (May 2005), it can now get built to use
|
||||||
|
GnuTLS instead of OpenSSL. GnuTLS is a LGPL[7] licensed library that offers a
|
||||||
|
matching set of features as OpenSSL does. Now, you can build and distribute
|
||||||
|
an SSL capable libcurl without including any Original BSD licensed code.
|
||||||
|
|
||||||
|
I believe Debian is the first distro to provide libcurl/GnutTLS packages.
|
||||||
|
|
||||||
|
GnuTLS vs OpenSSL
|
||||||
|
|
||||||
|
While these two libraries offer similar features, they are not equal. Both
|
||||||
|
libraries have features the other one lacks. libcurl does not (yet) offer a
|
||||||
|
standardized stable ABI if you decide to switch from using libcurl-openssl to
|
||||||
|
libcurl-gnutls or vice versa. The GnuTLS support is very recent in libcurl
|
||||||
|
and it has not been tested nor used very extensively, while the OpenSSL
|
||||||
|
equivalent code has been used and thus matured for more than seven (7) years.
|
||||||
|
|
||||||
|
In August 2005, the debian-devel mailing list discovered the license issue as
|
||||||
|
a GPL licensed application wanted SSL capabilities from libcurl and thus was
|
||||||
|
forced to use the GnuTLS powered libcurl. For a reason that is unknown to me,
|
||||||
|
the application authors didn't want to or was unable to add an exception to
|
||||||
|
their GPL license. Alas, the license problem hit the fan again.
|
||||||
|
|
||||||
|
GnuTLS
|
||||||
|
- LGPL licensened
|
||||||
|
- supports SRP
|
||||||
|
- lacks SSLv2 support
|
||||||
|
- lacks MD2 support (used by at least some CA certs)
|
||||||
|
|
||||||
|
OpenSSL
|
||||||
|
- Original BSD licensened
|
||||||
|
- lacks SRP
|
||||||
|
- supports SSLv2
|
||||||
|
- older and more widely used
|
||||||
|
|
||||||
|
The Better License, Original BSD or LGPL?
|
||||||
|
|
||||||
|
It isn't obvious or without debate to any objective interested party that
|
||||||
|
either of these licenses are the "better" or even the "preferred" one in a
|
||||||
|
generic situation.
|
||||||
|
|
||||||
|
Instead, I think we should accept the fact that the SSL/TLS libraries and
|
||||||
|
their different licenses will fit different applications and their authors
|
||||||
|
differently depending on the applications' licenses and their general usage
|
||||||
|
pattern (considering how LGPL libraries for example can be burdensome for
|
||||||
|
embedded systems usage).
|
||||||
|
|
||||||
|
In Debian land, there seems to be a common opinion that LGPL is "maximally
|
||||||
|
compatible" with apps while Original BSD is not. Like this:
|
||||||
|
|
||||||
|
http://lists.debian.org/debian-devel/2005/09/msg01417.html
|
||||||
|
|
||||||
|
More SSL Libraries
|
||||||
|
|
||||||
|
In libcurl, there's no stopping us here. There are at least a few more Open
|
||||||
|
Source/Free SSL/TLS libraries and we would very much like to support them as
|
||||||
|
well, to offer application authors an even wider scope of choice.
|
||||||
|
|
||||||
|
Application Angle of this Problem
|
||||||
|
|
||||||
|
libcurl is built to use one SSL/TLS library. It uses a single fixed name (by
|
||||||
|
default), and applications are built/linked to use that single lib. Replacing
|
||||||
|
one libcurl instance with another one that uses the other SSL/TLS library
|
||||||
|
might break one or more applications (due to ABI differences and/or different
|
||||||
|
feature set). You want your application to use the libcurl it was built for.
|
||||||
|
|
||||||
|
Project cURL Angle of this Problem
|
||||||
|
|
||||||
|
We distribute libcurl and everyone may build libcurl with either library. At
|
||||||
|
their choice. This problem is not directly a problem of ours. It merely
|
||||||
|
affects users - GPL application authors only - of our lib as it comes
|
||||||
|
included and delivered on some distros.
|
||||||
|
|
||||||
|
libcurl has different ABI when built with different SSL/TLS libraries due to
|
||||||
|
two reasons:
|
||||||
|
|
||||||
|
1. No one has worked on fixing this. The mutex/lock callbacks should be set
|
||||||
|
with a generic libcurl function that should use the proper underlying
|
||||||
|
functions.
|
||||||
|
|
||||||
|
2. The CURLOPT_SSL_CTX_FUNCTION option is not possible to "emulate" on GnuTLS
|
||||||
|
but simply requires OpenSSL.
|
||||||
|
|
||||||
|
Distro Angle of this Problem
|
||||||
|
|
||||||
|
A distro can provide separate libcurls built with different SSL/TLS libraries
|
||||||
|
to work around this, but at least Debian seems to be very hostile against
|
||||||
|
such an approach, probably since it makes things like devel packages for the
|
||||||
|
different libs collide since they would provide the same include files and
|
||||||
|
man pages etc.
|
||||||
|
|
||||||
|
Fixing the Only Problem
|
||||||
|
|
||||||
|
The only problem is thus for distributions that want to offer libcurl
|
||||||
|
versions built with more than one SSL/TLS library.
|
||||||
|
|
||||||
|
Debian is now (since mid September 2005) providing two different devel
|
||||||
|
packages, one for libcurl built with OpenSSL and one built with GnuTLS. They
|
||||||
|
use different .so names and can this both be installed in a single system
|
||||||
|
simultaneously. This has previously been said as a transitional system not
|
||||||
|
desired to keep in the long run.
|
||||||
|
|
||||||
|
Since multiple libcurl binaries using different names are ruled out, we need
|
||||||
|
to come up with a way to have one single libcurl that someone uses different
|
||||||
|
underlying libraries. The best(?) approach currently suggested involves this:
|
||||||
|
|
||||||
|
A new intermediate library (named lib2 so far in the discussions) with the
|
||||||
|
single purpose of providing libcurl with SSL/TLS capabilities. It would have
|
||||||
|
a unified API and ABI no matter what underlying library it would use.
|
||||||
|
|
||||||
|
There would be one lib2 binary provided for each supported SSL/TLS library.
|
||||||
|
For example: lib2-openssl, lib2-gnutls, lib2-yassl, lib2-matrixssl and
|
||||||
|
lib2-nossl. Yes, take note of the last one that provides the lib2 ABI but
|
||||||
|
that lacks the actual powers.
|
||||||
|
|
||||||
|
When libcurl is built and linked, it will be linked against a lib2 with the
|
||||||
|
set ABI.
|
||||||
|
|
||||||
|
When you link an app against libcurl, it would also need to provide one of
|
||||||
|
the (many) lib2 libs to decide what approach that fits the app. An app that
|
||||||
|
doesn't want SSL at all would still need to link with the lib2-nossl lib.
|
||||||
|
|
||||||
|
GPL apps can pick the lib2-gnutls, others may pick the lib2-openssl.
|
||||||
|
|
||||||
|
This concept works equally well both for shared and static libraries.
|
||||||
|
|
||||||
|
A positive side effect of this approach could be a more generic "de facto"
|
||||||
|
standard API for SSL/TLS libraries.
|
||||||
|
|
||||||
|
When Will This Happen
|
||||||
|
|
||||||
|
Note again that this is not a problem in curl, it doesn't solve any actual
|
||||||
|
technical problems in our project. Don't hold your breath for this to happen
|
||||||
|
very soon (if at all) unless you step forward and contribute.
|
||||||
|
|
||||||
|
The suggestion that is outlined above is still only a suggestion. Feel free
|
||||||
|
to bring a better idea!
|
||||||
|
|
||||||
|
Also, to keep in mind: I don't want this new concept to have too much of an
|
||||||
|
impact on the existing code. Preferably it should be possible to build the
|
||||||
|
code like today (without the use of lib2), should you decide to ignore the
|
||||||
|
problems outlined in this document.
|
||||||
|
|
||||||
|
Update: Work on this has been initiated by Richard Atterer:
|
||||||
|
|
||||||
|
http://curl.haxx.se/mail/lib-2005-09/0066.html
|
||||||
|
|
||||||
|
Footnotes
|
||||||
|
|
||||||
|
[1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6
|
||||||
|
[2] = http://www.fsf.org/licensing/essays/bsd.html
|
||||||
|
[3] = http://www.fsf.org/licensing/licenses/gpl.html
|
||||||
|
[4] = http://curl.haxx.se/docs/copyright.html
|
||||||
|
[5] = http://www.openssl.org/source/license.html
|
||||||
|
[6] = http://www.fsf.org/licensing/licenses/gpl.html end of section 3
|
||||||
|
[7] = http://www.fsf.org/licensing/licenses/lgpl.html
|
||||||
|
[8] = http://en.wikipedia.org/wiki/OpenSSL_exception
|
||||||
|
|
||||||
|
Feedback/Updates provided by
|
||||||
|
|
||||||
|
Eric Cooper
|
||||||
241
docs/FAQ
241
docs/FAQ
@@ -1,4 +1,4 @@
|
|||||||
Updated: December 21, 2004 (http://curl.haxx.se/docs/faq.html)
|
Updated: November 2, 2005 (http://curl.haxx.se/docs/faq.html)
|
||||||
_ _ ____ _
|
_ _ ____ _
|
||||||
___| | | | _ \| |
|
___| | | | _ \| |
|
||||||
/ __| | | | |_) | |
|
/ __| | | | |_) | |
|
||||||
@@ -16,6 +16,8 @@ FAQ
|
|||||||
1.6 What do you get for making curl?
|
1.6 What do you get for making curl?
|
||||||
1.7 What about CURL from curl.com?
|
1.7 What about CURL from curl.com?
|
||||||
1.8 I have a problem who do I mail?
|
1.8 I have a problem who do I mail?
|
||||||
|
1.9 Where do I buy commercial support for curl?
|
||||||
|
1.10 How many are using curl?
|
||||||
|
|
||||||
2. Install Related Problems
|
2. Install Related Problems
|
||||||
2.1 configure doesn't find OpenSSL even when it is installed
|
2.1 configure doesn't find OpenSSL even when it is installed
|
||||||
@@ -43,6 +45,7 @@ FAQ
|
|||||||
3.15 Can I do recursive fetches with curl?
|
3.15 Can I do recursive fetches with curl?
|
||||||
3.16 What certificates do I need when I use SSL?
|
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.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?
|
||||||
|
|
||||||
4. Running Problems
|
4. Running Problems
|
||||||
4.1 Problems connecting to SSL servers.
|
4.1 Problems connecting to SSL servers.
|
||||||
@@ -63,6 +66,8 @@ FAQ
|
|||||||
4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
|
4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
|
||||||
4.11 Why does my HTTP range requests return the full document?
|
4.11 Why does my HTTP range requests return the full document?
|
||||||
4.12 Why do I get "certificate verify failed" ?
|
4.12 Why do I get "certificate verify failed" ?
|
||||||
|
4.13 Why is curl -R on Windows one hour off?
|
||||||
|
4.14 Redirects work in browser but not with curl!
|
||||||
|
|
||||||
5. libcurl Issues
|
5. libcurl Issues
|
||||||
5.1 Is libcurl thread-safe?
|
5.1 Is libcurl thread-safe?
|
||||||
@@ -74,6 +79,9 @@ FAQ
|
|||||||
5.7 Link errors when building libcurl on Windows!
|
5.7 Link errors when building libcurl on Windows!
|
||||||
5.8 libcurl.so.3: open failed: No such file or directory
|
5.8 libcurl.so.3: open failed: No such file or directory
|
||||||
5.9 How does libcurl resolve host names?
|
5.9 How does libcurl resolve host names?
|
||||||
|
5.10 How do I prevent libcurl from writing the response to stdout?
|
||||||
|
5.11 How do I make libcurl not receive the whole HTTP response?
|
||||||
|
5.12 Can I make libcurl fake or hide my real IP address?
|
||||||
|
|
||||||
6. License Issues
|
6. License Issues
|
||||||
6.1 I have a GPL program, can I use the libcurl library?
|
6.1 I have a GPL program, can I use the libcurl library?
|
||||||
@@ -82,6 +90,7 @@ FAQ
|
|||||||
6.4 I have a program that uses LGPL libraries, can I use libcurl?
|
6.4 I have a program that uses LGPL libraries, can I use libcurl?
|
||||||
6.5 Can I modify curl/libcurl for my program and keep the changes secret?
|
6.5 Can I modify curl/libcurl for my program and keep the changes secret?
|
||||||
6.6 Can you please change the curl/libcurl license to XXXX?
|
6.6 Can you please change the curl/libcurl license to XXXX?
|
||||||
|
6.7 What are my obligations when using libcurl in my commerical apps?
|
||||||
|
|
||||||
7. PHP/CURL Issues
|
7. PHP/CURL Issues
|
||||||
7.1 What is PHP/CURL?
|
7.1 What is PHP/CURL?
|
||||||
@@ -97,7 +106,7 @@ FAQ
|
|||||||
cURL is the name of the project. The name is a play on 'Client for URLs',
|
cURL is the name of the project. The name is a play on 'Client for URLs',
|
||||||
originally with URL spelled in uppercase to make it obvious it deals with
|
originally with URL spelled in uppercase to make it obvious it deals with
|
||||||
URLs. The fact it can also be pronounced 'see URL' also helped, it works as
|
URLs. The fact it can also be pronounced 'see URL' also helped, it works as
|
||||||
an abbrivation for "Client URL Request Library" or why not the recursive
|
an abbreviation for "Client URL Request Library" or why not the recursive
|
||||||
version: "Curl URL Request Library".
|
version: "Curl URL Request Library".
|
||||||
|
|
||||||
The cURL project produces two products:
|
The cURL project produces two products:
|
||||||
@@ -105,7 +114,7 @@ FAQ
|
|||||||
libcurl
|
libcurl
|
||||||
|
|
||||||
A free and easy-to-use client-side URL transfer library, supporting FTP,
|
A free and easy-to-use client-side URL transfer library, supporting FTP,
|
||||||
FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and LDAP. libcurl supports
|
FTPS, HTTP, HTTPS, TELNET, DICT, FILE and LDAP. libcurl supports
|
||||||
HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP
|
HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP
|
||||||
form based upload, proxies, cookies, user+password authentication, file
|
form based upload, proxies, cookies, user+password authentication, file
|
||||||
transfer resume, http proxy tunneling and more!
|
transfer resume, http proxy tunneling and more!
|
||||||
@@ -123,16 +132,15 @@ FAQ
|
|||||||
A command line tool for getting or sending files using URL syntax.
|
A command line tool for getting or sending files using URL syntax.
|
||||||
|
|
||||||
Since curl uses libcurl, it supports a range of common Internet protocols,
|
Since curl uses libcurl, it supports a range of common Internet protocols,
|
||||||
currently including HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and
|
currently including HTTP, HTTPS, FTP, FTPS, LDAP, DICT, TELNET and FILE.
|
||||||
FILE.
|
|
||||||
|
|
||||||
We pronounce curl and cURL with an initial k sound: [kurl].
|
We pronounce curl and cURL with an initial k sound: [kurl].
|
||||||
|
|
||||||
NOTE: there are numerous sub-projects and related projects that also use the
|
There are numerous sub-projects and related projects that also use the word
|
||||||
word curl in the project names in various combinations, but you should take
|
curl in the project names in various combinations, but you should take
|
||||||
notice that this FAQ is directed at the command-line tool named curl (and
|
notice that this FAQ is directed at the command-line tool named curl (and
|
||||||
libcurl the library), and may therefore not be valid for other curl-related
|
libcurl the library), and may therefore not be valid for other curl-related
|
||||||
projects.
|
projects. (There is however a small section for the PHP/CURL in this FAQ.)
|
||||||
|
|
||||||
1.2 What is libcurl?
|
1.2 What is libcurl?
|
||||||
|
|
||||||
@@ -142,6 +150,10 @@ FAQ
|
|||||||
You can use libcurl for free in your application, be it open source,
|
You can use libcurl for free in your application, be it open source,
|
||||||
commercial or closed-source.
|
commercial or closed-source.
|
||||||
|
|
||||||
|
libcurl is most probably the most portable, most powerful and most often
|
||||||
|
used C-based multi-platform file transfer library on this planet - be it
|
||||||
|
open source or commercial.
|
||||||
|
|
||||||
1.3 What is curl not?
|
1.3 What is curl not?
|
||||||
|
|
||||||
Curl is *not* a wget clone. That is a common misconception. Never, during
|
Curl is *not* a wget clone. That is a common misconception. Never, during
|
||||||
@@ -193,15 +205,14 @@ FAQ
|
|||||||
|
|
||||||
1.5 Who makes curl?
|
1.5 Who makes curl?
|
||||||
|
|
||||||
curl and libcurl are not made by any single individual. Sure, Daniel
|
curl and libcurl are not made by any single individual. Daniel Stenberg is
|
||||||
Stenberg writes the major parts, but other persons' submissions are
|
project leader and main developer, but other persons' submissions are
|
||||||
important and crucial. Anyone can contribute and post their changes and
|
important and crucial. Anyone can contribute and post their changes and
|
||||||
improvements and have them inserted in the main sources (of course on the
|
improvements and have them inserted in the main sources (of course on the
|
||||||
condition that developers agree on that the fixes are good).
|
condition that developers agree on that the fixes are good).
|
||||||
|
|
||||||
The list of contributors in the docs/THANKS file is only a small part of all
|
The full list of the more than 450 contributors is found in the docs/THANKS
|
||||||
the people that every day provide us with bug reports, suggestions, ideas
|
file.
|
||||||
and source code.
|
|
||||||
|
|
||||||
curl is developed by a community, with Daniel at the wheel.
|
curl is developed by a community, with Daniel at the wheel.
|
||||||
|
|
||||||
@@ -216,12 +227,8 @@ FAQ
|
|||||||
have sponsored certain parts of the development in the past and I hope some
|
have sponsored certain parts of the development in the past and I hope some
|
||||||
will continue to do so in the future.
|
will continue to do so in the future.
|
||||||
|
|
||||||
If you want to support our project with a donation or similar, one way of
|
If you want to support our project, consider a donation or a banner-program
|
||||||
doing that would be to buy "gift certificates" at useful online shopping
|
or even better: by helping us coding, documenting, testing etc.
|
||||||
sites, such as amazon.com or thinkgeek.com. Another way would be to sponsor
|
|
||||||
us through a banner-program or even better: by helping us coding,
|
|
||||||
documenting, testing etc. You're welcome to send us a buck using paypal, as
|
|
||||||
described here: http://curl.haxx.se/donation.html
|
|
||||||
|
|
||||||
1.7 What about CURL from curl.com?
|
1.7 What about CURL from curl.com?
|
||||||
|
|
||||||
@@ -252,6 +259,58 @@ FAQ
|
|||||||
users thanks to the web based archives of the mailing lists), thus saving us
|
users thanks to the web based archives of the mailing lists), thus saving us
|
||||||
from having to repeat ourselves even more. Thanks for respecting this.
|
from having to repeat ourselves even more. Thanks for respecting this.
|
||||||
|
|
||||||
|
If you have found or simply suspect a security problem in curl or libcurl,
|
||||||
|
mail curl-security at haxx.se (closed list of receivers, mails are not
|
||||||
|
disclosed) and tell. Then we can produce a fix in a timely manner before the
|
||||||
|
flaw is announced to the world, thus lessen the impact the problem will have
|
||||||
|
on existing users.
|
||||||
|
|
||||||
|
1.9 Where do I buy commercial support for curl?
|
||||||
|
|
||||||
|
curl is fully open source. It means you can hire any skilled engineer to fix
|
||||||
|
your curl-related problems.
|
||||||
|
|
||||||
|
We list available alternatives on the curl web site:
|
||||||
|
http://curl.haxx.se/support.html
|
||||||
|
|
||||||
|
1.10 How many are using curl?
|
||||||
|
|
||||||
|
It is impossible to tell.
|
||||||
|
|
||||||
|
We don't know how many users that knowingly have installed and use curl.
|
||||||
|
|
||||||
|
We don't know how many users that use curl without knowing that they are in
|
||||||
|
fact using it.
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
curl packages have been downloaded from the curl.haxx.se site well over a
|
||||||
|
million times. curl is installed by default with most Linux
|
||||||
|
distributions. curl is installed by default with Mac OS X. curl and libcurl
|
||||||
|
as used by numerous applications that include libcurl binaries in their
|
||||||
|
distribution packages (like Adobe Acrobat Reader and Google Earth).
|
||||||
|
|
||||||
|
More than 40 known named companies use curl in commercial environments and
|
||||||
|
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.
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
2. Install Related Problems
|
2. Install Related Problems
|
||||||
|
|
||||||
@@ -296,8 +355,8 @@ FAQ
|
|||||||
|
|
||||||
2.2 Does curl work/build with other SSL libraries?
|
2.2 Does curl work/build with other SSL libraries?
|
||||||
|
|
||||||
Curl has been written to use OpenSSL, although there should not be much
|
Curl has been written to use OpenSSL or GnuTLS, although there should not be
|
||||||
problems using a different library. If anyone does "port" curl to use a
|
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
|
different SSL library, we are of course very interested in getting the
|
||||||
patch!
|
patch!
|
||||||
|
|
||||||
@@ -392,6 +451,8 @@ FAQ
|
|||||||
|
|
||||||
curl -L http://redirector.com
|
curl -L http://redirector.com
|
||||||
|
|
||||||
|
Not all redirects are HTTP ones, see 4.14
|
||||||
|
|
||||||
3.9 How do I use curl in my favorite programming language?
|
3.9 How do I use curl in my favorite programming language?
|
||||||
|
|
||||||
There exist many language interfaces/bindings for curl that integrates it
|
There exist many language interfaces/bindings for curl that integrates it
|
||||||
@@ -503,24 +564,26 @@ FAQ
|
|||||||
If the server doesn't require this, you don't need a client certificate.
|
If the server doesn't require this, you don't need a client certificate.
|
||||||
|
|
||||||
- Server certificate. The server you communicate with has a server
|
- Server certificate. The server you communicate with has a server
|
||||||
certificate. You can and should verify this certficate to make sure that
|
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
|
you are truly talking to the real server and not a server impersonating
|
||||||
it. The server certificate verifaction process is made by using a
|
it.
|
||||||
Certificate Authority certificate ("CA cert") that was used to sign the
|
|
||||||
server certificate. Server certificate verification is enabled by default
|
|
||||||
in curl and libcurl and is often the reason for problems as explained in
|
|
||||||
FAQ entry 4.12 and the SSLCERTS document
|
|
||||||
(http://curl.haxx.se/docs/sslcerts.html). Server certificates that are
|
|
||||||
"self-signed" or otherwise signed by a CA that you do not have a CA cert
|
|
||||||
for, cannot be verified. If the verification during a connect fails, you
|
|
||||||
are refused access. You then need to explicitly disable the verification
|
|
||||||
to connect to the server.
|
|
||||||
|
|
||||||
- Certificate Authority certificate ("CA cert"). You often have several CA
|
- 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
|
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
|
that was signed by one of the authorities in the bundle. curl comes with a
|
||||||
default CA cert bundle. You can override the default.
|
default CA cert bundle. You can 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
|
||||||
|
certificate. Server certificate verification is enabled by default in curl
|
||||||
|
and libcurl and is often the reason for problems as explained in FAQ entry
|
||||||
|
4.12 and the SSLCERTS document
|
||||||
|
(http://curl.haxx.se/docs/sslcerts.html). Server certificates that are
|
||||||
|
"self-signed" or otherwise signed by a CA that you do not have a CA cert
|
||||||
|
for, cannot be verified. If the verification during a connect fails, you
|
||||||
|
are refused access. You then need to explicitly disable the verification
|
||||||
|
to connect to the server.
|
||||||
|
|
||||||
3.17 How do I list the root dir of an FTP server?
|
3.17 How do I list the root dir of an FTP server?
|
||||||
|
|
||||||
There are two ways. The way defined in the RFC is to use an encoded slash
|
There are two ways. The way defined in the RFC is to use an encoded slash
|
||||||
@@ -533,6 +596,12 @@ FAQ
|
|||||||
|
|
||||||
curl ftp://ftp.sunet.se//tmp/
|
curl ftp://ftp.sunet.se//tmp/
|
||||||
|
|
||||||
|
3.18 Can I use curl to send a POST/PUT and not wait for a response?
|
||||||
|
|
||||||
|
No.
|
||||||
|
|
||||||
|
But you could easily write your own program using libcurl to do such stunts.
|
||||||
|
|
||||||
|
|
||||||
4. Running Problems
|
4. Running Problems
|
||||||
|
|
||||||
@@ -726,6 +795,28 @@ FAQ
|
|||||||
Details are also in the SSLCERTS file in the release archives, found online
|
Details are also in the SSLCERTS file in the release archives, found online
|
||||||
here: http://curl.haxx.se/docs/sslcerts.html
|
here: http://curl.haxx.se/docs/sslcerts.html
|
||||||
|
|
||||||
|
4.13 Why is curl -R on Windows one hour off?
|
||||||
|
|
||||||
|
During daylight savings time, when -R is used, curl will set a time that
|
||||||
|
appears one hour off. This happens due to a flaw in how Windows stores and
|
||||||
|
uses file modification times and it is not easily worked around. For details
|
||||||
|
on this problem, read this: http://www.codeproject.com/datetime/dstbugs.asp
|
||||||
|
|
||||||
|
4.14 Redirects work in browser but not with curl!
|
||||||
|
|
||||||
|
curl supports HTTP redirects fine (see item 3.8). Browsers generally support
|
||||||
|
at least two other ways to perform directs that curl does not:
|
||||||
|
|
||||||
|
- Meta tags. You can write a HTML tag that will cause the browser to
|
||||||
|
redirect to another given URL after a certain time.
|
||||||
|
|
||||||
|
- Javascript. You can write a javascript program embeded in a HTML page
|
||||||
|
that redirects the browser to another given URL.
|
||||||
|
|
||||||
|
There is no way to make curl follow these redirects. You must either
|
||||||
|
manually figure out what the page is set to do, or you write a script that
|
||||||
|
parses the results and fetches the new URL.
|
||||||
|
|
||||||
|
|
||||||
5. libcurl Issues
|
5. libcurl Issues
|
||||||
|
|
||||||
@@ -733,12 +824,20 @@ FAQ
|
|||||||
|
|
||||||
Yes.
|
Yes.
|
||||||
|
|
||||||
We have written the libcurl code specificly adjusted for multi-threaded
|
We have written the libcurl code specifically adjusted for multi-threaded
|
||||||
programs. libcurl will use thread-safe functions instead of non-safe ones if
|
programs. libcurl will use thread-safe functions instead of non-safe ones if
|
||||||
your system has such.
|
your system has such.
|
||||||
|
|
||||||
We would appreciate some kind of report or README file from those who have
|
If you use a OpenSSL-powered libcurl in a multi-threaded environment, you
|
||||||
used libcurl in a threaded environment.
|
need to provide one or two locking functions:
|
||||||
|
|
||||||
|
http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
|
||||||
|
|
||||||
|
If you use a GnuTLS-powered libcurl in a multi-threaded environment, you
|
||||||
|
need to provide locking function(s) for libgcrypt (which is used by GnuTLS
|
||||||
|
for the crypto functions).
|
||||||
|
|
||||||
|
http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
|
||||||
|
|
||||||
5.2 How can I receive all data into a large memory chunk?
|
5.2 How can I receive all data into a large memory chunk?
|
||||||
|
|
||||||
@@ -750,8 +849,8 @@ FAQ
|
|||||||
|
|
||||||
One solution to this problem could be to have a pointer to a struct that you
|
One solution to this problem could be to have a pointer to a struct that you
|
||||||
pass to the callback function. You set the pointer using the
|
pass to the callback function. You set the pointer using the
|
||||||
curl_easy_setopt(CURLOPT_FILE) function. Then that pointer will be passed to
|
CURLOPT_WRITEDATA option. Then that pointer will be passed to the callback
|
||||||
the callback instead of a FILE * to a file:
|
instead of a FILE * to a file:
|
||||||
|
|
||||||
/* imaginary struct */
|
/* imaginary struct */
|
||||||
struct MemoryStruct {
|
struct MemoryStruct {
|
||||||
@@ -858,7 +957,10 @@ FAQ
|
|||||||
|
|
||||||
5.9 How does libcurl resolve host names?
|
5.9 How does libcurl resolve host names?
|
||||||
|
|
||||||
libcurl includes a number of different name resolve functions:
|
libcurl supports a large a number of different name resolve functions. One
|
||||||
|
of them is picked at build-time and will be used unconditionally. Thus, if
|
||||||
|
you want to change name resolver function you must rebuild libcurl and tell
|
||||||
|
it to use a different function.
|
||||||
|
|
||||||
- The non-ipv6 resolver that can use one out of four host name resolve calls
|
- The non-ipv6 resolver that can use one out of four host name resolve calls
|
||||||
(depending on what your system supports):
|
(depending on what your system supports):
|
||||||
@@ -871,12 +973,43 @@ FAQ
|
|||||||
- The ipv6-resolver that uses getaddrinfo()
|
- The ipv6-resolver that uses getaddrinfo()
|
||||||
|
|
||||||
- The c-ares based name resolver that uses the c-ares library for resolves.
|
- 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.
|
||||||
|
|
||||||
- The Windows threaded resolver. It use:
|
- The Windows threaded resolver. It use:
|
||||||
|
|
||||||
A - gethostbyname() on plain ipv4 windows hosts
|
A - gethostbyname() on plain ipv4 windows hosts
|
||||||
B - getaddrinfo() on ipv6-enabled windows hosts
|
B - getaddrinfo() on ipv6-enabled windows hosts
|
||||||
|
|
||||||
|
Also note that libcurl never resolves or reverse-lookups addresses given as
|
||||||
|
pure numbers, such as 127.0.0.1 or ::1.
|
||||||
|
|
||||||
|
5.10 How do I prevent libcurl from writing the response to stdout?
|
||||||
|
|
||||||
|
libcurl provides a default built-in write function that writes received data
|
||||||
|
to stdout. Set the CURLOPT_WRITEFUNCTION to receive the data, or possibly
|
||||||
|
set CURLOPT_WRITEDATA to a different FILE * handle.
|
||||||
|
|
||||||
|
5.11 How do I make libcurl not receive the whole HTTP response?
|
||||||
|
|
||||||
|
You make the write callback (or progress callback) return an error and
|
||||||
|
libcurl will then abort the transfer.
|
||||||
|
|
||||||
|
5.12 Can I make libcurl fake or hide my real IP address?
|
||||||
|
|
||||||
|
No. libcurl operates on a higher level than so. Besides, faking IP address
|
||||||
|
would imply sending IP packages with a made-up source address, and then you
|
||||||
|
normally get a problem with intercepting the packages sent back as they
|
||||||
|
would then not be routed to you!
|
||||||
|
|
||||||
|
If you use a proxy to access remote sites, the sites will not see your local
|
||||||
|
IP address but instead the address of the proxy.
|
||||||
|
|
||||||
|
Also note that on many networks NATs or other IP-munging techniques are used
|
||||||
|
that makes you see and use a different IP address locally than what the
|
||||||
|
remote server will see you coming from.
|
||||||
|
|
||||||
|
|
||||||
6. License Issues
|
6. License Issues
|
||||||
|
|
||||||
Curl and libcurl are released under a MIT/X derivate license. The license is
|
Curl and libcurl are released under a MIT/X derivate license. The license is
|
||||||
@@ -884,6 +1017,9 @@ FAQ
|
|||||||
is just a brief summary for the cases we get the most questions. (Parts of
|
is just a brief summary for the cases we get the most questions. (Parts of
|
||||||
this section was much enhanced by Bjorn Reese.)
|
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.
|
||||||
|
|
||||||
6.1 I have a GPL program, can I use the libcurl library?
|
6.1 I have a GPL program, can I use the libcurl library?
|
||||||
|
|
||||||
Yes!
|
Yes!
|
||||||
@@ -928,13 +1064,38 @@ FAQ
|
|||||||
libraries that use it. It should be possible for everyone to use libcurl or
|
libraries that use it. It should be possible for everyone to use libcurl or
|
||||||
curl in their projects, no matter what license they already have in use.
|
curl in their projects, no matter what license they already have in use.
|
||||||
|
|
||||||
|
6.7 What are my obligations when using libcurl in my commerical apps?
|
||||||
|
|
||||||
|
Next to none. All you need to adhere to is the MIT-style license (stated in
|
||||||
|
the COPYING file) which basically says you have to include the copyright
|
||||||
|
notice in "all copies" and that you may not use the copyright holder's name
|
||||||
|
when promoting your software.
|
||||||
|
|
||||||
|
You do not have to release any of your source code.
|
||||||
|
|
||||||
|
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
|
||||||
|
your app.
|
||||||
|
|
||||||
|
As can be seen here: http://curl.haxx.se/docs/companies.html and
|
||||||
|
elsewhere, more and more companies are dicovering the power
|
||||||
|
of libcurl and take advantage of it even in commercial environments.
|
||||||
|
|
||||||
|
|
||||||
7. PHP/CURL Issues
|
7. PHP/CURL Issues
|
||||||
|
|
||||||
7.1 What is PHP/CURL?
|
7.1 What is PHP/CURL?
|
||||||
|
|
||||||
The module for PHP that makes it possible for PHP programs to access curl-
|
The module for PHP that makes it possible for PHP programs to access curl-
|
||||||
functions from within PHP. We often call it PHP/CURL to differentiate from
|
functions from within PHP.
|
||||||
curl the command line tool and libcurl the library.
|
|
||||||
|
In the cURL project we call this module PHP/CURL to differentiate it from
|
||||||
|
curl the command line tool and libcurl the library. The PHP team however
|
||||||
|
does not refer to it like this (for unknown reasons). They call it plain
|
||||||
|
CURL (often using all caps) which causes much confusion to users which in
|
||||||
|
turn gives us a higher question load.
|
||||||
|
|
||||||
7.2 Who write PHP/CURL?
|
7.2 Who write PHP/CURL?
|
||||||
|
|
||||||
|
|||||||
@@ -62,11 +62,11 @@ HTTP
|
|||||||
|
|
||||||
HTTPS (*1)
|
HTTPS (*1)
|
||||||
- (all the HTTP features)
|
- (all the HTTP features)
|
||||||
- using certificates
|
- using client certificates
|
||||||
- verify server certificate
|
- verify server certificate
|
||||||
- via http-proxy
|
- via http-proxy
|
||||||
- select desired encryption
|
- select desired encryption
|
||||||
- force usage of a specific SSL version (SSLv2, SSLv3 or TLSv1)
|
- force usage of a specific SSL version (SSLv2(*7), SSLv3 or TLSv1)
|
||||||
|
|
||||||
FTP
|
FTP
|
||||||
- download
|
- download
|
||||||
@@ -95,6 +95,9 @@ FTPS (*1)
|
|||||||
- implicit "AUTH TSL" and "AUTH SSL" usage to "upgrade" plain ftp://
|
- implicit "AUTH TSL" and "AUTH SSL" usage to "upgrade" plain ftp://
|
||||||
connection to use SSL for both or one of the connections
|
connection to use SSL for both or one of the connections
|
||||||
|
|
||||||
|
TFTP
|
||||||
|
- download / upload
|
||||||
|
|
||||||
TELNET
|
TELNET
|
||||||
- connection negotiation
|
- connection negotiation
|
||||||
- custom telnet options
|
- custom telnet options
|
||||||
@@ -106,10 +109,6 @@ LDAP (*2)
|
|||||||
DICT
|
DICT
|
||||||
- extended DICT URL support
|
- extended DICT URL support
|
||||||
|
|
||||||
GOPHER
|
|
||||||
- GET
|
|
||||||
- via http-proxy
|
|
||||||
|
|
||||||
FILE
|
FILE
|
||||||
- URL support
|
- URL support
|
||||||
- "uploads"
|
- "uploads"
|
||||||
@@ -118,9 +117,10 @@ FILE
|
|||||||
FOOTNOTES
|
FOOTNOTES
|
||||||
=========
|
=========
|
||||||
|
|
||||||
*1 = requires OpenSSL
|
*1 = requires OpenSSL or GnuTLS
|
||||||
*2 = requires OpenLDAP
|
*2 = requires OpenLDAP
|
||||||
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
||||||
*4 = requires FBopenssl
|
*4 = requires FBopenssl
|
||||||
*5 = requires a krb4 library, such as the MIT one or similar.
|
*5 = requires a krb4 library, such as the MIT one or similar.
|
||||||
*6 = requires c-ares
|
*6 = requires c-ares
|
||||||
|
*7 = requires OpenSSL specificly, as GnuTLS only supports SSLv3 and TLSv1
|
||||||
|
|||||||
12
docs/HISTORY
12
docs/HISTORY
@@ -114,6 +114,8 @@ distributions and otherwise retrieved as part of other software.
|
|||||||
September 2002, with the release of curl 7.10 it is released under the MIT
|
September 2002, with the release of curl 7.10 it is released under the MIT
|
||||||
license only.
|
license only.
|
||||||
|
|
||||||
|
January 2003. Started working on the distributed curl tests. The autobuilds.
|
||||||
|
|
||||||
February 2003, the curl site averages at 20000 visits weekly. At any given
|
February 2003, the curl site averages at 20000 visits weekly. At any given
|
||||||
moment, there's an average of 3 people browsing the curl.haxx.se site.
|
moment, there's an average of 3 people browsing the curl.haxx.se site.
|
||||||
|
|
||||||
@@ -139,3 +141,13 @@ August 2004:
|
|||||||
Number of public functions in libcurl: 36
|
Number of public functions in libcurl: 36
|
||||||
Amount of public web site mirrors: 12
|
Amount of public web site mirrors: 12
|
||||||
Number of known libcurl bindings: 26
|
Number of known libcurl bindings: 26
|
||||||
|
|
||||||
|
April 2005:
|
||||||
|
|
||||||
|
GnuTLS can now optionally be used for the secure layer when curl is built.
|
||||||
|
|
||||||
|
September 2005:
|
||||||
|
|
||||||
|
TFTP support was added.
|
||||||
|
|
||||||
|
More than 100,000 unique visitors of the curl web site. 25 mirrors.
|
||||||
|
|||||||
296
docs/INSTALL
296
docs/INSTALL
@@ -132,172 +132,150 @@ UNIX
|
|||||||
Win32
|
Win32
|
||||||
=====
|
=====
|
||||||
|
|
||||||
Without SSL:
|
MingW32
|
||||||
|
-------
|
||||||
|
|
||||||
MingW32 (GCC-2.95) style
|
Run the 'mingw32.bat' file to get the proper environment variables set,
|
||||||
------------------------
|
then run 'make mingw32' in the root dir. Use 'make mingw32-ssl' to build
|
||||||
Run the 'mingw32.bat' file to get the proper environment variables
|
curl SSL enabled.
|
||||||
set, then run 'make mingw32' in the root dir.
|
|
||||||
|
|
||||||
If you have any problems linking libraries or finding header files, be
|
If you have any problems linking libraries or finding header files, be sure
|
||||||
sure to verify that the provided "Makefile.m32" files use the proper
|
to verify that the provided "Makefile.m32" files use the proper paths, and
|
||||||
paths, and adjust as necessary.
|
adjust as necessary.
|
||||||
|
|
||||||
Cygwin style
|
Cygwin
|
||||||
------------
|
------
|
||||||
Almost identical to the unix installation. Run the configure script in
|
|
||||||
the curl root with 'sh configure'. Make sure you have the sh
|
|
||||||
executable in /bin/ or you'll see the configure fail towards the end.
|
|
||||||
|
|
||||||
Run 'make'
|
Almost identical to the unix installation. Run the configure script in the
|
||||||
|
curl root with 'sh configure'. Make sure you have the sh executable in
|
||||||
|
/bin/ or you'll see the configure fail towards the end.
|
||||||
|
|
||||||
Microsoft command line style
|
Run 'make'
|
||||||
----------------------------
|
|
||||||
Run the 'vcvars32.bat' file to get the proper environment variables
|
|
||||||
set, then run 'nmake vc' in the root dir.
|
|
||||||
|
|
||||||
The vcvars32.bat file is part of the Microsoft development
|
Dev-Cpp
|
||||||
environment.
|
-------
|
||||||
|
|
||||||
IDE-style
|
See the separate INSTALL.devcpp file for details.
|
||||||
-------------------------
|
|
||||||
If you use VC++, Borland or similar compilers. Include all lib source
|
|
||||||
files in a static lib "project" (all .c and .h files that is).
|
|
||||||
(you should name it libcurl or similar)
|
|
||||||
|
|
||||||
Make the sources in the src/ drawer be a "win32 console application"
|
MSVC from command line
|
||||||
project. Name it curl.
|
----------------------
|
||||||
|
|
||||||
For VC++ 6, there's an included Makefile.vc6 that should be possible
|
Run the 'vcvars32.bat' file to get a proper environment. The
|
||||||
to use out-of-the-box.
|
vcvars32.bat file is part of the Microsoft development environment and
|
||||||
|
you may find it in 'C:\Program Files\Microsoft Visual Studio\vc98\bin'
|
||||||
|
provided that you installed Visual C/C++ 6 in the default directory.
|
||||||
|
|
||||||
|
Then run 'nmake vc' in curl's root directory.
|
||||||
|
|
||||||
|
If you want to compile with zlib support, you will need to build
|
||||||
|
zlib (http://www.gzip.org/zlib/) as well. Please read the zlib
|
||||||
|
documentation on how to compile zlib. Define the ZLIB_PATH environment
|
||||||
|
variable to the location of zlib.h and zlib.lib, for example:
|
||||||
|
|
||||||
|
set ZLIB_PATH=c:\zlib-1.2.1
|
||||||
|
|
||||||
|
Then run 'nmake vc-zlib' in curl's root directory.
|
||||||
|
|
||||||
|
If you want to compile with SSL support you need the OpenSSL package.
|
||||||
|
Please read the OpenSSL documentation on how to compile and install
|
||||||
|
the OpenSSL libraries. The build process of OpenSSL generates the
|
||||||
|
libeay32.dll and ssleay32.dll files in the out32dll subdirectory in
|
||||||
|
the OpenSSL home directory. OpenSSL static libraries (libeay32.lib,
|
||||||
|
ssleay32.lib, RSAglue.lib) are created in the out32 subdirectory.
|
||||||
|
|
||||||
|
Before running nmake define the OPENSSL_PATH environment variable with
|
||||||
|
the root/base directory of OpenSSL, for example:
|
||||||
|
|
||||||
|
set OPENSSL_PATH=c:\openssl-0.9.7d
|
||||||
|
|
||||||
|
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
|
||||||
|
libraries in the lib subdirectory, as well as a statically linked
|
||||||
|
version of curl.exe in the src subdirectory. This statically linked
|
||||||
|
version is a standalone executable not requiring any DLL at
|
||||||
|
runtime. This make method requires that you have the static OpenSSL
|
||||||
|
libraries available in OpenSSL's out32 subdirectory.
|
||||||
|
'nmake vc-ssl-dll' creates the libcurl dynamic library and
|
||||||
|
links curl.exe against libcurl and OpenSSL dynamically.
|
||||||
|
This executable requires libcurl.dll and the OpenSSL DLLs
|
||||||
|
at runtime.
|
||||||
|
Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support.
|
||||||
|
|
||||||
|
Borland C++ compiler
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
compile openssl
|
||||||
|
|
||||||
|
Make sure you include the paths to curl/include and openssl/inc32 in
|
||||||
|
your bcc32.cnf file
|
||||||
|
|
||||||
|
eg : -I"c:\Bcc55\include;c:\path_curl\include;c:\path_openssl\inc32"
|
||||||
|
|
||||||
|
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.)
|
||||||
|
|
||||||
|
Make sure the environment variable "BCCDIR" is set to the install
|
||||||
|
location for the compiler eg : c:\Borland\BCC55
|
||||||
|
|
||||||
|
command line:
|
||||||
|
make -f /path_to_curl/lib/Makefile-ssl.b32
|
||||||
|
|
||||||
|
compile simplessl.c with appropriate links
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
With SSL:
|
MSVC IDE
|
||||||
|
--------
|
||||||
|
|
||||||
MingW32 (GCC-2.95) style
|
If you use VC++, Borland or similar compilers. Include all lib source
|
||||||
------------------------
|
files in a static lib "project" (all .c and .h files that is).
|
||||||
Run the 'mingw32.bat' file to get the proper environment variables
|
(you should name it libcurl or similar)
|
||||||
set, then run 'make mingw32-ssl' in the root dir.
|
|
||||||
|
|
||||||
If you have any problems linking libraries or finding header files, be
|
Make the sources in the src/ drawer be a "win32 console application"
|
||||||
sure to look at the provided "Makefile.m32" files for the proper
|
project. Name it curl.
|
||||||
paths, and adjust as necessary.
|
|
||||||
|
|
||||||
Cygwin style
|
For VC++ 6, there's an included Makefile.vc6 that should be possible
|
||||||
------------
|
to use out-of-the-box.
|
||||||
Haven't done, nor got any reports on how to do. It should although be
|
|
||||||
identical to the unix setup for the same purpose. See above.
|
|
||||||
|
|
||||||
Microsoft command line style
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
Run the 'vcvars32.bat' file to get a proper environment. The
|
|
||||||
vcvars32.bat file is part of the Microsoft development environment and
|
|
||||||
you may find it in 'C:\Program Files\Microsoft Visual Studio\vc98\bin'
|
|
||||||
provided that you installed Visual C/C++ 6 in the default directory.
|
|
||||||
|
|
||||||
Then run 'nmake vc' in curl's root directory.
|
|
||||||
|
|
||||||
If you want to compile with zlib support, you will need to build
|
|
||||||
zlib (http://www.gzip.org/zlib/) as well. Please read the zlib
|
|
||||||
documentation on how to compile zlib. Define the ZLIB_PATH environment
|
|
||||||
variable to the location of zlib.h and zlib.lib, for example:
|
|
||||||
|
|
||||||
set ZLIB_PATH=c:\zlib-1.2.1
|
|
||||||
|
|
||||||
Then run 'nmake vc-zlib' in curl's root directory.
|
|
||||||
|
|
||||||
If you want to compile with SSL support you need the OpenSSL package.
|
|
||||||
Please read the OpenSSL documentation on how to compile and install
|
|
||||||
the OpenSSL libraries. The build process of OpenSSL generates the
|
|
||||||
libeay32.dll and ssleay32.dll files in the out32dll subdirectory in
|
|
||||||
the OpenSSL home directory. OpenSSL static libraries (libeay32.lib,
|
|
||||||
ssleay32.lib, RSAglue.lib) are created in the out32 subdirectory.
|
|
||||||
|
|
||||||
Before running nmake define the OPENSSL_PATH environment variable with
|
|
||||||
the root/base directory of OpenSSL, for example:
|
|
||||||
|
|
||||||
set OPENSSL_PATH=c:\openssl-0.9.7d
|
|
||||||
|
|
||||||
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
|
|
||||||
libraries in the lib subdirectory, as well as a statically linked
|
|
||||||
version of curl.exe in the src subdirectory. This statically linked
|
|
||||||
version is a standalone executable not requiring any DLL at
|
|
||||||
runtime. This make method requires that you have the static OpenSSL
|
|
||||||
libraries available in OpenSSL's out32 subdirectory.
|
|
||||||
'nmake vc-ssl-dll' creates the libcurl dynamic library and
|
|
||||||
links curl.exe against libcurl and OpenSSL dynamically.
|
|
||||||
This executable requires libcurl.dll and the OpenSSL DLLs
|
|
||||||
at runtime.
|
|
||||||
Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support.
|
|
||||||
|
|
||||||
Microsoft / Borland style
|
|
||||||
-------------------------
|
|
||||||
If you have OpenSSL, and want curl to take advantage of it, edit your
|
|
||||||
project properties to use the SSL include path, link with the SSL libs
|
|
||||||
and define the USE_SSLEAY symbol.
|
|
||||||
|
|
||||||
Using Borland C++ compiler version 5.5.1 (available as free download
|
|
||||||
from Borland's site)
|
|
||||||
---------------------------------------------------------------------
|
|
||||||
|
|
||||||
compile openssl
|
|
||||||
|
|
||||||
Make sure you include the paths to curl/include and openssl/inc32 in
|
|
||||||
your bcc32.cnf file
|
|
||||||
|
|
||||||
|
|
||||||
eg : -I"c:\Bcc55\include;c:\path_curl\include;c:\path_openssl\inc32"
|
Disabling Specific Protocols in Win32 builds
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
Check to make sure that all of the sources listed in lib/Makefile.b32
|
The configure utility, unfortunately, is not available for the Windows
|
||||||
are present in the /path_to_curl/lib directory. (Check the src
|
environment, therefore, you cannot use the various disable-protocol
|
||||||
directory for missing ones.)
|
options of the configure utility on this platform.
|
||||||
|
|
||||||
Make sure the environment variable "BCCDIR" is set to the install
|
However, you can use the following defines to disable specific
|
||||||
location for the compiler eg : c:\Borland\BCC55
|
protocols:
|
||||||
|
|
||||||
command line:
|
HTTP_ONLY disables all protocols except HTTP
|
||||||
make -f /path_to_curl/lib/Makefile-ssl.b32
|
CURL_DISABLE_FTP disables FTP
|
||||||
|
CURL_DISABLE_LDAP disables LDAP
|
||||||
|
CURL_DISABLE_TELNET disables TELNET
|
||||||
|
CURL_DISABLE_DICT disables DICT
|
||||||
|
CURL_DISABLE_FILE disables FILE
|
||||||
|
|
||||||
compile simplessl.c with appropriate links
|
If you want to set any of these defines you have the following
|
||||||
|
possibilities:
|
||||||
|
|
||||||
c:\curl\docs\examples\> bcc32 -L c:\path_to_curl\lib\libcurl.lib
|
- Modify lib/setup.h
|
||||||
-L c:\borland\bcc55\lib\psdk\ws2_32.lib
|
- Modify lib/Makefile.vc6
|
||||||
-L c:\openssl\out32\libeay32.lib
|
- Add defines to Project/Settings/C/C++/General/Preprocessor Definitions
|
||||||
-L c:\openssl\out32\ssleay32.lib
|
in the curllib.dsw/curllib.dsp Visual C++ 6 IDE project.
|
||||||
simplessl.c
|
|
||||||
|
|
||||||
Disabling Specific Protocols:
|
|
||||||
|
|
||||||
The configure utility, unfortunately, is not available for the Windows
|
|
||||||
environment, therefore, you cannot use the various disable-protocol
|
|
||||||
options of the configure utility on this platform.
|
|
||||||
|
|
||||||
However, you can use the following defines to disable specific
|
|
||||||
protocols:
|
|
||||||
|
|
||||||
HTTP_ONLY disables all protocols except HTTP
|
|
||||||
CURL_DISABLE_FTP disables FTP
|
|
||||||
CURL_DISABLE_LDAP disables LDAP
|
|
||||||
CURL_DISABLE_TELNET disables TELNET
|
|
||||||
CURL_DISABLE_DICT disables DICT
|
|
||||||
CURL_DISABLE_FILE disables FILE
|
|
||||||
CURL_DISABLE_GOPHER disables GOPHER
|
|
||||||
|
|
||||||
If you want to set any of these defines you have the following
|
|
||||||
possibilities:
|
|
||||||
|
|
||||||
- Modify lib/setup.h
|
|
||||||
- Modify lib/Makefile.vc6
|
|
||||||
- Add defines to Project/Settings/C/C++/General/Preprocessor Definitions
|
|
||||||
in the curllib.dsw/curllib.dsp Visual C++ 6 IDE project.
|
|
||||||
|
|
||||||
|
|
||||||
Important (with SSL or not):
|
Important static libcurl usage note
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
|
||||||
IBM OS/2
|
IBM OS/2
|
||||||
@@ -462,21 +440,19 @@ NetWare
|
|||||||
- optional zlib sources (at the moment only dynamic linking with zlib.imp);
|
- optional zlib sources (at the moment only dynamic linking with zlib.imp);
|
||||||
sources with NetWare Makefile can be obtained from:
|
sources with NetWare Makefile can be obtained from:
|
||||||
http://www.gknw.com/mirror/zlib/
|
http://www.gknw.com/mirror/zlib/
|
||||||
|
- optional OpenSSL sources (version 0.9.8 or later which builds with BSD);
|
||||||
|
|
||||||
Set a search path to your compiler, linker and tools; if you want to have
|
Set a search path to your compiler, linker and tools; on Linux make
|
||||||
zlib support then set the environment var ZLIB_PATH pointing to your zlib
|
sure that the var OSTYPE contains the string 'linux'; and then type
|
||||||
sources, on Linux make sure the var OSTYPE contains the string 'linux';
|
'make netware' from the top source directory; other tagets available
|
||||||
and finally type 'make netware' from the top source directory...
|
are 'netware-ssl', 'netware-ssl-zlib', 'netware-zlib' and 'netware-ares';
|
||||||
I found on some Linux systems (RH9) that OS detection didnlt work although
|
if you need other combinations you can control the build with the
|
||||||
|
environment variables WITH_SSL, WITH_ZLIB, WITH_ARES and ENABLE_IPV6.
|
||||||
|
I found on some Linux systems (RH9) that OS detection didnt work although
|
||||||
a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it
|
a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it
|
||||||
with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...;
|
with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...
|
||||||
other options are currently not supported, although partly prepared.
|
|
||||||
The Ares lib builds arlready fine, and both test tools work fine at least
|
|
||||||
when build with CodeWarrior...; don't know yet why they fail when build with
|
|
||||||
gcc though; if you want to compile with Ares support then set an env var
|
|
||||||
WITH_ARES=1; I've not tested yet including libares into curl.
|
|
||||||
Any help in testing appreciated!
|
Any help in testing appreciated!
|
||||||
Builds automatically created 4 times a day from current CVS are here:
|
Builds automatically created 8 times a day from current CVS are here:
|
||||||
http://www.gknw.com/mirror/curl/autobuilds/
|
http://www.gknw.com/mirror/curl/autobuilds/
|
||||||
the status of these builds can be viewed at the autobuild table:
|
the status of these builds can be viewed at the autobuild table:
|
||||||
http://curl.haxx.se/auto/
|
http://curl.haxx.se/auto/
|
||||||
@@ -578,17 +554,17 @@ PORTS
|
|||||||
- MIPS IRIX 6.2, 6.5
|
- MIPS IRIX 6.2, 6.5
|
||||||
- MIPS Linux
|
- MIPS Linux
|
||||||
- Pocket PC/Win CE 3.0
|
- Pocket PC/Win CE 3.0
|
||||||
- Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1
|
- Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2
|
||||||
- PowerPC Darwin 1.0
|
- PowerPC Darwin 1.0
|
||||||
- PowerPC Linux
|
- PowerPC Linux
|
||||||
- PowerPC Mac OS 9
|
- PowerPC Mac OS 9
|
||||||
- PowerPC Mac OS X
|
- PowerPC Mac OS X
|
||||||
- SINIX-Z v5
|
- SINIX-Z v5
|
||||||
- Sparc Linux
|
- Sparc Linux
|
||||||
- Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8
|
- Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10
|
||||||
- Sparc SunOS 4.1.X
|
- Sparc SunOS 4.1.X
|
||||||
- StrongARM (and other ARM) RISC OS 3.1, 4.02
|
- StrongARM (and other ARM) RISC OS 3.1, 4.02
|
||||||
- StrongARM Linux 2.4
|
- StrongARM/ARM7/ARM9 Linux 2.4, 2.6
|
||||||
- StrongARM NetBSD 1.4.1
|
- StrongARM NetBSD 1.4.1
|
||||||
- Ultrix 4.3a
|
- Ultrix 4.3a
|
||||||
- i386 BeOS
|
- i386 BeOS
|
||||||
@@ -596,14 +572,14 @@ PORTS
|
|||||||
- i386 Esix 4.1
|
- i386 Esix 4.1
|
||||||
- i386 FreeBSD
|
- i386 FreeBSD
|
||||||
- i386 HURD
|
- i386 HURD
|
||||||
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4
|
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6
|
||||||
- i386 NetBSD
|
- i386 NetBSD
|
||||||
- i386 Novell NetWare
|
- i386 Novell NetWare
|
||||||
- i386 OS/2
|
- i386 OS/2
|
||||||
- i386 OpenBSD
|
- i386 OpenBSD
|
||||||
- i386 SCO unix
|
- i386 SCO unix
|
||||||
- i386 Solaris 2.7
|
- i386 Solaris 2.7
|
||||||
- i386 Windows 95, 98, ME, NT, 2000
|
- i386 Windows 95, 98, ME, NT, 2000, XP, 2003
|
||||||
- i386 QNX 6
|
- i386 QNX 6
|
||||||
- i486 ncr-sysv4.3.03 (NCR MP-RAS)
|
- i486 ncr-sysv4.3.03 (NCR MP-RAS)
|
||||||
- ia64 Linux 2.3.99
|
- ia64 Linux 2.3.99
|
||||||
|
|||||||
302
docs/INSTALL.devcpp
Normal file
302
docs/INSTALL.devcpp
Normal file
@@ -0,0 +1,302 @@
|
|||||||
|
DevCpp-Mingw Install & Compilation Sept 2005
|
||||||
|
==================================
|
||||||
|
|
||||||
|
Reference Emails available at curl@haxx.se:
|
||||||
|
|
||||||
|
Libcurl Install and Use Issues
|
||||||
|
Awaiting an Answer for Win 32 Install
|
||||||
|
res = curl_easy_perform(curl); Error
|
||||||
|
Makefile Issues
|
||||||
|
|
||||||
|
|
||||||
|
Having previously done a thorough review of what was available that met my
|
||||||
|
requirements under GPL, I settled for Libcurl as the software of choice for
|
||||||
|
many reasons not the least of which was the support.
|
||||||
|
|
||||||
|
Background
|
||||||
|
----------
|
||||||
|
|
||||||
|
This quest started when I innocently tried to incorporate the libcurl library
|
||||||
|
into my simple source code. I figured that a few easy steps would accomplish
|
||||||
|
this without major headaches. I had no idea that I would be facing an almost
|
||||||
|
insurmountable challenge.
|
||||||
|
|
||||||
|
The main problem lies in two areas. First the bulk of support for libcurl
|
||||||
|
exists for a Unix/linux command line environments. This is of little help when
|
||||||
|
it comes to Windows O/S.
|
||||||
|
|
||||||
|
Secondly the help that does exist for the Windows O/S focused around mingw
|
||||||
|
thru a command line argument environment.
|
||||||
|
|
||||||
|
You may ask "Why is this a problem?"
|
||||||
|
|
||||||
|
I'm using a Windows O/S with DevCpp. For those of you who are unfamiliar with
|
||||||
|
DevCpp, it is a window shell GUI that replaces the command line environment
|
||||||
|
for gcc. A definite improvement that I am unwilling to give up. However using
|
||||||
|
DevCpp presented its own set of issues. Inadvertently I also made some
|
||||||
|
careless errors such as compiling the 7.14 version of Makefile with an older
|
||||||
|
version of source code. Thanks to Dan Fandrich for picking this up.
|
||||||
|
|
||||||
|
I did eventually with the help of Daniel, Phillipe and others manage to
|
||||||
|
implement successfully (the only mingw available version)
|
||||||
|
curl-7.13.0-win32-ssl-devel-mingw32 into the DevCpp environment. Only the
|
||||||
|
dynamic libcurl.dll libcurldll.a libraries worked. The static library which I
|
||||||
|
was interested in did not. Furthermore when I tried to implement one of the
|
||||||
|
examples included with the curl package (get info.c) it caused the executable
|
||||||
|
to crash. Tracing the bug I found it in the code and function res =
|
||||||
|
curl_easy_perform(curl);.
|
||||||
|
|
||||||
|
At this point I had to make a choice as to whether invest my limited
|
||||||
|
time-energy resource to fixing the bug or to compile the new version
|
||||||
|
available. After searching the archives I found a very similar or the same bug
|
||||||
|
reported from version 7.12x on. Daniel did inform me that he thought that this
|
||||||
|
bug had been fixed with the latest version. So I proceeded to compile the
|
||||||
|
latest SSL version where I faced other challenges.
|
||||||
|
|
||||||
|
In order to make this process unremarkable for others using the same
|
||||||
|
environment I decided to document the process so that others will find it
|
||||||
|
routine. It would be a shame if newbies could not implement this excellent
|
||||||
|
package for their use.
|
||||||
|
|
||||||
|
I would like to thank the many others in this forum and in the DevCpp forum
|
||||||
|
for their help. Without your help I may either have given up or it would have
|
||||||
|
taken me many times longer to achieve success.
|
||||||
|
|
||||||
|
The Cookbook Approach
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
This discussion will be confined to a SSL static library compilation and
|
||||||
|
installation. Limited mention and comments will be inserted where appropriate
|
||||||
|
to help with non-SSL, dynamic libraries and executables.
|
||||||
|
|
||||||
|
|
||||||
|
Using Makefile from DevCpp to compile Libcurl libraries
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
--------
|
||||||
|
|
||||||
|
Using the latest version release - curl-7.14.0.tar.gz. Curl source code is
|
||||||
|
platform independent. This simply means that the source code can be compiled
|
||||||
|
for any Operating System (Linux/Unix Windows etc. and variations of thereof).
|
||||||
|
|
||||||
|
The first thing to note is that inside curl-7.14.0 you will find two folders
|
||||||
|
lib and src. Both contain Makefile.m32 (required for win mingw library or exe
|
||||||
|
compilation) files which are different. The main difference between these two
|
||||||
|
folders and the makefiles is that the src folder contents are used to compile
|
||||||
|
an executable file(curl.exe) while the lib folder contents are used to compile
|
||||||
|
a static (libcurl.a) and dynamic (libcurl.dll & libcurldll.a) file that can be
|
||||||
|
used to compile libcurl with your own source code so that one can use and
|
||||||
|
access all libcurl functions.
|
||||||
|
|
||||||
|
Before we start please make sure that DevCpp is installed properly. In
|
||||||
|
particular make sure you have no spaces in the name of any of the directories
|
||||||
|
and subdirectories where DevCpp is installed. Failure to comply with the
|
||||||
|
install instructions may produce erratic behaviour in DevCpp. For further info
|
||||||
|
check the following sites
|
||||||
|
|
||||||
|
http://aditsu.freeunixhost.com/dev-cpp-faq.html
|
||||||
|
http://sourceforge.net/forum/message.php?msg_id=3252213
|
||||||
|
|
||||||
|
As I have mentioned before I will confine this to the SSL Library compilations
|
||||||
|
but the process is very similar for compilation of the executable - curl.exe;
|
||||||
|
just substitute the src folder makefile in its stead.
|
||||||
|
|
||||||
|
First use a text processor Notepad, or your own favourite text processor. To
|
||||||
|
engage your favourite text processor, select Makefile.m32 click once with your
|
||||||
|
mouse on file icon; icon turns blue, press the shift key and right-click on
|
||||||
|
mouse, menu appears select "Open with", select your favourite text processor.
|
||||||
|
|
||||||
|
Next read the contents of Makefile.m32. It includes instructions on its use.
|
||||||
|
|
||||||
|
Method I - DOS Command Line
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Note - The only reason I have included this method is that Method II which is
|
||||||
|
the preferred method for compiling does not allow for the setting of option
|
||||||
|
switches (e.g. SSL = 1 or SSL =0). At least that's what they tell me at the
|
||||||
|
Dev-Cpp forum.
|
||||||
|
|
||||||
|
1 - Make a copy of (D:\Dev-Cpp\bin) bin folder and name it "bin Original"
|
||||||
|
place it in the Dev-Cpp installed directory (D:\Dev-Cpp\ for this example)
|
||||||
|
|
||||||
|
2 - Copy the entire contents of the LIB folder of curl-7.14.0.tar.gz or zip
|
||||||
|
version into the bin folder above (D:\Dev-Cpp\bin). The reason being is that
|
||||||
|
the make.exe file resides in this folder. Make.exe will use - Makefile.m32,
|
||||||
|
Makefile.inc, and the source code included in the lib folder to compile the
|
||||||
|
source code. There is a PATH issue with make.exe that remains unresolved at
|
||||||
|
least for me. Unless the entire source code to be compiled is placed entirely
|
||||||
|
within the directory of make.exe an error message will be generated - "file
|
||||||
|
xxxx.yyy not available".
|
||||||
|
|
||||||
|
3- Go to Dev-Cpp\bin and double click on make .exe. You will see a DOS window
|
||||||
|
quickly pop up and close very quickly. Not to worry! Please do not skip this
|
||||||
|
step.
|
||||||
|
|
||||||
|
4- Click on the start button\Programs\MS-DOS Prompt.Once the DOS Window is up
|
||||||
|
Type the disk drive letter (e.g. E: ) engage the enter button. The path should
|
||||||
|
automatically take you to the directory of the make.exe file.
|
||||||
|
|
||||||
|
5- To compile the source code simply type at the DOS prompt make -f
|
||||||
|
Makefile.m32 as per instructions contained in the Makefile.m32 file (use any
|
||||||
|
text processor to read instructions). I don't believe that this makefile
|
||||||
|
allows for the option of non SSL. Ignore any warnings.
|
||||||
|
|
||||||
|
6- Collect and make copies of libcurl.a, libcurl.dll, libcurldll.a and any *.o
|
||||||
|
compilations you might need in another directory outside of the bin directory
|
||||||
|
as you will need this files shortly to set up libcurl for use with
|
||||||
|
Dev-cpp. For most apps *.o is not required. Later on we will show what to do
|
||||||
|
with these files.
|
||||||
|
|
||||||
|
7- You are finished but before closing we need to do cleanup - erase the bin
|
||||||
|
folder and rename the "bin Original" folder created in step 1 to bin.
|
||||||
|
|
||||||
|
Note to compile a curl executable the process is probably similar but instead
|
||||||
|
of using the LIB folder contents use the SRC folder contents and Makefiles in
|
||||||
|
curl-7.14.0.tar.gz. File directories relative placements must be respected for
|
||||||
|
compiling to take place successfully. This may not be possible with the PATH
|
||||||
|
problem that make.exe experiences. If anyone has solved this PATH issue and
|
||||||
|
please make sure it actually works on Win 9x/2000/XP before letting me
|
||||||
|
know. Then please let me or Daniel in on the solution so that it can be
|
||||||
|
included with these instructions. Thanks.
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
Method II - Dev-Cpp GUI
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
1- Copy the entire contents of the LIB folder of curl-7.14.0.tar.gz or zip
|
||||||
|
version into any folder outside of (Dev-Cpp\bin).
|
||||||
|
|
||||||
|
2- Drop the File/New/click on Project.
|
||||||
|
|
||||||
|
3- New Project Dialogue box appears. Double click on the Static Library.
|
||||||
|
|
||||||
|
4- Create Project Dialogue box appears. Select the LIB folder location to
|
||||||
|
place and locate your Project File Name. Placing the Project File Name
|
||||||
|
elsewhere may cause problems (PATH issue problem again).
|
||||||
|
|
||||||
|
5- Drop down the Project/Project Options. Project Options Dialogue box
|
||||||
|
appears.
|
||||||
|
|
||||||
|
6- Select the Makefile tab in the Project Options Dialogue Box. Check Box -
|
||||||
|
Use Custom Makefile. Click on the Folder icon at the extreme right of the
|
||||||
|
Check Box. Select Makefile.m32 in the folder wherever you have placed the
|
||||||
|
contents of the LIB Folder. Press OK and close the Dialogue Box.
|
||||||
|
|
||||||
|
7- Drop the Menu Project/Click on Add to Project. Open File Dialogue Box
|
||||||
|
appears. The Dialogue Box should open in the folder wherever you have placed
|
||||||
|
the contents of the LIB Folder. If not go there.
|
||||||
|
|
||||||
|
8- Select Crtl-A to select all files in the LIB folder. Click on open to add
|
||||||
|
files and close box. Wait till all files are added. This may take 30 seconds
|
||||||
|
or longer.
|
||||||
|
|
||||||
|
9- Drop the Menu Execute/Click on Compile.
|
||||||
|
|
||||||
|
10- That's it.
|
||||||
|
|
||||||
|
|
||||||
|
The following steps must be completed if Curl is to work properly
|
||||||
|
=================================================================
|
||||||
|
|
||||||
|
LIB folder inclusions (*.a placement)
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
1- Refer to Method I - DOS Command Line point # 6 Take libcurl.a, libcurldll.a
|
||||||
|
and install it in the directory C( or whichever drive Dev is installed)
|
||||||
|
:\Dev-Cpp\lib.
|
||||||
|
|
||||||
|
|
||||||
|
Include Folder
|
||||||
|
--------------
|
||||||
|
|
||||||
|
1- Create a new folder by the name of curl (do not change the name curl to
|
||||||
|
some other name as it will cause major issues) in the directory
|
||||||
|
C:\Dev-Cpp\include.
|
||||||
|
|
||||||
|
2- Copy the entire contents of the curl folder of curl-7.14.0.tar.gz or zip
|
||||||
|
version into the newly created curl directory - C:\Dev-Cpp\include\curl.
|
||||||
|
|
||||||
|
Links To Include And Lib Folder
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
1- Drop the Menu - Tools\Compiler Options\Directories\Libraries. Make sure
|
||||||
|
that C( or whichever drive Dev is installed):\DEV-CPP\lib is included.
|
||||||
|
|
||||||
|
2- Next select the Menu - Tools\Compiler Options\Directories\C Includes. Make
|
||||||
|
sure that C:\DEV-CPP\include and C:\Dev-Cpp\include\curl are included.
|
||||||
|
|
||||||
|
3- Next select the Menu - Tools\Compiler Options\Directories\C++
|
||||||
|
Includes. Make sure that C:\DEV-CPP\include and C:\Dev-Cpp\include\curl are
|
||||||
|
included.
|
||||||
|
|
||||||
|
Linker Links
|
||||||
|
------------
|
||||||
|
|
||||||
|
1- Drop the Menu - Tools\Compiler Options\Directories\Compiler.
|
||||||
|
|
||||||
|
2- Make sure that the box "Add these commands to the linker command line" is
|
||||||
|
checked.
|
||||||
|
|
||||||
|
3- Include in the white space immediately below the box referred in 2 -lcurl
|
||||||
|
-lws2_32 -lwinmm.
|
||||||
|
|
||||||
|
SSL Files
|
||||||
|
---------
|
||||||
|
|
||||||
|
1- Get the latest openSSL (as of time of this writing)
|
||||||
|
openssl-0.9.7e-win32-bin.zip for the minimalist package of the openssl-0.9.7e
|
||||||
|
binaries ported to MS Windows 95/98/NT/XP using the MingW32/GCC-3.1
|
||||||
|
development environment. The file may be downloaded at
|
||||||
|
http://curl.haxx.se/download/.
|
||||||
|
|
||||||
|
2- Open the above zip file. You will find two files - SDL.dll,
|
||||||
|
SDL_mixer.dll. Install them in the directory C:\WINDOWS\SYSTEM32 for Win 9x
|
||||||
|
users and c:\winnt\system32 for NT-family users.
|
||||||
|
|
||||||
|
Multithreading Files
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
To be completed
|
||||||
|
|
||||||
|
#define
|
||||||
|
-------
|
||||||
|
|
||||||
|
1- Make sure that your program includes the following - #define CURL_STATICLIB
|
||||||
|
must be declared FIRST before any other define functions may be
|
||||||
|
added. Otherwise you may experience link errors.
|
||||||
|
|
||||||
|
2- Don't forget to include #include "curl/curl.h".
|
||||||
|
|
||||||
|
e.g.
|
||||||
|
#define CURL_STATICLIB
|
||||||
|
#include <windows.h>
|
||||||
|
#include "curl/curl.h"
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
etc...
|
||||||
|
|
||||||
|
|
||||||
|
Static or Dynamic Library
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
The above steps apply for the use by a static library. Should you choose to
|
||||||
|
use a dynamic library you will be required to perform these additional steps.
|
||||||
|
|
||||||
|
1- Refer to Method I - DOS Command Line point # 6. Install libcurl.dll in the
|
||||||
|
directory C:\WINDOWS\SYSTEM32 for Win 9x users and c:\winnt\system32 for
|
||||||
|
NT-family users.
|
||||||
|
|
||||||
|
2- Refer to Linker Links point 3 - Replace -lcurl with -lcurldll.
|
||||||
|
|
||||||
|
Voila you're done.
|
||||||
|
|
||||||
|
The non-SSL static Library build may not be possible to use at least as of the
|
||||||
|
time of this writing - v7.14. Check reference emails - Phillipe and I found it
|
||||||
|
impossible to fully compile as certain files were missing for linking. No big
|
||||||
|
loss as SSL is a major plus.
|
||||||
|
|
||||||
|
Hope this Helps
|
||||||
|
|
||||||
|
Tom
|
||||||
@@ -3,12 +3,65 @@ join in and help us correct one or more of these! Also be sure to check the
|
|||||||
changelog of the current development status, as one or more of these problems
|
changelog of the current development status, as one or more of these problems
|
||||||
may have been fixed since this was written!
|
may have been fixed since this was written!
|
||||||
|
|
||||||
|
32. (At least on Windows) If libcurl is built with c-ares and there's no DNS
|
||||||
|
server configured in the system, the ares_init() call fails and thus
|
||||||
|
curl_easy_init() fails as well. This causes weird effects for people who use
|
||||||
|
numerical IP addresses only.
|
||||||
|
|
||||||
|
31. "curl-config --libs" will include details set in LDFLAGS when configure is
|
||||||
|
run that might be needed only for building libcurl. Similarly, it might
|
||||||
|
include options that perhaps aren't suitable both for static and dynamic
|
||||||
|
linking. Further, curl-config --cflags suffers from the same effects with
|
||||||
|
CFLAGS/CPPFLAGS.
|
||||||
|
|
||||||
|
30. You need to use -g to the command line tool in order to use RFC2732-style
|
||||||
|
IPv6 numerical addresses in URLs.
|
||||||
|
|
||||||
|
29. IPv6 URLs with zone ID is not supported.
|
||||||
|
http://www.ietf.org/internet-drafts/draft-fenner-literal-zone-02.txt
|
||||||
|
specifies the use of a plus sign instead of a percent when specifying zone
|
||||||
|
IDs in URLs to get around the problem of percent signs being
|
||||||
|
special. According to the reporter, Firefox deals with the URL _with_ a
|
||||||
|
percent letter (which seems like a blatant URL spec violation).
|
||||||
|
|
||||||
|
See http://curl.haxx.se/bug/view.cgi?id=1371118
|
||||||
|
|
||||||
|
28. The TFTP code is not portable and will fail on some architectures.
|
||||||
|
|
||||||
|
26. NTLM authentication using SSPI (on Windows) when (lib)curl is running in
|
||||||
|
"system context" will make it use wrong(?) user name - at least when compared
|
||||||
|
to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=1281867
|
||||||
|
|
||||||
|
25. When doing a CONNECT request with curl it doesn't properly handle if the
|
||||||
|
proxy closes the connection within the authentication "negotiation phase".
|
||||||
|
Like if you do HTTPS or similar over a proxy and you use perhaps
|
||||||
|
--proxy-anyauth. There's work in progress on this problem, and a recent
|
||||||
|
patch was posted here: http://curl.haxx.se/mail/lib-2005-08/0074.html
|
||||||
|
|
||||||
|
23. We don't support SOCKS for IPv6. We don't support FTPS over a SOCKS proxy.
|
||||||
|
We don't have any test cases for SOCKS proxy. We probably have even more
|
||||||
|
bugs and lack of features when a SOCKS proxy is used. And there seem to be a
|
||||||
|
problem with SOCKS when doing FTP: See
|
||||||
|
http://curl.haxx.se/bug/view.cgi?id=1371540
|
||||||
|
|
||||||
|
22. Sending files to a FTP server using curl on VMS, might lead to curl
|
||||||
|
complaining on "unaligned file size" on completion. The problem is related
|
||||||
|
to VMS file structures and the perceived file sizes stat() returns. A
|
||||||
|
possible fix would involve sending a "STRU VMS" command.
|
||||||
|
http://curl.haxx.se/bug/view.cgi?id=1156287
|
||||||
|
|
||||||
|
21. FTP ASCII transfers do not follow RFC959. They don't convert the data
|
||||||
|
accordingly (not for sending nor for receiving). RFC 959 section 3.1.1.1
|
||||||
|
clearly describes how this should be done:
|
||||||
|
|
||||||
|
The sender converts the data from an internal character representation to
|
||||||
|
the standard 8-bit NVT-ASCII representation (see the Telnet
|
||||||
|
specification). The receiver will convert the data from the standard
|
||||||
|
form to his own internal form.
|
||||||
|
|
||||||
19. FTP 3rd party transfers with the multi interface doesn't work. Test:
|
19. FTP 3rd party transfers with the multi interface doesn't work. Test:
|
||||||
define CURL_MULTIEASY, rebuild curl, run test case 230 - 232.
|
define CURL_MULTIEASY, rebuild curl, run test case 230 - 232.
|
||||||
|
|
||||||
18. test case 57 has </test> that should be </client> but when corrected, the
|
|
||||||
test case fails!
|
|
||||||
|
|
||||||
16. FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>,
|
16. FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>,
|
||||||
<password>, and <fpath> components, encoded as "%00". The problem is that
|
<password>, and <fpath> components, encoded as "%00". The problem is that
|
||||||
curl_unescape does not detect this, but instead returns a shortened C
|
curl_unescape does not detect this, but instead returns a shortened C
|
||||||
@@ -19,10 +72,6 @@ may have been fixed since this was written!
|
|||||||
would not meaningfully support NUL characters within RFC 959 <string>,
|
would not meaningfully support NUL characters within RFC 959 <string>,
|
||||||
anyway (e.g., UNIX pathnames may not contain NUL).
|
anyway (e.g., UNIX pathnames may not contain NUL).
|
||||||
|
|
||||||
15. Test case 241 fails on all systems that support IPv6 but that don't have
|
|
||||||
the host name 'ip6-localhost' in /etc/hosts (or similar) since the test case
|
|
||||||
uses that host name to test the IPv6 name to address resolver.
|
|
||||||
|
|
||||||
14. Test case 165 might fail on system which has libidn present, but with an
|
14. Test case 165 might fail on system which has libidn present, but with an
|
||||||
old iconv version (2.1.3 is a known bad version), since it doesn't recognize
|
old iconv version (2.1.3 is a known bad version), since it doesn't recognize
|
||||||
the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the
|
the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the
|
||||||
@@ -42,11 +91,12 @@ may have been fixed since this was written!
|
|||||||
10. To get HTTP Negotiate authentication to work fine, you need to provide a
|
10. To get HTTP Negotiate authentication to work fine, you need to provide a
|
||||||
(fake) user name (this concerns both curl and the lib) because the code
|
(fake) user name (this concerns both curl and the lib) because the code
|
||||||
wrongly only considers authentication if there's a user name provided.
|
wrongly only considers authentication if there's a user name provided.
|
||||||
Bug report #1004841. How? http://curl.haxx.se/mail/lib-2004-08/0182.html
|
http://curl.haxx.se/bug/view.cgi?id=1004841. How?
|
||||||
|
http://curl.haxx.se/mail/lib-2004-08/0182.html
|
||||||
|
|
||||||
9. --limit-rate using -d or -F does not work. This is because the limit logic
|
9. --limit-rate using -d or -F does not work. This is because the limit logic
|
||||||
is provided by the curl app in its read/write callbacks, and when doing
|
is provided by the curl app in its read/write callbacks, and when doing
|
||||||
-d/-F the callbacks aren't used! Bug report #921395.
|
-d/-F the callbacks aren't used! http://curl.haxx.se/bug/view.cgi?id=921395
|
||||||
|
|
||||||
8. Doing resumed upload over HTTP does not work with '-C -', because curl
|
8. Doing resumed upload over HTTP does not work with '-C -', because curl
|
||||||
doesn't do a HEAD first to get the initial size. This needs to be done
|
doesn't do a HEAD first to get the initial size. This needs to be done
|
||||||
@@ -69,11 +119,6 @@ may have been fixed since this was written!
|
|||||||
libcurl thinks of it as the *compressed* length. Some explanations are here:
|
libcurl thinks of it as the *compressed* length. Some explanations are here:
|
||||||
http://curl.haxx.se/mail/lib-2003-06/0146.html
|
http://curl.haxx.se/mail/lib-2003-06/0146.html
|
||||||
|
|
||||||
4. IPv6 support on AIX 4.3.3 doesn't work due to a missing sockaddr_storage
|
|
||||||
struct. It has been reported to work on AIX 5.1 though.
|
|
||||||
|
|
||||||
3. GOPHER transfers seem broken
|
|
||||||
|
|
||||||
2. If a HTTP server responds to a HEAD request and includes a body (thus
|
2. If a HTTP server responds to a HEAD request and includes a body (thus
|
||||||
violating the RFC2616), curl won't wait to read the response but just stop
|
violating the RFC2616), curl won't wait to read the response but just stop
|
||||||
reading and return back. If a second request (let's assume a GET) is then
|
reading and return back. If a second request (let's assume a GET) is then
|
||||||
@@ -83,7 +128,3 @@ may have been fixed since this was written!
|
|||||||
and havoc is what happens.
|
and havoc is what happens.
|
||||||
More details on this is found in this libcurl mailing list thread:
|
More details on this is found in this libcurl mailing list thread:
|
||||||
http://curl.haxx.se/mail/lib-2002-08/0000.html
|
http://curl.haxx.se/mail/lib-2002-08/0000.html
|
||||||
|
|
||||||
1. LDAP support requires that not only the OpenLDAP shared libraries be
|
|
||||||
present at run time, but the development libraries (liblber.so and
|
|
||||||
libldap.so) as well (not applicable to Windows).
|
|
||||||
|
|||||||
@@ -12,12 +12,11 @@ I am not a lawyer and this is not legal advice!
|
|||||||
|
|
||||||
One common dilemma is that GPL[1]-licensed code is not allowed to be linked
|
One common dilemma is that GPL[1]-licensed code is not allowed to be linked
|
||||||
with code licensed under the Original BSD license (with the announcement
|
with code licensed under the Original BSD license (with the announcement
|
||||||
clause, unless there's a specified exception in the GPL-licensed module). You
|
clause). You may still build your own copies that use them all, but
|
||||||
may still build your own copies that use them all, but distributing them as
|
distributing them as binaries would be to violate the GPL license - unless you
|
||||||
binaries would be to violate the GPL license - unless you accompany your
|
accompany your license with an exception[2]. This particular problem was
|
||||||
license with an exception[2]. This particular problem was addressed when the
|
addressed when the Modified BSD license was created, which does not have the
|
||||||
Modified BSD license was created, which does not have the annoncement clause
|
annoncement clause that collides with GPL.
|
||||||
that collides with GPL.
|
|
||||||
|
|
||||||
libcurl http://curl.haxx.se/docs/copyright.html
|
libcurl http://curl.haxx.se/docs/copyright.html
|
||||||
|
|
||||||
@@ -28,59 +27,80 @@ libcurl http://curl.haxx.se/docs/copyright.html
|
|||||||
|
|
||||||
OpenSSL http://www.openssl.org/source/license.html
|
OpenSSL http://www.openssl.org/source/license.html
|
||||||
|
|
||||||
Uses an Original BSD-style license with an announement clause that
|
(May be used for SSL/TLS support) Uses an Original BSD-style license
|
||||||
makes it "incompatible" with GPL. You are not allowed to ship binaries
|
with an announement clause that makes it "incompatible" with GPL. You
|
||||||
that link with OpenSSL that includes GPL code (unless that specific
|
are not allowed to ship binaries that link with OpenSSL that includes
|
||||||
GPL code includes an exception for OpenSSL - a habit that is growing
|
GPL code (unless that specific GPL code includes an exception for
|
||||||
more and more common).
|
OpenSSL - a habit that is growing more and more common). If OpenSSL's
|
||||||
|
licensing is a problem for you, consider using GnuTLS instead.
|
||||||
|
|
||||||
|
GnuTLS http://www.gnutls.org/
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) Uses the LGPL[3] license. If this is
|
||||||
|
a problem for you, consider using OpenSSL instead. Also note that
|
||||||
|
GnuTLS itself depends on and uses other libs (libgcrypt and
|
||||||
|
libgpg-error) and they too are LGPL- or GPL-licensed.
|
||||||
|
|
||||||
c-ares http://daniel.haxx.se/projects/c-ares/license.html
|
c-ares http://daniel.haxx.se/projects/c-ares/license.html
|
||||||
|
|
||||||
Uses an MIT license that is very liberal and imposes no restrictions
|
(Used for asynchronous name resolves) Uses an MIT license that is very
|
||||||
on any other library or part you may link with.
|
liberal and imposes no restrictions on any other library or part you
|
||||||
|
may link with.
|
||||||
|
|
||||||
zlib http://www.gzip.org/zlib/zlib_license.html
|
zlib http://www.gzip.org/zlib/zlib_license.html
|
||||||
|
|
||||||
Uses an MIT-style license that shouldn't collide with any other
|
(Used for compressed Transfer-Encoding support) Uses an MIT-style
|
||||||
library.
|
license that shouldn't collide with any other library.
|
||||||
|
|
||||||
krb4
|
krb4
|
||||||
|
|
||||||
While nothing in particular says that a Kerberos4 library must use any
|
While nothing in particular says that a Kerberos4 library must use any
|
||||||
particular license, the one I've tried and used successfully so far
|
particular license, the one I've tried and used successfully so far
|
||||||
(kth-krb4) is Original BSD-licensed with the announcement clause. Some
|
(kth-krb4) is partly Original BSD-licensed with the announcement
|
||||||
of the code in libcurl that is written to deal with Kerberos4 likewise
|
clause. Some of the code in libcurl that is written to deal with
|
||||||
have such a license.
|
Kerberos4 is Modified BSD-licensed.
|
||||||
|
|
||||||
GSSAPI
|
MIT Kerberos http://web.mit.edu/kerberos/www/dist/
|
||||||
|
|
||||||
While nothing in particular says that a GSS/Kerberos5 library must use
|
(May be used for GSS support) MIT licensed, that shouldn't collide
|
||||||
any particular license, the one I've used (Heimdal) is Original BSD-
|
with any other parts.
|
||||||
licensed with the announcement clause.
|
|
||||||
|
Heimdal http://www.pdc.kth.se/heimdal/
|
||||||
|
|
||||||
|
(May be used for GSS support) Heimdal is Original BSD licensed with
|
||||||
|
the announcement clause.
|
||||||
|
|
||||||
|
GNU GSS http://www.gnu.org/software/gss/
|
||||||
|
|
||||||
|
(May be used for GSS support) GNU GSS is GPL licensed. Note that you
|
||||||
|
may not distribute binary curl packages that uses this if you build
|
||||||
|
curl to also link and use any Original BSD licensed libraries!
|
||||||
|
|
||||||
fbopenssl
|
fbopenssl
|
||||||
|
|
||||||
Unclear license. Based on its name, I assume that it uses the OpenSSL
|
(Used for SPNEGO support) Unclear license. Based on its name, I assume
|
||||||
license and thus shares the same issues as described for OpenSSL
|
that it uses the OpenSSL license and thus shares the same issues as
|
||||||
above.
|
described for OpenSSL above.
|
||||||
|
|
||||||
libidn http://www.gnu.org/licenses/lgpl.html
|
libidn http://www.gnu.org/licenses/lgpl.html
|
||||||
|
|
||||||
Uses the GNU Lesser General Public License. LGPL is a variation of GPL
|
(Used for IDNA support) Uses the GNU Lesser General Public
|
||||||
with slightly less aggressive "copyleft". This license requires more
|
License. LGPL is a variation of GPL with slightly less aggressive
|
||||||
requirements to be met when distributing binaries, see the license for
|
"copyleft". This license requires more requirements to be met when
|
||||||
details. Also note that if you distribute a binary that includes this
|
distributing binaries, see the license for details. Also note that if
|
||||||
library, you must also include the full LGPL license text. Please
|
you distribute a binary that includes this library, you must also
|
||||||
properly point out what parts of the distributed package that the
|
include the full LGPL license text. Please properly point out what
|
||||||
license addresses.
|
parts of the distributed package that the license addresses.
|
||||||
|
|
||||||
OpenLDAP http://www.openldap.org/software/release/license.html
|
OpenLDAP http://www.openldap.org/software/release/license.html
|
||||||
|
|
||||||
Uses a Modified BSD-style license. Since libcurl uses OpenLDAP as a
|
(Used for LDAP support) Uses a Modified BSD-style license. Since
|
||||||
shared library only, I have not heard of anyone that ships OpenLDAP
|
libcurl uses OpenLDAP as a shared library only, I have not heard of
|
||||||
linked with libcurl in an app.
|
anyone that ships OpenLDAP linked with libcurl in an app.
|
||||||
|
|
||||||
|
|
||||||
[1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html
|
[1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html
|
||||||
[2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on
|
[2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on
|
||||||
how to write such an exception to the GPL
|
how to write such an exception to the GPL
|
||||||
|
[3] = LGPL - GNU Lesser General Public License:
|
||||||
|
http://www.gnu.org/licenses/lgpl.html
|
||||||
|
|||||||
17
docs/MANUAL
17
docs/MANUAL
@@ -23,10 +23,6 @@ SIMPLE USAGE
|
|||||||
|
|
||||||
curl ftp://cool.haxx.se/
|
curl ftp://cool.haxx.se/
|
||||||
|
|
||||||
Get a gopher document from funet's gopher server:
|
|
||||||
|
|
||||||
curl gopher://gopher.funet.fi
|
|
||||||
|
|
||||||
Get the definition of curl from a dictionary:
|
Get the definition of curl from a dictionary:
|
||||||
|
|
||||||
curl dict://dict.org/m:curl
|
curl dict://dict.org/m:curl
|
||||||
@@ -94,10 +90,6 @@ USING PASSWORDS
|
|||||||
|
|
||||||
Probably most commonly used with private certificates, as explained below.
|
Probably most commonly used with private certificates, as explained below.
|
||||||
|
|
||||||
GOPHER
|
|
||||||
|
|
||||||
Curl features no password support for gopher.
|
|
||||||
|
|
||||||
PROXY
|
PROXY
|
||||||
|
|
||||||
Get an ftp file using a proxy named my-proxy that uses port 888:
|
Get an ftp file using a proxy named my-proxy that uses port 888:
|
||||||
@@ -299,6 +291,13 @@ POST (HTTP)
|
|||||||
|
|
||||||
curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif"
|
curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif"
|
||||||
|
|
||||||
|
To send a field value literally without interpreting a leading '@'
|
||||||
|
or '<', or an embedded ';type=', use --form-string instead of
|
||||||
|
-F. This is recommended when the value is obtained from a user or
|
||||||
|
some other unpredictable source. Under these circumstances, using
|
||||||
|
-F instead of --form-string would allow a user to trick curl into
|
||||||
|
uploading a file.
|
||||||
|
|
||||||
REFERRER
|
REFERRER
|
||||||
|
|
||||||
A HTTP request has the option to include information about which address
|
A HTTP request has the option to include information about which address
|
||||||
@@ -741,7 +740,7 @@ ENVIRONMENT VARIABLES
|
|||||||
|
|
||||||
Curl reads and understands the following environment variables:
|
Curl reads and understands the following environment variables:
|
||||||
|
|
||||||
http_proxy, HTTPS_PROXY, FTP_PROXY, GOPHER_PROXY
|
http_proxy, HTTPS_PROXY, FTP_PROXY
|
||||||
|
|
||||||
They should be set for protocol-specific proxies. General proxy should be
|
They should be set for protocol-specific proxies. General proxy should be
|
||||||
set with
|
set with
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ SUBDIRS = examples libcurl
|
|||||||
|
|
||||||
CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES)
|
CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES)
|
||||||
|
|
||||||
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
|
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
|
||||||
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
|
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
|
||||||
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
|
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
|
||||||
$(PDFPAGES) LICENSE-MIXING README.netware
|
$(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp
|
||||||
|
|
||||||
MAN2HTML= roffit < $< >$@
|
MAN2HTML= roffit < $< >$@
|
||||||
|
|
||||||
|
|||||||
593
docs/THANKS
593
docs/THANKS
@@ -1,110 +1,493 @@
|
|||||||
This project has been alive for several years. Countless people have provided
|
This project has been alive for many years. Countless people have provided
|
||||||
feedback that have improved curl. Here follows a (incomplete) list of people
|
feedback that have improved curl. Here follows a list of people that have
|
||||||
that have contributed with non-trivial parts:
|
contributed (a-z order).
|
||||||
|
|
||||||
Daniel Stenberg <daniel@haxx.se>
|
If you have contributed but are missing here, please let us know!
|
||||||
Rafael Sagula <sagula@inf.ufrgs.br>
|
|
||||||
Sampo Kellomaki <sampo@iki.fi>
|
Adrian Schuur
|
||||||
Linas Vepstas <linas@linas.org>
|
Alan Pinstein
|
||||||
Bjorn Reese <breese@mail1.stofanet.dk>
|
Albert Chin-A-Young
|
||||||
Johan Anderson <johan@homemail.com>
|
Albert Choy
|
||||||
Kjell Ericson <Kjell.Ericson@haxx.se>
|
Aleksandar Milivojevic
|
||||||
Troy Engel <tengel@sonic.net>
|
Alex Neblett
|
||||||
Ryan Nelson <ryan@inch.com>
|
Alex Suykov
|
||||||
Bj<EFBFBD>rn Stenberg <bjorn@haxx.se>
|
Alex aka WindEagle
|
||||||
Angus Mackay <amackay@gus.ml.org>
|
Alexander Kourakos
|
||||||
Eric Young <eay@cryptsoft.com>
|
|
||||||
Simon Dick <simond@totally.irrelevant.org>
|
|
||||||
Oren Tirosh <oren@monty.hishome.net>
|
|
||||||
Steven G. Johnson <stevenj@alum.mit.edu>
|
|
||||||
Gilbert Ramirez Jr. <gram@verdict.uthscsa.edu>
|
|
||||||
Andr<EFBFBD>s Garc<72>a <ornalux@redestb.es>
|
|
||||||
Douglas E. Wegscheid <wegscd@whirlpool.com>
|
|
||||||
Mark Butler <butlerm@xmission.com>
|
|
||||||
Eric Thelin <eric@generation-i.com>
|
|
||||||
Marc Boucher <marc@mbsi.ca>
|
|
||||||
Greg Onufer <Greg.Onufer@Eng.Sun.COM>
|
|
||||||
Doug Kaufman <dkaufman@rahul.net>
|
|
||||||
David Eriksson <david@2good.com>
|
|
||||||
Ralph Beckmann <rabe@uni-paderborn.de>
|
|
||||||
T. Yamada <tai@imasy.or.jp>
|
|
||||||
Lars J. Aas <larsa@sim.no>
|
|
||||||
J<EFBFBD>rn Hartroth <Joern.Hartroth@computer.org>
|
|
||||||
Matthew Clarke <clamat@van.maves.ca>
|
|
||||||
Linus Nielsen Feltzing <linus@haxx.se>
|
|
||||||
Felix von Leitner <felix@convergence.de>
|
|
||||||
Dan Zitter <dzitter@zitter.net>
|
|
||||||
Jongki Suwandi <Jongki.Suwandi@eng.sun.com>
|
|
||||||
Chris Maltby <chris@aurema.com>
|
|
||||||
Ron Zapp <rzapper@yahoo.com>
|
|
||||||
Paul Marquis <pmarquis@iname.com>
|
|
||||||
Ellis Pritchard <ellis@citria.com>
|
|
||||||
Damien Adant <dams@usa.net>
|
|
||||||
Chris <cbayliss@csc.come>
|
|
||||||
Marco G. Salvagno <mgs@whiz.cjb.net>
|
|
||||||
Paul Marquis <pmarquis@iname.com>
|
|
||||||
David LeBlanc <dleblanc@qnx.com>
|
|
||||||
Rich Gray at Plus Technologies
|
|
||||||
Luong Dinh Dung <u8luong@lhsystems.hu>
|
|
||||||
Torsten Foertsch <torsten.foertsch@gmx.net>
|
|
||||||
Kristian K<>hntopp <kris@koehntopp.de>
|
|
||||||
Fred Noz <FNoz@siac.com>
|
|
||||||
Caolan McNamara <caolan@csn.ul.ie>
|
|
||||||
Albert Chin-A-Young <china@thewrittenword.com>
|
|
||||||
Stephen Kick <skick@epicrealm.com>
|
|
||||||
Martin Hedenfalk <mhe@stacken.kth.se>
|
|
||||||
Richard Prescott <rip at step.polymtl.ca>
|
|
||||||
Jason S. Priebe <priebe@wral-tv.com>
|
|
||||||
T. Bharath <TBharath@responsenetworks.com>
|
|
||||||
Alexander Kourakos <awk@users.sourceforge.net>
|
|
||||||
James Griffiths <griffiths_james@yahoo.com>
|
|
||||||
Loic Dachary <loic@senga.org>
|
|
||||||
Robert Weaver <robert.weaver@sabre.com>
|
|
||||||
Ingo Ralf Blum <ingoralfblum@ingoralfblum.com>
|
|
||||||
Jun-ichiro itojun Hagino <itojun@iijlab.net>
|
|
||||||
Frederic Lepied <flepied@mandrakesoft.com>
|
|
||||||
Georg Horn <horn@koblenz-net.de>
|
|
||||||
Cris Bailiff <c.bailiff@awayweb.com>
|
|
||||||
Sterling Hughes <sterling@designmultimedia.com>
|
|
||||||
S. Moonesamy
|
|
||||||
Ingo Wilken <iw@WWW.Ecce-Terram.DE>
|
|
||||||
Pawel A. Gajda <mis@k2.net.pl>
|
|
||||||
Patrick Bihan-Faou
|
|
||||||
Nico Baggus <Nico.Baggus@mail.ing.nl>
|
|
||||||
Sergio Ballestrero
|
|
||||||
Andrew Francis <locust@familyhealth.com.au>
|
|
||||||
Tomasz Lacki <Tomasz.Lacki@primark.pl>
|
|
||||||
Georg Huettenegger <georg@ist.org>
|
|
||||||
John Lask <johnlask@hotmail.com>
|
|
||||||
Eric Lavigne <erlavigne@wanadoo.fr>
|
|
||||||
Marcus Webster <marcus.webster@phocis.com>
|
|
||||||
G<EFBFBD>tz Babin-Ebell <babin<69>ebell@trustcenter.de>
|
|
||||||
Andreas Damm <andreas-sourceforge@radab.org>
|
|
||||||
Jacky Lam <sylam@emsoftltd.com>
|
|
||||||
James Gallagher <jgallagher@gso.uri.edu>
|
|
||||||
Kjetil Jacobsen <kjetilja@cs.uit.no>
|
|
||||||
Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
|
||||||
Miklos Nemeth <mnemeth@kfkisystems.com>
|
|
||||||
Kevin Roth <kproth@users.sourceforge.net>
|
|
||||||
Ralph Mitchell <rmitchell@eds.com>
|
|
||||||
Dan Fandrich <dan@coneharvesters.com>
|
|
||||||
Jean-Philippe Barrette-LaPierre <jpb@rrette.com>
|
|
||||||
Richard Bramante <RBramante@on.com>
|
|
||||||
Daniel Kouril <kouril@ics.muni.cz>
|
|
||||||
Dirk Manske <dm@nettraffic.de>
|
|
||||||
David Meyer <meyer@paracel.com>
|
|
||||||
Dominick Meglio <codemstr@ptd.net>
|
|
||||||
Gisle Vanem <gvanem@broadpark.no>
|
|
||||||
Giuseppe Attardi <attardi@di.unipi.it>
|
|
||||||
Tor Arntsen <tor@spacetec.no>
|
|
||||||
David Byron <DByron@everdreamcorp.com>
|
|
||||||
David Phillips
|
|
||||||
Alexander Krasnostavsky
|
Alexander Krasnostavsky
|
||||||
G<EFBFBD>nter Knauf
|
Alexander Lazic
|
||||||
|
Alexander Zhuravlev
|
||||||
|
Alexis Carvalho
|
||||||
|
Amol Pattekar
|
||||||
|
Andi Jahja
|
||||||
|
Andreas Damm
|
||||||
|
Andreas Olsson
|
||||||
|
Andreas Rieke
|
||||||
|
Andres Garcia
|
||||||
|
Andrew Benham
|
||||||
|
Andrew Bushnell
|
||||||
|
Andrew Francis
|
||||||
|
Andrew Fuller
|
||||||
|
Andr<EFBFBD>s Garc<72>a
|
||||||
|
Andy Cedilnik
|
||||||
|
Andy Serpa
|
||||||
|
Angus Mackay
|
||||||
|
Antoine Calando
|
||||||
|
Anton Kalmykov
|
||||||
|
Arkadiusz Miskiewicz
|
||||||
|
Augustus Saunders
|
||||||
|
Avery Fay
|
||||||
|
Ben Greear
|
||||||
|
Ben Madsen
|
||||||
|
Benjamin Gerard
|
||||||
Bertrand Demiddelaer
|
Bertrand Demiddelaer
|
||||||
Peter Sylvester
|
Bjorn Reese
|
||||||
Alexis S. L. Carvalho
|
Bj<EFBFBD>rn Stenberg
|
||||||
|
Bob Schader
|
||||||
|
Brad Burdick
|
||||||
|
Bradford Bruce
|
||||||
|
Brent Beardsley
|
||||||
|
Brian Akins
|
||||||
|
Brian R Duffy
|
||||||
|
Bruce Mitchener
|
||||||
|
Bryan Henderson
|
||||||
|
Bryan Kemp
|
||||||
|
Caolan McNamara
|
||||||
Casey O'Donnell
|
Casey O'Donnell
|
||||||
Marty Kuhrt
|
Chih-Chung Chang
|
||||||
James Bursa
|
Chris "Bob Bob"
|
||||||
|
Chris Combes
|
||||||
|
Chris Gaukroger
|
||||||
|
Chris Maltby
|
||||||
|
Christian Kurz
|
||||||
|
Christian Robottom Reis
|
||||||
|
Christophe Demory
|
||||||
|
Christophe Legry
|
||||||
|
Christopher R. Palmer
|
||||||
|
Clarence Gardner
|
||||||
|
Clifford Wolf
|
||||||
|
Cody Jones
|
||||||
|
Colin Watson
|
||||||
|
Colm Buckley
|
||||||
|
Cory Nelson
|
||||||
|
Craig Davison
|
||||||
|
Craig Markwardt
|
||||||
|
Cris Bailiff
|
||||||
|
Cyrill Osterwalder
|
||||||
|
Damien Adant
|
||||||
|
Dan Becker
|
||||||
|
Dan C
|
||||||
|
Dan Fandrich
|
||||||
|
Dan Torop
|
||||||
|
Dan Zitter
|
||||||
|
Daniel Stenberg
|
||||||
|
Daniel at touchtunes
|
||||||
|
Darryl House
|
||||||
|
Dave Dribin
|
||||||
|
Dave Halbakken
|
||||||
|
Dave Hamilton
|
||||||
|
Dave May
|
||||||
|
David Byron
|
||||||
|
David Cohen
|
||||||
|
David Eriksson
|
||||||
|
David Houlder
|
||||||
|
David Hull
|
||||||
|
David J Meyer
|
||||||
|
David James
|
||||||
|
David Kimdon
|
||||||
|
David Lang
|
||||||
|
David LeBlanc
|
||||||
|
David Odin
|
||||||
|
David Phillips
|
||||||
|
David Shaw
|
||||||
|
David Tarendash
|
||||||
|
David Thiel
|
||||||
|
David Yan
|
||||||
|
Detlef Schmier
|
||||||
|
Diego Casorran
|
||||||
|
Dima Barsky
|
||||||
|
Dimitris Sarris
|
||||||
|
Dinar
|
||||||
|
Dirk Eddelbuettel
|
||||||
|
Dirk Manske
|
||||||
|
Dmitry Bartsevich
|
||||||
|
Dolbneff A.V
|
||||||
|
Domenico Andreoli
|
||||||
|
Dominick Meglio
|
||||||
|
Doug Kaufman
|
||||||
|
Doug Porter
|
||||||
|
Douglas E. Wegscheid
|
||||||
|
Douglas R. Horner
|
||||||
|
Dov Murik
|
||||||
|
Duane Cathey
|
||||||
|
Dustin Boswell
|
||||||
|
Dylan Ellicott
|
||||||
|
Dylan Salisbury
|
||||||
|
Early Ehlinger
|
||||||
|
Edin Kadribasic
|
||||||
|
Ellis Pritchard
|
||||||
|
Emiliano Ida
|
||||||
|
Enrico Scholz
|
||||||
|
Enrik Berkhan
|
||||||
|
Eric Cooper
|
||||||
|
Eric Lavigne
|
||||||
|
Eric Melville
|
||||||
|
Eric Rautman
|
||||||
|
Eric Thelin
|
||||||
|
Eric Vergnaud
|
||||||
|
Eric Young
|
||||||
|
Erick Nuwendam
|
||||||
|
Erwan Legrand
|
||||||
|
Erwin Authried
|
||||||
|
Eugene Kotlyarov
|
||||||
|
Evan Jordan
|
||||||
|
Fabrizio Ammollo
|
||||||
|
Fedor Karpelevitch
|
||||||
|
Felix von Leitner
|
||||||
|
Florian Schoppmann
|
||||||
|
Forrest Cahoon
|
||||||
|
Frank Keeney
|
||||||
|
Frank Ticheler
|
||||||
|
Fred New
|
||||||
|
Fred Noz
|
||||||
|
Frederic Lepied
|
||||||
|
Gautam Mani
|
||||||
|
Gaz Iqbal
|
||||||
|
Georg Horn
|
||||||
|
Georg Huettenegger
|
||||||
|
Georg Wicherski
|
||||||
|
Gerd v. Egidy
|
||||||
|
Gerhard Herre
|
||||||
|
Giaslas Georgios
|
||||||
|
Gilad
|
||||||
|
Gilbert Ramirez Jr.
|
||||||
|
Gisle Vanem
|
||||||
|
Giuseppe Attardi
|
||||||
|
Giuseppe D'Ambrosio
|
||||||
|
Glen Nakamura
|
||||||
|
Glen Scott
|
||||||
Greg Hewgill
|
Greg Hewgill
|
||||||
|
Greg Onufer
|
||||||
|
Grigory Entin
|
||||||
|
Guenole Bescon
|
||||||
|
Guillaume Arluison
|
||||||
|
Gustaf Hui
|
||||||
|
Gwenole Beauchesne
|
||||||
|
G<EFBFBD>tz Babin-Ebell
|
||||||
|
G<EFBFBD>nter Knauf
|
||||||
|
Hamish Mackenzie
|
||||||
|
Hanno Kranzhoff
|
||||||
|
Hans Steegers
|
||||||
|
Hardeep Singh
|
||||||
|
Harshal Pradhan
|
||||||
|
Heikki Korpela
|
||||||
|
Henrik Storner
|
||||||
|
Hzhijun
|
||||||
|
Ian Ford
|
||||||
|
Ian Gulliver
|
||||||
|
Ian Wilkes
|
||||||
|
Ignacio Vazquez-Abrams
|
||||||
|
Igor Polyakov
|
||||||
|
Ilguiz Latypov
|
||||||
|
Ingo Ralf Blum
|
||||||
|
Ingo Wilken
|
||||||
|
Jacky Lam
|
||||||
|
Jacob Meuser
|
||||||
|
James Bursa
|
||||||
|
James Clancy
|
||||||
|
James Cone
|
||||||
|
James Gallagher
|
||||||
|
James Griffiths
|
||||||
|
James MacMillan
|
||||||
|
Jamie Lokier
|
||||||
|
Jamie Newton
|
||||||
|
Jamie Wilkinson
|
||||||
|
Jan Kunder
|
||||||
|
Jason S. Priebe
|
||||||
|
Jaz Fresh
|
||||||
|
Jean Jacques Drouin
|
||||||
|
Jean-Claude Chauve
|
||||||
|
Jean-Louis Lemaire
|
||||||
|
Jean-Marc Ranger
|
||||||
|
Jean-Philippe Barrette-LaPierre
|
||||||
|
Jeff Lawson
|
||||||
|
Jeff Phillips
|
||||||
|
Jeff Pohlmeyer
|
||||||
|
Jeffrey Pohlmeyer
|
||||||
|
Jeremy Friesner
|
||||||
|
Jesper Jensen
|
||||||
|
Jesse Noller
|
||||||
|
Jim Drash
|
||||||
|
Joe Halpin
|
||||||
|
Joel Chen
|
||||||
|
Johan Anderson
|
||||||
|
Johan Nilsson
|
||||||
|
John Crow
|
||||||
|
John Janssen
|
||||||
|
John Kelly
|
||||||
|
John Lask
|
||||||
|
John McGowan
|
||||||
|
Jon Grubbs
|
||||||
|
Jon Travis
|
||||||
|
Jon Turner
|
||||||
|
Jonas Forsman
|
||||||
|
Jonatan Lander
|
||||||
|
Jonathan Hseu
|
||||||
|
Jongki Suwandi
|
||||||
|
Josh Kapell
|
||||||
|
Juan F. Codagnone
|
||||||
|
Juan Ignacio Herv<72>s
|
||||||
|
Juergen Wilke
|
||||||
|
Jukka Pihl
|
||||||
|
Julian Noble
|
||||||
|
Jun-ichiro itojun Hagino
|
||||||
|
Jurij Smakov
|
||||||
|
J<EFBFBD>rg Mueller-Tolk
|
||||||
|
J<EFBFBD>rn Hartroth
|
||||||
|
Kai Sommerfeld
|
||||||
|
Kai-Uwe Rommel
|
||||||
|
Kang-Jin Lee
|
||||||
|
Karl Moerder
|
||||||
|
Karol Pietrzak
|
||||||
|
Keith MacDonald
|
||||||
|
Keith McGuigan
|
||||||
|
Ken Hirsch
|
||||||
|
Ken Rastatter
|
||||||
|
Kent Boortz
|
||||||
|
Kevin Fisk
|
||||||
|
Kevin Lussier
|
||||||
|
Kevin Roth
|
||||||
|
Kimmo Kinnunen
|
||||||
|
Kjell Ericson
|
||||||
|
Kjetil Jacobsen
|
||||||
|
Klevtsov Vadim
|
||||||
|
Kris Kennaway
|
||||||
|
Krishnendu Majumdar
|
||||||
|
Kristian K<>hntopp
|
||||||
|
Kyle Sallee
|
||||||
|
Lachlan O'Dea
|
||||||
|
Larry Campbell
|
||||||
|
Larry Fahnoe
|
||||||
|
Lars Gustafsson
|
||||||
|
Lars J. Aas
|
||||||
|
Lars Nilsson
|
||||||
|
Lars Torben Wilson
|
||||||
|
Legoff Vincent
|
||||||
|
Lehel Bernadt
|
||||||
|
Len Krause
|
||||||
|
Linas Vepstas
|
||||||
|
Ling Thio
|
||||||
|
Linus Nielsen Feltzing
|
||||||
|
Loic Dachary
|
||||||
|
Loren Kirkby
|
||||||
|
Luca Altea
|
||||||
|
Luca Alteas
|
||||||
|
Lucas Adamski
|
||||||
|
Lukasz Czekierda
|
||||||
|
Luke Call
|
||||||
|
Luong Dinh Dung
|
||||||
|
Maciej W. Rozycki
|
||||||
|
Marc Boucher
|
||||||
|
Marcelo Juchem
|
||||||
|
Marcin Konicki
|
||||||
|
Marco G. Salvagno
|
||||||
|
Marcus Webster
|
||||||
|
Mario Schroeder
|
||||||
|
Mark Butler
|
||||||
|
Markus Moeller
|
||||||
|
Markus Oberhumer
|
||||||
|
Martijn Koster
|
||||||
|
Martin C. Martin
|
||||||
|
Martin Hedenfalk
|
||||||
|
Marty Kuhrt
|
||||||
|
Maruko
|
||||||
|
Massimiliano Ziccardi
|
||||||
|
Mathias Axelsson
|
||||||
|
Mats Lidell
|
||||||
|
Matt Veenstra
|
||||||
|
Matthew Blain
|
||||||
|
Matthew Clarke
|
||||||
|
Maurice Barnum
|
||||||
|
Mekonikum
|
||||||
|
Mettgut Jamalla
|
||||||
|
Michael Benedict
|
||||||
|
Michael Curtis
|
||||||
|
Michael Jahn
|
||||||
|
Michael Mealling
|
||||||
|
Michael Wallner
|
||||||
|
Michal Bonino
|
||||||
|
Michal Marek
|
||||||
|
Mihai Ionescu
|
||||||
|
Mike Bytnar
|
||||||
|
Mike Dobbs
|
||||||
|
Miklos Nemeth
|
||||||
|
Mitz Wark
|
||||||
|
Mohamed Lrhazi
|
||||||
|
Mohun Biswas
|
||||||
|
Moonesamy
|
||||||
|
Nathan O'Sullivan
|
||||||
|
Naveen Noel
|
||||||
|
Neil Dunbar
|
||||||
|
Neil Spring
|
||||||
|
Nic Roets
|
||||||
|
Nick Gimbrone
|
||||||
|
Nick Humfrey
|
||||||
|
Nico Baggus
|
||||||
|
Nicolas Berloquin
|
||||||
|
Nicolas Croiset
|
||||||
|
Nicolas Fran<61>ois
|
||||||
|
Niels van Tongeren
|
||||||
|
Nikita Schmidt
|
||||||
|
Nis Jorgensen
|
||||||
|
Nodak Sodak
|
||||||
|
Norbert Novotny
|
||||||
|
Ofer
|
||||||
|
Oren Tirosh
|
||||||
|
P R Schaffner
|
||||||
|
Patrick Bihan-Faou
|
||||||
|
Patrick Smith
|
||||||
|
Paul Harrington
|
||||||
|
Paul Marquis
|
||||||
|
Paul Moore
|
||||||
|
Paul Nolan
|
||||||
|
Pavel Cenek
|
||||||
|
Pavel Orehov
|
||||||
|
Pawel A. Gajda
|
||||||
|
Pedro Neves
|
||||||
|
Pete Su
|
||||||
|
Peter Bray
|
||||||
|
Peter Forret
|
||||||
|
Peter Pentchev
|
||||||
|
Peter Su
|
||||||
|
Peter Sylvester
|
||||||
|
Peter Todd
|
||||||
|
Peter Verhas
|
||||||
|
Peter Wullinger
|
||||||
|
Peteris Krumins
|
||||||
|
Phil Karn
|
||||||
|
Philip Gladstone
|
||||||
|
Philippe Hameau
|
||||||
|
Philippe Raoult
|
||||||
|
Philippe Vaucher
|
||||||
|
Pierre
|
||||||
|
Puneet Pawaia
|
||||||
|
Quagmire
|
||||||
|
Rafael Sagula
|
||||||
|
Ralph Beckmann
|
||||||
|
Ralph Mitchell
|
||||||
|
Ramana Mokkapati
|
||||||
|
Randy McMurchy
|
||||||
|
Reinout van Schouwen
|
||||||
|
Renaud Chaillat
|
||||||
|
Renaud Duhaut
|
||||||
|
Rene Bernhardt
|
||||||
|
Rene Rebe
|
||||||
|
Ricardo Cadime
|
||||||
|
Rich Gray
|
||||||
|
Richard Archer
|
||||||
|
Richard Atterer
|
||||||
|
Richard Bramante
|
||||||
|
Richard Clayton
|
||||||
|
Richard Cooper
|
||||||
|
Richard Gorton
|
||||||
|
Richard Prescott
|
||||||
|
Rick Jones
|
||||||
|
Rick Richardson
|
||||||
|
Rob Stanzel
|
||||||
|
Robert D. Young
|
||||||
|
Robert Olson
|
||||||
|
Robert Weaver
|
||||||
|
Robin Kay
|
||||||
|
Rodney Simmons
|
||||||
|
Roland Krikava
|
||||||
|
Roland Zimmermann
|
||||||
|
Roman Koifman
|
||||||
|
Ron Zapp
|
||||||
|
Rosimildo da Silva
|
||||||
|
Roy Shan
|
||||||
|
Rune Kleveland
|
||||||
|
Ryan Nelson
|
||||||
|
S. Moonesamy
|
||||||
|
Salvador D<>vila
|
||||||
|
Salvatore Sorrentino
|
||||||
|
Sampo Kellomaki
|
||||||
|
Samuel D<>az Garc<72>a
|
||||||
|
Samuel Listopad
|
||||||
|
Sander Gates
|
||||||
|
Saul good
|
||||||
|
Scott Davis
|
||||||
|
Sebastien Willemijns
|
||||||
|
Sergio Ballestrero
|
||||||
|
Seshubabu Pasam
|
||||||
|
Shard
|
||||||
|
Shawn Poulson
|
||||||
|
Shmulik Regev
|
||||||
|
Siddhartha Prakash Jain
|
||||||
|
Simon Dick
|
||||||
|
Simon Josefsson
|
||||||
|
Simon Liu
|
||||||
|
Spiridonoff A.V
|
||||||
|
Stadler Stephan
|
||||||
|
Stefan Esser
|
||||||
|
Stefan Ulrich
|
||||||
|
Stephan Bergmann
|
||||||
|
Stephen Kick
|
||||||
|
Stephen More
|
||||||
|
Sterling Hughes
|
||||||
|
Steve Green
|
||||||
|
Steve Lhomme
|
||||||
|
Steve Marx
|
||||||
|
Steve Oliphant
|
||||||
|
Steven Bazyl
|
||||||
|
Steven G. Johnson
|
||||||
|
Stoned Elipot
|
||||||
|
Sven Neuhaus
|
||||||
|
S<EFBFBD>bastien Willemijns
|
||||||
|
T. Bharath
|
||||||
|
T. Yamada
|
||||||
|
Temprimus
|
||||||
|
Thomas Schwinge
|
||||||
|
Thomas Tonino
|
||||||
|
Tim Baker
|
||||||
|
Tim Bartley
|
||||||
|
Tim Costello
|
||||||
|
Tim Sneddon
|
||||||
|
Toby Peterson
|
||||||
|
Todd Kulesza
|
||||||
|
Tom Benoist
|
||||||
|
Tom Lee
|
||||||
|
Tom Mattison
|
||||||
|
Tom Moers
|
||||||
|
Tom Zerucha
|
||||||
|
Tomas Pospisek
|
||||||
|
Tomas Szepe
|
||||||
|
Tomasz Lacki
|
||||||
|
Tommy Tam
|
||||||
|
Ton Voon
|
||||||
|
Tor Arntsen
|
||||||
|
Torsten Foertsch
|
||||||
|
Toshiyuki Maezawa
|
||||||
|
Traian Nicolescu
|
||||||
|
Troels Walsted Hansen
|
||||||
|
Troy Engel
|
||||||
|
Tupone Alfredo
|
||||||
|
Ulf H<>rnhammar
|
||||||
|
Ulrich Zadow
|
||||||
|
Vilmos Nebehaj
|
||||||
|
Vincent Bronner
|
||||||
|
Vincent Penquerc'h
|
||||||
|
Vincent Sanders
|
||||||
|
Vojtech Janota
|
||||||
|
Vojtech Minarik
|
||||||
|
Walter J. Mack
|
||||||
|
Wayne Haigh
|
||||||
|
Werner Koch
|
||||||
|
Wesley Laxton
|
||||||
|
Wez Furlong
|
||||||
|
Wilfredo Sanchez
|
||||||
|
Wojciech Zwiefka
|
||||||
|
Yang Tse
|
||||||
|
Yarram Sunil
|
||||||
|
Zvi Har'El
|
||||||
|
nk
|
||||||
|
swalkaus at yahoo.com
|
||||||
|
tommink[at]post.pl
|
||||||
|
|||||||
90
docs/TODO
90
docs/TODO
@@ -26,25 +26,46 @@ TODO
|
|||||||
|
|
||||||
* More data sharing. curl_share_* functions already exist and work, and they
|
* More data sharing. curl_share_* functions already exist and work, and they
|
||||||
can be extended to share more. For example, enable sharing of the ares
|
can be extended to share more. For example, enable sharing of the ares
|
||||||
channel.
|
channel and the connection cache.
|
||||||
|
|
||||||
* Introduce a new error code indicating authentication problems (for proxy
|
* Introduce a new error code indicating authentication problems (for proxy
|
||||||
CONNECT error 407 for example). This cannot be an error code, we must not
|
CONNECT error 407 for example). This cannot be an error code, we must not
|
||||||
return informational stuff as errors, consider a new info returned by
|
return informational stuff as errors, consider a new info returned by
|
||||||
curl_easy_getinfo() #845941
|
curl_easy_getinfo() http://curl.haxx.se/bug/view.cgi?id=845941
|
||||||
|
|
||||||
* Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
|
* Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
|
||||||
SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
|
SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
|
||||||
|
To support ipv6 interface addresses properly.
|
||||||
|
|
||||||
* Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and
|
* Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and
|
||||||
GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan.
|
GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan.
|
||||||
|
|
||||||
|
* Add option that changes the interval in which the progress callback is
|
||||||
|
called at most.
|
||||||
|
|
||||||
|
* Make libcurl built with c-ares use c-ares' IPv6 abilities. They weren't
|
||||||
|
present when we first added c-ares support but they have been added since!
|
||||||
|
When this is done and works, we can actually start considering making c-ares
|
||||||
|
powered libcurl the default build (which of course would require that we'd
|
||||||
|
bundle the c-ares source code in the libcurl source code releases).
|
||||||
|
|
||||||
|
* Support CONNECT 407 responses that kill the connection and expect the
|
||||||
|
client to reconnect to complete the authentication. Currently libcurl
|
||||||
|
assumes that a proxy connection will be kept alive.
|
||||||
|
|
||||||
|
* Make the curl/*.h headers include the proper system includes based on what
|
||||||
|
was present at the time when configure was run. Currently, the sys/select.h
|
||||||
|
header is for example included by curl/multi.h only on specific platforms
|
||||||
|
we know MUST have it. This is error-prone. We therefore want the header
|
||||||
|
files to adapt to configure results. Those results must be stored in a new
|
||||||
|
header and they must use a curl name space, i.e not be HAVE_* prefix (as
|
||||||
|
that would risk collide with other apps that use libcurl and that runs
|
||||||
|
configure).
|
||||||
|
|
||||||
LIBCURL - multi interface
|
LIBCURL - multi interface
|
||||||
|
|
||||||
* Add a curl_multi_fdset() alternative that returns only two arrays with file
|
* Add a curl_multi_fdset() alternative. this allows apps to avoid the
|
||||||
desrciptors for reading and writing to allow the app to use whatever
|
FD_SETSIZE problem with select().
|
||||||
function it prefers. Plus, this allows apps to avoid the FD_SETSIZE problem
|
|
||||||
with select().
|
|
||||||
|
|
||||||
* Add curl_multi_timeout() to make libcurl's ares-functionality better.
|
* Add curl_multi_timeout() to make libcurl's ares-functionality better.
|
||||||
|
|
||||||
@@ -59,6 +80,17 @@ TODO
|
|||||||
ready to accept read data. Today libcurl feeds the data as soon as it is
|
ready to accept read data. Today libcurl feeds the data as soon as it is
|
||||||
available for reading, no matter what.
|
available for reading, no matter what.
|
||||||
|
|
||||||
|
* Add curl_multi_socket() and family to the multi interface that gets file
|
||||||
|
descriptors, as an alternative to the curl_multi_fdset(). This is necessary
|
||||||
|
to allow apps to properly avoid the FD_SETSIZE problem.
|
||||||
|
|
||||||
|
* Make curl_easy_perform() a wrapper-function that simply creates a multi
|
||||||
|
handle, adds the easy handle to it, runs curl_multi_perform() until the
|
||||||
|
transfer is done, then detach the easy handle, destroy the multi handle and
|
||||||
|
return the easy handle's return code. This will thus make everything
|
||||||
|
internally use and assume the multi interface. The select()-loop should use
|
||||||
|
curl_multi_socket().
|
||||||
|
|
||||||
DOCUMENTATION
|
DOCUMENTATION
|
||||||
|
|
||||||
* More and better
|
* More and better
|
||||||
@@ -68,12 +100,9 @@ TODO
|
|||||||
* Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in
|
* Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in
|
||||||
the process to avoid doing a resolve and connect in vain.
|
the process to avoid doing a resolve and connect in vain.
|
||||||
|
|
||||||
* Code overhaul to make it more state-machine like and to _never_ block on
|
|
||||||
waiting for server responses when used with the multi interface.
|
|
||||||
|
|
||||||
* Support GSS/Kerberos 5 for ftp file transfer. This will allow user
|
* Support GSS/Kerberos 5 for ftp file transfer. This will allow user
|
||||||
authentication and file encryption. Possible libraries and example clients
|
authentication and file encryption. Possible libraries and example clients
|
||||||
are available from MIT or Heimdal. Requsted by Markus Moeller.
|
are available from MIT or Heimdal. Requested by Markus Moeller.
|
||||||
|
|
||||||
* REST fix for servers not behaving well on >2GB requests. This should fail
|
* REST fix for servers not behaving well on >2GB requests. This should fail
|
||||||
if the server doesn't set the pointer to the requested index. The tricky
|
if the server doesn't set the pointer to the requested index. The tricky
|
||||||
@@ -146,14 +175,31 @@ TODO
|
|||||||
it be? There's so much that could be done if it were! (brought by Chris
|
it be? There's so much that could be done if it were! (brought by Chris
|
||||||
Clark)
|
Clark)
|
||||||
|
|
||||||
* Make curl's SSL layer option capable of using other free SSL libraries.
|
* Make curl's SSL layer capable of using other free SSL libraries. Such as
|
||||||
Such as the Mozilla Security Services
|
Mozilla Security Services
|
||||||
(http://www.mozilla.org/projects/security/pki/nss/) and GnuTLS
|
(http://www.mozilla.org/projects/security/pki/nss/), MatrixSSL
|
||||||
(http://www.gnu.org/software/gnutls/) This subject has been brought up
|
(http://www.matrixssl.org/) or yaSSL (http://yassl.com/). At least the
|
||||||
again recently since GPL-licensed applications that link with libcurl MAY
|
latter two could be alternatives for those looking to reduce the footprint
|
||||||
NOT distribute binaries that use OpenSSL without adding an exception clause
|
of libcurl built with OpenSSL or GnuTLS.
|
||||||
to the GPL license. See the LICENSE-MIXING document and this:
|
|
||||||
http://www.gnome.org/~markmc/openssl-and-the-gpl.html
|
* Peter Sylvester's patch for SRP on the TLS layer.
|
||||||
|
Awaits OpenSSL support for this, no need to support this in libcurl before
|
||||||
|
there's an OpenSSL release that does it.
|
||||||
|
|
||||||
|
* make the configure --with-ssl option first check for OpenSSL and then for
|
||||||
|
GnuTLS if OpenSSL wasn't detected.
|
||||||
|
|
||||||
|
GnuTLS
|
||||||
|
|
||||||
|
* Get NTLM working using the functions provided by libgcrypt, since GnuTLS
|
||||||
|
already depends on that to function. 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++.
|
||||||
|
|
||||||
|
* SSL engine stuff?
|
||||||
|
|
||||||
|
* Work out a common method with Peter Sylvester's OpenSSL-patch for SRP
|
||||||
|
on the TLS to provide name and password
|
||||||
|
|
||||||
LDAP
|
LDAP
|
||||||
|
|
||||||
@@ -163,12 +209,6 @@ TODO
|
|||||||
|
|
||||||
NEW PROTOCOLS
|
NEW PROTOCOLS
|
||||||
|
|
||||||
* TFTP - RFC1350 (protocol) and RFC3617 (URI format)
|
|
||||||
|
|
||||||
Dan Fandrich: I wrote a tftp protocol module as part of the I-Boot
|
|
||||||
bootloader under a BSD-style license with attribution clause
|
|
||||||
http://download.intrinsyc.com/supported/tools/i-boot-lite/i-boot-lite-1.8/src/libs/net/tftp.c
|
|
||||||
|
|
||||||
* RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description)
|
* RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description)
|
||||||
|
|
||||||
* SFTP/SCP/SSH (no RFCs for protocol nor URI/URL format). An implementation
|
* SFTP/SCP/SSH (no RFCs for protocol nor URI/URL format). An implementation
|
||||||
@@ -190,7 +230,7 @@ TODO
|
|||||||
* Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
|
* Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
|
||||||
Requested by Dane Jensen and others. This is easily scripted though.
|
Requested by Dane Jensen and others. This is easily scripted though.
|
||||||
|
|
||||||
* Add an option that prevents cURL from overwiting existing local files. When
|
* 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
|
used, and there already is an existing file with the target file name
|
||||||
(either -O or -o), a number should be appended (and increased if already
|
(either -O or -o), a number should be appended (and increased if already
|
||||||
existing). So that index.html becomes first index.html.1 and then
|
existing). So that index.html becomes first index.html.1 and then
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ Version Numbers and Releases
|
|||||||
N is pre-release number
|
N is pre-release number
|
||||||
|
|
||||||
One of these numbers will get bumped in each new release. The numbers to the
|
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 is not
|
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
|
included in the version number. The pre release number is only included in
|
||||||
pre releases (they're never used in public, official, releases).
|
pre releases (they're never used in public, official, releases).
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ Version Numbers and Releases
|
|||||||
|
|
||||||
As a service to any application that might want to support new libcurl
|
As a service to any application that might want to support new libcurl
|
||||||
features while still being able to build with older versions, all releases
|
features while still being able to build with older versions, all releases
|
||||||
have the libcurl version stored in the curl/curl.h file using a static
|
have the libcurl version stored in the curl/curlver.h file using a static
|
||||||
numbering scheme that can be used for comparison. The version number is
|
numbering scheme that can be used for comparison. The version number is
|
||||||
defined as:
|
defined as:
|
||||||
|
|
||||||
@@ -62,3 +62,6 @@ Version Numbers and Releases
|
|||||||
This 6-digit hexadecimal number does not show pre-release number, and it is
|
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
|
always a greater number in a more recent release. It makes comparisons with
|
||||||
greater than and less than work.
|
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.
|
||||||
|
|||||||
@@ -53,10 +53,10 @@ in $prefix/lib and its header files are installed in $prefix/include and so
|
|||||||
on. The prefix is set with "configure --prefix".
|
on. The prefix is set with "configure --prefix".
|
||||||
.IP "--protocols"
|
.IP "--protocols"
|
||||||
Lists what particular protocols the installed libcurl was built to support. At
|
Lists what particular protocols the installed libcurl was built to support. At
|
||||||
the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, GOPHER,
|
the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, FILE,
|
||||||
FILE, TELNET, LDAP, DICT. Do not assume any particular order. The protocols
|
TELNET, LDAP, DICT. Do not assume any particular order. The protocols will
|
||||||
will be listed using uppercase and are separated by newlines. There may be
|
be listed using uppercase and are separated by newlines. There may be none,
|
||||||
none, one or several protocols in the list. (Added in 7.13.0)
|
one or several protocols in the list. (Added in 7.13.0)
|
||||||
.IP "--version"
|
.IP "--version"
|
||||||
Outputs version information about the installed libcurl.
|
Outputs version information about the installed libcurl.
|
||||||
.IP "--vernum"
|
.IP "--vernum"
|
||||||
@@ -64,7 +64,7 @@ Outputs version information about the installed libcurl, in numerical mode.
|
|||||||
This outputs the version number, in hexadecimal, with 8 bits for each part;
|
This outputs the version number, in hexadecimal, with 8 bits for each part;
|
||||||
major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl
|
major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl
|
||||||
12.13.14 would appear as 0c0d0e... Note that the initial zero might be
|
12.13.14 would appear as 0c0d0e... Note that the initial zero might be
|
||||||
omitted.
|
omitted. (This option was broken in the 7.15.0 release.)
|
||||||
.SH "EXAMPLES"
|
.SH "EXAMPLES"
|
||||||
What linker options do I need when I link with libcurl?
|
What linker options do I need when I link with libcurl?
|
||||||
|
|
||||||
|
|||||||
306
docs/curl.1
306
docs/curl.1
@@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
.\" * $Id$
|
.\" * $Id$
|
||||||
.\" **************************************************************************
|
.\" **************************************************************************
|
||||||
.\"
|
.\"
|
||||||
.TH curl 1 "25 Jan 2005" "Curl 7.13.0" "Curl Manual"
|
.TH curl 1 "21 Feb 2006" "Curl 7.15.2" "Curl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl \- transfer a URL
|
curl \- transfer a URL
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -30,8 +30,8 @@ curl \- transfer a URL
|
|||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.B curl
|
.B curl
|
||||||
is a tool to transfer data from or to a server, using one of the supported
|
is a tool to transfer data from or to a server, using one of the supported
|
||||||
protocols (HTTP, HTTPS, FTP, FTPS, GOPHER, DICT, TELNET, LDAP or FILE). The
|
protocols (HTTP, HTTPS, FTP, FTPS, TFTP, DICT, TELNET, LDAP or FILE).
|
||||||
command is designed to work without user interaction.
|
The command is designed to work without user interaction.
|
||||||
|
|
||||||
curl offers a busload of useful tricks like proxy support, user
|
curl offers a busload of useful tricks like proxy support, user
|
||||||
authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file
|
authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file
|
||||||
@@ -64,11 +64,40 @@ several ones next to each other:
|
|||||||
You can specify any amount of URLs on the command line. They will be fetched
|
You can specify any amount of URLs on the command line. They will be fetched
|
||||||
in a sequential manner in the specified order.
|
in a sequential manner in the specified order.
|
||||||
|
|
||||||
|
Since curl 7.15.1 you can also specify step counter for the ranges, so that
|
||||||
|
you can get every Nth number or letter:
|
||||||
|
|
||||||
|
http://www.numericals.com/file[1-100:10].txt
|
||||||
|
http://www.letters.com/file[a-z:2].txt
|
||||||
|
|
||||||
|
If you specify URL without protocol:// prefix, curl will attempt to guess what
|
||||||
|
protocol you might want. It will then default to HTTP but try other protocols
|
||||||
|
based on often-used host name prefixes. For example, for host names starting
|
||||||
|
with "ftp." curl will assume you want to speak FTP.
|
||||||
|
|
||||||
Curl will attempt to re-use connections for multiple file transfers, so that
|
Curl will attempt to re-use connections for multiple file transfers, so that
|
||||||
getting many files from the same server will not do multiple connects /
|
getting many files from the same server will not do multiple connects /
|
||||||
handshakes. This improves speed. Of course this is only done on files
|
handshakes. This improves speed. Of course this is only done on files
|
||||||
specified on a single command line and cannot be used between separate curl
|
specified on a single command line and cannot be used between separate curl
|
||||||
invokes.
|
invokes.
|
||||||
|
.SH "PROGRESS METER"
|
||||||
|
curl normally displays a progress meter during operations, indicating amount
|
||||||
|
of transfered data, transfer speeds and estimated time left etc.
|
||||||
|
|
||||||
|
However, since curl displays data to the terminal by default, if you invoke
|
||||||
|
curl to do an operation and it is about to write data to the terminal, it
|
||||||
|
\fIdisables\fP the progress meter as otherwise it would mess up the output
|
||||||
|
mixing progress meter and response data.
|
||||||
|
|
||||||
|
If you want a progress meter for HTTP POST or PUT requests, you need to
|
||||||
|
redirect the response output to a file, using shell redirect (>), -o [file] or
|
||||||
|
similar.
|
||||||
|
|
||||||
|
It is not the same case for FTP upload as that operation is not spitting out
|
||||||
|
any response data to the terminal.
|
||||||
|
|
||||||
|
If you prefer a progress "bar" instead of the regular meter, \fI-#\fP is your
|
||||||
|
friend.
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.IP "-a/--append"
|
.IP "-a/--append"
|
||||||
(FTP) When used in an FTP upload, this will tell curl to append to the target
|
(FTP) When used in an FTP upload, this will tell curl to append to the target
|
||||||
@@ -89,7 +118,7 @@ most secure one the remote site claims it supports. This is done by first
|
|||||||
doing a request and checking the response-headers, thus inducing an extra
|
doing a request and checking the response-headers, thus inducing an extra
|
||||||
network round-trip. This is used instead of setting a specific authentication
|
network round-trip. This is used instead of setting a specific authentication
|
||||||
method, which you can do with \fI--basic\fP, \fI--digest\fP, \fI--ntlm\fP, and
|
method, which you can do with \fI--basic\fP, \fI--digest\fP, \fI--ntlm\fP, and
|
||||||
\fI--negotiate\fP. (Added in 7.10.6)
|
\fI--negotiate\fP.
|
||||||
|
|
||||||
Note that using --anyauth is not recommended if you do uploads from stdin,
|
Note that using --anyauth is not recommended if you do uploads from stdin,
|
||||||
since it may require data to be sent twice and then the client must be able to
|
since it may require data to be sent twice and then the client must be able to
|
||||||
@@ -129,7 +158,7 @@ If this option is used twice, the second one will disable ASCII usage.
|
|||||||
(HTTP) Tells curl to use HTTP Basic authentication. This is the default and
|
(HTTP) Tells curl to use HTTP Basic authentication. This is the default and
|
||||||
this option is usually pointless, unless you use it to override a previously
|
this option is usually pointless, unless you use it to override a previously
|
||||||
set option that sets a different authentication method (such as \fI--ntlm\fP,
|
set option that sets a different authentication method (such as \fI--ntlm\fP,
|
||||||
\fI--digest\fP and \fI--negotiate\fP). (Added in 7.10.6)
|
\fI--digest\fP and \fI--negotiate\fP).
|
||||||
|
|
||||||
If this option is used several times, the following occurrences make no
|
If this option is used several times, the following occurrences make no
|
||||||
difference.
|
difference.
|
||||||
@@ -187,7 +216,8 @@ To create remote directories when using FTP, try \fI--ftp-create-dirs\fP.
|
|||||||
.IP "--crlf"
|
.IP "--crlf"
|
||||||
(FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390).
|
(FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390).
|
||||||
|
|
||||||
If this option is used twice, the second will again disable crlf converting.
|
If this option is used several times, the following occurrences make no
|
||||||
|
difference.
|
||||||
.IP "-d/--data <data>"
|
.IP "-d/--data <data>"
|
||||||
(HTTP) Sends the specified data in a POST request to the HTTP server, in a way
|
(HTTP) Sends the specified data in a POST request to the HTTP server, in a way
|
||||||
that can emulate as if a user has filled in a HTML form and pressed the submit
|
that can emulate as if a user has filled in a HTML form and pressed the submit
|
||||||
@@ -231,7 +261,7 @@ append data.
|
|||||||
prevents the password from being sent over the wire in clear text. Use this in
|
prevents the password from being sent over the wire in clear text. Use this in
|
||||||
combination with the normal \fI-u/--user\fP option to set user name and
|
combination with the normal \fI-u/--user\fP option to set user name and
|
||||||
password. See also \fI--ntlm\fP, \fI--negotiate\fP and \fI--anyauth\fP for
|
password. See also \fI--ntlm\fP, \fI--negotiate\fP and \fI--anyauth\fP for
|
||||||
related options. (Added in curl 7.10.6)
|
related options.
|
||||||
|
|
||||||
If this option is used several times, the following occurrences make no
|
If this option is used several times, the following occurrences make no
|
||||||
difference.
|
difference.
|
||||||
@@ -241,7 +271,7 @@ active FTP transfers. Curl will normally always first attempt to use EPRT,
|
|||||||
then LPRT before using PORT, but with this option, it will use PORT right
|
then LPRT before using PORT, but with this option, it will use PORT right
|
||||||
away. EPRT and LPRT are extensions to the original FTP protocol, may not work
|
away. EPRT and LPRT are extensions to the original FTP protocol, may not work
|
||||||
on all servers but enable more functionality in a better way than the
|
on all servers but enable more functionality in a better way than the
|
||||||
traditional PORT command. (Added in 7.10.5)
|
traditional PORT command.
|
||||||
|
|
||||||
If this option is used several times, each occurrence will toggle this on/off.
|
If this option is used several times, each occurrence will toggle this on/off.
|
||||||
.IP "--disable-epsv"
|
.IP "--disable-epsv"
|
||||||
@@ -265,9 +295,9 @@ If this option is used several times, the last one will be used.
|
|||||||
.IP "-e/--referer <URL>"
|
.IP "-e/--referer <URL>"
|
||||||
(HTTP) Sends the "Referer Page" information to the HTTP server. This can also
|
(HTTP) Sends the "Referer Page" information to the HTTP server. This can also
|
||||||
be set with the \fI-H/--header\fP flag of course. When used with
|
be set with the \fI-H/--header\fP flag of course. When used with
|
||||||
\fI-L/--location\fP you can append ";auto" to the referer URL to make curl
|
\fI-L/--location\fP you can append ";auto" to the --referer URL to make curl
|
||||||
automatically set the previous URL when it follows a Location: header. The
|
automatically set the previous URL when it follows a Location: header. The
|
||||||
";auto" string can be used alone, even if you don't set an initial referer.
|
\&";auto" string can be used alone, even if you don't set an initial --referer.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "--engine <name>"
|
.IP "--engine <name>"
|
||||||
@@ -325,9 +355,9 @@ If this option is used several times, the last one will be used.
|
|||||||
.IP "-f/--fail"
|
.IP "-f/--fail"
|
||||||
(HTTP) Fail silently (no output at all) on server errors. This is mostly done
|
(HTTP) Fail silently (no output at all) on server errors. This is mostly done
|
||||||
like this to better enable scripts etc to better deal with failed attempts. In
|
like this to better enable scripts etc to better deal with failed attempts. In
|
||||||
normal cases when a HTTP server fails to deliver a document, it returns a HTML
|
normal cases when a HTTP server fails to deliver a document, it returns an
|
||||||
document stating so (which often also describes why and more). This flag will
|
HTML document stating so (which often also describes why and more). This flag
|
||||||
prevent curl from outputting that and fail silently instead.
|
will prevent curl from outputting that and return error 22.
|
||||||
|
|
||||||
If this option is used twice, the second will again disable silent failure.
|
If this option is used twice, the second will again disable silent failure.
|
||||||
.IP "--ftp-account [data]"
|
.IP "--ftp-account [data]"
|
||||||
@@ -339,15 +369,43 @@ If this option is used twice, the second will override the previous use.
|
|||||||
.IP "--ftp-create-dirs"
|
.IP "--ftp-create-dirs"
|
||||||
(FTP) When an FTP URL/operation uses a path that doesn't currently exist on
|
(FTP) When an FTP URL/operation uses a path that doesn't currently exist on
|
||||||
the server, the standard behavior of curl is to fail. Using this option, curl
|
the server, the standard behavior of curl is to fail. Using this option, curl
|
||||||
will instead attempt to create missing directories. (Added in 7.10.7)
|
will instead attempt to create missing directories.
|
||||||
|
|
||||||
If this option is used twice, the second will again disable silent failure.
|
If this option is used twice, the second will again disable directory creation.
|
||||||
|
.IP "--ftp-method [method]"
|
||||||
|
(FTP) Control what method curl should use to reach a file on a FTP(S)
|
||||||
|
server. The method argument should be one of the following alternatives:
|
||||||
|
.RS
|
||||||
|
.IP multicwd
|
||||||
|
curl does a single CWD operation for each path part in the given URL. For deep
|
||||||
|
hierarchies this means very many commands. This is how RFC1738 says it should
|
||||||
|
be done. This is the default but the slowest behavior.
|
||||||
|
.IP nocwd
|
||||||
|
curl does no CWD at all. curl will do SIZE, RETR, STOR etc and give a full
|
||||||
|
path to the server for all these commands. This is the fastest behavior.
|
||||||
|
.IP singlecwd
|
||||||
|
curl does one CWD with the full target directory and then operates on the file
|
||||||
|
\&"normally" (like in the multicwd case). This is somewhat more standards
|
||||||
|
compliant than 'nocwd' but without the full penalty of 'multicwd'.
|
||||||
|
.RE
|
||||||
.IP "--ftp-pasv"
|
.IP "--ftp-pasv"
|
||||||
(FTP) Use PASV when transfering. PASV is the internal default behavior, but
|
(FTP) Use PASV when transferring. PASV is the internal default behavior, but
|
||||||
using this option can be used to override a previous --ftp-port option. (Added
|
using this option can be used to override a previous --ftp-port option. (Added
|
||||||
in 7.11.0)
|
in 7.11.0)
|
||||||
|
|
||||||
If this option is used twice, the second will again disable silent failure.
|
If this option is used several times, the following occurrences make no
|
||||||
|
difference.
|
||||||
|
|
||||||
|
.IP "--ftp-skip-pasv-ip"
|
||||||
|
(FTP) Tell curl to not use the IP address the server suggests in its response
|
||||||
|
to curl's PASV command when curl connects the data connection. Instead curl
|
||||||
|
will re-use the same IP address it already uses for the control
|
||||||
|
connection. (Added in 7.14.2)
|
||||||
|
|
||||||
|
This option has no effect if PORT, EPRT or EPSV is used instead of PASV.
|
||||||
|
|
||||||
|
If this option is used twice, the second will again use the server's suggested
|
||||||
|
address.
|
||||||
.IP "--ftp-ssl"
|
.IP "--ftp-ssl"
|
||||||
(FTP) Make the FTP connection switch to use SSL/TLS. (Added in 7.11.0)
|
(FTP) Make the FTP connection switch to use SSL/TLS. (Added in 7.11.0)
|
||||||
|
|
||||||
@@ -380,9 +438,20 @@ or
|
|||||||
|
|
||||||
\fBcurl\fP -F "name=daniel;type=text/foo" url.com
|
\fBcurl\fP -F "name=daniel;type=text/foo" url.com
|
||||||
|
|
||||||
|
You can also explicitly change the name field of an file upload part by
|
||||||
|
setting filename=, like this:
|
||||||
|
|
||||||
|
\fBcurl\fP -F "file=@localfile;filename=nameinpost" url.com
|
||||||
|
|
||||||
See further examples and details in the MANUAL.
|
See further examples and details in the MANUAL.
|
||||||
|
|
||||||
This option can be used multiple times.
|
This option can be used multiple times.
|
||||||
|
.IP "--form-string <name=string>"
|
||||||
|
(HTTP) Similar to \fI--form\fP except that the value string for the named
|
||||||
|
parameter is used literally. Leading \&'@' and \&'<' characters, and the
|
||||||
|
\&';type=' string in the value have no special meaning. Use this in preference
|
||||||
|
to \fI--form\fP if there's any possibility that the string value may
|
||||||
|
accidentally trigger the \&'@' or \&'<' features of \fI--form\fP.
|
||||||
.IP "-g/--globoff"
|
.IP "-g/--globoff"
|
||||||
This option switches off the "URL globbing parser". When you set this option,
|
This option switches off the "URL globbing parser". When you set this option,
|
||||||
you can specify URLs that contain the letters {}[] without having them being
|
you can specify URLs that contain the letters {}[] without having them being
|
||||||
@@ -397,7 +466,8 @@ with a '?' separator.
|
|||||||
If used in combination with -I, the POST data will instead be appended to the
|
If used in combination with -I, the POST data will instead be appended to the
|
||||||
URL with a HEAD request.
|
URL with a HEAD request.
|
||||||
|
|
||||||
If used multiple times, nothing special happens.
|
If this option is used several times, the following occurrences make no
|
||||||
|
difference.
|
||||||
.IP "-h/--help"
|
.IP "-h/--help"
|
||||||
Usage help.
|
Usage help.
|
||||||
.IP "-H/--header <header>"
|
.IP "-H/--header <header>"
|
||||||
@@ -410,9 +480,19 @@ set headers without knowing perfectly well what you're doing. Replacing an
|
|||||||
internal header with one without content on the right side of the colon will
|
internal header with one without content on the right side of the colon will
|
||||||
prevent that header from appearing.
|
prevent that header from appearing.
|
||||||
|
|
||||||
|
curl will make sure that each header you add/replace get sent with the proper
|
||||||
|
end of line marker, you should thus \fBnot\fP add that as a part of the header
|
||||||
|
content: do not add newlines or carriage returns they will only mess things up
|
||||||
|
for you.
|
||||||
|
|
||||||
See also the \fI-A/--user-agent\fP and \fI-e/--referer\fP options.
|
See also the \fI-A/--user-agent\fP and \fI-e/--referer\fP options.
|
||||||
|
|
||||||
This option can be used multiple times to add/replace/remove multiple headers.
|
This option can be used multiple times to add/replace/remove multiple headers.
|
||||||
|
.IP "--ignore-content-length"
|
||||||
|
(HTTP)
|
||||||
|
Ignore the Content-Length header. This is particularly useful for servers
|
||||||
|
running Apache 1.x, which will report incorrect Content-Length for files
|
||||||
|
larger than 2 gigabytes.
|
||||||
.IP "-i/--include"
|
.IP "-i/--include"
|
||||||
(HTTP)
|
(HTTP)
|
||||||
Include the HTTP-header in the output. The HTTP-header includes things
|
Include the HTTP-header in the output. The HTTP-header includes things
|
||||||
@@ -438,15 +518,14 @@ If this option is used twice, the second will again disable header only.
|
|||||||
(HTTP) When curl is told to read cookies from a given file, this option will
|
(HTTP) When curl is told to read cookies from a given file, this option will
|
||||||
make it discard all "session cookies". This will basically have the same effect
|
make it discard all "session cookies". This will basically have the same effect
|
||||||
as if a new session is started. Typical browsers always discard session
|
as if a new session is started. Typical browsers always discard session
|
||||||
cookies when they're closed down. (Added in 7.9.7)
|
cookies when they're closed down.
|
||||||
|
|
||||||
If this option is used several times, each occurrence will toggle this on/off.
|
If this option is used several times, each occurrence will toggle this on/off.
|
||||||
.IP "-k/--insecure"
|
.IP "-k/--insecure"
|
||||||
(SSL) This option explicitly allows curl to perform "insecure" SSL connections
|
(SSL) This option explicitly allows curl to perform "insecure" SSL connections
|
||||||
and transfers. Starting with curl 7.10, all SSL connections will be attempted
|
and transfers. All SSL connections are attempted to be made secure by using
|
||||||
to be made secure by using the CA certificate bundle installed by
|
the CA certificate bundle installed by default. This makes all connections
|
||||||
default. This makes all connections considered "insecure" to fail unless
|
considered "insecure" to fail unless \fI-k/--insecure\fP is used.
|
||||||
\fI-k/--insecure\fP is used.
|
|
||||||
|
|
||||||
If this option is used twice, the second time will again disable it.
|
If this option is used twice, the second time will again disable it.
|
||||||
.IP "--key <key>"
|
.IP "--key <key>"
|
||||||
@@ -473,7 +552,7 @@ Specify which config file to read curl arguments from. The config file is a
|
|||||||
text file in which command line arguments can be written which then will be
|
text file in which command line arguments can be written which then will be
|
||||||
used as if they were written on the actual command line. Options and their
|
used as if they were written on the actual command line. Options and their
|
||||||
parameters must be specified on the same config file line. If the parameter is
|
parameters must be specified on the same config file line. If the parameter is
|
||||||
to contain white spaces, the parameter must be inclosed within quotes. If the
|
to contain white spaces, the parameter must be enclosed within quotes. If the
|
||||||
first column of a config line is a '#' character, the rest of the line will be
|
first column of a config line is a '#' character, the rest of the line will be
|
||||||
treated as a comment.
|
treated as a comment.
|
||||||
|
|
||||||
@@ -486,6 +565,20 @@ line. So, it could look similar to this:
|
|||||||
url = "http://curl.haxx.se/docs/"
|
url = "http://curl.haxx.se/docs/"
|
||||||
|
|
||||||
This option can be used multiple times.
|
This option can be used multiple times.
|
||||||
|
|
||||||
|
When curl is invoked, it always (unless \fI-q\fP is used) checks for a default
|
||||||
|
config file and uses it if found. The default config file is checked for in
|
||||||
|
the following places in this order:
|
||||||
|
|
||||||
|
1) curl tries to find the "home dir": It first checks for the CURL_HOME and
|
||||||
|
then the HOME environment variables. Failing that, it uses getpwuid() on
|
||||||
|
unix-like systems (which returns the home dir given the current user in your
|
||||||
|
system). On Windows, it then checks for the APPDATA variable, or as a last
|
||||||
|
resort the '%USERPROFILE%\Application Data'.
|
||||||
|
|
||||||
|
2) On windows, if there is no _curlrc file in the home dir, it checks for one
|
||||||
|
in the same dir the executable curl is placed. On unix-like systems, it will
|
||||||
|
simply try to load .curlrc from the determined home dir.
|
||||||
.IP "--limit-rate <speed>"
|
.IP "--limit-rate <speed>"
|
||||||
Specify the maximum transfer rate you want curl to use. This feature is useful
|
Specify the maximum transfer rate you want curl to use. This feature is useful
|
||||||
if you have a limited pipe and you'd like your transfer not use your entire
|
if you have a limited pipe and you'd like your transfer not use your entire
|
||||||
@@ -499,8 +592,6 @@ If you are also using the \fI-Y/--speed-limit\fP option, that option will take
|
|||||||
precedence and might cripple the rate-limiting slightly, to help keeping the
|
precedence and might cripple the rate-limiting slightly, to help keeping the
|
||||||
speed-limit logic working.
|
speed-limit logic working.
|
||||||
|
|
||||||
This option was introduced in curl 7.10.
|
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-l/--list-only"
|
.IP "-l/--list-only"
|
||||||
(FTP)
|
(FTP)
|
||||||
@@ -514,15 +605,21 @@ list only files in their response to NLST; they do not include
|
|||||||
subdirectories and symbolic links.
|
subdirectories and symbolic links.
|
||||||
|
|
||||||
If this option is used twice, the second will again disable list only.
|
If this option is used twice, the second will again disable list only.
|
||||||
|
.IP "--local-port <num>[-num]"
|
||||||
|
Set a prefered number or range of local port numbers to use for the
|
||||||
|
connection(s). Note that port numbers by nature is a scarce resource that
|
||||||
|
will be busy at times so setting this range to something too narrow might
|
||||||
|
cause unnecessary connection setup failures. (Added in 7.15.2)
|
||||||
.IP "-L/--location"
|
.IP "-L/--location"
|
||||||
(HTTP/HTTPS) If the server reports that the requested page has a different
|
(HTTP/HTTPS) If the server reports that the requested page has moved to a
|
||||||
location (indicated with the header line Location:) this flag will let curl
|
different location (indicated with a Location: header and a 3XX response code)
|
||||||
attempt to reattempt the get on the new place. If used together with
|
this option will make curl redo the request on the new place. If used together
|
||||||
\fI-i/--include\fP or \fI-I/--head\fP, headers from all requested pages will
|
with \fI-i/--include\fP or \fI-I/--head\fP, headers from all requested pages
|
||||||
be shown. If authentication is used, curl will only send its credentials to
|
will be shown. When authentication is used, curl only sends its credentials to
|
||||||
the initial host, so if a redirect takes curl to a different host, it won't
|
the initial host. If a redirect takes curl to a different host, it won't be
|
||||||
intercept the user+password. See also \fI--location-trusted\fP on how to
|
able to intercept the user+password. See also \fI--location-trusted\fP on how
|
||||||
change this.
|
to change this. You can limit the amount of redirects to follow by using the
|
||||||
|
\fI--max-redirs\fP option.
|
||||||
|
|
||||||
If this option is used twice, the second will again disable location following.
|
If this option is used twice, the second will again disable location following.
|
||||||
.IP "--location-trusted"
|
.IP "--location-trusted"
|
||||||
@@ -544,8 +641,7 @@ this given limit. This concerns both FTP and HTTP transfers.
|
|||||||
.IP "-m/--max-time <seconds>"
|
.IP "-m/--max-time <seconds>"
|
||||||
Maximum time in seconds that you allow the whole operation to take. This is
|
Maximum time in seconds that you allow the whole operation to take. This is
|
||||||
useful for preventing your batch jobs from hanging for hours due to slow
|
useful for preventing your batch jobs from hanging for hours due to slow
|
||||||
networks or links going down. This doesn't work fully in win32 systems. See
|
networks or links going down. See also the \fI--connect-timeout\fP option.
|
||||||
also the \fI--connect-timeout\fP option.
|
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-M/--manual"
|
.IP "-M/--manual"
|
||||||
@@ -564,7 +660,7 @@ directory.
|
|||||||
|
|
||||||
A quick and very simple example of how to setup a \fI.netrc\fP to allow curl
|
A quick and very simple example of how to setup a \fI.netrc\fP to allow curl
|
||||||
to ftp to the machine host.domain.com with user name \&'myself' and password
|
to ftp to the machine host.domain.com with user name \&'myself' and password
|
||||||
'secret' should look similar to:
|
\&'secret' should look similar to:
|
||||||
|
|
||||||
.B "machine host.domain.com login myself password secret"
|
.B "machine host.domain.com login myself password secret"
|
||||||
|
|
||||||
@@ -577,12 +673,16 @@ Very similar to \fI--netrc\fP, but this option makes the .netrc usage
|
|||||||
designed by Microsoft and is used in their web applications. It is primarily
|
designed by Microsoft and is used in their web applications. It is primarily
|
||||||
meant as a support for Kerberos5 authentication but may be also used along
|
meant as a support for Kerberos5 authentication but may be also used along
|
||||||
with another authentication methods. For more information see IETF draft
|
with another authentication methods. For more information see IETF draft
|
||||||
draft-brezak-spnego-http-04.txt. (Added in 7.10.6)
|
draft-brezak-spnego-http-04.txt.
|
||||||
|
|
||||||
This option requires that the library was built with GSSAPI support. This is
|
This option requires that the library was built with GSSAPI support. This is
|
||||||
not very common. Use \fI-V/--version\fP to see if your version supports
|
not very common. Use \fI-V/--version\fP to see if your version supports
|
||||||
GSS-Negotiate.
|
GSS-Negotiate.
|
||||||
|
|
||||||
|
When using this option, you must also provide a fake -u/--user option to
|
||||||
|
activate the authentication code properly. Sending a '-u :' is enough as the
|
||||||
|
user name and password from the -u option aren't actually used.
|
||||||
|
|
||||||
If this option is used several times, the following occurrences make no
|
If this option is used several times, the following occurrences make no
|
||||||
difference.
|
difference.
|
||||||
.IP "-N/--no-buffer"
|
.IP "-N/--no-buffer"
|
||||||
@@ -598,7 +698,7 @@ designed by Microsoft and is used by IIS web servers. It is a proprietary
|
|||||||
protocol, reversed engineered by clever people and implemented in curl based
|
protocol, reversed engineered by clever people and implemented in curl based
|
||||||
on their efforts. This kind of behavior should not be endorsed, you should
|
on their efforts. This kind of behavior should not be endorsed, you should
|
||||||
encourage everyone who uses NTLM to switch to a public and documented
|
encourage everyone who uses NTLM to switch to a public and documented
|
||||||
authentication method instead. Such as Digest. (Added in 7.10.6)
|
authentication method instead. Such as Digest.
|
||||||
|
|
||||||
If you want to enable NTLM for your proxy authentication, then use
|
If you want to enable NTLM for your proxy authentication, then use
|
||||||
\fI--proxy-ntlm\fP.
|
\fI--proxy-ntlm\fP.
|
||||||
@@ -628,11 +728,21 @@ dynamically.
|
|||||||
Write output to a local file named like the remote file we get. (Only the file
|
Write output to a local file named like the remote file we get. (Only the file
|
||||||
part of the remote file is used, the path is cut off.)
|
part of the remote file is used, the path is cut off.)
|
||||||
|
|
||||||
|
The remote file name to use for saving is extracted from the given URL,
|
||||||
|
nothing else.
|
||||||
|
|
||||||
You may use this option as many times as you have number of URLs.
|
You may use this option as many times as you have number of URLs.
|
||||||
.IP "--pass <phrase>"
|
.IP "--pass <phrase>"
|
||||||
(SSL) Pass phrase for the private key
|
(SSL) Pass phrase for the private key
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
|
.IP "--proxy-anyauth"
|
||||||
|
Tells curl to pick a suitable authentication method when communicating with
|
||||||
|
the given proxy. This will cause an extra request/response round-trip. (Added
|
||||||
|
in 7.13.2)
|
||||||
|
|
||||||
|
If this option is used twice, the second will again disable the proxy use-any
|
||||||
|
authentication.
|
||||||
.IP "--proxy-basic"
|
.IP "--proxy-basic"
|
||||||
Tells curl to use HTTP Basic authentication when communicating with the given
|
Tells curl to use HTTP Basic authentication when communicating with the given
|
||||||
proxy. Use \fI--basic\fP for enabling HTTP Basic with a remote host. Basic is
|
proxy. Use \fI--basic\fP for enabling HTTP Basic with a remote host. Basic is
|
||||||
@@ -672,16 +782,18 @@ i.e "192.168.10.1" to specify exact IP number
|
|||||||
.IP "host name"
|
.IP "host name"
|
||||||
i.e "my.host.domain" to specify machine
|
i.e "my.host.domain" to specify machine
|
||||||
.IP "-"
|
.IP "-"
|
||||||
(any single-letter string) to make it pick the machine's default
|
make curl pick the same IP address that is already used for the control
|
||||||
|
connection
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
If this option is used several times, the last one will be used. Disable the
|
If this option is used several times, the last one will be used. Disable the
|
||||||
use of PORT with \fI--ftp-pasv\fP. Disable the attempt to use the EPRT command
|
use of PORT with \fI--ftp-pasv\fP. Disable the attempt to use the EPRT command
|
||||||
instead of PORT by using \fI--disable-eprt\fP. EPRT is really PORT++.
|
instead of PORT by using \fI--disable-eprt\fP. EPRT is really PORT++.
|
||||||
.IP "-q"
|
.IP "-q"
|
||||||
If used as the first parameter on the command line, the \fI$HOME/.curlrc\fP
|
If used as the first parameter on the command line, the \fIcurlrc\fP config
|
||||||
file will not be read and used as a config file.
|
file will not be read and used. See the \fI-K/--config\fP for details on the
|
||||||
.IP "-Q/--quote <comand>"
|
default config file search path.
|
||||||
|
.IP "-Q/--quote <command>"
|
||||||
(FTP) Send an arbitrary command to the remote FTP server. Quote commands are
|
(FTP) Send an arbitrary command to the remote FTP server. Quote commands are
|
||||||
sent BEFORE the transfer is taking place (just after the initial PWD command
|
sent BEFORE the transfer is taking place (just after the initial PWD command
|
||||||
to be exact). To make commands take place after a successful transfer, prefix
|
to be exact). To make commands take place after a successful transfer, prefix
|
||||||
@@ -711,7 +823,7 @@ specifies the second 500 bytes
|
|||||||
.B -500
|
.B -500
|
||||||
specifies the last 500 bytes
|
specifies the last 500 bytes
|
||||||
.TP
|
.TP
|
||||||
.B 9500
|
.B 9500-
|
||||||
specifies the bytes from offset 9500 and forward
|
specifies the bytes from offset 9500 and forward
|
||||||
.TP
|
.TP
|
||||||
.B 0-0,-1
|
.B 0-0,-1
|
||||||
@@ -752,7 +864,7 @@ for all forthcoming retries it will double the waiting time until it reaches
|
|||||||
10 minutes which then will be the delay between the rest of the retries. By
|
10 minutes which then will be the delay between the rest of the retries. By
|
||||||
using \fI--retry-delay\fP you disable this exponential backoff algorithm. See
|
using \fI--retry-delay\fP you disable this exponential backoff algorithm. See
|
||||||
also \fI--retry-max-time\fP to limit the total time allowed for
|
also \fI--retry-max-time\fP to limit the total time allowed for
|
||||||
retries. (Option added in 7.12.3)
|
retries. (Added in 7.12.3)
|
||||||
|
|
||||||
If this option is used multiple times, the last occurrence decide the amount.
|
If this option is used multiple times, the last occurrence decide the amount.
|
||||||
.IP "--retry-delay <seconds>"
|
.IP "--retry-delay <seconds>"
|
||||||
@@ -760,7 +872,7 @@ Make curl sleep this amount of time between each retry when a transfer has
|
|||||||
failed with a transient error (it changes the default backoff time algorithm
|
failed with a transient error (it changes the default backoff time algorithm
|
||||||
between retries). This option is only interesting if \fI--retry\fP is also
|
between retries). This option is only interesting if \fI--retry\fP is also
|
||||||
used. Setting this delay to zero will make curl use the default backoff time.
|
used. Setting this delay to zero will make curl use the default backoff time.
|
||||||
(Option added in 7.12.3)
|
(Added in 7.12.3)
|
||||||
|
|
||||||
If this option is used multiple times, the last occurrence decide the amount.
|
If this option is used multiple times, the last occurrence decide the amount.
|
||||||
.IP "--retry-max-time <seconds>"
|
.IP "--retry-max-time <seconds>"
|
||||||
@@ -769,26 +881,36 @@ done as usual (see \fI--retry\fP) as long as the timer hasn't reached this
|
|||||||
given limit. Notice that if the timer hasn't reached the limit, the request
|
given limit. Notice that if the timer hasn't reached the limit, the request
|
||||||
will be made and while performing, it may take longer than this given time
|
will be made and while performing, it may take longer than this given time
|
||||||
period. To limit a single request\'s maximum time, use \fI-m/--max-time\fP.
|
period. To limit a single request\'s maximum time, use \fI-m/--max-time\fP.
|
||||||
Set this option to zero to not timeout retries. (Option added in 7.12.3)
|
Set this option to zero to not timeout retries. (Added in 7.12.3)
|
||||||
|
|
||||||
If this option is used multiple times, the last occurrence decide the amount.
|
If this option is used multiple times, the last occurrence decide the amount.
|
||||||
.IP "-s/--silent"
|
.IP "-s/--silent"
|
||||||
Silent mode. Don't show progress meter or error messages. Makes
|
Silent mode. Don't show progress meter or error messages. Makes
|
||||||
Curl mute.
|
Curl mute.
|
||||||
|
|
||||||
If this option is used twice, the second will again disable mute.
|
If this option is used twice, the second will again disable silent mode.
|
||||||
.IP "-S/--show-error"
|
.IP "-S/--show-error"
|
||||||
When used with -s it makes curl show error message if it fails.
|
When used with -s it makes curl show error message if it fails.
|
||||||
|
|
||||||
If this option is used twice, the second will again disable show error.
|
If this option is used twice, the second will again disable show error.
|
||||||
.IP "--socks <host[:port]>"
|
.IP "--socks4 <host[:port]>"
|
||||||
Use the specified SOCKS5 proxy. If the port number is not specified, it is
|
Use the specified SOCKS4 proxy. If the port number is not specified, it is
|
||||||
assumed at port 1080. (Option added in 7.11.1)
|
assumed at port 1080. (Added in 7.15.2)
|
||||||
|
|
||||||
This option overrides any previous use of \fI-x/--proxy\fP, as they are
|
This option overrides any previous use of \fI-x/--proxy\fP, as they are
|
||||||
mutually exclusive.
|
mutually exclusive.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
|
.IP "--socks5 <host[:port]>"
|
||||||
|
Use the specified SOCKS5 proxy. If the port number is not specified, it is
|
||||||
|
assumed at port 1080. (Added in 7.11.1)
|
||||||
|
|
||||||
|
This option overrides any previous use of \fI-x/--proxy\fP, as they are
|
||||||
|
mutually exclusive.
|
||||||
|
|
||||||
|
If this option is used several times, the last one will be used. (This option
|
||||||
|
was previously wrongly documented and used as --socks without the number
|
||||||
|
appended.)
|
||||||
.IP "--stderr <file>"
|
.IP "--stderr <file>"
|
||||||
Redirect all writes to stderr to the specified file instead. If the file name
|
Redirect all writes to stderr to the specified file instead. If the file name
|
||||||
is a plain '-', it is instead written to stdout. This option has no point when
|
is a plain '-', it is instead written to stdout. This option has no point when
|
||||||
@@ -818,13 +940,10 @@ this is used on a http(s) server, the PUT command will be used.
|
|||||||
|
|
||||||
Use the file name "-" (a single dash) to use stdin instead of a given file.
|
Use the file name "-" (a single dash) to use stdin instead of a given file.
|
||||||
|
|
||||||
Before 7.10.8, when this option was used several times, the last one was used.
|
You can specify one -T for each URL on the command line. Each -T + URL pair
|
||||||
|
specifies what to upload and to where. curl also supports "globbing" of the -T
|
||||||
In curl 7.10.8 and later, you can specify one -T for each URL on the command
|
argument, meaning that you can upload multiple files to a single URL by using
|
||||||
line. Each -T + URL pair specifies what to upload and to where. curl also
|
the same URL globbing style supported in the URL, like this:
|
||||||
supports "globbing" of the -T argument, meaning that you can upload multiple
|
|
||||||
files to a single URL by using the same URL globbing style supported in the
|
|
||||||
URL, like this:
|
|
||||||
|
|
||||||
curl -T "{file1,file2}" http://www.uploadtothissite.com
|
curl -T "{file1,file2}" http://www.uploadtothissite.com
|
||||||
|
|
||||||
@@ -836,8 +955,7 @@ Enables a full trace dump of all incoming and outgoing data, including
|
|||||||
descriptive information, to the given output file. Use "-" as filename to have
|
descriptive information, to the given output file. Use "-" as filename to have
|
||||||
the output sent to stdout.
|
the output sent to stdout.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used. (Added in
|
If this option is used several times, the last one will be used.
|
||||||
7.9.7)
|
|
||||||
.IP "--trace-ascii <file>"
|
.IP "--trace-ascii <file>"
|
||||||
Enables a full trace dump of all incoming and outgoing data, including
|
Enables a full trace dump of all incoming and outgoing data, including
|
||||||
descriptive information, to the given output file. Use "-" as filename to have
|
descriptive information, to the given output file. Use "-" as filename to have
|
||||||
@@ -847,16 +965,28 @@ This is very similar to \fI--trace\fP, but leaves out the hex part and only
|
|||||||
shows the ASCII part of the dump. It makes smaller output that might be easier
|
shows the ASCII part of the dump. It makes smaller output that might be easier
|
||||||
to read for untrained humans.
|
to read for untrained humans.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used. (Added in
|
If this option is used several times, the last one will be used.
|
||||||
7.9.7)
|
.IP "--trace-time"
|
||||||
|
Prepends a time stamp to each trace or verbose line that curl displays.
|
||||||
|
(Added in 7.14.0)
|
||||||
|
|
||||||
|
If this option is used several times, each occurrence will toggle it on/off.
|
||||||
.IP "-u/--user <user:password>"
|
.IP "-u/--user <user:password>"
|
||||||
Specify user and password to use for server authentication. Overrides
|
Specify user and password to use for server authentication. Overrides
|
||||||
\fI-n/--netrc\fP and \fI--netrc-optional\fP.
|
\fI-n/--netrc\fP and \fI--netrc-optional\fP.
|
||||||
|
|
||||||
|
If you use an SSPI-enabled curl binary and do NTLM autentication, you can
|
||||||
|
force curl to pick up the user name and password from your environment by
|
||||||
|
simply specifying a single colon with this option: "-u :".
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-U/--proxy-user <user:password>"
|
.IP "-U/--proxy-user <user:password>"
|
||||||
Specify user and password to use for proxy authentication.
|
Specify user and password to use for proxy authentication.
|
||||||
|
|
||||||
|
If you use an SSPI-enabled curl binary and do NTLM autentication, you can
|
||||||
|
force curl to pick up the user name and password from your environment by
|
||||||
|
simply specifying a single colon with this option: "-U :".
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "--url <URL>"
|
.IP "--url <URL>"
|
||||||
Specify a URL to fetch. This option is mostly handy when you want to specify
|
Specify a URL to fetch. This option is mostly handy when you want to specify
|
||||||
@@ -866,9 +996,9 @@ This option may be used any number of times. To control where this URL is
|
|||||||
written, use the \fI-o/--output\fP or the \fI-O/--remote-name\fP options.
|
written, use the \fI-o/--output\fP or the \fI-O/--remote-name\fP options.
|
||||||
.IP "-v/--verbose"
|
.IP "-v/--verbose"
|
||||||
Makes the fetching more verbose/talkative. Mostly usable for debugging. Lines
|
Makes the fetching more verbose/talkative. Mostly usable for debugging. Lines
|
||||||
starting with '>' means data sent by curl, '<' means data received by curl
|
starting with '>' means "header data" sent by curl, '<' means "header data"
|
||||||
that is hidden in normal cases and lines starting with '*' means additional
|
received by curl that is hidden in normal cases and lines starting with '*'
|
||||||
info provided by curl.
|
means additional info provided by curl.
|
||||||
|
|
||||||
Note that if you only want HTTP headers in the output, \fI-i/--include\fP
|
Note that if you only want HTTP headers in the output, \fI-i/--include\fP
|
||||||
might be option you're looking for.
|
might be option you're looking for.
|
||||||
@@ -912,13 +1042,16 @@ SPNEGO Negotiate authentication is supported.
|
|||||||
This curl supports transfers of large files, files larger than 2GB.
|
This curl supports transfers of large files, files larger than 2GB.
|
||||||
.IP "IDN"
|
.IP "IDN"
|
||||||
This curl supports IDN - international domain names.
|
This curl supports IDN - international domain names.
|
||||||
|
.IP "SSPI"
|
||||||
|
SSPI is supported. If you use NTLM and set a blank user name, curl will
|
||||||
|
authenticate with your current user and password.
|
||||||
.RE
|
.RE
|
||||||
.IP "-w/--write-out <format>"
|
.IP "-w/--write-out <format>"
|
||||||
Defines what to display after a completed and successful operation. The format
|
Defines what to display on stdout after a completed and successful
|
||||||
is a string that may contain plain text mixed with any number of variables. The
|
operation. The format is a string that may contain plain text mixed with any
|
||||||
string can be specified as "string", to get read from a particular file you
|
number of variables. The string can be specified as "string", to get read from
|
||||||
specify it "@filename" and to tell curl to read the format from stdin you
|
a particular file you specify it "@filename" and to tell curl to read the
|
||||||
write "@-".
|
format from stdin you write "@-".
|
||||||
|
|
||||||
The variables present in the output format will be substituted by the value or
|
The variables present in the output format will be substituted by the value or
|
||||||
text that curl thinks fit, as described below. All variables are specified
|
text that curl thinks fit, as described below. All variables are specified
|
||||||
@@ -991,7 +1124,7 @@ The average download speed that curl measured for the complete download.
|
|||||||
The average upload speed that curl measured for the complete upload.
|
The average upload speed that curl measured for the complete upload.
|
||||||
.TP
|
.TP
|
||||||
.B content_type
|
.B content_type
|
||||||
The Content-Type of the requested document, if there was any. (Added in 7.9.5)
|
The Content-Type of the requested document, if there was any.
|
||||||
.TP
|
.TP
|
||||||
.B num_connects
|
.B num_connects
|
||||||
Number of new connects made in the recent transfer. (Added in 7.12.3)
|
Number of new connects made in the recent transfer. (Added in 7.12.3)
|
||||||
@@ -1014,12 +1147,16 @@ transparently be converted to HTTP. It means that certain protocol specific
|
|||||||
operations might not be available. This is not the case if you can tunnel
|
operations might not be available. This is not the case if you can tunnel
|
||||||
through the proxy, as done with the \fI-p/--proxytunnel\fP option.
|
through the proxy, as done with the \fI-p/--proxytunnel\fP option.
|
||||||
|
|
||||||
|
Starting with 7.14.1, the proxy host can be specified the exact same way as
|
||||||
|
the proxy environment variables, include protocol prefix (http://) and
|
||||||
|
embedded user + password.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-X/--request <command>"
|
.IP "-X/--request <command>"
|
||||||
(HTTP)
|
(HTTP) Specifies a custom request method to use when communicating with the
|
||||||
Specifies a custom request to use when communicating with the HTTP server.
|
HTTP server. The specified request will be used instead of the method
|
||||||
The specified request will be used instead of the standard GET. Read the
|
otherwise used (which defaults to GET). Read the HTTP 1.1 specification for
|
||||||
HTTP 1.1 specification for details and explanations.
|
details and explanations.
|
||||||
|
|
||||||
(FTP)
|
(FTP)
|
||||||
Specifies a custom FTP command to use instead of LIST when doing file lists
|
Specifies a custom FTP command to use instead of LIST when doing file lists
|
||||||
@@ -1056,7 +1193,8 @@ If this option is used several times, the last one will be used.
|
|||||||
.IP "--max-redirs <num>"
|
.IP "--max-redirs <num>"
|
||||||
Set maximum number of redirection-followings allowed. If \fI-L/--location\fP
|
Set maximum number of redirection-followings allowed. If \fI-L/--location\fP
|
||||||
is used, this option can be used to prevent curl from following redirections
|
is used, this option can be used to prevent curl from following redirections
|
||||||
\&"in absurdum".
|
\&"in absurdum". By default, the limit is set to 50 redirections. Set this
|
||||||
|
option to -1 to make it limitless.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-0/--http1.0"
|
.IP "-0/--http1.0"
|
||||||
@@ -1085,11 +1223,11 @@ Note that not all FTP server allow 3rd party transfers. (Added in 7.13.0)
|
|||||||
.IP "-4/--ipv4"
|
.IP "-4/--ipv4"
|
||||||
If libcurl is capable of resolving an address to multiple IP versions (which
|
If libcurl is capable of resolving an address to multiple IP versions (which
|
||||||
it is if it is ipv6-capable), this option tells libcurl to resolve names to
|
it is if it is ipv6-capable), this option tells libcurl to resolve names to
|
||||||
IPv4 addresses only. (Added in 7.10.8)
|
IPv4 addresses only.
|
||||||
.IP "-6/--ipv6"
|
.IP "-6/--ipv6"
|
||||||
If libcurl is capable of resolving an address to multiple IP versions (which
|
If libcurl is capable of resolving an address to multiple IP versions (which
|
||||||
it is if it is ipv6-capable), this option tells libcurl to resolve names to
|
it is if it is ipv6-capable), this option tells libcurl to resolve names to
|
||||||
IPv6 addresses only. (Added in 7.10.8)
|
IPv6 addresses only.
|
||||||
.IP "-#/--progress-bar"
|
.IP "-#/--progress-bar"
|
||||||
Make curl display progress information as a progress bar instead of the
|
Make curl display progress information as a progress bar instead of the
|
||||||
default statistics.
|
default statistics.
|
||||||
@@ -1107,13 +1245,11 @@ Sets proxy server to use for HTTP.
|
|||||||
Sets proxy server to use for HTTPS.
|
Sets proxy server to use for HTTPS.
|
||||||
.IP "FTP_PROXY [protocol://]<host>[:port]"
|
.IP "FTP_PROXY [protocol://]<host>[:port]"
|
||||||
Sets proxy server to use for FTP.
|
Sets proxy server to use for FTP.
|
||||||
.IP "GOPHER_PROXY [protocol://]<host>[:port]"
|
|
||||||
Sets proxy server to use for GOPHER.
|
|
||||||
.IP "ALL_PROXY [protocol://]<host>[:port]"
|
.IP "ALL_PROXY [protocol://]<host>[:port]"
|
||||||
Sets proxy server to use if no protocol-specific proxy is set.
|
Sets proxy server to use if no protocol-specific proxy is set.
|
||||||
.IP "NO_PROXY <comma-separated list of hosts>"
|
.IP "NO_PROXY <comma-separated list of hosts>"
|
||||||
list of host names that shouldn't go through any proxy. If set to a asterisk
|
list of host names that shouldn't go through any proxy. If set to a asterisk
|
||||||
'*' only, it matches all hosts.
|
\&'*' only, it matches all hosts.
|
||||||
.SH EXIT CODES
|
.SH EXIT CODES
|
||||||
There exists a bunch of different error codes and their corresponding error
|
There exists a bunch of different error codes and their corresponding error
|
||||||
messages that may appear during bad conditions. At the time of this writing,
|
messages that may appear during bad conditions. At the time of this writing,
|
||||||
@@ -1135,7 +1271,9 @@ Failed to connect to host.
|
|||||||
.IP 8
|
.IP 8
|
||||||
FTP weird server reply. The server sent data curl couldn't parse.
|
FTP weird server reply. The server sent data curl couldn't parse.
|
||||||
.IP 9
|
.IP 9
|
||||||
FTP access denied. The server denied login.
|
FTP access denied. The server denied login or denied access to the particular
|
||||||
|
resource or directory you wanted to reach. Most often you tried to change to a
|
||||||
|
directory that doesn't exist on the server.
|
||||||
.IP 10
|
.IP 10
|
||||||
FTP user/password incorrect. Either one or both were not accepted by the
|
FTP user/password incorrect. Either one or both were not accepted by the
|
||||||
server.
|
server.
|
||||||
@@ -1263,5 +1401,5 @@ http://curl.haxx.se
|
|||||||
ftp://ftp.sunet.se/pub/www/utilities/curl/
|
ftp://ftp.sunet.se/pub/www/utilities/curl/
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR ftp (1),
|
.BR ftp (1),
|
||||||
.BR wget (1),
|
.BR wget (1)
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.c \
|
|||||||
post-callback.c multi-app.c multi-double.c multi-single.c \
|
post-callback.c multi-app.c multi-double.c multi-single.c \
|
||||||
multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \
|
multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \
|
||||||
multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c \
|
multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c \
|
||||||
anyauthput.c htmltitle.cc
|
anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c \
|
||||||
|
cookie_interface.c cacertinmem.c synctime.c
|
||||||
|
|
||||||
all:
|
all:
|
||||||
@echo "done"
|
@echo "done"
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ we expect you to actually torture our web site with your tests! Thanks.
|
|||||||
EXAMPLES
|
EXAMPLES
|
||||||
|
|
||||||
anyauthput.c - HTTP PUT using "any" authentication method
|
anyauthput.c - HTTP PUT using "any" authentication method
|
||||||
|
cacertinmem.c - Use a built-in PEM certificate to retrieve a https page
|
||||||
|
cookie_interface.c - shows usage of simple cookie interface
|
||||||
curlgtk.c - download using a GTK progress bar
|
curlgtk.c - download using a GTK progress bar
|
||||||
curlx.c - getting file info from the remote cert data
|
curlx.c - getting file info from the remote cert data
|
||||||
debug.c - showing how to use the debug callback
|
debug.c - showing how to use the debug callback
|
||||||
@@ -55,6 +57,7 @@ multi-double.c - a multi-interface app doing two simultaneous transfers
|
|||||||
multi-post.c - a multi-interface app doing a multipart formpost
|
multi-post.c - a multi-interface app doing a multipart formpost
|
||||||
multi-single.c - a multi-interface app getting a single file
|
multi-single.c - a multi-interface app getting a single file
|
||||||
multithread.c - an example using multi-treading transfering multiple files
|
multithread.c - an example using multi-treading transfering multiple files
|
||||||
|
opensslthreadlock.c - show how to do locking when using OpenSSL multi-threaded
|
||||||
persistant.c - request two URLs with a persistant connection
|
persistant.c - request two URLs with a persistant connection
|
||||||
post-callback.c - send a HTTP POST using a callback
|
post-callback.c - send a HTTP POST using a callback
|
||||||
postit2.c - send a HTTP multipart formpost
|
postit2.c - send a HTTP multipart formpost
|
||||||
@@ -62,3 +65,4 @@ sepheaders.c - download headers to a separate file
|
|||||||
simple.c - the most simple download a URL source
|
simple.c - the most simple download a URL source
|
||||||
simplepost.c - HTTP POST
|
simplepost.c - HTTP POST
|
||||||
simplessl.c - HTTPS example with certificates many options set
|
simplessl.c - HTTPS example with certificates many options set
|
||||||
|
synctime.c - Sync local time by extracing date from remote HTTP servers
|
||||||
|
|||||||
138
docs/examples/cacertinmem.c
Normal file
138
docs/examples/cacertinmem.c
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Example using a "in core" PEM certificate to retrieve a https page.
|
||||||
|
* Written by Theo Borm
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* on a netBSD system with OPENSSL& LIBCURL installed from
|
||||||
|
* pkgsrc (using default paths) this program can be compiled using:
|
||||||
|
* gcc -I/usr/pkg/include -L/usr/pkg/lib -lcurl -Wl,-R/usr/pkg/lib -lssl
|
||||||
|
* -lcrypto -lz -o curlcacerttest curlcacerttest.c
|
||||||
|
* on other operating systems you may want to change paths to headers
|
||||||
|
* and libraries
|
||||||
|
*/
|
||||||
|
#include <openssl/ssl.h>
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
size_t writefunction( void *ptr, size_t size, size_t nmemb, void *stream)
|
||||||
|
{
|
||||||
|
fwrite(ptr,size,nmemb,stream);
|
||||||
|
return(nmemb*size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CURLcode sslctx_function(CURL * curl, void * sslctx, void * parm)
|
||||||
|
{
|
||||||
|
X509_STORE * store;
|
||||||
|
X509 * cert=NULL;
|
||||||
|
BIO * bio;
|
||||||
|
char * mypem = /* www.cacert.org */
|
||||||
|
"-----BEGIN CERTIFICATE-----\n"\
|
||||||
|
"MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\n"\
|
||||||
|
"IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB\n"\
|
||||||
|
"IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA\n"\
|
||||||
|
"Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO\n"\
|
||||||
|
"BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi\n"\
|
||||||
|
"MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ\n"\
|
||||||
|
"ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\n"\
|
||||||
|
"CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ\n"\
|
||||||
|
"8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6\n"\
|
||||||
|
"zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y\n"\
|
||||||
|
"fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7\n"\
|
||||||
|
"w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc\n"\
|
||||||
|
"G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k\n"\
|
||||||
|
"epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q\n"\
|
||||||
|
"laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ\n"\
|
||||||
|
"QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU\n"\
|
||||||
|
"fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826\n"\
|
||||||
|
"YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w\n"\
|
||||||
|
"ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY\n"\
|
||||||
|
"gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe\n"\
|
||||||
|
"MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0\n"\
|
||||||
|
"IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy\n"\
|
||||||
|
"dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw\n"\
|
||||||
|
"czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0\n"\
|
||||||
|
"dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl\n"\
|
||||||
|
"aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC\n"\
|
||||||
|
"AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg\n"\
|
||||||
|
"b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB\n"\
|
||||||
|
"ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc\n"\
|
||||||
|
"nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg\n"\
|
||||||
|
"18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c\n"\
|
||||||
|
"gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl\n"\
|
||||||
|
"Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY\n"\
|
||||||
|
"sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T\n"\
|
||||||
|
"SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF\n"\
|
||||||
|
"CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum\n"\
|
||||||
|
"GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk\n"\
|
||||||
|
"zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW\n"\
|
||||||
|
"omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD\n"\
|
||||||
|
"-----END CERTIFICATE-----\n";
|
||||||
|
/* get a BIO */
|
||||||
|
bio=BIO_new_mem_buf(mypem, -1);
|
||||||
|
/* use it to read the PEM formatted certificate from memory into an X509
|
||||||
|
* structure that SSL can use
|
||||||
|
*/
|
||||||
|
PEM_read_bio_X509(bio, &cert, 0, NULL);
|
||||||
|
if (cert == NULL)
|
||||||
|
printf("PEM_read_bio_X509 failed...\n");
|
||||||
|
|
||||||
|
/* get a pointer to the X509 certificate store (which may be empty!) */
|
||||||
|
store=SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
|
||||||
|
|
||||||
|
/* add our certificate to this store */
|
||||||
|
if (X509_STORE_add_cert(store, cert)==0)
|
||||||
|
printf("error adding certificate\n");
|
||||||
|
|
||||||
|
/* all set to go */
|
||||||
|
return CURLE_OK ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
CURL * ch;
|
||||||
|
CURLcode rv;
|
||||||
|
|
||||||
|
rv=curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
ch=curl_easy_init();
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_VERBOSE, 0);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_HEADER, 0);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_NOPROGRESS, 1);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_NOSIGNAL, 1);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_WRITEFUNCTION, *writefunction);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_WRITEDATA, stdout);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_HEADERFUNCTION, *writefunction);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_WRITEHEADER, stderr);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM");
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_SSL_VERIFYPEER,1);
|
||||||
|
rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.cacert.org/");
|
||||||
|
|
||||||
|
/* first try: retrieve page without cacerts' certificate -> will fail
|
||||||
|
*/
|
||||||
|
rv=curl_easy_perform(ch);
|
||||||
|
if (rv==CURLE_OK)
|
||||||
|
printf("*** transfer succeeded ***\n");
|
||||||
|
else
|
||||||
|
printf("*** transfer failed ***\n");
|
||||||
|
|
||||||
|
/* second try: retrieve page using cacerts' certificate -> will succeed
|
||||||
|
* load the certificate by installing a function doing the nescessary
|
||||||
|
* "modifications" to the SSL CONTEXT just before link init
|
||||||
|
*/
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
|
||||||
|
rv=curl_easy_perform(ch);
|
||||||
|
if (rv==CURLE_OK)
|
||||||
|
printf("*** transfer succeeded ***\n");
|
||||||
|
else
|
||||||
|
printf("*** transfer failed ***\n");
|
||||||
|
|
||||||
|
curl_easy_cleanup(ch);
|
||||||
|
curl_global_cleanup();
|
||||||
|
}
|
||||||
110
docs/examples/cookie_interface.c
Normal file
110
docs/examples/cookie_interface.c
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* This example shows usage of simple cookie interface.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_cookies(CURL *curl)
|
||||||
|
{
|
||||||
|
CURLcode res;
|
||||||
|
struct curl_slist *cookies;
|
||||||
|
struct curl_slist *nc;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
printf("Cookies, curl knows:\n");
|
||||||
|
res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
|
||||||
|
if (res != CURLE_OK) {
|
||||||
|
fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", curl_easy_strerror(res));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
nc = cookies, i = 1;
|
||||||
|
while (nc) {
|
||||||
|
printf("[%d]: %s\n", i, nc->data);
|
||||||
|
nc = nc->next;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i == 1) {
|
||||||
|
printf("(none)\n");
|
||||||
|
}
|
||||||
|
curl_slist_free_all(cookies);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
curl = curl_easy_init();
|
||||||
|
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_VERBOSE, 1);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* just to start the cookie engine */
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
if (res != CURLE_OK) {
|
||||||
|
fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
print_cookies(curl);
|
||||||
|
|
||||||
|
printf("Erasing curl's knowledge of cookies!\n");
|
||||||
|
curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL");
|
||||||
|
|
||||||
|
print_cookies(curl);
|
||||||
|
|
||||||
|
printf("-----------------------------------------------\n"
|
||||||
|
"Setting a cookie \"PREF\" via cookie interface:\n");
|
||||||
|
#ifdef WIN32
|
||||||
|
#define snprintf _snprintf
|
||||||
|
#endif
|
||||||
|
/* Netscape format cookie */
|
||||||
|
snprintf(nline, 256, "%s\t%s\t%s\t%s\t%u\t%s\t%s",
|
||||||
|
".google.com", "TRUE", "/", "FALSE", time(NULL) + 31337, "PREF", "hello google, i like you very much!");
|
||||||
|
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
|
||||||
|
if (res != CURLE_OK) {
|
||||||
|
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* HTTP-header style cookie */
|
||||||
|
snprintf(nline, 256,
|
||||||
|
"Set-Cookie: OLD_PREF=3d141414bf4209321; "
|
||||||
|
"expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com");
|
||||||
|
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
|
||||||
|
if (res != CURLE_OK) {
|
||||||
|
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
print_cookies(curl);
|
||||||
|
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
if (res != CURLE_OK) {
|
||||||
|
fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "Curl init failed!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_global_cleanup();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -14,6 +14,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include <curl/types.h>
|
#include <curl/types.h>
|
||||||
@@ -37,7 +39,7 @@ void *myrealloc(void *ptr, size_t size)
|
|||||||
size_t
|
size_t
|
||||||
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
|
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
|
||||||
{
|
{
|
||||||
register int realsize = size * nmemb;
|
size_t realsize = size * nmemb;
|
||||||
struct MemoryStruct *mem = (struct MemoryStruct *)data;
|
struct MemoryStruct *mem = (struct MemoryStruct *)data;
|
||||||
|
|
||||||
mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1);
|
mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1);
|
||||||
@@ -93,5 +95,8 @@ int main(int argc, char **argv)
|
|||||||
* you're done with it, you should free() it as a nice application.
|
* you're done with it, you should free() it as a nice application.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if(chunk.memory)
|
||||||
|
free(chunk.memory);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
118
docs/examples/htmltidy.c
Normal file
118
docs/examples/htmltidy.c
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Download a document and use libtidy to parse the HTML.
|
||||||
|
* Written by Jeff Pohlmeyer
|
||||||
|
*
|
||||||
|
* LibTidy => http://tidy.sourceforge.net
|
||||||
|
*
|
||||||
|
* gcc -Wall -I/usr/local/include tidycurl.c -lcurl -ltidy -o tidycurl
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <tidy/tidy.h>
|
||||||
|
#include <tidy/buffio.h>
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
/* curl write callback, to fill tidy's input buffer... */
|
||||||
|
uint write_cb(char *in, uint size, uint nmemb, TidyBuffer *out)
|
||||||
|
{
|
||||||
|
uint r;
|
||||||
|
r = size * nmemb;
|
||||||
|
tidyBufAppend( out, in, r );
|
||||||
|
return(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Traverse the document tree */
|
||||||
|
void dumpNode(TidyDoc doc, TidyNode tnod, int indent )
|
||||||
|
{
|
||||||
|
TidyNode child;
|
||||||
|
for ( child = tidyGetChild(tnod); child; child = tidyGetNext(child) )
|
||||||
|
{
|
||||||
|
ctmbstr name = tidyNodeGetName( child );
|
||||||
|
if ( name )
|
||||||
|
{
|
||||||
|
/* if it has a name, then it's an HTML tag ... */
|
||||||
|
TidyAttr attr;
|
||||||
|
printf( "%*.*s%s ", indent, indent, "<", name);
|
||||||
|
/* walk the attribute list */
|
||||||
|
for ( attr=tidyAttrFirst(child); attr; attr=tidyAttrNext(attr) ) {
|
||||||
|
printf(tidyAttrName(attr));
|
||||||
|
tidyAttrValue(attr)?printf("=\"%s\" ",
|
||||||
|
tidyAttrValue(attr)):printf(" ");
|
||||||
|
}
|
||||||
|
printf( ">\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* if it doesn't have a name, then it's probably text, cdata, etc... */
|
||||||
|
TidyBuffer buf;
|
||||||
|
tidyBufInit(&buf);
|
||||||
|
tidyNodeGetText(doc, child, &buf);
|
||||||
|
printf("%*.*s\n", indent, indent, buf.bp?(char *)buf.bp:"");
|
||||||
|
tidyBufFree(&buf);
|
||||||
|
}
|
||||||
|
dumpNode( doc, child, indent + 4 ); /* recursive */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv )
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
char curl_errbuf[CURL_ERROR_SIZE];
|
||||||
|
TidyDoc tdoc;
|
||||||
|
TidyBuffer docbuf = {0};
|
||||||
|
TidyBuffer tidy_errbuf = {0};
|
||||||
|
int err;
|
||||||
|
if ( argc == 2) {
|
||||||
|
curl = curl_easy_init();
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, no);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_VERBOSE, yes);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
|
||||||
|
|
||||||
|
tdoc = tidyCreate();
|
||||||
|
tidyOptSetBool(tdoc, TidyForceOutput, yes); /* try harder */
|
||||||
|
tidyOptSetInt(tdoc, TidyWrapLen, 4096);
|
||||||
|
tidySetErrorBuffer( tdoc, &tidy_errbuf );
|
||||||
|
tidyBufInit(&docbuf);
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &docbuf);
|
||||||
|
err=curl_easy_perform(curl);
|
||||||
|
if ( !err ) {
|
||||||
|
err = tidyParseBuffer(tdoc, &docbuf); /* parse the input */
|
||||||
|
if ( err >= 0 ) {
|
||||||
|
err = tidyCleanAndRepair(tdoc); /* fix any problems */
|
||||||
|
if ( err >= 0 ) {
|
||||||
|
err = tidyRunDiagnostics(tdoc); /* load tidy error buffer */
|
||||||
|
if ( err >= 0 ) {
|
||||||
|
dumpNode( tdoc, tidyGetRoot(tdoc), 0 ); /* walk the tree */
|
||||||
|
fprintf(stderr, "%s\n", tidy_errbuf.bp); /* show errors */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fprintf(stderr, "%s\n", curl_errbuf);
|
||||||
|
|
||||||
|
/* clean-up */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
tidyBufFree(&docbuf);
|
||||||
|
tidyBufFree(&tidy_errbuf);
|
||||||
|
tidyRelease(tdoc);
|
||||||
|
return(err);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf( "usage: %s <url>\n", argv[0] );
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
@@ -131,7 +131,7 @@ static bool init(CURL *&conn, char *url)
|
|||||||
// libxml start element callback function
|
// libxml start element callback function
|
||||||
//
|
//
|
||||||
|
|
||||||
static void startElement(void *voidContext,
|
static void StartElement(void *voidContext,
|
||||||
const xmlChar *name,
|
const xmlChar *name,
|
||||||
const xmlChar **attributes)
|
const xmlChar **attributes)
|
||||||
{
|
{
|
||||||
@@ -148,7 +148,7 @@ static void startElement(void *voidContext,
|
|||||||
// libxml end element callback function
|
// libxml end element callback function
|
||||||
//
|
//
|
||||||
|
|
||||||
static void endElement(void *voidContext,
|
static void EndElement(void *voidContext,
|
||||||
const xmlChar *name)
|
const xmlChar *name)
|
||||||
{
|
{
|
||||||
Context *context = (Context *)voidContext;
|
Context *context = (Context *)voidContext;
|
||||||
@@ -173,7 +173,7 @@ static void handleCharacters(Context *context,
|
|||||||
// libxml PCDATA callback function
|
// libxml PCDATA callback function
|
||||||
//
|
//
|
||||||
|
|
||||||
static void characters(void *voidContext,
|
static void Characters(void *voidContext,
|
||||||
const xmlChar *chars,
|
const xmlChar *chars,
|
||||||
int length)
|
int length)
|
||||||
{
|
{
|
||||||
@@ -215,10 +215,10 @@ static htmlSAXHandler saxHandler =
|
|||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
startElement,
|
StartElement,
|
||||||
endElement,
|
EndElement,
|
||||||
NULL,
|
NULL,
|
||||||
characters,
|
Characters,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ PROGRAMS = fopen.exe ftpget.exe ftpgetresp.exe ftpupload.exe \
|
|||||||
multi-double.exe multi-post.exe multi-single.exe \
|
multi-double.exe multi-post.exe multi-single.exe \
|
||||||
persistant.exe post-callback.exe postit2.exe \
|
persistant.exe post-callback.exe postit2.exe \
|
||||||
sepheaders.exe simple.exe simplessl.exe https.exe \
|
sepheaders.exe simple.exe simplessl.exe https.exe \
|
||||||
ftp3rdparty.exe getinfo.exe anyauthput.exe
|
ftp3rdparty.exe getinfo.exe anyauthput.exe \
|
||||||
|
cookie_interface.exe
|
||||||
|
|
||||||
all: $(PROGRAMS)
|
all: $(PROGRAMS)
|
||||||
|
|
||||||
|
|||||||
77
docs/examples/opensslthreadlock.c
Normal file
77
docs/examples/opensslthreadlock.c
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This is not a complete stand-alone example.
|
||||||
|
*
|
||||||
|
* Author: Jeremy Brown
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MUTEX_TYPE pthread_mutex_t
|
||||||
|
#define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL)
|
||||||
|
#define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
|
||||||
|
#define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
|
||||||
|
#define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
|
||||||
|
#define THREAD_ID pthread_self( )
|
||||||
|
|
||||||
|
|
||||||
|
void handle_error(const char *file, int lineno, const char *msg){
|
||||||
|
fprintf(stderr, ** %s:%i %s\n, file, lineno, msg);
|
||||||
|
ERR_print_errors_fp(stderr);
|
||||||
|
/* exit(-1); */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This array will store all of the mutexes available to OpenSSL. */
|
||||||
|
static MUTEX_TYPE *mutex_buf= NULL;
|
||||||
|
|
||||||
|
|
||||||
|
static void locking_function(int mode, int n, const char * file, int line)
|
||||||
|
{
|
||||||
|
if (mode & CRYPTO_LOCK)
|
||||||
|
MUTEX_LOCK(mutex_buf[n]);
|
||||||
|
else
|
||||||
|
MUTEX_UNLOCK(mutex_buf[n]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned long id_function(void)
|
||||||
|
{
|
||||||
|
return ((unsigned long)THREAD_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
int thread_setup(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
mutex_buf = (MUTEX_TYPE *)malloc(CRYPTO_num_locks( ) * sizeof(MUTEX_TYPE));
|
||||||
|
if (!mutex_buf)
|
||||||
|
return 0;
|
||||||
|
for (i = 0; i < CRYPTO_num_locks( ); i++)
|
||||||
|
MUTEX_SETUP(mutex_buf[i]);
|
||||||
|
CRYPTO_set_id_callback(id_function);
|
||||||
|
CRYPTO_set_locking_callback(locking_function);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int thread_cleanup(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!mutex_buf)
|
||||||
|
return 0;
|
||||||
|
CRYPTO_set_id_callback(NULL);
|
||||||
|
CRYPTO_set_locking_callback(NULL);
|
||||||
|
for (i = 0; i < CRYPTO_num_locks( ); i++)
|
||||||
|
MUTEX_CLEANUP(mutex_buf[i]);
|
||||||
|
free(mutex_buf);
|
||||||
|
mutex_buf = NULL;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
@@ -78,7 +78,7 @@ int main(void)
|
|||||||
curl_slist *chunk = NULL;
|
curl_slist *chunk = NULL;
|
||||||
|
|
||||||
chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked");
|
chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked");
|
||||||
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER);
|
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
|
||||||
/* use curl_slist_free_all() after the *perform() call to free this
|
/* use curl_slist_free_all() after the *perform() call to free this
|
||||||
list again */
|
list again */
|
||||||
}
|
}
|
||||||
@@ -101,7 +101,7 @@ int main(void)
|
|||||||
curl_slist *chunk = NULL;
|
curl_slist *chunk = NULL;
|
||||||
|
|
||||||
chunk = curl_slist_append(chunk, "Expect:");
|
chunk = curl_slist_append(chunk, "Expect:");
|
||||||
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER);
|
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
|
||||||
/* use curl_slist_free_all() after the *perform() call to free this
|
/* use curl_slist_free_all() after the *perform() call to free this
|
||||||
list again */
|
list again */
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user