Compare commits
	
		
			1244 Commits
		
	
	
		
			pre-ares
			...
			curl-7_11_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 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 | ||
|   | fadf077502 | ||
|   | 863c7c7282 | ||
|   | 3a85b187c6 | ||
|   | 296ccc35d2 | ||
|   | 68826c25f8 | ||
|   | 5e2fcc1f74 | ||
|   | e262a7265a | ||
|   | 945c6f7279 | ||
|   | 6ddec1f169 | ||
|   | 9beae7693a | ||
|   | d204c62c39 | ||
|   | 13dd99842a | ||
|   | 2431b2caff | ||
|   | f44bc85545 | ||
|   | 52df162c2f | ||
|   | 60787171c7 | ||
|   | 61e3d75def | ||
|   | 27b7220f1b | ||
|   | a275365c72 | ||
|   | 80ef1bad86 | ||
|   | 686c70c5b5 | ||
|   | f94502ecba | ||
|   | 4c70c3e820 | ||
|   | 84990cb176 | ||
|   | eabbb5331a | ||
|   | 898bf8bb0b | ||
|   | 3d66d10fbe | ||
|   | 7052daf475 | ||
|   | 846d203d31 | ||
|   | 7561cbda0a | ||
|   | c5c89862b2 | ||
|   | 3a70d686ee | ||
|   | 2d567af069 | ||
|   | d2f7037ff7 | ||
|   | c3614fa6a3 | ||
|   | f1da9e508e | ||
|   | 9e80356dd5 | ||
|   | 4a4295290d | ||
|   | 57f67d0241 | ||
|   | d50c9218c7 | ||
|   | 3c1bb36193 | ||
|   | 16c747da76 | ||
|   | baf948db40 | ||
|   | 9906eb8e19 | ||
|   | 44d931dbc7 | ||
|   | d0ad607c46 | ||
|   | 36f76396ea | ||
|   | 1cb3cd1463 | ||
|   | a76235c008 | ||
|   | 71b3cc08a6 | ||
|   | d8dd9b0008 | ||
|   | 35fd3a3139 | ||
|   | 90be1d157e | ||
|   | 8433068f3a | ||
|   | e043cf22e2 | ||
|   | 206039cb76 | ||
|   | 4ba05e1128 | ||
|   | 0ae7e93299 | ||
|   | 5baf747e67 | ||
|   | 3a61c98b65 | ||
|   | 5173bab0bb | ||
|   | b291bbc9a6 | ||
|   | 11e8600390 | ||
|   | 93aea06ed9 | ||
|   | 9e5aee63c7 | ||
|   | 60cc5a3f27 | ||
|   | 5ac047dc39 | ||
|   | 6cd280fdfb | ||
|   | c8ac7a0d95 | ||
|   | 44031f32a1 | ||
|   | 7237221108 | ||
|   | ad36138f52 | ||
|   | 8a16e48a6c | ||
|   | 4c3a2318ae | ||
|   | 7beac70644 | ||
|   | b16dfbee99 | ||
|   | 202e54cf9c | ||
|   | e0d9e7a255 | ||
|   | c2bc5662b5 | ||
|   | f4569f10f0 | ||
|   | 23cfb9a832 | ||
|   | b921777057 | ||
|   | ff6d9a1109 | ||
|   | 053f6c85ef | ||
|   | 9970fb863d | ||
|   | feeef39ebf | ||
|   | 7bf11297fe | ||
|   | 292ef5fabb | ||
|   | 2b277f85f5 | ||
|   | 9363d94f9b | ||
|   | ea1c98dccf | ||
|   | 1109a4a629 | ||
|   | 2d01740e1a | ||
|   | 979a1e6237 | ||
|   | b60e0fa97e | ||
|   | 41c6f68d94 | ||
|   | 411d0cb715 | ||
|   | 8b3946efda | ||
|   | 763d6a8524 | ||
|   | 232b051254 | ||
|   | aef6208bd7 | ||
|   | 50c5a69d70 | ||
|   | 9ebe4ab60c | ||
|   | a0edfb90c2 | ||
|   | 93a8572928 | ||
|   | 591fe66f18 | ||
|   | a99e6445bf | ||
|   | f3e5d4a602 | ||
|   | 1d6248baa4 | ||
|   | 61685fee7e | ||
|   | 55e4d79111 | ||
|   | 84b3c3b569 | ||
|   | 4ea14b25df | ||
|   | 4223f602ed | ||
|   | 8146d46386 | ||
|   | 36a2fac79f | ||
|   | 58cf108251 | ||
|   | 6c6e5522cb | ||
|   | aff9a817b4 | ||
|   | f4e987cd19 | ||
|   | b3afb31181 | ||
|   | a3ad4295c9 | ||
|   | 2450506c83 | ||
|   | 23a6041698 | ||
|   | 979ba8a8b5 | ||
|   | cd9dea3091 | ||
|   | 989ec98ebd | ||
|   | d262d0a62a | ||
|   | 15b775e126 | ||
|   | 3788f25eac | ||
|   | 5b8852107b | ||
|   | cfe53768dd | ||
|   | 947e656367 | ||
|   | 50e7545118 | ||
|   | 0839d6e6bc | ||
|   | bbafc27b42 | ||
|   | a7de09a966 | ||
|   | 1410deb8f7 | ||
|   | 7dea4acc46 | ||
|   | a3c09e636d | ||
|   | a025425d06 | ||
|   | 4eb9ac0821 | ||
|   | 77a5e7c646 | ||
|   | 8f0abd31c5 | ||
|   | a13f85fb33 | ||
|   | 3b048880ad | ||
|   | 24ac5b8a6c | ||
|   | 9bc97b2d3c | ||
|   | 9825d81973 | ||
|   | 1e012c5259 | ||
|   | 68c508976f | ||
|   | 4d8a53da2f | ||
|   | 29d3deaee8 | ||
|   | 6c56340e1a | ||
|   | 134ab91358 | ||
|   | fb927939e2 | ||
|   | ac114ed45b | ||
|   | d46a735418 | ||
|   | 5a87203fe4 | ||
|   | 90e9c64f72 | ||
|   | 8742d39060 | ||
|   | 821302bcf3 | ||
|   | f68219ddaa | ||
|   | 7e3cd82b50 | ||
|   | bc372815a8 | ||
|   | 391a37ebbf | ||
|   | a61dc1e9c5 | ||
|   | 2e0d1a55c6 | ||
|   | dfd1a636b4 | ||
|   | ee337309cf | ||
|   | 437afe0767 | ||
|   | 0ab2dff69c | ||
|   | bff59dac12 | ||
|   | ea53aed841 | ||
|   | e2555cf83d | ||
|   | f7c8a57206 | ||
|   | 02bf6660bf | ||
|   | 6c8e6df38f | ||
|   | 96d3db1687 | ||
|   | 3e43105ff1 | ||
|   | 8ccc1148d9 | ||
|   | 06c38330ba | ||
|   | 0f4d042d3e | ||
|   | c79de8d86e | ||
|   | d670f308a6 | ||
|   | e64e9d7fed | ||
|   | ad5ead8bed | ||
|   | 1b99d33b59 | ||
|   | 800052dc50 | ||
|   | d4629fd395 | ||
|   | 2c22feced2 | ||
|   | 41688a1642 | ||
|   | 2cf209d3f7 | ||
|   | 909887f310 | ||
|   | d1d417664e | ||
|   | 7d7e99104e | ||
|   | 3eeea48839 | ||
|   | cd653f1be9 | ||
|   | 5751796ddd | ||
|   | 012c4ee1fa | ||
|   | 426954ff95 | ||
|   | 471c30372b | ||
|   | f6413f2cb4 | ||
|   | e80bdd66f9 | ||
|   | d083fac1fc | ||
|   | 1d85f950bf | ||
|   | 1d977b7848 | ||
|   | b3803903d1 | ||
|   | efc9410796 | ||
|   | 45614d54c6 | ||
|   | 50e690f2dd | ||
|   | 2f9f843e8a | ||
|   | 15d41dfbcd | ||
|   | bc01ad5b9e | ||
|   | dadc1026f1 | ||
|   | d8cf2d42c0 | ||
|   | 96d7a95ce4 | ||
|   | d5d55a856e | ||
|   | dac045029a | ||
|   | 1e98727c55 | ||
|   | 1c700b5a5c | ||
|   | af9dc9f128 | ||
|   | 4874aa6986 | ||
|   | c0336dcc52 | ||
|   | 78fb476677 | ||
|   | 3fed12a203 | ||
|   | ed2b831afe | ||
|   | f481b3e1dc | ||
|   | 2769f3b245 | ||
|   | e9a545c710 | ||
|   | edce444551 | ||
|   | 7bee4140e8 | ||
|   | cc48658564 | ||
|   | 79e4aee185 | ||
|   | 4d28012468 | ||
|   | e1d01045e2 | ||
|   | 0717e4690e | ||
|   | a0a5668dbd | ||
|   | bfc7d6c11b | ||
|   | dfe0118033 | ||
|   | a701f3dddf | ||
|   | f99a1d4e82 | ||
|   | 43bb20461f | ||
|   | b9d3c71178 | ||
|   | 1e251a64f3 | ||
|   | 776f0bd95e | ||
|   | cd9aabb474 | ||
|   | e42f806b3f | ||
|   | 0850aec780 | ||
|   | ad77f760cf | ||
|   | a50d2a45d7 | ||
|   | 17a834bc63 | ||
|   | c10bc0ef12 | ||
|   | f9b1981bd7 | ||
|   | 451d34ce21 | ||
|   | 445950aa70 | ||
|   | 8be602cdfd | ||
|   | 3dd40cca9a | ||
|   | f1445ea228 | ||
|   | c40309ae21 | ||
|   | fe0b5801ec | ||
|   | 3de511b248 | ||
|   | b1aa8eb7ef | ||
|   | 967cb4d75e | ||
|   | bcbaeaf7d5 | ||
|   | 41be41358e | ||
|   | ecb818805b | ||
|   | d95f7129d5 | ||
|   | 6294b356fb | ||
|   | 3e64a76498 | ||
|   | dec9907c16 | ||
|   | 527850928d | ||
|   | eee3f13134 | ||
|   | 80d2be541d | ||
|   | 472c4d8616 | ||
|   | 45abf75e1e | ||
|   | 4ec4e91de0 | ||
|   | f6645094a2 | ||
|   | 7496e87d16 | ||
|   | bd4c081157 | ||
|   | 927e392b31 | ||
|   | aeb5edbf07 | ||
|   | 67dcddbef7 | ||
|   | 7ffb8c6aee | ||
|   | 344c378996 | ||
|   | 445f54db57 | ||
|   | 9b7c311929 | ||
|   | 6a21a28048 | ||
|   | 0adb75114b | ||
|   | ecfb53f06d | ||
|   | c020ee2eb6 | ||
|   | a3279d4baf | ||
|   | c45f43ce32 | ||
|   | 0eb037a849 | ||
|   | 5a089f6c1f | ||
|   | 556d59dfcf | ||
|   | 79cb1400ab | ||
|   | d1b94a5f3f | ||
|   | a07f43d202 | ||
|   | a717afc3a7 | ||
|   | f023b4cc79 | ||
|   | a7aacac5e8 | ||
|   | decdb93ccb | ||
|   | 3e24c6a957 | ||
|   | 00d2c9d92d | ||
|   | bd383f0c60 | ||
|   | 900cecae96 | ||
|   | ffc58c6620 | ||
|   | 39f673874f | ||
|   | fe291202db | ||
|   | 4606dc4158 | ||
|   | 36d6b16c23 | ||
|   | b4d8108ba1 | ||
|   | 2c120aa05c | ||
|   | 693df0fa34 | ||
|   | fb26b2bd98 | ||
|   | 5554f1ccba | ||
|   | 46accd62d1 | ||
|   | 41535eaea9 | ||
|   | 02437b2d51 | ||
|   | c964aedf3b | ||
|   | 5f4fb857f0 | ||
|   | 0334509754 | ||
|   | aad70aa24e | ||
|   | e9c835ad06 | ||
|   | 0701b973df | ||
|   | ec59aa259f | ||
|   | ffc6d062d8 | ||
|   | 757a7d0851 | ||
|   | 25613503cb | ||
|   | 60ef75f2ee | ||
|   | 1cdc66d927 | ||
|   | ba12c5deda | ||
|   | 203f66d0cb | ||
|   | 54c6f2c7c0 | ||
|   | 4cccceb034 | ||
|   | 245ab7c796 | ||
|   | 2bdf52d4c5 | ||
|   | f991a69cce | ||
|   | 3dd26b7932 | ||
|   | a5e22867c7 | ||
|   | 5c96266d45 | ||
|   | fcfc6de918 | ||
|   | da0b380655 | ||
|   | ed7ac3c932 | ||
|   | b5d4a71883 | ||
|   | a9d74e6c97 | ||
|   | d46afd2b6a | ||
|   | ce4b8420d1 | ||
|   | faabd44658 | ||
|   | 2fe5f5ab4b | ||
|   | 656d4b4c20 | ||
|   | 7247041e21 | ||
|   | 017a78d0c5 | ||
|   | 9010bd3831 | ||
|   | ded884e825 | ||
|   | b53a5e92c0 | ||
|   | 69bdb82586 | ||
|   | 4799d39be6 | ||
|   | f32d011d90 | ||
|   | 14f795816d | ||
|   | 5987791516 | ||
|   | db074518c3 | ||
|   | 64731b0056 | ||
|   | debe6a1432 | ||
|   | 715c3f6482 | ||
|   | f232baf4d2 | ||
|   | b439e8ffb7 | ||
|   | 475166fc8b | ||
|   | be2b742b85 | ||
|   | 640d6a5564 | ||
|   | 2e9d100d03 | ||
|   | 294adcae9d | ||
|   | 1fd16e7b04 | ||
|   | d1c08e1d85 | ||
|   | d7c09efeb1 | ||
|   | b83c7ade10 | ||
|   | 7d6584e140 | ||
|   | 31b6bb6a41 | ||
|   | b84607ff7b | ||
|   | ac2af59880 | ||
|   | d9f961ed2d | ||
|   | c7f5476416 | ||
|   | 381c6c5d52 | ||
|   | 9df8f9a63d | ||
|   | 5eee801d06 | ||
|   | 80a06403e4 | ||
|   | 7ad69f59c7 | ||
|   | 83b82e4472 | ||
|   | 65dab79ca5 | ||
|   | f0089b6291 | ||
|   | d10508e08c | ||
|   | 630995f40a | ||
|   | f7f7cd6cce | ||
|   | ce7326ed09 | ||
|   | b3591ec464 | ||
|   | b1952e773a | ||
|   | ce5db9a86e | ||
|   | 94568f884d | ||
|   | d095b20d1c | ||
|   | 18b809e7e4 | ||
|   | 3f458fc650 | ||
|   | 9935d33b8e | ||
|   | d42c6b7e78 | ||
|   | d70550f949 | ||
|   | 679654bd47 | ||
|   | 9e3f54431d | ||
|   | 3d59934163 | ||
|   | a77d931cd0 | ||
|   | 260c353577 | ||
|   | 8823679e70 | ||
|   | 722ece4055 | ||
|   | cc09e31acf | ||
|   | fe09079778 | ||
|   | 8f5b80c715 | ||
|   | 460979496e | ||
|   | cadcc12169 | ||
|   | 22adcb9cd1 | ||
|   | 597c1fe6bc | ||
|   | 7201a5a290 | ||
|   | c6a0bb99af | ||
|   | 622984de64 | ||
|   | a9af971c59 | ||
|   | 171229e122 | ||
|   | b71ca15598 | ||
|   | 1c604b7ba9 | ||
|   | 749f5387c1 | ||
|   | 7553341bad | ||
|   | c6f11b053d | ||
|   | 7d6e2a3adb | ||
|   | 43cc844d3f | ||
|   | 941dfc502a | ||
|   | 8341e8e502 | ||
|   | e85881d7ec | ||
|   | c9d154ca7f | ||
|   | 5911485f38 | ||
|   | 6d6de53eb9 | ||
|   | 022996e5c7 | ||
|   | 4935853eb9 | ||
|   | d1a3c9944e | ||
|   | 8996a7346e | ||
|   | e4adbf4017 | ||
|   | c29740f0d8 | ||
|   | 1a4fddb9ba | ||
|   | af19ff51e6 | ||
|   | 5438ced6b3 | ||
|   | 2eb3ad7678 | ||
|   | b86ad6438e | ||
|   | 81f250be59 | ||
|   | 9db5dfc15d | ||
|   | 377ce6a2c2 | ||
|   | 867c189ef7 | ||
|   | 33525ac165 | ||
|   | 5c52cacc98 | ||
|   | e612f73374 | ||
|   | ff5b6ff528 | ||
|   | c86768d856 | ||
|   | 9f002b1289 | ||
|   | 0436fbe226 | ||
|   | 6494889e3b | ||
|   | f52534522c | ||
|   | 0b615afac9 | ||
|   | b61c25af45 | ||
|   | bf20ed5984 | ||
|   | 9d5c22d5ae | ||
|   | aaddfa0181 | ||
|   | 17e13acd10 | ||
|   | 5564e9a321 | ||
|   | a0118fb390 | ||
|   | 57b6202eaa | ||
|   | 0bbe184f1f | ||
|   | 1b0af1c53a | ||
|   | 23f8692058 | ||
|   | 780652e5b6 | ||
|   | 8297ac4a28 | ||
|   | 45ef092cc2 | ||
|   | a191fe028c | ||
|   | 343291ce37 | ||
|   | b864e25011 | ||
|   | 24836d30f5 | ||
|   | ba1ff79b3f | ||
|   | 09d593ade0 | ||
|   | d1b17779a3 | ||
|   | 588b63a05b | ||
|   | a5c2a86649 | ||
|   | 8a46c64c78 | ||
|   | 2d4c0af528 | ||
|   | edd09a1b16 | ||
|   | 0edab55dd2 | ||
|   | 16643faaa1 | ||
|   | 881c38b38a | ||
|   | 59889d45da | ||
|   | 734c17ae56 | ||
|   | 48c1943824 | ||
|   | 9ef76fecef | ||
|   | 8aa2894bfb | ||
|   | f40467638d | ||
|   | 2297eca103 | ||
|   | 09ccfcdcd4 | ||
|   | bbc01c36d2 | ||
|   | b560428492 | ||
|   | d19134e644 | ||
|   | 951e2a6545 | ||
|   | fcacd38036 | ||
|   | c4aca23ec4 | ||
|   | 20943292ff | ||
|   | b2ddfb54a7 | ||
|   | 76b9631d03 | ||
|   | 58b1437cae | ||
|   | c611ac958e | ||
|   | e7160459ab | ||
|   | 071fc74c0e | ||
|   | 14597475b1 | ||
|   | de3281a3a8 | ||
|   | 6e16985156 | ||
|   | 50dacab379 | ||
|   | 7c2930611b | ||
|   | 84bc46ac3b | ||
|   | fd42247cac | ||
|   | 0efcb57623 | ||
|   | 6fde147273 | ||
|   | cc497fd153 | ||
|   | c1f31180a2 | ||
|   | d4ab68cd51 | ||
|   | e8c762981a | ||
|   | 0ef3e6fe8a | ||
|   | adcbe03aeb | ||
|   | 359c0eac0d | ||
|   | a53d7848eb | ||
|   | 29b7fb628e | ||
|   | df760a0a4b | ||
|   | f2057eb744 | ||
|   | 2956fe97a0 | ||
|   | 1f9b0e70ab | ||
|   | 8fae12b2f1 | ||
|   | 7410210f19 | ||
|   | 40e6b12cca | ||
|   | f2d422235b | ||
|   | 6a678f6d64 | ||
|   | 52ceab5e41 | ||
|   | cafcc242e6 | ||
|   | 2ad0a7d20f | ||
|   | 481094db90 | ||
|   | 840c0af014 | ||
|   | f193ab4b59 | ||
|   | f7db3023a8 | ||
|   | cfe80449e2 | ||
|   | 818d231849 | ||
|   | eb9937ec1a | ||
|   | 070cd2b52f | ||
|   | 96d9ddee38 | ||
|   | 5629eeaec2 | ||
|   | 46c2bc4bb6 | ||
|   | 3938e0f58b | ||
|   | fa162e8feb | ||
|   | a95df8246b | ||
|   | 8feb5110b5 | ||
|   | 32899f8309 | ||
|   | dc7c6d1030 | ||
|   | 7fdd0bd367 | ||
|   | 4459d3b434 | ||
|   | 7e7d89471a | ||
|   | e67d15b50e | ||
|   | bd78878cc3 | ||
|   | 5974309d10 | ||
|   | d00e4a377b | ||
|   | afc6ade2b9 | ||
|   | 734e8d6229 | ||
|   | 61629d2c86 | ||
|   | cb48c6a3d8 | ||
|   | 93a29c3c45 | ||
|   | e92b7c73bc | ||
|   | 0ea74e3255 | ||
|   | 3bd52e3cb1 | ||
|   | c7f9c51fe6 | ||
|   | b1da98170f | ||
|   | 0496598e77 | ||
|   | fb3eee5f0b | ||
|   | e16bc91601 | ||
|   | a8c78cbbb0 | ||
|   | 3a5a6038e7 | ||
|   | d412724598 | ||
|   | f95de76789 | ||
|   | 33cf204e9a | ||
|   | dafc652f63 | ||
|   | c16dd085f1 | ||
|   | a7349a48ff | ||
|   | 8042cd93c3 | ||
|   | 394faaeb97 | ||
|   | 5c2df3e1a4 | ||
|   | 6fc55467f4 | ||
|   | a147a07956 | ||
|   | a10581d459 | ||
|   | cc2d6942bb | ||
|   | 3974c02bb1 | ||
|   | 09b5ddaea5 | ||
|   | acbcd68d89 | ||
|   | 4281470fca | ||
|   | 68a4aa6773 | ||
|   | 905b160097 | ||
|   | 52596c339b | ||
|   | 73500267ee | ||
|   | e6011e33a6 | ||
|   | 3454319c17 | ||
|   | 02c78ecf81 | ||
|   | caca034302 | ||
|   | fb366ed35f | ||
|   | b352ffca15 | ||
|   | 2d94856efd | ||
|   | ae66bd1284 | ||
|   | 89d9d4e6c8 | ||
|   | fe60fc4730 | ||
|   | 46690d5e1c | ||
|   | beaea8cb25 | ||
|   | 409ec90c85 | ||
|   | 4d423eeabe | ||
|   | 019e612225 | ||
|   | 6550d271f0 | ||
|   | c46da65263 | ||
|   | b46745759b | ||
|   | 9687571a84 | ||
|   | c13236de25 | ||
|   | 8ffbb6acd4 | ||
|   | a3e5d81765 | ||
|   | e2aecfe80f | ||
|   | a3c1248214 | ||
|   | b933639222 | ||
|   | 27619fc450 | ||
|   | 96fecba190 | ||
|   | 50257d4f50 | ||
|   | 3eb4ae031c | ||
|   | 6a4ec3be81 | ||
|   | cc9ac6ad14 | ||
|   | 644990a835 | ||
|   | d3b81ea3f7 | ||
|   | 3660f67534 | ||
|   | 203cc4a5c3 | ||
|   | c7be232fee | ||
|   | 2617b379be | ||
|   | 84ed5e755a | ||
|   | 2f17615790 | ||
|   | acfa131c8c | ||
|   | 793d0e27e1 | ||
|   | fdf0c443c3 | ||
|   | 1b39b53321 | ||
|   | 1679993e3b | ||
|   | 4c831f8b68 | ||
|   | 7a19923afa | ||
|   | 3e122a765d | ||
|   | d873ba8c9f | ||
|   | 8093338f39 | ||
|   | 07660eea1e | ||
|   | a2b2d4cd5c | ||
|   | 96e217b496 | ||
|   | 2dd1518d63 | ||
|   | 168703b7bf | ||
|   | 0f2d680f1f | ||
|   | b7930b6ebd | ||
|   | 8fa43b469a | ||
|   | 894e52f61a | ||
|   | 3c294691aa | ||
|   | acbf932861 | ||
|   | 26f5c53be8 | ||
|   | 8dd069604c | ||
|   | 5dadbd094e | ||
|   | 514a8739b6 | ||
|   | 12e78a082e | ||
|   | 9273096a8a | ||
|   | 686c6133f8 | ||
|   | 1d1276cc3a | ||
|   | d987676ef0 | ||
|   | 6e4658c89d | ||
|   | b7cbcf7434 | ||
|   | e347d06a49 | ||
|   | 2077e9365a | ||
|   | 6e3adc9b14 | ||
|   | 7954eee639 | ||
|   | f9f1f0e316 | ||
|   | a9afe6aa84 | ||
|   | 6d36796135 | ||
|   | 9e81fd5703 | ||
|   | 609059b6ec | ||
|   | 6af73f417a | ||
|   | 32468a0072 | ||
|   | 6800c45104 | ||
|   | 0d8c754ffd | ||
|   | 1b80276496 | ||
|   | bf9a138276 | ||
|   | b3f9c636b9 | ||
|   | 18975d44a6 | ||
|   | b201db5cec | ||
|   | bbe23945e4 | ||
|   | bbdc0394ff | ||
|   | 38a9b14965 | ||
|   | 77ba0d3686 | ||
|   | 065c8d7a95 | ||
|   | c704d1545c | ||
|   | 62b65a5f20 | ||
|   | 665a7a3848 | ||
|   | 256b9f31e1 | ||
|   | a3037e1173 | ||
|   | f3e7a5d755 | ||
|   | 5f0cba7775 | ||
|   | 673759fe7e | ||
|   | b73612392d | ||
|   | f85935f0f9 | 
							
								
								
									
										2
									
								
								COPYING
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								COPYING
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| COPYRIGHT AND PERMISSION NOTICE | ||||
|  | ||||
| Copyright (c) 1996 - 2003, Daniel Stenberg, <daniel@haxx.se>. | ||||
| Copyright (c) 1996 - 2004, Daniel Stenberg, <daniel@haxx.se>. | ||||
|  | ||||
| All rights reserved. | ||||
|  | ||||
|   | ||||
							
								
								
									
										10
									
								
								CVS-INFO
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								CVS-INFO
									
									
									
									
									
								
							| @@ -25,7 +25,8 @@ Compile and build instructions follow below. | ||||
|  | ||||
|   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 +36,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) | ||||
|   | ||||
							
								
								
									
										36
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -1,21 +1,44 @@ | ||||
| #*************************************************************************** | ||||
| #                                  _   _ ____  _ | ||||
| #  Project                     ___| | | |  _ \| | | ||||
| #                             / __| | | | |_) | | | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # | ||||
| # This software is licensed as described in the file COPYING, which | ||||
| # you should have received as part of this distribution. The terms | ||||
| # are also available at http://curl.haxx.se/docs/copyright.html. | ||||
| # | ||||
| # You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||
| # copies of the Software, and permit persons to whom the Software is | ||||
| # furnished to do so, under the terms of the COPYING file. | ||||
| # | ||||
| # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||
| # KIND, either express or implied. | ||||
| # | ||||
| # $Id$ | ||||
| # | ||||
| ########################################################################### | ||||
|  | ||||
| AUTOMAKE_OPTIONS = foreign | ||||
|  | ||||
| EXTRA_DIST = CHANGES COPYING maketgz reconf Makefile.dist	\ | ||||
|   curl-config.in build_vms.com curl-style.el sample.emacs testcurl.sh | ||||
|   curl-config.in curl-style.el sample.emacs testcurl.sh RELEASE-NOTES | ||||
|  | ||||
| bin_SCRIPTS = curl-config | ||||
|  | ||||
| SUBDIRS = lib src | ||||
| DIST_SUBDIRS = $(SUBDIRS) tests include packages docs | ||||
|  | ||||
| # create a root makefile in the distribution: | ||||
| dist-hook: | ||||
| 	rm -rf $(top_builddir)/tests/log | ||||
| 	cp $(srcdir)/Makefile.dist $(distdir)/Makefile | ||||
| 	find $(distdir) -name "*.dist" -exec rm {} \; | ||||
| 	(distit=`find $(srcdir) -name "*.dist"`; \ | ||||
| 	for file in $$distit; do \ | ||||
| 	  strip=`echo $$file | sed -e s/^$(srcdir)// -e s/\.dist//`; \ | ||||
| 	  cp $$file $(distdir)$$strip; \ | ||||
| 	done) | ||||
|  | ||||
| html: | ||||
| 	cd docs; make html | ||||
| @@ -83,3 +106,8 @@ cygwinbin: | ||||
| install-data-hook: | ||||
| 	cd include && $(MAKE) install | ||||
| 	cd docs && $(MAKE) install | ||||
|  | ||||
| # We extend the standard uninstall with a custom hook: | ||||
| uninstall-hook: | ||||
| 	cd include && $(MAKE) uninstall | ||||
| 	cd docs && $(MAKE) uninstall | ||||
|   | ||||
| @@ -1,25 +1,25 @@ | ||||
| ############################################################################# | ||||
| #*************************************************************************** | ||||
| #                                  _   _ ____  _ | ||||
| #  Project                     ___| | | |  _ \| | | ||||
| #                             / __| | | | |_) | | | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 2002, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # | ||||
| # In order to be useful for every potential user, curl and libcurl are | ||||
| # dual-licensed under the MPL and the MIT/X-derivate licenses. | ||||
| # This software is licensed as described in the file COPYING, which | ||||
| # you should have received as part of this distribution. The terms | ||||
| # are also available at http://curl.haxx.se/docs/copyright.html. | ||||
| # | ||||
| # You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||
| # copies of the Software, and permit persons to whom the Software is | ||||
| # furnished to do so, under the terms of the MPL or the MIT/X-derivate | ||||
| # licenses. You may pick one of these licenses. | ||||
| # furnished to do so, under the terms of the COPYING file. | ||||
| # | ||||
| # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||
| # KIND, either express or implied. | ||||
| # | ||||
| # $Id$ | ||||
| ############################################################################# | ||||
| ########################################################################### | ||||
|  | ||||
| all: | ||||
| 	./configure | ||||
| @@ -43,21 +43,27 @@ mingw32-ssl: | ||||
|  | ||||
| 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-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-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 | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 | ||||
|  | ||||
| djgpp: | ||||
| 	make -C lib -f Makefile.dj | ||||
| @@ -71,6 +77,14 @@ cygwin-ssl: | ||||
| 	./configure --with-ssl | ||||
| 	make | ||||
|  | ||||
| amiga: | ||||
| 	cd ./lib && make -f makefile.amiga | ||||
| 	cd ./src && make -f makefile.amiga | ||||
|  | ||||
| netware: | ||||
|         cd lib && make -f Makefile.netware | ||||
|         cd src && make -f Makefile.netware | ||||
|  | ||||
| unix: all | ||||
|  | ||||
| unix-ssl: ssl | ||||
|   | ||||
							
								
								
									
										17
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								README
									
									
									
									
									
								
							| @@ -31,19 +31,26 @@ WEB SITE | ||||
|   Visit the curl web site or mirrors for the latest news: | ||||
|  | ||||
|         Sweden    -- http://curl.haxx.se/ | ||||
|         US        -- http://curl.sf.net/ | ||||
|         Australia -- http://curl.planetmirror.com/ | ||||
|         Estonia   -- http://curl.dope-brothers.com/ | ||||
|         Germany   -- http://curl.mirror.at.stealer.net/ | ||||
|         Russia    -- http://curl.tsuren.net/ | ||||
|         Thailand  -- http://curl.siamu.ac.th/ | ||||
|         US (CA)   -- http://curl.mirror.redwire.net/ | ||||
|  | ||||
| DOWNLOAD | ||||
|  | ||||
|   The official download mirror sites are: | ||||
|  | ||||
|         Australia -- http://curl.planetmirror.com/download/ | ||||
|         Estonia   -- http://curl.dope-brothers.com/download/ | ||||
|         Germany   -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/ | ||||
|         Hongkong  -- http://www.execve.net/curl/ | ||||
|         Russia    -- http://curl.tsuren.net/download/ | ||||
|         Sweden    -- ftp://ftp.sunet.se/pub/www/utilities/curl/ | ||||
|         Sweden    -- http://cool.haxx.se/curl/ | ||||
|         Germany   -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/ | ||||
|         Australia -- http://curl.planetmirror.com/download/ | ||||
|         US        -- http://curl.sourceforge.net/download/ | ||||
|         Hongkong  -- http://www.execve.net/curl/ | ||||
|         Thailand  -- http://curl.siamu.ac.th/download/ | ||||
|         US (CA)   -- http://curl.mirror.redwire.net/download/ | ||||
|  | ||||
| CVS | ||||
|  | ||||
|   | ||||
							
								
								
									
										89
									
								
								RELEASE-NOTES
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								RELEASE-NOTES
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| Curl and libcurl 7.11.1. A bugfix release. | ||||
|  | ||||
|  Public curl release number:               79 | ||||
|  Releases counted from the very beginning: 106 | ||||
|  Available command line options:           94 | ||||
|  Available curl_easy_setopt() options:     112 | ||||
|  | ||||
| This release includes the following changes: | ||||
|  | ||||
|  o CURLOPT_POSTFIELDSIZE_LARGE added to offer POSTs larger than 2GB | ||||
|  o CURL_VERSION_LARGEFILE is a feature bit returned by libcurls that feature | ||||
|    large file support | ||||
|  o libcurl only requires winsock 1.1 on windows now | ||||
|  o when doing FTP, curl now sends QUIT before disconnecting | ||||
|  o name resolves can now timeout on windows too | ||||
|  o $HOME is now recognized better when looking for .netrc files | ||||
|  o now re-uses the ares handle when re-using curl handles | ||||
|  o SO_BINDTODEVICE is used for network interface binding | ||||
|  o configure --disable-manual disables the built-in huge manual from the | ||||
|    command line tool | ||||
|  o the default Accept: header used in HTTP requests changed | ||||
|  o asynch dns lookups now require the c-ares library | ||||
|  o curl --socks can be used to set a SOCKS5 proxy to use | ||||
|  o response-headers received after a (proxy) CONNECT request are now passed | ||||
|    to the header callback just like other headers | ||||
|  | ||||
| This release includes the following bugfixes: | ||||
|  | ||||
|  o builds and runs on Novell NetWare | ||||
|  o Windows builds now report OS as "i386-pc-win32" | ||||
|  o received signals during SSL connect is handled better | ||||
|  o improved PUT/POST with NTLM/Digest authentication | ||||
|  o following redirects and doing NTLM/Digest (where the first connection gets | ||||
|    closed) with the multi interface work better now | ||||
|  o file: progress meter and getinfo variables work now | ||||
|  o CURLOPT_FRESH_CONNECT and CURLAUTH_NTLM now work when set together | ||||
|  o share interface usage without (un)lock functions segfaulted | ||||
|  o --limit-rate no longer cripples the --speed-limit feature | ||||
|  o fixed verbose output problem with ipv6-enabled re-used connections | ||||
|  o fixed the socks5 code to check version in the socks response properly | ||||
|  o dns cache bug - fixed the 'inuse' counter | ||||
|  o large file fix for Content-Length | ||||
|  o better docs for the share interface | ||||
|  o several configure fixes for mingw/msys | ||||
|  o setting a Host: header is no longer affecting the Host: header used when | ||||
|    libcurl follows a Location: | ||||
|  o fixed numerous compiler warnings on several operating systems and compilers | ||||
|  o PUTing from stdin couldn't disable chunked transfer-encoding | ||||
|  o corrected the mingw makefiles | ||||
|  o improved the configure libz detection | ||||
|  o fixed EPRT/PORT use when doing FTP on ipv6-enabled AIX hosts | ||||
|  o *nroff commands that only support -mandoc and not -man are now supported | ||||
|    (for the built-in manual text in the command line tool) | ||||
|  o fixed the unconditional #include of config.h in hugehelp.c | ||||
|  o builds fine on MPE/iX | ||||
|  o upload using chunked transfer-encoding now sends the last chunk properly | ||||
|    teriminated with an extra CRLF | ||||
|  o Fixed the progress meter display for files >2GB | ||||
|  o persistant connections over a proxy messed up the proxy name/password | ||||
|  o the socks5 code segfaulted if no username/password was set | ||||
|  o the *_LARGE options now take curl_off_t types as parameters and this will | ||||
|    make it possible to handle large files on windows too | ||||
|  o builds with large file support even on systems without strtoll() | ||||
|  | ||||
| Other curl-related news since the previous public release: | ||||
|  | ||||
|  o Many platforms are being used to autobuild and autotest curl on a daily | ||||
|    basis. Please join in and test curl on your systems: | ||||
|    http://curl.haxx.se/auto/ | ||||
|  o the curl mailing lists moved, (re-)subscribe to the new ones from here: | ||||
|    http://curl.haxx.se/mail/ | ||||
|  o c-ares 1.1.0 was relased: http://daniel.haxx.se/projects/c-ares/ | ||||
|  o TclCurl 0.11.0 was released: | ||||
|    http://personal1.iddeo.es/andresgarci/tclcurl/english/ | ||||
|  o PycURL 7.11.0 was released: http://pycurl.sourceforge.net/ | ||||
|  o the libcurl D binding was released: | ||||
|    http://www.atari-soldiers.com/libcurl.html | ||||
|  o new Estonian web site mirror: http://curl.dope-brothers.com/ | ||||
|  | ||||
| This release would not have looked like this without help, code, reports and | ||||
| advice from friends like these: | ||||
|  | ||||
|  Gisle Vanem, Vincent Bronner, Richard Bramante, Dirk Manske, Dan Fandrich, | ||||
|  Ken Hirsch, Stadler Stephan, Domenico Andreoli, Patrick Smith, Tor Arntsen, | ||||
|  Andr<64>s Garc<72>a, Tim Baker, Len Krause, Gilad, Ken Rastatter, P R Schaffner, | ||||
|  Greg Hewgill, Ben Greear, Jeff Lawson, Grigory Entin, Doug Porter, David | ||||
|  Byron, Andy Serpa, Joe Halpin, Christopher R. Palmer, G<>nter Knauf | ||||
|  | ||||
|         Thanks! (and sorry if I forgot to mention someone) | ||||
							
								
								
									
										53
									
								
								TODO-RELEASE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								TODO-RELEASE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| Issues not sorted in any particular order. | ||||
|   #[num] refers to bug report numbers. | ||||
|   UNASSIGNED means that no person has publicly stated to work on the issue. | ||||
|   DELETE means the issue is subject for dismissal | ||||
|  | ||||
| To get fixed in 7.11.1 (planned release in March 2004) | ||||
| ====================== | ||||
|  | ||||
| To get fixed in 7.11.2 (planned release May/June 2004) | ||||
| ====================== | ||||
|  | ||||
| 6. REST fix for servers not behaving well on >2GB requests. This should fail | ||||
|    if the server doesn't set the pointer to the requested index. The tricky | ||||
|    part is to figure out if the server did the right thing or not. | ||||
|    UNASSIGNED | ||||
|  | ||||
| 10. Anton Fedorov's "dumpcert" patch UNASSIGNED | ||||
|     http://curl.haxx.se/mail/lib-2004-03/0088.html | ||||
|  | ||||
| 14. Evaluate/apply Gertjan van Wingerde's SSL patches, UNASSIGNED | ||||
|     http://curl.haxx.se/mail/lib-2004-03/0087.html | ||||
|  | ||||
| 23. Peter Sylvester's "Most Significant Common Name" change. Feedback welcome. | ||||
|     At least the UTF8 conversion and comparison should be done. Patch? | ||||
|     UNASSIGNED | ||||
|  | ||||
| 24. Make the progress meter use one digit more for the hour time fields. | ||||
|     Accomplish this by removing one of the times displayed. | ||||
|  | ||||
| 27. Put the version defines in their own header file, so that lib/libcurl.rc | ||||
|     can include only that to reduce problems with MSVC. | ||||
|  | ||||
| 28. Optimize the way libcurl uses CWD on each new request over a persistent | ||||
|     connection (on FTP) even if it doesn't have to. | ||||
|  | ||||
| 29. Define USE_NTRESPONSES in the NTLM code to work properly with >14 letter | ||||
|     passwords against IIS servers. Requires test cases to be updated | ||||
|     accordingly. #915609 | ||||
|  | ||||
| 30. Digest re-negotiation is not supported, we wrongly assume a new 401 | ||||
|     response to signify an authenticaion error. We need to detect the | ||||
|     difference between a 401 due to a bad Digest authorization header and a | ||||
|     401 because the server wants to re-negotiate. | ||||
|  | ||||
|     Mitz Wark provided details and traces here: | ||||
|     http://curl.haxx.se/mail/lib-2004-03/0299.html | ||||
|  | ||||
| To get fixed in 7.12.0 | ||||
| ====================== | ||||
|  | ||||
| 25. curl_easy_strerror() curl_multi_strerror() curl_share_strerror() | ||||
|  | ||||
| 26. i18n of error messages | ||||
							
								
								
									
										171
									
								
								acinclude.m4
									
									
									
									
									
								
							
							
						
						
									
										171
									
								
								acinclude.m4
									
									
									
									
									
								
							| @@ -7,7 +7,7 @@ dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the | ||||
| dnl O_NONBLOCK define is found but does not work. This condition is attempted | ||||
| dnl to get caught in this script by using an excessive number of #ifdefs... | ||||
| dnl | ||||
| AC_DEFUN(CURL_CHECK_NONBLOCKING_SOCKET, | ||||
| AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET], | ||||
| [ | ||||
|   AC_MSG_CHECKING([non-blocking sockets style]) | ||||
|  | ||||
| @@ -30,7 +30,7 @@ AC_DEFUN(CURL_CHECK_NONBLOCKING_SOCKET, | ||||
| # define PLATFORM_AIX_V3 | ||||
| #endif | ||||
|  | ||||
| #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) | ||||
| #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__) | ||||
| #error "O_NONBLOCK does not work on this platform" | ||||
| #endif | ||||
|   int socket; | ||||
| @@ -47,7 +47,8 @@ dnl the code was bad, try a different program now, test 2 | ||||
| #include <unistd.h> | ||||
| #include <stropts.h> | ||||
| ],[ | ||||
| /* FIONBIO source test */ | ||||
| /* FIONBIO source test (old-style unix) */ | ||||
|  int socket; | ||||
|  int flags = ioctl(socket, FIONBIO, &flags); | ||||
| ],[ | ||||
| dnl FIONBIO test was good | ||||
| @@ -62,28 +63,49 @@ dnl the code was bad, try a different program now, test 3 | ||||
| #include <windows.h> | ||||
| ],[ | ||||
| /* ioctlsocket source code */ | ||||
|  int socket; | ||||
|  int flags = ioctlsocket(socket, FIONBIO, &flags); | ||||
| ],[ | ||||
| dnl ioctlsocket test was good | ||||
| nonblock="ioctlsocket" | ||||
| AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets]) | ||||
| ],[ | ||||
| dnl ioctlsocket didnt compile! | ||||
| dnl ioctlsocket didnt compile!, go to test 4 | ||||
|  | ||||
|   AC_TRY_COMPILE([ | ||||
|   AC_TRY_LINK([ | ||||
| /* headers for IoctlSocket test (Amiga?) */ | ||||
| #include <sys/ioctl.h> | ||||
| ],[ | ||||
| /* IoctlSocket source code */ | ||||
|  int socket; | ||||
|  int flags = IoctlSocket(socket, FIONBIO, (long)1); | ||||
| ],[ | ||||
| dnl ioctlsocket test was good | ||||
| nonblock="IoctlSocket" | ||||
| AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets]) | ||||
| ],[ | ||||
| dnl ioctlsocket didnt compile! | ||||
| dnl Ioctlsocket didnt compile, do test 5! | ||||
|   AC_TRY_COMPILE([ | ||||
| /* headers for SO_NONBLOCK test (BeOS) */ | ||||
| #include <sys/types.h> | ||||
| #include <unistd.h> | ||||
| #include <fcntl.h> | ||||
| ],[ | ||||
| /* SO_NONBLOCK source code */ | ||||
|  long b = 1; | ||||
|  int socket; | ||||
|  int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); | ||||
| ],[ | ||||
| dnl the SO_NONBLOCK test was good | ||||
| nonblock="SO_NONBLOCK" | ||||
| AC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets]) | ||||
| ],[ | ||||
| dnl test 5 didnt compile! | ||||
| nonblock="nada" | ||||
| AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets]) | ||||
| ]) | ||||
| dnl end of fifth test | ||||
|  | ||||
| ]) | ||||
| dnl end of forth test | ||||
|  | ||||
| @@ -118,8 +140,12 @@ AC_DEFUN([TYPE_SOCKLEN_T], | ||||
|          for arg2 in "struct sockaddr" void; do | ||||
|             for t in int size_t unsigned long "unsigned long"; do | ||||
|                AC_TRY_COMPILE([ | ||||
|                   #ifdef HAVE_SYS_TYPES_H | ||||
|                   #include <sys/types.h> | ||||
|                   #endif | ||||
|                   #ifdef HAVE_SYS_SOCKET_H | ||||
|                   #include <sys/socket.h> | ||||
|                   #endif | ||||
|  | ||||
|                   int getpeername (int, $arg2 *, $t *); | ||||
|                ],[ | ||||
| @@ -155,9 +181,15 @@ AC_DEFUN([TYPE_IN_ADDR_T], | ||||
|          curl_cv_in_addr_t_equiv= | ||||
|          for t in "unsigned long" int size_t unsigned long; do | ||||
|             AC_TRY_COMPILE([ | ||||
|                #ifdef HAVE_SYS_TYPES_H | ||||
|                #include <sys/types.h> | ||||
|                #endif | ||||
|                #ifdef HAVE_SYS_SOCKET_H | ||||
|                #include <sys/socket.h> | ||||
|                #endif | ||||
|                #ifdef HAVE_ARPA_INET_H | ||||
|                #include <arpa/inet.h> | ||||
|                #endif | ||||
|             ],[ | ||||
|                $t data = inet_addr ("1.2.3.4"); | ||||
|             ],[ | ||||
| @@ -183,7 +215,7 @@ dnl check for "localhost", if it doesn't exist, we can't do the | ||||
| dnl gethostbyname_r tests! | ||||
| dnl  | ||||
|  | ||||
| AC_DEFUN(CURL_CHECK_WORKING_RESOLVER,[ | ||||
| AC_DEFUN([CURL_CHECK_WORKING_RESOLVER],[ | ||||
| AC_MSG_CHECKING([if "localhost" resolves]) | ||||
| AC_TRY_RUN([ | ||||
| #include <string.h> | ||||
| @@ -206,7 +238,7 @@ exit (h == NULL ? 1 : 0); }],[ | ||||
| dnl ************************************************************ | ||||
| dnl check for working getaddrinfo() | ||||
| dnl | ||||
| AC_DEFUN(CURL_CHECK_WORKING_GETADDRINFO,[ | ||||
| AC_DEFUN([CURL_CHECK_WORKING_GETADDRINFO],[ | ||||
|   AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[ | ||||
|   AC_TRY_RUN( [ | ||||
| #include <netdb.h> | ||||
| @@ -245,7 +277,7 @@ fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| AC_DEFUN(CURL_CHECK_LOCALTIME_R, | ||||
| AC_DEFUN([CURL_CHECK_LOCALTIME_R], | ||||
| [ | ||||
|   dnl check for a few thread-safe functions | ||||
|   AC_CHECK_FUNCS(localtime_r,[ | ||||
| @@ -263,7 +295,7 @@ AC_DEFUN(CURL_CHECK_LOCALTIME_R, | ||||
| 	AC_MSG_RESULT(no))])]) | ||||
| ]) | ||||
|  | ||||
| AC_DEFUN(CURL_CHECK_INET_NTOA_R, | ||||
| AC_DEFUN([CURL_CHECK_INET_NTOA_R], | ||||
| [ | ||||
|   dnl determine if function definition for inet_ntoa_r exists. | ||||
|   AC_CHECK_FUNCS(inet_ntoa_r,[ | ||||
| @@ -283,7 +315,7 @@ AC_DEFUN(CURL_CHECK_INET_NTOA_R, | ||||
| 	AC_MSG_RESULT(no))])]) | ||||
| ]) | ||||
|  | ||||
| AC_DEFUN(CURL_CHECK_GETHOSTBYADDR_R, | ||||
| AC_DEFUN([CURL_CHECK_GETHOSTBYADDR_R], | ||||
| [ | ||||
|   dnl check for number of arguments to gethostbyaddr_r. it might take | ||||
|   dnl either 5, 7, or 8 arguments. | ||||
| @@ -360,7 +392,7 @@ rc = gethostbyaddr_r(address, length, type, &h, | ||||
| 	    have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])]) | ||||
| ]) | ||||
|  | ||||
| AC_DEFUN(CURL_CHECK_GETHOSTBYNAME_R, | ||||
| AC_DEFUN([CURL_CHECK_GETHOSTBYNAME_R], | ||||
| [ | ||||
|   dnl check for number of arguments to gethostbyname_r. it might take | ||||
|   dnl either 3, 5, or 6 arguments. | ||||
| @@ -443,3 +475,118 @@ 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 * 1419 warns on "external declaration in primary source file" | ||||
|          dnl   which we know and do on purpose. | ||||
|  | ||||
|          WARN="-wd279,269,1419,981" | ||||
|  | ||||
|          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 | ||||
|  | ||||
|          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() | ||||
|  | ||||
|   | ||||
							
								
								
									
										8
									
								
								ares/.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								ares/.cvsignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| configure | ||||
| autom4te.cache | ||||
| Makefile | ||||
| adig | ||||
| ahost | ||||
| config.log | ||||
| config.status | ||||
| aclocal.m4 | ||||
							
								
								
									
										76
									
								
								ares/CHANGES
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								ares/CHANGES
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| * 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 | ||||
|  | ||||
|   Added ares_version(). | ||||
|  | ||||
| Version 1.0-pre1 (8 October 2003) | ||||
|  | ||||
| - James Bursa made it run on RISC OS | ||||
|  | ||||
| - Dominick Meglio made it run fine on NT4 | ||||
|  | ||||
| - Duncan Wilcox made it work fine on Mac OS X | ||||
|  | ||||
| - Daniel Stenberg adjusted the windows port | ||||
|  | ||||
| - liren at vivisimo.com made the initial windows port | ||||
							
								
								
									
										33
									
								
								ares/FILES
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								ares/FILES
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| *.c | ||||
| *.h | ||||
| *.3 | ||||
| NEWS | ||||
| README | ||||
| README.cares | ||||
| CHANGES | ||||
| FILES | ||||
| maketgz | ||||
| aclocal.m4 | ||||
| acinclude.m4 | ||||
| Makefile.in | ||||
| install-sh | ||||
| mkinstalldirs | ||||
| configure | ||||
| configure.ac | ||||
| config.guess | ||||
| config.sub | ||||
| vc/adig/adig.dep | ||||
| 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 | ||||
| vc/ahost/ahost.plg | ||||
| vc/areslib/areslib.dep | ||||
| vc/areslib/areslib.dsp | ||||
| vc/areslib/areslib.mak | ||||
| vc/areslib/areslib.plg | ||||
							
								
								
									
										93
									
								
								ares/Makefile.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								ares/Makefile.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| # $Id$ | ||||
|  | ||||
| SHELL=/bin/sh | ||||
| INSTALL=@INSTALL@ | ||||
| RANLIB=@RANLIB@ | ||||
| VPATH=@srcdir@ | ||||
| srcdir=@srcdir@ | ||||
| top_srcdir=@top_srcdir@ | ||||
| prefix=@prefix@ | ||||
| exec_prefix=@exec_prefix@ | ||||
| libdir=@libdir@ | ||||
| includedir=@includedir@ | ||||
| mandir=@mandir@ | ||||
|  | ||||
| LIB=libcares.a | ||||
| CC=@CC@ | ||||
| CPPFLAGS=@CPPFLAGS@ | ||||
| CFLAGS=@CFLAGS@ ${WARN_CFLAGS} ${ERROR_CFLAGS} | ||||
| DEFS=@DEFS@ | ||||
| LDFLAGS=@LDFLAGS@ | ||||
| LIBS=@LIBS@ | ||||
| ALL_CFLAGS=${CPPFLAGS} ${CFLAGS} ${DEFS} | ||||
| OBJS=	ares__close_sockets.o ares__get_hostent.o ares__read_line.o \ | ||||
| 	ares_destroy.o ares_expand_name.o ares_fds.o \ | ||||
| 	ares_free_hostent.o ares_free_string.o ares_gethostbyaddr.o \ | ||||
| 	ares_gethostbyname.o ares_init.o ares_mkquery.o ares_parse_a_reply.o \ | ||||
| 	ares_parse_ptr_reply.o ares_process.o ares_query.o ares_search.o \ | ||||
| 	ares_send.o ares_strerror.o ares_timeout.o ares_version.o | ||||
|  | ||||
| $(LIB): ${OBJS} | ||||
| 	ar cru $@ ${OBJS} | ||||
| 	${RANLIB} $@ | ||||
|  | ||||
| all: $(LIB) demos | ||||
|  | ||||
| demos: adig ahost | ||||
|  | ||||
| tags: | ||||
| 	etags *.[ch] | ||||
|  | ||||
| adig: adig.o $(LIB) | ||||
| 	${CC} ${LDFLAGS} -o $@ adig.o $(LIB) ${LIBS} | ||||
|  | ||||
| ahost: ahost.o $(LIB) | ||||
| 	${CC} ${LDFLAGS} -o $@ ahost.o $(LIB) ${LIBS} | ||||
|  | ||||
| ${OBJS}: ares.h ares_dns.h ares_private.h | ||||
|  | ||||
| .c.o: | ||||
| 	${CC} -c ${ALL_CFLAGS} $< | ||||
|  | ||||
| check: | ||||
|  | ||||
| install: | ||||
| 	${top_srcdir}/mkinstalldirs ${DESTDIR}${libdir} | ||||
| 	${top_srcdir}/mkinstalldirs ${DESTDIR}${includedir} | ||||
| 	${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man3 | ||||
| 	${INSTALL} -m 644 $(LIB) ${DESTDIR}${libdir} | ||||
| 	${RANLIB} ${DESTDIR}${libdir}/$(LIB) | ||||
| 	chmod u-w ${DESTDIR}${libdir}/$(LIB) | ||||
| 	${INSTALL} -m 444 ${srcdir}/ares.h ${DESTDIR}${includedir} | ||||
| 	${INSTALL} -m 444 ${srcdir}/ares_version.h ${DESTDIR}${includedir} | ||||
| 	${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_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} $(LIB) adig.o adig ahost.o ahost | ||||
|  | ||||
| distclean: clean | ||||
| 	rm -f config.cache config.log config.status Makefile | ||||
							
								
								
									
										18
									
								
								ares/NEWS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								ares/NEWS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| Major changes in release 1.1.1: | ||||
| * ares should now compile as C++ code (no longer uses reserved word | ||||
|   "class"). | ||||
| * Added SRV support to adig test program. | ||||
| * Fixed a few error handling bugs in query processing. | ||||
|  | ||||
| Major changes in release 1.1.0: | ||||
| * Added ares_free_string() function so that memory can be freed in the | ||||
|   same layer as it is allocated, a desirable feature in some | ||||
|   environments. | ||||
| * A few of the ares_dns.h macros are fixed to use the proper bitwise | ||||
|   operator. | ||||
| * Fixed a couple of fenceposts fixed in ares_expand_name()'s | ||||
|   bounds-checking. | ||||
| * In process_timeouts(), extract query->next before calling | ||||
|   next_server() and possibly freeing the query structure. | ||||
| * Casted arguments to ctype macros casted to unsigned char, since not | ||||
|   all char values are valid inputs to those macros according to ANSI. | ||||
							
								
								
									
										46
									
								
								ares/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								ares/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| 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 | ||||
| examples of such applications are servers which communicate with | ||||
| multiple clients and programs with graphical user interfaces. | ||||
|  | ||||
| This library implementation is not especially portable to crufty old | ||||
| systems like SunOS 4.  It assumes a compiler which can handle ANSI C | ||||
| syntax, a system malloc which properly handles realloc(NULL, foo) and | ||||
| free(NULL), and a reasonably up-to-date <arpa/nameser.h>. | ||||
|  | ||||
| I have attempted to preserve the externally visible behavior of the | ||||
| BIND resolver in nearly all respects.  The API of the library is, of | ||||
| course, very different from the synchronous BIND API; instead of | ||||
| invoking a function like res_send() and getting a return value back | ||||
| indicating the number of bytes in the response, you invoke a function | ||||
| like ares_send() and give it a callback function to invoke when the | ||||
| response arrives.  You then have to select() on the file descriptors | ||||
| indicated by ares_fds(), with a timeout given by ares_timeout().  You | ||||
| call ares_process() when select() returns. | ||||
|  | ||||
| Some features are missing from the current version of ares, relative | ||||
| to the BIND resolver: | ||||
|  | ||||
| 	* There is no IPV6 support. | ||||
| 	* There is no hostname verification. | ||||
| 	* There is no logging of unexpected events. | ||||
| 	* There is no debugging-oriented logging. | ||||
| 	* There is no YP support. | ||||
|  | ||||
| libares requires an ANSI compiler to compile and use.  To build the | ||||
| library, just run "./configure" and "make".  To install it, run "make | ||||
| install".  Run "./configure --help" to see a list of options you can | ||||
| provide to configure to change how the library builds.  libares has no | ||||
| data files, so you can move the include file and library around freely | ||||
| without leaving behind any dependencies on old paths.  Building the | ||||
| library will also build the "adig" program, a little toy for trying | ||||
| out the library.  It doesn't get installed. | ||||
|  | ||||
| libares is distributed at athena-dist.mit.edu:pub/ATHENA/ares.  Please | ||||
| send bug reports and comments to ghudson@mit.edu. | ||||
							
								
								
									
										23
									
								
								ares/README.cares
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								ares/README.cares
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
|  | ||||
| This package is based 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. | ||||
|  | ||||
| The package is thus dubbed 'c-ares' since I (Daniel Stenberg) want this for | ||||
| use within the curl project (hence the letter C) and it makes a nice | ||||
| pun. Also, c-ares will not remain API compatible with the original ares, so | ||||
| picking a new name makes it 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 curl-library mailing list. | ||||
|  | ||||
| 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() | ||||
|  | ||||
							
								
								
									
										620
									
								
								ares/adig.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										620
									
								
								ares/adig.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,620 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <sys/time.h> | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <arpa/nameser.h> | ||||
| #include <unistd.h> | ||||
| #include <netdb.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <ctype.h> | ||||
| #include <errno.h> | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
|  | ||||
| #ifndef INADDR_NONE | ||||
| #define	INADDR_NONE 0xffffffff | ||||
| #endif | ||||
|  | ||||
| /* Mac OS X portability check */ | ||||
| #ifndef T_SRV | ||||
| #define T_SRV 33 /* server selection */ | ||||
| #endif | ||||
|  | ||||
| extern int optind; | ||||
| extern char *optarg; | ||||
|  | ||||
| struct nv { | ||||
|   const char *name; | ||||
|   int value; | ||||
| }; | ||||
|  | ||||
| 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 } | ||||
| }; | ||||
| 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 } | ||||
| }; | ||||
| 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 } | ||||
| }; | ||||
| static const int ntypes = sizeof(types) / sizeof(types[0]); | ||||
|  | ||||
| static const char *opcodes[] = { | ||||
|   "QUERY", "IQUERY", "STATUS", "(reserved)", "NOTIFY", | ||||
|   "(unknown)", "(unknown)", "(unknown)", "(unknown)", | ||||
|   "UPDATEA", "UPDATED", "UPDATEDA", "UPDATEM", "UPDATEMA", | ||||
|   "ZONEINIT", "ZONEREF" | ||||
| }; | ||||
|  | ||||
| static const char *rcodes[] = { | ||||
|   "NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN", "NOTIMP", "REFUSED", | ||||
|   "(unknown)", "(unknown)", "(unknown)", "(unknown)", "(unknown)", | ||||
|   "(unknown)", "(unknown)", "(unknown)", "(unknown)", "NOCHANGE" | ||||
| }; | ||||
|  | ||||
| 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); | ||||
| static const unsigned char *display_rr(const unsigned char *aptr, | ||||
| 				       const unsigned char *abuf, int alen); | ||||
| static const char *type_name(int type); | ||||
| static const char *class_name(int dnsclass); | ||||
| static void usage(void); | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|   ares_channel channel; | ||||
|   int c, i, optmask = ARES_OPT_FLAGS, dnsclass = C_IN, type = T_A; | ||||
|   int status, nfds, count; | ||||
|   struct ares_options options; | ||||
|   struct hostent *hostent; | ||||
|   fd_set read_fds, write_fds; | ||||
|   struct timeval *tvp, tv; | ||||
|  | ||||
| #ifdef WIN32 | ||||
|   WORD wVersionRequested = MAKEWORD(1,1); | ||||
|   WSADATA wsaData; | ||||
|   WSAStartup(wVersionRequested, &wsaData); | ||||
| #endif   | ||||
|  | ||||
|   options.flags = ARES_FLAG_NOCHECKRESP; | ||||
|   options.servers = NULL; | ||||
|   options.nservers = 0; | ||||
|   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 '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 '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 '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; | ||||
|   if (argc == 0) | ||||
|     usage(); | ||||
|  | ||||
|   status = ares_init_options(&channel, &options, optmask); | ||||
|  | ||||
|   if (status != ARES_SUCCESS) | ||||
|     { | ||||
|       fprintf(stderr, "ares_init_options: %s\n", | ||||
| 	      ares_strerror(status)); | ||||
|       return 1; | ||||
|     } | ||||
|  | ||||
|   /* Initiate the queries, one per command-line argument.  If there is | ||||
|    * only one query to do, supply NULL as the callback argument; | ||||
|    * otherwise, supply the query name as an argument so we can | ||||
|    * distinguish responses for the user when printing them out. | ||||
|    */ | ||||
|   if (argc == 1) | ||||
|     ares_query(channel, *argv, dnsclass, type, callback, (char *) NULL); | ||||
|   else | ||||
|     { | ||||
|       for (; *argv; argv++) | ||||
| 	ares_query(channel, *argv, dnsclass, type, callback, *argv); | ||||
|     } | ||||
|  | ||||
|   /* Wait for all queries to complete. */ | ||||
|   while (1) | ||||
|     { | ||||
|       FD_ZERO(&read_fds); | ||||
|       FD_ZERO(&write_fds); | ||||
|       nfds = ares_fds(channel, &read_fds, &write_fds); | ||||
|       if (nfds == 0) | ||||
| 	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; | ||||
| 	} | ||||
|       ares_process(channel, &read_fds, &write_fds); | ||||
|     } | ||||
|  | ||||
|   ares_destroy(channel); | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| static void callback(void *arg, int status, unsigned char *abuf, int alen) | ||||
| { | ||||
|   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. */ | ||||
|   if (name) | ||||
|     printf("Answer for query %s:\n", name); | ||||
|  | ||||
|   /* Display an error message if there was an error, but only stop if | ||||
|    * we actually didn't get an answer buffer. | ||||
|    */ | ||||
|   if (status != ARES_SUCCESS) | ||||
|     { | ||||
|       printf("%s\n", ares_strerror(status)); | ||||
|       if (!abuf) | ||||
| 	return; | ||||
|     } | ||||
|  | ||||
|   /* Won't happen, but check anyway, for safety. */ | ||||
|   if (alen < HFIXEDSZ) | ||||
|     return; | ||||
|  | ||||
|   /* Parse the answer header. */ | ||||
|   id = DNS_HEADER_QID(abuf); | ||||
|   qr = DNS_HEADER_QR(abuf); | ||||
|   opcode = DNS_HEADER_OPCODE(abuf); | ||||
|   aa = DNS_HEADER_AA(abuf); | ||||
|   tc = DNS_HEADER_TC(abuf); | ||||
|   rd = DNS_HEADER_RD(abuf); | ||||
|   ra = DNS_HEADER_RA(abuf); | ||||
|   rcode = DNS_HEADER_RCODE(abuf); | ||||
|   qdcount = DNS_HEADER_QDCOUNT(abuf); | ||||
|   ancount = DNS_HEADER_ANCOUNT(abuf); | ||||
|   nscount = DNS_HEADER_NSCOUNT(abuf); | ||||
|   arcount = DNS_HEADER_ARCOUNT(abuf); | ||||
|  | ||||
|   /* 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 " : ""); | ||||
|   printf("opcode: %s\n", opcodes[opcode]); | ||||
|   printf("rcode: %s\n", rcodes[rcode]); | ||||
|  | ||||
|   /* Display the questions. */ | ||||
|   printf("Questions:\n"); | ||||
|   aptr = abuf + HFIXEDSZ; | ||||
|   for (i = 0; i < qdcount; i++) | ||||
|     { | ||||
|       aptr = display_question(aptr, abuf, alen); | ||||
|       if (aptr == NULL) | ||||
| 	return; | ||||
|     } | ||||
|  | ||||
|   /* Display the answers. */ | ||||
|   printf("Answers:\n"); | ||||
|   for (i = 0; i < ancount; i++) | ||||
|     { | ||||
|       aptr = display_rr(aptr, abuf, alen); | ||||
|       if (aptr == NULL) | ||||
| 	return; | ||||
|     } | ||||
|  | ||||
|   /* Display the NS records. */ | ||||
|   printf("NS records:\n"); | ||||
|   for (i = 0; i < nscount; i++) | ||||
|     { | ||||
|       aptr = display_rr(aptr, abuf, alen); | ||||
|       if (aptr == NULL) | ||||
| 	return; | ||||
|     } | ||||
|  | ||||
|   /* Display the additional records. */ | ||||
|   printf("Additional records:\n"); | ||||
|   for (i = 0; i < arcount; i++) | ||||
|     { | ||||
|       aptr = display_rr(aptr, abuf, alen); | ||||
|       if (aptr == NULL) | ||||
| 	return; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static const unsigned char *display_question(const unsigned char *aptr, | ||||
| 					     const unsigned char *abuf, | ||||
| 					     int alen) | ||||
| { | ||||
|   char *name; | ||||
|   int type, dnsclass, status; | ||||
|   long len; | ||||
|  | ||||
|   /* Parse the question name. */ | ||||
|   status = ares_expand_name(aptr, abuf, alen, &name, &len); | ||||
|   if (status != ARES_SUCCESS) | ||||
|     return NULL; | ||||
|   aptr += len; | ||||
|  | ||||
|   /* Make sure there's enough data after the name for the fixed part | ||||
|    * of the question. | ||||
|    */ | ||||
|   if (aptr + QFIXEDSZ > abuf + alen) | ||||
|     { | ||||
|       free(name); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
|   /* Parse the question type and class. */ | ||||
|   type = DNS_QUESTION_TYPE(aptr); | ||||
|   dnsclass = DNS_QUESTION_CLASS(aptr); | ||||
|   aptr += QFIXEDSZ; | ||||
|  | ||||
|   /* Display the question, in a format sort of similar to how we will | ||||
|    * display RRs. | ||||
|    */ | ||||
|   printf("\t%-15s.\t", name); | ||||
|   if (dnsclass != C_IN) | ||||
|     printf("\t%s", class_name(dnsclass)); | ||||
|   printf("\t%s\n", type_name(type)); | ||||
|   free(name); | ||||
|   return aptr; | ||||
| } | ||||
|  | ||||
| static const unsigned char *display_rr(const unsigned char *aptr, | ||||
| 				       const unsigned char *abuf, int alen) | ||||
| { | ||||
|   const unsigned char *p; | ||||
|   char *name; | ||||
|   int type, dnsclass, ttl, dlen, status; | ||||
|   long len; | ||||
|   struct in_addr addr; | ||||
|  | ||||
|   /* Parse the RR name. */ | ||||
|   status = ares_expand_name(aptr, abuf, alen, &name, &len); | ||||
|   if (status != ARES_SUCCESS) | ||||
|     return NULL; | ||||
|   aptr += len; | ||||
|  | ||||
|   /* Make sure there is enough data after the RR name for the fixed | ||||
|    * part of the RR. | ||||
|    */ | ||||
|   if (aptr + RRFIXEDSZ > abuf + alen) | ||||
|     { | ||||
|       free(name); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
|   /* Parse the fixed part of the RR, and advance to the RR data | ||||
|    * field. */ | ||||
|   type = DNS_RR_TYPE(aptr); | ||||
|   dnsclass = DNS_RR_CLASS(aptr); | ||||
|   ttl = DNS_RR_TTL(aptr); | ||||
|   dlen = DNS_RR_LEN(aptr); | ||||
|   aptr += RRFIXEDSZ; | ||||
|   if (aptr + dlen > abuf + alen) | ||||
|     { | ||||
|       free(name); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
|   /* Display the RR name, class, and type. */ | ||||
|   printf("\t%-15s.\t%d", name, ttl); | ||||
|   if (dnsclass != C_IN) | ||||
|     printf("\t%s", class_name(dnsclass)); | ||||
|   printf("\t%s", type_name(type)); | ||||
|   free(name); | ||||
|  | ||||
|   /* Display the RR data.  Don't touch aptr. */ | ||||
|   switch (type) | ||||
|     { | ||||
|     case T_CNAME: | ||||
|     case T_MB: | ||||
|     case T_MD: | ||||
|     case T_MF: | ||||
|     case T_MG: | ||||
|     case T_MR: | ||||
|     case T_NS: | ||||
|     case T_PTR: | ||||
|       /* 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; | ||||
|       printf("\t%s.", name); | ||||
|       free(name); | ||||
|       break; | ||||
|  | ||||
|     case T_HINFO: | ||||
|       /* The RR data is two length-counted character strings. */ | ||||
|       p = aptr; | ||||
|       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); | ||||
|       break; | ||||
|  | ||||
|     case T_MINFO: | ||||
|       /* The RR data is two domain names. */ | ||||
|       p = aptr; | ||||
|       status = ares_expand_name(p, abuf, alen, &name, &len); | ||||
|       if (status != ARES_SUCCESS) | ||||
| 	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; | ||||
|       printf("\t%s.", name); | ||||
|       free(name); | ||||
|       break; | ||||
|  | ||||
|     case T_MX: | ||||
|       /* The RR data is two bytes giving a preference ordering, and | ||||
|        * then a domain name. | ||||
|        */ | ||||
|       if (dlen < 2) | ||||
| 	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; | ||||
|       printf("\t%s.", name); | ||||
|       free(name); | ||||
|       break; | ||||
|  | ||||
|     case T_SOA: | ||||
|       /* The RR data is two domain names and then five four-byte | ||||
|        * numbers giving the serial number and some timeouts. | ||||
|        */ | ||||
|       p = aptr; | ||||
|       status = ares_expand_name(p, abuf, alen, &name, &len); | ||||
|       if (status != ARES_SUCCESS) | ||||
| 	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; | ||||
|       printf("\t\t\t\t\t\t%s.\n", name); | ||||
|       free(name); | ||||
|       p += len; | ||||
|       if (p + 20 > aptr + dlen) | ||||
| 	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]); | ||||
|       break; | ||||
|  | ||||
|     case T_TXT: | ||||
|       /* The RR data is one or more length-counted character | ||||
|        * 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; | ||||
| 	} | ||||
|       break; | ||||
|  | ||||
|     case T_A: | ||||
|       /* The RR data is a four-byte Internet address. */ | ||||
|       if (dlen != 4) | ||||
| 	return NULL; | ||||
|       memcpy(&addr, aptr, sizeof(struct in_addr)); | ||||
|       printf("\t%s", inet_ntoa(addr)); | ||||
|       break; | ||||
|  | ||||
|     case T_WKS: | ||||
|       /* Not implemented yet */ | ||||
|       break; | ||||
|  | ||||
|     case T_SRV: | ||||
|       /* 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]"); | ||||
|     } | ||||
|   printf("\n"); | ||||
|  | ||||
|   return aptr + dlen; | ||||
| } | ||||
|  | ||||
| static const char *type_name(int type) | ||||
| { | ||||
|   int i; | ||||
|  | ||||
|   for (i = 0; i < ntypes; i++) | ||||
|     { | ||||
|       if (types[i].value == type) | ||||
| 	return types[i].name; | ||||
|     } | ||||
|   return "(unknown)"; | ||||
| } | ||||
|  | ||||
| static const char *class_name(int dnsclass) | ||||
| { | ||||
|   int i; | ||||
|  | ||||
|   for (i = 0; i < nclasses; i++) | ||||
|     { | ||||
|       if (classes[i].value == dnsclass) | ||||
| 	return classes[i].name; | ||||
|     } | ||||
|   return "(unknown)"; | ||||
| } | ||||
|  | ||||
| static void usage(void) | ||||
| { | ||||
|   fprintf(stderr, "usage: adig [-f flag] [-s server] [-c class] " | ||||
| 	  "[-t type] [-p port] name ...\n"); | ||||
|   exit(1); | ||||
| } | ||||
							
								
								
									
										117
									
								
								ares/ahost.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								ares/ahost.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #else | ||||
| #include <sys/time.h> | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #include <unistd.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
|  | ||||
| #ifndef INADDR_NONE | ||||
| #define	INADDR_NONE 0xffffffff | ||||
| #endif | ||||
|  | ||||
| static void callback(void *arg, int status, struct hostent *host); | ||||
| static void usage(void); | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|   ares_channel channel; | ||||
|   int status, nfds; | ||||
|   fd_set read_fds, write_fds; | ||||
|   struct timeval *tvp, tv; | ||||
|   struct in_addr addr; | ||||
|  | ||||
| #ifdef WIN32 | ||||
|   WORD wVersionRequested = MAKEWORD(1,1); | ||||
|   WSADATA wsaData; | ||||
|   WSAStartup(wVersionRequested, &wsaData); | ||||
| #endif   | ||||
|  | ||||
|   if (argc <= 1) | ||||
|     usage(); | ||||
|  | ||||
|   status = ares_init(&channel); | ||||
|   if (status != ARES_SUCCESS) | ||||
|     { | ||||
|       fprintf(stderr, "ares_init: %s\n", ares_strerror(status)); | ||||
|       return 1; | ||||
|     } | ||||
|  | ||||
|   /* Initiate the queries, one per command-line argument. */ | ||||
|   for (argv++; *argv; argv++) | ||||
|     { | ||||
|       addr.s_addr = inet_addr(*argv); | ||||
|       if (addr.s_addr == INADDR_NONE) | ||||
| 	ares_gethostbyname(channel, *argv, AF_INET, callback, *argv); | ||||
|       else | ||||
| 	{ | ||||
| 	  ares_gethostbyaddr(channel, &addr, sizeof(addr), AF_INET, callback, | ||||
| 			     *argv); | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   /* Wait for all queries to complete. */ | ||||
|   while (1) | ||||
|     { | ||||
|       FD_ZERO(&read_fds); | ||||
|       FD_ZERO(&write_fds); | ||||
|       nfds = ares_fds(channel, &read_fds, &write_fds); | ||||
|       if (nfds == 0) | ||||
| 	break; | ||||
|       tvp = ares_timeout(channel, NULL, &tv); | ||||
|       select(nfds, &read_fds, &write_fds, NULL, tvp); | ||||
|       ares_process(channel, &read_fds, &write_fds); | ||||
|     } | ||||
|  | ||||
|   ares_destroy(channel); | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| static void callback(void *arg, int status, struct hostent *host) | ||||
| { | ||||
|   struct in_addr addr; | ||||
|   char **p; | ||||
|  | ||||
|   if (status != ARES_SUCCESS) | ||||
|     { | ||||
|       fprintf(stderr, "%s: %s\n", (char *) arg, ares_strerror(status)); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   for (p = host->h_addr_list; *p; p++) | ||||
|     { | ||||
|       memcpy(&addr, *p, sizeof(struct in_addr)); | ||||
|       printf("%-32s\t%s\n", host->h_name, inet_ntoa(addr)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void usage(void) | ||||
| { | ||||
|   fprintf(stderr, "usage: ahost {host|addr} ...\n"); | ||||
|   exit(1); | ||||
| } | ||||
							
								
								
									
										137
									
								
								ares/ares.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								ares/ares.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | ||||
| /* $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. | ||||
|  */ | ||||
|  | ||||
| #ifndef ARES__H | ||||
| #define ARES__H | ||||
|  | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #ifdef _AIX | ||||
| /* 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 | ||||
|  | ||||
| #ifdef 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 | ||||
|  | ||||
| /* 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 | ||||
|  | ||||
| /* 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) | ||||
|  | ||||
| /* 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) | ||||
|  | ||||
| struct ares_options { | ||||
|   int flags; | ||||
|   int timeout; | ||||
|   int tries; | ||||
|   int ndots; | ||||
|   unsigned short udp_port; | ||||
|   unsigned short tcp_port; | ||||
|   struct in_addr *servers; | ||||
|   int nservers; | ||||
|   char **domains; | ||||
|   int ndomains; | ||||
|   char *lookups; | ||||
| }; | ||||
|  | ||||
| struct hostent; | ||||
| struct timeval; | ||||
| struct ares_channeldata; | ||||
| typedef struct ares_channeldata *ares_channel; | ||||
| typedef void (*ares_callback)(void *arg, int status, unsigned char *abuf, | ||||
| 			      int alen); | ||||
| typedef void (*ares_host_callback)(void *arg, int status, | ||||
| 				   struct hostent *hostent); | ||||
|  | ||||
| int ares_init(ares_channel *channelptr); | ||||
| int ares_init_options(ares_channel *channelptr, struct ares_options *options, | ||||
| 		      int optmask); | ||||
| void ares_destroy(ares_channel channel); | ||||
|  | ||||
| void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen, | ||||
| 	       ares_callback callback, void *arg); | ||||
| void ares_query(ares_channel channel, const char *name, int dnsclass, | ||||
| 		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); | ||||
| void ares_gethostbyname(ares_channel channel, const char *name, int family, | ||||
| 			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 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); | ||||
| 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 ares_expand_name(const unsigned char *encoded, const unsigned char *abuf, | ||||
| 		     int alen, char **s, long *enclen); | ||||
| int ares_parse_a_reply(const unsigned char *abuf, int alen, | ||||
| 		       struct hostent **host); | ||||
| int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, | ||||
| 			 int 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); | ||||
| void ares_free_errmem(char *mem); | ||||
|  | ||||
| #endif /* ARES__H */ | ||||
							
								
								
									
										55
									
								
								ares/ares__close_sockets.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								ares/ares__close_sockets.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| /* 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 <stdlib.h> | ||||
| #ifdef WIN32 | ||||
| #else | ||||
| #include <unistd.h> | ||||
| #endif | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| void ares__close_sockets(struct server_state *server) | ||||
| { | ||||
|   struct send_request *sendreq; | ||||
|  | ||||
|   /* Free all pending output buffers. */ | ||||
|   while (server->qhead) | ||||
|     { | ||||
|       /* Advance server->qhead; pull out query as we go. */ | ||||
|       sendreq = server->qhead; | ||||
|       server->qhead = sendreq->next; | ||||
|       free(sendreq); | ||||
|     } | ||||
|   server->qtail = NULL; | ||||
|  | ||||
|   /* Reset any existing input buffer. */ | ||||
|   if (server->tcp_buffer) | ||||
|     free(server->tcp_buffer); | ||||
|   server->tcp_buffer = NULL; | ||||
|   server->tcp_lenbuf_pos = 0; | ||||
|  | ||||
|   /* Close the TCP and UDP sockets. */ | ||||
|   if (server->tcp_socket != -1) | ||||
|     { | ||||
|       closesocket(server->tcp_socket); | ||||
|       server->tcp_socket = -1; | ||||
|     } | ||||
|   if (server->udp_socket != -1) | ||||
|     { | ||||
|       closesocket(server->udp_socket); | ||||
|       server->udp_socket = -1; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										169
									
								
								ares/ares__get_hostent.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								ares/ares__get_hostent.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,169 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
|  | ||||
| #else | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <ctype.h> | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| int ares__get_hostent(FILE *fp, struct hostent **host) | ||||
| { | ||||
|   char *line = NULL, *p, *q, *canonical, **alias; | ||||
|   int status, linesize, end_at_hostname, naliases; | ||||
|   struct in_addr addr; | ||||
|   struct hostent *hostent = NULL; | ||||
|  | ||||
|   while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) | ||||
|     { | ||||
|       /* Skip comment lines; terminate line at comment character. */ | ||||
|       if (*line == '#' || !*line) | ||||
| 	continue; | ||||
|       p = strchr(line, '#'); | ||||
|       if (p) | ||||
| 	*p = 0; | ||||
|  | ||||
|       /* Get the address part. */ | ||||
|       p = line; | ||||
|       while (*p && !isspace((unsigned char)*p)) | ||||
| 	p++; | ||||
|       if (!*p) | ||||
| 	continue; | ||||
|       *p = 0; | ||||
|       addr.s_addr = inet_addr(line); | ||||
|       if (addr.s_addr == INADDR_NONE) | ||||
| 	continue; | ||||
|  | ||||
|       /* Get the canonical hostname. */ | ||||
|       p++; | ||||
|       while (isspace((unsigned char)*p)) | ||||
| 	p++; | ||||
|       if (!*p) | ||||
| 	continue; | ||||
|       q = p; | ||||
|       while (*q && !isspace((unsigned char)*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++; | ||||
| 	    } | ||||
| 	} | ||||
|  | ||||
|       /* Allocate memory for the host structure. */ | ||||
|       hostent = malloc(sizeof(struct hostent)); | ||||
|       if (!hostent) | ||||
| 	break; | ||||
|       hostent->h_aliases = NULL; | ||||
|       hostent->h_addr_list = NULL; | ||||
|       hostent->h_name = strdup(canonical); | ||||
|       if (!hostent->h_name) | ||||
| 	break; | ||||
|       hostent->h_addr_list = malloc(2 * sizeof(char *)); | ||||
|       if (!hostent->h_addr_list) | ||||
| 	break; | ||||
|       hostent->h_addr_list[0] = malloc(sizeof(struct in_addr)); | ||||
|       if (!hostent->h_addr_list[0]) | ||||
| 	break; | ||||
|       hostent->h_aliases = malloc((naliases + 1) * sizeof(char *)); | ||||
|       if (!hostent->h_aliases) | ||||
| 	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; | ||||
| 	} | ||||
|       hostent->h_aliases[naliases] = NULL; | ||||
|  | ||||
|       hostent->h_addrtype = AF_INET; | ||||
|       hostent->h_length = sizeof(struct in_addr); | ||||
|       memcpy(hostent->h_addr_list[0], &addr, sizeof(struct in_addr)); | ||||
|       hostent->h_addr_list[1] = NULL; | ||||
|       *host = hostent; | ||||
|       free(line); | ||||
|       return ARES_SUCCESS; | ||||
|     } | ||||
|   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); | ||||
|       return ARES_ENOMEM; | ||||
|     } | ||||
|  | ||||
|   return status; | ||||
| } | ||||
							
								
								
									
										63
									
								
								ares/ares__read_line.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								ares/ares__read_line.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| /* 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 <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| /* This is an internal function.  Its contract is to read a line from | ||||
|  * a file into a dynamically allocated buffer, zeroing the trailing | ||||
|  * newline if there is one.  The calling routine may call | ||||
|  * ares__read_line multiple times with the same buf and bufsize | ||||
|  * pointers; *buf will be reallocated and *bufsize adjusted as | ||||
|  * appropriate.  The initial value of *buf should be NULL.  After the | ||||
|  * calling routine is done reading lines, it should free *buf. | ||||
|  */ | ||||
| int ares__read_line(FILE *fp, char **buf, int *bufsize) | ||||
| { | ||||
|   char *newbuf; | ||||
|   size_t offset = 0; | ||||
|   size_t len; | ||||
|  | ||||
|   if (*buf == NULL) | ||||
|     { | ||||
|       *buf = malloc(128); | ||||
|       if (!*buf) | ||||
| 	return ARES_ENOMEM; | ||||
|       *bufsize = 128; | ||||
|     } | ||||
|  | ||||
|   while (1) | ||||
|     { | ||||
|       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; | ||||
| 	} | ||||
|       offset = len; | ||||
|  | ||||
|       /* Allocate more space. */ | ||||
|       newbuf = realloc(*buf, *bufsize * 2); | ||||
|       if (!newbuf) | ||||
| 	return ARES_ENOMEM; | ||||
|       *buf = newbuf; | ||||
|       *bufsize *= 2; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										43
									
								
								ares/ares_destroy.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								ares/ares_destroy.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| .\" $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_DESTROY 3 "23 July 1998" | ||||
| .SH NAME | ||||
| ares_destroy \- Destroy a resolver channel | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B int ares_destroy(ares_channel \fIchannel\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_destroy | ||||
| function destroys the name service channel identified by | ||||
| .IR channel , | ||||
| freeing all memory and closing all sockets used by the channel. | ||||
| .B ares_destroy | ||||
| invokes the callbacks for each pending query on the channel, passing a | ||||
| status of | ||||
| .BR ARES_EDESTRUCTION . | ||||
| 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) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										44
									
								
								ares/ares_destroy.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								ares/ares_destroy.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| /* 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 <stdlib.h> | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| void ares_destroy(ares_channel channel) | ||||
| { | ||||
|   int i; | ||||
|   struct query *query; | ||||
|  | ||||
|   for (i = 0; i < channel->nservers; i++) | ||||
|     ares__close_sockets(&channel->servers[i]); | ||||
|   free(channel->servers); | ||||
|   for (i = 0; i < channel->ndomains; i++) | ||||
|     free(channel->domains[i]); | ||||
|   free(channel->domains); | ||||
|   if(channel->sortlist) | ||||
|     free(channel->sortlist); | ||||
|   free(channel->lookups); | ||||
|   while (channel->queries) | ||||
|     { | ||||
|       query = channel->queries; | ||||
|       channel->queries = query->next; | ||||
|       query->callback(query->arg, ARES_EDESTRUCTION, NULL, 0); | ||||
|       free(query->tcpbuf); | ||||
|       free(query->skip_server); | ||||
|       free(query); | ||||
|     } | ||||
|   free(channel); | ||||
| } | ||||
							
								
								
									
										81
									
								
								ares/ares_dns.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								ares/ares_dns.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| /* $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. | ||||
|  */ | ||||
|  | ||||
| #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)) | ||||
|  | ||||
| /* 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) | ||||
|  | ||||
| /* 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) | ||||
|  | ||||
| /* 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) | ||||
|  | ||||
| /* 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) | ||||
|  | ||||
| /* 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) | ||||
|  | ||||
| /* 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) | ||||
|  | ||||
| #endif /* ARES__DNS_H */ | ||||
							
								
								
									
										64
									
								
								ares/ares_expand_name.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								ares/ares_expand_name.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| .\" $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_name \- Expand a DNS-encoded domain name | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .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 	int *\fIenclen\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_expand_name | ||||
| function converts a DNS-encoded domain name to a dot-separated C | ||||
| string.  The argument | ||||
| .I encoded | ||||
| gives the beginning of the encoded domain name, 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 name is stored in the variable pointed to by | ||||
| .I enclen | ||||
| so that the caller can advance past the encoded domain name to read | ||||
| further data in the message. | ||||
| .SH RETURN VALUES | ||||
| .B ares_expand_name | ||||
| can return any of the following values: | ||||
| .TP 15 | ||||
| .B ARES_SUCCESS | ||||
| Expansion of the encoded name succeeded. | ||||
| .TP 15 | ||||
| .B ARES_EBADNAME | ||||
| The encoded domain name was malformed and could not be expanded. | ||||
| .TP 15 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .SH SEE ALSO | ||||
| .BR ares_mkquery (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										158
									
								
								ares/ares_expand_name.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								ares/ares_expand_name.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
|  | ||||
| #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); | ||||
|  | ||||
| /* Expand an RFC1035-encoded domain name given by encoded.  The | ||||
|  * containing message is given by abuf and alen.  The result given by | ||||
|  * *s, which is set to a NUL-terminated allocated buffer.  *enclen is | ||||
|  * set to the length of the encoded name (not the length of the | ||||
|  * expanded name; the goal is to tell the caller how many bytes to | ||||
|  * move forward to get past the encoded name). | ||||
|  * | ||||
|  * In the simple case, an encoded name is a series of labels, each | ||||
|  * composed of a one-byte length (limited to values between 0 and 63 | ||||
|  * inclusive) followed by the label contents.  The name is terminated | ||||
|  * by a zero-length label. | ||||
|  * | ||||
|  * In the more complicated case, a label may be terminated by an | ||||
|  * indirection pointer, specified by two bytes with the high bits of | ||||
|  * the first byte (corresponding to INDIR_MASK) set to 11.  With the | ||||
|  * two high bits of the first byte stripped off, the indirection | ||||
|  * pointer gives an offset from the beginning of the containing | ||||
|  * message with more labels to decode.  Indirection can happen an | ||||
|  * arbitrary number of times, so we have to detect loops. | ||||
|  * | ||||
|  * Since the expanded name uses '.' as a label separator, we use | ||||
|  * backslashes to escape periods or backslashes in the expanded name. | ||||
|  */ | ||||
|  | ||||
| int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf, | ||||
| 		     int alen, char **s, long *enclen) | ||||
| { | ||||
|   int len, indir = 0; | ||||
|   char *q; | ||||
|   const unsigned char *p; | ||||
|  | ||||
|   len = name_length(encoded, abuf, alen); | ||||
|   if (len == -1) | ||||
|     return ARES_EBADNAME; | ||||
|  | ||||
|   *s = malloc(len + 1); | ||||
|   if (!*s) | ||||
|     return ARES_ENOMEM; | ||||
|   q = *s; | ||||
|  | ||||
|   /* No error-checking necessary; it was all done by name_length(). */ | ||||
|   p = encoded; | ||||
|   while (*p) | ||||
|     { | ||||
|       if ((*p & INDIR_MASK) == INDIR_MASK) | ||||
| 	{ | ||||
| 	  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++ = '.'; | ||||
| 	} | ||||
|     } | ||||
|   if (!indir) | ||||
|     *enclen = p + 1 - encoded; | ||||
|  | ||||
|   /* Nuke the trailing period if we wrote one. */ | ||||
|   if (q > *s) | ||||
|     *(q - 1) = 0; | ||||
|  | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| /* Return the length of the expansion of an encoded domain name, or | ||||
|  * -1 if the encoding is invalid. | ||||
|  */ | ||||
| static int name_length(const unsigned char *encoded, const unsigned char *abuf, | ||||
| 		       int alen) | ||||
| { | ||||
|   int n = 0, offset, indir = 0; | ||||
|  | ||||
|   /* Allow the caller to pass us abuf + alen and have us check for it. */ | ||||
|   if (encoded == abuf + alen) | ||||
|     return -1; | ||||
|  | ||||
|   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; | ||||
|  | ||||
| 	  /* 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++; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   /* If there were any labels at all, then the number of dots is one | ||||
|    * less than the number of labels, so subtract one. | ||||
|    */ | ||||
|   return (n) ? n - 1 : n; | ||||
| } | ||||
							
								
								
									
										62
									
								
								ares/ares_fds.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								ares/ares_fds.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_FDS 3 "23 July 1998" | ||||
| .SH NAME | ||||
| ares_fds \- Get file descriptors to select on for name service | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B int ares_fds(ares_channel \fIchannel\fP, fd_set *\fIread_fds\fP, | ||||
| .B	fd_set *\fIwrite_fds\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_fds | ||||
| function retrieves the set of file descriptors which the calling | ||||
| application should select on for reading and writing for the | ||||
| processing of name service queries pending on the name service channel | ||||
| identified by | ||||
| .IR channel . | ||||
| File descriptors will be set in the file descriptor sets pointed to by | ||||
| .I read_fds | ||||
| and | ||||
| .I write_fds | ||||
| as appropriate.  File descriptors already set in | ||||
| .I read_fds | ||||
| and | ||||
| .I write_fds | ||||
| will remain set; initialization of the file descriptor sets | ||||
| (using | ||||
| .BR FD_ZERO ) | ||||
| is the responsibility of the caller. | ||||
| .SH RETURN VALUES | ||||
| .B ares_fds | ||||
| returns one greater than the number of the highest socket set in either | ||||
| .I read_fds | ||||
| or | ||||
| .IR write_fds . | ||||
| If no queries are active, | ||||
| .B ares_fds | ||||
| will return 0. | ||||
| .SH SEE ALSO | ||||
| .BR ares_timeout (3), | ||||
| .BR ares_process (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										56
									
								
								ares/ares_fds.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								ares/ares_fds.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
|  | ||||
| #else | ||||
| #include <sys/time.h> | ||||
| #endif | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds) | ||||
| { | ||||
|   struct server_state *server; | ||||
|   int i, nfds; | ||||
|  | ||||
|   /* No queries, no file descriptors. */ | ||||
|   if (!channel->queries) | ||||
|     return 0; | ||||
|  | ||||
|   nfds = 0; | ||||
|   for (i = 0; i < channel->nservers; i++) | ||||
|     { | ||||
|       server = &channel->servers[i]; | ||||
|       if (server->udp_socket != -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; | ||||
| 	} | ||||
|     } | ||||
|   return nfds; | ||||
| } | ||||
							
								
								
									
										49
									
								
								ares/ares_free_hostent.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								ares/ares_free_hostent.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| .\" $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_FREE_HOSTENT 3 "23 July 1998" | ||||
| .SH NAME | ||||
| ares_free_hostent \- Free host structure allocated by ares functions | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B void ares_free_hostent(struct hostent *\fIhost\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| 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 . | ||||
| .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 | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										38
									
								
								ares/ares_free_hostent.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								ares/ares_free_hostent.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| /* 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 <stdlib.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
|  | ||||
| #else | ||||
| #include <netdb.h> | ||||
| #endif | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" /* for memdebug */ | ||||
|  | ||||
| void ares_free_hostent(struct hostent *host) | ||||
| { | ||||
|   char **p; | ||||
|  | ||||
|   free(host->h_name); | ||||
|   for (p = host->h_aliases; *p; p++) | ||||
|     free(*p); | ||||
|   free(host->h_aliases); | ||||
|   free(host->h_addr_list[0]); | ||||
|   free(host->h_addr_list); | ||||
|   free(host); | ||||
| } | ||||
							
								
								
									
										37
									
								
								ares/ares_free_string.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								ares/ares_free_string.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .\" Copyright 2000 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_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(void *\fIstr\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .I ares_free_string | ||||
| function frees a string allocated by the | ||||
| .I ares_mkquery | ||||
| function. | ||||
| .SH SEE ALSO | ||||
| .BR ares_mkquery (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 2000 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										22
									
								
								ares/ares_free_string.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								ares/ares_free_string.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| /* Copyright 2000 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 <stdlib.h> | ||||
| #include "ares.h" | ||||
|  | ||||
| void ares_free_string(void *str) | ||||
| { | ||||
|   free(str); | ||||
| } | ||||
							
								
								
									
										100
									
								
								ares/ares_gethostbyaddr.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								ares/ares_gethostbyaddr.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| .\" $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_GETHOSTBYADDR 3 "24 July 1998" | ||||
| .SH NAME | ||||
| ares_gethostbyaddr \- Initiate a host query by address | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B typedef void (*ares_host_callback)(void *\fIarg\fP, int \fIstatus\fP, | ||||
| .B	struct hostent *\fIhostent\fP) | ||||
| .PP | ||||
| .B void ares_gethostbyaddr(ares_channel \fIchannel\fP, const void *\fIaddr\fP, | ||||
| .B 	int \fIaddrlen\fP, int \fIfamily\fP, ares_host_callback \fIcallback\fP, | ||||
| .B 	void *\fIarg\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_gethostbyaddr | ||||
| function initiates a host query by address on the name service channel | ||||
| identified by | ||||
| .IR channel . | ||||
| The parameters | ||||
| .I addr | ||||
| 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). | ||||
| .PP | ||||
| The callback argument | ||||
| .I arg | ||||
| is copied from the | ||||
| .B ares_gethostbyaddr | ||||
| argument | ||||
| .IR arg . | ||||
| The callback argument | ||||
| .I status | ||||
| indicates whether the query succeeded and, if not, how it failed.  It | ||||
| may have any of the following values: | ||||
| .TP 19 | ||||
| .B ARES_SUCCESS | ||||
| The host lookup completed successfully. | ||||
| .TP 19 | ||||
| .B ARES_ENOTIMP | ||||
| The ares library does not know how to look up addresses of type | ||||
| .IR family . | ||||
| .TP 19 | ||||
| .B ARES_ENOTFOUND | ||||
| The address | ||||
| .I addr | ||||
| was not found. | ||||
| .TP 19 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .TP 19 | ||||
| .B ARES_EDESTRUCTION | ||||
| The name service channel | ||||
| .I channel | ||||
| is being destroyed; the query will not be completed. | ||||
| .PP | ||||
| On successful completion of the query, the callback argument | ||||
| .I hostent | ||||
| points to a | ||||
| .B struct hostent | ||||
| containing the name of the host returned by the query.  The callback | ||||
| need not and should not attempt to free the memory pointed to by | ||||
| .IR hostent ; | ||||
| the ares library will free it when the callback returns.  If the query | ||||
| did not complete successfully, | ||||
| .I hostent | ||||
| will be | ||||
| .BR NULL . | ||||
| .SH SEE ALSO | ||||
| .BR ares_process (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										172
									
								
								ares/ares_gethostbyaddr.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								ares/ares_gethostbyaddr.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,172 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| struct addr_query { | ||||
|   /* Arguments passed to ares_gethostbyaddr() */ | ||||
|   ares_channel channel; | ||||
|   struct in_addr addr; | ||||
|   ares_host_callback callback; | ||||
|   void *arg; | ||||
|  | ||||
|   const char *remaining_lookups; | ||||
| }; | ||||
|  | ||||
| static void next_lookup(struct addr_query *aquery); | ||||
| 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); | ||||
| 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) | ||||
| { | ||||
|   struct addr_query *aquery; | ||||
|  | ||||
|   if (family != AF_INET || addrlen != sizeof(struct in_addr)) | ||||
|     { | ||||
|       callback(arg, ARES_ENOTIMP, NULL); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   aquery = malloc(sizeof(struct addr_query)); | ||||
|   if (!aquery) | ||||
|     { | ||||
|       callback(arg, ARES_ENOMEM, NULL); | ||||
|       return; | ||||
|     } | ||||
|   aquery->channel = channel; | ||||
|   memcpy(&aquery->addr, addr, sizeof(aquery->addr)); | ||||
|   aquery->callback = callback; | ||||
|   aquery->arg = arg; | ||||
|   aquery->remaining_lookups = channel->lookups; | ||||
|  | ||||
|   next_lookup(aquery); | ||||
| } | ||||
|  | ||||
| static void next_lookup(struct addr_query *aquery) | ||||
| { | ||||
|   const char *p; | ||||
|   char name[64]; | ||||
|   int a1, a2, a3, a4, status; | ||||
|   struct hostent *host; | ||||
|   unsigned long addr; | ||||
|  | ||||
|   for (p = aquery->remaining_lookups; *p; p++) | ||||
|     { | ||||
|       switch (*p) | ||||
| 	{ | ||||
| 	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); | ||||
| } | ||||
|  | ||||
| static void addr_callback(void *arg, int status, unsigned char *abuf, int alen) | ||||
| { | ||||
|   struct addr_query *aquery = (struct addr_query *) arg; | ||||
|   struct hostent *host; | ||||
|  | ||||
|   if (status == ARES_SUCCESS) | ||||
|     { | ||||
|       status = ares_parse_ptr_reply(abuf, alen, &aquery->addr, | ||||
| 				    sizeof(struct in_addr), AF_INET, &host); | ||||
|       end_aquery(aquery, status, host); | ||||
|     } | ||||
|   else if (status == ARES_EDESTRUCTION) | ||||
|     end_aquery(aquery, status, NULL); | ||||
|   else | ||||
|     next_lookup(aquery); | ||||
| } | ||||
|  | ||||
| static void end_aquery(struct addr_query *aquery, int status, | ||||
| 		       struct hostent *host) | ||||
| { | ||||
|   aquery->callback(aquery->arg, status, host); | ||||
|   if (host) | ||||
|     ares_free_hostent(host); | ||||
|   free(aquery); | ||||
| } | ||||
|  | ||||
| static int file_lookup(struct in_addr *addr, struct hostent **host) | ||||
| { | ||||
|   FILE *fp; | ||||
|   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); | ||||
|   } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|   fp = fopen(PATH_HOSTS, "r"); | ||||
|   if (!fp) | ||||
|     return ARES_ENOTFOUND; | ||||
|  | ||||
|   while ((status = ares__get_hostent(fp, host)) == ARES_SUCCESS) | ||||
|     { | ||||
|       if (memcmp((*host)->h_addr, addr, sizeof(struct in_addr)) == 0) | ||||
| 	break; | ||||
|       ares_free_hostent(*host); | ||||
|     } | ||||
|   fclose(fp); | ||||
|   if (status == ARES_EOF) | ||||
|     status = ARES_ENOTFOUND; | ||||
|   if (status != ARES_SUCCESS) | ||||
|     *host = NULL; | ||||
|   return status; | ||||
| } | ||||
							
								
								
									
										103
									
								
								ares/ares_gethostbyname.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								ares/ares_gethostbyname.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| .\" $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_GETHOSTBYNAME 3 "25 July 1998" | ||||
| .SH NAME | ||||
| ares_gethostbyname \- Initiate a host query by name | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B typedef void (*ares_host_callback)(void *\fIarg\fP, int \fIstatus\fP, | ||||
| .B	struct hostent *\fIhostent\fP) | ||||
| .PP | ||||
| .B void ares_gethostbyname(ares_channel \fIchannel\fP, const char *\fIname\fP, | ||||
| .B 	int \fIfamily\fP, ares_host_callback \fIcallback\fP, void *\fIarg\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_gethostbyname | ||||
| function initiates a host query by name on the name service channel | ||||
| identified by | ||||
| .IR channel . | ||||
| 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). | ||||
| .PP | ||||
| The callback argument | ||||
| .I arg | ||||
| is copied from the | ||||
| .B ares_gethostbyname | ||||
| argument | ||||
| .IR arg . | ||||
| The callback argument | ||||
| .I status | ||||
| indicates whether the query succeeded and, if not, how it failed.  It | ||||
| may have any of the following values: | ||||
| .TP 19 | ||||
| .B ARES_SUCCESS | ||||
| The host lookup completed successfully. | ||||
| .TP 19 | ||||
| .B ARES_ENOTIMP | ||||
| The ares library does not know how to find addresses of type | ||||
| .IR family . | ||||
| .TP 19 | ||||
| .B ARES_EBADNAME | ||||
| The hostname | ||||
| .B name | ||||
| is composed entirely of numbers and periods, but is not a valid | ||||
| representation of an Internet address. | ||||
| .TP 19 | ||||
| .B ARES_ENOTFOUND | ||||
| The address | ||||
| .I addr | ||||
| was not found. | ||||
| .TP 19 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .TP 19 | ||||
| .B ARES_EDESTRUCTION | ||||
| The name service channel | ||||
| .I channel | ||||
| is being destroyed; the query will not be completed. | ||||
| .PP | ||||
| On successful completion of the query, the callback argument | ||||
| .I hostent | ||||
| points to a | ||||
| .B struct hostent | ||||
| containing the name of the host returned by the query.  The callback | ||||
| need not and should not attempt to free the memory pointed to by | ||||
| .IR hostent ; | ||||
| the ares library will free it when the callback returns.  If the query | ||||
| did not complete successfully, | ||||
| .I hostent | ||||
| will be | ||||
| .BR NULL . | ||||
| .SH SEE ALSO | ||||
| .BR ares_process (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										295
									
								
								ares/ares_gethostbyname.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										295
									
								
								ares/ares_gethostbyname.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,295 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <ctype.h> | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| struct host_query { | ||||
|   /* Arguments passed to ares_gethostbyname() */ | ||||
|   ares_channel channel; | ||||
|   char *name; | ||||
|   ares_host_callback callback; | ||||
|   void *arg; | ||||
|  | ||||
|   const char *remaining_lookups; | ||||
| }; | ||||
|  | ||||
| static void next_lookup(struct host_query *hquery); | ||||
| 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); | ||||
| static int fake_hostent(const char *name, ares_host_callback callback, | ||||
| 			void *arg); | ||||
| static int file_lookup(const char *name, struct hostent **host); | ||||
| static void sort_addresses(struct hostent *host, struct apattern *sortlist, | ||||
| 			   int nsort); | ||||
| static int get_address_index(struct in_addr *addr, struct apattern *sortlist, | ||||
| 			     int nsort); | ||||
|  | ||||
| void ares_gethostbyname(ares_channel channel, const char *name, int family, | ||||
| 			ares_host_callback callback, void *arg) | ||||
| { | ||||
|   struct host_query *hquery; | ||||
|  | ||||
|   /* Right now we only know how to look up Internet addresses. */ | ||||
|   if (family != AF_INET) | ||||
|     { | ||||
|       callback(arg, ARES_ENOTIMP, NULL); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   if (fake_hostent(name, callback, arg)) | ||||
|     return; | ||||
|  | ||||
|   /* Allocate and fill in the host query structure. */ | ||||
|   hquery = malloc(sizeof(struct host_query)); | ||||
|   if (!hquery) | ||||
|     { | ||||
|       callback(arg, ARES_ENOMEM, NULL); | ||||
|       return; | ||||
|     } | ||||
|   hquery->channel = channel; | ||||
|   hquery->name = strdup(name); | ||||
|   if (!hquery->name) | ||||
|     { | ||||
|       free(hquery); | ||||
|       callback(arg, ARES_ENOMEM, NULL); | ||||
|       return; | ||||
|     } | ||||
|   hquery->callback = callback; | ||||
|   hquery->arg = arg; | ||||
|   hquery->remaining_lookups = channel->lookups; | ||||
|  | ||||
|   /* Start performing lookups according to channel->lookups. */ | ||||
|   next_lookup(hquery); | ||||
| } | ||||
|  | ||||
| static void next_lookup(struct host_query *hquery) | ||||
| { | ||||
|   int status; | ||||
|   const char *p; | ||||
|   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 '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); | ||||
| } | ||||
|  | ||||
| static void host_callback(void *arg, int status, unsigned char *abuf, int alen) | ||||
| { | ||||
|   struct host_query *hquery = (struct host_query *) arg; | ||||
|   ares_channel channel = hquery->channel; | ||||
|   struct hostent *host; | ||||
|  | ||||
|   if (status == ARES_SUCCESS) | ||||
|     { | ||||
|       status = ares_parse_a_reply(abuf, alen, &host); | ||||
|       if (host && channel->nsort) | ||||
| 	sort_addresses(host, channel->sortlist, channel->nsort); | ||||
|       end_hquery(hquery, status, host); | ||||
|     } | ||||
|   else if (status == ARES_EDESTRUCTION) | ||||
|     end_hquery(hquery, status, NULL); | ||||
|   else | ||||
|     next_lookup(hquery); | ||||
| } | ||||
|  | ||||
| static void end_hquery(struct host_query *hquery, int status, | ||||
| 		       struct hostent *host) | ||||
| { | ||||
|   hquery->callback(hquery->arg, status, host); | ||||
|   if (host) | ||||
|     ares_free_hostent(host); | ||||
|   free(hquery->name); | ||||
|   free(hquery); | ||||
| } | ||||
|  | ||||
| /* If the name looks like an IP address, fake up a host entry, end the | ||||
|  * query immediately, and return true.  Otherwise return false. | ||||
|  */ | ||||
| static int fake_hostent(const char *name, ares_host_callback callback, | ||||
| 			void *arg) | ||||
| { | ||||
|   struct in_addr addr; | ||||
|   struct hostent hostent; | ||||
|   const char *p; | ||||
|   char *aliases[1] = { NULL }; | ||||
|   char *addrs[2]; | ||||
|  | ||||
|   /* It only looks like an IP address if it's all numbers and dots. */ | ||||
|   for (p = name; *p; p++) | ||||
|     { | ||||
|       if (!isdigit((unsigned char)*p) && *p != '.') | ||||
| 	return 0; | ||||
|     } | ||||
|  | ||||
|   /* It also only looks like an IP address if it's non-zero-length and | ||||
|    * doesn't end with a dot. | ||||
|    */ | ||||
|   if (p == name || *(p - 1) == '.') | ||||
|     return 0; | ||||
|  | ||||
|   /* It looks like an IP address.  Figure out what IP address it is. */ | ||||
|   addr.s_addr = inet_addr(name); | ||||
|   if (addr.s_addr == INADDR_NONE) | ||||
|     { | ||||
|       callback(arg, ARES_EBADNAME, NULL); | ||||
|       return 1; | ||||
|     } | ||||
|  | ||||
|   /* Duplicate the name, to avoid a constness violation. */ | ||||
|   hostent.h_name = strdup(name); | ||||
|   if (!hostent.h_name) | ||||
|     { | ||||
|       callback(arg, ARES_ENOMEM, NULL); | ||||
|       return 1; | ||||
|     } | ||||
|  | ||||
|   /* Fill in the rest of the host structure and terminate the query. */ | ||||
|   addrs[0] = (char *) &addr; | ||||
|   addrs[1] = NULL; | ||||
|   hostent.h_aliases = aliases; | ||||
|   hostent.h_addrtype = AF_INET; | ||||
|   hostent.h_length = sizeof(struct in_addr); | ||||
|   hostent.h_addr_list = addrs; | ||||
|   callback(arg, ARES_SUCCESS, &hostent); | ||||
|  | ||||
|   free(hostent.h_name); | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| static int file_lookup(const char *name, struct hostent **host) | ||||
| { | ||||
|   FILE *fp; | ||||
|   char **alias; | ||||
|   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); | ||||
|   } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|   fp = fopen(PATH_HOSTS, "r"); | ||||
|   if (!fp) | ||||
|     return ARES_ENOTFOUND; | ||||
|  | ||||
|   while ((status = ares__get_hostent(fp, host)) == ARES_SUCCESS) | ||||
|     { | ||||
|       if (strcasecmp((*host)->h_name, name) == 0) | ||||
| 	break; | ||||
|       for (alias = (*host)->h_aliases; *alias; alias++) | ||||
| 	{ | ||||
| 	  if (strcasecmp(*alias, name) == 0) | ||||
| 	    break; | ||||
| 	} | ||||
|       if (*alias) | ||||
| 	break; | ||||
|       ares_free_hostent(*host); | ||||
|     } | ||||
|   fclose(fp); | ||||
|   if (status == ARES_EOF) | ||||
|     status = ARES_ENOTFOUND; | ||||
|   if (status != ARES_SUCCESS) | ||||
|     *host = NULL; | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| static void sort_addresses(struct hostent *host, struct apattern *sortlist, | ||||
| 			   int nsort) | ||||
| { | ||||
|   struct in_addr a1, a2; | ||||
|   int i1, i2, ind1, ind2; | ||||
|  | ||||
|   /* This is a simple insertion sort, not optimized at all.  i1 walks | ||||
|    * through the address list, with the loop invariant that everything | ||||
|    * to the left of i1 is sorted.  In the loop body, the value at i1 is moved | ||||
|    * back through the list (via i2) until it is in sorted order. | ||||
|    */ | ||||
|   for (i1 = 0; host->h_addr_list[i1]; i1++) | ||||
|     { | ||||
|       memcpy(&a1, host->h_addr_list[i1], sizeof(struct 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(host->h_addr_list[i2 + 1], &a1, sizeof(struct in_addr)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* Find the first entry in sortlist which matches addr.  Return nsort | ||||
|  * if none of them match. | ||||
|  */ | ||||
| static int get_address_index(struct in_addr *addr, struct apattern *sortlist, | ||||
| 			     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; | ||||
|     } | ||||
|   return i; | ||||
| } | ||||
							
								
								
									
										170
									
								
								ares/ares_init.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								ares/ares_init.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,170 @@ | ||||
| .\" $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_INIT 3 "21 July 1998" | ||||
| .SH NAME | ||||
| ares_init, ares_init_options \- Initialize a resolver channel | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B int ares_init(ares_channel *\fIchannel\fP) | ||||
| .B int ares_init_options(ares_channel *\fIchannel\fP, | ||||
| .B 	struct ares_options *\fIoptions\fP, int \fIoptmask\fP) | ||||
| .PP | ||||
| .B cc file.c -lares | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_init | ||||
| function initializes a communications channel for name service | ||||
| lookups.  If it returns successfully, | ||||
| .B ares_init | ||||
| will set the variable pointed to by | ||||
| .I channel | ||||
| to a handle used to identify the name service channel.  The caller | ||||
| should invoke | ||||
| .BR ares_destroy (3) | ||||
| on the handle when the channel is no longer needed. | ||||
| .PP | ||||
| The | ||||
| .B ares_init_options | ||||
| function also initializes a name service channel, with additional | ||||
| options useful for applications requiring more control over name | ||||
| service configuration.  The | ||||
| .I optmask | ||||
| parameter specifies which fields in the structure pointed to by | ||||
| .I options | ||||
| are set, as follows: | ||||
| .PP | ||||
| .TP 18 | ||||
| .B ARES_OPT_FLAGS | ||||
| .B int \fIflags\fP; | ||||
| .br | ||||
| Flags controlling the behavior of the resolver.  See below for a | ||||
| description of possible flag values. | ||||
| .TP 18 | ||||
| .B ARES_OPT_TIMEOUT | ||||
| .B int \fItimeout\fP; | ||||
| .br | ||||
| The number of seconds each name server is given to respond to a query | ||||
| on the first try.  (After the first try, the timeout algorithm becomes | ||||
| more complicated, but scales linearly with the value of | ||||
| \fItimeout\fP.)  The default is five seconds. | ||||
| .TP 18 | ||||
| .B ARES_OPT_TRIES | ||||
| .B int \fItries\fP; | ||||
| .br | ||||
| The number of tries the resolver will try contacting each name server | ||||
| before giving up.  The default is four tries. | ||||
| .TP 18 | ||||
| .B ARES_OPT_NDOTS | ||||
| .B int \fIndots\fP; | ||||
| .br | ||||
| The number of dots which must be present in a domain name for it to be | ||||
| queried for "as is" prior to querying for it with the default domain | ||||
| extensions appended.  The default value is 1 unless set otherwise by | ||||
| resolv.conf or the RES_OPTIONS environment variable. | ||||
| .TP 18 | ||||
| .B ARES_OPT_PORT | ||||
| .B unsigned short \fIport\fP; | ||||
| .br | ||||
| The port to use for queries (both TCP and UDP), in network byte order. | ||||
| The default value is 53 (in network byte order), the standard name | ||||
| service port. | ||||
| .TP 18 | ||||
| .B ARES_OPT_SERVERS | ||||
| .B struct in_addr *\fIservers\fP; | ||||
| .br | ||||
| .B int \fInservers\fP; | ||||
| .br | ||||
| The list of servers to contact, instead of the servers specified in | ||||
| resolv.conf or the local named. | ||||
| .TP 18 | ||||
| .B ARES_OPT_DOMAINS | ||||
| .B char **\fIdomains\fP; | ||||
| .br | ||||
| .B int \fIndomains\fP; | ||||
| .br | ||||
| The domains to search, instead of the domains specified in resolv.conf | ||||
| or the domain derived from the kernel hostname variable. | ||||
| .TP 18 | ||||
| .B ARES_OPT_LOOKUPS | ||||
| .B char *\fIlookups\fP; | ||||
| .br | ||||
| The lookups to perform for host queries.   | ||||
| .I lookups | ||||
| should be set to a string of the characters "b" or "f", where "b" | ||||
| indicates a DNS lookup and "f" indicates a lookup in the hosts file. | ||||
| .PP | ||||
| The | ||||
| .I flags | ||||
| field should be the bitwise or of some subset of the following values: | ||||
| .TP 23 | ||||
| .B ARES_FLAG_USEVC | ||||
| Always use TCP queries (the "virtual circuit") instead of UDP | ||||
| queries.  Normally, TCP is only used if a UDP query yields a truncated | ||||
| result. | ||||
| .TP 23 | ||||
| .B ARES_FLAG_PRIMARY | ||||
| Only query the first server in the list of servers to query. | ||||
| .TP 23 | ||||
| .B ARES_FLAG_IGNTC | ||||
| If a truncated response to a UDP query is received, do not fall back | ||||
| to TCP; simply continue on with the truncated response. | ||||
| .TP 23 | ||||
| .B ARES_FLAG_NORECURSE | ||||
| Do not set the "recursion desired" bit on outgoing queries, so that | ||||
| the name server being contacted will not try to fetch the answer from | ||||
| other servers if it doesn't know the answer locally. | ||||
| .TP 23 | ||||
| .B ARES_FLAG_STAYOPEN | ||||
| Do not close communciations sockets when the number of active queries | ||||
| drops to zero. | ||||
| .TP 23 | ||||
| .B ARES_FLAG_NOSEARCH | ||||
| Do not use the default search domains; only query hostnames as-is or | ||||
| as aliases. | ||||
| .TP 23 | ||||
| .B ARES_FLAG_NOALIASES | ||||
| Do not honor the HOSTALIASES environment variable, which normally | ||||
| specifies a file of hostname translations. | ||||
| .TP 23 | ||||
| .B ARES_FLAG_NOCHECKRESP | ||||
| Do not discard responses with the SERVFAIL, NOTIMP, or REFUSED | ||||
| response code or responses whose questions don't match the questions | ||||
| in the request.  Primarily useful for writing clients which might be | ||||
| used to test or debug name servers. | ||||
| .SH RETURN VALUES | ||||
| .I ares_init | ||||
| or | ||||
| .I ares_init_options | ||||
| can return any of the following values: | ||||
| .TP 14 | ||||
| .B ARES_SUCCESS | ||||
| Initialization succeeded. | ||||
| .TP 14 | ||||
| .B ARES_EFILE | ||||
| A configuration file could not be read. | ||||
| .TP 14 | ||||
| .B ARES_ENOMEM | ||||
| The process's available memory was exhausted. | ||||
| .SH SEE ALSO | ||||
| .BR ares_destroy (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										824
									
								
								ares/ares_init.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										824
									
								
								ares/ares_init.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,824 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <sys/param.h> | ||||
| #include <sys/time.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #include <unistd.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <ctype.h> | ||||
| #include <time.h> | ||||
| #include <errno.h> | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| static int init_by_options(ares_channel channel, struct ares_options *options, | ||||
| 			   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_nameserver(struct server_state **servers, int *nservers, | ||||
| 			     char *str); | ||||
| static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||
| 			   const char *str); | ||||
| static int set_search(ares_channel channel, const char *str); | ||||
| static int set_options(ares_channel channel, const char *str); | ||||
| static char *try_config(char *s, const char *opt); | ||||
| static const char *try_option(const char *p, const char *q, const char *opt); | ||||
| static int ip_addr(const char *s, int len, struct in_addr *addr); | ||||
| static void natural_mask(struct apattern *pat); | ||||
|  | ||||
| int ares_init(ares_channel *channelptr) | ||||
| { | ||||
|   return ares_init_options(channelptr, NULL, 0); | ||||
| } | ||||
|  | ||||
| int ares_init_options(ares_channel *channelptr, struct ares_options *options, | ||||
| 		      int optmask) | ||||
| { | ||||
|   ares_channel channel; | ||||
|   int i, status; | ||||
|   struct server_state *server; | ||||
|   struct timeval tv; | ||||
|  | ||||
|   channel = malloc(sizeof(struct ares_channeldata)); | ||||
|   if (!channel) | ||||
|     return ARES_ENOMEM; | ||||
|  | ||||
|   /* Set everything to distinguished values so we know they haven't | ||||
|    * been set yet. | ||||
|    */ | ||||
|   channel->flags = -1; | ||||
|   channel->timeout = -1; | ||||
|   channel->tries = -1; | ||||
|   channel->ndots = -1; | ||||
|   channel->udp_port = -1; | ||||
|   channel->tcp_port = -1; | ||||
|   channel->nservers = -1; | ||||
|   channel->ndomains = -1; | ||||
|   channel->nsort = -1; | ||||
|   channel->lookups = NULL; | ||||
|   channel->queries = NULL; | ||||
|  | ||||
|   /* Initialize configuration by each of the four sources, from highest | ||||
|    * precedence to lowest. | ||||
|    */ | ||||
|   status = init_by_options(channel, options, optmask); | ||||
|   if (status == ARES_SUCCESS) | ||||
|     status = init_by_environment(channel); | ||||
|   if (status == ARES_SUCCESS) | ||||
|     status = init_by_resolv_conf(channel); | ||||
|   if (status == ARES_SUCCESS) | ||||
|     status = init_by_defaults(channel); | ||||
|   if (status != ARES_SUCCESS) | ||||
|     { | ||||
|       /* 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); | ||||
|       return status; | ||||
|     } | ||||
|  | ||||
|   /* Trim to one server if ARES_FLAG_PRIMARY is set. */ | ||||
|   if ((channel->flags & ARES_FLAG_PRIMARY) && channel->nservers > 1) | ||||
|     channel->nservers = 1; | ||||
|  | ||||
|   /* Initialize server states. */ | ||||
|   for (i = 0; i < channel->nservers; i++) | ||||
|     { | ||||
|       server = &channel->servers[i]; | ||||
|       server->udp_socket = -1; | ||||
|       server->tcp_socket = -1; | ||||
|       server->tcp_lenbuf_pos = 0; | ||||
|       server->tcp_buffer = NULL; | ||||
|       server->qhead = NULL; | ||||
|       server->qtail = NULL; | ||||
|     } | ||||
|  | ||||
|   /* Choose a somewhat random query ID.  The main point is to avoid | ||||
|    * collisions with stale queries.  An attacker trying to spoof a DNS | ||||
|    * answer also has to guess the query ID, but it's only a 16-bit | ||||
|    * field, so there's not much to be done about that. | ||||
|    */ | ||||
|   gettimeofday(&tv, NULL); | ||||
|   channel->next_id = (unsigned short) | ||||
|     (tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff; | ||||
|  | ||||
|   channel->queries = NULL; | ||||
|  | ||||
|   *channelptr = channel; | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| static int init_by_options(ares_channel channel, struct ares_options *options, | ||||
| 			   int optmask) | ||||
| { | ||||
|   int i; | ||||
|  | ||||
|   /* Easy stuff. */ | ||||
|   if ((optmask & ARES_OPT_FLAGS) && channel->flags == -1) | ||||
|     channel->flags = options->flags; | ||||
|   if ((optmask & ARES_OPT_TIMEOUT) && channel->timeout == -1) | ||||
|     channel->timeout = options->timeout; | ||||
|   if ((optmask & ARES_OPT_TRIES) && channel->tries == -1) | ||||
|     channel->tries = options->tries; | ||||
|   if ((optmask & ARES_OPT_NDOTS) && channel->ndots == -1) | ||||
|     channel->ndots = options->ndots; | ||||
|   if ((optmask & ARES_OPT_UDP_PORT) && channel->udp_port == -1) | ||||
|     channel->udp_port = options->udp_port; | ||||
|   if ((optmask & ARES_OPT_TCP_PORT) && channel->tcp_port == -1) | ||||
|     channel->tcp_port = options->tcp_port; | ||||
|  | ||||
|   /* Copy the servers, if given. */ | ||||
|   if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1) | ||||
|     { | ||||
|       channel->servers = | ||||
| 	malloc(options->nservers * sizeof(struct server_state)); | ||||
|       if (!channel->servers && options->nservers != 0) | ||||
| 	return ARES_ENOMEM; | ||||
|       for (i = 0; i < options->nservers; i++) | ||||
| 	channel->servers[i].addr = options->servers[i]; | ||||
|       channel->nservers = options->nservers; | ||||
|     } | ||||
|  | ||||
|   /* Copy the domains, if given.  Keep channel->ndomains consistent so | ||||
|    * we can clean up in case of error. | ||||
|    */ | ||||
|   if ((optmask & ARES_OPT_DOMAINS) && channel->ndomains == -1) | ||||
|     { | ||||
|       channel->domains = malloc(options->ndomains * sizeof(char *)); | ||||
|       if (!channel->domains && options->ndomains != 0) | ||||
| 	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 = options->ndomains; | ||||
|     } | ||||
|  | ||||
|   /* Set lookups, if given. */ | ||||
|   if ((optmask & ARES_OPT_LOOKUPS) && !channel->lookups) | ||||
|     { | ||||
|       channel->lookups = strdup(options->lookups); | ||||
|       if (!channel->lookups) | ||||
| 	return ARES_ENOMEM; | ||||
|     } | ||||
|  | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| static int init_by_environment(ares_channel channel) | ||||
| { | ||||
|   const char *localdomain, *res_options; | ||||
|   int status; | ||||
|  | ||||
|   localdomain = getenv("LOCALDOMAIN"); | ||||
|   if (localdomain && channel->ndomains == -1) | ||||
|     { | ||||
|       status = set_search(channel, localdomain); | ||||
|       if (status != ARES_SUCCESS) | ||||
| 	return status; | ||||
|     } | ||||
|  | ||||
|   res_options = getenv("RES_OPTIONS"); | ||||
|   if (res_options) | ||||
|     { | ||||
|       status = set_options(channel, res_options); | ||||
|       if (status != ARES_SUCCESS) | ||||
| 	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 | ||||
|  * use free() if the function returns 1 | ||||
|  */ | ||||
| static int get_res_nt(HKEY hKey, 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); | ||||
|  | ||||
|   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) | ||||
| { | ||||
|   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; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static int init_by_resolv_conf(ares_channel channel) | ||||
| { | ||||
|   char *line = NULL; | ||||
|   int status, nservers = 0, nsort = 0; | ||||
|   struct server_state *servers = NULL; | ||||
|   struct apattern *sortlist = NULL; | ||||
|  | ||||
| #ifdef WIN32 | ||||
|  | ||||
|     /* | ||||
|   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: | ||||
| HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\NameServer | ||||
| 	or | ||||
| HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DhcpNameServer | ||||
| 	or | ||||
| HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\{AdapterID}\ | ||||
| NameServer | ||||
| 	or | ||||
| HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\{AdapterID}\ | ||||
| DhcpNameServer | ||||
|    */ | ||||
|  | ||||
|   HKEY mykey; | ||||
|   HKEY subkey; | ||||
|   DWORD data_type; | ||||
|   DWORD bytes; | ||||
|   DWORD result; | ||||
|   DWORD keysize = MAX_PATH; | ||||
|  | ||||
|   status = ARES_EFILE; | ||||
|  | ||||
|   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 | ||||
|           ) == 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_EFILE) | ||||
|   { | ||||
|     /* | ||||
|       if (!channel->lookups) { | ||||
|       status = config_lookup(channel, "file bind"); | ||||
|       } | ||||
|     */ | ||||
|     status = ARES_EOF; | ||||
|   } | ||||
|  | ||||
| #elif defined(riscos) | ||||
|  | ||||
|   /* Under RISC OS, name servers are listed in the | ||||
|      system variable Inet$Resolvers, space separated. */ | ||||
|  | ||||
|   line = getenv("Inet$Resolvers"); | ||||
|   status = ARES_EFILE; | ||||
|   if (line) { | ||||
|     char *resolvers = strdup(line), *pos, *space; | ||||
|  | ||||
|     if (!resolvers) | ||||
|       return ARES_ENOMEM; | ||||
|  | ||||
|     pos = resolvers; | ||||
|     do { | ||||
|       space = strchr(pos, ' '); | ||||
|       if (space) | ||||
|         *space = 0; | ||||
|       status = config_nameserver(&servers, &nservers, pos); | ||||
|       if (status != ARES_SUCCESS) | ||||
|         break; | ||||
|       pos = space + 1; | ||||
|     } while (space); | ||||
|  | ||||
|     if (status == ARES_SUCCESS) | ||||
|       status = ARES_EOF; | ||||
|      | ||||
|     free(resolvers); | ||||
|   } | ||||
|  | ||||
| #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); | ||||
|       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); | ||||
|       else if ((p = try_config(line, "nameserver")) && channel->nservers == -1) | ||||
|         status = config_nameserver(&servers, &nservers, p); | ||||
|       else if ((p = try_config(line, "sortlist")) && channel->nsort == -1) | ||||
|         status = config_sortlist(&sortlist, &nsort, p); | ||||
|       else if ((p = try_config(line, "options"))) | ||||
|         status = set_options(channel, p); | ||||
|       else | ||||
|         status = ARES_SUCCESS; | ||||
|       if (status != ARES_SUCCESS) | ||||
|         break; | ||||
|     } | ||||
|     free(line); | ||||
|     fclose(fp); | ||||
|   } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|   /* Handle errors. */ | ||||
|   if (status != ARES_EOF) | ||||
|     { | ||||
|       if (servers != NULL) free(servers); | ||||
|       if (sortlist != NULL) free(sortlist); | ||||
|       return status; | ||||
|     } | ||||
|  | ||||
|   /* If we got any name server entries, fill them in. */ | ||||
|   if (servers) | ||||
|     { | ||||
|       channel->servers = servers; | ||||
|       channel->nservers = nservers; | ||||
|     } | ||||
|  | ||||
|   /* If we got any sortlist entries, fill them in. */ | ||||
|   if (sortlist) | ||||
|     { | ||||
|       channel->sortlist = sortlist; | ||||
|       channel->nsort = nsort; | ||||
|     } | ||||
|  | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| static int init_by_defaults(ares_channel channel) | ||||
| { | ||||
|   char hostname[MAXHOSTNAMELEN + 1]; | ||||
|  | ||||
|   if (channel->flags == -1) | ||||
|     channel->flags = 0; | ||||
|   if (channel->timeout == -1) | ||||
|     channel->timeout = DEFAULT_TIMEOUT; | ||||
|   if (channel->tries == -1) | ||||
|     channel->tries = DEFAULT_TRIES; | ||||
|   if (channel->ndots == -1) | ||||
|     channel->ndots = 1; | ||||
|   if (channel->udp_port == -1) | ||||
|     channel->udp_port = htons(NAMESERVER_PORT); | ||||
|   if (channel->tcp_port == -1) | ||||
|     channel->tcp_port = htons(NAMESERVER_PORT); | ||||
|  | ||||
|   if (channel->nservers == -1) | ||||
|     { | ||||
|       /* If nobody specified servers, try a local named. */ | ||||
|       channel->servers = malloc(sizeof(struct server_state)); | ||||
|       if (!channel->servers) | ||||
| 	return ARES_ENOMEM; | ||||
|       channel->servers[0].addr.s_addr = htonl(INADDR_LOOPBACK); | ||||
|       channel->nservers = 1; | ||||
|     } | ||||
|  | ||||
|   if (channel->ndomains == -1) | ||||
|     { | ||||
|       /* Derive a default domain search list from the kernel hostname, | ||||
|        * 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; | ||||
| 	} | ||||
|       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; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   if (channel->nsort == -1) | ||||
|     { | ||||
|       channel->sortlist = NULL; | ||||
|       channel->nsort = 0; | ||||
|     } | ||||
|  | ||||
|   if (!channel->lookups) | ||||
|     { | ||||
|       channel->lookups = strdup("bf"); | ||||
|       if (!channel->lookups) | ||||
| 	return ARES_ENOMEM; | ||||
|     } | ||||
|  | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| static int config_domain(ares_channel channel, char *str) | ||||
| { | ||||
|   char *q; | ||||
|  | ||||
|   /* Set a single search domain. */ | ||||
|   q = str; | ||||
|   while (*q && !isspace((unsigned char)*q)) | ||||
|     q++; | ||||
|   *q = 0; | ||||
|   return set_search(channel, str); | ||||
| } | ||||
|  | ||||
| static int config_lookup(ares_channel channel, const char *str) | ||||
| { | ||||
|   char lookups[3], *l; | ||||
|   const char *p; | ||||
|  | ||||
|   /* Set the lookup order.  Only the first letter of each work | ||||
|    * is relevant, and it has to be "b" for DNS or "f" for the | ||||
|    * host file.  Ignore everything else. | ||||
|    */ | ||||
|   l = lookups; | ||||
|   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++; | ||||
|     } | ||||
|   *l = 0; | ||||
|   channel->lookups = strdup(lookups); | ||||
|   return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM; | ||||
| } | ||||
|  | ||||
| static int config_nameserver(struct server_state **servers, int *nservers, | ||||
| 			     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) | ||||
|     return ARES_SUCCESS; | ||||
|   newserv = realloc(*servers, (*nservers + 1) * sizeof(struct server_state)); | ||||
|   if (!newserv) | ||||
|     return ARES_ENOMEM; | ||||
|   newserv[*nservers].addr = addr; | ||||
|   *servers = newserv; | ||||
|   (*nservers)++; | ||||
| #endif | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||
| 			   const char *str) | ||||
| { | ||||
|   struct apattern pat, *newsort; | ||||
|   const char *q; | ||||
|  | ||||
|   /* Add sortlist entries. */ | ||||
|   while (*str && *str != ';') | ||||
|     { | ||||
|       q = str; | ||||
|       while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q)) | ||||
| 	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)++; | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  while (*q && *q != ';' && !isspace((unsigned char)*q)) | ||||
| 	    q++; | ||||
| 	} | ||||
|       str = q; | ||||
|       while (isspace((unsigned char)*str)) | ||||
| 	str++; | ||||
|     } | ||||
|  | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| static int set_search(ares_channel channel, const char *str) | ||||
| { | ||||
|   int n; | ||||
|   const char *p, *q; | ||||
|  | ||||
|   /* Count the domains given. */ | ||||
|   n = 0; | ||||
|   p = str; | ||||
|   while (*p) | ||||
|     { | ||||
|       while (*p && !isspace((unsigned char)*p)) | ||||
| 	p++; | ||||
|       while (isspace((unsigned char)*p)) | ||||
| 	p++; | ||||
|       n++; | ||||
|     } | ||||
|  | ||||
|   channel->domains = malloc(n * sizeof(char *)); | ||||
|   if (!channel->domains && n) | ||||
|     return ARES_ENOMEM; | ||||
|  | ||||
|   /* Now copy the domains. */ | ||||
|   n = 0; | ||||
|   p = str; | ||||
|   while (*p) | ||||
|     { | ||||
|       channel->ndomains = n; | ||||
|       q = p; | ||||
|       while (*q && !isspace((unsigned char)*q)) | ||||
| 	q++; | ||||
|       channel->domains[n] = malloc(q - p + 1); | ||||
|       if (!channel->domains[n]) | ||||
| 	return ARES_ENOMEM; | ||||
|       memcpy(channel->domains[n], p, q - p); | ||||
|       channel->domains[n][q - p] = 0; | ||||
|       p = q; | ||||
|       while (isspace((unsigned char)*p)) | ||||
| 	p++; | ||||
|       n++; | ||||
|     } | ||||
|   channel->ndomains = n; | ||||
|  | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| static int set_options(ares_channel channel, const char *str) | ||||
| { | ||||
|   const char *p, *q, *val; | ||||
|  | ||||
|   p = str; | ||||
|   while (*p) | ||||
|     { | ||||
|       q = p; | ||||
|       while (*q && !isspace((unsigned char)*q)) | ||||
| 	q++; | ||||
|       val = try_option(p, q, "ndots:"); | ||||
|       if (val && channel->ndots == -1) | ||||
| 	channel->ndots = atoi(val); | ||||
|       val = try_option(p, q, "retrans:"); | ||||
|       if (val && channel->timeout == -1) | ||||
| 	channel->timeout = atoi(val); | ||||
|       val = try_option(p, q, "retry:"); | ||||
|       if (val && channel->tries == -1) | ||||
| 	channel->tries = atoi(val); | ||||
|       p = q; | ||||
|       while (isspace((unsigned char)*p)) | ||||
| 	p++; | ||||
|     } | ||||
|  | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| static char *try_config(char *s, const char *opt) | ||||
| { | ||||
|   size_t len; | ||||
|  | ||||
|   len = strlen(opt); | ||||
|   if (strncmp(s, opt, len) != 0 || !isspace((unsigned char)s[len])) | ||||
|     return NULL; | ||||
|   s += len; | ||||
|   while (isspace((unsigned char)*s)) | ||||
|     s++; | ||||
|   return s; | ||||
| } | ||||
|  | ||||
| static const char *try_option(const char *p, const char *q, const char *opt) | ||||
| { | ||||
|   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) | ||||
| { | ||||
|   char ipbuf[16]; | ||||
|  | ||||
|   /* Four octets and three periods yields at most 15 characters. */ | ||||
|   if (len > 15) | ||||
|     return -1; | ||||
|   memcpy(ipbuf, s, len); | ||||
|   ipbuf[len] = 0; | ||||
|  | ||||
|   addr->s_addr = inet_addr(ipbuf); | ||||
|   if (addr->s_addr == INADDR_NONE && strcmp(ipbuf, "255.255.255.255") != 0) | ||||
|     return -1; | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| static void natural_mask(struct apattern *pat) | ||||
| { | ||||
|   struct in_addr addr; | ||||
|  | ||||
|   /* Store a host-byte-order copy of pat in a struct in_addr.  Icky, | ||||
|    * but portable. | ||||
|    */ | ||||
|   addr.s_addr = ntohl(pat->addr.s_addr); | ||||
|  | ||||
|   /* This is out of date in the CIDR world, but some people might | ||||
|    * still rely on it. | ||||
|    */ | ||||
|   if (IN_CLASSA(addr.s_addr)) | ||||
|     pat->mask.s_addr = htonl(IN_CLASSA_NET); | ||||
|   else if (IN_CLASSB(addr.s_addr)) | ||||
|     pat->mask.s_addr = htonl(IN_CLASSB_NET); | ||||
|   else | ||||
|     pat->mask.s_addr = htonl(IN_CLASSC_NET); | ||||
| } | ||||
							
								
								
									
										2
									
								
								ares/ares_init_options.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								ares/ares_init_options.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| .so man3/ares_init.3 | ||||
| .\" $Id$ | ||||
							
								
								
									
										79
									
								
								ares/ares_mkquery.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								ares/ares_mkquery.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .\" Copyright 1998, 2000 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_MKQUERY 3 "4 January 2000" | ||||
| .SH NAME | ||||
| ares_mkquery \- Compose a single-question DNS query buffer | ||||
| .SH SYNOPSIS | ||||
| .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) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_mkquery | ||||
| function composes a DNS query with a single question. | ||||
| The parameter | ||||
| .I name | ||||
| gives the query name as a NUL-terminated C string of period-separated | ||||
| labels optionally ending with a period; periods and backslashes within | ||||
| a label must be escaped with a backlash.  The parameters | ||||
| .I dnsclass | ||||
| and | ||||
| .I type | ||||
| give the class and type of the query using the values defined in | ||||
| .BR <arpa/nameser.h> . | ||||
| The parameter | ||||
| .I id | ||||
| gives a 16-bit identifier for the query.  The parameter | ||||
| .I rd | ||||
| should be nonzero if recursion is desired, zero if not.  The query | ||||
| will be placed in an allocated buffer, a pointer to which will be | ||||
| stored in the variable pointed to by | ||||
| .IR buf , | ||||
| 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. | ||||
| .SH RETURN VALUES | ||||
| .B ares_mkquery | ||||
| can return any of the following values: | ||||
| .TP 15 | ||||
| .B ARES_SUCCESS | ||||
| Construction of the DNS query succeeded. | ||||
| .TP 15 | ||||
| .B ARES_EBADNAME | ||||
| The query name | ||||
| .I name | ||||
| could not be encoded as a domain name, either because it contained a | ||||
| zero-length label or because it contained a label of more than 63 | ||||
| characters. | ||||
| .TP 15 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .SH SEE ALSO | ||||
| .BR ares_expand_name (3), | ||||
| .BR ares_free_string (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998, 2000 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										159
									
								
								ares/ares_mkquery.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								ares/ares_mkquery.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,159 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
|  | ||||
| /* Header format, from RFC 1035: | ||||
|  *                                  1  1  1  1  1  1 | ||||
|  *    0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5 | ||||
|  *  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ||||
|  *  |                      ID                       | | ||||
|  *  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ||||
|  *  |QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   | | ||||
|  *  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ||||
|  *  |                    QDCOUNT                    | | ||||
|  *  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ||||
|  *  |                    ANCOUNT                    | | ||||
|  *  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ||||
|  *  |                    NSCOUNT                    | | ||||
|  *  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ||||
|  *  |                    ARCOUNT                    | | ||||
|  *  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ||||
|  * | ||||
|  * 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 | ||||
|  * | ||||
|  * Question format, from RFC 1035: | ||||
|  *                                  1  1  1  1  1  1 | ||||
|  *    0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5 | ||||
|  *  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ||||
|  *  |                                               | | ||||
|  *  /                     QNAME                     / | ||||
|  *  /                                               / | ||||
|  *  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ||||
|  *  |                     QTYPE                     | | ||||
|  *  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ||||
|  *  |                     QCLASS                    | | ||||
|  *  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ||||
|  * | ||||
|  * The query name is encoded as a series of labels, each represented | ||||
|  * as a one-byte length (maximum 63) followed by the text of the | ||||
|  * label.  The list is terminated by a label of length zero (which can | ||||
|  * be thought of as the root domain). | ||||
|  */ | ||||
|  | ||||
| int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id, | ||||
| 		 int rd, unsigned char **buf, int *buflen) | ||||
| { | ||||
|   int len; | ||||
|   unsigned char *q; | ||||
|   const char *p; | ||||
|  | ||||
|   /* Compute the length of the encoded name so we can check buflen. | ||||
|    * Start counting at 1 for the zero-length label at the end. */ | ||||
|   len = 1; | ||||
|   for (p = name; *p; p++) | ||||
|     { | ||||
|       if (*p == '\\' && *(p + 1) != 0) | ||||
| 	p++; | ||||
|       len++; | ||||
|     } | ||||
|   /* If there are n periods in the name, there are n + 1 labels, and | ||||
|    * thus n + 1 length fields, unless the name is empty or ends with a | ||||
|    * period.  So add 1 unless name is empty or ends with a period. | ||||
|    */ | ||||
|   if (*name && *(p - 1) != '.') | ||||
|     len++; | ||||
|  | ||||
|   *buflen = len + HFIXEDSZ + QFIXEDSZ; | ||||
|   *buf = malloc(*buflen); | ||||
|   if (!*buf) | ||||
|       return ARES_ENOMEM; | ||||
|  | ||||
|   /* Set up the header. */ | ||||
|   q = *buf; | ||||
|   memset(q, 0, HFIXEDSZ); | ||||
|   DNS_HEADER_SET_QID(q, id); | ||||
|   DNS_HEADER_SET_OPCODE(q, QUERY); | ||||
|   DNS_HEADER_SET_RD(q, (rd) ? 1 : 0); | ||||
|   DNS_HEADER_SET_QDCOUNT(q, 1); | ||||
|  | ||||
|   /* A name of "." is a screw case for the loop below, so adjust it. */ | ||||
|   if (strcmp(name, ".") == 0) | ||||
|     name++; | ||||
|  | ||||
|   /* Start writing out the name after the header. */ | ||||
|   q += HFIXEDSZ; | ||||
|   while (*name) | ||||
|     { | ||||
|       if (*name == '.') | ||||
| 	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 (len > MAXLABEL) | ||||
| 	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; | ||||
| 	} | ||||
|  | ||||
|       /* Go to the next label and repeat, unless we hit the end. */ | ||||
|       if (!*p) | ||||
| 	break; | ||||
|       name = p + 1; | ||||
|     } | ||||
|  | ||||
|   /* Add the zero-length label at the end. */ | ||||
|   *q++ = 0; | ||||
|  | ||||
|   /* Finish off the question with the type and class. */ | ||||
|   DNS_QUESTION_SET_TYPE(q, type); | ||||
|   DNS_QUESTION_SET_CLASS(q, dnsclass); | ||||
|  | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
							
								
								
									
										65
									
								
								ares/ares_parse_a_reply.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								ares/ares_parse_a_reply.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| .\" $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_PARSE_A_REPLY 3 "25 July 1998" | ||||
| .SH NAME | ||||
| ares_parse_a_reply \- Parse a reply to a DNS query of type A into a hostent | ||||
| .SH SYNOPSIS | ||||
| .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); | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_parse_a_reply | ||||
| function parses the response to a query of type A into a | ||||
| .BR "struct hostent" . | ||||
| The parameters | ||||
| .I abuf | ||||
| and | ||||
| .I alen | ||||
| give the contents of the response.  The result is stored in allocated | ||||
| memory and a pointer to it stored into the variable pointed to by | ||||
| .IR host . | ||||
| It is the caller's responsibility to free the resulting host structure | ||||
| using | ||||
| .BR ares_free_hostent (3) | ||||
| when it is no longer needed. | ||||
| .SH RETURN VALUES | ||||
| .B ares_parse_a_reply | ||||
| can return any of the following values: | ||||
| .TP 15 | ||||
| .B ARES_SUCCESS | ||||
| The response was successfully parsed. | ||||
| .TP 15 | ||||
| .B ARES_EBADRESP | ||||
| The response was malformatted. | ||||
| .TP 15 | ||||
| .B ARES_ENODATA | ||||
| The response did not contain an answer to the query. | ||||
| .TP 15 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .SH SEE ALSO | ||||
| .BR ares_gethostbyname (3), | ||||
| .BR ares_free_hostent (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										172
									
								
								ares/ares_parse_a_reply.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								ares/ares_parse_a_reply.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,172 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| int ares_parse_a_reply(const unsigned char *abuf, int alen, | ||||
| 		       struct hostent **host) | ||||
| { | ||||
|   unsigned int qdcount, ancount; | ||||
|   int status, i, rr_type, rr_class, rr_len, naddrs; | ||||
|   int naliases; | ||||
|   long len; | ||||
|   const unsigned char *aptr; | ||||
|   char *hostname, *rr_name, *rr_data, **aliases; | ||||
|   struct in_addr *addrs; | ||||
|   struct hostent *hostent; | ||||
|  | ||||
|   /* Set *host to NULL for all failure cases. */ | ||||
|   *host = NULL; | ||||
|  | ||||
|   /* Give up if abuf doesn't have room for a header. */ | ||||
|   if (alen < HFIXEDSZ) | ||||
|     return ARES_EBADRESP; | ||||
|  | ||||
|   /* Fetch the question and answer count from the header. */ | ||||
|   qdcount = DNS_HEADER_QDCOUNT(abuf); | ||||
|   ancount = DNS_HEADER_ANCOUNT(abuf); | ||||
|   if (qdcount != 1) | ||||
|     return ARES_EBADRESP; | ||||
|  | ||||
|   /* Expand the name from the question, and skip past the question. */ | ||||
|   aptr = abuf + HFIXEDSZ; | ||||
|   status = ares_expand_name(aptr, abuf, alen, &hostname, &len); | ||||
|   if (status != ARES_SUCCESS) | ||||
|     return status; | ||||
|   if (aptr + len + QFIXEDSZ > abuf + alen) | ||||
|     { | ||||
|       free(hostname); | ||||
|       return ARES_EBADRESP; | ||||
|     } | ||||
|   aptr += len + QFIXEDSZ; | ||||
|  | ||||
|   /* Allocate addresses and aliases; ancount gives an upper bound for both. */ | ||||
|   addrs = malloc(ancount * sizeof(struct in_addr)); | ||||
|   if (!addrs) | ||||
|     { | ||||
|       free(hostname); | ||||
|       return ARES_ENOMEM; | ||||
|     } | ||||
|   aliases = malloc((ancount + 1) * sizeof(char *)); | ||||
|   if (!aliases) | ||||
|     { | ||||
|       free(hostname); | ||||
|       free(addrs); | ||||
|       return ARES_ENOMEM; | ||||
|     } | ||||
|   naddrs = 0; | ||||
|   naliases = 0; | ||||
|  | ||||
|   /* Examine each answer resource record (RR) in turn. */ | ||||
|   for (i = 0; i < (int)ancount; i++) | ||||
|     { | ||||
|       /* Decode the RR up to the data field. */ | ||||
|       status = ares_expand_name(aptr, abuf, alen, &rr_name, &len); | ||||
|       if (status != ARES_SUCCESS) | ||||
| 	break; | ||||
|       aptr += len; | ||||
|       if (aptr + RRFIXEDSZ > abuf + alen) | ||||
| 	{ | ||||
| 	  status = ARES_EBADRESP; | ||||
| 	  break; | ||||
| 	} | ||||
|       rr_type = DNS_RR_TYPE(aptr); | ||||
|       rr_class = DNS_RR_CLASS(aptr); | ||||
|       rr_len = DNS_RR_LEN(aptr); | ||||
|       aptr += RRFIXEDSZ; | ||||
|  | ||||
|       if (rr_class == C_IN && rr_type == T_A | ||||
| 	  && 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++; | ||||
|  | ||||
| 	  /* Decode the RR data and replace the hostname with it. */ | ||||
| 	  status = ares_expand_name(aptr, abuf, alen, &rr_data, &len); | ||||
| 	  if (status != ARES_SUCCESS) | ||||
| 	    break; | ||||
| 	  free(hostname); | ||||
| 	  hostname = rr_data; | ||||
| 	} | ||||
|       else | ||||
| 	free(rr_name); | ||||
|  | ||||
|       aptr += rr_len; | ||||
|       if (aptr > abuf + alen) | ||||
| 	{ | ||||
| 	  status = ARES_EBADRESP; | ||||
| 	  break; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   if (status == ARES_SUCCESS && naddrs == 0) | ||||
|     status = ARES_ENODATA; | ||||
|   if (status == ARES_SUCCESS) | ||||
|     { | ||||
|       /* We got our answer.  Allocate memory to build the host entry. */ | ||||
|       aliases[naliases] = NULL; | ||||
|       hostent = malloc(sizeof(struct hostent)); | ||||
|       if (hostent) | ||||
| 	{ | ||||
| 	  hostent->h_addr_list = malloc((naddrs + 1) * sizeof(char *)); | ||||
| 	  if (hostent->h_addr_list) | ||||
| 	    { | ||||
| 	      /* Fill in the hostent and return successfully. */ | ||||
| 	      hostent->h_name = hostname; | ||||
| 	      hostent->h_aliases = aliases; | ||||
| 	      hostent->h_addrtype = AF_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++) | ||||
|     free(aliases[i]); | ||||
|   free(aliases); | ||||
|   free(addrs); | ||||
|   free(hostname); | ||||
|   return status; | ||||
| } | ||||
							
								
								
									
										77
									
								
								ares/ares_parse_ptr_reply.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								ares/ares_parse_ptr_reply.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| .\" $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_PARSE_PTR_REPLY 3 "25 July 1998" | ||||
| .SH NAME | ||||
| ares_parse_ptr_reply \- Parse a reply to a DNS query of type PTR into a hostent | ||||
| .SH SYNOPSIS | ||||
| .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); | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_parse_ptr_reply | ||||
| function parses the response to a query of type PTR into a | ||||
| .BR "struct hostent" . | ||||
| The parameters | ||||
| .I abuf | ||||
| and | ||||
| .I alen | ||||
| give the contents of the response.  The parameters | ||||
| .IR addr , | ||||
| .IR addrlen , | ||||
| and | ||||
| .I family | ||||
| specify which address was queried for; they are not used to verify the | ||||
| response, merely used to fill in the address of the | ||||
| .BR "struct hostent" . | ||||
| The resulting | ||||
| .B struct hostent | ||||
| is stored in allocated memory and a pointer to it stored into the | ||||
| variable pointed to by | ||||
| .IR host . | ||||
| It is the caller's responsibility to free the resulting host structure | ||||
| using | ||||
| .BR ares_free_hostent (3) | ||||
| when it is no longer needed. | ||||
| .SH RETURN VALUES | ||||
| .B ares_parse_ptr_reply | ||||
| can return any of the following values: | ||||
| .TP 15 | ||||
| .B ARES_SUCCESS | ||||
| The response was successfully parsed. | ||||
| .TP 15 | ||||
| .B ARES_EBADRESP | ||||
| The response was malformatted. | ||||
| .TP 15 | ||||
| .B ARES_ENODATA | ||||
| The response did not contain an answer to the query. | ||||
| .TP 15 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .SH SEE ALSO | ||||
| .BR ares_gethostbyaddr (3), | ||||
| .BR ares_free_hostent (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										158
									
								
								ares/ares_parse_ptr_reply.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								ares/ares_parse_ptr_reply.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
| #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) | ||||
| { | ||||
|   unsigned int qdcount, ancount; | ||||
|   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; | ||||
|  | ||||
|   /* Set *host to NULL for all failure cases. */ | ||||
|   *host = NULL; | ||||
|  | ||||
|   /* Give up if abuf doesn't have room for a header. */ | ||||
|   if (alen < HFIXEDSZ) | ||||
|     return ARES_EBADRESP; | ||||
|  | ||||
|   /* Fetch the question and answer count from the header. */ | ||||
|   qdcount = DNS_HEADER_QDCOUNT(abuf); | ||||
|   ancount = DNS_HEADER_ANCOUNT(abuf); | ||||
|   if (qdcount != 1) | ||||
|     return ARES_EBADRESP; | ||||
|  | ||||
|   /* Expand the name from the question, and skip past the question. */ | ||||
|   aptr = abuf + HFIXEDSZ; | ||||
|   status = ares_expand_name(aptr, abuf, alen, &ptrname, &len); | ||||
|   if (status != ARES_SUCCESS) | ||||
|     return status; | ||||
|   if (aptr + len + QFIXEDSZ > abuf + alen) | ||||
|     { | ||||
|       free(ptrname); | ||||
|       return ARES_EBADRESP; | ||||
|     } | ||||
|   aptr += len + QFIXEDSZ; | ||||
|  | ||||
|   /* Examine each answer resource record (RR) in turn. */ | ||||
|   hostname = NULL; | ||||
|   for (i = 0; i < (int)ancount; i++) | ||||
|     { | ||||
|       /* Decode the RR up to the data field. */ | ||||
|       status = ares_expand_name(aptr, abuf, alen, &rr_name, &len); | ||||
|       if (status != ARES_SUCCESS) | ||||
| 	break; | ||||
|       aptr += len; | ||||
|       if (aptr + RRFIXEDSZ > abuf + alen) | ||||
| 	{ | ||||
| 	  status = ARES_EBADRESP; | ||||
| 	  break; | ||||
| 	} | ||||
|       rr_type = DNS_RR_TYPE(aptr); | ||||
|       rr_class = DNS_RR_CLASS(aptr); | ||||
|       rr_len = DNS_RR_LEN(aptr); | ||||
|       aptr += RRFIXEDSZ; | ||||
|  | ||||
|       if (rr_class == C_IN && rr_type == T_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; | ||||
| 	} | ||||
|  | ||||
|       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; | ||||
| 	} | ||||
|  | ||||
|       free(rr_name); | ||||
|       aptr += rr_len; | ||||
|       if (aptr > abuf + alen) | ||||
| 	{ | ||||
| 	  status = ARES_EBADRESP; | ||||
| 	  break; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   if (status == ARES_SUCCESS && !hostname) | ||||
|     status = ARES_ENODATA; | ||||
|   if (status == ARES_SUCCESS) | ||||
|     { | ||||
|       /* 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); | ||||
| 	} | ||||
|       status = ARES_ENOMEM; | ||||
|     } | ||||
|   if (hostname) | ||||
|     free(hostname); | ||||
|   free(ptrname); | ||||
|   return status; | ||||
| } | ||||
							
								
								
									
										153
									
								
								ares/ares_private.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								ares/ares_private.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,153 @@ | ||||
| /* $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. | ||||
|  */ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
|  | ||||
| #else | ||||
| #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 | ||||
| #endif | ||||
|  | ||||
| #ifdef WIN32 | ||||
|  | ||||
| #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" | ||||
|            | ||||
| #else | ||||
|  | ||||
| #define PATH_RESOLV_CONF	"/etc/resolv.conf" | ||||
| #ifdef ETC_INET | ||||
| #define PATH_HOSTS		"/etc/inet/hosts" | ||||
| #else | ||||
| #define PATH_HOSTS		"/etc/hosts" | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| struct send_request { | ||||
|   /* Remaining data to send */ | ||||
|   const unsigned char *data; | ||||
|   size_t len; | ||||
|  | ||||
|   /* Next request in queue */ | ||||
|   struct send_request *next; | ||||
| }; | ||||
|  | ||||
| struct server_state { | ||||
|   struct in_addr addr; | ||||
|   int udp_socket; | ||||
|   int tcp_socket; | ||||
|  | ||||
|   /* Mini-buffer for reading the length word */ | ||||
|   unsigned char tcp_lenbuf[2]; | ||||
|   int tcp_lenbuf_pos; | ||||
|   int tcp_length; | ||||
|  | ||||
|   /* Buffer for reading actual TCP data */ | ||||
|   unsigned char *tcp_buffer; | ||||
|   int tcp_buffer_pos; | ||||
|  | ||||
|   /* TCP output queue */ | ||||
|   struct send_request *qhead; | ||||
|   struct send_request *qtail; | ||||
| }; | ||||
|  | ||||
| struct query { | ||||
|   /* Query ID from qbuf, for faster lookup, and current timeout */ | ||||
|   unsigned short qid; | ||||
|   time_t timeout; | ||||
|  | ||||
|   /* Query buf with length at beginning, for TCP transmission */ | ||||
|   unsigned char *tcpbuf; | ||||
|   int tcplen; | ||||
|  | ||||
|   /* Arguments passed to ares_send() (qbuf points into tcpbuf) */ | ||||
|   const unsigned char *qbuf; | ||||
|   int qlen; | ||||
|   ares_callback callback; | ||||
|   void *arg; | ||||
|  | ||||
|   /* Query status */ | ||||
|   int try; | ||||
|   int server; | ||||
|   int *skip_server; | ||||
|   int using_tcp; | ||||
|   int error_status; | ||||
|  | ||||
|   /* Next query in chain */ | ||||
|   struct query *next; | ||||
| }; | ||||
|  | ||||
| /* An IP address pattern; matches an IP address X if X & mask == addr */ | ||||
| struct apattern { | ||||
|   struct in_addr addr; | ||||
|   struct in_addr mask; | ||||
| }; | ||||
|  | ||||
| struct ares_channeldata { | ||||
|   /* Configuration data */ | ||||
|   int flags; | ||||
|   int timeout; | ||||
|   int tries; | ||||
|   int ndots; | ||||
|   int udp_port; | ||||
|   int tcp_port; | ||||
|   char **domains; | ||||
|   int ndomains; | ||||
|   struct apattern *sortlist; | ||||
|   int nsort; | ||||
|   char *lookups; | ||||
|  | ||||
|   /* Server addresses and communications state */ | ||||
|   struct server_state *servers; | ||||
|   int nservers; | ||||
|  | ||||
|   /* ID to use for next query */ | ||||
|   unsigned short next_id; | ||||
|  | ||||
|   /* Active queries */ | ||||
|   struct query *queries; | ||||
| }; | ||||
|  | ||||
| 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 | ||||
							
								
								
									
										79
									
								
								ares/ares_process.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								ares/ares_process.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| .\" $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_PROCESS 3 "25 July 1998" | ||||
| .SH NAME | ||||
| ares_process \- Process events for name resolution | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B void ares_process(ares_channel \fIchannel\fP, fd_set *\fIread_fds\fP, | ||||
| .B	fd_set *\fIwrite_fds\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_process | ||||
| function handles input/output events and timeouts associated with | ||||
| queries pending on the name service channel identified by | ||||
| .IR channel . | ||||
| The file descriptor sets pointed to by | ||||
| .I read_fds | ||||
| 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 | ||||
| .B select | ||||
| with a timeout no greater than the timeout given by | ||||
| .BR ares_timeout (3)). | ||||
| .PP | ||||
| The | ||||
| .B ares_process | ||||
| function will invoke callbacks for pending queries if they complete | ||||
| successfully or fail. | ||||
| .SS EXAMPLE | ||||
| The following code fragment waits for all pending queries on a channel | ||||
| to complete: | ||||
| .PP | ||||
| .RS | ||||
| .nf | ||||
| int nfds, count; | ||||
| fd_set readers, writers; | ||||
| struct timeval tv, *tvp; | ||||
|  | ||||
| while (1) | ||||
|   { | ||||
|     FD_ZERO(&readers); | ||||
|     FD_ZERO(&writers); | ||||
|     nfds = ares_fds(channel, &readers, &writers); | ||||
|     if (nfds == 0) | ||||
|       break; | ||||
|     tvp = ares_timeout(channel, NULL, &tv); | ||||
|     count = select(nfds, &readers, &writers, NULL, tvp); | ||||
|     ares_process(channel, &readers, &writers); | ||||
|   } | ||||
| .fi | ||||
| .RE | ||||
| .SH SEE ALSO | ||||
| .BR ares_fds (3), | ||||
| .BR ares_timeout (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										625
									
								
								ares/ares_process.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										625
									
								
								ares/ares_process.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,625 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <sys/socket.h> | ||||
| #include <sys/uio.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #include <unistd.h> | ||||
| #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" | ||||
|  | ||||
| static void write_tcp_data(ares_channel channel, fd_set *write_fds, | ||||
| 			   time_t now); | ||||
| static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now); | ||||
| static void read_udp_packets(ares_channel channel, fd_set *read_fds, | ||||
| 			     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); | ||||
| 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 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); | ||||
|  | ||||
| /* Something interesting happened on the wire, or there was a timeout. | ||||
|  * See what's up and respond accordingly. | ||||
|  */ | ||||
| void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds) | ||||
| { | ||||
|   time_t now; | ||||
|  | ||||
|   time(&now); | ||||
|   write_tcp_data(channel, write_fds, now); | ||||
|   read_tcp_data(channel, read_fds, now); | ||||
|   read_udp_packets(channel, read_fds, now); | ||||
|   process_timeouts(channel, now); | ||||
| } | ||||
|  | ||||
| /* If any TCP sockets select true for writing, write out queued data | ||||
|  * we have for them. | ||||
|  */ | ||||
| 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; | ||||
|  | ||||
|   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; | ||||
|  | ||||
|       /* Count the number of send queue items. */ | ||||
|       n = 0; | ||||
|       for (sendreq = server->qhead; sendreq; sendreq = sendreq->next) | ||||
| 	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; | ||||
| 	    } | ||||
|  | ||||
| 	  /* Advance the send queue by as many bytes as we sent. */ | ||||
| 	  while (count) | ||||
| 	    { | ||||
| 	      sendreq = server->qhead; | ||||
| 	      if ((size_t)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 | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  /* Can't allocate iovecs; just send the first request. */ | ||||
| 	  sendreq = server->qhead; | ||||
|  | ||||
|           count = send(server->tcp_socket, sendreq->data, sendreq->len, 0); | ||||
|  | ||||
| 	  if (count < 0) | ||||
| 	    { | ||||
| 	      handle_error(channel, i, now); | ||||
| 	      continue; | ||||
| 	    } | ||||
|  | ||||
| 	  /* Advance the send queue by as many bytes as we sent. */ | ||||
| 	  if ((size_t)count == sendreq->len) | ||||
| 	    { | ||||
| 	      server->qhead = sendreq->next; | ||||
| 	      if (server->qhead == NULL) | ||||
| 		server->qtail = NULL; | ||||
| 	      free(sendreq); | ||||
| 	    } | ||||
| 	  else | ||||
| 	    { | ||||
| 	      sendreq->data += count; | ||||
| 	      sendreq->len -= count; | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* If any TCP socket selects true for reading, read some data, | ||||
|  * allocate a buffer if we finish reading the length word, and process | ||||
|  * a packet if we finish reading one. | ||||
|  */ | ||||
| static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now) | ||||
| { | ||||
|   struct server_state *server; | ||||
|   int i, count; | ||||
|  | ||||
|   for (i = 0; i < channel->nservers; i++) | ||||
|     { | ||||
|       /* 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_lenbuf_pos != 2) | ||||
| 	{ | ||||
| 	  /* 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; | ||||
| 	    } | ||||
|  | ||||
| 	  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; | ||||
| 	    } | ||||
| 	} | ||||
|       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; | ||||
| 	    } | ||||
|  | ||||
| 	  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; | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* 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) | ||||
| { | ||||
|   struct server_state *server; | ||||
|   int i, count; | ||||
|   unsigned char buf[PACKETSZ + 1]; | ||||
|  | ||||
|   for (i = 0; i < channel->nservers; i++) | ||||
|     { | ||||
|       /* 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; | ||||
|  | ||||
|       count = recv(server->udp_socket, buf, sizeof(buf), 0); | ||||
|       if (count <= 0) | ||||
| 	handle_error(channel, i, now); | ||||
|  | ||||
|       process_answer(channel, buf, count, i, 0, now); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* If any queries have timed out, note the timeout and move them on. */ | ||||
| static void process_timeouts(ares_channel channel, time_t now) | ||||
| { | ||||
|   struct query *query, *next; | ||||
|  | ||||
|   for (query = channel->queries; query; query = next) | ||||
|     { | ||||
|       next = query->next; | ||||
|       if (query->timeout != 0 && now >= query->timeout) | ||||
| 	{ | ||||
| 	  query->error_status = ARES_ETIMEOUT; | ||||
| 	  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 id, tc, rcode; | ||||
|   struct query *query; | ||||
|  | ||||
|   /* If there's no room in the answer for a header, we can't do much | ||||
|    * with it. */ | ||||
|   if (alen < HFIXEDSZ) | ||||
|     return; | ||||
|  | ||||
|   /* Grab the query ID, truncate bit, and response code from the packet. */ | ||||
|   id = DNS_HEADER_QID(abuf); | ||||
|   tc = DNS_HEADER_TC(abuf); | ||||
|   rcode = DNS_HEADER_RCODE(abuf); | ||||
|  | ||||
|   /* Find the query corresponding to this packet. */ | ||||
|   for (query = channel->queries; query; query = query->next) | ||||
|     { | ||||
|       if (query->qid == id) | ||||
| 	break; | ||||
|     } | ||||
|   if (!query) | ||||
|     return; | ||||
|  | ||||
|   /* If we got a truncated UDP packet and are not ignoring truncation, | ||||
|    * don't accept the packet, and switch the query to TCP if we hadn't | ||||
|    * done so already. | ||||
|    */ | ||||
|   if ((tc || alen > PACKETSZ) && !tcp && !(channel->flags & ARES_FLAG_IGNTC)) | ||||
|     { | ||||
|       if (!query->using_tcp) | ||||
| 	{ | ||||
| 	  query->using_tcp = 1; | ||||
| 	  ares__send_query(channel, query, now); | ||||
| 	} | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   /* Limit alen to PACKETSZ if we aren't using TCP (only relevant if we | ||||
|    * are ignoring truncation. | ||||
|    */ | ||||
|   if (alen > PACKETSZ && !tcp) | ||||
|     alen = PACKETSZ; | ||||
|  | ||||
|   /* If we aren't passing through all error packets, discard packets | ||||
|    * with SERVFAIL, NOTIMP, or REFUSED response codes. | ||||
|    */ | ||||
|   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; | ||||
| 	} | ||||
|       if (!same_questions(query->qbuf, query->qlen, abuf, alen)) | ||||
| 	{ | ||||
| 	  if (query->server == whichserver) | ||||
| 	    next_server(channel, query, now); | ||||
| 	  return; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   end_query(channel, query, ARES_SUCCESS, abuf, alen); | ||||
| } | ||||
|  | ||||
| static void handle_error(ares_channel channel, int whichserver, time_t now) | ||||
| { | ||||
|   struct query *query; | ||||
|  | ||||
|   /* Reset communications with this server. */ | ||||
|   ares__close_sockets(&channel->servers[whichserver]); | ||||
|  | ||||
|   /* Tell all queries talking to this server to move on and not try | ||||
|    * this server again. | ||||
|    */ | ||||
|   for (query = channel->queries; query; query = query->next) | ||||
|     { | ||||
|       if (query->server == whichserver) | ||||
| 	{ | ||||
| 	  query->skip_server[whichserver] = 1; | ||||
| 	  next_server(channel, query, now); | ||||
| 	} | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void 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; | ||||
| 	    } | ||||
| 	} | ||||
|       query->server = 0; | ||||
|  | ||||
|       /* Only one try if we're using TCP. */ | ||||
|       if (query->using_tcp) | ||||
| 	break; | ||||
|     } | ||||
|   end_query(channel, query, query->error_status, NULL, 0); | ||||
| } | ||||
|  | ||||
| void ares__send_query(ares_channel channel, struct query *query, time_t now) | ||||
| { | ||||
|   struct send_request *sendreq; | ||||
|   struct server_state *server; | ||||
|  | ||||
|   server = &channel->servers[query->server]; | ||||
|   if (query->using_tcp) | ||||
|     { | ||||
|       /* 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 (!sendreq) | ||||
| 	end_query(channel, query, ARES_ENOMEM, NULL, 0); | ||||
|       sendreq->data = query->tcpbuf; | ||||
|       sendreq->len = query->tcplen; | ||||
|       sendreq->next = NULL; | ||||
|       if (server->qtail) | ||||
| 	server->qtail->next = sendreq; | ||||
|       else | ||||
| 	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 (send(server->udp_socket, query->qbuf, query->qlen, 0) == -1) | ||||
| 	{ | ||||
| 	  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); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static int open_tcp_socket(ares_channel channel, struct server_state *server) | ||||
| { | ||||
|   int s, flags; | ||||
|   struct sockaddr_in sockin; | ||||
|  | ||||
|   /* Acquire a socket. */ | ||||
|   s = socket(AF_INET, SOCK_STREAM, 0); | ||||
|   if (s == -1) | ||||
|     return -1; | ||||
|  | ||||
|   /* Set the socket non-blocking. */ | ||||
|  | ||||
| #ifdef WIN32 | ||||
|   flags = 1; | ||||
|   ioctlsocket(s, FIONBIO, &flags); | ||||
| #else | ||||
|   flags = fcntl(s, F_GETFL, 0); | ||||
|  | ||||
|   if (flags == -1) | ||||
|     { | ||||
|       close(s); | ||||
|       return -1; | ||||
|     } | ||||
|   flags |= O_NONBLOCK; | ||||
|   if (fcntl(s, F_SETFL, flags) == -1) | ||||
|     { | ||||
|       close(s); | ||||
|       return -1; | ||||
|     } | ||||
| #endif | ||||
|    | ||||
|   /* Connect to the server. */ | ||||
|   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 | ||||
|       && errno != EINPROGRESS) | ||||
|     { | ||||
|       closesocket(s); | ||||
|       return -1; | ||||
|     } | ||||
|  | ||||
|   server->tcp_socket = s; | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| static int open_udp_socket(ares_channel channel, struct server_state *server) | ||||
| { | ||||
|   int s; | ||||
|   struct sockaddr_in sockin; | ||||
|  | ||||
|   /* Acquire a socket. */ | ||||
|   s = socket(AF_INET, SOCK_DGRAM, 0); | ||||
|   if (s == -1) | ||||
|     return -1; | ||||
|  | ||||
|   /* Connect to the server. */ | ||||
|   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; | ||||
|     } | ||||
|  | ||||
|   server->udp_socket = s; | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| static int same_questions(const unsigned char *qbuf, int qlen, | ||||
| 			  const unsigned char *abuf, int alen) | ||||
| { | ||||
|   struct { | ||||
|     const unsigned char *p; | ||||
|     int qdcount; | ||||
|     char *name; | ||||
|     long namelen; | ||||
|     int type; | ||||
|     int dnsclass; | ||||
|   } q, a; | ||||
|   int i, j; | ||||
|  | ||||
|   if (qlen < HFIXEDSZ || alen < HFIXEDSZ) | ||||
|     return 0; | ||||
|  | ||||
|   /* Extract qdcount from the request and reply buffers and compare them. */ | ||||
|   q.qdcount = DNS_HEADER_QDCOUNT(qbuf); | ||||
|   a.qdcount = DNS_HEADER_QDCOUNT(abuf); | ||||
|   if (q.qdcount != a.qdcount) | ||||
|     return 0; | ||||
|  | ||||
|   /* For each question in qbuf, find it in abuf. */ | ||||
|   q.p = qbuf + HFIXEDSZ; | ||||
|   for (i = 0; i < q.qdcount; i++) | ||||
|     { | ||||
|       /* Decode the question in the query. */ | ||||
|       if (ares_expand_name(q.p, qbuf, qlen, &q.name, &q.namelen) | ||||
| 	  != ARES_SUCCESS) | ||||
| 	return 0; | ||||
|       q.p += q.namelen; | ||||
|       if (q.p + QFIXEDSZ > qbuf + qlen) | ||||
| 	{ | ||||
| 	  free(q.name); | ||||
| 	  return 0; | ||||
| 	} | ||||
|       q.type = DNS_QUESTION_TYPE(q.p); | ||||
|       q.dnsclass = DNS_QUESTION_CLASS(q.p); | ||||
|       q.p += QFIXEDSZ; | ||||
|  | ||||
|       /* 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; | ||||
|  | ||||
| 	  /* 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 1; | ||||
| } | ||||
|  | ||||
| static void end_query(ares_channel channel, struct query *query, int status, | ||||
| 		      unsigned char *abuf, int alen) | ||||
| { | ||||
|   struct query **q; | ||||
|   int i; | ||||
|  | ||||
|   query->callback(query->arg, status, abuf, alen); | ||||
|   for (q = &channel->queries; *q; q = &(*q)->next) | ||||
|     { | ||||
|       if (*q == query) | ||||
| 	break; | ||||
|     } | ||||
|   *q = query->next; | ||||
|   free(query->tcpbuf); | ||||
|   free(query->skip_server); | ||||
|   free(query); | ||||
|  | ||||
|   /* Simple cleanup policy: if no queries are remaining, close all | ||||
|    * network sockets unless STAYOPEN is set. | ||||
|    */ | ||||
|   if (!channel->queries && !(channel->flags & ARES_FLAG_STAYOPEN)) | ||||
|     { | ||||
|       for (i = 0; i < channel->nservers; i++) | ||||
| 	ares__close_sockets(&channel->servers[i]); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										142
									
								
								ares/ares_query.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								ares/ares_query.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
| .\" $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_QUERY 3 "24 July 1998" | ||||
| .SH NAME | ||||
| ares_query \- Initiate a single-question DNS query | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, | ||||
| .B	unsigned char *\fIabuf\fP, int \fIalen\fP) | ||||
| .PP | ||||
| .B void ares_query(ares_channel \fIchannel\fP, const char *\fIname\fP, | ||||
| .B 	int \fIdnsclass\fP, int \fItype\fP, ares_callback \fIcallback\fP, | ||||
| .B	void *\fIarg\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_query | ||||
| function initiates a single-question DNS query on the name service | ||||
| channel identified by | ||||
| .IR channel . | ||||
| The parameter | ||||
| .I name | ||||
| gives the query name as a NUL-terminated C string of period-separated | ||||
| labels optionally ending with a period; periods and backslashes within | ||||
| a label must be escaped with a backslash.  The parameters | ||||
| .I dnsclass | ||||
| and | ||||
| .I type | ||||
| give the class and type of the query using the values defined in | ||||
| .BR <arpa/nameser.h> . | ||||
| 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). | ||||
| .PP | ||||
| The callback argument | ||||
| .I arg | ||||
| is copied from the | ||||
| .B ares_query | ||||
| argument | ||||
| .IR arg . | ||||
| The callback argument | ||||
| .I status | ||||
| indicates whether the query succeeded and, if not, how it failed.  It | ||||
| may have any of the following values: | ||||
| .TP 19 | ||||
| .B ARES_SUCCESS | ||||
| The query completed successfully. | ||||
| .TP 19 | ||||
| .B ARES_ENODATA | ||||
| The query completed but contains no answers. | ||||
| .TP 19 | ||||
| .B ARES_EFORMERR | ||||
| The query completed but the server claims that the query was | ||||
| malformatted. | ||||
| .TP 19 | ||||
| .B ARES_ESERVFAIL | ||||
| The query completed but the server claims to have experienced a | ||||
| failure.  (This code can only occur if the | ||||
| .B ARES_FLAG_NOCHECKRESP | ||||
| flag was specified at channel initialization time; otherwise, such | ||||
| responses are ignored at the | ||||
| .BR ares_send (3) | ||||
| level.) | ||||
| .TP 19 | ||||
| .B ARES_ENOTFOUND | ||||
| The query completed but the queried-for domain name was not found. | ||||
| .TP 19 | ||||
| .B ARES_ENOTIMP | ||||
| The query completed but the server does not implement the operation | ||||
| requested by the query.  (This code can only occur if the | ||||
| .B ARES_FLAG_NOCHECKRESP | ||||
| flag was specified at channel initialization time; otherwise, such | ||||
| responses are ignored at the | ||||
| .BR ares_send (3) | ||||
| level.) | ||||
| .TP 19 | ||||
| .B ARES_EREFUSED | ||||
| The query completed but the server refused the query.  (This code can | ||||
| only occur if the | ||||
| .B ARES_FLAG_NOCHECKRESP | ||||
| flag was specified at channel initialization time; otherwise, such | ||||
| responses are ignored at the | ||||
| .BR ares_send (3) | ||||
| level.) | ||||
| .TP 19 | ||||
| .B ARES_EBADNAME | ||||
| The query name | ||||
| .I name | ||||
| could not be encoded as a domain name, either because it contained a | ||||
| zero-length label or because it contained a label of more than 63 | ||||
| characters. | ||||
| .TP 19 | ||||
| .B ARES_ETIMEOUT | ||||
| No name servers responded within the timeout period. | ||||
| .TP 19 | ||||
| .B ARES_ECONNREFUSED | ||||
| No name servers could be contacted. | ||||
| .TP 19 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .TP 19 | ||||
| .B ARES_EDESTRUCTION | ||||
| The name service channel | ||||
| .I channel | ||||
| is being destroyed; the query will not be completed. | ||||
| .PP | ||||
| If the query completed (even if there was something wrong with it, as | ||||
| indicated by some of the above error codes), the callback argument | ||||
| .I abuf | ||||
| points to a result buffer of length | ||||
| .IR alen . | ||||
| If the query did not complete, | ||||
| .I abuf | ||||
| will be NULL and | ||||
| .I alen | ||||
| will be 0. | ||||
| .SH SEE ALSO | ||||
| .BR ares_process (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										110
									
								
								ares/ares_query.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								ares/ares_query.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| struct qquery { | ||||
|   ares_callback callback; | ||||
|   void *arg; | ||||
| }; | ||||
|  | ||||
| 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) | ||||
| { | ||||
|   struct qquery *qquery; | ||||
|   unsigned char *qbuf; | ||||
|   int qlen, rd, status; | ||||
|  | ||||
|   /* Compose the query. */ | ||||
|   rd = !(channel->flags & ARES_FLAG_NORECURSE); | ||||
|   status = ares_mkquery(name, dnsclass, type, channel->next_id, rd, &qbuf, | ||||
| 			&qlen); | ||||
|   channel->next_id++; | ||||
|   if (status != ARES_SUCCESS) | ||||
|     { | ||||
|       callback(arg, status, NULL, 0); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   /* Allocate and fill in the query structure. */ | ||||
|   qquery = malloc(sizeof(struct qquery)); | ||||
|   if (!qquery) | ||||
|     { | ||||
|       ares_free_string(qbuf); | ||||
|       callback(arg, ARES_ENOMEM, NULL, 0); | ||||
|       return; | ||||
|     } | ||||
|   qquery->callback = callback; | ||||
|   qquery->arg = arg; | ||||
|  | ||||
|   /* Send it off.  qcallback will be called when we get an answer. */ | ||||
|   ares_send(channel, qbuf, qlen, qcallback, qquery); | ||||
|   ares_free_string(qbuf); | ||||
| } | ||||
|  | ||||
| static void qcallback(void *arg, int status, unsigned char *abuf, int alen) | ||||
| { | ||||
|   struct qquery *qquery = (struct qquery *) arg; | ||||
|   unsigned int ancount; | ||||
|   int rcode; | ||||
|  | ||||
|   if (status != ARES_SUCCESS) | ||||
|     qquery->callback(qquery->arg, status, abuf, alen); | ||||
|   else | ||||
|     { | ||||
|       /* Pull the response code and answer count from the packet. */ | ||||
|       rcode = DNS_HEADER_RCODE(abuf); | ||||
|       ancount = DNS_HEADER_ANCOUNT(abuf); | ||||
|  | ||||
|       /* 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; | ||||
| 	} | ||||
|       qquery->callback(qquery->arg, status, abuf, alen); | ||||
|     } | ||||
|   free(qquery); | ||||
| } | ||||
							
								
								
									
										144
									
								
								ares/ares_search.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								ares/ares_search.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,144 @@ | ||||
| .\" $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_SEARCH 3 "24 July 1998" | ||||
| .SH NAME | ||||
| ares_search \- Initiate a DNS query with domain search | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, | ||||
| .B	unsigned char *\fIabuf\fP, int \fIalen\fP) | ||||
| .PP | ||||
| .B void ares_search(ares_channel \fIchannel\fP, const char *\fIname\fP, | ||||
| .B 	int \fIdnsclass\fP, int \fItype\fP, ares_callback \fIcallback\fP, | ||||
| .B	void *\fIarg\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_search | ||||
| function initiates a series of single-question DNS queries on the name | ||||
| service channel identified by | ||||
| .IR channel , | ||||
| using the channel's search domains as well as a host alias file given | ||||
| by the HOSTALIAS environment variable.  The parameter | ||||
| .I name | ||||
| gives the alias name or the base of the query name as a NUL-terminated | ||||
| C string of period-separated labels; if it ends with a period, the | ||||
| channel's search domains will not be used.  Periods and backslashes | ||||
| within a label must be escaped with a backslash.  The parameters | ||||
| .I dnsclass | ||||
| and | ||||
| .I type | ||||
| give the class and type of the query using the values defined in | ||||
| .BR <arpa/nameser.h> . | ||||
| When the query sequence is complete or has failed, the ares library | ||||
| will invoke | ||||
| .IR callback . | ||||
| Completion or failure of the query sequence may happen immediately, or | ||||
| may happen during a later call to | ||||
| .BR ares_process (3) | ||||
| or | ||||
| .BR ares_destroy (3). | ||||
| .PP | ||||
| The callback argument | ||||
| .I arg | ||||
| is copied from the | ||||
| .B ares_search | ||||
| argument | ||||
| .IR arg . | ||||
| The callback argument | ||||
| .I status | ||||
| indicates whether the query sequence ended with a successful query | ||||
| and, if not, how the query sequence failed.  It may have any of the | ||||
| following values: | ||||
| .TP 19 | ||||
| .B ARES_SUCCESS | ||||
| A query completed successfully. | ||||
| .TP 19 | ||||
| .B ARES_ENODATA | ||||
| No query completed successfully; when the query was tried without a | ||||
| search domain appended, a response was returned with no answers. | ||||
| .TP 19 | ||||
| .B ARES_EFORMERR | ||||
| A query completed but the server claimed that the query was | ||||
| malformatted. | ||||
| .TP 19 | ||||
| .B ARES_ESERVFAIL | ||||
| No query completed successfully; when the query was tried without a | ||||
| search domain appended, the server claimed to have experienced a | ||||
| failure.  (This code can only occur if the | ||||
| .B ARES_FLAG_NOCHECKRESP | ||||
| flag was specified at channel initialization time; otherwise, such | ||||
| responses are ignored at the | ||||
| .BR ares_send (3) | ||||
| level.) | ||||
| .TP 19 | ||||
| .B ARES_ENOTFOUND | ||||
| No query completed successfully; when the query was tried without a | ||||
| search domain appended, the server reported that the queried-for | ||||
| domain name was not found. | ||||
| .TP 19 | ||||
| .B ARES_ENOTIMP | ||||
| A query completed but the server does not implement the operation | ||||
| requested by the query.  (This code can only occur if the | ||||
| .B ARES_FLAG_NOCHECKRESP | ||||
| flag was specified at channel initialization time; otherwise, such | ||||
| responses are ignored at the | ||||
| .BR ares_send (3) | ||||
| level.) | ||||
| .TP 19 | ||||
| .B ARES_EREFUSED | ||||
| A query completed but the server refused the query.  (This code can | ||||
| only occur returned if the | ||||
| .B ARES_FLAG_NOCHECKRESP | ||||
| flag was specified at channel initialization time; otherwise, such | ||||
| responses are ignored at the | ||||
| .BR ares_send (3) | ||||
| level.) | ||||
| .TP 19 | ||||
| .B ARES_TIMEOUT | ||||
| No name servers responded to a query within the timeout period. | ||||
| .TP 19 | ||||
| .B ARES_ECONNREFUSED | ||||
| No name servers could be contacted. | ||||
| .TP 19 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .TP 19 | ||||
| .B ARES_EDESTRUCTION | ||||
| The name service channel | ||||
| .I channel | ||||
| is being destroyed; the query will not be completed. | ||||
| .PP | ||||
| If a query completed successfully, the callback argument | ||||
| .I abuf | ||||
| points to a result buffer of length | ||||
| .IR alen . | ||||
| If the query did not complete successfully, | ||||
| .I abuf | ||||
| will usually be NULL and | ||||
| .I alen | ||||
| will usually be 0, but in some cases an unsuccessful query result may | ||||
| be placed in | ||||
| .IR abuf . | ||||
| .SH SEE ALSO | ||||
| .BR ares_process (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										272
									
								
								ares/ares_search.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								ares/ares_search.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,272 @@ | ||||
| /* 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 <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <ctype.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #endif | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| struct search_query { | ||||
|   /* Arguments passed to ares_search */ | ||||
|   ares_channel channel; | ||||
|   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 */ | ||||
| }; | ||||
|  | ||||
| static void search_callback(void *arg, int status, unsigned char *abuf, | ||||
| 			    int alen); | ||||
| static void end_squery(struct search_query *squery, int status, | ||||
| 		       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) | ||||
| { | ||||
|   struct search_query *squery; | ||||
|   char *s; | ||||
|   const char *p; | ||||
|   int status, ndots; | ||||
|  | ||||
|   /* If name only yields one domain to search, then we don't have | ||||
|    * to keep extra state, so just do an ares_query(). | ||||
|    */ | ||||
|   status = single_domain(channel, name, &s); | ||||
|   if (status != ARES_SUCCESS) | ||||
|     { | ||||
|       callback(arg, status, NULL, 0); | ||||
|       return; | ||||
|     } | ||||
|   if (s) | ||||
|     { | ||||
|       ares_query(channel, s, dnsclass, type, callback, arg); | ||||
|       free(s); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   /* Allocate a search_query structure to hold the state necessary for | ||||
|    * doing multiple lookups. | ||||
|    */ | ||||
|   squery = malloc(sizeof(struct search_query)); | ||||
|   if (!squery) | ||||
|     { | ||||
|       callback(arg, ARES_ENOMEM, NULL, 0); | ||||
|       return; | ||||
|     } | ||||
|   squery->channel = channel; | ||||
|   squery->name = strdup(name); | ||||
|   if (!squery->name) | ||||
|     { | ||||
|       free(squery); | ||||
|       callback(arg, ARES_ENOMEM, NULL, 0); | ||||
|       return; | ||||
|     } | ||||
|   squery->dnsclass = dnsclass; | ||||
|   squery->type = type; | ||||
|   squery->status_as_is = -1; | ||||
|   squery->callback = callback; | ||||
|   squery->arg = arg; | ||||
|  | ||||
|   /* Count the number of dots in name. */ | ||||
|   ndots = 0; | ||||
|   for (p = name; *p; p++) | ||||
|     { | ||||
|       if (*p == '.') | ||||
| 	ndots++; | ||||
|     } | ||||
|  | ||||
|   /* If ndots is at least the channel ndots threshold (usually 1), | ||||
|    * then we try the name as-is first.  Otherwise, we try the name | ||||
|    * as-is last. | ||||
|    */ | ||||
|   if (ndots >= channel->ndots) | ||||
|     { | ||||
|       /* Try the name as-is first. */ | ||||
|       squery->next_domain = 0; | ||||
|       squery->trying_as_is = 1; | ||||
|       ares_query(channel, name, dnsclass, type, search_callback, squery); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       /* Try the name as-is last; start with the first search domain. */ | ||||
|       squery->next_domain = 1; | ||||
|       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); | ||||
| 	} | ||||
|       else | ||||
| 	callback(arg, status, NULL, 0); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void search_callback(void *arg, int status, unsigned char *abuf, | ||||
| 			    int alen) | ||||
| { | ||||
|   struct search_query *squery = (struct search_query *) arg; | ||||
|   ares_channel channel = squery->channel; | ||||
|   char *s; | ||||
|  | ||||
|   /* Stop searching unless we got a non-fatal error. */ | ||||
|   if (status != ARES_ENODATA && status != ARES_ESERVFAIL | ||||
|       && status != ARES_ENOTFOUND) | ||||
|     end_squery(squery, status, abuf, alen); | ||||
|   else | ||||
|     { | ||||
|       /* Save the status if we were trying as-is. */ | ||||
|       if (squery->trying_as_is) | ||||
| 	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); | ||||
| 	    } | ||||
| 	} | ||||
|       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); | ||||
| 	} | ||||
|       else | ||||
| 	end_squery(squery, squery->status_as_is, NULL, 0); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void end_squery(struct search_query *squery, int status, | ||||
| 		       unsigned char *abuf, int alen) | ||||
| { | ||||
|   squery->callback(squery->arg, status, abuf, alen); | ||||
|   free(squery->name); | ||||
|   free(squery); | ||||
| } | ||||
|  | ||||
| /* Concatenate two domains. */ | ||||
| static int cat_domain(const char *name, const char *domain, char **s) | ||||
| { | ||||
|   size_t nlen = strlen(name); | ||||
|   size_t dlen = strlen(domain); | ||||
|  | ||||
|   *s = malloc(nlen + 1 + dlen + 1); | ||||
|   if (!*s) | ||||
|     return ARES_ENOMEM; | ||||
|   memcpy(*s, name, nlen); | ||||
|   (*s)[nlen] = '.'; | ||||
|   memcpy(*s + nlen + 1, domain, dlen); | ||||
|   (*s)[nlen + 1 + dlen] = 0; | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| /* Determine if this name only yields one query.  If it does, set *s to | ||||
|  * the string we should query, in an allocated buffer.  If not, set *s | ||||
|  * to NULL. | ||||
|  */ | ||||
| static int single_domain(ares_channel channel, const char *name, char **s) | ||||
| { | ||||
|   size_t len = strlen(name); | ||||
|   const char *hostaliases; | ||||
|   FILE *fp; | ||||
|   char *line = NULL; | ||||
|   int linesize, status; | ||||
|   const char *p, *q; | ||||
|  | ||||
|   /* If the name contains a trailing dot, then the single query is the name | ||||
|    * sans the trailing dot. | ||||
|    */ | ||||
|   if (name[len - 1] == '.') | ||||
|     { | ||||
|       *s = strdup(name); | ||||
|       return (*s) ? ARES_SUCCESS : ARES_ENOMEM; | ||||
|     } | ||||
|  | ||||
|   if (!(channel->flags & ARES_FLAG_NOALIASES) && !strchr(name, '.')) | ||||
|     { | ||||
|       /* 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; | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   if (channel->flags & ARES_FLAG_NOSEARCH || channel->ndomains == 0) | ||||
|     { | ||||
|       /* No domain search to do; just try the name as-is. */ | ||||
|       *s = strdup(name); | ||||
|       return (*s) ? ARES_SUCCESS : ARES_ENOMEM; | ||||
|     } | ||||
|  | ||||
|   *s = NULL; | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
							
								
								
									
										117
									
								
								ares/ares_send.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								ares/ares_send.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| .\" $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_SEND 3 "25 July 1998" | ||||
| .SH NAME | ||||
| ares_send \- Initiate a DNS query | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .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 	int \fIqlen\fP, ares_callback \fIcallback\fP, void *\fIarg\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_send | ||||
| function initiates a DNS query on the name service channel identified | ||||
| by | ||||
| .IR channel . | ||||
| The parameters | ||||
| .I qbuf | ||||
| and | ||||
| .I qlen | ||||
| give the DNS query, which should already have been formatted according | ||||
| to the DNS protocol.  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). | ||||
| .PP | ||||
| The callback argument | ||||
| .I arg | ||||
| is copied from the | ||||
| .B ares_send | ||||
| argument | ||||
| .IR arg . | ||||
| The callback argument | ||||
| .I status | ||||
| indicates whether the query succeeded and, if not, how it failed.  It | ||||
| may have any of the following values: | ||||
| .TP 19 | ||||
| .B ARES_SUCCESS | ||||
| The query completed. | ||||
| .TP 19 | ||||
| .B ARES_EBADQUERY | ||||
| The query buffer was poorly formed (was not long enough for a DNS | ||||
| header or was too long for TCP transmission). | ||||
| .TP 19 | ||||
| .B ARES_ETIMEOUT | ||||
| No name servers responded within the timeout period. | ||||
| .TP 19 | ||||
| .B ARES_ECONNREFUSED | ||||
| No name servers could be contacted. | ||||
| .TP 19 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .TP 19 | ||||
| .B ARES_EDESTRUCTION | ||||
| The name service channel | ||||
| .I channel | ||||
| is being destroyed; the query will not be completed. | ||||
| .PP | ||||
| If the query completed, the callback argument | ||||
| .I abuf | ||||
| points to a result buffer of length | ||||
| .IR alen . | ||||
| If the query did not complete, | ||||
| .I abuf | ||||
| will be NULL and | ||||
| .I alen | ||||
| will be 0. | ||||
| .PP | ||||
| Unless the flag | ||||
| .B ARES_FLAG_NOCHECKRESP | ||||
| was set at channel initialization time, | ||||
| .B ares_send | ||||
| will normally ignore responses whose questions do not match the | ||||
| questions in | ||||
| .IR qbuf , | ||||
| as well as responses with reply codes of | ||||
| .BR SERVFAIL , | ||||
| .BR NOTIMP , | ||||
| and | ||||
| .BR REFUSED . | ||||
| Unlike other query functions in the ares library, however, | ||||
| .B ares_send | ||||
| does not inspect the header of the reply packet to determine the error | ||||
| status, so a callback status of | ||||
| .B ARES_SUCCESS | ||||
| does not reflect as much about the response as for other query | ||||
| functions. | ||||
| .SH SEE ALSO | ||||
| .BR ares_process (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										102
									
								
								ares/ares_send.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								ares/ares_send.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,102 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <time.h> | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen, | ||||
| 	       ares_callback callback, void *arg) | ||||
| { | ||||
|   struct query *query; | ||||
|   int i; | ||||
|   time_t now; | ||||
|  | ||||
|   /* Verify that the query is at least long enough to hold the header. */ | ||||
|   if (qlen < HFIXEDSZ || qlen >= (1 << 16)) | ||||
|     { | ||||
|       callback(arg, ARES_EBADQUERY, NULL, 0); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   /* Allocate space for query and allocated fields. */ | ||||
|   query = malloc(sizeof(struct query)); | ||||
|   if (!query) | ||||
|     { | ||||
|       callback(arg, ARES_ENOMEM, NULL, 0); | ||||
|       return; | ||||
|     } | ||||
|   query->tcpbuf = malloc(qlen + 2); | ||||
|   if (!query->tcpbuf) | ||||
|     { | ||||
|       free(query); | ||||
|       callback(arg, ARES_ENOMEM, NULL, 0); | ||||
|       return; | ||||
|     } | ||||
|   query->skip_server = malloc(channel->nservers * sizeof(int)); | ||||
|   if (!query->skip_server) | ||||
|     { | ||||
|       free(query->tcpbuf); | ||||
|       free(query); | ||||
|       callback(arg, ARES_ENOMEM, NULL, 0); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   /* Compute the query ID.  Start with no timeout. */ | ||||
|   query->qid = DNS_HEADER_QID(qbuf); | ||||
|   query->timeout = 0; | ||||
|  | ||||
|   /* Form the TCP query buffer by prepending qlen (as two | ||||
|    * network-order bytes) to qbuf. | ||||
|    */ | ||||
|   query->tcpbuf[0] = (qlen >> 8) & 0xff; | ||||
|   query->tcpbuf[1] = qlen & 0xff; | ||||
|   memcpy(query->tcpbuf + 2, qbuf, qlen); | ||||
|   query->tcplen = qlen + 2; | ||||
|  | ||||
|   /* Fill in query arguments. */ | ||||
|   query->qbuf = query->tcpbuf + 2; | ||||
|   query->qlen = qlen; | ||||
|   query->callback = callback; | ||||
|   query->arg = arg; | ||||
|  | ||||
|   /* Initialize query status. */ | ||||
|   query->try = 0; | ||||
|   query->server = 0; | ||||
|   for (i = 0; i < channel->nservers; i++) | ||||
|     query->skip_server[i] = 0; | ||||
|   query->using_tcp = (channel->flags & ARES_FLAG_USEVC) || qlen > PACKETSZ; | ||||
|   query->error_status = ARES_ECONNREFUSED; | ||||
|  | ||||
|   /* Chain the query into this channel's query list. */ | ||||
|   query->next = channel->queries; | ||||
|   channel->queries = query; | ||||
|  | ||||
|   /* Perform the first query action. */ | ||||
|   time(&now); | ||||
|   ares__send_query(channel, query, now); | ||||
| } | ||||
							
								
								
									
										37
									
								
								ares/ares_strerror.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								ares/ares_strerror.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| .\" $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_STRERROR 3 "25 July 1998" | ||||
| .SH NAME | ||||
| ares_strerror \- Get the description of an ares library error code | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .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. | ||||
| .SH NOTES | ||||
| This function is not compatible with ares. | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										43
									
								
								ares/ares_strerror.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								ares/ares_strerror.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| /* 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 <assert.h> | ||||
| #include "ares.h" | ||||
|  | ||||
| const char *ares_strerror(int code) | ||||
| { | ||||
|   /* Return a string literal from a table. */ | ||||
|   const char *errtext[] = { | ||||
|     "Successful completion", | ||||
|     "DNS server returned answer with no data", | ||||
|     "DNS server claims query was misformatted", | ||||
|     "DNS server returned general failure", | ||||
|     "Domain name not found", | ||||
|     "DNS server does not implement requested operation", | ||||
|     "DNS server refused query", | ||||
|     "Misformatted DNS query", | ||||
|     "Misformatted domain name", | ||||
|     "Unsupported address family", | ||||
|     "Misformatted DNS reply", | ||||
|     "Could not contact DNS servers", | ||||
|     "Timeout while contacting DNS servers", | ||||
|     "End of file", | ||||
|     "Error reading file", | ||||
|     "Out of memory" | ||||
|   }; | ||||
|  | ||||
|   assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext))); | ||||
|   return errtext[code]; | ||||
| } | ||||
							
								
								
									
										64
									
								
								ares/ares_timeout.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								ares/ares_timeout.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| .\" $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_TIMEOUT 3 "25 July 1998" | ||||
| .SH NAME | ||||
| ares_fds \- Get file descriptors to select on for name service | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B struct timeval *ares_timeout(ares_channel \fIchannel\fP, | ||||
| .B	struct timeval *\fImaxtv\fP, struct timeval *\fItvbuf\fP) | ||||
| .fi | ||||
| .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 | ||||
| .I maxtv | ||||
| specifies a existing maximum timeout, or | ||||
| .B NULL | ||||
| if the caller does not wish to apply a maximum timeout.  The parameter | ||||
| .I tvbuf | ||||
| must point to a writable buffer of type | ||||
| .BR "struct timeval" . | ||||
| It is valid for | ||||
| .I maxtv | ||||
| and | ||||
| .I tvbuf | ||||
| to have the same value. | ||||
| .PP | ||||
| If no queries have timeouts pending sooner than the given maximum | ||||
| timeout, | ||||
| .B ares_timeout | ||||
| returns the value of | ||||
| .IR maxtv; | ||||
| otherwise | ||||
| .B ares_timeout | ||||
| stores the appropriate timeout value into the buffer pointed to by | ||||
| .I tvbuf | ||||
| and returns the value of | ||||
| .IR tvbuf . | ||||
| .SH SEE ALSO | ||||
| .BR ares_fds (3), | ||||
| .BR ares_process (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
| .br | ||||
| Copyright 1998 by the Massachusetts Institute of Technology. | ||||
							
								
								
									
										65
									
								
								ares/ares_timeout.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								ares/ares_timeout.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| /* 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 <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
|  | ||||
| #else | ||||
| #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 query *query; | ||||
|   time_t now; | ||||
|   int offset, min_offset; | ||||
|  | ||||
|   /* No queries, no timeout (and no fetch of the current time). */ | ||||
|   if (!channel->queries) | ||||
|     return maxtv; | ||||
|  | ||||
|   /* Find the minimum timeout for the current set of queries. */ | ||||
|   time(&now); | ||||
|   min_offset = -1; | ||||
|   for (query = channel->queries; query; query = query->next) | ||||
|     { | ||||
|       if (query->timeout == 0) | ||||
| 	continue; | ||||
|       offset = query->timeout - now; | ||||
|       if (offset < 0) | ||||
| 	offset = 0; | ||||
|       if (min_offset == -1 || offset < min_offset) | ||||
| 	min_offset = offset; | ||||
|     } | ||||
|  | ||||
|   /* If we found a minimum timeout and it's sooner than the one | ||||
|    * specified in maxtv (if any), return it.  Otherwise go with | ||||
|    * maxtv. | ||||
|    */ | ||||
|   if (min_offset != -1 && (!maxtv || min_offset <= maxtv->tv_sec)) | ||||
|     { | ||||
|       tvbuf->tv_sec = min_offset; | ||||
|       tvbuf->tv_usec = 0; | ||||
|       return tvbuf; | ||||
|     } | ||||
|   else | ||||
|     return maxtv; | ||||
| } | ||||
							
								
								
									
										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 | ||||
|  | ||||
							
								
								
									
										11
									
								
								ares/ares_version.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								ares/ares_version.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| #include "ares_version.h" | ||||
|  | ||||
| const char *ares_version(int *version) | ||||
| { | ||||
|   if(version) | ||||
|     *version = ARES_VERSION; | ||||
|  | ||||
|   return ARES_VERSION_STR; | ||||
| } | ||||
							
								
								
									
										17
									
								
								ares/ares_version.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								ares/ares_version.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| #ifndef ARES__VERSION_H | ||||
| #define ARES__VERSION_H | ||||
|  | ||||
| #define ARES_VERSION_MAJOR 1 | ||||
| #define ARES_VERSION_MINOR 0 | ||||
| #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" | ||||
|  | ||||
| const char *ares_version(int *version); | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										1388
									
								
								ares/config.guess
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										1388
									
								
								ares/config.guess
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1489
									
								
								ares/config.sub
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										1489
									
								
								ares/config.sub
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										56
									
								
								ares/configure.ac
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								ares/configure.ac
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| 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) | ||||
|  | ||||
| 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 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) | ||||
| ) | ||||
|  | ||||
| dnl check for a few basic system headers we need | ||||
| dnl AC_CHECK_HEADERS( | ||||
| dnl        sys/types.h \ | ||||
| dnl        sys/time.h \ | ||||
| dnl        sys/select.h \ | ||||
| dnl        sys/socket.h \ | ||||
| dnl        ) | ||||
|  | ||||
| AC_OUTPUT(Makefile) | ||||
							
								
								
									
										250
									
								
								ares/install-sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										250
									
								
								ares/install-sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,250 @@ | ||||
| #!/bin/sh | ||||
| # | ||||
| # install - install a program, script, or datafile | ||||
| # This comes from X11R5 (mit/util/scripts/install.sh). | ||||
| # | ||||
| # Copyright 1991 by the Massachusetts Institute of Technology | ||||
| # | ||||
| # Permission to use, copy, modify, distribute, and sell this software and its | ||||
| # documentation for any purpose is hereby granted without fee, 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. | ||||
| # | ||||
| # Calling this script install-sh is preferred over install.sh, to prevent | ||||
| # `make' implicit rules from creating a file called install from it | ||||
| # when there is no Makefile. | ||||
| # | ||||
| # This script is compatible with the BSD install script, but was written | ||||
| # from scratch.  It can only install one file at a time, a restriction | ||||
| # shared with many OS's install programs. | ||||
|  | ||||
|  | ||||
| # set DOITPROG to echo to test this script | ||||
|  | ||||
| # Don't use :- since 4.3BSD and earlier shells don't like it. | ||||
| doit="${DOITPROG-}" | ||||
|  | ||||
|  | ||||
| # put in absolute paths if you don't have them in your path; or use env. vars. | ||||
|  | ||||
| mvprog="${MVPROG-mv}" | ||||
| cpprog="${CPPROG-cp}" | ||||
| chmodprog="${CHMODPROG-chmod}" | ||||
| chownprog="${CHOWNPROG-chown}" | ||||
| chgrpprog="${CHGRPPROG-chgrp}" | ||||
| stripprog="${STRIPPROG-strip}" | ||||
| rmprog="${RMPROG-rm}" | ||||
| mkdirprog="${MKDIRPROG-mkdir}" | ||||
|  | ||||
| transformbasename="" | ||||
| transform_arg="" | ||||
| instcmd="$mvprog" | ||||
| chmodcmd="$chmodprog 0755" | ||||
| chowncmd="" | ||||
| chgrpcmd="" | ||||
| stripcmd="" | ||||
| rmcmd="$rmprog -f" | ||||
| mvcmd="$mvprog" | ||||
| src="" | ||||
| dst="" | ||||
| dir_arg="" | ||||
|  | ||||
| while [ x"$1" != x ]; do | ||||
|     case $1 in | ||||
| 	-c) instcmd="$cpprog" | ||||
| 	    shift | ||||
| 	    continue;; | ||||
|  | ||||
| 	-d) dir_arg=true | ||||
| 	    shift | ||||
| 	    continue;; | ||||
|  | ||||
| 	-m) chmodcmd="$chmodprog $2" | ||||
| 	    shift | ||||
| 	    shift | ||||
| 	    continue;; | ||||
|  | ||||
| 	-o) chowncmd="$chownprog $2" | ||||
| 	    shift | ||||
| 	    shift | ||||
| 	    continue;; | ||||
|  | ||||
| 	-g) chgrpcmd="$chgrpprog $2" | ||||
| 	    shift | ||||
| 	    shift | ||||
| 	    continue;; | ||||
|  | ||||
| 	-s) stripcmd="$stripprog" | ||||
| 	    shift | ||||
| 	    continue;; | ||||
|  | ||||
| 	-t=*) transformarg=`echo $1 | sed 's/-t=//'` | ||||
| 	    shift | ||||
| 	    continue;; | ||||
|  | ||||
| 	-b=*) transformbasename=`echo $1 | sed 's/-b=//'` | ||||
| 	    shift | ||||
| 	    continue;; | ||||
|  | ||||
| 	*)  if [ x"$src" = x ] | ||||
| 	    then | ||||
| 		src=$1 | ||||
| 	    else | ||||
| 		# this colon is to work around a 386BSD /bin/sh bug | ||||
| 		: | ||||
| 		dst=$1 | ||||
| 	    fi | ||||
| 	    shift | ||||
| 	    continue;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| if [ x"$src" = x ] | ||||
| then | ||||
| 	echo "install:	no input file specified" | ||||
| 	exit 1 | ||||
| else | ||||
| 	true | ||||
| fi | ||||
|  | ||||
| if [ x"$dir_arg" != x ]; then | ||||
| 	dst=$src | ||||
| 	src="" | ||||
| 	 | ||||
| 	if [ -d $dst ]; then | ||||
| 		instcmd=: | ||||
| 	else | ||||
| 		instcmd=mkdir | ||||
| 	fi | ||||
| else | ||||
|  | ||||
| # Waiting for this to be detected by the "$instcmd $src $dsttmp" command | ||||
| # might cause directories to be created, which would be especially bad  | ||||
| # if $src (and thus $dsttmp) contains '*'. | ||||
|  | ||||
| 	if [ -f $src -o -d $src ] | ||||
| 	then | ||||
| 		true | ||||
| 	else | ||||
| 		echo "install:  $src does not exist" | ||||
| 		exit 1 | ||||
| 	fi | ||||
| 	 | ||||
| 	if [ x"$dst" = x ] | ||||
| 	then | ||||
| 		echo "install:	no destination specified" | ||||
| 		exit 1 | ||||
| 	else | ||||
| 		true | ||||
| 	fi | ||||
|  | ||||
| # If destination is a directory, append the input filename; if your system | ||||
| # does not like double slashes in filenames, you may need to add some logic | ||||
|  | ||||
| 	if [ -d $dst ] | ||||
| 	then | ||||
| 		dst="$dst"/`basename $src` | ||||
| 	else | ||||
| 		true | ||||
| 	fi | ||||
| fi | ||||
|  | ||||
| ## this sed command emulates the dirname command | ||||
| dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` | ||||
|  | ||||
| # Make sure that the destination directory exists. | ||||
| #  this part is taken from Noah Friedman's mkinstalldirs script | ||||
|  | ||||
| # Skip lots of stat calls in the usual case. | ||||
| if [ ! -d "$dstdir" ]; then | ||||
| defaultIFS='	 | ||||
| ' | ||||
| IFS="${IFS-${defaultIFS}}" | ||||
|  | ||||
| oIFS="${IFS}" | ||||
| # Some sh's can't handle IFS=/ for some reason. | ||||
| IFS='%' | ||||
| set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` | ||||
| IFS="${oIFS}" | ||||
|  | ||||
| pathcomp='' | ||||
|  | ||||
| while [ $# -ne 0 ] ; do | ||||
| 	pathcomp="${pathcomp}${1}" | ||||
| 	shift | ||||
|  | ||||
| 	if [ ! -d "${pathcomp}" ] ; | ||||
|         then | ||||
| 		$mkdirprog "${pathcomp}" | ||||
| 	else | ||||
| 		true | ||||
| 	fi | ||||
|  | ||||
| 	pathcomp="${pathcomp}/" | ||||
| done | ||||
| fi | ||||
|  | ||||
| if [ x"$dir_arg" != x ] | ||||
| then | ||||
| 	$doit $instcmd $dst && | ||||
|  | ||||
| 	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && | ||||
| 	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && | ||||
| 	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && | ||||
| 	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi | ||||
| else | ||||
|  | ||||
| # If we're going to rename the final executable, determine the name now. | ||||
|  | ||||
| 	if [ x"$transformarg" = x ]  | ||||
| 	then | ||||
| 		dstfile=`basename $dst` | ||||
| 	else | ||||
| 		dstfile=`basename $dst $transformbasename |  | ||||
| 			sed $transformarg`$transformbasename | ||||
| 	fi | ||||
|  | ||||
| # don't allow the sed command to completely eliminate the filename | ||||
|  | ||||
| 	if [ x"$dstfile" = x ]  | ||||
| 	then | ||||
| 		dstfile=`basename $dst` | ||||
| 	else | ||||
| 		true | ||||
| 	fi | ||||
|  | ||||
| # Make a temp file name in the proper directory. | ||||
|  | ||||
| 	dsttmp=$dstdir/#inst.$$# | ||||
|  | ||||
| # Move or copy the file name to the temp name | ||||
|  | ||||
| 	$doit $instcmd $src $dsttmp && | ||||
|  | ||||
| 	trap "rm -f ${dsttmp}" 0 && | ||||
|  | ||||
| # and set any options; do chmod last to preserve setuid bits | ||||
|  | ||||
| # If any of these fail, we abort the whole thing.  If we want to | ||||
| # ignore errors from any of these, just make sure not to ignore | ||||
| # errors from the above "$doit $instcmd $src $dsttmp" command. | ||||
|  | ||||
| 	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && | ||||
| 	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && | ||||
| 	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && | ||||
| 	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && | ||||
|  | ||||
| # Now rename the file to the real destination. | ||||
|  | ||||
| 	$doit $rmcmd -f $dstdir/$dstfile && | ||||
| 	$doit $mvcmd $dsttmp $dstdir/$dstfile  | ||||
|  | ||||
| fi && | ||||
|  | ||||
|  | ||||
| exit 0 | ||||
							
								
								
									
										98
									
								
								ares/maketgz
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										98
									
								
								ares/maketgz
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| #!/usr/bin/env perl | ||||
|  | ||||
| $version = $ARGV[0]; | ||||
|  | ||||
| $name="c-ares"; | ||||
|  | ||||
| if($version eq "") { | ||||
|     print "Enter version number!\n"; | ||||
|     exit; | ||||
| } | ||||
|  | ||||
| if(!-f "ares.h") { | ||||
|     print "run this script in the ares source root dir\n"; | ||||
|     exit; | ||||
| } | ||||
|  | ||||
| if(!-f "configure") { | ||||
|     `autoconf`; | ||||
| } | ||||
|  | ||||
| @files=`find . -name FILES`; | ||||
|  | ||||
| my @entries; | ||||
|  | ||||
| sub dirpart { | ||||
|     my ($file)=@_; | ||||
|     my @p=split("/", $file); | ||||
|     $p[$#p]=""; # blank the last one | ||||
|     my $dir=join("/", @p); | ||||
|  | ||||
|     $dir =~ s/^\.\///; # cut off ./ beginnings | ||||
|  | ||||
|     $dir =~ s/\/$//;  # off / trailers | ||||
|  | ||||
|     if(!$dir) { | ||||
|         $dir = "."; | ||||
|     } | ||||
|  | ||||
|     return $dir; | ||||
| } | ||||
|  | ||||
| sub add { | ||||
|     my ($file)=@_; | ||||
|  | ||||
|     my $dir=dirpart($file); | ||||
|  | ||||
|     open(FILE, "<$file"); | ||||
|     while(<FILE>) { | ||||
|         if($_ =~ /^ *\#/) { | ||||
|             next; | ||||
|         } | ||||
|         chomp; | ||||
|         push @entries, "$dir/$_"; | ||||
|     } | ||||
|     close(FILE); | ||||
| } | ||||
|  | ||||
| for(@files) { | ||||
|     chomp; | ||||
|     add($_); | ||||
| } | ||||
|  | ||||
| sub mkalldir { | ||||
|     my ($dir) = @_; | ||||
|  | ||||
|     my @parts = split("/", $dir); | ||||
|  | ||||
|     #print "IN: $dir\n"; | ||||
|  | ||||
|     my $sub=""; | ||||
|     for(@parts) { | ||||
|         #print "PART: $_\n"; | ||||
|  | ||||
|         $sub .= "$_"; | ||||
|         if($_ eq "") { | ||||
|             next; | ||||
|         } | ||||
|         mkdir($sub, 0777); | ||||
|         #print "make $sub\n"; | ||||
|         $sub .= "/"; | ||||
|     } | ||||
|      | ||||
| } | ||||
|  | ||||
| for(@entries) { | ||||
|     my $dir = dirpart("$name-$version/$_"); | ||||
|  #   print "Create $dir\n"; | ||||
|     mkalldir($dir); | ||||
|  #   print "Copy $_ to $dir\n"; | ||||
|     `cp -p $_ $dir`; | ||||
| } | ||||
|  | ||||
| # make a tarball | ||||
| `tar -cf $name-$version.tar $name-$version`; | ||||
| # gzip the tarball | ||||
| `gzip -9 $name-$version.tar`; | ||||
| # remove the dir | ||||
| `rm -rf $name-$version`; | ||||
							
								
								
									
										40
									
								
								ares/mkinstalldirs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								ares/mkinstalldirs
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| #! /bin/sh | ||||
| # mkinstalldirs --- make directory hierarchy | ||||
| # Author: Noah Friedman <friedman@prep.ai.mit.edu> | ||||
| # Created: 1993-05-16 | ||||
| # Public domain | ||||
|  | ||||
| # $Id$ | ||||
|  | ||||
| errstatus=0 | ||||
|  | ||||
| for file | ||||
| do | ||||
|    set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` | ||||
|    shift | ||||
|  | ||||
|    pathcomp= | ||||
|    for d | ||||
|    do | ||||
|      pathcomp="$pathcomp$d" | ||||
|      case "$pathcomp" in | ||||
|        -* ) pathcomp=./$pathcomp ;; | ||||
|      esac | ||||
|  | ||||
|      if test ! -d "$pathcomp"; then | ||||
|         echo "mkdir $pathcomp" 1>&2 | ||||
|  | ||||
|         mkdir "$pathcomp" || lasterr=$? | ||||
|  | ||||
|         if test ! -d "$pathcomp"; then | ||||
|   	  errstatus=$lasterr | ||||
|         fi | ||||
|      fi | ||||
|  | ||||
|      pathcomp="$pathcomp/" | ||||
|    done | ||||
| done | ||||
|  | ||||
| exit $errstatus | ||||
|  | ||||
| # mkinstalldirs ends here | ||||
							
								
								
									
										226
									
								
								ares/nameser.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								ares/nameser.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,226 @@ | ||||
| #ifndef ARES_NAMESER_H | ||||
| #define ARES_NAMESER_H | ||||
|  | ||||
| /* Windows-only header file provided by liren@vivisimo.com to make his Windows | ||||
|    port build */ | ||||
|  | ||||
| #include <windows.h> | ||||
| #include <process.h> /* for the _getpid() proto */ | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #define MAXHOSTNAMELEN 256 | ||||
|  | ||||
| #define EINPROGRESS WSAEINPROGRESS | ||||
|  | ||||
| /* Structure for scatter/gather I/O.  */ | ||||
| struct iovec | ||||
| { | ||||
|     void *iov_base;     /* Pointer to data.  */ | ||||
|     size_t iov_len;     /* Length of data.  */ | ||||
| }; | ||||
|  | ||||
| #define getpid() _getpid() | ||||
|  | ||||
| struct timezone { int dummy; }; | ||||
|  | ||||
| int ares_gettimeofday(struct timeval *tv, struct timezone *tz); | ||||
| #define gettimeofday(tv,tz) ares_gettimeofday(tv,tz) | ||||
|  | ||||
| #define NS_CMPRSFLGS  0xc0   | ||||
|  | ||||
|  | ||||
|   /* Flag bits indicating name compression. */ | ||||
| #define INDIR_MASK    NS_CMPRSFLGS | ||||
|  | ||||
| typedef enum __ns_class { | ||||
|     ns_c_invalid = 0,       /* Cookie. */ | ||||
|     ns_c_in = 1,            /* Internet. */ | ||||
|     ns_c_2 = 2,             /* unallocated/unsupported. */ | ||||
|     ns_c_chaos = 3,         /* MIT Chaos-net. */ | ||||
|     ns_c_hs = 4,            /* MIT Hesiod. */ | ||||
|     /* Query class values which do not appear in resource records */ | ||||
|     ns_c_none = 254,        /* for prereq. sections in update requests */ | ||||
|     ns_c_any = 255,         /* Wildcard match. */ | ||||
|     ns_c_max = 65536 | ||||
| } ns_class; | ||||
|  | ||||
| #define C_IN           ns_c_in | ||||
|  | ||||
| typedef enum __ns_type { | ||||
|     ns_t_invalid = 0,       /* Cookie. */ | ||||
|     ns_t_a = 1,             /* Host address. */ | ||||
|     ns_t_ns = 2,            /* Authoritative server. */ | ||||
|     ns_t_md = 3,            /* Mail destination. */ | ||||
|     ns_t_mf = 4,            /* Mail forwarder. */ | ||||
|     ns_t_cname = 5,         /* Canonical name. */ | ||||
|     ns_t_soa = 6,           /* Start of authority zone. */ | ||||
|     ns_t_mb = 7,            /* Mailbox domain name. */ | ||||
|     ns_t_mg = 8,            /* Mail group member. */ | ||||
|     ns_t_mr = 9,            /* Mail rename name. */ | ||||
|     ns_t_null = 10,         /* Null resource record. */ | ||||
|     ns_t_wks = 11,          /* Well known service. */ | ||||
|     ns_t_ptr = 12,          /* Domain name pointer. */ | ||||
|     ns_t_hinfo = 13,        /* Host information. */ | ||||
|     ns_t_minfo = 14,        /* Mailbox information. */ | ||||
|     ns_t_mx = 15,           /* Mail routing information. */ | ||||
|     ns_t_txt = 16,          /* Text strings. */ | ||||
|     ns_t_rp = 17,           /* Responsible person. */ | ||||
|     ns_t_afsdb = 18,        /* AFS cell database. */ | ||||
|     ns_t_x25 = 19,          /* X_25 calling address. */ | ||||
|     ns_t_isdn = 20,         /* ISDN calling address. */ | ||||
|     ns_t_rt = 21,           /* Router. */ | ||||
|     ns_t_nsap = 22,         /* NSAP address. */ | ||||
|     ns_t_nsap_ptr = 23,     /* Reverse NSAP lookup (deprecated). */ | ||||
|     ns_t_sig = 24,          /* Security signature. */ | ||||
|     ns_t_key = 25,          /* Security key. */ | ||||
|     ns_t_px = 26,           /* X.400 mail mapping. */ | ||||
|     ns_t_gpos = 27,         /* Geographical position (withdrawn). */ | ||||
|     ns_t_aaaa = 28,         /* Ip6 Address. */ | ||||
|     ns_t_loc = 29,          /* Location Information. */ | ||||
|     ns_t_nxt = 30,          /* Next domain (security). */ | ||||
|     ns_t_eid = 31,          /* Endpoint identifier. */ | ||||
|     ns_t_nimloc = 32,       /* Nimrod Locator. */ | ||||
|     ns_t_srv = 33,          /* Server Selection. */ | ||||
|     ns_t_atma = 34,         /* ATM Address */ | ||||
|     ns_t_naptr = 35,        /* Naming Authority PoinTeR */ | ||||
|     ns_t_kx = 36,           /* Key Exchange */ | ||||
|     ns_t_cert = 37,         /* Certification record */ | ||||
|     ns_t_a6 = 38,           /* IPv6 address (deprecates AAAA) */ | ||||
|     ns_t_dname = 39,        /* Non-terminal DNAME (for IPv6) */ | ||||
|     ns_t_sink = 40,         /* Kitchen sink (experimentatl) */ | ||||
|     ns_t_opt = 41,          /* EDNS0 option (meta-RR) */ | ||||
|     ns_t_tsig = 250,        /* Transaction signature. */ | ||||
|     ns_t_ixfr = 251,        /* Incremental zone transfer. */ | ||||
|     ns_t_axfr = 252,        /* Transfer zone of authority. */ | ||||
|     ns_t_mailb = 253,       /* Transfer mailbox records. */ | ||||
|     ns_t_maila = 254,       /* Transfer mail agent records. */ | ||||
|     ns_t_any = 255,         /* Wildcard match. */ | ||||
|     ns_t_zxfr = 256,        /* BIND-specific, nonstandard. */ | ||||
|     ns_t_max = 65536 | ||||
| } ns_type; | ||||
|  | ||||
| #define T_PTR          ns_t_ptr | ||||
| #define T_A            ns_t_a | ||||
|  | ||||
|  | ||||
| #define NS_DEFAULTPORT        53      /* For both TCP and UDP. */ | ||||
| #define NAMESERVER_PORT        NS_DEFAULTPORT | ||||
|  | ||||
| #define NS_HFIXEDSZ   12      /* #/bytes of fixed data in header */ | ||||
| #define HFIXEDSZ      NS_HFIXEDSZ | ||||
|  | ||||
| #define NS_QFIXEDSZ   4       /* #/bytes of fixed data in query */ | ||||
| #define QFIXEDSZ       NS_QFIXEDSZ | ||||
|  | ||||
| typedef enum __ns_opcode { | ||||
|     ns_o_query = 0,         /* Standard query. */ | ||||
|     ns_o_iquery = 1,        /* Inverse query (deprecated/unsupported). */ | ||||
|     ns_o_status = 2,        /* Name server status query (unsupported). */ | ||||
|                                 /* Opcode 3 is undefined/reserved. */ | ||||
|     ns_o_notify = 4,        /* Zone change notification. */ | ||||
|     ns_o_update = 5,        /* Zone update message. */ | ||||
|     ns_o_max = 6 | ||||
| } ns_opcode; | ||||
|  | ||||
| #define QUERY          ns_o_query | ||||
|  | ||||
| #define NS_MAXLABEL   63  | ||||
| #define MAXLABEL       NS_MAXLABEL | ||||
|  | ||||
| #define NS_RRFIXEDSZ  10      /* #/bytes of fixed data in r record */ | ||||
| #define RRFIXEDSZ      NS_RRFIXEDSZ | ||||
|  | ||||
| #define T_CNAME                ns_t_cname | ||||
|  | ||||
|  | ||||
| #define NS_PACKETSZ   512     /* maximum packet size */ | ||||
| #define PACKETSZ       NS_PACKETSZ | ||||
|  | ||||
| typedef enum __ns_rcode { | ||||
|     ns_r_noerror = 0,       /* No error occurred. */ | ||||
|     ns_r_formerr = 1,       /* Format error. */ | ||||
|     ns_r_servfail = 2,      /* Server failure. */ | ||||
|     ns_r_nxdomain = 3,      /* Name error. */ | ||||
|     ns_r_notimpl = 4,       /* Unimplemented. */ | ||||
|     ns_r_refused = 5,       /* Operation refused. */ | ||||
|     /* these are for BIND_UPDATE */ | ||||
|     ns_r_yxdomain = 6,      /* Name exists */ | ||||
|     ns_r_yxrrset = 7,       /* RRset exists */ | ||||
|     ns_r_nxrrset = 8,       /* RRset does not exist */ | ||||
|     ns_r_notauth = 9,       /* Not authoritative for zone */ | ||||
|     ns_r_notzone = 10,      /* Zone of record different from zone section */ | ||||
|     ns_r_max = 11, | ||||
|     /* The following are TSIG extended errors */ | ||||
|     ns_r_badsig = 16, | ||||
|     ns_r_badkey = 17, | ||||
|     ns_r_badtime = 18 | ||||
| } 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 | ||||
|  | ||||
| #define C_CHAOS         ns_c_chaos | ||||
| #define C_HS            ns_c_hs | ||||
| #define C_NONE          ns_c_none | ||||
| #define C_ANY           ns_c_any | ||||
|  | ||||
| #define T_A             ns_t_a | ||||
| #define T_NS            ns_t_ns | ||||
| #define T_MD            ns_t_md | ||||
| #define T_MF            ns_t_mf | ||||
| #define T_CNAME         ns_t_cname | ||||
| #define T_SOA           ns_t_soa | ||||
| #define T_MB            ns_t_mb | ||||
| #define T_MG            ns_t_mg | ||||
| #define T_MR            ns_t_mr | ||||
| #define T_NULL          ns_t_null | ||||
| #define T_WKS           ns_t_wks | ||||
| #define T_PTR           ns_t_ptr | ||||
| #define T_HINFO         ns_t_hinfo | ||||
| #define T_MINFO         ns_t_minfo | ||||
| #define T_MX            ns_t_mx | ||||
| #define T_TXT           ns_t_txt | ||||
| #define T_RP            ns_t_rp | ||||
| #define T_AFSDB         ns_t_afsdb | ||||
| #define T_X25           ns_t_x25 | ||||
| #define T_ISDN          ns_t_isdn | ||||
| #define T_RT            ns_t_rt | ||||
| #define T_NSAP          ns_t_nsap | ||||
| #define T_NSAP_PTR      ns_t_nsap_ptr | ||||
| #define T_SIG           ns_t_sig | ||||
| #define T_KEY           ns_t_key | ||||
| #define T_PX            ns_t_px | ||||
| #define T_GPOS          ns_t_gpos | ||||
| #define T_AAAA          ns_t_aaaa | ||||
| #define T_LOC           ns_t_loc | ||||
| #define T_NXT           ns_t_nxt | ||||
| #define T_EID           ns_t_eid | ||||
| #define T_NIMLOC        ns_t_nimloc | ||||
| #define T_SRV           ns_t_srv | ||||
| #define T_ATMA          ns_t_atma | ||||
| #define T_NAPTR         ns_t_naptr | ||||
| #define T_TSIG          ns_t_tsig | ||||
| #define T_IXFR          ns_t_ixfr | ||||
| #define T_AXFR          ns_t_axfr | ||||
| #define T_MAILB         ns_t_mailb | ||||
| #define T_MAILA         ns_t_maila | ||||
| #define T_ANY           ns_t_any | ||||
|  | ||||
| #ifndef __MINGW32__ | ||||
| /* protos for the functions we provide in windows_port.c */ | ||||
| int ares_strncasecmp(const char *s1, const char *s2, size_t n); | ||||
| int ares_strcasecmp(const char *s1, const char *s2); | ||||
|  | ||||
| /* use this define magic to prevent us from adding symbol names to the library | ||||
|    that is a high-risk to collide with another libraries' attempts to do the | ||||
|    same */ | ||||
| #define strncasecmp(a,b,c) ares_strncasecmp(a,b,c) | ||||
| #define strcasecmp(a,b) ares_strcasecmp(a,b) | ||||
| #endif | ||||
|  | ||||
| #endif /* ARES_NAMESER_H */ | ||||
							
								
								
									
										2
									
								
								ares/vc/adig/adig.dep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								ares/vc/adig/adig.dep
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| # Microsoft Developer Studio Generated Dependency File, included by adig.mak | ||||
|  | ||||
							
								
								
									
										106
									
								
								ares/vc/adig/adig.dsp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								ares/vc/adig/adig.dsp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| # Microsoft Developer Studio Project File - Name="adig" - Package Owner=<4> | ||||
| # Microsoft Developer Studio Generated Build File, Format Version 6.00 | ||||
| # ** DO NOT EDIT ** | ||||
|  | ||||
| # TARGTYPE "Win32 (x86) Console Application" 0x0103 | ||||
|  | ||||
| CFG=adig - 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 NMAKE /f "adig.mak". | ||||
| !MESSAGE  | ||||
| !MESSAGE You can specify a configuration when running NMAKE | ||||
| !MESSAGE by defining the macro CFG on the command line. For example: | ||||
| !MESSAGE  | ||||
| !MESSAGE NMAKE /f "adig.mak" CFG="adig - Win32 Debug" | ||||
| !MESSAGE  | ||||
| !MESSAGE Possible choices for configuration are: | ||||
| !MESSAGE  | ||||
| !MESSAGE "adig - Win32 Release" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE "adig - Win32 Debug" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE  | ||||
|  | ||||
| # Begin Project | ||||
| # PROP AllowPerConfigDependencies 0 | ||||
| # PROP Scc_ProjName "" | ||||
| # PROP Scc_LocalPath "" | ||||
| CPP=cl.exe | ||||
| RSC=rc.exe | ||||
|  | ||||
| !IF  "$(CFG)" == "adig - Win32 Release" | ||||
|  | ||||
| # PROP BASE Use_MFC 0 | ||||
| # PROP BASE Use_Debug_Libraries 0 | ||||
| # PROP BASE Output_Dir "Release" | ||||
| # PROP BASE Intermediate_Dir "Release" | ||||
| # PROP BASE Target_Dir "" | ||||
| # PROP Use_MFC 0 | ||||
| # PROP Use_Debug_Libraries 0 | ||||
| # PROP Output_Dir "Release" | ||||
| # PROP Intermediate_Dir "Release" | ||||
| # PROP Ignore_Export_Lib 0 | ||||
| # PROP Target_Dir "" | ||||
| # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c | ||||
| # ADD CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c | ||||
| # ADD BASE RSC /l 0x409 /d "NDEBUG" | ||||
| # ADD RSC /l 0x409 /d "NDEBUG" | ||||
| BSC32=bscmake.exe | ||||
| # ADD BASE BSC32 /nologo | ||||
| # ADD BSC32 /nologo | ||||
| LINK32=link.exe | ||||
| # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 | ||||
| # ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\areslib\Release" | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "adig - Win32 Debug" | ||||
|  | ||||
| # PROP BASE Use_MFC 0 | ||||
| # PROP BASE Use_Debug_Libraries 1 | ||||
| # PROP BASE Output_Dir "Debug" | ||||
| # PROP BASE Intermediate_Dir "Debug" | ||||
| # PROP BASE Target_Dir "" | ||||
| # PROP Use_MFC 0 | ||||
| # PROP Use_Debug_Libraries 1 | ||||
| # PROP Output_Dir "Debug" | ||||
| # PROP Intermediate_Dir "Debug" | ||||
| # PROP Ignore_Export_Lib 0 | ||||
| # PROP Target_Dir "" | ||||
| # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ  /c | ||||
| # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ  /c | ||||
| # ADD BASE RSC /l 0x409 /d "_DEBUG" | ||||
| # ADD RSC /l 0x409 /d "_DEBUG" | ||||
| BSC32=bscmake.exe | ||||
| # ADD BASE BSC32 /nologo | ||||
| # ADD BSC32 /nologo | ||||
| LINK32=link.exe | ||||
| # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||||
| # ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\areslib\Debug" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| # Begin Target | ||||
|  | ||||
| # Name "adig - Win32 Release" | ||||
| # Name "adig - Win32 Debug" | ||||
| # Begin Group "Source Files" | ||||
|  | ||||
| # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\adig.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\getopt.c | ||||
| # End Source File | ||||
| # End Group | ||||
| # Begin Group "Header Files" | ||||
|  | ||||
| # PROP Default_Filter "h;hpp;hxx;hm;inl" | ||||
| # End Group | ||||
| # Begin Group "Resource Files" | ||||
|  | ||||
| # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" | ||||
| # End Group | ||||
| # End Target | ||||
| # End Project | ||||
							
								
								
									
										213
									
								
								ares/vc/adig/adig.mak
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								ares/vc/adig/adig.mak
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,213 @@ | ||||
| # Microsoft Developer Studio Generated NMAKE File, Based on adig.dsp | ||||
| !IF "$(CFG)" == "" | ||||
| CFG=adig - Win32 Debug | ||||
| !MESSAGE No configuration specified. Defaulting to adig - Win32 Debug. | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(CFG)" != "adig - Win32 Release" && "$(CFG)" != "adig - Win32 Debug" | ||||
| !MESSAGE Invalid configuration "$(CFG)" specified. | ||||
| !MESSAGE You can specify a configuration when running NMAKE | ||||
| !MESSAGE by defining the macro CFG on the command line. For example: | ||||
| !MESSAGE  | ||||
| !MESSAGE NMAKE /f "adig.mak" CFG="adig - Win32 Debug" | ||||
| !MESSAGE  | ||||
| !MESSAGE Possible choices for configuration are: | ||||
| !MESSAGE  | ||||
| !MESSAGE "adig - Win32 Release" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE "adig - Win32 Debug" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE  | ||||
| !ERROR An invalid configuration is specified. | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(OS)" == "Windows_NT" | ||||
| NULL= | ||||
| !ELSE  | ||||
| NULL=nul | ||||
| !ENDIF  | ||||
|  | ||||
| CPP=cl.exe | ||||
| RSC=rc.exe | ||||
|  | ||||
| !IF  "$(CFG)" == "adig - Win32 Release" | ||||
|  | ||||
| OUTDIR=.\Release | ||||
| INTDIR=.\Release | ||||
| # Begin Custom Macros | ||||
| OutDir=.\Release | ||||
| # End Custom Macros | ||||
|  | ||||
| !IF "$(RECURSE)" == "0"  | ||||
|  | ||||
| ALL : "$(OUTDIR)\adig.exe" | ||||
|  | ||||
| !ELSE  | ||||
|  | ||||
| ALL : "areslib - Win32 Release" "$(OUTDIR)\adig.exe" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(RECURSE)" == "1"  | ||||
| CLEAN :"areslib - Win32 ReleaseCLEAN"  | ||||
| !ELSE  | ||||
| CLEAN : | ||||
| !ENDIF  | ||||
| 	-@erase "$(INTDIR)\adig.obj" | ||||
| 	-@erase "$(INTDIR)\getopt.obj" | ||||
| 	-@erase "$(INTDIR)\vc60.idb" | ||||
| 	-@erase "$(OUTDIR)\adig.exe" | ||||
|  | ||||
| "$(OUTDIR)" : | ||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||
|  | ||||
| CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\adig.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c  | ||||
| BSC32=bscmake.exe | ||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\adig.bsc"  | ||||
| BSC32_SBRS= \ | ||||
| 	 | ||||
| LINK32=link.exe | ||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\adig.pdb" /machine:I386 /out:"$(OUTDIR)\adig.exe" /libpath:"..\areslib\Release"  | ||||
| LINK32_OBJS= \ | ||||
| 	"$(INTDIR)\adig.obj" \ | ||||
| 	"$(INTDIR)\getopt.obj" \ | ||||
| 	"..\areslib\Release\areslib.lib" | ||||
|  | ||||
| "$(OUTDIR)\adig.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) | ||||
|     $(LINK32) @<< | ||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) | ||||
| << | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "adig - Win32 Debug" | ||||
|  | ||||
| OUTDIR=.\Debug | ||||
| INTDIR=.\Debug | ||||
| # Begin Custom Macros | ||||
| OutDir=.\Debug | ||||
| # End Custom Macros | ||||
|  | ||||
| !IF "$(RECURSE)" == "0"  | ||||
|  | ||||
| ALL : "$(OUTDIR)\adig.exe" | ||||
|  | ||||
| !ELSE  | ||||
|  | ||||
| ALL : "areslib - Win32 Debug" "$(OUTDIR)\adig.exe" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(RECURSE)" == "1"  | ||||
| CLEAN :"areslib - Win32 DebugCLEAN"  | ||||
| !ELSE  | ||||
| CLEAN : | ||||
| !ENDIF  | ||||
| 	-@erase "$(INTDIR)\adig.obj" | ||||
| 	-@erase "$(INTDIR)\getopt.obj" | ||||
| 	-@erase "$(INTDIR)\vc60.idb" | ||||
| 	-@erase "$(INTDIR)\vc60.pdb" | ||||
| 	-@erase "$(OUTDIR)\adig.exe" | ||||
| 	-@erase "$(OUTDIR)\adig.ilk" | ||||
| 	-@erase "$(OUTDIR)\adig.pdb" | ||||
|  | ||||
| "$(OUTDIR)" : | ||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||
|  | ||||
| CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\adig.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ  /c  | ||||
| BSC32=bscmake.exe | ||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\adig.bsc"  | ||||
| BSC32_SBRS= \ | ||||
| 	 | ||||
| LINK32=link.exe | ||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\adig.pdb" /debug /machine:I386 /out:"$(OUTDIR)\adig.exe" /pdbtype:sept /libpath:"..\areslib\Debug"  | ||||
| LINK32_OBJS= \ | ||||
| 	"$(INTDIR)\adig.obj" \ | ||||
| 	"$(INTDIR)\getopt.obj" \ | ||||
| 	"..\areslib\Debug\areslib.lib" | ||||
|  | ||||
| "$(OUTDIR)\adig.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) | ||||
|     $(LINK32) @<< | ||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) | ||||
| << | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| .c{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cpp{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cxx{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .c{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cpp{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cxx{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
|  | ||||
| !IF "$(NO_EXTERNAL_DEPS)" != "1" | ||||
| !IF EXISTS("adig.dep") | ||||
| !INCLUDE "adig.dep" | ||||
| !ELSE  | ||||
| !MESSAGE Warning: cannot find "adig.dep" | ||||
| !ENDIF  | ||||
| !ENDIF  | ||||
|  | ||||
|  | ||||
| !IF "$(CFG)" == "adig - Win32 Release" || "$(CFG)" == "adig - Win32 Debug" | ||||
| SOURCE=..\..\adig.c | ||||
|  | ||||
| "$(INTDIR)\adig.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\getopt.c | ||||
|  | ||||
| "$(INTDIR)\getopt.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| !IF  "$(CFG)" == "adig - Win32 Release" | ||||
|  | ||||
| "areslib - Win32 Release" :  | ||||
|    cd "\ARES-1.1.1\vc\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"  | ||||
|    cd "..\adig" | ||||
|  | ||||
| "areslib - Win32 ReleaseCLEAN" :  | ||||
|    cd "\ARES-1.1.1\vc\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN  | ||||
|    cd "..\adig" | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "adig - Win32 Debug" | ||||
|  | ||||
| "areslib - Win32 Debug" :  | ||||
|    cd "\ARES-1.1.1\vc\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"  | ||||
|    cd "..\adig" | ||||
|  | ||||
| "areslib - Win32 DebugCLEAN" :  | ||||
|    cd "\ARES-1.1.1\vc\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN  | ||||
|    cd "..\adig" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
							
								
								
									
										77
									
								
								ares/vc/adig/adig.plg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								ares/vc/adig/adig.plg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| <html> | ||||
| <body> | ||||
| <pre> | ||||
| <h1>Build Log</h1> | ||||
| <h3> | ||||
| --------------------Configuration: areslib - Win32 Release-------------------- | ||||
| </h3> | ||||
| <h3>Command Lines</h3> | ||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615A.tmp" with contents | ||||
| [ | ||||
| /nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"Release/areslib.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c  | ||||
| "Z:\ARES-1.1.1\ares_gethostbyname.c" | ||||
| "Z:\ARES-1.1.1\ares_init.c" | ||||
| ] | ||||
| Creating command line "cl.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615A.tmp"  | ||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615B.tmp" with contents | ||||
| [ | ||||
| /nologo /out:"Release\areslib.lib"  | ||||
| ".\Release\ares__close_sockets.obj" | ||||
| ".\Release\ares__get_hostent.obj" | ||||
| ".\Release\ares__read_line.obj" | ||||
| ".\Release\ares_destroy.obj" | ||||
| ".\Release\ares_expand_name.obj" | ||||
| ".\Release\ares_fds.obj" | ||||
| ".\Release\ares_free_errmem.obj" | ||||
| ".\Release\ares_free_hostent.obj" | ||||
| ".\Release\ares_free_string.obj" | ||||
| ".\Release\ares_gethostbyaddr.obj" | ||||
| ".\Release\ares_gethostbyname.obj" | ||||
| ".\Release\ares_init.obj" | ||||
| ".\Release\ares_mkquery.obj" | ||||
| ".\Release\ares_parse_a_reply.obj" | ||||
| ".\Release\ares_parse_ptr_reply.obj" | ||||
| ".\Release\ares_process.obj" | ||||
| ".\Release\ares_query.obj" | ||||
| ".\Release\ares_search.obj" | ||||
| ".\Release\ares_send.obj" | ||||
| ".\Release\ares_strerror.obj" | ||||
| ".\Release\ares_timeout.obj" | ||||
| ".\Release\windows_port.obj" | ||||
| ] | ||||
| Creating command line "link.exe -lib @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615B.tmp" | ||||
| <h3>Output Window</h3> | ||||
| Compiling... | ||||
| ares_gethostbyname.c | ||||
| Z:\ARES-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_init.c | ||||
| Z:\ARES-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| Z:\ARES-1.1.1\ares_init.c(141) : warning C4013: '_getpid' undefined; assuming extern returning int | ||||
| Z:\ARES-1.1.1\ares_init.c(236) : warning C4101: 'p' : unreferenced local variable | ||||
| Z:\ARES-1.1.1\ares_init.c(237) : warning C4101: 'linesize' : unreferenced local variable | ||||
| Z:\ARES-1.1.1\ares_init.c(235) : warning C4101: 'fp' : unreferenced local variable | ||||
| Creating library... | ||||
| <h3> | ||||
| --------------------Configuration: adig - Win32 Release-------------------- | ||||
| </h3> | ||||
| <h3>Command Lines</h3> | ||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615C.tmp" with contents | ||||
| [ | ||||
| wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"Release/adig.pdb" /machine:I386 /out:"Release/adig.exe" /libpath:"..\areslib\Release"  | ||||
| ".\Release\adig.obj" | ||||
| ".\Release\getopt.obj" | ||||
| "\ARES-1.1.1\vc\areslib\Release\areslib.lib" | ||||
| ] | ||||
| Creating command line "link.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615C.tmp" | ||||
| <h3>Output Window</h3> | ||||
| Linking... | ||||
|  | ||||
|  | ||||
|  | ||||
| <h3>Results</h3> | ||||
| adig.exe - 0 error(s), 6 warning(s) | ||||
| </pre> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										2
									
								
								ares/vc/ahost/ahost.dep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								ares/vc/ahost/ahost.dep
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| # Microsoft Developer Studio Generated Dependency File, included by ahost.mak | ||||
|  | ||||
							
								
								
									
										100
									
								
								ares/vc/ahost/ahost.dsp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								ares/vc/ahost/ahost.dsp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| # Microsoft Developer Studio Project File - Name="ahost" - Package Owner=<4> | ||||
| # Microsoft Developer Studio Generated Build File, Format Version 6.00 | ||||
| # ** DO NOT EDIT ** | ||||
|  | ||||
| # TARGTYPE "Win32 (x86) Console Application" 0x0103 | ||||
|  | ||||
| CFG=ahost - 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 NMAKE /f "ahost.mak". | ||||
| !MESSAGE  | ||||
| !MESSAGE You can specify a configuration when running NMAKE | ||||
| !MESSAGE by defining the macro CFG on the command line. For example: | ||||
| !MESSAGE  | ||||
| !MESSAGE NMAKE /f "ahost.mak" CFG="ahost - Win32 Debug" | ||||
| !MESSAGE  | ||||
| !MESSAGE Possible choices for configuration are: | ||||
| !MESSAGE  | ||||
| !MESSAGE "ahost - Win32 Release" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE "ahost - Win32 Debug" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE  | ||||
|  | ||||
| # Begin Project | ||||
| # PROP AllowPerConfigDependencies 0 | ||||
| # PROP Scc_ProjName "" | ||||
| # PROP Scc_LocalPath "" | ||||
| CPP=cl.exe | ||||
| RSC=rc.exe | ||||
|  | ||||
| !IF  "$(CFG)" == "ahost - Win32 Release" | ||||
|  | ||||
| # PROP BASE Use_MFC 0 | ||||
| # PROP BASE Use_Debug_Libraries 0 | ||||
| # PROP BASE Output_Dir "Release" | ||||
| # PROP BASE Intermediate_Dir "Release" | ||||
| # PROP BASE Target_Dir "" | ||||
| # PROP Use_MFC 0 | ||||
| # PROP Use_Debug_Libraries 0 | ||||
| # PROP Output_Dir "Release" | ||||
| # PROP Intermediate_Dir "Release" | ||||
| # PROP Target_Dir "" | ||||
| # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c | ||||
| # ADD CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c | ||||
| # ADD BASE RSC /l 0x409 /d "NDEBUG" | ||||
| # ADD RSC /l 0x409 /d "NDEBUG" | ||||
| BSC32=bscmake.exe | ||||
| # ADD BASE BSC32 /nologo | ||||
| # ADD BSC32 /nologo | ||||
| LINK32=link.exe | ||||
| # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 | ||||
| # ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\areslib\Release" | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" | ||||
|  | ||||
| # PROP BASE Use_MFC 0 | ||||
| # PROP BASE Use_Debug_Libraries 1 | ||||
| # PROP BASE Output_Dir "Debug" | ||||
| # PROP BASE Intermediate_Dir "Debug" | ||||
| # PROP BASE Target_Dir "" | ||||
| # PROP Use_MFC 0 | ||||
| # PROP Use_Debug_Libraries 1 | ||||
| # PROP Output_Dir "Debug" | ||||
| # PROP Intermediate_Dir "Debug" | ||||
| # PROP Target_Dir "" | ||||
| # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ  /c | ||||
| # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ  /c | ||||
| # ADD BASE RSC /l 0x409 /d "_DEBUG" | ||||
| # ADD RSC /l 0x409 /d "_DEBUG" | ||||
| BSC32=bscmake.exe | ||||
| # ADD BASE BSC32 /nologo | ||||
| # ADD BSC32 /nologo | ||||
| LINK32=link.exe | ||||
| # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||||
| # ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\areslib\Debug" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| # Begin Target | ||||
|  | ||||
| # Name "ahost - Win32 Release" | ||||
| # Name "ahost - Win32 Debug" | ||||
| # Begin Group "Source Files" | ||||
|  | ||||
| # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ahost.c | ||||
| # End Source File | ||||
| # End Group | ||||
| # Begin Group "Header Files" | ||||
|  | ||||
| # PROP Default_Filter "h;hpp;hxx;hm;inl" | ||||
| # End Group | ||||
| # Begin Group "Resource Files" | ||||
|  | ||||
| # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" | ||||
| # End Group | ||||
| # End Target | ||||
| # End Project | ||||
							
								
								
									
										223
									
								
								ares/vc/ahost/ahost.mak
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								ares/vc/ahost/ahost.mak
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,223 @@ | ||||
| # Microsoft Developer Studio Generated NMAKE File, Based on ahost.dsp | ||||
| !IF "$(CFG)" == "" | ||||
| CFG=ahost - Win32 Debug | ||||
| !MESSAGE No configuration specified. Defaulting to ahost - Win32 Debug. | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(CFG)" != "ahost - Win32 Release" && "$(CFG)" != "ahost - Win32 Debug" | ||||
| !MESSAGE Invalid configuration "$(CFG)" specified. | ||||
| !MESSAGE You can specify a configuration when running NMAKE | ||||
| !MESSAGE by defining the macro CFG on the command line. For example: | ||||
| !MESSAGE  | ||||
| !MESSAGE NMAKE /f "ahost.mak" CFG="ahost - Win32 Debug" | ||||
| !MESSAGE  | ||||
| !MESSAGE Possible choices for configuration are: | ||||
| !MESSAGE  | ||||
| !MESSAGE "ahost - Win32 Release" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE "ahost - Win32 Debug" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE  | ||||
| !ERROR An invalid configuration is specified. | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(OS)" == "Windows_NT" | ||||
| NULL= | ||||
| !ELSE  | ||||
| NULL=nul | ||||
| !ENDIF  | ||||
|  | ||||
| CPP=cl.exe | ||||
| RSC=rc.exe | ||||
|  | ||||
| !IF  "$(CFG)" == "ahost - Win32 Release" | ||||
|  | ||||
| OUTDIR=.\Release | ||||
| INTDIR=.\Release | ||||
| # Begin Custom Macros | ||||
| OutDir=.\Release | ||||
| # End Custom Macros | ||||
|  | ||||
| !IF "$(RECURSE)" == "0"  | ||||
|  | ||||
| ALL : "$(OUTDIR)\ahost.exe" | ||||
|  | ||||
| !ELSE  | ||||
|  | ||||
| ALL : "areslib - Win32 Release" "$(OUTDIR)\ahost.exe" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(RECURSE)" == "1"  | ||||
| CLEAN :"areslib - Win32 ReleaseCLEAN"  | ||||
| !ELSE  | ||||
| CLEAN : | ||||
| !ENDIF  | ||||
| 	-@erase "$(INTDIR)\ahost.obj" | ||||
| 	-@erase "$(INTDIR)\vc60.idb" | ||||
| 	-@erase "$(OUTDIR)\ahost.exe" | ||||
|  | ||||
| "$(OUTDIR)" : | ||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||
|  | ||||
| CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\ahost.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c  | ||||
| BSC32=bscmake.exe | ||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\ahost.bsc"  | ||||
| BSC32_SBRS= \ | ||||
| 	 | ||||
| LINK32=link.exe | ||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\ahost.pdb" /machine:I386 /out:"$(OUTDIR)\ahost.exe" /libpath:"..\areslib\Release"  | ||||
| LINK32_OBJS= \ | ||||
| 	"$(INTDIR)\ahost.obj" \ | ||||
| 	"..\areslib\Release\areslib.lib" | ||||
|  | ||||
| "$(OUTDIR)\ahost.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) | ||||
|     $(LINK32) @<< | ||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) | ||||
| << | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" | ||||
|  | ||||
| OUTDIR=.\Debug | ||||
| INTDIR=.\Debug | ||||
| # Begin Custom Macros | ||||
| OutDir=.\Debug | ||||
| # End Custom Macros | ||||
|  | ||||
| !IF "$(RECURSE)" == "0"  | ||||
|  | ||||
| ALL : "$(OUTDIR)\ahost.exe" "$(OUTDIR)\ahost.bsc" | ||||
|  | ||||
| !ELSE  | ||||
|  | ||||
| ALL : "areslib - Win32 Debug" "$(OUTDIR)\ahost.exe" "$(OUTDIR)\ahost.bsc" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(RECURSE)" == "1"  | ||||
| CLEAN :"areslib - Win32 DebugCLEAN"  | ||||
| !ELSE  | ||||
| CLEAN : | ||||
| !ENDIF  | ||||
| 	-@erase "$(INTDIR)\ahost.obj" | ||||
| 	-@erase "$(INTDIR)\ahost.sbr" | ||||
| 	-@erase "$(INTDIR)\vc60.idb" | ||||
| 	-@erase "$(INTDIR)\vc60.pdb" | ||||
| 	-@erase "$(OUTDIR)\ahost.bsc" | ||||
| 	-@erase "$(OUTDIR)\ahost.exe" | ||||
| 	-@erase "$(OUTDIR)\ahost.ilk" | ||||
| 	-@erase "$(OUTDIR)\ahost.pdb" | ||||
|  | ||||
| "$(OUTDIR)" : | ||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||
|  | ||||
| CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fp"$(INTDIR)\ahost.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ  /c  | ||||
| BSC32=bscmake.exe | ||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\ahost.bsc"  | ||||
| BSC32_SBRS= \ | ||||
| 	"$(INTDIR)\ahost.sbr" | ||||
|  | ||||
| "$(OUTDIR)\ahost.bsc" : "$(OUTDIR)" $(BSC32_SBRS) | ||||
|     $(BSC32) @<< | ||||
|   $(BSC32_FLAGS) $(BSC32_SBRS) | ||||
| << | ||||
|  | ||||
| LINK32=link.exe | ||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\ahost.pdb" /debug /machine:I386 /out:"$(OUTDIR)\ahost.exe" /pdbtype:sept /libpath:"..\areslib\Debug"  | ||||
| LINK32_OBJS= \ | ||||
| 	"$(INTDIR)\ahost.obj" \ | ||||
| 	"..\areslib\Debug\areslib.lib" | ||||
|  | ||||
| "$(OUTDIR)\ahost.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) | ||||
|     $(LINK32) @<< | ||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) | ||||
| << | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| .c{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cpp{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cxx{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .c{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cpp{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cxx{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
|  | ||||
| !IF "$(NO_EXTERNAL_DEPS)" != "1" | ||||
| !IF EXISTS("ahost.dep") | ||||
| !INCLUDE "ahost.dep" | ||||
| !ELSE  | ||||
| !MESSAGE Warning: cannot find "ahost.dep" | ||||
| !ENDIF  | ||||
| !ENDIF  | ||||
|  | ||||
|  | ||||
| !IF "$(CFG)" == "ahost - Win32 Release" || "$(CFG)" == "ahost - Win32 Debug" | ||||
| SOURCE=..\..\ahost.c | ||||
|  | ||||
| !IF  "$(CFG)" == "ahost - Win32 Release" | ||||
|  | ||||
|  | ||||
| "$(INTDIR)\ahost.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" | ||||
|  | ||||
|  | ||||
| "$(INTDIR)\ahost.obj"	"$(INTDIR)\ahost.sbr" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| !IF  "$(CFG)" == "ahost - Win32 Release" | ||||
|  | ||||
| "areslib - Win32 Release" :  | ||||
|    cd "\ARES-1.1.1\vc\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"  | ||||
|    cd "..\ahost" | ||||
|  | ||||
| "areslib - Win32 ReleaseCLEAN" :  | ||||
|    cd "\ARES-1.1.1\vc\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN  | ||||
|    cd "..\ahost" | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" | ||||
|  | ||||
| "areslib - Win32 Debug" :  | ||||
|    cd "\ARES-1.1.1\vc\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"  | ||||
|    cd "..\ahost" | ||||
|  | ||||
| "areslib - Win32 DebugCLEAN" :  | ||||
|    cd "\ARES-1.1.1\vc\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN  | ||||
|    cd "..\ahost" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
							
								
								
									
										16
									
								
								ares/vc/ahost/ahost.plg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								ares/vc/ahost/ahost.plg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| <html> | ||||
| <body> | ||||
| <pre> | ||||
| <h1>Build Log</h1> | ||||
| <h3> | ||||
| --------------------Configuration: ahost - Win32 Release-------------------- | ||||
| </h3> | ||||
| <h3>Command Lines</h3> | ||||
|  | ||||
|  | ||||
|  | ||||
| <h3>Results</h3> | ||||
| ahost.exe - 0 error(s), 0 warning(s) | ||||
| </pre> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										2
									
								
								ares/vc/areslib/areslib.dep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								ares/vc/areslib/areslib.dep
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| # Microsoft Developer Studio Generated Dependency File, included by areslib.mak | ||||
|  | ||||
							
								
								
									
										196
									
								
								ares/vc/areslib/areslib.dsp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								ares/vc/areslib/areslib.dsp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,196 @@ | ||||
| # Microsoft Developer Studio Project File - Name="areslib" - Package Owner=<4> | ||||
| # Microsoft Developer Studio Generated Build File, Format Version 6.00 | ||||
| # ** DO NOT EDIT ** | ||||
|  | ||||
| # TARGTYPE "Win32 (x86) Static Library" 0x0104 | ||||
|  | ||||
| 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 NMAKE /f "areslib.mak". | ||||
| !MESSAGE  | ||||
| !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  | ||||
|  | ||||
| # Begin Project | ||||
| # PROP AllowPerConfigDependencies 0 | ||||
| # PROP Scc_ProjName "" | ||||
| # PROP Scc_LocalPath "" | ||||
| CPP=cl.exe | ||||
| RSC=rc.exe | ||||
|  | ||||
| !IF  "$(CFG)" == "areslib - Win32 Release" | ||||
|  | ||||
| # PROP BASE Use_MFC 0 | ||||
| # PROP BASE Use_Debug_Libraries 0 | ||||
| # PROP BASE Output_Dir "Release" | ||||
| # PROP BASE Intermediate_Dir "Release" | ||||
| # PROP BASE Target_Dir "" | ||||
| # PROP Use_MFC 0 | ||||
| # PROP Use_Debug_Libraries 0 | ||||
| # PROP Output_Dir "Release" | ||||
| # PROP Intermediate_Dir "Release" | ||||
| # PROP Target_Dir "" | ||||
| # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c | ||||
| # ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c | ||||
| # ADD BASE RSC /l 0x409 /d "NDEBUG" | ||||
| # ADD RSC /l 0x409 /d "NDEBUG" | ||||
| BSC32=bscmake.exe | ||||
| # ADD BASE BSC32 /nologo | ||||
| # ADD BSC32 /nologo | ||||
| LIB32=link.exe -lib | ||||
| # ADD BASE LIB32 /nologo | ||||
| # ADD LIB32 /nologo | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "areslib - Win32 Debug" | ||||
|  | ||||
| # PROP BASE Use_MFC 0 | ||||
| # PROP BASE Use_Debug_Libraries 1 | ||||
| # PROP BASE Output_Dir "Debug" | ||||
| # PROP BASE Intermediate_Dir "Debug" | ||||
| # PROP BASE Target_Dir "" | ||||
| # PROP Use_MFC 0 | ||||
| # PROP Use_Debug_Libraries 1 | ||||
| # PROP Output_Dir "Debug" | ||||
| # PROP Intermediate_Dir "Debug" | ||||
| # PROP Target_Dir "" | ||||
| # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ  /c | ||||
| # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ  /c | ||||
| # ADD BASE RSC /l 0x409 /d "_DEBUG" | ||||
| # ADD RSC /l 0x409 /d "_DEBUG" | ||||
| BSC32=bscmake.exe | ||||
| # ADD BASE BSC32 /nologo | ||||
| # ADD BSC32 /nologo | ||||
| LIB32=link.exe -lib | ||||
| # ADD BASE LIB32 /nologo | ||||
| # ADD LIB32 /nologo | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| # Begin Target | ||||
|  | ||||
| # Name "areslib - Win32 Release" | ||||
| # Name "areslib - Win32 Debug" | ||||
| # Begin Group "Source Files" | ||||
|  | ||||
| # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares__close_sockets.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares__get_hostent.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares__read_line.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_destroy.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_expand_name.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| 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 | ||||
|  | ||||
| SOURCE=..\..\ares_free_string.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_gethostbyaddr.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_gethostbyname.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_init.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_mkquery.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_parse_a_reply.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_parse_ptr_reply.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_process.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_query.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_search.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_send.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_strerror.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_timeout.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\windows_port.c | ||||
| # End Source File | ||||
| # End Group | ||||
| # Begin Group "Header Files" | ||||
|  | ||||
| # PROP Default_Filter "h;hpp;hxx;hm;inl" | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares.h | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_dns.h | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_private.h | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\nameser.h | ||||
| # End Source File | ||||
| # End Group | ||||
| # End Target | ||||
| # End Project | ||||
							
								
								
									
										361
									
								
								ares/vc/areslib/areslib.mak
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										361
									
								
								ares/vc/areslib/areslib.mak
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,361 @@ | ||||
| # 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  | ||||
|  | ||||
							
								
								
									
										125
									
								
								ares/vc/areslib/areslib.plg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								ares/vc/areslib/areslib.plg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| <html> | ||||
| <body> | ||||
| <pre> | ||||
| <h1>Build Log</h1> | ||||
| <h3> | ||||
| --------------------Configuration: areslib - Win32 Release-------------------- | ||||
| </h3> | ||||
| <h3>Command Lines</h3> | ||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603D.tmp" with contents | ||||
| [ | ||||
| /nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"Release/areslib.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c  | ||||
| "Z:\ares-1.1.1\ares__close_sockets.c" | ||||
| "Z:\ares-1.1.1\ares__get_hostent.c" | ||||
| "Z:\ares-1.1.1\ares__read_line.c" | ||||
| "Z:\ares-1.1.1\ares_destroy.c" | ||||
| "Z:\ares-1.1.1\ares_expand_name.c" | ||||
| "Z:\ares-1.1.1\ares_fds.c" | ||||
| "Z:\ares-1.1.1\ares_free_errmem.c" | ||||
| "Z:\ares-1.1.1\ares_free_hostent.c" | ||||
| "Z:\ares-1.1.1\ares_free_string.c" | ||||
| "Z:\ares-1.1.1\ares_gethostbyaddr.c" | ||||
| "Z:\ares-1.1.1\ares_gethostbyname.c" | ||||
| "Z:\ares-1.1.1\ares_init.c" | ||||
| "Z:\ares-1.1.1\ares_mkquery.c" | ||||
| "Z:\ares-1.1.1\ares_parse_a_reply.c" | ||||
| "Z:\ares-1.1.1\ares_parse_ptr_reply.c" | ||||
| "Z:\ares-1.1.1\ares_process.c" | ||||
| "Z:\ares-1.1.1\ares_query.c" | ||||
| "Z:\ares-1.1.1\ares_search.c" | ||||
| "Z:\ares-1.1.1\ares_send.c" | ||||
| "Z:\ares-1.1.1\ares_strerror.c" | ||||
| "Z:\ares-1.1.1\ares_timeout.c" | ||||
| "Z:\ares-1.1.1\windows_port.c" | ||||
| ] | ||||
| Creating command line "cl.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603D.tmp"  | ||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603E.tmp" with contents | ||||
| [ | ||||
| /nologo /out:"Release\areslib.lib"  | ||||
| ".\Release\ares__close_sockets.obj" | ||||
| ".\Release\ares__get_hostent.obj" | ||||
| ".\Release\ares__read_line.obj" | ||||
| ".\Release\ares_destroy.obj" | ||||
| ".\Release\ares_expand_name.obj" | ||||
| ".\Release\ares_fds.obj" | ||||
| ".\Release\ares_free_errmem.obj" | ||||
| ".\Release\ares_free_hostent.obj" | ||||
| ".\Release\ares_free_string.obj" | ||||
| ".\Release\ares_gethostbyaddr.obj" | ||||
| ".\Release\ares_gethostbyname.obj" | ||||
| ".\Release\ares_init.obj" | ||||
| ".\Release\ares_mkquery.obj" | ||||
| ".\Release\ares_parse_a_reply.obj" | ||||
| ".\Release\ares_parse_ptr_reply.obj" | ||||
| ".\Release\ares_process.obj" | ||||
| ".\Release\ares_query.obj" | ||||
| ".\Release\ares_search.obj" | ||||
| ".\Release\ares_send.obj" | ||||
| ".\Release\ares_strerror.obj" | ||||
| ".\Release\ares_timeout.obj" | ||||
| ".\Release\windows_port.obj" | ||||
| ] | ||||
| Creating command line "link.exe -lib @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603E.tmp" | ||||
| <h3>Output Window</h3> | ||||
| Compiling... | ||||
| ares__close_sockets.c | ||||
| Z:\ares-1.1.1\ares__close_sockets.c(46) : warning C4013: 'close' undefined; assuming extern returning int | ||||
| ares__get_hostent.c | ||||
| ares__read_line.c | ||||
| ares_destroy.c | ||||
| ares_expand_name.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_fds.c | ||||
| ares_free_errmem.c | ||||
| ares_free_hostent.c | ||||
| ares_free_string.c | ||||
| ares_gethostbyaddr.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_gethostbyname.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_init.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| Z:\ares-1.1.1\ares_init.c(141) : warning C4013: '_getpid' undefined; assuming extern returning int | ||||
| Z:\ares-1.1.1\ares_init.c(236) : warning C4101: 'p' : unreferenced local variable | ||||
| Z:\ares-1.1.1\ares_init.c(237) : warning C4101: 'linesize' : unreferenced local variable | ||||
| Z:\ares-1.1.1\ares_init.c(235) : warning C4101: 'fp' : unreferenced local variable | ||||
| ares_mkquery.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_parse_a_reply.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| Z:\ares-1.1.1\ares_parse_a_reply.c(90) : warning C4018: '<' : signed/unsigned mismatch | ||||
| ares_parse_ptr_reply.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| Z:\ares-1.1.1\ares_parse_ptr_reply.c(71) : warning C4018: '<' : signed/unsigned mismatch | ||||
| ares_process.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_query.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_search.c | ||||
| Z:\ares-1.1.1\ares_search.c(229) : warning C4013: 'strncasecmp' undefined; assuming extern returning int | ||||
| ares_send.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_strerror.c | ||||
| ares_timeout.c | ||||
| windows_port.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| Creating library... | ||||
|  | ||||
|  | ||||
|  | ||||
| <h3>Results</h3> | ||||
| areslib.lib - 0 error(s), 19 warning(s) | ||||
| </pre> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										59
									
								
								ares/vc/vc.dsw
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								ares/vc/vc.dsw
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| Microsoft Developer Studio Workspace File, Format Version 6.00 | ||||
| # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! | ||||
|  | ||||
| ############################################################################### | ||||
|  | ||||
| Project: "adig"=".\adig\adig.dsp" - Package Owner=<4> | ||||
|  | ||||
| Package=<5> | ||||
| {{{ | ||||
| }}} | ||||
|  | ||||
| Package=<4> | ||||
| {{{ | ||||
|     Begin Project Dependency | ||||
|     Project_Dep_Name areslib | ||||
|     End Project Dependency | ||||
| }}} | ||||
|  | ||||
| ############################################################################### | ||||
|  | ||||
| Project: "ahost"=".\ahost\ahost.dsp" - Package Owner=<4> | ||||
|  | ||||
| Package=<5> | ||||
| {{{ | ||||
| }}} | ||||
|  | ||||
| Package=<4> | ||||
| {{{ | ||||
|     Begin Project Dependency | ||||
|     Project_Dep_Name areslib | ||||
|     End Project Dependency | ||||
| }}} | ||||
|  | ||||
| ############################################################################### | ||||
|  | ||||
| Project: "areslib"=".\areslib\areslib.dsp" - Package Owner=<4> | ||||
|  | ||||
| Package=<5> | ||||
| {{{ | ||||
| }}} | ||||
|  | ||||
| Package=<4> | ||||
| {{{ | ||||
| }}} | ||||
|  | ||||
| ############################################################################### | ||||
|  | ||||
| Global: | ||||
|  | ||||
| Package=<5> | ||||
| {{{ | ||||
| }}} | ||||
|  | ||||
| Package=<3> | ||||
| {{{ | ||||
| }}} | ||||
|  | ||||
| ############################################################################### | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								ares/vc/vc.ncb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								ares/vc/vc.ncb
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								ares/vc/vc.opt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								ares/vc/vc.opt
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										63
									
								
								ares/windows_port.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								ares/windows_port.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <ctype.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "nameser.h" | ||||
|  | ||||
| #ifndef __MINGW32__ | ||||
| int | ||||
| ares_strncasecmp(const char *a, const char *b, size_t n) | ||||
| { | ||||
|     size_t i; | ||||
|  | ||||
|     for (i = 0; i < n; i++) { | ||||
|         int c1 = isupper(a[i]) ? tolower(a[i]) : a[i]; | ||||
|         int c2 = isupper(b[i]) ? tolower(b[i]) : b[i]; | ||||
|         if (c1 != c2) return c1-c2; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| 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)  | ||||
| { | ||||
|     FILETIME        ft; | ||||
|     LARGE_INTEGER   li; | ||||
|     __int64         t; | ||||
|     static int      tzflag; | ||||
|  | ||||
|     if (tv) | ||||
|     { | ||||
|         GetSystemTimeAsFileTime(&ft); | ||||
|         li.LowPart  = ft.dwLowDateTime; | ||||
|         li.HighPart = ft.dwHighDateTime; | ||||
|         t  = li.QuadPart;       /* In 100-nanosecond intervals */ | ||||
|         //t -= EPOCHFILETIME;     /* Offset to the Epoch time */ | ||||
|         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; | ||||
| } | ||||
| @@ -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 | ||||
							
								
								
									
										76
									
								
								buildconf
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								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 | ||||
| # | ||||
| @@ -63,7 +78,7 @@ if test "$1" = "1" -a "$2" -lt "7" || test "$1" -lt "1"; then | ||||
|   echo "buildconf: automake version $am_version found." | ||||
|   echo "            You need automake version $need_automake or newer installed." | ||||
|   echo "            If you have a sufficient automake installed, but it" | ||||
|   echo "            is not named 'autommake', then try setting the" | ||||
|   echo "            is not named 'automake', then try setting the" | ||||
|   echo "            AUTOMAKE environment variable." | ||||
|   exit 1 | ||||
| fi | ||||
| @@ -79,28 +94,39 @@ 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]* *$//'` | ||||
| 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." | ||||
|   echo "            You need libtool version $LIBTOOL_WANTED_VERSION or newer installed" | ||||
|   exit 1 | ||||
| fi | ||||
| lt_version=`echo $lt_pversion` #|sed -e 's/\([a-z]*\)$/.\1/'` | ||||
| lt_version=`echo $lt_pversion|sed -e 's/\([a-z]*\)$//'` | ||||
| IFS=.; set $lt_version; IFS=' ' | ||||
| lt_status="good" | ||||
| if test "$1" = "$LIBTOOL_WANTED_MAJOR"; then | ||||
|    if test "$2" -lt "$LIBTOOL_WANTED_MINOR"; then | ||||
|  | ||||
| major=$1 | ||||
| minor=$2 | ||||
| patch=$3 | ||||
|  | ||||
| if test "$major" = "$LIBTOOL_WANTED_MAJOR"; then | ||||
|    if test "$minor" -lt "$LIBTOOL_WANTED_MINOR"; then | ||||
|       lt_status="bad" | ||||
|    elif test ! -z "$LIBTOOL_WANTED_PATCH"; then | ||||
|        if test -n "$3"; then | ||||
|           if test "$3" -lt "$LIBTOOL_WANTED_PATCH"; then | ||||
|    elif test -n "$LIBTOOL_WANTED_PATCH"; then | ||||
|        if test "$minor" -gt "$LIBTOOL_WANTED_MINOR"; then | ||||
|          lt_status="good" | ||||
|        elif test -n "$patch"; then | ||||
|           if test "$patch" -lt "$LIBTOOL_WANTED_PATCH"; then | ||||
|              lt_status="bad" | ||||
|           fi | ||||
|        else | ||||
|           lt_status="bad" | ||||
|        fi | ||||
|    fi | ||||
| fi | ||||
| @@ -112,18 +138,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 command '${LIBTOOLIZE:-libtoolize}  --copy --automake --force' failed" | ||||
| echo "buildconf: running aclocal" | ||||
| ${ACLOCAL:-aclocal}       || die "The command '${AUTOHEADER:-aclocal}' 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" | ||||
| echo "buildconf: running autoconf" | ||||
| ${AUTOCONF:-autoconf}     || die "The command '${AUTOCONF:-autoconf}' failed" | ||||
|  | ||||
| if test -d ares; then | ||||
|   cd ares | ||||
|   echo "buildconf: running aclocal in the ares directory" | ||||
|   ${ACLOCAL:-aclocal}     || die "The command '${ACLOCAL:-aclocal}' failed" | ||||
|   echo "buildconf: running autoconf in the ares directory" | ||||
|   ${AUTOCONF:-autoconf}     || die "The command '${AUTOCONF:-autoconf}' failed" | ||||
|   cd .. | ||||
| fi | ||||
|  | ||||
| echo "buildconf: running automake" | ||||
| ${AUTOMAKE:-automake} -a  || die "The command '${AUTOMAKE:-automake} -a' failed" | ||||
|  | ||||
| echo "buildconf: OK" | ||||
| exit 0 | ||||
|   | ||||
							
								
								
									
										17
									
								
								buildconf.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								buildconf.bat
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| @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 getdate.c | ||||
| copy lib\getdate.c.cvs lib\getdate.c | ||||
|  | ||||
| REM create hugehelp.c | ||||
| copy src\hugehelp.c.cvs src\hugehelp.c | ||||
|  | ||||
| REM create Makefile | ||||
| copy Makefile.dist Makefile | ||||
							
								
								
									
										555
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										555
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -1,20 +1,18 @@ | ||||
| dnl $Id$ | ||||
| dnl Process this file with autoconf to produce a configure script. | ||||
|  | ||||
| dnl Ensure that this file is processed with autoconf 2.50 or newer | ||||
| dnl Don't even think about removing this check! | ||||
| AC_PREREQ(2.50) | ||||
| 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]) | ||||
|  | ||||
| dnl configure script copyright | ||||
| AC_COPYRIGHT([Copyright (c) 1998 - 2003 Daniel Stenberg, <daniel@haxx.se> | ||||
| AC_COPYRIGHT([Copyright (c) 1998 - 2004 Daniel Stenberg, <daniel@haxx.se> | ||||
| This configure script may be copied, distributed and modified under the  | ||||
| terms of the curl license; see COPYING for more details]) | ||||
|  | ||||
| AC_CONFIG_SRCDIR([lib/urldata.h]) | ||||
| AM_CONFIG_HEADER(lib/config.h src/config.h tests/server/config.h ) | ||||
| AM_CONFIG_HEADER(lib/config.h src/config.h) | ||||
| AM_MAINTAINER_MODE | ||||
|  | ||||
| dnl SED is needed by some of the tools | ||||
| @@ -68,6 +66,7 @@ AC_LIBTOOL_WIN32_DLL | ||||
| dnl libtool setup | ||||
| AM_PROG_LIBTOOL | ||||
|  | ||||
| AC_MSG_CHECKING([if we need -no-undefined]) | ||||
| case $host in | ||||
|   *-*-cygwin | *-*-mingw* | *-*-pw32*) | ||||
|     need_no_undefined=yes | ||||
| @@ -76,9 +75,23 @@ case $host in | ||||
|     need_no_undefined=no | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| AC_MSG_RESULT($need_no_undefined) | ||||
| AM_CONDITIONAL(NO_UNDEFINED, test x$need_no_undefined = xyes) | ||||
|  | ||||
| AC_MSG_CHECKING([if we need -mimpure-text]) | ||||
| case $host in | ||||
|   *-*-solaris2*) | ||||
|     if test "$GCC" = "yes"; then | ||||
|       mimpure="yes" | ||||
|     fi | ||||
|     ;; | ||||
|   *) | ||||
|     mimpure=no | ||||
|     ;; | ||||
| esac | ||||
| AC_MSG_RESULT($mimpure) | ||||
| AM_CONDITIONAL(MIMPURE, test x$mimpure = xyes) | ||||
|  | ||||
| dnl The install stuff has already been taken care of by the automake stuff | ||||
| dnl AC_PROG_INSTALL | ||||
| AC_PROG_MAKE_SET | ||||
| @@ -195,6 +208,142 @@ 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 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 "$HAVE_GETHOSTBYNAME" != "1" | ||||
| then | ||||
|   dnl gethostbyname in the socket lib? | ||||
|   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 socket | ||||
| dnl libs at the same time to link properly. | ||||
| if test "$HAVE_GETHOSTBYNAME" != "1" | ||||
| then | ||||
|   AC_MSG_CHECKING([trying gethostbyname with both nsl and socket libs]) | ||||
|   my_ac_save_LIBS=$LIBS | ||||
|   LIBS="-lnsl -lsocket $LIBS" | ||||
|   AC_TRY_LINK( , | ||||
|              [gethostbyname();], | ||||
|              [ 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 "$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? | ||||
| AC_CHECK_FUNC(strcasecmp, , [ AC_CHECK_LIB(resolve, strcasecmp) ]) | ||||
|  | ||||
| if test "$ac_cv_lib_resolve_strcasecmp" = "$ac_cv_func_strcasecmp"; then | ||||
|   AC_CHECK_LIB(resolve, strcasecmp, | ||||
|               [LIBS="-lresolve $LIBS"], | ||||
|                , | ||||
|                -lnsl) | ||||
| fi | ||||
|  | ||||
| dnl socket lib? | ||||
| AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ]) | ||||
|  | ||||
| dnl dl lib? | ||||
| AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ]) | ||||
|  | ||||
| AC_MSG_CHECKING([whether to use libgcc]) | ||||
| AC_ARG_ENABLE(libgcc, | ||||
| AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]), | ||||
| [ case "$enableval" in | ||||
|   yes) | ||||
|         LIBS="$LIBS -lgcc" | ||||
|        AC_MSG_RESULT(yes) | ||||
|        ;; | ||||
|   *)   AC_MSG_RESULT(no) | ||||
|        ;; | ||||
|   esac ], | ||||
|        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 | ||||
| @@ -237,70 +386,6 @@ if test "$ipv6" = "yes"; then | ||||
|   CURL_CHECK_WORKING_GETADDRINFO | ||||
| fi | ||||
|  | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Checks for libraries. | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| dnl gethostbyname in the nsl lib? | ||||
| AC_CHECK_FUNC(gethostbyname, , [ AC_CHECK_LIB(nsl, gethostbyname) ]) | ||||
|  | ||||
| if test "$ac_cv_lib_nsl_gethostbyname" != "yes" -a "$ac_cv_func_gethostbyname" != "yes"; then | ||||
|   dnl gethostbyname in the socket lib? | ||||
|   AC_CHECK_FUNC(gethostbyname, , [ AC_CHECK_LIB(socket, gethostbyname) ]) | ||||
| 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" = "$ac_cv_func_gethostbyname"; then | ||||
|   AC_MSG_CHECKING([trying 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 ) | ||||
|  | ||||
|   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 | ||||
| fi | ||||
|  | ||||
| dnl resolve lib? | ||||
| AC_CHECK_FUNC(strcasecmp, , [ AC_CHECK_LIB(resolve, strcasecmp) ]) | ||||
|  | ||||
| if test "$ac_cv_lib_resolve_strcasecmp" = "$ac_cv_func_strcasecmp"; then | ||||
|   AC_CHECK_LIB(resolve, strcasecmp, | ||||
|               [LIBS="-lresolve $LIBS"], | ||||
|                , | ||||
|                -lnsl) | ||||
| fi | ||||
|  | ||||
| dnl socket lib? | ||||
| AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ]) | ||||
|  | ||||
| dnl dl lib? | ||||
| AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ]) | ||||
|  | ||||
| AC_MSG_CHECKING([whether to use libgcc]) | ||||
| AC_ARG_ENABLE(libgcc, | ||||
| AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]), | ||||
| [ case "$enableval" in | ||||
|   yes) | ||||
|         LIBS="$LIBS -lgcc" | ||||
|        AC_MSG_RESULT(yes) | ||||
|        ;; | ||||
|   *)   AC_MSG_RESULT(no) | ||||
|        ;; | ||||
|   esac ], | ||||
|        AC_MSG_RESULT(no) | ||||
| ) | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check how non-blocking sockets are set | ||||
| dnl ********************************************************************** | ||||
| @@ -354,18 +439,30 @@ dnl Check if the operating system allows programs to write to their own argv[] | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| AC_MSG_CHECKING([if argv can be written to]) | ||||
| AC_CACHE_VAL(curl_cv_writable_argv, [ | ||||
| AC_RUN_IFELSE([[ | ||||
| int main(int argc, char ** argv) { | ||||
| 	argv[0][0] = ' '; | ||||
| 	return (argv[0][0] == ' ')?0:1; | ||||
| } | ||||
| 	]], | ||||
| 	curl_cv_writable_argv=yes, | ||||
| 	curl_cv_writable_argv=no, | ||||
| 	curl_cv_writable_argv=cross) | ||||
| ]) | ||||
| case $curl_cv_writable_argv in | ||||
| yes) | ||||
| 	AC_DEFINE(HAVE_WRITABLE_ARGV, 1, [Define this symbol if your OS supports changing the contents of argv]) | ||||
| 	AC_MSG_RESULT(yes), | ||||
| 	AC_MSG_RESULT(no), | ||||
| 	AC_MSG_RESULT(yes) | ||||
| 	;; | ||||
| no) | ||||
| 	AC_MSG_RESULT(no) | ||||
| 	;; | ||||
| *) | ||||
|         AC_MSG_RESULT(no) | ||||
|         AC_MSG_WARN([the previous check could not be made default was used]) | ||||
| ) | ||||
| 	;; | ||||
| esac | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the presence of Kerberos4 libraries and headers | ||||
| @@ -393,8 +490,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 | ||||
| @@ -443,7 +540,7 @@ then | ||||
|       AC_CHECK_FUNCS(krb_get_our_ip_for_realm) | ||||
|  | ||||
|       dnl add define KRB4 | ||||
|       AC_DEFINE(KRB4, 1, | ||||
|       AC_DEFINE(HAVE_KRB4, 1, | ||||
|       [if you have the Kerberos4 libraries (including -ldes)]) | ||||
|  | ||||
|       dnl substitute it too! | ||||
| @@ -459,6 +556,36 @@ else | ||||
|   AC_MSG_RESULT(no) | ||||
| fi | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for FBopenssl(SPNEGO) libraries | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| AC_ARG_WITH(spnego, | ||||
|   AC_HELP_STRING([--with-spnego=DIR], | ||||
|                  [Specify location of SPNEGO library fbopenssl]), | ||||
|   [ SPNEGO_ROOT="$withval" | ||||
|     want_spnego="yes" ] | ||||
| ) | ||||
| AC_MSG_CHECKING([if SPNEGO support is requested]) | ||||
| if test x"$want_spnego" = xyes; then | ||||
|  | ||||
|   if test X"$SPNEGO_ROOT" = Xyes; then | ||||
|      AC_MSG_ERROR([FBOpenSSL libs and/or directories were not found where specified!]) | ||||
|      AC_MSG_RESULT(no) | ||||
|   else | ||||
|      if test -z "$SPNEGO_LIB_DIR"; then | ||||
|         LDFLAGS="$LDFLAGS -L$SPNEGO_ROOT -lfbopenssl" | ||||
|      else | ||||
|         LDFLAGS="$LDFLAGS $SPNEGO_LIB_DIR" | ||||
|      fi | ||||
|   | ||||
|      AC_MSG_RESULT(yes) | ||||
|      AC_DEFINE(HAVE_SPNEGO, 1, [Define this if you have the SPNEGO library fbopenssl]) | ||||
|   fi | ||||
| else | ||||
|   AC_MSG_RESULT(no) | ||||
| fi | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for GSS-API libraries | ||||
| dnl ********************************************************************** | ||||
| @@ -488,28 +615,37 @@ AC_MSG_CHECKING([if GSSAPI support is requested]) | ||||
| if test x"$want_gss" = xyes; then | ||||
|   if test -z "$GSSAPI_INCS"; then | ||||
|      if test -f "$GSSAPI_ROOT/bin/krb5-config"; then | ||||
|         gss_cppflags=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi` | ||||
| 	CPPFLAGS="$CPPFLAGS $gss_cppflags" | ||||
|         GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi` | ||||
|      else | ||||
|         CPPFLAGS="$GSSAPI_ROOT/include" | ||||
|         GSSAPI_INCS="-I$GSSAPI_ROOT/include" | ||||
|      fi | ||||
|   else | ||||
|      CPPFLAGS="$CPPFLAGS $GSSAPI_INCS" | ||||
|   fi | ||||
|   CPPFLAGS="$CPPFLAGS $GSSAPI_INCS" | ||||
|    | ||||
|   if test -z "$GSSAPI_LIB_DIR"; then | ||||
|      if test -f "$GSSAPI_ROOT/bin/krb5-config"; 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" | ||||
|   fi | ||||
|  | ||||
|   AC_MSG_RESULT(yes) | ||||
|   AC_DEFINE(GSSAPI, 1, [if you have the gssapi libraries]) | ||||
|   AC_DEFINE(HAVE_GSSAPI, 1, [if you have the gssapi libraries]) | ||||
|  | ||||
|   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` | ||||
|   fi | ||||
|  | ||||
|   if test -f "$GSSAPI_INCS/gssapi.h"; then | ||||
|       AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries]) | ||||
|   else | ||||
|       AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries]) | ||||
|   fi | ||||
|    | ||||
| else | ||||
|   AC_MSG_RESULT(no) | ||||
| @@ -574,7 +710,7 @@ else | ||||
|   *) | ||||
|     dnl check the given spot right away! | ||||
|     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 | ||||
| @@ -584,7 +720,7 @@ else | ||||
|      ],[ | ||||
|      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" ], [ | ||||
| @@ -598,6 +734,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) | ||||
|  | ||||
| @@ -661,7 +811,8 @@ AC_HELP_STRING([--without-ca-bundle], [Don't install the CA bundle]), | ||||
|  | ||||
|     AC_CHECK_FUNCS( RAND_status \ | ||||
|                     RAND_screen \ | ||||
|                     RAND_egd ) | ||||
|                     RAND_egd \ | ||||
|                     CRYPTO_cleanup_all_ex_data ) | ||||
|  | ||||
|   fi | ||||
|  | ||||
| @@ -695,29 +846,60 @@ 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) | ||||
|                    LIBS="$LIBS -lz" | ||||
|                    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]) | ||||
|     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) | ||||
|  | ||||
| dnl Default is to try the thread-safe versions of a few functions | ||||
| OPT_THREAD=on | ||||
| @@ -738,9 +920,17 @@ printf("just fine"); | ||||
| ) | ||||
|  | ||||
| AC_ARG_ENABLE(thread,dnl | ||||
| AC_HELP_STRING([--disable-thread],[don't look for thread-safe functions]), | ||||
|   OPT_THREAD=off | ||||
|   AC_MSG_WARN(libcurl will not get built using thread-safe functions) | ||||
| AC_HELP_STRING([--disable-thread],[don't look for thread-safe functions]) | ||||
| AC_HELP_STRING([--enable-thread],[look for thread-safe functions]), | ||||
| [ case "$enableval" in | ||||
|   no) | ||||
|     OPT_THREAD=off | ||||
|     AC_MSG_WARN(libcurl will not get built using thread-safe functions) | ||||
|     ;; | ||||
|   *) | ||||
|     ;; | ||||
|   esac | ||||
| ] | ||||
| ) | ||||
|  | ||||
| if test X"$OPT_THREAD" = Xoff | ||||
| @@ -748,12 +938,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() | ||||
|     CURL_CHECK_GETHOSTBYADDR_R() | ||||
|   fi | ||||
|  | ||||
|   dnl poke around for inet_ntoa_r() | ||||
|   CURL_CHECK_INET_NTOA_R() | ||||
| @@ -779,9 +970,12 @@ AC_CHECK_HEADERS( | ||||
|         sys/time.h \ | ||||
|         sys/select.h \ | ||||
|         sys/socket.h \ | ||||
|         sys/ioctl.h \ | ||||
|         assert.h \ | ||||
|         unistd.h \ | ||||
|         malloc.h \ | ||||
|         stdlib.h \ | ||||
|         limits.h \ | ||||
|         arpa/inet.h \ | ||||
|         net/if.h \ | ||||
|         netinet/in.h \ | ||||
| @@ -829,15 +1023,17 @@ AC_C_CONST | ||||
| AC_TYPE_SIZE_T | ||||
| AC_HEADER_TIME | ||||
|  | ||||
| # mprintf() checks: | ||||
| AC_CHECK_SIZEOF(curl_off_t, ,[ | ||||
| #include <stdio.h> | ||||
| #include "$srcdir/include/curl/curl.h" | ||||
| ]) | ||||
|  | ||||
| # check for 'long double' | ||||
| # AC_CHECK_SIZEOF(long double, 8) | ||||
| # check for 'long long' | ||||
| # AC_CHECK_SIZEOF(long long, 4) | ||||
| AC_CHECK_TYPE(long long, | ||||
|    [AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports 'long long'])]) | ||||
|  | ||||
| # check for ssize_t | ||||
| AC_CHECK_TYPE(ssize_t, int) | ||||
| AC_CHECK_TYPE(ssize_t, , | ||||
|    AC_DEFINE(ssize_t, int, [the signed version of size_t])) | ||||
|  | ||||
| TYPE_SOCKLEN_T | ||||
| TYPE_IN_ADDR_T | ||||
| @@ -848,7 +1044,8 @@ dnl Checks for library functions. | ||||
| dnl AC_PROG_GCC_TRADITIONAL | ||||
| AC_TYPE_SIGNAL | ||||
| dnl AC_FUNC_VPRINTF | ||||
| AC_CHECK_FUNCS( socket \ | ||||
| AC_CHECK_FUNCS( strtoll \ | ||||
|                 socket \ | ||||
|                 select \ | ||||
|                 strdup \ | ||||
|                 strstr \ | ||||
| @@ -862,10 +1059,12 @@ AC_CHECK_FUNCS( socket \ | ||||
|                 gettimeofday \ | ||||
|                 inet_addr \ | ||||
|                 inet_ntoa \ | ||||
|                 inet_pton \ | ||||
|                 tcsetattr \ | ||||
|                 tcgetattr \ | ||||
|                 perror \ | ||||
|                 closesocket \ | ||||
|                 siginterrupt \ | ||||
|                 sigaction \ | ||||
|                 signal \ | ||||
|                 getpass_r \ | ||||
| @@ -913,8 +1112,64 @@ AC_PATH_PROGS( NROFF, gnroff nroff, , | ||||
|   $PATH:/usr/bin/:/usr/local/bin ) | ||||
| AC_SUBST(NROFF) | ||||
|  | ||||
| if test -n "$NROFF"; then | ||||
|   dnl only check for nroff options if an nroff command was found | ||||
|  | ||||
|   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 | ||||
|   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 | ||||
|  | ||||
| AC_PROG_YACC | ||||
|  | ||||
| if test -z "$YACC" | ||||
| then | ||||
|   AC_MSG_CHECKING([if OK to build without bison/yacc]) | ||||
|   dnl no yacc is a big deal if we have no pre-fixed getdate.y | ||||
|   if test -r "$srcdir/lib/getdate.c" | ||||
|   then | ||||
|     dnl all is well, we don't have to generate it! | ||||
|     AC_MSG_RESULT(yes) | ||||
|   else | ||||
|     AC_MSG_RESULT(no) | ||||
|     AC_MSG_ERROR([no yacc or bison found, can't build libcurl!]) | ||||
|   fi | ||||
| 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]) | ||||
| fi | ||||
|  | ||||
| dnl set variable for use in automakefile(s) | ||||
| AM_CONDITIONAL(USE_MANUAL, test x"$USE_MANUAL" = x1) | ||||
|  | ||||
|  | ||||
| dnl AC_PATH_PROG( RANLIB, ranlib, /usr/bin/ranlib,  | ||||
| dnl   $PATH:/usr/bin/:/usr/local/bin ) | ||||
| dnl AC_SUBST(RANLIB) | ||||
| @@ -934,22 +1189,57 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]), | ||||
|  | ||||
|     CPPFLAGS="$CPPFLAGS -DCURLDEBUG" | ||||
|     CFLAGS="$CFLAGS -g" | ||||
|     if test "$GCC" = "yes"; then | ||||
|        CFLAGS="$CFLAGS -W -Wall -Wwrite-strings -pedantic -Wundef -Wpointer-arith -Wnested-externs" | ||||
|     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 | ||||
|  | ||||
|     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_MSG_CHECKING([whether to enable ares]) | ||||
| AC_ARG_ENABLE(ares, | ||||
| AC_HELP_STRING([--enable-ares=PATH],[Enable ares for name lookups]) | ||||
| AC_HELP_STRING([--disable-ares],[Disable ares for name lookups]), | ||||
| [ case "$enableval" in | ||||
|   no) | ||||
|        AC_MSG_RESULT(no) | ||||
|        ;; | ||||
|   *)   AC_MSG_RESULT(yes) | ||||
|  | ||||
|        if test "x$IPV6_ENABLED" = "x1"; then | ||||
|          AC_MSG_ERROR([ares doesn't work with ipv6, disable ipv6 to use ares]) | ||||
|        fi | ||||
|  | ||||
|        AC_DEFINE(USE_ARES, 1, [Define if you want to enable ares support]) | ||||
|        dnl substitute HAVE_ARES for curl-config and similar | ||||
|        HAVE_ARES="1" | ||||
|        AC_SUBST(HAVE_ARES) | ||||
|  | ||||
|        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 | ||||
|        dnl and the includes are in $val/include. This is the default setup for | ||||
|        dnl ares so it should not be a problem. | ||||
|        if test "x$enableval" = "xyes" ; then | ||||
|          if test -d "$srcdir/ares"; then | ||||
|             AC_CONFIG_SUBDIRS(ares) | ||||
|             aresinc=`cd $srcdir/ares && pwd` | ||||
|             CPPFLAGS="$CPPFLAGS -I$aresinc" | ||||
|  | ||||
|             dnl the pwd= below cannot 'cd' into the ares dir to get the full | ||||
|             dnl path to it, since it may not exist yet if we build outside of | ||||
|             dnl the source tree | ||||
|             pwd=`pwd` | ||||
|             LDFLAGS="$LDFLAGS -L$pwd/ares" | ||||
|          fi | ||||
|        else | ||||
|          CPPFLAGS="$CPPFLAGS -I$enableval/include" | ||||
|          LDFLAGS="$LDFLAGS -L$enableval/lib" | ||||
|        fi | ||||
|        ;; | ||||
|   esac ], | ||||
|        AC_MSG_RESULT(no) | ||||
| @@ -978,6 +1268,7 @@ AC_CONFIG_FILES([Makefile \ | ||||
|            packages/DOS/Makefile \ | ||||
|            packages/EPM/curl.list \ | ||||
|            packages/EPM/Makefile \ | ||||
|            packages/vms/Makefile \ | ||||
|            curl-config | ||||
| ]) | ||||
| AC_OUTPUT | ||||
|   | ||||
| @@ -90,6 +90,9 @@ while test $# -gt 0; do | ||||
| 	if test "@CURL_DISABLE_DICT@" = "1"; then | ||||
|           echo "DICT-disabled" | ||||
|         fi | ||||
| 	if test "@HAVE_ARES@" = "1"; then | ||||
|           echo "AsynchDNS" | ||||
|         fi | ||||
| 	;; | ||||
|  | ||||
|     --version) | ||||
|   | ||||
| @@ -37,7 +37,7 @@ | ||||
|   (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")) | ||||
| 	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")) | ||||
| 	) | ||||
|   ;; keybindings for C, C++, and Objective-C.  We can put these in | ||||
|   ;; c-mode-base-map because of inheritance ... | ||||
|   | ||||
| @@ -6,15 +6,20 @@ | ||||
|  | ||||
|                                libcurl bindings | ||||
|  | ||||
| Creative people have written particular bindings or interfaces for various | ||||
| environments and programming languages. Using one of these allows you to take | ||||
| advantage of curl powers from within your favourite language or system. | ||||
| Creative people have written bindings or interfaces for various environments | ||||
| and programming languages. Using one of these allows you to take advantage of | ||||
| curl powers from within your favourite language or system. | ||||
|  | ||||
| This is a list of all known interfaces as of this writing. | ||||
|  | ||||
| The bindings listed below are not part of the curl/libcurl distribution | ||||
| archives, but must be downloaded and installed separately. | ||||
|  | ||||
| Ada95 | ||||
|  | ||||
|   Writtten by Andreas Almroth. | ||||
|   http://www.almroth.com/adacurl/index.html | ||||
|  | ||||
| Basic | ||||
|  | ||||
|   ScriptBasic bindings to libcurl. Writtten by Peter Verhas. | ||||
| @@ -22,19 +27,32 @@ Basic | ||||
|  | ||||
| C++ | ||||
|  | ||||
|   Maintained by Jean-Philippe Barrette-LaPierre. | ||||
|   http://curl.haxx.se/libcurl/cplusplus/ | ||||
|   Written by Jean-Philippe Barrette-LaPierre. | ||||
|   http://www.sourceforge.net/projects/curlpp | ||||
|  | ||||
| Cocoa | ||||
|  | ||||
|   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. | ||||
|   http://dylanlibs.sourceforge.net/ | ||||
|  | ||||
| Euphoria | ||||
|  | ||||
|   Written by Ray Smith. | ||||
|   http://rays-web.com/eulibcurl.htm | ||||
|  | ||||
| Ferite | ||||
|   http://www.ferite.org/ | ||||
|  | ||||
| Java | ||||
|  | ||||
|   Written by Daniel Stenberg. | ||||
| @@ -50,6 +68,11 @@ Object-Pascal | ||||
|   Free Pascal, Delphi and Kylix binding written by Christophe Espern. | ||||
|   http://www.tekool.com/opcurl | ||||
|  | ||||
| O'Caml | ||||
|  | ||||
|   Written by Lars Nilsson. | ||||
|   http://sourceforge.net/projects/ocurl/ | ||||
|  | ||||
| Pascal | ||||
|  | ||||
|   Free Pascal, Delphi and Kylix binding written by Jeffrey Pohlmeyer. | ||||
|   | ||||
							
								
								
									
										17
									
								
								docs/BUGS
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								docs/BUGS
									
									
									
									
									
								
							| @@ -8,7 +8,7 @@ $Id$ | ||||
| BUGS | ||||
|  | ||||
|   Curl and libcurl have grown substantially since the beginning. At the time | ||||
|   of writing (end of March 2003), there are 35000 lines of source code, and by | ||||
|   of writing (August 2003), there are about 40000 lines of source code, and by | ||||
|   the time you read this it has probably grown even more. | ||||
|  | ||||
|   Of course there are lots of bugs left. And lots of misfeatures. | ||||
| @@ -32,7 +32,7 @@ WHERE TO REPORT | ||||
|  | ||||
| WHAT TO REPORT | ||||
|  | ||||
|   When reporting a bug, you should include information that will help us | ||||
|   When reporting a bug, you should include all information that will help us | ||||
|   understand what's wrong, what you expected to happen and how to repeat the | ||||
|   bad behavior. You therefore need to tell us: | ||||
|  | ||||
| @@ -48,16 +48,15 @@ WHAT TO REPORT | ||||
|   enable us to help you quicker and more accurately. | ||||
|  | ||||
|   Since curl deals with networks, it often helps us if you include a protocol | ||||
|   debug dump with your bug report. The output you get by using the -v | ||||
|   flag. Usually, you also get more info by using -i so that is likely to be | ||||
|   useful when reporting bugs as well. | ||||
|   debug dump with your bug report. The output you get by using the -v or | ||||
|   --trace options. | ||||
|  | ||||
|   If curl crashed, causing a core dump (in unix), there is hardly any use to | ||||
|   send that huge file to anyone of us. Unless we have an exact same system | ||||
|   setup as you, we can't do much with it. What we instead ask of you is to get | ||||
|   a stack trace and send that (much smaller) output to us instead! | ||||
|   setup as you, we can't do much with it. Instead we ask you to get a stack | ||||
|   trace and send that (much smaller) output to us instead! | ||||
|  | ||||
|   The address and how to subscribe to the mailing list is detailed in the | ||||
|   The address and how to subscribe to the mailing lists are detailed in the | ||||
|   MANUAL file. | ||||
|  | ||||
| HOW TO GET A STACK TRACE | ||||
| @@ -66,7 +65,7 @@ HOW TO GET A STACK TRACE | ||||
|   don't 'strip' the final executable. Try to avoid optimizing the code as | ||||
|   well, remove -O, -O2 etc from the compiler options. | ||||
|  | ||||
|   Run the program until it dumps core. | ||||
|   Run the program until it cores. | ||||
|  | ||||
|   Run your debugger on the core file, like '<debugger> curl core'. <debugger> | ||||
|   should be replaced with the name of your debugger, in most cases that will | ||||
|   | ||||
| @@ -58,9 +58,9 @@ Commenting | ||||
|  | ||||
|  Comment your source code extensively using C comments (/* comment */), DO NOT | ||||
|  use C++ comments (// this style). Commented code is quality code and enables | ||||
|  future modifications much more. Uncommented code much more risk being | ||||
|  completely replaced when someone wants to extend things, since other persons' | ||||
|  source code can get quite hard to read. | ||||
|  future modifications much more. Uncommented code risk having to be completely | ||||
|  replaced when someone wants to extend things, since other persons' source | ||||
|  code can get quite hard to read. | ||||
|  | ||||
| General Style | ||||
|  | ||||
| @@ -128,7 +128,7 @@ Test Cases | ||||
|  improve it, all new features and functions that are added need to be tested | ||||
|  in the test suite. Every feature that is added should get at least one valid | ||||
|  test case that verifies that it works as documented. If every submitter also | ||||
|  post a few test cases, it won't end up as a heavy burden on a single person! | ||||
|  posts a few test cases, it won't end up as a heavy burden on a single person! | ||||
|  | ||||
| How To Make a Patch | ||||
|  | ||||
|   | ||||
							
								
								
									
										70
									
								
								docs/FAQ
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								docs/FAQ
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| Updated: June 17, 2003 (http://curl.haxx.se/docs/faq.html) | ||||
| Updated: March 16, 2004 (http://curl.haxx.se/docs/faq.html) | ||||
|                                   _   _ ____  _ | ||||
|                               ___| | | |  _ \| | | ||||
|                              / __| | | | |_) | | | ||||
| @@ -19,7 +19,7 @@ FAQ | ||||
|  | ||||
|  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.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? | ||||
| @@ -40,6 +40,7 @@ FAQ | ||||
|   3.12 Why do FTP specific features over HTTP proxy fail? | ||||
|   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? | ||||
|  | ||||
|  4. Running Problems | ||||
|   4.1 Problems connecting to SSL servers. | ||||
| @@ -66,7 +67,7 @@ FAQ | ||||
|   5.2 How can I receive all data into a large memory chunk? | ||||
|   5.3 How do I fetch multiple files with libcurl? | ||||
|   5.4 Does libcurl do Winsock initing on win32 systems? | ||||
|   5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ? | ||||
|   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! | ||||
|  | ||||
| @@ -89,7 +90,7 @@ FAQ | ||||
|   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". | ||||
|   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. | ||||
| @@ -100,7 +101,7 @@ FAQ | ||||
|   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? | ||||
| @@ -108,16 +109,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. | ||||
|   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 wanna use curl to mirror | ||||
|   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). | ||||
|  | ||||
| @@ -180,9 +181,8 @@ FAQ | ||||
|   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. | ||||
|  | ||||
|   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 | ||||
| @@ -280,8 +280,7 @@ FAQ | ||||
|  | ||||
|   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 when curl is built with IPv6 support disabled. | ||||
|  | ||||
|  | ||||
| 3. Usage problems | ||||
| @@ -449,11 +448,19 @@ FAQ | ||||
|  | ||||
|     - Read the javascript code and rewrite the same logic in another language. | ||||
|  | ||||
|     - Implement a javascript interpreted, people have successfully used the | ||||
|     - 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. | ||||
|  | ||||
|   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. | ||||
|  | ||||
|   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. | ||||
|  | ||||
| 4. Running Problems | ||||
|  | ||||
| @@ -469,7 +476,7 @@ 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? | ||||
| @@ -568,21 +575,26 @@ FAQ | ||||
|  | ||||
|   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 | ||||
| @@ -699,13 +711,15 @@ FAQ | ||||
|  | ||||
|   Yes, if told to in the curl_global_init() call. | ||||
|  | ||||
|   5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ? | ||||
|   5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ? | ||||
|  | ||||
|   Yes, but you cannot open a FILE * and pass the pointer to a DLL and have | ||||
|   that DLL use the FILE *. If you set CURLOPT_FILE you must also use | ||||
|   CURLOPT_WRITEFUNCTION as well to set a function that writes the file, even | ||||
|   if that simply writes the data to the specified FILE*. Similarly, if you use | ||||
|   CURLOPT_INFILE you must also specify CURLOPT_READFUNCTION. | ||||
|   that DLL use the FILE * (as the DLL and the client application cannot access | ||||
|   each others' variable memory areas). If you set CURLOPT_WRITEDATA you must | ||||
|   also use CURLOPT_WRITEFUNCTION as well to set a function that writes the | ||||
|   file, even if that simply writes the data to the specified FILE *. | ||||
|   Similarly, if you use CURLOPT_READDATA you must also specify | ||||
|   CURLOPT_READFUNCTION. | ||||
|  | ||||
|   (Provided by Joel DeYoung and Bob Schader) | ||||
|  | ||||
|   | ||||
| @@ -25,6 +25,7 @@ Misc | ||||
|  - socks5 support | ||||
|  - supports user name + password in proxy environment variables | ||||
|  - operations through proxy "tunnel" (using CONNECT) | ||||
|  - supports transfers of large files (>2GB and >4GB) | ||||
|  | ||||
| HTTP | ||||
|  - HTTP/1.1 compliant (optionally uses 1.0) | ||||
| @@ -33,7 +34,8 @@ HTTP | ||||
|  - HEAD | ||||
|  - POST | ||||
|  - multipart formpost (RFC1867-style) | ||||
|  - authentication (Basic, Digest, NTLM(*1), GSS-Negotiate(*3)) | ||||
|  - authentication: Basic, Digest, NTLM(*1), GSS-Negotiate/Negotiate(*3) and | ||||
|    SPNEGO (*4) | ||||
|  - resume (both GET and PUT) | ||||
|  - follow redirects | ||||
|  - maximum amount of redirects to follow | ||||
| @@ -62,7 +64,7 @@ HTTPS (*1) | ||||
| FTP | ||||
|  - download | ||||
|  - authentication | ||||
|  - kerberos security | ||||
|  - kerberos4 (*5) | ||||
|  - active/passive using PORT, EPRT, PASV or EPSV | ||||
|  - single file size information (compare to HTTP HEAD) | ||||
|  - 'type=' URL support | ||||
| @@ -79,6 +81,11 @@ FTP | ||||
|  - all operations can be tunneled through a http-proxy | ||||
|  - customizable to retrieve file modification date | ||||
|  | ||||
| FTPS (*1) | ||||
|  - explicit ftps:// support that use SSL on both connections | ||||
|  - implicit "AUTH TSL" and "AUTH SSL" usage to "upgrade" plain ftp:// | ||||
|    connection to use SSL for both or one of the connections | ||||
|  | ||||
| TELNET | ||||
|  - connection negotiation | ||||
|  - custom telnet options | ||||
| @@ -97,6 +104,11 @@ GOPHER | ||||
| FILE | ||||
|  - URL support | ||||
|  | ||||
| FOOTNOTES | ||||
| ========= | ||||
|  | ||||
|   *1 = requires OpenSSL | ||||
|   *2 = requires OpenLDAP | ||||
|   *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. | ||||
|   | ||||
							
								
								
									
										22
									
								
								docs/HISTORY
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								docs/HISTORY
									
									
									
									
									
								
							| @@ -23,17 +23,17 @@ the http-only days were already passed. | ||||
|  | ||||
| The project slowly grew bigger. When upload capabilities were added and the | ||||
| name once again was misleading, a second name change was made and on March 20, | ||||
| 1998 curl 4 was released. (The version numbering from the previous names were | ||||
| 1998 curl 4 was released. (The version numbering from the previous names was | ||||
| kept.) | ||||
|  | ||||
| (Unrelated to this project a company called Curl Corporation filed a US | ||||
| (Unrelated to this project a company called Curl Corporation registered a US | ||||
| trademark on the name "CURL" on May 18 1998. That company had then already | ||||
| registered the curl.com domain back in November of the previous year. All this | ||||
| was much later brought into the lights.) | ||||
| was revealed to us much later.) | ||||
|  | ||||
| SSL support was added, powered by the SSLeay library. | ||||
|  | ||||
| August 1998, added project curl to freshmeat.net. | ||||
| August 1998, first announcement of curl on freshmeat.net. | ||||
|  | ||||
| October 1998, with the curl 4.9 release and the introduction of cookie | ||||
| support, curl was no longer released under the GPL license. Now we're at 4000 | ||||
| @@ -42,7 +42,7 @@ lines of code, we switched over to the MPL license to restrict the effects of | ||||
|  | ||||
| November 1998, configure script and reported successful compiles on several | ||||
| major operating systems. The never-quite-understood -F option was added and | ||||
| curl could now simulate quite a lot of a browser. | ||||
| curl could now simulate quite a lot of a browser. TELNET support was added. | ||||
|  | ||||
| Curl 5 was released in December 1998 and introduced the first ever curl man | ||||
| page. People started making Linux RPM packages out of it. | ||||
| @@ -90,6 +90,8 @@ curl supports HTTP 1.1 starting with the release of 7.7, March 22 2001. This | ||||
| also introduced libcurl's ability to do persistent connections. 24000 lines of | ||||
| code. | ||||
|  | ||||
| The first experimental ftps:// support was added in March 2001. | ||||
|  | ||||
| August 2001. curl is bundled in Mac OS X, 10.1. It was already becoming more | ||||
| and more of a standard utility of Linux distributions and a regular in the BSD | ||||
| ports collections. The curl web site gets 8000 visits weekly. Curl Corporation | ||||
| @@ -114,3 +116,13 @@ license only. | ||||
|  | ||||
| February 2003, the curl site averages at 20000 visits weekly. At any given | ||||
| moment, there's an average of 3 people browsing the curl.haxx.se site. | ||||
|  | ||||
| Multiple new authentication schemes are supported: Digest (May), NTLM (June) | ||||
| and Negotiate (June). | ||||
|  | ||||
| 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. | ||||
|   | ||||
							
								
								
									
										76
									
								
								docs/INSTALL
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								docs/INSTALL
									
									
									
									
									
								
							| @@ -6,14 +6,13 @@ | ||||
|  | ||||
|                                 How To Compile | ||||
|  | ||||
| Curl has been compiled and built on numerous different operating systems. | ||||
| Installing Binary Packages | ||||
| ========================== | ||||
|  | ||||
| Most systems build curl the same way (unix-style). Continue reading below for | ||||
| more details if you're one of them. | ||||
|  | ||||
| If you're using Windows (95/98/NT/ME/2000/XP or similar), VMS, RISC OS or OS/2 | ||||
| or cross-compile, you should continue reading from one the paragraphs further | ||||
| down. | ||||
|    Lots of people download binary distributions of curl and libcurl. This | ||||
|    document does not describe how to install curl or libcurl using such a | ||||
|    binary package. This document describes how to compile, build and install | ||||
|    curl and libcurl from source code. | ||||
|  | ||||
| UNIX | ||||
| ==== | ||||
| @@ -231,6 +230,36 @@ Win32 | ||||
|         project properties to use the SSL include path, link with the SSL libs | ||||
|         and define the USE_SSLEAY symbol. | ||||
|  | ||||
|       Using Borland C++ compiler version 5.5.1 (available as free download | ||||
|       from Borland's site) | ||||
|       --------------------------------------------------------------------- | ||||
|        | ||||
|         compile openssl | ||||
|        | ||||
|         Make sure you include the paths to curl/include and openssl/inc32 in | ||||
|         your bcc32.cnf file | ||||
|        | ||||
|  | ||||
|         eg : -I"c:\Bcc55\include;c:\path_curl\include;c:\path_openssl\inc32" | ||||
|          | ||||
|         Check to make sure that all of the sources listed in lib/Makefile.b32 | ||||
|         are present in the /path_to_curl/lib directory. (Check the src | ||||
|         directory for missing ones.) | ||||
|          | ||||
|         Make sure the environment variable "BCCDIR" is set to the install | ||||
|         location for the compiler eg : c:\Borland\BCC55 | ||||
|          | ||||
|         command line: | ||||
|         make -f /path_to_curl/lib/Makefile-ssl.b32 | ||||
|          | ||||
|         compile simplessl.c with appropriate links | ||||
|          | ||||
|         c:\curl\docs\examples\> bcc32 -L c:\path_to_curl\lib\libcurl.lib | ||||
|                                       -L c:\borland\bcc55\lib\psdk\ws2_32.lib | ||||
|                                       -L c:\openssl\out32\libeay32.lib | ||||
|                                       -L c:\openssl\out32\ssleay32.lib | ||||
|                                       simplessl.c | ||||
|  | ||||
|    Disabling Specific Protocols: | ||||
|  | ||||
|       The configure utility, unfortunately, is not available for the Windows | ||||
| @@ -290,8 +319,6 @@ VMS | ||||
| === | ||||
|    (The VMS section is in whole contributed by the friendly Nico Baggus) | ||||
|  | ||||
|    This is the first attempt at porting cURL to VMS. | ||||
|  | ||||
|    Curl seems to work with FTP & HTTP other protocols are not tested.  (the | ||||
|    perl http/ftp testing server supplied as testing too cannot work on VMS | ||||
|    because vms has no concept of fork(). [ I tried to give it a whack, but | ||||
| @@ -300,7 +327,7 @@ VMS | ||||
|    SSL stuff has not been ported. | ||||
|  | ||||
|    Telnet has about the same issues as for Win32. When the changes for Win32 | ||||
|    are clear maybe they'l work for VMS too. The basic problem is that select | ||||
|    are clear maybe they'll work for VMS too. The basic problem is that select | ||||
|    ONLY works for sockets. | ||||
|  | ||||
|    Marked instances of fopen/[f]stat that might become a problem, especially | ||||
| @@ -422,6 +449,29 @@ RISC OS | ||||
|    where riscos-gcc and riscos-ar are links to the gccsdk tools. | ||||
|    You can then link your program with curl/lib/.libs/libcurl.a | ||||
|  | ||||
|  | ||||
| AmigaOS | ||||
| ======= | ||||
|    (This section was graciously brought to us by Diego Casorran) | ||||
|  | ||||
|    To build cURL/libcurl on AmigaOS just type 'make amiga' ... | ||||
|  | ||||
|    What you need is:    (not tested with others versions) | ||||
|  | ||||
|         GeekGadgets / gcc 2.95.3 (http://www.geekgadgets.org/) | ||||
|  | ||||
|         AmiTCP SDK v4.3 (http://www.aminet.net/comm/tcp/AmiTCP-SDK-4.3.lha) | ||||
|  | ||||
|         Native Developer Kit (http://www.amiga.com/3.9/download/NDK3.9.lha) | ||||
|  | ||||
|    As no ixemul.library is required you will be able to build it for | ||||
|    WarpOS/PowerPC (not tested by me), as well a MorphOS version should be | ||||
|    possible with no problems. | ||||
|  | ||||
|    To enable SSL support, you need a OpenSSL native version (without ixemul), | ||||
|    you can find a precompiled package at http://amiga.sourceforge.net/OpenSSL/ | ||||
|  | ||||
|  | ||||
| PORTS | ||||
| ===== | ||||
|    This is a probably incomplete list of known hardware and operating systems | ||||
| @@ -438,6 +488,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 | ||||
| @@ -460,6 +511,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 | ||||
| @@ -497,7 +549,3 @@ OpenLDAP | ||||
|  | ||||
|       http://www.openldap.org | ||||
|  | ||||
|    You need to install it with shared libraries, which is enabled when running | ||||
|    the ldap configure script with "--enable-shared". With my linux 2.0.36 | ||||
|    kernel I also had to disable using threads (with --without-threads), | ||||
|    because the configure script couldn't figure out my system. | ||||
|   | ||||
							
								
								
									
										110
									
								
								docs/KNOWN_BUGS
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								docs/KNOWN_BUGS
									
									
									
									
									
								
							| @@ -3,32 +3,52 @@ 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! | ||||
|  | ||||
| * NTLM authentication with passwords longer than 14 letters fail. There is | ||||
|   a known fix for this, planned to come in curl 7.11.2 | ||||
|  | ||||
| * 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]'. | ||||
|  | ||||
| * CURLOPT_USERPWD and CURLOPT_PROXYUSERPWD have no way of providing user names | ||||
|   that contain a colon. This can't be fixed easily in a backwards compatible | ||||
|   way without adding new options (and then, they should most probably allow | ||||
|   setting user name and password separately). | ||||
|  | ||||
| * libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that | ||||
|   such parts should be sent to the server as 'CWD ' (without an argument). | ||||
|   The only exception to this rule, is that we knowingly break this if the | ||||
|   empty part is first in the path, as then we use the double slashes to | ||||
|   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. | ||||
|  | ||||
| * LDAP output is garbled. Hardly anyone seems to care about LDAP functionality | ||||
|   in curl/libcurl why this report has been closed and set to be solved later. | ||||
|   If you feel this is something you want fixed, get in touch and we'll start | ||||
|   working. | ||||
|   http://sourceforge.net/tracker/index.php?func=detail&aid=735752&group_id=976&atid=100976 | ||||
|  | ||||
| * 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 | ||||
| @@ -38,63 +58,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> | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user