Compare commits
2029 Commits
c-ares-1_2
...
curl-7_14_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
818aed35e2 | ||
|
|
2ed524f07e | ||
|
|
5f1eefd03f | ||
|
|
522b4d7576 | ||
|
|
d6dcb08407 | ||
|
|
806c756a2d | ||
|
|
2494701347 | ||
|
|
1c10272e15 | ||
|
|
0badcf381a | ||
|
|
35558e6bd7 | ||
|
|
7659747e6f | ||
|
|
53189fb2d7 | ||
|
|
450c178d77 | ||
|
|
a20eb6df1b | ||
|
|
d73425061a | ||
|
|
0051d5ac88 | ||
|
|
76920413d9 | ||
|
|
44d9a8ba4e | ||
|
|
38dc548a87 | ||
|
|
dca6386234 | ||
|
|
2a701a1aac | ||
|
|
0cb297abc9 | ||
|
|
821a23535b | ||
|
|
bc80599178 | ||
|
|
941374b573 | ||
|
|
1886893d66 | ||
|
|
7291772b1f | ||
|
|
8e28721057 | ||
|
|
8d2120566e | ||
|
|
67341c4cbe | ||
|
|
f8188ddfee | ||
|
|
29c546b426 | ||
|
|
0d259b898b | ||
|
|
c136b80af5 | ||
|
|
83b87d53c1 | ||
|
|
1e99f1ee41 | ||
|
|
d7fe136d54 | ||
|
|
cd7a0f829f | ||
|
|
cf3f1ef284 | ||
|
|
a737864a1c | ||
|
|
c68a6805b3 | ||
|
|
bd3d5a17b4 | ||
|
|
d4b577114b | ||
|
|
713effb6e4 | ||
|
|
b92e2ab6b1 | ||
|
|
05baf94b43 | ||
|
|
a76288b99a | ||
|
|
557e95c0a3 | ||
|
|
0a83fa90bb | ||
|
|
daeb143177 | ||
|
|
9f752120c0 | ||
|
|
80a1e972fc | ||
|
|
5e65d48ffa | ||
|
|
752ef08141 | ||
|
|
070e0e8b0a | ||
|
|
2ed0728cef | ||
|
|
a79b9e9d4a | ||
|
|
24572daccc | ||
|
|
1770563fff | ||
|
|
4cd96483f6 | ||
|
|
8f1783b8a7 | ||
|
|
be72eaa327 | ||
|
|
61bded1d82 | ||
|
|
4b3937373a | ||
|
|
08bf0907d4 | ||
|
|
eb044f8787 | ||
|
|
8d0c77403c | ||
|
|
601062455c | ||
|
|
5be788ba36 | ||
|
|
281559b31b | ||
|
|
ef1aa4e5e9 | ||
|
|
7b7ac04895 | ||
|
|
60f5b2b275 | ||
|
|
c0f9d7fdb7 | ||
|
|
fc4d6f73a6 | ||
|
|
295169f9d9 | ||
|
|
1a3797a699 | ||
|
|
977e106924 | ||
|
|
8d76d4016d | ||
|
|
9f92657f76 | ||
|
|
9f341f9ce5 | ||
|
|
2098871509 | ||
|
|
3d00c86f4c | ||
|
|
90037b85d1 | ||
|
|
6ec145d4b4 | ||
|
|
40a58c392f | ||
|
|
9733cd59bb | ||
|
|
b3caf7bfa8 | ||
|
|
23fbb89805 | ||
|
|
bd1adaf7ea | ||
|
|
0c9e23fc0c | ||
|
|
f091ce64ac | ||
|
|
55a69ebea6 | ||
|
|
d6b3850562 | ||
|
|
80197cf493 | ||
|
|
8ee564c216 | ||
|
|
5bfeb60a83 | ||
|
|
1ab4a2f870 | ||
|
|
2a627059ac | ||
|
|
3f739acf24 | ||
|
|
d3454ceb94 | ||
|
|
59695c05b1 | ||
|
|
f0969c9692 | ||
|
|
18dd8154e2 | ||
|
|
4c58797607 | ||
|
|
d620f1e529 | ||
|
|
e0b436f8e1 | ||
|
|
e99d1e97de | ||
|
|
1fb74b4fa2 | ||
|
|
473f6ea9f0 | ||
|
|
0b04c52119 | ||
|
|
8383945acc | ||
|
|
fce9d51122 | ||
|
|
7c3ee84295 | ||
|
|
a8db25f48b | ||
|
|
20705ca311 | ||
|
|
af33c6b549 | ||
|
|
2b8775dff7 | ||
|
|
ea81dd9e2e | ||
|
|
7dcb102733 | ||
|
|
aa0e32060e | ||
|
|
2e8f37aca5 | ||
|
|
195d769c4b | ||
|
|
70f08b5baa | ||
|
|
9e987ac6a2 | ||
|
|
de03f172ad | ||
|
|
0078944486 | ||
|
|
d3f796ac59 | ||
|
|
3d38080d54 | ||
|
|
fe07962f9c | ||
|
|
938a72b2db | ||
|
|
a8827b1ed6 | ||
|
|
ff40cd71ac | ||
|
|
39626d8cfd | ||
|
|
67ad29e716 | ||
|
|
8bbf9b13af | ||
|
|
cb21851c74 | ||
|
|
8d611bec6e | ||
|
|
1de1dc7314 | ||
|
|
aca79af7de | ||
|
|
da6eea9b38 | ||
|
|
dcf7310b2d | ||
|
|
c2e8ba0fba | ||
|
|
a5360255ba | ||
|
|
5690a2b493 | ||
|
|
ff0429a802 | ||
|
|
46cdc83b81 | ||
|
|
76dfef7117 | ||
|
|
de2aeb9fc2 | ||
|
|
17a5b44205 | ||
|
|
f99e347878 | ||
|
|
f5a0c17322 | ||
|
|
8442c3942d | ||
|
|
15cd35f67f | ||
|
|
459801d6e0 | ||
|
|
2c43d64302 | ||
|
|
fd802db39f | ||
|
|
765754d39d | ||
|
|
f7f6b288eb | ||
|
|
11ee9540bf | ||
|
|
f6319bd706 | ||
|
|
0912015a5c | ||
|
|
4e7575fc7a | ||
|
|
6531a6116d | ||
|
|
9a33561e80 | ||
|
|
88229a0f2a | ||
|
|
120394cc45 | ||
|
|
1adfe0fe18 | ||
|
|
d57c178a62 | ||
|
|
6faa83bc6a | ||
|
|
9fb4e019fa | ||
|
|
74551597b1 | ||
|
|
37c269d0ba | ||
|
|
5d8b526b80 | ||
|
|
83dcc3e061 | ||
|
|
4ed58463f7 | ||
|
|
85b2056dc7 | ||
|
|
94ca911dc1 | ||
|
|
24420c2191 | ||
|
|
59f904d8de | ||
|
|
755f98e768 | ||
|
|
aadc797225 | ||
|
|
5c882bdfa3 | ||
|
|
60f9450594 | ||
|
|
ff52ba7f7b | ||
|
|
0fbcea45d6 | ||
|
|
ca6d430561 | ||
|
|
91601b3bf4 | ||
|
|
cdd70596df | ||
|
|
7e186f9a63 | ||
|
|
a94e117ede | ||
|
|
662cb30372 | ||
|
|
bd3aba5d6a | ||
|
|
29ed6d24bf | ||
|
|
e2c5c20896 | ||
|
|
7c4b6cb0d9 | ||
|
|
aced2904ff | ||
|
|
17eb1fca7c | ||
|
|
2511d1193a | ||
|
|
e9056f5f95 | ||
|
|
a9893ca79a | ||
|
|
f39f7c28f0 | ||
|
|
a807065ccc | ||
|
|
67532e916c | ||
|
|
3920b4dae8 | ||
|
|
d70a335dce | ||
|
|
8001921112 | ||
|
|
d7cb09bd18 | ||
|
|
e11710714c | ||
|
|
5b0bfc298f | ||
|
|
0383f7f19d | ||
|
|
23a43c6e0f | ||
|
|
eb946690d2 | ||
|
|
c090fdbdf1 | ||
|
|
de279099e5 | ||
|
|
6bd8db3c99 | ||
|
|
6176f14141 | ||
|
|
512e54ff85 | ||
|
|
a5aa569fe3 | ||
|
|
e2e593a036 | ||
|
|
9ce0a7b49d | ||
|
|
4ab0d74250 | ||
|
|
b5f85ba77d | ||
|
|
b6ee33c6e1 | ||
|
|
1c69b15c7c | ||
|
|
54cd2bee58 | ||
|
|
5bf02b16a0 | ||
|
|
594cb8507b | ||
|
|
78aba6e4cd | ||
|
|
ccdcdb2a46 | ||
|
|
b121e41ec3 | ||
|
|
05d8e56ffd | ||
|
|
4345c7a712 | ||
|
|
12d5e33dc9 | ||
|
|
6d70a82757 | ||
|
|
47d52d4eca | ||
|
|
4973b0f88a | ||
|
|
d1542bf549 | ||
|
|
2b7727aad1 | ||
|
|
fd775454ca | ||
|
|
8e09a389c4 | ||
|
|
aa3ae01878 | ||
|
|
c123676825 | ||
|
|
d60c22572b | ||
|
|
1d7ce36791 | ||
|
|
34e8baab9a | ||
|
|
a219d774fe | ||
|
|
005042e973 | ||
|
|
d301d69fbf | ||
|
|
34af02caca | ||
|
|
91025d1dd6 | ||
|
|
c9bab31a7f | ||
|
|
2f60e91a9b | ||
|
|
018affe6d0 | ||
|
|
aeb27ccfdb | ||
|
|
939866faab | ||
|
|
98f968f2ee | ||
|
|
864f1a3366 | ||
|
|
f42b10242f | ||
|
|
853134017d | ||
|
|
d3999e06d1 | ||
|
|
0b0b37cffe | ||
|
|
a13f5888d5 | ||
|
|
c8807438ce | ||
|
|
3f106afd00 | ||
|
|
d925057e11 | ||
|
|
bbafb2eb27 | ||
|
|
434bc13812 | ||
|
|
5c592f7dd9 | ||
|
|
9bf1ba2f7e | ||
|
|
724e4a3585 | ||
|
|
f69711fc78 | ||
|
|
04e2520dbb | ||
|
|
7a35fb5403 | ||
|
|
63f97b38eb | ||
|
|
b8541929c8 | ||
|
|
329f17ac7c | ||
|
|
5dcab07c54 | ||
|
|
1f798affb9 | ||
|
|
a2ecdf4249 | ||
|
|
71fdc063bd | ||
|
|
887d78a9ad | ||
|
|
00557a5475 | ||
|
|
e18d27b78a | ||
|
|
228fea4628 | ||
|
|
e64dacb40e | ||
|
|
fff01f24bf | ||
|
|
e55dee3807 | ||
|
|
8c2ce33c0b | ||
|
|
135394f511 | ||
|
|
fe065dc851 | ||
|
|
445c7791a7 | ||
|
|
686ba84128 | ||
|
|
3394c01826 | ||
|
|
d67ea8c7ad | ||
|
|
535046430a | ||
|
|
9aebdff219 | ||
|
|
90da930131 | ||
|
|
fbdc1b1e3d | ||
|
|
e942df755b | ||
|
|
91c8be3628 | ||
|
|
d56c03840b | ||
|
|
d3d5cdf305 | ||
|
|
af43ce73e5 | ||
|
|
84b52e92f4 | ||
|
|
0aa7d11cc9 | ||
|
|
933f7cecae | ||
|
|
8e73e55336 | ||
|
|
55c015c136 | ||
|
|
bde6c6685e | ||
|
|
58387b91f9 | ||
|
|
6f74820cfc | ||
|
|
af72f198ba | ||
|
|
3fc831f9eb | ||
|
|
9f660862ec | ||
|
|
1354671c90 | ||
|
|
1175a226e3 | ||
|
|
358b72bb12 | ||
|
|
6c408c885a | ||
|
|
9cf04dff6a | ||
|
|
6bdcfecbcf | ||
|
|
3f21fe60fc | ||
|
|
b2c290e40e | ||
|
|
bc5b2fa12c | ||
|
|
32a9554c92 | ||
|
|
afc1ed60f7 | ||
|
|
91018f4f24 | ||
|
|
fb086b57a8 | ||
|
|
3fc39a6efb | ||
|
|
6062ac7c37 | ||
|
|
caf7854a3c | ||
|
|
6def0892ea | ||
|
|
1c0744bde6 | ||
|
|
7591e07b7c | ||
|
|
35ab93f484 | ||
|
|
dcf5e52b62 | ||
|
|
aae521d086 | ||
|
|
78e6508e22 | ||
|
|
4d9517f0b4 | ||
|
|
a331aa0221 | ||
|
|
679cabb532 | ||
|
|
7332350e85 | ||
|
|
69f4dda74a | ||
|
|
c19c3bd15a | ||
|
|
76ff92b811 | ||
|
|
4250637e7d | ||
|
|
08d1da106e | ||
|
|
9e31a0536e | ||
|
|
2960d37d71 | ||
|
|
c63af5fc01 | ||
|
|
fc6eff13b5 | ||
|
|
e7ee1ccf45 | ||
|
|
98bf69f8f1 | ||
|
|
0363fbc411 | ||
|
|
e3bc92ae53 | ||
|
|
27e76021e9 | ||
|
|
93dde29979 | ||
|
|
d42dcd60cd | ||
|
|
ade89799f5 | ||
|
|
6e118ce50f | ||
|
|
34be9df773 | ||
|
|
7356a67780 | ||
|
|
f77949ef3b | ||
|
|
26b8b3fc53 | ||
|
|
38cc79a54f | ||
|
|
ec113aefb9 | ||
|
|
913e1570bd | ||
|
|
e2aaf22d5d | ||
|
|
3304589043 | ||
|
|
0247642bb6 | ||
|
|
19f5aa165c | ||
|
|
1756499b11 | ||
|
|
15f9a93c25 | ||
|
|
e99287734b | ||
|
|
8349dde0f1 | ||
|
|
59907ebc0e | ||
|
|
da91d6ac66 | ||
|
|
7548115a0e | ||
|
|
8ca37dd1c7 | ||
|
|
31e9e4bb76 | ||
|
|
84a322ab23 | ||
|
|
707f217b2d | ||
|
|
e6b45a66ec | ||
|
|
b34c40dcf5 | ||
|
|
699ebe2f0b | ||
|
|
e1c6f216c2 | ||
|
|
630b73bfa8 | ||
|
|
877f16e5a5 | ||
|
|
fbe1fa9dcc | ||
|
|
5b65cc55a2 | ||
|
|
97769737d0 | ||
|
|
5b0a5c4050 | ||
|
|
4b9f8e766d | ||
|
|
96002646f1 | ||
|
|
5ef6904ec3 | ||
|
|
2f53da5e7a | ||
|
|
58f1cc0b5f | ||
|
|
98c70b73f2 | ||
|
|
6bd02a3ab5 | ||
|
|
372e7a6cd4 | ||
|
|
211004bb0d | ||
|
|
80d2fff1a1 | ||
|
|
cf3cf413c8 | ||
|
|
e218811ca3 | ||
|
|
a9f2274bd8 | ||
|
|
92179ff990 | ||
|
|
4aac210a83 | ||
|
|
245e3122df | ||
|
|
ffc5fa3a2b | ||
|
|
f5042cce34 | ||
|
|
712c67b4ae | ||
|
|
5dcfb8ad66 | ||
|
|
673ff5eb2c | ||
|
|
92fc3f07ba | ||
|
|
cff90cf3f9 | ||
|
|
a33c53a36b | ||
|
|
2370d4fa02 | ||
|
|
f128d904a5 | ||
|
|
fb1039f2ab | ||
|
|
923ce98e42 | ||
|
|
8e935b58a2 | ||
|
|
c93e972543 | ||
|
|
1cb66f5262 | ||
|
|
648e82f05d | ||
|
|
1dbe60b8b7 | ||
|
|
9631fa7407 | ||
|
|
9befc682ee | ||
|
|
fbeb674479 | ||
|
|
af641d20a7 | ||
|
|
d02587750c | ||
|
|
241a4b3d45 | ||
|
|
496e81a25a | ||
|
|
f39b081253 | ||
|
|
c96f7f13da | ||
|
|
1bdc4b2006 | ||
|
|
3915fecf80 | ||
|
|
f94f06825c | ||
|
|
2ddbf8975a | ||
|
|
68a3cbe384 | ||
|
|
b9432d1296 | ||
|
|
e202a29a9a | ||
|
|
3755bffcc2 | ||
|
|
2a0a305300 | ||
|
|
70e2aadc18 | ||
|
|
a1c8aaf666 | ||
|
|
8ee470aaeb | ||
|
|
37e4858cd0 | ||
|
|
a27072bebb | ||
|
|
47059f45fe | ||
|
|
daced8041d | ||
|
|
b053ae6a65 | ||
|
|
42f60ecb36 | ||
|
|
550862f41a | ||
|
|
6838f74fe0 | ||
|
|
2ff30d067c | ||
|
|
84406b3e2c | ||
|
|
c323969bdd | ||
|
|
43cbbdbea0 | ||
|
|
1d3f76df71 | ||
|
|
33cb93ad0b | ||
|
|
4dc9179f4b | ||
|
|
26a5ec9aa0 | ||
|
|
883ea3113c | ||
|
|
62b7c08bb3 | ||
|
|
a85fa66cc8 | ||
|
|
9ba010c629 | ||
|
|
3ef3f2b6f0 | ||
|
|
1401d909e8 | ||
|
|
3233322622 | ||
|
|
e373f1fd73 | ||
|
|
dc25cd6f3a | ||
|
|
0e31d41d4e | ||
|
|
b7a7600465 | ||
|
|
111a2f3057 | ||
|
|
760cecac8d | ||
|
|
6f8b4395ec | ||
|
|
5506f8767c | ||
|
|
5887945828 | ||
|
|
25e98179be | ||
|
|
78ebe3fa5a | ||
|
|
a8e8e51b14 | ||
|
|
f97d194934 | ||
|
|
4661cc7403 | ||
|
|
bc11929395 | ||
|
|
caf37bc92e | ||
|
|
5de447b0cb | ||
|
|
5dbaced4a2 | ||
|
|
43f8a1f5de | ||
|
|
f57efa1899 | ||
|
|
592522ceaf | ||
|
|
4f84e6d9e2 | ||
|
|
6f08903f07 | ||
|
|
220cd010bd | ||
|
|
68e8a0f0d9 | ||
|
|
b23dbf9f34 | ||
|
|
1d0b5b507a | ||
|
|
b83d8104cd | ||
|
|
bf6e1053cf | ||
|
|
c3dd928e29 | ||
|
|
aba6c2b89d | ||
|
|
9c0a386246 | ||
|
|
bba3bb7556 | ||
|
|
c1422864b5 | ||
|
|
31a693b99a | ||
|
|
804534fbc9 | ||
|
|
1bc6532c16 | ||
|
|
b48bf7470d | ||
|
|
1ca9ce5ef4 |
1572
CHANGES.2003
Normal file
1572
CHANGES.2003
Normal file
File diff suppressed because it is too large
Load Diff
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
|
||||||
|
|||||||
20
Makefile.am
20
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 testcurl.sh RELEASE-NOTES
|
curl-style.el sample.emacs RELEASE-NOTES buildconf buildconf.bat libcurl.pc.in
|
||||||
|
|
||||||
bin_SCRIPTS = curl-config
|
bin_SCRIPTS = curl-config
|
||||||
|
|
||||||
@@ -48,12 +48,26 @@ 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)
|
||||||
|
|
||||||
test-full:
|
test-full:
|
||||||
@(cd tests; $(MAKE) all full-test)
|
@(cd tests; $(MAKE) all full-test)
|
||||||
|
|
||||||
|
test-torture:
|
||||||
|
@(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:
|
||||||
|
|||||||
165
Makefile.dist
165
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,16 +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:
|
||||||
|
$(MAKE) -C lib -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
|
||||||
@@ -47,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
|
||||||
@@ -82,8 +197,28 @@ amiga:
|
|||||||
cd ./src && make -f makefile.amiga
|
cd ./src && make -f makefile.amiga
|
||||||
|
|
||||||
netware:
|
netware:
|
||||||
cd lib && make -f Makefile.netware
|
$(MAKE) -C lib -f Makefile.netware
|
||||||
cd src && make -f Makefile.netware
|
$(MAKE) -C src -f Makefile.netware
|
||||||
|
|
||||||
|
netware-ares:
|
||||||
|
$(MAKE) -C lib -f Makefile.netware WITH_ARES=1
|
||||||
|
$(MAKE) -C src -f Makefile.netware WITH_ARES=1
|
||||||
|
|
||||||
|
netware-ssl:
|
||||||
|
$(MAKE) -C lib -f Makefile.netware WITH_SSL=1
|
||||||
|
$(MAKE) -C src -f Makefile.netware WITH_SSL=1
|
||||||
|
|
||||||
|
netware-ssl-zlib:
|
||||||
|
$(MAKE) -C lib -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
|
||||||
|
$(MAKE) -C src -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
|
||||||
|
|
||||||
|
netware-zlib:
|
||||||
|
$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1
|
||||||
|
$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1
|
||||||
|
|
||||||
|
netware-clean:
|
||||||
|
$(MAKE) -C lib -f Makefile.netware clean
|
||||||
|
$(MAKE) -C src -f Makefile.netware clean
|
||||||
|
|
||||||
unix: all
|
unix: all
|
||||||
|
|
||||||
|
|||||||
63
README
63
README
@@ -1,12 +1,12 @@
|
|||||||
_ _ ____ _
|
_ _ ____ _
|
||||||
___| | | | _ \| |
|
___| | | | _ \| |
|
||||||
/ __| | | | |_) | |
|
/ __| | | | |_) | |
|
||||||
| (__| |_| | _ <| |___
|
| (__| |_| | _ <| |___
|
||||||
\___|\___/|_| \_\_____|
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
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.
|
||||||
@@ -17,60 +17,59 @@ README
|
|||||||
|
|
||||||
You find answers to the most frequent questions we get in the FAQ document.
|
You find answers to the most frequent questions we get in the FAQ document.
|
||||||
|
|
||||||
Study the COPYING file for distribution terms and similar.
|
Study the COPYING file for distribution terms and similar. If you distribute
|
||||||
|
curl binaries or other binaries that involve libcurl, you might enjoy the
|
||||||
|
LICENSE-MIXING document.
|
||||||
|
|
||||||
CONTACT
|
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/
|
||||||
Estonia -- http://curl.dope-brothers.com/
|
Austria -- http://curl.gds.tuwien.ac.at/
|
||||||
|
Canada -- http://curl.meulie.net/
|
||||||
|
Denmark -- http://curl.cofman.dk/
|
||||||
|
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 (CA) -- http://curl.mirrormonster.com/
|
||||||
DOWNLOAD
|
US (CA) -- http://curl.signal42.com/
|
||||||
|
US (CA) -- http://curl.tolix.org/
|
||||||
The official download mirror sites are:
|
US (CA) -- http://curl.webhosting76.com/
|
||||||
|
US (TX) -- http://curl.109k.com/
|
||||||
Australia -- http://curl.planetmirror.com/download.html
|
US (TX) -- http://curl.mirrors.cyberservers.net/
|
||||||
Estonia -- http://curl.dope-brothers.com/download.html
|
US (TX) -- http://curl.seekmeup.com/
|
||||||
Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
|
US (TX) -- http://curl.hostingzero.com/
|
||||||
Germany -- http://curl.mirror.at.stealer.net/download.html
|
|
||||||
Germany -- http://curl.netmirror.org/download.html
|
|
||||||
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
|
||||||
|
|
||||||
To download the very latest source off the CVS server do this:
|
To download the very latest source off the CVS server do this:
|
||||||
|
|
||||||
cvs -d :pserver:cvsread@cvs.php.net:/repository login
|
cvs -d :pserver:anonymous@cool.haxx.se:/cvsroot/curl login
|
||||||
|
|
||||||
(enter "phpfi" when asked for password)
|
(just press enter when asked for password)
|
||||||
|
|
||||||
cvs -d :pserver:cvsread@cvs.php.net:/repository co curl
|
cvs -d :pserver:anonymous@cool.haxx.se:/cvsroot/curl co curl
|
||||||
|
|
||||||
(you'll get a directory named curl created, filled with the source code)
|
(you'll get a directory named curl created, filled with the source code)
|
||||||
|
|
||||||
cvs -d :pserver:cvsread@cvs.php.net:/repository logout
|
|
||||||
|
|
||||||
(you're off the hook!)
|
|
||||||
|
|
||||||
NOTICE
|
NOTICE
|
||||||
|
|
||||||
Curl contains pieces of source code that is Copyright (c) 1998, 1999
|
Curl contains pieces of source code that is Copyright (c) 1998, 1999
|
||||||
|
|||||||
@@ -1,54 +1,74 @@
|
|||||||
Curl and libcurl 7.11.2. A bugfix release.
|
Curl and libcurl 7.14.1
|
||||||
|
|
||||||
Public curl release number: 80
|
Public curl release number: 89
|
||||||
Releases counted from the very beginning: 107
|
Releases counted from the very beginning: 116
|
||||||
Available command line options: 94
|
Available command line options: 108
|
||||||
Available curl_easy_setopt() options: 113
|
Available curl_easy_setopt() options: 123
|
||||||
|
Number of public functions in libcurl: 46
|
||||||
|
Amount of public web site mirrors: 25
|
||||||
|
Number of known libcurl bindings: 31
|
||||||
|
Number of contributors: 447
|
||||||
|
|
||||||
This release includes the following changes:
|
This release includes the following changes:
|
||||||
|
|
||||||
o the ares build now requires c-ares 1.2.0 or later
|
o GNU GSS support
|
||||||
o --tcp-nodelay and CURLOPT_TCP_NODELAY were added
|
o --ignore-content-length and CURLOPT_IGNORE_CONTENT_LENGTH added
|
||||||
o curl/curlver.h contains the libcurl version info now
|
o negotiates data connection SSL earlier when doing FTPS with PASV
|
||||||
|
o CURLOPT_COOKIELIST and CURLINFO_COOKIELIST
|
||||||
|
o trailer support for chunked encoded data streams
|
||||||
|
o -x/CURL_PROXY strings may now contain user+password
|
||||||
|
o --trace-time now outputs the full microsecond, all 6 digits
|
||||||
|
|
||||||
This release includes the following bugfixes:
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
o getting only a 100 Continue response and nothing else, when talking HTTP,
|
o MSVC build problem with the DSP file
|
||||||
is now treated as an error by libcurl
|
o windows threaded resolver access violation with multi interface
|
||||||
o fixed minor memory leak in libcurl for Windows when staticly linked
|
o test suite works with valgrind 3
|
||||||
o POST/PUT using Digest/NTLM/Negotiate (including anyauth) now work better
|
o CA cert verification with GnuTLS builds
|
||||||
o --limit-rate with high speed rates is a lot more accurate now, and supports
|
o handles expiry times in cookie files that go beyond 32 bits in size
|
||||||
limiting to speeds >2GB/sec on systems with Large File support.
|
o several client problems with files, such as doing -d @file when the file
|
||||||
o curl_strnqual.3 "refer-to" man page fix
|
isn't readable now gets a warning displayed
|
||||||
o fixed a minor very old progress meter final update bug
|
o write callback abort didn't always "take"
|
||||||
o added checks for a working NI_WITHSCOPEID before that is used
|
o the curl -z "bad syntax" warning is now hidden when -s is used
|
||||||
o fixed a flaw that prevented ares name resolve timeouts to occur
|
o curl -d @nonexisting no longer makes a GET
|
||||||
o getting user name from http_proxy env variable works now
|
o minor debug callback data size
|
||||||
o fixed too early name resolve timeouts with ares
|
o date parsing of dates including daylight savings time zone names
|
||||||
o HTTP Digest "re-negotiation" works now
|
o using NTLM over proxy with an FTP URL
|
||||||
o CURLOPT_FAILONERROR (-f/--fail) works with all kinds of authentication
|
o curl-config --features now displays SSL when built with GnuTLS too
|
||||||
o better thread-safety thanks to the internal strerror() replacement
|
o CURLOPT_HTTPGET, CURLOPT_POST and CURLOPT_HTTPPOST reset CURLOPT_NOBODY
|
||||||
o better thread-safety on AIX thanks to better function detection
|
o builds fine on AmigaOS again
|
||||||
o minor ipv6 build fix for windows
|
o corrected date parsing on Windows with auto-DST-adjust enabled
|
||||||
o the test suite runs fine with mingw-built curl
|
o treats CONNECT 407 responses with bodies better during Digest/NTLM auth
|
||||||
o the postit2.c example works now
|
o improved strerror_r() API guessing when cross-compiling
|
||||||
o better error message when --interface fails on windows
|
o debug builds work on Tru64
|
||||||
o the progress meter now displays very long times better
|
o improved libcurl.m4
|
||||||
o CURLINFO_CONTENT_LENGTH_DOWNLOAD with CURLOPT_NOBODY set TRUE now works
|
o possible memory leak in windows name resolves
|
||||||
o passwords longer than 14 letters work with NTLM
|
o c-ares enabled build with mingw
|
||||||
o 'make netware' in the root dir works now
|
o proxy host set with numerical IPv6 address
|
||||||
o builds fine on VMS again and even nicer than before
|
o better treatment of binary zeroes in HTTP response headers
|
||||||
|
o fixed the notorious FTP server failure in the test suite
|
||||||
|
o better checking of text output in the test suite on windows
|
||||||
|
o FTP servers' TYPE command response check made less strict
|
||||||
|
o URL-without-slash as in http://somehost?data
|
||||||
|
o strerror_r() configure check for HP-UX 10.20 (and others)
|
||||||
|
o time parse work-around on HP-UX 10.20 since its gmtime_r() is broken
|
||||||
|
|
||||||
Other curl-related news since the previous public release:
|
Other curl-related news since the previous public release:
|
||||||
|
|
||||||
o PycURL 7.11.1 was released: http://pycurl.sf.net/
|
o cURLpp 0.5.2 was released at http://rrette.com/curlpp.html
|
||||||
o New German web mirror: http://curl.netmirror.org/
|
o Rexx/CURL 1.3 was released at http://rexxcurl.sf.net/
|
||||||
|
o http://curl.miscellaneousmirror.org is a new German curl mirror
|
||||||
|
o LuaCURL by Alexander Marinov at http://luacurl.luaforge.net/
|
||||||
|
o http://curl.hostingzero.com/ is a new US curl mirror
|
||||||
|
o ocurl 0.2.1 was released at http://sourceforge.net/projects/ocurl
|
||||||
|
|
||||||
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:
|
||||||
|
|
||||||
Thomas Schwinge, Marty Kuhrt, G<>nter Knauf, Kevin Roth, Glen Nakamura, Gisle
|
John McGowan, Georg Wicherski, Andres Garcia, Eric Cooper, Todd Kulesza,
|
||||||
Vanem, Greg Hewgill, Joe Halpin, Tor Arntsen, Dirk Manske, Roy Shan, Mitz
|
Tupone Alfredo, Gisle Vanem, David Shaw, Andrew Bushnell, Dan Fandrich,
|
||||||
Wark, Andr<EFBFBD>s Garc<72>a, Robin Kay, Alan Pinstein, David Byron, Nathan O'Sullivan
|
Adrian Schuur, Diego Casorran, Peteris Krumins, Jon Grubbs, Christopher
|
||||||
|
R. Palmer, Mario Schroeder, Richard Clayton, James Bursa, Jeff Pohlmeyer,
|
||||||
|
Norbert Novotny, Toby Peterson, Simon Josefsson, Igor Polyakov, Kevin Lussier
|
||||||
|
|
||||||
Thanks! (and sorry if I forgot to mention someone)
|
Thanks! (and sorry if I forgot to mention someone)
|
||||||
|
|||||||
24
TODO-RELEASE
24
TODO-RELEASE
@@ -1,28 +1,12 @@
|
|||||||
Issues not sorted in any particular order.
|
Issues not sorted in any particular order.
|
||||||
#[num] refers to bug report numbers.
|
|
||||||
UNASSIGNED means that no person has publicly stated to work on the issue.
|
|
||||||
DELETE means the issue is subject for dismissal
|
|
||||||
|
|
||||||
To get fixed in 7.11.2 (planned release May/June 2004)
|
To get fixed in 7.14.1 (planned release: August 2005)
|
||||||
======================
|
======================
|
||||||
|
|
||||||
31. Fix multi interface for windows with ares. curl_multi_fdset() returns
|
To get fixed in 7.14.2 (planned release: October 2005)
|
||||||
blank fdsets during name lookup which causes a following select() to fail!
|
|
||||||
High prio.
|
|
||||||
|
|
||||||
To get fixed in 7.12.0
|
|
||||||
======================
|
======================
|
||||||
|
|
||||||
25. curl_easy_strerror() curl_multi_strerror() curl_share_strerror()
|
60 - CONNECT 407 responses that kills the connection
|
||||||
Code already in CVS. Messages need overview/improvements.
|
|
||||||
Medium prio.
|
|
||||||
|
|
||||||
26. i18n of error messages?
|
63 -
|
||||||
Low prio. Nobody has volunteered. Subject for removal.
|
|
||||||
|
|
||||||
33. Add a function to replace the malloc-calls within libcurl.
|
|
||||||
Low prio. Seshubabu Pasam works on this.
|
|
||||||
|
|
||||||
35. Rearrange lib/hostip.c to reduce the amount of #ifdefs and make it easier
|
|
||||||
to follow "the flow". Daniel's task.
|
|
||||||
Medium prio.
|
|
||||||
|
|||||||
200
acinclude.m4
200
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,24 +416,26 @@ 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])
|
||||||
|
) dnl with _THREAD_SAFE
|
||||||
|
]) dnl plain cpp for it
|
||||||
|
|
||||||
if test "x$strerror_r" = "xyes"; then
|
|
||||||
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])
|
||||||
AC_TRY_RUN([
|
AC_TRY_RUN([
|
||||||
@@ -412,13 +452,30 @@ main () {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
GLIBC_STRERROR_R="1"
|
||||||
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 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
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_MSG_CHECKING([for a POSIX strerror_r API])
|
if test -z "$GLIBC_STRERROR_R"; then
|
||||||
AC_TRY_RUN([
|
|
||||||
|
AC_MSG_CHECKING([for a POSIX strerror_r API])
|
||||||
|
AC_TRY_RUN([
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
int
|
int
|
||||||
@@ -433,12 +490,16 @@ main () {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
AC_DEFINE(HAVE_POSIX_STRERROR_R, 1, [we have a POSIX-style strerror_r()])
|
AC_DEFINE(HAVE_POSIX_STRERROR_R, 1, [we have a POSIX-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!])
|
||||||
)
|
)
|
||||||
|
|
||||||
fi
|
fi dnl if not using glibc API
|
||||||
|
|
||||||
|
fi dnl we have a strerror_r
|
||||||
|
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -658,10 +719,11 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
|||||||
dnl "invalid format string conversion"
|
dnl "invalid format string conversion"
|
||||||
dnl * 279 warns on static conditions in while expressions
|
dnl * 279 warns on static conditions in while expressions
|
||||||
dnl * 981 warns on "operands are evaluated in unspecified order"
|
dnl * 981 warns on "operands are evaluated in unspecified order"
|
||||||
|
dnl * 1418 "external definition with no prior declaration"
|
||||||
dnl * 1419 warns on "external declaration in primary source file"
|
dnl * 1419 warns on "external declaration in primary source file"
|
||||||
dnl which we know and do on purpose.
|
dnl which we know and do on purpose.
|
||||||
|
|
||||||
WARN="-wd279,269,1419,981"
|
WARN="-wd279,269,981,1418,1419"
|
||||||
|
|
||||||
if test "$gccnum" -gt "600"; then
|
if test "$gccnum" -gt "600"; then
|
||||||
dnl icc 6.0 and older doesn't have the -Wall flag
|
dnl icc 6.0 and older doesn't have the -Wall flag
|
||||||
@@ -669,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
|
||||||
@@ -691,12 +758,20 @@ 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
|
||||||
|
# try these on gcc 3.4
|
||||||
|
WARN="$WARN -Wdeclaration-after-statement"
|
||||||
|
fi
|
||||||
|
|
||||||
for flag in $CPPFLAGS; do
|
for flag in $CPPFLAGS; do
|
||||||
case "$flag" in
|
case "$flag" in
|
||||||
-I*)
|
-I*)
|
||||||
@@ -737,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
|
||||||
214
ares/CHANGES
214
ares/CHANGES
@@ -1,5 +1,219 @@
|
|||||||
Changelog for the c-ares project
|
Changelog for the c-ares project
|
||||||
|
|
||||||
|
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
|
||||||
|
- Gisle Vanem's init patch for Windows:
|
||||||
|
|
||||||
|
The init_by_resolv_conf() function fetches the DNS-server(s)
|
||||||
|
from a series of registry branches.
|
||||||
|
|
||||||
|
This can be wrong in the case where DHCP has assigned nameservers, but the
|
||||||
|
user has overridden these servers with other prefered settings. Then it's
|
||||||
|
wrong to use the DHCPNAMESERVER setting in registry.
|
||||||
|
|
||||||
|
In the case of no global DHCP-assigned or fixed servers, but DNS server(s)
|
||||||
|
per adapter, one has to query the adapter branches. But how can c-ares know
|
||||||
|
which adapter is valid for use? AFAICS it can't. There could be one adapter
|
||||||
|
that is down (e.g. a VPN adapter).
|
||||||
|
|
||||||
|
So it's better to leave this to the IP Helper API (iphlapi) available in
|
||||||
|
Win-98/2000 and later. My patch falls-back to the old way if not available.
|
||||||
|
|
||||||
|
* June 8
|
||||||
|
- James Bursa fixed an init issue for RISC OS.
|
||||||
|
|
||||||
|
* May 11
|
||||||
|
- Nico Stappenbelt reported that when processing domain and search lines in
|
||||||
|
the resolv.conf file, the first entry encountered is processed and used as
|
||||||
|
the search list. According to the manual pages for both Linux, Solaris and
|
||||||
|
Tru64, the last entry of either a domain or a search field is used.
|
||||||
|
|
||||||
|
This is now adjusted in the code
|
||||||
|
|
||||||
Version 1.2.0 (April 13, 2004)
|
Version 1.2.0 (April 13, 2004)
|
||||||
|
|
||||||
* April 2, 2004
|
* April 2, 2004
|
||||||
|
|||||||
@@ -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,101 +1,291 @@
|
|||||||
|
dnl Check for how to set a socket to non-blocking state. There seems to exist
|
||||||
dnl We create a function for detecting which compiler we use and then set as
|
dnl four known different ways, with the one used almost everywhere being POSIX
|
||||||
dnl pendantic compiler options as possible for that particular compiler. The
|
dnl and XPG3, while the other different ways for different systems (old BSD,
|
||||||
dnl options are only used for debug-builds.
|
dnl Windows and Amiga).
|
||||||
|
dnl
|
||||||
dnl This is a copy of the original found in curl's configure script. Don't
|
dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the
|
||||||
dnl modify this one, edit the one in curl and copy it back here when that one
|
dnl O_NONBLOCK define is found but does not work. This condition is attempted
|
||||||
dnl is changed.
|
dnl to get caught in this script by using an excessive number of #ifdefs...
|
||||||
|
dnl
|
||||||
AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],
|
||||||
[
|
[
|
||||||
if test "$GCC" = "yes"; then
|
AC_MSG_CHECKING([non-blocking sockets style])
|
||||||
|
|
||||||
dnl figure out gcc version!
|
AC_TRY_COMPILE([
|
||||||
AC_MSG_CHECKING([gcc version])
|
/* headers for O_NONBLOCK test */
|
||||||
gccver=`$CC -dumpversion`
|
#include <sys/types.h>
|
||||||
num1=`echo $gccver | cut -d . -f1`
|
#include <unistd.h>
|
||||||
num2=`echo $gccver | cut -d . -f2`
|
#include <fcntl.h>
|
||||||
gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
|
],[
|
||||||
AC_MSG_RESULT($gccver)
|
/* try to compile O_NONBLOCK */
|
||||||
|
|
||||||
AC_MSG_CHECKING([if this is icc in disguise])
|
#if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
||||||
AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
|
# if defined(__SVR4) || defined(__srv4__)
|
||||||
dnl action if the text is found, this it has not been replaced by the
|
# define PLATFORM_SOLARIS
|
||||||
dnl cpp
|
# else
|
||||||
ICC="no"
|
# define PLATFORM_SUNOS4
|
||||||
AC_MSG_RESULT([no]),
|
# endif
|
||||||
dnl the text was not found, it was replaced by the cpp
|
#endif
|
||||||
ICC="yes"
|
#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4)
|
||||||
AC_MSG_RESULT([yes])
|
# define PLATFORM_AIX_V3
|
||||||
)
|
#endif
|
||||||
|
|
||||||
if test "$ICC" = "yes"; then
|
#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)
|
||||||
dnl this is icc, not gcc.
|
#error "O_NONBLOCK does not work on this platform"
|
||||||
|
#endif
|
||||||
dnl ICC warnings we ignore:
|
int socket;
|
||||||
dnl * 279 warns on static conditions in while expressions
|
int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);
|
||||||
dnl * 269 warns on our "%Od" printf formatters for curl_off_t output:
|
],[
|
||||||
dnl "invalid format string conversion"
|
dnl the O_NONBLOCK test was fine
|
||||||
|
nonblock="O_NONBLOCK"
|
||||||
WARN="-wd279,269"
|
AC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets])
|
||||||
|
],[
|
||||||
if test "$gccnum" -gt "600"; then
|
dnl the code was bad, try a different program now, test 2
|
||||||
dnl icc 6.0 and older doesn't have the -Wall flag
|
|
||||||
WARN="-Wall $WARN"
|
AC_TRY_COMPILE([
|
||||||
fi
|
/* headers for FIONBIO test */
|
||||||
else dnl $ICC = yes
|
#include <unistd.h>
|
||||||
dnl
|
#include <stropts.h>
|
||||||
WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wundef -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare"
|
],[
|
||||||
|
/* FIONBIO source test (old-style unix) */
|
||||||
dnl -Wcast-align is a bit too annoying ;-)
|
int socket;
|
||||||
|
int flags = ioctl(socket, FIONBIO, &flags);
|
||||||
if test "$gccnum" -ge "296"; then
|
],[
|
||||||
dnl gcc 2.96 or later
|
dnl FIONBIO test was good
|
||||||
WARN="$WARN -Wfloat-equal"
|
nonblock="FIONBIO"
|
||||||
|
AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])
|
||||||
if test "$gccnum" -gt "296"; then
|
],[
|
||||||
dnl this option does not exist in 2.96
|
dnl FIONBIO test was also bad
|
||||||
WARN="$WARN -Wno-format-nonliteral"
|
dnl the code was bad, try a different program now, test 3
|
||||||
fi
|
|
||||||
|
AC_TRY_COMPILE([
|
||||||
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
/* headers for ioctlsocket test (cygwin?) */
|
||||||
dnl on i686-Linux as it gives us heaps with false positives
|
#include <windows.h>
|
||||||
if test "$gccnum" -ge "303"; then
|
],[
|
||||||
dnl gcc 3.3 and later
|
/* ioctlsocket source code */
|
||||||
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
|
int socket;
|
||||||
fi
|
unsigned long flags = ioctlsocket(socket, FIONBIO, &flags);
|
||||||
fi
|
],[
|
||||||
|
dnl ioctlsocket test was good
|
||||||
for flag in $CPPFLAGS; do
|
nonblock="ioctlsocket"
|
||||||
case "$flag" in
|
AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])
|
||||||
-I*)
|
],[
|
||||||
dnl include path
|
dnl ioctlsocket didnt compile!, go to test 4
|
||||||
add=`echo $flag | sed 's/^-I/-isystem /g'`
|
|
||||||
WARN="$WARN $add"
|
AC_TRY_LINK([
|
||||||
;;
|
/* headers for IoctlSocket test (Amiga?) */
|
||||||
esac
|
#include <sys/ioctl.h>
|
||||||
done
|
],[
|
||||||
|
/* IoctlSocket source code */
|
||||||
fi dnl $ICC = no
|
int socket;
|
||||||
|
int flags = IoctlSocket(socket, FIONBIO, (long)1);
|
||||||
CFLAGS="$CFLAGS $WARN"
|
],[
|
||||||
|
dnl ioctlsocket test was good
|
||||||
fi dnl $GCC = yes
|
nonblock="IoctlSocket"
|
||||||
|
AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])
|
||||||
dnl strip off optimizer flags
|
],[
|
||||||
NEWFLAGS=""
|
dnl Ioctlsocket didnt compile, do test 5!
|
||||||
for flag in $CFLAGS; do
|
AC_TRY_COMPILE([
|
||||||
case "$flag" in
|
/* headers for SO_NONBLOCK test (BeOS) */
|
||||||
-O*)
|
#include <socket.h>
|
||||||
dnl echo "cut off $flag"
|
],[
|
||||||
;;
|
/* SO_NONBLOCK source code */
|
||||||
*)
|
long b = 1;
|
||||||
NEWFLAGS="$NEWFLAGS $flag"
|
int socket;
|
||||||
;;
|
int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
|
||||||
esac
|
],[
|
||||||
done
|
dnl the SO_NONBLOCK test was good
|
||||||
CFLAGS=$NEWFLAGS
|
nonblock="SO_NONBLOCK"
|
||||||
|
AC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets])
|
||||||
]) dnl end of AC_DEFUN()
|
],[
|
||||||
|
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 pendantic compiler options as possible for that particular compiler. The
|
||||||
|
dnl options are only used for debug-builds.
|
||||||
|
|
||||||
|
dnl This is a copy of the original found in curl's configure script. Don't
|
||||||
|
dnl modify this one, edit the one in curl and copy it back here when that one
|
||||||
|
dnl is changed.
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
||||||
|
[
|
||||||
|
if test "$GCC" = "yes"; then
|
||||||
|
|
||||||
|
dnl figure out gcc version!
|
||||||
|
AC_MSG_CHECKING([gcc version])
|
||||||
|
gccver=`$CC -dumpversion`
|
||||||
|
num1=`echo $gccver | cut -d . -f1`
|
||||||
|
num2=`echo $gccver | cut -d . -f2`
|
||||||
|
gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
|
||||||
|
AC_MSG_RESULT($gccver)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([if this is icc in disguise])
|
||||||
|
AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
|
||||||
|
dnl action if the text is found, this it has not been replaced by the
|
||||||
|
dnl cpp
|
||||||
|
ICC="no"
|
||||||
|
AC_MSG_RESULT([no]),
|
||||||
|
dnl the text was not found, it was replaced by the cpp
|
||||||
|
ICC="yes"
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
)
|
||||||
|
|
||||||
|
if test "$ICC" = "yes"; then
|
||||||
|
dnl this is icc, not gcc.
|
||||||
|
|
||||||
|
dnl ICC warnings we ignore:
|
||||||
|
dnl * 279 warns on static conditions in while expressions
|
||||||
|
dnl * 269 warns on our "%Od" printf formatters for curl_off_t output:
|
||||||
|
dnl "invalid format string conversion"
|
||||||
|
|
||||||
|
WARN="-wd279,269"
|
||||||
|
|
||||||
|
if test "$gccnum" -gt "600"; then
|
||||||
|
dnl icc 6.0 and older doesn't have the -Wall flag
|
||||||
|
WARN="-Wall $WARN"
|
||||||
|
fi
|
||||||
|
else dnl $ICC = yes
|
||||||
|
dnl
|
||||||
|
WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wundef -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare"
|
||||||
|
|
||||||
|
dnl -Wcast-align is a bit too annoying ;-)
|
||||||
|
|
||||||
|
if test "$gccnum" -ge "296"; then
|
||||||
|
dnl gcc 2.96 or later
|
||||||
|
WARN="$WARN -Wfloat-equal"
|
||||||
|
|
||||||
|
if test "$gccnum" -gt "296"; then
|
||||||
|
dnl this option does not exist in 2.96
|
||||||
|
WARN="$WARN -Wno-format-nonliteral"
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
||||||
|
dnl on i686-Linux as it gives us heaps with false positives
|
||||||
|
if test "$gccnum" -ge "303"; then
|
||||||
|
dnl gcc 3.3 and later
|
||||||
|
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
for flag in $CPPFLAGS; do
|
||||||
|
case "$flag" in
|
||||||
|
-I*)
|
||||||
|
dnl include path
|
||||||
|
add=`echo $flag | sed 's/^-I/-isystem /g'`
|
||||||
|
WARN="$WARN $add"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
fi dnl $ICC = no
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS $WARN"
|
||||||
|
|
||||||
|
fi dnl $GCC = yes
|
||||||
|
|
||||||
|
dnl strip off optimizer flags
|
||||||
|
NEWFLAGS=""
|
||||||
|
for flag in $CFLAGS; do
|
||||||
|
case "$flag" in
|
||||||
|
-O*)
|
||||||
|
dnl echo "cut off $flag"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
NEWFLAGS="$NEWFLAGS $flag"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
CFLAGS=$NEWFLAGS
|
||||||
|
|
||||||
|
]) 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 determins if the specified struct contains a specific member.
|
||||||
|
dnl Syntax:
|
||||||
|
dnl CARES_CHECK_STRUCT_MEMBER(headers, struct name, member name, if found, [if not found])
|
||||||
|
|
||||||
|
AC_DEFUN([CARES_CHECK_STRUCT_MEMBER], [
|
||||||
|
AC_MSG_CHECKING([if struct $2 has member $3])
|
||||||
|
AC_TRY_COMPILE([$1],
|
||||||
|
[
|
||||||
|
struct $2 struct_instance;
|
||||||
|
struct_instance.$3 = 0;
|
||||||
|
], ac_struct="yes", ac_found="no")
|
||||||
|
if test "$ac_struct" = "yes" ; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
$4
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
$5
|
||||||
|
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
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
335
ares/adig.c
335
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);
|
||||||
@@ -145,7 +146,7 @@ int main(int argc, char **argv)
|
|||||||
WORD wVersionRequested = MAKEWORD(1,1);
|
WORD wVersionRequested = MAKEWORD(1,1);
|
||||||
WSADATA wsaData;
|
WSADATA wsaData;
|
||||||
WSAStartup(wVersionRequested, &wsaData);
|
WSAStartup(wVersionRequested, &wsaData);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
options.flags = ARES_FLAG_NOCHECKRESP;
|
options.flags = ARES_FLAG_NOCHECKRESP;
|
||||||
options.servers = NULL;
|
options.servers = NULL;
|
||||||
@@ -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;
|
||||||
@@ -568,18 +569,18 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
/* The RR data is three two-byte numbers representing the
|
/* The RR data is three two-byte numbers representing the
|
||||||
* priority, weight, and port, followed by a domain name.
|
* priority, weight, and port, followed by a domain name.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
printf("\t%d", DNS__16BIT(aptr));
|
printf("\t%d", DNS__16BIT(aptr));
|
||||||
printf(" %d", DNS__16BIT(aptr + 2));
|
printf(" %d", DNS__16BIT(aptr + 2));
|
||||||
printf(" %d", DNS__16BIT(aptr + 4));
|
printf(" %d", DNS__16BIT(aptr + 4));
|
||||||
|
|
||||||
status = ares_expand_name(aptr + 6, abuf, alen, &name, &len);
|
status = ares_expand_name(aptr + 6, 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;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("\t[Unknown RR; cannot parse]");
|
printf("\t[Unknown RR; cannot parse]");
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
17
ares/ahost.c
17
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);
|
||||||
@@ -50,7 +51,7 @@ int main(int argc, char **argv)
|
|||||||
WORD wVersionRequested = MAKEWORD(1,1);
|
WORD wVersionRequested = MAKEWORD(1,1);
|
||||||
WSADATA wsaData;
|
WSADATA wsaData;
|
||||||
WSAStartup(wVersionRequested, &wsaData);
|
WSAStartup(wVersionRequested, &wsaData);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (argc <= 1)
|
if (argc <= 1)
|
||||||
usage();
|
usage();
|
||||||
@@ -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);
|
||||||
|
|||||||
152
ares/ares.h
152
ares/ares.h
@@ -20,63 +20,93 @@
|
|||||||
|
|
||||||
#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
|
||||||
|
|
||||||
/* 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_ALLOW_UNASSIGNED (1 << 11)
|
||||||
|
#define ARES_NI_USE_STD3_ASCII_RULES (1 << 12)
|
||||||
|
|
||||||
struct ares_options {
|
struct ares_options {
|
||||||
int flags;
|
int flags;
|
||||||
@@ -94,47 +124,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,137 +30,158 @@
|
|||||||
|
|
||||||
#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);
|
||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
free(line);
|
if(line)
|
||||||
|
free(line);
|
||||||
|
|
||||||
if (status == ARES_SUCCESS)
|
if (status == ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Memory allocation failure; clean up. */
|
/* Memory allocation failure; clean up. */
|
||||||
if (hostent)
|
if (hostent)
|
||||||
{
|
{
|
||||||
free((char *) hostent->h_name);
|
if(hostent->h_name)
|
||||||
if (hostent->h_aliases)
|
free((char *) hostent->h_name);
|
||||||
{
|
if (hostent->h_aliases)
|
||||||
for (alias = hostent->h_aliases; *alias; alias++)
|
{
|
||||||
free(*alias);
|
for (alias = hostent->h_aliases; *alias; alias++)
|
||||||
}
|
free(*alias);
|
||||||
free(hostent->h_aliases);
|
}
|
||||||
if (hostent->h_addr_list)
|
if(hostent->h_aliases)
|
||||||
free(hostent->h_addr_list[0]);
|
free(hostent->h_aliases);
|
||||||
free(hostent->h_addr_list);
|
if (hostent->h_addr_list && hostent->h_addr_list[0])
|
||||||
}
|
free(hostent->h_addr_list[0]);
|
||||||
free(hostent);
|
if(hostent->h_addr_list)
|
||||||
|
free(hostent->h_addr_list);
|
||||||
|
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);
|
||||||
@@ -100,26 +118,30 @@ static void next_lookup(struct host_query *hquery)
|
|||||||
struct hostent *host;
|
struct hostent *host;
|
||||||
|
|
||||||
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.
|
||||||
331
ares/ares_getnameinfo.c
Normal file
331
ares/ares_getnameinfo.c
Normal file
@@ -0,0 +1,331 @@
|
|||||||
|
/* 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)
|
||||||
|
{
|
||||||
|
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 (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";
|
||||||
|
se = getservbyport(port, proto);
|
||||||
|
if (se && se->s_name)
|
||||||
|
strcpy(buf, se->s_name);
|
||||||
|
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
|
||||||
|
|||||||
544
ares/ares_init.c
544
ares/ares_init.c
@@ -13,19 +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 <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>
|
||||||
@@ -35,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)
|
||||||
{
|
{
|
||||||
@@ -60,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;
|
||||||
@@ -85,6 +111,8 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
|||||||
channel->nsort = -1;
|
channel->nsort = -1;
|
||||||
channel->lookups = NULL;
|
channel->lookups = NULL;
|
||||||
channel->queries = NULL;
|
channel->queries = NULL;
|
||||||
|
channel->domains = NULL;
|
||||||
|
channel->sortlist = NULL;
|
||||||
|
|
||||||
/* Initialize configuration by each of the four sources, from highest
|
/* Initialize configuration by each of the four sources, from highest
|
||||||
* precedence to lowest.
|
* precedence to lowest.
|
||||||
@@ -100,16 +128,17 @@ 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->ndomains != -1)
|
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->nsort != -1)
|
if (channel->sortlist)
|
||||||
free(channel->sortlist);
|
free(channel->sortlist);
|
||||||
free(channel->lookups);
|
if(channel->lookups)
|
||||||
|
free(channel->lookups);
|
||||||
free(channel);
|
free(channel);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -122,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;
|
||||||
@@ -146,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;
|
||||||
|
|
||||||
@@ -168,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,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;
|
||||||
@@ -215,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");
|
||||||
@@ -223,31 +252,32 @@ 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;
|
||||||
}
|
}
|
||||||
#ifdef WIN32
|
|
||||||
static int get_res_size_nt(HKEY hKey, char *subkey, int *size)
|
|
||||||
{
|
|
||||||
return RegQueryValueEx(hKey, subkey, 0, NULL, NULL, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Warning: returns a dynamically allocated buffer, the user MUST
|
#ifdef WIN32
|
||||||
|
/*
|
||||||
|
* Warning: returns a dynamically allocated buffer, the user MUST
|
||||||
* use free() if the function returns 1
|
* use free() if the function returns 1
|
||||||
*/
|
*/
|
||||||
static int get_res_nt(HKEY hKey, char *subkey, char **obuf)
|
static int get_res_nt(HKEY hKey, const char *subkey, char **obuf)
|
||||||
{
|
{
|
||||||
/* Test for the size we need */
|
/* Test for the size we need */
|
||||||
int size = 0;
|
DWORD size = 0;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
result = RegQueryValueEx(hKey, subkey, 0, NULL, NULL, &size);
|
result = RegQueryValueEx(hKey, subkey, 0, NULL, NULL, &size);
|
||||||
if ((result != ERROR_SUCCESS && result != ERROR_MORE_DATA) || !size)
|
if ((result != ERROR_SUCCESS && result != ERROR_MORE_DATA) || !size)
|
||||||
return 0;
|
return 0;
|
||||||
*obuf = malloc(size+1);
|
*obuf = malloc(size+1);
|
||||||
|
if (!*obuf)
|
||||||
|
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;
|
||||||
@@ -260,54 +290,132 @@ static int get_res_nt(HKEY hKey, char *subkey, char **obuf)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_res_interfaces_nt(HKEY hKey, char *subkey, char **obuf)
|
static int get_res_interfaces_nt(HKEY hKey, const char *subkey, char **obuf)
|
||||||
{
|
{
|
||||||
char enumbuf[39]; /* GUIDs are 38 chars + 1 for NULL */
|
char enumbuf[39]; /* GUIDs are 38 chars + 1 for NULL */
|
||||||
int enum_size = 39;
|
DWORD enum_size = 39;
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
HKEY hVal;
|
HKEY hVal;
|
||||||
|
|
||||||
while (RegEnumKeyEx(hKey, idx++, enumbuf, &enum_size, 0,
|
while (RegEnumKeyEx(hKey, idx++, enumbuf, &enum_size, 0,
|
||||||
NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS)
|
NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS)
|
||||||
{
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
enum_size = 39;
|
enum_size = 39;
|
||||||
if (RegOpenKeyEx(hKey, enumbuf, 0, KEY_QUERY_VALUE, &hVal) !=
|
if (RegOpenKeyEx(hKey, enumbuf, 0, KEY_QUERY_VALUE, &hVal) !=
|
||||||
ERROR_SUCCESS)
|
ERROR_SUCCESS)
|
||||||
continue;
|
continue;
|
||||||
if (!get_res_nt(hVal, subkey, obuf))
|
rc = get_res_nt(hVal, subkey, obuf);
|
||||||
RegCloseKey(hVal);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RegCloseKey(hVal);
|
RegCloseKey(hVal);
|
||||||
|
if (rc)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
||||||
|
{
|
||||||
|
FIXED_INFO *fi = alloca (sizeof(*fi));
|
||||||
|
DWORD size = sizeof (*fi);
|
||||||
|
typedef DWORD (WINAPI* get_net_param_func) (FIXED_INFO*, DWORD*);
|
||||||
|
get_net_param_func GetNetworkParams; /* available only on Win-98/2000+ */
|
||||||
|
HMODULE handle;
|
||||||
|
IP_ADDR_STRING *ipAddr;
|
||||||
|
int i, count = 0;
|
||||||
|
int debug = 0;
|
||||||
|
size_t ip_size = sizeof("255.255.255.255,")-1;
|
||||||
|
size_t left = ret_size;
|
||||||
|
char *ret = ret_buf;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
if (!fi)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
handle = LoadLibrary ("iphlpapi.dll");
|
||||||
|
if (!handle)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
GetNetworkParams = (get_net_param_func) GetProcAddress (handle, "GetNetworkParams");
|
||||||
|
if (!GetNetworkParams)
|
||||||
|
goto quit;
|
||||||
|
|
||||||
|
res = (*GetNetworkParams) (fi, &size);
|
||||||
|
if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
|
||||||
|
goto quit;
|
||||||
|
|
||||||
|
fi = alloca (size);
|
||||||
|
if (!fi || (*GetNetworkParams) (fi, &size) != ERROR_SUCCESS)
|
||||||
|
goto quit;
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
{
|
||||||
|
printf ("Host Name: %s\n", fi->HostName);
|
||||||
|
printf ("Domain Name: %s\n", fi->DomainName);
|
||||||
|
printf ("DNS Servers:\n"
|
||||||
|
" %s (primary)\n", fi->DnsServerList.IpAddress.String);
|
||||||
|
}
|
||||||
|
if (inet_addr(fi->DnsServerList.IpAddress.String) != INADDR_NONE &&
|
||||||
|
left > ip_size)
|
||||||
|
{
|
||||||
|
ret += sprintf (ret, "%s,", fi->DnsServerList.IpAddress.String);
|
||||||
|
left -= ret - ret_buf;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0, ipAddr = fi->DnsServerList.Next; ipAddr && left > ip_size;
|
||||||
|
ipAddr = ipAddr->Next, i++)
|
||||||
|
{
|
||||||
|
if (inet_addr(ipAddr->IpAddress.String) != INADDR_NONE)
|
||||||
|
{
|
||||||
|
ret += sprintf (ret, "%s,", ipAddr->IpAddress.String);
|
||||||
|
left -= ret - ret_buf;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
if (debug)
|
||||||
|
printf (" %s (secondary %d)\n", ipAddr->IpAddress.String, i+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
quit:
|
||||||
|
if (handle)
|
||||||
|
FreeLibrary (handle);
|
||||||
|
|
||||||
|
if (debug && left <= ip_size)
|
||||||
|
printf ("Too many nameservers. Truncating to %d addressess", count);
|
||||||
|
if (ret > ret_buf)
|
||||||
|
ret[-1] = '\0';
|
||||||
|
return (count);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
NameServer info via IPHLPAPI (IP helper API):
|
||||||
|
GetNetworkParams() should be the trusted source for this.
|
||||||
|
Available in Win-98/2000 and later. If that fail, fall-back to
|
||||||
|
registry information.
|
||||||
|
|
||||||
NameServer Registry:
|
NameServer Registry:
|
||||||
|
|
||||||
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
|
||||||
*/
|
*/
|
||||||
@@ -317,11 +425,19 @@ DhcpNameServer
|
|||||||
DWORD data_type;
|
DWORD data_type;
|
||||||
DWORD bytes;
|
DWORD bytes;
|
||||||
DWORD result;
|
DWORD result;
|
||||||
DWORD keysize = MAX_PATH;
|
char buf[256];
|
||||||
|
|
||||||
status = ARES_EFILE;
|
if (channel->nservers > -1) /* don't override ARES_OPT_SERVER */
|
||||||
|
return ARES_SUCCESS;
|
||||||
|
|
||||||
if (IsNT)
|
if (get_iphlpapi_dns_info(buf,sizeof(buf)) > 0)
|
||||||
|
{
|
||||||
|
status = config_nameserver(&servers, &nservers, buf);
|
||||||
|
if (status == ARES_SUCCESS)
|
||||||
|
goto okay;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_NT())
|
||||||
{
|
{
|
||||||
if (RegOpenKeyEx(
|
if (RegOpenKeyEx(
|
||||||
HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,
|
HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,
|
||||||
@@ -365,7 +481,7 @@ DhcpNameServer
|
|||||||
if ((result = RegQueryValueEx(
|
if ((result = RegQueryValueEx(
|
||||||
mykey, NAMESERVER, NULL, &data_type,
|
mykey, NAMESERVER, NULL, &data_type,
|
||||||
NULL, &bytes
|
NULL, &bytes
|
||||||
)
|
)
|
||||||
) == ERROR_SUCCESS ||
|
) == ERROR_SUCCESS ||
|
||||||
result == ERROR_MORE_DATA)
|
result == ERROR_MORE_DATA)
|
||||||
{
|
{
|
||||||
@@ -381,19 +497,12 @@ DhcpNameServer
|
|||||||
free(line);
|
free(line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RegCloseKey(mykey);
|
RegCloseKey(mykey);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status != ARES_EFILE)
|
if (status == ARES_SUCCESS)
|
||||||
{
|
|
||||||
/*
|
|
||||||
if (!channel->lookups) {
|
|
||||||
status = config_lookup(channel, "file bind");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
status = ARES_EOF;
|
status = ARES_EOF;
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(riscos)
|
#elif defined(riscos)
|
||||||
|
|
||||||
@@ -401,7 +510,7 @@ DhcpNameServer
|
|||||||
system variable Inet$Resolvers, space separated. */
|
system variable Inet$Resolvers, space separated. */
|
||||||
|
|
||||||
line = getenv("Inet$Resolvers");
|
line = getenv("Inet$Resolvers");
|
||||||
status = ARES_EFILE;
|
status = ARES_EOF;
|
||||||
if (line) {
|
if (line) {
|
||||||
char *resolvers = strdup(line), *pos, *space;
|
char *resolvers = strdup(line), *pos, *space;
|
||||||
|
|
||||||
@@ -421,26 +530,44 @@ DhcpNameServer
|
|||||||
|
|
||||||
if (status == ARES_SUCCESS)
|
if (status == ARES_SUCCESS)
|
||||||
status = ARES_EOF;
|
status = ARES_EOF;
|
||||||
|
|
||||||
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;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
int linesize;
|
int linesize;
|
||||||
|
|
||||||
fp = fopen(PATH_RESOLV_CONF, "r");
|
fp = fopen(PATH_RESOLV_CONF, "r");
|
||||||
if (!fp)
|
if (!fp)
|
||||||
return (errno == ENOENT) ? ARES_SUCCESS : ARES_EFILE;
|
return (errno == ENOENT) ? ARES_SUCCESS : ARES_EFILE;
|
||||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
if ((p = try_config(line, "domain")) && channel->ndomains == -1)
|
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")) && channel->ndomains == -1)
|
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)
|
||||||
status = config_nameserver(&servers, &nservers, p);
|
status = config_nameserver(&servers, &nservers, p);
|
||||||
@@ -453,8 +580,49 @@ DhcpNameServer
|
|||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
free(line);
|
|
||||||
fclose(fp);
|
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)
|
||||||
|
free(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -462,12 +630,17 @@ DhcpNameServer
|
|||||||
/* Handle errors. */
|
/* Handle errors. */
|
||||||
if (status != ARES_EOF)
|
if (status != ARES_EOF)
|
||||||
{
|
{
|
||||||
if (servers != NULL) free(servers);
|
if (servers != NULL)
|
||||||
if (sortlist != NULL) free(sortlist);
|
free(servers);
|
||||||
|
if (sortlist != NULL)
|
||||||
|
free(sortlist);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we got any name server entries, fill them in. */
|
/* If we got any name server entries, fill them in. */
|
||||||
|
#ifdef WIN32
|
||||||
|
okay:
|
||||||
|
#endif
|
||||||
if (servers)
|
if (servers)
|
||||||
{
|
{
|
||||||
channel->servers = servers;
|
channel->servers = servers;
|
||||||
@@ -506,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;
|
||||||
}
|
}
|
||||||
@@ -517,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)
|
||||||
@@ -543,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;
|
||||||
@@ -563,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;
|
||||||
@@ -576,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;
|
||||||
@@ -649,67 +828,111 @@ 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)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
const char *p, *q;
|
const char *p, *q;
|
||||||
|
|
||||||
|
if(channel->ndomains != -1) {
|
||||||
|
/* if we already have some domains present, free them first */
|
||||||
|
for(n=0; n < channel->ndomains; n++)
|
||||||
|
free(channel->domains[n]);
|
||||||
|
free(channel->domains);
|
||||||
|
channel->ndomains = -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Count the domains given. */
|
/* Count the domains given. */
|
||||||
n = 0;
|
n = 0;
|
||||||
p = str;
|
p = 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++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -725,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;
|
||||||
@@ -750,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;
|
||||||
@@ -781,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)
|
||||||
@@ -810,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,17 +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
|
||||||
callback(arg, status, NULL, 0);
|
{
|
||||||
|
/* failed, free the malloc()ed memory */
|
||||||
|
free(squery->name);
|
||||||
|
free(squery);
|
||||||
|
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;
|
||||||
@@ -143,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);
|
||||||
@@ -223,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,56 +1,351 @@
|
|||||||
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)
|
||||||
AC_PROG_CC
|
AM_MAINTAINER_MODE
|
||||||
AC_PROG_INSTALL
|
AM_INIT_AUTOMAKE(c-ares, CVS)
|
||||||
AC_PROG_RANLIB
|
|
||||||
|
AC_PROG_CC
|
||||||
AC_CANONICAL_HOST
|
AC_PROG_INSTALL
|
||||||
case $host_os in
|
|
||||||
solaris*)
|
case $host_os in
|
||||||
AC_DEFINE(ETC_INET)
|
solaris*)
|
||||||
;;
|
AC_DEFINE(ETC_INET, 1, [if a /etc/inet dir is being used])
|
||||||
esac
|
;;
|
||||||
|
esac
|
||||||
AC_SEARCH_LIBS(gethostbyname, nsl)
|
|
||||||
AC_SEARCH_LIBS(socket, socket)
|
# check for ssize_t
|
||||||
|
AC_CHECK_TYPE(ssize_t, ,
|
||||||
dnl ************************************************************
|
AC_DEFINE(ssize_t, int, [the signed version of size_t]))
|
||||||
dnl Option to switch on debug options. This makes an assumption that
|
|
||||||
dnl this is built as an 'ares' subdir in the curl source tree. Subject for
|
AC_SEARCH_LIBS(gethostbyname, nsl)
|
||||||
dnl improval in the future!
|
AC_SEARCH_LIBS(socket, socket)
|
||||||
dnl
|
|
||||||
AC_MSG_CHECKING([whether to enable debug options])
|
dnl ************************************************************
|
||||||
AC_ARG_ENABLE(debug,
|
dnl Option to switch on debug options. This makes an assumption that
|
||||||
AC_HELP_STRING([--enable-debug],[Enable pedantic debug options])
|
dnl this is built as an 'ares' subdir in the curl source tree. Subject for
|
||||||
AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
dnl improval in the future!
|
||||||
[ case "$enableval" in
|
dnl
|
||||||
no)
|
AC_MSG_CHECKING([whether to enable debug options])
|
||||||
AC_MSG_RESULT(no)
|
AC_ARG_ENABLE(debug,
|
||||||
;;
|
AC_HELP_STRING([--enable-debug],[Enable pedantic debug options])
|
||||||
*) AC_MSG_RESULT(yes)
|
AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||||
|
[ case "$enableval" in
|
||||||
dnl Checks for standard header files, to make memdebug.h inclusions bettter
|
no)
|
||||||
AC_HEADER_STDC
|
AC_MSG_RESULT(no)
|
||||||
|
;;
|
||||||
CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I../include"
|
*) AC_MSG_RESULT(yes)
|
||||||
CFLAGS="$CFLAGS -g"
|
|
||||||
|
dnl when doing the debug stuff, use static library only
|
||||||
dnl set compiler "debug" options to become more picky, and remove
|
AC_DISABLE_SHARED
|
||||||
dnl optimize options from CFLAGS
|
|
||||||
CURL_CC_DEBUG_OPTS
|
dnl Checks for standard header files, to make memdebug.h inclusions bettter
|
||||||
|
AC_HEADER_STDC
|
||||||
;;
|
|
||||||
esac ],
|
dnl the entire --enable-debug is a hack that lives and runs on top of
|
||||||
AC_MSG_RESULT(no)
|
dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier
|
||||||
)
|
AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl])
|
||||||
|
|
||||||
dnl check for a few basic system headers we need
|
CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include"
|
||||||
dnl AC_CHECK_HEADERS(
|
CFLAGS="$CFLAGS -g"
|
||||||
dnl sys/types.h \
|
|
||||||
dnl sys/time.h \
|
dnl set compiler "debug" options to become more picky, and remove
|
||||||
dnl sys/select.h \
|
dnl optimize options from CFLAGS
|
||||||
dnl sys/socket.h \
|
CURL_CC_DEBUG_OPTS
|
||||||
dnl )
|
|
||||||
|
;;
|
||||||
AC_OUTPUT(Makefile)
|
esac ],
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_PROG_LIBTOOL
|
||||||
|
|
||||||
|
dnl check for a few basic system headers we need
|
||||||
|
AC_CHECK_HEADERS(
|
||||||
|
sys/types.h \
|
||||||
|
sys/time.h \
|
||||||
|
sys/select.h \
|
||||||
|
sys/socket.h \
|
||||||
|
sys/ioctl.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
|
||||||
|
)
|
||||||
|
|
||||||
|
if test "$ac_have_sockaddr_in6" = "yes" ; then
|
||||||
|
CARES_CHECK_STRUCT_MEMBER(
|
||||||
|
[
|
||||||
|
#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], [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.])
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl check for the addrinfo 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
|
||||||
|
], [addrinfo],
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1,
|
||||||
|
[Define to 1 if you have struct addrinfo.])
|
||||||
|
)
|
||||||
|
|
||||||
|
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])
|
||||||
|
|
||||||
|
CURL_CHECK_NONBLOCKING_SOCKET
|
||||||
|
|
||||||
|
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
|
||||||
@@ -124,7 +138,7 @@ typedef enum __ns_opcode {
|
|||||||
|
|
||||||
#define QUERY ns_o_query
|
#define QUERY ns_o_query
|
||||||
|
|
||||||
#define NS_MAXLABEL 63
|
#define NS_MAXLABEL 63
|
||||||
#define MAXLABEL NS_MAXLABEL
|
#define MAXLABEL NS_MAXLABEL
|
||||||
|
|
||||||
#define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
|
#define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
|
||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -7,19 +7,19 @@
|
|||||||
CFG=areslib - Win32 Debug
|
CFG=areslib - Win32 Debug
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||||
!MESSAGE use the Export Makefile command and run
|
!MESSAGE use the Export Makefile command and run
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE NMAKE /f "areslib.mak".
|
!MESSAGE NMAKE /f "areslib.mak".
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
!MESSAGE You can specify a configuration when running NMAKE
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE NMAKE /f "areslib.mak" CFG="areslib - Win32 Debug"
|
!MESSAGE NMAKE /f "areslib.mak" CFG="areslib - Win32 Debug"
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE Possible choices for configuration are:
|
!MESSAGE Possible choices for configuration are:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE "areslib - Win32 Release" (based on "Win32 (x86) Static Library")
|
!MESSAGE "areslib - Win32 Release" (based on "Win32 (x86) Static Library")
|
||||||
!MESSAGE "areslib - Win32 Debug" (based on "Win32 (x86) Static Library")
|
!MESSAGE "areslib - Win32 Debug" (based on "Win32 (x86) Static Library")
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
|
|
||||||
# Begin Project
|
# Begin Project
|
||||||
# PROP AllowPerConfigDependencies 0
|
# PROP AllowPerConfigDependencies 0
|
||||||
@@ -74,7 +74,7 @@ LIB32=link.exe -lib
|
|||||||
# ADD BASE LIB32 /nologo
|
# ADD BASE LIB32 /nologo
|
||||||
# ADD LIB32 /nologo
|
# ADD LIB32 /nologo
|
||||||
|
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
# Begin Target
|
# Begin Target
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -1,361 +1,367 @@
|
|||||||
# Microsoft Developer Studio Generated NMAKE File, Based on areslib.dsp
|
# Microsoft Developer Studio Generated NMAKE File, Based on areslib.dsp
|
||||||
!IF "$(CFG)" == ""
|
!IF "$(CFG)" == ""
|
||||||
CFG=areslib - Win32 Debug
|
CFG=areslib - Win32 Debug
|
||||||
!MESSAGE No configuration specified. Defaulting to areslib - Win32 Debug.
|
!MESSAGE No configuration specified. Defaulting to areslib - Win32 Debug.
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
!IF "$(CFG)" != "areslib - Win32 Release" && "$(CFG)" != "areslib - Win32 Debug"
|
!IF "$(CFG)" != "areslib - Win32 Release" && "$(CFG)" != "areslib - Win32 Debug"
|
||||||
!MESSAGE Invalid configuration "$(CFG)" specified.
|
!MESSAGE Invalid configuration "$(CFG)" specified.
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
!MESSAGE You can specify a configuration when running NMAKE
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE NMAKE /f "areslib.mak" CFG="areslib - Win32 Debug"
|
!MESSAGE NMAKE /f "areslib.mak" CFG="areslib - Win32 Debug"
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE Possible choices for configuration are:
|
!MESSAGE Possible choices for configuration are:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE "areslib - Win32 Release" (based on "Win32 (x86) Static Library")
|
!MESSAGE "areslib - Win32 Release" (based on "Win32 (x86) Static Library")
|
||||||
!MESSAGE "areslib - Win32 Debug" (based on "Win32 (x86) Static Library")
|
!MESSAGE "areslib - Win32 Debug" (based on "Win32 (x86) Static Library")
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!ERROR An invalid configuration is specified.
|
!ERROR An invalid configuration is specified.
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
!IF "$(OS)" == "Windows_NT"
|
!IF "$(OS)" == "Windows_NT"
|
||||||
NULL=
|
NULL=
|
||||||
!ELSE
|
!ELSE
|
||||||
NULL=nul
|
NULL=nul
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
CPP=cl.exe
|
CPP=cl.exe
|
||||||
RSC=rc.exe
|
RSC=rc.exe
|
||||||
|
|
||||||
!IF "$(CFG)" == "areslib - Win32 Release"
|
!IF "$(CFG)" == "areslib - Win32 Release"
|
||||||
|
|
||||||
OUTDIR=.\Release
|
OUTDIR=.\Release
|
||||||
INTDIR=.\Release
|
INTDIR=.\Release
|
||||||
# Begin Custom Macros
|
# Begin Custom Macros
|
||||||
OutDir=.\Release
|
OutDir=.\Release
|
||||||
# End Custom Macros
|
# End Custom Macros
|
||||||
|
|
||||||
ALL : "$(OUTDIR)\areslib.lib"
|
ALL : "$(OUTDIR)\areslib.lib"
|
||||||
|
|
||||||
|
|
||||||
CLEAN :
|
CLEAN :
|
||||||
-@erase "$(INTDIR)\ares__close_sockets.obj"
|
-@erase "$(INTDIR)\ares__close_sockets.obj"
|
||||||
-@erase "$(INTDIR)\ares__get_hostent.obj"
|
-@erase "$(INTDIR)\ares__get_hostent.obj"
|
||||||
-@erase "$(INTDIR)\ares__read_line.obj"
|
-@erase "$(INTDIR)\ares__read_line.obj"
|
||||||
-@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"
|
-@erase "$(INTDIR)\ares_gethostbyname.obj"
|
||||||
-@erase "$(INTDIR)\ares_gethostbyname.obj"
|
-@erase "$(INTDIR)\ares_init.obj"
|
||||||
-@erase "$(INTDIR)\ares_init.obj"
|
-@erase "$(INTDIR)\ares_mkquery.obj"
|
||||||
-@erase "$(INTDIR)\ares_mkquery.obj"
|
-@erase "$(INTDIR)\ares_parse_a_reply.obj"
|
||||||
-@erase "$(INTDIR)\ares_parse_a_reply.obj"
|
-@erase "$(INTDIR)\ares_parse_ptr_reply.obj"
|
||||||
-@erase "$(INTDIR)\ares_parse_ptr_reply.obj"
|
-@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_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"
|
-@erase "$(INTDIR)\vc60.idb"
|
||||||
-@erase "$(INTDIR)\vc60.idb"
|
-@erase "$(INTDIR)\windows_port.obj"
|
||||||
-@erase "$(INTDIR)\windows_port.obj"
|
-@erase "$(OUTDIR)\areslib.lib"
|
||||||
-@erase "$(OUTDIR)\areslib.lib"
|
|
||||||
|
"$(OUTDIR)" :
|
||||||
"$(OUTDIR)" :
|
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
|
||||||
|
CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
|
||||||
CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
|
BSC32=bscmake.exe
|
||||||
BSC32=bscmake.exe
|
BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc"
|
||||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc"
|
BSC32_SBRS= \
|
||||||
BSC32_SBRS= \
|
|
||||||
|
LIB32=link.exe -lib
|
||||||
LIB32=link.exe -lib
|
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib"
|
||||||
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib"
|
LIB32_OBJS= \
|
||||||
LIB32_OBJS= \
|
"$(INTDIR)\ares__close_sockets.obj" \
|
||||||
"$(INTDIR)\ares__close_sockets.obj" \
|
"$(INTDIR)\ares__get_hostent.obj" \
|
||||||
"$(INTDIR)\ares__get_hostent.obj" \
|
"$(INTDIR)\ares__read_line.obj" \
|
||||||
"$(INTDIR)\ares__read_line.obj" \
|
"$(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_hostent.obj" \
|
||||||
"$(INTDIR)\ares_free_errmem.obj" \
|
"$(INTDIR)\ares_free_string.obj" \
|
||||||
"$(INTDIR)\ares_free_hostent.obj" \
|
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
||||||
"$(INTDIR)\ares_free_string.obj" \
|
"$(INTDIR)\ares_gethostbyname.obj" \
|
||||||
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
"$(INTDIR)\ares_init.obj" \
|
||||||
"$(INTDIR)\ares_gethostbyname.obj" \
|
"$(INTDIR)\ares_mkquery.obj" \
|
||||||
"$(INTDIR)\ares_init.obj" \
|
"$(INTDIR)\ares_parse_a_reply.obj" \
|
||||||
"$(INTDIR)\ares_mkquery.obj" \
|
"$(INTDIR)\ares_parse_ptr_reply.obj" \
|
||||||
"$(INTDIR)\ares_parse_a_reply.obj" \
|
"$(INTDIR)\ares_process.obj" \
|
||||||
"$(INTDIR)\ares_parse_ptr_reply.obj" \
|
"$(INTDIR)\ares_query.obj" \
|
||||||
"$(INTDIR)\ares_process.obj" \
|
"$(INTDIR)\ares_search.obj" \
|
||||||
"$(INTDIR)\ares_query.obj" \
|
"$(INTDIR)\ares_cancel.obj" \
|
||||||
"$(INTDIR)\ares_search.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" \
|
||||||
"$(INTDIR)\windows_port.obj"
|
"$(INTDIR)\windows_port.obj"
|
||||||
|
|
||||||
"$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
|
"$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
|
||||||
$(LIB32) @<<
|
$(LIB32) @<<
|
||||||
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
|
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
|
||||||
<<
|
<<
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "areslib - Win32 Debug"
|
!ELSEIF "$(CFG)" == "areslib - Win32 Debug"
|
||||||
|
|
||||||
OUTDIR=.\Debug
|
OUTDIR=.\Debug
|
||||||
INTDIR=.\Debug
|
INTDIR=.\Debug
|
||||||
# Begin Custom Macros
|
# Begin Custom Macros
|
||||||
OutDir=.\Debug
|
OutDir=.\Debug
|
||||||
# End Custom Macros
|
# End Custom Macros
|
||||||
|
|
||||||
ALL : "$(OUTDIR)\areslib.lib"
|
ALL : "$(OUTDIR)\areslib.lib"
|
||||||
|
|
||||||
|
|
||||||
CLEAN :
|
CLEAN :
|
||||||
-@erase "$(INTDIR)\ares__close_sockets.obj"
|
-@erase "$(INTDIR)\ares__close_sockets.obj"
|
||||||
-@erase "$(INTDIR)\ares__get_hostent.obj"
|
-@erase "$(INTDIR)\ares__get_hostent.obj"
|
||||||
-@erase "$(INTDIR)\ares__read_line.obj"
|
-@erase "$(INTDIR)\ares__read_line.obj"
|
||||||
-@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"
|
-@erase "$(INTDIR)\ares_gethostbyname.obj"
|
||||||
-@erase "$(INTDIR)\ares_gethostbyname.obj"
|
-@erase "$(INTDIR)\ares_init.obj"
|
||||||
-@erase "$(INTDIR)\ares_init.obj"
|
-@erase "$(INTDIR)\ares_mkquery.obj"
|
||||||
-@erase "$(INTDIR)\ares_mkquery.obj"
|
-@erase "$(INTDIR)\ares_parse_a_reply.obj"
|
||||||
-@erase "$(INTDIR)\ares_parse_a_reply.obj"
|
-@erase "$(INTDIR)\ares_parse_ptr_reply.obj"
|
||||||
-@erase "$(INTDIR)\ares_parse_ptr_reply.obj"
|
-@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_send.obj"
|
-@erase "$(INTDIR)\ares_version.obj"
|
||||||
-@erase "$(INTDIR)\ares_strerror.obj"
|
-@erase "$(INTDIR)\ares_send.obj"
|
||||||
-@erase "$(INTDIR)\ares_timeout.obj"
|
-@erase "$(INTDIR)\ares_strerror.obj"
|
||||||
-@erase "$(INTDIR)\vc60.idb"
|
-@erase "$(INTDIR)\ares_timeout.obj"
|
||||||
-@erase "$(INTDIR)\vc60.pdb"
|
-@erase "$(INTDIR)\vc60.idb"
|
||||||
-@erase "$(INTDIR)\windows_port.obj"
|
-@erase "$(INTDIR)\vc60.pdb"
|
||||||
-@erase "$(OUTDIR)\areslib.lib"
|
-@erase "$(INTDIR)\windows_port.obj"
|
||||||
|
-@erase "$(OUTDIR)\areslib.lib"
|
||||||
"$(OUTDIR)" :
|
|
||||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
"$(OUTDIR)" :
|
||||||
|
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||||
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
|
|
||||||
BSC32=bscmake.exe
|
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
|
||||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc"
|
BSC32=bscmake.exe
|
||||||
BSC32_SBRS= \
|
BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc"
|
||||||
|
BSC32_SBRS= \
|
||||||
LIB32=link.exe -lib
|
|
||||||
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib"
|
LIB32=link.exe -lib
|
||||||
LIB32_OBJS= \
|
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib"
|
||||||
"$(INTDIR)\ares__close_sockets.obj" \
|
LIB32_OBJS= \
|
||||||
"$(INTDIR)\ares__get_hostent.obj" \
|
"$(INTDIR)\ares__close_sockets.obj" \
|
||||||
"$(INTDIR)\ares__read_line.obj" \
|
"$(INTDIR)\ares__get_hostent.obj" \
|
||||||
"$(INTDIR)\ares_destroy.obj" \
|
"$(INTDIR)\ares__read_line.obj" \
|
||||||
"$(INTDIR)\ares_expand_name.obj" \
|
"$(INTDIR)\ares_destroy.obj" \
|
||||||
"$(INTDIR)\ares_fds.obj" \
|
"$(INTDIR)\ares_expand_name.obj" \
|
||||||
"$(INTDIR)\ares_free_errmem.obj" \
|
"$(INTDIR)\ares_fds.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" \
|
||||||
"$(INTDIR)\ares_gethostbyname.obj" \
|
"$(INTDIR)\ares_gethostbyname.obj" \
|
||||||
"$(INTDIR)\ares_init.obj" \
|
"$(INTDIR)\ares_init.obj" \
|
||||||
"$(INTDIR)\ares_mkquery.obj" \
|
"$(INTDIR)\ares_mkquery.obj" \
|
||||||
"$(INTDIR)\ares_parse_a_reply.obj" \
|
"$(INTDIR)\ares_parse_a_reply.obj" \
|
||||||
"$(INTDIR)\ares_parse_ptr_reply.obj" \
|
"$(INTDIR)\ares_parse_ptr_reply.obj" \
|
||||||
"$(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_send.obj" \
|
"$(INTDIR)\ares_send.obj" \
|
||||||
"$(INTDIR)\ares_strerror.obj" \
|
"$(INTDIR)\ares_strerror.obj" \
|
||||||
"$(INTDIR)\ares_timeout.obj" \
|
"$(INTDIR)\ares_timeout.obj" \
|
||||||
"$(INTDIR)\windows_port.obj"
|
"$(INTDIR)\windows_port.obj"
|
||||||
|
|
||||||
"$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
|
"$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
|
||||||
$(LIB32) @<<
|
$(LIB32) @<<
|
||||||
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
|
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
|
||||||
<<
|
<<
|
||||||
|
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
.c{$(INTDIR)}.obj::
|
.c{$(INTDIR)}.obj::
|
||||||
$(CPP) @<<
|
$(CPP) @<<
|
||||||
$(CPP_PROJ) $<
|
$(CPP_PROJ) $<
|
||||||
<<
|
<<
|
||||||
|
|
||||||
.cpp{$(INTDIR)}.obj::
|
.cpp{$(INTDIR)}.obj::
|
||||||
$(CPP) @<<
|
$(CPP) @<<
|
||||||
$(CPP_PROJ) $<
|
$(CPP_PROJ) $<
|
||||||
<<
|
<<
|
||||||
|
|
||||||
.cxx{$(INTDIR)}.obj::
|
.cxx{$(INTDIR)}.obj::
|
||||||
$(CPP) @<<
|
$(CPP) @<<
|
||||||
$(CPP_PROJ) $<
|
$(CPP_PROJ) $<
|
||||||
<<
|
<<
|
||||||
|
|
||||||
.c{$(INTDIR)}.sbr::
|
.c{$(INTDIR)}.sbr::
|
||||||
$(CPP) @<<
|
$(CPP) @<<
|
||||||
$(CPP_PROJ) $<
|
$(CPP_PROJ) $<
|
||||||
<<
|
<<
|
||||||
|
|
||||||
.cpp{$(INTDIR)}.sbr::
|
.cpp{$(INTDIR)}.sbr::
|
||||||
$(CPP) @<<
|
$(CPP) @<<
|
||||||
$(CPP_PROJ) $<
|
$(CPP_PROJ) $<
|
||||||
<<
|
<<
|
||||||
|
|
||||||
.cxx{$(INTDIR)}.sbr::
|
.cxx{$(INTDIR)}.sbr::
|
||||||
$(CPP) @<<
|
$(CPP) @<<
|
||||||
$(CPP_PROJ) $<
|
$(CPP_PROJ) $<
|
||||||
<<
|
<<
|
||||||
|
|
||||||
|
|
||||||
!IF "$(NO_EXTERNAL_DEPS)" != "1"
|
!IF "$(NO_EXTERNAL_DEPS)" != "1"
|
||||||
!IF EXISTS("areslib.dep")
|
!IF EXISTS("areslib.dep")
|
||||||
!INCLUDE "areslib.dep"
|
!INCLUDE "areslib.dep"
|
||||||
!ELSE
|
!ELSE
|
||||||
!MESSAGE Warning: cannot find "areslib.dep"
|
!MESSAGE Warning: cannot find "areslib.dep"
|
||||||
!ENDIF
|
!ENDIF
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "areslib - Win32 Release" || "$(CFG)" == "areslib - Win32 Debug"
|
!IF "$(CFG)" == "areslib - Win32 Release" || "$(CFG)" == "areslib - Win32 Debug"
|
||||||
SOURCE=..\..\ares__close_sockets.c
|
SOURCE=..\..\ares__close_sockets.c
|
||||||
|
|
||||||
"$(INTDIR)\ares__close_sockets.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares__close_sockets.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares__get_hostent.c
|
SOURCE=..\..\ares__get_hostent.c
|
||||||
|
|
||||||
"$(INTDIR)\ares__get_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares__get_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares__read_line.c
|
SOURCE=..\..\ares__read_line.c
|
||||||
|
|
||||||
"$(INTDIR)\ares__read_line.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares__read_line.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_destroy.c
|
SOURCE=..\..\ares_destroy.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_destroy.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_destroy.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_expand_name.c
|
SOURCE=..\..\ares_expand_name.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_expand_name.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_expand_name.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_fds.c
|
SOURCE=..\..\ares_fds.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_fds.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_fds.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_free_errmem.c
|
SOURCE=..\..\ares_free_hostent.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_free_errmem.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_free_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_free_hostent.c
|
SOURCE=..\..\ares_free_string.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_free_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_free_string.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_free_string.c
|
SOURCE=..\..\ares_gethostbyaddr.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_free_string.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_gethostbyaddr.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_gethostbyaddr.c
|
SOURCE=..\..\ares_gethostbyname.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_gethostbyaddr.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_gethostbyname.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_gethostbyname.c
|
SOURCE=..\..\ares_init.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_gethostbyname.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_init.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_init.c
|
SOURCE=..\..\ares_mkquery.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_init.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_mkquery.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_mkquery.c
|
SOURCE=..\..\ares_parse_a_reply.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_mkquery.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_parse_a_reply.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_parse_a_reply.c
|
SOURCE=..\..\ares_parse_ptr_reply.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_parse_a_reply.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_parse_ptr_reply.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_parse_ptr_reply.c
|
SOURCE=..\..\ares_process.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_parse_ptr_reply.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_process.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_process.c
|
SOURCE=..\..\ares_query.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_process.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_query.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_query.c
|
SOURCE=..\..\ares_search.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_query.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_search.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_search.c
|
SOURCE=..\..\ares_version.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_search.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_version.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_send.c
|
SOURCE=..\..\ares_cancel.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_cancel.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_strerror.c
|
SOURCE=..\..\ares_send.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_strerror.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_timeout.c
|
SOURCE=..\..\ares_strerror.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_timeout.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_strerror.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\windows_port.c
|
SOURCE=..\..\ares_timeout.c
|
||||||
|
|
||||||
"$(INTDIR)\windows_port.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_timeout.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
|
SOURCE=..\..\windows_port.c
|
||||||
!ENDIF
|
|
||||||
|
"$(INTDIR)\windows_port.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
int
|
/*
|
||||||
ares_gettimeofday(struct timeval *tv, struct timezone *tz)
|
* 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
|
||||||
|
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 */
|
||||||
|
|||||||
66
buildconf
66
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,33 +170,46 @@ else
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
# perl check
|
||||||
|
#
|
||||||
|
PERL=`findtool perl`
|
||||||
|
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
# run the correct scripts now
|
# run the correct scripts now
|
||||||
|
|
||||||
echo "buildconf: running libtoolize"
|
echo "buildconf: running libtoolize"
|
||||||
${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The command '${LIBTOOLIZE:-libtoolize} --copy --automake --force' 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 command '${ACLOCAL:-aclocal}${ACLOCAL_FLAGS:+" $ACLOCAL_FLAGS"}' 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 command '${AUTOHEADER:-autoheader}' 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 command '${AUTOCONF:-autoconf}' 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"
|
||||||
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The command '${ACLOCAL:-aclocal}${ACLOCAL_FLAGS:+" $ACLOCAL_FLAGS"}' failed"
|
${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed"
|
||||||
echo "buildconf: running autoconf in the ares directory"
|
echo "buildconf: running ares/aclocal"
|
||||||
${AUTOCONF:-autoconf} || die "The command '${AUTOCONF:-autoconf}' failed"
|
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed"
|
||||||
|
echo "buildconf: running ares/autoconf"
|
||||||
|
${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 command '${AUTOMAKE:-automake} -a' failed"
|
${AUTOMAKE:-automake} -a || 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
|
||||||
|
|
||||||
|
|||||||
1150
configure.ac
1150
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,50 @@ 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
|
||||||
|
;;
|
||||||
--version)
|
--version)
|
||||||
echo libcurl @VERSION@
|
echo libcurl @VERSION@
|
||||||
exit 0
|
exit 0
|
||||||
@@ -123,8 +145,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,15 @@
|
|||||||
(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" 'curl-code-cleanup)
|
||||||
(setq c-recognize-knr-p nil)
|
(setq c-recognize-knr-p nil)
|
||||||
|
;;; (add-hook 'write-file-hooks 'delete-trailing-whitespace t)
|
||||||
|
(setq show-trailing-whitespace t)
|
||||||
)
|
)
|
||||||
|
|
||||||
;; Set this is in your .emacs if you want to use the c-mode-hook as
|
;; Set this is in your .emacs if you want to use the c-mode-hook as
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
_ _ ____ _
|
_ _ ____ _
|
||||||
___| | | | _ \| |
|
___| | | | _ \| |
|
||||||
/ __| | | | |_) | |
|
/ __| | | | |_) | |
|
||||||
| (__| |_| | _ <| |___
|
| (__| |_| | _ <| |___
|
||||||
\___|\___/|_| \_\_____|
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
libcurl bindings
|
libcurl bindings
|
||||||
@@ -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,59 @@ 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/
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
http://q-lang.sourceforge.net/
|
||||||
|
|
||||||
|
wxWidgets
|
||||||
|
|
||||||
|
Written by Casey O'Donnell
|
||||||
|
http://homepage.mac.com/codonnell/wxcurldav/
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
_ _ ____ _
|
_ _ ____ _
|
||||||
___| | | | _ \| |
|
___| | | | _ \| |
|
||||||
/ __| | | | |_) | |
|
/ __| | | | |_) | |
|
||||||
| (__| |_| | _ <| |___
|
| (__| |_| | _ <| |___
|
||||||
\___|\___/|_| \_\_____|
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
To Think About When Contributing Source Code
|
To Think About When Contributing Source Code
|
||||||
@@ -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:
|
||||||
|
|
||||||
|
|||||||
186
docs/DISTRO-DILEMMA
Normal file
186
docs/DISTRO-DILEMMA
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
Date: September 1, 2005
|
||||||
|
Author: Daniel Stenberg <daniel@haxx.se>
|
||||||
|
URL: http://curl.haxx.se/legal/distro-dilemma.html
|
||||||
|
|
||||||
|
Condition
|
||||||
|
|
||||||
|
This document is written to describe the sitution as it is right now. libcurl
|
||||||
|
7.14.0 is currently the latest version available. Things may (or perhaps
|
||||||
|
will) of course change in the future.
|
||||||
|
|
||||||
|
This document reflects my view and understanding of these things. Please tell
|
||||||
|
me where and how you think I'm wrong, and I'll try to correct my mistakes.
|
||||||
|
|
||||||
|
Background
|
||||||
|
|
||||||
|
The Free Software Foundation has deemed the Original BSD license[1] to be
|
||||||
|
"incompatible"[2] with GPL[3]. I'd rather say it is the other way around, but
|
||||||
|
the point is the same: if you distribute a binary version of a GPL program,
|
||||||
|
it MUST NOT be linked with any Original BSD-licenced 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
|
||||||
|
uderlying 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 can be burdonsome for embedded
|
||||||
|
systems usage).
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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
|
||||||
|
|||||||
27
docs/HISTORY
27
docs/HISTORY
@@ -1,7 +1,7 @@
|
|||||||
_ _ ____ _
|
_ _ ____ _
|
||||||
___| | | | _ \| |
|
___| | | | _ \| |
|
||||||
/ __| | | | |_) | |
|
/ __| | | | |_) | |
|
||||||
| (__| |_| | _ <| |___
|
| (__| |_| | _ <| |___
|
||||||
\___|\___/|_| \_\_____|
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
How cURL Became Like This
|
How cURL Became Like This
|
||||||
@@ -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.
|
||||||
|
|
||||||
@@ -126,3 +128,20 @@ visitors to the curl.haxx.se site. Five official web mirrors.
|
|||||||
December 2003, full-fledged SSL for FTP is supported.
|
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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|||||||
@@ -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
|
|
||||||
304
docs/INSTALL
304
docs/INSTALL
@@ -1,7 +1,7 @@
|
|||||||
_ _ ____ _
|
_ _ ____ _
|
||||||
___| | | | _ \| |
|
___| | | | _ \| |
|
||||||
/ __| | | | |_) | |
|
/ __| | | | |_) | |
|
||||||
| (__| |_| | _ <| |___
|
| (__| |_| | _ <| |___
|
||||||
\___|\___/|_| \_\_____|
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
How To Compile
|
How To Compile
|
||||||
@@ -75,12 +75,22 @@ UNIX
|
|||||||
./configure
|
./configure
|
||||||
|
|
||||||
(with csh, tcsh and their clones):
|
(with csh, tcsh and their clones):
|
||||||
|
|
||||||
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:
|
||||||
@@ -121,7 +131,7 @@ UNIX
|
|||||||
|
|
||||||
Win32
|
Win32
|
||||||
=====
|
=====
|
||||||
|
|
||||||
Without SSL:
|
Without SSL:
|
||||||
|
|
||||||
MingW32 (GCC-2.95) style
|
MingW32 (GCC-2.95) style
|
||||||
@@ -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
|
||||||
-------------------------
|
-------------------------
|
||||||
@@ -233,27 +241,27 @@ Win32
|
|||||||
Using Borland C++ compiler version 5.5.1 (available as free download
|
Using Borland C++ compiler version 5.5.1 (available as free download
|
||||||
from Borland's site)
|
from Borland's site)
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
compile openssl
|
compile openssl
|
||||||
|
|
||||||
Make sure you include the paths to curl/include and openssl/inc32 in
|
Make sure you include the paths to curl/include and openssl/inc32 in
|
||||||
your bcc32.cnf file
|
your bcc32.cnf file
|
||||||
|
|
||||||
|
|
||||||
eg : -I"c:\Bcc55\include;c:\path_curl\include;c:\path_openssl\inc32"
|
eg : -I"c:\Bcc55\include;c:\path_curl\include;c:\path_openssl\inc32"
|
||||||
|
|
||||||
Check to make sure that all of the sources listed in lib/Makefile.b32
|
Check to make sure that all of the sources listed in lib/Makefile.b32
|
||||||
are present in the /path_to_curl/lib directory. (Check the src
|
are present in the /path_to_curl/lib directory. (Check the src
|
||||||
directory for missing ones.)
|
directory for missing ones.)
|
||||||
|
|
||||||
Make sure the environment variable "BCCDIR" is set to the install
|
Make sure the environment variable "BCCDIR" is set to the install
|
||||||
location for the compiler eg : c:\Borland\BCC55
|
location for the compiler eg : c:\Borland\BCC55
|
||||||
|
|
||||||
command line:
|
command line:
|
||||||
make -f /path_to_curl/lib/Makefile-ssl.b32
|
make -f /path_to_curl/lib/Makefile-ssl.b32
|
||||||
|
|
||||||
compile simplessl.c with appropriate links
|
compile simplessl.c with appropriate links
|
||||||
|
|
||||||
c:\curl\docs\examples\> bcc32 -L c:\path_to_curl\lib\libcurl.lib
|
c:\curl\docs\examples\> bcc32 -L c:\path_to_curl\lib\libcurl.lib
|
||||||
-L c:\borland\bcc55\lib\psdk\ws2_32.lib
|
-L c:\borland\bcc55\lib\psdk\ws2_32.lib
|
||||||
-L c:\openssl\out32\libeay32.lib
|
-L c:\openssl\out32\libeay32.lib
|
||||||
@@ -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
|
||||||
@@ -524,28 +609,13 @@ PORTS
|
|||||||
- m68k Linux
|
- m68k Linux
|
||||||
- m68k OpenBSD
|
- m68k OpenBSD
|
||||||
- m88k dg-dgux5.4R3.00
|
- m88k dg-dgux5.4R3.00
|
||||||
- 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/
|
||||||
|
|||||||
@@ -3,44 +3,102 @@ 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!
|
||||||
|
|
||||||
* --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
|
||||||
is provided by the curl app in its read/write callbacks, and when doing
|
proxy closes the connection within the authentication "negotiation phase".
|
||||||
-d/-F the callbacks aren't used!
|
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
|
||||||
|
|
||||||
* Doing resumed upload over HTTP does not work with '-C -', because curl
|
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://sourceforge.net/support/tracker.php?aid=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.
|
||||||
|
Bug report #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
|
||||||
|
-d/-F the callbacks aren't used! Bug report #921395.
|
||||||
|
|
||||||
|
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
|
||||||
|
|||||||
106
docs/LICENSE-MIXING
Normal file
106
docs/LICENSE-MIXING
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
License Mixing with apps, libcurl and Third Party Libraries
|
||||||
|
===========================================================
|
||||||
|
|
||||||
|
libcurl can be built to use a fair amount of various third party libraries,
|
||||||
|
libraries that are written and provided by other parties that are distributed
|
||||||
|
using their own licenses. Even libcurl itself contains code that may cause
|
||||||
|
problems to some. This document attempts to describe what licenses libcurl and
|
||||||
|
the other libraries use and what possible dilemmas linking and mixing them all
|
||||||
|
can lead to for end users.
|
||||||
|
|
||||||
|
I am not a lawyer and this is not legal advice!
|
||||||
|
|
||||||
|
One common dilemma is that GPL[1]-licensed code is not allowed to be linked
|
||||||
|
with code licensed under the Original BSD license (with the announcement
|
||||||
|
clause). You may still build your own copies that use them all, but
|
||||||
|
distributing them as binaries would be to violate the GPL license - unless you
|
||||||
|
accompany your license with an exception[2]. This particular problem was
|
||||||
|
addressed when the Modified BSD license was created, which does not have the
|
||||||
|
annoncement clause that collides with GPL.
|
||||||
|
|
||||||
|
libcurl http://curl.haxx.se/docs/copyright.html
|
||||||
|
|
||||||
|
Uses an MIT (or Modified BSD)-style license that is as liberal as
|
||||||
|
possible. Some of the source files that deal with KRB4 have Original
|
||||||
|
BSD-style announce-clause licenses. You may not distribute binaries
|
||||||
|
with krb4-enabled libcurl that also link with GPL-licensed code!
|
||||||
|
|
||||||
|
OpenSSL http://www.openssl.org/source/license.html
|
||||||
|
|
||||||
|
(May be used for SSL/TLS support) Uses an Original BSD-style license
|
||||||
|
with an announement clause that makes it "incompatible" with GPL. You
|
||||||
|
are not allowed to ship binaries that link with OpenSSL that includes
|
||||||
|
GPL code (unless that specific GPL code includes an exception for
|
||||||
|
OpenSSL - a habit that is growing more and more common). If OpenSSL's
|
||||||
|
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
|
||||||
|
|
||||||
|
(Used for asynchronous name resolves) Uses an MIT license that is very
|
||||||
|
liberal and imposes no restrictions on any other library or part you
|
||||||
|
may link with.
|
||||||
|
|
||||||
|
zlib http://www.gzip.org/zlib/zlib_license.html
|
||||||
|
|
||||||
|
(Used for compressed Transfer-Encoding support) Uses an MIT-style
|
||||||
|
license that shouldn't collide with any other library.
|
||||||
|
|
||||||
|
krb4
|
||||||
|
|
||||||
|
While nothing in particular says that a Kerberos4 library must use any
|
||||||
|
particular license, the one I've tried and used successfully so far
|
||||||
|
(kth-krb4) is Original BSD-licensed with the announcement clause. Some
|
||||||
|
of the code in libcurl that is written to deal with Kerberos4 likewise
|
||||||
|
have such a license.
|
||||||
|
|
||||||
|
MIT Kerberos http://web.mit.edu/kerberos/www/dist/
|
||||||
|
|
||||||
|
(May be used for GSS support) MIT licensed, that shouldn't collide
|
||||||
|
with any other parts.
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
(Used for SPNEGO support) Unclear license. Based on its name, I assume
|
||||||
|
that it uses the OpenSSL license and thus shares the same issues as
|
||||||
|
described for OpenSSL above.
|
||||||
|
|
||||||
|
libidn http://www.gnu.org/licenses/lgpl.html
|
||||||
|
|
||||||
|
(Used for IDNA support) Uses the GNU Lesser General Public
|
||||||
|
License. LGPL is a variation of GPL with slightly less aggressive
|
||||||
|
"copyleft". This license requires more requirements to be met when
|
||||||
|
distributing binaries, see the license for details. Also note that if
|
||||||
|
you distribute a binary that includes this library, you must also
|
||||||
|
include the full LGPL license text. Please properly point out what
|
||||||
|
parts of the distributed package that the license addresses.
|
||||||
|
|
||||||
|
OpenLDAP http://www.openldap.org/software/release/license.html
|
||||||
|
|
||||||
|
(Used for LDAP support) Uses a Modified BSD-style license. Since
|
||||||
|
libcurl uses OpenLDAP as a shared library only, I have not heard of
|
||||||
|
anyone that ships OpenLDAP linked with libcurl in an app.
|
||||||
|
|
||||||
|
|
||||||
|
[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
|
||||||
59
docs/MANUAL
59
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,28 +837,28 @@ 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
|
||||||
|
|
||||||
For your convenience, we have several open mailing lists to discuss curl,
|
For your convenience, we have several open mailing lists to discuss curl,
|
||||||
its development and things relevant to this. Get all info at
|
its development and things relevant to this. Get all info at
|
||||||
http://curl.haxx.se/mail/. The lists available are:
|
http://curl.haxx.se/mail/. Some of the lists available are:
|
||||||
|
|
||||||
curl-users
|
curl-users
|
||||||
|
|
||||||
@@ -865,24 +872,18 @@ MAILING LISTS
|
|||||||
|
|
||||||
curl-announce
|
curl-announce
|
||||||
|
|
||||||
Low-traffic. Only announcements of new public versions.
|
Low-traffic. Only receives announcements of new public versions. At worst,
|
||||||
|
that makes something like one or two mails per month, but usually only one
|
||||||
|
mail every second month.
|
||||||
|
|
||||||
curl-and-PHP
|
curl-and-php
|
||||||
|
|
||||||
Using the curl functions in PHP. Everything curl with a PHP angle. Or PHP
|
Using the curl functions in PHP. Everything curl with a PHP angle. Or PHP
|
||||||
with a curl angle.
|
with a curl angle.
|
||||||
|
|
||||||
curl-commits
|
curl-and-python
|
||||||
|
|
||||||
Receives notifications on all CVS commits done to the curl source module.
|
Python hackers using curl with or without the python binding pycurl.
|
||||||
This can become quite a large amount of mails during intense development,
|
|
||||||
be aware. This is for us who like email...
|
|
||||||
|
|
||||||
curl-www-commits
|
|
||||||
|
|
||||||
Receives notifications on all CVS commits done to the curl www module
|
|
||||||
(basicly the web site). This can become quite a large amount of mails
|
|
||||||
during intense changing, be aware. This is for us who like email...
|
|
||||||
|
|
||||||
Please direct curl questions, feature requests and trouble reports to one of
|
Please direct curl questions, feature requests and trouble reports to one of
|
||||||
these mailing lists instead of mailing any individual.
|
these mailing lists instead of mailing any individual.
|
||||||
|
|||||||
@@ -4,28 +4,20 @@
|
|||||||
|
|
||||||
AUTOMAKE_OPTIONS = foreign no-dependencies
|
AUTOMAKE_OPTIONS = foreign no-dependencies
|
||||||
|
|
||||||
man_MANS = \
|
man_MANS = curl.1 curl-config.1
|
||||||
curl.1 \
|
GENHTMLPAGES = curl.html curl-config.html
|
||||||
curl-config.1
|
PDFPAGES = curl.pdf curl-config.pdf
|
||||||
|
|
||||||
GENHTMLPAGES = \
|
|
||||||
curl.html \
|
|
||||||
curl-config.html
|
|
||||||
|
|
||||||
HTMLPAGES = $(GENHTMLPAGES) index.html
|
HTMLPAGES = $(GENHTMLPAGES) index.html
|
||||||
|
|
||||||
PDFPAGES = \
|
|
||||||
curl.pdf \
|
|
||||||
curl-config.pdf
|
|
||||||
|
|
||||||
SUBDIRS = examples libcurl
|
SUBDIRS = examples libcurl
|
||||||
|
|
||||||
CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES)
|
CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES)
|
||||||
|
|
||||||
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
|
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
|
||||||
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS \
|
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
|
||||||
VERSIONS KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) \
|
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
|
||||||
HISTORY INSTALL libcurl-the-guide $(PDFPAGES)
|
$(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.
|
|
||||||
|
|
||||||
|
|||||||
547
docs/THANKS
547
docs/THANKS
@@ -1,100 +1,453 @@
|
|||||||
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 aka WindEagle
|
||||||
Ryan Nelson <ryan@inch.com>
|
Alex Neblett
|
||||||
Bj<EFBFBD>rn Stenberg <bjorn@haxx.se>
|
Alex Suykov
|
||||||
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>
|
Andr<EFBFBD>s Garc<72>a
|
||||||
Andr<EFBFBD>s Garc<72>a <ornalux@redestb.es>
|
Andreas Damm
|
||||||
Douglas E. Wegscheid <wegscd@whirlpool.com>
|
Andreas Olsson
|
||||||
Mark Butler <butlerm@xmission.com>
|
Andreas Rieke
|
||||||
Eric Thelin <eric@generation-i.com>
|
Andres Garcia
|
||||||
Marc Boucher <marc@mbsi.ca>
|
Andrew Bushnell
|
||||||
Greg Onufer <Greg.Onufer@Eng.Sun.COM>
|
Andrew Francis
|
||||||
Doug Kaufman <dkaufman@rahul.net>
|
Andrew Fuller
|
||||||
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>
|
Bj<EFBFBD>rn Stenberg
|
||||||
Paul Marquis <pmarquis@iname.com>
|
Bjorn Reese
|
||||||
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 at touchtunes
|
||||||
|
Daniel Stenberg
|
||||||
|
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
|
||||||
|
G<EFBFBD>nter Knauf
|
||||||
|
G<EFBFBD>tz Babin-Ebell
|
||||||
|
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
|
||||||
|
Hamish Mackenzie
|
||||||
|
Hanno Kranzhoff
|
||||||
|
Hans Steegers
|
||||||
|
Hardeep Singh
|
||||||
|
Harshal Pradhan
|
||||||
|
Heikki Korpela
|
||||||
|
Henrik Storner
|
||||||
|
Hzhijun
|
||||||
|
Ian Ford
|
||||||
|
Ian Gulliver
|
||||||
|
Ian Wilkes
|
||||||
|
Ignacio Vazquez-Abrams
|
||||||
|
Ilguiz Latypov
|
||||||
|
Ingo Ralf Blum
|
||||||
|
Ingo Wilken
|
||||||
|
J<EFBFBD>rg Mueller-Tolk
|
||||||
|
J<EFBFBD>rn Hartroth
|
||||||
|
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
|
||||||
|
Kai Sommerfeld
|
||||||
|
Kai-Uwe Rommel
|
||||||
|
Kang-Jin Lee
|
||||||
|
Karol Pietrzak
|
||||||
|
Keith MacDonald
|
||||||
|
Keith McGuigan
|
||||||
|
Ken Hirsch
|
||||||
|
Ken Rastatter
|
||||||
|
Kevin Fisk
|
||||||
|
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
|
||||||
|
nk
|
||||||
|
Nodak Sodak
|
||||||
|
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<EFBFBD>bastien Willemijns
|
||||||
|
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 Liu
|
||||||
G<EFBFBD>tz Babin-Ebell <babin<69>ebell@trustcenter.de>
|
Spiridonoff A.V
|
||||||
Andreas Damm <andreas-sourceforge@radab.org>
|
Stadler Stephan
|
||||||
Jacky Lam <sylam@emsoftltd.com>
|
Stefan Ulrich
|
||||||
James Gallagher <jgallagher@gso.uri.edu>
|
Stephan Bergmann
|
||||||
Kjetil Jacobsen <kjetilja@cs.uit.no>
|
Stephen Kick
|
||||||
Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
Stephen More
|
||||||
Miklos Nemeth <mnemeth@kfkisystems.com>
|
Sterling Hughes
|
||||||
Kevin Roth <kproth@users.sourceforge.net>
|
Steve Green
|
||||||
Ralph Mitchell <rmitchell@eds.com>
|
Steve Lhomme
|
||||||
Dan Fandrich <dan@coneharvesters.com>
|
Steve Marx
|
||||||
Jean-Philippe Barrette-LaPierre <jpb@rrette.com>
|
Steve Oliphant
|
||||||
Richard Bramante <RBramante@on.com>
|
Steven Bazyl
|
||||||
Daniel Kouril <kouril@ics.muni.cz>
|
Steven G. Johnson
|
||||||
Dirk Manske <dm@nettraffic.de>
|
Stoned Elipot
|
||||||
David Meyer <meyer@paracel.com>
|
Sven Neuhaus
|
||||||
Dominick Meglio <codemstr@ptd.net>
|
swalkaus at yahoo.com
|
||||||
Gisle Vanem <gvanem@broadpark.no>
|
T. Bharath
|
||||||
Giuseppe Attardi <attardi@di.unipi.it>
|
T. Yamada
|
||||||
Tor Arntsen <tor@spacetec.no>
|
Thomas Schwinge
|
||||||
David Byron <DByron@everdreamcorp.com>
|
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
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user