Compare commits
1612 Commits
pre-aifix
...
curl-7_15_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
4a9e12542d | ||
|
|
21b4105454 | ||
|
|
d7648d94ca | ||
|
|
883343ba63 | ||
|
|
16b5dc710f | ||
|
|
686d767053 | ||
|
|
ed3176dd6b | ||
|
|
6a99ab098c | ||
|
|
b03adde546 | ||
|
|
e6034ea299 | ||
|
|
c7f51ebeab | ||
|
|
9a820d7a98 | ||
|
|
8dbaf534c8 | ||
|
|
91f483c591 | ||
|
|
c5b448038f | ||
|
|
c4ff5eb0ca | ||
|
|
0859cd2444 | ||
|
|
59b45a90cc | ||
|
|
f661475962 | ||
|
|
54b02ecf09 | ||
|
|
4551e7ce49 | ||
|
|
064bc3ecbc | ||
|
|
cf38a4c470 | ||
|
|
aacc79a3a3 | ||
|
|
9864bf703d | ||
|
|
289a42f050 | ||
|
|
ade1e79b37 | ||
|
|
2415724d5f | ||
|
|
5463177f1f | ||
|
|
4efd751eda | ||
|
|
2337efc3b1 | ||
|
|
b942a25a45 | ||
|
|
beab9a9696 | ||
|
|
177dbc7be0 | ||
|
|
f2e71edcbd | ||
|
|
fad6e5a5bc | ||
|
|
52f6c437fe | ||
|
|
80a8be6319 | ||
|
|
043d70fcdf | ||
|
|
4f7e958969 | ||
|
|
53143910a1 | ||
|
|
95656cd7f3 | ||
|
|
d8f79b263d | ||
|
|
51da8552c3 | ||
|
|
7e42cb61f7 | ||
|
|
6c038680f9 | ||
|
|
291a908f19 | ||
|
|
b264a03f89 | ||
|
|
7472ede32a | ||
|
|
b5065e462b | ||
|
|
8dd799b4bd | ||
|
|
a38520c90d | ||
|
|
3050ae57c0 | ||
|
|
01205f772c | ||
|
|
06ad5be3af | ||
|
|
2fe3829e5e | ||
|
|
a0c8b9bc68 | ||
|
|
0406b1facf | ||
|
|
65dbee01e5 | ||
|
|
b1080f7c9a | ||
|
|
7bfd58d41f | ||
|
|
3851c6aae2 | ||
|
|
ae03fa7d8e | ||
|
|
8a14dd25a9 | ||
|
|
e0bea7d541 | ||
|
|
534a8a05f3 | ||
|
|
f5b8a26d9a | ||
|
|
cf51f7fb65 | ||
|
|
4d1f3d3cd0 | ||
|
|
f70b87b4c5 | ||
|
|
0e26355348 | ||
|
|
246ea56eab | ||
|
|
7c1bba315b | ||
|
|
9395cad379 | ||
|
|
c5b2e85b47 | ||
|
|
38f8087281 | ||
|
|
e3fa7d021e | ||
|
|
a1813e2b2d | ||
|
|
2e62458eef | ||
|
|
bb9e5565f2 | ||
|
|
29102befa6 | ||
|
|
9d1145598a | ||
|
|
065e466f1a | ||
|
|
3ac00f32af | ||
|
|
21bb852750 | ||
|
|
83bab78bda | ||
|
|
894ec46ef4 | ||
|
|
4eb1d3eb1b | ||
|
|
945423e83a | ||
|
|
9fd33c0b96 | ||
|
|
3c09f2d2bd | ||
|
|
7b4bf6a22c | ||
|
|
b5b77f6367 | ||
|
|
5a8097a4d5 | ||
|
|
9cdf6fb64b | ||
|
|
a137223b4f | ||
|
|
52e1ce9518 | ||
|
|
8127a34f98 | ||
|
|
2dcb8b674f | ||
|
|
1e3b1b6e47 | ||
|
|
9cdaae94cc | ||
|
|
316e74be74 | ||
|
|
af69c4f4f7 | ||
|
|
ad9648a215 | ||
|
|
1576f3319e | ||
|
|
8ac90316d9 | ||
|
|
35ba5c826d | ||
|
|
4f4ffa98b5 | ||
|
|
b7d92c3e03 | ||
|
|
4ecf939452 | ||
|
|
7ef6b05ef1 | ||
|
|
695f95aad1 | ||
|
|
2a6ea6d7a7 | ||
|
|
f5e0ff2170 | ||
|
|
814d176b86 | ||
|
|
3955b31362 | ||
|
|
4b3fb5a01c | ||
|
|
67abd4cd47 | ||
|
|
58f4af7973 | ||
|
|
99befd3a15 | ||
|
|
3acda85c2b | ||
|
|
dbb69797cf | ||
|
|
2910880b15 | ||
|
|
8b5f0abef1 | ||
|
|
10b5327b19 | ||
|
|
4ba1eb26fa | ||
|
|
444f6427b8 | ||
|
|
a173e07eec | ||
|
|
3de85777de | ||
|
|
f4c5314890 | ||
|
|
1225ad58bd | ||
|
|
951fdeba67 | ||
|
|
327b46cced | ||
|
|
80d301257c | ||
|
|
0e59182945 | ||
|
|
7270d5ce26 | ||
|
|
a142d419d2 | ||
|
|
23cf63f550 | ||
|
|
13ee90bbd4 | ||
|
|
754d6c3abd | ||
|
|
c6f6e81238 | ||
|
|
7803a1a28a | ||
|
|
3d647b9a98 | ||
|
|
090a7f38be | ||
|
|
8ad47a13e5 | ||
|
|
497cc6bfaf | ||
|
|
d5be114c07 | ||
|
|
6e43a4ccce | ||
|
|
a07dcfd850 | ||
|
|
321511a5be | ||
|
|
c5297b9fd9 | ||
|
|
7e00076586 | ||
|
|
9a8ba19b73 | ||
|
|
41e776f9db | ||
|
|
5c2d4a6bdd | ||
|
|
83b709401c | ||
|
|
3590fffeae | ||
|
|
5e2e87cc8d | ||
|
|
b1bdba7db5 | ||
|
|
e3d342df96 | ||
|
|
ff54a74b4d | ||
|
|
ccf65be0a4 | ||
|
|
7dfef13224 | ||
|
|
0b85e53af2 | ||
|
|
26cfb21c00 | ||
|
|
b7acdbcb4c | ||
|
|
6e1e9caa32 | ||
|
|
f71725de6e | ||
|
|
26fe6da93b | ||
|
|
8d4ac69175 | ||
|
|
4f5a6a33b4 | ||
|
|
ec8ee4404b | ||
|
|
e47b5d4e6c | ||
|
|
494c40fd98 | ||
|
|
d3b414724b | ||
|
|
38181fbc74 | ||
|
|
8847e61fca | ||
|
|
95b84adb9b | ||
|
|
b34d161703 | ||
|
|
d88b3d3d5d | ||
|
|
f2fb9039bd | ||
|
|
a28b32aa45 | ||
|
|
1ba47e7af9 | ||
|
|
9359498b06 | ||
|
|
553082e24a | ||
|
|
dc28a9c0c1 | ||
|
|
1faef62d59 | ||
|
|
0d0d5e7ee3 | ||
|
|
4f567d0f81 | ||
|
|
f23d923fd3 | ||
|
|
10d6d8b2ae | ||
|
|
358e08b95d | ||
|
|
e181eda253 | ||
|
|
7d3f5d7ac1 | ||
|
|
37c7a695a2 | ||
|
|
07f107ae20 | ||
|
|
5c14b3be6d | ||
|
|
1dc15ec1bc | ||
|
|
6a9ed44088 | ||
|
|
bdb0620529 | ||
|
|
be9ea07e87 | ||
|
|
4cf14e9f85 | ||
|
|
d02b2c4308 | ||
|
|
1687a9eb94 | ||
|
|
344c6a3725 | ||
|
|
f966dad306 | ||
|
|
887f41c062 | ||
|
|
4b1350e467 | ||
|
|
22a0c57746 | ||
|
|
fec571f5b0 | ||
|
|
976285ccbc | ||
|
|
9b3b7ad22e | ||
|
|
1b8ac7c6b5 | ||
|
|
bd2db87237 | ||
|
|
df3ca59116 | ||
|
|
3ca4509ae9 | ||
|
|
d531926246 | ||
|
|
357fdb60b6 | ||
|
|
b6f855cb9b | ||
|
|
b6646310e8 | ||
|
|
070da3c08f | ||
|
|
6b7f6369ec | ||
|
|
309e3ce4f9 | ||
|
|
8a4eb8ed45 | ||
|
|
eee70dcf8e | ||
|
|
c0c885a1f3 | ||
|
|
a7488672bf | ||
|
|
c1312cab1f | ||
|
|
8c833d375a | ||
|
|
18f14ae23d | ||
|
|
98adcdd466 | ||
|
|
a2bd47c567 | ||
|
|
7b3c308eb0 | ||
|
|
1be1d3cfb8 | ||
|
|
b970469df9 | ||
|
|
80a324386b | ||
|
|
163518778c | ||
|
|
7fd1ce4dc3 | ||
|
|
c78ee11c41 | ||
|
|
4435e3b269 | ||
|
|
b96a0dba90 | ||
|
|
30dfc00a54 | ||
|
|
fe5979cfdb | ||
|
|
a1f7987ad8 | ||
|
|
ac269a8f68 | ||
|
|
35944744f8 | ||
|
|
4b1c0bd1e7 | ||
|
|
b7ff86fa2b | ||
|
|
2c27e4ee76 | ||
|
|
6ac9e67bd7 | ||
|
|
8726a6b6ed | ||
|
|
2f26069a41 | ||
|
|
d6c155ff47 | ||
|
|
15360e5e51 | ||
|
|
e587a56fc0 | ||
|
|
113531432a | ||
|
|
bfa74c2649 | ||
|
|
6bb215f56c | ||
|
|
8b37844e5f | ||
|
|
1445e62312 | ||
|
|
4781ff88fd | ||
|
|
c28e15c682 | ||
|
|
fe0585ec91 | ||
|
|
18c0b49f3d | ||
|
|
5d69c956ee | ||
|
|
93aa22ea08 | ||
|
|
b7c6bc20be | ||
|
|
9bb4a95e08 | ||
|
|
0966ddafaa | ||
|
|
c073625fb9 | ||
|
|
85dd4bfb8d | ||
|
|
5ae34aa8e1 | ||
|
|
0eb8414750 | ||
|
|
09717d3fc8 | ||
|
|
81a3246a56 | ||
|
|
4c8fbe9abf | ||
|
|
c0d448f778 | ||
|
|
16e9a9eaef | ||
|
|
0d7446c134 | ||
|
|
a4752673bb | ||
|
|
9a0d5c4ed8 | ||
|
|
d85bc18178 | ||
|
|
f0e66d8c76 | ||
|
|
af114358c8 | ||
|
|
ffe17a8197 | ||
|
|
2459e1e268 | ||
|
|
a34a4af36a | ||
|
|
bf51f05a50 | ||
|
|
5d94ff5974 | ||
|
|
0d4ddfa743 | ||
|
|
56c9899832 | ||
|
|
7b3fba1ad5 | ||
|
|
700e3b685a | ||
|
|
3e1caa6185 | ||
|
|
50eafb7668 | ||
|
|
25559ac02e | ||
|
|
51a87fa652 | ||
|
|
b2dad0342f | ||
|
|
a5abce7982 | ||
|
|
de3f22b288 | ||
|
|
be5cc378c8 | ||
|
|
4afc4aed73 | ||
|
|
a4e1ac7952 | ||
|
|
f84d2b4d36 | ||
|
|
b4c7876e4b | ||
|
|
4207ef3d27 | ||
|
|
b3572269a4 | ||
|
|
097d449cc1 | ||
|
|
7f44713487 | ||
|
|
b7a6b78e0c | ||
|
|
855a9eff76 | ||
|
|
8e34e75100 | ||
|
|
4be60ac155 | ||
|
|
5ec4501b9d | ||
|
|
e80f566a14 | ||
|
|
1729918777 | ||
|
|
cef290c6b4 | ||
|
|
539e34b5df | ||
|
|
765683403f | ||
|
|
cca9fca894 | ||
|
|
2b403db811 | ||
|
|
03e7b7c95f | ||
|
|
1a05a90f1c | ||
|
|
dcea109bb5 | ||
|
|
d46a573bbe | ||
|
|
7d0d19708a | ||
|
|
09f14efade | ||
|
|
87753cda49 | ||
|
|
66f6f43056 | ||
|
|
86f059dcfb | ||
|
|
5931d43a36 | ||
|
|
8475a0df2f | ||
|
|
ccc4c9c02c | ||
|
|
16edb15600 | ||
|
|
9e7534a46e | ||
|
|
737dddaec0 | ||
|
|
b5c90c9b05 | ||
|
|
c3ecd552f5 | ||
|
|
56f0227c92 | ||
|
|
dcb5a4df01 | ||
|
|
fd64213c2f | ||
|
|
fc2c06754c | ||
|
|
7ec200f4d1 | ||
|
|
e53f139925 | ||
|
|
61599ceb7b | ||
|
|
6f8e3f106a | ||
|
|
8fd676f73e | ||
|
|
98a8103a3b | ||
|
|
94043b1150 | ||
|
|
1b02ad5e8a | ||
|
|
4897587615 | ||
|
|
8e2f57c82e | ||
|
|
c3323b1902 | ||
|
|
59c063dfd3 | ||
|
|
8c16696f47 | ||
|
|
f68950db67 | ||
|
|
710e370c34 | ||
|
|
7bb6d76d14 | ||
|
|
2467f814a8 | ||
|
|
a654ef9ee6 | ||
|
|
c1688733c1 | ||
|
|
cd73a733c7 | ||
|
|
8ef8e949bd | ||
|
|
49111a63e6 | ||
|
|
ee4ecf5155 | ||
|
|
3478253e5a | ||
|
|
6ddc59dadf | ||
|
|
dc8688b8dc | ||
|
|
865e495188 | ||
|
|
d3c0ed007e | ||
|
|
0dc79376e7 | ||
|
|
3ccbed1022 | ||
|
|
377e43fbb9 | ||
|
|
1f2b042b95 | ||
|
|
fd49ba6c18 | ||
|
|
facfa19cdd | ||
|
|
3347ced899 | ||
|
|
592686bee9 | ||
|
|
f471a293ea | ||
|
|
c688166066 | ||
|
|
5dcd2710d4 | ||
|
|
16d8383625 | ||
|
|
6b49fd7483 | ||
|
|
f10985fc50 | ||
|
|
edeac97773 | ||
|
|
40498ffdd0 | ||
|
|
fd884a3cd2 | ||
|
|
1887629c5c | ||
|
|
d3be5b2725 | ||
|
|
2e973684c0 | ||
|
|
ab909fc4c2 | ||
|
|
4cd5220d27 | ||
|
|
24d47a6e07 | ||
|
|
8a66584db4 | ||
|
|
186f433e40 | ||
|
|
736a40fec9 | ||
|
|
4245400ae4 | ||
|
|
629bba6b35 | ||
|
|
f6f2a9e4be | ||
|
|
8bfcae65ef | ||
|
|
96cf615e9d | ||
|
|
e9b3e1d031 | ||
|
|
7167cde020 | ||
|
|
2a80a4c521 | ||
|
|
83f11b1c9b | ||
|
|
a00e7f0f5e | ||
|
|
e1607f5705 | ||
|
|
cce931f27d | ||
|
|
34089c93bb | ||
|
|
beb61ef429 | ||
|
|
72aff74798 | ||
|
|
8e715af480 | ||
|
|
2730842559 | ||
|
|
cac269cf91 | ||
|
|
249036ada0 | ||
|
|
18d80b9e8f | ||
|
|
b2d8e0b476 | ||
|
|
225a652021 | ||
|
|
38b1d96750 | ||
|
|
2f069ad3e2 | ||
|
|
a3dbe03e80 | ||
|
|
f4bef25b5e | ||
|
|
ebf7d22503 | ||
|
|
9296d9deb8 | ||
|
|
7b95a25adc | ||
|
|
82d6cfa7fc | ||
|
|
48750d5fc7 | ||
|
|
4f0258ec09 | ||
|
|
db4d0d307a | ||
|
|
2baf22e184 | ||
|
|
21d5aead47 | ||
|
|
f40c9b83df | ||
|
|
b9e082b811 | ||
|
|
0bfa601a9f | ||
|
|
e356420123 | ||
|
|
e8f85cba0f | ||
|
|
1aba99b1e7 | ||
|
|
12815d7cd6 | ||
|
|
9deb76ce3e | ||
|
|
c98676068e | ||
|
|
b534f74bf4 | ||
|
|
411e9b0c45 | ||
|
|
3fa1879f6a | ||
|
|
d30cf22c12 | ||
|
|
557b6cfd3f | ||
|
|
84bf03b365 | ||
|
|
34342bcd19 | ||
|
|
5322a86313 | ||
|
|
1dc50e21c4 | ||
|
|
1eddbb1b47 | ||
|
|
bb8591cf54 | ||
|
|
a7913a62a9 | ||
|
|
6d1b37b3da | ||
|
|
34750cc738 | ||
|
|
af677c4e1d | ||
|
|
298076e00f | ||
|
|
0d2cdd9773 | ||
|
|
eb5d3b5a7c | ||
|
|
7663775971 | ||
|
|
fe46572f2b | ||
|
|
a6d4d3eeac | ||
|
|
62f97f1817 | ||
|
|
253ff7b2ad | ||
|
|
c274e51654 | ||
|
|
1239e48304 | ||
|
|
52313cbac9 | ||
|
|
071218a201 | ||
|
|
f0d6cc23ae | ||
|
|
ceefe2e248 | ||
|
|
9a2aed7d7a | ||
|
|
a91a75355d | ||
|
|
01acbfa1a5 | ||
|
|
49b2896a3b | ||
|
|
39af394a1c | ||
|
|
5c7dcc6c33 | ||
|
|
6c5ea2af27 | ||
|
|
93e084e097 | ||
|
|
1a61bcecfc | ||
|
|
3d9fb701e2 | ||
|
|
19a568a983 | ||
|
|
70c3f6a8dd | ||
|
|
bb999d8213 | ||
|
|
121197bc87 | ||
|
|
d5dd8e0fdc | ||
|
|
c368800877 | ||
|
|
6eb58549a9 | ||
|
|
95def48071 | ||
|
|
2ee6c33412 | ||
|
|
be7ce435c0 | ||
|
|
f4252f8672 | ||
|
|
f4f961c4ea | ||
|
|
e2fe03df8e | ||
|
|
19b284c214 | ||
|
|
6b3e3095ea | ||
|
|
fd2aad1d9b | ||
|
|
d239fc5d04 | ||
|
|
ec4da97a35 | ||
|
|
bb48ccedd7 | ||
|
|
afc0dfb141 | ||
|
|
8e87223195 | ||
|
|
be1cece69b | ||
|
|
45be6d6645 | ||
|
|
d4db35c125 | ||
|
|
94c6a5eeab | ||
|
|
35292e794a | ||
|
|
c2043a7f94 | ||
|
|
e752588e8d | ||
|
|
8f30dbd4f0 | ||
|
|
29eb80dbd1 | ||
|
|
6cf6f9a21e | ||
|
|
6af6a2bbe8 | ||
|
|
2576ac1c76 | ||
|
|
bfeea8e6b7 | ||
|
|
2f89f2311c | ||
|
|
75e5967afd | ||
|
|
1003628103 | ||
|
|
3451e888b9 | ||
|
|
12dc142a28 | ||
|
|
cb80670885 | ||
|
|
c189687188 | ||
|
|
595016d393 | ||
|
|
23550fe5de | ||
|
|
8420de971f | ||
|
|
17f8f32b2e | ||
|
|
7676f40218 | ||
|
|
2de62cb06f | ||
|
|
be1df3ca0a | ||
|
|
543ab6f331 | ||
|
|
2b6f7ef2a9 | ||
|
|
0d37f8564e | ||
|
|
6cd2536048 | ||
|
|
60fccf4e37 | ||
|
|
8a8028394f | ||
|
|
6a06667cc0 | ||
|
|
25bf23105d | ||
|
|
2544c78083 | ||
|
|
40b9b6f6dc | ||
|
|
f5e1beddf1 | ||
|
|
d4076c9a8a | ||
|
|
106695d45e | ||
|
|
f71b3f48a1 | ||
|
|
aa8dd932c1 | ||
|
|
adbe3eefb6 | ||
|
|
33f69c0546 | ||
|
|
6c3a87a599 | ||
|
|
13cc010e38 | ||
|
|
e99bf99829 | ||
|
|
2e7dcc1e2a | ||
|
|
b85a036e4a | ||
|
|
7885264b29 | ||
|
|
73dd450147 | ||
|
|
96efa990f9 | ||
|
|
4e0aee9408 | ||
|
|
27d509cfe9 | ||
|
|
ade8e47a8c | ||
|
|
ca52c963c7 | ||
|
|
17acdb5acf | ||
|
|
f6433211ae | ||
|
|
0ec4c66fba | ||
|
|
1faa9d6fd5 | ||
|
|
23d64e720d | ||
|
|
b8b56248bd | ||
|
|
33929117f9 | ||
|
|
2b1673c9c8 | ||
|
|
702f549a6a | ||
|
|
428741d7cf | ||
|
|
6fa624cf8c | ||
|
|
5f60188b8a | ||
|
|
75a6fdeb58 | ||
|
|
5f3fa92062 | ||
|
|
66077ae48b | ||
|
|
92637303db | ||
|
|
811dfd710b | ||
|
|
b08dc2cadb | ||
|
|
f7c5a097e3 | ||
|
|
5eb3102cd1 | ||
|
|
05825a8a9f | ||
|
|
24353c4372 | ||
|
|
e89ea07626 | ||
|
|
b99c95ba46 | ||
|
|
9432bfe90c | ||
|
|
37bf6da9c8 | ||
|
|
b3ebbd60a2 | ||
|
|
e942394bdb | ||
|
|
4adfcd4fd7 | ||
|
|
c10196afc0 | ||
|
|
49746d1dce | ||
|
|
d46e235c2a | ||
|
|
ee44677d7e | ||
|
|
20057aee2e | ||
|
|
7119679080 | ||
|
|
d869b51a57 | ||
|
|
dbacc81af7 | ||
|
|
b233c13dca | ||
|
|
464be27479 | ||
|
|
d736ac51c0 | ||
|
|
e8b295ff7d | ||
|
|
4a4490d5f1 | ||
|
|
46313be2f5 | ||
|
|
723bfe42e7 | ||
|
|
e35c7dcd72 | ||
|
|
fa83a0573e | ||
|
|
7b97371ab1 | ||
|
|
b17e32baa7 | ||
|
|
cd52b9f0da | ||
|
|
c3d74ffe48 | ||
|
|
a231a96841 | ||
|
|
93b61bf0d3 | ||
|
|
06d39bd303 | ||
|
|
52177b1f60 | ||
|
|
566f7b5e58 | ||
|
|
c8c47768c7 | ||
|
|
62ff567c47 | ||
|
|
ee400f9552 | ||
|
|
9ac7629e2c | ||
|
|
d72ca96a43 | ||
|
|
d0dcb3b554 | ||
|
|
e139e49826 | ||
|
|
3838745fdb | ||
|
|
06a5c70f4d | ||
|
|
62af3fb7b9 | ||
|
|
db302a1055 | ||
|
|
847c91e568 | ||
|
|
2646af106b | ||
|
|
7261b4556b | ||
|
|
071e3cf007 | ||
|
|
164184b484 | ||
|
|
8b6e87abee | ||
|
|
45197b188e | ||
|
|
559553b169 | ||
|
|
84ec4068de | ||
|
|
aea87be19e | ||
|
|
9f14744d16 | ||
|
|
1dc8c1dbc8 | ||
|
|
e9812c53cb | ||
|
|
ed98565963 | ||
|
|
1d3233612a | ||
|
|
8362a34cef | ||
|
|
edd16d978f | ||
|
|
4356356305 | ||
|
|
cb88135220 | ||
|
|
498a0fe795 | ||
|
|
0ca1b6afcf | ||
|
|
d3c9f3d6f8 | ||
|
|
df59ca1a45 | ||
|
|
9d84442409 | ||
|
|
5ab9d72e45 | ||
|
|
6060e7ed96 | ||
|
|
7ca7f7a725 | ||
|
|
355b3d3057 | ||
|
|
d5bdf5f89c | ||
|
|
17de7e0f1c | ||
|
|
2cea484428 | ||
|
|
fb3e19ae50 | ||
|
|
99db7fb222 | ||
|
|
49d0272627 | ||
|
|
da30242640 | ||
|
|
811edcde18 | ||
|
|
4934e6471b | ||
|
|
9dbd6659dc | ||
|
|
5ddad4cdb3 | ||
|
|
338c2da24f | ||
|
|
b5cafc0b83 | ||
|
|
c50ced6cc2 | ||
|
|
f4783bda27 | ||
|
|
b55507c8a7 | ||
|
|
827a805966 | ||
|
|
e23ba31eb9 | ||
|
|
02c6fde11e | ||
|
|
d003f6e125 | ||
|
|
1dfff2487f | ||
|
|
4ff9cd39c5 | ||
|
|
9c4ffcc250 | ||
|
|
6b5a04cf83 | ||
|
|
55e61c092e | ||
|
|
de6ab3de22 | ||
|
|
5e1eb58e5a | ||
|
|
d892a4dc23 | ||
|
|
496ea65f39 | ||
|
|
6577b15d08 | ||
|
|
f2e35fad27 | ||
|
|
81c48aa43d | ||
|
|
0cfa9b52ae | ||
|
|
48b92c163f | ||
|
|
b7575b39c4 | ||
|
|
ae2f002b44 | ||
|
|
89c312691e | ||
|
|
1d23affbc5 | ||
|
|
26ffaa263b | ||
|
|
ca5e6160b7 | ||
|
|
6d60ff6ea1 | ||
|
|
43ae26f146 | ||
|
|
3e01f70468 | ||
|
|
b9f1dd7691 | ||
|
|
a7bed4fc7c | ||
|
|
7ca49dc91d | ||
|
|
645ee8a42a | ||
|
|
115dd6f095 | ||
|
|
0e03165467 | ||
|
|
6574f4106e | ||
|
|
8e7fcd9ee1 | ||
|
|
ad63e1e698 | ||
|
|
d784526dae | ||
|
|
79d480e1e7 | ||
|
|
b3b2ba31f7 | ||
|
|
7f78bc3c6d | ||
|
|
f508f30fb6 | ||
|
|
d20a05161a | ||
|
|
6769ab2797 | ||
|
|
85867cbe94 | ||
|
|
5e8d3988a2 | ||
|
|
1cd0a08575 | ||
|
|
efd71af2a1 | ||
|
|
2ea80c29fa | ||
|
|
e3fc0d5e78 | ||
|
|
33f42aacca | ||
|
|
c85bf83e88 | ||
|
|
060b6ce148 | ||
|
|
35618b4712 | ||
|
|
cd2e99e980 | ||
|
|
0359ae8f40 | ||
|
|
972d39234f | ||
|
|
798349fce6 | ||
|
|
9612fda886 | ||
|
|
4b217efb84 | ||
|
|
555cfb3059 | ||
|
|
c0d1d6926c | ||
|
|
fca8fcec3e | ||
|
|
6844d5dcad | ||
|
|
d759e97166 | ||
|
|
cbfc737d79 | ||
|
|
ab64bf6fb1 | ||
|
|
0b0d20021c | ||
|
|
932a6f6b77 | ||
|
|
1318760ad2 | ||
|
|
15a403a98d | ||
|
|
a92b7c1b16 | ||
|
|
0c54013ee3 | ||
|
|
ca5d1e7a8d | ||
|
|
40a39e2270 | ||
|
|
982530b186 | ||
|
|
fadc08445a | ||
|
|
783381c163 | ||
|
|
5f26bee7c8 | ||
|
|
2be57d0833 | ||
|
|
6e6748f051 | ||
|
|
a8d544d9b3 | ||
|
|
5f1490e1bd | ||
|
|
2c3e557b5c | ||
|
|
08df4b8971 | ||
|
|
11f58ea896 | ||
|
|
15f3b4b6d1 | ||
|
|
35270e50c2 | ||
|
|
8c975657e7 | ||
|
|
03cb3b9db1 | ||
|
|
19ad942739 | ||
|
|
3cf452b923 | ||
|
|
2a6f9aa155 | ||
|
|
570455b21d | ||
|
|
dccdf9e66c | ||
|
|
dd4d5bb1e0 | ||
|
|
842e4aaa0d | ||
|
|
ebb09cd9c4 | ||
|
|
9a6df07d3d | ||
|
|
c59c429a69 | ||
|
|
69f9d0c916 | ||
|
|
56edbe3804 | ||
|
|
94c4a18541 | ||
|
|
bdcf8d626d | ||
|
|
576b40b1b0 | ||
|
|
954575a19d | ||
|
|
47bbe36725 | ||
|
|
1a8f7e830c | ||
|
|
dfc85b7291 | ||
|
|
1457b80617 | ||
|
|
dba40b35f2 | ||
|
|
e9d95f1a25 | ||
|
|
67e40a2b16 | ||
|
|
25f5f14d35 | ||
|
|
dfda9cc007 | ||
|
|
e39b29fc48 | ||
|
|
4c17ba4fc0 | ||
|
|
4511f7ac50 | ||
|
|
b9f76f11bb | ||
|
|
17841a20e3 | ||
|
|
d90d40b5d1 | ||
|
|
d2e6a0583a | ||
|
|
b2c9277e66 | ||
|
|
31c332af93 | ||
|
|
90af60a6ef | ||
|
|
80c7566203 | ||
|
|
efb1fdbec8 | ||
|
|
bada8cc259 | ||
|
|
c3a076176e | ||
|
|
2cda3070d5 | ||
|
|
728bed8c98 | ||
|
|
6e72ea7442 | ||
|
|
a4aac27fd3 | ||
|
|
5b8816dcb7 | ||
|
|
fc0df97278 | ||
|
|
592658e874 | ||
|
|
5a70e42428 | ||
|
|
e4caa98901 | ||
|
|
c211a7c685 | ||
|
|
7876c078bc | ||
|
|
aedadfc779 | ||
|
|
2046a6b9e5 | ||
|
|
d1d53b2bbf | ||
|
|
950aa1c743 | ||
|
|
a9572bf88a | ||
|
|
5a93f50394 | ||
|
|
60af1cbcc2 | ||
|
|
8952ef933b | ||
|
|
b350d5da59 | ||
|
|
6df3bf3644 | ||
|
|
35840a2c5c | ||
|
|
090b89cc76 | ||
|
|
f05d47ddd6 | ||
|
|
fcfd4bef2d | ||
|
|
18dc8fbc26 | ||
|
|
d9ceee1c75 | ||
|
|
097281f459 | ||
|
|
087748c48e | ||
|
|
e35187741b | ||
|
|
574e911375 | ||
|
|
ce945bd2f0 | ||
|
|
8efa6f407d | ||
|
|
85bd4621db | ||
|
|
6c3759d78d | ||
|
|
4af08a19f8 | ||
|
|
c14650caec | ||
|
|
c7a9e07909 | ||
|
|
185baf036b | ||
|
|
3523613826 | ||
|
|
782ade7223 | ||
|
|
ba40eccc90 | ||
|
|
4191741fb6 | ||
|
|
7a52f44bd4 | ||
|
|
efa5485744 | ||
|
|
c81ac51e5c | ||
|
|
fd17cf2e3c | ||
|
|
d4b0999415 | ||
|
|
03f8ec89db | ||
|
|
f633ab688b | ||
|
|
808621ab22 | ||
|
|
6ed5feda2b | ||
|
|
964066c0de | ||
|
|
a913e93667 | ||
|
|
a7b99fc463 | ||
|
|
6f252f4704 | ||
|
|
b596c34bed | ||
|
|
b0cd96478c | ||
|
|
387ec712e6 | ||
|
|
f2a99d7d74 | ||
|
|
8b6b15dccc | ||
|
|
bbb72b7b6b | ||
|
|
785bad388b | ||
|
|
cf10df6c68 | ||
|
|
5b55dcbfbb | ||
|
|
e7dbbd16a5 | ||
|
|
62f0457961 | ||
|
|
8879b57b73 | ||
|
|
e49a6feabb | ||
|
|
feb2dd2835 | ||
|
|
5e34f3dc01 | ||
|
|
0031d76f2a | ||
|
|
00ee738fdd | ||
|
|
8d0a823124 | ||
|
|
9729df1756 | ||
|
|
cdb419d65e | ||
|
|
d6f9a41539 | ||
|
|
1daa258b8a | ||
|
|
560c257bd0 | ||
|
|
d7aae417b1 | ||
|
|
c39858aac0 |
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 - 2005, Daniel Stenberg, <daniel@haxx.se>.
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|||||||
6
CVS-INFO
6
CVS-INFO
@@ -15,12 +15,6 @@ Compile and build instructions follow below.
|
|||||||
CHANGES.0 contains ancient changes.
|
CHANGES.0 contains ancient changes.
|
||||||
CHANGES.$year contains changes for the particular year.
|
CHANGES.$year contains changes for the particular year.
|
||||||
|
|
||||||
tests/memanalyze.pl
|
|
||||||
is for analyzing the output generated by curl if -DCURLDEBUG
|
|
||||||
is used when compiling (run configure with --enable-debug)
|
|
||||||
|
|
||||||
buildconf builds the makefiles and configure stuff
|
|
||||||
|
|
||||||
Makefile.dist is included as the root Makefile in distribution archives
|
Makefile.dist is included as the root Makefile in distribution archives
|
||||||
|
|
||||||
perl/ is a subdirectory with various perl scripts
|
perl/ is a subdirectory with various perl scripts
|
||||||
|
|||||||
17
Makefile.am
17
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
|
||||||
@@ -23,8 +23,8 @@
|
|||||||
|
|
||||||
AUTOMAKE_OPTIONS = foreign
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
EXTRA_DIST = CHANGES COPYING maketgz reconf Makefile.dist \
|
EXTRA_DIST = CHANGES COPYING maketgz reconf Makefile.dist curl-config.in \
|
||||||
curl-config.in curl-style.el sample.emacs RELEASE-NOTES
|
curl-style.el sample.emacs RELEASE-NOTES buildconf buildconf.bat libcurl.pc.in
|
||||||
|
|
||||||
bin_SCRIPTS = curl-config
|
bin_SCRIPTS = curl-config
|
||||||
|
|
||||||
@@ -48,6 +48,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 +66,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:
|
||||||
|
|||||||
157
Makefile.dist
157
Makefile.dist
@@ -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
|
||||||
@@ -30,20 +30,83 @@ ssl:
|
|||||||
make
|
make
|
||||||
|
|
||||||
borland:
|
borland:
|
||||||
cd lib & make -f Makefile.b32
|
cd lib
|
||||||
cd src & make -f Makefile.b32
|
make -f Makefile.b32
|
||||||
|
cd ..\src
|
||||||
|
make -f Makefile.b32
|
||||||
|
|
||||||
|
borland-ssl:
|
||||||
|
cd lib
|
||||||
|
make -f Makefile.b32 WITH_SSL=1
|
||||||
|
cd ..\src
|
||||||
|
make -f Makefile.b32 WITH_SSL=1
|
||||||
|
|
||||||
|
borland-ssl-zlib:
|
||||||
|
cd lib
|
||||||
|
make -f Makefile.b32 WITH_SSL=1 WITH_ZLIB=1
|
||||||
|
cd ..\src
|
||||||
|
make -f Makefile.b32 WITH_SSL=1 WITH_ZLIB=1
|
||||||
|
|
||||||
|
borland-clean:
|
||||||
|
cd lib
|
||||||
|
make -f Makefile.b32 clean
|
||||||
|
cd ..\src
|
||||||
|
make -f Makefile.b32 clean
|
||||||
|
|
||||||
|
watcom:
|
||||||
|
cd lib
|
||||||
|
wmake -f Makefile.Watcom
|
||||||
|
cd ..\src
|
||||||
|
wmake -f Makefile.Watcom
|
||||||
|
|
||||||
|
watcom-clean:
|
||||||
|
cd lib
|
||||||
|
wmake -f Makefile.Watcom clean
|
||||||
|
cd ..\src
|
||||||
|
wmake -f Makefile.Watcom clean
|
||||||
|
|
||||||
mingw32:
|
mingw32:
|
||||||
cd lib & make -f Makefile.m32 ZLIB=1
|
$(MAKE) -C lib -f Makefile.m32 ZLIB=1
|
||||||
cd src & make -f Makefile.m32 ZLIB=1
|
$(MAKE) -C src -f Makefile.m32 ZLIB=1
|
||||||
|
|
||||||
mingw32-ssl:
|
mingw32-ssl:
|
||||||
cd lib & make -f Makefile.m32 SSL=1 ZLIB=1
|
$(MAKE) -C lib -f Makefile.m32 SSL=1 ZLIB=1
|
||||||
cd src & make -f Makefile.m32 SSL=1 ZLIB=1
|
$(MAKE) -C src -f Makefile.m32 SSL=1 ZLIB=1
|
||||||
|
|
||||||
mingw32-clean:
|
mingw32-clean:
|
||||||
cd lib & make -f Makefile.m32 clean
|
$(MAKE) -C lib -f Makefile.m32 clean
|
||||||
cd src & make -f Makefile.m32 clean
|
$(MAKE) -C src -f Makefile.m32 clean
|
||||||
|
|
||||||
|
vc-clean:
|
||||||
|
cd lib
|
||||||
|
nmake -f Makefile.vc6 clean
|
||||||
|
cd ..\src
|
||||||
|
nmake -f Makefile.vc6 clean
|
||||||
|
|
||||||
|
vc-all:
|
||||||
|
cd lib
|
||||||
|
nmake -f Makefile.vc6 cfg=release
|
||||||
|
nmake -f Makefile.vc6 cfg=release-ssl
|
||||||
|
nmake -f Makefile.vc6 cfg=release-zlib
|
||||||
|
nmake -f Makefile.vc6 cfg=release-ssl-zlib
|
||||||
|
nmake -f Makefile.vc6 cfg=release-ssl-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=release-zlib-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=release-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=release-dll-ssl-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=release-dll-zlib-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=debug
|
||||||
|
nmake -f Makefile.vc6 cfg=debug-ssl
|
||||||
|
nmake -f Makefile.vc6 cfg=debug-zlib
|
||||||
|
nmake -f Makefile.vc6 cfg=debug-ssl-zlib
|
||||||
|
nmake -f Makefile.vc6 cfg=debug-ssl-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=debug-zlib-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=debug-ssl-dll-zlib-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=debug-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=debug-dll-zlib-dll
|
||||||
|
nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll-zlib-dll
|
||||||
|
|
||||||
vc:
|
vc:
|
||||||
cd lib
|
cd lib
|
||||||
@@ -51,27 +114,75 @@ vc:
|
|||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6
|
nmake /f Makefile.vc6
|
||||||
|
|
||||||
|
vc-zlib:
|
||||||
|
cd lib
|
||||||
|
nmake /f Makefile.vc6 cfg=release-zlib
|
||||||
|
cd ..\src
|
||||||
|
nmake /f Makefile.vc6 cfg=release-zlib
|
||||||
|
|
||||||
vc-ssl:
|
vc-ssl:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-ssl
|
nmake /f Makefile.vc6 cfg=release-ssl
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6 cfg=release-ssl
|
nmake /f Makefile.vc6 cfg=release-ssl
|
||||||
|
|
||||||
|
vc-ssl-zlib:
|
||||||
|
cd lib
|
||||||
|
nmake /f Makefile.vc6 cfg=release-ssl-zlib
|
||||||
|
cd ..\src
|
||||||
|
nmake /f Makefile.vc6 cfg=release-ssl-zlib
|
||||||
|
|
||||||
vc-ssl-dll:
|
vc-ssl-dll:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-ssl-dll
|
nmake /f Makefile.vc6 cfg=release-ssl-dll
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6
|
nmake /f Makefile.vc6 cfg=release-ssl-dll
|
||||||
|
|
||||||
vc-libcurl-ssl-dll:
|
vc-dll-ssl-dll:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-libcurl-ssl-dll
|
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6
|
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll
|
||||||
|
|
||||||
|
vc-dll:
|
||||||
|
cd lib
|
||||||
|
nmake /f Makefile.vc6 cfg=release-dll
|
||||||
|
cd ..\src
|
||||||
|
nmake /f Makefile.vc6 cfg=release-dll
|
||||||
|
|
||||||
|
vc-dll-zlib-dll:
|
||||||
|
cd lib
|
||||||
|
nmake /f Makefile.vc6 cfg=release-dll-zlib-dll
|
||||||
|
cd ..\src
|
||||||
|
nmake /f Makefile.vc6 cfg=release-dll-zlib-dll
|
||||||
|
|
||||||
|
vc-dll-ssl-dll-zlib-dll:
|
||||||
|
cd lib
|
||||||
|
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
|
||||||
|
cd ..\src
|
||||||
|
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
|
||||||
|
|
||||||
|
vc-ssl-dll-zlib-dll:
|
||||||
|
cd lib
|
||||||
|
nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
|
||||||
|
cd ..\src
|
||||||
|
nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
|
||||||
|
|
||||||
|
vc-zlib-dll:
|
||||||
|
cd lib
|
||||||
|
nmake /f Makefile.vc6 cfg=release-zlib-dll
|
||||||
|
cd ..\src
|
||||||
|
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
|
||||||
|
|
||||||
cygwin:
|
cygwin:
|
||||||
./configure
|
./configure
|
||||||
@@ -89,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
|
||||||
|
|||||||
40
README
40
README
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
README
|
README
|
||||||
|
|
||||||
Curl is a command line tool for transfering data specified with URL
|
Curl is a command line tool for transferring data specified with URL
|
||||||
syntax. Find out how to use Curl by reading the curl.1 man page or the
|
syntax. Find out how to use Curl by reading the curl.1 man page or the
|
||||||
MANUAL document. Find out how to install Curl by reading the INSTALL
|
MANUAL document. Find out how to install Curl by reading the INSTALL
|
||||||
document.
|
document.
|
||||||
@@ -26,39 +26,37 @@ 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/
|
||||||
|
Canada -- http://curl.meulie.net/
|
||||||
Denmark -- http://curl.cofman.dk/
|
Denmark -- http://curl.cofman.dk/
|
||||||
Estonia -- http://curl.wildyou.net/
|
Estonia -- http://curl.wildyou.net/
|
||||||
|
France -- http://curl.mirror.internet.tp/
|
||||||
|
Germany -- http://curl.miscellaneousmirror.org/
|
||||||
Germany -- http://curl.mirror.at.stealer.net/
|
Germany -- http://curl.mirror.at.stealer.net/
|
||||||
|
Germany -- http://curl.mirroring.de/
|
||||||
|
Germany -- http://curl.mons-new-media.de/
|
||||||
Germany -- http://curl.netmirror.org/
|
Germany -- http://curl.netmirror.org/
|
||||||
Russia -- http://curl.tsuren.net/
|
Russia -- http://curl.tsuren.net/
|
||||||
|
Taiwan -- http://curl.cs.pu.edu.tw/
|
||||||
Thailand -- http://curl.siamu.ac.th/
|
Thailand -- http://curl.siamu.ac.th/
|
||||||
|
US (AZ) -- http://curl.islandofpoker.com/
|
||||||
US (CA) -- http://curl.mirror.redwire.net/
|
US (CA) -- http://curl.mirror.redwire.net/
|
||||||
US -- http://curl.signal42.com/
|
US (CA) -- http://curl.mirrormonster.com/
|
||||||
|
US (CA) -- http://curl.signal42.com/
|
||||||
DOWNLOAD
|
US (CA) -- http://curl.tolix.org/
|
||||||
|
US (CA) -- http://curl.webhosting76.com/
|
||||||
The official download mirror sites are:
|
US (TX) -- http://curl.109k.com/
|
||||||
|
US (TX) -- http://curl.mirrors.cyberservers.net/
|
||||||
Australia -- http://curl.planetmirror.com/download.html
|
US (TX) -- http://curl.seekmeup.com/
|
||||||
Estonia -- http://curl.wildyou.net/download.html
|
US (TX) -- http://curl.hostingzero.com/
|
||||||
Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
|
|
||||||
Germany -- http://curl.mirror.at.stealer.net/download.html
|
|
||||||
Germany -- http://curl.netmirror.org/download.html
|
|
||||||
Germany -- http://www.mirrorspace.org/curl/
|
|
||||||
Hongkong -- http://www.execve.net/curl/
|
|
||||||
Russia -- http://curl.tsuren.net/download.html
|
|
||||||
Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/
|
|
||||||
Sweden -- http://cool.haxx.se/curl/
|
|
||||||
Thailand -- http://curl.siamu.ac.th/download.html
|
|
||||||
US (CA) -- http://curl.mirror.redwire.net/download.html
|
|
||||||
|
|
||||||
CVS
|
CVS
|
||||||
|
|
||||||
|
|||||||
@@ -1,51 +1,46 @@
|
|||||||
Curl and libcurl 7.12.1
|
Curl and libcurl 7.15.0
|
||||||
|
|
||||||
Public curl release number: 82
|
Public curl release number: 90
|
||||||
Releases counted from the very beginning: 109
|
Releases counted from the very beginning: 117
|
||||||
Available command line options: 96
|
Available command line options: 109
|
||||||
Available curl_easy_setopt() options: 120
|
Available curl_easy_setopt() options: 124
|
||||||
Number of public functions in libcurl: 36
|
Number of public functions in libcurl: 46
|
||||||
|
Amount of public web site mirrors: 24
|
||||||
|
Number of known libcurl bindings: 32
|
||||||
|
Number of contributors: 451
|
||||||
|
|
||||||
This release includes the following changes:
|
This release includes the following changes:
|
||||||
|
|
||||||
o read callbacks can stop the transfer by returning CURL_READFUNC_ABORT
|
o --ftp-skip-pasv-ip / CURLOPT_FTP_SKIP_PASV_IP (sponsored by CU*Answers)
|
||||||
o libcurl-tutorial.3 is the new man page formerly known as libcurl-the-guide
|
o TFTP support added
|
||||||
o additional SSL trace data might be sent to the debug callback using two new
|
|
||||||
types: CURLINFO_SSL_DATA_IN and CURLINFO_SSL_DATA_OUT
|
|
||||||
o multipart formposts can upload files larger than system memory
|
|
||||||
o the curl tool continues with the next URL even if one transfer fails
|
|
||||||
o FTP 3rd party transfer support - seven new setopt() options
|
|
||||||
|
|
||||||
This release includes the following bugfixes:
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
o cookies can now hold 4999 bytes of content
|
o user+domain name buffer overflow in the NTLM code (security flaw)
|
||||||
o HTTP POST/PUT with NTLM/Digest/Negotiate to a URL returning 3XX
|
o -z over FTP now considers equal timestamps "not modified since"
|
||||||
o HTTPS POST/PUT over a proxy requiring NTLM/Digest/Negotiate works now
|
o Weird characters removed from the configure script
|
||||||
o less restrictive libidn requirements, 0.4.1 or later is fine
|
o Fixed time zone offsets for MEST and CEST for the time parser
|
||||||
o fixed HTTP POST or PUT with Digest/Negotiate/NTLM selected but the server
|
o HTTP Content-Range header parser crash
|
||||||
didn't require any authentication
|
o FTPS negotiation timeouts/errors
|
||||||
o win32 file:// transfer free memory bug
|
o SSPI works even for Windows 9x
|
||||||
o configure --disable-http builds a libcurl without HTTP support
|
o crash in --dump-header on FTP
|
||||||
o CURLOPT_FILETIME had wrong type, it expects a long argument
|
o test 56 runs better
|
||||||
o builds fine with Borland on Windows again
|
|
||||||
o the msvc curllib.dsp now builds the libcurl.lib file again
|
|
||||||
o builds fine on VMS again
|
|
||||||
o builds fine on NetWare again
|
|
||||||
o HTTP Digest authentication with proxies uses correct user name + password
|
|
||||||
o now builds fine with lcc-win32
|
|
||||||
|
|
||||||
Other curl-related news since the previous public release:
|
Other curl-related news since the previous public release:
|
||||||
|
|
||||||
o James Hu took over after Kevin Roth as maintainer of the curl package on
|
o http://curl.freemirror.de/ is a new German mirror
|
||||||
cygwin. Many saludos to Kevin for a work well done during many years.
|
o All curl relatd mailing list information and subscribers on cool.haxx.se
|
||||||
o Gambas binding for libcurl: http://gambas.sf.net/
|
were lost due to a malicious user exploiting a security hole on the
|
||||||
o pycurl 7.12.0 was released http://pycurl.sf.net/
|
server. Attempts have been made to put back susbcribers on the lists, but
|
||||||
|
many have been lost: http://curl.haxx.se/mail/lost.html
|
||||||
|
o New S-Lang binding: http://curl.haxx.se/libcurl/slang/
|
||||||
|
o TclCurl 0.14.1: http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
||||||
|
o pycurl 7.14.1: http://pycurl.sf.net/
|
||||||
|
|
||||||
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:
|
||||||
|
|
||||||
Gisle Vanem, Vincent Bronner, Alexander Krasnostavsky, Chris Gaukroger,
|
o John Kelly, Nicolas Fran<61>ois, Scott Davis, Ben Madsen, Dmitry Bartsevich,
|
||||||
G<EFBFBD>nter Knauf, Marty Kuhrt, Kjetil Jacobsen, Steven Bazyl, Seshubabu Pasam,
|
David Yan, Michael Wallner, Domenico Andreoli, Darryl House
|
||||||
Luca Alteas, Jean-Louis Lemaire, David Byron, David Cohen
|
|
||||||
|
|
||||||
Thanks! (and sorry if I forgot to mention someone)
|
Thanks! (and sorry if I forgot to mention someone)
|
||||||
|
|||||||
16
TODO-RELEASE
16
TODO-RELEASE
@@ -1,17 +1,7 @@
|
|||||||
Issues not sorted in any particular order.
|
To get fixed in 7.15.0 (planned release: November 2005)
|
||||||
UNASSIGNED means that no person has publicly stated to work on the issue.
|
|
||||||
|
|
||||||
To get fixed in 7.12.1 (planned release: August 2004)
|
|
||||||
======================
|
======================
|
||||||
|
|
||||||
35 - Fix multi interface when connecting to host with multiple IP addresses:
|
60 - CONNECT 407 responses that kills the connection (not very likely though)
|
||||||
http://curl.haxx.se/mail/lib-2004-06/0163.html and
|
|
||||||
http://curl.haxx.se/mail/lib-2004-06/0167.html
|
|
||||||
UNASSIGNED
|
|
||||||
|
|
||||||
* Bugfixes reported until late July
|
63 -
|
||||||
|
|
||||||
To get fixed in 7.12.2 (planned release: December 2004)
|
|
||||||
======================
|
|
||||||
|
|
||||||
Bugfixes reported until late November
|
|
||||||
|
|||||||
188
acinclude.m4
188
acinclude.m4
@@ -87,9 +87,7 @@ AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets]
|
|||||||
dnl Ioctlsocket didnt compile, do test 5!
|
dnl Ioctlsocket didnt compile, do test 5!
|
||||||
AC_TRY_COMPILE([
|
AC_TRY_COMPILE([
|
||||||
/* headers for SO_NONBLOCK test (BeOS) */
|
/* headers for SO_NONBLOCK test (BeOS) */
|
||||||
#include <sys/types.h>
|
#include <socket.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
],[
|
],[
|
||||||
/* SO_NONBLOCK source code */
|
/* SO_NONBLOCK source code */
|
||||||
long b = 1;
|
long b = 1;
|
||||||
@@ -124,6 +122,30 @@ dnl end of non-blocking try-compile test
|
|||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
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]), ,
|
||||||
|
[
|
||||||
|
#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
|
||||||
|
])
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
dnl Check for socklen_t: historically on BSD it is an int, and in
|
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 POSIX 1g it is a type of its own, but some platforms use different
|
||||||
dnl types for the argument to getsockopt, getpeername, etc. So we
|
dnl types for the argument to getsockopt, getpeername, etc. So we
|
||||||
@@ -170,8 +192,7 @@ AC_DEFUN([TYPE_SOCKLEN_T],
|
|||||||
])
|
])
|
||||||
|
|
||||||
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], ,[
|
||||||
@@ -236,7 +257,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,[
|
||||||
@@ -251,6 +272,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);
|
||||||
@@ -324,8 +346,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
|
||||||
@@ -378,34 +416,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])
|
||||||
@@ -427,8 +456,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
|
||||||
@@ -690,15 +731,20 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
|||||||
fi
|
fi
|
||||||
else dnl $ICC = yes
|
else dnl $ICC = yes
|
||||||
dnl this is a set of options we believe *ALL* gcc versions support:
|
dnl this is a set of options we believe *ALL* gcc versions support:
|
||||||
WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare"
|
WARN="-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes"
|
||||||
|
|
||||||
dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
|
dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
|
||||||
|
|
||||||
|
if test "$gccnum" -ge "207"; then
|
||||||
|
dnl gcc 2.7 or later
|
||||||
|
WARN="$WARN -Wmissing-declarations"
|
||||||
|
fi
|
||||||
|
|
||||||
if test "$gccnum" -gt "295"; then
|
if test "$gccnum" -gt "295"; then
|
||||||
dnl only if the compiler is newer than 2.95 since we got lots of
|
dnl only if the compiler is newer than 2.95 since we got lots of
|
||||||
dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
|
dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
|
||||||
dnl gcc 2.95.4 on FreeBSD 4.9!
|
dnl gcc 2.95.4 on FreeBSD 4.9!
|
||||||
WARN="$WARN -Wundef"
|
WARN="$WARN -Wundef -Wno-long-long -Wsign-compare"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$gccnum" -ge "296"; then
|
if test "$gccnum" -ge "296"; then
|
||||||
@@ -712,15 +758,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
|
||||||
@@ -763,3 +812,72 @@ 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
|
||||||
|
])
|
||||||
|
|||||||
@@ -6,3 +6,18 @@ ahost
|
|||||||
config.log
|
config.log
|
||||||
config.status
|
config.status
|
||||||
aclocal.m4
|
aclocal.m4
|
||||||
|
.deps
|
||||||
|
Makefile.in
|
||||||
|
config.guess
|
||||||
|
config.h
|
||||||
|
config.h.in
|
||||||
|
config.sub
|
||||||
|
libtool
|
||||||
|
ltmain.sh
|
||||||
|
stamp-h1
|
||||||
|
*.lo
|
||||||
|
.libs
|
||||||
|
depcomp
|
||||||
|
libcares.la
|
||||||
|
missing
|
||||||
|
ares_version.h.dist
|
||||||
|
|||||||
13
ares/AUTHORS
Normal file
13
ares/AUTHORS
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
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
|
||||||
197
ares/CHANGES
197
ares/CHANGES
@@ -1,5 +1,202 @@
|
|||||||
Changelog for the c-ares project
|
Changelog for the c-ares project
|
||||||
|
|
||||||
|
* 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
|
||||||
|
|
||||||
|
- Fixed the VC project and makefile to use ares_cancel and ares_version
|
||||||
|
|
||||||
|
* October 24
|
||||||
|
|
||||||
|
- The released ares_version.h from 1.2.1 says 1.2.0 due to a maketgz flaw.
|
||||||
|
This is now fixed.
|
||||||
|
|
||||||
|
Version 1.2.1 (October 20, 2004)
|
||||||
|
|
||||||
|
* September 29
|
||||||
|
|
||||||
|
- Henrik Stoerner fix: got a report that Tru64 Unix (the unix from Digital
|
||||||
|
when they made Alpha's) uses /etc/svc.conf for the purpose fixed below for
|
||||||
|
other OSes. He made c-ares check for and understand it if present.
|
||||||
|
|
||||||
|
- Now c-ares will use local host name lookup _before_ DNS resolving by default
|
||||||
|
if nothing else is told.
|
||||||
|
|
||||||
|
* September 26
|
||||||
|
|
||||||
|
- Henrik Stoerner: found out that c-ares does not look at the /etc/host.conf
|
||||||
|
file to determine the sequence in which to search /etc/hosts and DNS. So on
|
||||||
|
systems where this order is defined by /etc/host.conf instead of a "lookup"
|
||||||
|
entry in /etc/resolv.conf, c-ares will always default to looking in DNS
|
||||||
|
first, and /etc/hosts second.
|
||||||
|
|
||||||
|
c-ares now looks at
|
||||||
|
|
||||||
|
1) resolv.conf (for the "lookup" line);
|
||||||
|
2) nsswitch.fon (for the "hosts:" line);
|
||||||
|
3) host.conf (for the "order" line).
|
||||||
|
|
||||||
|
First match wins.
|
||||||
|
|
||||||
|
- Dominick Meglio patched: C-ares on Windows assumed that the HOSTS file is
|
||||||
|
located in a static location. It assumed
|
||||||
|
C:\Windows\System32\Drivers\Etc. This is a poor assumption to make. In fact,
|
||||||
|
the location of the HOSTS file can be changed via a registry setting.
|
||||||
|
|
||||||
|
There is a key called DatabasePath which specifies the path to the HOSTS
|
||||||
|
file:
|
||||||
|
http://www.microsoft.com/technet/itsolutions/network/deploy/depovg/tcpip2k.mspx
|
||||||
|
|
||||||
|
The patch will make c-ares correctly consult the registry for the location
|
||||||
|
of this file.
|
||||||
|
|
||||||
|
* August 29
|
||||||
|
|
||||||
|
- Gisle Vanem fixed the MSVC build files.
|
||||||
|
|
||||||
|
* August 20
|
||||||
|
|
||||||
|
- Gisle Vanem made c-ares build and work with his Watt-32 TCP/IP stack.
|
||||||
|
|
||||||
|
* August 13
|
||||||
|
|
||||||
|
- Harshal Pradhan made a minor syntax change in ares_init.c to make it build
|
||||||
|
fine with MSVC 7.1
|
||||||
|
|
||||||
|
* July 24
|
||||||
|
|
||||||
|
- Made the lib get built static only if --enable-debug is used.
|
||||||
|
|
||||||
|
- Gisle Vanem fixed:
|
||||||
|
|
||||||
|
Basically in loops like handle_errors(), 'query->next' was assigned a local
|
||||||
|
variable and then query was referenced after the memory was freed by
|
||||||
|
next_server(). I've changed that so next_server() and end_query() returns
|
||||||
|
the next query. So callers should use this ret-value.
|
||||||
|
|
||||||
|
The next problem was that 'server->tcp_buffer_pos' had a random value at
|
||||||
|
entry to 1st recv() (luckily causing Winsock to return ENOBUFS).
|
||||||
|
|
||||||
|
I've also added a ares_writev() for Windows to streamline the code a bit
|
||||||
|
more.
|
||||||
|
|
||||||
|
* July 20
|
||||||
|
- Fixed a few variable return types for some system calls. Made configure
|
||||||
|
check for ssize_t to make it possible to use that when receiving the send()
|
||||||
|
error code. This is necessary to prevent compiler warnings on some systems.
|
||||||
|
|
||||||
|
- Made configure create config.h, and all source files now include setup.h that
|
||||||
|
might include the proper config.h (or a handicrafted alternative).
|
||||||
|
|
||||||
|
- Switched to 'ares_socket_t' type for sockets in ares, since Windows don't
|
||||||
|
use 'int' for that.
|
||||||
|
|
||||||
|
- automake-ified and libool-ified c-ares. Now it builds libcares as a shared
|
||||||
|
lib on most platforms if wanted. (This bloated the size of the release
|
||||||
|
archive with another 200K!)
|
||||||
|
|
||||||
|
- Makefile.am now uses Makefile.inc for the c sources, h headers and man
|
||||||
|
pages, to make it easier for other makefiles to use the exact same set of
|
||||||
|
files.
|
||||||
|
|
||||||
|
- Adjusted 'maketgz' to use the new automake magic when building distribution
|
||||||
|
archives.
|
||||||
|
|
||||||
|
- Anyone desires HTML and/or PDF versions of the man pages in the release
|
||||||
|
archives?
|
||||||
|
|
||||||
|
* July 3
|
||||||
|
- G<>nter Knauf made c-ares build and run on Novell Netware.
|
||||||
|
|
||||||
|
* July 1
|
||||||
|
- Gisle Vanem provided Makefile.dj to build with djgpp, added a few more djgpp
|
||||||
|
fixes and made ares not use 'errno' to provide further info on Windows.
|
||||||
|
|
||||||
|
* June 30
|
||||||
|
- Gisle Vanem made it build with djgpp and run fine with the Watt-32 stack.
|
||||||
|
|
||||||
* June 10
|
* June 10
|
||||||
- Gisle Vanem's init patch for Windows:
|
- Gisle Vanem's init patch for Windows:
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ maketgz
|
|||||||
aclocal.m4
|
aclocal.m4
|
||||||
acinclude.m4
|
acinclude.m4
|
||||||
Makefile.in
|
Makefile.in
|
||||||
|
Makefile.dj
|
||||||
|
Makefile.m32
|
||||||
|
Makefile.netware
|
||||||
install-sh
|
install-sh
|
||||||
mkinstalldirs
|
mkinstalldirs
|
||||||
configure
|
configure
|
||||||
|
|||||||
66
ares/Makefile.am
Normal file
66
ares/Makefile.am
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libcares.la
|
||||||
|
|
||||||
|
man_MANS = $(MANPAGES)
|
||||||
|
|
||||||
|
MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/adig/adig.mak \
|
||||||
|
vc/adig/adig.plg vc/vc.dsw vc/ahost/ahost.dep vc/ahost/ahost.dsp \
|
||||||
|
vc/ahost/ahost.mak vc/ahost/ahost.plg vc/areslib/areslib.dep \
|
||||||
|
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
|
||||||
|
# regular sources and headers
|
||||||
|
EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \
|
||||||
|
$(MSVCFILES) AUTHORS
|
||||||
|
|
||||||
|
|
||||||
|
VER=-version-info 1:0:0
|
||||||
|
# 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
|
||||||
|
# 1.
|
||||||
|
#
|
||||||
|
# If either revision or age are omitted, they default to 0. Also note that age
|
||||||
|
# must be less than or equal to the current interface number.
|
||||||
|
#
|
||||||
|
# Here are a set of rules to help you update your library version information:
|
||||||
|
#
|
||||||
|
# 1.Start with version information of 0:0:0 for each libtool library.
|
||||||
|
#
|
||||||
|
# 2.Update the version information only immediately before a public release of
|
||||||
|
# your software. More frequent updates are unnecessary, and only guarantee
|
||||||
|
# that the current interface number gets larger faster.
|
||||||
|
#
|
||||||
|
# 3.If the library source code has changed at all since the last update, then
|
||||||
|
# increment revision (c:r+1:a)
|
||||||
|
#
|
||||||
|
# 4.If any interfaces have been added, removed, or changed since the last
|
||||||
|
# update, increment current, and set revision to 0. (c+1:r=0:a)
|
||||||
|
#
|
||||||
|
# 5.If any interfaces have been added since the last public release, then
|
||||||
|
# increment age. (c:r:a+1)
|
||||||
|
#
|
||||||
|
# 6.If any interfaces have been removed since the last public release, then
|
||||||
|
# set age to 0. (c:r:a=0)
|
||||||
|
#
|
||||||
|
|
||||||
|
libcares_la_LDFLAGS = $(VER)
|
||||||
|
|
||||||
|
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||||
|
include Makefile.inc
|
||||||
|
|
||||||
|
libcares_la_SOURCES = $(CSOURCES) $(HHEADERS)
|
||||||
|
|
||||||
|
# where to install the c-ares headers
|
||||||
|
libcares_ladir = $(includedir)
|
||||||
|
# what headers to install on 'make install':
|
||||||
|
libcares_la_HEADERS = ares.h ares_version.h
|
||||||
|
|
||||||
|
# Make files named *.dist replace the file without .dist extension
|
||||||
|
dist-hook:
|
||||||
|
find $(distdir) -name "*.dist" -exec rm {} \;
|
||||||
|
(distit=`find $(srcdir) -name "*.dist"`; \
|
||||||
|
for file in $$distit; do \
|
||||||
|
strip=`echo $$file | sed -e s/^$(srcdir)// -e s/\.dist//`; \
|
||||||
|
cp $$file $(distdir)$$strip; \
|
||||||
|
done)
|
||||||
50
ares/Makefile.dj
Normal file
50
ares/Makefile.dj
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#
|
||||||
|
# c-ares Makefile for djgpp/gcc/Watt-32.
|
||||||
|
# By Gisle Vanem <giva@bgnett.no> 2004.
|
||||||
|
#
|
||||||
|
.SUFFIXES: .exe
|
||||||
|
|
||||||
|
include Makefile.inc
|
||||||
|
|
||||||
|
WATT32_ROOT = $(subst \,/,$(WATT_ROOT))
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -O2 -Wall -DWATT32 -Dselect=select_s -I$(WATT32_ROOT)/inc
|
||||||
|
LDFLAGS = -s
|
||||||
|
EX_LIBS = $(WATT32_ROOT)/lib/libwatt.a
|
||||||
|
|
||||||
|
OBJ_DIR = djgpp
|
||||||
|
|
||||||
|
OBJECTS = $(addprefix $(OBJ_DIR)/, $(CSOURCES:.c=.o))
|
||||||
|
|
||||||
|
all: $(OBJ_DIR) libcares.a ahost.exe adig.exe
|
||||||
|
@echo Welcome to c-ares.
|
||||||
|
|
||||||
|
$(OBJ_DIR):
|
||||||
|
- mkdir $(OBJ_DIR)
|
||||||
|
|
||||||
|
libcares.a: $(OBJECTS)
|
||||||
|
ar rs $@ $?
|
||||||
|
|
||||||
|
ahost.exe: ahost.c libcares.a
|
||||||
|
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
||||||
|
|
||||||
|
adig.exe: adig.c libcares.a
|
||||||
|
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(OBJECTS) libcares.a
|
||||||
|
|
||||||
|
vclean realclean: clean
|
||||||
|
rm -f ahost.exe adig.exe depend.dj
|
||||||
|
- rmdir $(OBJ_DIR)
|
||||||
|
|
||||||
|
$(OBJ_DIR)/%.o: %.c
|
||||||
|
$(CC) $(CFLAGS) -o $@ -c $<
|
||||||
|
@echo
|
||||||
|
|
||||||
|
depend:
|
||||||
|
$(CC) -MM $(CFLAGS) $(CSOURCES) | \
|
||||||
|
sed -e 's/^\([a-zA-Z0-9_-]*\.o:\)/$$(OBJ_DIR)\/\1/' > depend.dj
|
||||||
|
|
||||||
|
-include depend.dj
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
# $Id$
|
|
||||||
|
|
||||||
SHELL=/bin/sh
|
|
||||||
INSTALL=@INSTALL@
|
|
||||||
RANLIB=@RANLIB@
|
|
||||||
VPATH=@srcdir@
|
|
||||||
srcdir=@srcdir@
|
|
||||||
top_srcdir=@top_srcdir@
|
|
||||||
prefix=@prefix@
|
|
||||||
exec_prefix=@exec_prefix@
|
|
||||||
libdir=@libdir@
|
|
||||||
includedir=@includedir@
|
|
||||||
mandir=@mandir@
|
|
||||||
|
|
||||||
LIB=libcares.a
|
|
||||||
CC=@CC@
|
|
||||||
CPPFLAGS=@CPPFLAGS@
|
|
||||||
CFLAGS=@CFLAGS@ ${WARN_CFLAGS} ${ERROR_CFLAGS}
|
|
||||||
DEFS=@DEFS@
|
|
||||||
LDFLAGS=@LDFLAGS@
|
|
||||||
LIBS=@LIBS@
|
|
||||||
ALL_CFLAGS=${CPPFLAGS} ${CFLAGS} ${DEFS}
|
|
||||||
OBJS= ares__close_sockets.o ares__get_hostent.o ares__read_line.o \
|
|
||||||
ares_destroy.o ares_expand_name.o ares_fds.o \
|
|
||||||
ares_free_hostent.o ares_free_string.o ares_gethostbyaddr.o \
|
|
||||||
ares_gethostbyname.o ares_init.o ares_mkquery.o ares_parse_a_reply.o \
|
|
||||||
ares_parse_ptr_reply.o ares_process.o ares_query.o ares_search.o \
|
|
||||||
ares_send.o ares_strerror.o ares_timeout.o ares_version.o \
|
|
||||||
ares_expand_string.o ares_cancel.o
|
|
||||||
|
|
||||||
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
|
||||||
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
|
||||||
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
|
||||||
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
|
||||||
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
|
||||||
ares_version.3 ares_cancel.3
|
|
||||||
|
|
||||||
$(LIB): ${OBJS}
|
|
||||||
ar cru $@ ${OBJS}
|
|
||||||
${RANLIB} $@
|
|
||||||
|
|
||||||
all: $(LIB) demos
|
|
||||||
|
|
||||||
demos: adig ahost
|
|
||||||
|
|
||||||
tags:
|
|
||||||
etags *.[ch]
|
|
||||||
|
|
||||||
adig: adig.o $(LIB)
|
|
||||||
${CC} ${LDFLAGS} -o $@ adig.o $(LIB) ${LIBS}
|
|
||||||
|
|
||||||
ahost: ahost.o $(LIB)
|
|
||||||
${CC} ${LDFLAGS} -o $@ ahost.o $(LIB) ${LIBS}
|
|
||||||
|
|
||||||
${OBJS}: ares.h ares_dns.h ares_private.h
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
${CC} -c ${ALL_CFLAGS} $<
|
|
||||||
|
|
||||||
check:
|
|
||||||
|
|
||||||
install:
|
|
||||||
${top_srcdir}/mkinstalldirs ${DESTDIR}${libdir}
|
|
||||||
${top_srcdir}/mkinstalldirs ${DESTDIR}${includedir}
|
|
||||||
${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man3
|
|
||||||
${INSTALL} -m 644 $(LIB) ${DESTDIR}${libdir}
|
|
||||||
${RANLIB} ${DESTDIR}${libdir}/$(LIB)
|
|
||||||
chmod u-w ${DESTDIR}${libdir}/$(LIB)
|
|
||||||
${INSTALL} -m 444 ${srcdir}/ares.h ${DESTDIR}${includedir}
|
|
||||||
${INSTALL} -m 444 ${srcdir}/ares_version.h ${DESTDIR}${includedir}
|
|
||||||
(for man in $(MANPAGES); do \
|
|
||||||
${INSTALL} -m 444 ${srcdir}/$${man} ${DESTDIR}${mandir}/man3; \
|
|
||||||
done)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f ${OBJS} $(LIB) adig.o adig ahost.o ahost
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f config.cache config.log config.status Makefile
|
|
||||||
18
ares/Makefile.inc
Normal file
18
ares/Makefile.inc
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
CSOURCES = ares_fds.c ares_process.c ares_free_hostent.c ares_query.c \
|
||||||
|
ares__close_sockets.c ares_free_string.c ares_search.c ares__get_hostent.c \
|
||||||
|
ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c \
|
||||||
|
ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c \
|
||||||
|
ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c \
|
||||||
|
windows_port.c ares_expand_string.c ares_parse_ptr_reply.c \
|
||||||
|
ares_parse_aaaa_reply.c ares_getnameinfo.c inet_net_pton.c bitncmp.c \
|
||||||
|
inet_ntop.c
|
||||||
|
|
||||||
|
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 \
|
||||||
|
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
||||||
|
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
||||||
|
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
||||||
|
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
||||||
|
ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.3
|
||||||
75
ares/Makefile.m32
Normal file
75
ares/Makefile.m32
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
#############################################################
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
## Makefile for building libcares.a with MingW32 (GCC-3.2)
|
||||||
|
## Use: make -f Makefile.m32 [demos]
|
||||||
|
##
|
||||||
|
## Quick hack by Guenter; comments to: /dev/nul
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
AR = ar
|
||||||
|
RANLIB = ranlib
|
||||||
|
STRIP = strip -g
|
||||||
|
#RM = rm -f
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
## Nothing more to do below this line!
|
||||||
|
|
||||||
|
LIB=libcares.a
|
||||||
|
CC=gcc
|
||||||
|
#CPPFLAGS=@CPPFLAGS@
|
||||||
|
WARN_FLAGS=-Wall
|
||||||
|
CFLAGS=-O2
|
||||||
|
CFLAGS+=${WARN_CFLAGS} ${ERROR_CFLAGS}
|
||||||
|
DEFS=-DMINGW32
|
||||||
|
LDFLAGS=-s
|
||||||
|
LIBS=-lwsock32
|
||||||
|
ALL_CFLAGS=${CPPFLAGS} ${CFLAGS} ${DEFS}
|
||||||
|
|
||||||
|
MANPAGES := $(patsubst %.c,%.o,$(wildcard ares_*.3))
|
||||||
|
|
||||||
|
OBJS := $(patsubst %.c,%.o,$(wildcard ares_*.c))
|
||||||
|
OBJS += windows_port.o
|
||||||
|
|
||||||
|
$(LIB): ${OBJS}
|
||||||
|
ar cru $@ ${OBJS}
|
||||||
|
${RANLIB} $@
|
||||||
|
|
||||||
|
all: $(LIB) demos
|
||||||
|
|
||||||
|
demos: adig.exe ahost.exe
|
||||||
|
|
||||||
|
tags:
|
||||||
|
etags *.[ch]
|
||||||
|
|
||||||
|
adig.exe: adig.o $(LIB)
|
||||||
|
${CC} ${LDFLAGS} -o $@ adig.o $(LIB) ${LIBS}
|
||||||
|
|
||||||
|
ahost.exe: ahost.o $(LIB)
|
||||||
|
${CC} ${LDFLAGS} -o $@ ahost.o $(LIB) ${LIBS}
|
||||||
|
|
||||||
|
${OBJS}: ares.h ares_dns.h ares_private.h
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
${CC} -c ${ALL_CFLAGS} $<
|
||||||
|
|
||||||
|
check:
|
||||||
|
|
||||||
|
install:
|
||||||
|
${top_srcdir}/mkinstalldirs ${DESTDIR}${libdir}
|
||||||
|
${top_srcdir}/mkinstalldirs ${DESTDIR}${includedir}
|
||||||
|
${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man3
|
||||||
|
${INSTALL} -m 644 $(LIB) ${DESTDIR}${libdir}
|
||||||
|
${RANLIB} ${DESTDIR}${libdir}/$(LIB)
|
||||||
|
chmod u-w ${DESTDIR}${libdir}/$(LIB)
|
||||||
|
${INSTALL} -m 444 ${srcdir}/ares.h ${DESTDIR}${includedir}
|
||||||
|
${INSTALL} -m 444 ${srcdir}/ares_version.h ${DESTDIR}${includedir}
|
||||||
|
(for man in $(MANPAGES); do \
|
||||||
|
${INSTALL} -m 444 ${srcdir}/$${man} ${DESTDIR}${mandir}/man3; \
|
||||||
|
done)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f ${OBJS} $(LIB) adig.o adig.exe ahost.o ahost.exe
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f config.cache config.log config.status Makefile
|
||||||
328
ares/Makefile.netware
Normal file
328
ares/Makefile.netware
Normal file
@@ -0,0 +1,328 @@
|
|||||||
|
#################################################################
|
||||||
|
#
|
||||||
|
## Makefile for building libares.lib (NetWare version - gnu make)
|
||||||
|
## Use: make -f Makefile.netware
|
||||||
|
##
|
||||||
|
## Comments to: Guenter Knauf <eflash@gmx.net>
|
||||||
|
#
|
||||||
|
#################################################################
|
||||||
|
|
||||||
|
# Edit the path below to point to the base of your Novell NDK.
|
||||||
|
ifndef NDKBASE
|
||||||
|
NDKBASE = c:/novell
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifndef INSTDIR
|
||||||
|
INSTDIR = ../curl-$(LIBCURL_VERSION_STR)-bin-nw
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Edit the vars below to change NLM target settings.
|
||||||
|
TARGETS = adig.nlm ahost.nlm
|
||||||
|
LTARGET = libcares.lib
|
||||||
|
VERSION = $(LIBCARES_VERSION)
|
||||||
|
COPYR = Copyright (C) 1996 - 2005, Daniel Stenberg, <daniel@haxx.se>
|
||||||
|
DESCR = cURL $(subst .def,,$(notdir $@)) $(LIBCARES_VERSION_STR) - http://curl.haxx.se
|
||||||
|
MTSAFE = YES
|
||||||
|
STACK = 64000
|
||||||
|
SCREEN = none
|
||||||
|
#EXPORTS =
|
||||||
|
# Comment the line below if you dont want to load protected automatically.
|
||||||
|
#LDRING = 3
|
||||||
|
|
||||||
|
# Edit the var below to point to your lib architecture.
|
||||||
|
ifndef LIBARCH
|
||||||
|
LIBARCH = LIBC
|
||||||
|
endif
|
||||||
|
|
||||||
|
# must be equal to DEBUG or NDEBUG
|
||||||
|
DB = NDEBUG
|
||||||
|
# DB = DEBUG
|
||||||
|
# DB = CURLDEBUG
|
||||||
|
# Optimization: -O<n> or debugging: -g
|
||||||
|
ifeq ($(DB),NDEBUG)
|
||||||
|
OPT = -O2
|
||||||
|
OBJDIR = release
|
||||||
|
else
|
||||||
|
OPT = -g
|
||||||
|
OBJDIR = debug
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Include the version info retrieved from curlver.h
|
||||||
|
-include $(OBJDIR)/version.inc
|
||||||
|
|
||||||
|
# The following line defines your compiler.
|
||||||
|
ifdef METROWERKS
|
||||||
|
CC = mwccnlm
|
||||||
|
else
|
||||||
|
CC = gcc
|
||||||
|
endif
|
||||||
|
YACC = bison -y
|
||||||
|
CP = cp -afv
|
||||||
|
# RM = rm -f
|
||||||
|
# if you want to mark the target as MTSAFE you will need a tool for
|
||||||
|
# generating the xdc data for the linker; here's a minimal tool:
|
||||||
|
# http://www.gknw.com/development/prgtools/mkxdc.zip
|
||||||
|
MPKXDC = mkxdc
|
||||||
|
|
||||||
|
# Global flags for all compilers
|
||||||
|
CFLAGS = $(OPT) -D$(DB) -DNETWARE -DHAVE_CONFIG_H -nostdinc
|
||||||
|
|
||||||
|
ifeq ($(CC),mwccnlm)
|
||||||
|
LD = mwldnlm
|
||||||
|
LDFLAGS = -nostdlib $(PRELUDE) $(OBJS) $(<:.def=.o) -o $@ -commandfile
|
||||||
|
AR = mwldnlm
|
||||||
|
ARFLAGS = -type library -w nocmdline $(OBJDIR)/*.o -o
|
||||||
|
CFLAGS += -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586
|
||||||
|
CFLAGS += -relax_pointers
|
||||||
|
#CFLAGS += -w on
|
||||||
|
ifeq ($(LIBARCH),LIBC)
|
||||||
|
PRELUDE = $(SDK_LIBC)/imports/libcpre.o
|
||||||
|
CFLAGS += -align 4
|
||||||
|
else
|
||||||
|
PRELUDE = "$(METROWERKS)/Novell Support/libraries/runtime/prelude.obj"
|
||||||
|
# CFLAGS += -include "$(METROWERKS)/Novell Support/headers/nlm_prefix.h"
|
||||||
|
CFLAGS += -align 1
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
LD = nlmconv
|
||||||
|
LDFLAGS = -T
|
||||||
|
AR = ar
|
||||||
|
ARFLAGS = -cq
|
||||||
|
CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing
|
||||||
|
CFLAGS += -Wall -Wno-format -Wno-uninitialized # -pedantic
|
||||||
|
ifeq ($(LIBARCH),LIBC)
|
||||||
|
PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o
|
||||||
|
else
|
||||||
|
PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o
|
||||||
|
CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
NDK_ROOT = $(NDKBASE)/ndk
|
||||||
|
SDK_CLIB = $(NDK_ROOT)/nwsdk
|
||||||
|
SDK_LIBC = $(NDK_ROOT)/libc
|
||||||
|
|
||||||
|
ifeq ($(LIBARCH),LIBC)
|
||||||
|
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
||||||
|
# INCLUDES += -I$(SDK_LIBC)/include/winsock
|
||||||
|
CFLAGS += -D_POSIX_SOURCE
|
||||||
|
# CFLAGS += -D__ANSIC__
|
||||||
|
else
|
||||||
|
INCLUDES += -I$(SDK_CLIB)/include/nlm -I$(SDK_CLIB)/include
|
||||||
|
# INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete
|
||||||
|
CFLAGS += -DNETDB_USE_INTERNET
|
||||||
|
endif
|
||||||
|
CFLAGS += -I. $(INCLUDES)
|
||||||
|
|
||||||
|
ifeq ($(MTSAFE),YES)
|
||||||
|
XDCOPT = -n
|
||||||
|
endif
|
||||||
|
ifeq ($(MTSAFE),NO)
|
||||||
|
XDCOPT = -u
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(findstring linux,$(OSTYPE)),linux)
|
||||||
|
DL = '
|
||||||
|
#-include $(NDKBASE)/nlmconv/ncpfs.inc
|
||||||
|
endif
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
lib: prebuild $(LTARGET)
|
||||||
|
|
||||||
|
nlm: prebuild $(TARGETS)
|
||||||
|
|
||||||
|
prebuild: $(OBJDIR) $(OBJDIR)/version.inc config.h arpa/nameser.h
|
||||||
|
|
||||||
|
dist: all
|
||||||
|
-$(RM) $(OBJS) $(OBJDIR)/*.map $(OBJDIR)/*.ncv
|
||||||
|
-$(RM) $(OBJDIR)/*.def $(OBJDIR)/*.xdc $(OBJDIR)/version.inc
|
||||||
|
|
||||||
|
install: $(INSTDIR) all
|
||||||
|
@$(CP) *.nlm $(INSTDIR)
|
||||||
|
@$(CP) ../CHANGES $(INSTDIR)
|
||||||
|
@$(CP) ../COPYING $(INSTDIR)
|
||||||
|
@$(CP) ../README $(INSTDIR)
|
||||||
|
@$(CP) ../RELEASE-NOTES $(INSTDIR)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-$(RM) $(LTARGET) $(TARGETS) config.h
|
||||||
|
-$(RM) -r $(OBJDIR)
|
||||||
|
-$(RM) -r arpa
|
||||||
|
|
||||||
|
%.lib: $(OBJS)
|
||||||
|
@echo Creating $@
|
||||||
|
@-$(RM) $@
|
||||||
|
@$(AR) $(ARFLAGS) $@ $^
|
||||||
|
|
||||||
|
%.nlm: $(OBJDIR)/%.def $(OBJDIR)/%.o $(OBJDIR)/%.xdc $(OBJS)
|
||||||
|
@echo Linking $@
|
||||||
|
@-$(RM) $@
|
||||||
|
@$(LD) $(LDFLAGS) $<
|
||||||
|
|
||||||
|
$(INSTDIR):
|
||||||
|
@mkdir $(INSTDIR)
|
||||||
|
|
||||||
|
$(OBJDIR):
|
||||||
|
@mkdir $(OBJDIR)
|
||||||
|
|
||||||
|
$(OBJDIR)/%.o: %.c
|
||||||
|
# @echo Compiling $<
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
$(OBJDIR)/version.inc: ares_version.h $(OBJDIR)
|
||||||
|
@echo Creating $@
|
||||||
|
@awk -f ../packages/NetWare/get_ver.awk $< > $@
|
||||||
|
|
||||||
|
$(OBJDIR)/%.xdc: Makefile.netware
|
||||||
|
@echo Creating $@
|
||||||
|
@$(MPKXDC) $(XDCOPT) $@
|
||||||
|
|
||||||
|
$(OBJDIR)/%.def: Makefile.netware
|
||||||
|
@echo Creating $@
|
||||||
|
@echo $(DL)# DEF file for linking with $(LD)$(DL) > $@
|
||||||
|
@echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@
|
||||||
|
@echo $(DL)# All your changes will be lost!!$(DL) >> $@
|
||||||
|
@echo $(DL)#$(DL) >> $@
|
||||||
|
@echo $(DL)copyright "$(COPYR)"$(DL) >> $@
|
||||||
|
@echo $(DL)description "$(DESCR)"$(DL) >> $@
|
||||||
|
@echo $(DL)version $(VERSION)$(DL) >> $@
|
||||||
|
ifdef NLMTYPE
|
||||||
|
@echo $(DL)type $(NLMTYPE)$(DL) >> $@
|
||||||
|
endif
|
||||||
|
ifdef STACK
|
||||||
|
@echo $(DL)stack $(STACK)$(DL) >> $@
|
||||||
|
endif
|
||||||
|
ifdef SCREEN
|
||||||
|
@echo $(DL)screenname "$(SCREEN)"$(DL) >> $@
|
||||||
|
else
|
||||||
|
@echo $(DL)screenname "DEFAULT"$(DL) >> $@
|
||||||
|
endif
|
||||||
|
ifeq ($(DB),DEBUG)
|
||||||
|
@echo $(DL)debug$(DL) >> $@
|
||||||
|
endif
|
||||||
|
@echo $(DL)threadname "$^"$(DL) >> $@
|
||||||
|
ifdef XDCOPT
|
||||||
|
@echo $(DL)xdcdata $(@:.def=.xdc)$(DL) >> $@
|
||||||
|
endif
|
||||||
|
ifeq ($(LDRING),0)
|
||||||
|
@echo $(DL)flag_on 16$(DL) >> $@
|
||||||
|
endif
|
||||||
|
ifeq ($(LDRING),3)
|
||||||
|
@echo $(DL)flag_on 512$(DL) >> $@
|
||||||
|
endif
|
||||||
|
ifeq ($(LIBARCH),CLIB)
|
||||||
|
@echo $(DL)start _Prelude$(DL) >> $@
|
||||||
|
@echo $(DL)exit _Stop$(DL) >> $@
|
||||||
|
@echo $(DL)import @$(SDK_CLIB)/imports/clib.imp$(DL) >> $@
|
||||||
|
@echo $(DL)import @$(SDK_CLIB)/imports/threads.imp$(DL) >> $@
|
||||||
|
@echo $(DL)import @$(SDK_CLIB)/imports/nlmlib.imp$(DL) >> $@
|
||||||
|
@echo $(DL)import @$(SDK_CLIB)/imports/socklib.imp$(DL) >> $@
|
||||||
|
@echo $(DL)module clib$(DL) >> $@
|
||||||
|
else
|
||||||
|
@echo $(DL)flag_on 64$(DL) >> $@
|
||||||
|
@echo $(DL)pseudopreemption$(DL) >> $@
|
||||||
|
@echo $(DL)start _LibCPrelude$(DL) >> $@
|
||||||
|
@echo $(DL)exit _LibCPostlude$(DL) >> $@
|
||||||
|
@echo $(DL)check _LibCCheckUnload$(DL) >> $@
|
||||||
|
@echo $(DL)import @$(SDK_LIBC)/imports/libc.imp$(DL) >> $@
|
||||||
|
@echo $(DL)import @$(SDK_LIBC)/imports/netware.imp$(DL) >> $@
|
||||||
|
@echo $(DL)module libc$(DL) >> $@
|
||||||
|
endif
|
||||||
|
ifdef MODULES
|
||||||
|
@echo $(DL)module $(MODULES)$(DL) >> $@
|
||||||
|
endif
|
||||||
|
ifdef EXPORTS
|
||||||
|
@echo $(DL)export $(EXPORTS)$(DL) >> $@
|
||||||
|
endif
|
||||||
|
ifdef IMPORTS
|
||||||
|
@echo $(DL)import $(IMPORTS)$(DL) >> $@
|
||||||
|
endif
|
||||||
|
ifeq ($(LD),nlmconv)
|
||||||
|
@echo $(DL)input $(OBJS)$(DL) >> $@
|
||||||
|
@echo $(DL)input $(PRELUDE)$(DL) >> $@
|
||||||
|
@echo $(DL)output $(notdir $(@:.def=.nlm))$(DL) >> $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
config.h: Makefile.netware
|
||||||
|
@echo Creating $@
|
||||||
|
@echo $(DL)/* $@ for NetWare target.$(DL) > $@
|
||||||
|
@echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@
|
||||||
|
@echo $(DL)** All your changes will be lost!!$(DL) >> $@
|
||||||
|
@echo $(DL)*/$(DL) >> $@
|
||||||
|
@echo $(DL)#define OS "i586-pc-NetWare"$(DL) >> $@
|
||||||
|
@echo $(DL)#define VERSION "$(LIBCURL_VERSION_STR)"$(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_NAMESER_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_ERR_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_FCNTL_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_FIONBIO 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_GETHOSTBYADDR 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_GETTIMEOFDAY 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_INET_ADDR 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_INET_NTOA 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_INET_PTON 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_INTTYPES_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_LIMITS_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_LONGLONG 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_NETINET_IN_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SELECT 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SETJMP_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SIGNAL 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SOCKET 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STDLIB_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRCASECMP 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRDUP 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRFTIME 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRING_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRLCAT 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRLCPY 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRSTR 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SYS_PARAM_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SYS_SELECT_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SYS_STAT_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SYS_TIME_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_TIME_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_UNAME 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_UNISTD_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define RETSIGTYPE void$(DL) >> $@
|
||||||
|
@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@
|
||||||
|
@echo $(DL)#define STDC_HEADERS 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
|
||||||
|
@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@
|
||||||
|
else
|
||||||
|
@echo $(DL)#define HAVE_SYS_TYPES_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SYS_SOCKET_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SYS_SOCKIO_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@
|
||||||
|
endif
|
||||||
|
ifdef OLD_NOVELLSDK
|
||||||
|
@echo $(DL)#define socklen_t int$(DL) >> $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
arpa/nameser.h: nameser.h
|
||||||
|
@echo Fix missing header $@
|
||||||
|
@-mkdir arpa
|
||||||
|
@$(CP) $< arpa
|
||||||
|
|
||||||
|
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
Major changes since:
|
||||||
|
* see the CHANGES file
|
||||||
|
|
||||||
Major changes in release 1.1.1:
|
Major changes in release 1.1.1:
|
||||||
* ares should now compile as C++ code (no longer uses reserved word
|
* ares should now compile as C++ code (no longer uses reserved word
|
||||||
"class").
|
"class").
|
||||||
|
|||||||
@@ -1,3 +1,126 @@
|
|||||||
|
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 (cygwin?) */
|
||||||
|
#include <windows.h>
|
||||||
|
],[
|
||||||
|
/* ioctlsocket source code */
|
||||||
|
int socket;
|
||||||
|
unsigned long flags = ioctlsocket(socket, 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 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
|
||||||
@@ -99,3 +222,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_COMPILE(
|
||||||
|
[#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_COMPILE(
|
||||||
|
[#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_COMPILE(
|
||||||
|
[#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
|
||||||
|
])
|
||||||
|
|
||||||
|
|||||||
327
ares/adig.c
327
ares/adig.c
@@ -13,6 +13,7 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
@@ -36,7 +37,7 @@
|
|||||||
#include "ares_dns.h"
|
#include "ares_dns.h"
|
||||||
|
|
||||||
#ifndef INADDR_NONE
|
#ifndef INADDR_NONE
|
||||||
#define INADDR_NONE 0xffffffff
|
#define INADDR_NONE 0xffffffff
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Mac OS X portability check */
|
/* Mac OS X portability check */
|
||||||
@@ -53,58 +54,58 @@ struct nv {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct nv flags[] = {
|
static const struct nv flags[] = {
|
||||||
{ "usevc", ARES_FLAG_USEVC },
|
{ "usevc", ARES_FLAG_USEVC },
|
||||||
{ "primary", ARES_FLAG_PRIMARY },
|
{ "primary", ARES_FLAG_PRIMARY },
|
||||||
{ "igntc", ARES_FLAG_IGNTC },
|
{ "igntc", ARES_FLAG_IGNTC },
|
||||||
{ "norecurse", ARES_FLAG_NORECURSE },
|
{ "norecurse", ARES_FLAG_NORECURSE },
|
||||||
{ "stayopen", ARES_FLAG_STAYOPEN },
|
{ "stayopen", ARES_FLAG_STAYOPEN },
|
||||||
{ "noaliases", ARES_FLAG_NOALIASES }
|
{ "noaliases", ARES_FLAG_NOALIASES }
|
||||||
};
|
};
|
||||||
static const int nflags = sizeof(flags) / sizeof(flags[0]);
|
static const int nflags = sizeof(flags) / sizeof(flags[0]);
|
||||||
|
|
||||||
static const struct nv classes[] = {
|
static const struct nv classes[] = {
|
||||||
{ "IN", C_IN },
|
{ "IN", C_IN },
|
||||||
{ "CHAOS", C_CHAOS },
|
{ "CHAOS", C_CHAOS },
|
||||||
{ "HS", C_HS },
|
{ "HS", C_HS },
|
||||||
{ "ANY", C_ANY }
|
{ "ANY", C_ANY }
|
||||||
};
|
};
|
||||||
static const int nclasses = sizeof(classes) / sizeof(classes[0]);
|
static const int nclasses = sizeof(classes) / sizeof(classes[0]);
|
||||||
|
|
||||||
static const struct nv types[] = {
|
static const struct nv types[] = {
|
||||||
{ "A", T_A },
|
{ "A", T_A },
|
||||||
{ "NS", T_NS },
|
{ "NS", T_NS },
|
||||||
{ "MD", T_MD },
|
{ "MD", T_MD },
|
||||||
{ "MF", T_MF },
|
{ "MF", T_MF },
|
||||||
{ "CNAME", T_CNAME },
|
{ "CNAME", T_CNAME },
|
||||||
{ "SOA", T_SOA },
|
{ "SOA", T_SOA },
|
||||||
{ "MB", T_MB },
|
{ "MB", T_MB },
|
||||||
{ "MG", T_MG },
|
{ "MG", T_MG },
|
||||||
{ "MR", T_MR },
|
{ "MR", T_MR },
|
||||||
{ "NULL", T_NULL },
|
{ "NULL", T_NULL },
|
||||||
{ "WKS", T_WKS },
|
{ "WKS", T_WKS },
|
||||||
{ "PTR", T_PTR },
|
{ "PTR", T_PTR },
|
||||||
{ "HINFO", T_HINFO },
|
{ "HINFO", T_HINFO },
|
||||||
{ "MINFO", T_MINFO },
|
{ "MINFO", T_MINFO },
|
||||||
{ "MX", T_MX },
|
{ "MX", T_MX },
|
||||||
{ "TXT", T_TXT },
|
{ "TXT", T_TXT },
|
||||||
{ "RP", T_RP },
|
{ "RP", T_RP },
|
||||||
{ "AFSDB", T_AFSDB },
|
{ "AFSDB", T_AFSDB },
|
||||||
{ "X25", T_X25 },
|
{ "X25", T_X25 },
|
||||||
{ "ISDN", T_ISDN },
|
{ "ISDN", T_ISDN },
|
||||||
{ "RT", T_RT },
|
{ "RT", T_RT },
|
||||||
{ "NSAP", T_NSAP },
|
{ "NSAP", T_NSAP },
|
||||||
{ "NSAP_PTR", T_NSAP_PTR },
|
{ "NSAP_PTR", T_NSAP_PTR },
|
||||||
{ "SIG", T_SIG },
|
{ "SIG", T_SIG },
|
||||||
{ "KEY", T_KEY },
|
{ "KEY", T_KEY },
|
||||||
{ "PX", T_PX },
|
{ "PX", T_PX },
|
||||||
{ "GPOS", T_GPOS },
|
{ "GPOS", T_GPOS },
|
||||||
{ "AAAA", T_AAAA },
|
{ "AAAA", T_AAAA },
|
||||||
{ "LOC", T_LOC },
|
{ "LOC", T_LOC },
|
||||||
{ "SRV", T_SRV },
|
{ "SRV", T_SRV },
|
||||||
{ "AXFR", T_AXFR },
|
{ "AXFR", T_AXFR },
|
||||||
{ "MAILB", T_MAILB },
|
{ "MAILB", T_MAILB },
|
||||||
{ "MAILA", T_MAILA },
|
{ "MAILA", T_MAILA },
|
||||||
{ "ANY", T_ANY }
|
{ "ANY", T_ANY }
|
||||||
};
|
};
|
||||||
static const int ntypes = sizeof(types) / sizeof(types[0]);
|
static const int ntypes = sizeof(types) / sizeof(types[0]);
|
||||||
|
|
||||||
@@ -123,10 +124,10 @@ static const char *rcodes[] = {
|
|||||||
|
|
||||||
static void callback(void *arg, int status, unsigned char *abuf, int alen);
|
static void callback(void *arg, int status, unsigned char *abuf, int alen);
|
||||||
static const unsigned char *display_question(const unsigned char *aptr,
|
static const unsigned char *display_question(const unsigned char *aptr,
|
||||||
const unsigned char *abuf,
|
const unsigned char *abuf,
|
||||||
int alen);
|
int alen);
|
||||||
static const unsigned char *display_rr(const unsigned char *aptr,
|
static const unsigned char *display_rr(const unsigned char *aptr,
|
||||||
const unsigned char *abuf, int alen);
|
const unsigned char *abuf, int alen);
|
||||||
static const char *type_name(int type);
|
static const char *type_name(int type);
|
||||||
static const char *class_name(int dnsclass);
|
static const char *class_name(int dnsclass);
|
||||||
static void usage(void);
|
static void usage(void);
|
||||||
@@ -153,80 +154,80 @@ int main(int argc, char **argv)
|
|||||||
while ((c = getopt(argc, argv, "f:s:c:t:T:U:")) != -1)
|
while ((c = getopt(argc, argv, "f:s:c:t:T:U:")) != -1)
|
||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
case 'f':
|
case 'f':
|
||||||
/* Add a flag. */
|
/* Add a flag. */
|
||||||
for (i = 0; i < nflags; i++)
|
for (i = 0; i < nflags; i++)
|
||||||
{
|
{
|
||||||
if (strcmp(flags[i].name, optarg) == 0)
|
if (strcmp(flags[i].name, optarg) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i == nflags)
|
if (i == nflags)
|
||||||
usage();
|
usage();
|
||||||
options.flags |= flags[i].value;
|
options.flags |= flags[i].value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
/* Add a server, and specify servers in the option mask. */
|
/* Add a server, and specify servers in the option mask. */
|
||||||
hostent = gethostbyname(optarg);
|
hostent = gethostbyname(optarg);
|
||||||
if (!hostent || hostent->h_addrtype != AF_INET)
|
if (!hostent || hostent->h_addrtype != AF_INET)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "adig: server %s not found.\n", optarg);
|
fprintf(stderr, "adig: server %s not found.\n", optarg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
options.servers = realloc(options.servers, (options.nservers + 1)
|
options.servers = realloc(options.servers, (options.nservers + 1)
|
||||||
* sizeof(struct in_addr));
|
* sizeof(struct in_addr));
|
||||||
if (!options.servers)
|
if (!options.servers)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Out of memory!\n");
|
fprintf(stderr, "Out of memory!\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
memcpy(&options.servers[options.nservers], hostent->h_addr,
|
memcpy(&options.servers[options.nservers], hostent->h_addr,
|
||||||
sizeof(struct in_addr));
|
sizeof(struct in_addr));
|
||||||
options.nservers++;
|
options.nservers++;
|
||||||
optmask |= ARES_OPT_SERVERS;
|
optmask |= ARES_OPT_SERVERS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'c':
|
case 'c':
|
||||||
/* Set the query class. */
|
/* Set the query class. */
|
||||||
for (i = 0; i < nclasses; i++)
|
for (i = 0; i < nclasses; i++)
|
||||||
{
|
{
|
||||||
if (strcasecmp(classes[i].name, optarg) == 0)
|
if (strcasecmp(classes[i].name, optarg) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i == nclasses)
|
if (i == nclasses)
|
||||||
usage();
|
usage();
|
||||||
dnsclass = classes[i].value;
|
dnsclass = classes[i].value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 't':
|
case 't':
|
||||||
/* Set the query type. */
|
/* Set the query type. */
|
||||||
for (i = 0; i < ntypes; i++)
|
for (i = 0; i < ntypes; i++)
|
||||||
{
|
{
|
||||||
if (strcasecmp(types[i].name, optarg) == 0)
|
if (strcasecmp(types[i].name, optarg) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i == ntypes)
|
if (i == ntypes)
|
||||||
usage();
|
usage();
|
||||||
type = types[i].value;
|
type = types[i].value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'T':
|
case 'T':
|
||||||
/* 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 = strtol(optarg, NULL, 0);
|
||||||
optmask |= ARES_OPT_TCP_PORT;
|
optmask |= ARES_OPT_TCP_PORT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'U':
|
case 'U':
|
||||||
/* 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 = strtol(optarg, NULL, 0);
|
||||||
optmask |= ARES_OPT_UDP_PORT;
|
optmask |= ARES_OPT_UDP_PORT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
argv += optind;
|
argv += optind;
|
||||||
@@ -238,7 +239,7 @@ int main(int argc, char **argv)
|
|||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ares_init_options: %s\n",
|
fprintf(stderr, "ares_init_options: %s\n",
|
||||||
ares_strerror(status));
|
ares_strerror(status));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +253,7 @@ int main(int argc, char **argv)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (; *argv; argv++)
|
for (; *argv; argv++)
|
||||||
ares_query(channel, *argv, dnsclass, type, callback, *argv);
|
ares_query(channel, *argv, dnsclass, type, callback, *argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for all queries to complete. */
|
/* Wait for all queries to complete. */
|
||||||
@@ -262,14 +263,14 @@ int main(int argc, char **argv)
|
|||||||
FD_ZERO(&write_fds);
|
FD_ZERO(&write_fds);
|
||||||
nfds = ares_fds(channel, &read_fds, &write_fds);
|
nfds = ares_fds(channel, &read_fds, &write_fds);
|
||||||
if (nfds == 0)
|
if (nfds == 0)
|
||||||
break;
|
break;
|
||||||
tvp = ares_timeout(channel, NULL, &tv);
|
tvp = ares_timeout(channel, NULL, &tv);
|
||||||
count = select(nfds, &read_fds, &write_fds, NULL, tvp);
|
count = select(nfds, &read_fds, &write_fds, NULL, tvp);
|
||||||
if (count < 0 && errno != EINVAL)
|
if (count < 0 && errno != EINVAL)
|
||||||
{
|
{
|
||||||
perror("select");
|
perror("select");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
ares_process(channel, &read_fds, &write_fds);
|
ares_process(channel, &read_fds, &write_fds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -295,7 +296,7 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
|||||||
{
|
{
|
||||||
printf("%s\n", ares_strerror(status));
|
printf("%s\n", ares_strerror(status));
|
||||||
if (!abuf)
|
if (!abuf)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Won't happen, but check anyway, for safety. */
|
/* Won't happen, but check anyway, for safety. */
|
||||||
@@ -319,11 +320,11 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
|||||||
/* Display the answer header. */
|
/* Display the answer header. */
|
||||||
printf("id: %d\n", id);
|
printf("id: %d\n", id);
|
||||||
printf("flags: %s%s%s%s%s\n",
|
printf("flags: %s%s%s%s%s\n",
|
||||||
qr ? "qr " : "",
|
qr ? "qr " : "",
|
||||||
aa ? "aa " : "",
|
aa ? "aa " : "",
|
||||||
tc ? "tc " : "",
|
tc ? "tc " : "",
|
||||||
rd ? "rd " : "",
|
rd ? "rd " : "",
|
||||||
ra ? "ra " : "");
|
ra ? "ra " : "");
|
||||||
printf("opcode: %s\n", opcodes[opcode]);
|
printf("opcode: %s\n", opcodes[opcode]);
|
||||||
printf("rcode: %s\n", rcodes[rcode]);
|
printf("rcode: %s\n", rcodes[rcode]);
|
||||||
|
|
||||||
@@ -334,7 +335,7 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
|||||||
{
|
{
|
||||||
aptr = display_question(aptr, abuf, alen);
|
aptr = display_question(aptr, abuf, alen);
|
||||||
if (aptr == NULL)
|
if (aptr == NULL)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Display the answers. */
|
/* Display the answers. */
|
||||||
@@ -343,7 +344,7 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
|||||||
{
|
{
|
||||||
aptr = display_rr(aptr, abuf, alen);
|
aptr = display_rr(aptr, abuf, alen);
|
||||||
if (aptr == NULL)
|
if (aptr == NULL)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Display the NS records. */
|
/* Display the NS records. */
|
||||||
@@ -352,7 +353,7 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
|||||||
{
|
{
|
||||||
aptr = display_rr(aptr, abuf, alen);
|
aptr = display_rr(aptr, abuf, alen);
|
||||||
if (aptr == NULL)
|
if (aptr == NULL)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Display the additional records. */
|
/* Display the additional records. */
|
||||||
@@ -361,13 +362,13 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
|||||||
{
|
{
|
||||||
aptr = display_rr(aptr, abuf, alen);
|
aptr = display_rr(aptr, abuf, alen);
|
||||||
if (aptr == NULL)
|
if (aptr == NULL)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const unsigned char *display_question(const unsigned char *aptr,
|
static const unsigned char *display_question(const unsigned char *aptr,
|
||||||
const unsigned char *abuf,
|
const unsigned char *abuf,
|
||||||
int alen)
|
int alen)
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
int type, dnsclass, status;
|
int type, dnsclass, status;
|
||||||
@@ -405,7 +406,7 @@ static const unsigned char *display_question(const unsigned char *aptr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const unsigned char *display_rr(const unsigned char *aptr,
|
static const unsigned char *display_rr(const unsigned char *aptr,
|
||||||
const unsigned char *abuf, int alen)
|
const unsigned char *abuf, int alen)
|
||||||
{
|
{
|
||||||
const unsigned char *p;
|
const unsigned char *p;
|
||||||
char *name;
|
char *name;
|
||||||
@@ -462,7 +463,7 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
/* For these types, the RR data is just a domain name. */
|
/* For these types, the RR data is just a domain name. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &name, &len);
|
status = ares_expand_name(aptr, abuf, alen, &name, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t%s.", name);
|
printf("\t%s.", name);
|
||||||
free(name);
|
free(name);
|
||||||
break;
|
break;
|
||||||
@@ -472,12 +473,12 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
p = aptr;
|
p = 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", 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", len, p + 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -486,13 +487,13 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
p = aptr;
|
p = aptr;
|
||||||
status = ares_expand_name(p, abuf, alen, &name, &len);
|
status = ares_expand_name(p, abuf, alen, &name, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t%s.", name);
|
printf("\t%s.", name);
|
||||||
free(name);
|
free(name);
|
||||||
p += len;
|
p += len;
|
||||||
status = ares_expand_name(p, abuf, alen, &name, &len);
|
status = ares_expand_name(p, abuf, alen, &name, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t%s.", name);
|
printf("\t%s.", name);
|
||||||
free(name);
|
free(name);
|
||||||
break;
|
break;
|
||||||
@@ -502,11 +503,11 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
* then a domain name.
|
* then a domain name.
|
||||||
*/
|
*/
|
||||||
if (dlen < 2)
|
if (dlen < 2)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t%d", (aptr[0] << 8) | aptr[1]);
|
printf("\t%d", (aptr[0] << 8) | aptr[1]);
|
||||||
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;
|
||||||
printf("\t%s.", name);
|
printf("\t%s.", name);
|
||||||
free(name);
|
free(name);
|
||||||
break;
|
break;
|
||||||
@@ -518,24 +519,24 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
p = aptr;
|
p = aptr;
|
||||||
status = ares_expand_name(p, abuf, alen, &name, &len);
|
status = ares_expand_name(p, abuf, alen, &name, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t%s.\n", name);
|
printf("\t%s.\n", name);
|
||||||
free(name);
|
free(name);
|
||||||
p += len;
|
p += len;
|
||||||
status = ares_expand_name(p, abuf, alen, &name, &len);
|
status = ares_expand_name(p, abuf, alen, &name, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t\t\t\t\t\t%s.\n", name);
|
printf("\t\t\t\t\t\t%s.\n", name);
|
||||||
free(name);
|
free(name);
|
||||||
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( %d %d %d %d %d )",
|
||||||
(p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3],
|
(p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3],
|
||||||
(p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7],
|
(p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7],
|
||||||
(p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11],
|
(p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11],
|
||||||
(p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15],
|
(p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15],
|
||||||
(p[16] << 24) | (p[17] << 16) | (p[18] << 8) | p[19]);
|
(p[16] << 24) | (p[17] << 16) | (p[18] << 8) | p[19]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_TXT:
|
case T_TXT:
|
||||||
@@ -543,19 +544,19 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
* strings. */
|
* strings. */
|
||||||
p = aptr;
|
p = aptr;
|
||||||
while (p < aptr + dlen)
|
while (p < aptr + dlen)
|
||||||
{
|
{
|
||||||
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", len, p + 1);
|
||||||
p += len + 1;
|
p += len + 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_A:
|
case T_A:
|
||||||
/* 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));
|
memcpy(&addr, aptr, sizeof(struct in_addr));
|
||||||
printf("\t%s", inet_ntoa(addr));
|
printf("\t%s", inet_ntoa(addr));
|
||||||
break;
|
break;
|
||||||
@@ -595,7 +596,7 @@ static const char *type_name(int type)
|
|||||||
for (i = 0; i < ntypes; i++)
|
for (i = 0; i < ntypes; i++)
|
||||||
{
|
{
|
||||||
if (types[i].value == type)
|
if (types[i].value == type)
|
||||||
return types[i].name;
|
return types[i].name;
|
||||||
}
|
}
|
||||||
return "(unknown)";
|
return "(unknown)";
|
||||||
}
|
}
|
||||||
@@ -607,7 +608,7 @@ static const char *class_name(int dnsclass)
|
|||||||
for (i = 0; i < nclasses; i++)
|
for (i = 0; i < nclasses; i++)
|
||||||
{
|
{
|
||||||
if (classes[i].value == dnsclass)
|
if (classes[i].value == dnsclass)
|
||||||
return classes[i].name;
|
return classes[i].name;
|
||||||
}
|
}
|
||||||
return "(unknown)";
|
return "(unknown)";
|
||||||
}
|
}
|
||||||
@@ -615,6 +616,6 @@ static const char *class_name(int dnsclass)
|
|||||||
static void usage(void)
|
static void usage(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "usage: adig [-f flag] [-s server] [-c class] "
|
fprintf(stderr, "usage: adig [-f flag] [-s server] [-c class] "
|
||||||
"[-t type] [-p port] name ...\n");
|
"[-t type] [-p port] name ...\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|||||||
15
ares/ahost.c
15
ares/ahost.c
@@ -13,6 +13,7 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
@@ -32,7 +33,7 @@
|
|||||||
#include "ares_dns.h"
|
#include "ares_dns.h"
|
||||||
|
|
||||||
#ifndef INADDR_NONE
|
#ifndef INADDR_NONE
|
||||||
#define INADDR_NONE 0xffffffff
|
#define INADDR_NONE 0xffffffff
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void callback(void *arg, int status, struct hostent *host);
|
static void callback(void *arg, int status, struct hostent *host);
|
||||||
@@ -67,12 +68,12 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
addr.s_addr = inet_addr(*argv);
|
addr.s_addr = inet_addr(*argv);
|
||||||
if (addr.s_addr == INADDR_NONE)
|
if (addr.s_addr == INADDR_NONE)
|
||||||
ares_gethostbyname(channel, *argv, AF_INET, callback, *argv);
|
ares_gethostbyname(channel, *argv, AF_INET, callback, *argv);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ares_gethostbyaddr(channel, &addr, sizeof(addr), AF_INET, callback,
|
ares_gethostbyaddr(channel, &addr, sizeof(addr), AF_INET, callback,
|
||||||
*argv);
|
*argv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for all queries to complete. */
|
/* Wait for all queries to complete. */
|
||||||
@@ -82,7 +83,7 @@ int main(int argc, char **argv)
|
|||||||
FD_ZERO(&write_fds);
|
FD_ZERO(&write_fds);
|
||||||
nfds = ares_fds(channel, &read_fds, &write_fds);
|
nfds = ares_fds(channel, &read_fds, &write_fds);
|
||||||
if (nfds == 0)
|
if (nfds == 0)
|
||||||
break;
|
break;
|
||||||
tvp = ares_timeout(channel, NULL, &tv);
|
tvp = ares_timeout(channel, NULL, &tv);
|
||||||
select(nfds, &read_fds, &write_fds, NULL, tvp);
|
select(nfds, &read_fds, &write_fds, NULL, tvp);
|
||||||
ares_process(channel, &read_fds, &write_fds);
|
ares_process(channel, &read_fds, &write_fds);
|
||||||
|
|||||||
174
ares/ares.h
174
ares/ares.h
@@ -20,63 +20,115 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef _AIX
|
#if defined(_AIX) || defined(NETWARE)
|
||||||
/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish
|
/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish
|
||||||
libc5-based Linux systems. Only include it on system that are known to
|
libc5-based Linux systems. Only include it on system that are known to
|
||||||
require it! */
|
require it! */
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WATT32)
|
||||||
#include <winsock.h>
|
#include <netinet/in.h>
|
||||||
#include <windows.h>
|
#include <sys/socket.h>
|
||||||
|
#include <tcp.h>
|
||||||
|
#elif defined(WIN32)
|
||||||
|
#include <winsock.h>
|
||||||
|
#include <windows.h>
|
||||||
#else
|
#else
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ARES_SUCCESS 0
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ARES_SUCCESS 0
|
||||||
|
|
||||||
/* Server error codes (ARES_ENODATA indicates no relevant answer) */
|
/* Server error codes (ARES_ENODATA indicates no relevant answer) */
|
||||||
#define ARES_ENODATA 1
|
#define ARES_ENODATA 1
|
||||||
#define ARES_EFORMERR 2
|
#define ARES_EFORMERR 2
|
||||||
#define ARES_ESERVFAIL 3
|
#define ARES_ESERVFAIL 3
|
||||||
#define ARES_ENOTFOUND 4
|
#define ARES_ENOTFOUND 4
|
||||||
#define ARES_ENOTIMP 5
|
#define ARES_ENOTIMP 5
|
||||||
#define ARES_EREFUSED 6
|
#define ARES_EREFUSED 6
|
||||||
|
|
||||||
/* Locally generated error codes */
|
/* Locally generated error codes */
|
||||||
#define ARES_EBADQUERY 7
|
#define ARES_EBADQUERY 7
|
||||||
#define ARES_EBADNAME 8
|
#define ARES_EBADNAME 8
|
||||||
#define ARES_EBADFAMILY 9
|
#define ARES_EBADFAMILY 9
|
||||||
#define ARES_EBADRESP 10
|
#define ARES_EBADRESP 10
|
||||||
#define ARES_ECONNREFUSED 11
|
#define ARES_ECONNREFUSED 11
|
||||||
#define ARES_ETIMEOUT 12
|
#define ARES_ETIMEOUT 12
|
||||||
#define ARES_EOF 13
|
#define ARES_EOF 13
|
||||||
#define ARES_EFILE 14
|
#define ARES_EFILE 14
|
||||||
#define ARES_ENOMEM 15
|
#define ARES_ENOMEM 15
|
||||||
#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)
|
||||||
#define ARES_FLAG_IGNTC (1 << 2)
|
#define ARES_FLAG_IGNTC (1 << 2)
|
||||||
#define ARES_FLAG_NORECURSE (1 << 3)
|
#define ARES_FLAG_NORECURSE (1 << 3)
|
||||||
#define ARES_FLAG_STAYOPEN (1 << 4)
|
#define ARES_FLAG_STAYOPEN (1 << 4)
|
||||||
#define ARES_FLAG_NOSEARCH (1 << 5)
|
#define ARES_FLAG_NOSEARCH (1 << 5)
|
||||||
#define ARES_FLAG_NOALIASES (1 << 6)
|
#define ARES_FLAG_NOALIASES (1 << 6)
|
||||||
#define ARES_FLAG_NOCHECKRESP (1 << 7)
|
#define ARES_FLAG_NOCHECKRESP (1 << 7)
|
||||||
|
|
||||||
/* Option mask values */
|
/* Option mask values */
|
||||||
#define ARES_OPT_FLAGS (1 << 0)
|
#define ARES_OPT_FLAGS (1 << 0)
|
||||||
#define ARES_OPT_TIMEOUT (1 << 1)
|
#define ARES_OPT_TIMEOUT (1 << 1)
|
||||||
#define ARES_OPT_TRIES (1 << 2)
|
#define ARES_OPT_TRIES (1 << 2)
|
||||||
#define ARES_OPT_NDOTS (1 << 3)
|
#define ARES_OPT_NDOTS (1 << 3)
|
||||||
#define ARES_OPT_UDP_PORT (1 << 4)
|
#define ARES_OPT_UDP_PORT (1 << 4)
|
||||||
#define ARES_OPT_TCP_PORT (1 << 5)
|
#define ARES_OPT_TCP_PORT (1 << 5)
|
||||||
#define ARES_OPT_SERVERS (1 << 6)
|
#define ARES_OPT_SERVERS (1 << 6)
|
||||||
#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)
|
||||||
|
|
||||||
struct ares_options {
|
struct ares_options {
|
||||||
int flags;
|
int flags;
|
||||||
@@ -94,47 +146,57 @@ 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,
|
||||||
int optmask);
|
int optmask);
|
||||||
void ares_destroy(ares_channel channel);
|
void ares_destroy(ares_channel channel);
|
||||||
void ares_cancel(ares_channel channel);
|
void ares_cancel(ares_channel channel);
|
||||||
void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
|
void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
|
||||||
ares_callback callback, void *arg);
|
ares_callback callback, void *arg);
|
||||||
void ares_query(ares_channel channel, const char *name, int dnsclass,
|
void ares_query(ares_channel channel, const char *name, int dnsclass,
|
||||||
int type, ares_callback callback, void *arg);
|
int type, ares_callback callback, void *arg);
|
||||||
void ares_search(ares_channel channel, const char *name, int dnsclass,
|
void ares_search(ares_channel channel, const char *name, int dnsclass,
|
||||||
int type, ares_callback callback, void *arg);
|
int type, ares_callback callback, void *arg);
|
||||||
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);
|
||||||
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);
|
||||||
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);
|
||||||
|
|
||||||
int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
||||||
int rd, unsigned char **buf, int *buflen);
|
int rd, unsigned char **buf, int *buflen);
|
||||||
int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
||||||
int alen, char **s, long *enclen);
|
int alen, char **s, long *enclen);
|
||||||
int ares_expand_string(const unsigned char *encoded, const unsigned char *abuf,
|
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
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* ARES__H */
|
#endif /* ARES__H */
|
||||||
|
|||||||
@@ -13,11 +13,13 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#ifdef WIN32
|
#ifdef HAVE_UNISTD_H
|
||||||
#else
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
|
||||||
@@ -42,14 +44,14 @@ void ares__close_sockets(struct server_state *server)
|
|||||||
server->tcp_lenbuf_pos = 0;
|
server->tcp_lenbuf_pos = 0;
|
||||||
|
|
||||||
/* Close the TCP and UDP sockets. */
|
/* Close the TCP and UDP sockets. */
|
||||||
if (server->tcp_socket != -1)
|
if (server->tcp_socket != ARES_SOCKET_BAD)
|
||||||
{
|
{
|
||||||
closesocket(server->tcp_socket);
|
closesocket(server->tcp_socket);
|
||||||
server->tcp_socket = -1;
|
server->tcp_socket = ARES_SOCKET_BAD;
|
||||||
}
|
}
|
||||||
if (server->udp_socket != -1)
|
if (server->udp_socket != ARES_SOCKET_BAD)
|
||||||
{
|
{
|
||||||
closesocket(server->udp_socket);
|
closesocket(server->udp_socket);
|
||||||
server->udp_socket = -1;
|
server->udp_socket = ARES_SOCKET_BAD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,11 +13,10 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if !defined(WIN32) || defined(WATT32)
|
||||||
|
|
||||||
#else
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
@@ -31,113 +30,130 @@
|
|||||||
|
|
||||||
#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)
|
||||||
{
|
{
|
||||||
/* Skip comment lines; terminate line at comment character. */
|
/* Skip comment lines; terminate line at comment character. */
|
||||||
if (*line == '#' || !*line)
|
if (*line == '#' || !*line)
|
||||||
continue;
|
continue;
|
||||||
p = strchr(line, '#');
|
p = strchr(line, '#');
|
||||||
if (p)
|
if (p)
|
||||||
*p = 0;
|
*p = 0;
|
||||||
|
|
||||||
/* Get the address part. */
|
/* Get the address part. */
|
||||||
p = line;
|
p = line;
|
||||||
while (*p && !isspace((unsigned char)*p))
|
while (*p && !isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
if (!*p)
|
if (!*p)
|
||||||
continue;
|
continue;
|
||||||
*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)
|
||||||
continue;
|
{
|
||||||
|
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;
|
||||||
|
|
||||||
/* Get the canonical hostname. */
|
/* Get the canonical hostname. */
|
||||||
p++;
|
p++;
|
||||||
while (isspace((unsigned char)*p))
|
while (isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
if (!*p)
|
if (!*p)
|
||||||
continue;
|
continue;
|
||||||
q = p;
|
q = p;
|
||||||
while (*q && !isspace((unsigned char)*q))
|
while (*q && !isspace((unsigned char)*q))
|
||||||
q++;
|
q++;
|
||||||
end_at_hostname = (*q == 0);
|
end_at_hostname = (*q == 0);
|
||||||
*q = 0;
|
*q = 0;
|
||||||
canonical = p;
|
canonical = p;
|
||||||
|
|
||||||
naliases = 0;
|
naliases = 0;
|
||||||
if (!end_at_hostname)
|
if (!end_at_hostname)
|
||||||
{
|
{
|
||||||
/* Count the aliases. */
|
/* Count the aliases. */
|
||||||
p = q + 1;
|
p = q + 1;
|
||||||
while (isspace((unsigned char)*p))
|
while (isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
while (*p)
|
while (*p)
|
||||||
{
|
{
|
||||||
while (*p && !isspace((unsigned char)*p))
|
while (*p && !isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
while (isspace((unsigned char)*p))
|
while (isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
naliases++;
|
naliases++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate memory for the host structure. */
|
/* Allocate memory for the host structure. */
|
||||||
hostent = malloc(sizeof(struct hostent));
|
hostent = malloc(sizeof(struct hostent));
|
||||||
if (!hostent)
|
if (!hostent)
|
||||||
break;
|
break;
|
||||||
hostent->h_aliases = NULL;
|
hostent->h_aliases = NULL;
|
||||||
hostent->h_addr_list = NULL;
|
hostent->h_addr_list = NULL;
|
||||||
hostent->h_name = strdup(canonical);
|
hostent->h_name = strdup(canonical);
|
||||||
if (!hostent->h_name)
|
if (!hostent->h_name)
|
||||||
break;
|
break;
|
||||||
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 *));
|
||||||
if (!hostent->h_aliases)
|
if (!hostent->h_aliases)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Copy in aliases. */
|
/* Copy in aliases. */
|
||||||
naliases = 0;
|
naliases = 0;
|
||||||
if (!end_at_hostname)
|
if (!end_at_hostname)
|
||||||
{
|
{
|
||||||
p = canonical + strlen(canonical) + 1;
|
p = canonical + strlen(canonical) + 1;
|
||||||
while (isspace((unsigned char)*p))
|
while (isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
while (*p)
|
while (*p)
|
||||||
{
|
{
|
||||||
q = p;
|
q = p;
|
||||||
while (*q && !isspace((unsigned char)*q))
|
while (*q && !isspace((unsigned char)*q))
|
||||||
q++;
|
q++;
|
||||||
hostent->h_aliases[naliases] = malloc(q - p + 1);
|
hostent->h_aliases[naliases] = malloc(q - p + 1);
|
||||||
if (hostent->h_aliases[naliases] == NULL)
|
if (hostent->h_aliases[naliases] == NULL)
|
||||||
break;
|
break;
|
||||||
memcpy(hostent->h_aliases[naliases], p, q - p);
|
memcpy(hostent->h_aliases[naliases], p, q - p);
|
||||||
hostent->h_aliases[naliases][q - p] = 0;
|
hostent->h_aliases[naliases][q - p] = 0;
|
||||||
p = q;
|
p = q;
|
||||||
while (isspace((unsigned char)*p))
|
while (isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
naliases++;
|
naliases++;
|
||||||
}
|
}
|
||||||
if (*p)
|
if (*p)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
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);
|
||||||
@@ -150,22 +166,22 @@ int ares__get_hostent(FILE *fp, struct hostent **host)
|
|||||||
{
|
{
|
||||||
/* Memory allocation failure; clean up. */
|
/* Memory allocation failure; clean up. */
|
||||||
if (hostent)
|
if (hostent)
|
||||||
{
|
{
|
||||||
if(hostent->h_name)
|
if(hostent->h_name)
|
||||||
free((char *) hostent->h_name);
|
free((char *) hostent->h_name);
|
||||||
if (hostent->h_aliases)
|
if (hostent->h_aliases)
|
||||||
{
|
{
|
||||||
for (alias = hostent->h_aliases; *alias; alias++)
|
for (alias = hostent->h_aliases; *alias; alias++)
|
||||||
free(*alias);
|
free(*alias);
|
||||||
}
|
}
|
||||||
if(hostent->h_aliases)
|
if(hostent->h_aliases)
|
||||||
free(hostent->h_aliases);
|
free(hostent->h_aliases);
|
||||||
if (hostent->h_addr_list && hostent->h_addr_list[0])
|
if (hostent->h_addr_list && hostent->h_addr_list[0])
|
||||||
free(hostent->h_addr_list[0]);
|
free(hostent->h_addr_list[0]);
|
||||||
if(hostent->h_addr_list)
|
if(hostent->h_addr_list)
|
||||||
free(hostent->h_addr_list);
|
free(hostent->h_addr_list);
|
||||||
free(hostent);
|
free(hostent);
|
||||||
}
|
}
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -37,26 +38,26 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize)
|
|||||||
{
|
{
|
||||||
*buf = malloc(128);
|
*buf = malloc(128);
|
||||||
if (!*buf)
|
if (!*buf)
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
*bufsize = 128;
|
*bufsize = 128;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (!fgets(*buf + offset, *bufsize - (int)offset, fp))
|
if (!fgets(*buf + offset, *bufsize - (int)offset, fp))
|
||||||
return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF;
|
return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF;
|
||||||
len = offset + strlen(*buf + offset);
|
len = offset + strlen(*buf + offset);
|
||||||
if ((*buf)[len - 1] == '\n')
|
if ((*buf)[len - 1] == '\n')
|
||||||
{
|
{
|
||||||
(*buf)[len - 1] = 0;
|
(*buf)[len - 1] = 0;
|
||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
offset = len;
|
offset = len;
|
||||||
|
|
||||||
/* Allocate more space. */
|
/* Allocate more space. */
|
||||||
newbuf = realloc(*buf, *bufsize * 2);
|
newbuf = realloc(*buf, *bufsize * 2);
|
||||||
if (!newbuf)
|
if (!newbuf)
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
*buf = newbuf;
|
*buf = newbuf;
|
||||||
*bufsize *= 2;
|
*bufsize *= 2;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,5 +33,7 @@ might have been stored in their arguments.
|
|||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR ares_init (3)
|
.BR ares_init (3)
|
||||||
.BR ares_destroy (3)
|
.BR ares_destroy (3)
|
||||||
|
.SH NOTES
|
||||||
|
This function is not compatible with ares.
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Dirk Manske
|
Dirk Manske
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
/* Copyright (C) 2004 by Daniel Stenberg et al
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this
|
* Permission to use, copy, modify, and distribute this software and its
|
||||||
* software and its documentation for any purpose and without
|
* documentation for any purpose and without fee is hereby granted, provided
|
||||||
* fee is hereby granted, provided that the above copyright
|
* that the above copyright notice appear in all copies and that both that
|
||||||
* notice appear in all copies and that both that copyright
|
* copyright notice and this permission notice appear in supporting
|
||||||
* notice and this permission notice appear in supporting
|
* documentation, and that the name of M.I.T. not be used in advertising or
|
||||||
* documentation, and that the name of M.I.T. not be used in
|
* publicity pertaining to distribution of the software without specific,
|
||||||
* advertising or publicity pertaining to distribution of the
|
* written prior permission. M.I.T. makes no representations about the
|
||||||
* software without specific, written prior permission.
|
* suitability of this software for any purpose. It is provided "as is"
|
||||||
* 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.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
|||||||
@@ -14,14 +14,14 @@
|
|||||||
.\" 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.
|
||||||
.\"
|
.\"
|
||||||
.TH ARES_DESTROY 3 "23 July 1998"
|
.TH ARES_DESTROY 3 "7 December 2004"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
ares_destroy \- Destroy a resolver channel
|
ares_destroy \- Destroy a resolver channel
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.nf
|
.nf
|
||||||
.B #include <ares.h>
|
.B #include <ares.h>
|
||||||
.PP
|
.PP
|
||||||
.B int ares_destroy(ares_channel \fIchannel\fP)
|
.B void ares_destroy(ares_channel \fIchannel\fP)
|
||||||
.fi
|
.fi
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
The
|
The
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
|||||||
@@ -18,64 +18,64 @@
|
|||||||
#ifndef ARES__DNS_H
|
#ifndef ARES__DNS_H
|
||||||
#define ARES__DNS_H
|
#define ARES__DNS_H
|
||||||
|
|
||||||
#define DNS__16BIT(p) (((p)[0] << 8) | (p)[1])
|
#define DNS__16BIT(p) (((p)[0] << 8) | (p)[1])
|
||||||
#define DNS__32BIT(p) (((p)[0] << 24) | ((p)[1] << 16) | \
|
#define DNS__32BIT(p) (((p)[0] << 24) | ((p)[1] << 16) | \
|
||||||
((p)[2] << 8) | (p)[3])
|
((p)[2] << 8) | (p)[3])
|
||||||
#define DNS__SET16BIT(p, v) (((p)[0] = ((v) >> 8) & 0xff), \
|
#define DNS__SET16BIT(p, v) (((p)[0] = ((v) >> 8) & 0xff), \
|
||||||
((p)[1] = (v) & 0xff))
|
((p)[1] = (v) & 0xff))
|
||||||
#define DNS__SET32BIT(p, v) (((p)[0] = ((v) >> 24) & 0xff), \
|
#define DNS__SET32BIT(p, v) (((p)[0] = ((v) >> 24) & 0xff), \
|
||||||
((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))
|
||||||
|
|
||||||
/* 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)
|
||||||
#define DNS_HEADER_QR(h) (((h)[2] >> 7) & 0x1)
|
#define DNS_HEADER_QR(h) (((h)[2] >> 7) & 0x1)
|
||||||
#define DNS_HEADER_OPCODE(h) (((h)[2] >> 3) & 0xf)
|
#define DNS_HEADER_OPCODE(h) (((h)[2] >> 3) & 0xf)
|
||||||
#define DNS_HEADER_AA(h) (((h)[2] >> 2) & 0x1)
|
#define DNS_HEADER_AA(h) (((h)[2] >> 2) & 0x1)
|
||||||
#define DNS_HEADER_TC(h) (((h)[2] >> 1) & 0x1)
|
#define DNS_HEADER_TC(h) (((h)[2] >> 1) & 0x1)
|
||||||
#define DNS_HEADER_RD(h) ((h)[2] & 0x1)
|
#define DNS_HEADER_RD(h) ((h)[2] & 0x1)
|
||||||
#define DNS_HEADER_RA(h) (((h)[3] >> 7) & 0x1)
|
#define DNS_HEADER_RA(h) (((h)[3] >> 7) & 0x1)
|
||||||
#define DNS_HEADER_Z(h) (((h)[3] >> 4) & 0x7)
|
#define DNS_HEADER_Z(h) (((h)[3] >> 4) & 0x7)
|
||||||
#define DNS_HEADER_RCODE(h) ((h)[3] & 0xf)
|
#define DNS_HEADER_RCODE(h) ((h)[3] & 0xf)
|
||||||
#define DNS_HEADER_QDCOUNT(h) DNS__16BIT((h) + 4)
|
#define DNS_HEADER_QDCOUNT(h) DNS__16BIT((h) + 4)
|
||||||
#define DNS_HEADER_ANCOUNT(h) DNS__16BIT((h) + 6)
|
#define DNS_HEADER_ANCOUNT(h) DNS__16BIT((h) + 6)
|
||||||
#define DNS_HEADER_NSCOUNT(h) DNS__16BIT((h) + 8)
|
#define DNS_HEADER_NSCOUNT(h) DNS__16BIT((h) + 8)
|
||||||
#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10)
|
#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10)
|
||||||
|
|
||||||
/* Macros for constructing a DNS header */
|
/* Macros for constructing a DNS header */
|
||||||
#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v)
|
#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v)
|
||||||
#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (((v) & 0x1) << 7))
|
#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (((v) & 0x1) << 7))
|
||||||
#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (((v) & 0xf) << 3))
|
#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (((v) & 0xf) << 3))
|
||||||
#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (((v) & 0x1) << 2))
|
#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (((v) & 0x1) << 2))
|
||||||
#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (((v) & 0x1) << 1))
|
#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (((v) & 0x1) << 1))
|
||||||
#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (((v) & 0x1)))
|
#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (((v) & 0x1)))
|
||||||
#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (((v) & 0x1) << 7))
|
#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (((v) & 0x1) << 7))
|
||||||
#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (((v) & 0x7) << 4))
|
#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (((v) & 0x7) << 4))
|
||||||
#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (((v) & 0xf)))
|
#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (((v) & 0xf)))
|
||||||
#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v)
|
#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v)
|
||||||
#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v)
|
#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v)
|
||||||
#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v)
|
#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v)
|
||||||
#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v)
|
#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v)
|
||||||
|
|
||||||
/* Macros for parsing the fixed part of a DNS question */
|
/* Macros for parsing the fixed part of a DNS question */
|
||||||
#define DNS_QUESTION_TYPE(q) DNS__16BIT(q)
|
#define DNS_QUESTION_TYPE(q) DNS__16BIT(q)
|
||||||
#define DNS_QUESTION_CLASS(q) DNS__16BIT((q) + 2)
|
#define DNS_QUESTION_CLASS(q) DNS__16BIT((q) + 2)
|
||||||
|
|
||||||
/* Macros for constructing the fixed part of a DNS question */
|
/* Macros for constructing the fixed part of a DNS question */
|
||||||
#define DNS_QUESTION_SET_TYPE(q, v) DNS__SET16BIT(q, v)
|
#define DNS_QUESTION_SET_TYPE(q, v) DNS__SET16BIT(q, v)
|
||||||
#define DNS_QUESTION_SET_CLASS(q, v) DNS__SET16BIT((q) + 2, v)
|
#define DNS_QUESTION_SET_CLASS(q, v) DNS__SET16BIT((q) + 2, v)
|
||||||
|
|
||||||
/* Macros for parsing the fixed part of a DNS resource record */
|
/* Macros for parsing the fixed part of a DNS resource record */
|
||||||
#define DNS_RR_TYPE(r) DNS__16BIT(r)
|
#define DNS_RR_TYPE(r) DNS__16BIT(r)
|
||||||
#define DNS_RR_CLASS(r) DNS__16BIT((r) + 2)
|
#define DNS_RR_CLASS(r) DNS__16BIT((r) + 2)
|
||||||
#define DNS_RR_TTL(r) DNS__32BIT((r) + 4)
|
#define DNS_RR_TTL(r) DNS__32BIT((r) + 4)
|
||||||
#define DNS_RR_LEN(r) DNS__16BIT((r) + 8)
|
#define DNS_RR_LEN(r) DNS__16BIT((r) + 8)
|
||||||
|
|
||||||
/* Macros for constructing the fixed part of a DNS resource record */
|
/* Macros for constructing the fixed part of a DNS resource record */
|
||||||
#define DNS_RR_SET_TYPE(r) DNS__SET16BIT(r, v)
|
#define DNS_RR_SET_TYPE(r) DNS__SET16BIT(r, v)
|
||||||
#define DNS_RR_SET_CLASS(r) DNS__SET16BIT((r) + 2, v)
|
#define DNS_RR_SET_CLASS(r) DNS__SET16BIT((r) + 2, v)
|
||||||
#define DNS_RR_SET_TTL(r) DNS__SET32BIT((r) + 4, v)
|
#define DNS_RR_SET_TTL(r) DNS__SET32BIT((r) + 4, v)
|
||||||
#define DNS_RR_SET_LEN(r) DNS__SET16BIT((r) + 8, v)
|
#define DNS_RR_SET_LEN(r) DNS__SET16BIT((r) + 8, v)
|
||||||
|
|
||||||
#endif /* ARES__DNS_H */
|
#endif /* ARES__DNS_H */
|
||||||
|
|||||||
@@ -13,13 +13,17 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#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>
|
||||||
@@ -27,7 +31,7 @@
|
|||||||
#include "ares_private.h" /* for the memdebug */
|
#include "ares_private.h" /* for the memdebug */
|
||||||
|
|
||||||
static int name_length(const unsigned char *encoded, const unsigned char *abuf,
|
static int name_length(const unsigned char *encoded, const unsigned char *abuf,
|
||||||
int alen);
|
int alen);
|
||||||
|
|
||||||
/* Expand an RFC1035-encoded domain name given by encoded. The
|
/* Expand an RFC1035-encoded domain name given by encoded. The
|
||||||
* containing message is given by abuf and alen. The result given by
|
* containing message is given by abuf and alen. The result given by
|
||||||
@@ -54,7 +58,7 @@ static int name_length(const unsigned char *encoded, const unsigned char *abuf,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
||||||
int alen, char **s, long *enclen)
|
int alen, char **s, long *enclen)
|
||||||
{
|
{
|
||||||
int len, indir = 0;
|
int len, indir = 0;
|
||||||
char *q;
|
char *q;
|
||||||
@@ -74,27 +78,27 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
|||||||
while (*p)
|
while (*p)
|
||||||
{
|
{
|
||||||
if ((*p & INDIR_MASK) == INDIR_MASK)
|
if ((*p & INDIR_MASK) == INDIR_MASK)
|
||||||
{
|
{
|
||||||
if (!indir)
|
if (!indir)
|
||||||
{
|
{
|
||||||
*enclen = p + 2 - encoded;
|
*enclen = p + 2 - encoded;
|
||||||
indir = 1;
|
indir = 1;
|
||||||
}
|
}
|
||||||
p = abuf + ((*p & ~INDIR_MASK) << 8 | *(p + 1));
|
p = abuf + ((*p & ~INDIR_MASK) << 8 | *(p + 1));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
len = *p;
|
len = *p;
|
||||||
p++;
|
p++;
|
||||||
while (len--)
|
while (len--)
|
||||||
{
|
{
|
||||||
if (*p == '.' || *p == '\\')
|
if (*p == '.' || *p == '\\')
|
||||||
*q++ = '\\';
|
*q++ = '\\';
|
||||||
*q++ = *p;
|
*q++ = *p;
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
*q++ = '.';
|
*q++ = '.';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!indir)
|
if (!indir)
|
||||||
*enclen = p + 1 - encoded;
|
*enclen = p + 1 - encoded;
|
||||||
@@ -102,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;
|
||||||
}
|
}
|
||||||
@@ -110,7 +116,7 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
|||||||
* -1 if the encoding is invalid.
|
* -1 if the encoding is invalid.
|
||||||
*/
|
*/
|
||||||
static int name_length(const unsigned char *encoded, const unsigned char *abuf,
|
static int name_length(const unsigned char *encoded, const unsigned char *abuf,
|
||||||
int alen)
|
int alen)
|
||||||
{
|
{
|
||||||
int n = 0, offset, indir = 0;
|
int n = 0, offset, indir = 0;
|
||||||
|
|
||||||
@@ -121,34 +127,34 @@ static int name_length(const unsigned char *encoded, const unsigned char *abuf,
|
|||||||
while (*encoded)
|
while (*encoded)
|
||||||
{
|
{
|
||||||
if ((*encoded & INDIR_MASK) == INDIR_MASK)
|
if ((*encoded & INDIR_MASK) == INDIR_MASK)
|
||||||
{
|
{
|
||||||
/* Check the offset and go there. */
|
/* Check the offset and go there. */
|
||||||
if (encoded + 1 >= abuf + alen)
|
if (encoded + 1 >= abuf + alen)
|
||||||
return -1;
|
return -1;
|
||||||
offset = (*encoded & ~INDIR_MASK) << 8 | *(encoded + 1);
|
offset = (*encoded & ~INDIR_MASK) << 8 | *(encoded + 1);
|
||||||
if (offset >= alen)
|
if (offset >= alen)
|
||||||
return -1;
|
return -1;
|
||||||
encoded = abuf + offset;
|
encoded = abuf + offset;
|
||||||
|
|
||||||
/* If we've seen more indirects than the message length,
|
/* If we've seen more indirects than the message length,
|
||||||
* then there's a loop.
|
* then there's a loop.
|
||||||
*/
|
*/
|
||||||
if (++indir > alen)
|
if (++indir > alen)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
offset = *encoded;
|
offset = *encoded;
|
||||||
if (encoded + offset + 1 >= abuf + alen)
|
if (encoded + offset + 1 >= abuf + alen)
|
||||||
return -1;
|
return -1;
|
||||||
encoded++;
|
encoded++;
|
||||||
while (offset--)
|
while (offset--)
|
||||||
{
|
{
|
||||||
n += (*encoded == '.' || *encoded == '\\') ? 2 : 1;
|
n += (*encoded == '.' || *encoded == '\\') ? 2 : 1;
|
||||||
encoded++;
|
encoded++;
|
||||||
}
|
}
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If there were any labels at all, then the number of dots is one
|
/* If there were any labels at all, then the number of dots is one
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#else
|
#else
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|||||||
@@ -13,11 +13,10 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
|
||||||
#else
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -27,7 +26,8 @@
|
|||||||
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)
|
||||||
{
|
{
|
||||||
struct server_state *server;
|
struct server_state *server;
|
||||||
int i, nfds;
|
ares_socket_t nfds;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* No queries, no file descriptors. */
|
/* No queries, no file descriptors. */
|
||||||
if (!channel->queries)
|
if (!channel->queries)
|
||||||
@@ -37,20 +37,20 @@ int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
|
|||||||
for (i = 0; i < channel->nservers; i++)
|
for (i = 0; i < channel->nservers; i++)
|
||||||
{
|
{
|
||||||
server = &channel->servers[i];
|
server = &channel->servers[i];
|
||||||
if (server->udp_socket != -1)
|
if (server->udp_socket != ARES_SOCKET_BAD)
|
||||||
{
|
{
|
||||||
FD_SET(server->udp_socket, read_fds);
|
FD_SET(server->udp_socket, read_fds);
|
||||||
if (server->udp_socket >= nfds)
|
if (server->udp_socket >= nfds)
|
||||||
nfds = server->udp_socket + 1;
|
nfds = server->udp_socket + 1;
|
||||||
}
|
}
|
||||||
if (server->tcp_socket != -1)
|
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 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
|
||||||
|
|||||||
@@ -13,11 +13,10 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if !defined(WIN32) || defined(WATT32)
|
||||||
|
|
||||||
#else
|
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
|
|
||||||
|
|||||||
@@ -12,28 +12,38 @@
|
|||||||
* 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 <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#else
|
#else
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#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>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
#include "inet_net_pton.h"
|
||||||
|
|
||||||
|
#ifdef WATT32
|
||||||
|
#undef WIN32
|
||||||
|
#endif
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
@@ -42,17 +52,24 @@ struct addr_query {
|
|||||||
|
|
||||||
static void next_lookup(struct addr_query *aquery);
|
static void next_lookup(struct addr_query *aquery);
|
||||||
static void addr_callback(void *arg, int status, unsigned char *abuf,
|
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;
|
||||||
@@ -65,7 +82,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;
|
||||||
@@ -76,7 +97,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;
|
||||||
@@ -84,27 +105,47 @@ static void next_lookup(struct addr_query *aquery)
|
|||||||
for (p = aquery->remaining_lookups; *p; p++)
|
for (p = aquery->remaining_lookups; *p; p++)
|
||||||
{
|
{
|
||||||
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;
|
||||||
return;
|
ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback,
|
||||||
case 'f':
|
aquery);
|
||||||
status = file_lookup(&aquery->addr, &host);
|
}
|
||||||
if (status != ARES_ENOTFOUND)
|
else
|
||||||
{
|
{
|
||||||
end_aquery(aquery, status, host);
|
unsigned char *bytes;
|
||||||
return;
|
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",
|
||||||
break;
|
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;
|
||||||
|
case 'f':
|
||||||
|
status = file_lookup(&aquery->addr, aquery->family, &host);
|
||||||
|
if (status != ARES_ENOTFOUND)
|
||||||
|
{
|
||||||
|
end_aquery(aquery, status, host);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
end_aquery(aquery, ARES_ENOTFOUND, NULL);
|
end_aquery(aquery, ARES_ENOTFOUND, NULL);
|
||||||
}
|
}
|
||||||
@@ -116,8 +157,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)
|
||||||
@@ -127,7 +172,7 @@ static void addr_callback(void *arg, int status, unsigned char *abuf, 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)
|
||||||
{
|
{
|
||||||
aquery->callback(aquery->arg, status, host);
|
aquery->callback(aquery->arg, status, host);
|
||||||
if (host)
|
if (host)
|
||||||
@@ -135,32 +180,60 @@ 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 (IsNT) {
|
if (IS_NT()) {
|
||||||
GetSystemDirectory(PATH_HOSTS, MAX_PATH);
|
char tmp[MAX_PATH];
|
||||||
strcat(PATH_HOSTS, PATH_HOSTS_NT);
|
HKEY hkeyHosts;
|
||||||
} else {
|
|
||||||
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
|
||||||
strcat(PATH_HOSTS, PATH_HOSTS_9X);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts)
|
||||||
|
== ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DWORD dwLength = MAX_PATH;
|
||||||
|
RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp,
|
||||||
|
&dwLength);
|
||||||
|
ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH);
|
||||||
|
RegCloseKey(hkeyHosts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
||||||
|
|
||||||
|
strcat(PATH_HOSTS, WIN_PATH_HOSTS);
|
||||||
|
|
||||||
|
#elif defined(WATT32)
|
||||||
|
extern const char *_w32_GetHostsFile (void);
|
||||||
|
const char *PATH_HOSTS = _w32_GetHostsFile();
|
||||||
|
|
||||||
|
if (!PATH_HOSTS)
|
||||||
|
return ARES_ENOTFOUND;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
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);
|
||||||
|
|||||||
@@ -13,24 +13,37 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#else
|
#else
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
#ifdef HAVE_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>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
#include "inet_net_pton.h"
|
||||||
|
#include "bitncmp.h"
|
||||||
|
|
||||||
|
#ifdef WATT32
|
||||||
|
#undef WIN32
|
||||||
|
#endif
|
||||||
|
|
||||||
struct host_query {
|
struct host_query {
|
||||||
/* Arguments passed to ares_gethostbyname() */
|
/* Arguments passed to ares_gethostbyname() */
|
||||||
@@ -38,36 +51,40 @@ 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;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void next_lookup(struct host_query *hquery);
|
static void next_lookup(struct host_query *hquery);
|
||||||
static void host_callback(void *arg, int status, unsigned char *abuf,
|
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)
|
||||||
{
|
{
|
||||||
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. */
|
||||||
@@ -79,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);
|
||||||
@@ -102,24 +120,28 @@ static void next_lookup(struct host_query *hquery)
|
|||||||
for (p = hquery->remaining_lookups; *p; p++)
|
for (p = hquery->remaining_lookups; *p; p++)
|
||||||
{
|
{
|
||||||
switch (*p)
|
switch (*p)
|
||||||
{
|
{
|
||||||
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,
|
||||||
return;
|
hquery);
|
||||||
|
else
|
||||||
|
ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
|
||||||
|
hquery);
|
||||||
|
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);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end_hquery(hquery, ARES_ENOTFOUND, NULL);
|
end_hquery(hquery, ARES_ENOTFOUND, NULL);
|
||||||
}
|
}
|
||||||
@@ -132,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
|
||||||
@@ -144,7 +182,7 @@ static void host_callback(void *arg, int status, unsigned char *abuf, 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)
|
||||||
{
|
{
|
||||||
hquery->callback(hquery->arg, status, host);
|
hquery->callback(hquery->arg, status, host);
|
||||||
if (host)
|
if (host)
|
||||||
@@ -156,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)
|
||||||
@@ -195,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);
|
||||||
|
|
||||||
@@ -207,40 +241,56 @@ 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;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
|
||||||
char PATH_HOSTS[MAX_PATH];
|
char PATH_HOSTS[MAX_PATH];
|
||||||
if (IsNT) {
|
if (IS_NT()) {
|
||||||
GetSystemDirectory(PATH_HOSTS, MAX_PATH);
|
char tmp[MAX_PATH];
|
||||||
strcat(PATH_HOSTS, PATH_HOSTS_NT);
|
HKEY hkeyHosts;
|
||||||
} else {
|
|
||||||
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
|
||||||
strcat(PATH_HOSTS, PATH_HOSTS_9X);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts)
|
||||||
|
== ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DWORD dwLength = MAX_PATH;
|
||||||
|
RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp,
|
||||||
|
&dwLength);
|
||||||
|
ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH);
|
||||||
|
RegCloseKey(hkeyHosts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
||||||
|
|
||||||
|
strcat(PATH_HOSTS, WIN_PATH_HOSTS);
|
||||||
|
|
||||||
|
#elif defined(WATT32)
|
||||||
|
extern const char *_w32_GetHostsFile (void);
|
||||||
|
const char *PATH_HOSTS = _w32_GetHostsFile();
|
||||||
|
|
||||||
|
if (!PATH_HOSTS)
|
||||||
|
return ARES_ENOTFOUND;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
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, 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;
|
||||||
for (alias = (*host)->h_aliases; *alias; alias++)
|
for (alias = (*host)->h_aliases; *alias; alias++)
|
||||||
{
|
{
|
||||||
if (strcasecmp(*alias, name) == 0)
|
if (strcasecmp(*alias, name) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (*alias)
|
if (*alias)
|
||||||
break;
|
break;
|
||||||
ares_free_hostent(*host);
|
ares_free_hostent(*host);
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@@ -252,7 +302,7 @@ static int file_lookup(const char *name, 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)
|
||||||
{
|
{
|
||||||
struct in_addr a1, a2;
|
struct in_addr a1, a2;
|
||||||
int i1, i2, ind1, ind2;
|
int i1, i2, ind1, ind2;
|
||||||
@@ -267,13 +317,13 @@ static void sort_addresses(struct hostent *host, struct apattern *sortlist,
|
|||||||
memcpy(&a1, host->h_addr_list[i1], sizeof(struct in_addr));
|
memcpy(&a1, host->h_addr_list[i1], sizeof(struct in_addr));
|
||||||
ind1 = get_address_index(&a1, sortlist, nsort);
|
ind1 = get_address_index(&a1, sortlist, nsort);
|
||||||
for (i2 = i1 - 1; i2 >= 0; i2--)
|
for (i2 = i1 - 1; i2 >= 0; i2--)
|
||||||
{
|
{
|
||||||
memcpy(&a2, host->h_addr_list[i2], sizeof(struct in_addr));
|
memcpy(&a2, host->h_addr_list[i2], sizeof(struct in_addr));
|
||||||
ind2 = get_address_index(&a2, sortlist, nsort);
|
ind2 = get_address_index(&a2, sortlist, nsort);
|
||||||
if (ind2 <= ind1)
|
if (ind2 <= ind1)
|
||||||
break;
|
break;
|
||||||
memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in_addr));
|
memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in_addr));
|
||||||
}
|
}
|
||||||
memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in_addr));
|
memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in_addr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -282,14 +332,72 @@ static void sort_addresses(struct hostent *host, struct apattern *sortlist,
|
|||||||
* if none of them match.
|
* if none of them match.
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
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.
|
||||||
373
ares/ares_getnameinfo.c
Normal file
373
ares/ares_getnameinfo.c
Normal file
@@ -0,0 +1,373 @@
|
|||||||
|
/* 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);
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid, char *buf);
|
||||||
|
#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;
|
||||||
|
struct sockaddr_in6 *addr6;
|
||||||
|
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);
|
||||||
|
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[32];
|
||||||
|
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);
|
||||||
|
#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);
|
||||||
|
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);
|
||||||
|
else
|
||||||
|
service = lookup_service(niquery->addr.addr6.sin6_port,
|
||||||
|
niquery->flags, 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);
|
||||||
|
#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);
|
||||||
|
else
|
||||||
|
service = lookup_service(niquery->addr.addr6.sin6_port,
|
||||||
|
niquery->flags, 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) /* 33 bytes buffer */
|
||||||
|
{
|
||||||
|
if (port)
|
||||||
|
{
|
||||||
|
/* Just return the port as a string */
|
||||||
|
if (flags & ARES_NI_NUMERICSERV)
|
||||||
|
sprintf(buf, "%u", ntohs(port));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct servent *se;
|
||||||
|
const char *proto;
|
||||||
|
#if GETSERVBYPORT_R_ARGS == 6
|
||||||
|
struct servent ret;
|
||||||
|
char buf[4096];
|
||||||
|
int len = 4096;
|
||||||
|
#elif GETSERVBYPORT_R_ARGS == 5
|
||||||
|
char buf[4096];
|
||||||
|
int len = 4096;
|
||||||
|
#elif GETSERVBYPORT_R_ARGS == 4
|
||||||
|
struct servent ret;
|
||||||
|
struct servent_data sed;
|
||||||
|
#endif
|
||||||
|
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
|
||||||
|
#if GETSERVBYPORT_R_ARGS == 6
|
||||||
|
se = &ret;
|
||||||
|
if (getservbyport_r(port, proto, se, buf, len, &ret))
|
||||||
|
se = NULL;
|
||||||
|
#elif GETSERVBYPORT_R_ARGS == 5
|
||||||
|
se = getservbyport_r(port, proto, se, buf, len);
|
||||||
|
#elif GETSERVBYPORT_R_ARGS == 4
|
||||||
|
se = &ret;
|
||||||
|
if (getservbyport_r(port, proto, se, &sed) == -1)
|
||||||
|
se = NULL;
|
||||||
|
#else
|
||||||
|
/* Lets just hope the OS uses TLS! */
|
||||||
|
se = getservbyport(port, proto);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
/* Lets just hope the OS uses TLS! */
|
||||||
|
se = getservbyport(port, proto);
|
||||||
|
#endif
|
||||||
|
if (se && se->s_name) {
|
||||||
|
size_t len = strlen(se->s_name);
|
||||||
|
if(len < 33) {
|
||||||
|
strcpy(buf, se->s_name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* too big name to fit the buffer */
|
||||||
|
buf[0]=0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sprintf(buf, "%u", ntohs(port));
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
|
||||||
|
char *buf)
|
||||||
|
{
|
||||||
|
char tmpbuf[IF_NAMESIZE + 1];
|
||||||
|
|
||||||
|
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], "%u", addr6->sin6_scope_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL)
|
||||||
|
sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id);
|
||||||
|
#endif
|
||||||
|
strcat(buf, tmpbuf);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
#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;
|
||||||
|
}
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
.\" 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.
|
||||||
.\"
|
.\"
|
||||||
.TH ARES_INIT 3 "21 July 1998"
|
.TH ARES_INIT 3 "7 December 2004"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
ares_init, ares_init_options \- Initialize a resolver channel
|
ares_init, ares_init_options \- Initialize a resolver channel
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -25,31 +25,20 @@ ares_init, ares_init_options \- Initialize a resolver channel
|
|||||||
.B int ares_init_options(ares_channel *\fIchannel\fP,
|
.B int ares_init_options(ares_channel *\fIchannel\fP,
|
||||||
.B struct ares_options *\fIoptions\fP, int \fIoptmask\fP)
|
.B struct ares_options *\fIoptions\fP, int \fIoptmask\fP)
|
||||||
.PP
|
.PP
|
||||||
.B cc file.c -lares
|
.B cc file.c -lcares
|
||||||
.fi
|
.fi
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
The
|
The \fBares_init\fP function initializes a communications channel for name
|
||||||
.B ares_init
|
service lookups. If it returns successfully, \fBares_init\fP will set the
|
||||||
function initializes a communications channel for name service
|
variable pointed to by \fIchannel\fP to a handle used to identify the name
|
||||||
lookups. If it returns successfully,
|
service channel. The caller should invoke
|
||||||
.B ares_init
|
|
||||||
will set the variable pointed to by
|
|
||||||
.I channel
|
|
||||||
to a handle used to identify the name service channel. The caller
|
|
||||||
should invoke
|
|
||||||
.BR ares_destroy (3)
|
.BR ares_destroy (3)
|
||||||
on the handle when the channel is no longer needed.
|
on the handle when the channel is no longer needed.
|
||||||
.PP
|
.PP
|
||||||
The
|
The \fBares_init_options\fP function also initializes a name service channel,
|
||||||
.B ares_init_options
|
with additional options useful for applications requiring more control over
|
||||||
function also initializes a name service channel, with additional
|
name service configuration. The \fIoptmask\fP parameter specifies which fields
|
||||||
options useful for applications requiring more control over name
|
in the structure pointed to by \fIoptions\fP are set, as follows:
|
||||||
service configuration. The
|
|
||||||
.I optmask
|
|
||||||
parameter specifies which fields in the structure pointed to by
|
|
||||||
.I options
|
|
||||||
are set, as follows:
|
|
||||||
.PP
|
|
||||||
.TP 18
|
.TP 18
|
||||||
.B ARES_OPT_FLAGS
|
.B ARES_OPT_FLAGS
|
||||||
.B int \fIflags\fP;
|
.B int \fIflags\fP;
|
||||||
@@ -127,9 +116,11 @@ If a truncated response to a UDP query is received, do not fall back
|
|||||||
to TCP; simply continue on with the truncated response.
|
to TCP; simply continue on with the truncated response.
|
||||||
.TP 23
|
.TP 23
|
||||||
.B ARES_FLAG_NORECURSE
|
.B ARES_FLAG_NORECURSE
|
||||||
Do not set the "recursion desired" bit on outgoing queries, so that
|
Do not set the "recursion desired" bit on outgoing queries, so that the name
|
||||||
the name server being contacted will not try to fetch the answer from
|
server being contacted will not try to fetch the answer from other servers if
|
||||||
other servers if it doesn't know the answer locally.
|
it doesn't know the answer locally. Be aware that ares will not do the
|
||||||
|
recursion for you. Recursion must be handled by the application calling ares
|
||||||
|
if \fIARES_FLAG_NORECURSE\fP is set.
|
||||||
.TP 23
|
.TP 23
|
||||||
.B ARES_FLAG_STAYOPEN
|
.B ARES_FLAG_STAYOPEN
|
||||||
Do not close communciations sockets when the number of active queries
|
Do not close communciations sockets when the number of active queries
|
||||||
|
|||||||
379
ares/ares_init.c
379
ares/ares_init.c
@@ -13,21 +13,35 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#include <iphlpapi.h>
|
#include <iphlpapi.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#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
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -37,24 +51,34 @@
|
|||||||
#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
|
||||||
|
#undef WIN32 /* Redefined in MingW/MSVC headers */
|
||||||
|
#endif
|
||||||
|
|
||||||
static int init_by_options(ares_channel channel, struct ares_options *options,
|
static int init_by_options(ares_channel channel, struct ares_options *options,
|
||||||
int optmask);
|
int optmask);
|
||||||
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_domain(ares_channel channel, char *str);
|
|
||||||
static int config_lookup(ares_channel channel, const char *str);
|
|
||||||
static int config_nameserver(struct server_state **servers, int *nservers,
|
static int config_nameserver(struct server_state **servers, int *nservers,
|
||||||
char *str);
|
char *str);
|
||||||
static int config_sortlist(struct apattern **sortlist, int *nsort,
|
|
||||||
const char *str);
|
|
||||||
static int set_search(ares_channel channel, const char *str);
|
static int set_search(ares_channel channel, const char *str);
|
||||||
static int set_options(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 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);
|
||||||
|
#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 int ip_addr(const char *s, int len, struct in_addr *addr);
|
||||||
static void natural_mask(struct apattern *pat);
|
static void natural_mask(struct apattern *pat);
|
||||||
|
static int config_domain(ares_channel channel, char *str);
|
||||||
|
static int config_lookup(ares_channel channel, const char *str,
|
||||||
|
const char *bindch, const char *filech);
|
||||||
|
static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||||
|
const char *str);
|
||||||
|
static char *try_config(char *s, const char *opt);
|
||||||
|
#endif
|
||||||
|
|
||||||
int ares_init(ares_channel *channelptr)
|
int ares_init(ares_channel *channelptr)
|
||||||
{
|
{
|
||||||
@@ -62,7 +86,7 @@ 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,
|
||||||
int optmask)
|
int optmask)
|
||||||
{
|
{
|
||||||
ares_channel channel;
|
ares_channel channel;
|
||||||
int i, status;
|
int i, status;
|
||||||
@@ -104,15 +128,15 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
|||||||
{
|
{
|
||||||
/* Something failed; clean up memory we may have allocated. */
|
/* Something failed; clean up memory we may have allocated. */
|
||||||
if (channel->nservers != -1)
|
if (channel->nservers != -1)
|
||||||
free(channel->servers);
|
free(channel->servers);
|
||||||
if (channel->domains)
|
if (channel->domains)
|
||||||
{
|
{
|
||||||
for (i = 0; i < channel->ndomains; i++)
|
for (i = 0; i < channel->ndomains; i++)
|
||||||
free(channel->domains[i]);
|
free(channel->domains[i]);
|
||||||
free(channel->domains);
|
free(channel->domains);
|
||||||
}
|
}
|
||||||
if (channel->sortlist)
|
if (channel->sortlist)
|
||||||
free(channel->sortlist);
|
free(channel->sortlist);
|
||||||
if(channel->lookups)
|
if(channel->lookups)
|
||||||
free(channel->lookups);
|
free(channel->lookups);
|
||||||
free(channel);
|
free(channel);
|
||||||
@@ -127,8 +151,8 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
|||||||
for (i = 0; i < channel->nservers; i++)
|
for (i = 0; i < channel->nservers; i++)
|
||||||
{
|
{
|
||||||
server = &channel->servers[i];
|
server = &channel->servers[i];
|
||||||
server->udp_socket = -1;
|
server->udp_socket = ARES_SOCKET_BAD;
|
||||||
server->tcp_socket = -1;
|
server->tcp_socket = ARES_SOCKET_BAD;
|
||||||
server->tcp_lenbuf_pos = 0;
|
server->tcp_lenbuf_pos = 0;
|
||||||
server->tcp_buffer = NULL;
|
server->tcp_buffer = NULL;
|
||||||
server->qhead = NULL;
|
server->qhead = NULL;
|
||||||
@@ -151,7 +175,7 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int init_by_options(ares_channel channel, struct ares_options *options,
|
static int init_by_options(ares_channel channel, struct ares_options *options,
|
||||||
int optmask)
|
int optmask)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -173,11 +197,11 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
|||||||
if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1)
|
if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1)
|
||||||
{
|
{
|
||||||
channel->servers =
|
channel->servers =
|
||||||
malloc(options->nservers * sizeof(struct server_state));
|
malloc(options->nservers * sizeof(struct server_state));
|
||||||
if (!channel->servers && options->nservers != 0)
|
if (!channel->servers && options->nservers != 0)
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
for (i = 0; i < options->nservers; i++)
|
for (i = 0; i < options->nservers; i++)
|
||||||
channel->servers[i].addr = options->servers[i];
|
channel->servers[i].addr = options->servers[i];
|
||||||
channel->nservers = options->nservers;
|
channel->nservers = options->nservers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,14 +212,14 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
|||||||
{
|
{
|
||||||
channel->domains = malloc(options->ndomains * sizeof(char *));
|
channel->domains = malloc(options->ndomains * sizeof(char *));
|
||||||
if (!channel->domains && options->ndomains != 0)
|
if (!channel->domains && options->ndomains != 0)
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
for (i = 0; i < options->ndomains; i++)
|
for (i = 0; i < options->ndomains; i++)
|
||||||
{
|
{
|
||||||
channel->ndomains = i;
|
channel->ndomains = i;
|
||||||
channel->domains[i] = strdup(options->domains[i]);
|
channel->domains[i] = strdup(options->domains[i]);
|
||||||
if (!channel->domains[i])
|
if (!channel->domains[i])
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
}
|
}
|
||||||
channel->ndomains = options->ndomains;
|
channel->ndomains = options->ndomains;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,7 +228,7 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
|||||||
{
|
{
|
||||||
channel->lookups = strdup(options->lookups);
|
channel->lookups = strdup(options->lookups);
|
||||||
if (!channel->lookups)
|
if (!channel->lookups)
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
@@ -220,7 +244,7 @@ static int init_by_environment(ares_channel channel)
|
|||||||
{
|
{
|
||||||
status = set_search(channel, localdomain);
|
status = set_search(channel, localdomain);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
res_options = getenv("RES_OPTIONS");
|
res_options = getenv("RES_OPTIONS");
|
||||||
@@ -228,7 +252,7 @@ static int init_by_environment(ares_channel channel)
|
|||||||
{
|
{
|
||||||
status = set_options(channel, res_options);
|
status = set_options(channel, res_options);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
@@ -252,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;
|
||||||
@@ -293,7 +318,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
|||||||
{
|
{
|
||||||
FIXED_INFO *fi = alloca (sizeof(*fi));
|
FIXED_INFO *fi = alloca (sizeof(*fi));
|
||||||
DWORD size = sizeof (*fi);
|
DWORD size = sizeof (*fi);
|
||||||
DWORD WINAPI (*GetNetworkParams) (FIXED_INFO*, DWORD*); /* available only on Win-98/2000+ */
|
typedef DWORD (WINAPI* get_net_param_func) (FIXED_INFO*, DWORD*);
|
||||||
|
get_net_param_func GetNetworkParams; /* available only on Win-98/2000+ */
|
||||||
HMODULE handle;
|
HMODULE handle;
|
||||||
IP_ADDR_STRING *ipAddr;
|
IP_ADDR_STRING *ipAddr;
|
||||||
int i, count = 0;
|
int i, count = 0;
|
||||||
@@ -301,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);
|
||||||
@@ -309,11 +336,12 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
|||||||
if (!handle)
|
if (!handle)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
(void*)GetNetworkParams = GetProcAddress (handle, "GetNetworkParams");
|
GetNetworkParams = (get_net_param_func) GetProcAddress (handle, "GetNetworkParams");
|
||||||
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);
|
||||||
@@ -363,7 +391,7 @@ quit:
|
|||||||
static int init_by_resolv_conf(ares_channel channel)
|
static int init_by_resolv_conf(ares_channel channel)
|
||||||
{
|
{
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
int status, nservers = 0, nsort = 0;
|
int status = -1, nservers = 0, nsort = 0;
|
||||||
struct server_state *servers = NULL;
|
struct server_state *servers = NULL;
|
||||||
struct apattern *sortlist = NULL;
|
struct apattern *sortlist = NULL;
|
||||||
|
|
||||||
@@ -380,14 +408,14 @@ static int init_by_resolv_conf(ares_channel channel)
|
|||||||
On Windows 9X, the DNS server can be found in:
|
On Windows 9X, the DNS server can be found in:
|
||||||
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCP\NameServer
|
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCP\NameServer
|
||||||
|
|
||||||
On Windows NT/2000/XP/2003:
|
On Windows NT/2000/XP/2003:
|
||||||
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\NameServer
|
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\NameServer
|
||||||
or
|
or
|
||||||
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DhcpNameServer
|
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DhcpNameServer
|
||||||
or
|
or
|
||||||
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\{AdapterID}\
|
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\{AdapterID}\
|
||||||
NameServer
|
NameServer
|
||||||
or
|
or
|
||||||
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\{AdapterID}\
|
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\{AdapterID}\
|
||||||
DhcpNameServer
|
DhcpNameServer
|
||||||
*/
|
*/
|
||||||
@@ -409,7 +437,7 @@ DhcpNameServer
|
|||||||
goto okay;
|
goto okay;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsNT)
|
if (IS_NT())
|
||||||
{
|
{
|
||||||
if (RegOpenKeyEx(
|
if (RegOpenKeyEx(
|
||||||
HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,
|
HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,
|
||||||
@@ -506,6 +534,24 @@ DhcpNameServer
|
|||||||
free(resolvers);
|
free(resolvers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined(WATT32)
|
||||||
|
int i;
|
||||||
|
|
||||||
|
sock_init();
|
||||||
|
for (i = 0; def_nameservers[i]; i++)
|
||||||
|
;
|
||||||
|
if (i == 0)
|
||||||
|
return ARES_SUCCESS; /* use localhost DNS server */
|
||||||
|
|
||||||
|
nservers = i;
|
||||||
|
servers = calloc(sizeof(*servers), i);
|
||||||
|
if (!servers)
|
||||||
|
return ARES_ENOMEM;
|
||||||
|
|
||||||
|
for (i = 0; def_nameservers[i]; i++)
|
||||||
|
servers[i].addr.s_addr = htonl(def_nameservers[i]);
|
||||||
|
status = ARES_EOF;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
@@ -520,7 +566,7 @@ DhcpNameServer
|
|||||||
if ((p = try_config(line, "domain")))
|
if ((p = try_config(line, "domain")))
|
||||||
status = config_domain(channel, p);
|
status = config_domain(channel, p);
|
||||||
else if ((p = try_config(line, "lookup")) && !channel->lookups)
|
else if ((p = try_config(line, "lookup")) && !channel->lookups)
|
||||||
status = config_lookup(channel, p);
|
status = config_lookup(channel, p, "bind", "file");
|
||||||
else if ((p = try_config(line, "search")))
|
else if ((p = try_config(line, "search")))
|
||||||
status = set_search(channel, p);
|
status = set_search(channel, p);
|
||||||
else if ((p = try_config(line, "nameserver")) && channel->nservers == -1)
|
else if ((p = try_config(line, "nameserver")) && channel->nservers == -1)
|
||||||
@@ -534,9 +580,49 @@ DhcpNameServer
|
|||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
if (!channel->lookups) {
|
||||||
|
/* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */
|
||||||
|
fp = fopen("/etc/nsswitch.conf", "r");
|
||||||
|
if (fp) {
|
||||||
|
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||||
|
{
|
||||||
|
if ((p = try_config(line, "hosts:")) && !channel->lookups)
|
||||||
|
status = config_lookup(channel, p, "dns", "files");
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!channel->lookups) {
|
||||||
|
/* Linux / GNU libc 2.x and possibly others have host.conf */
|
||||||
|
fp = fopen("/etc/host.conf", "r");
|
||||||
|
if (fp) {
|
||||||
|
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||||
|
{
|
||||||
|
if ((p = try_config(line, "order")) && !channel->lookups)
|
||||||
|
status = config_lookup(channel, p, "bind", "hosts");
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!channel->lookups) {
|
||||||
|
/* Tru64 uses /etc/svc.conf */
|
||||||
|
fp = fopen("/etc/svc.conf", "r");
|
||||||
|
if (fp) {
|
||||||
|
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||||
|
{
|
||||||
|
if ((p = try_config(line, "hosts=")) && !channel->lookups)
|
||||||
|
status = config_lookup(channel, p, "bind", "local");
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(line)
|
if(line)
|
||||||
free(line);
|
free(line);
|
||||||
fclose(fp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -593,7 +679,7 @@ static int init_by_defaults(ares_channel channel)
|
|||||||
/* If nobody specified servers, try a local named. */
|
/* If nobody specified servers, try a local named. */
|
||||||
channel->servers = malloc(sizeof(struct server_state));
|
channel->servers = malloc(sizeof(struct server_state));
|
||||||
if (!channel->servers)
|
if (!channel->servers)
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
channel->servers[0].addr.s_addr = htonl(INADDR_LOOPBACK);
|
channel->servers[0].addr.s_addr = htonl(INADDR_LOOPBACK);
|
||||||
channel->nservers = 1;
|
channel->nservers = 1;
|
||||||
}
|
}
|
||||||
@@ -604,22 +690,22 @@ static int init_by_defaults(ares_channel channel)
|
|||||||
* or set it to empty if the hostname isn't helpful.
|
* or set it to empty if the hostname isn't helpful.
|
||||||
*/
|
*/
|
||||||
if (gethostname(hostname, sizeof(hostname)) == -1
|
if (gethostname(hostname, sizeof(hostname)) == -1
|
||||||
|| !strchr(hostname, '.'))
|
|| !strchr(hostname, '.'))
|
||||||
{
|
{
|
||||||
channel->domains = malloc(0);
|
channel->domains = malloc(0);
|
||||||
channel->ndomains = 0;
|
channel->ndomains = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
channel->domains = malloc(sizeof(char *));
|
channel->domains = malloc(sizeof(char *));
|
||||||
if (!channel->domains)
|
if (!channel->domains)
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
channel->ndomains = 0;
|
channel->ndomains = 0;
|
||||||
channel->domains[0] = strdup(strchr(hostname, '.') + 1);
|
channel->domains[0] = strdup(strchr(hostname, '.') + 1);
|
||||||
if (!channel->domains[0])
|
if (!channel->domains[0])
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
channel->ndomains = 1;
|
channel->ndomains = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (channel->nsort == -1)
|
if (channel->nsort == -1)
|
||||||
@@ -630,14 +716,15 @@ static int init_by_defaults(ares_channel channel)
|
|||||||
|
|
||||||
if (!channel->lookups)
|
if (!channel->lookups)
|
||||||
{
|
{
|
||||||
channel->lookups = strdup("bf");
|
channel->lookups = strdup("fb");
|
||||||
if (!channel->lookups)
|
if (!channel->lookups)
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
@@ -650,7 +737,8 @@ static int config_domain(ares_channel channel, char *str)
|
|||||||
return set_search(channel, str);
|
return set_search(channel, 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)
|
||||||
{
|
{
|
||||||
char lookups[3], *l;
|
char lookups[3], *l;
|
||||||
const char *p;
|
const char *p;
|
||||||
@@ -663,20 +751,24 @@ static int config_lookup(ares_channel channel, const char *str)
|
|||||||
p = str;
|
p = str;
|
||||||
while (*p)
|
while (*p)
|
||||||
{
|
{
|
||||||
if ((*p == 'b' || *p == 'f') && l < lookups + 2)
|
if ((*p == *bindch || *p == *filech) && l < lookups + 2) {
|
||||||
*l++ = *p;
|
if (*p == *bindch) *l++ = 'b';
|
||||||
while (*p && !isspace((unsigned char)*p))
|
else *l++ = 'f';
|
||||||
p++;
|
}
|
||||||
while (isspace((unsigned char)*p))
|
while (*p && !isspace((unsigned char)*p) && (*p != ','))
|
||||||
p++;
|
p++;
|
||||||
|
while (*p && (isspace((unsigned char)*p) || (*p == ',')))
|
||||||
|
p++;
|
||||||
}
|
}
|
||||||
*l = 0;
|
*l = 0;
|
||||||
channel->lookups = strdup(lookups);
|
channel->lookups = strdup(lookups);
|
||||||
return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM;
|
return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#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)
|
||||||
{
|
{
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
struct server_state *newserv;
|
struct server_state *newserv;
|
||||||
@@ -736,52 +828,88 @@ 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;
|
||||||
/* We have a pattern address; now determine the mask. */
|
/* Find the prefix */
|
||||||
if (*q == '/')
|
if (*q == '/')
|
||||||
{
|
{
|
||||||
str = q + 1;
|
const char *str2 = q+1;
|
||||||
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
||||||
q++;
|
q++;
|
||||||
if (ip_addr(str, (int)(q - str), &pat.mask) != 0)
|
memcpy(ipbufpfx, str, (int)(q-str));
|
||||||
natural_mask(&pat);
|
ipbufpfx[(int)(q-str)] = 0;
|
||||||
}
|
str = str2;
|
||||||
else
|
}
|
||||||
natural_mask(&pat);
|
|
||||||
|
|
||||||
/* Add this pattern to our list. */
|
|
||||||
newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern));
|
|
||||||
if (!newsort)
|
|
||||||
return ARES_ENOMEM;
|
|
||||||
newsort[*nsort] = pat;
|
|
||||||
*sortlist = newsort;
|
|
||||||
(*nsort)++;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
ipbufpfx[0] = 0;
|
||||||
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
/* Lets see if it is CIDR */
|
||||||
q++;
|
/* 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)
|
||||||
|
{
|
||||||
|
memcpy(ipbuf, str, (int)(q-str));
|
||||||
|
ipbuf[(int)(q-str)] = 0;
|
||||||
|
if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr.addr4) != 0)
|
||||||
|
natural_mask(&pat);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
natural_mask(&pat);
|
||||||
|
pat.family = AF_INET;
|
||||||
|
pat.type = PATTERN_MASK;
|
||||||
|
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||||
|
return ARES_ENOMEM;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
||||||
|
q++;
|
||||||
|
}
|
||||||
str = q;
|
str = q;
|
||||||
while (isspace((unsigned char)*str))
|
while (isspace((unsigned char)*str))
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
@@ -802,9 +930,9 @@ static int set_search(ares_channel channel, const char *str)
|
|||||||
while (*p)
|
while (*p)
|
||||||
{
|
{
|
||||||
while (*p && !isspace((unsigned char)*p))
|
while (*p && !isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
while (isspace((unsigned char)*p))
|
while (isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -820,15 +948,15 @@ static int set_search(ares_channel channel, const char *str)
|
|||||||
channel->ndomains = n;
|
channel->ndomains = n;
|
||||||
q = p;
|
q = p;
|
||||||
while (*q && !isspace((unsigned char)*q))
|
while (*q && !isspace((unsigned char)*q))
|
||||||
q++;
|
q++;
|
||||||
channel->domains[n] = malloc(q - p + 1);
|
channel->domains[n] = malloc(q - p + 1);
|
||||||
if (!channel->domains[n])
|
if (!channel->domains[n])
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
memcpy(channel->domains[n], p, q - p);
|
memcpy(channel->domains[n], p, q - p);
|
||||||
channel->domains[n][q - p] = 0;
|
channel->domains[n][q - p] = 0;
|
||||||
p = q;
|
p = q;
|
||||||
while (isspace((unsigned char)*p))
|
while (isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
channel->ndomains = n;
|
channel->ndomains = n;
|
||||||
@@ -845,24 +973,25 @@ static int set_options(ares_channel channel, const char *str)
|
|||||||
{
|
{
|
||||||
q = p;
|
q = p;
|
||||||
while (*q && !isspace((unsigned char)*q))
|
while (*q && !isspace((unsigned char)*q))
|
||||||
q++;
|
q++;
|
||||||
val = try_option(p, q, "ndots:");
|
val = try_option(p, q, "ndots:");
|
||||||
if (val && channel->ndots == -1)
|
if (val && channel->ndots == -1)
|
||||||
channel->ndots = atoi(val);
|
channel->ndots = atoi(val);
|
||||||
val = try_option(p, q, "retrans:");
|
val = try_option(p, q, "retrans:");
|
||||||
if (val && channel->timeout == -1)
|
if (val && channel->timeout == -1)
|
||||||
channel->timeout = atoi(val);
|
channel->timeout = atoi(val);
|
||||||
val = try_option(p, q, "retry:");
|
val = try_option(p, q, "retry:");
|
||||||
if (val && channel->tries == -1)
|
if (val && channel->tries == -1)
|
||||||
channel->tries = atoi(val);
|
channel->tries = atoi(val);
|
||||||
p = q;
|
p = q;
|
||||||
while (isspace((unsigned char)*p))
|
while (isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
@@ -876,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)
|
||||||
@@ -905,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 */
|
||||||
@@ -13,13 +13,17 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#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>
|
||||||
@@ -46,15 +50,15 @@
|
|||||||
*
|
*
|
||||||
* AA, TC, RA, and RCODE are only set in responses. Brief description
|
* AA, TC, RA, and RCODE are only set in responses. Brief description
|
||||||
* of the remaining fields:
|
* of the remaining fields:
|
||||||
* ID Identifier to match responses with queries
|
* ID Identifier to match responses with queries
|
||||||
* QR Query (0) or response (1)
|
* QR Query (0) or response (1)
|
||||||
* Opcode For our purposes, always QUERY
|
* Opcode For our purposes, always QUERY
|
||||||
* RD Recursion desired
|
* RD Recursion desired
|
||||||
* Z Reserved (zero)
|
* Z Reserved (zero)
|
||||||
* QDCOUNT Number of queries
|
* QDCOUNT Number of queries
|
||||||
* ANCOUNT Number of answers
|
* ANCOUNT Number of answers
|
||||||
* NSCOUNT Number of name server records
|
* NSCOUNT Number of name server records
|
||||||
* ARCOUNT Number of additional records
|
* ARCOUNT Number of additional records
|
||||||
*
|
*
|
||||||
* Question format, from RFC 1035:
|
* Question format, from RFC 1035:
|
||||||
* 1 1 1 1 1 1
|
* 1 1 1 1 1 1
|
||||||
@@ -76,7 +80,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
||||||
int rd, unsigned char **buf, int *buflen)
|
int rd, unsigned char **buf, int *buflen)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
unsigned char *q;
|
unsigned char *q;
|
||||||
@@ -88,7 +92,7 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
|||||||
for (p = name; *p; p++)
|
for (p = name; *p; p++)
|
||||||
{
|
{
|
||||||
if (*p == '\\' && *(p + 1) != 0)
|
if (*p == '\\' && *(p + 1) != 0)
|
||||||
p++;
|
p++;
|
||||||
len++;
|
len++;
|
||||||
}
|
}
|
||||||
/* If there are n periods in the name, there are n + 1 labels, and
|
/* If there are n periods in the name, there are n + 1 labels, and
|
||||||
@@ -120,31 +124,31 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
|||||||
while (*name)
|
while (*name)
|
||||||
{
|
{
|
||||||
if (*name == '.')
|
if (*name == '.')
|
||||||
return ARES_EBADNAME;
|
return ARES_EBADNAME;
|
||||||
|
|
||||||
/* Count the number of bytes in this label. */
|
/* Count the number of bytes in this label. */
|
||||||
len = 0;
|
len = 0;
|
||||||
for (p = name; *p && *p != '.'; p++)
|
for (p = name; *p && *p != '.'; p++)
|
||||||
{
|
{
|
||||||
if (*p == '\\' && *(p + 1) != 0)
|
if (*p == '\\' && *(p + 1) != 0)
|
||||||
p++;
|
p++;
|
||||||
len++;
|
len++;
|
||||||
}
|
}
|
||||||
if (len > MAXLABEL)
|
if (len > MAXLABEL)
|
||||||
return ARES_EBADNAME;
|
return ARES_EBADNAME;
|
||||||
|
|
||||||
/* Encode the length and copy the data. */
|
/* Encode the length and copy the data. */
|
||||||
*q++ = len;
|
*q++ = len;
|
||||||
for (p = name; *p && *p != '.'; p++)
|
for (p = name; *p && *p != '.'; p++)
|
||||||
{
|
{
|
||||||
if (*p == '\\' && *(p + 1) != 0)
|
if (*p == '\\' && *(p + 1) != 0)
|
||||||
p++;
|
p++;
|
||||||
*q++ = *p;
|
*q++ = *p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Go to the next label and repeat, unless we hit the end. */
|
/* Go to the next label and repeat, unless we hit the end. */
|
||||||
if (!*p)
|
if (!*p)
|
||||||
break;
|
break;
|
||||||
name = p + 1;
|
name = p + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,9 +13,10 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#else
|
#else
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
@@ -23,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>
|
||||||
@@ -32,7 +36,7 @@
|
|||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
unsigned int qdcount, ancount;
|
unsigned int qdcount, ancount;
|
||||||
int status, i, rr_type, rr_class, rr_len, naddrs;
|
int status, i, rr_type, rr_class, rr_len, naddrs;
|
||||||
@@ -91,49 +95,49 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
|||||||
/* Decode the RR up to the data field. */
|
/* Decode the RR up to the data field. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_name, &len);
|
status = ares_expand_name(aptr, abuf, alen, &rr_name, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
aptr += len;
|
aptr += len;
|
||||||
if (aptr + RRFIXEDSZ > abuf + alen)
|
if (aptr + RRFIXEDSZ > abuf + alen)
|
||||||
{
|
{
|
||||||
status = ARES_EBADRESP;
|
status = ARES_EBADRESP;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
rr_type = DNS_RR_TYPE(aptr);
|
rr_type = DNS_RR_TYPE(aptr);
|
||||||
rr_class = DNS_RR_CLASS(aptr);
|
rr_class = DNS_RR_CLASS(aptr);
|
||||||
rr_len = DNS_RR_LEN(aptr);
|
rr_len = DNS_RR_LEN(aptr);
|
||||||
aptr += RRFIXEDSZ;
|
aptr += RRFIXEDSZ;
|
||||||
|
|
||||||
if (rr_class == C_IN && rr_type == T_A
|
if (rr_class == C_IN && rr_type == T_A
|
||||||
&& rr_len == sizeof(struct in_addr)
|
&& rr_len == sizeof(struct in_addr)
|
||||||
&& strcasecmp(rr_name, hostname) == 0)
|
&& strcasecmp(rr_name, hostname) == 0)
|
||||||
{
|
{
|
||||||
memcpy(&addrs[naddrs], aptr, sizeof(struct in_addr));
|
memcpy(&addrs[naddrs], aptr, sizeof(struct in_addr));
|
||||||
naddrs++;
|
naddrs++;
|
||||||
status = ARES_SUCCESS;
|
status = ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rr_class == C_IN && rr_type == T_CNAME)
|
if (rr_class == C_IN && rr_type == T_CNAME)
|
||||||
{
|
{
|
||||||
/* Record the RR name as an alias. */
|
/* Record the RR name as an alias. */
|
||||||
aliases[naliases] = rr_name;
|
aliases[naliases] = rr_name;
|
||||||
naliases++;
|
naliases++;
|
||||||
|
|
||||||
/* Decode the RR data and replace the hostname with it. */
|
/* Decode the RR data and replace the hostname with it. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
free(hostname);
|
free(hostname);
|
||||||
hostname = rr_data;
|
hostname = rr_data;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
free(rr_name);
|
free(rr_name);
|
||||||
|
|
||||||
aptr += rr_len;
|
aptr += rr_len;
|
||||||
if (aptr > abuf + alen)
|
if (aptr > abuf + alen)
|
||||||
{
|
{
|
||||||
status = ARES_EBADRESP;
|
status = ARES_EBADRESP;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status == ARES_SUCCESS && naddrs == 0)
|
if (status == ARES_SUCCESS && naddrs == 0)
|
||||||
@@ -144,23 +148,23 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
|||||||
aliases[naliases] = NULL;
|
aliases[naliases] = NULL;
|
||||||
hostent = malloc(sizeof(struct hostent));
|
hostent = malloc(sizeof(struct hostent));
|
||||||
if (hostent)
|
if (hostent)
|
||||||
{
|
{
|
||||||
hostent->h_addr_list = malloc((naddrs + 1) * sizeof(char *));
|
hostent->h_addr_list = malloc((naddrs + 1) * sizeof(char *));
|
||||||
if (hostent->h_addr_list)
|
if (hostent->h_addr_list)
|
||||||
{
|
{
|
||||||
/* Fill in the hostent and return successfully. */
|
/* Fill in the hostent and return successfully. */
|
||||||
hostent->h_name = hostname;
|
hostent->h_name = hostname;
|
||||||
hostent->h_aliases = aliases;
|
hostent->h_aliases = aliases;
|
||||||
hostent->h_addrtype = AF_INET;
|
hostent->h_addrtype = AF_INET;
|
||||||
hostent->h_length = sizeof(struct in_addr);
|
hostent->h_length = sizeof(struct in_addr);
|
||||||
for (i = 0; i < naddrs; i++)
|
for (i = 0; i < naddrs; i++)
|
||||||
hostent->h_addr_list[i] = (char *) &addrs[i];
|
hostent->h_addr_list[i] = (char *) &addrs[i];
|
||||||
hostent->h_addr_list[naddrs] = NULL;
|
hostent->h_addr_list[naddrs] = NULL;
|
||||||
*host = hostent;
|
*host = hostent;
|
||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
free(hostent);
|
free(hostent);
|
||||||
}
|
}
|
||||||
status = ARES_ENOMEM;
|
status = ARES_ENOMEM;
|
||||||
}
|
}
|
||||||
for (i = 0; i < naliases; i++)
|
for (i = 0; i < naliases; i++)
|
||||||
|
|||||||
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;
|
||||||
|
}
|
||||||
@@ -13,15 +13,19 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#else
|
#else
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#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>
|
||||||
@@ -31,7 +35,7 @@
|
|||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
unsigned int qdcount, ancount;
|
unsigned int qdcount, ancount;
|
||||||
int status, i, rr_type, rr_class, rr_len;
|
int status, i, rr_type, rr_class, rr_len;
|
||||||
@@ -72,47 +76,47 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
|||||||
/* Decode the RR up to the data field. */
|
/* Decode the RR up to the data field. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_name, &len);
|
status = ares_expand_name(aptr, abuf, alen, &rr_name, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
aptr += len;
|
aptr += len;
|
||||||
if (aptr + RRFIXEDSZ > abuf + alen)
|
if (aptr + RRFIXEDSZ > abuf + alen)
|
||||||
{
|
{
|
||||||
status = ARES_EBADRESP;
|
status = ARES_EBADRESP;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
rr_type = DNS_RR_TYPE(aptr);
|
rr_type = DNS_RR_TYPE(aptr);
|
||||||
rr_class = DNS_RR_CLASS(aptr);
|
rr_class = DNS_RR_CLASS(aptr);
|
||||||
rr_len = DNS_RR_LEN(aptr);
|
rr_len = DNS_RR_LEN(aptr);
|
||||||
aptr += RRFIXEDSZ;
|
aptr += RRFIXEDSZ;
|
||||||
|
|
||||||
if (rr_class == C_IN && rr_type == T_PTR
|
if (rr_class == C_IN && rr_type == T_PTR
|
||||||
&& strcasecmp(rr_name, ptrname) == 0)
|
&& strcasecmp(rr_name, ptrname) == 0)
|
||||||
{
|
{
|
||||||
/* Decode the RR data and set hostname to it. */
|
/* Decode the RR data and set hostname to it. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
if (hostname)
|
if (hostname)
|
||||||
free(hostname);
|
free(hostname);
|
||||||
hostname = rr_data;
|
hostname = rr_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rr_class == C_IN && rr_type == T_CNAME)
|
if (rr_class == C_IN && rr_type == T_CNAME)
|
||||||
{
|
{
|
||||||
/* Decode the RR data and replace ptrname with it. */
|
/* Decode the RR data and replace ptrname with it. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
free(ptrname);
|
free(ptrname);
|
||||||
ptrname = rr_data;
|
ptrname = rr_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(rr_name);
|
free(rr_name);
|
||||||
aptr += rr_len;
|
aptr += rr_len;
|
||||||
if (aptr > abuf + alen)
|
if (aptr > abuf + alen)
|
||||||
{
|
{
|
||||||
status = ARES_EBADRESP;
|
status = ARES_EBADRESP;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status == ARES_SUCCESS && !hostname)
|
if (status == ARES_SUCCESS && !hostname)
|
||||||
@@ -122,33 +126,33 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
|||||||
/* We got our answer. Allocate memory to build the host entry. */
|
/* We got our answer. Allocate memory to build the host entry. */
|
||||||
hostent = malloc(sizeof(struct hostent));
|
hostent = malloc(sizeof(struct hostent));
|
||||||
if (hostent)
|
if (hostent)
|
||||||
{
|
{
|
||||||
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)
|
||||||
{
|
{
|
||||||
hostent->h_addr_list[0] = malloc(addrlen);
|
hostent->h_addr_list[0] = malloc(addrlen);
|
||||||
if (hostent->h_addr_list[0])
|
if (hostent->h_addr_list[0])
|
||||||
{
|
{
|
||||||
hostent->h_aliases = malloc(sizeof (char *));
|
hostent->h_aliases = malloc(sizeof (char *));
|
||||||
if (hostent->h_aliases)
|
if (hostent->h_aliases)
|
||||||
{
|
{
|
||||||
/* Fill in the hostent and return successfully. */
|
/* Fill in the hostent and return successfully. */
|
||||||
hostent->h_name = hostname;
|
hostent->h_name = hostname;
|
||||||
hostent->h_aliases[0] = NULL;
|
hostent->h_aliases[0] = NULL;
|
||||||
hostent->h_addrtype = family;
|
hostent->h_addrtype = family;
|
||||||
hostent->h_length = addrlen;
|
hostent->h_length = addrlen;
|
||||||
memcpy(hostent->h_addr_list[0], addr, addrlen);
|
memcpy(hostent->h_addr_list[0], addr, addrlen);
|
||||||
hostent->h_addr_list[1] = NULL;
|
hostent->h_addr_list[1] = NULL;
|
||||||
*host = hostent;
|
*host = hostent;
|
||||||
free(ptrname);
|
free(ptrname);
|
||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
free(hostent->h_addr_list[0]);
|
free(hostent->h_addr_list[0]);
|
||||||
}
|
}
|
||||||
free(hostent->h_addr_list);
|
free(hostent->h_addr_list);
|
||||||
}
|
}
|
||||||
free(hostent);
|
free(hostent);
|
||||||
}
|
}
|
||||||
status = ARES_ENOMEM;
|
status = ARES_ENOMEM;
|
||||||
}
|
}
|
||||||
if (hostname)
|
if (hostname)
|
||||||
|
|||||||
@@ -18,42 +18,63 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if !defined(WIN32) || defined(WATT32)
|
||||||
|
|
||||||
#else
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
/* We define closesocket() here so that we can use this function all over
|
/* We define closesocket() here so that we can use this function all over
|
||||||
the source code for closing sockets. */
|
the source code for closing sockets. */
|
||||||
#define closesocket(x) close(x)
|
#define closesocket(x) close(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DEFAULT_TIMEOUT 5
|
#ifdef WATT32
|
||||||
#define DEFAULT_TRIES 4
|
#include <tcp.h>
|
||||||
#ifndef INADDR_NONE
|
#include <sys/ioctl.h>
|
||||||
#define INADDR_NONE 0xffffffff
|
#undef closesocket
|
||||||
|
#define closesocket(s) close_s(s)
|
||||||
|
#define writev(s,v,c) writev_s(s,v,c)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef NETWARE
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define IsNT ((int)GetVersion()>0)
|
#define DEFAULT_TIMEOUT 5
|
||||||
|
#define DEFAULT_TRIES 4
|
||||||
|
#ifndef INADDR_NONE
|
||||||
|
#define INADDR_NONE 0xffffffff
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
|
|
||||||
|
#define IS_NT() ((int)GetVersion() > 0)
|
||||||
#define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
|
#define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
|
||||||
#define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
|
#define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
|
||||||
#define NAMESERVER "NameServer"
|
#define NAMESERVER "NameServer"
|
||||||
#define DHCPNAMESERVER "DhcpNameServer"
|
#define DHCPNAMESERVER "DhcpNameServer"
|
||||||
#define PATH_HOSTS_NT "\\drivers\\etc\\hosts"
|
#define DATABASEPATH "DatabasePath"
|
||||||
#define PATH_HOSTS_9X "\\hosts"
|
#define WIN_PATH_HOSTS "\\hosts"
|
||||||
|
|
||||||
|
#elif defined(WATT32)
|
||||||
|
|
||||||
|
#define PATH_RESOLV_CONF "/dev/ENV/etc/resolv.conf"
|
||||||
|
|
||||||
|
#elif defined(NETWARE)
|
||||||
|
|
||||||
|
#define PATH_RESOLV_CONF "sys:/etc/resolv.cfg"
|
||||||
|
#define PATH_HOSTS "sys:/etc/hosts"
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define PATH_RESOLV_CONF "/etc/resolv.conf"
|
#define PATH_RESOLV_CONF "/etc/resolv.conf"
|
||||||
#ifdef ETC_INET
|
#ifdef ETC_INET
|
||||||
#define PATH_HOSTS "/etc/inet/hosts"
|
#define PATH_HOSTS "/etc/inet/hosts"
|
||||||
#else
|
#else
|
||||||
#define PATH_HOSTS "/etc/hosts"
|
#define PATH_HOSTS "/etc/hosts"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#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;
|
||||||
@@ -65,8 +86,8 @@ struct send_request {
|
|||||||
|
|
||||||
struct server_state {
|
struct server_state {
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
int udp_socket;
|
ares_socket_t udp_socket;
|
||||||
int tcp_socket;
|
ares_socket_t tcp_socket;
|
||||||
|
|
||||||
/* Mini-buffer for reading the length word */
|
/* Mini-buffer for reading the length word */
|
||||||
unsigned char tcp_lenbuf[2];
|
unsigned char tcp_lenbuf[2];
|
||||||
@@ -109,9 +130,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 {
|
||||||
@@ -141,7 +176,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
|
||||||
|
|||||||
@@ -13,44 +13,71 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#ifdef HAVE_SYS_UIO_H
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
|
#endif
|
||||||
#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
|
||||||
|
#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>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_dns.h"
|
#include "ares_dns.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
/* at least Solaris 7 does not have TRUE at this point */
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
|
||||||
|
#define GET_ERRNO() WSAGetLastError()
|
||||||
|
#else
|
||||||
|
#define GET_ERRNO() errno
|
||||||
|
#endif
|
||||||
|
|
||||||
static void write_tcp_data(ares_channel channel, fd_set *write_fds,
|
static void write_tcp_data(ares_channel channel, fd_set *write_fds,
|
||||||
time_t now);
|
time_t now);
|
||||||
static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now);
|
static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now);
|
||||||
static void read_udp_packets(ares_channel channel, fd_set *read_fds,
|
static void read_udp_packets(ares_channel channel, fd_set *read_fds,
|
||||||
time_t now);
|
time_t now);
|
||||||
static void process_timeouts(ares_channel channel, time_t now);
|
static void process_timeouts(ares_channel channel, time_t now);
|
||||||
static void process_answer(ares_channel channel, unsigned char *abuf,
|
static void process_answer(ares_channel channel, unsigned char *abuf,
|
||||||
int alen, int whichserver, int tcp, int now);
|
int alen, int whichserver, int tcp, int now);
|
||||||
static void handle_error(ares_channel channel, int whichserver, time_t now);
|
static void handle_error(ares_channel channel, int whichserver, time_t now);
|
||||||
static void next_server(ares_channel channel, struct query *query, time_t now);
|
static struct query *next_server(ares_channel channel, struct query *query, time_t now);
|
||||||
static int open_tcp_socket(ares_channel channel, struct server_state *server);
|
static int open_tcp_socket(ares_channel channel, struct server_state *server);
|
||||||
static int open_udp_socket(ares_channel channel, struct server_state *server);
|
static int open_udp_socket(ares_channel channel, struct server_state *server);
|
||||||
static int same_questions(const unsigned char *qbuf, int qlen,
|
static int same_questions(const unsigned char *qbuf, int qlen,
|
||||||
const unsigned char *abuf, int alen);
|
const unsigned char *abuf, int alen);
|
||||||
static void end_query(ares_channel channel, struct query *query, int status,
|
static struct query *end_query(ares_channel channel, struct query *query, int status,
|
||||||
unsigned char *abuf, int alen);
|
unsigned char *abuf, int alen);
|
||||||
|
|
||||||
/* Something interesting happened on the wire, or there was a timeout.
|
/* Something interesting happened on the wire, or there was a timeout.
|
||||||
* See what's up and respond accordingly.
|
* See what's up and respond accordingly.
|
||||||
@@ -74,95 +101,91 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
|||||||
struct server_state *server;
|
struct server_state *server;
|
||||||
struct send_request *sendreq;
|
struct send_request *sendreq;
|
||||||
struct iovec *vec;
|
struct iovec *vec;
|
||||||
int i, n, count;
|
int i;
|
||||||
|
ssize_t scount;
|
||||||
|
int wcount;
|
||||||
|
size_t n;
|
||||||
|
|
||||||
for (i = 0; i < channel->nservers; i++)
|
for (i = 0; i < channel->nservers; i++)
|
||||||
{
|
{
|
||||||
/* Make sure server has data to send and is selected in write_fds. */
|
/* Make sure server has data to send and is selected in write_fds. */
|
||||||
server = &channel->servers[i];
|
server = &channel->servers[i];
|
||||||
if (!server->qhead || server->tcp_socket == -1
|
if (!server->qhead || server->tcp_socket == ARES_SOCKET_BAD
|
||||||
|| !FD_ISSET(server->tcp_socket, write_fds))
|
|| !FD_ISSET(server->tcp_socket, write_fds))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Count the number of send queue items. */
|
/* Count the number of send queue items. */
|
||||||
n = 0;
|
n = 0;
|
||||||
for (sendreq = server->qhead; sendreq; sendreq = sendreq->next)
|
for (sendreq = server->qhead; sendreq; sendreq = sendreq->next)
|
||||||
n++;
|
n++;
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
vec = NULL;
|
|
||||||
#else
|
|
||||||
/* Allocate iovecs so we can send all our data at once. */
|
/* Allocate iovecs so we can send all our data at once. */
|
||||||
vec = malloc(n * sizeof(struct iovec));
|
vec = malloc(n * sizeof(struct iovec));
|
||||||
#endif
|
|
||||||
if (vec)
|
if (vec)
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
/* Fill in the iovecs and send. */
|
||||||
#else
|
n = 0;
|
||||||
/* Fill in the iovecs and send. */
|
for (sendreq = server->qhead; sendreq; sendreq = sendreq->next)
|
||||||
n = 0;
|
{
|
||||||
for (sendreq = server->qhead; sendreq; sendreq = sendreq->next)
|
vec[n].iov_base = (char *) sendreq->data;
|
||||||
{
|
vec[n].iov_len = sendreq->len;
|
||||||
vec[n].iov_base = (char *) sendreq->data;
|
n++;
|
||||||
vec[n].iov_len = sendreq->len;
|
}
|
||||||
n++;
|
wcount = writev(server->tcp_socket, vec, n);
|
||||||
}
|
free(vec);
|
||||||
count = writev(server->tcp_socket, vec, n);
|
if (wcount < 0)
|
||||||
free(vec);
|
{
|
||||||
if (count < 0)
|
handle_error(channel, i, now);
|
||||||
{
|
continue;
|
||||||
handle_error(channel, i, now);
|
}
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Advance the send queue by as many bytes as we sent. */
|
/* Advance the send queue by as many bytes as we sent. */
|
||||||
while (count)
|
while (wcount)
|
||||||
{
|
{
|
||||||
sendreq = server->qhead;
|
sendreq = server->qhead;
|
||||||
if ((size_t)count >= sendreq->len)
|
if ((size_t)wcount >= sendreq->len)
|
||||||
{
|
{
|
||||||
count -= sendreq->len;
|
wcount -= sendreq->len;
|
||||||
server->qhead = sendreq->next;
|
server->qhead = sendreq->next;
|
||||||
if (server->qhead == NULL)
|
if (server->qhead == NULL)
|
||||||
server->qtail = NULL;
|
server->qtail = NULL;
|
||||||
free(sendreq);
|
free(sendreq);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sendreq->data += count;
|
sendreq->data += wcount;
|
||||||
sendreq->len -= count;
|
sendreq->len -= wcount;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Can't allocate iovecs; just send the first request. */
|
/* Can't allocate iovecs; just send the first request. */
|
||||||
sendreq = server->qhead;
|
sendreq = server->qhead;
|
||||||
|
|
||||||
count = send(server->tcp_socket, sendreq->data, sendreq->len, 0);
|
scount = send(server->tcp_socket, sendreq->data, sendreq->len, 0);
|
||||||
|
|
||||||
if (count < 0)
|
if (scount < 0)
|
||||||
{
|
{
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Advance the send queue by as many bytes as we sent. */
|
/* Advance the send queue by as many bytes as we sent. */
|
||||||
if ((size_t)count == sendreq->len)
|
if ((size_t)scount == sendreq->len)
|
||||||
{
|
{
|
||||||
server->qhead = sendreq->next;
|
server->qhead = sendreq->next;
|
||||||
if (server->qhead == NULL)
|
if (server->qhead == NULL)
|
||||||
server->qtail = NULL;
|
server->qtail = NULL;
|
||||||
free(sendreq);
|
free(sendreq);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sendreq->data += count;
|
sendreq->data += scount;
|
||||||
sendreq->len -= count;
|
sendreq->len -= scount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,68 +202,70 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now)
|
|||||||
{
|
{
|
||||||
/* Make sure the server has a socket and is selected in read_fds. */
|
/* Make sure the server has a socket and is selected in read_fds. */
|
||||||
server = &channel->servers[i];
|
server = &channel->servers[i];
|
||||||
if (server->tcp_socket == -1 || !FD_ISSET(server->tcp_socket, read_fds))
|
if (server->tcp_socket == ARES_SOCKET_BAD ||
|
||||||
continue;
|
!FD_ISSET(server->tcp_socket, read_fds))
|
||||||
|
continue;
|
||||||
|
|
||||||
if (server->tcp_lenbuf_pos != 2)
|
if (server->tcp_lenbuf_pos != 2)
|
||||||
{
|
{
|
||||||
/* We haven't yet read a length word, so read that (or
|
/* We haven't yet read a length word, so read that (or
|
||||||
* 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,
|
server->tcp_lenbuf + server->tcp_buffer_pos,
|
||||||
2 - server->tcp_buffer_pos, 0);
|
2 - server->tcp_buffer_pos, 0);
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
{
|
{
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
server->tcp_lenbuf_pos += count;
|
server->tcp_lenbuf_pos += count;
|
||||||
if (server->tcp_lenbuf_pos == 2)
|
if (server->tcp_lenbuf_pos == 2)
|
||||||
{
|
{
|
||||||
/* We finished reading the length word. Decode the
|
/* We finished reading the length word. Decode the
|
||||||
* length and allocate a buffer for the data.
|
* length and allocate a buffer for the data.
|
||||||
*/
|
*/
|
||||||
server->tcp_length = server->tcp_lenbuf[0] << 8
|
server->tcp_length = server->tcp_lenbuf[0] << 8
|
||||||
| server->tcp_lenbuf[1];
|
| server->tcp_lenbuf[1];
|
||||||
server->tcp_buffer = malloc(server->tcp_length);
|
server->tcp_buffer = malloc(server->tcp_length);
|
||||||
if (!server->tcp_buffer)
|
if (!server->tcp_buffer)
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
server->tcp_buffer_pos = 0;
|
server->tcp_buffer_pos = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* 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,
|
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)
|
||||||
{
|
{
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
server->tcp_buffer_pos += count;
|
server->tcp_buffer_pos += count;
|
||||||
if (server->tcp_buffer_pos == server->tcp_length)
|
if (server->tcp_buffer_pos == server->tcp_length)
|
||||||
{
|
{
|
||||||
/* We finished reading this answer; process it and
|
/* We finished reading this answer; process it and
|
||||||
* prepare to read another length word.
|
* prepare to read another length word.
|
||||||
*/
|
*/
|
||||||
process_answer(channel, server->tcp_buffer, server->tcp_length,
|
process_answer(channel, server->tcp_buffer, server->tcp_length,
|
||||||
i, 1, now);
|
i, 1, now);
|
||||||
free(server->tcp_buffer);
|
if (server->tcp_buffer)
|
||||||
server->tcp_buffer = NULL;
|
free(server->tcp_buffer);
|
||||||
server->tcp_lenbuf_pos = 0;
|
server->tcp_buffer = NULL;
|
||||||
}
|
server->tcp_lenbuf_pos = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If any UDP sockets select true for reading, process them. */
|
/* If any UDP sockets select true for reading, process them. */
|
||||||
static void read_udp_packets(ares_channel channel, fd_set *read_fds,
|
static void read_udp_packets(ares_channel channel, fd_set *read_fds,
|
||||||
time_t now)
|
time_t now)
|
||||||
{
|
{
|
||||||
struct server_state *server;
|
struct server_state *server;
|
||||||
int i, count;
|
int i, count;
|
||||||
@@ -251,12 +276,13 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds,
|
|||||||
/* Make sure the server has a socket and is selected in read_fds. */
|
/* Make sure the server has a socket and is selected in read_fds. */
|
||||||
server = &channel->servers[i];
|
server = &channel->servers[i];
|
||||||
|
|
||||||
if (server->udp_socket == -1 || !FD_ISSET(server->udp_socket, read_fds))
|
if (server->udp_socket == ARES_SOCKET_BAD ||
|
||||||
continue;
|
!FD_ISSET(server->udp_socket, read_fds))
|
||||||
|
continue;
|
||||||
|
|
||||||
count = recv(server->udp_socket, buf, sizeof(buf), 0);
|
count = recv(server->udp_socket, buf, sizeof(buf), 0);
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
|
|
||||||
process_answer(channel, buf, count, i, 0, now);
|
process_answer(channel, buf, count, i, 0, now);
|
||||||
}
|
}
|
||||||
@@ -271,16 +297,16 @@ static void process_timeouts(ares_channel channel, time_t now)
|
|||||||
{
|
{
|
||||||
next = query->next;
|
next = query->next;
|
||||||
if (query->timeout != 0 && now >= query->timeout)
|
if (query->timeout != 0 && now >= query->timeout)
|
||||||
{
|
{
|
||||||
query->error_status = ARES_ETIMEOUT;
|
query->error_status = ARES_ETIMEOUT;
|
||||||
next_server(channel, query, now);
|
next = next_server(channel, query, now);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle an answer from a server. */
|
/* Handle an answer from a server. */
|
||||||
static void process_answer(ares_channel channel, unsigned char *abuf,
|
static void process_answer(ares_channel channel, unsigned char *abuf,
|
||||||
int alen, int whichserver, int tcp, int now)
|
int alen, int whichserver, int tcp, int now)
|
||||||
{
|
{
|
||||||
int id, tc, rcode;
|
int id, tc, rcode;
|
||||||
struct query *query;
|
struct query *query;
|
||||||
@@ -299,7 +325,7 @@ static void process_answer(ares_channel channel, unsigned char *abuf,
|
|||||||
for (query = channel->queries; query; query = query->next)
|
for (query = channel->queries; query; query = query->next)
|
||||||
{
|
{
|
||||||
if (query->qid == id)
|
if (query->qid == id)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!query)
|
if (!query)
|
||||||
return;
|
return;
|
||||||
@@ -311,10 +337,10 @@ static void process_answer(ares_channel channel, unsigned char *abuf,
|
|||||||
if ((tc || alen > PACKETSZ) && !tcp && !(channel->flags & ARES_FLAG_IGNTC))
|
if ((tc || alen > PACKETSZ) && !tcp && !(channel->flags & ARES_FLAG_IGNTC))
|
||||||
{
|
{
|
||||||
if (!query->using_tcp)
|
if (!query->using_tcp)
|
||||||
{
|
{
|
||||||
query->using_tcp = 1;
|
query->using_tcp = 1;
|
||||||
ares__send_query(channel, query, now);
|
ares__send_query(channel, query, now);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,18 +356,18 @@ static void process_answer(ares_channel channel, unsigned char *abuf,
|
|||||||
if (!(channel->flags & ARES_FLAG_NOCHECKRESP))
|
if (!(channel->flags & ARES_FLAG_NOCHECKRESP))
|
||||||
{
|
{
|
||||||
if (rcode == SERVFAIL || rcode == NOTIMP || rcode == REFUSED)
|
if (rcode == SERVFAIL || rcode == NOTIMP || rcode == REFUSED)
|
||||||
{
|
{
|
||||||
query->skip_server[whichserver] = 1;
|
query->skip_server[whichserver] = 1;
|
||||||
if (query->server == whichserver)
|
if (query->server == whichserver)
|
||||||
next_server(channel, query, now);
|
next_server(channel, query, now);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!same_questions(query->qbuf, query->qlen, abuf, alen))
|
if (!same_questions(query->qbuf, query->qlen, abuf, alen))
|
||||||
{
|
{
|
||||||
if (query->server == whichserver)
|
if (query->server == whichserver)
|
||||||
next_server(channel, query, now);
|
next_server(channel, query, now);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
end_query(channel, query, ARES_SUCCESS, abuf, alen);
|
end_query(channel, query, ARES_SUCCESS, abuf, alen);
|
||||||
@@ -349,7 +375,7 @@ static void process_answer(ares_channel channel, unsigned char *abuf,
|
|||||||
|
|
||||||
static void handle_error(ares_channel channel, int whichserver, time_t now)
|
static void handle_error(ares_channel channel, int whichserver, time_t now)
|
||||||
{
|
{
|
||||||
struct query *query;
|
struct query *query, *next;
|
||||||
|
|
||||||
/* Reset communications with this server. */
|
/* Reset communications with this server. */
|
||||||
ares__close_sockets(&channel->servers[whichserver]);
|
ares__close_sockets(&channel->servers[whichserver]);
|
||||||
@@ -357,37 +383,39 @@ static void handle_error(ares_channel channel, int whichserver, time_t now)
|
|||||||
/* Tell all queries talking to this server to move on and not try
|
/* Tell all queries talking to this server to move on and not try
|
||||||
* this server again.
|
* this server again.
|
||||||
*/
|
*/
|
||||||
for (query = channel->queries; query; query = query->next)
|
|
||||||
|
for (query = channel->queries; query; query = next)
|
||||||
{
|
{
|
||||||
|
next = query->next;
|
||||||
if (query->server == whichserver)
|
if (query->server == whichserver)
|
||||||
{
|
{
|
||||||
query->skip_server[whichserver] = 1;
|
query->skip_server[whichserver] = 1;
|
||||||
next_server(channel, query, now);
|
next = next_server(channel, query, now);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void next_server(ares_channel channel, struct query *query, time_t now)
|
static struct query *next_server(ares_channel channel, struct query *query, time_t now)
|
||||||
{
|
{
|
||||||
/* Advance to the next server or try. */
|
/* Advance to the next server or try. */
|
||||||
query->server++;
|
query->server++;
|
||||||
for (; query->try < channel->tries; query->try++)
|
for (; query->try < channel->tries; query->try++)
|
||||||
{
|
{
|
||||||
for (; query->server < channel->nservers; query->server++)
|
for (; query->server < channel->nservers; query->server++)
|
||||||
{
|
{
|
||||||
if (!query->skip_server[query->server])
|
if (!query->skip_server[query->server])
|
||||||
{
|
{
|
||||||
ares__send_query(channel, query, now);
|
ares__send_query(channel, query, now);
|
||||||
return;
|
return (query->next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
query->server = 0;
|
query->server = 0;
|
||||||
|
|
||||||
/* Only one try if we're using TCP. */
|
/* Only one try if we're using TCP. */
|
||||||
if (query->using_tcp)
|
if (query->using_tcp)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
end_query(channel, query, query->error_status, NULL, 0);
|
return end_query(channel, query, query->error_status, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
@@ -401,108 +429,167 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now)
|
|||||||
/* Make sure the TCP socket for this server is set up and queue
|
/* Make sure the TCP socket for this server is set up and queue
|
||||||
* a send request.
|
* a send request.
|
||||||
*/
|
*/
|
||||||
if (server->tcp_socket == -1)
|
if (server->tcp_socket == ARES_SOCKET_BAD)
|
||||||
{
|
{
|
||||||
if (open_tcp_socket(channel, server) == -1)
|
if (open_tcp_socket(channel, server) == -1)
|
||||||
{
|
{
|
||||||
query->skip_server[query->server] = 1;
|
query->skip_server[query->server] = 1;
|
||||||
next_server(channel, query, now);
|
next_server(channel, query, now);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sendreq = malloc(sizeof(struct send_request));
|
sendreq = calloc(sizeof(struct send_request), 1);
|
||||||
if (!sendreq)
|
if (!sendreq)
|
||||||
end_query(channel, query, ARES_ENOMEM, NULL, 0);
|
{
|
||||||
|
end_query(channel, query, ARES_ENOMEM, NULL, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
sendreq->data = query->tcpbuf;
|
sendreq->data = query->tcpbuf;
|
||||||
sendreq->len = query->tcplen;
|
sendreq->len = query->tcplen;
|
||||||
sendreq->next = NULL;
|
sendreq->next = NULL;
|
||||||
if (server->qtail)
|
if (server->qtail)
|
||||||
server->qtail->next = sendreq;
|
server->qtail->next = sendreq;
|
||||||
else
|
else
|
||||||
server->qhead = sendreq;
|
server->qhead = sendreq;
|
||||||
server->qtail = sendreq;
|
server->qtail = sendreq;
|
||||||
query->timeout = 0;
|
query->timeout = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (server->udp_socket == -1)
|
if (server->udp_socket == ARES_SOCKET_BAD)
|
||||||
{
|
{
|
||||||
if (open_udp_socket(channel, server) == -1)
|
if (open_udp_socket(channel, server) == -1)
|
||||||
{
|
{
|
||||||
query->skip_server[query->server] = 1;
|
query->skip_server[query->server] = 1;
|
||||||
next_server(channel, query, now);
|
next_server(channel, query, now);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (send(server->udp_socket, query->qbuf, query->qlen, 0) == -1)
|
if (send(server->udp_socket, 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);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
query->timeout = now
|
query->timeout = now
|
||||||
+ ((query->try == 0) ? channel->timeout
|
+ ((query->try == 0) ? channel->timeout
|
||||||
: channel->timeout << query->try / channel->nservers);
|
: channel->timeout << query->try / channel->nservers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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)
|
||||||
{
|
{
|
||||||
int s, flags;
|
ares_socket_t s;
|
||||||
struct sockaddr_in sockin;
|
struct sockaddr_in sockin;
|
||||||
|
|
||||||
/* Acquire a socket. */
|
/* Acquire a socket. */
|
||||||
s = socket(AF_INET, SOCK_STREAM, 0);
|
s = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
if (s == -1)
|
if (s == ARES_SOCKET_BAD)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* Set the socket non-blocking. */
|
/* Set the socket non-blocking. */
|
||||||
|
nonblock(s, TRUE);
|
||||||
#ifdef WIN32
|
|
||||||
flags = 1;
|
|
||||||
ioctlsocket(s, FIONBIO, &flags);
|
|
||||||
#else
|
|
||||||
flags = fcntl(s, F_GETFL, 0);
|
|
||||||
|
|
||||||
if (flags == -1)
|
|
||||||
{
|
|
||||||
close(s);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
flags |= O_NONBLOCK;
|
|
||||||
if (fcntl(s, F_SETFL, flags) == -1)
|
|
||||||
{
|
|
||||||
close(s);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* 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;
|
||||||
sockin.sin_addr = server->addr;
|
sockin.sin_addr = server->addr;
|
||||||
sockin.sin_port = channel->tcp_port;
|
sockin.sin_port = channel->tcp_port;
|
||||||
if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1
|
if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1) {
|
||||||
&& errno != EINPROGRESS)
|
int err = GET_ERRNO();
|
||||||
{
|
|
||||||
|
if (err != EINPROGRESS && err != EWOULDBLOCK) {
|
||||||
closesocket(s);
|
closesocket(s);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server->tcp_buffer_pos = 0;
|
||||||
server->tcp_socket = s;
|
server->tcp_socket = s;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int open_udp_socket(ares_channel channel, struct server_state *server)
|
static int open_udp_socket(ares_channel channel, struct server_state *server)
|
||||||
{
|
{
|
||||||
int s;
|
ares_socket_t s;
|
||||||
struct sockaddr_in sockin;
|
struct sockaddr_in sockin;
|
||||||
|
|
||||||
/* Acquire a socket. */
|
/* Acquire a socket. */
|
||||||
s = socket(AF_INET, SOCK_DGRAM, 0);
|
s = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
if (s == -1)
|
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;
|
||||||
@@ -519,7 +606,7 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int same_questions(const unsigned char *qbuf, int qlen,
|
static int same_questions(const unsigned char *qbuf, int qlen,
|
||||||
const unsigned char *abuf, int alen)
|
const unsigned char *abuf, int alen)
|
||||||
{
|
{
|
||||||
struct {
|
struct {
|
||||||
const unsigned char *p;
|
const unsigned char *p;
|
||||||
@@ -546,14 +633,14 @@ static int same_questions(const unsigned char *qbuf, int qlen,
|
|||||||
{
|
{
|
||||||
/* Decode the question in the query. */
|
/* Decode the question in the query. */
|
||||||
if (ares_expand_name(q.p, qbuf, qlen, &q.name, &q.namelen)
|
if (ares_expand_name(q.p, qbuf, qlen, &q.name, &q.namelen)
|
||||||
!= ARES_SUCCESS)
|
!= ARES_SUCCESS)
|
||||||
return 0;
|
return 0;
|
||||||
q.p += q.namelen;
|
q.p += q.namelen;
|
||||||
if (q.p + QFIXEDSZ > qbuf + qlen)
|
if (q.p + QFIXEDSZ > qbuf + qlen)
|
||||||
{
|
{
|
||||||
free(q.name);
|
free(q.name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
q.type = DNS_QUESTION_TYPE(q.p);
|
q.type = DNS_QUESTION_TYPE(q.p);
|
||||||
q.dnsclass = DNS_QUESTION_CLASS(q.p);
|
q.dnsclass = DNS_QUESTION_CLASS(q.p);
|
||||||
q.p += QFIXEDSZ;
|
q.p += QFIXEDSZ;
|
||||||
@@ -561,55 +648,59 @@ static int same_questions(const unsigned char *qbuf, int qlen,
|
|||||||
/* Search for this question in the answer. */
|
/* Search for this question in the answer. */
|
||||||
a.p = abuf + HFIXEDSZ;
|
a.p = abuf + HFIXEDSZ;
|
||||||
for (j = 0; j < a.qdcount; j++)
|
for (j = 0; j < a.qdcount; j++)
|
||||||
{
|
{
|
||||||
/* Decode the question in the answer. */
|
/* Decode the question in the answer. */
|
||||||
if (ares_expand_name(a.p, abuf, alen, &a.name, &a.namelen)
|
if (ares_expand_name(a.p, abuf, alen, &a.name, &a.namelen)
|
||||||
!= ARES_SUCCESS)
|
!= ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
free(q.name);
|
free(q.name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
a.p += a.namelen;
|
a.p += a.namelen;
|
||||||
if (a.p + QFIXEDSZ > abuf + alen)
|
if (a.p + QFIXEDSZ > abuf + alen)
|
||||||
{
|
{
|
||||||
free(q.name);
|
free(q.name);
|
||||||
free(a.name);
|
free(a.name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
a.type = DNS_QUESTION_TYPE(a.p);
|
a.type = DNS_QUESTION_TYPE(a.p);
|
||||||
a.dnsclass = DNS_QUESTION_CLASS(a.p);
|
a.dnsclass = DNS_QUESTION_CLASS(a.p);
|
||||||
a.p += QFIXEDSZ;
|
a.p += QFIXEDSZ;
|
||||||
|
|
||||||
/* Compare the decoded questions. */
|
/* Compare the decoded questions. */
|
||||||
if (strcasecmp(q.name, a.name) == 0 && q.type == a.type
|
if (strcasecmp(q.name, a.name) == 0 && q.type == a.type
|
||||||
&& q.dnsclass == a.dnsclass)
|
&& q.dnsclass == a.dnsclass)
|
||||||
{
|
{
|
||||||
free(a.name);
|
free(a.name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
free(a.name);
|
free(a.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(q.name);
|
free(q.name);
|
||||||
if (j == a.qdcount)
|
if (j == a.qdcount)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void end_query(ares_channel channel, struct query *query, int status,
|
static struct query *end_query (ares_channel channel, struct query *query, int status,
|
||||||
unsigned char *abuf, int alen)
|
unsigned char *abuf, int alen)
|
||||||
{
|
{
|
||||||
struct query **q;
|
struct query **q, *next;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
query->callback(query->arg, status, abuf, alen);
|
query->callback(query->arg, status, abuf, alen);
|
||||||
for (q = &channel->queries; *q; q = &(*q)->next)
|
for (q = &channel->queries; *q; q = &(*q)->next)
|
||||||
{
|
{
|
||||||
if (*q == query)
|
if (*q == query)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
*q = query->next;
|
*q = query->next;
|
||||||
|
if (*q)
|
||||||
|
next = (*q)->next;
|
||||||
|
else
|
||||||
|
next = NULL;
|
||||||
free(query->tcpbuf);
|
free(query->tcpbuf);
|
||||||
free(query->skip_server);
|
free(query->skip_server);
|
||||||
free(query);
|
free(query);
|
||||||
@@ -620,6 +711,7 @@ static void end_query(ares_channel channel, struct query *query, int status,
|
|||||||
if (!channel->queries && !(channel->flags & ARES_FLAG_STAYOPEN))
|
if (!channel->queries && !(channel->flags & ARES_FLAG_STAYOPEN))
|
||||||
{
|
{
|
||||||
for (i = 0; i < channel->nservers; i++)
|
for (i = 0; i < channel->nservers; i++)
|
||||||
ares__close_sockets(&channel->servers[i]);
|
ares__close_sockets(&channel->servers[i]);
|
||||||
}
|
}
|
||||||
|
return (next);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,13 +13,17 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#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>
|
||||||
@@ -35,7 +39,7 @@ struct qquery {
|
|||||||
static void qcallback(void *arg, int status, unsigned char *abuf, int alen);
|
static void qcallback(void *arg, int status, unsigned char *abuf, int alen);
|
||||||
|
|
||||||
void ares_query(ares_channel channel, const char *name, int dnsclass,
|
void ares_query(ares_channel channel, const char *name, int dnsclass,
|
||||||
int type, ares_callback callback, void *arg)
|
int type, ares_callback callback, void *arg)
|
||||||
{
|
{
|
||||||
struct qquery *qquery;
|
struct qquery *qquery;
|
||||||
unsigned char *qbuf;
|
unsigned char *qbuf;
|
||||||
@@ -44,7 +48,7 @@ void ares_query(ares_channel channel, const char *name, int dnsclass,
|
|||||||
/* Compose the query. */
|
/* Compose the query. */
|
||||||
rd = !(channel->flags & ARES_FLAG_NORECURSE);
|
rd = !(channel->flags & ARES_FLAG_NORECURSE);
|
||||||
status = ares_mkquery(name, dnsclass, type, channel->next_id, rd, &qbuf,
|
status = ares_mkquery(name, dnsclass, type, channel->next_id, rd, &qbuf,
|
||||||
&qlen);
|
&qlen);
|
||||||
channel->next_id++;
|
channel->next_id++;
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
@@ -84,26 +88,26 @@ static void qcallback(void *arg, int status, unsigned char *abuf, int alen)
|
|||||||
|
|
||||||
/* Convert errors. */
|
/* Convert errors. */
|
||||||
switch (rcode)
|
switch (rcode)
|
||||||
{
|
{
|
||||||
case NOERROR:
|
case NOERROR:
|
||||||
status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA;
|
status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA;
|
||||||
break;
|
break;
|
||||||
case FORMERR:
|
case FORMERR:
|
||||||
status = ARES_EFORMERR;
|
status = ARES_EFORMERR;
|
||||||
break;
|
break;
|
||||||
case SERVFAIL:
|
case SERVFAIL:
|
||||||
status = ARES_ESERVFAIL;
|
status = ARES_ESERVFAIL;
|
||||||
break;
|
break;
|
||||||
case NXDOMAIN:
|
case NXDOMAIN:
|
||||||
status = ARES_ENOTFOUND;
|
status = ARES_ENOTFOUND;
|
||||||
break;
|
break;
|
||||||
case NOTIMP:
|
case NOTIMP:
|
||||||
status = ARES_ENOTIMP;
|
status = ARES_ENOTIMP;
|
||||||
break;
|
break;
|
||||||
case REFUSED:
|
case REFUSED:
|
||||||
status = ARES_EREFUSED;
|
status = ARES_EREFUSED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
qquery->callback(qquery->arg, status, abuf, alen);
|
qquery->callback(qquery->arg, status, abuf, alen);
|
||||||
}
|
}
|
||||||
free(qquery);
|
free(qquery);
|
||||||
|
|||||||
@@ -13,12 +13,13 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -28,26 +29,26 @@
|
|||||||
struct search_query {
|
struct search_query {
|
||||||
/* Arguments passed to ares_search */
|
/* Arguments passed to ares_search */
|
||||||
ares_channel channel;
|
ares_channel channel;
|
||||||
char *name; /* copied into an allocated buffer */
|
char *name; /* copied into an allocated buffer */
|
||||||
int dnsclass;
|
int dnsclass;
|
||||||
int type;
|
int type;
|
||||||
ares_callback callback;
|
ares_callback callback;
|
||||||
void *arg;
|
void *arg;
|
||||||
|
|
||||||
int status_as_is; /* error status from trying as-is */
|
int status_as_is; /* error status from trying as-is */
|
||||||
int next_domain; /* next search domain to try */
|
int next_domain; /* next search domain to try */
|
||||||
int trying_as_is; /* current query is for name as-is */
|
int trying_as_is; /* current query is for name as-is */
|
||||||
};
|
};
|
||||||
|
|
||||||
static void search_callback(void *arg, int status, unsigned char *abuf,
|
static void search_callback(void *arg, int status, unsigned char *abuf,
|
||||||
int alen);
|
int alen);
|
||||||
static void end_squery(struct search_query *squery, int status,
|
static void end_squery(struct search_query *squery, int status,
|
||||||
unsigned char *abuf, int alen);
|
unsigned char *abuf, int alen);
|
||||||
static int cat_domain(const char *name, const char *domain, char **s);
|
static int cat_domain(const char *name, const char *domain, char **s);
|
||||||
static int single_domain(ares_channel channel, const char *name, char **s);
|
static int single_domain(ares_channel channel, const char *name, char **s);
|
||||||
|
|
||||||
void ares_search(ares_channel channel, const char *name, int dnsclass,
|
void ares_search(ares_channel channel, const char *name, int dnsclass,
|
||||||
int type, ares_callback callback, void *arg)
|
int type, ares_callback callback, void *arg)
|
||||||
{
|
{
|
||||||
struct search_query *squery;
|
struct search_query *squery;
|
||||||
char *s;
|
char *s;
|
||||||
@@ -98,7 +99,7 @@ void ares_search(ares_channel channel, const char *name, int dnsclass,
|
|||||||
for (p = name; *p; p++)
|
for (p = name; *p; p++)
|
||||||
{
|
{
|
||||||
if (*p == '.')
|
if (*p == '.')
|
||||||
ndots++;
|
ndots++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If ndots is at least the channel ndots threshold (usually 1),
|
/* If ndots is at least the channel ndots threshold (usually 1),
|
||||||
@@ -119,22 +120,22 @@ void ares_search(ares_channel channel, const char *name, int dnsclass,
|
|||||||
squery->trying_as_is = 0;
|
squery->trying_as_is = 0;
|
||||||
status = cat_domain(name, channel->domains[0], &s);
|
status = cat_domain(name, channel->domains[0], &s);
|
||||||
if (status == ARES_SUCCESS)
|
if (status == ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
ares_query(channel, s, dnsclass, type, search_callback, squery);
|
ares_query(channel, s, dnsclass, type, search_callback, squery);
|
||||||
free(s);
|
free(s);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* failed, free the malloc()ed memory */
|
/* failed, free the malloc()ed memory */
|
||||||
free(squery->name);
|
free(squery->name);
|
||||||
free(squery);
|
free(squery);
|
||||||
callback(arg, status, NULL, 0);
|
callback(arg, status, NULL, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void search_callback(void *arg, int status, unsigned char *abuf,
|
static void search_callback(void *arg, int status, unsigned char *abuf,
|
||||||
int alen)
|
int alen)
|
||||||
{
|
{
|
||||||
struct search_query *squery = (struct search_query *) arg;
|
struct search_query *squery = (struct search_query *) arg;
|
||||||
ares_channel channel = squery->channel;
|
ares_channel channel = squery->channel;
|
||||||
@@ -148,37 +149,37 @@ static void search_callback(void *arg, int status, unsigned char *abuf,
|
|||||||
{
|
{
|
||||||
/* Save the status if we were trying as-is. */
|
/* Save the status if we were trying as-is. */
|
||||||
if (squery->trying_as_is)
|
if (squery->trying_as_is)
|
||||||
squery->status_as_is = status;
|
squery->status_as_is = status;
|
||||||
if (squery->next_domain < channel->ndomains)
|
if (squery->next_domain < channel->ndomains)
|
||||||
{
|
{
|
||||||
/* Try the next domain. */
|
/* Try the next domain. */
|
||||||
status = cat_domain(squery->name,
|
status = cat_domain(squery->name,
|
||||||
channel->domains[squery->next_domain], &s);
|
channel->domains[squery->next_domain], &s);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
end_squery(squery, status, NULL, 0);
|
end_squery(squery, status, NULL, 0);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
squery->trying_as_is = 0;
|
squery->trying_as_is = 0;
|
||||||
squery->next_domain++;
|
squery->next_domain++;
|
||||||
ares_query(channel, s, squery->dnsclass, squery->type,
|
ares_query(channel, s, squery->dnsclass, squery->type,
|
||||||
search_callback, squery);
|
search_callback, squery);
|
||||||
free(s);
|
free(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (squery->status_as_is == -1)
|
else if (squery->status_as_is == -1)
|
||||||
{
|
{
|
||||||
/* Try the name as-is at the end. */
|
/* Try the name as-is at the end. */
|
||||||
squery->trying_as_is = 1;
|
squery->trying_as_is = 1;
|
||||||
ares_query(channel, squery->name, squery->dnsclass, squery->type,
|
ares_query(channel, squery->name, squery->dnsclass, squery->type,
|
||||||
search_callback, squery);
|
search_callback, squery);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
end_squery(squery, squery->status_as_is, NULL, 0);
|
end_squery(squery, squery->status_as_is, NULL, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void end_squery(struct search_query *squery, int status,
|
static void end_squery(struct search_query *squery, int status,
|
||||||
unsigned char *abuf, int alen)
|
unsigned char *abuf, int alen)
|
||||||
{
|
{
|
||||||
squery->callback(squery->arg, status, abuf, alen);
|
squery->callback(squery->arg, status, abuf, alen);
|
||||||
free(squery->name);
|
free(squery->name);
|
||||||
@@ -228,41 +229,41 @@ static int single_domain(ares_channel channel, const char *name, char **s)
|
|||||||
/* The name might be a host alias. */
|
/* The name might be a host alias. */
|
||||||
hostaliases = getenv("HOSTALIASES");
|
hostaliases = getenv("HOSTALIASES");
|
||||||
if (hostaliases)
|
if (hostaliases)
|
||||||
{
|
{
|
||||||
fp = fopen(hostaliases, "r");
|
fp = fopen(hostaliases, "r");
|
||||||
if (fp)
|
if (fp)
|
||||||
{
|
{
|
||||||
while ((status = ares__read_line(fp, &line, &linesize))
|
while ((status = ares__read_line(fp, &line, &linesize))
|
||||||
== ARES_SUCCESS)
|
== ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
if (strncasecmp(line, name, len) != 0 ||
|
if (strncasecmp(line, name, len) != 0 ||
|
||||||
!isspace((unsigned char)line[len]))
|
!isspace((unsigned char)line[len]))
|
||||||
continue;
|
continue;
|
||||||
p = line + len;
|
p = line + len;
|
||||||
while (isspace((unsigned char)*p))
|
while (isspace((unsigned char)*p))
|
||||||
p++;
|
p++;
|
||||||
if (*p)
|
if (*p)
|
||||||
{
|
{
|
||||||
q = p + 1;
|
q = p + 1;
|
||||||
while (*q && !isspace((unsigned char)*q))
|
while (*q && !isspace((unsigned char)*q))
|
||||||
q++;
|
q++;
|
||||||
*s = malloc(q - p + 1);
|
*s = malloc(q - p + 1);
|
||||||
if (*s)
|
if (*s)
|
||||||
{
|
{
|
||||||
memcpy(*s, p, q - p);
|
memcpy(*s, p, q - p);
|
||||||
(*s)[q - p] = 0;
|
(*s)[q - p] = 0;
|
||||||
}
|
}
|
||||||
free(line);
|
free(line);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return (*s) ? ARES_SUCCESS : ARES_ENOMEM;
|
return (*s) ? ARES_SUCCESS : ARES_ENOMEM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(line);
|
free(line);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (channel->flags & ARES_FLAG_NOSEARCH || channel->ndomains == 0)
|
if (channel->flags & ARES_FLAG_NOSEARCH || channel->ndomains == 0)
|
||||||
|
|||||||
@@ -13,13 +13,17 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#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>
|
||||||
@@ -30,7 +34,7 @@
|
|||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
|
||||||
void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
|
void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
|
||||||
ares_callback callback, void *arg)
|
ares_callback callback, void *arg)
|
||||||
{
|
{
|
||||||
struct query *query;
|
struct query *query;
|
||||||
int i;
|
int i;
|
||||||
|
|||||||
@@ -30,7 +30,8 @@ function gets the description of the ares library error code
|
|||||||
.IR code ,
|
.IR code ,
|
||||||
returning the result as a NUL-terminated C string.
|
returning the result as a NUL-terminated C string.
|
||||||
.SH NOTES
|
.SH NOTES
|
||||||
This function is not compatible with ares.
|
This function is not compatible with ares, it takes a different set of
|
||||||
|
arguments.
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Greg Hudson, MIT Information Systems
|
Greg Hudson, MIT Information Systems
|
||||||
.br
|
.br
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
|
|
||||||
@@ -37,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)));
|
||||||
|
|||||||
@@ -13,20 +13,20 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
|
||||||
#else
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
|
||||||
struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
||||||
struct timeval *tvbuf)
|
struct timeval *tvbuf)
|
||||||
{
|
{
|
||||||
struct query *query;
|
struct query *query;
|
||||||
time_t now;
|
time_t now;
|
||||||
@@ -42,12 +42,12 @@ struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
|||||||
for (query = channel->queries; query; query = query->next)
|
for (query = channel->queries; query; query = query->next)
|
||||||
{
|
{
|
||||||
if (query->timeout == 0)
|
if (query->timeout == 0)
|
||||||
continue;
|
continue;
|
||||||
offset = query->timeout - now;
|
offset = query->timeout - now;
|
||||||
if (offset < 0)
|
if (offset < 0)
|
||||||
offset = 0;
|
offset = 0;
|
||||||
if (min_offset == -1 || offset < min_offset)
|
if (min_offset == -1 || offset < min_offset)
|
||||||
min_offset = offset;
|
min_offset = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we found a minimum timeout and it's sooner than the one
|
/* If we found a minimum timeout and it's sooner than the one
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
|
#include "setup.h"
|
||||||
#include "ares_version.h"
|
#include "ares_version.h"
|
||||||
|
|
||||||
const char *ares_version(int *version)
|
const char *ares_version(int *version)
|
||||||
|
|||||||
@@ -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 0
|
||||||
#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.0"
|
||||||
|
|
||||||
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,4 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
aclocal
|
${LIBTOOLIZE:-libtoolize} --copy --automake --force
|
||||||
autoconf
|
${ACLOCAL:-aclocal}
|
||||||
|
${AUTOHEADER:-autoheader}
|
||||||
|
${AUTOCONF:-autoconf}
|
||||||
|
${AUTOMAKE:-automake} --add-missing
|
||||||
|
|||||||
1388
ares/config.guess
vendored
1388
ares/config.guess
vendored
File diff suppressed because it is too large
Load Diff
1489
ares/config.sub
vendored
1489
ares/config.sub
vendored
File diff suppressed because it is too large
Load Diff
@@ -1,17 +1,22 @@
|
|||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
AC_INIT(ares_init.c)
|
AC_INIT(ares_init.c)
|
||||||
|
AM_CONFIG_HEADER(config.h)
|
||||||
|
AM_MAINTAINER_MODE
|
||||||
|
AM_INIT_AUTOMAKE(c-ares, CVS)
|
||||||
|
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_RANLIB
|
|
||||||
|
|
||||||
AC_CANONICAL_HOST
|
|
||||||
case $host_os in
|
case $host_os in
|
||||||
solaris*)
|
solaris*)
|
||||||
AC_DEFINE(ETC_INET)
|
AC_DEFINE(ETC_INET, 1, [if a /etc/inet dir is being used])
|
||||||
;;
|
;;
|
||||||
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)
|
||||||
|
|
||||||
@@ -30,10 +35,17 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
|||||||
;;
|
;;
|
||||||
*) AC_MSG_RESULT(yes)
|
*) AC_MSG_RESULT(yes)
|
||||||
|
|
||||||
|
dnl when doing the debug stuff, use static library only
|
||||||
|
AC_DISABLE_SHARED
|
||||||
|
|
||||||
dnl Checks for standard header files, to make memdebug.h inclusions bettter
|
dnl Checks for standard header files, to make memdebug.h inclusions bettter
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
|
|
||||||
CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I../include"
|
dnl the entire --enable-debug is a hack that lives and runs on top of
|
||||||
|
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"
|
||||||
CFLAGS="$CFLAGS -g"
|
CFLAGS="$CFLAGS -g"
|
||||||
|
|
||||||
dnl set compiler "debug" options to become more picky, and remove
|
dnl set compiler "debug" options to become more picky, and remove
|
||||||
@@ -45,12 +57,303 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
|||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
AC_PROG_LIBTOOL
|
||||||
|
|
||||||
dnl check for a few basic system headers we need
|
dnl check for a few basic system headers we need
|
||||||
dnl AC_CHECK_HEADERS(
|
AC_CHECK_HEADERS(
|
||||||
dnl sys/types.h \
|
sys/types.h \
|
||||||
dnl sys/time.h \
|
sys/time.h \
|
||||||
dnl sys/select.h \
|
sys/select.h \
|
||||||
dnl sys/socket.h \
|
sys/socket.h \
|
||||||
dnl )
|
sys/ioctl.h \
|
||||||
|
netdb.h \
|
||||||
|
winsock.h \
|
||||||
|
netinet/in.h \
|
||||||
|
net/if.h \
|
||||||
|
arpa/nameser.h \
|
||||||
|
arpa/nameser_compat.h \
|
||||||
|
arpa/inet.h, , ,
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.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_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_CHECK_TYPE(socklen_t, ,
|
||||||
|
AC_DEFINE(socklen_t, int, [the length of a socket address]),
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl check for AF_INET6
|
||||||
|
CARES_CHECK_CONSTANT(
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#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(
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#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(
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#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(
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#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.])
|
||||||
|
, ,
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#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.]),,
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.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
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
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_WINSOCK_H
|
||||||
|
#include <winsock.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_WINSOCK_H
|
||||||
|
#include <winsock.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_WINSOCK_H
|
||||||
|
#include <winsock.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, ,
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
]
|
||||||
|
)
|
||||||
|
AC_CHECK_SIZEOF(struct in_addr, ,
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_CHECK_FUNCS([bitncmp if_indextoname])
|
||||||
|
|
||||||
|
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_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 */
|
||||||
206
ares/inet_ntop.c
Normal file
206
ares/inet_ntop.c
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
/* 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, cur;
|
||||||
|
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 */
|
||||||
114
ares/maketgz
114
ares/maketgz
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
$version = $ARGV[0];
|
$version = $ARGV[0];
|
||||||
|
|
||||||
$name="c-ares";
|
|
||||||
|
|
||||||
if($version eq "") {
|
if($version eq "") {
|
||||||
print "Enter version number!\n";
|
print "Enter version number!\n";
|
||||||
exit;
|
exit;
|
||||||
@@ -14,87 +12,47 @@ if(!-f "ares.h") {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my ($major, $minor, $patch)=split(/\./, $version);
|
||||||
|
|
||||||
|
$major += 0;
|
||||||
|
$minor += 0;
|
||||||
|
$patch += 0;
|
||||||
|
|
||||||
|
open(VER, "<ares_version.h") ||
|
||||||
|
die "can't open ares_version.h";
|
||||||
|
open(NEWV, ">ares_version.h.dist");
|
||||||
|
while(<VER>) {
|
||||||
|
$_ =~ s/^\#define ARES_VERSION_MAJOR .*/\#define ARES_VERSION_MAJOR $major/;
|
||||||
|
$_ =~ s/^\#define ARES_VERSION_MINOR .*/\#define ARES_VERSION_MINOR $minor/;
|
||||||
|
$_ =~ s/^\#define ARES_VERSION_PATCH .*/\#define ARES_VERSION_PATCH $patch/;
|
||||||
|
$_ =~ s/^\#define ARES_VERSION_STR .*/\#define ARES_VERSION_STR \"$version\"/;
|
||||||
|
|
||||||
|
print NEWV $_;
|
||||||
|
}
|
||||||
|
close(VER);
|
||||||
|
close(NEWV);
|
||||||
|
print "ares_version.h.dist created\n";
|
||||||
|
|
||||||
if(!-f "configure") {
|
if(!-f "configure") {
|
||||||
`autoconf`;
|
print "running buildconf\n";
|
||||||
|
`./buildconf`;
|
||||||
}
|
}
|
||||||
|
print "adding $version in the configure.ac file\n";
|
||||||
|
`sed -e 's/AM_INIT_AUTOMAKE(c-ares, CVS)/AM_INIT_AUTOMAKE(c-ares, $version)/' < configure.ac > configure.ac-rel`;
|
||||||
|
|
||||||
@files=`find . -name FILES`;
|
# now make a new configure script with this
|
||||||
|
print "makes a new configure script\n";
|
||||||
|
`autoconf configure.ac-rel >configure`;
|
||||||
|
|
||||||
my @entries;
|
# now run this new configure to get a fine makefile
|
||||||
|
print "running configure\n";
|
||||||
|
`./configure`;
|
||||||
|
|
||||||
sub dirpart {
|
# now make the actual tarball
|
||||||
my ($file)=@_;
|
print "running make dist\n";
|
||||||
my @p=split("/", $file);
|
`make dist`;
|
||||||
$p[$#p]=""; # blank the last one
|
|
||||||
my $dir=join("/", @p);
|
|
||||||
|
|
||||||
$dir =~ s/^\.\///; # cut off ./ beginnings
|
print "removing temporary configure.ac file\n";
|
||||||
|
`rm configure.ac-rel`;
|
||||||
$dir =~ s/\/$//; # off / trailers
|
|
||||||
|
|
||||||
if(!$dir) {
|
|
||||||
$dir = ".";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub add {
|
|
||||||
my ($file)=@_;
|
|
||||||
|
|
||||||
my $dir=dirpart($file);
|
|
||||||
|
|
||||||
open(FILE, "<$file");
|
|
||||||
while(<FILE>) {
|
|
||||||
if($_ =~ /^ *\#/) {
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
chomp;
|
|
||||||
push @entries, "$dir/$_";
|
|
||||||
}
|
|
||||||
close(FILE);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(@files) {
|
|
||||||
chomp;
|
|
||||||
add($_);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub mkalldir {
|
|
||||||
my ($dir) = @_;
|
|
||||||
|
|
||||||
my @parts = split("/", $dir);
|
|
||||||
|
|
||||||
#print "IN: $dir\n";
|
|
||||||
|
|
||||||
my $sub="";
|
|
||||||
for(@parts) {
|
|
||||||
#print "PART: $_\n";
|
|
||||||
|
|
||||||
$sub .= "$_";
|
|
||||||
if($_ eq "") {
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
mkdir($sub, 0777);
|
|
||||||
#print "make $sub\n";
|
|
||||||
$sub .= "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
for(@entries) {
|
|
||||||
my $dir = dirpart("$name-$version/$_");
|
|
||||||
# print "Create $dir\n";
|
|
||||||
mkalldir($dir);
|
|
||||||
# print "Copy $_ to $dir\n";
|
|
||||||
`cp -p $_ $dir`;
|
|
||||||
}
|
|
||||||
|
|
||||||
# make a tarball
|
|
||||||
`tar -cf $name-$version.tar $name-$version`;
|
|
||||||
# gzip the tarball
|
|
||||||
`gzip -9 $name-$version.tar`;
|
|
||||||
# remove the dir
|
|
||||||
`rm -rf $name-$version`;
|
|
||||||
|
|
||||||
print "NOTE: now cvs tag this release!\n";
|
print "NOTE: now cvs tag this release!\n";
|
||||||
|
|||||||
@@ -4,13 +4,20 @@
|
|||||||
/* Windows-only header file provided by liren@vivisimo.com to make his Windows
|
/* Windows-only header file provided by liren@vivisimo.com to make his Windows
|
||||||
port build */
|
port build */
|
||||||
|
|
||||||
|
#ifndef NETWARE
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <process.h> /* for the _getpid() proto */
|
#include <process.h> /* for the _getpid() proto */
|
||||||
|
#endif /* !NETWARE */
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#ifndef NETWARE
|
||||||
|
|
||||||
#define MAXHOSTNAMELEN 256
|
#define MAXHOSTNAMELEN 256
|
||||||
|
|
||||||
#define EINPROGRESS WSAEINPROGRESS
|
#define EINPROGRESS WSAEINPROGRESS
|
||||||
|
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||||
|
#define EMSGSIZE WSAEMSGSIZE
|
||||||
|
#define EAFNOSUPPORT WSAEAFNOSUPPORT
|
||||||
|
|
||||||
/* Structure for scatter/gather I/O. */
|
/* Structure for scatter/gather I/O. */
|
||||||
struct iovec
|
struct iovec
|
||||||
@@ -21,13 +28,20 @@ struct iovec
|
|||||||
|
|
||||||
#define getpid() _getpid()
|
#define getpid() _getpid()
|
||||||
|
|
||||||
|
int ares_writev (SOCKET s, const struct iovec *vector, size_t count);
|
||||||
|
#define writev(s,vect,count) ares_writev(s,vect,count)
|
||||||
|
|
||||||
struct timezone { int dummy; };
|
struct timezone { int dummy; };
|
||||||
|
|
||||||
int ares_gettimeofday(struct timeval *tv, struct timezone *tz);
|
int ares_gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||||
#define gettimeofday(tv,tz) ares_gettimeofday(tv,tz)
|
#define gettimeofday(tv,tz) ares_gettimeofday(tv,tz)
|
||||||
|
|
||||||
#define NS_CMPRSFLGS 0xc0
|
#endif /* !NETWARE */
|
||||||
|
|
||||||
|
#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
|
||||||
@@ -211,16 +225,4 @@ typedef enum __ns_rcode {
|
|||||||
#define T_MAILA ns_t_maila
|
#define T_MAILA ns_t_maila
|
||||||
#define T_ANY ns_t_any
|
#define T_ANY ns_t_any
|
||||||
|
|
||||||
#ifndef __MINGW32__
|
|
||||||
/* protos for the functions we provide in windows_port.c */
|
|
||||||
int ares_strncasecmp(const char *s1, const char *s2, size_t n);
|
|
||||||
int ares_strcasecmp(const char *s1, const char *s2);
|
|
||||||
|
|
||||||
/* use this define magic to prevent us from adding symbol names to the library
|
|
||||||
that is a high-risk to collide with another libraries' attempts to do the
|
|
||||||
same */
|
|
||||||
#define strncasecmp(a,b,c) ares_strncasecmp(a,b,c)
|
|
||||||
#define strcasecmp(a,b) ares_strcasecmp(a,b)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ARES_NAMESER_H */
|
#endif /* ARES_NAMESER_H */
|
||||||
|
|||||||
82
ares/setup.h
Normal file
82
ares/setup.h
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
#ifndef ARES_SETUP_H
|
||||||
|
#define ARES_SETUP_H
|
||||||
|
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#else
|
||||||
|
/* simple work-around for now, for systems without configure support */
|
||||||
|
#define ssize_t int
|
||||||
|
#define socklen_t int
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 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_TARNAME
|
||||||
|
#undef PACKAGE_VERSION
|
||||||
|
#undef PACKAGE_BUGREPORT
|
||||||
|
#undef PACKAGE_NAME
|
||||||
|
#undef VERSION
|
||||||
|
#undef PACKAGE
|
||||||
|
|
||||||
|
/* now typedef our socket type */
|
||||||
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
|
#include <winsock.h>
|
||||||
|
typedef SOCKET ares_socket_t;
|
||||||
|
#define ARES_SOCKET_BAD INVALID_SOCKET
|
||||||
|
#else
|
||||||
|
typedef int ares_socket_t;
|
||||||
|
#define ARES_SOCKET_BAD -1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Assume a few thing unless they're set by configure
|
||||||
|
*/
|
||||||
|
#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER)
|
||||||
|
#define HAVE_SYS_TIME_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER)
|
||||||
|
#define HAVE_UNISTD_H 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS)
|
||||||
|
#define HAVE_SYS_UIO_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(WIN32) || defined(WATT32)) && \
|
||||||
|
!(defined(__MINGW32__) || defined(NETWARE))
|
||||||
|
/* protos for the functions we provide in windows_port.c */
|
||||||
|
int ares_strncasecmp(const char *s1, const char *s2, int n);
|
||||||
|
int ares_strcasecmp(const char *s1, const char *s2);
|
||||||
|
|
||||||
|
/* use this define magic to prevent us from adding symbol names to the library
|
||||||
|
that is a high-risk to collide with another libraries' attempts to do the
|
||||||
|
same */
|
||||||
|
#define strncasecmp(a,b,c) ares_strncasecmp(a,b,c)
|
||||||
|
#define strcasecmp(a,b) ares_strcasecmp(a,b)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 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 */
|
||||||
@@ -185,24 +185,24 @@ SOURCE=..\..\getopt.c
|
|||||||
!IF "$(CFG)" == "adig - Win32 Release"
|
!IF "$(CFG)" == "adig - Win32 Release"
|
||||||
|
|
||||||
"areslib - Win32 Release" :
|
"areslib - Win32 Release" :
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
cd "..\areslib"
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"
|
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"
|
||||||
cd "..\adig"
|
cd "..\adig"
|
||||||
|
|
||||||
"areslib - Win32 ReleaseCLEAN" :
|
"areslib - Win32 ReleaseCLEAN" :
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
cd "..\areslib"
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN
|
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN
|
||||||
cd "..\adig"
|
cd "..\adig"
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "adig - Win32 Debug"
|
!ELSEIF "$(CFG)" == "adig - Win32 Debug"
|
||||||
|
|
||||||
"areslib - Win32 Debug" :
|
"areslib - Win32 Debug" :
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
cd "..\areslib"
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"
|
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"
|
||||||
cd "..\adig"
|
cd "..\adig"
|
||||||
|
|
||||||
"areslib - Win32 DebugCLEAN" :
|
"areslib - Win32 DebugCLEAN" :
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
cd "..\areslib"
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN
|
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN
|
||||||
cd "..\adig"
|
cd "..\adig"
|
||||||
|
|
||||||
|
|||||||
@@ -195,24 +195,24 @@ SOURCE=..\..\ahost.c
|
|||||||
!IF "$(CFG)" == "ahost - Win32 Release"
|
!IF "$(CFG)" == "ahost - Win32 Release"
|
||||||
|
|
||||||
"areslib - Win32 Release" :
|
"areslib - Win32 Release" :
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
cd "..\areslib"
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"
|
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"
|
||||||
cd "..\ahost"
|
cd "..\ahost"
|
||||||
|
|
||||||
"areslib - Win32 ReleaseCLEAN" :
|
"areslib - Win32 ReleaseCLEAN" :
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
cd "..\areslib"
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN
|
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN
|
||||||
cd "..\ahost"
|
cd "..\ahost"
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "ahost - Win32 Debug"
|
!ELSEIF "$(CFG)" == "ahost - Win32 Debug"
|
||||||
|
|
||||||
"areslib - Win32 Debug" :
|
"areslib - Win32 Debug" :
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
cd "..\areslib"
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"
|
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"
|
||||||
cd "..\ahost"
|
cd "..\ahost"
|
||||||
|
|
||||||
"areslib - Win32 DebugCLEAN" :
|
"areslib - Win32 DebugCLEAN" :
|
||||||
cd "\ARES-1.1.1\vc\areslib"
|
cd "..\areslib"
|
||||||
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN
|
$(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN
|
||||||
cd "..\ahost"
|
cd "..\ahost"
|
||||||
|
|
||||||
|
|||||||
@@ -109,10 +109,6 @@ SOURCE=..\..\ares_fds.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\ares_free_errmem.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_free_hostent.c
|
SOURCE=..\..\ares_free_hostent.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
@@ -157,6 +153,14 @@ 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
|
||||||
@@ -185,6 +189,10 @@ SOURCE=..\..\ares_dns.h
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_version.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\ares_private.h
|
SOURCE=..\..\ares_private.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ CLEAN :
|
|||||||
-@erase "$(INTDIR)\ares_destroy.obj"
|
-@erase "$(INTDIR)\ares_destroy.obj"
|
||||||
-@erase "$(INTDIR)\ares_expand_name.obj"
|
-@erase "$(INTDIR)\ares_expand_name.obj"
|
||||||
-@erase "$(INTDIR)\ares_fds.obj"
|
-@erase "$(INTDIR)\ares_fds.obj"
|
||||||
-@erase "$(INTDIR)\ares_free_errmem.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_free_hostent.obj"
|
-@erase "$(INTDIR)\ares_free_hostent.obj"
|
||||||
-@erase "$(INTDIR)\ares_free_string.obj"
|
-@erase "$(INTDIR)\ares_free_string.obj"
|
||||||
-@erase "$(INTDIR)\ares_gethostbyaddr.obj"
|
-@erase "$(INTDIR)\ares_gethostbyaddr.obj"
|
||||||
@@ -82,7 +81,6 @@ LIB32_OBJS= \
|
|||||||
"$(INTDIR)\ares_destroy.obj" \
|
"$(INTDIR)\ares_destroy.obj" \
|
||||||
"$(INTDIR)\ares_expand_name.obj" \
|
"$(INTDIR)\ares_expand_name.obj" \
|
||||||
"$(INTDIR)\ares_fds.obj" \
|
"$(INTDIR)\ares_fds.obj" \
|
||||||
"$(INTDIR)\ares_free_errmem.obj" \
|
|
||||||
"$(INTDIR)\ares_free_hostent.obj" \
|
"$(INTDIR)\ares_free_hostent.obj" \
|
||||||
"$(INTDIR)\ares_free_string.obj" \
|
"$(INTDIR)\ares_free_string.obj" \
|
||||||
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
||||||
@@ -94,6 +92,8 @@ LIB32_OBJS= \
|
|||||||
"$(INTDIR)\ares_process.obj" \
|
"$(INTDIR)\ares_process.obj" \
|
||||||
"$(INTDIR)\ares_query.obj" \
|
"$(INTDIR)\ares_query.obj" \
|
||||||
"$(INTDIR)\ares_search.obj" \
|
"$(INTDIR)\ares_search.obj" \
|
||||||
|
"$(INTDIR)\ares_cancel.obj" \
|
||||||
|
"$(INTDIR)\ares_version.obj" \
|
||||||
"$(INTDIR)\ares_send.obj" \
|
"$(INTDIR)\ares_send.obj" \
|
||||||
"$(INTDIR)\ares_strerror.obj" \
|
"$(INTDIR)\ares_strerror.obj" \
|
||||||
"$(INTDIR)\ares_timeout.obj" \
|
"$(INTDIR)\ares_timeout.obj" \
|
||||||
@@ -122,7 +122,6 @@ CLEAN :
|
|||||||
-@erase "$(INTDIR)\ares_destroy.obj"
|
-@erase "$(INTDIR)\ares_destroy.obj"
|
||||||
-@erase "$(INTDIR)\ares_expand_name.obj"
|
-@erase "$(INTDIR)\ares_expand_name.obj"
|
||||||
-@erase "$(INTDIR)\ares_fds.obj"
|
-@erase "$(INTDIR)\ares_fds.obj"
|
||||||
-@erase "$(INTDIR)\ares_free_errmem.obj"
|
|
||||||
-@erase "$(INTDIR)\ares_free_hostent.obj"
|
-@erase "$(INTDIR)\ares_free_hostent.obj"
|
||||||
-@erase "$(INTDIR)\ares_free_string.obj"
|
-@erase "$(INTDIR)\ares_free_string.obj"
|
||||||
-@erase "$(INTDIR)\ares_gethostbyaddr.obj"
|
-@erase "$(INTDIR)\ares_gethostbyaddr.obj"
|
||||||
@@ -134,6 +133,8 @@ CLEAN :
|
|||||||
-@erase "$(INTDIR)\ares_process.obj"
|
-@erase "$(INTDIR)\ares_process.obj"
|
||||||
-@erase "$(INTDIR)\ares_query.obj"
|
-@erase "$(INTDIR)\ares_query.obj"
|
||||||
-@erase "$(INTDIR)\ares_search.obj"
|
-@erase "$(INTDIR)\ares_search.obj"
|
||||||
|
-@erase "$(INTDIR)\ares_cancel.obj"
|
||||||
|
-@erase "$(INTDIR)\ares_version.obj"
|
||||||
-@erase "$(INTDIR)\ares_send.obj"
|
-@erase "$(INTDIR)\ares_send.obj"
|
||||||
-@erase "$(INTDIR)\ares_strerror.obj"
|
-@erase "$(INTDIR)\ares_strerror.obj"
|
||||||
-@erase "$(INTDIR)\ares_timeout.obj"
|
-@erase "$(INTDIR)\ares_timeout.obj"
|
||||||
@@ -159,7 +160,6 @@ LIB32_OBJS= \
|
|||||||
"$(INTDIR)\ares_destroy.obj" \
|
"$(INTDIR)\ares_destroy.obj" \
|
||||||
"$(INTDIR)\ares_expand_name.obj" \
|
"$(INTDIR)\ares_expand_name.obj" \
|
||||||
"$(INTDIR)\ares_fds.obj" \
|
"$(INTDIR)\ares_fds.obj" \
|
||||||
"$(INTDIR)\ares_free_errmem.obj" \
|
|
||||||
"$(INTDIR)\ares_free_hostent.obj" \
|
"$(INTDIR)\ares_free_hostent.obj" \
|
||||||
"$(INTDIR)\ares_free_string.obj" \
|
"$(INTDIR)\ares_free_string.obj" \
|
||||||
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
||||||
@@ -260,12 +260,6 @@ SOURCE=..\..\ares_fds.c
|
|||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_free_errmem.c
|
|
||||||
|
|
||||||
"$(INTDIR)\ares_free_errmem.obj" : $(SOURCE) "$(INTDIR)"
|
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_free_hostent.c
|
SOURCE=..\..\ares_free_hostent.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_free_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_free_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
@@ -332,6 +326,18 @@ SOURCE=..\..\ares_search.c
|
|||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(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
|
SOURCE=..\..\ares_send.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
|
|||||||
@@ -1,15 +1,28 @@
|
|||||||
|
#include "setup.h"
|
||||||
|
|
||||||
|
/* only do the following on windows
|
||||||
|
*/
|
||||||
|
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
|
#ifdef WATT32
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#else
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
|
#endif
|
||||||
|
#include "ares.h"
|
||||||
|
#include "ares_private.h"
|
||||||
|
|
||||||
#ifndef __MINGW32__
|
#ifndef __MINGW32__
|
||||||
int
|
int
|
||||||
ares_strncasecmp(const char *a, const char *b, size_t n)
|
ares_strncasecmp(const char *a, const char *b, int n)
|
||||||
{
|
{
|
||||||
size_t i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
int c1 = isupper(a[i]) ? tolower(a[i]) : a[i];
|
int c1 = isupper(a[i]) ? tolower(a[i]) : a[i];
|
||||||
@@ -26,38 +39,67 @@ ares_strcasecmp(const char *a, const char *b)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Number of micro-seconds between the beginning of the Windows epoch
|
||||||
|
* (Jan. 1, 1601) and the Unix epoch (Jan. 1, 1970).
|
||||||
|
*/
|
||||||
|
#if defined(_MSC_VER) || defined(__WATCOMC__)
|
||||||
|
#define EPOCH_FILETIME 11644473600000000Ui64
|
||||||
|
#else
|
||||||
|
#define EPOCH_FILETIME 11644473600000000ULL
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
ares_gettimeofday(struct timeval *tv, struct timezone *tz)
|
ares_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||||
{
|
{
|
||||||
FILETIME ft;
|
FILETIME ft;
|
||||||
LARGE_INTEGER li;
|
LARGE_INTEGER li;
|
||||||
__int64 t;
|
__int64 t;
|
||||||
static int tzflag;
|
|
||||||
|
|
||||||
if (tv)
|
if (tv)
|
||||||
{
|
{
|
||||||
GetSystemTimeAsFileTime(&ft);
|
GetSystemTimeAsFileTime(&ft);
|
||||||
li.LowPart = ft.dwLowDateTime;
|
li.LowPart = ft.dwLowDateTime;
|
||||||
li.HighPart = ft.dwHighDateTime;
|
li.HighPart = ft.dwHighDateTime;
|
||||||
t = li.QuadPart; /* In 100-nanosecond intervals */
|
t = li.QuadPart / 10; /* In micro-second intervals */
|
||||||
//t -= EPOCHFILETIME; /* Offset to the Epoch time */
|
t -= EPOCH_FILETIME; /* Offset to the Epoch time */
|
||||||
t /= 10; /* In microseconds */
|
|
||||||
tv->tv_sec = (long)(t / 1000000);
|
tv->tv_sec = (long)(t / 1000000);
|
||||||
tv->tv_usec = (long)(t % 1000000);
|
tv->tv_usec = (long)(t % 1000000);
|
||||||
}
|
}
|
||||||
|
(void) tz;
|
||||||
#if 0
|
|
||||||
if (tz)
|
|
||||||
{
|
|
||||||
if (!tzflag)
|
|
||||||
{
|
|
||||||
_tzset();
|
|
||||||
tzflag++;
|
|
||||||
}
|
|
||||||
tz->tz_minuteswest = _timezone / 60;
|
|
||||||
tz->tz_dsttime = _daylight;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ares_writev (ares_socket_t s, const struct iovec *vector, size_t count)
|
||||||
|
{
|
||||||
|
char *buffer, *bp;
|
||||||
|
size_t i, bytes = 0;
|
||||||
|
|
||||||
|
/* Find the total number of bytes to write
|
||||||
|
*/
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
bytes += vector[i].iov_len;
|
||||||
|
|
||||||
|
if (bytes == 0) /* not an error */
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
/* Allocate a temporary buffer to hold the data
|
||||||
|
*/
|
||||||
|
buffer = bp = (char*) alloca (bytes);
|
||||||
|
if (!buffer)
|
||||||
|
{
|
||||||
|
errno = ENOMEM;
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the data into buffer.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
memcpy (bp, vector[i].iov_base, vector[i].iov_len);
|
||||||
|
bp += vector[i].iov_len;
|
||||||
|
}
|
||||||
|
return send (s, (const void*)buffer, bytes, 0);
|
||||||
|
}
|
||||||
|
#endif /* WIN32 builds only */
|
||||||
|
|||||||
54
buildconf
54
buildconf
@@ -13,7 +13,7 @@ findtool(){
|
|||||||
IFS=":"
|
IFS=":"
|
||||||
for path in $PATH
|
for path in $PATH
|
||||||
do
|
do
|
||||||
if test -r "$path/$file"; then
|
if test -f "$path/$file"; then
|
||||||
echo "$path/$file"
|
echo "$path/$file"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
@@ -24,7 +24,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 +45,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 +67,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 +85,14 @@ fi
|
|||||||
|
|
||||||
echo "buildconf: automake version $am_version (ok)"
|
echo "buildconf: automake version $am_version (ok)"
|
||||||
|
|
||||||
|
ac=`findtool 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
|
||||||
@@ -101,7 +109,11 @@ libtool=`findtool glibtool 2>/dev/null`
|
|||||||
if test ! -x "$libtool"; then
|
if test ! -x "$libtool"; then
|
||||||
libtool=`findtool libtool`
|
libtool=`findtool libtool`
|
||||||
fi
|
fi
|
||||||
lt_pversion=`$libtool --version 2>/dev/null|head -1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'`
|
|
||||||
|
# set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found
|
||||||
|
LIBTOOLIZE="${libtool}ize"
|
||||||
|
|
||||||
|
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"
|
||||||
@@ -138,10 +150,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
|
||||||
@@ -151,6 +170,10 @@ else
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
# perl check
|
||||||
|
#
|
||||||
|
PERL=`findtool perl`
|
||||||
|
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
@@ -160,24 +183,33 @@ echo "buildconf: running libtoolize"
|
|||||||
${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed"
|
${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool 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"
|
||||||
|
cp lib/config.h.in src/config.h.in
|
||||||
echo "buildconf: running autoconf"
|
echo "buildconf: running autoconf"
|
||||||
${AUTOCONF:-autoconf} || die "The autoconf command failed"
|
${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 ares/libtoolize"
|
||||||
|
${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed"
|
||||||
|
echo "buildconf: running ares/aclocal"
|
||||||
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed"
|
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed"
|
||||||
echo "buildconf: running autoconf in the ares directory"
|
echo "buildconf: running ares/autoconf"
|
||||||
${AUTOCONF:-autoconf} || die "The ares autoconf command failed"
|
${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
|
||||||
|
|||||||
@@ -7,9 +7,6 @@ REM create ca-bundle.h
|
|||||||
echo /* This file is generated automatically */ >lib\ca-bundle.h
|
echo /* This file is generated automatically */ >lib\ca-bundle.h
|
||||||
echo #define CURL_CA_BUNDLE getenv("CURL_CA_BUNDLE") >>lib\ca-bundle.h
|
echo #define CURL_CA_BUNDLE getenv("CURL_CA_BUNDLE") >>lib\ca-bundle.h
|
||||||
|
|
||||||
REM create getdate.c
|
|
||||||
copy lib\getdate.c.cvs lib\getdate.c
|
|
||||||
|
|
||||||
REM create hugehelp.c
|
REM create hugehelp.c
|
||||||
copy src\hugehelp.c.cvs src\hugehelp.c
|
copy src\hugehelp.c.cvs src\hugehelp.c
|
||||||
|
|
||||||
|
|||||||
1071
configure.ac
1071
configure.ac
File diff suppressed because it is too large
Load Diff
@@ -19,7 +19,8 @@ Available values for OPTION include:
|
|||||||
--ca ca bundle install path
|
--ca ca bundle install path
|
||||||
--cc compiler
|
--cc compiler
|
||||||
--cflags pre-processor and compiler flags
|
--cflags pre-processor and compiler flags
|
||||||
--feature newline separated list of enabled features
|
--features newline separated list of enabled features
|
||||||
|
--protocols newline separated list of enabled protocols
|
||||||
--help display this help and exit
|
--help display this help and exit
|
||||||
--libs library linking information
|
--libs library linking information
|
||||||
--prefix curl install prefix
|
--prefix curl install prefix
|
||||||
@@ -45,19 +46,22 @@ while test $# -gt 0; do
|
|||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--ca)
|
--ca)
|
||||||
echo @CURL_CA_BUNDLE@
|
echo "@CURL_CA_BUNDLE@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--cc)
|
--cc)
|
||||||
echo @CC@
|
echo "@CC@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--prefix)
|
--prefix)
|
||||||
echo $prefix
|
echo "$prefix"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--feature)
|
--feature|--features)
|
||||||
if test "@OPENSSL_ENABLED@" = "1"; then
|
if test "@USE_SSLEAY@" = "1"; then
|
||||||
|
echo "SSL"
|
||||||
|
NTLM=1 # OpenSSL implies NTLM
|
||||||
|
elif test -n "@USE_GNUTLS@"; then
|
||||||
echo "SSL"
|
echo "SSL"
|
||||||
fi
|
fi
|
||||||
if test "@KRB4_ENABLED@" = "1"; then
|
if test "@KRB4_ENABLED@" = "1"; then
|
||||||
@@ -69,32 +73,53 @@ while test $# -gt 0; do
|
|||||||
if test "@HAVE_LIBZ@" = "1"; then
|
if test "@HAVE_LIBZ@" = "1"; then
|
||||||
echo "libz"
|
echo "libz"
|
||||||
fi
|
fi
|
||||||
if test "@CURL_DISABLE_HTTP@" = "1"; then
|
|
||||||
echo "HTTP-disabled"
|
|
||||||
fi
|
|
||||||
if test "@CURL_DISABLE_FTP@" = "1"; then
|
|
||||||
echo "FTP-disabled"
|
|
||||||
fi
|
|
||||||
if test "@CURL_DISABLE_GOPHER@" = "1"; then
|
|
||||||
echo "GOPHER-disabled"
|
|
||||||
fi
|
|
||||||
if test "@CURL_DISABLE_FILE@" = "1"; then
|
|
||||||
echo "FILE-disabled"
|
|
||||||
fi
|
|
||||||
if test "@CURL_DISABLE_TELNET@" = "1"; then
|
|
||||||
echo "TELNET-disabled"
|
|
||||||
fi
|
|
||||||
if test "@CURL_DISABLE_LDAP@" = "1"; then
|
|
||||||
echo "LDAP-disabled"
|
|
||||||
fi
|
|
||||||
if test "@CURL_DISABLE_DICT@" = "1"; then
|
|
||||||
echo "DICT-disabled"
|
|
||||||
fi
|
|
||||||
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)
|
||||||
|
if test "@CURL_DISABLE_HTTP@" != "1"; then
|
||||||
|
echo "HTTP"
|
||||||
|
if test "@USE_SSLEAY@" = "1"; then
|
||||||
|
echo "HTTPS"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "@CURL_DISABLE_FTP@" != "1"; then
|
||||||
|
echo "FTP"
|
||||||
|
if test "@USE_SSLEAY@" = "1"; then
|
||||||
|
echo "FTPS"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "@CURL_DISABLE_GOPHER@" != "1"; then
|
||||||
|
echo "GOPHER"
|
||||||
|
fi
|
||||||
|
if test "@CURL_DISABLE_FILE@" != "1"; then
|
||||||
|
echo "FILE"
|
||||||
|
fi
|
||||||
|
if test "@CURL_DISABLE_TELNET@" != "1"; then
|
||||||
|
echo "TELNET"
|
||||||
|
fi
|
||||||
|
if test "@CURL_DISABLE_LDAP@" != "1"; then
|
||||||
|
echo "LDAP"
|
||||||
|
fi
|
||||||
|
if test "@CURL_DISABLE_DICT@" != "1"; then
|
||||||
|
echo "DICT"
|
||||||
|
fi
|
||||||
|
if test "@CURL_DISABLE_TFTP@" != "1"; then
|
||||||
|
echo "TFTP"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
--version)
|
--version)
|
||||||
echo libcurl @VERSION@
|
echo libcurl @VERSION@
|
||||||
exit 0
|
exit 0
|
||||||
@@ -123,8 +148,7 @@ while test $# -gt 0; do
|
|||||||
|
|
||||||
*)
|
*)
|
||||||
echo "unknown option: $1"
|
echo "unknown option: $1"
|
||||||
usage
|
usage 1
|
||||||
exit 1
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
shift
|
shift
|
||||||
|
|||||||
@@ -20,6 +20,13 @@
|
|||||||
)
|
)
|
||||||
"Curl C Programming Style")
|
"Curl C Programming Style")
|
||||||
|
|
||||||
|
(defun curl-code-cleanup ()
|
||||||
|
"no docs"
|
||||||
|
(interactive)
|
||||||
|
(untabify (point-min) (point-max))
|
||||||
|
(delete-trailing-whitespace)
|
||||||
|
)
|
||||||
|
|
||||||
;; Customizations for all of c-mode, c++-mode, and objc-mode
|
;; Customizations for all of c-mode, c++-mode, and objc-mode
|
||||||
(defun curl-c-mode-common-hook ()
|
(defun curl-c-mode-common-hook ()
|
||||||
"Curl C mode hook"
|
"Curl C mode hook"
|
||||||
@@ -28,12 +35,12 @@
|
|||||||
(setq tab-width 8
|
(setq tab-width 8
|
||||||
indent-tabs-mode nil ; Use spaces. Not tabs.
|
indent-tabs-mode nil ; Use spaces. Not tabs.
|
||||||
comment-column 40
|
comment-column 40
|
||||||
c-font-lock-extra-types (append '("bool" "CURL" "CURLcode" "ssize_t" "size_t" "socklen_t" "fd_set" "time_t" "curl_off_t" "curl_socket_t" "in_addr_t" "CURLSHcode" "CURLMcode"))
|
c-font-lock-extra-types (append '("bool" "CURL" "CURLcode" "ssize_t" "size_t" "socklen_t" "fd_set" "time_t" "curl_off_t" "curl_socket_t" "in_addr_t" "CURLSHcode" "CURLMcode" "Curl_addrinfo"))
|
||||||
)
|
)
|
||||||
;; keybindings for C, C++, and Objective-C. We can put these in
|
;; keybindings for C, C++, and Objective-C. We can put these in
|
||||||
;; c-mode-base-map because of inheritance ...
|
;; c-mode-base-map because of inheritance ...
|
||||||
(define-key c-mode-base-map "\M-q" 'c-fill-paragraph)
|
(define-key c-mode-base-map "\M-q" 'c-fill-paragraph)
|
||||||
(define-key c-mode-base-map "\M-m" 'delete-trailing-whitespace)
|
(define-key c-mode-base-map "\M-m" 'curl-code-cleanup)
|
||||||
(setq c-recognize-knr-p nil)
|
(setq c-recognize-knr-p nil)
|
||||||
;;; (add-hook 'write-file-hooks 'delete-trailing-whitespace t)
|
;;; (add-hook 'write-file-hooks 'delete-trailing-whitespace t)
|
||||||
(setq show-trailing-whitespace t)
|
(setq show-trailing-whitespace t)
|
||||||
|
|||||||
@@ -17,22 +17,31 @@ archives, but must be downloaded and installed separately.
|
|||||||
|
|
||||||
Ada95
|
Ada95
|
||||||
|
|
||||||
Writtten by Andreas Almroth.
|
Writtten by Andreas Almroth
|
||||||
http://www.almroth.com/adacurl/index.html
|
http://www.almroth.com/adacurl/index.html
|
||||||
|
|
||||||
Basic
|
Basic
|
||||||
|
|
||||||
ScriptBasic bindings to libcurl. Writtten by Peter Verhas.
|
ScriptBasic bindings to libcurl. Writtten by Peter Verhas
|
||||||
http://scriptbasic.com/
|
http://scriptbasic.com/
|
||||||
|
|
||||||
|
C
|
||||||
|
libcurl is a C library in itself!
|
||||||
|
http://curl.haxx.se/libcurl/
|
||||||
|
|
||||||
C++
|
C++
|
||||||
|
|
||||||
Written by Jean-Philippe Barrette-LaPierre.
|
Written by Jean-Philippe Barrette-LaPierre
|
||||||
http://www.sourceforge.net/projects/curlpp
|
http://rrette.com/curlpp.html
|
||||||
|
|
||||||
|
Ch
|
||||||
|
|
||||||
|
Written by Stephen Nestinger and Jonathan Rogado
|
||||||
|
http://chcurl.sourceforge.net/
|
||||||
|
|
||||||
Cocoa
|
Cocoa
|
||||||
|
|
||||||
Written by Dan Wood.
|
Written by Dan Wood
|
||||||
http://curlhandle.sourceforge.net/
|
http://curlhandle.sourceforge.net/
|
||||||
|
|
||||||
D
|
D
|
||||||
@@ -42,26 +51,49 @@ D
|
|||||||
|
|
||||||
Dylan
|
Dylan
|
||||||
|
|
||||||
Written by Chris Double.
|
Written by Chris Double
|
||||||
http://dylanlibs.sourceforge.net/
|
http://dylanlibs.sourceforge.net/
|
||||||
|
|
||||||
Euphoria
|
Euphoria
|
||||||
|
|
||||||
Written by Ray Smith.
|
Written by Ray Smith
|
||||||
http://rays-web.com/eulibcurl.htm
|
http://rays-web.com/eulibcurl.htm
|
||||||
|
|
||||||
Ferite
|
Ferite
|
||||||
|
Written by Paul Querna
|
||||||
http://www.ferite.org/
|
http://www.ferite.org/
|
||||||
|
|
||||||
|
Gambas
|
||||||
|
http://gambas.sourceforge.net
|
||||||
|
|
||||||
|
glib/GTK+
|
||||||
|
Written by Richard Atterer
|
||||||
|
http://atterer.net/glibcurl/
|
||||||
|
|
||||||
Java
|
Java
|
||||||
|
|
||||||
Written by Daniel Stenberg.
|
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
|
||||||
|
|
||||||
|
Written by Jeffrey Phillips
|
||||||
|
http://forge.novell.com/modules/xfmod/project/?libcurl-mono
|
||||||
|
|
||||||
|
.NET
|
||||||
|
|
||||||
|
libcurl-net Written by Jeffrey Phillips
|
||||||
|
http://sourceforge.net/projects/libcurl-net/
|
||||||
|
|
||||||
Object-Pascal
|
Object-Pascal
|
||||||
|
|
||||||
@@ -70,7 +102,7 @@ Object-Pascal
|
|||||||
|
|
||||||
O'Caml
|
O'Caml
|
||||||
|
|
||||||
Written by Lars Nilsson.
|
Written by Lars Nilsson
|
||||||
http://sourceforge.net/projects/ocurl/
|
http://sourceforge.net/projects/ocurl/
|
||||||
|
|
||||||
Pascal
|
Pascal
|
||||||
@@ -80,40 +112,64 @@ Pascal
|
|||||||
|
|
||||||
Perl
|
Perl
|
||||||
|
|
||||||
Maintained by Cris Bailiff.
|
Maintained by Cris Bailiff
|
||||||
http://curl.haxx.se/libcurl/perl/
|
http://curl.haxx.se/libcurl/perl/
|
||||||
|
|
||||||
PHP
|
PHP
|
||||||
|
|
||||||
Written by Sterling Hughes.
|
Written by Sterling Hughes
|
||||||
http://curl.haxx.se/libcurl/php/
|
http://curl.haxx.se/libcurl/php/
|
||||||
|
|
||||||
PostgreSQL
|
PostgreSQL
|
||||||
|
|
||||||
Written by Gian Paolo Ciceri.
|
Written by Gian Paolo Ciceri
|
||||||
http://gborg.postgresql.org/project/pgcurl/projdisplay.php
|
http://gborg.postgresql.org/project/pgcurl/projdisplay.php
|
||||||
|
|
||||||
Python
|
Python
|
||||||
|
|
||||||
Written by Kjetil Jacobsen.
|
PycURL is written by Kjetil Jacobsen
|
||||||
http://pycurl.sourceforge.net/
|
http://pycurl.sourceforge.net/
|
||||||
|
|
||||||
|
R
|
||||||
|
|
||||||
|
RCurl is written by Duncan Temple Lang
|
||||||
|
http://www.omegahat.org/RCurl/
|
||||||
|
|
||||||
Rexx
|
Rexx
|
||||||
|
|
||||||
Written Mark Hessling.
|
Written Mark Hessling
|
||||||
http://rexxcurl.sourceforge.net/
|
http://rexxcurl.sourceforge.net/
|
||||||
|
|
||||||
Ruby
|
Ruby
|
||||||
|
|
||||||
Written by Hirotaka Matsuyuki.
|
Written by Hirotaka Matsuyuki
|
||||||
http://www.d1.dion.ne.jp/~matuyuki/ruby.html
|
http://www.d1.dion.ne.jp/~matuyuki/ruby.html
|
||||||
|
|
||||||
Scheme
|
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
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
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/
|
||||||
|
|
||||||
|
wxWidgets
|
||||||
|
|
||||||
|
Written by Casey O'Donnell
|
||||||
|
http://homepage.mac.com/codonnell/wxcurldav/
|
||||||
|
|||||||
@@ -138,15 +138,15 @@ How To Make a Patch
|
|||||||
|
|
||||||
If you have modified a single file, try something like:
|
If you have modified a single file, try something like:
|
||||||
|
|
||||||
diff -u undmodified-file.c my-changed-one.c > my-fixes.diff
|
diff -u unmodified-file.c my-changed-one.c > my-fixes.diff
|
||||||
|
|
||||||
If you have modified several files, possibly in different directories, you
|
If you have modified several files, possibly in different directories, you
|
||||||
can use diff recursively:
|
can use diff recursively:
|
||||||
|
|
||||||
diff -ur curl-original-dir curl-modfied-sources-dir > my-fixes.diff
|
diff -ur curl-original-dir curl-modified-sources-dir > my-fixes.diff
|
||||||
|
|
||||||
The GNU diff and GNU patch tools exist for virtually all platforms, including
|
The GNU diff and GNU patch tools exist for virtually all platforms, including
|
||||||
all kinds of unixes and Windows:
|
all kinds of Unixes and Windows:
|
||||||
|
|
||||||
For unix-like operating systems:
|
For unix-like operating systems:
|
||||||
|
|
||||||
|
|||||||
205
docs/DISTRO-DILEMMA
Normal file
205
docs/DISTRO-DILEMMA
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
Date: September 30, 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.14.1 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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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
|
||||||
393
docs/FAQ
393
docs/FAQ
@@ -1,4 +1,4 @@
|
|||||||
Updated: March 16, 2004 (http://curl.haxx.se/docs/faq.html)
|
Updated: August 26, 2005 (http://curl.haxx.se/docs/faq.html)
|
||||||
_ _ ____ _
|
_ _ ____ _
|
||||||
___| | | | _ \| |
|
___| | | | _ \| |
|
||||||
/ __| | | | |_) | |
|
/ __| | | | |_) | |
|
||||||
@@ -10,20 +10,20 @@ FAQ
|
|||||||
1. Philosophy
|
1. Philosophy
|
||||||
1.1 What is cURL?
|
1.1 What is cURL?
|
||||||
1.2 What is libcurl?
|
1.2 What is libcurl?
|
||||||
1.3 What is cURL not?
|
1.3 What is curl not?
|
||||||
1.4 When will you make curl do XXXX ?
|
1.4 When will you make curl do XXXX ?
|
||||||
1.5 Who makes cURL?
|
1.5 Who makes curl?
|
||||||
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?
|
||||||
|
|
||||||
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
|
||||||
2.1.1. native linker doesn't find OpenSSL
|
2.1.1 native linker doesn't find OpenSSL
|
||||||
2.1.2. only the libssl lib is missing
|
2.1.2 only the libssl lib is missing
|
||||||
2.2 Does curl work/build with other SSL libraries?
|
2.2 Does curl work/build with other SSL libraries?
|
||||||
2.3 Where can I find a copy of LIBEAY32.DLL?
|
2.3 Where can I find a copy of LIBEAY32.DLL?
|
||||||
2.4 Does cURL support Socks (RFC 1928) ?
|
2.4 Does curl support Socks (RFC 1928) ?
|
||||||
|
|
||||||
3. Usage Problems
|
3. Usage Problems
|
||||||
3.1 curl: (1) SSL is disabled, https: not supported
|
3.1 curl: (1) SSL is disabled, https: not supported
|
||||||
@@ -41,6 +41,9 @@ FAQ
|
|||||||
3.13 Why does my single/double quotes fail?
|
3.13 Why does my single/double quotes fail?
|
||||||
3.14 Does curl support javascript or pac (automated proxy config)?
|
3.14 Does curl support javascript or pac (automated proxy config)?
|
||||||
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.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.
|
||||||
@@ -61,6 +64,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?
|
||||||
@@ -70,6 +75,11 @@ FAQ
|
|||||||
5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ?
|
5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ?
|
||||||
5.6 What about Keep-Alive or persistent connections?
|
5.6 What about Keep-Alive or persistent connections?
|
||||||
5.7 Link errors when building libcurl on Windows!
|
5.7 Link errors when building libcurl on Windows!
|
||||||
|
5.8 libcurl.so.3: open failed: No such file or directory
|
||||||
|
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?
|
||||||
@@ -79,30 +89,56 @@ FAQ
|
|||||||
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?
|
||||||
|
|
||||||
|
7. PHP/CURL Issues
|
||||||
|
7.1 What is PHP/CURL?
|
||||||
|
7.2 Who write PHP/CURL?
|
||||||
|
7.3 Can I perform multiple requests using the same handle?
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
1. Philosophy
|
1. Philosophy
|
||||||
|
|
||||||
1.1 What is cURL?
|
1.1 What is cURL?
|
||||||
|
|
||||||
cURL (or simply just 'curl') is a command line tool for getting or sending
|
cURL is the name of the project. The name is a play on 'Client for URLs',
|
||||||
files using URL syntax. The name is a play on 'Client for URLs', originally
|
originally with URL spelled in uppercase to make it obvious it deals with
|
||||||
with URL spelled in uppercase to make it obvious it deals with URLs. The
|
URLs. The fact it can also be pronounced 'see URL' also helped, it works as
|
||||||
fact it can also be pronounced 'see URL' also helped, it works as an
|
an abbreviation for "Client URL Request Library" or why not the recursive
|
||||||
abbrivation for "Client URL Request Library" or why not the recursive
|
|
||||||
version: "Curl URL Request Library".
|
version: "Curl URL Request Library".
|
||||||
|
|
||||||
Curl supports a range of common Internet protocols, currently including
|
The cURL project produces two products:
|
||||||
HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and FILE.
|
|
||||||
|
|
||||||
We spell it cURL or just curl. We pronounce it with an initial k sound:
|
libcurl
|
||||||
[kurl].
|
|
||||||
|
|
||||||
NOTE: there are numerous sub-projects and related projects that also use the
|
A free and easy-to-use client-side URL transfer library, supporting FTP,
|
||||||
word curl in the project names in various combinations, but you should take
|
FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and LDAP. libcurl supports
|
||||||
|
HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP
|
||||||
|
form based upload, proxies, cookies, user+password authentication, file
|
||||||
|
transfer resume, http proxy tunneling and more!
|
||||||
|
|
||||||
|
libcurl is highly portable, it builds and works identically on numerous
|
||||||
|
platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX,
|
||||||
|
IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac
|
||||||
|
OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS and more...
|
||||||
|
|
||||||
|
libcurl is free, thread-safe, IPv6 compatible, feature rich, well
|
||||||
|
supported and fast.
|
||||||
|
|
||||||
|
curl
|
||||||
|
|
||||||
|
A command line tool for getting or sending files using URL syntax.
|
||||||
|
|
||||||
|
Since curl uses libcurl, it supports a range of common Internet protocols,
|
||||||
|
currently including HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and
|
||||||
|
FILE.
|
||||||
|
|
||||||
|
We pronounce curl and cURL with an initial k sound: [kurl].
|
||||||
|
|
||||||
|
There are numerous sub-projects and related projects that also use the word
|
||||||
|
curl in the project names in various combinations, but you should take
|
||||||
notice that this FAQ is directed at the command-line tool named curl (and
|
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?
|
||||||
|
|
||||||
@@ -112,7 +148,7 @@ 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.
|
||||||
|
|
||||||
1.3 What is cURL not?
|
1.3 What is curl not?
|
||||||
|
|
||||||
Curl is *not* a wget clone. That is a common misconception. Never, during
|
Curl is *not* a wget clone. That is a common misconception. Never, during
|
||||||
curl's development, have we intended curl to replace wget or compete on its
|
curl's development, have we intended curl to replace wget or compete on its
|
||||||
@@ -127,7 +163,7 @@ FAQ
|
|||||||
script (or write a new program that interfaces libcurl) and do it.
|
script (or write a new program that interfaces libcurl) and do it.
|
||||||
|
|
||||||
Curl is not a PHP tool, even though it works perfectly well when used from
|
Curl is not a PHP tool, even though it works perfectly well when used from
|
||||||
or with PHP.
|
or with PHP (when using the PHP/CURL module).
|
||||||
|
|
||||||
Curl is not a single-OS program. Curl exists, compiles, builds and runs
|
Curl is not a single-OS program. Curl exists, compiles, builds and runs
|
||||||
under a wide range of operating systems, including all modern Unixes (and a
|
under a wide range of operating systems, including all modern Unixes (and a
|
||||||
@@ -161,35 +197,32 @@ FAQ
|
|||||||
* If you write the code, chances are bigger that it will get into curl
|
* If you write the code, chances are bigger that it will get into curl
|
||||||
faster.
|
faster.
|
||||||
|
|
||||||
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 400 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.
|
||||||
|
|
||||||
1.6 What do you get for making cURL?
|
1.6 What do you get for making curl?
|
||||||
|
|
||||||
Project cURL is entirely free and open. No person gets paid for developing
|
Project cURL is entirely free and open. No person gets paid for developing
|
||||||
curl. We do this voluntarily on our spare time.
|
(lib)curl. We do this voluntarily on our spare time.
|
||||||
|
|
||||||
We get some help from companies. Contactor Data hosts the curl web site,
|
We get some help from companies. Contactor Data hosts the curl web site,
|
||||||
Haxx owns the curl web site's domain and sourceforge.net hosts project
|
Haxx owns the curl web site's domain and sourceforge.net hosts project
|
||||||
services we take advantage from, like the bug tracker.
|
services we take advantage from, like the bug tracker. Also, some companies
|
||||||
|
have sponsored certain parts of the development in the past and I hope some
|
||||||
|
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?
|
||||||
|
|
||||||
@@ -220,14 +253,20 @@ 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.
|
||||||
|
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
This may be because of several reasons.
|
This may be because of several reasons.
|
||||||
|
|
||||||
2.1.1. native linker doesn't find openssl
|
2.1.1 native linker doesn't find openssl
|
||||||
|
|
||||||
Affected platforms:
|
Affected platforms:
|
||||||
Solaris (native cc compiler)
|
Solaris (native cc compiler)
|
||||||
@@ -249,7 +288,7 @@ FAQ
|
|||||||
|
|
||||||
Solution submitted by: Bob Allison <allisonb@users.sourceforge.net>
|
Solution submitted by: Bob Allison <allisonb@users.sourceforge.net>
|
||||||
|
|
||||||
2.1.2. only the libssl lib is missing
|
2.1.2 only the libssl lib is missing
|
||||||
|
|
||||||
If all include files and the libcrypto lib is present, with only the
|
If all include files and the libcrypto lib is present, with only the
|
||||||
libssl being missing according to configure, this is mostly likely because
|
libssl being missing according to configure, this is mostly likely because
|
||||||
@@ -262,14 +301,14 @@ FAQ
|
|||||||
configure. Make sure that you remove the config.cache file before you
|
configure. Make sure that you remove the config.cache file before you
|
||||||
rerun configure with the new flags.
|
rerun configure with the new flags.
|
||||||
|
|
||||||
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!
|
||||||
|
|
||||||
2.3. Where can I find a copy of LIBEAY32.DLL?
|
2.3 Where can I find a copy of LIBEAY32.DLL?
|
||||||
|
|
||||||
That is an OpenSSL binary built for Windows.
|
That is an OpenSSL binary built for Windows.
|
||||||
|
|
||||||
@@ -278,14 +317,14 @@ FAQ
|
|||||||
accurate and up-to-date pointers to recent OpenSSL DLLs and other binary
|
accurate and up-to-date pointers to recent OpenSSL DLLs and other binary
|
||||||
packages.
|
packages.
|
||||||
|
|
||||||
2.4. Does cURL support Socks (RFC 1928) ?
|
2.4 Does curl support Socks (RFC 1928) ?
|
||||||
|
|
||||||
Yes, SOCKS5 is supported when curl is built with IPv6 support disabled.
|
Yes, SOCKS5 is supported.
|
||||||
|
|
||||||
|
|
||||||
3. Usage problems
|
3. Usage problems
|
||||||
|
|
||||||
3.1. curl: (1) SSL is disabled, https: not supported
|
3.1 curl: (1) SSL is disabled, https: not supported
|
||||||
|
|
||||||
If you get this output when trying to get anything from a https:// server,
|
If you get this output when trying to get anything from a https:// server,
|
||||||
it means that the configure script couldn't find all libs and include files
|
it means that the configure script couldn't find all libs and include files
|
||||||
@@ -300,13 +339,13 @@ FAQ
|
|||||||
Also, check out the other paragraph in this FAQ labeled "configure doesn't
|
Also, check out the other paragraph in this FAQ labeled "configure doesn't
|
||||||
find OpenSSL even when it is installed".
|
find OpenSSL even when it is installed".
|
||||||
|
|
||||||
3.2. How do I tell curl to resume a transfer?
|
3.2 How do I tell curl to resume a transfer?
|
||||||
|
|
||||||
Curl supports resumed transfers both ways on both FTP and HTTP.
|
Curl supports resumed transfers both ways on both FTP and HTTP.
|
||||||
|
|
||||||
Try the -C option.
|
Try the -C option.
|
||||||
|
|
||||||
3.3. Why doesn't my posting using -F work?
|
3.3 Why doesn't my posting using -F work?
|
||||||
|
|
||||||
You can't simply use -F or -d at your choice. The web server that will
|
You can't simply use -F or -d at your choice. The web server that will
|
||||||
receive your post assumes one of the formats. If the form you're trying to
|
receive your post assumes one of the formats. If the form you're trying to
|
||||||
@@ -320,7 +359,7 @@ FAQ
|
|||||||
through the mailing list archives for old postings and questions regarding
|
through the mailing list archives for old postings and questions regarding
|
||||||
this.
|
this.
|
||||||
|
|
||||||
3.4. How do I tell curl to run custom FTP commands?
|
3.4 How do I tell curl to run custom FTP commands?
|
||||||
|
|
||||||
You can tell curl to perform optional commands both before and/or after a
|
You can tell curl to perform optional commands both before and/or after a
|
||||||
file transfer. Study the -Q/--quote option.
|
file transfer. Study the -Q/--quote option.
|
||||||
@@ -329,13 +368,13 @@ FAQ
|
|||||||
FTP commands without transferring anything. Therefore you must always specify
|
FTP commands without transferring anything. Therefore you must always specify
|
||||||
a URL to transfer to/from even when doing custom FTP commands.
|
a URL to transfer to/from even when doing custom FTP commands.
|
||||||
|
|
||||||
3.5. How can I disable the Pragma: nocache header?
|
3.5 How can I disable the Pragma: nocache header?
|
||||||
|
|
||||||
You can change all internally generated headers by adding a replacement with
|
You can change all internally generated headers by adding a replacement with
|
||||||
the -H/--header option. By adding a header with empty contents you safely
|
the -H/--header option. By adding a header with empty contents you safely
|
||||||
disable that one. Use -H "Pragma:" to disable that specific header.
|
disable that one. Use -H "Pragma:" to disable that specific header.
|
||||||
|
|
||||||
3.6. Does curl support ASP, XML, XHTML or HTML version Y?
|
3.6 Does curl support ASP, XML, XHTML or HTML version Y?
|
||||||
|
|
||||||
To curl, all contents are alike. It doesn't matter how the page was
|
To curl, all contents are alike. It doesn't matter how the page was
|
||||||
generated. It may be ASP, PHP, Perl, shell-script, SSI or plain
|
generated. It may be ASP, PHP, Perl, shell-script, SSI or plain
|
||||||
@@ -344,7 +383,7 @@ FAQ
|
|||||||
|
|
||||||
See also item 3.14 regarding javascript.
|
See also item 3.14 regarding javascript.
|
||||||
|
|
||||||
3.7. Can I use curl to delete/rename a file through FTP?
|
3.7 Can I use curl to delete/rename a file through FTP?
|
||||||
|
|
||||||
Yes. You specify custom FTP commands with -Q/--quote.
|
Yes. You specify custom FTP commands with -Q/--quote.
|
||||||
|
|
||||||
@@ -360,6 +399,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
|
||||||
@@ -369,8 +410,7 @@ FAQ
|
|||||||
|
|
||||||
Find out more about which languages that support curl directly, and how to
|
Find out more about which languages that support curl directly, and how to
|
||||||
install and use them, in the libcurl section of the curl web site:
|
install and use them, in the libcurl section of the curl web site:
|
||||||
|
http://curl.haxx.se/libcurl/
|
||||||
http://curl.haxx.se/libcurl/
|
|
||||||
|
|
||||||
In February 2003, there are interfaces available for the following
|
In February 2003, there are interfaces available for the following
|
||||||
languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal,
|
languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal,
|
||||||
@@ -443,28 +483,73 @@ FAQ
|
|||||||
|
|
||||||
Some work-arounds usually suggested to overcome this javascript dependency:
|
Some work-arounds usually suggested to overcome this javascript dependency:
|
||||||
|
|
||||||
- Depending on the javascript complexity, write up a script that
|
- Depending on the javascript complexity, write up a script that
|
||||||
translates it to another language and execute that.
|
translates it to another language and execute that.
|
||||||
|
|
||||||
- Read the javascript code and rewrite the same logic in another language.
|
- Read the javascript code and rewrite the same logic in another language.
|
||||||
|
|
||||||
- Implement a javascript interpreter, people have successfully used the
|
- Implement a javascript interpreter, people have successfully used the
|
||||||
Mozilla javascript engine in the past.
|
Mozilla javascript engine in the past.
|
||||||
|
|
||||||
- Ask your admins to stop this, for a static proxy setup or similar.
|
- Ask your admins to stop this, for a static proxy setup or similar.
|
||||||
|
|
||||||
3.15 Can I do recursive fetches with curl?
|
3.15 Can I do recursive fetches with curl?
|
||||||
|
|
||||||
No. curl itself has no code that performs recursive operations, such as
|
No. curl itself has no code that performs recursive operations, such as
|
||||||
those performed by wget.
|
those performed by wget and similar tools.
|
||||||
|
|
||||||
There exist wrapper scripts with that functionality (for example the
|
There exist wrapper scripts with that functionality (for example the
|
||||||
curlmirror perl script), and you can write programs based on libcurl to do
|
curlmirror perl script), and you can write programs based on libcurl to do
|
||||||
it, but the command line tool curl itself cannot.
|
it, but the command line tool curl itself cannot.
|
||||||
|
|
||||||
|
3.16 What certificates do I need when I use SSL?
|
||||||
|
|
||||||
|
There are three different kinds of "certificates" to keep track of when we
|
||||||
|
talk about using SSL-based protocols (HTTPS or FTPS) using curl or libcurl.
|
||||||
|
|
||||||
|
- Client certificate. The server you communicate may require that you can
|
||||||
|
provide this in order to prove that you actually are who you claim to be.
|
||||||
|
If the server doesn't require this, you don't need a client certificate.
|
||||||
|
|
||||||
|
- Server certificate. The server you communicate with has a server
|
||||||
|
certificate. You can and should verify this certificate to make sure that
|
||||||
|
you are truly talking to the real server and not a server impersonating
|
||||||
|
it. 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.
|
||||||
|
|
||||||
|
- Certificate Authority certificate ("CA cert"). You often have several CA
|
||||||
|
certs in a CA cert bundle that can be used to verify a server certificate
|
||||||
|
that was signed by one of the authorities in the bundle. curl comes with a
|
||||||
|
default CA cert bundle. You can override the default.
|
||||||
|
|
||||||
|
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
|
||||||
|
in the first path part. List the "/tmp" dir like this:
|
||||||
|
|
||||||
|
curl ftp://ftp.sunet.se/%2ftmp/
|
||||||
|
|
||||||
|
or the not-quite-kosher-but-more-readable way, by simply starting the path
|
||||||
|
section of the URL with a slash:
|
||||||
|
|
||||||
|
curl ftp://ftp.sunet.se//tmp/
|
||||||
|
|
||||||
|
3.18 Can I use curl to send a POST/PUT and not wait for a response?
|
||||||
|
|
||||||
|
No.
|
||||||
|
|
||||||
|
|
||||||
4. Running Problems
|
4. Running Problems
|
||||||
|
|
||||||
4.1. Problems connecting to SSL servers.
|
4.1 Problems connecting to SSL servers.
|
||||||
|
|
||||||
It took a very long time before we could sort out why curl had problems to
|
It took a very long time before we could sort out why curl had problems to
|
||||||
connect to certain SSL servers when using SSLeay or OpenSSL v0.9+. The
|
connect to certain SSL servers when using SSLeay or OpenSSL v0.9+. The
|
||||||
@@ -479,7 +564,7 @@ FAQ
|
|||||||
There have also been examples where the remote server didn't like the SSLv2
|
There have also been examples where the remote server didn't like the SSLv2
|
||||||
request and instead you had to force curl to use SSLv3 with -3/--sslv3.
|
request and instead you had to force curl to use SSLv3 with -3/--sslv3.
|
||||||
|
|
||||||
4.2. Why do I get problems when I use & or % in the URL?
|
4.2 Why do I get problems when I use & or % in the URL?
|
||||||
|
|
||||||
In general unix shells, the & letter is treated special and when used, it
|
In general unix shells, the & letter is treated special and when used, it
|
||||||
runs the specified command in the background. To safely send the & as a part
|
runs the specified command in the background. To safely send the & as a part
|
||||||
@@ -497,7 +582,7 @@ FAQ
|
|||||||
pass in a POST using -d/--data you must encode it as '%25' (which then also
|
pass in a POST using -d/--data you must encode it as '%25' (which then also
|
||||||
needs the %-letter doubled on Windows machines).
|
needs the %-letter doubled on Windows machines).
|
||||||
|
|
||||||
4.3. How can I use {, }, [ or ] to specify multiple URLs?
|
4.3 How can I use {, }, [ or ] to specify multiple URLs?
|
||||||
|
|
||||||
Because those letters have a special meaning to the shell, and to be used in
|
Because those letters have a special meaning to the shell, and to be used in
|
||||||
a URL specified to curl you must quote them.
|
a URL specified to curl you must quote them.
|
||||||
@@ -511,7 +596,7 @@ FAQ
|
|||||||
|
|
||||||
curl -g 'www.site.com/weirdname[].html'
|
curl -g 'www.site.com/weirdname[].html'
|
||||||
|
|
||||||
4.4. Why do I get downloaded data even though the web page doesn't exist?
|
4.4 Why do I get downloaded data even though the web page doesn't exist?
|
||||||
|
|
||||||
Curl asks remote servers for the page you specify. If the page doesn't exist
|
Curl asks remote servers for the page you specify. If the page doesn't exist
|
||||||
at the server, the HTTP protocol defines how the server should respond and
|
at the server, the HTTP protocol defines how the server should respond and
|
||||||
@@ -562,14 +647,17 @@ FAQ
|
|||||||
slash. Try the same operation again _with_ the trailing URL, or use the
|
slash. Try the same operation again _with_ the trailing URL, or use the
|
||||||
-L/--location option to follow the redirection.
|
-L/--location option to follow the redirection.
|
||||||
|
|
||||||
4.6. Can you tell me what error code 142 means?
|
4.6 Can you tell me what error code 142 means?
|
||||||
|
|
||||||
All error codes that are larger than the highest documented error code means
|
All curl error codes are described at the end of the man page, in the
|
||||||
|
section called "EXIT CODES".
|
||||||
|
|
||||||
|
Error codes that are larger than the highest documented error code means
|
||||||
that curl has exited due to a crash. This is a serious error, and we
|
that curl has exited due to a crash. This is a serious error, and we
|
||||||
appreciate a detailed bug report from you that describes how we could go
|
appreciate a detailed bug report from you that describes how we could go
|
||||||
ahead and repeat this!
|
ahead and repeat this!
|
||||||
|
|
||||||
4.7. How do I keep user names and passwords secret in Curl command lines?
|
4.7 How do I keep user names and passwords secret in Curl command lines?
|
||||||
|
|
||||||
This problem has two sides:
|
This problem has two sides:
|
||||||
|
|
||||||
@@ -603,7 +691,7 @@ FAQ
|
|||||||
If there is a bug, read the BUGS document first. Then report it as described
|
If there is a bug, read the BUGS document first. Then report it as described
|
||||||
in there.
|
in there.
|
||||||
|
|
||||||
4.9. Curl can't authenticate to the server that requires NTLM?
|
4.9 Curl can't authenticate to the server that requires NTLM?
|
||||||
|
|
||||||
This is supported in curl 7.10.6 or later. No earlier curl version knows
|
This is supported in curl 7.10.6 or later. No earlier curl version knows
|
||||||
of this magic.
|
of this magic.
|
||||||
@@ -651,18 +739,49 @@ 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:
|
||||||
|
|
||||||
|
1 - Meta tags. You can write a HTML tag that will cause the browser to
|
||||||
|
redirect to another given URL after a certain time.
|
||||||
|
|
||||||
|
2 - 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
|
||||||
|
|
||||||
5.1. Is libcurl thread-safe?
|
5.1 Is libcurl thread-safe?
|
||||||
|
|
||||||
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?
|
||||||
|
|
||||||
@@ -687,7 +806,7 @@ FAQ
|
|||||||
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 *)realloc(mem->memory, mem->size + realsize + 1);
|
mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
|
||||||
@@ -743,6 +862,92 @@ FAQ
|
|||||||
|
|
||||||
(Provided by Andrew Francis)
|
(Provided by Andrew Francis)
|
||||||
|
|
||||||
|
When building an application that uses the static libcurl library, you must
|
||||||
|
add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
|
||||||
|
dynamic import symbols. If you get linker error like "unknown symbol
|
||||||
|
__imp__curl_easy_init ..." you have linked against the wrong (static)
|
||||||
|
library. If you want to use the libcurl.dll and import lib, you don't need
|
||||||
|
any extra CFLAGS, but use one of the import libraries below. These are the
|
||||||
|
libraries produced by the various lib/Makefile.* files:
|
||||||
|
|
||||||
|
Target: static lib. import lib for libcurl*.dll.
|
||||||
|
-----------------------------------------------------------
|
||||||
|
MingW: libcurl.a libcurldll.a
|
||||||
|
MSVC (release): libcurl.lib libcurl_imp.lib
|
||||||
|
MSVC (debug): libcurld.lib libcurld_imp.lib
|
||||||
|
Borland: libcurl.lib libcurl_imp.lib
|
||||||
|
|
||||||
|
|
||||||
|
5.8 libcurl.so.3: open failed: No such file or directory
|
||||||
|
|
||||||
|
This is an error message you might get when you try to run a program linked
|
||||||
|
with a shared version of libcurl and your run-time linker (ld.so) couldn't
|
||||||
|
find the shared library named libcurl.so.3.
|
||||||
|
|
||||||
|
You need to make sure that ld.so finds libcurl.so.3. You can do that
|
||||||
|
multiple ways, and it differs somewhat between different operating systems,
|
||||||
|
but they are usually:
|
||||||
|
|
||||||
|
* Add an option to the linker command line that specify the hard-coded path
|
||||||
|
the run-time linker should check for the lib (usually -R)
|
||||||
|
|
||||||
|
* Set an environment variable (LD_LIBRARY_PATH for example) where ld.so
|
||||||
|
should check for libs
|
||||||
|
|
||||||
|
* Adjust the system's config to check for libs in the directory where you've
|
||||||
|
put the dir (like Linux's /etc/ld.so.conf)
|
||||||
|
|
||||||
|
'man ld.so' and 'man ld' will tell you more details
|
||||||
|
|
||||||
|
5.9 How does libcurl resolve host names?
|
||||||
|
|
||||||
|
libcurl includes a number of different name resolve functions:
|
||||||
|
|
||||||
|
- The non-ipv6 resolver that can use one out of four host name resolve calls
|
||||||
|
(depending on what your system supports):
|
||||||
|
|
||||||
|
A - gethostbyname()
|
||||||
|
B - gethostbyname_r() with 3 arguments
|
||||||
|
C - gethostbyname_r() with 5 arguments
|
||||||
|
D - gethostbyname_r() with 6 arguments
|
||||||
|
|
||||||
|
- The ipv6-resolver that uses getaddrinfo()
|
||||||
|
|
||||||
|
- The c-ares based name resolver that uses the c-ares library for resolves.
|
||||||
|
|
||||||
|
- The Windows threaded resolver. It use:
|
||||||
|
|
||||||
|
A - gethostbyname() on plain ipv4 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 a WRITEFUNCTION to receive the data, or possibly set
|
||||||
|
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
|
||||||
|
|
||||||
@@ -751,32 +956,32 @@ 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.)
|
||||||
|
|
||||||
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!
|
||||||
|
|
||||||
Since libcurl may be distributed under the MIT/X derivate license, it can be
|
Since libcurl may be distributed under the MIT/X derivate license, it can be
|
||||||
used together with GPL in any software.
|
used together with GPL in any software.
|
||||||
|
|
||||||
6.2. I have a closed-source program, can I use the libcurl library?
|
6.2 I have a closed-source program, can I use the libcurl library?
|
||||||
|
|
||||||
Yes!
|
Yes!
|
||||||
|
|
||||||
libcurl does not put any restrictions on the program that uses the library.
|
libcurl does not put any restrictions on the program that uses the library.
|
||||||
|
|
||||||
6.3. I have a BSD licensed program, can I use the libcurl library?
|
6.3 I have a BSD licensed program, can I use the libcurl library?
|
||||||
|
|
||||||
Yes!
|
Yes!
|
||||||
|
|
||||||
libcurl does not put any restrictions on the program that uses the library.
|
libcurl does not put any restrictions on the program that uses the library.
|
||||||
|
|
||||||
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?
|
||||||
|
|
||||||
Yes!
|
Yes!
|
||||||
|
|
||||||
The LGPL license doesn't clash with other licenses.
|
The LGPL license doesn't clash with other licenses.
|
||||||
|
|
||||||
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?
|
||||||
|
|
||||||
Yes!
|
Yes!
|
||||||
|
|
||||||
@@ -784,7 +989,7 @@ FAQ
|
|||||||
the sources, on the condition that the copyright texts in the sources are
|
the sources, on the condition that the copyright texts in the sources are
|
||||||
left intact.
|
left intact.
|
||||||
|
|
||||||
6.6. Can you please change the curl/libcurl license to XXXX?
|
6.6 Can you please change the curl/libcurl license to XXXX?
|
||||||
|
|
||||||
No.
|
No.
|
||||||
|
|
||||||
@@ -794,3 +999,31 @@ FAQ
|
|||||||
we want on curl/libcurl and it does not spread to other programs or
|
we want on curl/libcurl and it does not spread to other programs or
|
||||||
libraries that use it. 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.
|
||||||
|
|
||||||
|
7. PHP/CURL Issues
|
||||||
|
|
||||||
|
7.1 What is PHP/CURL?
|
||||||
|
|
||||||
|
The module for PHP that makes it possible for PHP programs to access curl-
|
||||||
|
functions from within PHP.
|
||||||
|
|
||||||
|
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?
|
||||||
|
|
||||||
|
PHP/CURL is a module that comes with the regular PHP package. It depends and
|
||||||
|
uses libcurl, so you need to have libcurl installed properly first before
|
||||||
|
PHP/CURL can be used. PHP/CURL is written by Sterling Hughes.
|
||||||
|
|
||||||
|
7.3 Can I perform multiple requests using the same handle?
|
||||||
|
|
||||||
|
Yes - at least in PHP version 4.3.8 and later (this has been known to not
|
||||||
|
work in earlier versions, but the exact version when it started to work is
|
||||||
|
unknown to me).
|
||||||
|
|
||||||
|
After a transfer, you just set new options in the handle and make another
|
||||||
|
transfer. This will make libcurl to re-use the same connection if it can.
|
||||||
|
|||||||
@@ -6,26 +6,33 @@
|
|||||||
|
|
||||||
FEATURES
|
FEATURES
|
||||||
|
|
||||||
Misc
|
curl tool
|
||||||
- full URL syntax
|
- config file support
|
||||||
|
- multiple URLs in a single command line
|
||||||
|
- range "globbing" support: [0-13], {one,two,three}
|
||||||
|
- multiple file upload on a single command line
|
||||||
|
- custom maximum transfer rate
|
||||||
|
- redirectable stderr
|
||||||
|
|
||||||
|
libcurl supports
|
||||||
|
- full URL syntax with no length limit
|
||||||
- custom maximum download time
|
- custom maximum download time
|
||||||
- custom least download speed acceptable
|
- custom least download speed acceptable
|
||||||
- custom output result after completion
|
- custom output result after completion
|
||||||
- multiple URLs
|
|
||||||
- guesses protocol from host name unless specified
|
- guesses protocol from host name unless specified
|
||||||
- uses .netrc
|
- uses .netrc
|
||||||
- progress bar/time specs while downloading
|
- progress bar/time specs while downloading
|
||||||
- "standard" proxy environment variables support
|
- "standard" proxy environment variables support
|
||||||
- config file support
|
|
||||||
- compiles on win32 (reported builds on 40+ operating systems)
|
- compiles on win32 (reported builds on 40+ operating systems)
|
||||||
- redirectable stderr
|
|
||||||
- selectable network interface for outgoing traffic
|
- selectable network interface for outgoing traffic
|
||||||
- IPv6 support
|
- IPv6 support on unix and Windows
|
||||||
- persistant connections
|
- persistant connections
|
||||||
- socks5 support
|
- socks5 support
|
||||||
- supports user name + password in proxy environment variables
|
- supports user name + password in proxy environment variables
|
||||||
- operations through proxy "tunnel" (using CONNECT)
|
- operations through proxy "tunnel" (using CONNECT)
|
||||||
- supports transfers of large files (>2GB and >4GB)
|
- supports large files (>2GB and >4GB) both upload/download
|
||||||
|
- replacable memory functions (malloc, free, realloc, etc)
|
||||||
|
- asynchronous name resolving (*6)
|
||||||
|
|
||||||
HTTP
|
HTTP
|
||||||
- HTTP/1.1 compliant (optionally uses 1.0)
|
- HTTP/1.1 compliant (optionally uses 1.0)
|
||||||
@@ -35,7 +42,7 @@ HTTP
|
|||||||
- POST
|
- POST
|
||||||
- multipart formpost (RFC1867-style)
|
- multipart formpost (RFC1867-style)
|
||||||
- authentication: Basic, Digest, NTLM(*1), GSS-Negotiate/Negotiate(*3) and
|
- authentication: Basic, Digest, NTLM(*1), GSS-Negotiate/Negotiate(*3) and
|
||||||
SPNEGO (*4)
|
SPNEGO (*4) to server and proxy
|
||||||
- resume (both GET and PUT)
|
- resume (both GET and PUT)
|
||||||
- follow redirects
|
- follow redirects
|
||||||
- maximum amount of redirects to follow
|
- maximum amount of redirects to follow
|
||||||
@@ -55,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
|
||||||
@@ -80,6 +87,8 @@ FTP
|
|||||||
- via http-proxy
|
- via http-proxy
|
||||||
- all operations can be tunneled through a http-proxy
|
- all operations can be tunneled through a http-proxy
|
||||||
- customizable to retrieve file modification date
|
- customizable to retrieve file modification date
|
||||||
|
- third party transfers
|
||||||
|
- no dir depth limit
|
||||||
|
|
||||||
FTPS (*1)
|
FTPS (*1)
|
||||||
- explicit ftps:// support that use SSL on both connections
|
- explicit ftps:// support that use SSL on both connections
|
||||||
@@ -103,12 +112,16 @@ GOPHER
|
|||||||
|
|
||||||
FILE
|
FILE
|
||||||
- URL support
|
- URL support
|
||||||
|
- "uploads"
|
||||||
|
- resume
|
||||||
|
|
||||||
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
|
||||||
|
*7 = requires OpenSSL specificly, as GnuTLS only supports SSLv3 and TLSv1
|
||||||
|
|||||||
23
docs/HISTORY
23
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.
|
||||||
|
|
||||||
@@ -128,3 +130,24 @@ December 2003, full-fledged SSL for FTP is supported.
|
|||||||
January 2004: curl 7.11.0 introduced large file support.
|
January 2004: curl 7.11.0 introduced large file support.
|
||||||
|
|
||||||
June 2004: curl 7.12.0 introduced IDN support. 10 official web mirrors.
|
June 2004: curl 7.12.0 introduced IDN support. 10 official web mirrors.
|
||||||
|
|
||||||
|
August 2004:
|
||||||
|
Curl and libcurl 7.12.1
|
||||||
|
|
||||||
|
Public curl release number: 82
|
||||||
|
Releases counted from the very beginning: 109
|
||||||
|
Available command line options: 96
|
||||||
|
Available curl_easy_setopt() options: 120
|
||||||
|
Number of public functions in libcurl: 36
|
||||||
|
Amount of public web site mirrors: 12
|
||||||
|
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.
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
Steps To Perform When Building a Public Release
|
|
||||||
|
|
||||||
* "make distcheck"
|
|
||||||
|
|
||||||
* ./maketgz
|
|
||||||
then upload the 3 curl packages maketgz created
|
|
||||||
|
|
||||||
* update these files:
|
|
||||||
www/_download.html
|
|
||||||
www/_changes.html
|
|
||||||
www/_newslog.html
|
|
||||||
www/Makefile
|
|
||||||
|
|
||||||
* commit the web changes
|
|
||||||
|
|
||||||
* 'cvs commit'
|
|
||||||
|
|
||||||
* 'cvs tag'
|
|
||||||
|
|
||||||
* write the release announcement, including:
|
|
||||||
- changes / bugfixes
|
|
||||||
- other curl-related news
|
|
||||||
- contributors
|
|
||||||
|
|
||||||
* mail release-announcement to curl-announce and curl-users
|
|
||||||
274
docs/INSTALL
274
docs/INSTALL
@@ -79,8 +79,18 @@ UNIX
|
|||||||
env CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \
|
env CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \
|
||||||
./configure
|
./configure
|
||||||
|
|
||||||
If your SSL library was compiled with rsaref (usually for use in the United
|
If you have shared SSL libs installed in a directory where your run-time
|
||||||
States), you may also need to set:
|
linker doesn't find them (which usually causes configure failures), you can
|
||||||
|
provide the -R option to ld on some operating systems to set a hard-coded
|
||||||
|
path to the run-time linker:
|
||||||
|
|
||||||
|
LDFLAGS=-R/usr/local/ssl/lib ./configure --with-ssl
|
||||||
|
|
||||||
|
Another option to the previous trick, is to set LD_LIBRARY_PATH or edit the
|
||||||
|
/etc/ld.so.conf file.
|
||||||
|
|
||||||
|
If your SSL library was compiled with rsaref (this was common in the past
|
||||||
|
when used in the United States), you may also need to set:
|
||||||
|
|
||||||
LIBS=-lRSAglue -lrsaref
|
LIBS=-lRSAglue -lrsaref
|
||||||
(as suggested by Doug Kaufman)
|
(as suggested by Doug Kaufman)
|
||||||
@@ -92,7 +102,7 @@ UNIX
|
|||||||
|
|
||||||
CC=cc ./configure
|
CC=cc ./configure
|
||||||
or
|
or
|
||||||
env Cc=cc ./configure
|
env CC=cc ./configure
|
||||||
|
|
||||||
To force a static library compile, disable the shared library creation
|
To force a static library compile, disable the shared library creation
|
||||||
by running configure like:
|
by running configure like:
|
||||||
@@ -158,17 +168,9 @@ Win32
|
|||||||
Make the sources in the src/ drawer be a "win32 console application"
|
Make the sources in the src/ drawer be a "win32 console application"
|
||||||
project. Name it curl.
|
project. Name it curl.
|
||||||
|
|
||||||
With VC++, add 'ws2_32.lib' to the link libs when you build curl!
|
|
||||||
Borland seems to do that itself magically. Of course you have to make
|
|
||||||
sure it links with the libcurl too!
|
|
||||||
|
|
||||||
For VC++ 6, there's an included Makefile.vc6 that should be possible
|
For VC++ 6, there's an included Makefile.vc6 that should be possible
|
||||||
to use out-of-the-box.
|
to use out-of-the-box.
|
||||||
|
|
||||||
Microsoft note: add /Zm200 to the compiler options to increase the
|
|
||||||
compiler's memory allocation limit, as the hugehelp.c won't compile
|
|
||||||
due to "too long puts string".
|
|
||||||
|
|
||||||
|
|
||||||
With SSL:
|
With SSL:
|
||||||
|
|
||||||
@@ -189,28 +191,33 @@ Win32
|
|||||||
Microsoft command line style
|
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
|
Please read the OpenSSL documentation on how to compile and install
|
||||||
the OpenSSL libraries. The build process of OpenSSL generates the
|
the OpenSSL libraries. The build process of OpenSSL generates the
|
||||||
libeay32.dll and ssleay32.dll files in the out32dll subdirectory in
|
libeay32.dll and ssleay32.dll files in the out32dll subdirectory in
|
||||||
the OpenSSL home directory. OpenSSL static libraries (libeay32.lib,
|
the OpenSSL home directory. OpenSSL static libraries (libeay32.lib,
|
||||||
ssleay32.lib, RSAglue.lib) are created in the out32 subdirectory.
|
ssleay32.lib, RSAglue.lib) are created in the out32 subdirectory.
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Before running nmake define the OPENSSL_PATH environment variable with
|
Before running nmake define the OPENSSL_PATH environment variable with
|
||||||
the root/base directory of OpenSSL, for example:
|
the root/base directory of OpenSSL, for example:
|
||||||
|
|
||||||
set OPENSSL_PATH=c:\openssl-0.9.7a
|
set OPENSSL_PATH=c:\openssl-0.9.7d
|
||||||
|
|
||||||
lib/Makefile.vc6 depends on 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.1.4
|
|
||||||
|
|
||||||
Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root
|
Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root
|
||||||
directory. 'nmake vc-ssl' will create a libcurl static and dynamic
|
directory. 'nmake vc-ssl' will create a libcurl static and dynamic
|
||||||
@@ -219,10 +226,11 @@ Win32
|
|||||||
version is a standalone executable not requiring any DLL at
|
version is a standalone executable not requiring any DLL at
|
||||||
runtime. This make method requires that you have the static OpenSSL
|
runtime. This make method requires that you have the static OpenSSL
|
||||||
libraries available in OpenSSL's out32 subdirectory.
|
libraries available in OpenSSL's out32 subdirectory.
|
||||||
'nmake vc-ssl-dll' creates the libcurl dynamic library and
|
'nmake vc-ssl-dll' creates the libcurl dynamic library and
|
||||||
links curl.exe against libcurl and OpenSSL dynamically.
|
links curl.exe against libcurl and OpenSSL dynamically.
|
||||||
This executable requires libcurl.dll and the OpenSSL DLLs
|
This executable requires libcurl.dll and the OpenSSL DLLs
|
||||||
at runtime.
|
at runtime.
|
||||||
|
Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support.
|
||||||
|
|
||||||
Microsoft / Borland style
|
Microsoft / Borland style
|
||||||
-------------------------
|
-------------------------
|
||||||
@@ -285,6 +293,13 @@ Win32
|
|||||||
- Add defines to Project/Settings/C/C++/General/Preprocessor Definitions
|
- Add defines to Project/Settings/C/C++/General/Preprocessor Definitions
|
||||||
in the curllib.dsw/curllib.dsp Visual C++ 6 IDE project.
|
in the curllib.dsw/curllib.dsp Visual C++ 6 IDE project.
|
||||||
|
|
||||||
|
|
||||||
|
Important (with SSL or not):
|
||||||
|
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
|
||||||
========
|
========
|
||||||
|
|
||||||
@@ -355,18 +370,18 @@ VMS
|
|||||||
+----+------------+-------------+---+
|
+----+------------+-------------+---+
|
||||||
|
|
||||||
With the Ctrl-bits an application can tell if part or the whole message has
|
With the Ctrl-bits an application can tell if part or the whole message has
|
||||||
allready been printed from the program, DCL doesn't need to print it again.
|
already been printed from the program, DCL doesn't need to print it again.
|
||||||
|
|
||||||
Facility - basicaly the program ID. A code assigned to the program
|
Facility - basically the program ID. A code assigned to the program
|
||||||
the name can be fetched from external or internal message libraries
|
the name can be fetched from external or internal message libraries
|
||||||
Errorcode - the errodes assigned by the application
|
Errorcode - the errodes assigned by the application
|
||||||
Sev. - severity: Even = error, off = non error
|
Sev. - severity: Even = error, off = non error
|
||||||
0 = Warning
|
0 = Warning
|
||||||
1 = Success
|
1 = Success
|
||||||
2 = Error
|
2 = Error
|
||||||
3 = Information
|
3 = Information
|
||||||
4 = Fatal
|
4 = Fatal
|
||||||
<5-7> reserved.
|
<5-7> reserved.
|
||||||
|
|
||||||
This all presents itself with:
|
This all presents itself with:
|
||||||
%<FACILITY>-<SeV>-<Errorname>, <Error message>
|
%<FACILITY>-<SeV>-<Errorname>, <Error message>
|
||||||
@@ -379,7 +394,7 @@ VMS
|
|||||||
|
|
||||||
This was all compiled with:
|
This was all compiled with:
|
||||||
|
|
||||||
Compaq C V6.2-003 on OpenVMS Alpha V7.1-1H2
|
Compaq C V6.2-003 on OpenVMS Alpha V7.1-1H2
|
||||||
|
|
||||||
So far for porting notes as of:
|
So far for porting notes as of:
|
||||||
13-jul-2001
|
13-jul-2001
|
||||||
@@ -389,7 +404,7 @@ QNX
|
|||||||
===
|
===
|
||||||
(This section was graciously brought to us by David Bentham)
|
(This section was graciously brought to us by David Bentham)
|
||||||
|
|
||||||
As QNX is targetted for resource constrained environments, the QNX headers
|
As QNX is targeted for resource constrained environments, the QNX headers
|
||||||
set conservative limits. This includes the FD_SETSIZE macro, set by default
|
set conservative limits. This includes the FD_SETSIZE macro, set by default
|
||||||
to 32. Socket descriptors returned within the CURL library may exceed this,
|
to 32. Socket descriptors returned within the CURL library may exceed this,
|
||||||
resulting in memory faults/SIGSEGV crashes when passed into select(..)
|
resulting in memory faults/SIGSEGV crashes when passed into select(..)
|
||||||
@@ -399,44 +414,6 @@ QNX
|
|||||||
libcurl, by overriding CFLAGS during configure, example
|
libcurl, by overriding CFLAGS during configure, example
|
||||||
# configure CFLAGS='-DFD_SETSIZE=64 -g -O2'
|
# configure CFLAGS='-DFD_SETSIZE=64 -g -O2'
|
||||||
|
|
||||||
CROSS COMPILE
|
|
||||||
=============
|
|
||||||
|
|
||||||
(This section was graciously brought to us by Jim Duey, 23-oct-2001)
|
|
||||||
|
|
||||||
Download and unpack the cURL package. Version should be 7.9.1 or later.
|
|
||||||
|
|
||||||
'cd' to the new directory. (ie. curl-7.9.1-pre4)
|
|
||||||
|
|
||||||
Set environment variables to point to the cross-compile toolchain and call
|
|
||||||
configure with any options you need. Be sure and specify the '--host' and
|
|
||||||
'--build' parameters at configuration time. The following script is an
|
|
||||||
example of cross-compiling for the IBM 405GP PowerPC processor using the
|
|
||||||
toolchain from MonteVista for Hardhat Linux.
|
|
||||||
|
|
||||||
(begin script)
|
|
||||||
|
|
||||||
#! /bin/sh
|
|
||||||
|
|
||||||
export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin
|
|
||||||
export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include"
|
|
||||||
export AR=ppc_405-ar
|
|
||||||
export AS=ppc_405-as
|
|
||||||
export LD=ppc_405-ld
|
|
||||||
export RANLIB=ppc_405-ranlib
|
|
||||||
export CC=ppc_405-gcc
|
|
||||||
export NM=ppc_405-nm
|
|
||||||
|
|
||||||
configure --target=powerpc-hardhat-linux \
|
|
||||||
--host=powerpc-hardhat-linux \
|
|
||||||
--build=i586-pc-linux-gnu \
|
|
||||||
--prefix=/opt/hardhat/devkit/ppc/405/target/usr/local \
|
|
||||||
--exec-prefix=/usr/local
|
|
||||||
|
|
||||||
(end script)
|
|
||||||
|
|
||||||
The '--prefix' parameter specifies where cURL will be installed. If
|
|
||||||
'configure' completes successfully, do 'make' and 'make install' as usual.
|
|
||||||
|
|
||||||
RISC OS
|
RISC OS
|
||||||
=======
|
=======
|
||||||
@@ -472,6 +449,113 @@ AmigaOS
|
|||||||
you can find a precompiled package at http://amiga.sourceforge.net/OpenSSL/
|
you can find a precompiled package at http://amiga.sourceforge.net/OpenSSL/
|
||||||
|
|
||||||
|
|
||||||
|
NetWare
|
||||||
|
=======
|
||||||
|
|
||||||
|
To compile curl.nlm / libcurl.nlm you need:
|
||||||
|
- either any gcc / nlmconv, or CodeWarrior 7 PDK 4 or later.
|
||||||
|
- gnu make and awk running on the platform you compile on;
|
||||||
|
native Win32 versions can be downloaded from:
|
||||||
|
http://www.gknw.com/development/prgtools/
|
||||||
|
- recent Novell LibC SDK available from:
|
||||||
|
http://developer.novell.com/ndk/libc.htm
|
||||||
|
- optional zlib sources (at the moment only dynamic linking with zlib.imp);
|
||||||
|
sources with NetWare Makefile can be obtained from:
|
||||||
|
http://www.gknw.com/mirror/zlib/
|
||||||
|
- optional OpenSSL sources (version 0.9.8 or later which builds with BSD);
|
||||||
|
|
||||||
|
Set a search path to your compiler, linker and tools; on Linux make
|
||||||
|
sure that the var OSTYPE contains the string 'linux'; and then type
|
||||||
|
'make netware' from the top source directory; other tagets available
|
||||||
|
are 'netware-ssl', 'netware-ssl-zlib', 'netware-zlib' and 'netware-ares';
|
||||||
|
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
|
||||||
|
with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...
|
||||||
|
Any help in testing appreciated!
|
||||||
|
Builds automatically created 8 times a day from current CVS are here:
|
||||||
|
http://www.gknw.com/mirror/curl/autobuilds/
|
||||||
|
the status of these builds can be viewed at the autobuild table:
|
||||||
|
http://curl.haxx.se/auto/
|
||||||
|
|
||||||
|
|
||||||
|
CROSS COMPILE
|
||||||
|
=============
|
||||||
|
|
||||||
|
(This section was graciously brought to us by Jim Duey, with additions by
|
||||||
|
Dan Fandrich)
|
||||||
|
|
||||||
|
Download and unpack the cURL package. Version should be 7.9.1 or later.
|
||||||
|
|
||||||
|
'cd' to the new directory. (e.g. cd curl-7.12.3)
|
||||||
|
|
||||||
|
Set environment variables to point to the cross-compile toolchain and call
|
||||||
|
configure with any options you need. Be sure and specify the '--host' and
|
||||||
|
'--build' parameters at configuration time. The following script is an
|
||||||
|
example of cross-compiling for the IBM 405GP PowerPC processor using the
|
||||||
|
toolchain from MonteVista for Hardhat Linux.
|
||||||
|
|
||||||
|
(begin script)
|
||||||
|
|
||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin
|
||||||
|
export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include"
|
||||||
|
export AR=ppc_405-ar
|
||||||
|
export AS=ppc_405-as
|
||||||
|
export LD=ppc_405-ld
|
||||||
|
export RANLIB=ppc_405-ranlib
|
||||||
|
export CC=ppc_405-gcc
|
||||||
|
export NM=ppc_405-nm
|
||||||
|
|
||||||
|
./configure --target=powerpc-hardhat-linux \
|
||||||
|
--host=powerpc-hardhat-linux \
|
||||||
|
--build=i586-pc-linux-gnu \
|
||||||
|
--prefix=/opt/hardhat/devkit/ppc/405/target/usr/local \
|
||||||
|
--exec-prefix=/usr/local
|
||||||
|
|
||||||
|
(end script)
|
||||||
|
|
||||||
|
You may also need to provide a parameter like '--with-random=/dev/urandom'
|
||||||
|
to configure as it cannot detect the presence of a random number
|
||||||
|
generating device for a target system. The '--prefix' parameter
|
||||||
|
specifies where cURL will be installed. If 'configure' completes
|
||||||
|
successfully, do 'make' and 'make install' as usual.
|
||||||
|
|
||||||
|
In some cases, you may be able to simplify the above commands to as
|
||||||
|
little as:
|
||||||
|
|
||||||
|
./configure --host=ARCH-OS
|
||||||
|
|
||||||
|
There are a number of configure options that can be used to reduce the
|
||||||
|
size of libcurl for embedded applications where binary size is an
|
||||||
|
important factor. First, be sure to set the CFLAGS environment variable
|
||||||
|
when configuring with any compiler optimization flags to reduce the
|
||||||
|
size of the binary. For gcc, this would mean at minimum:
|
||||||
|
|
||||||
|
env CFLAGS='-Os' ./configure ...
|
||||||
|
|
||||||
|
Be sure to specify as many --disable- and --without- flags on the configure
|
||||||
|
command-line as you can to disable all the libcurl features that you
|
||||||
|
know your application is not going to need. Besides specifying the
|
||||||
|
--disable-PROTOCOL flags for all the types of URLs your application
|
||||||
|
will not use, here are some other flags that can reduce the size of the
|
||||||
|
library:
|
||||||
|
|
||||||
|
--disable-ares (disables support for the ARES DNS library)
|
||||||
|
--disable-cookies (disables support for HTTP cookies)
|
||||||
|
--disable-crypto-auth (disables HTTP cryptographic authentication)
|
||||||
|
--disable-ipv6 (disables support for IPv6)
|
||||||
|
--disable-verbose (eliminates debugging strings and error code strings)
|
||||||
|
--without-libidn (disables support for the libidn DNS library)
|
||||||
|
--without-ssl (disables support for SSL/TLS)
|
||||||
|
--without-zlib (disables support for on-the-fly decompression)
|
||||||
|
|
||||||
|
You may find that statically linking libcurl to your application will
|
||||||
|
result in a lower total size.
|
||||||
|
|
||||||
|
|
||||||
PORTS
|
PORTS
|
||||||
=====
|
=====
|
||||||
This is a probably incomplete list of known hardware and operating systems
|
This is a probably incomplete list of known hardware and operating systems
|
||||||
@@ -492,31 +576,32 @@ 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
|
||||||
- i386 DOS
|
- i386 DOS
|
||||||
|
- 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
|
||||||
@@ -527,25 +612,10 @@ PORTS
|
|||||||
- s390 Linux
|
- s390 Linux
|
||||||
- XScale/PXA250 Linux 2.4
|
- XScale/PXA250 Linux 2.4
|
||||||
|
|
||||||
OpenSSL
|
Useful URLs
|
||||||
=======
|
===========
|
||||||
|
|
||||||
You'll find OpenSSL information at:
|
|
||||||
|
|
||||||
http://www.openssl.org
|
|
||||||
|
|
||||||
|
|
||||||
MingW32/Cygwin
|
|
||||||
==============
|
|
||||||
|
|
||||||
You'll find MingW32 and Cygwin information at:
|
|
||||||
|
|
||||||
http://www.mingw.org
|
|
||||||
|
|
||||||
OpenLDAP
|
|
||||||
========
|
|
||||||
|
|
||||||
You'll find OpenLDAP information at:
|
|
||||||
|
|
||||||
http://www.openldap.org
|
|
||||||
|
|
||||||
|
OpenSSL http://www.openssl.org
|
||||||
|
MingW http://www.mingw.org
|
||||||
|
OpenLDAP http://www.openldap.org
|
||||||
|
Zlib http://www.gzip.org/zlib/
|
||||||
|
|||||||
103
docs/KNOWN_BUGS
103
docs/KNOWN_BUGS
@@ -3,48 +3,107 @@ 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!
|
||||||
|
|
||||||
* If you use a very large amount of file descriptors (more than FD_SETSIZE)
|
26. NTLM authentication using SSPI (on Windows) when (lib)curl is running in
|
||||||
and then use libcurl, it might crash on its use of select() which then
|
"system context" will make it use wrong(?) user name - at least when compared
|
||||||
stores data out of bounds. Bug report #948950.
|
to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=1281867
|
||||||
|
|
||||||
* --limit-rate using -d or -F does not work. This is because the limit logic
|
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
|
||||||
|
|
||||||
|
24. Harshal Pradhan's Use-after-free with libcurl+ares. This probably occurs
|
||||||
|
because there is a pending ares callback that gets called after the
|
||||||
|
connection struct has been freed in libcurl:
|
||||||
|
http://curl.haxx.se/mail/lib-2005-08/0022.html
|
||||||
|
Fixing this properly most likely requires a new c-ares function.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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:
|
||||||
|
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>,
|
||||||
|
<password>, and <fpath> components, encoded as "%00". The problem is that
|
||||||
|
curl_unescape does not detect this, but instead returns a shortened C
|
||||||
|
string. From a strict FTP protocol standpoint, NUL is a valid character
|
||||||
|
within RFC 959 <string>, so the way to handle this correctly in curl would
|
||||||
|
be to use a data structure other than a plain C string, one that can handle
|
||||||
|
embedded NUL characters. From a practical standpoint, most FTP servers
|
||||||
|
would not meaningfully support NUL characters within RFC 959 <string>,
|
||||||
|
anyway (e.g., UNIX pathnames may not contain NUL).
|
||||||
|
|
||||||
|
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
|
||||||
|
the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the
|
||||||
|
test pass, but instead makes it fail on Solaris hosts that use its native
|
||||||
|
iconv.
|
||||||
|
|
||||||
|
13. curl version 7.12.2 fails on AIX if compiled with --enable-ares.
|
||||||
|
The workaround is to combine --enable-ares with --disable-shared
|
||||||
|
|
||||||
|
12. When connecting to a SOCKS proxy, the (connect) timeout is not properly
|
||||||
|
acknowledged after the actual TCP connect (during the SOCKS "negotiate"
|
||||||
|
phase). Pointed out by Lucas. Fix: need to select() and timeout properly.
|
||||||
|
|
||||||
|
11. Using configure --disable-[protocol] may cause 'make test' to fail for
|
||||||
|
tests using the disabled protocol(s).
|
||||||
|
|
||||||
|
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
|
||||||
|
wrongly only considers authentication if there's a user name provided.
|
||||||
|
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
|
||||||
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
|
||||||
|
|
||||||
* 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
|
||||||
manually for HTTP PUT resume to work, and then '-C [index]'.
|
manually for HTTP PUT resume to work, and then '-C [index]'.
|
||||||
|
|
||||||
* CURLOPT_USERPWD and CURLOPT_PROXYUSERPWD have no way of providing user names
|
7. CURLOPT_USERPWD and CURLOPT_PROXYUSERPWD have no way of providing user names
|
||||||
that contain a colon. This can't be fixed easily in a backwards compatible
|
that contain a colon. This can't be fixed easily in a backwards compatible
|
||||||
way without adding new options (and then, they should most probably allow
|
way without adding new options (and then, they should most probably allow
|
||||||
setting user name and password separately).
|
setting user name and password separately).
|
||||||
|
|
||||||
* libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that
|
6. libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that
|
||||||
such parts should be sent to the server as 'CWD ' (without an argument).
|
such parts should be sent to the server as 'CWD ' (without an argument).
|
||||||
The only exception to this rule, is that we knowingly break this if the
|
The only exception to this rule, is that we knowingly break this if the
|
||||||
empty part is first in the path, as then we use the double slashes to
|
empty part is first in the path, as then we use the double slashes to
|
||||||
indicate that the user wants to reach the root dir (this exception SHALL
|
indicate that the user wants to reach the root dir (this exception SHALL
|
||||||
remain even when this bug is fixed).
|
remain even when this bug is fixed).
|
||||||
|
|
||||||
* libcurl doesn't treat the content-length of compressed data properly, as
|
5. libcurl doesn't treat the content-length of compressed data properly, as
|
||||||
it seems HTTP servers send the *uncompressed* length in that header and
|
it seems HTTP servers send the *uncompressed* length in that header and
|
||||||
libcurl thinks of it as the *compressed* lenght. 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
|
||||||
|
|
||||||
* Downloading 0 (zero) bytes files over FTP will not create a zero byte file
|
3. GOPHER transfers seem broken
|
||||||
locally, which is because libcurl doesn't call the write callback with zero
|
|
||||||
bytes. Explained here: http://curl.haxx.se/mail/archive-2003-04/0143.html
|
|
||||||
|
|
||||||
* IPv6 support on AIX 4.3.3 doesn't work due to a missing sockaddr_storage
|
2. If a HTTP server responds to a HEAD request and includes a body (thus
|
||||||
struct. It has been reported to work on AIX 5.1 though.
|
|
||||||
|
|
||||||
* GOPHER transfers seem broken
|
|
||||||
|
|
||||||
* configure --disable-http is not fully supported. All other protocols seem
|
|
||||||
to work to disable.
|
|
||||||
|
|
||||||
* 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
|
||||||
immediately made to the same server again, the connection will be re-used
|
immediately made to the same server again, the connection will be re-used
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ can lead to for end users.
|
|||||||
|
|
||||||
I am not a lawyer and this is not legal advice!
|
I am not a lawyer and this is not legal advice!
|
||||||
|
|
||||||
One common dilemma is that GPL[*]-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. This particular problem was
|
accompany your license with an exception[2]. This particular problem was
|
||||||
addressed when the Modified BSD license was created, which does not have the
|
addressed when the Modified BSD license was created, which does not have the
|
||||||
annoncement clause that collides with GPL.
|
annoncement clause that collides with GPL.
|
||||||
|
|
||||||
@@ -27,21 +27,30 @@ 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
|
||||||
|
|
||||||
@@ -51,33 +60,47 @@ krb4
|
|||||||
of the code in libcurl that is written to deal with Kerberos4 likewise
|
of the code in libcurl that is written to deal with Kerberos4 likewise
|
||||||
have such a license.
|
have such a license.
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
|
|
||||||
[*] = 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
|
||||||
|
how to write such an exception to the GPL
|
||||||
|
[3] = LGPL - GNU Lesser General Public License:
|
||||||
|
http://www.gnu.org/licenses/lgpl.html
|
||||||
|
|||||||
39
docs/MANUAL
39
docs/MANUAL
@@ -170,8 +170,8 @@ UPLOADING
|
|||||||
|
|
||||||
curl -T - http://www.upload.com/myfile
|
curl -T - http://www.upload.com/myfile
|
||||||
|
|
||||||
Note that the http server must've been configured to accept PUT before this
|
Note that the http server must have been configured to accept PUT before
|
||||||
can be done successfully.
|
this can be done successfully.
|
||||||
|
|
||||||
For other ways to do http data upload, see the POST section below.
|
For other ways to do http data upload, see the POST section below.
|
||||||
|
|
||||||
@@ -299,6 +299,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
|
||||||
@@ -370,7 +377,7 @@ COOKIES
|
|||||||
curl -b headers www.example.com
|
curl -b headers www.example.com
|
||||||
|
|
||||||
While saving headers to a file is a working way to store cookies, it is
|
While saving headers to a file is a working way to store cookies, it is
|
||||||
however error-prone and not the prefered way to do this. Instead, make curl
|
however error-prone and not the preferred way to do this. Instead, make curl
|
||||||
save the incoming cookies using the well-known netscape cookie format like
|
save the incoming cookies using the well-known netscape cookie format like
|
||||||
this:
|
this:
|
||||||
|
|
||||||
@@ -388,7 +395,7 @@ COOKIES
|
|||||||
file contents. In the above command, curl will parse the header and store
|
file contents. In the above command, curl will parse the header and store
|
||||||
the cookies received from www.example.com. curl will send to the server the
|
the cookies received from www.example.com. curl will send to the server the
|
||||||
stored cookies which match the request as it follows the location. The
|
stored cookies which match the request as it follows the location. The
|
||||||
file "empty.txt" may be a non-existant file.
|
file "empty.txt" may be a nonexistent file.
|
||||||
|
|
||||||
Alas, to both read and write cookies from a netscape cookie file, you can
|
Alas, to both read and write cookies from a netscape cookie file, you can
|
||||||
set both -b and -c to use the same file:
|
set both -b and -c to use the same file:
|
||||||
@@ -417,7 +424,7 @@ PROGRESS METER
|
|||||||
Upload - the average transfer speed of the upload
|
Upload - the average transfer speed of the upload
|
||||||
Time Total - expected time to complete the operation
|
Time Total - expected time to complete the operation
|
||||||
Time Current - time passed since the invoke
|
Time Current - time passed since the invoke
|
||||||
Time Left - expected time left to completetion
|
Time Left - expected time left to completion
|
||||||
Curr.Speed - the average transfer speed the last 5 seconds (the first
|
Curr.Speed - the average transfer speed the last 5 seconds (the first
|
||||||
5 seconds of a transfer is based on less time of course.)
|
5 seconds of a transfer is based on less time of course.)
|
||||||
|
|
||||||
@@ -437,14 +444,14 @@ SPEED LIMIT
|
|||||||
curl -Y 3000 -y 60 www.far-away-site.com
|
curl -Y 3000 -y 60 www.far-away-site.com
|
||||||
|
|
||||||
This can very well be used in combination with the overall time limit, so
|
This can very well be used in combination with the overall time limit, so
|
||||||
that the above operatioin must be completed in whole within 30 minutes:
|
that the above operation must be completed in whole within 30 minutes:
|
||||||
|
|
||||||
curl -m 1800 -Y 3000 -y 60 www.far-away-site.com
|
curl -m 1800 -Y 3000 -y 60 www.far-away-site.com
|
||||||
|
|
||||||
Forcing curl not to transfer data faster than a given rate is also possible,
|
Forcing curl not to transfer data faster than a given rate is also possible,
|
||||||
which might be useful if you're using a limited bandwidth connection and you
|
which might be useful if you're using a limited bandwidth connection and you
|
||||||
don't want your transfer to use all of it (sometimes referred to as
|
don't want your transfer to use all of it (sometimes referred to as
|
||||||
"bandwith throttle").
|
"bandwidth throttle").
|
||||||
|
|
||||||
Make curl transfer data no faster than 10 kilobytes per second:
|
Make curl transfer data no faster than 10 kilobytes per second:
|
||||||
|
|
||||||
@@ -580,17 +587,17 @@ NETWORK INTERFACE
|
|||||||
|
|
||||||
Get a web page from a server using a specified port for the interface:
|
Get a web page from a server using a specified port for the interface:
|
||||||
|
|
||||||
curl --interface eth0:1 http://www.netscape.com/
|
curl --interface eth0:1 http://www.netscape.com/
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
curl --interface 192.168.1.10 http://www.netscape.com/
|
curl --interface 192.168.1.10 http://www.netscape.com/
|
||||||
|
|
||||||
HTTPS
|
HTTPS
|
||||||
|
|
||||||
Secure HTTP requires SSL libraries to be installed and used when curl is
|
Secure HTTP requires SSL libraries to be installed and used when curl is
|
||||||
built. If that is done, curl is capable of retrieving and posting documents
|
built. If that is done, curl is capable of retrieving and posting documents
|
||||||
using the HTTPS procotol.
|
using the HTTPS protocol.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
@@ -765,7 +772,7 @@ NETRC
|
|||||||
to specify name and password for commonly visited ftp sites in a file so
|
to specify name and password for commonly visited ftp sites in a file so
|
||||||
that you don't have to type them in each time you visit those sites. You
|
that you don't have to type them in each time you visit those sites. You
|
||||||
realize this is a big security risk if someone else gets hold of your
|
realize this is a big security risk if someone else gets hold of your
|
||||||
passwords, so therefor most unix programs won't read this file unless it is
|
passwords, so therefore most unix programs won't read this file unless it is
|
||||||
only readable by yourself (curl doesn't care though).
|
only readable by yourself (curl doesn't care though).
|
||||||
|
|
||||||
Curl supports .netrc files if told so (using the -n/--netrc and
|
Curl supports .netrc files if told so (using the -n/--netrc and
|
||||||
@@ -830,22 +837,22 @@ TELNET
|
|||||||
to track when the login prompt is received and send the username and
|
to track when the login prompt is received and send the username and
|
||||||
password accordingly.
|
password accordingly.
|
||||||
|
|
||||||
PERSISTANT CONNECTIONS
|
PERSISTENT CONNECTIONS
|
||||||
|
|
||||||
Specifying multiple files on a single command line will make curl transfer
|
Specifying multiple files on a single command line will make curl transfer
|
||||||
all of them, one after the other in the specified order.
|
all of them, one after the other in the specified order.
|
||||||
|
|
||||||
libcurl will attempt to use persistant connections for the transfers so that
|
libcurl will attempt to use persistent connections for the transfers so that
|
||||||
the second transfer to the same host can use the same connection that was
|
the second transfer to the same host can use the same connection that was
|
||||||
already initiated and was left open in the previous transfer. This greatly
|
already initiated and was left open in the previous transfer. This greatly
|
||||||
decreases connection time for all but the first transfer and it makes a far
|
decreases connection time for all but the first transfer and it makes a far
|
||||||
better use of the network.
|
better use of the network.
|
||||||
|
|
||||||
Note that curl cannot use persistant connections for transfers that are used
|
Note that curl cannot use persistent connections for transfers that are used
|
||||||
in subsequence curl invokes. Try to stuff as many URLs as possible on the
|
in subsequence curl invokes. Try to stuff as many URLs as possible on the
|
||||||
same command line if they are using the same host, as that'll make the
|
same command line if they are using the same host, as that'll make the
|
||||||
transfers faster. If you use a http proxy for file transfers, practicly
|
transfers faster. If you use a http proxy for file transfers, practically
|
||||||
all transfers will be persistant.
|
all transfers will be persistent.
|
||||||
|
|
||||||
MAILING LISTS
|
MAILING LISTS
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ 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
|
$(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA
|
||||||
|
|
||||||
MAN2HTML= roffit < $< >$@
|
MAN2HTML= roffit < $< >$@
|
||||||
|
|
||||||
|
|||||||
27
docs/README.netware
Normal file
27
docs/README.netware
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
|
README.netware
|
||||||
|
|
||||||
|
Read the README file first.
|
||||||
|
|
||||||
|
Curl has been successfully compiled with gcc / nlmconv on different flavours
|
||||||
|
of Linux as well as with the official Metrowerks CodeWarrior compiler.
|
||||||
|
While not being the main development target, a continously growing share of
|
||||||
|
curl users are NetWare-based, specially also consuming the lib from PHP.
|
||||||
|
|
||||||
|
The unix-style man pages are tricky to read on windows, so therefore are all
|
||||||
|
those pages converted to HTML as well as pdf, and included in the release
|
||||||
|
archives.
|
||||||
|
|
||||||
|
The main curl.1 man page is also "built-in" in the command line tool. Use a
|
||||||
|
command line similar to this in order to extract a separate text file:
|
||||||
|
|
||||||
|
curl -M >manual.txt
|
||||||
|
|
||||||
|
Read the INSTALL file for instructions how to compile curl self.
|
||||||
|
|
||||||
|
|
||||||
@@ -1,32 +1,30 @@
|
|||||||
Peer SSL Certificate Verification
|
Peer SSL Certificate Verification
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
Since version 7.10, libcurl performs peer SSL certificate verification by
|
libcurl performs peer SSL certificate verification by default. This is done by
|
||||||
default. This is done by installing a default CA cert bundle on 'make install'
|
installing a default CA cert bundle on 'make install' (or similar), that CA
|
||||||
(or similar), that CA bundle package is used by default on operations against
|
bundle package is used by default on operations against SSL servers.
|
||||||
SSL servers.
|
|
||||||
|
|
||||||
Alas, if you communicate with HTTPS servers using certificates that are signed
|
If you communicate with HTTPS or FTPS servers using certificates that are
|
||||||
by CAs present in the bundle, you will not notice any changed behavior and you
|
signed by CAs present in the bundle, you can be sure that the remote server
|
||||||
will seamlessly get a higher security level on your SSL connections since you
|
really is the one it claims to be.
|
||||||
can be sure that the remote server really is the one it claims to be.
|
|
||||||
|
|
||||||
If the remote server uses a self-signed certificate, if you don't install
|
If the remote server uses a self-signed certificate, if you don't install
|
||||||
curl's CA cert bundle, if the server uses a certificate signed by a CA that
|
curl's CA cert bundle, if the server uses a certificate signed by a CA that
|
||||||
isn't included in the bundle or if the remoste host is an imposter
|
isn't included in the bundle or if the remote host is an impostor
|
||||||
impersonating your favourite site, and you want to transfer files from this
|
impersonating your favorite site, and you want to transfer files from this
|
||||||
server, do one of the following:
|
server, do one of the following:
|
||||||
|
|
||||||
1. Tell libcurl to *not* verify the peer. With libcurl you disable with with
|
1. Tell libcurl to *not* verify the peer. With libcurl you disable with with
|
||||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
|
||||||
|
|
||||||
With the curl command tool, you disable this with -k/--insecure.
|
With the curl command line tool, you disable this with -k/--insecure.
|
||||||
|
|
||||||
2. Get a CA certificate that can verify the remote server and use the proper
|
2. Get a CA certificate that can verify the remote server and use the proper
|
||||||
option to point out this CA cert for verification when connecting. For
|
option to point out this CA cert for verification when connecting. For
|
||||||
libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath);
|
libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath);
|
||||||
|
|
||||||
With the curl command tool: --cacert [file]
|
With the curl command line tool: --cacert [file]
|
||||||
|
|
||||||
3. Add the CA cert for your server to the existing default CA cert bundle.
|
3. Add the CA cert for your server to the existing default CA cert bundle.
|
||||||
The default path of the CA bundle installed with the curl package is:
|
The default path of the CA bundle installed with the curl package is:
|
||||||
@@ -34,15 +32,61 @@ server, do one of the following:
|
|||||||
configure with the --with-ca-bundle option pointing out the path of your
|
configure with the --with-ca-bundle option pointing out the path of your
|
||||||
choice.
|
choice.
|
||||||
|
|
||||||
Neglecting to use one of the above menthods when dealing with a server using a
|
To do this, you need to get the CA cert for your server in PEM format and
|
||||||
certficate that isn't signed by one of the certficates in the installed CA
|
then append that to your CA cert bundle.
|
||||||
|
|
||||||
|
If you use Internet Explorer, this is one way to get extract the CA cert
|
||||||
|
for a particular server:
|
||||||
|
|
||||||
|
o View the certificate by double-clicking the padlock
|
||||||
|
o Find out where the CA certificate is kept (Certificate>
|
||||||
|
Authority Information Access>URL)
|
||||||
|
o Get a copy of the crt file using curl
|
||||||
|
o Convert it from crt to PEM using the openssl tool:
|
||||||
|
openssl x509 -inform DES -in yourdownloaded.crt \
|
||||||
|
-out outcert.pem -text
|
||||||
|
o Append the 'outcert.pem' to the CA cert bundle or use it stand-alone
|
||||||
|
as described below.
|
||||||
|
|
||||||
|
(Thanks to Frankie V for this description)
|
||||||
|
|
||||||
|
If you use the 'openssl' tool, this is one way to get extract the CA cert
|
||||||
|
for a particular server:
|
||||||
|
|
||||||
|
o openssl s_client -connect xxxxx.com:443 |tee logfile
|
||||||
|
o type "QUIT", followed by the "ENTER" key
|
||||||
|
o The certificate will have "BEGIN CERTIFICATE" and "END CERTIFICATE"
|
||||||
|
markers.
|
||||||
|
o If you want to see the data in the certificate, you can do: "openssl
|
||||||
|
x509 -inform PEM -in certfile -text -out certdata" where certfile is
|
||||||
|
the cert you extracted from logfile. Look in certdata.
|
||||||
|
o If you want to trust the certificate, you can append it to your
|
||||||
|
cert_bundle or use it stand-alone as described. Just remember that the
|
||||||
|
security is no better than the way you obtained the certificate.
|
||||||
|
|
||||||
|
(Thanks to Doug Kaufman for this description)
|
||||||
|
|
||||||
|
4. If you're using the curl command line tool, you can specify your own CA
|
||||||
|
cert path by setting the environment variable CURL_CA_BUNDLE to the path
|
||||||
|
of your choice.
|
||||||
|
|
||||||
|
If you're using the curl command line tool on Windows, curl will search
|
||||||
|
for a CA cert file named "curl-ca-bundle.crt" in these directories and in
|
||||||
|
this order:
|
||||||
|
1. application's directory
|
||||||
|
2. current working directory
|
||||||
|
3. Windows System directory (e.g. C:\windows\system32)
|
||||||
|
4. Windows Directory (e.g. C:\windows)
|
||||||
|
5. all directories along %PATH%
|
||||||
|
|
||||||
|
5. Get a better/different/newer CA cert bundle! One option is to extract the
|
||||||
|
one a recent Mozilla browser uses, by following the instruction found
|
||||||
|
here:
|
||||||
|
|
||||||
|
http://curl.haxx.se/docs/caextract.html
|
||||||
|
|
||||||
|
Neglecting to use one of the above methods when dealing with a server using a
|
||||||
|
certificate that isn't signed by one of the certificates in the installed CA
|
||||||
cert bundle, will cause SSL to report an error ("certificate verify failed")
|
cert bundle, will cause SSL to report an error ("certificate verify failed")
|
||||||
during the handshake and SSL will then refuse further communication with that
|
during the handshake and SSL will then refuse further communication with that
|
||||||
server.
|
server.
|
||||||
|
|
||||||
This procedure has been deemed The Right Thing even though it adds this extra
|
|
||||||
trouble for some users, since it adds security to a majority of the SSL
|
|
||||||
connections that previously weren't really secure. It turned out many people
|
|
||||||
were using previous versions of curl/libcurl without realizing the need for
|
|
||||||
the CA cert options to get truly secure SSL connections.
|
|
||||||
|
|
||||||
|
|||||||
551
docs/THANKS
551
docs/THANKS
@@ -1,100 +1,457 @@
|
|||||||
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>
|
Alexander Krasnostavsky
|
||||||
Simon Dick <simond@totally.irrelevant.org>
|
Alexander Zhuravlev
|
||||||
Oren Tirosh <oren@monty.hishome.net>
|
Alexis Carvalho
|
||||||
Steven G. Johnson <stevenj@alum.mit.edu>
|
Andi Jahja
|
||||||
Gilbert Ramirez Jr. <gram@verdict.uthscsa.edu>
|
Andreas Damm
|
||||||
Andr<EFBFBD>s Garc<72>a <ornalux@redestb.es>
|
Andreas Olsson
|
||||||
Douglas E. Wegscheid <wegscd@whirlpool.com>
|
Andreas Rieke
|
||||||
Mark Butler <butlerm@xmission.com>
|
Andres Garcia
|
||||||
Eric Thelin <eric@generation-i.com>
|
Andrew Bushnell
|
||||||
Marc Boucher <marc@mbsi.ca>
|
Andrew Francis
|
||||||
Greg Onufer <Greg.Onufer@Eng.Sun.COM>
|
Andrew Fuller
|
||||||
Doug Kaufman <dkaufman@rahul.net>
|
Andr<EFBFBD>s Garc<72>a
|
||||||
David Eriksson <david@2good.com>
|
Andy Cedilnik
|
||||||
Ralph Beckmann <rabe@uni-paderborn.de>
|
Andy Serpa
|
||||||
T. Yamada <tai@imasy.or.jp>
|
Angus Mackay
|
||||||
Lars J. Aas <larsa@sim.no>
|
Antoine Calando
|
||||||
J<EFBFBD>rn Hartroth <Joern.Hartroth@computer.org>
|
Anton Kalmykov
|
||||||
Matthew Clarke <clamat@van.maves.ca>
|
Arkadiusz Miskiewicz
|
||||||
Linus Nielsen Feltzing <linus@haxx.se>
|
Augustus Saunders
|
||||||
Felix von Leitner <felix@convergence.de>
|
Avery Fay
|
||||||
Dan Zitter <dzitter@zitter.net>
|
Ben Greear
|
||||||
Jongki Suwandi <Jongki.Suwandi@eng.sun.com>
|
Benjamin Gerard
|
||||||
Chris Maltby <chris@aurema.com>
|
Bertrand Demiddelaer
|
||||||
Ron Zapp <rzapper@yahoo.com>
|
Bjorn Reese
|
||||||
Paul Marquis <pmarquis@iname.com>
|
Bj<EFBFBD>rn Stenberg
|
||||||
Ellis Pritchard <ellis@citria.com>
|
Bob Schader
|
||||||
Damien Adant <dams@usa.net>
|
Brad Burdick
|
||||||
Chris <cbayliss@csc.come>
|
Brent Beardsley
|
||||||
Marco G. Salvagno <mgs@whiz.cjb.net>
|
Brian Akins
|
||||||
Paul Marquis <pmarquis@iname.com>
|
Brian R Duffy
|
||||||
David LeBlanc <dleblanc@qnx.com>
|
Bruce Mitchener
|
||||||
Rich Gray at Plus Technologies
|
Bryan Henderson
|
||||||
Luong Dinh Dung <u8luong@lhsystems.hu>
|
Bryan Henderson
|
||||||
Torsten Foertsch <torsten.foertsch@gmx.net>
|
Bryan Kemp
|
||||||
Kristian K<>hntopp <kris@koehntopp.de>
|
Caolan McNamara
|
||||||
Fred Noz <FNoz@siac.com>
|
Casey O'Donnell
|
||||||
Caolan McNamara <caolan@csn.ul.ie>
|
Chih-Chung Chang
|
||||||
Albert Chin-A-Young <china@thewrittenword.com>
|
Chris "Bob Bob"
|
||||||
Stephen Kick <skick@epicrealm.com>
|
Chris Combes
|
||||||
Martin Hedenfalk <mhe@stacken.kth.se>
|
Chris Gaukroger
|
||||||
Richard Prescott <rip at step.polymtl.ca>
|
Chris Maltby
|
||||||
Jason S. Priebe <priebe@wral-tv.com>
|
Christian Kurz
|
||||||
T. Bharath <TBharath@responsenetworks.com>
|
Christian Robottom Reis
|
||||||
Alexander Kourakos <awk@users.sourceforge.net>
|
Christophe Demory
|
||||||
James Griffiths <griffiths_james@yahoo.com>
|
Christophe Legry
|
||||||
Loic Dachary <loic@senga.org>
|
Christopher R. Palmer
|
||||||
Robert Weaver <robert.weaver@sabre.com>
|
Clarence Gardner
|
||||||
Ingo Ralf Blum <ingoralfblum@ingoralfblum.com>
|
Clifford Wolf
|
||||||
Jun-ichiro itojun Hagino <itojun@iijlab.net>
|
Cody Jones
|
||||||
Frederic Lepied <flepied@mandrakesoft.com>
|
Colin Watson
|
||||||
Georg Horn <horn@koblenz-net.de>
|
Colm Buckley
|
||||||
Cris Bailiff <c.bailiff@awayweb.com>
|
Cory Nelson
|
||||||
Sterling Hughes <sterling@designmultimedia.com>
|
Craig Davison
|
||||||
S. Moonesamy
|
Craig Markwardt
|
||||||
Ingo Wilken <iw@WWW.Ecce-Terram.DE>
|
Cris Bailiff
|
||||||
Pawel A. Gajda <mis@k2.net.pl>
|
Cyrill Osterwalder
|
||||||
|
Damien Adant
|
||||||
|
Dan Becker
|
||||||
|
Dan C
|
||||||
|
Dan Fandrich
|
||||||
|
Dan Torop
|
||||||
|
Dan Zitter
|
||||||
|
Daniel Stenberg
|
||||||
|
Daniel at touchtunes
|
||||||
|
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 LeBlanc
|
||||||
|
David Odin
|
||||||
|
David Phillips
|
||||||
|
David Shaw
|
||||||
|
David Tarendash
|
||||||
|
David Thiel
|
||||||
|
Detlef Schmier
|
||||||
|
Diego Casorran
|
||||||
|
Dimitris Sarris
|
||||||
|
Dinar
|
||||||
|
Dirk Eddelbuettel
|
||||||
|
Dirk Manske
|
||||||
|
Dolbneff A.V
|
||||||
|
Domenico Andreoli
|
||||||
|
Dominick Meglio
|
||||||
|
Doug Kaufman
|
||||||
|
Doug Porter
|
||||||
|
Douglas E. Wegscheid
|
||||||
|
Douglas R. Horner
|
||||||
|
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
|
||||||
|
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 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 Wilkinson
|
||||||
|
Jason S. Priebe
|
||||||
|
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 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
|
||||||
|
Karol Pietrzak
|
||||||
|
Keith MacDonald
|
||||||
|
Keith McGuigan
|
||||||
|
Ken Hirsch
|
||||||
|
Ken Rastatter
|
||||||
|
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 Mealling
|
||||||
|
Michal Bonino
|
||||||
|
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
|
||||||
|
Niels van Tongeren
|
||||||
|
Nikita Schmidt
|
||||||
|
Nodak Sodak
|
||||||
|
Norbert Novotny
|
||||||
|
Oren Tirosh
|
||||||
|
P R Schaffner
|
||||||
Patrick Bihan-Faou
|
Patrick Bihan-Faou
|
||||||
Nico Baggus <Nico.Baggus@mail.ing.nl>
|
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 Sylvester
|
||||||
|
Peter Todd
|
||||||
|
Peter Verhas
|
||||||
|
Peter Wullinger
|
||||||
|
Peteris Krumins
|
||||||
|
Phil Karn
|
||||||
|
Philip Gladstone
|
||||||
|
Philippe Hameau
|
||||||
|
Philippe Raoult
|
||||||
|
Pierre
|
||||||
|
Puneet Pawaia
|
||||||
|
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
|
||||||
|
Sebastien Willemijns
|
||||||
Sergio Ballestrero
|
Sergio Ballestrero
|
||||||
Andrew Francis <locust@familyhealth.com.au>
|
Seshubabu Pasam
|
||||||
Tomasz Lacki <Tomasz.Lacki@primark.pl>
|
Shard
|
||||||
Georg Huettenegger <georg@ist.org>
|
Shawn Poulson
|
||||||
John Lask <johnlask@hotmail.com>
|
Siddhartha Prakash Jain
|
||||||
Eric Lavigne <erlavigne@wanadoo.fr>
|
Simon Dick
|
||||||
Marcus Webster <marcus.webster@phocis.com>
|
Simon Josefsson
|
||||||
G<EFBFBD>tz Babin-Ebell <babin<69>ebell@trustcenter.de>
|
Simon Liu
|
||||||
Andreas Damm <andreas-sourceforge@radab.org>
|
Spiridonoff A.V
|
||||||
Jacky Lam <sylam@emsoftltd.com>
|
Stadler Stephan
|
||||||
James Gallagher <jgallagher@gso.uri.edu>
|
Stefan Ulrich
|
||||||
Kjetil Jacobsen <kjetilja@cs.uit.no>
|
Stephan Bergmann
|
||||||
Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
Stephen Kick
|
||||||
Miklos Nemeth <mnemeth@kfkisystems.com>
|
Stephen More
|
||||||
Kevin Roth <kproth@users.sourceforge.net>
|
Sterling Hughes
|
||||||
Ralph Mitchell <rmitchell@eds.com>
|
Steve Green
|
||||||
Dan Fandrich <dan@coneharvesters.com>
|
Steve Lhomme
|
||||||
Jean-Philippe Barrette-LaPierre <jpb@rrette.com>
|
Steve Marx
|
||||||
Richard Bramante <RBramante@on.com>
|
Steve Oliphant
|
||||||
Daniel Kouril <kouril@ics.muni.cz>
|
Steven Bazyl
|
||||||
Dirk Manske <dm@nettraffic.de>
|
Steven G. Johnson
|
||||||
David Meyer <meyer@paracel.com>
|
Stoned Elipot
|
||||||
Dominick Meglio <codemstr@ptd.net>
|
Sven Neuhaus
|
||||||
Gisle Vanem <gvanem@broadpark.no>
|
S<EFBFBD>bastien Willemijns
|
||||||
Giuseppe Attardi <attardi@di.unipi.it>
|
T. Bharath
|
||||||
Tor Arntsen <tor@spacetec.no>
|
T. Yamada
|
||||||
David Byron <DByron@everdreamcorp.com>
|
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
|
||||||
|
Ulrich Zadow
|
||||||
|
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
|
||||||
|
Yarram Sunil
|
||||||
|
Zvi Har'El
|
||||||
|
nk
|
||||||
|
swalkaus at yahoo.com
|
||||||
|
|||||||
149
docs/TODO
149
docs/TODO
@@ -15,10 +15,10 @@ TODO
|
|||||||
LIBCURL
|
LIBCURL
|
||||||
|
|
||||||
* Introduce an interface to libcurl that allows applications to easier get to
|
* Introduce an interface to libcurl that allows applications to easier get to
|
||||||
know what cookies that are received. Pushing interface that calls a
|
know what cookies that are received. CURLINFO_COOKIELIST to get a
|
||||||
callback on each received cookie? Querying interface that asks about
|
curl_slist with cookies (netscape/mozilla cookie file formatted), and
|
||||||
existing cookies? We probably need both. Enable applications to modify
|
CURLOPT_COOKIELIST to set a list of cookies (using the same format).
|
||||||
existing cookies as well. http://curl.haxx.se/dev/COOKIES
|
http://curl.haxx.se/mail/lib-2004-12/0195.html
|
||||||
|
|
||||||
* Introduce another callback interface for upload/download that makes one
|
* Introduce another callback interface for upload/download that makes one
|
||||||
less copy of data and thus a faster operation.
|
less copy of data and thus a faster operation.
|
||||||
@@ -26,22 +26,28 @@ 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
|
||||||
|
|
||||||
* Option to set the SO_KEEPALIVE socket option to make libcurl notice and
|
* Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
|
||||||
disconnect very long time idle connections.
|
SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
|
||||||
|
To support ipv6 interface addresses properly.
|
||||||
|
|
||||||
* When posting multipart forms, we should _not_ create the whole data chunk
|
* Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and
|
||||||
in memory before the upload starts but do it in a "streaming" manner to
|
GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan.
|
||||||
allow uploads that are way larger than the amount of system memory.
|
|
||||||
|
* Add option that changes the interval in which the progress callback is
|
||||||
|
called at most.
|
||||||
|
|
||||||
LIBCURL - multi interface
|
LIBCURL - multi interface
|
||||||
|
|
||||||
|
* Add a curl_multi_fdset() alternative. 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.
|
||||||
|
|
||||||
* Make sure we don't ever loop because of non-blocking sockets return
|
* Make sure we don't ever loop because of non-blocking sockets return
|
||||||
@@ -55,18 +61,34 @@ 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
|
||||||
|
|
||||||
FTP
|
FTP
|
||||||
|
|
||||||
* Optimize the way libcurl uses CWD on each new request over a persistent
|
* Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in
|
||||||
connection (on FTP) even if it doesn't have to.
|
the process to avoid doing a resolve and connect in vain.
|
||||||
|
|
||||||
|
* Support GSS/Kerberos 5 for ftp file transfer. This will allow user
|
||||||
|
authentication and file encryption. Possible libraries and example clients
|
||||||
|
are available from MIT or Heimdal. Requsted 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
|
||||||
part is to figure out if the server did the right thing or not.
|
(impossible?) part is to figure out if the server did the right thing or
|
||||||
|
not.
|
||||||
|
|
||||||
* Support the most common FTP proxies, Philip Newton provided a list
|
* Support the most common FTP proxies, Philip Newton provided a list
|
||||||
allegedly from ncftp:
|
allegedly from ncftp:
|
||||||
@@ -89,13 +111,14 @@ TODO
|
|||||||
|
|
||||||
HTTP
|
HTTP
|
||||||
|
|
||||||
* GSS-Negotiate support for HTTP proxies. They only work on direct
|
|
||||||
connections to the server.
|
|
||||||
|
|
||||||
* Pipelining. Sending multiple requests before the previous one(s) are done.
|
* Pipelining. Sending multiple requests before the previous one(s) are done.
|
||||||
This could possibly be implemented using the multi interface to queue
|
This could possibly be implemented using the multi interface to queue
|
||||||
requests and the response data.
|
requests and the response data.
|
||||||
|
|
||||||
|
* When doing CONNECT to a HTTP proxy, libcurl always uses HTTP/1.0. This has
|
||||||
|
never been reported as causing trouble to anyone, but should be considered
|
||||||
|
to use the HTTP version the user has chosen.
|
||||||
|
|
||||||
TELNET
|
TELNET
|
||||||
|
|
||||||
* Reading input (to send to the remote server) on stdin is a crappy solution
|
* Reading input (to send to the remote server) on stdin is a crappy solution
|
||||||
@@ -114,31 +137,50 @@ TODO
|
|||||||
* Evaluate/apply Gertjan van Wingerde's SSL patches:
|
* Evaluate/apply Gertjan van Wingerde's SSL patches:
|
||||||
http://curl.haxx.se/mail/lib-2004-03/0087.html
|
http://curl.haxx.se/mail/lib-2004-03/0087.html
|
||||||
|
|
||||||
* If you really want to improve the SSL situation, you should probably have a
|
* "Look at SSL cafile - quick traces look to me like these are done on every
|
||||||
look at SSL cafile loading as well - quick traces look to me like these are
|
request as well, when they should only be necessary once per ssl context
|
||||||
done on every request as well, when they should only be necessary once per
|
(or once per handle)". The major improvement we can rather easily do is to
|
||||||
ssl context (or once per handle). Even better would be to support the SSL
|
make sure we don't create and kill a new SSL "context" for every request,
|
||||||
CAdir option - instead of loading all of the root CA certs for every
|
but instead make one for every connection and re-use that SSL context in
|
||||||
request, this option allows you to only read the CA chain that is actually
|
the same style connections are re-used. It will make us use slightly more
|
||||||
required (into the cache)...
|
memory but it will libcurl do less creations and deletions of SSL contexts.
|
||||||
|
|
||||||
* Add an interface to libcurl that enables "session IDs" to get
|
* Add an interface to libcurl that enables "session IDs" to get
|
||||||
exported/imported. Cris Bailiff said: "OpenSSL has functions which can
|
exported/imported. Cris Bailiff said: "OpenSSL has functions which can
|
||||||
serialise the current SSL state to a buffer of your choice, and
|
serialise the current SSL state to a buffer of your choice, and
|
||||||
recover/reset the state from such a buffer at a later date - this is used
|
recover/reset the state from such a buffer at a later date - this is used
|
||||||
by mod_ssl for apache to implement and SSL session ID cache". This whole
|
by mod_ssl for apache to implement and SSL session ID cache".
|
||||||
idea might become moot if we enable the 'data sharing' as mentioned in the
|
|
||||||
LIBCURL label above.
|
|
||||||
|
|
||||||
* OpenSSL supports a callback for customised verification of the peer
|
* OpenSSL supports a callback for customised verification of the peer
|
||||||
certificate, but this doesn't seem to be exposed in the libcurl APIs. Could
|
certificate, but this doesn't seem to be exposed in the libcurl APIs. Could
|
||||||
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://gnutls.hellug.gr/)
|
(http://www.matrixssl.org/) or yaSSL (http://yassl.com/). At least the
|
||||||
|
latter two could be alternatives for those looking to reduce the footprint
|
||||||
|
of libcurl built with OpenSSL or GnuTLS.
|
||||||
|
|
||||||
|
* Peter Sylvester's patch for SRP on the TLS layer.
|
||||||
|
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
|
||||||
|
|
||||||
@@ -146,8 +188,35 @@ TODO
|
|||||||
lib/ldap.c source file and get moved to the main network code so that the
|
lib/ldap.c source file and get moved to the main network code so that the
|
||||||
multi interface and friends will work for LDAP as well.
|
multi interface and friends will work for LDAP as well.
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
* SFTP/SCP/SSH (no RFCs for protocol nor URI/URL format). An implementation
|
||||||
|
should most probably use an existing ssh library, such as OpenSSH.
|
||||||
|
|
||||||
|
* RSYNC (no RFCs for protocol nor URI/URL format). An implementation should
|
||||||
|
most probably use an existing rsync library, such as librsync.
|
||||||
|
|
||||||
CLIENT
|
CLIENT
|
||||||
|
|
||||||
|
* "curl --sync http://example.com/feed[1-100].rss" or
|
||||||
|
"curl --sync http://example.net/{index,calendar,history}.html"
|
||||||
|
|
||||||
|
Downloads a range or set of URLs using the remote name, but only if the
|
||||||
|
remote file is newer than the local file. A Last-Modified HTTP date header
|
||||||
|
should also be used to set the mod date on the downloaded file.
|
||||||
|
(idea from "Brianiac")
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
* Add an option that prevents cURL from overwiting existing local files. When
|
* Add an option that prevents cURL from overwiting 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
|
||||||
@@ -182,14 +251,14 @@ TODO
|
|||||||
http://curl.haxx.se/mail/archive-2003-11/0091.html (Kevin Roth suggested)
|
http://curl.haxx.se/mail/archive-2003-11/0091.html (Kevin Roth suggested)
|
||||||
|
|
||||||
* Provide a way to make options bound to a specific URL among several on the
|
* Provide a way to make options bound to a specific URL among several on the
|
||||||
command line. Possibly by adding a new option that separates options
|
command line. Possibly by letting ':' separate options between URLs,
|
||||||
between URLs, similar to this:
|
similar to this:
|
||||||
|
|
||||||
curl --data foo --url url.com --optionseparator
|
curl --data foo --url url.com : \
|
||||||
--url url2.com --optionseparator \
|
--url url2.com : \
|
||||||
--url url3.com --data foo3
|
--url url3.com --data foo3
|
||||||
|
|
||||||
(--optionseparator used to show my point, it would need a better name)
|
(More details: http://curl.haxx.se/mail/archive-2004-07/0133.html)
|
||||||
|
|
||||||
The example would do a POST-GET-POST combination on a single command line.
|
The example would do a POST-GET-POST combination on a single command line.
|
||||||
|
|
||||||
@@ -203,9 +272,6 @@ TODO
|
|||||||
* Make the test servers able to serve multiple running test suites. Like if
|
* Make the test servers able to serve multiple running test suites. Like if
|
||||||
two users run 'make test' at once.
|
two users run 'make test' at once.
|
||||||
|
|
||||||
* Make runtests.pl capable of changing port numbers for the servers. This was
|
|
||||||
the intention from the start, but in practise it is now hard.
|
|
||||||
|
|
||||||
* If perl wasn't found by the configure script, don't attempt to run the
|
* If perl wasn't found by the configure script, don't attempt to run the
|
||||||
tests but explain something nice why it doesn't.
|
tests but explain something nice why it doesn't.
|
||||||
|
|
||||||
@@ -222,6 +288,8 @@ TODO
|
|||||||
|
|
||||||
* remove obsolete defines from curl/curl.h
|
* remove obsolete defines from curl/curl.h
|
||||||
|
|
||||||
|
* make several functions use size_t instead of int in their APIs
|
||||||
|
|
||||||
* remove the following functions from the public API:
|
* remove the following functions from the public API:
|
||||||
curl_getenv
|
curl_getenv
|
||||||
curl_mprintf (and variations)
|
curl_mprintf (and variations)
|
||||||
@@ -230,3 +298,6 @@ TODO
|
|||||||
|
|
||||||
They will instead become curlx_ - alternatives. That makes the curl app
|
They will instead become curlx_ - alternatives. That makes the curl app
|
||||||
still capable of building with them from source.
|
still capable of building with them from source.
|
||||||
|
|
||||||
|
* Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
|
||||||
|
internally. Let the app judge success or not for itself.
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user