Compare commits
1673 Commits
curl-7_11_
...
curl-7_12_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
789f2ecbe7 | ||
|
|
ee7d1d0701 | ||
|
|
4e3aa250c4 | ||
|
|
3647a6ddcd | ||
|
|
79aaa85a51 | ||
|
|
392a543eff | ||
|
|
eb6345de60 | ||
|
|
0fd3b7a00a | ||
|
|
bd51b80fa5 | ||
|
|
15c900839b | ||
|
|
2fd463e979 | ||
|
|
de8660a96a | ||
|
|
1e9cb272f1 | ||
|
|
72b1144b8c | ||
|
|
348fe0e210 | ||
|
|
cf1f46e1ca | ||
|
|
f052cbee19 | ||
|
|
1f5e8670e1 | ||
|
|
3b491d0f73 | ||
|
|
26a2b8d26d | ||
|
|
a7fd6f9007 | ||
|
|
8ed44e8dfb | ||
|
|
f617c1131a | ||
|
|
5ca47f19d7 | ||
|
|
9044fcbb5f | ||
|
|
7a82810b59 | ||
|
|
0ccdf3d0e6 | ||
|
|
ca7f0852df | ||
|
|
780b962336 | ||
|
|
bbeb840916 | ||
|
|
f4ec465bfc | ||
|
|
57c86a953d | ||
|
|
0fff8656e9 | ||
|
|
7b929636ee | ||
|
|
76835a2e00 | ||
|
|
1b171b02ac | ||
|
|
a8dc362572 | ||
|
|
7c72f8ee6c | ||
|
|
c39a54609b | ||
|
|
ce6b767b47 | ||
|
|
7ba4d3464f | ||
|
|
03def138fe | ||
|
|
9d99af5329 | ||
|
|
c8d850dbad | ||
|
|
01ea357744 | ||
|
|
ad9e83a90f | ||
|
|
6c9d96e811 | ||
|
|
f840e5192c | ||
|
|
ba9272dd05 | ||
|
|
675db3a211 | ||
|
|
1fc7ff878e | ||
|
|
b643d148b1 | ||
|
|
5804c995e1 | ||
|
|
13a6f85320 | ||
|
|
8b4582f111 | ||
|
|
cd3bf7c56f | ||
|
|
ee1595dcd5 | ||
|
|
310086deed | ||
|
|
5d27f50f2f | ||
|
|
9d0330d5bd | ||
|
|
d5074f74bb | ||
|
|
ea0cf7c87b | ||
|
|
a56164c8e0 | ||
|
|
cd95bb22ea | ||
|
|
1745ecd8ac | ||
|
|
75d66b9c62 | ||
|
|
2ff9f55001 | ||
|
|
ce446dbdc2 | ||
|
|
dd2add82ee | ||
|
|
40d9855df2 | ||
|
|
ecf7adba15 | ||
|
|
931c847e2b | ||
|
|
8230d9bff8 | ||
|
|
64cc14e9e6 | ||
|
|
d5b8971ff3 | ||
|
|
7ea837a18c | ||
|
|
b8b8473b6d | ||
|
|
894dbae455 | ||
|
|
2c11425868 | ||
|
|
a2ea0abf7f | ||
|
|
be8f8e66a4 | ||
|
|
9fadfffb9d | ||
|
|
76f23acfa1 | ||
|
|
6950aeafcc | ||
|
|
cd160a66c9 | ||
|
|
a7376968d2 | ||
|
|
fd96a2af34 | ||
|
|
a90cd1a45c | ||
|
|
8e92600ddd | ||
|
|
5e75c310ba | ||
|
|
20cab07c29 | ||
|
|
f466d7a6f1 | ||
|
|
dc46f535ae | ||
|
|
27fd5d6d6a | ||
|
|
18a3c3302f | ||
|
|
97959a00d7 | ||
|
|
5e92b2906b | ||
|
|
126ed14313 | ||
|
|
712d0374f7 | ||
|
|
4b49b2e3cf | ||
|
|
d85c21994f | ||
|
|
6b33a5f954 | ||
|
|
ed22afe5fb | ||
|
|
843391c745 | ||
|
|
ad6699e0c4 | ||
|
|
43137cf595 | ||
|
|
db6dc49b0b | ||
|
|
593170d1de | ||
|
|
0eace2fefe | ||
|
|
abd65e21c6 | ||
|
|
e21104a865 | ||
|
|
3ecf63fa66 | ||
|
|
762dcf0780 | ||
|
|
75ee9b5333 | ||
|
|
e161bdc5be | ||
|
|
bb3d6e8552 | ||
|
|
189c2f4989 | ||
|
|
f28389c87b | ||
|
|
7461592a16 | ||
|
|
50b0e72f7b | ||
|
|
76e73cfec8 | ||
|
|
5d8ec172a6 | ||
|
|
0953140b53 | ||
|
|
6c2825997a | ||
|
|
accc6eb91a | ||
|
|
eab8cdc640 | ||
|
|
dc9d0f256d | ||
|
|
b60d6404d8 | ||
|
|
08fe4b3210 | ||
|
|
0e60a118d0 | ||
|
|
4b78b4124e | ||
|
|
0d6d9af7ab | ||
|
|
41cd36b830 | ||
|
|
242be55771 | ||
|
|
7cf47ea5b5 | ||
|
|
6fb0012833 | ||
|
|
9d1ce9c0df | ||
|
|
5947e4e9fd | ||
|
|
e992aa6a54 | ||
|
|
2cf218610e | ||
|
|
fe6f0aeb26 | ||
|
|
bd04c6fb67 | ||
|
|
c5637baa06 | ||
|
|
f8426a2c44 | ||
|
|
0c791d1e76 | ||
|
|
c4a89d29f6 | ||
|
|
306ff5649a | ||
|
|
1c652dfc5d | ||
|
|
1f61e7f8f4 | ||
|
|
1a5f190e47 | ||
|
|
570033448c | ||
|
|
f44b655513 | ||
|
|
0aa720fa26 | ||
|
|
d44f3f84f8 | ||
|
|
d426db3d27 | ||
|
|
0fd88d7c8f | ||
|
|
4e84ac4db8 | ||
|
|
da5c8a121f | ||
|
|
76c36688d0 | ||
|
|
651c8d3bc4 | ||
|
|
a8a946d71d | ||
|
|
c5c005609e | ||
|
|
97886f9353 | ||
|
|
a784bd0797 | ||
|
|
4aacf65678 | ||
|
|
dd1ba7633e | ||
|
|
a4ea5a4054 | ||
|
|
69060b1382 | ||
|
|
a6562ea77d | ||
|
|
ad3563096a | ||
|
|
c5f02c1986 | ||
|
|
7ef5d20cad | ||
|
|
98b619c3a7 | ||
|
|
5b75919f95 | ||
|
|
20b76e09e3 | ||
|
|
67fca4cb01 | ||
|
|
606715b2cd | ||
|
|
ce04b35032 | ||
|
|
ec7f244ee9 | ||
|
|
a5b206f398 | ||
|
|
306a05f9ff | ||
|
|
81f8350616 | ||
|
|
760ca6adc4 | ||
|
|
ffb35ff5c3 | ||
|
|
8eda06131b | ||
|
|
5b55f9ecb3 | ||
|
|
3417e0b0fc | ||
|
|
79ed144b0f | ||
|
|
8e5cf6589c | ||
|
|
fc67cca882 | ||
|
|
eea2287068 | ||
|
|
5fe5de7511 | ||
|
|
4a6b9972dd | ||
|
|
256a16a8a3 | ||
|
|
30e0891d3d | ||
|
|
8147ccdf76 | ||
|
|
26ab286630 | ||
|
|
738807883e | ||
|
|
03a0988ce8 | ||
|
|
7de892eeb4 | ||
|
|
8c4e91a653 | ||
|
|
8f77030473 | ||
|
|
546d0bd3d1 | ||
|
|
5d53b544d3 | ||
|
|
6dc8fac122 | ||
|
|
8114f8562b | ||
|
|
c79fa187b9 | ||
|
|
237ec68b0e | ||
|
|
4ebf4f6e55 | ||
|
|
4d86593f3c | ||
|
|
ec050ccbc4 | ||
|
|
f19cade50f | ||
|
|
a2f35aaf67 | ||
|
|
e5c4b6b345 | ||
|
|
bad978feb2 | ||
|
|
bea9152aa8 | ||
|
|
f788f988ea | ||
|
|
d04ffd258b | ||
|
|
24cfa7f1bb | ||
|
|
94a1d09ac7 | ||
|
|
230a75091b | ||
|
|
4ad68ec305 | ||
|
|
ef776ab893 | ||
|
|
f8ff0f6bef | ||
|
|
bc7122f6e2 | ||
|
|
e5963dae48 | ||
|
|
1ebda8fa0e | ||
|
|
9af532e662 | ||
|
|
9d064a3927 | ||
|
|
d6edcfb486 | ||
|
|
1d5a914c1c | ||
|
|
666bc9ee4e | ||
|
|
e545e33d5f | ||
|
|
326e8b9fc1 | ||
|
|
0d1fc73f21 | ||
|
|
50a1853560 | ||
|
|
35e158d80b | ||
|
|
7225b14002 | ||
|
|
85838a8966 | ||
|
|
d29590f583 | ||
|
|
467c3e3a1f | ||
|
|
b484b3b696 | ||
|
|
b45d50ccc2 | ||
|
|
78e0ba82b0 | ||
|
|
c39c55cb2d | ||
|
|
cf004cbc7e | ||
|
|
9948250723 | ||
|
|
47afa058a8 | ||
|
|
40e892bb36 | ||
|
|
bc6f3beb9c | ||
|
|
f9e1f32adb | ||
|
|
93f96835f8 | ||
|
|
22f4d81f3e | ||
|
|
0d1f80ccb5 | ||
|
|
4e87dd89bf | ||
|
|
60e4b57ad8 | ||
|
|
ce5805a955 | ||
|
|
dad0715d79 | ||
|
|
52d85341ae | ||
|
|
7b2869338d | ||
|
|
ab35b2837f | ||
|
|
863473a856 | ||
|
|
be6af69dc7 | ||
|
|
3a80dc7f3e | ||
|
|
bd42a2acb1 | ||
|
|
7f0e708322 | ||
|
|
8cbfe5d24a | ||
|
|
bab9f532f2 | ||
|
|
09cce943cb | ||
|
|
702021e099 | ||
|
|
e94c46c00c | ||
|
|
9d311ff2c0 | ||
|
|
108434b95c | ||
|
|
c30cb73a5b | ||
|
|
b7c56594b3 | ||
|
|
2b700fae9d | ||
|
|
ef783d8da7 | ||
|
|
a4f1833629 | ||
|
|
2c756fa1d7 | ||
|
|
385086b460 | ||
|
|
72a4715dff | ||
|
|
7e6043f04f | ||
|
|
576be36249 | ||
|
|
c52c592f4c | ||
|
|
d9ffd2f544 | ||
|
|
a684c51c9b | ||
|
|
3fa4ac080e | ||
|
|
9c8b2a9958 | ||
|
|
498666bdc3 | ||
|
|
3d3612e252 | ||
|
|
e9920d8a04 | ||
|
|
acc5096eef | ||
|
|
6717240650 | ||
|
|
ef0a2c714b | ||
|
|
2cd6403011 | ||
|
|
75e1483e0d | ||
|
|
8a4532ca2d | ||
|
|
13f98c5c18 | ||
|
|
30e71d54e0 | ||
|
|
465753c2de | ||
|
|
e40392ac03 | ||
|
|
1eb9fd6c4d | ||
|
|
78e47fbb5c | ||
|
|
2b59e90c54 | ||
|
|
59a30e6d9b | ||
|
|
e0287fea20 | ||
|
|
4fbf3f16e2 | ||
|
|
de6433d5c2 | ||
|
|
23ef66f33a | ||
|
|
2479e06848 | ||
|
|
f2abe03fcf | ||
|
|
5e7f1a0eaf | ||
|
|
eb9383d49b | ||
|
|
817d17354e | ||
|
|
88e226c686 | ||
|
|
9116dd41bd | ||
|
|
213d64fbd7 | ||
|
|
a8419d68b6 | ||
|
|
87a1c7033e | ||
|
|
6e3fa90c9e | ||
|
|
b2ef40731a | ||
|
|
e2f7030202 | ||
|
|
533519cc9c | ||
|
|
7c85be9435 | ||
|
|
89829093ca | ||
|
|
7cb10a1853 | ||
|
|
33d67c68de | ||
|
|
e46b5719f2 | ||
|
|
353f764119 | ||
|
|
9f437269fb | ||
|
|
45391178c9 | ||
|
|
eddeb49fb6 | ||
|
|
7ab3b5b3bb | ||
|
|
00d5f886e3 | ||
|
|
49daeaf805 | ||
|
|
d03fbf5dfb | ||
|
|
cb72a80fe0 | ||
|
|
71d81f1f75 | ||
|
|
b0c51d198c | ||
|
|
71335e5b99 | ||
|
|
c9b23ca055 | ||
|
|
7983ec84a7 | ||
|
|
8cb2a68694 | ||
|
|
485122035c | ||
|
|
5c4dba1418 | ||
|
|
d6eb28400b | ||
|
|
526c61c657 | ||
|
|
fd6ec05916 | ||
|
|
6789dfc5f5 | ||
|
|
193a652e6a | ||
|
|
4d12be9867 | ||
|
|
87e7f4f688 | ||
|
|
5eeaff8235 | ||
|
|
7d2e872828 | ||
|
|
097938e6c8 | ||
|
|
d57b84e290 | ||
|
|
fcc07bed90 | ||
|
|
43bda5cd17 | ||
|
|
45c7f064d4 | ||
|
|
4dfc0a78e7 | ||
|
|
82bd583251 | ||
|
|
78f52c05a9 | ||
|
|
d818cbe58c | ||
|
|
4ae4336643 | ||
|
|
25bcd45034 | ||
|
|
f53d6e1c39 | ||
|
|
17a3aa1ddc | ||
|
|
6c78b4b7c0 | ||
|
|
2b634be467 | ||
|
|
c5b8e446f6 | ||
|
|
7bd55dc17c | ||
|
|
009cd96490 | ||
|
|
d0242da304 | ||
|
|
ab44763cb7 | ||
|
|
3a80bb0a09 | ||
|
|
77268e0649 | ||
|
|
1ceb77b4dc | ||
|
|
3430ce7907 | ||
|
|
4ba7ef34d1 | ||
|
|
4515d06465 | ||
|
|
b6a4ca9bc8 | ||
|
|
9b6350d0b0 | ||
|
|
07de0ff0ff | ||
|
|
7d8cd5906c | ||
|
|
1056d2d22d | ||
|
|
d571064b65 | ||
|
|
33eaf2e18b | ||
|
|
a054e5baf3 | ||
|
|
85af357d81 | ||
|
|
d687eed33e | ||
|
|
38b6016dfa | ||
|
|
be2cdf14f3 | ||
|
|
0943f33438 | ||
|
|
4427d91479 | ||
|
|
0c03ed6013 | ||
|
|
0c3c1b390a | ||
|
|
9b09193cfd | ||
|
|
b2cff76722 | ||
|
|
37817667e2 | ||
|
|
f9b2b7940e | ||
|
|
5168b32f86 | ||
|
|
0373758359 | ||
|
|
df94c7aedc | ||
|
|
6bd2de0c42 | ||
|
|
82c31256e1 | ||
|
|
403cbbe0c4 | ||
|
|
9a7e3437ae | ||
|
|
4fa58560bf | ||
|
|
be62b27ce2 | ||
|
|
3be66f3a03 | ||
|
|
089bdaed00 | ||
|
|
0d3674129f | ||
|
|
fce6783be4 | ||
|
|
48bc26e7e3 | ||
|
|
f128fae705 | ||
|
|
800fa31b65 | ||
|
|
2ae4420869 | ||
|
|
8ba042cf88 | ||
|
|
7adf43c1c5 | ||
|
|
d007e5615c | ||
|
|
888eec833c | ||
|
|
2911e63bc2 | ||
|
|
34d247bc4e | ||
|
|
99bc7e5fd3 | ||
|
|
0b1f7995c5 | ||
|
|
f35c28214e | ||
|
|
35fd1365ae | ||
|
|
f493081004 | ||
|
|
e1b5e15431 | ||
|
|
1aba4c519b | ||
|
|
ae76a67566 | ||
|
|
76241d0a02 | ||
|
|
89227a9d75 | ||
|
|
dfb5090e0f | ||
|
|
c7fe8a7a11 | ||
|
|
7174ca7a20 | ||
|
|
2e61fde07f | ||
|
|
41263f7d88 | ||
|
|
02095ba0e1 | ||
|
|
32a678eab3 | ||
|
|
bd7ba3bde6 | ||
|
|
0ffec4272a | ||
|
|
ea4cd4d8aa | ||
|
|
c7775c59bf | ||
|
|
243bd5bbb4 | ||
|
|
4bde770169 | ||
|
|
9af7e46f72 | ||
|
|
7d844c430c | ||
|
|
4f953b6459 | ||
|
|
44995d6877 | ||
|
|
2ebc821558 | ||
|
|
907bb78f3e | ||
|
|
b2e1bf7e7d | ||
|
|
7173a0f7b6 | ||
|
|
a49bebc74e | ||
|
|
8777ba7e42 | ||
|
|
a39669198f | ||
|
|
2c0c75e345 | ||
|
|
236337ce86 | ||
|
|
224ccc780a | ||
|
|
ccde85d198 | ||
|
|
9e7657d6ed | ||
|
|
7ac455fca3 | ||
|
|
e295cd759c | ||
|
|
a472cd9310 | ||
|
|
8794cb286b | ||
|
|
455b1af214 | ||
|
|
d765a00adb | ||
|
|
de37308722 | ||
|
|
7729c63be0 | ||
|
|
eebcf90942 | ||
|
|
fa8ecd3d53 | ||
|
|
134cb66129 | ||
|
|
349a15b089 | ||
|
|
c14fa2c935 | ||
|
|
6ca7af3419 | ||
|
|
afa5924487 | ||
|
|
bd63a557f3 | ||
|
|
49aa798082 | ||
|
|
c6e5b67197 | ||
|
|
e7050f97c4 | ||
|
|
b28f3d43bf | ||
|
|
edd467a12c | ||
|
|
0bf1bd51c4 | ||
|
|
4cf70e3069 | ||
|
|
9efddfedab | ||
|
|
4b11e19f26 | ||
|
|
de681d3b8f | ||
|
|
f33be3c313 | ||
|
|
62a12b7faf | ||
|
|
e75ab79bdb | ||
|
|
abd7e32c66 | ||
|
|
e2b6a45cfa | ||
|
|
e0c0b2ba7d | ||
|
|
debbcf81bb | ||
|
|
8300a880cc | ||
|
|
420bbd2e08 | ||
|
|
d87981e4c1 | ||
|
|
59091fa860 | ||
|
|
dc659ec736 | ||
|
|
09aa165942 | ||
|
|
f2fbb5f3d5 | ||
|
|
29bedfcf7f | ||
|
|
ccdaa0b51f | ||
|
|
f516734941 | ||
|
|
d53d33698c | ||
|
|
39926181ea | ||
|
|
8415b4a271 | ||
|
|
e4916145ef | ||
|
|
3ec605de67 | ||
|
|
a7e04cac78 | ||
|
|
8ddc18a4f9 | ||
|
|
0d3aa8b7be | ||
|
|
496bbceef1 | ||
|
|
901edd32b5 | ||
|
|
0612c275a7 | ||
|
|
f3d91528a1 | ||
|
|
f7fae23546 | ||
|
|
2d41efb71e | ||
|
|
7abf2f44ec | ||
|
|
3a36d4fdea | ||
|
|
12b71e422f | ||
|
|
d25a0a1bc8 | ||
|
|
4d17e77532 | ||
|
|
6a921197e2 | ||
|
|
fa57a8a78e | ||
|
|
eb4d65d0ba | ||
|
|
e7d9ea8919 | ||
|
|
372b141d5b | ||
|
|
115e74a8ad | ||
|
|
1b26fe39f9 | ||
|
|
4674f3f115 | ||
|
|
d8a1415646 | ||
|
|
773e7e871e | ||
|
|
1d937d62c0 | ||
|
|
f3663a9d0f | ||
|
|
199b2f4602 | ||
|
|
49ab1d914c | ||
|
|
f9a6e7b68d | ||
|
|
5d64d657de | ||
|
|
52caba0417 | ||
|
|
ad1a70205f | ||
|
|
d57eed6f22 | ||
|
|
a3d39efa3b | ||
|
|
50efb8f33e | ||
|
|
ad75360ec7 | ||
|
|
7f29bf61e2 | ||
|
|
9ca395fded | ||
|
|
68e140b2eb | ||
|
|
283f68f660 | ||
|
|
e6947f99ed | ||
|
|
93e32e6f62 | ||
|
|
f8a5ec1380 | ||
|
|
2d0b2f294f | ||
|
|
08e286ed68 | ||
|
|
220caed248 | ||
|
|
6eb0b5b917 | ||
|
|
3bdc883c93 | ||
|
|
cc85f813d1 | ||
|
|
e723d2eb7c | ||
|
|
b440c6638f | ||
|
|
648c5b05c0 | ||
|
|
011929cf4d | ||
|
|
7f679c3da3 | ||
|
|
3e4cd0b422 | ||
|
|
fc4f777b42 | ||
|
|
208a31f549 | ||
|
|
e565631afe | ||
|
|
9f2780a2ee | ||
|
|
1a6969a887 | ||
|
|
f56d753507 | ||
|
|
e5165af5a6 | ||
|
|
83e878420a | ||
|
|
58a5f485db | ||
|
|
e8fb77fac3 | ||
|
|
d292088a83 | ||
|
|
de100f8b51 | ||
|
|
1cb2306ae0 | ||
|
|
cc90a235f4 | ||
|
|
e97ce57d0b | ||
|
|
dc753b8315 | ||
|
|
a5c4442ebf | ||
|
|
a271cfb697 | ||
|
|
6dffe9702d | ||
|
|
f71139750d | ||
|
|
690b3e58b2 | ||
|
|
0c7cb0c10f | ||
|
|
4816294f52 | ||
|
|
6587ff440a | ||
|
|
791e49134b | ||
|
|
9254c3a103 | ||
|
|
9c95ebcbe7 | ||
|
|
3a4ed71b88 | ||
|
|
d6d312d550 | ||
|
|
1fa163fdf7 | ||
|
|
82b27d1b97 | ||
|
|
f7dee3b846 | ||
|
|
a7b5045598 | ||
|
|
b7fda8ec73 | ||
|
|
3d7f4c0d77 | ||
|
|
01771e50a1 | ||
|
|
c23cf6a058 | ||
|
|
79f9914af8 | ||
|
|
803fb123cb | ||
|
|
97728f5b1c | ||
|
|
36d5f30b8c | ||
|
|
e82a575894 | ||
|
|
773a8fe598 | ||
|
|
fa1c0d4a56 | ||
|
|
7e01548d46 | ||
|
|
14b36a8cba | ||
|
|
1089d91e77 | ||
|
|
556b68f44e | ||
|
|
3f37ae471d | ||
|
|
9f4e682ca9 | ||
|
|
5fc8d4da45 | ||
|
|
4af66b70fc | ||
|
|
95dd343244 | ||
|
|
e449aab0af | ||
|
|
3a0192bea6 | ||
|
|
37685848d1 | ||
|
|
0412a201a3 | ||
|
|
ca522d4787 | ||
|
|
c2967c3c39 | ||
|
|
70d7a9e6a5 | ||
|
|
462d1c5231 | ||
|
|
886391d145 | ||
|
|
1442fab4b6 | ||
|
|
aa93e2e638 | ||
|
|
e1d541086c | ||
|
|
3b0f52205d | ||
|
|
b84eaff1d5 | ||
|
|
9eb6fc1fb6 | ||
|
|
253f5f1a9a | ||
|
|
dd1f495c2f | ||
|
|
12fa877f00 | ||
|
|
580a2fe72b | ||
|
|
7f0ec86769 | ||
|
|
5e69ca0ebd | ||
|
|
b6592e29a4 | ||
|
|
4cba2ea1ad | ||
|
|
14cb9d296c | ||
|
|
df750c236c | ||
|
|
154c9bc3b8 | ||
|
|
508ad2c92f | ||
|
|
36a90aeaec | ||
|
|
f385b1976e | ||
|
|
3d99b566a6 | ||
|
|
99a3e2d769 | ||
|
|
aaa42735e6 | ||
|
|
50c80a49cc | ||
|
|
6b7f169b10 | ||
|
|
01e3bb98b5 | ||
|
|
7052598e59 | ||
|
|
ab52e20832 | ||
|
|
f50678eda7 | ||
|
|
3ded81188b | ||
|
|
a435151735 | ||
|
|
bfe5568c85 | ||
|
|
7e45a1ac53 | ||
|
|
76a51ef4b3 | ||
|
|
fc7c4d6157 | ||
|
|
4d17d6876e | ||
|
|
0d6236f7e1 | ||
|
|
0e4e72f193 | ||
|
|
107413c021 | ||
|
|
d7579087f2 | ||
|
|
3415ac3866 | ||
|
|
d50b209a7a | ||
|
|
62e0f10eba | ||
|
|
0b2b7439fe | ||
|
|
edcd1981ea | ||
|
|
ada9a9f4a1 | ||
|
|
1c0e4f1178 | ||
|
|
663d2080d1 | ||
|
|
e5641a33bb | ||
|
|
9b24c9a754 | ||
|
|
99b96d5446 | ||
|
|
cf7817eb38 | ||
|
|
9bca9681ba | ||
|
|
958987c214 | ||
|
|
ed75842df0 | ||
|
|
f35398e414 | ||
|
|
3b39cee785 | ||
|
|
dc932f739a | ||
|
|
7d15651115 | ||
|
|
e096072745 | ||
|
|
5d947e973e | ||
|
|
2465ff991f | ||
|
|
d10a941d29 | ||
|
|
5a58d51993 | ||
|
|
142f40582f | ||
|
|
4227407438 | ||
|
|
6e29f5d1df | ||
|
|
334c3df09d | ||
|
|
4120b7b0c0 | ||
|
|
fac1c13895 | ||
|
|
649caa1953 | ||
|
|
d8ee927be2 | ||
|
|
3efb90dd75 | ||
|
|
e4c5653035 | ||
|
|
ad7e26b140 | ||
|
|
f39749cee4 | ||
|
|
87eb26a33d | ||
|
|
9a48ca69fc | ||
|
|
a259f66fa4 | ||
|
|
83d77dc013 | ||
|
|
e36914a425 | ||
|
|
5bd0471315 | ||
|
|
b791e158f0 | ||
|
|
6cd0a90b52 | ||
|
|
d5bb877fba | ||
|
|
0c4907afcc | ||
|
|
e5cd0cc402 | ||
|
|
252423a725 | ||
|
|
eaddf3d198 | ||
|
|
a37a79c2a9 |
1572
CHANGES.2003
Normal file
1572
CHANGES.2003
Normal file
File diff suppressed because it is too large
Load Diff
16
CVS-INFO
16
CVS-INFO
@@ -15,17 +15,12 @@ Compile and build instructions follow below.
|
||||
CHANGES.0 contains ancient changes.
|
||||
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
|
||||
|
||||
perl/ is a subdirectory with various perl scripts
|
||||
|
||||
To build after having extracted everything from CVS, do this:
|
||||
To build in environments that support configure, after having extracted
|
||||
everything from CVS, do this:
|
||||
|
||||
./buildconf
|
||||
./configure
|
||||
@@ -35,10 +30,15 @@ make
|
||||
|
||||
./configure --disable-shared --enable-debug --enable-maintainer-mode
|
||||
|
||||
In environments that don't support configure (i.e. Microsoft), do this:
|
||||
|
||||
buildconf.bat
|
||||
|
||||
|
||||
REQUIREMENTS
|
||||
|
||||
You need the following software installed:
|
||||
For buildconf (not buildconf.bat) to work, you need the following software
|
||||
installed:
|
||||
|
||||
o autoconf 2.57 (or later)
|
||||
o automake 1.7 (or later)
|
||||
|
||||
@@ -23,9 +23,8 @@
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign
|
||||
|
||||
EXTRA_DIST = CHANGES COPYING maketgz reconf Makefile.dist \
|
||||
curl-config.in build_vms.com curl-style.el sample.emacs testcurl.sh \
|
||||
RELEASE-NOTES
|
||||
EXTRA_DIST = CHANGES COPYING maketgz reconf Makefile.dist curl-config.in \
|
||||
curl-style.el sample.emacs RELEASE-NOTES buildconf buildconf.bat
|
||||
|
||||
bin_SCRIPTS = curl-config
|
||||
|
||||
@@ -55,6 +54,9 @@ test:
|
||||
test-full:
|
||||
@(cd tests; $(MAKE) all full-test)
|
||||
|
||||
test-torture:
|
||||
@(cd tests; $(MAKE) all torture-test)
|
||||
|
||||
#
|
||||
# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros
|
||||
# must contain the following line:
|
||||
|
||||
@@ -30,8 +30,28 @@ ssl:
|
||||
make
|
||||
|
||||
borland:
|
||||
cd lib & make -f Makefile.b32
|
||||
cd src & make -f Makefile.b32
|
||||
cd lib
|
||||
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
|
||||
|
||||
mingw32:
|
||||
cd lib & make -f Makefile.m32 ZLIB=1
|
||||
@@ -41,29 +61,45 @@ mingw32-ssl:
|
||||
cd lib & make -f Makefile.m32 SSL=1 ZLIB=1
|
||||
cd src & make -f Makefile.m32 SSL=1 ZLIB=1
|
||||
|
||||
mingw32-clean:
|
||||
cd lib & make -f Makefile.m32 clean
|
||||
cd src & make -f Makefile.m32 clean
|
||||
|
||||
vc:
|
||||
cd lib
|
||||
nmake -f Makefile.vc6 cfg=release
|
||||
nmake /f Makefile.vc6 cfg=release
|
||||
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:
|
||||
cd lib
|
||||
nmake -f Makefile.vc6 cfg=release-ssl
|
||||
nmake /f Makefile.vc6 cfg=release-ssl
|
||||
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:
|
||||
cd lib
|
||||
nmake -f Makefile.vc6 cfg=release-ssl-dll
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-dll
|
||||
cd ..\src
|
||||
nmake -f Makefile.vc6
|
||||
nmake /f Makefile.vc6
|
||||
|
||||
vc-libcurl-ssl-dll:
|
||||
cd lib
|
||||
nmake -f Makefile.vc6 cfg=release-libcurl-ssl-dll
|
||||
nmake /f Makefile.vc6 cfg=release-libcurl-ssl-dll
|
||||
cd ..\src
|
||||
nmake -f Makefile.vc6
|
||||
nmake /f Makefile.vc6
|
||||
|
||||
djgpp:
|
||||
make -C lib -f Makefile.dj
|
||||
@@ -81,7 +117,17 @@ amiga:
|
||||
cd ./lib && make -f makefile.amiga
|
||||
cd ./src && make -f makefile.amiga
|
||||
|
||||
netware:
|
||||
$(MAKE) -C lib -f Makefile.netware
|
||||
$(MAKE) -C src -f Makefile.netware
|
||||
|
||||
netware-ssl:
|
||||
$(MAKE) -C lib -f Makefile.netware SSL=1
|
||||
$(MAKE) -C src -f Makefile.netware SSL=1
|
||||
|
||||
netware-clean:
|
||||
$(MAKE) -C lib -f Makefile.netware clean
|
||||
$(MAKE) -C src -f Makefile.netware clean
|
||||
|
||||
unix: all
|
||||
|
||||
|
||||
42
README
42
README
@@ -1,12 +1,12 @@
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
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
|
||||
MANUAL document. Find out how to install Curl by reading the INSTALL
|
||||
document.
|
||||
@@ -17,7 +17,9 @@ README
|
||||
|
||||
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
|
||||
|
||||
@@ -32,42 +34,44 @@ WEB SITE
|
||||
|
||||
Sweden -- http://curl.haxx.se/
|
||||
Australia -- http://curl.planetmirror.com/
|
||||
Denmark -- http://curl.cofman.dk/
|
||||
Estonia -- http://curl.wildyou.net/
|
||||
Germany -- http://curl.mirror.at.stealer.net/
|
||||
Germany -- http://curl.netmirror.org/
|
||||
Russia -- http://curl.tsuren.net/
|
||||
Thailand -- http://curl.siamu.ac.th/
|
||||
US (CA) -- http://curl.mirror.redwire.net/
|
||||
US (TX) -- http://curl.cyberservers.net/
|
||||
US -- http://curl.signal42.com/
|
||||
|
||||
DOWNLOAD
|
||||
|
||||
The official download mirror sites are:
|
||||
|
||||
Australia -- http://curl.planetmirror.com/download/
|
||||
Australia -- http://curl.planetmirror.com/download.html
|
||||
Estonia -- http://curl.wildyou.net/download.html
|
||||
Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
|
||||
Germany -- http://curl.mirror.at.stealer.net/download.html
|
||||
Germany -- http://curl.netmirror.org/download.html
|
||||
Germany -- http://www.mirrorspace.org/curl/
|
||||
Hongkong -- http://www.execve.net/curl/
|
||||
Russia -- http://curl.tsuren.net/download/
|
||||
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/
|
||||
US (CA) -- http://curl.mirror.redwire.net/download/
|
||||
US (TX) -- http://curl.cyberservers.net/download/
|
||||
Thailand -- http://curl.siamu.ac.th/download.html
|
||||
US (CA) -- http://curl.mirror.redwire.net/download.html
|
||||
|
||||
CVS
|
||||
|
||||
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)
|
||||
|
||||
cvs -d :pserver:cvsread@cvs.php.net:/repository logout
|
||||
|
||||
(you're off the hook!)
|
||||
|
||||
NOTICE
|
||||
|
||||
Curl contains pieces of source code that is Copyright (c) 1998, 1999
|
||||
|
||||
141
RELEASE-NOTES
141
RELEASE-NOTES
@@ -1,89 +1,84 @@
|
||||
Curl and libcurl 7.11.0. A minor-features-added release.
|
||||
Curl and libcurl 7.12.2
|
||||
|
||||
The 78th public curl release. Release number 105 counted from the very
|
||||
beginning.
|
||||
Public curl release number: 83
|
||||
Releases counted from the very beginning: 110
|
||||
Available command line options: 96
|
||||
Available curl_easy_setopt() options: 121
|
||||
Number of public functions in libcurl: 36
|
||||
Amount of public web site mirrors: 13
|
||||
Number of known libcurl bindings: 27
|
||||
|
||||
This release includes the following changes:
|
||||
|
||||
o allows the URL to be set by a callback when using the multi interface
|
||||
o large file support was added. Use one of the new options: INFILESIZE_LARGE,
|
||||
RESUME_FROM_LARGE and MAXFILESIZE_LARGE
|
||||
o the new --ftp-pasv overrides a previous --ftpport
|
||||
o CURLOPT_FTPSSL and ftps:// now do ssl over FTP "The Right Way" (the curl
|
||||
tool now features the --ftp-ssl option)
|
||||
o The Windows DLLs are built with an added "resource file"
|
||||
o New LIBCURL_VERSION_* defines for easier checking version number
|
||||
o Included Mac OS X 'framework' makefile in the release archive
|
||||
o Removed the TRUE and FALSE #defines from the public curl header file
|
||||
o Added CURLOPT_NETRC_FILE
|
||||
o the IDN code now verifies that only TLD-legitmate letters are used in the
|
||||
name or a warning is displayed (when verbose is enabled)
|
||||
o provides error texts for IDN errors
|
||||
o file upload parts in formposts now get their directory names cut off
|
||||
o added CURLINFO_OS_ERRNO
|
||||
o added CURLOPT_FTPSSLAUTH to allow ftp connects to attempt "AUTH TLS" instead
|
||||
before "AUTH SSL"
|
||||
o curl_getdate() completely rewritten: may affect rare curl -z use cases
|
||||
|
||||
This release includes the following bugfixes:
|
||||
|
||||
o improved config file parsing for options with required parameters
|
||||
o using --trace with a bad file name could crash
|
||||
o release archive contains compressed help text
|
||||
o the win32 password prompting supports backspace
|
||||
o builds natively on AmigaOS (without unix emulation)
|
||||
o ftps:// now uses port 990 by default
|
||||
o the "configure --with-spnego" action was improved
|
||||
o fixed a rare follow-redirect problem
|
||||
o curl-config --feature now outputs AsynchDNS if enabled
|
||||
o occational re-use of freed-memory problem fixed
|
||||
o curl-config --libs now include the ares link directory
|
||||
o configure --enable-ares now accepts a given path
|
||||
o -lz no longer appear twice on the link line
|
||||
o more descriptive error message if the FTP response reader fails
|
||||
o curl-config --feature now shows 'AsynchDNS' when built with ares
|
||||
o VMS build up-to-date and clarified source code
|
||||
o resolve bug caused socks5 to fail
|
||||
o Content-Length: is ignored when getting chunked Transfer-Encoding
|
||||
o POST over proxy to https server failed
|
||||
o improved how libcurl deals with persistant connections over FTP when a
|
||||
transfer fails
|
||||
o accessing a proxy that requires Basic auth without password caused a hang
|
||||
o a free free-twice problem in the server certificate code
|
||||
o minor memory leak when using ranges on persistant connections
|
||||
o formpost parts sending files with .html extensions now use "Content-Type:
|
||||
text/html"
|
||||
o formpost parts now default to "Content-Type: application/octet-stream"
|
||||
o --progress-bar was slightly improved
|
||||
o Failing to connect to localhost, using the multi interface on Solaris
|
||||
showed a connect problem now fixed.
|
||||
o The generated ca-bundle.h file is now generated in the build dir, not the
|
||||
source dir
|
||||
o The FTP-EPSV response parser for the 229 code was fixed
|
||||
o curl finds the user's home dir slightly different and hopefully better on
|
||||
Windows
|
||||
o testcurl.sh can now be used to autotest daily tarballs
|
||||
o a couple of command line options now check that the underlying library
|
||||
actually supports the features before trying to enable them
|
||||
o uninitialized variable fix
|
||||
o better html versions of the man pages
|
||||
o CURLOPT_FTP_CREATE_MISSING_DIRS works for third party transfers
|
||||
o memory leak for cookies received with max-age set
|
||||
o potential memory leaks in the window name resolver
|
||||
o URLs with ?-letters in the user name or password fields
|
||||
o libcurl error message is now provided when send() fails
|
||||
o no more SIGPIPE on Mac OS X and other SO_NOSIGPIPE-supporting platforms
|
||||
o HTTP resume was refused if redirected
|
||||
o configure's gethostbyname check when both nsl and socket libs are required
|
||||
o configure --with-libidn now checks the given path before defaults
|
||||
o a race condition sometimes resulting in CURLE_COULDNT_RESOLVE_HOST in the
|
||||
windows threaded name resolver code
|
||||
o isspace() invokes with negative values in the cookie code
|
||||
o a case of read-already-freed-data when CURLOPT_VERBOSE is used and a (very)
|
||||
persistent connection
|
||||
o now includes descriptive error messages for IDN errors
|
||||
o more forgivning PASS response code check for better working with proftpd
|
||||
o curl/multi.h works better included in winsock-using apps
|
||||
o curl_easy_reset() no longer enables the progress meter
|
||||
o build fix for SSL disabled curl with SSL Engine support present
|
||||
o configure --with-ssl=PATH now ignores pkg-config path info
|
||||
o CURLOPT_SSLENGINE can be set to NULL even if no engine support is available
|
||||
o LDAP crash when more than one record was received
|
||||
o connect failures properly stores an error message in the errorbuffer
|
||||
o Rare Location:-following problem with bad original URL
|
||||
o -F can now add Content-Type on non-file sections
|
||||
o double Host: header when following Location: with replaced Host:
|
||||
o curl_multi_add_handle() return code
|
||||
o "Proxy-Connection: close" is now understood and properly dealt with
|
||||
o curl_getdate() crash
|
||||
o downloading empty files now calls the write callback properly
|
||||
o no reverse DNS lookups for ip-only addresses with ipv6-enabled libcurl
|
||||
o file handler leak when getting an empty file:// URL
|
||||
o libcurl works better multi-threaded on AIX (when built with xlc)
|
||||
o cookies over proxy didn't match the path properly
|
||||
o MSVC makefile fixes to build better
|
||||
o FTP response 530 on 'PASS' now sends back a better error message
|
||||
|
||||
Other curl-related news since the previous public release:
|
||||
|
||||
o pycURL 7.10.8 was released: http://pycurl.sf.net/
|
||||
o TclCurl 0.10.8 was released:
|
||||
o AdacURL version 7.12.1 http://www.almroth.com/adacurl/index.html
|
||||
o pycurl version 7.12.1 http://pycurl.sourceforge.net/
|
||||
o tclcurl version 0.12.1
|
||||
http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
||||
o the Ferite curl binding was released: http://www.ferite.org/
|
||||
o stopped the curl.sourceforge.net mirror, it now redirects to curl.haxx.se
|
||||
o fresh new curl web mirrors:
|
||||
US Texas - http://curl.cyberservers.net
|
||||
US California - http://curl.mirrors.redwire.net
|
||||
Germany - http://curl.mirror.at.stealer.net
|
||||
Thailand - http://curl.siamu.ac.th
|
||||
o Dan Fandrich stepped forward and helps maintaining the download web page
|
||||
o libcurl.NET was announce: http://www.seasideresearch.com/downloads.html
|
||||
o Get your fresh Mozilla-extracted ca cert bundle here:
|
||||
http://curl.haxx.se/docs/caextract.html
|
||||
o New web mirror in Taiwan: http://curl.cs.pu.edu.tw/
|
||||
|
||||
This release would not have looked like this without help, code, reports and
|
||||
advice from friends like these:
|
||||
|
||||
Kevin Roth, Troels Walsted Hansen, Matt Veenstra, Marty Kuhrt, Benjamin
|
||||
Gerard, Gisle Vanem, Ralph Mitchell, S<>bastien Willemijns, Kang-Jin Lee,
|
||||
Peter Sylvester, Siddhartha Prakash Jain, Mathias Axelsson, Maciej
|
||||
W. Rozycki, Nicolas Croiset, Josh Kapell, Gaz Iqbal, Dave May, Markus
|
||||
Moeller, James Clancy, Giuseppe Attardi, swalkaus at yahoo.com, Steve Green,
|
||||
Marty Kuhrt, Dominick Meglio, Diego Casorran, David Byron, John McGowan,
|
||||
David J Meyer, Dan Fandrich, Pierre, Brian R Duffy, Luke Call, Vincent
|
||||
Bronner
|
||||
|
||||
Casey O'Donnell, Roland Krikava, Alex, Alexander Krasnostavsky, Kjetil
|
||||
Jacobsen, Ling Thio, Roman Koifman, Harshal Pradhan, Jonas Forsman, David
|
||||
Tarendash, Daniel at touchtunes, Bertrand Demiddelaer, Andreas Rieke,
|
||||
Jean-Claude Chauve, Dan Fandrich, Peter Sylvester, "Mekonikum", Jean-Philippe
|
||||
Barrette-LaPierre, G<>nter Knauf, Larry Campbell, Fedor Karpelevitch,
|
||||
Aleksandar Milivojevic, Gisle Vanem, Chris "Bob Bob", Chih-Chung Chang, Andy
|
||||
Cedilnik, Alan Pinstein, Eric Vergnaud, Traian Nicolescu, runekl at
|
||||
opoint.com
|
||||
|
||||
Thanks! (and sorry if I forgot to mention someone)
|
||||
|
||||
55
TODO-RELEASE
55
TODO-RELEASE
@@ -1,54 +1,11 @@
|
||||
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.
|
||||
Issues not sorted in any particular order.
|
||||
|
||||
Fix before releasing 7.11.0
|
||||
===========================
|
||||
|
||||
|
||||
To get fixed in 7.11.1
|
||||
To get fixed in 7.12.2 (planned release: mid October 2004)
|
||||
======================
|
||||
|
||||
1. Introduce a new error code indicating authentication problems (for proxy
|
||||
CONNECT error 407 for example). #845941 UNASSIGNED
|
||||
To get fixed in 7.12.3 (planned release: December 2004)
|
||||
======================
|
||||
|
||||
2. Make the proxy CONNECT headers get passed to the callbacks just like other
|
||||
headers are. #845941 UNASSIGNED
|
||||
47 - Peter Sylvester's patch for SRP on the TLS layer
|
||||
|
||||
4. Multi-threaded OpenSSL usage needs to be addressed (Dirk Manske has stepped
|
||||
forward on this)
|
||||
|
||||
6. REST fix for servers not behaving well on >2GB requests (some outstanding
|
||||
issues, Dave Meyer works on this)
|
||||
|
||||
8. Resolve the occational test case 91 failure. This still has no
|
||||
resolution. Test case 96 has been added to CVS to try variations of this
|
||||
test. (David Byron has done lots of research) UNASSIGNED
|
||||
|
||||
9. Modify ares to do 'files bind' order instead of 'bind files' by default
|
||||
(not actually part of libcurl) See details by Frank Ticheler posted here:
|
||||
http://curl.haxx.se/mail/archive-2003-11/0020.html UNASSIGNED
|
||||
|
||||
10. Anton Fedorov's "dumpcert" patch (only mailed to me privately) UNASSIGNED
|
||||
|
||||
12. The "PUT and (NTLM/Digest) auth" bug (confusion, awaits feedback) #862835
|
||||
|
||||
14. Evaluate/apply Gertjan van Wingerde's SSL patches, UNASSIGNED
|
||||
|
||||
16. Tony Blakie's bug report about getting a 302 and Location: back from a
|
||||
proxy after a CONNECT request. (correct behavior on this is not certain)
|
||||
UNASSIGNED, lack of feedback on this. Subject for dismissal.
|
||||
|
||||
18. Modified Accept: header in the default HTTP request (being discussed).
|
||||
UNASSIGNED
|
||||
|
||||
19. Resolve Giuseppe Attardi's "elusive cache bug" (work required)
|
||||
|
||||
20. Directory listing support for file:///dir/ (patch by David Hull)
|
||||
http://sourceforge.net/tracker/index.php?func=detail&aid=844036&group_id=976&atid=300976
|
||||
This patch needs work to become portable. UNASSIGNED
|
||||
|
||||
21. Send QUIT before closing an FTP connection. Joe Halpin has provided an
|
||||
initial patch. Some outstanding issues.
|
||||
|
||||
23. Peter Sylvester's "Most Significant Common Name" patch. Feedback welcome.
|
||||
48 - MSVC Makefile improvements by Samuel D<>az Garc<72>a
|
||||
|
||||
302
acinclude.m4
302
acinclude.m4
@@ -64,7 +64,7 @@ dnl the code was bad, try a different program now, test 3
|
||||
],[
|
||||
/* ioctlsocket source code */
|
||||
int socket;
|
||||
int flags = ioctlsocket(socket, FIONBIO, &flags);
|
||||
unsigned long flags = ioctlsocket(socket, FIONBIO, &flags);
|
||||
],[
|
||||
dnl ioctlsocket test was good
|
||||
nonblock="ioctlsocket"
|
||||
@@ -245,7 +245,8 @@ AC_DEFUN([CURL_CHECK_WORKING_GETADDRINFO],[
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
void main(void) {
|
||||
int main(void)
|
||||
{
|
||||
struct addrinfo hints, *ai;
|
||||
int error;
|
||||
|
||||
@@ -254,11 +255,9 @@ void main(void) {
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
error = getaddrinfo("127.0.0.1", "8080", &hints, &ai);
|
||||
if (error) {
|
||||
exit(1);
|
||||
}
|
||||
else {
|
||||
exit(0);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
],[
|
||||
ac_cv_working_getaddrinfo="yes"
|
||||
@@ -276,10 +275,72 @@ if test "$ac_cv_working_getaddrinfo" = "yes"; then
|
||||
fi
|
||||
])
|
||||
|
||||
dnl ************************************************************
|
||||
dnl check for working NI_WITHSCOPEID in getnameinfo()
|
||||
dnl
|
||||
AC_DEFUN([CURL_CHECK_NI_WITHSCOPEID],[
|
||||
AC_CACHE_CHECK(for working NI_WITHSCOPEID, ac_cv_working_ni_withscopeid,[
|
||||
|
||||
AC_RUN_IFELSE([[
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
int main()
|
||||
{
|
||||
#ifdef NI_WITHSCOPEID
|
||||
struct sockaddr_storage ss;
|
||||
int sslen = sizeof(ss);
|
||||
int rc;
|
||||
char hbuf[NI_MAXHOST];
|
||||
int fd = socket(AF_INET6, SOCK_STREAM, 0);
|
||||
if(fd < 0) {
|
||||
perror("socket()");
|
||||
return 1; /* couldn't create socket of either kind */
|
||||
}
|
||||
|
||||
rc = getsockname(fd, (struct sockaddr *)&ss, &sslen);
|
||||
if(rc) {
|
||||
perror("getsockname()");
|
||||
return 2;
|
||||
}
|
||||
|
||||
rc = getnameinfo((struct sockaddr *)&ss, sslen, hbuf, sizeof(hbuf),
|
||||
NULL, 0,
|
||||
NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID);
|
||||
|
||||
if(rc) {
|
||||
printf("rc = %s\n", gai_strerror(rc));
|
||||
return 3;
|
||||
}
|
||||
|
||||
return 0; /* everything works fine, use NI_WITHSCOPEID! */
|
||||
#else
|
||||
return 4; /* we don't seem to have the definition, don't use it */
|
||||
#endif
|
||||
}
|
||||
]],
|
||||
dnl program worked:
|
||||
[ ac_cv_working_ni_withscopeid="yes" ],
|
||||
dnl program failed:
|
||||
[ ac_cv_working_ni_withscopeid="no" ],
|
||||
dnl we cross-compile:
|
||||
[ ac_cv_working_ni_withscopeid="yes" ]
|
||||
) dnl end of AC_RUN_IFELSE
|
||||
|
||||
]) dnl end of AC_CACHE_CHECK
|
||||
|
||||
if test "$ac_cv_working_ni_withscopeid" = "yes"; then
|
||||
AC_DEFINE(HAVE_NI_WITHSCOPEID, 1,
|
||||
[Define if NI_WITHSCOPEID exists and works])
|
||||
fi
|
||||
|
||||
]) dnl end of AC_DEFUN
|
||||
|
||||
|
||||
AC_DEFUN([CURL_CHECK_LOCALTIME_R],
|
||||
[
|
||||
dnl check for a few thread-safe functions
|
||||
dnl check for localtime_r
|
||||
AC_CHECK_FUNCS(localtime_r,[
|
||||
AC_MSG_CHECKING(whether localtime_r is declared)
|
||||
AC_EGREP_CPP(localtime_r,[
|
||||
@@ -295,6 +356,112 @@ AC_DEFUN([CURL_CHECK_LOCALTIME_R],
|
||||
AC_MSG_RESULT(no))])])
|
||||
])
|
||||
|
||||
dnl
|
||||
dnl This function checks for strerror_r(). If it isn't found at first, it
|
||||
dnl retries with _THREAD_SAFE defined, as that is what AIX seems to require
|
||||
dnl in order to find this function.
|
||||
dnl
|
||||
dnl If the function is found, it will then proceed to check how the function
|
||||
dnl actually works: glibc-style or POSIX-style.
|
||||
dnl
|
||||
dnl glibc:
|
||||
dnl char *strerror_r(int errnum, char *buf, size_t n);
|
||||
dnl
|
||||
dnl What this one does is to return the error string (no surprises there),
|
||||
dnl but it doesn't usually copy anything into buf! The 'buf' and 'n'
|
||||
dnl parameters are only meant as an optional working area, in case strerror_r
|
||||
dnl needs it. A quick test on a few systems shows that it's generally not
|
||||
dnl touched at all.
|
||||
dnl
|
||||
dnl POSIX:
|
||||
dnl int strerror_r(int errnum, char *buf, size_t n);
|
||||
dnl
|
||||
AC_DEFUN([CURL_CHECK_STRERROR_R],
|
||||
[
|
||||
dnl determine of strerror_r is present
|
||||
AC_CHECK_FUNCS(strerror_r,[
|
||||
AC_MSG_CHECKING(whether strerror_r is declared)
|
||||
AC_EGREP_CPP(strerror_r,[
|
||||
#include <string.h>],[
|
||||
strerror_r="yes"
|
||||
AC_MSG_RESULT(yes)],[
|
||||
AC_MSG_RESULT(no)
|
||||
AC_MSG_CHECKING(whether strerror_r with -D_THREAD_SAFE is declared)
|
||||
AC_EGREP_CPP(strerror_r,[
|
||||
#define _THREAD_SAFE
|
||||
#include <string.h>],[
|
||||
strerror_r="yes"
|
||||
CPPFLAGS="-D_THREAD_SAFE $CPPFLAGS"
|
||||
AC_MSG_RESULT(yes)],
|
||||
AC_MSG_RESULT(no))])])
|
||||
|
||||
if test "x$strerror_r" = "xyes"; then
|
||||
|
||||
dnl check if strerror_r is properly declared in the headers
|
||||
AC_CHECK_DECL(strerror_r, ,
|
||||
AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto])
|
||||
,
|
||||
[#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
])
|
||||
|
||||
dnl determine if this strerror_r() is glibc or POSIX
|
||||
AC_MSG_CHECKING([for a glibc strerror_r API])
|
||||
AC_TRY_RUN([
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
int
|
||||
main () {
|
||||
char buffer[1024]; /* big enough to play with */
|
||||
char *string =
|
||||
strerror_r(EACCES, buffer, sizeof(buffer));
|
||||
/* this should've returned a string */
|
||||
if(!string || !string[0])
|
||||
return 99;
|
||||
return 0;
|
||||
}
|
||||
],
|
||||
GLIBC_STRERROR_R="1"
|
||||
AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
|
||||
AC_MSG_RESULT([yes]),
|
||||
AC_MSG_RESULT([no]),
|
||||
dnl cross-compiling!
|
||||
AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
|
||||
)
|
||||
|
||||
if test -z "$GLIBC_STRERROR_R"; then
|
||||
|
||||
AC_MSG_CHECKING([for a POSIX strerror_r API])
|
||||
AC_TRY_RUN([
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
int
|
||||
main () {
|
||||
char buffer[1024]; /* big enough to play with */
|
||||
int error =
|
||||
strerror_r(EACCES, buffer, sizeof(buffer));
|
||||
/* This should've returned zero, and written an error string in the
|
||||
buffer.*/
|
||||
if(!buffer[0] || error)
|
||||
return 99;
|
||||
return 0;
|
||||
}
|
||||
],
|
||||
AC_DEFINE(HAVE_POSIX_STRERROR_R, 1, [we have a POSIX-style strerror_r()])
|
||||
AC_MSG_RESULT([yes]),
|
||||
AC_MSG_RESULT([no]) ,
|
||||
dnl cross-compiling!
|
||||
AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
|
||||
)
|
||||
|
||||
fi dnl if not using glibc API
|
||||
|
||||
fi dnl we have a strerror_r
|
||||
|
||||
])
|
||||
|
||||
AC_DEFUN([CURL_CHECK_INET_NTOA_R],
|
||||
[
|
||||
dnl determine if function definition for inet_ntoa_r exists.
|
||||
@@ -475,3 +642,124 @@ if test "$ac_cv_func_gethostbyname_r" = "yes"; then
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
dnl We create a function for detecting which compiler we use and then set as
|
||||
dnl pendantic compiler options as possible for that particular compiler. The
|
||||
dnl options are only used for debug-builds.
|
||||
|
||||
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 * 269 warns on our "%Od" printf formatters for curl_off_t output:
|
||||
dnl "invalid format string conversion"
|
||||
dnl * 279 warns on static conditions in while expressions
|
||||
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 which we know and do on purpose.
|
||||
|
||||
WARN="-wd279,269,981,1418,1419"
|
||||
|
||||
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 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"
|
||||
|
||||
dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
|
||||
|
||||
if test "$gccnum" -gt "295"; then
|
||||
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 gcc 2.95.4 on FreeBSD 4.9!
|
||||
WARN="$WARN -Wundef"
|
||||
fi
|
||||
|
||||
if test "$gccnum" -ge "296"; then
|
||||
dnl gcc 2.96 or later
|
||||
WARN="$WARN -Wfloat-equal"
|
||||
fi
|
||||
|
||||
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
|
||||
|
||||
if test "$gccnum" -ge "304"; then
|
||||
# try -Wunreachable-code on gcc 3.4
|
||||
WARN="$WARN -Wunreachable-code"
|
||||
fi
|
||||
|
||||
for flag in $CPPFLAGS; do
|
||||
case "$flag" in
|
||||
-I*)
|
||||
dnl Include path, provide a -isystem option for the same dir
|
||||
dnl to prevent warnings in those dirs. The -isystem was not very
|
||||
dnl reliable on earlier gcc versions.
|
||||
add=`echo $flag | sed 's/^-I/-isystem /g'`
|
||||
WARN="$WARN $add"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
fi dnl $ICC = no
|
||||
|
||||
CFLAGS="$CFLAGS $WARN"
|
||||
|
||||
AC_MSG_NOTICE([Added this set of compiler options: $WARN])
|
||||
|
||||
else dnl $GCC = yes
|
||||
|
||||
AC_MSG_NOTICE([Added no extra compiler options])
|
||||
|
||||
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()
|
||||
|
||||
|
||||
@@ -5,3 +5,18 @@ adig
|
||||
ahost
|
||||
config.log
|
||||
config.status
|
||||
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
|
||||
|
||||
219
ares/CHANGES
219
ares/CHANGES
@@ -1,17 +1,220 @@
|
||||
This package is built on ares 1.1.1 (written by Greg Hudson). I've decided to
|
||||
put together and release my own ares archives since the ares maintainer
|
||||
doesn't want these improvements.
|
||||
Changelog for the c-ares project
|
||||
|
||||
The package is called 'c-ares' for now since I (Daniel Stenberg) want this for
|
||||
use within the curl project (hence the letter C) and it makes a nice pun.
|
||||
* September 29
|
||||
|
||||
* January 4, 2004:
|
||||
- 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)
|
||||
|
||||
* April 2, 2004
|
||||
- Updated various man pages to look nicer when converted to HTML on the web
|
||||
site.
|
||||
|
||||
* April 1, 2004
|
||||
- Dirk Manske provided a new function that is now named ares_cancel(). It is
|
||||
used to cancel/cleanup a resolve/request made using ares functions on the
|
||||
given ares channel. It does not destroy/kill the ares channel itself.
|
||||
|
||||
- Dominick Meglio cleaned up the formatting in several man pages.
|
||||
|
||||
* March 30, 2004
|
||||
- Dominick Meglio's new ares_expand_string. A helper function when decoding
|
||||
incoming DNS packages.
|
||||
|
||||
- Daniel Stenberg modified the Makefile.in to use a for loop for the man page
|
||||
installation to improve overview and make it easier to add man pages.
|
||||
|
||||
Version 1.1.0 (March 11, 2004)
|
||||
|
||||
* March 9, 2004
|
||||
- Gisle Vanem improved build on Windows.
|
||||
|
||||
* February 25, 2004
|
||||
- Dan Fandrich found a flaw in the Feb 22 fix.
|
||||
|
||||
- Added better configure --enable-debug logic (taken from the curl configure
|
||||
script). Added acinclude.m4 to the tarball.
|
||||
|
||||
* February 23, 2004
|
||||
- Removed ares_free_errmem(), the function, the file and the man page. It was
|
||||
not used and it did nothing.
|
||||
|
||||
- Fixed a lot of code that wasn't "64bit clean" and thus caused a lot of
|
||||
compiler warnings on picky compilers.
|
||||
|
||||
* February 22, 2004
|
||||
- Dominick Meglio made ares init support multiple name servers in the
|
||||
NameServer key on Windows.
|
||||
|
||||
* February 16, 2004
|
||||
- Modified ares_private.h to include libcurl's memory debug header if
|
||||
CURLDEBUG is set. This makes all the ares-functions supervised properly by
|
||||
the curl test suite. This also forced me to add inclusion of the
|
||||
ares_private.h header in a few more files that are using some kind of
|
||||
memory-related resources.
|
||||
|
||||
- Made the makefile only build ahost and adig if 'make demos' is used.
|
||||
|
||||
* February 10, 2004
|
||||
- Dirk Manske made ares_version.h installed with 'make install'
|
||||
|
||||
* February 4, 2004
|
||||
- ares_free_errmem() is subject for removal, it is simply present for future
|
||||
purposes, and since we removed the extra parameter in strerror() it won't
|
||||
be used by c-ares!
|
||||
- configure --enable-debug now enables picky compiler options if gcc is used
|
||||
- fixed several compiler warnings --enable-debug showed and Joerg Mueller-Tolk
|
||||
reported
|
||||
|
||||
Version 1.0.0 (February 3, 2004)
|
||||
|
||||
* February 3, 2004
|
||||
- now we produce the libcares.a library instead of the previous libares.a
|
||||
since we are no longer compatible
|
||||
|
||||
* February 2, 2004
|
||||
|
||||
- ares_strerror() has one argument less. This is the first official
|
||||
modification of the existing provided ares API.
|
||||
|
||||
* January 29, 2004
|
||||
|
||||
- Dirk Manske fixed how the socket is set non-blocking.
|
||||
|
||||
* January 4, 2004
|
||||
|
||||
- Dominick Meglio made the private gettimeofday() become ares_gettimeofday()
|
||||
instead in order to not pollute the name space and risk colliding with
|
||||
other libraries' versions of this function.
|
||||
|
||||
* October 24, 2003. Daniel Stenberg:
|
||||
* October 24, 2003. Daniel Stenberg
|
||||
|
||||
Added ares_version().
|
||||
|
||||
@@ -26,3 +229,5 @@ Version 1.0-pre1 (8 October 2003)
|
||||
- Daniel Stenberg adjusted the windows port
|
||||
|
||||
- liren at vivisimo.com made the initial windows port
|
||||
|
||||
* Imported the sources from ares 1.1.1
|
||||
|
||||
@@ -3,15 +3,20 @@
|
||||
*.3
|
||||
NEWS
|
||||
README
|
||||
README.cares
|
||||
CHANGES
|
||||
FILES
|
||||
maketgz
|
||||
aclocal.m4
|
||||
acinclude.m4
|
||||
Makefile.in
|
||||
Makefile.dj
|
||||
Makefile.m32
|
||||
Makefile.netware
|
||||
install-sh
|
||||
mkinstalldirs
|
||||
configure
|
||||
configure.in
|
||||
configure.ac
|
||||
config.guess
|
||||
config.sub
|
||||
vc/adig/adig.dep
|
||||
@@ -19,8 +24,6 @@ vc/adig/adig.dsp
|
||||
vc/adig/adig.mak
|
||||
vc/adig/adig.plg
|
||||
vc/vc.dsw
|
||||
vc/vc.ncb
|
||||
vc/vc.opt
|
||||
vc/ahost/ahost.dep
|
||||
vc/ahost/ahost.dsp
|
||||
vc/ahost/ahost.mak
|
||||
|
||||
57
ares/Makefile.am
Normal file
57
ares/Makefile.am
Normal file
@@ -0,0 +1,57 @@
|
||||
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)
|
||||
|
||||
|
||||
VER=-version-info 0: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
|
||||
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,87 +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@
|
||||
|
||||
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_errmem.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
|
||||
|
||||
all: libares.a adig ahost
|
||||
|
||||
libares.a: ${OBJS}
|
||||
ar cru $@ ${OBJS}
|
||||
${RANLIB} $@
|
||||
|
||||
adig: adig.o libares.a
|
||||
${CC} ${LDFLAGS} -o $@ adig.o libares.a ${LIBS}
|
||||
|
||||
ahost: ahost.o libares.a
|
||||
${CC} ${LDFLAGS} -o $@ ahost.o libares.a ${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 libares.a ${DESTDIR}${libdir}
|
||||
${RANLIB} ${DESTDIR}${libdir}/libares.a
|
||||
chmod u-w ${DESTDIR}${libdir}/libares.a
|
||||
${INSTALL} -m 444 ${srcdir}/ares.h ${DESTDIR}${includedir}
|
||||
${INSTALL} -m 444 ${srcdir}/ares_destroy.3 ${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_expand_name.3 ${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_fds.3 ${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_free_errmem.3 ${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_free_hostent.3 \
|
||||
${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_free_string.3 \
|
||||
${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_gethostbyaddr.3 \
|
||||
${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_gethostbyname.3 \
|
||||
${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_init.3 ${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_init_options.3 \
|
||||
${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_mkquery.3 ${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_parse_a_reply.3 \
|
||||
${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_parse_ptr_reply.3 \
|
||||
${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_process.3 ${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_query.3 ${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_search.3 ${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_send.3 ${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_strerror.3 ${DESTDIR}${mandir}/man3
|
||||
${INSTALL} -m 444 ${srcdir}/ares_timeout.3 ${DESTDIR}${mandir}/man3
|
||||
|
||||
clean:
|
||||
rm -f ${OBJS} libares.a adig.o adig ahost.o ahost
|
||||
|
||||
distclean: clean
|
||||
rm -f config.cache config.log config.status Makefile
|
||||
15
ares/Makefile.inc
Normal file
15
ares/Makefile.inc
Normal file
@@ -0,0 +1,15 @@
|
||||
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
|
||||
|
||||
HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h nameser.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
|
||||
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
|
||||
317
ares/Makefile.netware
Normal file
317
ares/Makefile.netware
Normal file
@@ -0,0 +1,317 @@
|
||||
#################################################################
|
||||
#
|
||||
## 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 - 2004, 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 # -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
|
||||
|
||||
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(wildcard ares_*.c))
|
||||
|
||||
.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_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) >> $@
|
||||
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:
|
||||
* ares should now compile as C++ code (no longer uses reserved word
|
||||
"class").
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
This is c-ares, a forked version of the original ares. The original ares
|
||||
README follows below, the c-ares specific details are in README.cares
|
||||
|
||||
====================================================================
|
||||
|
||||
This is ares, an asynchronous resolver library. It is intended for
|
||||
applications which need to perform DNS queries without blocking, or
|
||||
need to perform multiple DNS queries in parallel. The primary
|
||||
|
||||
25
ares/README.cares
Normal file
25
ares/README.cares
Normal file
@@ -0,0 +1,25 @@
|
||||
c-ares
|
||||
======
|
||||
|
||||
This package is based on ares 1.1.1 (written by Greg Hudson). I decided to
|
||||
fork and release a separate project since the ares author didn't want the
|
||||
improvements that were vital for our use of it.
|
||||
|
||||
This package is dubbed 'c-ares' since I (Daniel Stenberg) wanted this for use
|
||||
within the curl project (hence the letter C) and it makes a nice pun. Also,
|
||||
c-ares is not API compatible with ares: a new name makes that more obvious to
|
||||
the public.
|
||||
|
||||
The full source code is available in the 'c-ares' release archives, and in the
|
||||
'ares' subdir of the curl CVS source repostitory.
|
||||
|
||||
If you find bugs, correct flaws, have questions or have comments in general in
|
||||
regard to c-ares (or by all means the original ares too), get in touch with us
|
||||
on the c-ares mailing list: http://cool.haxx.se/mailman/listinfo/c-ares
|
||||
|
||||
c-ares is of course distributed under the same MIT-style license as the
|
||||
original ares.
|
||||
|
||||
You'll find all c-ares details and news here:
|
||||
|
||||
http://daniel.haxx.se/projects/c-ares
|
||||
101
ares/acinclude.m4
Normal file
101
ares/acinclude.m4
Normal file
@@ -0,0 +1,101 @@
|
||||
|
||||
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()
|
||||
|
||||
358
ares/aclocal.m4
vendored
358
ares/aclocal.m4
vendored
@@ -1,358 +0,0 @@
|
||||
dnl $Id$
|
||||
|
||||
dnl Copyright 1996 by the Massachusetts Institute of Technology.
|
||||
dnl
|
||||
dnl Permission to use, copy, modify, and distribute this
|
||||
dnl software and its documentation for any purpose and without
|
||||
dnl fee is hereby granted, provided that the above copyright
|
||||
dnl notice appear in all copies and that both that copyright
|
||||
dnl notice and this permission notice appear in supporting
|
||||
dnl documentation, and that the name of M.I.T. not be used in
|
||||
dnl advertising or publicity pertaining to distribution of the
|
||||
dnl software without specific, written prior permission.
|
||||
dnl M.I.T. makes no representations about the suitability of
|
||||
dnl this software for any purpose. It is provided "as is"
|
||||
dnl without express or implied warranty.
|
||||
|
||||
dnl This file provides local macros for packages which use specific
|
||||
dnl external libraries. The public macros are:
|
||||
dnl
|
||||
dnl ATHENA_UTIL_COM_ERR
|
||||
dnl Generates error if com_err not found.
|
||||
dnl ATHENA_UTIL_SS
|
||||
dnl Generates error if ss not found.
|
||||
dnl ATHENA_REGEXP
|
||||
dnl Sets REGEX_LIBS if rx library used; ensures POSIX
|
||||
dnl regexp support.
|
||||
dnl ATHENA_MOTIF
|
||||
dnl Sets MOTIF_LIBS and defines HAVE_MOTIF if Motif used.
|
||||
dnl ATHENA_MOTIF_REQUIRED
|
||||
dnl Generates error if Motif not found.
|
||||
dnl ATHENA_AFS
|
||||
dnl Sets AFS_LIBS and defines HAVE_AFS if AFS used. Pass
|
||||
dnl in an argument giving the desired AFS libraries;
|
||||
dnl AFS_LIBS will be set to that value if AFS is found.
|
||||
dnl AFS_DIR will be set to the prefix given.
|
||||
dnl ATHENA_AFS_REQUIRED
|
||||
dnl Generates error if AFS libraries not found. AFS_DIR
|
||||
dnl will be set to the prefix given.
|
||||
dnl ATHENA_KRB4
|
||||
dnl Sets KRB4_LIBS and defines HAVE_KRB4 if krb4 used.
|
||||
dnl ATHENA_KRB4_REQUIRED
|
||||
dnl Generates error if krb4 not found. Sets KRB4_LIBS
|
||||
dnl otherwise. (Special behavior because krb4 libraries
|
||||
dnl may be different if using krb4 compatibility libraries
|
||||
dnl from krb5.)
|
||||
dnl ATHENA_KRB5
|
||||
dnl Sets KRB5_LIBS and defines HAVE_KRB5 if krb5 used.
|
||||
dnl ATHENA_KRB5_REQUIRED
|
||||
dnl Generates error if krb5 not found.
|
||||
dnl ATHENA_HESIOD
|
||||
dnl Sets HESIOD_LIBS and defines HAVE_HESIOD if Hesiod
|
||||
dnl used.
|
||||
dnl ATHENA_HESIOD_REQUIRED
|
||||
dnl Generates error if Hesiod not found.
|
||||
dnl ATHENA_ARES
|
||||
dnl Sets ARES_LIBS and defines HAVE_ARES if libares
|
||||
dnl used.
|
||||
dnl ATHENA_ARES_REQUIRED
|
||||
dnl Generates error if libares not found.
|
||||
dnl ATHENA_ZEPHYR
|
||||
dnl Sets ZEPHYR_LIBS and defines HAVE_ZEPHYR if zephyr
|
||||
dnl used.
|
||||
dnl ATHENA_ZEPHYR_REQUIRED
|
||||
dnl Generates error if zephyr not found.
|
||||
dnl
|
||||
dnl All of the macros may extend CPPFLAGS and LDFLAGS to let the
|
||||
dnl compiler find the requested libraries. Put ATHENA_UTIL_COM_ERR
|
||||
dnl and ATHENA_UTIL_SS before ATHENA_AFS or ATHENA_AFS_REQUIRED; there
|
||||
dnl is a com_err library in the AFS libraries which requires -lutil.
|
||||
|
||||
dnl ----- com_err -----
|
||||
|
||||
AC_DEFUN(ATHENA_UTIL_COM_ERR,
|
||||
[AC_ARG_WITH(com_err,
|
||||
[ --with-com_err=PREFIX Specify location of com_err],
|
||||
[com_err="$withval"], [com_err=yes])
|
||||
if test "$com_err" != no; then
|
||||
if test "$com_err" != yes; then
|
||||
CPPFLAGS="$CPPFLAGS -I$com_err/include"
|
||||
LDFLAGS="$LDFLAGS -L$com_err/lib"
|
||||
fi
|
||||
AC_CHECK_LIB(com_err, com_err, :,
|
||||
[AC_MSG_ERROR(com_err library not found)])
|
||||
else
|
||||
AC_MSG_ERROR(This package requires com_err.)
|
||||
fi])
|
||||
|
||||
dnl ----- ss -----
|
||||
|
||||
AC_DEFUN(ATHENA_UTIL_SS,
|
||||
[AC_ARG_WITH(ss,
|
||||
[ --with-ss=PREFIX Specify location of ss (requires com_err)],
|
||||
[ss="$withval"], [ss=yes])
|
||||
if test "$ss" != no; then
|
||||
if test "$ss" != yes; then
|
||||
CPPFLAGS="$CPPFLAGS -I$ss/include"
|
||||
LDFLAGS="$LDFLAGS -L$ss/lib"
|
||||
fi
|
||||
AC_CHECK_LIB(ss, ss_perror, :,
|
||||
[AC_MSG_ERROR(ss library not found)], -lcom_err)
|
||||
else
|
||||
AC_MSG_ERROR(This package requires ss.)
|
||||
fi])
|
||||
|
||||
dnl ----- Regular expressions -----
|
||||
|
||||
AC_DEFUN(ATHENA_REGEXP,
|
||||
[AC_ARG_WITH(regex,
|
||||
[ --with-regex=PREFIX Use installed regex library],
|
||||
[regex="$withval"], [regex=no])
|
||||
if test "$regex" != no; then
|
||||
if test "$regex" != yes; then
|
||||
CPPFLAGS="$CPPFLAGS -I$regex/include"
|
||||
LDFLAGS="$LDFLAGS -L$regex/lib"
|
||||
fi
|
||||
AC_CHECK_LIB(regex, regcomp, REGEX_LIBS=-lregex,
|
||||
[AC_MSG_ERROR(regex library not found)])
|
||||
else
|
||||
AC_CHECK_FUNC(regcomp, :,
|
||||
[AC_MSG_ERROR(can't find POSIX regexp support)])
|
||||
fi
|
||||
AC_SUBST(REGEX_LIBS)])
|
||||
|
||||
dnl ----- Motif -----
|
||||
|
||||
AC_DEFUN(ATHENA_MOTIF_CHECK,
|
||||
[if test "$motif" != yes; then
|
||||
CPPFLAGS="$CPPFLAGS -I$motif/include"
|
||||
LDFLAGS="$LDFLAGS -L$motif/lib"
|
||||
fi
|
||||
AC_CHECK_LIB(Xm, XmStringFree, :, [AC_MSG_ERROR(Motif library not found)])])
|
||||
|
||||
AC_DEFUN(ATHENA_MOTIF,
|
||||
[AC_ARG_WITH(motif,
|
||||
[ --with-motif=PREFIX Use Motif],
|
||||
[motif="$withval"], [motif=no])
|
||||
if test "$motif" != no; then
|
||||
ATHENA_MOTIF_CHECK
|
||||
MOTIF_LIBS=-lXm
|
||||
AC_DEFINE(HAVE_MOTIF)
|
||||
fi
|
||||
AC_SUBST(MOTIF_LIBS)])
|
||||
|
||||
AC_DEFUN(ATHENA_MOTIF_REQUIRED,
|
||||
[AC_ARG_WITH(motif,
|
||||
[ --with-motif=PREFIX Specify location of Motif],
|
||||
[motif="$withval"], [motif=yes])
|
||||
if test "$motif" != no; then
|
||||
ATHENA_MOTIF_CHECK
|
||||
else
|
||||
AC_MSG_ERROR(This package requires Motif.)
|
||||
fi])
|
||||
|
||||
dnl ----- AFS -----
|
||||
|
||||
AC_DEFUN(ATHENA_AFS_CHECK,
|
||||
[AC_CHECK_FUNC(insque, :, AC_CHECK_LIB(compat, insque))
|
||||
AC_CHECK_FUNC(gethostbyname, :, AC_CHECK_LIB(nsl, gethostbyname))
|
||||
AC_CHECK_FUNC(socket, :, AC_CHECK_LIB(socket, socket))
|
||||
if test "$afs" != yes; then
|
||||
CPPFLAGS="$CPPFLAGS -I$afs/include"
|
||||
LDFLAGS="$LDFLAGS -L$afs/lib -L$afs/lib/afs"
|
||||
fi
|
||||
AC_CHECK_LIB(sys, pioctl, :, [AC_MSG_ERROR(AFS libraries not found)],
|
||||
-lrx -llwp -lsys)
|
||||
AFS_DIR=$afs
|
||||
AC_SUBST(AFS_DIR)])
|
||||
|
||||
dnl Specify desired AFS libraries as a parameter.
|
||||
AC_DEFUN(ATHENA_AFS,
|
||||
[AC_ARG_WITH(afs,
|
||||
[ --with-afs=PREFIX Use AFS libraries],
|
||||
[afs="$withval"], [afs=no])
|
||||
if test "$afs" != no; then
|
||||
ATHENA_AFS_CHECK
|
||||
AFS_LIBS=$1
|
||||
AC_DEFINE(HAVE_AFS)
|
||||
fi
|
||||
AC_SUBST(AFS_LIBS)])
|
||||
|
||||
AC_DEFUN(ATHENA_AFS_REQUIRED,
|
||||
[AC_ARG_WITH(afs,
|
||||
[ --with-afs=PREFIX Specify location of AFS libraries],
|
||||
[afs="$withval"], [afs=/usr/afsws])
|
||||
if test "$afs" != no; then
|
||||
ATHENA_AFS_CHECK
|
||||
else
|
||||
AC_MSG_ERROR(This package requires AFS libraries.)
|
||||
fi])
|
||||
|
||||
dnl ----- Kerberos 4 -----
|
||||
|
||||
AC_DEFUN(ATHENA_KRB4_CHECK,
|
||||
[AC_CHECK_FUNC(gethostbyname, :, AC_CHECK_LIB(nsl, gethostbyname))
|
||||
AC_CHECK_FUNC(socket, :, AC_CHECK_LIB(socket, socket))
|
||||
AC_CHECK_LIB(gen, compile)
|
||||
if test "$krb4" != yes; then
|
||||
CPPFLAGS="$CPPFLAGS -I$krb4/include"
|
||||
if test -d "$krb4/include/kerberosIV"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$krb4/include/kerberosIV"
|
||||
fi
|
||||
LDFLAGS="$LDFLAGS -L$krb4/lib"
|
||||
fi
|
||||
AC_CHECK_LIB(krb4, krb_rd_req,
|
||||
[KRB4_LIBS="-lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err"],
|
||||
[AC_CHECK_LIB(krb, krb_rd_req,
|
||||
[KRB4_LIBS="-lkrb -ldes"],
|
||||
[AC_MSG_ERROR(Kerberos 4 libraries not found)],
|
||||
-ldes)],
|
||||
-ldes425 -lkrb5 -lk5crypto -lcom_err)])
|
||||
|
||||
AC_DEFUN(ATHENA_KRB4,
|
||||
[AC_ARG_WITH(krb4,
|
||||
[ --with-krb4=PREFIX Use Kerberos 4],
|
||||
[krb4="$withval"], [krb4=no])
|
||||
if test "$krb4" != no; then
|
||||
ATHENA_KRB4_CHECK
|
||||
AC_DEFINE(HAVE_KRB4)
|
||||
fi
|
||||
AC_SUBST(KRB4_LIBS)])
|
||||
|
||||
AC_DEFUN(ATHENA_KRB4_REQUIRED,
|
||||
[AC_ARG_WITH(krb4,
|
||||
[ --with-krb4=PREFIX Specify location of Kerberos 4],
|
||||
[krb4="$withval"], [krb4=yes])
|
||||
if test "$krb4" != no; then
|
||||
ATHENA_KRB4_CHECK
|
||||
AC_SUBST(KRB4_LIBS)
|
||||
else
|
||||
AC_MSG_ERROR(This package requires Kerberos 4.)
|
||||
fi])
|
||||
|
||||
dnl ----- Kerberos 5 -----
|
||||
|
||||
AC_DEFUN(ATHENA_KRB5_CHECK,
|
||||
[AC_SEARCH_LIBS(gethostbyname, nsl)
|
||||
AC_SEARCH_LIBS(socket, socket)
|
||||
AC_CHECK_LIB(gen, compile)
|
||||
if test "$krb5" != yes; then
|
||||
CPPFLAGS="$CPPFLAGS -I$krb5/include"
|
||||
LDFLAGS="$LDFLAGS -L$krb5/lib"
|
||||
fi
|
||||
AC_CHECK_LIB(krb5, krb5_init_context, :,
|
||||
[AC_MSG_ERROR(Kerberos 5 libraries not found)],
|
||||
-lk5crypto -lcom_err)])
|
||||
|
||||
AC_DEFUN(ATHENA_KRB5,
|
||||
[AC_ARG_WITH(krb5,
|
||||
[ --with-krb5=PREFIX Use Kerberos 5],
|
||||
[krb5="$withval"], [krb5=no])
|
||||
if test "$krb5" != no; then
|
||||
ATHENA_KRB5_CHECK
|
||||
KRB5_LIBS="-lkrb5 -lk5crypto -lcom_err"
|
||||
AC_DEFINE(HAVE_KRB5)
|
||||
fi
|
||||
AC_SUBST(KRB5_LIBS)])
|
||||
|
||||
AC_DEFUN(ATHENA_KRB5_REQUIRED,
|
||||
[AC_ARG_WITH(krb5,
|
||||
[ --with-krb5=PREFIX Specify location of Kerberos 5],
|
||||
[krb5="$withval"], [krb5=yes])
|
||||
if test "$krb5" != no; then
|
||||
ATHENA_KRB5_CHECK
|
||||
else
|
||||
AC_MSG_ERROR(This package requires Kerberos 5.)
|
||||
fi])
|
||||
|
||||
dnl ----- Hesiod -----
|
||||
|
||||
AC_DEFUN(ATHENA_HESIOD_CHECK,
|
||||
[AC_CHECK_FUNC(res_send, :, AC_CHECK_LIB(resolv, res_send))
|
||||
if test "$hesiod" != yes; then
|
||||
CPPFLAGS="$CPPFLAGS -I$hesiod/include"
|
||||
LDFLAGS="$LDFLAGS -L$hesiod/lib"
|
||||
fi
|
||||
AC_CHECK_LIB(hesiod, hes_resolve, :,
|
||||
[AC_MSG_ERROR(Hesiod library not found)])])
|
||||
|
||||
AC_DEFUN(ATHENA_HESIOD,
|
||||
[AC_ARG_WITH(hesiod,
|
||||
[ --with-hesiod=PREFIX Use Hesiod],
|
||||
[hesiod="$withval"], [hesiod=no])
|
||||
if test "$hesiod" != no; then
|
||||
ATHENA_HESIOD_CHECK
|
||||
HESIOD_LIBS="-lhesiod"
|
||||
AC_DEFINE(HAVE_HESIOD)
|
||||
fi
|
||||
AC_SUBST(HESIOD_LIBS)])
|
||||
|
||||
AC_DEFUN(ATHENA_HESIOD_REQUIRED,
|
||||
[AC_ARG_WITH(hesiod,
|
||||
[ --with-hesiod=PREFIX Specify location of Hesiod],
|
||||
[hesiod="$withval"], [hesiod=yes])
|
||||
if test "$hesiod" != no; then
|
||||
ATHENA_HESIOD_CHECK
|
||||
else
|
||||
AC_MSG_ERROR(This package requires Hesiod.)
|
||||
fi])
|
||||
|
||||
dnl ----- libares -----
|
||||
|
||||
AC_DEFUN(ATHENA_ARES_CHECK,
|
||||
[AC_CHECK_FUNC(res_send, :, AC_CHECK_LIB(resolv, res_send))
|
||||
if test "$ares" != yes; then
|
||||
CPPFLAGS="$CPPFLAGS -I$ares/include"
|
||||
LDFLAGS="$LDFLAGS -L$ares/lib"
|
||||
fi
|
||||
AC_CHECK_LIB(ares, ares_init, :, [AC_MSG_ERROR(libares not found)])])
|
||||
|
||||
AC_DEFUN(ATHENA_ARES,
|
||||
[AC_ARG_WITH(ares,
|
||||
[ --with-ares=PREFIX Use libares],
|
||||
[ares="$withval"], [ares=no])
|
||||
if test "$ares" != no; then
|
||||
ATHENA_ARES_CHECK
|
||||
ARES_LIBS="-lares"
|
||||
AC_DEFINE(HAVE_ARES)
|
||||
fi
|
||||
AC_SUBST(ARES_LIBS)])
|
||||
|
||||
AC_DEFUN(ATHENA_ARES_REQUIRED,
|
||||
[AC_ARG_WITH(ares,
|
||||
[ --with-ares=PREFIX Specify location of libares],
|
||||
[ares="$withval"], [ares=yes])
|
||||
if test "$ares" != no; then
|
||||
ATHENA_ARES_CHECK
|
||||
else
|
||||
AC_MSG_ERROR(This package requires libares.)
|
||||
fi])
|
||||
dnl ----- zephyr -----
|
||||
|
||||
AC_DEFUN(ATHENA_ZEPHYR_CHECK,
|
||||
[if test "$zephyr" != yes; then
|
||||
CPPFLAGS="$CPPFLAGS -I$zephyr/include"
|
||||
LDFLAGS="$LDFLAGS -L$zephyr/lib"
|
||||
fi
|
||||
AC_CHECK_LIB(zephyr, ZFreeNotice, :, [AC_MSG_ERROR(zephyr not found)])])
|
||||
|
||||
AC_DEFUN(ATHENA_ZEPHYR,
|
||||
[AC_ARG_WITH(zephyr,
|
||||
[ --with-zephyr=PREFIX Use zephyr],
|
||||
[zephyr="$withval"], [zephyr=no])
|
||||
if test "$zephyr" != no; then
|
||||
ATHENA_ZEPHYR_CHECK
|
||||
ZEPHYR_LIBS="-lzephyr"
|
||||
AC_DEFINE(HAVE_ZEPHYR)
|
||||
fi
|
||||
AC_SUBST(ZEPHYR_LIBS)])
|
||||
|
||||
AC_DEFUN(ATHENA_ZEPHYR_REQUIRED,
|
||||
[AC_ARG_WITH(zephyr,
|
||||
[ --with-zephyr=PREFIX Specify location of zephyr],
|
||||
[zephyr="$withval"], [zephyr=yes])
|
||||
if test "$zephyr" != no; then
|
||||
ATHENA_ZEPHYR_CHECK
|
||||
else
|
||||
AC_MSG_ERROR(This package requires zephyr.)
|
||||
fi])
|
||||
354
ares/adig.c
354
ares/adig.c
@@ -13,8 +13,7 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
@@ -38,7 +37,7 @@ static const char rcsid[] = "$Id$";
|
||||
#include "ares_dns.h"
|
||||
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#endif
|
||||
|
||||
/* Mac OS X portability check */
|
||||
@@ -55,58 +54,58 @@ struct nv {
|
||||
};
|
||||
|
||||
static const struct nv flags[] = {
|
||||
{ "usevc", ARES_FLAG_USEVC },
|
||||
{ "primary", ARES_FLAG_PRIMARY },
|
||||
{ "igntc", ARES_FLAG_IGNTC },
|
||||
{ "norecurse", ARES_FLAG_NORECURSE },
|
||||
{ "stayopen", ARES_FLAG_STAYOPEN },
|
||||
{ "noaliases", ARES_FLAG_NOALIASES }
|
||||
{ "usevc", ARES_FLAG_USEVC },
|
||||
{ "primary", ARES_FLAG_PRIMARY },
|
||||
{ "igntc", ARES_FLAG_IGNTC },
|
||||
{ "norecurse", ARES_FLAG_NORECURSE },
|
||||
{ "stayopen", ARES_FLAG_STAYOPEN },
|
||||
{ "noaliases", ARES_FLAG_NOALIASES }
|
||||
};
|
||||
static const int nflags = sizeof(flags) / sizeof(flags[0]);
|
||||
|
||||
static const struct nv classes[] = {
|
||||
{ "IN", C_IN },
|
||||
{ "CHAOS", C_CHAOS },
|
||||
{ "HS", C_HS },
|
||||
{ "ANY", C_ANY }
|
||||
{ "IN", C_IN },
|
||||
{ "CHAOS", C_CHAOS },
|
||||
{ "HS", C_HS },
|
||||
{ "ANY", C_ANY }
|
||||
};
|
||||
static const int nclasses = sizeof(classes) / sizeof(classes[0]);
|
||||
|
||||
static const struct nv types[] = {
|
||||
{ "A", T_A },
|
||||
{ "NS", T_NS },
|
||||
{ "MD", T_MD },
|
||||
{ "MF", T_MF },
|
||||
{ "CNAME", T_CNAME },
|
||||
{ "SOA", T_SOA },
|
||||
{ "MB", T_MB },
|
||||
{ "MG", T_MG },
|
||||
{ "MR", T_MR },
|
||||
{ "NULL", T_NULL },
|
||||
{ "WKS", T_WKS },
|
||||
{ "PTR", T_PTR },
|
||||
{ "HINFO", T_HINFO },
|
||||
{ "MINFO", T_MINFO },
|
||||
{ "MX", T_MX },
|
||||
{ "TXT", T_TXT },
|
||||
{ "RP", T_RP },
|
||||
{ "AFSDB", T_AFSDB },
|
||||
{ "X25", T_X25 },
|
||||
{ "ISDN", T_ISDN },
|
||||
{ "RT", T_RT },
|
||||
{ "NSAP", T_NSAP },
|
||||
{ "NSAP_PTR", T_NSAP_PTR },
|
||||
{ "SIG", T_SIG },
|
||||
{ "KEY", T_KEY },
|
||||
{ "PX", T_PX },
|
||||
{ "GPOS", T_GPOS },
|
||||
{ "AAAA", T_AAAA },
|
||||
{ "LOC", T_LOC },
|
||||
{ "SRV", T_SRV },
|
||||
{ "AXFR", T_AXFR },
|
||||
{ "MAILB", T_MAILB },
|
||||
{ "MAILA", T_MAILA },
|
||||
{ "ANY", T_ANY }
|
||||
{ "A", T_A },
|
||||
{ "NS", T_NS },
|
||||
{ "MD", T_MD },
|
||||
{ "MF", T_MF },
|
||||
{ "CNAME", T_CNAME },
|
||||
{ "SOA", T_SOA },
|
||||
{ "MB", T_MB },
|
||||
{ "MG", T_MG },
|
||||
{ "MR", T_MR },
|
||||
{ "NULL", T_NULL },
|
||||
{ "WKS", T_WKS },
|
||||
{ "PTR", T_PTR },
|
||||
{ "HINFO", T_HINFO },
|
||||
{ "MINFO", T_MINFO },
|
||||
{ "MX", T_MX },
|
||||
{ "TXT", T_TXT },
|
||||
{ "RP", T_RP },
|
||||
{ "AFSDB", T_AFSDB },
|
||||
{ "X25", T_X25 },
|
||||
{ "ISDN", T_ISDN },
|
||||
{ "RT", T_RT },
|
||||
{ "NSAP", T_NSAP },
|
||||
{ "NSAP_PTR", T_NSAP_PTR },
|
||||
{ "SIG", T_SIG },
|
||||
{ "KEY", T_KEY },
|
||||
{ "PX", T_PX },
|
||||
{ "GPOS", T_GPOS },
|
||||
{ "AAAA", T_AAAA },
|
||||
{ "LOC", T_LOC },
|
||||
{ "SRV", T_SRV },
|
||||
{ "AXFR", T_AXFR },
|
||||
{ "MAILB", T_MAILB },
|
||||
{ "MAILA", T_MAILA },
|
||||
{ "ANY", T_ANY }
|
||||
};
|
||||
static const int ntypes = sizeof(types) / sizeof(types[0]);
|
||||
|
||||
@@ -125,10 +124,10 @@ static const char *rcodes[] = {
|
||||
|
||||
static void callback(void *arg, int status, unsigned char *abuf, int alen);
|
||||
static const unsigned char *display_question(const unsigned char *aptr,
|
||||
const unsigned char *abuf,
|
||||
int alen);
|
||||
const unsigned char *abuf,
|
||||
int alen);
|
||||
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 *class_name(int dnsclass);
|
||||
static void usage(void);
|
||||
@@ -142,13 +141,12 @@ int main(int argc, char **argv)
|
||||
struct hostent *hostent;
|
||||
fd_set read_fds, write_fds;
|
||||
struct timeval *tvp, tv;
|
||||
char *errmem;
|
||||
|
||||
#ifdef WIN32
|
||||
WORD wVersionRequested = MAKEWORD(1,1);
|
||||
WSADATA wsaData;
|
||||
WSAStartup(wVersionRequested, &wsaData);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
options.flags = ARES_FLAG_NOCHECKRESP;
|
||||
options.servers = NULL;
|
||||
@@ -156,80 +154,80 @@ int main(int argc, char **argv)
|
||||
while ((c = getopt(argc, argv, "f:s:c:t:T:U:")) != -1)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'f':
|
||||
/* Add a flag. */
|
||||
for (i = 0; i < nflags; i++)
|
||||
{
|
||||
if (strcmp(flags[i].name, optarg) == 0)
|
||||
break;
|
||||
}
|
||||
if (i == nflags)
|
||||
usage();
|
||||
options.flags |= flags[i].value;
|
||||
break;
|
||||
{
|
||||
case 'f':
|
||||
/* Add a flag. */
|
||||
for (i = 0; i < nflags; i++)
|
||||
{
|
||||
if (strcmp(flags[i].name, optarg) == 0)
|
||||
break;
|
||||
}
|
||||
if (i == nflags)
|
||||
usage();
|
||||
options.flags |= flags[i].value;
|
||||
break;
|
||||
|
||||
case 's':
|
||||
/* Add a server, and specify servers in the option mask. */
|
||||
hostent = gethostbyname(optarg);
|
||||
if (!hostent || hostent->h_addrtype != AF_INET)
|
||||
{
|
||||
fprintf(stderr, "adig: server %s not found.\n", optarg);
|
||||
return 1;
|
||||
}
|
||||
options.servers = realloc(options.servers, (options.nservers + 1)
|
||||
* sizeof(struct in_addr));
|
||||
if (!options.servers)
|
||||
{
|
||||
fprintf(stderr, "Out of memory!\n");
|
||||
return 1;
|
||||
}
|
||||
memcpy(&options.servers[options.nservers], hostent->h_addr,
|
||||
sizeof(struct in_addr));
|
||||
options.nservers++;
|
||||
optmask |= ARES_OPT_SERVERS;
|
||||
break;
|
||||
case 's':
|
||||
/* Add a server, and specify servers in the option mask. */
|
||||
hostent = gethostbyname(optarg);
|
||||
if (!hostent || hostent->h_addrtype != AF_INET)
|
||||
{
|
||||
fprintf(stderr, "adig: server %s not found.\n", optarg);
|
||||
return 1;
|
||||
}
|
||||
options.servers = realloc(options.servers, (options.nservers + 1)
|
||||
* sizeof(struct in_addr));
|
||||
if (!options.servers)
|
||||
{
|
||||
fprintf(stderr, "Out of memory!\n");
|
||||
return 1;
|
||||
}
|
||||
memcpy(&options.servers[options.nservers], hostent->h_addr,
|
||||
sizeof(struct in_addr));
|
||||
options.nservers++;
|
||||
optmask |= ARES_OPT_SERVERS;
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
/* Set the query class. */
|
||||
for (i = 0; i < nclasses; i++)
|
||||
{
|
||||
if (strcasecmp(classes[i].name, optarg) == 0)
|
||||
break;
|
||||
}
|
||||
if (i == nclasses)
|
||||
usage();
|
||||
dnsclass = classes[i].value;
|
||||
break;
|
||||
case 'c':
|
||||
/* Set the query class. */
|
||||
for (i = 0; i < nclasses; i++)
|
||||
{
|
||||
if (strcasecmp(classes[i].name, optarg) == 0)
|
||||
break;
|
||||
}
|
||||
if (i == nclasses)
|
||||
usage();
|
||||
dnsclass = classes[i].value;
|
||||
break;
|
||||
|
||||
case 't':
|
||||
/* Set the query type. */
|
||||
for (i = 0; i < ntypes; i++)
|
||||
{
|
||||
if (strcasecmp(types[i].name, optarg) == 0)
|
||||
break;
|
||||
}
|
||||
if (i == ntypes)
|
||||
usage();
|
||||
type = types[i].value;
|
||||
break;
|
||||
case 't':
|
||||
/* Set the query type. */
|
||||
for (i = 0; i < ntypes; i++)
|
||||
{
|
||||
if (strcasecmp(types[i].name, optarg) == 0)
|
||||
break;
|
||||
}
|
||||
if (i == ntypes)
|
||||
usage();
|
||||
type = types[i].value;
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
/* Set the TCP port number. */
|
||||
if (!isdigit((unsigned char)*optarg))
|
||||
usage();
|
||||
options.tcp_port = strtol(optarg, NULL, 0);
|
||||
optmask |= ARES_OPT_TCP_PORT;
|
||||
break;
|
||||
case 'T':
|
||||
/* Set the TCP port number. */
|
||||
if (!isdigit((unsigned char)*optarg))
|
||||
usage();
|
||||
options.tcp_port = strtol(optarg, NULL, 0);
|
||||
optmask |= ARES_OPT_TCP_PORT;
|
||||
break;
|
||||
|
||||
case 'U':
|
||||
/* Set the UDP port number. */
|
||||
if (!isdigit((unsigned char)*optarg))
|
||||
usage();
|
||||
options.udp_port = strtol(optarg, NULL, 0);
|
||||
optmask |= ARES_OPT_UDP_PORT;
|
||||
break;
|
||||
}
|
||||
case 'U':
|
||||
/* Set the UDP port number. */
|
||||
if (!isdigit((unsigned char)*optarg))
|
||||
usage();
|
||||
options.udp_port = strtol(optarg, NULL, 0);
|
||||
optmask |= ARES_OPT_UDP_PORT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
@@ -241,8 +239,7 @@ int main(int argc, char **argv)
|
||||
if (status != ARES_SUCCESS)
|
||||
{
|
||||
fprintf(stderr, "ares_init_options: %s\n",
|
||||
ares_strerror(status, &errmem));
|
||||
ares_free_errmem(errmem);
|
||||
ares_strerror(status));
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -256,7 +253,7 @@ int main(int argc, char **argv)
|
||||
else
|
||||
{
|
||||
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. */
|
||||
@@ -266,14 +263,14 @@ int main(int argc, char **argv)
|
||||
FD_ZERO(&write_fds);
|
||||
nfds = ares_fds(channel, &read_fds, &write_fds);
|
||||
if (nfds == 0)
|
||||
break;
|
||||
break;
|
||||
tvp = ares_timeout(channel, NULL, &tv);
|
||||
count = select(nfds, &read_fds, &write_fds, NULL, tvp);
|
||||
if (count < 0 && errno != EINVAL)
|
||||
{
|
||||
perror("select");
|
||||
return 1;
|
||||
}
|
||||
{
|
||||
perror("select");
|
||||
return 1;
|
||||
}
|
||||
ares_process(channel, &read_fds, &write_fds);
|
||||
}
|
||||
|
||||
@@ -283,9 +280,9 @@ int main(int argc, char **argv)
|
||||
|
||||
static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
{
|
||||
char *name = (char *) arg, *errmem;
|
||||
int id, qr, opcode, aa, tc, rd, ra, rcode, i;
|
||||
unsigned int qdcount, ancount, nscount, arcount;
|
||||
char *name = (char *) arg;
|
||||
int id, qr, opcode, aa, tc, rd, ra, rcode;
|
||||
unsigned int qdcount, ancount, nscount, arcount, i;
|
||||
const unsigned char *aptr;
|
||||
|
||||
/* Display the query name if given. */
|
||||
@@ -297,10 +294,9 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
*/
|
||||
if (status != ARES_SUCCESS)
|
||||
{
|
||||
printf("%s\n", ares_strerror(status, &errmem));
|
||||
ares_free_errmem(errmem);
|
||||
printf("%s\n", ares_strerror(status));
|
||||
if (!abuf)
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Won't happen, but check anyway, for safety. */
|
||||
@@ -324,11 +320,11 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
/* Display the answer header. */
|
||||
printf("id: %d\n", id);
|
||||
printf("flags: %s%s%s%s%s\n",
|
||||
qr ? "qr " : "",
|
||||
aa ? "aa " : "",
|
||||
tc ? "tc " : "",
|
||||
rd ? "rd " : "",
|
||||
ra ? "ra " : "");
|
||||
qr ? "qr " : "",
|
||||
aa ? "aa " : "",
|
||||
tc ? "tc " : "",
|
||||
rd ? "rd " : "",
|
||||
ra ? "ra " : "");
|
||||
printf("opcode: %s\n", opcodes[opcode]);
|
||||
printf("rcode: %s\n", rcodes[rcode]);
|
||||
|
||||
@@ -339,7 +335,7 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
{
|
||||
aptr = display_question(aptr, abuf, alen);
|
||||
if (aptr == NULL)
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Display the answers. */
|
||||
@@ -348,7 +344,7 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
{
|
||||
aptr = display_rr(aptr, abuf, alen);
|
||||
if (aptr == NULL)
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Display the NS records. */
|
||||
@@ -357,7 +353,7 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
{
|
||||
aptr = display_rr(aptr, abuf, alen);
|
||||
if (aptr == NULL)
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Display the additional records. */
|
||||
@@ -366,16 +362,17 @@ static void callback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
{
|
||||
aptr = display_rr(aptr, abuf, alen);
|
||||
if (aptr == NULL)
|
||||
return;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static const unsigned char *display_question(const unsigned char *aptr,
|
||||
const unsigned char *abuf,
|
||||
int alen)
|
||||
const unsigned char *abuf,
|
||||
int alen)
|
||||
{
|
||||
char *name;
|
||||
int type, dnsclass, status, len;
|
||||
int type, dnsclass, status;
|
||||
long len;
|
||||
|
||||
/* Parse the question name. */
|
||||
status = ares_expand_name(aptr, abuf, alen, &name, &len);
|
||||
@@ -409,11 +406,12 @@ static const unsigned char *display_question(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;
|
||||
char *name;
|
||||
int type, dnsclass, ttl, dlen, status, len;
|
||||
int type, dnsclass, ttl, dlen, status;
|
||||
long len;
|
||||
struct in_addr addr;
|
||||
|
||||
/* Parse the RR name. */
|
||||
@@ -465,7 +463,7 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
||||
/* For these types, the RR data is just a domain name. */
|
||||
status = ares_expand_name(aptr, abuf, alen, &name, &len);
|
||||
if (status != ARES_SUCCESS)
|
||||
return NULL;
|
||||
return NULL;
|
||||
printf("\t%s.", name);
|
||||
free(name);
|
||||
break;
|
||||
@@ -475,12 +473,12 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
||||
p = aptr;
|
||||
len = *p;
|
||||
if (p + len + 1 > aptr + dlen)
|
||||
return NULL;
|
||||
return NULL;
|
||||
printf("\t%.*s", len, p + 1);
|
||||
p += len + 1;
|
||||
len = *p;
|
||||
if (p + len + 1 > aptr + dlen)
|
||||
return NULL;
|
||||
return NULL;
|
||||
printf("\t%.*s", len, p + 1);
|
||||
break;
|
||||
|
||||
@@ -489,13 +487,13 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
||||
p = aptr;
|
||||
status = ares_expand_name(p, abuf, alen, &name, &len);
|
||||
if (status != ARES_SUCCESS)
|
||||
return NULL;
|
||||
return NULL;
|
||||
printf("\t%s.", name);
|
||||
free(name);
|
||||
p += len;
|
||||
status = ares_expand_name(p, abuf, alen, &name, &len);
|
||||
if (status != ARES_SUCCESS)
|
||||
return NULL;
|
||||
return NULL;
|
||||
printf("\t%s.", name);
|
||||
free(name);
|
||||
break;
|
||||
@@ -505,11 +503,11 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
||||
* then a domain name.
|
||||
*/
|
||||
if (dlen < 2)
|
||||
return NULL;
|
||||
return NULL;
|
||||
printf("\t%d", (aptr[0] << 8) | aptr[1]);
|
||||
status = ares_expand_name(aptr + 2, abuf, alen, &name, &len);
|
||||
if (status != ARES_SUCCESS)
|
||||
return NULL;
|
||||
return NULL;
|
||||
printf("\t%s.", name);
|
||||
free(name);
|
||||
break;
|
||||
@@ -521,24 +519,24 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
||||
p = aptr;
|
||||
status = ares_expand_name(p, abuf, alen, &name, &len);
|
||||
if (status != ARES_SUCCESS)
|
||||
return NULL;
|
||||
return NULL;
|
||||
printf("\t%s.\n", name);
|
||||
free(name);
|
||||
p += len;
|
||||
status = ares_expand_name(p, abuf, alen, &name, &len);
|
||||
if (status != ARES_SUCCESS)
|
||||
return NULL;
|
||||
return NULL;
|
||||
printf("\t\t\t\t\t\t%s.\n", name);
|
||||
free(name);
|
||||
p += len;
|
||||
if (p + 20 > aptr + dlen)
|
||||
return NULL;
|
||||
return NULL;
|
||||
printf("\t\t\t\t\t\t( %d %d %d %d %d )",
|
||||
(p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3],
|
||||
(p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7],
|
||||
(p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11],
|
||||
(p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15],
|
||||
(p[16] << 24) | (p[17] << 16) | (p[18] << 8) | p[19]);
|
||||
(p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3],
|
||||
(p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7],
|
||||
(p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11],
|
||||
(p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15],
|
||||
(p[16] << 24) | (p[17] << 16) | (p[18] << 8) | p[19]);
|
||||
break;
|
||||
|
||||
case T_TXT:
|
||||
@@ -546,19 +544,19 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
||||
* strings. */
|
||||
p = aptr;
|
||||
while (p < aptr + dlen)
|
||||
{
|
||||
len = *p;
|
||||
if (p + len + 1 > aptr + dlen)
|
||||
return NULL;
|
||||
printf("\t%.*s", len, p + 1);
|
||||
p += len + 1;
|
||||
}
|
||||
{
|
||||
len = *p;
|
||||
if (p + len + 1 > aptr + dlen)
|
||||
return NULL;
|
||||
printf("\t%.*s", len, p + 1);
|
||||
p += len + 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case T_A:
|
||||
/* The RR data is a four-byte Internet address. */
|
||||
if (dlen != 4)
|
||||
return NULL;
|
||||
return NULL;
|
||||
memcpy(&addr, aptr, sizeof(struct in_addr));
|
||||
printf("\t%s", inet_ntoa(addr));
|
||||
break;
|
||||
@@ -571,18 +569,18 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
||||
/* The RR data is three two-byte numbers representing the
|
||||
* priority, weight, and port, followed by a domain name.
|
||||
*/
|
||||
|
||||
|
||||
printf("\t%d", DNS__16BIT(aptr));
|
||||
printf(" %d", DNS__16BIT(aptr + 2));
|
||||
printf(" %d", DNS__16BIT(aptr + 4));
|
||||
|
||||
|
||||
status = ares_expand_name(aptr + 6, abuf, alen, &name, &len);
|
||||
if (status != ARES_SUCCESS)
|
||||
return NULL;
|
||||
printf("\t%s.", name);
|
||||
free(name);
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
printf("\t[Unknown RR; cannot parse]");
|
||||
}
|
||||
@@ -598,7 +596,7 @@ static const char *type_name(int type)
|
||||
for (i = 0; i < ntypes; i++)
|
||||
{
|
||||
if (types[i].value == type)
|
||||
return types[i].name;
|
||||
return types[i].name;
|
||||
}
|
||||
return "(unknown)";
|
||||
}
|
||||
@@ -610,7 +608,7 @@ static const char *class_name(int dnsclass)
|
||||
for (i = 0; i < nclasses; i++)
|
||||
{
|
||||
if (classes[i].value == dnsclass)
|
||||
return classes[i].name;
|
||||
return classes[i].name;
|
||||
}
|
||||
return "(unknown)";
|
||||
}
|
||||
@@ -618,6 +616,6 @@ static const char *class_name(int dnsclass)
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: adig [-f flag] [-s server] [-c class] "
|
||||
"[-t type] [-p port] name ...\n");
|
||||
"[-t type] [-p port] name ...\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
30
ares/ahost.c
30
ares/ahost.c
@@ -13,8 +13,7 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
@@ -34,7 +33,7 @@ static const char rcsid[] = "$Id$";
|
||||
#include "ares_dns.h"
|
||||
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#endif
|
||||
|
||||
static void callback(void *arg, int status, struct hostent *host);
|
||||
@@ -46,23 +45,21 @@ int main(int argc, char **argv)
|
||||
int status, nfds;
|
||||
fd_set read_fds, write_fds;
|
||||
struct timeval *tvp, tv;
|
||||
char *errmem;
|
||||
struct in_addr addr;
|
||||
|
||||
#ifdef WIN32
|
||||
WORD wVersionRequested = MAKEWORD(1,1);
|
||||
WSADATA wsaData;
|
||||
WSAStartup(wVersionRequested, &wsaData);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (argc == 0)
|
||||
if (argc <= 1)
|
||||
usage();
|
||||
|
||||
status = ares_init(&channel);
|
||||
if (status != ARES_SUCCESS)
|
||||
{
|
||||
fprintf(stderr, "ares_init: %s\n", ares_strerror(status, &errmem));
|
||||
ares_free_errmem(errmem);
|
||||
fprintf(stderr, "ares_init: %s\n", ares_strerror(status));
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -71,12 +68,12 @@ int main(int argc, char **argv)
|
||||
{
|
||||
addr.s_addr = inet_addr(*argv);
|
||||
if (addr.s_addr == INADDR_NONE)
|
||||
ares_gethostbyname(channel, *argv, AF_INET, callback, *argv);
|
||||
ares_gethostbyname(channel, *argv, AF_INET, callback, *argv);
|
||||
else
|
||||
{
|
||||
ares_gethostbyaddr(channel, &addr, sizeof(addr), AF_INET, callback,
|
||||
*argv);
|
||||
}
|
||||
{
|
||||
ares_gethostbyaddr(channel, &addr, sizeof(addr), AF_INET, callback,
|
||||
*argv);
|
||||
}
|
||||
}
|
||||
|
||||
/* Wait for all queries to complete. */
|
||||
@@ -86,7 +83,7 @@ int main(int argc, char **argv)
|
||||
FD_ZERO(&write_fds);
|
||||
nfds = ares_fds(channel, &read_fds, &write_fds);
|
||||
if (nfds == 0)
|
||||
break;
|
||||
break;
|
||||
tvp = ares_timeout(channel, NULL, &tv);
|
||||
select(nfds, &read_fds, &write_fds, NULL, tvp);
|
||||
ares_process(channel, &read_fds, &write_fds);
|
||||
@@ -99,12 +96,11 @@ int main(int argc, char **argv)
|
||||
static void callback(void *arg, int status, struct hostent *host)
|
||||
{
|
||||
struct in_addr addr;
|
||||
char *mem, **p;
|
||||
char **p;
|
||||
|
||||
if (status != ARES_SUCCESS)
|
||||
{
|
||||
fprintf(stderr, "%s: %s\n", (char *) arg, ares_strerror(status, &mem));
|
||||
ares_free_errmem(mem);
|
||||
fprintf(stderr, "%s: %s\n", (char *) arg, ares_strerror(status));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
123
ares/ares.h
123
ares/ares.h
@@ -20,55 +20,66 @@
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <winsock.h>
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <netinet/in.h>
|
||||
#if defined(_AIX) || defined(NETWARE)
|
||||
/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish
|
||||
libc5-based Linux systems. Only include it on system that are known to
|
||||
require it! */
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
|
||||
#define ARES_SUCCESS 0
|
||||
#if defined(WATT32)
|
||||
#include <netinet/in.h>
|
||||
#include <tcp.h>
|
||||
#elif defined(WIN32)
|
||||
#include <winsock.h>
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
#define ARES_SUCCESS 0
|
||||
|
||||
/* Server error codes (ARES_ENODATA indicates no relevant answer) */
|
||||
#define ARES_ENODATA 1
|
||||
#define ARES_EFORMERR 2
|
||||
#define ARES_ESERVFAIL 3
|
||||
#define ARES_ENOTFOUND 4
|
||||
#define ARES_ENOTIMP 5
|
||||
#define ARES_EREFUSED 6
|
||||
#define ARES_ENODATA 1
|
||||
#define ARES_EFORMERR 2
|
||||
#define ARES_ESERVFAIL 3
|
||||
#define ARES_ENOTFOUND 4
|
||||
#define ARES_ENOTIMP 5
|
||||
#define ARES_EREFUSED 6
|
||||
|
||||
/* Locally generated error codes */
|
||||
#define ARES_EBADQUERY 7
|
||||
#define ARES_EBADNAME 8
|
||||
#define ARES_EBADFAMILY 9
|
||||
#define ARES_EBADRESP 10
|
||||
#define ARES_ECONNREFUSED 11
|
||||
#define ARES_ETIMEOUT 12
|
||||
#define ARES_EOF 13
|
||||
#define ARES_EFILE 14
|
||||
#define ARES_ENOMEM 15
|
||||
#define ARES_EDESTRUCTION 16
|
||||
#define ARES_EBADQUERY 7
|
||||
#define ARES_EBADNAME 8
|
||||
#define ARES_EBADFAMILY 9
|
||||
#define ARES_EBADRESP 10
|
||||
#define ARES_ECONNREFUSED 11
|
||||
#define ARES_ETIMEOUT 12
|
||||
#define ARES_EOF 13
|
||||
#define ARES_EFILE 14
|
||||
#define ARES_ENOMEM 15
|
||||
#define ARES_EDESTRUCTION 16
|
||||
#define ARES_EBADSTR 17
|
||||
|
||||
/* Flag values */
|
||||
#define ARES_FLAG_USEVC (1 << 0)
|
||||
#define ARES_FLAG_PRIMARY (1 << 1)
|
||||
#define ARES_FLAG_IGNTC (1 << 2)
|
||||
#define ARES_FLAG_NORECURSE (1 << 3)
|
||||
#define ARES_FLAG_STAYOPEN (1 << 4)
|
||||
#define ARES_FLAG_NOSEARCH (1 << 5)
|
||||
#define ARES_FLAG_NOALIASES (1 << 6)
|
||||
#define ARES_FLAG_NOCHECKRESP (1 << 7)
|
||||
#define ARES_FLAG_USEVC (1 << 0)
|
||||
#define ARES_FLAG_PRIMARY (1 << 1)
|
||||
#define ARES_FLAG_IGNTC (1 << 2)
|
||||
#define ARES_FLAG_NORECURSE (1 << 3)
|
||||
#define ARES_FLAG_STAYOPEN (1 << 4)
|
||||
#define ARES_FLAG_NOSEARCH (1 << 5)
|
||||
#define ARES_FLAG_NOALIASES (1 << 6)
|
||||
#define ARES_FLAG_NOCHECKRESP (1 << 7)
|
||||
|
||||
/* Option mask values */
|
||||
#define ARES_OPT_FLAGS (1 << 0)
|
||||
#define ARES_OPT_TIMEOUT (1 << 1)
|
||||
#define ARES_OPT_TRIES (1 << 2)
|
||||
#define ARES_OPT_NDOTS (1 << 3)
|
||||
#define ARES_OPT_UDP_PORT (1 << 4)
|
||||
#define ARES_OPT_TCP_PORT (1 << 5)
|
||||
#define ARES_OPT_SERVERS (1 << 6)
|
||||
#define ARES_OPT_DOMAINS (1 << 7)
|
||||
#define ARES_OPT_LOOKUPS (1 << 8)
|
||||
#define ARES_OPT_FLAGS (1 << 0)
|
||||
#define ARES_OPT_TIMEOUT (1 << 1)
|
||||
#define ARES_OPT_TRIES (1 << 2)
|
||||
#define ARES_OPT_NDOTS (1 << 3)
|
||||
#define ARES_OPT_UDP_PORT (1 << 4)
|
||||
#define ARES_OPT_TCP_PORT (1 << 5)
|
||||
#define ARES_OPT_SERVERS (1 << 6)
|
||||
#define ARES_OPT_DOMAINS (1 << 7)
|
||||
#define ARES_OPT_LOOKUPS (1 << 8)
|
||||
|
||||
struct ares_options {
|
||||
int flags;
|
||||
@@ -89,42 +100,44 @@ struct timeval;
|
||||
struct ares_channeldata;
|
||||
typedef struct ares_channeldata *ares_channel;
|
||||
typedef void (*ares_callback)(void *arg, int status, unsigned char *abuf,
|
||||
int alen);
|
||||
int alen);
|
||||
typedef void (*ares_host_callback)(void *arg, int status,
|
||||
struct hostent *hostent);
|
||||
struct hostent *hostent);
|
||||
|
||||
int ares_init(ares_channel *channelptr);
|
||||
int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
int optmask);
|
||||
int optmask);
|
||||
void ares_destroy(ares_channel channel);
|
||||
|
||||
void ares_cancel(ares_channel channel);
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
ares_host_callback callback, void *arg);
|
||||
ares_host_callback callback, void *arg);
|
||||
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);
|
||||
|
||||
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 *tv);
|
||||
struct timeval *tv);
|
||||
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 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 alen, char **s, int *enclen);
|
||||
int alen, char **s, long *enclen);
|
||||
int ares_expand_string(const unsigned char *encoded, const unsigned char *abuf,
|
||||
int alen, unsigned char **s, long *enclen);
|
||||
int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
struct hostent **host);
|
||||
struct hostent **host);
|
||||
int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
||||
int addrlen, int family, struct hostent **host);
|
||||
void ares_free_string(char *str);
|
||||
int addrlen, int family, struct hostent **host);
|
||||
void ares_free_string(void *str);
|
||||
void ares_free_hostent(struct hostent *host);
|
||||
const char *ares_strerror(int code, char **memptr);
|
||||
const char *ares_strerror(int code);
|
||||
void ares_free_errmem(char *mem);
|
||||
|
||||
#endif /* ARES__H */
|
||||
|
||||
@@ -13,13 +13,13 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
#include "setup.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#ifdef WIN32
|
||||
#else
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
@@ -44,14 +44,14 @@ void ares__close_sockets(struct server_state *server)
|
||||
server->tcp_lenbuf_pos = 0;
|
||||
|
||||
/* Close the TCP and UDP sockets. */
|
||||
if (server->tcp_socket != -1)
|
||||
if (server->tcp_socket != ARES_SOCKET_BAD)
|
||||
{
|
||||
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);
|
||||
server->udp_socket = -1;
|
||||
server->udp_socket = ARES_SOCKET_BAD;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,13 +13,10 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#else
|
||||
#if !defined(WIN32) || defined(WATT32)
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
@@ -45,96 +42,96 @@ int ares__get_hostent(FILE *fp, struct hostent **host)
|
||||
{
|
||||
/* Skip comment lines; terminate line at comment character. */
|
||||
if (*line == '#' || !*line)
|
||||
continue;
|
||||
continue;
|
||||
p = strchr(line, '#');
|
||||
if (p)
|
||||
*p = 0;
|
||||
*p = 0;
|
||||
|
||||
/* Get the address part. */
|
||||
p = line;
|
||||
while (*p && !isspace((unsigned char)*p))
|
||||
p++;
|
||||
p++;
|
||||
if (!*p)
|
||||
continue;
|
||||
continue;
|
||||
*p = 0;
|
||||
addr.s_addr = inet_addr(line);
|
||||
if (addr.s_addr == INADDR_NONE)
|
||||
continue;
|
||||
continue;
|
||||
|
||||
/* Get the canonical hostname. */
|
||||
p++;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
p++;
|
||||
if (!*p)
|
||||
continue;
|
||||
continue;
|
||||
q = p;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
q++;
|
||||
end_at_hostname = (*q == 0);
|
||||
*q = 0;
|
||||
canonical = p;
|
||||
|
||||
naliases = 0;
|
||||
if (!end_at_hostname)
|
||||
{
|
||||
/* Count the aliases. */
|
||||
p = q + 1;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
while (*p)
|
||||
{
|
||||
while (*p && !isspace((unsigned char)*p))
|
||||
p++;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
naliases++;
|
||||
}
|
||||
}
|
||||
{
|
||||
/* Count the aliases. */
|
||||
p = q + 1;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
while (*p)
|
||||
{
|
||||
while (*p && !isspace((unsigned char)*p))
|
||||
p++;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
naliases++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate memory for the host structure. */
|
||||
hostent = malloc(sizeof(struct hostent));
|
||||
if (!hostent)
|
||||
break;
|
||||
break;
|
||||
hostent->h_aliases = NULL;
|
||||
hostent->h_addr_list = NULL;
|
||||
hostent->h_name = strdup(canonical);
|
||||
if (!hostent->h_name)
|
||||
break;
|
||||
break;
|
||||
hostent->h_addr_list = malloc(2 * sizeof(char *));
|
||||
if (!hostent->h_addr_list)
|
||||
break;
|
||||
break;
|
||||
hostent->h_addr_list[0] = malloc(sizeof(struct in_addr));
|
||||
if (!hostent->h_addr_list[0])
|
||||
break;
|
||||
break;
|
||||
hostent->h_aliases = malloc((naliases + 1) * sizeof(char *));
|
||||
if (!hostent->h_aliases)
|
||||
break;
|
||||
break;
|
||||
|
||||
/* Copy in aliases. */
|
||||
naliases = 0;
|
||||
if (!end_at_hostname)
|
||||
{
|
||||
p = canonical + strlen(canonical) + 1;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
while (*p)
|
||||
{
|
||||
q = p;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
hostent->h_aliases[naliases] = malloc(q - p + 1);
|
||||
if (hostent->h_aliases[naliases] == NULL)
|
||||
break;
|
||||
memcpy(hostent->h_aliases[naliases], p, q - p);
|
||||
hostent->h_aliases[naliases][q - p] = 0;
|
||||
p = q;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
naliases++;
|
||||
}
|
||||
if (*p)
|
||||
break;
|
||||
}
|
||||
{
|
||||
p = canonical + strlen(canonical) + 1;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
while (*p)
|
||||
{
|
||||
q = p;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
hostent->h_aliases[naliases] = malloc(q - p + 1);
|
||||
if (hostent->h_aliases[naliases] == NULL)
|
||||
break;
|
||||
memcpy(hostent->h_aliases[naliases], p, q - p);
|
||||
hostent->h_aliases[naliases][q - p] = 0;
|
||||
p = q;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
naliases++;
|
||||
}
|
||||
if (*p)
|
||||
break;
|
||||
}
|
||||
hostent->h_aliases[naliases] = NULL;
|
||||
|
||||
hostent->h_addrtype = AF_INET;
|
||||
@@ -145,25 +142,29 @@ int ares__get_hostent(FILE *fp, struct hostent **host)
|
||||
free(line);
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
free(line);
|
||||
if(line)
|
||||
free(line);
|
||||
|
||||
if (status == ARES_SUCCESS)
|
||||
{
|
||||
/* Memory allocation failure; clean up. */
|
||||
if (hostent)
|
||||
{
|
||||
free((char *) hostent->h_name);
|
||||
if (hostent->h_aliases)
|
||||
{
|
||||
for (alias = hostent->h_aliases; *alias; alias++)
|
||||
free(*alias);
|
||||
}
|
||||
free(hostent->h_aliases);
|
||||
if (hostent->h_addr_list)
|
||||
free(hostent->h_addr_list[0]);
|
||||
free(hostent->h_addr_list);
|
||||
}
|
||||
free(hostent);
|
||||
{
|
||||
if(hostent->h_name)
|
||||
free((char *) hostent->h_name);
|
||||
if (hostent->h_aliases)
|
||||
{
|
||||
for (alias = hostent->h_aliases; *alias; alias++)
|
||||
free(*alias);
|
||||
}
|
||||
if(hostent->h_aliases)
|
||||
free(hostent->h_aliases);
|
||||
if (hostent->h_addr_list && hostent->h_addr_list[0])
|
||||
free(hostent->h_addr_list[0]);
|
||||
if(hostent->h_addr_list)
|
||||
free(hostent->h_addr_list);
|
||||
free(hostent);
|
||||
}
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,8 +13,7 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -32,32 +31,33 @@ static const char rcsid[] = "$Id$";
|
||||
int ares__read_line(FILE *fp, char **buf, int *bufsize)
|
||||
{
|
||||
char *newbuf;
|
||||
int offset = 0, len;
|
||||
size_t offset = 0;
|
||||
size_t len;
|
||||
|
||||
if (*buf == NULL)
|
||||
{
|
||||
*buf = malloc(128);
|
||||
if (!*buf)
|
||||
return ARES_ENOMEM;
|
||||
return ARES_ENOMEM;
|
||||
*bufsize = 128;
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (!fgets(*buf + offset, *bufsize - offset, fp))
|
||||
return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF;
|
||||
if (!fgets(*buf + offset, *bufsize - (int)offset, fp))
|
||||
return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF;
|
||||
len = offset + strlen(*buf + offset);
|
||||
if ((*buf)[len - 1] == '\n')
|
||||
{
|
||||
(*buf)[len - 1] = 0;
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
{
|
||||
(*buf)[len - 1] = 0;
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
offset = len;
|
||||
|
||||
/* Allocate more space. */
|
||||
newbuf = realloc(*buf, *bufsize * 2);
|
||||
if (!newbuf)
|
||||
return ARES_ENOMEM;
|
||||
return ARES_ENOMEM;
|
||||
*buf = newbuf;
|
||||
*bufsize *= 2;
|
||||
}
|
||||
|
||||
@@ -14,29 +14,24 @@
|
||||
.\" this software for any purpose. It is provided "as is"
|
||||
.\" without express or implied warranty.
|
||||
.\"
|
||||
.TH ARES_FREE_ERRMEM 3 "23 July 1998"
|
||||
.TH ARES_CANCEL 3 "31 March 2004"
|
||||
.SH NAME
|
||||
ares_free_errmem \- Free memory allocated by ares_strerror
|
||||
ares_cancel \- Cancel a resolve
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B void ares_free_errmem(char *\fIerrmem\fP)
|
||||
.B int ares_cancel(ares_channel \fIchannel\fP)
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_free_errmem
|
||||
function frees any memory which might have been allocated by the
|
||||
.BR ares_strerror (3)
|
||||
function. The parameter
|
||||
.I errmem
|
||||
should be set to the variable pointed to by the
|
||||
.I memptr
|
||||
argument previously passed to
|
||||
.IR ares_strerror .
|
||||
The \fBares_cancel\fP function cancels all lookups/requests made on the the
|
||||
name service channel identified by \fIchannel\fP. \fBares_cancel\fP invokes
|
||||
the callbacks for each pending query on the channel, passing a status of
|
||||
.BR ARES_ETIMEOUT .
|
||||
These calls give the callbacks a chance to clean up any state which
|
||||
might have been stored in their arguments.
|
||||
.SH SEE ALSO
|
||||
.BR ares_strerror (3)
|
||||
.BR ares_init (3)
|
||||
.BR ares_destroy (3)
|
||||
.SH AUTHOR
|
||||
Greg Hudson, MIT Information Systems
|
||||
.br
|
||||
Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
Dirk Manske
|
||||
43
ares/ares_cancel.c
Normal file
43
ares/ares_cancel.c
Normal file
@@ -0,0 +1,43 @@
|
||||
/* Copyright (C) 2004 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.
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <stdlib.h>
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
/*
|
||||
* ares_cancel() cancels a ongoing request/resolve that might be going on on
|
||||
* the given channel. It does NOT kill the channel, use ares_destroy() for
|
||||
* that.
|
||||
*/
|
||||
void ares_cancel(ares_channel channel)
|
||||
{
|
||||
struct query *query, *next;
|
||||
int i;
|
||||
|
||||
for (query = channel->queries; query; query = next)
|
||||
{
|
||||
next = query->next;
|
||||
query->callback(query->arg, ARES_ETIMEOUT, NULL, 0);
|
||||
free(query->tcpbuf);
|
||||
free(query->skip_server);
|
||||
free(query);
|
||||
}
|
||||
channel->queries = NULL;
|
||||
if (!(channel->flags & ARES_FLAG_STAYOPEN))
|
||||
{
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
ares__close_sockets(&channel->servers[i]);
|
||||
}
|
||||
}
|
||||
@@ -36,7 +36,8 @@ status of
|
||||
These calls give the callbacks a chance to clean up any state which
|
||||
might have been stored in their arguments.
|
||||
.SH SEE ALSO
|
||||
.BR ares_init (3)
|
||||
.BR ares_init (3),
|
||||
.BR ares_cancel (3)
|
||||
.SH AUTHOR
|
||||
Greg Hudson, MIT Information Systems
|
||||
.br
|
||||
|
||||
@@ -13,8 +13,7 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <stdlib.h>
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
@@ -30,7 +29,8 @@ void ares_destroy(ares_channel channel)
|
||||
for (i = 0; i < channel->ndomains; i++)
|
||||
free(channel->domains[i]);
|
||||
free(channel->domains);
|
||||
free(channel->sortlist);
|
||||
if(channel->sortlist)
|
||||
free(channel->sortlist);
|
||||
free(channel->lookups);
|
||||
while (channel->queries)
|
||||
{
|
||||
|
||||
@@ -18,64 +18,64 @@
|
||||
#ifndef ARES__DNS_H
|
||||
#define ARES__DNS_H
|
||||
|
||||
#define DNS__16BIT(p) (((p)[0] << 8) | (p)[1])
|
||||
#define DNS__32BIT(p) (((p)[0] << 24) | ((p)[1] << 16) | \
|
||||
((p)[2] << 8) | (p)[3])
|
||||
#define DNS__SET16BIT(p, v) (((p)[0] = ((v) >> 8) & 0xff), \
|
||||
((p)[1] = (v) & 0xff))
|
||||
#define DNS__SET32BIT(p, v) (((p)[0] = ((v) >> 24) & 0xff), \
|
||||
((p)[1] = ((v) >> 16) & 0xff), \
|
||||
((p)[2] = ((v) >> 8) & 0xff), \
|
||||
((p)[3] = (v) & 0xff))
|
||||
#define DNS__16BIT(p) (((p)[0] << 8) | (p)[1])
|
||||
#define DNS__32BIT(p) (((p)[0] << 24) | ((p)[1] << 16) | \
|
||||
((p)[2] << 8) | (p)[3])
|
||||
#define DNS__SET16BIT(p, v) (((p)[0] = ((v) >> 8) & 0xff), \
|
||||
((p)[1] = (v) & 0xff))
|
||||
#define DNS__SET32BIT(p, v) (((p)[0] = ((v) >> 24) & 0xff), \
|
||||
((p)[1] = ((v) >> 16) & 0xff), \
|
||||
((p)[2] = ((v) >> 8) & 0xff), \
|
||||
((p)[3] = (v) & 0xff))
|
||||
|
||||
/* Macros for parsing a DNS header */
|
||||
#define DNS_HEADER_QID(h) DNS__16BIT(h)
|
||||
#define DNS_HEADER_QR(h) (((h)[2] >> 7) & 0x1)
|
||||
#define DNS_HEADER_OPCODE(h) (((h)[2] >> 3) & 0xf)
|
||||
#define DNS_HEADER_AA(h) (((h)[2] >> 2) & 0x1)
|
||||
#define DNS_HEADER_TC(h) (((h)[2] >> 1) & 0x1)
|
||||
#define DNS_HEADER_RD(h) ((h)[2] & 0x1)
|
||||
#define DNS_HEADER_RA(h) (((h)[3] >> 7) & 0x1)
|
||||
#define DNS_HEADER_Z(h) (((h)[3] >> 4) & 0x7)
|
||||
#define DNS_HEADER_RCODE(h) ((h)[3] & 0xf)
|
||||
#define DNS_HEADER_QDCOUNT(h) DNS__16BIT((h) + 4)
|
||||
#define DNS_HEADER_ANCOUNT(h) DNS__16BIT((h) + 6)
|
||||
#define DNS_HEADER_NSCOUNT(h) DNS__16BIT((h) + 8)
|
||||
#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10)
|
||||
#define DNS_HEADER_QID(h) DNS__16BIT(h)
|
||||
#define DNS_HEADER_QR(h) (((h)[2] >> 7) & 0x1)
|
||||
#define DNS_HEADER_OPCODE(h) (((h)[2] >> 3) & 0xf)
|
||||
#define DNS_HEADER_AA(h) (((h)[2] >> 2) & 0x1)
|
||||
#define DNS_HEADER_TC(h) (((h)[2] >> 1) & 0x1)
|
||||
#define DNS_HEADER_RD(h) ((h)[2] & 0x1)
|
||||
#define DNS_HEADER_RA(h) (((h)[3] >> 7) & 0x1)
|
||||
#define DNS_HEADER_Z(h) (((h)[3] >> 4) & 0x7)
|
||||
#define DNS_HEADER_RCODE(h) ((h)[3] & 0xf)
|
||||
#define DNS_HEADER_QDCOUNT(h) DNS__16BIT((h) + 4)
|
||||
#define DNS_HEADER_ANCOUNT(h) DNS__16BIT((h) + 6)
|
||||
#define DNS_HEADER_NSCOUNT(h) DNS__16BIT((h) + 8)
|
||||
#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10)
|
||||
|
||||
/* Macros for constructing a DNS header */
|
||||
#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_OPCODE(h, v) ((h)[2] |= (((v) & 0xf) << 3))
|
||||
#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_RD(h, v) ((h)[2] |= (((v) & 0x1)))
|
||||
#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_RCODE(h, v) ((h)[3] |= (((v) & 0xf)))
|
||||
#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_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v)
|
||||
#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, 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_OPCODE(h, v) ((h)[2] |= (((v) & 0xf) << 3))
|
||||
#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_RD(h, v) ((h)[2] |= (((v) & 0x1)))
|
||||
#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_RCODE(h, v) ((h)[3] |= (((v) & 0xf)))
|
||||
#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_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v)
|
||||
#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v)
|
||||
|
||||
/* Macros for parsing the fixed part of a DNS question */
|
||||
#define DNS_QUESTION_TYPE(q) DNS__16BIT(q)
|
||||
#define DNS_QUESTION_CLASS(q) DNS__16BIT((q) + 2)
|
||||
#define DNS_QUESTION_TYPE(q) DNS__16BIT(q)
|
||||
#define DNS_QUESTION_CLASS(q) DNS__16BIT((q) + 2)
|
||||
|
||||
/* 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_CLASS(q, v) DNS__SET16BIT((q) + 2, v)
|
||||
#define DNS_QUESTION_SET_TYPE(q, v) DNS__SET16BIT(q, v)
|
||||
#define DNS_QUESTION_SET_CLASS(q, v) DNS__SET16BIT((q) + 2, v)
|
||||
|
||||
/* Macros for parsing the fixed part of a DNS resource record */
|
||||
#define DNS_RR_TYPE(r) DNS__16BIT(r)
|
||||
#define DNS_RR_CLASS(r) DNS__16BIT((r) + 2)
|
||||
#define DNS_RR_TTL(r) DNS__32BIT((r) + 4)
|
||||
#define DNS_RR_LEN(r) DNS__16BIT((r) + 8)
|
||||
#define DNS_RR_TYPE(r) DNS__16BIT(r)
|
||||
#define DNS_RR_CLASS(r) DNS__16BIT((r) + 2)
|
||||
#define DNS_RR_TTL(r) DNS__32BIT((r) + 4)
|
||||
#define DNS_RR_LEN(r) DNS__16BIT((r) + 8)
|
||||
|
||||
/* 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_CLASS(r) DNS__SET16BIT((r) + 2, 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_TYPE(r) DNS__SET16BIT(r, 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_LEN(r) DNS__SET16BIT((r) + 8, v)
|
||||
|
||||
#endif /* ARES__DNS_H */
|
||||
|
||||
@@ -22,8 +22,7 @@ ares_expand_name \- Expand a DNS-encoded domain name
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B int ares_expand_name(const unsigned char *\fIencoded\fP,
|
||||
.B
|
||||
const unsigned char *\fIabuf\fP, int \fIalen\fP, char **\fIs\fP,
|
||||
.B const unsigned char *\fIabuf\fP, int \fIalen\fP, char **\fIs\fP,
|
||||
.B int *\fIenclen\fP)
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
|
||||
@@ -13,11 +13,10 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#include <netinet/in.h>
|
||||
@@ -26,9 +25,10 @@ static const char rcsid[] = "$Id$";
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "ares.h"
|
||||
#include "ares_private.h" /* for the memdebug */
|
||||
|
||||
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
|
||||
* containing message is given by abuf and alen. The result given by
|
||||
@@ -55,7 +55,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 alen, char **s, int *enclen)
|
||||
int alen, char **s, long *enclen)
|
||||
{
|
||||
int len, indir = 0;
|
||||
char *q;
|
||||
@@ -75,27 +75,27 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
||||
while (*p)
|
||||
{
|
||||
if ((*p & INDIR_MASK) == INDIR_MASK)
|
||||
{
|
||||
if (!indir)
|
||||
{
|
||||
*enclen = p + 2 - encoded;
|
||||
indir = 1;
|
||||
}
|
||||
p = abuf + ((*p & ~INDIR_MASK) << 8 | *(p + 1));
|
||||
}
|
||||
{
|
||||
if (!indir)
|
||||
{
|
||||
*enclen = p + 2 - encoded;
|
||||
indir = 1;
|
||||
}
|
||||
p = abuf + ((*p & ~INDIR_MASK) << 8 | *(p + 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
len = *p;
|
||||
p++;
|
||||
while (len--)
|
||||
{
|
||||
if (*p == '.' || *p == '\\')
|
||||
*q++ = '\\';
|
||||
*q++ = *p;
|
||||
p++;
|
||||
}
|
||||
*q++ = '.';
|
||||
}
|
||||
{
|
||||
len = *p;
|
||||
p++;
|
||||
while (len--)
|
||||
{
|
||||
if (*p == '.' || *p == '\\')
|
||||
*q++ = '\\';
|
||||
*q++ = *p;
|
||||
p++;
|
||||
}
|
||||
*q++ = '.';
|
||||
}
|
||||
}
|
||||
if (!indir)
|
||||
*enclen = p + 1 - encoded;
|
||||
@@ -111,7 +111,7 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
||||
* -1 if the encoding is invalid.
|
||||
*/
|
||||
static int name_length(const unsigned char *encoded, const unsigned char *abuf,
|
||||
int alen)
|
||||
int alen)
|
||||
{
|
||||
int n = 0, offset, indir = 0;
|
||||
|
||||
@@ -122,34 +122,34 @@ static int name_length(const unsigned char *encoded, const unsigned char *abuf,
|
||||
while (*encoded)
|
||||
{
|
||||
if ((*encoded & INDIR_MASK) == INDIR_MASK)
|
||||
{
|
||||
/* Check the offset and go there. */
|
||||
if (encoded + 1 >= abuf + alen)
|
||||
return -1;
|
||||
offset = (*encoded & ~INDIR_MASK) << 8 | *(encoded + 1);
|
||||
if (offset >= alen)
|
||||
return -1;
|
||||
encoded = abuf + offset;
|
||||
{
|
||||
/* Check the offset and go there. */
|
||||
if (encoded + 1 >= abuf + alen)
|
||||
return -1;
|
||||
offset = (*encoded & ~INDIR_MASK) << 8 | *(encoded + 1);
|
||||
if (offset >= alen)
|
||||
return -1;
|
||||
encoded = abuf + offset;
|
||||
|
||||
/* If we've seen more indirects than the message length,
|
||||
* then there's a loop.
|
||||
*/
|
||||
if (++indir > alen)
|
||||
return -1;
|
||||
}
|
||||
/* If we've seen more indirects than the message length,
|
||||
* then there's a loop.
|
||||
*/
|
||||
if (++indir > alen)
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
offset = *encoded;
|
||||
if (encoded + offset + 1 >= abuf + alen)
|
||||
return -1;
|
||||
encoded++;
|
||||
while (offset--)
|
||||
{
|
||||
n += (*encoded == '.' || *encoded == '\\') ? 2 : 1;
|
||||
encoded++;
|
||||
}
|
||||
n++;
|
||||
}
|
||||
{
|
||||
offset = *encoded;
|
||||
if (encoded + offset + 1 >= abuf + alen)
|
||||
return -1;
|
||||
encoded++;
|
||||
while (offset--)
|
||||
{
|
||||
n += (*encoded == '.' || *encoded == '\\') ? 2 : 1;
|
||||
encoded++;
|
||||
}
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
||||
/* If there were any labels at all, then the number of dots is one
|
||||
|
||||
62
ares/ares_expand_string.3
Normal file
62
ares/ares_expand_string.3
Normal file
@@ -0,0 +1,62 @@
|
||||
.\" $Id$
|
||||
.\"
|
||||
.\" Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
.\"
|
||||
.\" 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_EXPAND_NAME 3 "23 July 1998"
|
||||
.SH NAME
|
||||
ares_expand_string \- Expand a length encoded string
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B int ares_expand_string(const unsigned char *\fIencoded\fP,
|
||||
.B const unsigned char *\fIabuf\fP, int \fIalen\fP, unsigned char **\fIs\fP,
|
||||
.B int *\fIenclen\fP)
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_expand_string
|
||||
function converts a length encoded string to a NULL terminated C
|
||||
string. The argument
|
||||
.I encoded
|
||||
gives the beginning of the encoded string, and the arguments
|
||||
.I abuf
|
||||
and
|
||||
.I alen
|
||||
give the containing message buffer (necessary for the processing of
|
||||
indirection pointers within the encoded domain name). The result is
|
||||
placed in a NUL-terminated allocated buffer, a pointer to which is
|
||||
stored in the variable pointed to by
|
||||
.IR s .
|
||||
The length of the encoded string is stored in the variable pointed to by
|
||||
.I enclen
|
||||
so that the caller can advance past the encoded string to read
|
||||
further data in the message.
|
||||
.SH RETURN VALUES
|
||||
.B ares_expand_string
|
||||
can return any of the following values:
|
||||
.TP 15
|
||||
.B ARES_SUCCESS
|
||||
Expansion of the encoded string succeeded.
|
||||
.TP 15
|
||||
.B ARES_EBADSTR
|
||||
The encoded string was malformed and could not be expanded.
|
||||
.TP 15
|
||||
.B ARES_ENOMEM
|
||||
Memory was exhausted.
|
||||
.SH SEE ALSO
|
||||
.BR ares_free_string (3)
|
||||
.SH AUTHOR
|
||||
Dominick Meglio
|
||||
66
ares/ares_expand_string.c
Normal file
66
ares/ares_expand_string.c
Normal file
@@ -0,0 +1,66 @@
|
||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
*
|
||||
* 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 <netinet/in.h>
|
||||
#include <arpa/nameser.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "ares.h"
|
||||
#include "ares_private.h" /* for the memdebug */
|
||||
|
||||
/* Simply decodes a length-encoded character string. The first byte of the
|
||||
* input is the length of the string to be returned and the bytes thereafter
|
||||
* are the characters of the string. The returned result will be NULL
|
||||
* terminated.
|
||||
*/
|
||||
int ares_expand_string(const unsigned char *encoded,
|
||||
const unsigned char *abuf,
|
||||
int alen,
|
||||
unsigned char **s,
|
||||
long *enclen)
|
||||
{
|
||||
unsigned char *q;
|
||||
long len;
|
||||
if (encoded == abuf+alen)
|
||||
return ARES_EBADSTR;
|
||||
|
||||
len = *encoded;
|
||||
if (encoded+len+1 > abuf+alen)
|
||||
return ARES_EBADSTR;
|
||||
|
||||
encoded++;
|
||||
|
||||
*s = malloc(len+1);
|
||||
if (*s == NULL)
|
||||
return ARES_ENOMEM;
|
||||
q = *s;
|
||||
strncpy((char *)q, (char *)encoded, len);
|
||||
q[len] = '\0';
|
||||
|
||||
*s = q;
|
||||
|
||||
*enclen = len+1;
|
||||
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -13,13 +13,10 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#else
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
@@ -39,20 +36,20 @@ int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
{
|
||||
server = &channel->servers[i];
|
||||
if (server->udp_socket != -1)
|
||||
{
|
||||
FD_SET(server->udp_socket, read_fds);
|
||||
if (server->udp_socket >= nfds)
|
||||
nfds = server->udp_socket + 1;
|
||||
}
|
||||
if (server->tcp_socket != -1)
|
||||
{
|
||||
FD_SET(server->tcp_socket, read_fds);
|
||||
if (server->qhead)
|
||||
FD_SET(server->tcp_socket, write_fds);
|
||||
if (server->tcp_socket >= nfds)
|
||||
nfds = server->tcp_socket + 1;
|
||||
}
|
||||
if (server->udp_socket != ARES_SOCKET_BAD)
|
||||
{
|
||||
FD_SET(server->udp_socket, read_fds);
|
||||
if (server->udp_socket >= nfds)
|
||||
nfds = server->udp_socket + 1;
|
||||
}
|
||||
if (server->tcp_socket != ARES_SOCKET_BAD)
|
||||
{
|
||||
FD_SET(server->tcp_socket, read_fds);
|
||||
if (server->qhead)
|
||||
FD_SET(server->tcp_socket, write_fds);
|
||||
if (server->tcp_socket >= nfds)
|
||||
nfds = server->tcp_socket + 1;
|
||||
}
|
||||
}
|
||||
return nfds;
|
||||
}
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "ares.h"
|
||||
|
||||
/* Do nothing, for now. A future implementation may want to deal with
|
||||
* internationalization, in which case ares_strerror() might allocate
|
||||
* memory which we would then have to free.
|
||||
*/
|
||||
void ares_free_errmem(char *mem)
|
||||
{
|
||||
}
|
||||
@@ -28,21 +28,16 @@ The
|
||||
.I ares_free_hostent
|
||||
function frees a
|
||||
.B struct hostent
|
||||
allocated by one of the functions
|
||||
.I ares_parse_a_reply
|
||||
or
|
||||
.IR ares_parse_ptr_reply .
|
||||
allocated by one of the functions \fIares_parse_a_reply(3)\fP or
|
||||
\fIares_parse_ptr_reply(3)\fP.
|
||||
.SH NOTES
|
||||
It is not necessary (and is not correct) to free the host structure passed to
|
||||
the callback functions for \fIares_gethostbyname(3)\fP or
|
||||
\fIares_gethostbyaddr(3)\fP. The ares library will automatically free such
|
||||
host structures when the callback returns.
|
||||
.SH SEE ALSO
|
||||
.BR ares_parse_a_reply (3),
|
||||
.BR ares_parse_ptr_reply (3)
|
||||
.SH NOTES
|
||||
It is not necessary (and is not correct) to free the host structure
|
||||
passed to the callback functions for
|
||||
.I ares_gethostbyname
|
||||
or
|
||||
.IR ares_gethostbyaddr .
|
||||
The ares library will automatically free such host structures when the
|
||||
callback returns.
|
||||
.SH AUTHOR
|
||||
Greg Hudson, MIT Information Systems
|
||||
.br
|
||||
|
||||
@@ -13,17 +13,15 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#else
|
||||
#if !defined(WIN32) || defined(WATT32)
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
|
||||
#include "ares.h"
|
||||
#include "ares_private.h" /* for memdebug */
|
||||
|
||||
void ares_free_hostent(struct hostent *host)
|
||||
{
|
||||
|
||||
@@ -14,23 +14,22 @@
|
||||
.\" this software for any purpose. It is provided "as is"
|
||||
.\" without express or implied warranty.
|
||||
.\"
|
||||
.TH ARES_FREE_STRING 3 "4 January 2000"
|
||||
.TH ARES_FREE_STRING 3 "4 February 2004"
|
||||
.SH NAME
|
||||
ares_free_string \- Free strings allocated by ares functions
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B void ares_free_string(char *\fIstr\fP)
|
||||
.B void ares_free_string(void *\fIstr\fP)
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.I ares_free_string
|
||||
function frees a string allocated by the
|
||||
.I ares_mkquery
|
||||
function.
|
||||
function frees a string allocated by an ares function.
|
||||
.SH SEE ALSO
|
||||
.BR ares_mkquery (3)
|
||||
.BR ares_expand_string (3)
|
||||
.SH AUTHOR
|
||||
Greg Hudson, MIT Information Systems
|
||||
.br
|
||||
|
||||
@@ -13,12 +13,11 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <stdlib.h>
|
||||
#include "ares.h"
|
||||
|
||||
void ares_free_string(char *str)
|
||||
void ares_free_string(void *str)
|
||||
{
|
||||
free(str);
|
||||
}
|
||||
|
||||
@@ -40,14 +40,10 @@ and
|
||||
.I addrlen
|
||||
give the address as a series of bytes, and
|
||||
.I family
|
||||
gives the type of address. When the query is complete or has failed,
|
||||
the ares library will invoke
|
||||
.IR callback .
|
||||
Completion or failure of the query may happen immediately, or may
|
||||
happen during a later call to
|
||||
.BR ares_process (3)
|
||||
or
|
||||
.BR ares_destroy (3).
|
||||
gives the type of address. 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
|
||||
@@ -93,7 +89,8 @@ did not complete successfully,
|
||||
will be
|
||||
.BR NULL .
|
||||
.SH SEE ALSO
|
||||
.BR ares_process (3)
|
||||
.BR ares_process (3),
|
||||
.BR ares_gethostbyname (3)
|
||||
.SH AUTHOR
|
||||
Greg Hudson, MIT Information Systems
|
||||
.br
|
||||
|
||||
@@ -13,11 +13,10 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
@@ -29,9 +28,14 @@ static const char rcsid[] = "$Id$";
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#ifdef WATT32
|
||||
#undef WIN32
|
||||
#endif
|
||||
|
||||
struct addr_query {
|
||||
/* Arguments passed to ares_gethostbyaddr() */
|
||||
ares_channel channel;
|
||||
@@ -44,13 +48,13 @@ struct addr_query {
|
||||
|
||||
static void next_lookup(struct addr_query *aquery);
|
||||
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,
|
||||
struct hostent *host);
|
||||
struct hostent *host);
|
||||
static int file_lookup(struct in_addr *addr, struct hostent **host);
|
||||
|
||||
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;
|
||||
|
||||
@@ -86,27 +90,27 @@ static void next_lookup(struct addr_query *aquery)
|
||||
for (p = aquery->remaining_lookups; *p; p++)
|
||||
{
|
||||
switch (*p)
|
||||
{
|
||||
case 'b':
|
||||
addr = ntohl(aquery->addr.s_addr);
|
||||
a1 = addr >> 24;
|
||||
a2 = (addr >> 16) & 0xff;
|
||||
a3 = (addr >> 8) & 0xff;
|
||||
a4 = addr & 0xff;
|
||||
sprintf(name, "%d.%d.%d.%d.in-addr.arpa", a4, a3, a2, a1);
|
||||
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, &host);
|
||||
if (status != ARES_ENOTFOUND)
|
||||
{
|
||||
end_aquery(aquery, status, host);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
{
|
||||
case 'b':
|
||||
addr = ntohl(aquery->addr.s_addr);
|
||||
a1 = (int)((addr >> 24) & 0xff);
|
||||
a2 = (int)((addr >> 16) & 0xff);
|
||||
a3 = (int)((addr >> 8) & 0xff);
|
||||
a4 = (int)(addr & 0xff);
|
||||
sprintf(name, "%d.%d.%d.%d.in-addr.arpa", a4, a3, a2, a1);
|
||||
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, &host);
|
||||
if (status != ARES_ENOTFOUND)
|
||||
{
|
||||
end_aquery(aquery, status, host);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
end_aquery(aquery, ARES_ENOTFOUND, NULL);
|
||||
}
|
||||
@@ -119,7 +123,7 @@ static void addr_callback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
if (status == ARES_SUCCESS)
|
||||
{
|
||||
status = ares_parse_ptr_reply(abuf, alen, &aquery->addr,
|
||||
sizeof(struct in_addr), AF_INET, &host);
|
||||
sizeof(struct in_addr), AF_INET, &host);
|
||||
end_aquery(aquery, status, host);
|
||||
}
|
||||
else if (status == ARES_EDESTRUCTION)
|
||||
@@ -129,7 +133,7 @@ static void addr_callback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
}
|
||||
|
||||
static void end_aquery(struct addr_query *aquery, int status,
|
||||
struct hostent *host)
|
||||
struct hostent *host)
|
||||
{
|
||||
aquery->callback(aquery->arg, status, host);
|
||||
if (host)
|
||||
@@ -146,13 +150,30 @@ static int file_lookup(struct in_addr *addr, struct hostent **host)
|
||||
|
||||
char PATH_HOSTS[MAX_PATH];
|
||||
if (IsNT) {
|
||||
GetSystemDirectory(PATH_HOSTS, MAX_PATH);
|
||||
strcat(PATH_HOSTS, PATH_HOSTS_NT);
|
||||
} else {
|
||||
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
||||
strcat(PATH_HOSTS, PATH_HOSTS_9X);
|
||||
}
|
||||
char tmp[MAX_PATH];
|
||||
HKEY hkeyHosts;
|
||||
|
||||
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts)
|
||||
== ERROR_SUCCESS)
|
||||
{
|
||||
DWORD dwLength = MAX_PATH;
|
||||
RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, 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
|
||||
|
||||
fp = fopen(PATH_HOSTS, "r");
|
||||
@@ -162,7 +183,7 @@ static int file_lookup(struct in_addr *addr, struct hostent **host)
|
||||
while ((status = ares__get_hostent(fp, host)) == ARES_SUCCESS)
|
||||
{
|
||||
if (memcmp((*host)->h_addr, addr, sizeof(struct in_addr)) == 0)
|
||||
break;
|
||||
break;
|
||||
ares_free_hostent(*host);
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
@@ -37,14 +37,11 @@ The parameter
|
||||
.I name
|
||||
gives the hostname as a NUL-terminated C string, and
|
||||
.I family
|
||||
gives the desired type of address for the resulting host entry. When
|
||||
the query is complete or has failed, the ares library will invoke
|
||||
.IR callback .
|
||||
Completion or failure of the query may happen immediately, or may
|
||||
happen during a later call to
|
||||
.BR ares_process (3)
|
||||
or
|
||||
.BR ares_destroy (3).
|
||||
gives the desired type of address for the resulting host entry. 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
|
||||
@@ -96,7 +93,8 @@ did not complete successfully,
|
||||
will be
|
||||
.BR NULL .
|
||||
.SH SEE ALSO
|
||||
.BR ares_process (3)
|
||||
.BR ares_process (3),
|
||||
.BR ares_gethostbyaddr (3)
|
||||
.SH AUTHOR
|
||||
Greg Hudson, MIT Information Systems
|
||||
.br
|
||||
|
||||
@@ -13,11 +13,10 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
@@ -31,9 +30,14 @@ static const char rcsid[] = "$Id$";
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#ifdef WATT32
|
||||
#undef WIN32
|
||||
#endif
|
||||
|
||||
struct host_query {
|
||||
/* Arguments passed to ares_gethostbyname() */
|
||||
ares_channel channel;
|
||||
@@ -46,19 +50,19 @@ struct host_query {
|
||||
|
||||
static void next_lookup(struct host_query *hquery);
|
||||
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,
|
||||
struct hostent *host);
|
||||
struct hostent *host);
|
||||
static int fake_hostent(const char *name, ares_host_callback callback,
|
||||
void *arg);
|
||||
void *arg);
|
||||
static int file_lookup(const char *name, struct hostent **host);
|
||||
static void sort_addresses(struct hostent *host, struct apattern *sortlist,
|
||||
int nsort);
|
||||
int nsort);
|
||||
static int get_address_index(struct in_addr *addr, struct apattern *sortlist,
|
||||
int nsort);
|
||||
int nsort);
|
||||
|
||||
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;
|
||||
|
||||
@@ -102,26 +106,26 @@ static void next_lookup(struct host_query *hquery)
|
||||
struct hostent *host;
|
||||
|
||||
for (p = hquery->remaining_lookups; *p; p++)
|
||||
{
|
||||
{
|
||||
switch (*p)
|
||||
{
|
||||
case 'b':
|
||||
/* DNS lookup */
|
||||
hquery->remaining_lookups = p + 1;
|
||||
ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
|
||||
hquery);
|
||||
return;
|
||||
{
|
||||
case 'b':
|
||||
/* DNS lookup */
|
||||
hquery->remaining_lookups = p + 1;
|
||||
ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
|
||||
hquery);
|
||||
return;
|
||||
|
||||
case 'f':
|
||||
/* Host file lookup */
|
||||
status = file_lookup(hquery->name, &host);
|
||||
if (status != ARES_ENOTFOUND)
|
||||
{
|
||||
end_hquery(hquery, status, host);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'f':
|
||||
/* Host file lookup */
|
||||
status = file_lookup(hquery->name, &host);
|
||||
if (status != ARES_ENOTFOUND)
|
||||
{
|
||||
end_hquery(hquery, status, host);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
end_hquery(hquery, ARES_ENOTFOUND, NULL);
|
||||
}
|
||||
@@ -136,7 +140,7 @@ static void host_callback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
{
|
||||
status = ares_parse_a_reply(abuf, alen, &host);
|
||||
if (host && channel->nsort)
|
||||
sort_addresses(host, channel->sortlist, channel->nsort);
|
||||
sort_addresses(host, channel->sortlist, channel->nsort);
|
||||
end_hquery(hquery, status, host);
|
||||
}
|
||||
else if (status == ARES_EDESTRUCTION)
|
||||
@@ -146,7 +150,7 @@ static void host_callback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
}
|
||||
|
||||
static void end_hquery(struct host_query *hquery, int status,
|
||||
struct hostent *host)
|
||||
struct hostent *host)
|
||||
{
|
||||
hquery->callback(hquery->arg, status, host);
|
||||
if (host)
|
||||
@@ -159,7 +163,7 @@ static void end_hquery(struct host_query *hquery, int status,
|
||||
* query immediately, and return true. Otherwise return false.
|
||||
*/
|
||||
static int fake_hostent(const char *name, ares_host_callback callback,
|
||||
void *arg)
|
||||
void *arg)
|
||||
{
|
||||
struct in_addr addr;
|
||||
struct hostent hostent;
|
||||
@@ -171,7 +175,7 @@ static int fake_hostent(const char *name, ares_host_callback callback,
|
||||
for (p = name; *p; p++)
|
||||
{
|
||||
if (!isdigit((unsigned char)*p) && *p != '.')
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* It also only looks like an IP address if it's non-zero-length and
|
||||
@@ -216,16 +220,32 @@ static int file_lookup(const char *name, struct hostent **host)
|
||||
int status;
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
char PATH_HOSTS[MAX_PATH];
|
||||
if (IsNT) {
|
||||
GetSystemDirectory(PATH_HOSTS, MAX_PATH);
|
||||
strcat(PATH_HOSTS, PATH_HOSTS_NT);
|
||||
} else {
|
||||
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
||||
strcat(PATH_HOSTS, PATH_HOSTS_9X);
|
||||
}
|
||||
char tmp[MAX_PATH];
|
||||
HKEY hkeyHosts;
|
||||
|
||||
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts)
|
||||
== ERROR_SUCCESS)
|
||||
{
|
||||
DWORD dwLength = MAX_PATH;
|
||||
RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, 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
|
||||
|
||||
fp = fopen(PATH_HOSTS, "r");
|
||||
@@ -235,14 +255,14 @@ static int file_lookup(const char *name, struct hostent **host)
|
||||
while ((status = ares__get_hostent(fp, host)) == ARES_SUCCESS)
|
||||
{
|
||||
if (strcasecmp((*host)->h_name, name) == 0)
|
||||
break;
|
||||
break;
|
||||
for (alias = (*host)->h_aliases; *alias; alias++)
|
||||
{
|
||||
if (strcasecmp(*alias, name) == 0)
|
||||
break;
|
||||
}
|
||||
{
|
||||
if (strcasecmp(*alias, name) == 0)
|
||||
break;
|
||||
}
|
||||
if (*alias)
|
||||
break;
|
||||
break;
|
||||
ares_free_hostent(*host);
|
||||
}
|
||||
fclose(fp);
|
||||
@@ -254,7 +274,7 @@ static int file_lookup(const char *name, struct hostent **host)
|
||||
}
|
||||
|
||||
static void sort_addresses(struct hostent *host, struct apattern *sortlist,
|
||||
int nsort)
|
||||
int nsort)
|
||||
{
|
||||
struct in_addr a1, a2;
|
||||
int i1, i2, ind1, ind2;
|
||||
@@ -269,13 +289,13 @@ static void sort_addresses(struct hostent *host, struct apattern *sortlist,
|
||||
memcpy(&a1, host->h_addr_list[i1], sizeof(struct in_addr));
|
||||
ind1 = get_address_index(&a1, sortlist, nsort);
|
||||
for (i2 = i1 - 1; i2 >= 0; i2--)
|
||||
{
|
||||
memcpy(&a2, host->h_addr_list[i2], sizeof(struct in_addr));
|
||||
ind2 = get_address_index(&a2, sortlist, nsort);
|
||||
if (ind2 <= ind1)
|
||||
break;
|
||||
memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in_addr));
|
||||
}
|
||||
{
|
||||
memcpy(&a2, host->h_addr_list[i2], sizeof(struct in_addr));
|
||||
ind2 = get_address_index(&a2, sortlist, nsort);
|
||||
if (ind2 <= ind1)
|
||||
break;
|
||||
memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in_addr));
|
||||
}
|
||||
memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in_addr));
|
||||
}
|
||||
}
|
||||
@@ -284,14 +304,14 @@ static void sort_addresses(struct hostent *host, struct apattern *sortlist,
|
||||
* if none of them match.
|
||||
*/
|
||||
static int get_address_index(struct in_addr *addr, struct apattern *sortlist,
|
||||
int nsort)
|
||||
int nsort)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nsort; i++)
|
||||
{
|
||||
if ((addr->s_addr & sortlist[i].mask.s_addr) == sortlist[i].addr.s_addr)
|
||||
break;
|
||||
break;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
702
ares/ares_init.c
702
ares/ares_init.c
@@ -13,21 +13,28 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#include <iphlpapi.h>
|
||||
#include <malloc.h>
|
||||
|
||||
#else
|
||||
#include <sys/param.h>
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <arpa/nameser.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -38,20 +45,25 @@ static const char rcsid[] = "$Id$";
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#ifdef WATT32
|
||||
#undef WIN32 /* Redefined in MingW/MSVC headers */
|
||||
#endif
|
||||
|
||||
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_resolv_conf(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_lookup(ares_channel channel, const char *str,
|
||||
const char *bindch, const char *filech);
|
||||
static int config_nameserver(struct server_state **servers, int *nservers,
|
||||
const char *str);
|
||||
char *str);
|
||||
static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
const char *str);
|
||||
const char *str);
|
||||
static int set_search(ares_channel channel, const char *str);
|
||||
static int set_options(ares_channel channel, const char *str);
|
||||
static char *try_config(char *s, char *opt);
|
||||
static char *try_config(char *s, const char *opt);
|
||||
static const char *try_option(const char *p, const char *q, const char *opt);
|
||||
static int ip_addr(const char *s, int len, struct in_addr *addr);
|
||||
static void natural_mask(struct apattern *pat);
|
||||
@@ -62,7 +74,7 @@ int ares_init(ares_channel *channelptr)
|
||||
}
|
||||
|
||||
int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
int optmask)
|
||||
int optmask)
|
||||
{
|
||||
ares_channel channel;
|
||||
int i, status;
|
||||
@@ -87,6 +99,8 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
channel->nsort = -1;
|
||||
channel->lookups = NULL;
|
||||
channel->queries = NULL;
|
||||
channel->domains = NULL;
|
||||
channel->sortlist = NULL;
|
||||
|
||||
/* Initialize configuration by each of the four sources, from highest
|
||||
* precedence to lowest.
|
||||
@@ -102,16 +116,17 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
{
|
||||
/* Something failed; clean up memory we may have allocated. */
|
||||
if (channel->nservers != -1)
|
||||
free(channel->servers);
|
||||
if (channel->ndomains != -1)
|
||||
{
|
||||
for (i = 0; i < channel->ndomains; i++)
|
||||
free(channel->domains[i]);
|
||||
free(channel->domains);
|
||||
}
|
||||
if (channel->nsort != -1)
|
||||
free(channel->sortlist);
|
||||
free(channel->lookups);
|
||||
free(channel->servers);
|
||||
if (channel->domains)
|
||||
{
|
||||
for (i = 0; i < channel->ndomains; i++)
|
||||
free(channel->domains[i]);
|
||||
free(channel->domains);
|
||||
}
|
||||
if (channel->sortlist)
|
||||
free(channel->sortlist);
|
||||
if(channel->lookups)
|
||||
free(channel->lookups);
|
||||
free(channel);
|
||||
return status;
|
||||
}
|
||||
@@ -124,8 +139,8 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
{
|
||||
server = &channel->servers[i];
|
||||
server->udp_socket = -1;
|
||||
server->tcp_socket = -1;
|
||||
server->udp_socket = ARES_SOCKET_BAD;
|
||||
server->tcp_socket = ARES_SOCKET_BAD;
|
||||
server->tcp_lenbuf_pos = 0;
|
||||
server->tcp_buffer = NULL;
|
||||
server->qhead = NULL;
|
||||
@@ -138,7 +153,8 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
* field, so there's not much to be done about that.
|
||||
*/
|
||||
gettimeofday(&tv, NULL);
|
||||
channel->next_id = (tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff;
|
||||
channel->next_id = (unsigned short)
|
||||
(tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff;
|
||||
|
||||
channel->queries = NULL;
|
||||
|
||||
@@ -147,7 +163,7 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
}
|
||||
|
||||
static int init_by_options(ares_channel channel, struct ares_options *options,
|
||||
int optmask)
|
||||
int optmask)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -169,11 +185,11 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
||||
if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1)
|
||||
{
|
||||
channel->servers =
|
||||
malloc(options->nservers * sizeof(struct server_state));
|
||||
malloc(options->nservers * sizeof(struct server_state));
|
||||
if (!channel->servers && options->nservers != 0)
|
||||
return ARES_ENOMEM;
|
||||
return ARES_ENOMEM;
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -184,14 +200,14 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
||||
{
|
||||
channel->domains = malloc(options->ndomains * sizeof(char *));
|
||||
if (!channel->domains && options->ndomains != 0)
|
||||
return ARES_ENOMEM;
|
||||
return ARES_ENOMEM;
|
||||
for (i = 0; i < options->ndomains; i++)
|
||||
{
|
||||
channel->ndomains = i;
|
||||
channel->domains[i] = strdup(options->domains[i]);
|
||||
if (!channel->domains[i])
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
{
|
||||
channel->ndomains = i;
|
||||
channel->domains[i] = strdup(options->domains[i]);
|
||||
if (!channel->domains[i])
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
channel->ndomains = options->ndomains;
|
||||
}
|
||||
|
||||
@@ -200,7 +216,7 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
||||
{
|
||||
channel->lookups = strdup(options->lookups);
|
||||
if (!channel->lookups)
|
||||
return ARES_ENOMEM;
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
|
||||
return ARES_SUCCESS;
|
||||
@@ -216,7 +232,7 @@ static int init_by_environment(ares_channel channel)
|
||||
{
|
||||
status = set_search(channel, localdomain);
|
||||
if (status != ARES_SUCCESS)
|
||||
return status;
|
||||
return status;
|
||||
}
|
||||
|
||||
res_options = getenv("RES_OPTIONS");
|
||||
@@ -224,90 +240,166 @@ static int init_by_environment(ares_channel channel)
|
||||
{
|
||||
status = set_options(channel, res_options);
|
||||
if (status != ARES_SUCCESS)
|
||||
return status;
|
||||
return status;
|
||||
}
|
||||
|
||||
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
|
||||
*/
|
||||
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 */
|
||||
int size = 0;
|
||||
int result;
|
||||
result = RegQueryValueEx(hKey, subkey, 0, NULL, NULL, &size);
|
||||
if ((result != ERROR_SUCCESS && result != ERROR_MORE_DATA) || !size)
|
||||
return 0;
|
||||
*obuf = malloc(size+1);
|
||||
/* Test for the size we need */
|
||||
DWORD size = 0;
|
||||
int result;
|
||||
|
||||
if (RegQueryValueEx(hKey, subkey, 0, NULL, *obuf, &size) != ERROR_SUCCESS)
|
||||
{
|
||||
free(*obuf);
|
||||
return 0;
|
||||
}
|
||||
if (size == 1)
|
||||
{
|
||||
free(*obuf);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
result = RegQueryValueEx(hKey, subkey, 0, NULL, NULL, &size);
|
||||
if ((result != ERROR_SUCCESS && result != ERROR_MORE_DATA) || !size)
|
||||
return 0;
|
||||
*obuf = malloc(size+1);
|
||||
if (!*obuf)
|
||||
return 0;
|
||||
|
||||
if (RegQueryValueEx(hKey, subkey, 0, NULL, *obuf, &size) != ERROR_SUCCESS)
|
||||
{
|
||||
free(*obuf);
|
||||
return 0;
|
||||
}
|
||||
if (size == 1)
|
||||
{
|
||||
free(*obuf);
|
||||
return 0;
|
||||
}
|
||||
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 */
|
||||
int enum_size = 39;
|
||||
int idx = 0;
|
||||
HKEY hVal;
|
||||
while (RegEnumKeyEx(hKey, idx++, enumbuf, &enum_size, 0, NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS)
|
||||
{
|
||||
enum_size = 39;
|
||||
if (RegOpenKeyEx(hKey, enumbuf, 0, KEY_QUERY_VALUE, &hVal) != ERROR_SUCCESS)
|
||||
continue;
|
||||
if (!get_res_nt(hVal, subkey, obuf))
|
||||
RegCloseKey(hVal);
|
||||
else
|
||||
{
|
||||
RegCloseKey(hVal);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
char enumbuf[39]; /* GUIDs are 38 chars + 1 for NULL */
|
||||
DWORD enum_size = 39;
|
||||
int idx = 0;
|
||||
HKEY hVal;
|
||||
|
||||
while (RegEnumKeyEx(hKey, idx++, enumbuf, &enum_size, 0,
|
||||
NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS)
|
||||
{
|
||||
int rc;
|
||||
|
||||
enum_size = 39;
|
||||
if (RegOpenKeyEx(hKey, enumbuf, 0, KEY_QUERY_VALUE, &hVal) !=
|
||||
ERROR_SUCCESS)
|
||||
continue;
|
||||
rc = get_res_nt(hVal, subkey, obuf);
|
||||
RegCloseKey(hVal);
|
||||
if (rc)
|
||||
return 1;
|
||||
}
|
||||
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);
|
||||
DWORD (WINAPI *GetNetworkParams) (FIXED_INFO*, DWORD*); /* 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;
|
||||
|
||||
if (!fi)
|
||||
return (0);
|
||||
|
||||
handle = LoadLibrary ("iphlpapi.dll");
|
||||
if (!handle)
|
||||
return (0);
|
||||
|
||||
(void*)GetNetworkParams = GetProcAddress (handle, "GetNetworkParams");
|
||||
if (!GetNetworkParams)
|
||||
goto quit;
|
||||
|
||||
if ((*GetNetworkParams) (fi, &size) != ERROR_BUFFER_OVERFLOW)
|
||||
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
|
||||
|
||||
static int init_by_resolv_conf(ares_channel channel)
|
||||
{
|
||||
FILE *fp;
|
||||
char *line = NULL, *p;
|
||||
int linesize, status, nservers = 0, nsort = 0;
|
||||
char *line = NULL;
|
||||
int status, nservers = 0, nsort = 0;
|
||||
struct server_state *servers = NULL;
|
||||
struct apattern *sortlist = NULL;
|
||||
|
||||
#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:
|
||||
|
||||
On Windows 9X, the DNS server can be found in:
|
||||
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
|
||||
or
|
||||
or
|
||||
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DhcpNameServer
|
||||
or
|
||||
or
|
||||
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\{AdapterID}\
|
||||
NameServer
|
||||
or
|
||||
or
|
||||
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\{AdapterID}\
|
||||
DhcpNameServer
|
||||
*/
|
||||
@@ -317,80 +409,84 @@ DhcpNameServer
|
||||
DWORD data_type;
|
||||
DWORD bytes;
|
||||
DWORD result;
|
||||
DWORD index;
|
||||
char name[MAX_PATH];
|
||||
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 (IsNT)
|
||||
{
|
||||
if (RegOpenKeyEx(
|
||||
HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,
|
||||
KEY_READ, &mykey
|
||||
) == ERROR_SUCCESS)
|
||||
{
|
||||
RegOpenKeyEx(mykey, "Interfaces", 0, KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS, &subkey);
|
||||
if (get_res_nt(mykey, NAMESERVER, &line))
|
||||
{
|
||||
status = config_nameserver(&servers, &nservers, line);
|
||||
free(line);
|
||||
}
|
||||
else if (get_res_nt(mykey, DHCPNAMESERVER, &line))
|
||||
{
|
||||
status = config_nameserver(&servers, &nservers, line);
|
||||
free(line);
|
||||
}
|
||||
/* Try the interfaces */
|
||||
else if (get_res_interfaces_nt(subkey, NAMESERVER, &line))
|
||||
{
|
||||
status = config_nameserver(&servers, &nservers, line);
|
||||
free(line);
|
||||
}
|
||||
else if (get_res_interfaces_nt(subkey, DHCPNAMESERVER, &line))
|
||||
{
|
||||
status = config_nameserver(&servers, &nservers, line);
|
||||
free(line);
|
||||
}
|
||||
RegCloseKey(subkey);
|
||||
RegCloseKey(mykey);
|
||||
}
|
||||
} else {
|
||||
if (RegOpenKeyEx(
|
||||
HKEY_LOCAL_MACHINE, WIN_NS_9X, 0,
|
||||
KEY_READ, &mykey
|
||||
HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,
|
||||
KEY_READ, &mykey
|
||||
) == ERROR_SUCCESS)
|
||||
{
|
||||
RegOpenKeyEx(mykey, "Interfaces", 0,
|
||||
KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS, &subkey);
|
||||
if (get_res_nt(mykey, NAMESERVER, &line))
|
||||
{
|
||||
if ((result = RegQueryValueEx(
|
||||
mykey, NAMESERVER, NULL, &data_type,
|
||||
NULL, &bytes
|
||||
)
|
||||
) == ERROR_SUCCESS ||
|
||||
result == ERROR_MORE_DATA)
|
||||
{
|
||||
if (bytes) {
|
||||
line = (char *)malloc(bytes+1);
|
||||
if (RegQueryValueEx(
|
||||
mykey, NAMESERVER, NULL, &data_type,
|
||||
(unsigned char *)line, &bytes
|
||||
) == ERROR_SUCCESS) {
|
||||
status = config_nameserver(&servers, &nservers, line);
|
||||
}
|
||||
free(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
RegCloseKey(mykey);
|
||||
}
|
||||
|
||||
if (status != ARES_EFILE) {
|
||||
/*
|
||||
if (!channel->lookups) {
|
||||
status = config_lookup(channel, "file bind");
|
||||
status = config_nameserver(&servers, &nservers, line);
|
||||
free(line);
|
||||
}
|
||||
*/
|
||||
status = ARES_EOF;
|
||||
else if (get_res_nt(mykey, DHCPNAMESERVER, &line))
|
||||
{
|
||||
status = config_nameserver(&servers, &nservers, line);
|
||||
free(line);
|
||||
}
|
||||
/* Try the interfaces */
|
||||
else if (get_res_interfaces_nt(subkey, NAMESERVER, &line))
|
||||
{
|
||||
status = config_nameserver(&servers, &nservers, line);
|
||||
free(line);
|
||||
}
|
||||
else if (get_res_interfaces_nt(subkey, DHCPNAMESERVER, &line))
|
||||
{
|
||||
status = config_nameserver(&servers, &nservers, line);
|
||||
free(line);
|
||||
}
|
||||
RegCloseKey(subkey);
|
||||
RegCloseKey(mykey);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (RegOpenKeyEx(
|
||||
HKEY_LOCAL_MACHINE, WIN_NS_9X, 0,
|
||||
KEY_READ, &mykey
|
||||
) == ERROR_SUCCESS)
|
||||
{
|
||||
if ((result = RegQueryValueEx(
|
||||
mykey, NAMESERVER, NULL, &data_type,
|
||||
NULL, &bytes
|
||||
)
|
||||
) == ERROR_SUCCESS ||
|
||||
result == ERROR_MORE_DATA)
|
||||
{
|
||||
if (bytes)
|
||||
{
|
||||
line = (char *)malloc(bytes+1);
|
||||
if (RegQueryValueEx(mykey, NAMESERVER, NULL, &data_type,
|
||||
(unsigned char *)line, &bytes) ==
|
||||
ERROR_SUCCESS)
|
||||
{
|
||||
status = config_nameserver(&servers, &nservers, line);
|
||||
}
|
||||
free(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
RegCloseKey(mykey);
|
||||
}
|
||||
|
||||
if (status == ARES_SUCCESS)
|
||||
status = ARES_EOF;
|
||||
|
||||
#elif defined(riscos)
|
||||
|
||||
@@ -398,7 +494,7 @@ DhcpNameServer
|
||||
system variable Inet$Resolvers, space separated. */
|
||||
|
||||
line = getenv("Inet$Resolvers");
|
||||
status = ARES_EFILE;
|
||||
status = ARES_EOF;
|
||||
if (line) {
|
||||
char *resolvers = strdup(line), *pos, *space;
|
||||
|
||||
@@ -422,44 +518,113 @@ DhcpNameServer
|
||||
free(resolvers);
|
||||
}
|
||||
|
||||
#else
|
||||
#elif defined(WATT32)
|
||||
int i;
|
||||
|
||||
fp = fopen(PATH_RESOLV_CONF, "r");
|
||||
if (!fp)
|
||||
return (errno == ENOENT) ? ARES_SUCCESS : ARES_EFILE;
|
||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||
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
|
||||
{
|
||||
char *p;
|
||||
FILE *fp;
|
||||
int linesize;
|
||||
|
||||
fp = fopen(PATH_RESOLV_CONF, "r");
|
||||
if (!fp)
|
||||
return (errno == ENOENT) ? ARES_SUCCESS : ARES_EFILE;
|
||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||
{
|
||||
if ((p = try_config(line, "domain")) && channel->ndomains == -1)
|
||||
status = config_domain(channel, p);
|
||||
if ((p = try_config(line, "domain")))
|
||||
status = config_domain(channel, p);
|
||||
else if ((p = try_config(line, "lookup")) && !channel->lookups)
|
||||
status = config_lookup(channel, p);
|
||||
else if ((p = try_config(line, "search")) && channel->ndomains == -1)
|
||||
status = set_search(channel, p);
|
||||
status = config_lookup(channel, p, "bind", "file");
|
||||
else if ((p = try_config(line, "search")))
|
||||
status = set_search(channel, p);
|
||||
else if ((p = try_config(line, "nameserver")) && channel->nservers == -1)
|
||||
status = config_nameserver(&servers, &nservers, p);
|
||||
status = config_nameserver(&servers, &nservers, p);
|
||||
else if ((p = try_config(line, "sortlist")) && channel->nsort == -1)
|
||||
status = config_sortlist(&sortlist, &nsort, p);
|
||||
status = config_sortlist(&sortlist, &nsort, p);
|
||||
else if ((p = try_config(line, "options")))
|
||||
status = set_options(channel, p);
|
||||
status = set_options(channel, p);
|
||||
else
|
||||
status = ARES_SUCCESS;
|
||||
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
|
||||
|
||||
/* Handle errors. */
|
||||
if (status != ARES_EOF)
|
||||
{
|
||||
if (servers != NULL) free(servers);
|
||||
if (sortlist != NULL) free(sortlist);
|
||||
if (servers != NULL)
|
||||
free(servers);
|
||||
if (sortlist != NULL)
|
||||
free(sortlist);
|
||||
return status;
|
||||
}
|
||||
|
||||
/* If we got any name server entries, fill them in. */
|
||||
#ifdef WIN32
|
||||
okay:
|
||||
#endif
|
||||
if (servers)
|
||||
{
|
||||
channel->servers = servers;
|
||||
@@ -498,7 +663,7 @@ static int init_by_defaults(ares_channel channel)
|
||||
/* If nobody specified servers, try a local named. */
|
||||
channel->servers = malloc(sizeof(struct server_state));
|
||||
if (!channel->servers)
|
||||
return ARES_ENOMEM;
|
||||
return ARES_ENOMEM;
|
||||
channel->servers[0].addr.s_addr = htonl(INADDR_LOOPBACK);
|
||||
channel->nservers = 1;
|
||||
}
|
||||
@@ -509,22 +674,22 @@ static int init_by_defaults(ares_channel channel)
|
||||
* or set it to empty if the hostname isn't helpful.
|
||||
*/
|
||||
if (gethostname(hostname, sizeof(hostname)) == -1
|
||||
|| !strchr(hostname, '.'))
|
||||
{
|
||||
channel->domains = malloc(0);
|
||||
channel->ndomains = 0;
|
||||
}
|
||||
|| !strchr(hostname, '.'))
|
||||
{
|
||||
channel->domains = malloc(0);
|
||||
channel->ndomains = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
channel->domains = malloc(sizeof(char *));
|
||||
if (!channel->domains)
|
||||
return ARES_ENOMEM;
|
||||
channel->ndomains = 0;
|
||||
channel->domains[0] = strdup(strchr(hostname, '.') + 1);
|
||||
if (!channel->domains[0])
|
||||
return ARES_ENOMEM;
|
||||
channel->ndomains = 1;
|
||||
}
|
||||
{
|
||||
channel->domains = malloc(sizeof(char *));
|
||||
if (!channel->domains)
|
||||
return ARES_ENOMEM;
|
||||
channel->ndomains = 0;
|
||||
channel->domains[0] = strdup(strchr(hostname, '.') + 1);
|
||||
if (!channel->domains[0])
|
||||
return ARES_ENOMEM;
|
||||
channel->ndomains = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (channel->nsort == -1)
|
||||
@@ -535,9 +700,9 @@ static int init_by_defaults(ares_channel channel)
|
||||
|
||||
if (!channel->lookups)
|
||||
{
|
||||
channel->lookups = strdup("bf");
|
||||
channel->lookups = strdup("fb");
|
||||
if (!channel->lookups)
|
||||
return ARES_ENOMEM;
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
|
||||
return ARES_SUCCESS;
|
||||
@@ -555,7 +720,8 @@ static int config_domain(ares_channel channel, char *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;
|
||||
const char *p;
|
||||
@@ -568,12 +734,14 @@ static int config_lookup(ares_channel channel, const char *str)
|
||||
p = str;
|
||||
while (*p)
|
||||
{
|
||||
if ((*p == 'b' || *p == 'f') && l < lookups + 2)
|
||||
*l++ = *p;
|
||||
while (*p && !isspace((unsigned char)*p))
|
||||
p++;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
if ((*p == *bindch || *p == *filech) && l < lookups + 2) {
|
||||
if (*p == *bindch) *l++ = 'b';
|
||||
else *l++ = 'f';
|
||||
}
|
||||
while (*p && !isspace((unsigned char)*p) && (*p != ','))
|
||||
p++;
|
||||
while (*p && (isspace((unsigned char)*p) || (*p == ',')))
|
||||
p++;
|
||||
}
|
||||
*l = 0;
|
||||
channel->lookups = strdup(lookups);
|
||||
@@ -581,11 +749,52 @@ static int config_lookup(ares_channel channel, const char *str)
|
||||
}
|
||||
|
||||
static int config_nameserver(struct server_state **servers, int *nservers,
|
||||
const char *str)
|
||||
char *str)
|
||||
{
|
||||
struct in_addr addr;
|
||||
struct server_state *newserv;
|
||||
/* On Windows, there may be more than one nameserver specified in the same
|
||||
* registry key, so we parse it as a space or comma seperated list.
|
||||
*/
|
||||
#ifdef WIN32
|
||||
char *p = str;
|
||||
char *begin = str;
|
||||
int more = 1;
|
||||
while (more)
|
||||
{
|
||||
more = 0;
|
||||
while (*p && !isspace(*p) && *p != ',')
|
||||
p++;
|
||||
|
||||
if (*p)
|
||||
{
|
||||
*p = 0;
|
||||
more = 1;
|
||||
}
|
||||
|
||||
/* Skip multiple spaces or trailing spaces */
|
||||
if (!*begin)
|
||||
{
|
||||
begin = ++p;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* This is the part that actually sets the nameserver */
|
||||
addr.s_addr = inet_addr(begin);
|
||||
if (addr.s_addr == INADDR_NONE)
|
||||
continue;
|
||||
newserv = realloc(*servers, (*nservers + 1) * sizeof(struct server_state));
|
||||
if (!newserv)
|
||||
return ARES_ENOMEM;
|
||||
newserv[*nservers].addr = addr;
|
||||
*servers = newserv;
|
||||
(*nservers)++;
|
||||
|
||||
if (!more)
|
||||
break;
|
||||
begin = ++p;
|
||||
}
|
||||
#else
|
||||
/* Add a nameserver entry, if this is a valid address. */
|
||||
addr.s_addr = inet_addr(str);
|
||||
if (addr.s_addr == INADDR_NONE)
|
||||
@@ -596,11 +805,12 @@ static int config_nameserver(struct server_state **servers, int *nservers,
|
||||
newserv[*nservers].addr = addr;
|
||||
*servers = newserv;
|
||||
(*nservers)++;
|
||||
#endif
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
|
||||
static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
const char *str)
|
||||
const char *str)
|
||||
{
|
||||
struct apattern pat, *newsort;
|
||||
const char *q;
|
||||
@@ -610,37 +820,37 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
{
|
||||
q = str;
|
||||
while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
if (ip_addr(str, q - str, &pat.addr) == 0)
|
||||
{
|
||||
/* We have a pattern address; now determine the mask. */
|
||||
if (*q == '/')
|
||||
{
|
||||
str = q + 1;
|
||||
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
if (ip_addr(str, q - str, &pat.mask) != 0)
|
||||
natural_mask(&pat);
|
||||
}
|
||||
else
|
||||
natural_mask(&pat);
|
||||
q++;
|
||||
if (ip_addr(str, (int)(q - str), &pat.addr) == 0)
|
||||
{
|
||||
/* We have a pattern address; now determine the mask. */
|
||||
if (*q == '/')
|
||||
{
|
||||
str = q + 1;
|
||||
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
if (ip_addr(str, (int)(q - str), &pat.mask) != 0)
|
||||
natural_mask(&pat);
|
||||
}
|
||||
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)++;
|
||||
}
|
||||
/* 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
|
||||
{
|
||||
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
}
|
||||
{
|
||||
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
}
|
||||
str = q;
|
||||
while (isspace((unsigned char)*str))
|
||||
str++;
|
||||
str++;
|
||||
}
|
||||
|
||||
return ARES_SUCCESS;
|
||||
@@ -651,15 +861,23 @@ static int set_search(ares_channel channel, const char *str)
|
||||
int n;
|
||||
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. */
|
||||
n = 0;
|
||||
p = str;
|
||||
while (*p)
|
||||
{
|
||||
while (*p && !isspace((unsigned char)*p))
|
||||
p++;
|
||||
p++;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
p++;
|
||||
n++;
|
||||
}
|
||||
|
||||
@@ -675,15 +893,15 @@ static int set_search(ares_channel channel, const char *str)
|
||||
channel->ndomains = n;
|
||||
q = p;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
q++;
|
||||
channel->domains[n] = malloc(q - p + 1);
|
||||
if (!channel->domains[n])
|
||||
return ARES_ENOMEM;
|
||||
return ARES_ENOMEM;
|
||||
memcpy(channel->domains[n], p, q - p);
|
||||
channel->domains[n][q - p] = 0;
|
||||
p = q;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
p++;
|
||||
n++;
|
||||
}
|
||||
channel->ndomains = n;
|
||||
@@ -700,27 +918,27 @@ static int set_options(ares_channel channel, const char *str)
|
||||
{
|
||||
q = p;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
q++;
|
||||
val = try_option(p, q, "ndots:");
|
||||
if (val && channel->ndots == -1)
|
||||
channel->ndots = atoi(val);
|
||||
channel->ndots = atoi(val);
|
||||
val = try_option(p, q, "retrans:");
|
||||
if (val && channel->timeout == -1)
|
||||
channel->timeout = atoi(val);
|
||||
channel->timeout = atoi(val);
|
||||
val = try_option(p, q, "retry:");
|
||||
if (val && channel->tries == -1)
|
||||
channel->tries = atoi(val);
|
||||
channel->tries = atoi(val);
|
||||
p = q;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
p++;
|
||||
}
|
||||
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
|
||||
static char *try_config(char *s, char *opt)
|
||||
static char *try_config(char *s, const char *opt)
|
||||
{
|
||||
int len;
|
||||
size_t len;
|
||||
|
||||
len = strlen(opt);
|
||||
if (strncmp(s, opt, len) != 0 || !isspace((unsigned char)s[len]))
|
||||
@@ -733,10 +951,8 @@ static char *try_config(char *s, char *opt)
|
||||
|
||||
static const char *try_option(const char *p, const char *q, const char *opt)
|
||||
{
|
||||
int len;
|
||||
|
||||
len = strlen(opt);
|
||||
return (q - p > len && strncmp(p, opt, len) == 0) ? p + len : NULL;
|
||||
size_t len = strlen(opt);
|
||||
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)
|
||||
|
||||
@@ -21,11 +21,9 @@ ares_mkquery \- Compose a single-question DNS query buffer
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B
|
||||
int ares_mkquery(const char *\fIname\fP, int \fIdnsclass\fP, int \fItype\fP,
|
||||
.B
|
||||
unsigned short \fIid\fP, int \fIrd\fP, char **\fIbuf\fP,
|
||||
int *\fIbuflen\fP)
|
||||
.B int ares_mkquery(const char *\fIname\fP, int \fIdnsclass\fP, int \fItype\fP,
|
||||
.B unsigned short \fIid\fP, int \fIrd\fP, char **\fIbuf\fP,
|
||||
.B int *\fIbuflen\fP)
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
@@ -52,8 +50,7 @@ stored in the variable pointed to by
|
||||
and the length of which will be stored in the variable pointed to by
|
||||
.IR buflen .
|
||||
It is the caller's responsibility to free this buffer using
|
||||
.B ares_free_string
|
||||
when it is no longer needed.
|
||||
\fIares_free_string(3)\fP when it is no longer needed.
|
||||
.SH RETURN VALUES
|
||||
.B ares_mkquery
|
||||
can return any of the following values:
|
||||
|
||||
@@ -13,11 +13,10 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#include <netinet/in.h>
|
||||
@@ -48,15 +47,15 @@ static const char rcsid[] = "$Id$";
|
||||
*
|
||||
* AA, TC, RA, and RCODE are only set in responses. Brief description
|
||||
* of the remaining fields:
|
||||
* ID Identifier to match responses with queries
|
||||
* QR Query (0) or response (1)
|
||||
* Opcode For our purposes, always QUERY
|
||||
* RD Recursion desired
|
||||
* Z Reserved (zero)
|
||||
* QDCOUNT Number of queries
|
||||
* ANCOUNT Number of answers
|
||||
* NSCOUNT Number of name server records
|
||||
* ARCOUNT Number of additional records
|
||||
* ID Identifier to match responses with queries
|
||||
* QR Query (0) or response (1)
|
||||
* Opcode For our purposes, always QUERY
|
||||
* RD Recursion desired
|
||||
* Z Reserved (zero)
|
||||
* QDCOUNT Number of queries
|
||||
* ANCOUNT Number of answers
|
||||
* NSCOUNT Number of name server records
|
||||
* ARCOUNT Number of additional records
|
||||
*
|
||||
* Question format, from RFC 1035:
|
||||
* 1 1 1 1 1 1
|
||||
@@ -78,7 +77,7 @@ static const char rcsid[] = "$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;
|
||||
unsigned char *q;
|
||||
@@ -90,7 +89,7 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
||||
for (p = name; *p; p++)
|
||||
{
|
||||
if (*p == '\\' && *(p + 1) != 0)
|
||||
p++;
|
||||
p++;
|
||||
len++;
|
||||
}
|
||||
/* If there are n periods in the name, there are n + 1 labels, and
|
||||
@@ -122,31 +121,31 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
||||
while (*name)
|
||||
{
|
||||
if (*name == '.')
|
||||
return ARES_EBADNAME;
|
||||
return ARES_EBADNAME;
|
||||
|
||||
/* Count the number of bytes in this label. */
|
||||
len = 0;
|
||||
for (p = name; *p && *p != '.'; p++)
|
||||
{
|
||||
if (*p == '\\' && *(p + 1) != 0)
|
||||
p++;
|
||||
len++;
|
||||
}
|
||||
{
|
||||
if (*p == '\\' && *(p + 1) != 0)
|
||||
p++;
|
||||
len++;
|
||||
}
|
||||
if (len > MAXLABEL)
|
||||
return ARES_EBADNAME;
|
||||
return ARES_EBADNAME;
|
||||
|
||||
/* Encode the length and copy the data. */
|
||||
*q++ = len;
|
||||
for (p = name; *p && *p != '.'; p++)
|
||||
{
|
||||
if (*p == '\\' && *(p + 1) != 0)
|
||||
p++;
|
||||
*q++ = *p;
|
||||
}
|
||||
{
|
||||
if (*p == '\\' && *(p + 1) != 0)
|
||||
p++;
|
||||
*q++ = *p;
|
||||
}
|
||||
|
||||
/* Go to the next label and repeat, unless we hit the end. */
|
||||
if (!*p)
|
||||
break;
|
||||
break;
|
||||
name = p + 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,9 +21,8 @@ ares_parse_a_reply \- Parse a reply to a DNS query of type A into a hostent
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B
|
||||
int ares_parse_a_reply(const unsigned char *\fIabuf\fB, int \fIalen\fB,
|
||||
.B struct hostent **\fIhost\fB);
|
||||
.B int ares_parse_a_reply(const unsigned char *\fIabuf\fP, int \fIalen\fP,
|
||||
.B struct hostent **\fIhost\fP);
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
|
||||
@@ -13,11 +13,10 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
@@ -34,11 +33,12 @@ static const char rcsid[] = "$Id$";
|
||||
#include "ares_private.h"
|
||||
|
||||
int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
struct hostent **host)
|
||||
struct hostent **host)
|
||||
{
|
||||
unsigned int qdcount, ancount;
|
||||
int status, i, len, rr_type, rr_class, rr_len, naddrs;
|
||||
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 in_addr *addrs;
|
||||
@@ -87,54 +87,54 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
naliases = 0;
|
||||
|
||||
/* Examine each answer resource record (RR) in turn. */
|
||||
for (i = 0; i < ancount; i++)
|
||||
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;
|
||||
break;
|
||||
aptr += len;
|
||||
if (aptr + RRFIXEDSZ > abuf + alen)
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
{
|
||||
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_A
|
||||
&& rr_len == sizeof(struct in_addr)
|
||||
&& strcasecmp(rr_name, hostname) == 0)
|
||||
{
|
||||
memcpy(&addrs[naddrs], aptr, sizeof(struct in_addr));
|
||||
naddrs++;
|
||||
status = ARES_SUCCESS;
|
||||
}
|
||||
&& rr_len == sizeof(struct in_addr)
|
||||
&& strcasecmp(rr_name, hostname) == 0)
|
||||
{
|
||||
memcpy(&addrs[naddrs], aptr, sizeof(struct in_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++;
|
||||
{
|
||||
/* 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;
|
||||
}
|
||||
/* 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);
|
||||
free(rr_name);
|
||||
|
||||
aptr += rr_len;
|
||||
if (aptr > abuf + alen)
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (status == ARES_SUCCESS && naddrs == 0)
|
||||
@@ -145,23 +145,23 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
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_INET;
|
||||
hostent->h_length = sizeof(struct in_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);
|
||||
}
|
||||
{
|
||||
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_INET;
|
||||
hostent->h_length = sizeof(struct in_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++)
|
||||
|
||||
@@ -21,11 +21,9 @@ ares_parse_ptr_reply \- Parse a reply to a DNS query of type PTR into a hostent
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B
|
||||
int ares_parse_ptr_reply(const unsigned char *\fIabuf\fB, int \fIalen\fB,
|
||||
.B
|
||||
const void *\fIaddr\fP, int \fIaddrlen\fP, int \fIfamily\fP,
|
||||
.B struct hostent **\fIhost\fB);
|
||||
.B int ares_parse_ptr_reply(const unsigned char *\fIabuf\fP, int \fIalen\fP,
|
||||
.B const void *\fIaddr\fP, int \fIaddrlen\fP, int \fIfamily\fP,
|
||||
.B struct hostent **\fIhost\fP);
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
|
||||
@@ -13,11 +13,10 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
@@ -33,10 +32,11 @@ static const char rcsid[] = "$Id$";
|
||||
#include "ares_private.h"
|
||||
|
||||
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;
|
||||
int status, i, len, rr_type, rr_class, rr_len;
|
||||
int status, i, rr_type, rr_class, rr_len;
|
||||
long len;
|
||||
const unsigned char *aptr;
|
||||
char *ptrname, *hostname, *rr_name, *rr_data;
|
||||
struct hostent *hostent;
|
||||
@@ -68,52 +68,52 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
||||
|
||||
/* Examine each answer resource record (RR) in turn. */
|
||||
hostname = NULL;
|
||||
for (i = 0; i < ancount; i++)
|
||||
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;
|
||||
break;
|
||||
aptr += len;
|
||||
if (aptr + RRFIXEDSZ > abuf + alen)
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
{
|
||||
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_PTR
|
||||
&& strcasecmp(rr_name, ptrname) == 0)
|
||||
{
|
||||
/* Decode the RR data and set hostname to it. */
|
||||
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
||||
if (status != ARES_SUCCESS)
|
||||
break;
|
||||
if (hostname)
|
||||
free(hostname);
|
||||
hostname = rr_data;
|
||||
}
|
||||
&& strcasecmp(rr_name, ptrname) == 0)
|
||||
{
|
||||
/* Decode the RR data and set hostname to it. */
|
||||
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
||||
if (status != ARES_SUCCESS)
|
||||
break;
|
||||
if (hostname)
|
||||
free(hostname);
|
||||
hostname = rr_data;
|
||||
}
|
||||
|
||||
if (rr_class == C_IN && rr_type == T_CNAME)
|
||||
{
|
||||
/* Decode the RR data and replace ptrname with it. */
|
||||
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
||||
if (status != ARES_SUCCESS)
|
||||
break;
|
||||
free(ptrname);
|
||||
ptrname = rr_data;
|
||||
}
|
||||
{
|
||||
/* Decode the RR data and replace ptrname with it. */
|
||||
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
||||
if (status != ARES_SUCCESS)
|
||||
break;
|
||||
free(ptrname);
|
||||
ptrname = rr_data;
|
||||
}
|
||||
|
||||
free(rr_name);
|
||||
aptr += rr_len;
|
||||
if (aptr > abuf + alen)
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (status == ARES_SUCCESS && !hostname)
|
||||
@@ -123,33 +123,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. */
|
||||
hostent = malloc(sizeof(struct hostent));
|
||||
if (hostent)
|
||||
{
|
||||
hostent->h_addr_list = malloc(2 * sizeof(char *));
|
||||
if (hostent->h_addr_list)
|
||||
{
|
||||
hostent->h_addr_list[0] = malloc(addrlen);
|
||||
if (hostent->h_addr_list[0])
|
||||
{
|
||||
hostent->h_aliases = malloc(sizeof (char *));
|
||||
if (hostent->h_aliases)
|
||||
{
|
||||
/* Fill in the hostent and return successfully. */
|
||||
hostent->h_name = hostname;
|
||||
hostent->h_aliases[0] = NULL;
|
||||
hostent->h_addrtype = family;
|
||||
hostent->h_length = addrlen;
|
||||
memcpy(hostent->h_addr_list[0], addr, addrlen);
|
||||
hostent->h_addr_list[1] = NULL;
|
||||
*host = hostent;
|
||||
free(ptrname);
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
free(hostent->h_addr_list[0]);
|
||||
}
|
||||
free(hostent->h_addr_list);
|
||||
}
|
||||
free(hostent);
|
||||
}
|
||||
{
|
||||
hostent->h_addr_list = malloc(2 * sizeof(char *));
|
||||
if (hostent->h_addr_list)
|
||||
{
|
||||
hostent->h_addr_list[0] = malloc(addrlen);
|
||||
if (hostent->h_addr_list[0])
|
||||
{
|
||||
hostent->h_aliases = malloc(sizeof (char *));
|
||||
if (hostent->h_aliases)
|
||||
{
|
||||
/* Fill in the hostent and return successfully. */
|
||||
hostent->h_name = hostname;
|
||||
hostent->h_aliases[0] = NULL;
|
||||
hostent->h_addrtype = family;
|
||||
hostent->h_length = addrlen;
|
||||
memcpy(hostent->h_addr_list[0], addr, addrlen);
|
||||
hostent->h_addr_list[1] = NULL;
|
||||
*host = hostent;
|
||||
free(ptrname);
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
free(hostent->h_addr_list[0]);
|
||||
}
|
||||
free(hostent->h_addr_list);
|
||||
}
|
||||
free(hostent);
|
||||
}
|
||||
status = ARES_ENOMEM;
|
||||
}
|
||||
if (hostname)
|
||||
|
||||
@@ -18,46 +18,61 @@
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#else
|
||||
#if !defined(WIN32) || defined(WATT32)
|
||||
#include <netinet/in.h>
|
||||
/* We define closesocket() here so that we can use this function all over
|
||||
the source code for closing sockets. */
|
||||
#define closesocket(x) close(x)
|
||||
#endif
|
||||
|
||||
#define DEFAULT_TIMEOUT 5
|
||||
#define DEFAULT_TRIES 4
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#ifdef WATT32
|
||||
#include <tcp.h>
|
||||
#include <sys/ioctl.h>
|
||||
#undef closesocket
|
||||
#define closesocket(s) close_s(s)
|
||||
#define writev(s,v,c) writev_s(s,v,c)
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#define DEFAULT_TIMEOUT 5
|
||||
#define DEFAULT_TRIES 4
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#endif
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
|
||||
#define IsNT ((int)GetVersion()>0)
|
||||
#define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
|
||||
#define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
|
||||
#define NAMESERVER "NameServer"
|
||||
#define DHCPNAMESERVER "DhcpNameServer"
|
||||
#define PATH_HOSTS_NT "\\drivers\\etc\\hosts"
|
||||
#define PATH_HOSTS_9X "\\hosts"
|
||||
|
||||
#define DATABASEPATH "DatabasePath"
|
||||
#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
|
||||
|
||||
#define PATH_RESOLV_CONF "/etc/resolv.conf"
|
||||
#define PATH_RESOLV_CONF "/etc/resolv.conf"
|
||||
#ifdef ETC_INET
|
||||
#define PATH_HOSTS "/etc/inet/hosts"
|
||||
#define PATH_HOSTS "/etc/inet/hosts"
|
||||
#else
|
||||
#define PATH_HOSTS "/etc/hosts"
|
||||
#define PATH_HOSTS "/etc/hosts"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
struct send_request {
|
||||
/* Remaining data to send */
|
||||
const char *data;
|
||||
int len;
|
||||
const unsigned char *data;
|
||||
size_t len;
|
||||
|
||||
/* Next request in queue */
|
||||
struct send_request *next;
|
||||
@@ -65,8 +80,8 @@ struct send_request {
|
||||
|
||||
struct server_state {
|
||||
struct in_addr addr;
|
||||
int udp_socket;
|
||||
int tcp_socket;
|
||||
ares_socket_t udp_socket;
|
||||
ares_socket_t tcp_socket;
|
||||
|
||||
/* Mini-buffer for reading the length word */
|
||||
unsigned char tcp_lenbuf[2];
|
||||
@@ -88,11 +103,11 @@ struct query {
|
||||
time_t timeout;
|
||||
|
||||
/* Query buf with length at beginning, for TCP transmission */
|
||||
char *tcpbuf;
|
||||
unsigned char *tcpbuf;
|
||||
int tcplen;
|
||||
|
||||
/* Arguments passed to ares_send() (qbuf points into tcpbuf) */
|
||||
const char *qbuf;
|
||||
const unsigned char *qbuf;
|
||||
int qlen;
|
||||
ares_callback callback;
|
||||
void *arg;
|
||||
@@ -143,3 +158,11 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now);
|
||||
void ares__close_sockets(struct server_state *server);
|
||||
int ares__get_hostent(FILE *fp, struct hostent **host);
|
||||
int ares__read_line(FILE *fp, char **buf, int *bufsize);
|
||||
|
||||
#ifdef CURLDEBUG
|
||||
/* This is low-level hard-hacking memory leak tracking and similar. Using the
|
||||
libcurl lowlevel code from within library is ugly and only works when
|
||||
c-ares is built and linked with a similarly debug-build libcurl, but we do
|
||||
this anyway for convenience. */
|
||||
#include "../lib/memdebug.h"
|
||||
#endif
|
||||
|
||||
@@ -35,13 +35,10 @@ The file descriptor sets pointed to by
|
||||
and
|
||||
.I write_fds
|
||||
should have file descriptors set in them according to whether the file
|
||||
descriptors specified by
|
||||
.BR ares_fds (3)
|
||||
are ready for reading and writing. (The easiest way to determine this
|
||||
information is to invoke
|
||||
descriptors specified by \fIares_fds(3)\fP are ready for reading and writing.
|
||||
(The easiest way to determine this information is to invoke
|
||||
.B select
|
||||
with a timeout no greater than the timeout given by
|
||||
.BR ares_timeout (3)).
|
||||
with a timeout no greater than the timeout given by \fIares_timeout(3)\fP ).
|
||||
.PP
|
||||
The
|
||||
.B ares_process
|
||||
|
||||
@@ -13,46 +13,57 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#ifdef HAVE_SYS_UIO_H
|
||||
#include <sys/uio.h>
|
||||
#endif
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#include <arpa/nameser.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "ares.h"
|
||||
#include "ares_dns.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#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,
|
||||
time_t now);
|
||||
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,
|
||||
time_t now);
|
||||
time_t now);
|
||||
static void process_timeouts(ares_channel channel, time_t now);
|
||||
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 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_udp_socket(ares_channel channel, struct server_state *server);
|
||||
static int same_questions(const unsigned char *qbuf, int qlen,
|
||||
const unsigned char *abuf, int alen);
|
||||
static void end_query(ares_channel channel, struct query *query, int status,
|
||||
unsigned char *abuf, int alen);
|
||||
const unsigned char *abuf, int alen);
|
||||
static struct query *end_query(ares_channel channel, struct query *query, int status,
|
||||
unsigned char *abuf, int alen);
|
||||
|
||||
/* Something interesting happened on the wire, or there was a timeout.
|
||||
* See what's up and respond accordingly.
|
||||
@@ -76,95 +87,91 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
||||
struct server_state *server;
|
||||
struct send_request *sendreq;
|
||||
struct iovec *vec;
|
||||
int i, n, count;
|
||||
int i;
|
||||
ssize_t scount;
|
||||
int wcount;
|
||||
size_t n;
|
||||
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
{
|
||||
/* Make sure server has data to send and is selected in write_fds. */
|
||||
server = &channel->servers[i];
|
||||
if (!server->qhead || server->tcp_socket == -1
|
||||
|| !FD_ISSET(server->tcp_socket, write_fds))
|
||||
continue;
|
||||
if (!server->qhead || server->tcp_socket == ARES_SOCKET_BAD
|
||||
|| !FD_ISSET(server->tcp_socket, write_fds))
|
||||
continue;
|
||||
|
||||
/* Count the number of send queue items. */
|
||||
n = 0;
|
||||
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. */
|
||||
vec = malloc(n * sizeof(struct iovec));
|
||||
#endif
|
||||
if (vec)
|
||||
{
|
||||
#ifdef WIN32
|
||||
#else
|
||||
/* Fill in the iovecs and send. */
|
||||
n = 0;
|
||||
for (sendreq = server->qhead; sendreq; sendreq = sendreq->next)
|
||||
{
|
||||
vec[n].iov_base = (char *) sendreq->data;
|
||||
vec[n].iov_len = sendreq->len;
|
||||
n++;
|
||||
}
|
||||
count = writev(server->tcp_socket, vec, n);
|
||||
free(vec);
|
||||
if (count < 0)
|
||||
{
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
{
|
||||
/* Fill in the iovecs and send. */
|
||||
n = 0;
|
||||
for (sendreq = server->qhead; sendreq; sendreq = sendreq->next)
|
||||
{
|
||||
vec[n].iov_base = (char *) sendreq->data;
|
||||
vec[n].iov_len = sendreq->len;
|
||||
n++;
|
||||
}
|
||||
wcount = writev(server->tcp_socket, vec, n);
|
||||
free(vec);
|
||||
if (wcount < 0)
|
||||
{
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Advance the send queue by as many bytes as we sent. */
|
||||
while (count)
|
||||
{
|
||||
sendreq = server->qhead;
|
||||
if (count >= sendreq->len)
|
||||
{
|
||||
count -= sendreq->len;
|
||||
server->qhead = sendreq->next;
|
||||
if (server->qhead == NULL)
|
||||
server->qtail = NULL;
|
||||
free(sendreq);
|
||||
}
|
||||
else
|
||||
{
|
||||
sendreq->data += count;
|
||||
sendreq->len -= count;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/* Advance the send queue by as many bytes as we sent. */
|
||||
while (wcount)
|
||||
{
|
||||
sendreq = server->qhead;
|
||||
if ((size_t)wcount >= sendreq->len)
|
||||
{
|
||||
wcount -= sendreq->len;
|
||||
server->qhead = sendreq->next;
|
||||
if (server->qhead == NULL)
|
||||
server->qtail = NULL;
|
||||
free(sendreq);
|
||||
}
|
||||
else
|
||||
{
|
||||
sendreq->data += wcount;
|
||||
sendreq->len -= wcount;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Can't allocate iovecs; just send the first request. */
|
||||
sendreq = server->qhead;
|
||||
{
|
||||
/* Can't allocate iovecs; just send the first request. */
|
||||
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)
|
||||
{
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
if (scount < 0)
|
||||
{
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Advance the send queue by as many bytes as we sent. */
|
||||
if (count == sendreq->len)
|
||||
{
|
||||
server->qhead = sendreq->next;
|
||||
if (server->qhead == NULL)
|
||||
server->qtail = NULL;
|
||||
free(sendreq);
|
||||
}
|
||||
else
|
||||
{
|
||||
sendreq->data += count;
|
||||
sendreq->len -= count;
|
||||
}
|
||||
}
|
||||
/* Advance the send queue by as many bytes as we sent. */
|
||||
if ((size_t)scount == sendreq->len)
|
||||
{
|
||||
server->qhead = sendreq->next;
|
||||
if (server->qhead == NULL)
|
||||
server->qtail = NULL;
|
||||
free(sendreq);
|
||||
}
|
||||
else
|
||||
{
|
||||
sendreq->data += scount;
|
||||
sendreq->len -= scount;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -181,68 +188,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. */
|
||||
server = &channel->servers[i];
|
||||
if (server->tcp_socket == -1 || !FD_ISSET(server->tcp_socket, read_fds))
|
||||
continue;
|
||||
if (server->tcp_socket == ARES_SOCKET_BAD ||
|
||||
!FD_ISSET(server->tcp_socket, read_fds))
|
||||
continue;
|
||||
|
||||
if (server->tcp_lenbuf_pos != 2)
|
||||
{
|
||||
/* We haven't yet read a length word, so read that (or
|
||||
* what's left to read of it).
|
||||
*/
|
||||
{
|
||||
/* We haven't yet read a length word, so read that (or
|
||||
* what's left to read of it).
|
||||
*/
|
||||
count = recv(server->tcp_socket,
|
||||
server->tcp_lenbuf + server->tcp_buffer_pos,
|
||||
2 - server->tcp_buffer_pos, 0);
|
||||
if (count <= 0)
|
||||
{
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
if (count <= 0)
|
||||
{
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
|
||||
server->tcp_lenbuf_pos += count;
|
||||
if (server->tcp_lenbuf_pos == 2)
|
||||
{
|
||||
/* We finished reading the length word. Decode the
|
||||
server->tcp_lenbuf_pos += count;
|
||||
if (server->tcp_lenbuf_pos == 2)
|
||||
{
|
||||
/* We finished reading the length word. Decode the
|
||||
* length and allocate a buffer for the data.
|
||||
*/
|
||||
server->tcp_length = server->tcp_lenbuf[0] << 8
|
||||
| server->tcp_lenbuf[1];
|
||||
server->tcp_buffer = malloc(server->tcp_length);
|
||||
if (!server->tcp_buffer)
|
||||
handle_error(channel, i, now);
|
||||
server->tcp_buffer_pos = 0;
|
||||
}
|
||||
}
|
||||
*/
|
||||
server->tcp_length = server->tcp_lenbuf[0] << 8
|
||||
| server->tcp_lenbuf[1];
|
||||
server->tcp_buffer = malloc(server->tcp_length);
|
||||
if (!server->tcp_buffer)
|
||||
handle_error(channel, i, now);
|
||||
server->tcp_buffer_pos = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Read data into the allocated buffer. */
|
||||
count = recv(server->tcp_socket,
|
||||
server->tcp_buffer + server->tcp_buffer_pos,
|
||||
server->tcp_length - server->tcp_buffer_pos, 0);
|
||||
if (count <= 0)
|
||||
{
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
{
|
||||
/* Read data into the allocated buffer. */
|
||||
count = recv(server->tcp_socket,
|
||||
server->tcp_buffer + server->tcp_buffer_pos,
|
||||
server->tcp_length - server->tcp_buffer_pos, 0);
|
||||
if (count <= 0)
|
||||
{
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
|
||||
server->tcp_buffer_pos += count;
|
||||
if (server->tcp_buffer_pos == server->tcp_length)
|
||||
{
|
||||
/* We finished reading this answer; process it and
|
||||
server->tcp_buffer_pos += count;
|
||||
if (server->tcp_buffer_pos == server->tcp_length)
|
||||
{
|
||||
/* We finished reading this answer; process it and
|
||||
* prepare to read another length word.
|
||||
*/
|
||||
process_answer(channel, server->tcp_buffer, server->tcp_length,
|
||||
i, 1, now);
|
||||
free(server->tcp_buffer);
|
||||
server->tcp_buffer = NULL;
|
||||
server->tcp_lenbuf_pos = 0;
|
||||
}
|
||||
}
|
||||
*/
|
||||
process_answer(channel, server->tcp_buffer, server->tcp_length,
|
||||
i, 1, now);
|
||||
if (server->tcp_buffer)
|
||||
free(server->tcp_buffer);
|
||||
server->tcp_buffer = NULL;
|
||||
server->tcp_lenbuf_pos = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If any UDP sockets select true for reading, process them. */
|
||||
static void read_udp_packets(ares_channel channel, fd_set *read_fds,
|
||||
time_t now)
|
||||
time_t now)
|
||||
{
|
||||
struct server_state *server;
|
||||
int i, count;
|
||||
@@ -253,12 +262,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. */
|
||||
server = &channel->servers[i];
|
||||
|
||||
if (server->udp_socket == -1 || !FD_ISSET(server->udp_socket, read_fds))
|
||||
continue;
|
||||
if (server->udp_socket == ARES_SOCKET_BAD ||
|
||||
!FD_ISSET(server->udp_socket, read_fds))
|
||||
continue;
|
||||
|
||||
count = recv(server->udp_socket, buf, sizeof(buf), 0);
|
||||
if (count <= 0)
|
||||
handle_error(channel, i, now);
|
||||
handle_error(channel, i, now);
|
||||
|
||||
process_answer(channel, buf, count, i, 0, now);
|
||||
}
|
||||
@@ -273,16 +283,16 @@ static void process_timeouts(ares_channel channel, time_t now)
|
||||
{
|
||||
next = query->next;
|
||||
if (query->timeout != 0 && now >= query->timeout)
|
||||
{
|
||||
query->error_status = ARES_ETIMEOUT;
|
||||
next_server(channel, query, now);
|
||||
}
|
||||
{
|
||||
query->error_status = ARES_ETIMEOUT;
|
||||
next = next_server(channel, query, now);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle an answer from a server. */
|
||||
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;
|
||||
struct query *query;
|
||||
@@ -301,7 +311,7 @@ static void process_answer(ares_channel channel, unsigned char *abuf,
|
||||
for (query = channel->queries; query; query = query->next)
|
||||
{
|
||||
if (query->qid == id)
|
||||
break;
|
||||
break;
|
||||
}
|
||||
if (!query)
|
||||
return;
|
||||
@@ -313,10 +323,10 @@ static void process_answer(ares_channel channel, unsigned char *abuf,
|
||||
if ((tc || alen > PACKETSZ) && !tcp && !(channel->flags & ARES_FLAG_IGNTC))
|
||||
{
|
||||
if (!query->using_tcp)
|
||||
{
|
||||
query->using_tcp = 1;
|
||||
ares__send_query(channel, query, now);
|
||||
}
|
||||
{
|
||||
query->using_tcp = 1;
|
||||
ares__send_query(channel, query, now);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -332,18 +342,18 @@ static void process_answer(ares_channel channel, unsigned char *abuf,
|
||||
if (!(channel->flags & ARES_FLAG_NOCHECKRESP))
|
||||
{
|
||||
if (rcode == SERVFAIL || rcode == NOTIMP || rcode == REFUSED)
|
||||
{
|
||||
query->skip_server[whichserver] = 1;
|
||||
if (query->server == whichserver)
|
||||
next_server(channel, query, now);
|
||||
return;
|
||||
}
|
||||
{
|
||||
query->skip_server[whichserver] = 1;
|
||||
if (query->server == whichserver)
|
||||
next_server(channel, query, now);
|
||||
return;
|
||||
}
|
||||
if (!same_questions(query->qbuf, query->qlen, abuf, alen))
|
||||
{
|
||||
if (query->server == whichserver)
|
||||
next_server(channel, query, now);
|
||||
return;
|
||||
}
|
||||
{
|
||||
if (query->server == whichserver)
|
||||
next_server(channel, query, now);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
end_query(channel, query, ARES_SUCCESS, abuf, alen);
|
||||
@@ -351,7 +361,7 @@ static void process_answer(ares_channel channel, unsigned char *abuf,
|
||||
|
||||
static void handle_error(ares_channel channel, int whichserver, time_t now)
|
||||
{
|
||||
struct query *query;
|
||||
struct query *query, *next;
|
||||
|
||||
/* Reset communications with this server. */
|
||||
ares__close_sockets(&channel->servers[whichserver]);
|
||||
@@ -359,37 +369,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
|
||||
* 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)
|
||||
{
|
||||
query->skip_server[whichserver] = 1;
|
||||
next_server(channel, query, now);
|
||||
}
|
||||
{
|
||||
query->skip_server[whichserver] = 1;
|
||||
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. */
|
||||
query->server++;
|
||||
for (; query->try < channel->tries; query->try++)
|
||||
{
|
||||
for (; query->server < channel->nservers; query->server++)
|
||||
{
|
||||
if (!query->skip_server[query->server])
|
||||
{
|
||||
ares__send_query(channel, query, now);
|
||||
return;
|
||||
}
|
||||
}
|
||||
{
|
||||
if (!query->skip_server[query->server])
|
||||
{
|
||||
ares__send_query(channel, query, now);
|
||||
return (query->next);
|
||||
}
|
||||
}
|
||||
query->server = 0;
|
||||
|
||||
/* Only one try if we're 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)
|
||||
@@ -403,112 +415,121 @@ 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
|
||||
* a send request.
|
||||
*/
|
||||
if (server->tcp_socket == -1)
|
||||
{
|
||||
if (open_tcp_socket(channel, server) == -1)
|
||||
{
|
||||
query->skip_server[query->server] = 1;
|
||||
next_server(channel, query, now);
|
||||
return;
|
||||
}
|
||||
}
|
||||
sendreq = malloc(sizeof(struct send_request));
|
||||
if (server->tcp_socket == ARES_SOCKET_BAD)
|
||||
{
|
||||
if (open_tcp_socket(channel, server) == -1)
|
||||
{
|
||||
query->skip_server[query->server] = 1;
|
||||
next_server(channel, query, now);
|
||||
return;
|
||||
}
|
||||
}
|
||||
sendreq = calloc(sizeof(struct send_request), 1);
|
||||
if (!sendreq)
|
||||
end_query(channel, query, ARES_ENOMEM, NULL, 0);
|
||||
{
|
||||
end_query(channel, query, ARES_ENOMEM, NULL, 0);
|
||||
return;
|
||||
}
|
||||
sendreq->data = query->tcpbuf;
|
||||
sendreq->len = query->tcplen;
|
||||
sendreq->next = NULL;
|
||||
if (server->qtail)
|
||||
server->qtail->next = sendreq;
|
||||
server->qtail->next = sendreq;
|
||||
else
|
||||
server->qhead = sendreq;
|
||||
server->qhead = sendreq;
|
||||
server->qtail = sendreq;
|
||||
query->timeout = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (server->udp_socket == -1)
|
||||
{
|
||||
if (open_udp_socket(channel, server) == -1)
|
||||
{
|
||||
query->skip_server[query->server] = 1;
|
||||
next_server(channel, query, now);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (server->udp_socket == ARES_SOCKET_BAD)
|
||||
{
|
||||
if (open_udp_socket(channel, server) == -1)
|
||||
{
|
||||
query->skip_server[query->server] = 1;
|
||||
next_server(channel, query, now);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (send(server->udp_socket, query->qbuf, query->qlen, 0) == -1)
|
||||
{
|
||||
query->skip_server[query->server] = 1;
|
||||
next_server(channel, query, now);
|
||||
return;
|
||||
}
|
||||
{
|
||||
query->skip_server[query->server] = 1;
|
||||
next_server(channel, query, now);
|
||||
return;
|
||||
}
|
||||
query->timeout = now
|
||||
+ ((query->try == 0) ? channel->timeout
|
||||
: channel->timeout << query->try / channel->nservers);
|
||||
+ ((query->try == 0) ? channel->timeout
|
||||
: channel->timeout << query->try / channel->nservers);
|
||||
}
|
||||
}
|
||||
|
||||
static int open_tcp_socket(ares_channel channel, struct server_state *server)
|
||||
{
|
||||
int s, flags;
|
||||
struct sockaddr_in sin;
|
||||
ares_socket_t s;
|
||||
int flags;
|
||||
struct sockaddr_in sockin;
|
||||
|
||||
/* Acquire a socket. */
|
||||
s = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (s == -1)
|
||||
if (s == ARES_SOCKET_BAD)
|
||||
return -1;
|
||||
|
||||
/* Set the socket non-blocking. */
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) || defined(WATT32)
|
||||
flags = 1;
|
||||
ioctlsocket(s, FIONBIO, &flags);
|
||||
#else
|
||||
if (fcntl(s, F_GETFL, &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. */
|
||||
memset(&sin, 0, sizeof(sin));
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr = server->addr;
|
||||
sin.sin_port = channel->tcp_port;
|
||||
if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) == -1
|
||||
&& errno != EINPROGRESS)
|
||||
flags = fcntl(s, F_GETFL, 0);
|
||||
|
||||
if (flags == -1)
|
||||
{
|
||||
closesocket(s);
|
||||
return -1;
|
||||
}
|
||||
flags |= O_NONBLOCK;
|
||||
if (fcntl(s, F_SETFL, flags) == -1)
|
||||
{
|
||||
closesocket(s);
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Connect to the server. */
|
||||
memset(&sockin, 0, sizeof(sockin));
|
||||
sockin.sin_family = AF_INET;
|
||||
sockin.sin_addr = server->addr;
|
||||
sockin.sin_port = channel->tcp_port;
|
||||
if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1) {
|
||||
int err = GET_ERRNO();
|
||||
|
||||
if (err != EINPROGRESS && err != EWOULDBLOCK) {
|
||||
closesocket(s);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
server->tcp_buffer_pos = 0;
|
||||
server->tcp_socket = s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int open_udp_socket(ares_channel channel, struct server_state *server)
|
||||
{
|
||||
int s;
|
||||
struct sockaddr_in sin;
|
||||
ares_socket_t s;
|
||||
struct sockaddr_in sockin;
|
||||
|
||||
/* Acquire a socket. */
|
||||
s = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (s == -1)
|
||||
if (s == ARES_SOCKET_BAD)
|
||||
return -1;
|
||||
|
||||
/* Connect to the server. */
|
||||
memset(&sin, 0, sizeof(sin));
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr = server->addr;
|
||||
sin.sin_port = channel->udp_port;
|
||||
if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) == -1)
|
||||
memset(&sockin, 0, sizeof(sockin));
|
||||
sockin.sin_family = AF_INET;
|
||||
sockin.sin_addr = server->addr;
|
||||
sockin.sin_port = channel->udp_port;
|
||||
if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1)
|
||||
{
|
||||
closesocket(s);
|
||||
return -1;
|
||||
@@ -519,13 +540,13 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
|
||||
}
|
||||
|
||||
static int same_questions(const unsigned char *qbuf, int qlen,
|
||||
const unsigned char *abuf, int alen)
|
||||
const unsigned char *abuf, int alen)
|
||||
{
|
||||
struct {
|
||||
const unsigned char *p;
|
||||
int qdcount;
|
||||
char *name;
|
||||
int namelen;
|
||||
long namelen;
|
||||
int type;
|
||||
int dnsclass;
|
||||
} q, a;
|
||||
@@ -546,14 +567,14 @@ static int same_questions(const unsigned char *qbuf, int qlen,
|
||||
{
|
||||
/* Decode the question in the query. */
|
||||
if (ares_expand_name(q.p, qbuf, qlen, &q.name, &q.namelen)
|
||||
!= ARES_SUCCESS)
|
||||
return 0;
|
||||
!= ARES_SUCCESS)
|
||||
return 0;
|
||||
q.p += q.namelen;
|
||||
if (q.p + QFIXEDSZ > qbuf + qlen)
|
||||
{
|
||||
free(q.name);
|
||||
return 0;
|
||||
}
|
||||
{
|
||||
free(q.name);
|
||||
return 0;
|
||||
}
|
||||
q.type = DNS_QUESTION_TYPE(q.p);
|
||||
q.dnsclass = DNS_QUESTION_CLASS(q.p);
|
||||
q.p += QFIXEDSZ;
|
||||
@@ -561,55 +582,59 @@ static int same_questions(const unsigned char *qbuf, int qlen,
|
||||
/* Search for this question in the answer. */
|
||||
a.p = abuf + HFIXEDSZ;
|
||||
for (j = 0; j < a.qdcount; j++)
|
||||
{
|
||||
/* Decode the question in the answer. */
|
||||
if (ares_expand_name(a.p, abuf, alen, &a.name, &a.namelen)
|
||||
!= ARES_SUCCESS)
|
||||
{
|
||||
free(q.name);
|
||||
return 0;
|
||||
}
|
||||
a.p += a.namelen;
|
||||
if (a.p + QFIXEDSZ > abuf + alen)
|
||||
{
|
||||
free(q.name);
|
||||
free(a.name);
|
||||
return 0;
|
||||
}
|
||||
a.type = DNS_QUESTION_TYPE(a.p);
|
||||
a.dnsclass = DNS_QUESTION_CLASS(a.p);
|
||||
a.p += QFIXEDSZ;
|
||||
{
|
||||
/* Decode the question in the answer. */
|
||||
if (ares_expand_name(a.p, abuf, alen, &a.name, &a.namelen)
|
||||
!= ARES_SUCCESS)
|
||||
{
|
||||
free(q.name);
|
||||
return 0;
|
||||
}
|
||||
a.p += a.namelen;
|
||||
if (a.p + QFIXEDSZ > abuf + alen)
|
||||
{
|
||||
free(q.name);
|
||||
free(a.name);
|
||||
return 0;
|
||||
}
|
||||
a.type = DNS_QUESTION_TYPE(a.p);
|
||||
a.dnsclass = DNS_QUESTION_CLASS(a.p);
|
||||
a.p += QFIXEDSZ;
|
||||
|
||||
/* Compare the decoded questions. */
|
||||
if (strcasecmp(q.name, a.name) == 0 && q.type == a.type
|
||||
&& q.dnsclass == a.dnsclass)
|
||||
{
|
||||
free(a.name);
|
||||
break;
|
||||
}
|
||||
free(a.name);
|
||||
}
|
||||
/* Compare the decoded questions. */
|
||||
if (strcasecmp(q.name, a.name) == 0 && q.type == a.type
|
||||
&& q.dnsclass == a.dnsclass)
|
||||
{
|
||||
free(a.name);
|
||||
break;
|
||||
}
|
||||
free(a.name);
|
||||
}
|
||||
|
||||
free(q.name);
|
||||
if (j == a.qdcount)
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void end_query(ares_channel channel, struct query *query, int status,
|
||||
unsigned char *abuf, int alen)
|
||||
static struct query *end_query (ares_channel channel, struct query *query, int status,
|
||||
unsigned char *abuf, int alen)
|
||||
{
|
||||
struct query **q;
|
||||
struct query **q, *next;
|
||||
int i;
|
||||
|
||||
query->callback(query->arg, status, abuf, alen);
|
||||
for (q = &channel->queries; *q; q = &(*q)->next)
|
||||
{
|
||||
if (*q == query)
|
||||
break;
|
||||
break;
|
||||
}
|
||||
*q = query->next;
|
||||
if (*q)
|
||||
next = (*q)->next;
|
||||
else
|
||||
next = NULL;
|
||||
free(query->tcpbuf);
|
||||
free(query->skip_server);
|
||||
free(query);
|
||||
@@ -620,6 +645,7 @@ static void end_query(ares_channel channel, struct query *query, int status,
|
||||
if (!channel->queries && !(channel->flags & ARES_FLAG_STAYOPEN))
|
||||
{
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
ares__close_sockets(&channel->servers[i]);
|
||||
ares__close_sockets(&channel->servers[i]);
|
||||
}
|
||||
return (next);
|
||||
}
|
||||
|
||||
@@ -13,11 +13,10 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#include <netinet/in.h>
|
||||
@@ -37,7 +36,7 @@ struct qquery {
|
||||
static void qcallback(void *arg, int status, unsigned char *abuf, int alen);
|
||||
|
||||
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;
|
||||
unsigned char *qbuf;
|
||||
@@ -46,7 +45,7 @@ void ares_query(ares_channel channel, const char *name, int dnsclass,
|
||||
/* Compose the query. */
|
||||
rd = !(channel->flags & ARES_FLAG_NORECURSE);
|
||||
status = ares_mkquery(name, dnsclass, type, channel->next_id, rd, &qbuf,
|
||||
&qlen);
|
||||
&qlen);
|
||||
channel->next_id++;
|
||||
if (status != ARES_SUCCESS)
|
||||
{
|
||||
@@ -86,26 +85,26 @@ static void qcallback(void *arg, int status, unsigned char *abuf, int alen)
|
||||
|
||||
/* Convert errors. */
|
||||
switch (rcode)
|
||||
{
|
||||
case NOERROR:
|
||||
status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA;
|
||||
break;
|
||||
case FORMERR:
|
||||
status = ARES_EFORMERR;
|
||||
break;
|
||||
case SERVFAIL:
|
||||
status = ARES_ESERVFAIL;
|
||||
break;
|
||||
case NXDOMAIN:
|
||||
status = ARES_ENOTFOUND;
|
||||
break;
|
||||
case NOTIMP:
|
||||
status = ARES_ENOTIMP;
|
||||
break;
|
||||
case REFUSED:
|
||||
status = ARES_EREFUSED;
|
||||
break;
|
||||
}
|
||||
{
|
||||
case NOERROR:
|
||||
status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA;
|
||||
break;
|
||||
case FORMERR:
|
||||
status = ARES_EFORMERR;
|
||||
break;
|
||||
case SERVFAIL:
|
||||
status = ARES_ESERVFAIL;
|
||||
break;
|
||||
case NXDOMAIN:
|
||||
status = ARES_ENOTFOUND;
|
||||
break;
|
||||
case NOTIMP:
|
||||
status = ARES_ENOTIMP;
|
||||
break;
|
||||
case REFUSED:
|
||||
status = ARES_EREFUSED;
|
||||
break;
|
||||
}
|
||||
qquery->callback(qquery->arg, status, abuf, alen);
|
||||
}
|
||||
free(qquery);
|
||||
|
||||
@@ -13,14 +13,13 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#endif
|
||||
|
||||
@@ -30,26 +29,26 @@ static const char rcsid[] = "$Id$";
|
||||
struct search_query {
|
||||
/* Arguments passed to ares_search */
|
||||
ares_channel channel;
|
||||
char *name; /* copied into an allocated buffer */
|
||||
char *name; /* copied into an allocated buffer */
|
||||
int dnsclass;
|
||||
int type;
|
||||
ares_callback callback;
|
||||
void *arg;
|
||||
|
||||
int status_as_is; /* error status from trying as-is */
|
||||
int next_domain; /* next search domain to try */
|
||||
int trying_as_is; /* current query is for name as-is */
|
||||
int status_as_is; /* error status from trying as-is */
|
||||
int next_domain; /* next search domain to try */
|
||||
int trying_as_is; /* current query is for name as-is */
|
||||
};
|
||||
|
||||
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,
|
||||
unsigned char *abuf, int alen);
|
||||
unsigned char *abuf, int alen);
|
||||
static int cat_domain(const char *name, const char *domain, 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,
|
||||
int type, ares_callback callback, void *arg)
|
||||
int type, ares_callback callback, void *arg)
|
||||
{
|
||||
struct search_query *squery;
|
||||
char *s;
|
||||
@@ -100,7 +99,7 @@ void ares_search(ares_channel channel, const char *name, int dnsclass,
|
||||
for (p = name; *p; p++)
|
||||
{
|
||||
if (*p == '.')
|
||||
ndots++;
|
||||
ndots++;
|
||||
}
|
||||
|
||||
/* If ndots is at least the channel ndots threshold (usually 1),
|
||||
@@ -121,17 +120,22 @@ void ares_search(ares_channel channel, const char *name, int dnsclass,
|
||||
squery->trying_as_is = 0;
|
||||
status = cat_domain(name, channel->domains[0], &s);
|
||||
if (status == ARES_SUCCESS)
|
||||
{
|
||||
ares_query(channel, s, dnsclass, type, search_callback, squery);
|
||||
free(s);
|
||||
}
|
||||
{
|
||||
ares_query(channel, s, dnsclass, type, search_callback, squery);
|
||||
free(s);
|
||||
}
|
||||
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,
|
||||
int alen)
|
||||
int alen)
|
||||
{
|
||||
struct search_query *squery = (struct search_query *) arg;
|
||||
ares_channel channel = squery->channel;
|
||||
@@ -145,37 +149,37 @@ static void search_callback(void *arg, int status, unsigned char *abuf,
|
||||
{
|
||||
/* Save the status if we were trying as-is. */
|
||||
if (squery->trying_as_is)
|
||||
squery->status_as_is = status;
|
||||
squery->status_as_is = status;
|
||||
if (squery->next_domain < channel->ndomains)
|
||||
{
|
||||
/* Try the next domain. */
|
||||
status = cat_domain(squery->name,
|
||||
channel->domains[squery->next_domain], &s);
|
||||
if (status != ARES_SUCCESS)
|
||||
end_squery(squery, status, NULL, 0);
|
||||
else
|
||||
{
|
||||
squery->trying_as_is = 0;
|
||||
squery->next_domain++;
|
||||
ares_query(channel, s, squery->dnsclass, squery->type,
|
||||
search_callback, squery);
|
||||
free(s);
|
||||
}
|
||||
}
|
||||
{
|
||||
/* Try the next domain. */
|
||||
status = cat_domain(squery->name,
|
||||
channel->domains[squery->next_domain], &s);
|
||||
if (status != ARES_SUCCESS)
|
||||
end_squery(squery, status, NULL, 0);
|
||||
else
|
||||
{
|
||||
squery->trying_as_is = 0;
|
||||
squery->next_domain++;
|
||||
ares_query(channel, s, squery->dnsclass, squery->type,
|
||||
search_callback, squery);
|
||||
free(s);
|
||||
}
|
||||
}
|
||||
else if (squery->status_as_is == -1)
|
||||
{
|
||||
/* Try the name as-is at the end. */
|
||||
squery->trying_as_is = 1;
|
||||
ares_query(channel, squery->name, squery->dnsclass, squery->type,
|
||||
search_callback, squery);
|
||||
}
|
||||
{
|
||||
/* Try the name as-is at the end. */
|
||||
squery->trying_as_is = 1;
|
||||
ares_query(channel, squery->name, squery->dnsclass, squery->type,
|
||||
search_callback, squery);
|
||||
}
|
||||
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,
|
||||
unsigned char *abuf, int alen)
|
||||
unsigned char *abuf, int alen)
|
||||
{
|
||||
squery->callback(squery->arg, status, abuf, alen);
|
||||
free(squery->name);
|
||||
@@ -185,7 +189,8 @@ static void end_squery(struct search_query *squery, int status,
|
||||
/* Concatenate two domains. */
|
||||
static int cat_domain(const char *name, const char *domain, char **s)
|
||||
{
|
||||
int nlen = strlen(name), dlen = strlen(domain);
|
||||
size_t nlen = strlen(name);
|
||||
size_t dlen = strlen(domain);
|
||||
|
||||
*s = malloc(nlen + 1 + dlen + 1);
|
||||
if (!*s)
|
||||
@@ -203,7 +208,7 @@ static int cat_domain(const char *name, const char *domain, char **s)
|
||||
*/
|
||||
static int single_domain(ares_channel channel, const char *name, char **s)
|
||||
{
|
||||
int len = strlen(name);
|
||||
size_t len = strlen(name);
|
||||
const char *hostaliases;
|
||||
FILE *fp;
|
||||
char *line = NULL;
|
||||
@@ -224,41 +229,41 @@ static int single_domain(ares_channel channel, const char *name, char **s)
|
||||
/* The name might be a host alias. */
|
||||
hostaliases = getenv("HOSTALIASES");
|
||||
if (hostaliases)
|
||||
{
|
||||
fp = fopen(hostaliases, "r");
|
||||
if (fp)
|
||||
{
|
||||
while ((status = ares__read_line(fp, &line, &linesize))
|
||||
== ARES_SUCCESS)
|
||||
{
|
||||
if (strncasecmp(line, name, len) != 0 ||
|
||||
!isspace((unsigned char)line[len]))
|
||||
continue;
|
||||
p = line + len;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
if (*p)
|
||||
{
|
||||
q = p + 1;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
*s = malloc(q - p + 1);
|
||||
if (*s)
|
||||
{
|
||||
memcpy(*s, p, q - p);
|
||||
(*s)[q - p] = 0;
|
||||
}
|
||||
free(line);
|
||||
fclose(fp);
|
||||
return (*s) ? ARES_SUCCESS : ARES_ENOMEM;
|
||||
}
|
||||
}
|
||||
free(line);
|
||||
fclose(fp);
|
||||
if (status != ARES_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
}
|
||||
{
|
||||
fp = fopen(hostaliases, "r");
|
||||
if (fp)
|
||||
{
|
||||
while ((status = ares__read_line(fp, &line, &linesize))
|
||||
== ARES_SUCCESS)
|
||||
{
|
||||
if (strncasecmp(line, name, len) != 0 ||
|
||||
!isspace((unsigned char)line[len]))
|
||||
continue;
|
||||
p = line + len;
|
||||
while (isspace((unsigned char)*p))
|
||||
p++;
|
||||
if (*p)
|
||||
{
|
||||
q = p + 1;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
q++;
|
||||
*s = malloc(q - p + 1);
|
||||
if (*s)
|
||||
{
|
||||
memcpy(*s, p, q - p);
|
||||
(*s)[q - p] = 0;
|
||||
}
|
||||
free(line);
|
||||
fclose(fp);
|
||||
return (*s) ? ARES_SUCCESS : ARES_ENOMEM;
|
||||
}
|
||||
}
|
||||
free(line);
|
||||
fclose(fp);
|
||||
if (status != ARES_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (channel->flags & ARES_FLAG_NOSEARCH || channel->ndomains == 0)
|
||||
|
||||
@@ -24,8 +24,7 @@ ares_send \- Initiate a DNS query
|
||||
.B typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP,
|
||||
.B unsigned char *\fIabuf\fP, int \fIalen\fP)
|
||||
.PP
|
||||
.B
|
||||
void ares_send(ares_channel \fIchannel\fP, const unsigned char *\fIqbuf\fP,
|
||||
.B void ares_send(ares_channel \fIchannel\fP, const unsigned char *\fIqbuf\fP,
|
||||
.B int \fIqlen\fP, ares_callback \fIcallback\fP, void *\fIarg\fP)
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
|
||||
@@ -13,11 +13,10 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#include <netinet/in.h>
|
||||
@@ -32,7 +31,7 @@ static const char rcsid[] = "$Id$";
|
||||
#include "ares_private.h"
|
||||
|
||||
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;
|
||||
int i;
|
||||
|
||||
@@ -21,23 +21,16 @@ ares_strerror \- Get the description of an ares library error code
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B const char *ares_strerror(int \fIcode\fP, char **\fImemptr\fP)
|
||||
.B const char *ares_strerror(int \fIcode\fP)
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_strerror
|
||||
function gets the description of the ares library error code
|
||||
.IR code ,
|
||||
returning the result as a NUL-terminated C string. A pointer to
|
||||
allocated data necessary to compose the error description may be
|
||||
stored in the variable pointed to by
|
||||
.IR memptr .
|
||||
It is the caller's responsibility to invoke
|
||||
.BR ares_free_errmem (3)
|
||||
with the value of that variable when the error description is no
|
||||
longer needed.
|
||||
.SH SEE ALSO
|
||||
.BR ares_free_errmem (3)
|
||||
returning the result as a NUL-terminated C string.
|
||||
.SH NOTES
|
||||
This function is not compatible with ares.
|
||||
.SH AUTHOR
|
||||
Greg Hudson, MIT Information Systems
|
||||
.br
|
||||
|
||||
@@ -13,16 +13,13 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <assert.h>
|
||||
#include "ares.h"
|
||||
|
||||
const char *ares_strerror(int code, char **memptr)
|
||||
const char *ares_strerror(int code)
|
||||
{
|
||||
/* A future implementation may want to handle internationalization.
|
||||
* For now, just return a string literal from a table.
|
||||
*/
|
||||
/* Return a string literal from a table. */
|
||||
const char *errtext[] = {
|
||||
"Successful completion",
|
||||
"DNS server returned answer with no data",
|
||||
@@ -39,9 +36,11 @@ const char *ares_strerror(int code, char **memptr)
|
||||
"Timeout while contacting DNS servers",
|
||||
"End of file",
|
||||
"Error reading file",
|
||||
"Out of memory"
|
||||
"Out of memory",
|
||||
"Channel is being destroyed",
|
||||
"Misformatted string"
|
||||
};
|
||||
|
||||
assert(code >= 0 && code < (sizeof(errtext) / sizeof(*errtext)));
|
||||
assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)));
|
||||
return errtext[code];
|
||||
}
|
||||
|
||||
@@ -27,10 +27,8 @@ ares_fds \- Get file descriptors to select on for name service
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_timeout
|
||||
function determines the maximum time for which the caller should wait
|
||||
before invoking
|
||||
.BR ares_process (3)
|
||||
to process timeouts. The parameter
|
||||
function determines the maximum time for which the caller should wait before
|
||||
invoking \fIares_process(3)\fP to process timeouts. The parameter
|
||||
.I maxtv
|
||||
specifies a existing maximum timeout, or
|
||||
.B NULL
|
||||
|
||||
@@ -13,22 +13,20 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
static const char rcsid[] = "$Id$";
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#else
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
||||
struct timeval *tvbuf)
|
||||
struct timeval *tvbuf)
|
||||
{
|
||||
struct query *query;
|
||||
time_t now;
|
||||
@@ -44,12 +42,12 @@ struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
||||
for (query = channel->queries; query; query = query->next)
|
||||
{
|
||||
if (query->timeout == 0)
|
||||
continue;
|
||||
continue;
|
||||
offset = query->timeout - now;
|
||||
if (offset < 0)
|
||||
offset = 0;
|
||||
offset = 0;
|
||||
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
|
||||
|
||||
41
ares/ares_version.3
Normal file
41
ares/ares_version.3
Normal file
@@ -0,0 +1,41 @@
|
||||
.\" $Id$
|
||||
.\"
|
||||
.\" Copyright 2004 by Daniel Stenberg
|
||||
.\"
|
||||
.\" Permission to use, copy, modify, and distribute this
|
||||
.\" software and its documentation for any purpose and without
|
||||
.\" fee is hereby granted, provided that the above copyright
|
||||
.\" notice appear in all copies and that both that copyright
|
||||
.\" notice and this permission notice appear in supporting
|
||||
.\" documentation, and that the name of M.I.T. not be used in
|
||||
.\" advertising or publicity pertaining to distribution of the
|
||||
.\" software without specific, written prior permission.
|
||||
.\" M.I.T. makes no representations about the suitability of
|
||||
.\" this software for any purpose. It is provided "as is"
|
||||
.\" without express or implied warranty.
|
||||
.\"
|
||||
.TH ARES_VERSION 3 "29 January 2004"
|
||||
.SH NAME
|
||||
ares_version \- Get the version number of the library
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B const char *ares_version(int *\fIversion\fP)
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_version
|
||||
function gets the library version as a string and optionally as an integer
|
||||
stored in the
|
||||
.IR version ,
|
||||
argument. If you pass a NULL, no integer is attempted to be returned.
|
||||
|
||||
The integer is built up as 24bit number, with 8 separate bits used for major
|
||||
number, minor number and patch number. This makes a version string such as
|
||||
1.2.3 will be returned as the hexadecimal number 0x010203 (decimal 66051).
|
||||
.SH NOTES
|
||||
This function is not compatible with ares.
|
||||
.SH AUTHOR
|
||||
Daniel Stenberg
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
/* $Id$ */
|
||||
|
||||
#include "setup.h"
|
||||
#include "ares_version.h"
|
||||
|
||||
char *ares_version(int *version)
|
||||
const char *ares_version(int *version)
|
||||
{
|
||||
if(version)
|
||||
*version = ARES_VERSION;
|
||||
|
||||
@@ -4,14 +4,14 @@
|
||||
#define ARES__VERSION_H
|
||||
|
||||
#define ARES_VERSION_MAJOR 1
|
||||
#define ARES_VERSION_MINOR 0
|
||||
#define ARES_VERSION_MINOR 2
|
||||
#define ARES_VERSION_PATCH 0
|
||||
#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\
|
||||
(ARES_VERSION_MINOR<<8)|\
|
||||
(ARES_VERSION_PATCH))
|
||||
#define ARES_VERSION_STR "1.0.0"
|
||||
#define ARES_VERSION_STR "1.2.0"
|
||||
|
||||
char *ares_version(int *version);
|
||||
const char *ares_version(int *version);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
7
ares/buildconf
Executable file
7
ares/buildconf
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
libtoolize --copy --automake --force
|
||||
aclocal
|
||||
autoheader
|
||||
autoconf
|
||||
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
66
ares/configure.ac
Normal file
66
ares/configure.ac
Normal file
@@ -0,0 +1,66 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_INIT(ares_init.c)
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
AM_MAINTAINER_MODE
|
||||
AM_INIT_AUTOMAKE(c-ares, CVS)
|
||||
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
|
||||
case $host_os in
|
||||
solaris*)
|
||||
AC_DEFINE(ETC_INET, 1, [if a /etc/inet dir is being used])
|
||||
;;
|
||||
esac
|
||||
|
||||
# check for ssize_t
|
||||
AC_CHECK_TYPE(ssize_t, ,
|
||||
AC_DEFINE(ssize_t, int, [the signed version of size_t]))
|
||||
|
||||
AC_SEARCH_LIBS(gethostbyname, nsl)
|
||||
AC_SEARCH_LIBS(socket, socket)
|
||||
|
||||
dnl ************************************************************
|
||||
dnl Option to switch on debug options. This makes an assumption that
|
||||
dnl this is built as an 'ares' subdir in the curl source tree. Subject for
|
||||
dnl improval in the future!
|
||||
dnl
|
||||
AC_MSG_CHECKING([whether to enable debug options])
|
||||
AC_ARG_ENABLE(debug,
|
||||
AC_HELP_STRING([--enable-debug],[Enable pedantic debug options])
|
||||
AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||
[ case "$enableval" in
|
||||
no)
|
||||
AC_MSG_RESULT(no)
|
||||
;;
|
||||
*) AC_MSG_RESULT(yes)
|
||||
|
||||
dnl when doing the debug stuff, use static library only
|
||||
AC_DISABLE_SHARED
|
||||
|
||||
dnl Checks for standard header files, to make memdebug.h inclusions bettter
|
||||
AC_HEADER_STDC
|
||||
|
||||
CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I../include"
|
||||
CFLAGS="$CFLAGS -g"
|
||||
|
||||
dnl set compiler "debug" options to become more picky, and remove
|
||||
dnl optimize options from CFLAGS
|
||||
CURL_CC_DEBUG_OPTS
|
||||
|
||||
;;
|
||||
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 \
|
||||
)
|
||||
|
||||
AC_OUTPUT(Makefile)
|
||||
@@ -1,18 +0,0 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_INIT(ares_init.c)
|
||||
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_RANLIB
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
case $host_os in
|
||||
solaris*)
|
||||
AC_DEFINE(ETC_INET)
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SEARCH_LIBS(gethostbyname, nsl)
|
||||
AC_SEARCH_LIBS(socket, socket)
|
||||
|
||||
AC_OUTPUT(Makefile)
|
||||
88
ares/maketgz
88
ares/maketgz
@@ -13,81 +13,25 @@ if(!-f "ares.h") {
|
||||
}
|
||||
|
||||
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 {
|
||||
my ($file)=@_;
|
||||
my @p=split("/", $file);
|
||||
$p[$#p]=""; # blank the last one
|
||||
my $dir=join("/", @p);
|
||||
# now make the actual tarball
|
||||
print "running make dist\n";
|
||||
`make dist`;
|
||||
|
||||
$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("arescurl-$version/$_");
|
||||
# print "Create $dir\n";
|
||||
mkalldir($dir);
|
||||
# print "Copy $_ to $dir\n";
|
||||
`cp -p $_ $dir`;
|
||||
}
|
||||
|
||||
`tar -cf arescurl-$version.tar arescurl-$version`;
|
||||
`gzip -9 arescurl-$version.tar`;
|
||||
`rm -rf arescurl-$version`;
|
||||
print "NOTE: now cvs tag this release!\n";
|
||||
|
||||
@@ -1,12 +1,21 @@
|
||||
#ifndef ARES_NAMESER_H
|
||||
#define ARES_NAMESER_H
|
||||
|
||||
/* Windows-only header file provided by liren@vivisimo.com to make his Windows
|
||||
port build */
|
||||
|
||||
#ifndef NETWARE
|
||||
#include <windows.h>
|
||||
#include <process.h> /* for the _getpid() proto */
|
||||
#endif /* !NETWARE */
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifndef NETWARE
|
||||
|
||||
#define MAXHOSTNAMELEN 256
|
||||
|
||||
#define EINPROGRESS WSAEINPROGRESS
|
||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
|
||||
/* Structure for scatter/gather I/O. */
|
||||
struct iovec
|
||||
@@ -17,10 +26,16 @@ struct iovec
|
||||
|
||||
#define getpid() _getpid()
|
||||
|
||||
int strcasecmp(const char *a, const char *b);
|
||||
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; };
|
||||
|
||||
int ares_gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
#define gettimeofday(tv,tz) ares_gettimeofday(tv,tz)
|
||||
|
||||
#endif /* !NETWARE */
|
||||
|
||||
#define NS_CMPRSFLGS 0xc0
|
||||
|
||||
|
||||
@@ -154,6 +169,7 @@ typedef enum __ns_rcode {
|
||||
#define SERVFAIL ns_r_servfail
|
||||
#define NOTIMP ns_r_notimpl
|
||||
#define REFUSED ns_r_refused
|
||||
#undef NOERROR /* it seems this is already defined in winerror.h */
|
||||
#define NOERROR ns_r_noerror
|
||||
#define FORMERR ns_r_formerr
|
||||
#define NXDOMAIN ns_r_nxdomain
|
||||
@@ -204,3 +220,5 @@ typedef enum __ns_rcode {
|
||||
#define T_MAILB ns_t_mailb
|
||||
#define T_MAILA ns_t_maila
|
||||
#define T_ANY ns_t_any
|
||||
|
||||
#endif /* ARES_NAMESER_H */
|
||||
|
||||
72
ares/setup.h
Normal file
72
ares/setup.h
Normal file
@@ -0,0 +1,72 @@
|
||||
#ifndef ARES_SETUP_H
|
||||
#define ARES_SETUP_H
|
||||
|
||||
/* Copyright (C) 2004 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
|
||||
#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
|
||||
#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
|
||||
|
||||
#endif /* ARES_SETUP_H */
|
||||
@@ -7,19 +7,19 @@
|
||||
CFG=areslib - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "areslib.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "areslib.mak" CFG="areslib - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE "areslib - Win32 Release" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE "areslib - Win32 Debug" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
@@ -74,7 +74,7 @@ LIB32=link.exe -lib
|
||||
# ADD BASE LIB32 /nologo
|
||||
# ADD LIB32 /nologo
|
||||
|
||||
!ENDIF
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
@@ -109,10 +109,6 @@ SOURCE=..\..\ares_fds.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\ares_free_errmem.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\ares_free_hostent.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
@@ -1,361 +1,351 @@
|
||||
# Microsoft Developer Studio Generated NMAKE File, Based on areslib.dsp
|
||||
!IF "$(CFG)" == ""
|
||||
CFG=areslib - Win32 Debug
|
||||
!MESSAGE No configuration specified. Defaulting to areslib - Win32 Debug.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(CFG)" != "areslib - Win32 Release" && "$(CFG)" != "areslib - Win32 Debug"
|
||||
!MESSAGE Invalid configuration "$(CFG)" specified.
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "areslib.mak" CFG="areslib - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "areslib - Win32 Release" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE "areslib - Win32 Debug" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE
|
||||
!ERROR An invalid configuration is specified.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(OS)" == "Windows_NT"
|
||||
NULL=
|
||||
!ELSE
|
||||
NULL=nul
|
||||
!ENDIF
|
||||
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "areslib - Win32 Release"
|
||||
|
||||
OUTDIR=.\Release
|
||||
INTDIR=.\Release
|
||||
# Begin Custom Macros
|
||||
OutDir=.\Release
|
||||
# End Custom Macros
|
||||
|
||||
ALL : "$(OUTDIR)\areslib.lib"
|
||||
|
||||
|
||||
CLEAN :
|
||||
-@erase "$(INTDIR)\ares__close_sockets.obj"
|
||||
-@erase "$(INTDIR)\ares__get_hostent.obj"
|
||||
-@erase "$(INTDIR)\ares__read_line.obj"
|
||||
-@erase "$(INTDIR)\ares_destroy.obj"
|
||||
-@erase "$(INTDIR)\ares_expand_name.obj"
|
||||
-@erase "$(INTDIR)\ares_fds.obj"
|
||||
-@erase "$(INTDIR)\ares_free_errmem.obj"
|
||||
-@erase "$(INTDIR)\ares_free_hostent.obj"
|
||||
-@erase "$(INTDIR)\ares_free_string.obj"
|
||||
-@erase "$(INTDIR)\ares_gethostbyaddr.obj"
|
||||
-@erase "$(INTDIR)\ares_gethostbyname.obj"
|
||||
-@erase "$(INTDIR)\ares_init.obj"
|
||||
-@erase "$(INTDIR)\ares_mkquery.obj"
|
||||
-@erase "$(INTDIR)\ares_parse_a_reply.obj"
|
||||
-@erase "$(INTDIR)\ares_parse_ptr_reply.obj"
|
||||
-@erase "$(INTDIR)\ares_process.obj"
|
||||
-@erase "$(INTDIR)\ares_query.obj"
|
||||
-@erase "$(INTDIR)\ares_search.obj"
|
||||
-@erase "$(INTDIR)\ares_send.obj"
|
||||
-@erase "$(INTDIR)\ares_strerror.obj"
|
||||
-@erase "$(INTDIR)\ares_timeout.obj"
|
||||
-@erase "$(INTDIR)\vc60.idb"
|
||||
-@erase "$(INTDIR)\windows_port.obj"
|
||||
-@erase "$(OUTDIR)\areslib.lib"
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc"
|
||||
BSC32_SBRS= \
|
||||
|
||||
LIB32=link.exe -lib
|
||||
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib"
|
||||
LIB32_OBJS= \
|
||||
"$(INTDIR)\ares__close_sockets.obj" \
|
||||
"$(INTDIR)\ares__get_hostent.obj" \
|
||||
"$(INTDIR)\ares__read_line.obj" \
|
||||
"$(INTDIR)\ares_destroy.obj" \
|
||||
"$(INTDIR)\ares_expand_name.obj" \
|
||||
"$(INTDIR)\ares_fds.obj" \
|
||||
"$(INTDIR)\ares_free_errmem.obj" \
|
||||
"$(INTDIR)\ares_free_hostent.obj" \
|
||||
"$(INTDIR)\ares_free_string.obj" \
|
||||
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
||||
"$(INTDIR)\ares_gethostbyname.obj" \
|
||||
"$(INTDIR)\ares_init.obj" \
|
||||
"$(INTDIR)\ares_mkquery.obj" \
|
||||
"$(INTDIR)\ares_parse_a_reply.obj" \
|
||||
"$(INTDIR)\ares_parse_ptr_reply.obj" \
|
||||
"$(INTDIR)\ares_process.obj" \
|
||||
"$(INTDIR)\ares_query.obj" \
|
||||
"$(INTDIR)\ares_search.obj" \
|
||||
"$(INTDIR)\ares_send.obj" \
|
||||
"$(INTDIR)\ares_strerror.obj" \
|
||||
"$(INTDIR)\ares_timeout.obj" \
|
||||
"$(INTDIR)\windows_port.obj"
|
||||
|
||||
"$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
|
||||
$(LIB32) @<<
|
||||
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
|
||||
<<
|
||||
|
||||
!ELSEIF "$(CFG)" == "areslib - Win32 Debug"
|
||||
|
||||
OUTDIR=.\Debug
|
||||
INTDIR=.\Debug
|
||||
# Begin Custom Macros
|
||||
OutDir=.\Debug
|
||||
# End Custom Macros
|
||||
|
||||
ALL : "$(OUTDIR)\areslib.lib"
|
||||
|
||||
|
||||
CLEAN :
|
||||
-@erase "$(INTDIR)\ares__close_sockets.obj"
|
||||
-@erase "$(INTDIR)\ares__get_hostent.obj"
|
||||
-@erase "$(INTDIR)\ares__read_line.obj"
|
||||
-@erase "$(INTDIR)\ares_destroy.obj"
|
||||
-@erase "$(INTDIR)\ares_expand_name.obj"
|
||||
-@erase "$(INTDIR)\ares_fds.obj"
|
||||
-@erase "$(INTDIR)\ares_free_errmem.obj"
|
||||
-@erase "$(INTDIR)\ares_free_hostent.obj"
|
||||
-@erase "$(INTDIR)\ares_free_string.obj"
|
||||
-@erase "$(INTDIR)\ares_gethostbyaddr.obj"
|
||||
-@erase "$(INTDIR)\ares_gethostbyname.obj"
|
||||
-@erase "$(INTDIR)\ares_init.obj"
|
||||
-@erase "$(INTDIR)\ares_mkquery.obj"
|
||||
-@erase "$(INTDIR)\ares_parse_a_reply.obj"
|
||||
-@erase "$(INTDIR)\ares_parse_ptr_reply.obj"
|
||||
-@erase "$(INTDIR)\ares_process.obj"
|
||||
-@erase "$(INTDIR)\ares_query.obj"
|
||||
-@erase "$(INTDIR)\ares_search.obj"
|
||||
-@erase "$(INTDIR)\ares_send.obj"
|
||||
-@erase "$(INTDIR)\ares_strerror.obj"
|
||||
-@erase "$(INTDIR)\ares_timeout.obj"
|
||||
-@erase "$(INTDIR)\vc60.idb"
|
||||
-@erase "$(INTDIR)\vc60.pdb"
|
||||
-@erase "$(INTDIR)\windows_port.obj"
|
||||
-@erase "$(OUTDIR)\areslib.lib"
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc"
|
||||
BSC32_SBRS= \
|
||||
|
||||
LIB32=link.exe -lib
|
||||
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib"
|
||||
LIB32_OBJS= \
|
||||
"$(INTDIR)\ares__close_sockets.obj" \
|
||||
"$(INTDIR)\ares__get_hostent.obj" \
|
||||
"$(INTDIR)\ares__read_line.obj" \
|
||||
"$(INTDIR)\ares_destroy.obj" \
|
||||
"$(INTDIR)\ares_expand_name.obj" \
|
||||
"$(INTDIR)\ares_fds.obj" \
|
||||
"$(INTDIR)\ares_free_errmem.obj" \
|
||||
"$(INTDIR)\ares_free_hostent.obj" \
|
||||
"$(INTDIR)\ares_free_string.obj" \
|
||||
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
||||
"$(INTDIR)\ares_gethostbyname.obj" \
|
||||
"$(INTDIR)\ares_init.obj" \
|
||||
"$(INTDIR)\ares_mkquery.obj" \
|
||||
"$(INTDIR)\ares_parse_a_reply.obj" \
|
||||
"$(INTDIR)\ares_parse_ptr_reply.obj" \
|
||||
"$(INTDIR)\ares_process.obj" \
|
||||
"$(INTDIR)\ares_query.obj" \
|
||||
"$(INTDIR)\ares_search.obj" \
|
||||
"$(INTDIR)\ares_send.obj" \
|
||||
"$(INTDIR)\ares_strerror.obj" \
|
||||
"$(INTDIR)\ares_timeout.obj" \
|
||||
"$(INTDIR)\windows_port.obj"
|
||||
|
||||
"$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
|
||||
$(LIB32) @<<
|
||||
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
|
||||
<<
|
||||
|
||||
!ENDIF
|
||||
|
||||
.c{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.c{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
|
||||
!IF "$(NO_EXTERNAL_DEPS)" != "1"
|
||||
!IF EXISTS("areslib.dep")
|
||||
!INCLUDE "areslib.dep"
|
||||
!ELSE
|
||||
!MESSAGE Warning: cannot find "areslib.dep"
|
||||
!ENDIF
|
||||
!ENDIF
|
||||
|
||||
|
||||
!IF "$(CFG)" == "areslib - Win32 Release" || "$(CFG)" == "areslib - Win32 Debug"
|
||||
SOURCE=..\..\ares__close_sockets.c
|
||||
|
||||
"$(INTDIR)\ares__close_sockets.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares__get_hostent.c
|
||||
|
||||
"$(INTDIR)\ares__get_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares__read_line.c
|
||||
|
||||
"$(INTDIR)\ares__read_line.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_destroy.c
|
||||
|
||||
"$(INTDIR)\ares_destroy.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_expand_name.c
|
||||
|
||||
"$(INTDIR)\ares_expand_name.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_fds.c
|
||||
|
||||
"$(INTDIR)\ares_fds.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_free_errmem.c
|
||||
|
||||
"$(INTDIR)\ares_free_errmem.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_free_hostent.c
|
||||
|
||||
"$(INTDIR)\ares_free_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_free_string.c
|
||||
|
||||
"$(INTDIR)\ares_free_string.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_gethostbyaddr.c
|
||||
|
||||
"$(INTDIR)\ares_gethostbyaddr.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_gethostbyname.c
|
||||
|
||||
"$(INTDIR)\ares_gethostbyname.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_init.c
|
||||
|
||||
"$(INTDIR)\ares_init.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_mkquery.c
|
||||
|
||||
"$(INTDIR)\ares_mkquery.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_parse_a_reply.c
|
||||
|
||||
"$(INTDIR)\ares_parse_a_reply.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_parse_ptr_reply.c
|
||||
|
||||
"$(INTDIR)\ares_parse_ptr_reply.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_process.c
|
||||
|
||||
"$(INTDIR)\ares_process.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_query.c
|
||||
|
||||
"$(INTDIR)\ares_query.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_search.c
|
||||
|
||||
"$(INTDIR)\ares_search.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_send.c
|
||||
|
||||
"$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_strerror.c
|
||||
|
||||
"$(INTDIR)\ares_strerror.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_timeout.c
|
||||
|
||||
"$(INTDIR)\ares_timeout.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\windows_port.c
|
||||
|
||||
"$(INTDIR)\windows_port.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Microsoft Developer Studio Generated NMAKE File, Based on areslib.dsp
|
||||
!IF "$(CFG)" == ""
|
||||
CFG=areslib - Win32 Debug
|
||||
!MESSAGE No configuration specified. Defaulting to areslib - Win32 Debug.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(CFG)" != "areslib - Win32 Release" && "$(CFG)" != "areslib - Win32 Debug"
|
||||
!MESSAGE Invalid configuration "$(CFG)" specified.
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "areslib.mak" CFG="areslib - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "areslib - Win32 Release" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE "areslib - Win32 Debug" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE
|
||||
!ERROR An invalid configuration is specified.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(OS)" == "Windows_NT"
|
||||
NULL=
|
||||
!ELSE
|
||||
NULL=nul
|
||||
!ENDIF
|
||||
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "areslib - Win32 Release"
|
||||
|
||||
OUTDIR=.\Release
|
||||
INTDIR=.\Release
|
||||
# Begin Custom Macros
|
||||
OutDir=.\Release
|
||||
# End Custom Macros
|
||||
|
||||
ALL : "$(OUTDIR)\areslib.lib"
|
||||
|
||||
|
||||
CLEAN :
|
||||
-@erase "$(INTDIR)\ares__close_sockets.obj"
|
||||
-@erase "$(INTDIR)\ares__get_hostent.obj"
|
||||
-@erase "$(INTDIR)\ares__read_line.obj"
|
||||
-@erase "$(INTDIR)\ares_destroy.obj"
|
||||
-@erase "$(INTDIR)\ares_expand_name.obj"
|
||||
-@erase "$(INTDIR)\ares_fds.obj"
|
||||
-@erase "$(INTDIR)\ares_free_hostent.obj"
|
||||
-@erase "$(INTDIR)\ares_free_string.obj"
|
||||
-@erase "$(INTDIR)\ares_gethostbyaddr.obj"
|
||||
-@erase "$(INTDIR)\ares_gethostbyname.obj"
|
||||
-@erase "$(INTDIR)\ares_init.obj"
|
||||
-@erase "$(INTDIR)\ares_mkquery.obj"
|
||||
-@erase "$(INTDIR)\ares_parse_a_reply.obj"
|
||||
-@erase "$(INTDIR)\ares_parse_ptr_reply.obj"
|
||||
-@erase "$(INTDIR)\ares_process.obj"
|
||||
-@erase "$(INTDIR)\ares_query.obj"
|
||||
-@erase "$(INTDIR)\ares_search.obj"
|
||||
-@erase "$(INTDIR)\ares_send.obj"
|
||||
-@erase "$(INTDIR)\ares_strerror.obj"
|
||||
-@erase "$(INTDIR)\ares_timeout.obj"
|
||||
-@erase "$(INTDIR)\vc60.idb"
|
||||
-@erase "$(INTDIR)\windows_port.obj"
|
||||
-@erase "$(OUTDIR)\areslib.lib"
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc"
|
||||
BSC32_SBRS= \
|
||||
|
||||
LIB32=link.exe -lib
|
||||
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib"
|
||||
LIB32_OBJS= \
|
||||
"$(INTDIR)\ares__close_sockets.obj" \
|
||||
"$(INTDIR)\ares__get_hostent.obj" \
|
||||
"$(INTDIR)\ares__read_line.obj" \
|
||||
"$(INTDIR)\ares_destroy.obj" \
|
||||
"$(INTDIR)\ares_expand_name.obj" \
|
||||
"$(INTDIR)\ares_fds.obj" \
|
||||
"$(INTDIR)\ares_free_hostent.obj" \
|
||||
"$(INTDIR)\ares_free_string.obj" \
|
||||
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
||||
"$(INTDIR)\ares_gethostbyname.obj" \
|
||||
"$(INTDIR)\ares_init.obj" \
|
||||
"$(INTDIR)\ares_mkquery.obj" \
|
||||
"$(INTDIR)\ares_parse_a_reply.obj" \
|
||||
"$(INTDIR)\ares_parse_ptr_reply.obj" \
|
||||
"$(INTDIR)\ares_process.obj" \
|
||||
"$(INTDIR)\ares_query.obj" \
|
||||
"$(INTDIR)\ares_search.obj" \
|
||||
"$(INTDIR)\ares_send.obj" \
|
||||
"$(INTDIR)\ares_strerror.obj" \
|
||||
"$(INTDIR)\ares_timeout.obj" \
|
||||
"$(INTDIR)\windows_port.obj"
|
||||
|
||||
"$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
|
||||
$(LIB32) @<<
|
||||
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
|
||||
<<
|
||||
|
||||
!ELSEIF "$(CFG)" == "areslib - Win32 Debug"
|
||||
|
||||
OUTDIR=.\Debug
|
||||
INTDIR=.\Debug
|
||||
# Begin Custom Macros
|
||||
OutDir=.\Debug
|
||||
# End Custom Macros
|
||||
|
||||
ALL : "$(OUTDIR)\areslib.lib"
|
||||
|
||||
|
||||
CLEAN :
|
||||
-@erase "$(INTDIR)\ares__close_sockets.obj"
|
||||
-@erase "$(INTDIR)\ares__get_hostent.obj"
|
||||
-@erase "$(INTDIR)\ares__read_line.obj"
|
||||
-@erase "$(INTDIR)\ares_destroy.obj"
|
||||
-@erase "$(INTDIR)\ares_expand_name.obj"
|
||||
-@erase "$(INTDIR)\ares_fds.obj"
|
||||
-@erase "$(INTDIR)\ares_free_hostent.obj"
|
||||
-@erase "$(INTDIR)\ares_free_string.obj"
|
||||
-@erase "$(INTDIR)\ares_gethostbyaddr.obj"
|
||||
-@erase "$(INTDIR)\ares_gethostbyname.obj"
|
||||
-@erase "$(INTDIR)\ares_init.obj"
|
||||
-@erase "$(INTDIR)\ares_mkquery.obj"
|
||||
-@erase "$(INTDIR)\ares_parse_a_reply.obj"
|
||||
-@erase "$(INTDIR)\ares_parse_ptr_reply.obj"
|
||||
-@erase "$(INTDIR)\ares_process.obj"
|
||||
-@erase "$(INTDIR)\ares_query.obj"
|
||||
-@erase "$(INTDIR)\ares_search.obj"
|
||||
-@erase "$(INTDIR)\ares_send.obj"
|
||||
-@erase "$(INTDIR)\ares_strerror.obj"
|
||||
-@erase "$(INTDIR)\ares_timeout.obj"
|
||||
-@erase "$(INTDIR)\vc60.idb"
|
||||
-@erase "$(INTDIR)\vc60.pdb"
|
||||
-@erase "$(INTDIR)\windows_port.obj"
|
||||
-@erase "$(OUTDIR)\areslib.lib"
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc"
|
||||
BSC32_SBRS= \
|
||||
|
||||
LIB32=link.exe -lib
|
||||
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib"
|
||||
LIB32_OBJS= \
|
||||
"$(INTDIR)\ares__close_sockets.obj" \
|
||||
"$(INTDIR)\ares__get_hostent.obj" \
|
||||
"$(INTDIR)\ares__read_line.obj" \
|
||||
"$(INTDIR)\ares_destroy.obj" \
|
||||
"$(INTDIR)\ares_expand_name.obj" \
|
||||
"$(INTDIR)\ares_fds.obj" \
|
||||
"$(INTDIR)\ares_free_hostent.obj" \
|
||||
"$(INTDIR)\ares_free_string.obj" \
|
||||
"$(INTDIR)\ares_gethostbyaddr.obj" \
|
||||
"$(INTDIR)\ares_gethostbyname.obj" \
|
||||
"$(INTDIR)\ares_init.obj" \
|
||||
"$(INTDIR)\ares_mkquery.obj" \
|
||||
"$(INTDIR)\ares_parse_a_reply.obj" \
|
||||
"$(INTDIR)\ares_parse_ptr_reply.obj" \
|
||||
"$(INTDIR)\ares_process.obj" \
|
||||
"$(INTDIR)\ares_query.obj" \
|
||||
"$(INTDIR)\ares_search.obj" \
|
||||
"$(INTDIR)\ares_send.obj" \
|
||||
"$(INTDIR)\ares_strerror.obj" \
|
||||
"$(INTDIR)\ares_timeout.obj" \
|
||||
"$(INTDIR)\windows_port.obj"
|
||||
|
||||
"$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
|
||||
$(LIB32) @<<
|
||||
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
|
||||
<<
|
||||
|
||||
!ENDIF
|
||||
|
||||
.c{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.c{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
|
||||
!IF "$(NO_EXTERNAL_DEPS)" != "1"
|
||||
!IF EXISTS("areslib.dep")
|
||||
!INCLUDE "areslib.dep"
|
||||
!ELSE
|
||||
!MESSAGE Warning: cannot find "areslib.dep"
|
||||
!ENDIF
|
||||
!ENDIF
|
||||
|
||||
|
||||
!IF "$(CFG)" == "areslib - Win32 Release" || "$(CFG)" == "areslib - Win32 Debug"
|
||||
SOURCE=..\..\ares__close_sockets.c
|
||||
|
||||
"$(INTDIR)\ares__close_sockets.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares__get_hostent.c
|
||||
|
||||
"$(INTDIR)\ares__get_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares__read_line.c
|
||||
|
||||
"$(INTDIR)\ares__read_line.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_destroy.c
|
||||
|
||||
"$(INTDIR)\ares_destroy.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_expand_name.c
|
||||
|
||||
"$(INTDIR)\ares_expand_name.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_fds.c
|
||||
|
||||
"$(INTDIR)\ares_fds.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_free_hostent.c
|
||||
|
||||
"$(INTDIR)\ares_free_hostent.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_free_string.c
|
||||
|
||||
"$(INTDIR)\ares_free_string.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_gethostbyaddr.c
|
||||
|
||||
"$(INTDIR)\ares_gethostbyaddr.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_gethostbyname.c
|
||||
|
||||
"$(INTDIR)\ares_gethostbyname.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_init.c
|
||||
|
||||
"$(INTDIR)\ares_init.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_mkquery.c
|
||||
|
||||
"$(INTDIR)\ares_mkquery.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_parse_a_reply.c
|
||||
|
||||
"$(INTDIR)\ares_parse_a_reply.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_parse_ptr_reply.c
|
||||
|
||||
"$(INTDIR)\ares_parse_ptr_reply.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_process.c
|
||||
|
||||
"$(INTDIR)\ares_process.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_query.c
|
||||
|
||||
"$(INTDIR)\ares_query.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_search.c
|
||||
|
||||
"$(INTDIR)\ares_search.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_send.c
|
||||
|
||||
"$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_strerror.c
|
||||
|
||||
"$(INTDIR)\ares_strerror.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\ares_timeout.c
|
||||
|
||||
"$(INTDIR)\ares_timeout.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=..\..\windows_port.c
|
||||
|
||||
"$(INTDIR)\windows_port.obj" : $(SOURCE) "$(INTDIR)"
|
||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
|
||||
BIN
ares/vc/vc.ncb
BIN
ares/vc/vc.ncb
Binary file not shown.
BIN
ares/vc/vc.opt
BIN
ares/vc/vc.opt
Binary file not shown.
@@ -1,14 +1,28 @@
|
||||
#include "setup.h"
|
||||
|
||||
/* only do the following on windows
|
||||
*/
|
||||
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <malloc.h>
|
||||
|
||||
#ifdef WATT32
|
||||
#include <sys/socket.h>
|
||||
#else
|
||||
#include "nameser.h"
|
||||
#endif
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#ifndef __MINGW32__
|
||||
int
|
||||
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++) {
|
||||
int c1 = isupper(a[i]) ? tolower(a[i]) : a[i];
|
||||
@@ -19,13 +33,14 @@ strncasecmp(const char *a, const char *b, size_t n)
|
||||
}
|
||||
|
||||
int
|
||||
strcasecmp(const char *a, const char *b)
|
||||
ares_strcasecmp(const char *a, const char *b)
|
||||
{
|
||||
return strncasecmp(a, b, strlen(a)+1);
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
ares_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
int
|
||||
ares_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
{
|
||||
FILETIME ft;
|
||||
LARGE_INTEGER li;
|
||||
@@ -38,24 +53,47 @@ ares_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
li.LowPart = ft.dwLowDateTime;
|
||||
li.HighPart = ft.dwHighDateTime;
|
||||
t = li.QuadPart; /* In 100-nanosecond intervals */
|
||||
//t -= EPOCHFILETIME; /* Offset to the Epoch time */
|
||||
#if 0
|
||||
t -= EPOCHFILETIME; /* Offset to the Epoch time */
|
||||
#endif
|
||||
t /= 10; /* In microseconds */
|
||||
tv->tv_sec = (long)(t / 1000000);
|
||||
tv->tv_usec = (long)(t % 1000000);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (tz)
|
||||
{
|
||||
if (!tzflag)
|
||||
{
|
||||
_tzset();
|
||||
tzflag++;
|
||||
}
|
||||
tz->tz_minuteswest = _timezone / 60;
|
||||
tz->tz_dsttime = _daylight;
|
||||
}
|
||||
#endif
|
||||
|
||||
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 */
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
$!
|
||||
$
|
||||
$ on control_y then goto Common_Exit!
|
||||
$ orig = f$environment("DEFAULT")
|
||||
$ loc = f$environment("PROCEDURE")
|
||||
$ def = f$parse("X.X;1",loc) - "X.X;1"
|
||||
$
|
||||
$ set def 'def'
|
||||
$ cc_qual = "/define=HAVE_CONFIG_H=1/include=(""../include/"",""../"",""../../openssl-0_9_7/include/"")"
|
||||
$ if p1 .eqs. "LISTING" then cc_qual = cc_qual + "/LIST/MACHINE"
|
||||
$ if p1 .eqs. "DEBUG" then cc_qual = cc_qual + "/LIST/MACHINE/DEBUG"
|
||||
$ msg_qual = ""
|
||||
$ call build "[.lib]" "*.c"
|
||||
$ call build "[.src]" "*.c"
|
||||
$ call build "[.src]" "*.msg"
|
||||
$ link /exe=curl.exe [.src]curl/lib/include=main,[.lib]curl/lib, -
|
||||
[-.openssl-0_9_7.axp.exe.ssl]libssl/lib, -
|
||||
[-.openssl-0_9_7.axp.exe.crypto]libcrypto/lib
|
||||
$
|
||||
$
|
||||
$ goto Common_Exit
|
||||
$build: subroutine
|
||||
$ set noon
|
||||
$ set default 'p1'
|
||||
$ search = p2
|
||||
$ reset = f$search("reset")
|
||||
$ if f$search("CURL.OLB") .eqs. ""
|
||||
$ then
|
||||
$ LIB/CREATE/OBJECT CURL.OLB
|
||||
$ endif
|
||||
$ reset = f$search("reset",1)
|
||||
$Loop:
|
||||
$ file = f$search(search,1)
|
||||
$ if file .eqs. "" then goto EndLoop
|
||||
$ obj = f$search(f$parse(".OBJ;",file),2)
|
||||
$ if (obj .nes. "")
|
||||
$ then
|
||||
$ if (f$cvtime(f$file(file,"rdt")) .gts. f$cvtime(f$file(obj,"rdt")))
|
||||
$ then
|
||||
$ call compile 'file'
|
||||
$ lib/object curl.OLB 'f$parse(".obj;",file)'
|
||||
$ else
|
||||
$! write sys$output "File: ''file' is up to date"
|
||||
$ endif
|
||||
$ else
|
||||
$! write sys$output "Object for file: ''file' does not exist"
|
||||
$ call compile 'file'
|
||||
$ lib/object curl.OLB 'f$parse(".obj;",file)'
|
||||
$ endif
|
||||
$ goto Loop
|
||||
$EndLoop:
|
||||
$ purge
|
||||
$ set def 'def'
|
||||
$ endsubroutine ! Build
|
||||
$
|
||||
$compile: subroutine
|
||||
$ set noon
|
||||
$ file = p1
|
||||
$ qual = p2+p3+p4+p5+p6+p7+p8
|
||||
$ typ = f$parse(file,,,"TYPE") - "."
|
||||
$ cmd_c = "CC "+cc_qual
|
||||
$ cmd_msg = "MESSAGE "+msg_qual
|
||||
$ x = cmd_'typ'
|
||||
$ 'x' 'file'
|
||||
$ ENDSUBROUTINE ! Compile
|
||||
$
|
||||
$Common_Exit:
|
||||
$ set default 'orig'
|
||||
$ exit
|
||||
63
buildconf
63
buildconf
@@ -5,6 +5,21 @@ die(){
|
||||
exit
|
||||
}
|
||||
|
||||
# this works as 'which' but we use a different name to make it more obvious we
|
||||
# aren't using 'which'! ;-)
|
||||
findtool(){
|
||||
file="$1"
|
||||
|
||||
IFS=":"
|
||||
for path in $PATH
|
||||
do
|
||||
if test -r "$path/$file"; then
|
||||
echo "$path/$file"
|
||||
return
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# autoconf 2.57 or newer
|
||||
#
|
||||
@@ -52,7 +67,7 @@ echo "buildconf: autoheader version $ah_version (ok)"
|
||||
# automake 1.7 or newer
|
||||
#
|
||||
need_automake="1.7"
|
||||
am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
||||
am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'`
|
||||
if test -z "$am_version"; then
|
||||
echo "buildconf: automake not found."
|
||||
echo " You need automake version $need_automake or newer installed."
|
||||
@@ -79,11 +94,17 @@ LIBTOOL_WANTED_MINOR=4
|
||||
LIBTOOL_WANTED_PATCH=2
|
||||
LIBTOOL_WANTED_VERSION=1.4.2
|
||||
|
||||
libtool=`which glibtool 2>/dev/null`
|
||||
# this approach that tries 'glibtool' first is some kind of work-around for
|
||||
# some BSD-systems I believe that use to provide the GNU libtool named
|
||||
# glibtool, with 'libtool' being something completely different.
|
||||
libtool=`findtool glibtool 2>/dev/null`
|
||||
if test ! -x "$libtool"; then
|
||||
libtool=`which libtool`
|
||||
libtool=`findtool libtool`
|
||||
fi
|
||||
#lt_pversion=`${LIBTOOL:-$libtool} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
||||
|
||||
# set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found
|
||||
LIBTOOLIZE="${libtool}ize"
|
||||
|
||||
lt_pversion=`$libtool --version 2>/dev/null|head -1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'`
|
||||
if test -z "$lt_pversion"; then
|
||||
echo "buildconf: libtool not found."
|
||||
@@ -121,26 +142,46 @@ fi
|
||||
|
||||
echo "buildconf: libtool version $lt_version (ok)"
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# m4 check
|
||||
#
|
||||
m4=`${M4:-m4} --version 2>/dev/null|head -1`;
|
||||
m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
||||
|
||||
if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then
|
||||
echo "buildconf: GNU m4 version $m4_version (ok)"
|
||||
else
|
||||
echo "buildconf: m4 version $m4 found. You need a GNU m4 installed!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# ------------------------------------------------------------
|
||||
|
||||
# run the correct scripts now
|
||||
|
||||
echo "buildconf: running libtoolize"
|
||||
${LIBTOOLIZE:-libtoolize} --copy --automake || die "The command '${LIBTOOLIZE:-libtoolize} --copy --automake' failed"
|
||||
${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed"
|
||||
echo "buildconf: running aclocal"
|
||||
${ACLOCAL:-aclocal} || die "The command '${AUTOHEADER:-aclocal}' failed"
|
||||
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The aclocal command line failed"
|
||||
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
|
||||
echo "buildconf: running autoheader"
|
||||
${AUTOHEADER:-autoheader} || die "The command '${AUTOHEADER:-autoheader}' failed"
|
||||
${AUTOHEADER:-autoheader} || die "The autoheader command failed"
|
||||
echo "buildconf: running autoconf"
|
||||
${AUTOCONF:-autoconf} || die "The command '${AUTOCONF:-autoconf}' failed"
|
||||
${AUTOCONF:-autoconf} || die "The autoconf command failed"
|
||||
|
||||
if test -d ares; then
|
||||
echo "buildconf: running autoconf in the ares directory"
|
||||
cd ares
|
||||
${AUTOCONF:-autoconf} || die "The command '${AUTOCONF:-autoconf}' failed"
|
||||
echo "buildconf: running aclocal in the ares directory"
|
||||
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed"
|
||||
echo "buildconf: running autoconf in the ares directory"
|
||||
${AUTOCONF:-autoconf} || die "The ares autoconf command failed"
|
||||
cd ..
|
||||
fi
|
||||
|
||||
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"
|
||||
exit 0
|
||||
|
||||
14
buildconf.bat
Normal file
14
buildconf.bat
Normal file
@@ -0,0 +1,14 @@
|
||||
@echo off
|
||||
REM set up a CVS tree to build when there's no autotools
|
||||
REM $Revision$
|
||||
REM $Date$
|
||||
|
||||
REM create 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
|
||||
|
||||
REM create hugehelp.c
|
||||
copy src\hugehelp.c.cvs src\hugehelp.c
|
||||
|
||||
REM create Makefile
|
||||
copy Makefile.dist Makefile
|
||||
638
configure.ac
638
configure.ac
@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
|
||||
AC_PREREQ(2.57)
|
||||
|
||||
dnl We don't know the version number "staticly" so we use a dash here
|
||||
AC_INIT(curl, [-], [curl-bug@haxx.se])
|
||||
AC_INIT(curl, [-], [a suitable curl mailing list => http://curl.haxx.se/mail/])
|
||||
|
||||
dnl configure script copyright
|
||||
AC_COPYRIGHT([Copyright (c) 1998 - 2004 Daniel Stenberg, <daniel@haxx.se>
|
||||
@@ -16,22 +16,34 @@ AM_CONFIG_HEADER(lib/config.h src/config.h)
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
dnl SED is needed by some of the tools
|
||||
AC_PATH_PROG( SED, sed, , $PATH:/usr/bin:/usr/local/bin)
|
||||
AC_PATH_PROG( SED, sed, sed-was-not-found-by-configure,
|
||||
$PATH:/usr/bin:/usr/local/bin)
|
||||
AC_SUBST(SED)
|
||||
|
||||
if test "x$SED" = "xsed-was-not-found-by-configure"; then
|
||||
AC_MSG_WARN([sed was not found, this may ruin your chances to build fine])
|
||||
fi
|
||||
|
||||
dnl AR is used by libtool, and try the odd Solaris path too
|
||||
AC_PATH_PROG( AR, ar, , $PATH:/usr/bin:/usr/local/bin:/usr/ccs/bin)
|
||||
dnl we use AC_CHECK_TOOL since this should make a library for the target
|
||||
dnl platform
|
||||
AC_CHECK_TOOL(AR, ar,
|
||||
ar-was-not-found-by-configure,
|
||||
$PATH:/usr/bin:/usr/local/bin:/usr/ccs/bin)
|
||||
AC_SUBST(AR)
|
||||
if test "x$AR" = "xar-was-not-found-by-configure"; then
|
||||
AC_MSG_WARN([ar was not found, this may ruin your chances to build fine])
|
||||
fi
|
||||
|
||||
dnl figure out the libcurl version
|
||||
VERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curl.h`
|
||||
VERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curlver.h`
|
||||
AM_INIT_AUTOMAKE(curl,$VERSION)
|
||||
AC_MSG_CHECKING([curl version])
|
||||
AC_MSG_RESULT($VERSION)
|
||||
|
||||
dnl
|
||||
dnl we extract the numerical version for curl-config only
|
||||
VERSIONNUM=`$SED -ne 's/^#define LIBCURL_VERSION_NUM 0x\(.*\)/\1/p' ${srcdir}/include/curl/curl.h`
|
||||
VERSIONNUM=`$SED -ne 's/^#define LIBCURL_VERSION_NUM 0x\(.*\)/\1/p' ${srcdir}/include/curl/curlver.h`
|
||||
AC_SUBST(VERSIONNUM)
|
||||
|
||||
dnl Solaris pkgadd support definitions
|
||||
@@ -42,6 +54,17 @@ AC_SUBST(PKGADD_PKG)
|
||||
AC_SUBST(PKGADD_NAME)
|
||||
AC_SUBST(PKGADD_VENDOR)
|
||||
|
||||
dnl
|
||||
dnl initialize all the info variables to 'no'
|
||||
curl_ssl_msg="no (--with-ssl)"
|
||||
curl_zlib_msg="no (--with-zlib)"
|
||||
curl_krb4_msg="no (--with-krb4*)"
|
||||
curl_gss_msg="no (--with-gssapi)"
|
||||
curl_spnego_msg="no (--with-spnego)"
|
||||
curl_ares_msg="no (--enable-ares)"
|
||||
curl_ipv6_msg="no (--enable-ipv6)"
|
||||
curl_idn_msg="no (--with-libidn)"
|
||||
curl_manual_msg="no (--enable-manual)"
|
||||
|
||||
dnl
|
||||
dnl Detect the canonical host and target build environment
|
||||
@@ -64,7 +87,7 @@ dnl check for cygwin stuff
|
||||
AC_LIBTOOL_WIN32_DLL
|
||||
|
||||
dnl libtool setup
|
||||
AM_PROG_LIBTOOL
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
AC_MSG_CHECKING([if we need -no-undefined])
|
||||
case $host in
|
||||
@@ -79,6 +102,7 @@ AC_MSG_RESULT($need_no_undefined)
|
||||
AM_CONDITIONAL(NO_UNDEFINED, test x$need_no_undefined = xyes)
|
||||
|
||||
AC_MSG_CHECKING([if we need -mimpure-text])
|
||||
mimpure=no
|
||||
case $host in
|
||||
*-*-solaris2*)
|
||||
if test "$GCC" = "yes"; then
|
||||
@@ -86,7 +110,6 @@ case $host in
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
mimpure=no
|
||||
;;
|
||||
esac
|
||||
AC_MSG_RESULT($mimpure)
|
||||
@@ -208,37 +231,92 @@ AC_HELP_STRING([--disable-telnet],[Disable TELNET support]),
|
||||
AC_MSG_RESULT(yes)
|
||||
)
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for built-in manual
|
||||
dnl **********************************************************************
|
||||
|
||||
AC_MSG_CHECKING([whether to provide built-in manual])
|
||||
AC_ARG_ENABLE(manual,
|
||||
AC_HELP_STRING([--enable-manual],[Enable built-in manual])
|
||||
AC_HELP_STRING([--disable-manual],[Disable built-in manual]),
|
||||
[ case "$enableval" in
|
||||
no)
|
||||
AC_MSG_RESULT(no)
|
||||
;;
|
||||
*) AC_MSG_RESULT(yes)
|
||||
USE_MANUAL="1"
|
||||
;;
|
||||
esac ],
|
||||
AC_MSG_RESULT(yes)
|
||||
USE_MANUAL="1"
|
||||
)
|
||||
dnl The actual use of the USE_MANUAL variable is done much later in this
|
||||
dnl script to allow other actions to disable it as well.
|
||||
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Checks for libraries.
|
||||
dnl **********************************************************************
|
||||
|
||||
dnl gethostbyname in the nsl lib?
|
||||
AC_CHECK_FUNC(gethostbyname, , [ AC_CHECK_LIB(nsl, gethostbyname) ])
|
||||
dnl gethostbyname without lib or in the nsl lib?
|
||||
AC_CHECK_FUNC(gethostbyname,
|
||||
[HAVE_GETHOSTBYNAME="1"
|
||||
],
|
||||
[ AC_CHECK_LIB(nsl, gethostbyname,
|
||||
[HAVE_GETHOSTBYNAME="1"
|
||||
LIBS="$LIBS -lnsl"
|
||||
])
|
||||
])
|
||||
|
||||
if test "$ac_cv_lib_nsl_gethostbyname" != "yes" -a "$ac_cv_func_gethostbyname" != "yes"; then
|
||||
if test "$HAVE_GETHOSTBYNAME" != "1"
|
||||
then
|
||||
dnl gethostbyname in the socket lib?
|
||||
AC_CHECK_FUNC(gethostbyname, , [ AC_CHECK_LIB(socket, gethostbyname) ])
|
||||
AC_CHECK_LIB(socket, gethostbyname,
|
||||
[HAVE_GETHOSTBYNAME="1"
|
||||
LIBS="$LIBS -lsocket"
|
||||
])
|
||||
fi
|
||||
|
||||
dnl At least one system has been identified to require BOTH nsl and
|
||||
dnl socket libs to link properly.
|
||||
if test "$ac_cv_lib_nsl_gethostbyname" != "yes" -a "$ac_cv_lib_socket_gethostbyname" != "yes" -a "$ac_cv_func_gethostbyname" != "yes"; then
|
||||
AC_MSG_CHECKING([trying both nsl and socket libs])
|
||||
dnl At least one system has been identified to require BOTH nsl and socket
|
||||
dnl libs at the same time to link properly.
|
||||
if test "$HAVE_GETHOSTBYNAME" != "1"
|
||||
then
|
||||
AC_MSG_CHECKING([for gethostbyname with both nsl and socket libs])
|
||||
my_ac_save_LIBS=$LIBS
|
||||
LIBS="-lnsl -lsocket $LIBS"
|
||||
AC_TRY_LINK( ,
|
||||
[gethostbyname();],
|
||||
my_ac_link_result=success,
|
||||
my_ac_link_result=failure )
|
||||
[ dnl found it!
|
||||
HAVE_GETHOSTBYNAME="1"
|
||||
AC_MSG_RESULT([yes])],
|
||||
[ dnl failed!
|
||||
AC_MSG_RESULT([no])
|
||||
dnl restore LIBS
|
||||
LIBS=$my_ac_save_LIBS]
|
||||
)
|
||||
fi
|
||||
|
||||
if test "$my_ac_link_result" = "failure"; then
|
||||
AC_MSG_RESULT([no])
|
||||
AC_MSG_ERROR([couldn't find libraries for gethostbyname()])
|
||||
dnl restore LIBS
|
||||
LIBS=$my_ac_save_LIBS
|
||||
else
|
||||
AC_MSG_RESULT([yes])
|
||||
fi
|
||||
if test "$HAVE_GETHOSTBYNAME" != "1"
|
||||
then
|
||||
dnl This is for Msys/Mingw
|
||||
AC_MSG_CHECKING([for gethostbyname in ws2_32])
|
||||
my_ac_save_LIBS=$LIBS
|
||||
LIBS="-lws2_32 $LIBS"
|
||||
AC_TRY_LINK([#include <winsock2.h>],
|
||||
[gethostbyname("www.dummysite.com");],
|
||||
[ dnl worked!
|
||||
AC_MSG_RESULT([yes])
|
||||
HAVE_GETHOSTBYNAME="1"],
|
||||
[ dnl failed, restore LIBS
|
||||
LIBS=$my_ac_save_LIBS
|
||||
AC_MSG_RESULT(no)]
|
||||
)
|
||||
fi
|
||||
|
||||
if test "$HAVE_GETHOSTBYNAME" = "1"; then
|
||||
AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [If you have gethostbyname])
|
||||
else
|
||||
AC_MSG_ERROR([couldn't find libraries for gethostbyname()])
|
||||
fi
|
||||
|
||||
dnl resolve lib?
|
||||
@@ -271,6 +349,25 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the presence of the winmm library.
|
||||
dnl **********************************************************************
|
||||
|
||||
AC_MSG_CHECKING([for timeGetTime in winmm])
|
||||
my_ac_save_LIBS=$LIBS
|
||||
LIBS="-lwinmm $LIBS"
|
||||
AC_TRY_LINK([#include <windef.h>
|
||||
#include <mmsystem.h>
|
||||
],
|
||||
[timeGetTime();],
|
||||
[ dnl worked!
|
||||
AC_MSG_RESULT([yes])
|
||||
],
|
||||
[ dnl failed, restore LIBS
|
||||
LIBS=$my_ac_save_LIBS
|
||||
AC_MSG_RESULT(no)]
|
||||
)
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Checks for IPv6
|
||||
dnl **********************************************************************
|
||||
@@ -309,7 +406,11 @@ main()
|
||||
))
|
||||
|
||||
if test "$ipv6" = "yes"; then
|
||||
curl_ipv6_msg="enabled"
|
||||
|
||||
CURL_CHECK_WORKING_GETADDRINFO
|
||||
|
||||
CURL_CHECK_NI_WITHSCOPEID
|
||||
fi
|
||||
|
||||
dnl **********************************************************************
|
||||
@@ -416,8 +517,8 @@ AC_HELP_STRING([--with-krb4=DIR],[where to look for Kerberos4]),[
|
||||
OPT_KRB4="$withval"
|
||||
if test X"$OPT_KRB4" != Xyes
|
||||
then
|
||||
LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib"
|
||||
KRB4LIB="$OPT_KRB4/lib"
|
||||
LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib$libsuff"
|
||||
KRB4LIB="$OPT_KRB4/lib$libsuff"
|
||||
CPPFLAGS="$CPPFLAGS -I$OPT_KRB4/include"
|
||||
KRB4INC="$OPT_KRB4/include"
|
||||
fi
|
||||
@@ -459,7 +560,7 @@ then
|
||||
AC_CHECK_HEADERS(krb.h)
|
||||
|
||||
dnl we found the required libraries, add to LIBS
|
||||
LIBS="-lkrb -ldes $LIBS"
|
||||
LIBS="-lkrb -lcom_err -ldes $LIBS"
|
||||
|
||||
dnl Check for function krb_get_our_ip_for_realm
|
||||
dnl this is needed for NAT networks
|
||||
@@ -473,6 +574,8 @@ then
|
||||
KRB4_ENABLED=1
|
||||
AC_SUBST(KRB4_ENABLED)
|
||||
|
||||
curl_krb4_msg="enabled"
|
||||
|
||||
dnl the krb4 stuff needs a strlcpy()
|
||||
AC_CHECK_FUNCS(strlcpy)
|
||||
|
||||
@@ -506,7 +609,9 @@ if test x"$want_spnego" = xyes; then
|
||||
fi
|
||||
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_SPNEGO, 1, [Define this if you have the SPNEGO library fbopenssl])
|
||||
AC_DEFINE(HAVE_SPNEGO, 1,
|
||||
[Define this if you have the SPNEGO library fbopenssl])
|
||||
curl_spnego_msg="enabled"
|
||||
fi
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
@@ -543,7 +648,7 @@ if test x"$want_gss" = xyes; then
|
||||
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
||||
GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi`
|
||||
else
|
||||
GSSAPI_INCS=="-I$GSSAPI_ROOT/include"
|
||||
GSSAPI_INCS="-I$GSSAPI_ROOT/include"
|
||||
fi
|
||||
fi
|
||||
CPPFLAGS="$CPPFLAGS $GSSAPI_INCS"
|
||||
@@ -553,7 +658,7 @@ if test x"$want_gss" = xyes; then
|
||||
gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi`
|
||||
LDFLAGS="$LDFLAGS $gss_ldflags"
|
||||
else
|
||||
LDFLAGS="$LDFLAGS $GSSAPI_ROOT/lib -lgssapi"
|
||||
LDFLAGS="$LDFLAGS -L$GSSAPI_ROOT/lib$libsuff -lgssapi"
|
||||
fi
|
||||
else
|
||||
LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR"
|
||||
@@ -562,6 +667,8 @@ if test x"$want_gss" = xyes; then
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_GSSAPI, 1, [if you have the gssapi libraries])
|
||||
|
||||
curl_gss_msg="enabled"
|
||||
|
||||
if test -n "$GSSAPI_INCS"; then
|
||||
# cut off the preceding -I from the include path
|
||||
GSSAPI_INCS=`echo $GSSAPI_INCS | sed -e s/^-I//g`
|
||||
@@ -577,33 +684,6 @@ else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
|
||||
|
||||
dnl Detect the pkg-config tool, as it may have extra info about the
|
||||
dnl openssl installation we can use. I *believe* this is what we are
|
||||
dnl expected to do on really recent Redhat Linux hosts.
|
||||
AC_PATH_PROG( PKGCONFIG, pkg-config, no, $PATH:/usr/bin:/usr/local/bin)
|
||||
if test "$PKGCONFIG" != "no" ; then
|
||||
AC_MSG_CHECKING([for OpenSSL options using pkg-config])
|
||||
|
||||
$PKGCONFIG --exists openssl
|
||||
SSL_EXISTS=$?
|
||||
|
||||
if test "$SSL_EXISTS" -eq "0"; then
|
||||
SSL_LIBS=`$PKGCONFIG --libs-only-l openssl 2>/dev/null`
|
||||
SSL_LDFLAGS=`$PKGCONFIG --libs-only-L openssl 2>/dev/null`
|
||||
SSL_CPPFLAGS=`$PKGCONFIG --cflags-only-I openssl 2>/dev/null`
|
||||
|
||||
LIBS="$LIBS $SSL_LIBS"
|
||||
CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS"
|
||||
LDFLAGS="$LDFLAGS $SSL_LDFLAGS"
|
||||
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the presence of SSL libraries and headers
|
||||
dnl **********************************************************************
|
||||
@@ -619,39 +699,71 @@ AC_HELP_STRING([--without-ssl], [disable SSL]),
|
||||
|
||||
if test X"$OPT_SSL" = Xno
|
||||
then
|
||||
AC_MSG_WARN(SSL/https support disabled)
|
||||
AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more])
|
||||
else
|
||||
|
||||
dnl Check for and handle argument to --with-ssl.
|
||||
|
||||
dnl save the pre-ssl check flags for a while
|
||||
dnl backup the pre-ssl variables
|
||||
CLEANLDFLAGS="$LDFLAGS"
|
||||
CLEANCPPFLAGS="$CPPFLAGS"
|
||||
CLEANLIBS="$LIBS"
|
||||
|
||||
case "$OPT_SSL" in
|
||||
yes)
|
||||
dnl --with-ssl (without path) used
|
||||
PKGTEST="yes"
|
||||
EXTRA_SSL=/usr/local/ssl ;;
|
||||
off)
|
||||
dnl no --with-ssl option given, just check default places
|
||||
PKGTEST="yes"
|
||||
EXTRA_SSL= ;;
|
||||
*)
|
||||
dnl check the given spot right away!
|
||||
dnl check the given --with-ssl spot
|
||||
PKGTEST="no"
|
||||
EXTRA_SSL=$OPT_SSL
|
||||
LDFLAGS="$LDFLAGS -L$EXTRA_SSL/lib"
|
||||
LDFLAGS="$LDFLAGS -L$EXTRA_SSL/lib$libsuff"
|
||||
CPPFLAGS="$CPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include"
|
||||
;;
|
||||
esac
|
||||
|
||||
if test "$PKGTEST" = "yes"; then
|
||||
|
||||
dnl Detect the pkg-config tool, as it may have extra info about the
|
||||
dnl openssl installation we can use. I *believe* this is what we are
|
||||
dnl expected to do on really recent Redhat Linux hosts.
|
||||
|
||||
AC_PATH_PROG( PKGCONFIG, pkg-config, no, $PATH:/usr/bin:/usr/local/bin)
|
||||
if test "$PKGCONFIG" != "no" ; then
|
||||
AC_MSG_CHECKING([OpenSSL options with pkg-config])
|
||||
|
||||
$PKGCONFIG --exists openssl
|
||||
SSL_EXISTS=$?
|
||||
|
||||
if test "$SSL_EXISTS" -eq "0"; then
|
||||
SSL_LIBS=`$PKGCONFIG --libs-only-l openssl 2>/dev/null`
|
||||
SSL_LDFLAGS=`$PKGCONFIG --libs-only-L openssl 2>/dev/null`
|
||||
SSL_CPPFLAGS=`$PKGCONFIG --cflags-only-I openssl 2>/dev/null`
|
||||
|
||||
dnl use the values pkg-config reported
|
||||
LIBS="$LIBS $SSL_LIBS"
|
||||
CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS"
|
||||
LDFLAGS="$LDFLAGS $SSL_LDFLAGS"
|
||||
AC_MSG_RESULT([found])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_CHECK_LIB(crypto, CRYPTO_lock,[
|
||||
HAVECRYPTO="yes"
|
||||
],[
|
||||
OLDLDFLAGS="$LDFLAGS"
|
||||
OLDCPPFLAGS="$CPPFLAGS"
|
||||
LDFLAGS="$CLEANLDFLAGS -L$EXTRA_SSL/lib"
|
||||
LDFLAGS="$CLEANLDFLAGS -L$EXTRA_SSL/lib$libsuff"
|
||||
CPPFLAGS="$CLEANCPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include"
|
||||
AC_CHECK_LIB(crypto, CRYPTO_add_lock,[
|
||||
HAVECRYPTO="yes" ], [
|
||||
LDFLAGS="$OLDLDFLAGS"
|
||||
CPPFLAGS="$OLDCPPFLAGS"
|
||||
LDFLAGS="$CLEANLDFLAGS"
|
||||
CPPFLAGS="$CLEANCPPFLAGS"
|
||||
LIBS="$CLEANLIBS"
|
||||
])
|
||||
])
|
||||
|
||||
@@ -660,6 +772,20 @@ else
|
||||
dnl This is only reasonable to do if crypto actually is there: check for
|
||||
dnl SSL libs NOTE: it is important to do this AFTER the crypto lib
|
||||
|
||||
dnl This is for Msys/Mingw
|
||||
AC_MSG_CHECKING([for gdi32])
|
||||
my_ac_save_LIBS=$LIBS
|
||||
LIBS="-lgdi32 $LIBS"
|
||||
AC_TRY_LINK([#include <windef.h>
|
||||
#include <wingdi.h>],
|
||||
[GdiFlush();],
|
||||
[ dnl worked!
|
||||
AC_MSG_RESULT([yes])],
|
||||
[ dnl failed, restore LIBS
|
||||
LIBS=$my_ac_save_LIBS
|
||||
AC_MSG_RESULT(no)]
|
||||
)
|
||||
|
||||
AC_CHECK_LIB(crypto, CRYPTO_add_lock)
|
||||
AC_CHECK_LIB(ssl, SSL_connect)
|
||||
|
||||
@@ -682,10 +808,12 @@ else
|
||||
dnl Check for SSLeay headers
|
||||
AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \
|
||||
openssl/pem.h openssl/ssl.h openssl/err.h,
|
||||
curl_ssl_msg="enabled"
|
||||
OPENSSL_ENABLED=1)
|
||||
|
||||
if test $ac_cv_header_openssl_x509_h = no; then
|
||||
AC_CHECK_HEADERS(x509.h rsa.h crypto.h pem.h ssl.h err.h,
|
||||
curl_ssl_msg="enabled"
|
||||
OPENSSL_ENABLED=1)
|
||||
fi
|
||||
|
||||
@@ -758,28 +886,103 @@ case "$OPT_ZLIB" in
|
||||
dnl check for the lib first without setting any new path, since many
|
||||
dnl people have it in the default path
|
||||
|
||||
AC_CHECK_LIB(z, inflateEnd, ,
|
||||
AC_CHECK_LIB(z, inflateEnd,
|
||||
dnl libz found, set the variable
|
||||
[HAVE_LIBZ="1"],
|
||||
dnl if no lib found, try to add the given library
|
||||
[if test -d "$OPT_ZLIB"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include"
|
||||
LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib"
|
||||
LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib$libsuff"
|
||||
fi])
|
||||
|
||||
AC_CHECK_HEADER(zlib.h,[
|
||||
AC_CHECK_LIB(z, gzread,
|
||||
[HAVE_LIBZ="1"
|
||||
AC_SUBST(HAVE_LIBZ)
|
||||
AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file])
|
||||
AC_DEFINE(HAVE_LIBZ, 1, [If zlib is available])],
|
||||
[ CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags])],
|
||||
[ CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags]
|
||||
)
|
||||
AC_CHECK_HEADER(zlib.h,
|
||||
[
|
||||
dnl zlib.h was found
|
||||
HAVE_ZLIB_H="1"
|
||||
dnl if the lib wasn't found already, try again with the new paths
|
||||
if test "$HAVE_LIBZ" != "1"; then
|
||||
AC_CHECK_LIB(z, gzread,
|
||||
[
|
||||
dnl the lib was found!
|
||||
HAVE_LIBZ="1"
|
||||
],
|
||||
[ CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags])
|
||||
fi
|
||||
],
|
||||
[
|
||||
dnl zlib.h was not found, restore the flags
|
||||
CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags]
|
||||
)
|
||||
|
||||
if test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" != "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz lib, not the header file!])
|
||||
elif test "$HAVE_LIBZ" != "1" && test "$HAVE_ZLIB_H" = "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz header file, not the lib!])
|
||||
elif test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" = "1"
|
||||
then
|
||||
dnl both header and lib were found!
|
||||
AC_SUBST(HAVE_LIBZ)
|
||||
AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file])
|
||||
AC_DEFINE(HAVE_LIBZ, 1, [if zlib is available])
|
||||
|
||||
LIBS="$LIBS -lz"
|
||||
|
||||
dnl replace 'HAVE_LIBZ' in the automake makefile.ams
|
||||
AMFIXLIB="1"
|
||||
AC_MSG_NOTICE([found both libz and libz.h header])
|
||||
curl_zlib_msg="enabled"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl set variable for use in automakefile(s)
|
||||
AM_CONDITIONAL(HAVE_LIBZ, test x"$HAVE_LIBZ" = x1)
|
||||
AM_CONDITIONAL(HAVE_LIBZ, test x"$AMFIXLIB" = x1)
|
||||
|
||||
AC_MSG_CHECKING([whether to build with libidn])
|
||||
AC_ARG_WITH(libidn,
|
||||
AC_HELP_STRING([--with-libidn=PATH],[Enable libidn usage])
|
||||
AC_HELP_STRING([--without-libidn],[Disable libidn usage]),
|
||||
[LIBIDN="$withval"])
|
||||
|
||||
case "$LIBIDN" in
|
||||
no)
|
||||
AC_MSG_RESULT(no)
|
||||
;;
|
||||
*) AC_MSG_RESULT(yes)
|
||||
|
||||
idn=""
|
||||
dnl if there is a given path, check that FIRST
|
||||
if test "x$LIBIDN" != "xyes"; then
|
||||
oldLDFLAGS=$LDFLAGS
|
||||
oldCPPFLAGS=$CPPFLAGS
|
||||
LDFLAGS="$LDFLAGS -L$LIBIDN/lib"
|
||||
CPPFLAGS="$CPPFLAGS -I$LIBIDN/include"
|
||||
idn="yes"
|
||||
AC_CHECK_LIB(idn, idna_to_ascii_4i, ,
|
||||
idn=""
|
||||
LDFLAGS=$oldLDFLAGS
|
||||
CPPFLAGS=$oldCPPFLAGS)
|
||||
fi
|
||||
|
||||
if test "x$idn" != "xyes"; then
|
||||
dnl check with default paths
|
||||
AC_CHECK_LIB(idn, idna_to_ascii_lz, ,
|
||||
idn="")
|
||||
fi
|
||||
|
||||
if test "x$idn" = "xyes"; then
|
||||
curl_idn_msg="enabled"
|
||||
dnl different versions of libidn have different setups of these:
|
||||
AC_CHECK_FUNCS( idn_free idna_strerror tld_strerror)
|
||||
AC_CHECK_HEADERS( idn-free.h )
|
||||
fi
|
||||
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl Default is to try the thread-safe versions of a few functions
|
||||
OPT_THREAD=on
|
||||
@@ -795,6 +998,7 @@ printf("just fine");
|
||||
#endif
|
||||
],
|
||||
[ AC_MSG_RESULT([yes])
|
||||
RECENTAIX=yes
|
||||
OPT_THREAD=off ],
|
||||
[ AC_MSG_RESULT([no]) ]
|
||||
)
|
||||
@@ -818,12 +1022,13 @@ then
|
||||
AC_DEFINE(DISABLED_THREADSAFE, 1, \
|
||||
Set to explicitly specify we don't want to use thread-safe functions)
|
||||
else
|
||||
if test "$ipv6" != "yes"; then
|
||||
dnl dig around for gethostbyname_r()
|
||||
CURL_CHECK_GETHOSTBYNAME_R()
|
||||
|
||||
dnl dig around for gethostbyname_r()
|
||||
CURL_CHECK_GETHOSTBYNAME_R()
|
||||
|
||||
dnl dig around for gethostbyaddr_r()
|
||||
CURL_CHECK_GETHOSTBYADDR_R()
|
||||
dnl dig around for gethostbyaddr_r()
|
||||
dnl CURL_CHECK_GETHOSTBYADDR_R()
|
||||
fi
|
||||
|
||||
dnl poke around for inet_ntoa_r()
|
||||
CURL_CHECK_INET_NTOA_R()
|
||||
@@ -831,10 +1036,49 @@ else
|
||||
dnl is there a localtime_r()
|
||||
CURL_CHECK_LOCALTIME_R()
|
||||
|
||||
AC_CHECK_FUNCS( gmtime_r )
|
||||
dnl is there a strerror_r()
|
||||
CURL_CHECK_STRERROR_R()
|
||||
|
||||
AC_CHECK_FUNCS( gmtime_r )
|
||||
fi
|
||||
|
||||
dnl for recent AIX versions, we skip all the thread-safe checks above since
|
||||
dnl they claim a thread-safe libc using the standard API. But there are
|
||||
dnl some functions still not thread-safe. Check for these!
|
||||
|
||||
dnl Let's hope this split URL remains working:
|
||||
dnl http://publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/aixprggd/ \
|
||||
dnl genprogc/thread_quick_ref.htm
|
||||
|
||||
if test "x$RECENTAIX" = "xyes"; then
|
||||
|
||||
AC_DEFINE(_THREAD_SAFE, 1, [define this if you need it to compile thread-safe code])
|
||||
|
||||
dnl check if this is the IMB xlc compiler
|
||||
dnl Details thanks to => http://predef.sourceforge.net/
|
||||
AC_MSG_CHECKING([if this is the xlc compiler])
|
||||
AC_EGREP_CPP([^__xlC__], [__xlC__],
|
||||
dnl action if the text is found, this it has not been replaced by the
|
||||
dnl cpp
|
||||
XLC="no"
|
||||
AC_MSG_RESULT([no]),
|
||||
dnl the text was not found, it was replaced by the cpp
|
||||
XLC="yes"
|
||||
AC_MSG_RESULT([yes])
|
||||
CFLAGS="$CFLAGS -qthreaded"
|
||||
)
|
||||
|
||||
|
||||
dnl is there a localtime_r()
|
||||
CURL_CHECK_LOCALTIME_R()
|
||||
|
||||
dnl is there a strerror_r()
|
||||
CURL_CHECK_STRERROR_R()
|
||||
|
||||
AC_CHECK_FUNCS( gmtime_r )
|
||||
fi
|
||||
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Back to "normal" configuring
|
||||
dnl **********************************************************************
|
||||
@@ -849,6 +1093,7 @@ AC_CHECK_HEADERS(
|
||||
sys/time.h \
|
||||
sys/select.h \
|
||||
sys/socket.h \
|
||||
sys/ioctl.h \
|
||||
assert.h \
|
||||
unistd.h \
|
||||
malloc.h \
|
||||
@@ -857,6 +1102,7 @@ AC_CHECK_HEADERS(
|
||||
arpa/inet.h \
|
||||
net/if.h \
|
||||
netinet/in.h \
|
||||
netinet/tcp.h \
|
||||
netdb.h \
|
||||
sys/sockio.h \
|
||||
sys/stat.h \
|
||||
@@ -874,6 +1120,7 @@ AC_CHECK_HEADERS(
|
||||
utime.h \
|
||||
sys/utime.h \
|
||||
sys/poll.h \
|
||||
libgen.h \
|
||||
setjmp.h,
|
||||
dnl to do if not found
|
||||
[],
|
||||
@@ -893,6 +1140,9 @@ dnl default includes
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
]
|
||||
)
|
||||
|
||||
@@ -901,10 +1151,27 @@ AC_C_CONST
|
||||
AC_TYPE_SIZE_T
|
||||
AC_HEADER_TIME
|
||||
|
||||
AC_CHECK_SIZEOF(off_t)
|
||||
AC_CHECK_SIZEOF(curl_off_t, ,[
|
||||
#include <stdio.h>
|
||||
#include "$srcdir/include/curl/curl.h"
|
||||
])
|
||||
AC_CHECK_SIZEOF(size_t)
|
||||
AC_CHECK_SIZEOF(long)
|
||||
|
||||
AC_CHECK_TYPE(long long,
|
||||
[AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports 'long long'])])
|
||||
[AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports long long])]
|
||||
longlong="yes"
|
||||
)
|
||||
|
||||
if test "xyes" = "x$longlong"; then
|
||||
AC_MSG_CHECKING([if numberLL works])
|
||||
AC_COMPILE_IFELSE([long long val = 1000LL;],
|
||||
[AC_DEFINE(HAVE_LL, 1, [if your compiler supports LL])]
|
||||
AC_MSG_RESULT(yes),
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
fi
|
||||
|
||||
|
||||
# check for ssize_t
|
||||
AC_CHECK_TYPE(ssize_t, ,
|
||||
@@ -949,6 +1216,7 @@ AC_CHECK_FUNCS( strtoll \
|
||||
dlopen \
|
||||
utime \
|
||||
sigsetjmp \
|
||||
basename \
|
||||
poll,
|
||||
dnl if found
|
||||
[],
|
||||
@@ -979,6 +1247,41 @@ if test "$ac_cv_func_sigsetjmp" != "yes"; then
|
||||
)
|
||||
fi
|
||||
|
||||
AC_CHECK_DECL(basename, ,
|
||||
AC_DEFINE(NEED_BASENAME_PROTO, 1, [If you lack a fine basename() prototype]),
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#endif
|
||||
#ifdef HAVE_LIBGEN_H
|
||||
#include <libgen.h>
|
||||
#endif
|
||||
)
|
||||
|
||||
dnl poll() might be badly emulated, as in Mac OS X 10.3 (and other BSDs?) and
|
||||
dnl to find out we make an extra check here!
|
||||
if test "$ac_cv_func_poll" = "yes"; then
|
||||
AC_MSG_CHECKING([if poll works with NULL inputs])
|
||||
AC_RUN_IFELSE([
|
||||
#ifdef HAVE_SYS_POLL_H
|
||||
#include <sys/poll.h>
|
||||
#endif
|
||||
|
||||
int main(void)
|
||||
{
|
||||
/* make this return 0 == timeout since there's nothing to read from */
|
||||
return poll((void *)0, 0, 10 /*ms*/);
|
||||
}
|
||||
],
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_POLL_FINE, 1, [If you have a fine poll]),
|
||||
AC_MSG_RESULT(no),
|
||||
AC_MSG_RESULT(cross-compiling assumes yes)
|
||||
AC_DEFINE(HAVE_POLL_FINE, 1, [If you have a fine poll])
|
||||
) dnl end of AC_RUN_IFELSE
|
||||
fi
|
||||
|
||||
|
||||
|
||||
AC_PATH_PROG( PERL, perl, ,
|
||||
$PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin )
|
||||
AC_SUBST(PERL)
|
||||
@@ -987,47 +1290,47 @@ AC_PATH_PROGS( NROFF, gnroff nroff, ,
|
||||
$PATH:/usr/bin/:/usr/local/bin )
|
||||
AC_SUBST(NROFF)
|
||||
|
||||
AC_PROG_YACC
|
||||
if test -n "$NROFF"; then
|
||||
dnl only check for nroff options if an nroff command was found
|
||||
|
||||
dnl AC_PATH_PROG( RANLIB, ranlib, /usr/bin/ranlib,
|
||||
dnl $PATH:/usr/bin/:/usr/local/bin )
|
||||
dnl AC_SUBST(RANLIB)
|
||||
|
||||
dnl ************************************************************
|
||||
dnl lame option to switch on debug options
|
||||
dnl
|
||||
AC_MSG_CHECKING([whether to enable debug options])
|
||||
AC_ARG_ENABLE(debug,
|
||||
AC_HELP_STRING([--enable-debug],[Enable pedantic debug options])
|
||||
AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||
[ case "$enableval" in
|
||||
no)
|
||||
AC_MSG_RESULT(no)
|
||||
;;
|
||||
*) AC_MSG_RESULT(yes)
|
||||
|
||||
CPPFLAGS="$CPPFLAGS -DCURLDEBUG"
|
||||
CFLAGS="$CFLAGS -g"
|
||||
if test "$GCC" = "yes"; then
|
||||
CFLAGS="$CFLAGS -W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wundef -Wpointer-arith -Wnested-externs"
|
||||
AC_MSG_CHECKING([how to use *nroff to get plain text from man pages])
|
||||
MANOPT="-man"
|
||||
mancheck=`echo foo | $NROFF $MANOPT 2>/dev/null`
|
||||
if test -z "$mancheck"; then
|
||||
MANOPT="-mandoc"
|
||||
mancheck=`echo foo | $NROFF $MANOPT 2>/dev/null`
|
||||
if test -z "$mancheck"; then
|
||||
MANOPT=""
|
||||
AC_MSG_RESULT([failed])
|
||||
AC_MSG_WARN([found no *nroff option to get plaintext from man pages])
|
||||
else
|
||||
AC_MSG_RESULT([$MANOPT])
|
||||
fi
|
||||
dnl strip off optimizer flags
|
||||
NEWFLAGS=""
|
||||
for flag in $CFLAGS; do
|
||||
case "$flag" in
|
||||
-O*)
|
||||
dnl echo "cut off $flag"
|
||||
;;
|
||||
*)
|
||||
NEWFLAGS="$NEWFLAGS $flag"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
CFLAGS=$NEWFLAGS
|
||||
;;
|
||||
esac ],
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
else
|
||||
AC_MSG_RESULT([$MANOPT])
|
||||
fi
|
||||
AC_SUBST(MANOPT)
|
||||
fi
|
||||
|
||||
if test -z "$MANOPT"
|
||||
then
|
||||
dnl if no nroff tool was found, or no option that could convert man pages
|
||||
dnl was found, then disable the built-in manual stuff
|
||||
AC_MSG_WARN([disabling built-in manual])
|
||||
USE_MANUAL="no";
|
||||
fi
|
||||
|
||||
dnl *************************************************************************
|
||||
dnl If the manual variable still is set, then we go with providing a built-in
|
||||
dnl manual
|
||||
|
||||
if test "$USE_MANUAL" = "1"; then
|
||||
AC_DEFINE(USE_MANUAL, 1, [If you want to build curl with the built-in manual])
|
||||
curl_manual_msg="enabled"
|
||||
fi
|
||||
|
||||
dnl set variable for use in automakefile(s)
|
||||
AM_CONDITIONAL(USE_MANUAL, test x"$USE_MANUAL" = x1)
|
||||
|
||||
AC_MSG_CHECKING([whether to enable ares])
|
||||
AC_ARG_ENABLE(ares,
|
||||
@@ -1047,8 +1350,9 @@ AC_HELP_STRING([--disable-ares],[Disable ares for name lookups]),
|
||||
dnl substitute HAVE_ARES for curl-config and similar
|
||||
HAVE_ARES="1"
|
||||
AC_SUBST(HAVE_ARES)
|
||||
curl_ares_msg="enabled"
|
||||
|
||||
LIBS="$LIBS -lares"
|
||||
LIBS="$LIBS -lcares"
|
||||
|
||||
dnl For backwards compatibility default to includes/lib in srcdir/ares
|
||||
dnl If a value is specified it is assumed that the libs are in $val/lib
|
||||
@@ -1056,6 +1360,7 @@ AC_HELP_STRING([--disable-ares],[Disable ares for name lookups]),
|
||||
dnl ares so it should not be a problem.
|
||||
if test "x$enableval" = "xyes" ; then
|
||||
if test -d "$srcdir/ares"; then
|
||||
aresembedded="yes"
|
||||
AC_CONFIG_SUBDIRS(ares)
|
||||
aresinc=`cd $srcdir/ares && pwd`
|
||||
CPPFLAGS="$CPPFLAGS -I$aresinc"
|
||||
@@ -1070,11 +1375,63 @@ AC_HELP_STRING([--disable-ares],[Disable ares for name lookups]),
|
||||
CPPFLAGS="$CPPFLAGS -I$enableval/include"
|
||||
LDFLAGS="$LDFLAGS -L$enableval/lib"
|
||||
fi
|
||||
|
||||
if test -z "$aresembedded"; then
|
||||
dnl verify that a sufficient c-ares is here if we have pointed one
|
||||
dnl out and don't use the "embedded" ares dir (in which case we don't
|
||||
dnl check it because it might not have been built yet)
|
||||
AC_MSG_CHECKING([that c-ares is good and recent enough])
|
||||
AC_LINK_IFELSE( [
|
||||
#include <ares.h>
|
||||
/* provide a set of dummy functions in case c-ares was built with debug */
|
||||
void curl_dofree() { }
|
||||
void curl_sclose() { }
|
||||
void curl_domalloc() { }
|
||||
|
||||
int main(void)
|
||||
{
|
||||
ares_channel channel;
|
||||
ares_cancel(channel);
|
||||
return 0;
|
||||
}
|
||||
],
|
||||
AC_MSG_RESULT(yes),
|
||||
AC_MSG_RESULT(no)
|
||||
AC_MSG_ERROR([c-ares library defective or too old])
|
||||
)
|
||||
fi
|
||||
;;
|
||||
esac ],
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
|
||||
dnl ************************************************************
|
||||
dnl lame option to switch on debug options
|
||||
dnl
|
||||
AC_MSG_CHECKING([whether to enable debug options])
|
||||
AC_ARG_ENABLE(debug,
|
||||
AC_HELP_STRING([--enable-debug],[Enable pedantic debug options])
|
||||
AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||
[ case "$enableval" in
|
||||
no)
|
||||
AC_MSG_RESULT(no)
|
||||
;;
|
||||
*) AC_MSG_RESULT(yes)
|
||||
|
||||
CPPFLAGS="$CPPFLAGS -DCURLDEBUG"
|
||||
CFLAGS="$CFLAGS -g"
|
||||
|
||||
dnl set compiler "debug" options to become more picky, and remove
|
||||
dnl optimize options from CFLAGS
|
||||
CURL_CC_DEBUG_OPTS
|
||||
;;
|
||||
esac
|
||||
],
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
|
||||
AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes)
|
||||
|
||||
AC_CONFIG_FILES([Makefile \
|
||||
docs/Makefile \
|
||||
docs/examples/Makefile \
|
||||
@@ -1098,6 +1455,25 @@ AC_CONFIG_FILES([Makefile \
|
||||
packages/DOS/Makefile \
|
||||
packages/EPM/curl.list \
|
||||
packages/EPM/Makefile \
|
||||
packages/vms/Makefile \
|
||||
curl-config
|
||||
])
|
||||
AC_OUTPUT
|
||||
|
||||
AC_MSG_NOTICE([Configured to build curl/libcurl:
|
||||
|
||||
curl version: ${VERSION}
|
||||
Host setup: ${host}
|
||||
Install prefix: ${prefix}
|
||||
Compiler: ${CC}
|
||||
SSL support: ${curl_ssl_msg}
|
||||
zlib support: ${curl_zlib_msg}
|
||||
krb4 support: ${curl_krb4_msg}
|
||||
GSSAPI support: ${curl_gss_msg}
|
||||
SNPEGO support: ${curl_spnego_msg}
|
||||
c-ares support: ${curl_ares_msg}
|
||||
ipv6 support: ${curl_ipv6_msg}
|
||||
IDN support: ${curl_idn_msg}
|
||||
Build libcurl: Shared=${enable_shared}, Static=${enable_static}
|
||||
Built-in manual: ${curl_manual_msg}
|
||||
])
|
||||
|
||||
@@ -2,17 +2,8 @@
|
||||
;;;; $Id$
|
||||
|
||||
;;; The curl hacker's C conventions.
|
||||
|
||||
;;; After loading this file and added the mode-hook you can in C
|
||||
;;; files, put something like this to use the curl style
|
||||
;;; automatically:
|
||||
;;
|
||||
;; /* -----------------------------------------------------------------
|
||||
;; * local variables:
|
||||
;; * eval: (set c-file-style "curl")
|
||||
;; * end:
|
||||
;; */
|
||||
;;
|
||||
;;; See the sample.emacs file on how this file can be made to take
|
||||
;;; effect automatically when editing curl source files.
|
||||
|
||||
(defconst curl-c-style
|
||||
'((c-basic-offset . 2)
|
||||
@@ -29,6 +20,13 @@
|
||||
)
|
||||
"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
|
||||
(defun curl-c-mode-common-hook ()
|
||||
"Curl C mode hook"
|
||||
@@ -37,12 +35,15 @@
|
||||
(setq tab-width 8
|
||||
indent-tabs-mode nil ; Use spaces. Not tabs.
|
||||
comment-column 40
|
||||
c-font-lock-extra-types (append '("bool" "CURL" "CURLcode" "ssize_t" "size_t" "socklen_t" "fd_set" "time_t" "off_t"))
|
||||
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
|
||||
;; 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-m" 'curl-code-cleanup)
|
||||
(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
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
libcurl bindings
|
||||
@@ -17,45 +17,63 @@ archives, but must be downloaded and installed separately.
|
||||
|
||||
Ada95
|
||||
|
||||
Writtten by Andreas Almroth.
|
||||
Writtten by Andreas Almroth
|
||||
http://www.almroth.com/adacurl/index.html
|
||||
|
||||
Basic
|
||||
|
||||
ScriptBasic bindings to libcurl. Writtten by Peter Verhas.
|
||||
ScriptBasic bindings to libcurl. Writtten by Peter Verhas
|
||||
http://scriptbasic.com/
|
||||
|
||||
C++
|
||||
|
||||
Written by Jean-Philippe Barrette-LaPierre.
|
||||
Written by Jean-Philippe Barrette-LaPierre
|
||||
http://www.sourceforge.net/projects/curlpp
|
||||
|
||||
Ch
|
||||
|
||||
Written by Stephen Nestinger and Jonathan Rogado
|
||||
http://chcurl.sourceforge.net/
|
||||
|
||||
Cocoa
|
||||
|
||||
Written by Dan Wood.
|
||||
Written by Dan Wood
|
||||
http://curlhandle.sourceforge.net/
|
||||
|
||||
D
|
||||
|
||||
Written by Charles Sanders and James Wavro
|
||||
http://www.atari-soldiers.com/libcurl.html
|
||||
|
||||
Dylan
|
||||
|
||||
Written by Chris Double.
|
||||
Written by Chris Double
|
||||
http://dylanlibs.sourceforge.net/
|
||||
|
||||
Euphoria
|
||||
|
||||
Written by Ray Smith.
|
||||
Written by Ray Smith
|
||||
http://rays-web.com/eulibcurl.htm
|
||||
|
||||
Ferite
|
||||
Written by Paul Querna
|
||||
http://www.ferite.org/
|
||||
|
||||
Gambas
|
||||
http://gambas.sourceforge.net
|
||||
|
||||
glib/GTK+
|
||||
Written by Richard Atterer
|
||||
http://atterer.net/glibcurl/
|
||||
|
||||
Java
|
||||
|
||||
Written by Daniel Stenberg.
|
||||
Written by Daniel Stenberg
|
||||
http://curl.haxx.se/libcurl/java/
|
||||
|
||||
Lua
|
||||
|
||||
Written by Steve Dekorte.
|
||||
Written by Steve Dekorte
|
||||
http://curl.haxx.se/libcurl/lua/
|
||||
|
||||
Object-Pascal
|
||||
@@ -65,7 +83,7 @@ Object-Pascal
|
||||
|
||||
O'Caml
|
||||
|
||||
Written by Lars Nilsson.
|
||||
Written by Lars Nilsson
|
||||
http://sourceforge.net/projects/ocurl/
|
||||
|
||||
Pascal
|
||||
@@ -75,40 +93,49 @@ Pascal
|
||||
|
||||
Perl
|
||||
|
||||
Maintained by Cris Bailiff.
|
||||
Maintained by Cris Bailiff
|
||||
http://curl.haxx.se/libcurl/perl/
|
||||
|
||||
PHP
|
||||
|
||||
Written by Sterling Hughes.
|
||||
Written by Sterling Hughes
|
||||
http://curl.haxx.se/libcurl/php/
|
||||
|
||||
PostgreSQL
|
||||
|
||||
Written by Gian Paolo Ciceri.
|
||||
Written by Gian Paolo Ciceri
|
||||
http://gborg.postgresql.org/project/pgcurl/projdisplay.php
|
||||
|
||||
Python
|
||||
|
||||
Written by Kjetil Jacobsen.
|
||||
Written by Kjetil Jacobsen
|
||||
http://pycurl.sourceforge.net/
|
||||
|
||||
Rexx
|
||||
|
||||
Written Mark Hessling.
|
||||
Written Mark Hessling
|
||||
http://rexxcurl.sourceforge.net/
|
||||
|
||||
Ruby
|
||||
|
||||
Written by Hirotaka Matsuyuki.
|
||||
Written by Hirotaka Matsuyuki
|
||||
http://www.d1.dion.ne.jp/~matuyuki/ruby.html
|
||||
|
||||
Scheme
|
||||
|
||||
Bigloo binding written by Kirill Lisovsky.
|
||||
Bigloo binding written by Kirill Lisovsky
|
||||
http://curl.haxx.se/libcurl/scheme/
|
||||
|
||||
Tcl
|
||||
|
||||
Written by Andr<64>s Garc<72>a.
|
||||
Written by Andr<64>s Garc<72>a
|
||||
http://personal1.iddeo.es/andresgarci/tclcurl/english/docs.html
|
||||
|
||||
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
|
||||
@@ -138,15 +138,15 @@ How To Make a Patch
|
||||
|
||||
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
|
||||
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
|
||||
all kinds of unixes and Windows:
|
||||
all kinds of Unixes and Windows:
|
||||
|
||||
For unix-like operating systems:
|
||||
|
||||
|
||||
303
docs/FAQ
303
docs/FAQ
@@ -1,8 +1,8 @@
|
||||
Updated: December 22, 2003 (http://curl.haxx.se/docs/faq.html)
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
Updated: August 18, 2004 (http://curl.haxx.se/docs/faq.html)
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
FAQ
|
||||
@@ -10,20 +10,20 @@ FAQ
|
||||
1. Philosophy
|
||||
1.1 What is cURL?
|
||||
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.5 Who makes cURL?
|
||||
1.6 What do you get for making cURL?
|
||||
1.5 Who makes curl?
|
||||
1.6 What do you get for making curl?
|
||||
1.7 What about CURL from curl.com?
|
||||
1.8 I have a problem who do I mail?
|
||||
|
||||
2. Install Related Problems
|
||||
2.1 configure doesn't find OpenSSL even when it is installed
|
||||
2.1.1. native linker doesn't find openssl
|
||||
2.1.2. only the libssl lib is missing
|
||||
2.1.1 native linker doesn't find OpenSSL
|
||||
2.1.2 only the libssl lib is missing
|
||||
2.2 Does curl work/build with other SSL libraries?
|
||||
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.1 curl: (1) SSL is disabled, https: not supported
|
||||
@@ -41,6 +41,7 @@ FAQ
|
||||
3.13 Why does my single/double quotes fail?
|
||||
3.14 Does curl support javascript or pac (automated proxy config)?
|
||||
3.15 Can I do recursive fetches with curl?
|
||||
3.16 What certificates do I need when I use SSL?
|
||||
|
||||
4. Running Problems
|
||||
4.1 Problems connecting to SSL servers.
|
||||
@@ -70,6 +71,8 @@ FAQ
|
||||
5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ?
|
||||
5.6 What about Keep-Alive or persistent connections?
|
||||
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?
|
||||
|
||||
6. License Issues
|
||||
6.1 I have a GPL program, can I use the libcurl library?
|
||||
@@ -79,29 +82,55 @@ FAQ
|
||||
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?
|
||||
|
||||
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.1 What is cURL?
|
||||
|
||||
cURL (or simply just 'curl') is a command line tool for getting or sending
|
||||
files using URL syntax. The name is a play on 'Client for URLs', originally
|
||||
with URL spelled in uppercase to make it obvious it deals with URLs. The
|
||||
fact it can also be pronounced 'see URL' also helped, it works as an
|
||||
abbrivation for "Client URL Request Library" or why not the recursive
|
||||
version: "Curl is a URL Request Library".
|
||||
cURL is the name of the project. The name is a play on 'Client for URLs',
|
||||
originally with URL spelled in uppercase to make it obvious it deals with
|
||||
URLs. The fact it can also be pronounced 'see URL' also helped, it works as
|
||||
an abbrivation for "Client URL Request Library" or why not the recursive
|
||||
version: "Curl URL Request Library".
|
||||
|
||||
Curl supports a range of common Internet protocols, currently including
|
||||
HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and FILE.
|
||||
The cURL project produces two products:
|
||||
|
||||
We spell it cURL or just curl. We pronounce it with an initial k sound:
|
||||
[kurl].
|
||||
libcurl
|
||||
|
||||
A free and easy-to-use client-side URL transfer library, supporting FTP,
|
||||
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].
|
||||
|
||||
NOTE: there are numerous sub-projects and related projects that also use the
|
||||
word curl in the project names in various combinations, but you should take
|
||||
notice that this FAQ is directed at the command-line tool named curl (and
|
||||
libcurl the library), and may therefore not be valid for other curl
|
||||
libcurl the library), and may therefore not be valid for other curl-related
|
||||
projects.
|
||||
|
||||
1.2 What is libcurl?
|
||||
@@ -109,16 +138,16 @@ FAQ
|
||||
libcurl is a reliable and portable library which provides you with an easy
|
||||
interface to a range of common Internet protocols.
|
||||
|
||||
You can use libcurl for free in your application even if it is commercial
|
||||
or closed-source.
|
||||
You can use libcurl for free in your application, be it open source,
|
||||
commercial or closed-source.
|
||||
|
||||
1.3 What is cURL not?
|
||||
|
||||
Curl is *not* a wget clone even though that is a very common misconception.
|
||||
Never, during curl's development, have we intended curl to replace wget or
|
||||
compete on its market. Curl is targeted at single-shot file transfers.
|
||||
1.3 What is curl not?
|
||||
|
||||
Curl is not a web site mirroring program. If you wanna use curl to mirror
|
||||
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
|
||||
market. Curl is targeted at single-shot file transfers.
|
||||
|
||||
Curl is not a web site mirroring program. If you want to use curl to mirror
|
||||
something: fine, go ahead and write a script that wraps around curl to make
|
||||
it reality (like curlmirror.pl does).
|
||||
|
||||
@@ -127,7 +156,7 @@ FAQ
|
||||
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
|
||||
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
|
||||
under a wide range of operating systems, including all modern Unixes (and a
|
||||
@@ -161,9 +190,9 @@ FAQ
|
||||
* If you write the code, chances are bigger that it will get into curl
|
||||
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. Sure, Daniel
|
||||
Stenberg writes the major parts, but other persons' submissions are
|
||||
important and crucial. Anyone can contribute and post their changes and
|
||||
improvements and have them inserted in the main sources (of course on the
|
||||
@@ -175,15 +204,16 @@ FAQ
|
||||
|
||||
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
|
||||
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,
|
||||
Haxx owns the curl web site's domain and sourceforge.net hosts several
|
||||
project services we take advantage from, like the bug tracker, mailing lists
|
||||
and more.
|
||||
Haxx owns the curl web site's domain and sourceforge.net hosts project
|
||||
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
|
||||
doing that would be to buy "gift certificates" at useful online shopping
|
||||
@@ -198,7 +228,7 @@ FAQ
|
||||
programming language for the web, named CURL.
|
||||
|
||||
We are in no way associated with curl.com or their CURL programming
|
||||
language.
|
||||
language.
|
||||
|
||||
Our project name curl has been in effective use since 1998. We were not the
|
||||
first computer related project to use the name "curl" and do not claim any
|
||||
@@ -224,11 +254,11 @@ FAQ
|
||||
|
||||
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.
|
||||
|
||||
2.1.1. native linker doesn't find openssl
|
||||
2.1.1 native linker doesn't find openssl
|
||||
|
||||
Affected platforms:
|
||||
Solaris (native cc compiler)
|
||||
@@ -250,7 +280,7 @@ FAQ
|
||||
|
||||
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
|
||||
libssl being missing according to configure, this is mostly likely because
|
||||
@@ -263,14 +293,14 @@ FAQ
|
||||
configure. Make sure that you remove the config.cache file before you
|
||||
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
|
||||
problems using a different library. If anyone does "port" curl to use a
|
||||
different SSL library, we are of course very interested in getting the
|
||||
patch!
|
||||
|
||||
2.3. Where can I find a copy of LIBEAY32.DLL?
|
||||
2.3 Where can I find a copy of LIBEAY32.DLL?
|
||||
|
||||
That is an OpenSSL binary built for Windows.
|
||||
|
||||
@@ -279,15 +309,14 @@ FAQ
|
||||
accurate and up-to-date pointers to recent OpenSSL DLLs and other binary
|
||||
packages.
|
||||
|
||||
2.4. Does cURL support Socks (RFC 1928) ?
|
||||
2.4 Does curl support Socks (RFC 1928) ?
|
||||
|
||||
There is limited support for SOCKS5 for curl built with IPv6 support
|
||||
disabled.
|
||||
Yes, SOCKS5 is supported.
|
||||
|
||||
|
||||
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,
|
||||
it means that the configure script couldn't find all libs and include files
|
||||
@@ -302,13 +331,13 @@ FAQ
|
||||
Also, check out the other paragraph in this FAQ labeled "configure doesn't
|
||||
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.
|
||||
|
||||
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
|
||||
receive your post assumes one of the formats. If the form you're trying to
|
||||
@@ -322,7 +351,7 @@ FAQ
|
||||
through the mailing list archives for old postings and questions regarding
|
||||
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
|
||||
file transfer. Study the -Q/--quote option.
|
||||
@@ -331,13 +360,13 @@ FAQ
|
||||
FTP commands without transferring anything. Therefore you must always specify
|
||||
a URL to transfer to/from even when doing custom FTP commands.
|
||||
|
||||
3.5. How can I disable the Pragma: nocache header?
|
||||
3.5 How can I disable the Pragma: nocache header?
|
||||
|
||||
You can change all internally generated headers by adding a replacement with
|
||||
the -H/--header option. By adding a header with empty contents you safely
|
||||
disable that one. Use -H "Pragma:" to disable that specific header.
|
||||
|
||||
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
|
||||
generated. It may be ASP, PHP, Perl, shell-script, SSI or plain
|
||||
@@ -346,7 +375,7 @@ FAQ
|
||||
|
||||
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.
|
||||
|
||||
@@ -371,8 +400,7 @@ FAQ
|
||||
|
||||
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:
|
||||
|
||||
http://curl.haxx.se/libcurl/
|
||||
http://curl.haxx.se/libcurl/
|
||||
|
||||
In February 2003, there are interfaces available for the following
|
||||
languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal,
|
||||
@@ -414,7 +442,7 @@ FAQ
|
||||
put the entire option within quotes. Like in:
|
||||
|
||||
curl -d " with spaces " url.com
|
||||
|
||||
|
||||
or perhaps
|
||||
|
||||
curl -d ' with spaces ' url.com
|
||||
@@ -445,28 +473,57 @@ FAQ
|
||||
|
||||
Some work-arounds usually suggested to overcome this javascript dependency:
|
||||
|
||||
- Depending on the javascript complexity, write up a script that
|
||||
translates it to another language and execute that.
|
||||
- Depending on the javascript complexity, write up a script 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 interpreted, people have successfully used the
|
||||
Mozilla javascript engine in the past.
|
||||
- Implement a javascript interpreter, people have successfully used the
|
||||
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?
|
||||
|
||||
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
|
||||
curlmirror perl script), and you can write programs based on libcurl to do
|
||||
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 certficate to make sure that
|
||||
you are truly talking to the real server and not a server impersonating
|
||||
it. The server certificate verifaction 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.
|
||||
|
||||
|
||||
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
|
||||
connect to certain SSL servers when using SSLeay or OpenSSL v0.9+. The
|
||||
@@ -478,10 +535,10 @@ FAQ
|
||||
requests properly. To correct this problem, tell curl to select SSLv2 from
|
||||
the command line (-2/--sslv2).
|
||||
|
||||
There has 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.
|
||||
|
||||
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
|
||||
runs the specified command in the background. To safely send the & as a part
|
||||
@@ -499,7 +556,7 @@ FAQ
|
||||
pass in a POST using -d/--data you must encode it as '%25' (which then also
|
||||
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
|
||||
a URL specified to curl you must quote them.
|
||||
@@ -513,7 +570,7 @@ FAQ
|
||||
|
||||
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
|
||||
at the server, the HTTP protocol defines how the server should respond and
|
||||
@@ -554,7 +611,7 @@ FAQ
|
||||
containing a list of valid methods for the requested resource.
|
||||
|
||||
4.5.6 "301 Moved Permanently"
|
||||
|
||||
|
||||
If you get this return code and an HTML output similar to this:
|
||||
|
||||
<H1>Moved Permanently</H1> The document has moved <A
|
||||
@@ -564,34 +621,39 @@ FAQ
|
||||
slash. Try the same operation again _with_ the trailing URL, or use the
|
||||
-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
|
||||
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
|
||||
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:
|
||||
|
||||
The first part is to avoid having clear-text passwords in the command line
|
||||
so that they don't appear in 'ps' outputs and similar. That is easily
|
||||
avoided by using the "-K" option to tell curl to read parameters from a
|
||||
file or stdin to which you can pass the secret info.
|
||||
avoided by using the "-K" option to tell curl to read parameters from a file
|
||||
or stdin to which you can pass the secret info. curl itself will also
|
||||
attempt to "hide" the given password by blanking out the option - this
|
||||
doesn't work on all platforms.
|
||||
|
||||
To keep the passwords in your account secret from the rest of the world is
|
||||
not a task that curl addresses. You could of course encrypt them somehow to
|
||||
at least hide them from being read by human eyes, but that is not what
|
||||
anyone would call security.
|
||||
|
||||
Also note that regular HTTP and FTP passwords are sent in clear across the
|
||||
network. All it takes for anyone to fetch them is to listen on the network.
|
||||
Eavesdropping is very easy.
|
||||
Also note that regular HTTP (using Basic authentication) and FTP passwords
|
||||
are sent in clear across the network. All it takes for anyone to fetch them
|
||||
is to listen on the network. Eavesdropping is very easy. Use more secure
|
||||
authentication methods (like Digest, Negotiate or even NTLM) or consider the
|
||||
SSL-based alternatives HTTPS and FTPS.
|
||||
|
||||
4.8 I found a bug!
|
||||
|
||||
It is not a bug if the behavior is documented. Read the docs first.
|
||||
Especially check out the KNOWN_BUGS file, it may be a documented bug!
|
||||
|
||||
If it is a problem with a binary you've downloaded or a package for your
|
||||
particular platform, try contacting the person who built the package/archive
|
||||
@@ -600,7 +662,7 @@ FAQ
|
||||
If there is a bug, read the BUGS document first. Then report it as described
|
||||
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
|
||||
of this magic.
|
||||
@@ -629,7 +691,7 @@ FAQ
|
||||
You invoke curl 7.10 or later to communicate on a https:// URL and get an
|
||||
error back looking something similar to this:
|
||||
|
||||
curl: (35) SSL: error:14090086:SSL routines:
|
||||
curl: (35) SSL: error:14090086:SSL routines:
|
||||
SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
|
||||
|
||||
Then it means that curl couldn't verify that the server's certificate was
|
||||
@@ -648,9 +710,10 @@ FAQ
|
||||
Details are also in the SSLCERTS file in the release archives, found online
|
||||
here: http://curl.haxx.se/docs/sslcerts.html
|
||||
|
||||
|
||||
5. libcurl Issues
|
||||
|
||||
5.1. Is libcurl thread-safe?
|
||||
5.1 Is libcurl thread-safe?
|
||||
|
||||
Yes.
|
||||
|
||||
@@ -684,9 +747,9 @@ FAQ
|
||||
size_t
|
||||
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;
|
||||
|
||||
|
||||
mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
|
||||
if (mem->memory) {
|
||||
memcpy(&(mem->memory[mem->size]), ptr, realsize);
|
||||
@@ -740,6 +803,47 @@ FAQ
|
||||
|
||||
(Provided by Andrew Francis)
|
||||
|
||||
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
|
||||
|
||||
6. License Issues
|
||||
|
||||
@@ -748,32 +852,32 @@ FAQ
|
||||
is just a brief summary for the cases we get the most questions. (Parts of
|
||||
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!
|
||||
|
||||
Since libcurl may be distributed under the MIT/X derivate license, it can be
|
||||
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!
|
||||
|
||||
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!
|
||||
|
||||
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!
|
||||
|
||||
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!
|
||||
|
||||
@@ -781,7 +885,7 @@ FAQ
|
||||
the sources, on the condition that the copyright texts in the sources are
|
||||
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.
|
||||
|
||||
@@ -791,3 +895,26 @@ FAQ
|
||||
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
|
||||
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. We often call it PHP/CURL to differentiate from
|
||||
curl the command line tool and libcurl the library.
|
||||
|
||||
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
|
||||
|
||||
Misc
|
||||
- full URL syntax
|
||||
curl tool
|
||||
- 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 least download speed acceptable
|
||||
- custom output result after completion
|
||||
- multiple URLs
|
||||
- guesses protocol from host name unless specified
|
||||
- uses .netrc
|
||||
- progress bar/time specs while downloading
|
||||
- "standard" proxy environment variables support
|
||||
- config file support
|
||||
- compiles on win32 (reported builds on 40+ operating systems)
|
||||
- redirectable stderr
|
||||
- selectable network interface for outgoing traffic
|
||||
- IPv6 support
|
||||
- IPv6 support on unix and Windows
|
||||
- persistant connections
|
||||
- socks5 support
|
||||
- supports user name + password in proxy environment variables
|
||||
- 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/1.1 compliant (optionally uses 1.0)
|
||||
@@ -35,7 +42,7 @@ HTTP
|
||||
- POST
|
||||
- multipart formpost (RFC1867-style)
|
||||
- authentication: Basic, Digest, NTLM(*1), GSS-Negotiate/Negotiate(*3) and
|
||||
SPNEGO (*4)
|
||||
SPNEGO (*4) to server and proxy
|
||||
- resume (both GET and PUT)
|
||||
- follow redirects
|
||||
- maximum amount of redirects to follow
|
||||
@@ -80,6 +87,8 @@ FTP
|
||||
- via http-proxy
|
||||
- all operations can be tunneled through a http-proxy
|
||||
- customizable to retrieve file modification date
|
||||
- third party transfers
|
||||
- no dir depth limit
|
||||
|
||||
FTPS (*1)
|
||||
- explicit ftps:// support that use SSL on both connections
|
||||
@@ -103,6 +112,8 @@ GOPHER
|
||||
|
||||
FILE
|
||||
- URL support
|
||||
- "uploads"
|
||||
- resume
|
||||
|
||||
FOOTNOTES
|
||||
=========
|
||||
@@ -112,3 +123,4 @@ FOOTNOTES
|
||||
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
||||
*4 = requires FBopenssl
|
||||
*5 = requires a krb4 library, such as the MIT one or similar.
|
||||
*6 = requires c-ares
|
||||
|
||||
23
docs/HISTORY
23
docs/HISTORY
@@ -1,7 +1,7 @@
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
How cURL Became Like This
|
||||
@@ -124,3 +124,18 @@ November 2003: curl 7.10.8 is released. 45000 lines of code. ~55000 unique
|
||||
visitors to the curl.haxx.se site. Five official web mirrors.
|
||||
|
||||
December 2003, full-fledged SSL for FTP is supported.
|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
124
docs/INSTALL
124
docs/INSTALL
@@ -158,17 +158,9 @@ Win32
|
||||
Make the sources in the src/ drawer be a "win32 console application"
|
||||
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
|
||||
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:
|
||||
|
||||
@@ -189,28 +181,33 @@ Win32
|
||||
Microsoft command line style
|
||||
----------------------------
|
||||
|
||||
Run the 'vcvars32.bat' file to get a proper environment. The
|
||||
vcvars32.bat file is part of the Microsoft development environment and
|
||||
you may find it in 'C:\Program Files\Microsoft Visual Studio\vc98\bin'
|
||||
provided that you installed Visual C/C++ 6 in the default directory.
|
||||
|
||||
Then run 'nmake vc' in curl's root directory.
|
||||
|
||||
If you want to compile with zlib support, you will need to build
|
||||
zlib (http://www.gzip.org/zlib/) as well. Please read the zlib
|
||||
documentation on how to compile zlib. Define the ZLIB_PATH environment
|
||||
variable to the location of zlib.h and zlib.lib, for example:
|
||||
|
||||
set ZLIB_PATH=c:\zlib-1.2.1
|
||||
|
||||
Then run 'nmake vc-zlib' in curl's root directory.
|
||||
|
||||
If you want to compile with SSL support you need the OpenSSL package.
|
||||
Please read the OpenSSL documentation on how to compile and install
|
||||
the OpenSSL libraries. The build process of OpenSSL generates the
|
||||
libeay32.dll and ssleay32.dll files in the out32dll subdirectory in
|
||||
the OpenSSL home directory. OpenSSL static libraries (libeay32.lib,
|
||||
ssleay32.lib, RSAglue.lib) are created in the out32 subdirectory.
|
||||
|
||||
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
|
||||
the root/base directory of OpenSSL, for example:
|
||||
|
||||
set OPENSSL_PATH=c:\openssl-0.9.7a
|
||||
|
||||
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
|
||||
set OPENSSL_PATH=c:\openssl-0.9.7d
|
||||
|
||||
Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root
|
||||
directory. 'nmake vc-ssl' will create a libcurl static and dynamic
|
||||
@@ -219,10 +216,11 @@ Win32
|
||||
version is a standalone executable not requiring any DLL at
|
||||
runtime. This make method requires that you have the static OpenSSL
|
||||
libraries available in OpenSSL's out32 subdirectory.
|
||||
'nmake vc-ssl-dll' creates the libcurl dynamic library and
|
||||
links curl.exe against libcurl and OpenSSL dynamically.
|
||||
This executable requires libcurl.dll and the OpenSSL DLLs
|
||||
at runtime.
|
||||
'nmake vc-ssl-dll' creates the libcurl dynamic library and
|
||||
links curl.exe against libcurl and OpenSSL dynamically.
|
||||
This executable requires libcurl.dll and the OpenSSL DLLs
|
||||
at runtime.
|
||||
Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support.
|
||||
|
||||
Microsoft / Borland style
|
||||
-------------------------
|
||||
@@ -361,12 +359,12 @@ VMS
|
||||
the name can be fetched from external or internal message libraries
|
||||
Errorcode - the errodes assigned by the application
|
||||
Sev. - severity: Even = error, off = non error
|
||||
0 = Warning
|
||||
1 = Success
|
||||
2 = Error
|
||||
3 = Information
|
||||
4 = Fatal
|
||||
<5-7> reserved.
|
||||
0 = Warning
|
||||
1 = Success
|
||||
2 = Error
|
||||
3 = Information
|
||||
4 = Fatal
|
||||
<5-7> reserved.
|
||||
|
||||
This all presents itself with:
|
||||
%<FACILITY>-<SeV>-<Errorname>, <Error message>
|
||||
@@ -379,7 +377,7 @@ VMS
|
||||
|
||||
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:
|
||||
13-jul-2001
|
||||
@@ -472,6 +470,39 @@ AmigaOS
|
||||
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 availabable 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 optained from:
|
||||
http://www.gknw.com/mirror/zlib/
|
||||
|
||||
Set a search path to your compiler, linker and tools; if you want to have
|
||||
zlib support then set the environment var ZLIB_PATH pointing to your zlib
|
||||
sources, on Linux make sure the var OSTYPE contains the string 'linux';
|
||||
and finally type 'make netware' from the top source directory...
|
||||
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...;
|
||||
other options are currently not supported, although partly prepared.
|
||||
The Ares lib builds arlready fine, and both test tools work fine at least
|
||||
when build with CodeWarrior...; dont know yet why they fail when build with
|
||||
gcc though; if you want to compile with Ares support then set an env var
|
||||
WITH_ARES=1; I've not tested yet including libcares into curl.
|
||||
Any help in testing appreciated!
|
||||
Buils automatically created 4 times a day from current CVS are here:
|
||||
http://www.gknw.com/mirror/curl/autobuilds/
|
||||
the status of these buids can be viewed at the autobuild table:
|
||||
http://curl.haxx.se/auto/
|
||||
|
||||
|
||||
PORTS
|
||||
=====
|
||||
This is a probably incomplete list of known hardware and operating systems
|
||||
@@ -488,6 +519,7 @@ PORTS
|
||||
- Alpha Tru64 v5.0 5.1
|
||||
- HP-PA HP-UX 9.X 10.X 11.X
|
||||
- HP-PA Linux
|
||||
- HP3000 MPE/iX
|
||||
- MIPS IRIX 6.2, 6.5
|
||||
- MIPS Linux
|
||||
- Pocket PC/Win CE 3.0
|
||||
@@ -510,6 +542,7 @@ PORTS
|
||||
- i386 HURD
|
||||
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4
|
||||
- i386 NetBSD
|
||||
- i386 Novell NetWare
|
||||
- i386 OS/2
|
||||
- i386 OpenBSD
|
||||
- i386 SCO unix
|
||||
@@ -525,25 +558,10 @@ PORTS
|
||||
- s390 Linux
|
||||
- XScale/PXA250 Linux 2.4
|
||||
|
||||
OpenSSL
|
||||
=======
|
||||
|
||||
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
|
||||
Useful URLs
|
||||
===========
|
||||
|
||||
OpenSSL http://www.openssl.org
|
||||
MingW http://www.mingw.org
|
||||
OpenLDAP http://www.openldap.org
|
||||
Zlib http://www.gzip.org/zlib/
|
||||
|
||||
109
docs/KNOWN_BUGS
109
docs/KNOWN_BUGS
@@ -3,6 +3,29 @@ join in and help us correct one or more of these! Also be sure to check the
|
||||
changelog of the current development status, as one or more of these problems
|
||||
may have been fixed since this was written!
|
||||
|
||||
* curl version 7.12.2 fails on AIX if compiled with --enable-ares.
|
||||
The workaround is to combine --enable-ares with --disable-shared
|
||||
|
||||
* 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.
|
||||
|
||||
* Using configure --disable-[protocol] may cause 'make test' to fail for
|
||||
tests using the disabled protocol(s).
|
||||
|
||||
* 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
|
||||
|
||||
* If you use a very large amount of file descriptors (more than FD_SETSIZE)
|
||||
and then use libcurl, it might crash on its use of select() which then
|
||||
stores data out of bounds. Bug report #948950.
|
||||
|
||||
* --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.
|
||||
|
||||
* 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
|
||||
manually for HTTP PUT resume to work, and then '-C [index]'.
|
||||
@@ -19,42 +42,16 @@ may have been fixed since this was written!
|
||||
indicate that the user wants to reach the root dir (this exception SHALL
|
||||
remain even when this bug is fixed).
|
||||
|
||||
* 1) libcurl does a POST
|
||||
2) receives a 100-continue
|
||||
3) sends away the POST
|
||||
Now, if nothing else is returned from the server, libcurl MUST return
|
||||
CURLE_GOT_NOTHING, but it seems it returns CURLE_OK as it seems to count
|
||||
the 100-continue reply as a good enough reply.
|
||||
|
||||
* libcurl doesn't treat the content-length of compressed data properly, as
|
||||
it seems HTTP servers send the *uncompressed* length in that header and
|
||||
libcurl thinks of it as the *compressed* lenght. Some explanations are here:
|
||||
http://curl.haxx.se/mail/lib-2003-06/0146.html
|
||||
|
||||
* Downloading 0 (zero) bytes files over FTP will not create a zero byte file
|
||||
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
|
||||
|
||||
* Using CURLOPT_FAILONERROR (-f/--fail) will make authentication to stop
|
||||
working if you use anything but plain Basic auth.
|
||||
|
||||
* IPv6 support on AIX 4.3.3 doesn't work due to a missing sockaddr_storage
|
||||
struct. It has been reported to work on AIX 5.1 though.
|
||||
|
||||
* Running 'make test' on Mac OS X gives 4 errors. This seems to be related
|
||||
to some kind of libtool problem:
|
||||
http://curl.haxx.se/mail/archive-2002-03/0029.html and
|
||||
http://curl.haxx.se/mail/archive-2002-03/0033.html
|
||||
|
||||
* libcurl does not deal nicely with files larger than 2GB
|
||||
|
||||
* GOPHER transfers seem broken
|
||||
|
||||
* configure --disable-http is not fully supported. All other protocols seem
|
||||
to work to disable.
|
||||
|
||||
* The -m parameter does not work when using telnet with curl on Windows.
|
||||
|
||||
* If a HTTP server responds to a HEAD request and includes a body (thus
|
||||
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
|
||||
@@ -64,63 +61,3 @@ may have been fixed since this was written!
|
||||
and havoc is what happens.
|
||||
More details on this is found in this libcurl mailing list thread:
|
||||
http://curl.haxx.se/mail/lib-2002-08/0000.html
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Q: My program blows up when I run lots of curl_easy_perform() calls on a
|
||||
single thread
|
||||
Q: My program dies when a single thread re-enters the win32 select() call
|
||||
via curl_easy_perform()
|
||||
Q: --- add your own flavour here ---
|
||||
|
||||
Single Threaded Re-Entracy
|
||||
--------------------------
|
||||
|
||||
There is a glitch / trick to using cURL on Win32 related to re-entrancy.
|
||||
This experience was gained on verion 7.9.4 using Windows NT SP3 in a banking
|
||||
environment (just in case you wanted to know).
|
||||
|
||||
If you have already called curl_easy_perform(), and *somehow* you cause your
|
||||
single thread of execution to make another call to curl_easy_perform() - the
|
||||
windows socket() call used to create a new socket for the second connection
|
||||
can return with 10044 / 10043 error codes.
|
||||
|
||||
The WSA errors we experienced are:
|
||||
WSAEPROTONOSUPPORT
|
||||
(10043)
|
||||
Protocol not supported.
|
||||
The requested protocol has not been configured into the system, or no
|
||||
implementation for it exists. For example, a socket call requests a
|
||||
SOCK_DGRAM socket, but specifies a stream protocol.
|
||||
|
||||
WSAESOCKTNOSUPPORT
|
||||
(10044)
|
||||
Socket type not supported.
|
||||
The support for the specified socket type does not exist in this address
|
||||
family. For example, the optional type SOCK_RAW might be selected in a
|
||||
socket call, and the implementation does not support SOCK_RAW sockets at
|
||||
all.
|
||||
|
||||
We have experienced this by creating a timer that ticks every 20ms, and on
|
||||
the tick making a curl_easy_perform() call. The call usually completed in
|
||||
about 300ms. And we expected (before this test) that the timer would NOT be
|
||||
fired during a call to curl_easy_perform(), howvever, while the first
|
||||
curl_easy_perform() is running a tick *is* fired by the windows API somehow,
|
||||
and we then call curl_easy_perform() again - thus single threaded
|
||||
re-entrancy is achieved.
|
||||
|
||||
Notes:
|
||||
* We made sure that a new CURL structure was being used for each
|
||||
curl_easy_perform() request, and that the curl_global_init() had been called
|
||||
beforehand.
|
||||
* I'm happy to answer any questions about this problem to try to track it
|
||||
down.
|
||||
* Once the socket() call started failing, there is no hope - it never works
|
||||
again.
|
||||
* Slowing the timer down to give each request enough time to complete solves
|
||||
this problem completely.
|
||||
|
||||
If anyone has the source code to the WinNT implementation of socket() and
|
||||
can figure out WHY this can occur, more tracing can be performed.
|
||||
|
||||
John Clayton <John.Clayton at barclayscapital.com>
|
||||
|
||||
86
docs/LICENSE-MIXING
Normal file
86
docs/LICENSE-MIXING
Normal file
@@ -0,0 +1,86 @@
|
||||
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, unless there's a specified exception in the GPL-licensed module). 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
|
||||
|
||||
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).
|
||||
|
||||
c-ares http://daniel.haxx.se/projects/c-ares/license.html
|
||||
|
||||
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
|
||||
|
||||
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.
|
||||
|
||||
GSSAPI
|
||||
|
||||
While nothing in particular says that a GSS/Kerberos5 library must use
|
||||
any particular license, the one I've used (Heimdal) is Original BSD-
|
||||
licensed with the announcement clause.
|
||||
|
||||
fbopenssl
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
37
docs/MANUAL
37
docs/MANUAL
@@ -63,6 +63,11 @@ USING PASSWORDS
|
||||
|
||||
curl -u name:passwd ftp://machine.domain:port/full/path/to/file
|
||||
|
||||
FTPS
|
||||
|
||||
It is just like for FTP, but you may also want to specify and use
|
||||
SSL-specific options for certificates etc.
|
||||
|
||||
HTTP
|
||||
|
||||
The HTTP URL doesn't support user and password in the URL string. Curl
|
||||
@@ -75,6 +80,12 @@ USING PASSWORDS
|
||||
|
||||
curl -u name:passwd http://machine.domain/full/path/to/file
|
||||
|
||||
HTTP offers many different methods of authentication and curl supports
|
||||
several: Basic, Digest, NTLM and Negotiate. Without telling which method to
|
||||
use, curl defaults to Basic. You can also ask curl to pick the most secure
|
||||
ones out of the ones that the server accepts for the given URL, by using
|
||||
--anyauth.
|
||||
|
||||
NOTE! Since HTTP URLs don't support user and password, you can't use that
|
||||
style when using Curl via a proxy. You _must_ use the -u style fetch
|
||||
during such circumstances.
|
||||
@@ -569,11 +580,11 @@ NETWORK 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
|
||||
|
||||
curl --interface 192.168.1.10 http://www.netscape.com/
|
||||
curl --interface 192.168.1.10 http://www.netscape.com/
|
||||
|
||||
HTTPS
|
||||
|
||||
@@ -836,13 +847,11 @@ PERSISTANT CONNECTIONS
|
||||
transfers faster. If you use a http proxy for file transfers, practicly
|
||||
all transfers will be persistant.
|
||||
|
||||
Persistant connections were introduced in curl 7.7.
|
||||
|
||||
MAILING LISTS
|
||||
|
||||
For your convenience, we have several open mailing lists to discuss curl,
|
||||
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
|
||||
|
||||
@@ -856,24 +865,18 @@ MAILING LISTS
|
||||
|
||||
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
|
||||
with a curl angle.
|
||||
|
||||
curl-commits
|
||||
curl-and-python
|
||||
|
||||
Receives notifications on all CVS commits done to the curl source module.
|
||||
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...
|
||||
Python hackers using curl with or without the python binding pycurl.
|
||||
|
||||
Please direct curl questions, feature requests and trouble reports to one of
|
||||
these mailing lists instead of mailing any individual.
|
||||
|
||||
@@ -4,25 +4,20 @@
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign no-dependencies
|
||||
|
||||
man_MANS = \
|
||||
curl.1 \
|
||||
curl-config.1
|
||||
man_MANS = curl.1 curl-config.1
|
||||
GENHTMLPAGES = curl.html curl-config.html
|
||||
PDFPAGES = curl.pdf curl-config.pdf
|
||||
|
||||
HTMLPAGES = \
|
||||
curl.html \
|
||||
curl-config.html \
|
||||
index.html
|
||||
|
||||
PDFPAGES = \
|
||||
curl.pdf \
|
||||
curl-config.pdf
|
||||
HTMLPAGES = $(GENHTMLPAGES) index.html
|
||||
|
||||
SUBDIRS = examples libcurl
|
||||
|
||||
CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES)
|
||||
|
||||
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
|
||||
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS \
|
||||
VERSIONS KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) \
|
||||
HISTORY INSTALL libcurl-the-guide $(PDFPAGES)
|
||||
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
|
||||
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
|
||||
$(PDFPAGES) LICENSE-MIXING README.netware
|
||||
|
||||
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,39 +1,92 @@
|
||||
Peer SSL Certificate Verification
|
||||
=================================
|
||||
|
||||
Starting in 7.10, libcurl performs peer SSL certificate verification by
|
||||
default. This is done by installing a default CA cert bundle on 'make install'
|
||||
(or similar), that CA bundle package is used by default on operations against
|
||||
SSL servers.
|
||||
libcurl performs peer SSL certificate verification by default. This is done by
|
||||
installing a default CA cert bundle on 'make install' (or similar), that CA
|
||||
bundle package is used by default on operations against SSL servers.
|
||||
|
||||
Alas, if you communicate with HTTPS servers using certificates that are signed
|
||||
by CAs present in the bundle, you will not notice any changed behavior and you
|
||||
will seamlessly get a higher security level on your SSL connections since you
|
||||
can be sure that the remote server really is the one it claims to be.
|
||||
If you communicate with HTTPS or FTPS servers using certificates that are
|
||||
signed by CAs present in the bundle, you can be sure that the remote server
|
||||
really is the one it claims to be.
|
||||
|
||||
If the remote server uses a self-signed certificate, or if you don't install
|
||||
curl's CA cert bundle or if it uses a certificate signed by a CA that isn't
|
||||
included in the bundle, then you need to do one of the following:
|
||||
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
|
||||
isn't included in the bundle or if the remote host is an impostor
|
||||
impersonating your favorite site, and you want to transfer files from this
|
||||
server, do one of the following:
|
||||
|
||||
1. Tell libcurl to *not* verify the peer. With libcurl you disable with with
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
|
||||
|
||||
With the curl command tool, you disable this with -k/--insecure.
|
||||
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
|
||||
option to point out this CA cert for verification when connecting. For
|
||||
libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath);
|
||||
|
||||
With the curl command tool: --cacert [file]
|
||||
With the curl command line tool: --cacert [file]
|
||||
|
||||
Neglecting to use one of the above menthods when dealing with a server using a
|
||||
certficate that isn't signed by one of the certficates in the installed CA
|
||||
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:
|
||||
/usr/local/share/curl/curl-ca-bundle.crt, which can be changed by running
|
||||
configure with the --with-ca-bundle option pointing out the path of your
|
||||
choice.
|
||||
|
||||
To do this, you need to get the CA cert for your server in PEM format and
|
||||
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")
|
||||
during the handshake and SSL will then refuse further communication with that
|
||||
server.
|
||||
|
||||
This procedure has been deemed The Right Thing even though it adds this extra
|
||||
trouble for some users, since it adds security to a majority of the SSL
|
||||
connections that previously weren't really secure. It turned out many people
|
||||
were using previous versions of curl/libcurl without realizing the need for
|
||||
the CA cert options to get truly secure SSL connections.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user