Compare commits
	
		
			1117 Commits
		
	
	
		
			curl-7_13_
			...
			curl-7_15_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | c7e9e60b05 | ||
|   | 47f2e1da73 | ||
|   | 5975229919 | ||
|   | 38295e8a75 | ||
|   | f9612b5eaf | ||
|   | 5cf2ef2ef7 | ||
|   | 938b5c886e | ||
|   | 0618e68200 | ||
|   | bac52f3969 | ||
|   | d494d62953 | ||
|   | 7206181385 | ||
|   | 3f22901a43 | ||
|   | f70f11fc70 | ||
|   | cffebd7fd6 | ||
|   | b8c8e7349f | ||
|   | 8bba99ae56 | ||
|   | b5c5f57613 | ||
|   | 33df856925 | ||
|   | ce09cedd2e | ||
|   | 7d68101f83 | ||
|   | aa50a00898 | ||
|   | 26f112ba55 | ||
|   | 159b9162f8 | ||
|   | d7999f9fcb | ||
|   | f13eba4c78 | ||
|   | 050e82e088 | ||
|   | 88377e5b61 | ||
|   | 241af465fd | ||
|   | 59510a554d | ||
|   | b10aa95d28 | ||
|   | 097bee681a | ||
|   | 8548c2fc61 | ||
|   | dc4fbd2e97 | ||
|   | 60b029869f | ||
|   | f592ea6c30 | ||
|   | a39ac3d94a | ||
|   | 4b23ddc002 | ||
|   | 4486d336a6 | ||
|   | 45e4b811b0 | ||
|   | 0e6a1a4420 | ||
|   | b8bf708db9 | ||
|   | 6fdbb01194 | ||
|   | d29147565c | ||
|   | 75c9430559 | ||
|   | 9ac99a80c3 | ||
|   | a15d107dde | ||
|   | 09897b8146 | ||
|   | 29e446e508 | ||
|   | 10beb36b1c | ||
|   | a65a888866 | ||
|   | 98180b5cc7 | ||
|   | 92009181af | ||
|   | 831bdb9f63 | ||
|   | 50a4dbbb5e | ||
|   | ad6511c313 | ||
|   | 7a37fa4aef | ||
|   | dcee24191f | ||
|   | 87bcb6f377 | ||
|   | b0bc2f00d2 | ||
|   | 3b19c7d0d9 | ||
|   | 12f5c67bf5 | ||
|   | d7a83d8995 | ||
|   | 7725729d90 | ||
|   | e96445bd02 | ||
|   | da2c124675 | ||
|   | 8cb695a963 | ||
|   | 54cbd7e154 | ||
|   | 5994b62930 | ||
|   | 2fbf94b0f3 | ||
|   | 32bc30e210 | ||
|   | f3bc8e6ce1 | ||
|   | 16f3a32bec | ||
|   | c44d2498e3 | ||
|   | 2aed209efa | ||
|   | b55b780d7b | ||
|   | 8d4eb2bc1f | ||
|   | 67bf4f28ff | ||
|   | 803582f8ac | ||
|   | 03603f392a | ||
|   | fcfd6d9504 | ||
|   | c31451cf13 | ||
|   | 5deff1a179 | ||
|   | e236a1c99b | ||
|   | a2f3094eb0 | ||
|   | 65afc576ea | ||
|   | 8971f656b4 | ||
|   | 394ce9ee39 | ||
|   | 67a83c1b34 | ||
|   | 1e8d094274 | ||
|   | 4c35a40858 | ||
|   | 802b2aaf6a | ||
|   | 0e79a8944b | ||
|   | bebf70667d | ||
|   | d9bd5de0b1 | ||
|   | 31c7aa0ba4 | ||
|   | fc2388189f | ||
|   | 4431338691 | ||
|   | bda1e9aeab | ||
|   | 4969ca768d | ||
|   | 2acd1c1642 | ||
|   | e1e753179a | ||
|   | f4cc8153ae | ||
|   | e4d8cb4ee0 | ||
|   | 723a78ae3f | ||
|   | cd9d0d7dec | ||
|   | 665d4f08c8 | ||
|   | 00c7780fcb | ||
|   | 15ab13dc42 | ||
|   | 8a0ca3066e | ||
|   | ea01755bb4 | ||
|   | 69c2084a18 | ||
|   | 99c0a1a7d0 | ||
|   | 5acf997e69 | ||
|   | dd87e4ed39 | ||
|   | 2f8c26ba8a | ||
|   | 81b9793807 | ||
|   | 7278f17e8f | ||
|   | 66c7427df0 | ||
|   | c1a06d858d | ||
|   | 53b5fdbe9e | ||
|   | 687cf0235e | ||
|   | b6e9229cf0 | ||
|   | 089e4848d8 | ||
|   | 58d2e7c6d1 | ||
|   | fa18d6fb76 | ||
|   | 4dcb930247 | ||
|   | 74a299fd08 | ||
|   | 532a560d87 | ||
|   | 0040a60559 | ||
|   | cc34342790 | ||
|   | bdbf6e9d19 | ||
|   | db86f765eb | ||
|   | b11dec5dd5 | ||
|   | 86becc7591 | ||
|   | 8922bc038b | ||
|   | 009f5790a4 | ||
|   | 0536b6c459 | ||
|   | 0e3ebd9841 | ||
|   | 598965a606 | ||
|   | d7a2938849 | ||
|   | a683658675 | ||
|   | 25169f68b7 | ||
|   | e5247ae65d | ||
|   | a718cb05ff | ||
|   | b466ef2581 | ||
|   | c7a634641f | ||
|   | e4388643f1 | ||
|   | bc4208201c | ||
|   | a0d69d52a1 | ||
|   | c23a1be139 | ||
|   | 9799f7afb0 | ||
|   | 6358b24fac | ||
|   | b58634316f | ||
|   | e3657644d6 | ||
|   | 7d1e3ebeed | ||
|   | 9e61dfe85e | ||
|   | 7b51aafa86 | ||
|   | 5f487123df | ||
|   | f1f32477e3 | ||
|   | df2b1251a0 | ||
|   | 02c7cf6fa5 | ||
|   | 60006ff993 | ||
|   | f3af5d7b8e | ||
|   | d551412a32 | ||
|   | 6de67a134e | ||
|   | 8ec31398e0 | ||
|   | fd0d560b47 | ||
|   | cc542269a1 | ||
|   | 7b488a3bef | ||
|   | f448168501 | ||
|   | 80a8fb98db | ||
|   | 898bb397b1 | ||
|   | 74ed5b5ebd | ||
|   | 178afd81a9 | ||
|   | d6eb1a7b98 | ||
|   | 4ff56b15e9 | ||
|   | e6b98d3152 | ||
|   | 5fd8dd2dce | ||
|   | 0ad3e046a4 | ||
|   | d6c5d24af3 | ||
|   | 8a3280a2de | ||
|   | 450a0a647a | ||
|   | 676c0cf123 | ||
|   | a731319321 | ||
|   | 81b06a09b7 | ||
|   | 23b34744d9 | ||
|   | bc8590aa12 | ||
|   | 939d368d5f | ||
|   | 336e3b8baf | ||
|   | 47c06fa308 | ||
|   | b7f447f8d8 | ||
|   | 03af76b631 | ||
|   | e105d5c28f | ||
|   | d6ffb4c177 | ||
|   | 6dbfce1031 | ||
|   | fea5ddf585 | ||
|   | b9f39c2711 | ||
|   | 5acac0309a | ||
|   | 78febad718 | ||
|   | a6a5bba0a9 | ||
|   | 51581c034d | ||
|   | 8f25a95b47 | ||
|   | 7f5d092223 | ||
|   | 2e5cccd1b6 | ||
|   | 2645782f89 | ||
|   | 9533092511 | ||
|   | 6005a461bb | ||
|   | e2df946eee | ||
|   | d14588120f | ||
|   | ab31cfa664 | ||
|   | af1c397969 | ||
|   | 947f9deed5 | ||
|   | ce95eee903 | ||
|   | b15f3bb969 | ||
|   | 998e8cba19 | ||
|   | e3f523ab2a | ||
|   | 36485e56ed | ||
|   | b4113360f6 | ||
|   | 2d71e22f08 | ||
|   | 2ae67c431c | ||
|   | 4b1a91b64f | ||
|   | 4f69318e12 | ||
|   | 1cc98ab50f | ||
|   | a6494602fd | ||
|   | 50ec78b488 | ||
|   | 7d044d14f9 | ||
|   | df03d5a8b2 | ||
|   | 6a0ed81e67 | ||
|   | c94f3e8188 | ||
|   | 1e5f6cc1dc | ||
|   | b1fece74e3 | ||
|   | fdbe0df6e7 | ||
|   | 93d59520e4 | ||
|   | b68d3a073b | ||
|   | 2100311f41 | ||
|   | e1269e3156 | ||
|   | c88d61b044 | ||
|   | f49df54a36 | ||
|   | 952bbc4410 | ||
|   | 1eb4b85d72 | ||
|   | 59b6cb9e91 | ||
|   | e06afaeb7a | ||
|   | 8c6f654b26 | ||
|   | 1d8212e53a | ||
|   | 083c5e17e1 | ||
|   | 272231fb09 | ||
|   | 67b4d9b232 | ||
|   | 21709e1557 | ||
|   | 9c312637d1 | ||
|   | feacad7f68 | ||
|   | 6513303498 | ||
|   | 3e2a52b034 | ||
|   | 176d4e85e9 | ||
|   | 84d30dffb6 | ||
|   | 0fd282b078 | ||
|   | cdf4afbe50 | ||
|   | b222b2304e | ||
|   | fdf9900114 | ||
|   | 5867eb2dd2 | ||
|   | 61f145e3de | ||
|   | b97e7fc730 | ||
|   | 01cbf08064 | ||
|   | fec632e948 | ||
|   | 6aab5b57e1 | ||
|   | d2a27e02ce | ||
|   | b55506a76d | ||
|   | afc2aa2b3f | ||
|   | d055b269ed | ||
|   | 8a246a4a9f | ||
|   | 2f684351bf | ||
|   | 74e5beab9d | ||
|   | b41765f441 | ||
|   | 05a6013f42 | ||
|   | cfff544d67 | ||
|   | 599d9642ca | ||
|   | 0264faaa4e | ||
|   | 4022a60ea7 | ||
|   | 39e366fc11 | ||
|   | 096675824f | ||
|   | 80bfa76ac9 | ||
|   | b2e553a82e | ||
|   | 772b64d9d3 | ||
|   | 92c0de518e | ||
|   | ff96456513 | ||
|   | e89adbef51 | ||
|   | 22a6a6cf81 | ||
|   | fd870e4e8a | ||
|   | d52ed3fff2 | ||
|   | bac17ab7d8 | ||
|   | 9ace303528 | ||
|   | 7e81c35cdc | ||
|   | 0f125d9bcf | ||
|   | d4714517c0 | ||
|   | 280e4bf4c3 | ||
|   | adf462fe05 | ||
|   | c2862742ab | ||
|   | 8a712eb5af | ||
|   | d58790af17 | ||
|   | 9ef7a13403 | ||
|   | a5da1219bb | ||
|   | be524fed38 | ||
|   | 042016b85e | ||
|   | f6da574324 | ||
|   | b09d5c3135 | ||
|   | ec65c3fd53 | ||
|   | 7ca2f31c8d | ||
|   | 2275737a5d | ||
|   | 5e3836055f | ||
|   | 37a6a0bb3e | ||
|   | 6bcca3eca9 | ||
|   | ce40b8d531 | ||
|   | 9f109b94b8 | ||
|   | 89024febde | ||
|   | b7a673c6e2 | ||
|   | 7f68be770d | ||
|   | 4f173f35db | ||
|   | ae9fbe573e | ||
|   | 29676f473d | ||
|   | a5fcb26ab1 | ||
|   | d68b1a1e8c | ||
|   | bd8baed138 | ||
|   | 00a7dda273 | ||
|   | 4dba07c384 | ||
|   | 4d39c6b7cc | ||
|   | 7d6f6158c9 | ||
|   | 6863dbbc0c | ||
|   | 28b96efd8b | ||
|   | 0f82af0f49 | ||
|   | f0d839436f | ||
|   | f1aa4b4127 | ||
|   | ccdb43f7f1 | ||
|   | 72900f0f90 | ||
|   | 3ad958ddb1 | ||
|   | 2c77cc90f4 | ||
|   | db4c33b4fb | ||
|   | 3fb04115fc | ||
|   | 4faaa32aef | ||
|   | cab59b4c32 | ||
|   | 931eff89f5 | ||
|   | 175335808b | ||
|   | e00216581e | ||
|   | 23951ec00c | ||
|   | a8fc5d0f9f | ||
|   | f5e85bab1c | ||
|   | 9a44fa83dc | ||
|   | 6b1e54da62 | ||
|   | b91421b107 | ||
|   | 43b3954fa5 | ||
|   | 80f2e3f263 | ||
|   | 9ea423b4c1 | ||
|   | b259c9c535 | ||
|   | 80f481a5f7 | ||
|   | 115fe1b577 | ||
|   | 06d6ea651e | ||
|   | 966fa848a0 | ||
|   | 6f8fe67ace | ||
|   | d49edc8e09 | ||
|   | 3b9c20fe31 | ||
|   | bd72c5eacf | ||
|   | 9d152a77fd | ||
|   | 33dc28b905 | ||
|   | 43ce64dcca | ||
|   | 9e0882ba98 | ||
|   | c890149c8c | ||
|   | 1a1ab2e2e8 | ||
|   | 715b706caa | ||
|   | bfa9c42c25 | ||
|   | 9d98f97e1b | ||
|   | 5eb5ce6ff3 | ||
|   | be9c873a6e | ||
|   | 034d80f6cd | ||
|   | 021e786c71 | ||
|   | 0c6bb8cb66 | ||
|   | 4d7f08a99e | ||
|   | fdef584681 | ||
|   | f335bac8a3 | ||
|   | 51369753bb | ||
|   | 82a4c2bce3 | ||
|   | e73c6e039e | ||
|   | 19bad0844f | ||
|   | 96cec4dfd7 | ||
|   | 943aea6267 | ||
|   | b433e4a1e7 | ||
|   | 20f1966c0e | ||
|   | ab1f5c3edd | ||
|   | b2be6799f2 | ||
|   | ea2618fc6f | ||
|   | 62fdf8eaed | ||
|   | d3569a3572 | ||
|   | 89df76e449 | ||
|   | e5b2f33b4f | ||
|   | 934d312f50 | ||
|   | 68917eb517 | ||
|   | 3beb2f6b5d | ||
|   | b29017f15b | ||
|   | db83a0ebbc | ||
|   | 6d9fddb95d | ||
|   | 4284190cc4 | ||
|   | 5e4cbd2d24 | ||
|   | 06c3bec65d | ||
|   | e8c3bb45ba | ||
|   | 4ec55a964d | ||
|   | b9420864c0 | ||
|   | bf6588b6a7 | ||
|   | e43217e664 | ||
|   | e19ee2d102 | ||
|   | b4c53e2cfd | ||
|   | a2902de67c | ||
|   | da192f7955 | ||
|   | a2210d23c3 | ||
|   | bd5a622400 | ||
|   | b9494cb0d6 | ||
|   | 0f73af4470 | ||
|   | 45e26b5c02 | ||
|   | 6af5ea38ce | ||
|   | b6f0aa4394 | ||
|   | 774dab58f6 | ||
|   | e3bdb98f7a | ||
|   | 58d628c9f8 | ||
|   | 1e69394545 | ||
|   | 1cf798ad14 | ||
|   | da3992d2e9 | ||
|   | 48908e4633 | ||
|   | f5ae149338 | ||
|   | 3fe5311967 | ||
|   | 6a48639c68 | ||
|   | e7093b3ca8 | ||
|   | d0a4104c0c | ||
|   | 90559bed53 | ||
|   | 973a18cf03 | ||
|   | 3c666ce57a | ||
|   | a1287ec64f | ||
|   | 5fbfa1bfa8 | ||
|   | da3ecc91f8 | ||
|   | 09c8f558f7 | ||
|   | 528a149def | ||
|   | 29e36afb6b | ||
|   | 0e39543d35 | ||
|   | 0de20d8ee6 | ||
|   | cd5de5c0e5 | ||
|   | bd5afc26bd | ||
|   | 9542dfdcdc | ||
|   | 97a6d7b1a8 | ||
|   | 209b9d4374 | ||
|   | 0b8ccd0ae7 | ||
|   | 0b7f5ad508 | ||
|   | 8a38805e82 | ||
|   | 836d88a4b8 | ||
|   | d5268ed511 | ||
|   | 0e7d93858d | ||
|   | 2164d760b7 | ||
|   | b9c8de598b | ||
|   | 9889a811db | ||
|   | 9e38d882b9 | ||
|   | e8635044b5 | ||
|   | 56dea0ac9a | ||
|   | e8b77477c7 | ||
|   | 64298e528d | ||
|   | 4f1465e7c7 | ||
|   | 6120041b69 | ||
|   | 8c1213627d | ||
|   | 3e6ae6eeb8 | ||
|   | 291e9aeabd | ||
|   | a3d776187a | ||
|   | e55f502e2f | ||
|   | e369270f88 | ||
|   | 7e845e7cfd | ||
|   | 56d9624b56 | ||
|   | 911d135deb | ||
|   | 8107b90678 | ||
|   | 7722452b98 | ||
|   | 6e1a986e0f | ||
|   | e0785ade35 | ||
|   | 0177ed6f03 | ||
|   | c62635a3b5 | ||
|   | 0177476fd2 | ||
|   | 76d7dface7 | ||
|   | 982ba21460 | ||
|   | 6081c60556 | ||
|   | 2fe3c22108 | ||
|   | 75dbb3189a | ||
|   | 32330300a9 | ||
|   | 64414df27e | ||
|   | f98ec86798 | ||
|   | 87bbd13899 | ||
|   | 51a4493add | ||
|   | 5effe8f336 | ||
|   | 296eb2bd61 | ||
|   | 9853acba66 | ||
|   | 09cb9c782d | ||
|   | 575ce905b2 | ||
|   | 54887af471 | ||
|   | 573350637e | ||
|   | 49a16f7121 | ||
|   | a4773fcbbb | ||
|   | 1e038c4bc6 | ||
|   | 6ba19692a3 | ||
|   | 432dfe2b8f | ||
|   | a142372750 | ||
|   | f14195f786 | ||
|   | 9d54f9a6b7 | ||
|   | ebb91191bf | ||
|   | 8742e294d4 | ||
|   | 8882d1fa1b | ||
|   | 0c37ab5255 | ||
|   | 747a05844d | ||
|   | c7b7bf32f8 | ||
|   | 710ee3b0e0 | ||
|   | 7a8993892d | ||
|   | 5e16a77fa9 | ||
|   | ef35519696 | ||
|   | d5baaf7756 | ||
|   | 2a94387fc3 | ||
|   | 6a5c2b0fc3 | ||
|   | fc281d6440 | ||
|   | e22ac39da4 | ||
|   | 34cadb1e54 | ||
|   | 94692b904e | ||
|   | 18f3087afd | ||
|   | 15bc228ae9 | ||
|   | 2b7a38d032 | ||
|   | 90e1a6905a | ||
|   | c36af24cbd | ||
|   | a676c18502 | ||
|   | 362912ff83 | ||
|   | 46ff13f243 | ||
|   | 340a67a6f8 | ||
|   | 9294c1e76c | ||
|   | fd704f8de0 | ||
|   | d9ca9154d1 | ||
|   | 35110eca73 | ||
|   | 9ad92b3007 | ||
|   | 2f78c96330 | ||
|   | 639857ceb2 | ||
|   | 162f58c53c | ||
|   | 84c4d96e71 | ||
|   | c0d343d56d | ||
|   | 6d14a80608 | ||
|   | f451bb7c49 | ||
|   | 20b17d6b04 | ||
|   | bb2317b63c | ||
|   | 189461dc98 | ||
|   | 69af552bc1 | ||
|   | 0ae6ff9f72 | ||
|   | 8b571fbbb1 | ||
|   | f3fcd409d5 | ||
|   | a47532f88a | ||
|   | 6c157a404b | ||
|   | 4f8a49143d | ||
|   | 493d6033aa | ||
|   | 8f219af884 | ||
|   | aeb04136f7 | ||
|   | 0b8f57bf06 | ||
|   | 6508d446e1 | ||
|   | 82cb462bb4 | ||
|   | 9a264bf610 | ||
|   | 57007e80a9 | ||
|   | b6c876bdb6 | ||
|   | 57afae79eb | ||
|   | 84c2184909 | ||
|   | e358a24a75 | ||
|   | 9da9d00c62 | ||
|   | ec3f269d1f | ||
|   | 1c388a52a5 | ||
|   | 34a827bbfe | ||
|   | 726b9e2240 | ||
|   | 2236ba0d20 | ||
|   | 463c0f7096 | ||
|   | e49a7e361c | ||
|   | 6e87cf5b30 | ||
|   | 5872e8dd7e | ||
|   | e81d4ac8c8 | ||
|   | 4922904991 | ||
|   | decae2dcda | ||
|   | 16bbd13af7 | ||
|   | ee0666c8df | ||
|   | a8a8ae2e92 | ||
|   | fd1148a728 | ||
|   | 74c7b41ee7 | ||
|   | 465e19dbe9 | ||
|   | 86660c73e5 | ||
|   | 6d8a208df2 | ||
|   | c3a826fdce | ||
|   | c5d6a42abf | ||
|   | d49c144297 | ||
|   | e7de7d5eb3 | ||
|   | 20005a83d2 | ||
|   | 27926030f9 | ||
|   | 701de67b79 | ||
|   | 883479f01e | ||
|   | b37a0b0512 | ||
|   | 5c5d5270d2 | ||
|   | 36461fb2aa | ||
|   | d8dcd5e472 | ||
|   | c51b46c982 | ||
|   | b1b63c1dd1 | ||
|   | 30c93d66eb | ||
|   | 3b60bb7259 | ||
|   | c73f8e835f | ||
|   | 93558c4299 | ||
|   | 396cff5779 | ||
|   | 336154e729 | ||
|   | bb0aba34fa | ||
|   | 1dc0ce9562 | ||
|   | e4aee168b5 | ||
|   | 2c10c895da | ||
|   | c04fae3096 | ||
|   | a214af0830 | ||
|   | f21bc46e82 | ||
|   | 044327a488 | ||
|   | c4bbcc83b6 | ||
|   | eb162b73c2 | ||
|   | 29aafb9cea | ||
|   | 40eb7d0d48 | ||
|   | 1dcb2b7e65 | ||
|   | 5470b9aa73 | ||
|   | 050bd7dd0b | ||
|   | f75038634f | ||
|   | 300b4a9158 | ||
|   | 52071f3476 | ||
|   | 42ddd745f8 | ||
|   | a7846189cd | ||
|   | 4762995d1f | ||
|   | e3a530eb61 | ||
|   | d1235ff058 | ||
|   | 4370e92dbd | ||
|   | 50e9522a06 | ||
|   | b5bb9aa8e3 | ||
|   | cf2e365f23 | ||
|   | 72e532cb67 | ||
|   | ac5635f77d | ||
|   | 640d67c119 | ||
|   | 3e79693e3b | ||
|   | d55d3c2fd0 | ||
|   | 3aced17c75 | ||
|   | bac63914db | ||
|   | 6a63c51f7c | ||
|   | 632cf13767 | ||
|   | e7012a515c | ||
|   | 6b638af92f | ||
|   | c654b79c53 | ||
|   | bee7b874ea | ||
|   | 9c3fc592f7 | ||
|   | 4eab7a1ebc | ||
|   | 3d985688e4 | ||
|   | 17ea2631cd | ||
|   | b749910e6c | ||
|   | eff36caea8 | ||
|   | 6ff092f140 | ||
|   | 28bb36e53d | ||
|   | 4a091bbd8a | ||
|   | e99a6b813e | ||
|   | b9e5302f27 | ||
|   | dd7b6aef39 | ||
|   | 910b8b6a69 | ||
|   | c3207e215f | ||
|   | f83be11b85 | ||
|   | 45bce1062a | ||
|   | 8cb344bf3c | ||
|   | fcc4518cdc | ||
|   | c84839eb91 | ||
|   | 1f878aee69 | ||
|   | 84fd4686e2 | ||
|   | ede9fb4fcc | ||
|   | 723aef71e8 | ||
|   | 48964a911e | ||
|   | 6a35cb60fd | ||
|   | 1e51c3a832 | ||
|   | 205dda2b39 | ||
|   | 1c18d19da0 | ||
|   | 645729e943 | ||
|   | f425a25c98 | ||
|   | aaace2e802 | ||
|   | 3f16d9fbc9 | ||
|   | 3afc57bab8 | ||
|   | 55225106b6 | ||
|   | 1a31bff9fe | ||
|   | 4eaa3329ec | ||
|   | 028d78b993 | ||
|   | 944af98be6 | ||
|   | 2789b2b0ad | ||
|   | 7dded571de | ||
|   | 95fe8372e8 | ||
|   | ecdcb0ef67 | ||
|   | 6a04a03eb5 | ||
|   | 0c96056a94 | ||
|   | f518a5e231 | ||
|   | f581c1062e | ||
|   | 0b3deceea3 | ||
|   | fa4cd8868c | ||
|   | 8c573ca7f3 | ||
|   | 5a5cf3a51d | ||
|   | 3f23e8443e | ||
|   | a00f9b093c | ||
|   | 5f538ce3f8 | ||
|   | ebcaa3d579 | ||
|   | 60e26199a2 | ||
|   | 11defd180c | ||
|   | c82c1691ee | ||
|   | 364562f209 | ||
|   | 5d9fc28fa7 | ||
|   | e5ec5c284f | ||
|   | a90e33ad71 | ||
|   | 62ab21ce7d | ||
|   | cc8e8db1e5 | ||
|   | b19cba2016 | ||
|   | 315a9c95d5 | ||
|   | e010ac9706 | ||
|   | e4c0a85da0 | ||
|   | d3e4cdd5b0 | ||
|   | 763b812dc7 | ||
|   | 3269dfb4ab | ||
|   | e816bd259f | ||
|   | a295408e09 | ||
|   | 42a34c7cd7 | ||
|   | 9a72751958 | ||
|   | 314e6fa80b | ||
|   | b2b66f749a | ||
|   | 708ed6fded | ||
|   | 5c30fa50d6 | ||
|   | fc33c424d9 | ||
|   | b04d6dd0b1 | ||
|   | 9c5f79c56a | ||
|   | ef5eea689a | ||
|   | fd191deb49 | ||
|   | e1da1ff7d3 | ||
|   | 2b00ed7ef8 | ||
|   | d960ea959d | ||
|   | 274842ec41 | ||
|   | c06da7c84a | ||
|   | cea117b509 | ||
|   | 6078c938b2 | ||
|   | 9e95dd4821 | ||
|   | 0cc8b57d4f | ||
|   | 2179e6e797 | ||
|   | 7dde3d1825 | ||
|   | a0fe950b75 | ||
|   | 44985e8884 | ||
|   | f03366bcbf | ||
|   | d43ea83033 | ||
|   | 11bdba0007 | ||
|   | 07e58aaa79 | ||
|   | a31ddd363b | ||
|   | ed9e10f2d8 | ||
|   | 02ae3c2810 | ||
|   | 669ebb5f71 | ||
|   | 9a3e0e52cb | ||
|   | b0f856213d | ||
|   | 6f4ff1f2bf | ||
|   | d3eea61f1f | ||
|   | d59d81fae8 | ||
|   | 329ca40b6f | ||
|   | e71bd416f4 | ||
|   | ad66fc6cc2 | ||
|   | d12b44204b | ||
|   | 4be2136de4 | ||
|   | c4dbed040b | ||
|   | 366b62af2d | ||
|   | a6955aa486 | ||
|   | ad30341fa2 | ||
|   | 23da55a9f1 | ||
|   | 41e6292e7b | ||
|   | ae1d6f29d9 | ||
|   | ccfc1ddbef | ||
|   | 002de1eae2 | ||
|   | 63621bae81 | ||
|   | 85f9e6c4b9 | ||
|   | 967ec296c0 | ||
|   | c6aae9b1d7 | ||
|   | 913c370c25 | ||
|   | e5472bbd21 | ||
|   | 957c258c6d | ||
|   | abee109cd1 | ||
|   | 502e5ae6e1 | ||
|   | b8417be1f2 | ||
|   | 9e037431b4 | ||
|   | f71b3676bb | ||
|   | 50fe7b5e35 | ||
|   | 9fb253388b | ||
|   | 8cf1786296 | ||
|   | 51b17b299c | ||
|   | 78882e4642 | ||
|   | 8465a367a4 | ||
|   | 3bcfe678ab | ||
|   | d5403f3a5b | ||
|   | 26abb48533 | ||
|   | 177848ed27 | ||
|   | 656a2e93d7 | ||
|   | 6b1220b61d | ||
|   | 9d7330d879 | ||
|   | 26a5954fa0 | ||
|   | 01165e08e0 | ||
|   | 6e1633a6c5 | ||
|   | a8ff0a21bf | ||
|   | b8bc6bed97 | ||
|   | 1a4402038c | ||
|   | 5ac51cc9b5 | ||
|   | c12159ce21 | ||
|   | 4485503ecc | ||
|   | 200ac588cc | ||
|   | 0bb040822d | ||
|   | 543fbe14ee | ||
|   | e02ab66120 | ||
|   | 76c7c694c5 | ||
|   | f0057977b7 | ||
|   | e8e43f06af | ||
|   | 04b35e86d5 | ||
|   | 64ab85da4f | ||
|   | b8d7a13ea3 | ||
|   | 78a76dc905 | ||
|   | 5fa5fff0e9 | ||
|   | d323b3d816 | ||
|   | b685b5672a | ||
|   | 8f6c2f87c8 | ||
|   | f30e8b11eb | ||
|   | 8bd6d6a4de | ||
|   | b3a8f438fc | ||
|   | e78ddf0a95 | ||
|   | 5f0366c2cb | ||
|   | 779ca09775 | ||
|   | 313f1a1e83 | ||
|   | 21337f4776 | ||
|   | 53a8e5655b | ||
|   | 2d85585ae1 | ||
|   | 63d109f7be | ||
|   | c904b6b5bf | ||
|   | 6a27449922 | ||
|   | 9a9c07f571 | ||
|   | 4382204e1b | ||
|   | 6d3114efe2 | ||
|   | b62baaed95 | ||
|   | 9b391e531b | ||
|   | a0c7a6d22b | ||
|   | 14424f7058 | ||
|   | 6063dff8d0 | ||
|   | 7fba9ed398 | ||
|   | 53280a196b | ||
|   | 0bf9a5704b | ||
|   | 8182d17ae1 | ||
|   | 69b1ac7dcd | ||
|   | b15507aac3 | ||
|   | 6c2f583f51 | ||
|   | a72eaddda3 | ||
|   | dc050e45df | ||
|   | 2fcbf13920 | ||
|   | 099ae31523 | ||
|   | c2fcdf3a02 | ||
|   | 2056a538b9 | ||
|   | cd1144dc24 | ||
|   | e9d068b913 | ||
|   | ec2ad57c32 | ||
|   | 316adac511 | ||
|   | d7b11d4c33 | ||
|   | c52aa6df33 | ||
|   | a19b23b59f | ||
|   | 4e26b2a65b | ||
|   | 7c4feac6db | ||
|   | e01e364c37 | ||
|   | c13a3d7b84 | ||
|   | 67805b6dc5 | ||
|   | 0050ab2a3d | ||
|   | 60e66c6cbf | ||
|   | 5ad2a253e8 | ||
|   | b5d50e9298 | ||
|   | 37f7362aca | ||
|   | bee198def5 | ||
|   | f09e479fd6 | ||
|   | 80fe93bc33 | ||
|   | ea03ad3bee | ||
|   | feec421744 | ||
|   | 634982840e | ||
|   | fb3c85ab2f | ||
|   | a9b7c3531c | ||
|   | a7ba0d908d | ||
|   | 2fc70e2c5d | ||
|   | 7ae3f0e70c | ||
|   | 9afaa51e3f | ||
|   | c736a719f1 | ||
|   | 37a547842b | ||
|   | b9f1d43921 | ||
|   | bec6423c02 | ||
|   | 241b2b4ae3 | ||
|   | 14d9b56937 | ||
|   | 1c3766eb46 | ||
|   | 70024d61eb | ||
|   | 2085f133d6 | ||
|   | 2a045dfceb | ||
|   | 893cbaaf2f | ||
|   | 6e61939382 | ||
|   | 015a618172 | ||
|   | 2a8b91cdb9 | ||
|   | bebd5dbc5a | ||
|   | 018dbfe058 | ||
|   | c6ea597817 | ||
|   | 175b00c0a2 | ||
|   | 5ebc6e305e | ||
|   | 993600761f | ||
|   | 1d9fff80b7 | ||
|   | c712b84dd5 | ||
|   | dcf8dd4b5e | ||
|   | ba26c3fb22 | ||
|   | 41563607a8 | ||
|   | 2d4dcfb740 | ||
|   | 34854e70cf | ||
|   | 758d9fe852 | ||
|   | 6a6c0e7a73 | ||
|   | ee44eec3e1 | ||
|   | eccd0d8e37 | ||
|   | 983be0ec60 | ||
|   | 243a45d840 | ||
|   | 60ec804047 | ||
|   | c53e9ccf4a | ||
|   | 6e8e0418fc | ||
|   | e9eb52305f | ||
|   | 8501ae748c | ||
|   | da59692067 | ||
|   | bae77c0a46 | ||
|   | b42bc7329e | ||
|   | 9b3c2b6ae2 | ||
|   | 833b6df969 | ||
|   | 0b45431139 | ||
|   | 5d1349031c | ||
|   | 82388a5e4c | ||
|   | 74816fed6c | ||
|   | b4c9789d5f | ||
|   | f96fadc074 | ||
|   | f6b1173437 | ||
|   | 346992c366 | ||
|   | ab4086bc24 | ||
|   | d8e7f2b2c7 | ||
|   | 93fcb94b62 | ||
|   | 32a446cf19 | ||
|   | 94459cab98 | ||
|   | 158588640a | ||
|   | f00f050d1b | ||
|   | c4f34c60a5 | ||
|   | 371ef80dc3 | ||
|   | 84b4e9ff7c | ||
|   | 677a74fa1b | ||
|   | 8a076d1dba | ||
|   | 970722483c | ||
|   | 31443724c6 | ||
|   | 0e7614919b | ||
|   | 2bf72937d2 | ||
|   | 4e555c7b32 | ||
|   | bd7021d05b | ||
|   | 1a14555605 | ||
|   | cb3fb371ea | ||
|   | 6c6dda1b74 | ||
|   | a712808006 | ||
|   | e19c203728 | ||
|   | 8817779f23 | ||
|   | 3e5a32671c | ||
|   | d34f32b39e | ||
|   | c85a77e0b1 | ||
|   | 9406e517e6 | ||
|   | 4a56049225 | ||
|   | 04ea4b4d75 | ||
|   | 5b6b6283f3 | ||
|   | 38f07ce0fb | ||
|   | 987cdebefb | ||
|   | 6b978db369 | ||
|   | 5840c8cb70 | ||
|   | 44f2024bab | ||
|   | 410942e9df | ||
|   | 5b3730feae | ||
|   | 38f797ccd6 | ||
|   | 553c5a7501 | ||
|   | bbba9d568f | ||
|   | 11e43dd021 | ||
|   | e8ddf84871 | ||
|   | 67f04d2d5f | ||
|   | 8f646eef45 | ||
|   | d26e932858 | ||
|   | 73b9d0840c | ||
|   | 2ea4326c40 | ||
|   | 8b80ac2877 | ||
|   | 233237740d | ||
|   | f5cdac38bd | ||
|   | 760565dcad | ||
|   | b5d97b3d94 | ||
|   | 4a6cc54eb5 | ||
|   | 61133545f6 | ||
|   | bf87d13f5b | ||
|   | efaf688650 | ||
|   | 9a5c21c16f | ||
|   | 06ffb47ef2 | ||
|   | 1acbda97e0 | ||
|   | d6460aff36 | ||
|   | a357f77c4c | ||
|   | d5bdd2b2f9 | ||
|   | 562d2de303 | ||
|   | 1f68fa19c7 | ||
|   | 677ddd6160 | ||
|   | 228e627475 | ||
|   | ec4e653c6f | ||
|   | 3916d1e6cb | ||
|   | 387aaba810 | ||
|   | 9f3d9da119 | ||
|   | 76c24a0d82 | ||
|   | ffd65a1956 | ||
|   | de8947f92f | ||
|   | d2b4dedbe4 | ||
|   | 34865ffb4a | ||
|   | 62970da675 | ||
|   | 8ed31c48e0 | ||
|   | 13d40e33a4 | ||
|   | c765213aaa | ||
|   | 983bf93a24 | ||
|   | 2f8085af15 | ||
|   | 88a4dc2795 | ||
|   | b5112096d7 | ||
|   | fc80c714e8 | ||
|   | 84bc23b92f | ||
|   | d90472dd64 | ||
|   | 3b63ed8230 | ||
|   | e75441e027 | ||
|   | 0ae8b51230 | ||
|   | 547c136b4f | ||
|   | 4ed13bde55 | ||
|   | 80e01deba0 | ||
|   | fb9ae9d0e2 | ||
|   | dd54d8551b | ||
|   | 205f8b266c | ||
|   | c4ce9ac4de | ||
|   | 0e4e28fdda | ||
|   | db2370a12f | ||
|   | d1d35ba85f | ||
|   | 2ab2e7675c | ||
|   | 0472629222 | ||
|   | c4f7570a23 | ||
|   | d26cfd5791 | ||
|   | b7ffc6bb45 | ||
|   | 8a96aec567 | ||
|   | 5cd9f57137 | ||
|   | 702664e959 | ||
|   | 18d87edd6d | ||
|   | dc59795629 | ||
|   | cb9bb31f7d | ||
|   | 02706bec94 | ||
|   | 7657186bf6 | ||
|   | 42ac24448c | ||
|   | 31891b55a4 | ||
|   | aa47ac4c06 | ||
|   | b01151e81c | ||
|   | 67bd6f9ccd | ||
|   | 4869fa285b | ||
|   | d221e01406 | ||
|   | 874fc8228a | ||
|   | 6f752c64bc | ||
|   | ccb7950c4c | ||
|   | 750e771376 | ||
|   | 7012a4a291 | ||
|   | 40ab20a252 | ||
|   | 6af315e50c | ||
|   | 861b5e608b | ||
|   | f61917594e | ||
|   | 0ddab51ad8 | ||
|   | 9798432f56 | ||
|   | 5faf52619d | ||
|   | f8b4ba80e0 | ||
|   | 527f70e540 | ||
|   | 19f66c7575 | ||
|   | b7721deb02 | ||
|   | 5ba188ab2d | ||
|   | eadfd78c2e | ||
|   | 4d815c9990 | ||
|   | 176981b529 | ||
|   | 85baebd0d4 | ||
|   | ac022b2e30 | ||
|   | f169b750b8 | ||
|   | 86295eef13 | ||
|   | 32d60b2714 | ||
|   | 0a3065a2f2 | ||
|   | b98faaa8c0 | ||
|   | 73772323c9 | ||
|   | 98389066e2 | ||
|   | fb53ed4c1f | ||
|   | e719eb5b81 | ||
|   | 3858063bcd | ||
|   | d4f5fea840 | ||
|   | 22c1d48cb2 | ||
|   | e7cefd684b | ||
|   | d2485e4f20 | ||
|   | 160d6b26b0 | ||
|   | 17d61e4f29 | ||
|   | 446b9467da | ||
|   | 3970a7056c | ||
|   | 74068a6d1b | ||
|   | 8c83422fe2 | ||
|   | 61a1e3cd01 | ||
|   | 89cac6f25c | ||
|   | 62082293c5 | ||
|   | 153fd2752c | ||
|   | e649a40f5d | ||
|   | 32d76a5b57 | ||
|   | 14aa3fa258 | ||
|   | f5394cccb1 | ||
|   | 64dd9c7656 | ||
|   | 16ae0c6466 | ||
|   | 6a2e21ec8c | ||
|   | 120f17ce04 | ||
|   | ab938bb9bd | ||
|   | 33820cd2ac | ||
|   | 41def21f91 | ||
|   | d118312922 | ||
|   | 82b93e4945 | ||
|   | e36fb1ecda | ||
|   | e4a1788614 | ||
|   | 7b23eff9cf | ||
|   | 67ff8e3ea3 | ||
|   | 2248599ae1 | ||
|   | 29350b363b | ||
|   | 83c470a443 | ||
|   | ab96e2d6e9 | ||
|   | 6b81cf4bc9 | ||
|   | 0d9301539e | 
| @@ -12,3 +12,4 @@ depcomp | |||||||
| config.guess | config.guess | ||||||
| config.sub | config.sub | ||||||
| ltmain.sh | ltmain.sh | ||||||
|  | libcurl.pc | ||||||
|   | |||||||
							
								
								
									
										1994
									
								
								CHANGES.2004
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1994
									
								
								CHANGES.2004
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2
									
								
								COPYING
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								COPYING
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| COPYRIGHT AND PERMISSION NOTICE | COPYRIGHT AND PERMISSION NOTICE | ||||||
|  |  | ||||||
| Copyright (c) 1996 - 2004, Daniel Stenberg, <daniel@haxx.se>. | Copyright (c) 1996 - 2006, Daniel Stenberg, <daniel@haxx.se>. | ||||||
|  |  | ||||||
| All rights reserved. | All rights reserved. | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | |||||||
| #                            | (__| |_| |  _ <| |___ | #                            | (__| |_| |  _ <| |___ | ||||||
| #                             \___|\___/|_| \_\_____| | #                             \___|\___/|_| \_\_____| | ||||||
| # | # | ||||||
| # Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | # Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||||
| # | # | ||||||
| # This software is licensed as described in the file COPYING, which | # This software is licensed as described in the file COPYING, which | ||||||
| # you should have received as part of this distribution. The terms | # you should have received as part of this distribution. The terms | ||||||
| @@ -31,6 +31,9 @@ bin_SCRIPTS = curl-config | |||||||
| SUBDIRS = lib src | SUBDIRS = lib src | ||||||
| DIST_SUBDIRS = $(SUBDIRS) tests include packages docs | DIST_SUBDIRS = $(SUBDIRS) tests include packages docs | ||||||
|  |  | ||||||
|  | pkgconfigdir = $(libdir)/pkgconfig | ||||||
|  | pkgconfig_DATA = libcurl.pc | ||||||
|  |  | ||||||
| dist-hook: | dist-hook: | ||||||
| 	rm -rf $(top_builddir)/tests/log | 	rm -rf $(top_builddir)/tests/log | ||||||
| 	find $(distdir) -name "*.dist" -exec rm {} \; | 	find $(distdir) -name "*.dist" -exec rm {} \; | ||||||
| @@ -48,6 +51,15 @@ pdf: | |||||||
|  |  | ||||||
| check: test | check: test | ||||||
|  |  | ||||||
|  | if CROSSCOMPILING | ||||||
|  | test-full: test | ||||||
|  | test-torture: test | ||||||
|  |  | ||||||
|  | test: | ||||||
|  | 	@echo "NOTICE: we can't run the tests when cross-compiling!" | ||||||
|  |  | ||||||
|  | else | ||||||
|  |  | ||||||
| test: | test: | ||||||
| 	@(cd tests; $(MAKE) all quiet-test) | 	@(cd tests; $(MAKE) all quiet-test) | ||||||
|  |  | ||||||
| @@ -57,6 +69,8 @@ test-full: | |||||||
| test-torture: | test-torture: | ||||||
| 	@(cd tests; $(MAKE) all torture-test) | 	@(cd tests; $(MAKE) all torture-test) | ||||||
|  |  | ||||||
|  | endif | ||||||
|  |  | ||||||
| # | # | ||||||
| # Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros | # Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros | ||||||
| # must contain the following line: | # must contain the following line: | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| #                            | (__| |_| |  _ <| |___ | #                            | (__| |_| |  _ <| |___ | ||||||
| #                             \___|\___/|_| \_\_____| | #                             \___|\___/|_| \_\_____| | ||||||
| # | # | ||||||
| # Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | # Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||||
| # | # | ||||||
| # This software is licensed as described in the file COPYING, which | # This software is licensed as described in the file COPYING, which | ||||||
| # you should have received as part of this distribution. The terms | # you should have received as part of this distribution. The terms | ||||||
| @@ -174,6 +174,12 @@ vc-zlib-dll: | |||||||
| 	cd ..\src | 	cd ..\src | ||||||
| 	nmake /f Makefile.vc6 cfg=release-zlib-dll | 	nmake /f Makefile.vc6 cfg=release-zlib-dll | ||||||
|  |  | ||||||
|  | vc-sspi: | ||||||
|  | 	cd lib | ||||||
|  | 	nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1 | ||||||
|  | 	cd ..\src | ||||||
|  | 	nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1 | ||||||
|  |  | ||||||
| djgpp: | djgpp: | ||||||
| 	$(MAKE) -C lib -f Makefile.dj | 	$(MAKE) -C lib -f Makefile.dj | ||||||
| 	$(MAKE) -C src -f Makefile.dj | 	$(MAKE) -C src -f Makefile.dj | ||||||
| @@ -194,9 +200,21 @@ netware: | |||||||
| 	$(MAKE) -C lib -f Makefile.netware | 	$(MAKE) -C lib -f Makefile.netware | ||||||
| 	$(MAKE) -C src -f Makefile.netware | 	$(MAKE) -C src -f Makefile.netware | ||||||
|  |  | ||||||
|  | netware-ares: | ||||||
|  | 	$(MAKE) -C lib -f Makefile.netware WITH_ARES=1 | ||||||
|  | 	$(MAKE) -C src -f Makefile.netware WITH_ARES=1 | ||||||
|  |  | ||||||
| netware-ssl: | netware-ssl: | ||||||
| 	$(MAKE) -C lib -f Makefile.netware SSL=1 | 	$(MAKE) -C lib -f Makefile.netware WITH_SSL=1 | ||||||
| 	$(MAKE) -C src -f Makefile.netware SSL=1 | 	$(MAKE) -C src -f Makefile.netware WITH_SSL=1 | ||||||
|  |  | ||||||
|  | netware-ssl-zlib: | ||||||
|  | 	$(MAKE) -C lib -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1 | ||||||
|  | 	$(MAKE) -C src -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1 | ||||||
|  |  | ||||||
|  | netware-zlib: | ||||||
|  | 	$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1 | ||||||
|  | 	$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1 | ||||||
|  |  | ||||||
| netware-clean: | netware-clean: | ||||||
| 	$(MAKE) -C lib -f Makefile.netware clean | 	$(MAKE) -C lib -f Makefile.netware clean | ||||||
|   | |||||||
							
								
								
									
										71
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								README
									
									
									
									
									
								
							| @@ -26,50 +26,41 @@ CONTACT | |||||||
|   If you have problems, questions, ideas or suggestions, please contact us |   If you have problems, questions, ideas or suggestions, please contact us | ||||||
|   by posting to a suitable mailing list. See http://curl.haxx.se/mail/ |   by posting to a suitable mailing list. See http://curl.haxx.se/mail/ | ||||||
|  |  | ||||||
|   Many major contributors to the project are listed in the THANKS document. |   All contributors to the project are listed in the THANKS document. | ||||||
|  |  | ||||||
| WEB SITE | WEB SITE | ||||||
|  |  | ||||||
|   Visit the curl web site or mirrors for the latest news: |   Visit the curl web site or mirrors for the latest news and downloads: | ||||||
|  |  | ||||||
|         Sweden    -- http://curl.haxx.se/ |         Sweden       http://curl.haxx.se/ | ||||||
|         Australia -- http://curl.planetmirror.com/ |         Australia    http://curl.planetmirror.com/ | ||||||
|         Austria   -- http://curl.gds.tuwien.ac.at/ |         Austria      http://curl.gds.tuwien.ac.at/ | ||||||
|         Denmark   -- http://curl.cofman.dk/ |         Denmark      http://curl.cofman.dk/ | ||||||
|         Estonia   -- http://curl.wildyou.net/ |         France       http://curl.fastmirror.net/ | ||||||
|         France    -- http://curl.mirror.internet.tp/ |         Germany      http://curl.freemirror.de/ | ||||||
|         Germany   -- http://curl.kgt.org/ |         Germany      http://curl.mirror-server.net/ | ||||||
|         Germany   -- http://curl.mirror.at.stealer.net/ |         Germany      http://curl.mirror.at.stealer.net/ | ||||||
|         Germany   -- http://curl.netmirror.org/ |         Germany      http://curl.mirroring.de/ | ||||||
|         Russia    -- http://curl.tsuren.net/ |         Germany      http://curl.miscellaneousmirror.org/ | ||||||
|         Taiwan    -- http://curl.cs.pu.edu.tw/ |         Germany      http://curl.mons-new-media.de/ | ||||||
|         Thailand  -- http://curl.siamu.ac.th/ |         Germany      http://curl.storemypix.com/ | ||||||
|         US (CA)   -- http://curl.mirror.redwire.net/ |         Germany      http://curl.triplemind.com/ | ||||||
|         US (CA)   -- http://curl.mirrormonster.com/ |         Hong Kong    http://curl.hkmirror.org/ | ||||||
|         US (CA)   -- http://curl.signal42.com/ |         Japan        http://curl.s-lines.net/ | ||||||
|         US (TX)   -- http://curl.109k.com/ |         Netherlands  http://curl.nedmirror.nl/ | ||||||
|  |         Russia       http://curl.tsuren.net/ | ||||||
| DOWNLOAD |         Taiwan       http://curl.cs.pu.edu.tw/ | ||||||
|  |         Thailand     http://curl.siamu.ac.th/ | ||||||
|   The official download mirror sites are: |         US (AZ)      http://curl.islandofpoker.com/ | ||||||
|  |         US (CA)      http://curl.meulie.net/ | ||||||
|         Australia -- http://curl.planetmirror.com/download.html |         US (CA)      http://curl.mirror.redwire.net/ | ||||||
|         Austria   -- http://curl.gds.tuwien.ac.at/download.html |         US (CA)      http://curl.mirrormonster.com/ | ||||||
|         Estonia   -- http://curl.wildyou.net/download.html |         US (CA)      http://curl.signal42.com/ | ||||||
|         Germany   -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/ |         US (FL)      http://curl.hoxt.com/ | ||||||
|         Germany   -- http://curl.mirror.at.stealer.net/download.html |         US (TX)      http://curl.109k.com/ | ||||||
|         Germany   -- http://curl.netmirror.org/download.html |         US (TX)      http://curl.hostingzero.com/ | ||||||
|         Germany   -- http://www.mirrorspace.org/curl/ |         US (TX)      http://curl.mirrors.cyberservers.net/ | ||||||
|         Hongkong  -- http://www.execve.net/curl/ |         US (TX)      http://curl.seekmeup.com/ | ||||||
|         Russia    -- http://curl.tsuren.net/download.html |  | ||||||
|         Sweden    -- ftp://ftp.sunet.se/pub/www/utilities/curl/ |  | ||||||
|         Sweden    -- http://cool.haxx.se/curl/ |  | ||||||
|         Taiwan    -- http://curl.cs.pu.edu.tw/download.html |  | ||||||
|         Thailand  -- http://curl.siamu.ac.th/download.html |  | ||||||
|         US (CA)   -- http://curl.mirror.redwire.net/download.html |  | ||||||
|         US (CA)   -- http://curl.mirrormonster.com/download.html |  | ||||||
|         US (CA)   -- http://curl.signal42.com/download.html |  | ||||||
|         US (TX)   -- http://curl.109k.com/download.html |  | ||||||
|  |  | ||||||
| CVS | CVS | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,60 +1,40 @@ | |||||||
| Curl and libcurl 7.13.0 | Curl and libcurl 7.15.3 | ||||||
|  |  | ||||||
|  Public curl release number:               85 |  Public curl release number:               93 | ||||||
|  Releases counted from the very beginning: 112 |  Releases counted from the very beginning: 120 | ||||||
|  Available command line options:           104 |  Available command line options:           112 | ||||||
|  Available curl_easy_setopt() options:     122 |  Available curl_easy_setopt() options:     129 | ||||||
|  Number of public functions in libcurl:    46 |  Number of public functions in libcurl:    46 | ||||||
|  Amount of public web site mirrors:        15 |  Amount of public web site mirrors:        31 | ||||||
|  Number of known libcurl bindings:         29 |  Number of known libcurl bindings:         32 | ||||||
|  |  Number of contributors:                   487 | ||||||
|  |  | ||||||
| This release includes the following changes: | This release includes the following changes: | ||||||
|  |  | ||||||
|  o added --ftp-account and CURLOPT_FTP_ACCOUNT |  o added docs for --ftp-method and CURLOPT_FTP_FILEMETHOD | ||||||
|  o added CURLOPT_SOURCE_URL and CURLOPT_SOURCE_QUOTE |  | ||||||
|  o obsoleted CURLOPT_SOURCE_HOST, CURLOPT_SOURCE_PATH, CURLOPT_SOURCE_PORT |  | ||||||
|    and CURLOPT_PASV_HOST |  | ||||||
|  o added --3p-url, --3p-user and --3p-quote |  | ||||||
|  o -Q "+[command]" was added |  | ||||||
|  o src/getpass.c license issue sorted (code was rewritten) |  | ||||||
|  o curl -w now supports 'http_connect' for the proxy's response to CONNECT |  | ||||||
|  o introducing "curl-config --protocols" |  | ||||||
|  |  | ||||||
| This release includes the following bugfixes: | This release includes the following bugfixes: | ||||||
|  |  | ||||||
|  o re-sending a request when retrying on a fresh connection with multi |  o TFTP Packet Buffer Overflow Vulnerability: | ||||||
|    interface |    http://curl.haxx.se/docs/adv_20060320.html | ||||||
|  o improved valgrind report parser in the test suite |  o properly detecting problems with sending the FTP command USER | ||||||
|  o several valgrind reports |  o wrong error message shown when certificate verification failed | ||||||
|  o CURLOPT_FTPPORT and -P work when built ipv6-enabled |  o multi-part formpost with multi interface crash | ||||||
|  o FTP third party transfers was much improved |  o the CURLFTPSSL_CONTROL setting for CURLOPT_FTP_SSL is acknowledged | ||||||
|  o proxy environment variables are now ignored when built HTTP-disabled |  o "SSL: couldn't set callback" is now treated as a less serious problem | ||||||
|  o CURLOPT_PROXY can now disable HTTP proxy even when built HTTP-disabled |  o Interix build fix | ||||||
|  o "curl dictionary.com" no longer assumes DICT protocol |  o fixed curl "hang" when out of file handles at start | ||||||
|  o re-invoke some system calls on EINTR |  o prevent FTP uploads to URLs with trailing slash | ||||||
|  o duplicate Host: when failed connection re-use |  | ||||||
|  o SOCKS5 version check |  | ||||||
|  o memory problem with cleaning up multi interface |  | ||||||
|  o SSL certificate name memory leak |  | ||||||
|  o -d with -G to multiple URLs crashed |  | ||||||
|  o double va_list access crash fixed |  | ||||||
|  o minor memory leak when "version" is set in a cookie header |  | ||||||
|  o builds fine on BeOS and NetBSD |  | ||||||
|  o builds and runs fine on FreeBSD |  | ||||||
|  |  | ||||||
| Other curl-related news since the previous public release: | Other curl-related news since the previous public release: | ||||||
|  |  | ||||||
|  o cURLpp 0.3.2 - https://rrette.com/curlpp.html |  o pycurl-7.15.2 has been released: http://pycurl.sf.net | ||||||
|  o pycURL 7.12.3 - http://pycurl.sourceforge.net/ |  o http://curl.download.nextag.com/ is a new US curl web mirror! | ||||||
|  o new web mirror: http://curl.mirrormonster.com/ (US, California) |  | ||||||
|  |  | ||||||
| This release would not have looked like this without help, code, reports and | This release would not have looked like this without help, code, reports and | ||||||
| advice from friends like these: | advice from friends like these: | ||||||
|  |  | ||||||
|  Dan Fandrich, Peter Pentchev, Marcin Konicki, Rune Kleveland, David Shaw, |  Gisle Vanem, Dan Fandrich, Thomas Klausner, Todd Vierling, Peter Heuchert, | ||||||
|  Werner Koch, Gisle Vanem, Alex Neblett, Kai Sommerfeld, Marty Kuhrt, |  Markus Koetter, David McCreedy, Tor Arntsen | ||||||
|  Hzhijun, Pavel Orehov, Bruce Mitchener, Cyrill Osterwalder, Dan Torop, |  | ||||||
|  Martijn Koster, Alex aka WindEagle, Cody Jones, Samuel D<>az Garc<72>a, |  | ||||||
|  Stephan Bergmann, Philippe Hameau, Ian Ford, Stephen More, Lars Nilsson |  | ||||||
|  |  | ||||||
|         Thanks! (and sorry if I forgot to mention someone) |         Thanks! (and sorry if I forgot to mention someone) | ||||||
|   | |||||||
							
								
								
									
										36
									
								
								TODO-RELEASE
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								TODO-RELEASE
									
									
									
									
									
								
							| @@ -1,36 +1,4 @@ | |||||||
| Issues not sorted in any particular order. | To get fixed in 7.15.2 (planned release: Febrary 2006) | ||||||
|  |  | ||||||
| To get fixed in 7.13.1 (planned release: April 2005) |  | ||||||
| ====================== | ====================== | ||||||
|  |  | ||||||
| 58 - Fix KNOWN_BUGS #19: "FTP 3rd party transfers with the multi interface | 65 -  | ||||||
|      doesn't work" |  | ||||||
|  |  | ||||||
| 59 - Figure out a fix for David Byron's SSL problems: |  | ||||||
|      http://curl.haxx.se/mail/lib-2005-01/0240.html |  | ||||||
|  |  | ||||||
| 47 - Peter Sylvester's patch for SRP on the TLS layer |  | ||||||
|      Awaits OpenSSL support for this, no need to support this in libcurl before |  | ||||||
|      there's an OpenSSL release that does it. |  | ||||||
|  |  | ||||||
| 54 - Turn the FTP code into a state machine to support the multi interface |  | ||||||
|      100% non-blocking. |  | ||||||
|  |  | ||||||
| To get fixed in 7.14.0 |  | ||||||
| ====================== |  | ||||||
|  |  | ||||||
| 55 - Add a function to the multi interface that gets file descriptors, as an |  | ||||||
|      alternative to the curl_multi_fdset(). This is necessary to allow apps to |  | ||||||
|      properly avoid the FD_SETSIZE problem. |  | ||||||
|  |  | ||||||
| 56 - Make curl_easy_perform() a wrapper-function that simply creates a multi |  | ||||||
|      handle, adds the easy handle to it, runs curl_multi_perform() until the |  | ||||||
|      transfer is done, then detach the easy handle, destroy the multi handle |  | ||||||
|      and return the easy handle's return code. This will thus make everything |  | ||||||
|      internally use and assume the multi interface. The select()-loop should |  | ||||||
|      use the new function from (55). |  | ||||||
|  |  | ||||||
| 57 - Add an interface to libcurl for getting and setting cookies from an easy |  | ||||||
|      handle. One idea: http://curl.haxx.se/mail/lib-2004-12/0195.html the |  | ||||||
|      older idea: http://curl.haxx.se/dev/COOKIES. We need to settle on some |  | ||||||
|      middle ground I guess. |  | ||||||
|   | |||||||
							
								
								
									
										726
									
								
								acinclude.m4
									
									
									
									
									
								
							
							
						
						
									
										726
									
								
								acinclude.m4
									
									
									
									
									
								
							| @@ -1,3 +1,393 @@ | |||||||
|  | #*************************************************************************** | ||||||
|  | #                                  _   _ ____  _ | ||||||
|  | #  Project                     ___| | | |  _ \| | | ||||||
|  | #                             / __| | | | |_) | | | ||||||
|  | #                            | (__| |_| |  _ <| |___ | ||||||
|  | #                             \___|\___/|_| \_\_____| | ||||||
|  | # | ||||||
|  | # Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||||
|  | # | ||||||
|  | # This software is licensed as described in the file COPYING, which | ||||||
|  | # you should have received as part of this distribution. The terms | ||||||
|  | # are also available at http://curl.haxx.se/docs/copyright.html. | ||||||
|  | # | ||||||
|  | # You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||||
|  | # copies of the Software, and permit persons to whom the Software is | ||||||
|  | # furnished to do so, under the terms of the COPYING file. | ||||||
|  | # | ||||||
|  | # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||||
|  | # KIND, either express or implied. | ||||||
|  | # | ||||||
|  | # $Id$ | ||||||
|  | ########################################################################### | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_HEADER_WINDOWS | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for compilable and valid windows.h header  | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [ | ||||||
|  |   AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [ | ||||||
|  |     AC_COMPILE_IFELSE([ | ||||||
|  |       AC_LANG_PROGRAM([ | ||||||
|  | #undef inline | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  |       ],[ | ||||||
|  |         int dummy=2*WINVER; | ||||||
|  |       ]) | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_windows_h="yes" | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_windows_h="no" | ||||||
|  |     ]) | ||||||
|  |   ]) | ||||||
|  |   if test "x$ac_cv_header_windows_h" = "xyes"; then | ||||||
|  |     AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1, | ||||||
|  |       [Define to 1 if you have the windows.h header file.]) | ||||||
|  |     AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1, | ||||||
|  |       [Define to avoid automatic inclusion of winsock.h]) | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_HEADER_WINSOCK | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for compilable and valid winsock.h header  | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [ | ||||||
|  |   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl | ||||||
|  |   AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [ | ||||||
|  |     AC_COMPILE_IFELSE([ | ||||||
|  |       AC_LANG_PROGRAM([ | ||||||
|  | #undef inline | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #include <winsock.h> | ||||||
|  |       ],[ | ||||||
|  |         int dummy=WSACleanup(); | ||||||
|  |       ]) | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_winsock_h="yes" | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_winsock_h="no" | ||||||
|  |     ]) | ||||||
|  |   ]) | ||||||
|  |   if test "x$ac_cv_header_winsock_h" = "xyes"; then | ||||||
|  |     AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1, | ||||||
|  |       [Define to 1 if you have the winsock.h header file.]) | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_HEADER_WINSOCK2 | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for compilable and valid winsock2.h header  | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [ | ||||||
|  |   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl | ||||||
|  |   AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [ | ||||||
|  |     AC_COMPILE_IFELSE([ | ||||||
|  |       AC_LANG_PROGRAM([ | ||||||
|  | #undef inline | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #include <winsock2.h> | ||||||
|  |       ],[ | ||||||
|  |         int dummy=2*IPPROTO_ESP; | ||||||
|  |       ]) | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_winsock2_h="yes" | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_winsock2_h="no" | ||||||
|  |     ]) | ||||||
|  |   ]) | ||||||
|  |   if test "x$ac_cv_header_winsock2_h" = "xyes"; then | ||||||
|  |     AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1, | ||||||
|  |       [Define to 1 if you have the winsock2.h header file.]) | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_HEADER_WS2TCPIP | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for compilable and valid ws2tcpip.h header | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [ | ||||||
|  |   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl | ||||||
|  |   AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [ | ||||||
|  |     AC_COMPILE_IFELSE([ | ||||||
|  |       AC_LANG_PROGRAM([ | ||||||
|  | #undef inline | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #include <winsock2.h> | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  |       ],[ | ||||||
|  |         int dummy=2*IP_PKTINFO; | ||||||
|  |       ]) | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_ws2tcpip_h="yes" | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_ws2tcpip_h="no" | ||||||
|  |     ]) | ||||||
|  |   ]) | ||||||
|  |   if test "x$ac_cv_header_ws2tcpip_h" = "xyes"; then | ||||||
|  |     AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1, | ||||||
|  |       [Define to 1 if you have the ws2tcpip.h header file.]) | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_TYPE_SOCKLEN_T | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for existing socklen_t type, and provide | ||||||
|  | dnl an equivalent type if socklen_t not available | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [ | ||||||
|  |   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl | ||||||
|  |   AC_CHECK_TYPE([socklen_t], ,[ | ||||||
|  |     AC_CACHE_CHECK([for socklen_t equivalent],  | ||||||
|  |       [curl_cv_socklen_t_equiv], [ | ||||||
|  |       curl_cv_socklen_t_equiv="unknown" | ||||||
|  |       for arg2 in "struct sockaddr" void; do | ||||||
|  |         for t in int size_t unsigned long "unsigned long"; do | ||||||
|  |           AC_COMPILE_IFELSE([ | ||||||
|  |             AC_LANG_PROGRAM([ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_WINSOCK_H | ||||||
|  | #include <winsock.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |               int getpeername (int, $arg2 *, $t *); | ||||||
|  |             ],[ | ||||||
|  |               $t len=0; | ||||||
|  |               getpeername(0,0,&len); | ||||||
|  |             ]) | ||||||
|  |           ],[ | ||||||
|  |              curl_cv_socklen_t_equiv="$t" | ||||||
|  |              break 2 | ||||||
|  |           ]) | ||||||
|  |         done | ||||||
|  |       done | ||||||
|  |     ]) | ||||||
|  |     if test "$curl_cv_socklen_t_equiv" = "unknown"; then | ||||||
|  |       AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) | ||||||
|  |     else | ||||||
|  |       AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv, | ||||||
|  |         [type to use in place of socklen_t if not defined]) | ||||||
|  |     fi | ||||||
|  |   ],[ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |   ]) | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_FUNC_GETNAMEINFO | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Test if the getnameinfo function is available,  | ||||||
|  | dnl and check the types of five of its arguments. | ||||||
|  | dnl If the function succeeds HAVE_GETNAMEINFO will be | ||||||
|  | dnl defined, defining the types of the arguments in | ||||||
|  | dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2, | ||||||
|  | dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7. | ||||||
|  | dnl This function is experimental and its results shall | ||||||
|  | dnl not be trusted while this notice is in place ------ | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [ | ||||||
|  |   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl | ||||||
|  |   AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl | ||||||
|  |   AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h) | ||||||
|  |   # | ||||||
|  |   AC_MSG_CHECKING([for getnameinfo]) | ||||||
|  |   AC_LINK_IFELSE([ | ||||||
|  |       AC_LANG_FUNC_LINK_TRY([getnameinfo]) | ||||||
|  |     ],[ | ||||||
|  |       AC_MSG_RESULT([yes]) | ||||||
|  |       curl_cv_getnameinfo="yes" | ||||||
|  |     ],[ | ||||||
|  |       AC_MSG_RESULT([no]) | ||||||
|  |       curl_cv_getnameinfo="no" | ||||||
|  |   ]) | ||||||
|  |   # | ||||||
|  |   if test "$curl_cv_getnameinfo" != "yes"; then | ||||||
|  |     AC_MSG_CHECKING([deeper for getnameinfo]) | ||||||
|  |     AC_TRY_LINK([ | ||||||
|  |       ],[ | ||||||
|  |         getnameinfo(); | ||||||
|  |       ],[ | ||||||
|  |         AC_MSG_RESULT([yes]) | ||||||
|  |         curl_cv_getnameinfo="yes" | ||||||
|  |       ],[ | ||||||
|  |         AC_MSG_RESULT([but still no]) | ||||||
|  |         curl_cv_getnameinfo="no" | ||||||
|  |     ]) | ||||||
|  |   fi | ||||||
|  |   # | ||||||
|  |   if test "$curl_cv_getnameinfo" != "yes"; then | ||||||
|  |     AC_MSG_CHECKING([deeper and deeper for getnameinfo]) | ||||||
|  |     AC_TRY_LINK([ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETDB_H | ||||||
|  | #include <netdb.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |       ],[ | ||||||
|  |         getnameinfo(0, 0, 0, 0, 0, 0, 0); | ||||||
|  |       ],[  | ||||||
|  |         AC_MSG_RESULT([yes]) | ||||||
|  |         curl_cv_getnameinfo="yes" | ||||||
|  |       ],[ | ||||||
|  |         AC_MSG_RESULT([but still no]) | ||||||
|  |         curl_cv_getnameinfo="no" | ||||||
|  |     ]) | ||||||
|  |   fi | ||||||
|  |   # | ||||||
|  |   if test "$curl_cv_getnameinfo" = "yes"; then | ||||||
|  |     AC_CACHE_CHECK([types of arguments for getnameinfo], | ||||||
|  |       [curl_cv_func_getnameinfo_args], [ | ||||||
|  |       curl_cv_func_getnameinfo_args="unknown" | ||||||
|  |       for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do | ||||||
|  |         for gni_arg2 in 'socklen_t' 'size_t' 'int'; do | ||||||
|  |           for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int' 'DWORD'; do | ||||||
|  |             for gni_arg7 in 'int' 'unsigned int'; do | ||||||
|  |               AC_COMPILE_IFELSE([ | ||||||
|  |                 AC_LANG_PROGRAM([ | ||||||
|  | #undef inline  | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501) | ||||||
|  | #undef _WIN32_WINNT | ||||||
|  | #define _WIN32_WINNT 0x0501 | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h>  | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #define GNICALLCONV WSAAPI | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETDB_H | ||||||
|  | #include <netdb.h> | ||||||
|  | #endif | ||||||
|  | #define GNICALLCONV | ||||||
|  | #endif | ||||||
|  |                   extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2, | ||||||
|  |                                          char *, $gni_arg46, | ||||||
|  |                                          char *, $gni_arg46, | ||||||
|  |                                          $gni_arg7); | ||||||
|  |                 ],[ | ||||||
|  |                   $gni_arg2 salen=0; | ||||||
|  |                   $gni_arg46 hostlen=0; | ||||||
|  |                   $gni_arg46 servlen=0; | ||||||
|  |                   $gni_arg7 flags=0; | ||||||
|  |                   int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags); | ||||||
|  |                 ]) | ||||||
|  |               ],[ | ||||||
|  |                  curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7" | ||||||
|  |                  break 4 | ||||||
|  |               ]) | ||||||
|  |             done | ||||||
|  |           done | ||||||
|  |         done | ||||||
|  |       done | ||||||
|  |     ]) # AC_CACHE_CHECK | ||||||
|  |     if test "$curl_cv_func_getnameinfo_args" = "unknown"; then | ||||||
|  |       AC_MSG_WARN([Cannot find proper types to use for getnameinfo args]) | ||||||
|  |       AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined]) | ||||||
|  |     else | ||||||
|  |       gni_prev_IFS=$IFS; IFS=',' | ||||||
|  |       set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'` | ||||||
|  |       IFS=$gni_prev_IFS | ||||||
|  |       shift | ||||||
|  |       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $[1], | ||||||
|  |         [Define to the type of arg 1 for getnameinfo.]) | ||||||
|  |       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2], | ||||||
|  |         [Define to the type of arg 2 for getnameinfo.]) | ||||||
|  |       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3], | ||||||
|  |         [Define to the type of args 4 and 6 for getnameinfo.]) | ||||||
|  |       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4], | ||||||
|  |         [Define to the type of arg 7 for getnameinfo.]) | ||||||
|  |       AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1, | ||||||
|  |         [Define to 1 if you have the getnameinfo function.]) | ||||||
|  |       ac_cv_func_getnameinfo="yes" | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | ]) # AC_DEFUN | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_NONBLOCKING_SOCKET | ||||||
|  | dnl ------------------------------------------------- | ||||||
| dnl Check for how to set a socket to non-blocking state. There seems to exist | dnl Check for how to set a socket to non-blocking state. There seems to exist | ||||||
| dnl four known different ways, with the one used almost everywhere being POSIX | dnl four known different ways, with the one used almost everywhere being POSIX | ||||||
| dnl and XPG3, while the other different ways for different systems (old BSD, | dnl and XPG3, while the other different ways for different systems (old BSD, | ||||||
| @@ -59,12 +449,27 @@ dnl FIONBIO test was also bad | |||||||
| dnl the code was bad, try a different program now, test 3 | dnl the code was bad, try a different program now, test 3 | ||||||
|  |  | ||||||
|   AC_TRY_COMPILE([ |   AC_TRY_COMPILE([ | ||||||
| /* headers for ioctlsocket test (cygwin?) */ | /* headers for ioctlsocket test (Windows) */ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
| #include <windows.h> | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_WINSOCK_H | ||||||
|  | #include <winsock.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
| ],[ | ],[ | ||||||
| /* ioctlsocket source code */ | /* ioctlsocket source code */ | ||||||
|  int socket; |  SOCKET sd; | ||||||
|  unsigned long flags = ioctlsocket(socket, FIONBIO, &flags); |  unsigned long flags = 0; | ||||||
|  |  sd = socket(0, 0, 0); | ||||||
|  |  ioctlsocket(sd, FIONBIO, &flags); | ||||||
| ],[ | ],[ | ||||||
| dnl ioctlsocket test was good | dnl ioctlsocket test was good | ||||||
| nonblock="ioctlsocket" | nonblock="ioctlsocket" | ||||||
| @@ -122,54 +527,48 @@ dnl end of non-blocking try-compile test | |||||||
|   fi |   fi | ||||||
| ]) | ]) | ||||||
|  |  | ||||||
| dnl Check for socklen_t: historically on BSD it is an int, and in |  | ||||||
| dnl POSIX 1g it is a type of its own, but some platforms use different | dnl TYPE_SOCKADDR_STORAGE | ||||||
| dnl types for the argument to getsockopt, getpeername, etc.  So we | dnl ------------------------------------------------- | ||||||
| dnl have to test to find something that will work. | dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but | ||||||
| AC_DEFUN([TYPE_SOCKLEN_T], | dnl AIX 4.3 is one known exception. | ||||||
|  | AC_DEFUN([TYPE_SOCKADDR_STORAGE], | ||||||
| [ | [ | ||||||
|    AC_CHECK_TYPE([socklen_t], ,[ |    AC_CHECK_TYPE([struct sockaddr_storage], | ||||||
|       AC_MSG_CHECKING([for socklen_t equivalent]) |         AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1, | ||||||
|       AC_CACHE_VAL([curl_cv_socklen_t_equiv], |                   [if struct sockaddr_storage is defined]), , | ||||||
|       [ |    [ | ||||||
|          # Systems have either "struct sockaddr *" or | #undef inline | ||||||
|          # "void *" as the second argument to getpeername | #ifdef HAVE_WINDOWS_H | ||||||
|          curl_cv_socklen_t_equiv= | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|          for arg2 in "struct sockaddr" void; do | #define WIN32_LEAN_AND_MEAN | ||||||
|             for t in int size_t unsigned long "unsigned long"; do | #endif | ||||||
|                AC_TRY_COMPILE([ | #include <windows.h> | ||||||
|                   #ifdef HAVE_SYS_TYPES_H | #ifdef HAVE_WINSOCK2_H | ||||||
|                   #include <sys/types.h> | #include <winsock2.h> | ||||||
|                   #endif | #endif | ||||||
|                   #ifdef HAVE_SYS_SOCKET_H | #else | ||||||
|                   #include <sys/socket.h> | #ifdef HAVE_SYS_TYPES_H | ||||||
|                   #endif | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|                   int getpeername (int, $arg2 *, $t *); | #ifdef HAVE_SYS_SOCKET_H | ||||||
|                ],[ | #include <sys/socket.h> | ||||||
|                   $t len; | #endif | ||||||
|                   getpeername(0,0,&len); | #ifdef HAVE_NETINET_IN_H | ||||||
|                ],[ | #include <netinet/in.h> | ||||||
|                   curl_cv_socklen_t_equiv="$t" | #endif | ||||||
|                   break | #ifdef HAVE_ARPA_INET_H | ||||||
|                ]) | #include <arpa/inet.h> | ||||||
|             done | #endif | ||||||
|          done | #endif | ||||||
|  |    ]) | ||||||
|          if test "x$curl_cv_socklen_t_equiv" = x; then |  | ||||||
|             AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) |  | ||||||
|          fi |  | ||||||
|       ]) |  | ||||||
|       AC_MSG_RESULT($curl_cv_socklen_t_equiv) |  | ||||||
|       AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv, |  | ||||||
| 			[type to use in place of socklen_t if not defined])], |  | ||||||
|       [#include <sys/types.h> |  | ||||||
| #include <sys/socket.h>]) |  | ||||||
| ]) | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl TYPE_IN_ADDR_T | ||||||
|  | dnl ------------------------------------------------- | ||||||
| dnl Check for in_addr_t: it is used to receive the return code of inet_addr() | dnl Check for in_addr_t: it is used to receive the return code of inet_addr() | ||||||
| dnl and a few other things. If not found, we set it to unsigned int, as even | dnl and a few other things. | ||||||
| dnl 64-bit implementations use to set it to a 32-bit type. |  | ||||||
| AC_DEFUN([TYPE_IN_ADDR_T], | AC_DEFUN([TYPE_IN_ADDR_T], | ||||||
| [ | [ | ||||||
|    AC_CHECK_TYPE([in_addr_t], ,[ |    AC_CHECK_TYPE([in_addr_t], ,[ | ||||||
| @@ -179,15 +578,33 @@ AC_DEFUN([TYPE_IN_ADDR_T], | |||||||
|          curl_cv_in_addr_t_equiv= |          curl_cv_in_addr_t_equiv= | ||||||
|          for t in "unsigned long" int size_t unsigned long; do |          for t in "unsigned long" int size_t unsigned long; do | ||||||
|             AC_TRY_COMPILE([ |             AC_TRY_COMPILE([ | ||||||
|                #ifdef HAVE_SYS_TYPES_H | #undef inline | ||||||
|                #include <sys/types.h> | #ifdef HAVE_WINDOWS_H | ||||||
|                #endif | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|                #ifdef HAVE_SYS_SOCKET_H | #define WIN32_LEAN_AND_MEAN | ||||||
|                #include <sys/socket.h> | #endif | ||||||
|                #endif | #include <windows.h> | ||||||
|                #ifdef HAVE_ARPA_INET_H | #ifdef HAVE_WINSOCK2_H | ||||||
|                #include <arpa/inet.h> | #include <winsock2.h> | ||||||
|                #endif | #else | ||||||
|  | #ifdef HAVE_WINSOCK_H | ||||||
|  | #include <winsock.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_ARPA_INET_H | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|             ],[ |             ],[ | ||||||
|                $t data = inet_addr ("1.2.3.4"); |                $t data = inet_addr ("1.2.3.4"); | ||||||
|             ],[ |             ],[ | ||||||
| @@ -203,10 +620,36 @@ AC_DEFUN([TYPE_IN_ADDR_T], | |||||||
|       AC_MSG_RESULT($curl_cv_in_addr_t_equiv) |       AC_MSG_RESULT($curl_cv_in_addr_t_equiv) | ||||||
|       AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv, |       AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv, | ||||||
| 			[type to use in place of in_addr_t if not defined])], | 			[type to use in place of in_addr_t if not defined])], | ||||||
|       [#include <sys/types.h> |       [ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_WINSOCK_H | ||||||
|  | #include <winsock.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
| #include <sys/socket.h> | #include <sys/socket.h> | ||||||
| #include <arpa/inet.h>]) | #endif | ||||||
| ]) | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_ARPA_INET_H | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |   ]) dnl AC_CHECK_TYPE | ||||||
|  | ]) dnl AC_DEFUN | ||||||
|  |  | ||||||
| dnl ************************************************************ | dnl ************************************************************ | ||||||
| dnl check for "localhost", if it doesn't exist, we can't do the | dnl check for "localhost", if it doesn't exist, we can't do the | ||||||
| @@ -234,7 +677,7 @@ exit (h == NULL ? 1 : 0); }],[ | |||||||
| ]) | ]) | ||||||
|  |  | ||||||
| dnl ************************************************************ | dnl ************************************************************ | ||||||
| dnl check for working getaddrinfo() | dnl check for working getaddrinfo() that works with AI_NUMERICHOST | ||||||
| dnl | dnl | ||||||
| AC_DEFUN([CURL_CHECK_WORKING_GETADDRINFO],[ | AC_DEFUN([CURL_CHECK_WORKING_GETADDRINFO],[ | ||||||
|   AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[ |   AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[ | ||||||
| @@ -249,6 +692,7 @@ int main(void) | |||||||
|     int error; |     int error; | ||||||
|  |  | ||||||
|     memset(&hints, 0, sizeof(hints)); |     memset(&hints, 0, sizeof(hints)); | ||||||
|  |     hints.ai_flags = AI_NUMERICHOST; | ||||||
|     hints.ai_family = AF_UNSPEC; |     hints.ai_family = AF_UNSPEC; | ||||||
|     hints.ai_socktype = SOCK_STREAM; |     hints.ai_socktype = SOCK_STREAM; | ||||||
|     error = getaddrinfo("127.0.0.1", "8080", &hints, &ai); |     error = getaddrinfo("127.0.0.1", "8080", &hints, &ai); | ||||||
| @@ -322,8 +766,24 @@ dnl program worked: | |||||||
| [ ac_cv_working_ni_withscopeid="yes" ], | [ ac_cv_working_ni_withscopeid="yes" ], | ||||||
| dnl program failed: | dnl program failed: | ||||||
| [ ac_cv_working_ni_withscopeid="no" ], | [ ac_cv_working_ni_withscopeid="no" ], | ||||||
| dnl we cross-compile: | dnl we cross-compile, check the headers using the preprocessor | ||||||
| [ ac_cv_working_ni_withscopeid="yes" ] | [ | ||||||
|  |  | ||||||
|  |  AC_EGREP_CPP(WORKS, | ||||||
|  | [ | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #include <netdb.h> | ||||||
|  |  | ||||||
|  | #ifdef NI_WITHSCOPEID | ||||||
|  | WORKS | ||||||
|  | #endif | ||||||
|  | ], | ||||||
|  |   ac_cv_working_ni_withscopeid="yes", | ||||||
|  |   ac_cv_working_ni_withscopeid="no" ) | ||||||
|  |  | ||||||
|  |  ] | ||||||
| ) dnl end of AC_RUN_IFELSE | ) dnl end of AC_RUN_IFELSE | ||||||
|  |  | ||||||
| ]) dnl end of AC_CACHE_CHECK | ]) dnl end of AC_CACHE_CHECK | ||||||
| @@ -376,34 +836,25 @@ dnl      int strerror_r(int errnum, char *buf, size_t n); | |||||||
| dnl | dnl | ||||||
| AC_DEFUN([CURL_CHECK_STRERROR_R], | AC_DEFUN([CURL_CHECK_STRERROR_R], | ||||||
| [ | [ | ||||||
|   dnl determine of strerror_r is present |   AC_CHECK_FUNCS(strerror_r) | ||||||
|   AC_CHECK_FUNCS(strerror_r,[ |  | ||||||
|  |   if test "x$ac_cv_func_strerror_r" = "xyes"; then | ||||||
|  |  | ||||||
|     AC_MSG_CHECKING(whether strerror_r is declared) |     AC_MSG_CHECKING(whether strerror_r is declared) | ||||||
|     AC_EGREP_CPP(strerror_r,[ |     AC_EGREP_CPP(strerror_r,[ | ||||||
| #include <string.h>],[ | #include <string.h>],[ | ||||||
|       strerror_r="yes" |  | ||||||
|       AC_MSG_RESULT(yes)],[ |       AC_MSG_RESULT(yes)],[ | ||||||
|       AC_MSG_RESULT(no) |       AC_MSG_RESULT(no) | ||||||
|       AC_MSG_CHECKING(whether strerror_r with -D_THREAD_SAFE is declared) |       AC_MSG_CHECKING(whether strerror_r with -D_REENTRANT is declared) | ||||||
|       AC_EGREP_CPP(strerror_r,[ |       AC_EGREP_CPP(strerror_r,[ | ||||||
| #define _THREAD_SAFE | #define _REENTRANT | ||||||
| #include <string.h>],[ | #include <string.h>],[ | ||||||
|         strerror_r="yes" | 	CPPFLAGS="-D_REENTRANT $CPPFLAGS" | ||||||
| 	CPPFLAGS="-D_THREAD_SAFE $CPPFLAGS" |  | ||||||
| 	AC_MSG_RESULT(yes)], | 	AC_MSG_RESULT(yes)], | ||||||
| 	AC_MSG_RESULT(no))])]) | 	AC_MSG_RESULT(no) | ||||||
|  |         AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto]) | ||||||
|   if test "x$strerror_r" = "xyes"; then |        ) dnl with _THREAD_SAFE | ||||||
|  |     ]) dnl plain cpp for it | ||||||
|     dnl check if strerror_r is properly declared in the headers |  | ||||||
|     AC_CHECK_DECL(strerror_r, , |  | ||||||
|      AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto]) |  | ||||||
| , |  | ||||||
| [#include <stdlib.h> |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <string.h> |  | ||||||
| #include <errno.h> |  | ||||||
| ]) |  | ||||||
|  |  | ||||||
|     dnl determine if this strerror_r() is glibc or POSIX |     dnl determine if this strerror_r() is glibc or POSIX | ||||||
|     AC_MSG_CHECKING([for a glibc strerror_r API]) |     AC_MSG_CHECKING([for a glibc strerror_r API]) | ||||||
| @@ -425,8 +876,20 @@ main () { | |||||||
|     AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()]) |     AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()]) | ||||||
|     AC_MSG_RESULT([yes]), |     AC_MSG_RESULT([yes]), | ||||||
|     AC_MSG_RESULT([no]), |     AC_MSG_RESULT([no]), | ||||||
|     dnl cross-compiling! |  | ||||||
|     AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!]) |     dnl Use an inferior method of strerror_r detection while cross-compiling | ||||||
|  |     AC_EGREP_CPP(yes, [ | ||||||
|  | #include <features.h> | ||||||
|  | #ifdef __GLIBC__ | ||||||
|  | yes | ||||||
|  | #endif | ||||||
|  | ],  | ||||||
|  |       dnl looks like glibc, so assume a glibc-style strerror_r() | ||||||
|  |       GLIBC_STRERROR_R="1" | ||||||
|  |       AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()]) | ||||||
|  |       AC_MSG_RESULT([yes]), | ||||||
|  |       AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!]) | ||||||
|  |     ) dnl while cross-compiling | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|     if test -z "$GLIBC_STRERROR_R"; then |     if test -z "$GLIBC_STRERROR_R"; then | ||||||
| @@ -641,6 +1104,7 @@ if test "$ac_cv_func_gethostbyname_r" = "yes"; then | |||||||
| fi | fi | ||||||
| ]) | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
| dnl We create a function for detecting which compiler we use and then set as | dnl We create a function for detecting which compiler we use and then set as | ||||||
| dnl pendantic compiler options as possible for that particular compiler. The | dnl pendantic compiler options as possible for that particular compiler. The | ||||||
| dnl options are only used for debug-builds. | dnl options are only used for debug-builds. | ||||||
| @@ -715,15 +1179,18 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS], | |||||||
|          fi |          fi | ||||||
|  |  | ||||||
|          dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on |          dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on | ||||||
|          dnl on i686-Linux as it gives us heaps with false positives |          dnl on i686-Linux as it gives us heaps with false positives. | ||||||
|  |          dnl Also, on gcc 4.0.X it is totally unbearable and complains all | ||||||
|  |          dnl over making it unusable for generic purposes. Let's not use it. | ||||||
|  |  | ||||||
|          if test "$gccnum" -ge "303"; then |          if test "$gccnum" -ge "303"; then | ||||||
|            dnl gcc 3.3 and later |            dnl gcc 3.3 and later | ||||||
|            WARN="$WARN -Wendif-labels -Wstrict-prototypes" |            WARN="$WARN -Wendif-labels -Wstrict-prototypes" | ||||||
|          fi |          fi | ||||||
|  |  | ||||||
|          if test "$gccnum" -ge "304"; then |          if test "$gccnum" -ge "304"; then | ||||||
|            # try -Wunreachable-code on gcc 3.4 |            # try these on gcc 3.4 | ||||||
|            WARN="$WARN -Wunreachable-code" |            WARN="$WARN -Wdeclaration-after-statement" | ||||||
|          fi |          fi | ||||||
|  |  | ||||||
|          for flag in $CPPFLAGS; do |          for flag in $CPPFLAGS; do | ||||||
| @@ -766,3 +1233,88 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS], | |||||||
|  |  | ||||||
| ]) dnl end of AC_DEFUN() | ]) dnl end of AC_DEFUN() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl Determine the name of the library to pass to dlopen() based on the name | ||||||
|  | dnl that would normally be given to AC_CHECK_LIB.  The preprocessor symbol | ||||||
|  | dnl given is set to the quoted library file name.  | ||||||
|  | dnl The standard dynamic library file name is first generated, based on the | ||||||
|  | dnl current system type, then a search is performed for that file on the | ||||||
|  | dnl standard dynamic library path.  If it is a symbolic link, the destination | ||||||
|  | dnl of the link is used as the file name, after stripping off any minor | ||||||
|  | dnl version numbers. If a library file can't be found, a guess is made. | ||||||
|  | dnl This macro assumes AC_PROG_LIBTOOL has been called and requires perl | ||||||
|  | dnl to be available in the PATH, or $PERL to be set to its location. | ||||||
|  | dnl | ||||||
|  | dnl CURL_DLLIB_NAME(VARIABLE, library_name) | ||||||
|  | dnl e.g. CURL_DLLIB_NAME(LDAP_NAME, ldap) on a Linux system might result | ||||||
|  | dnl in LDAP_NAME holding the string "libldap.so.2". | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_DLLIB_NAME], | ||||||
|  | [ | ||||||
|  | AC_MSG_CHECKING([name of dynamic library $2]) | ||||||
|  | dnl The shared library extension variable name changes from version to | ||||||
|  | dnl version of libtool.  Try a few names then just set one statically. | ||||||
|  | test -z "$shared_ext" && shared_ext="$shrext_cmds" | ||||||
|  | test -z "$shared_ext" && shared_ext="$shrext" | ||||||
|  | test -z "$shared_ext" && shared_ext=".so" | ||||||
|  |  | ||||||
|  | dnl Create the library link name of the correct form for this platform | ||||||
|  | LIBNAME_LINK_SPEC=`echo "$library_names_spec" | $SED 's/^.* //'` | ||||||
|  | DLGUESSLIB=`name=$2 eval echo "$libname_spec"` | ||||||
|  | DLGUESSFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$LIBNAME_LINK_SPEC"` | ||||||
|  |  | ||||||
|  | dnl Synthesize a likely dynamic library name in case we can't find an actual one | ||||||
|  | SO_NAME_SPEC="$soname_spec" | ||||||
|  | dnl soname_spec undefined when identical to the 1st entry in library_names_spec | ||||||
|  | test -z "$SO_NAME_SPEC" && SO_NAME_SPEC=`echo "$library_names_spec" | $SED 's/ .*$//'` | ||||||
|  | DLGUESSSOFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$SO_NAME_SPEC"` | ||||||
|  |  | ||||||
|  | if test "$cross_compiling" = yes; then | ||||||
|  |   dnl Can't look at filesystem when cross-compiling | ||||||
|  |   AC_DEFINE_UNQUOTED($1, "$DLGUESSSOFILE", [$2 dynamic library file]) | ||||||
|  |   AC_MSG_RESULT([$DLGUESSSOFILE (guess while cross-compiling)]) | ||||||
|  | else | ||||||
|  |  | ||||||
|  |   DLFOUNDFILE="" | ||||||
|  |   if test "$sys_lib_dlsearch_path_spec" ; then | ||||||
|  |     dnl Search for the link library name and see what it points to. | ||||||
|  |     for direc in $sys_lib_dlsearch_path_spec ; do | ||||||
|  |       DLTRYFILE="$direc/$DLGUESSFILE" | ||||||
|  |       dnl Find where the symbolic link for this name points | ||||||
|  |       changequote(<<, >>)dnl | ||||||
|  |       << | ||||||
|  |       DLFOUNDFILE=`${PERL:-perl} -e 'use File::Basename; (basename(readlink($ARGV[0])) =~ /^(.*[^\d]\.\d+)[\d\.]*$/ && print ${1}) || exit 1;' "$DLTRYFILE" 2>&5` | ||||||
|  |       >> | ||||||
|  |       changequote([, ])dnl | ||||||
|  |       if test "$?" -eq "0"; then | ||||||
|  |         dnl Found the file link | ||||||
|  |         break | ||||||
|  |       fi | ||||||
|  |     done | ||||||
|  |   fi | ||||||
|  |  | ||||||
|  |   if test -z "$DLFOUNDFILE" ; then | ||||||
|  |     dnl Couldn't find a link library, so guess at a name. | ||||||
|  |     DLFOUNDFILE="$DLGUESSSOFILE" | ||||||
|  |   fi | ||||||
|  |  | ||||||
|  |   AC_DEFINE_UNQUOTED($1, "$DLFOUNDFILE", [$2 dynamic library file]) | ||||||
|  |   AC_MSG_RESULT($DLFOUNDFILE) | ||||||
|  | fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  | # This is only a temporary fix. This macro is here to replace the broken one | ||||||
|  | # delivered by the automake project (including the 1.9.6 release). As soon as | ||||||
|  | # they ship a working version we SHOULD remove this work-around. | ||||||
|  |  | ||||||
|  | AC_DEFUN([AM_MISSING_HAS_RUN], | ||||||
|  | [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl | ||||||
|  | test x"${MISSING+set}" = xset || MISSING="\${SHELL} \"$am_aux_dir/missing\"" | ||||||
|  | # Use eval to expand $SHELL | ||||||
|  | if eval "$MISSING --run true"; then | ||||||
|  |   am_missing_run="$MISSING --run " | ||||||
|  | else | ||||||
|  |   am_missing_run= | ||||||
|  |   AC_MSG_WARN([`missing' script is too old or missing]) | ||||||
|  | fi | ||||||
|  | ]) | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								ares/AUTHORS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								ares/AUTHORS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | c-ares is based on ares, and these are the people that have worked on it since | ||||||
|  | the fork was made: | ||||||
|  |  | ||||||
|  | Daniel Stenberg | ||||||
|  | Dominick Meglio | ||||||
|  | liren at vivisimo.com | ||||||
|  | James Bursa | ||||||
|  | Duncan Wilcox | ||||||
|  | Dirk Manske | ||||||
|  | Dan Fandrich | ||||||
|  | Gisle Vanem | ||||||
|  | Gunter Knauf | ||||||
|  | Henrik Stoerner | ||||||
|  | Yang Tse | ||||||
							
								
								
									
										108
									
								
								ares/CHANGES
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								ares/CHANGES
									
									
									
									
									
								
							| @@ -1,5 +1,113 @@ | |||||||
|   Changelog for the c-ares project |   Changelog for the c-ares project | ||||||
|  |  | ||||||
|  | * January 9, 2006 | ||||||
|  |  | ||||||
|  | - Alexander Lazic improved the getservbyport_r() configure check. | ||||||
|  |  | ||||||
|  | * January 6, 2006 | ||||||
|  |  | ||||||
|  | - Alexander Lazic pointed out that the buildconf should use the ACLOCAL_FLAGS | ||||||
|  |   variable for easier controlling what it does and how it runs. | ||||||
|  |  | ||||||
|  | * January 5, 2006 | ||||||
|  |  | ||||||
|  | - James Bursa fixed c-ares to find the hosts file on RISC OS, and made it | ||||||
|  |   build with newer gcc versions that no longer defines "riscos". | ||||||
|  |  | ||||||
|  | * December 22 | ||||||
|  |  | ||||||
|  | - Daniel Stenberg added ares_getsock() that extracts the set of sockets to | ||||||
|  |   wait for action on. Similar to ares_fds() but not restricted to using | ||||||
|  |   select() for the waiting. | ||||||
|  |  | ||||||
|  | * November 25 | ||||||
|  |  | ||||||
|  | - Yang Tse fixed some send() / recv() compiler warnings | ||||||
|  |  | ||||||
|  | * September 18 | ||||||
|  |  | ||||||
|  | - Added constants that will be used by ares_getaddrinfo | ||||||
|  |  | ||||||
|  | - Made ares_getnameinfo use the reentrant getservbyport (getservbyport_r) if it is | ||||||
|  |   available to ensure it works properly in a threaded environment. | ||||||
|  |  | ||||||
|  | * September 10 | ||||||
|  |  | ||||||
|  | - configure fix for detecting a member in the sockaddr_in6 struct which failed | ||||||
|  |   on ipv6-enabled HP-UX 11.00 | ||||||
|  |  | ||||||
|  | Version 1.3.0 (August 29, 2004) | ||||||
|  |  | ||||||
|  | * August 21 | ||||||
|  |  | ||||||
|  | - Alfredo Tupone provided a fix for the Windows code in get_iphlpapi_dns_info() | ||||||
|  |   when getting the DNS server etc. | ||||||
|  |  | ||||||
|  | * June 19 | ||||||
|  |  | ||||||
|  | - Added some checks for the addrinfo structure. | ||||||
|  |  | ||||||
|  | * June 2 | ||||||
|  |  | ||||||
|  | - William Ahern: | ||||||
|  |  | ||||||
|  |   Make UDP sockets non-blocking. I've confirmed that at least on Linux 2.4 a | ||||||
|  |   read event can come back from poll() on a valid SOCK_DGRAM socket but | ||||||
|  |   recv(2) will still block. This patch doesn't ignore EAGAIN in | ||||||
|  |   read_udp_packets(), though maybe it should. (This patch was edited by Daniel | ||||||
|  |   Stenberg and a new configure test was added (imported from curl's configure) | ||||||
|  |   to properly detect what non-blocking socket approach to use.) | ||||||
|  |  | ||||||
|  |   I'm not quite sure how this was happening, but I've been seeing PTR queries | ||||||
|  |   which seem to return empty responses. At least, they were empty when calling | ||||||
|  |   ares_expand_name() on the record. Here's a patch which guarantees to | ||||||
|  |   NUL-terminate the expanded name. The old behavior failed to NUL-terminate if | ||||||
|  |   len was 0, and this was causing strlen() to run past the end of the buffer | ||||||
|  |   after calling ares_expand_name() and getting ARES_SUCCESS as the return | ||||||
|  |   value. If q is not greater than *s then it's equal and *s is always | ||||||
|  |   allocated with at least one byte. | ||||||
|  |  | ||||||
|  | * May 16 | ||||||
|  |  | ||||||
|  | - Added ares_getnameinfo which mimics the getnameinfo API (another feature | ||||||
|  |   that could use testing). | ||||||
|  |  | ||||||
|  | * May 14 | ||||||
|  |  | ||||||
|  | - Added an inet_ntop function from BIND for systems that do not have it. | ||||||
|  |  | ||||||
|  | * April 9 | ||||||
|  |  | ||||||
|  | - Made sortlist support IPv6 (this can probably use some testing). | ||||||
|  |  | ||||||
|  | - Made sortlist support CIDR matching for IPv4. | ||||||
|  |  | ||||||
|  | * April 8 | ||||||
|  |  | ||||||
|  | - Added preliminary IPv6 support to ares_gethostbyname. Currently, sortlist | ||||||
|  |   does not work with IPv6. Also provided an implementation of bitncmp from | ||||||
|  |   BIND for systems that do not supply this function. This will be used to add | ||||||
|  |   IPv6 support to sortlist. | ||||||
|  |  | ||||||
|  | - Made ares_gethostbyaddr support IPv6 by specifying AF_INET6 as the family. | ||||||
|  |   The function can lookup IPv6 addresses both from files (/etc/hosts) and | ||||||
|  |   DNS lookups. | ||||||
|  |  | ||||||
|  | * April 7 | ||||||
|  |  | ||||||
|  | - Tupone Alfredo fixed includes of arpa/nameser_compat.h to build fine on Mac | ||||||
|  |   OS X. | ||||||
|  |  | ||||||
|  | * April 5 | ||||||
|  |  | ||||||
|  | - Dominick Meglio: Provided implementations of inet_net_pton and inet_pton | ||||||
|  |   from BIND for systems that do not include these functions. | ||||||
|  |  | ||||||
|  | * March 11, 2005 | ||||||
|  |  | ||||||
|  | - Dominick Meglio added ares_parse_aaaa_reply.c and did various | ||||||
|  |   adjustments. The first little steps towards IPv6 support! | ||||||
|  |  | ||||||
| * November 7 | * November 7 | ||||||
|  |  | ||||||
| - Fixed the VC project and makefile to use ares_cancel and ares_version | - Fixed the VC project and makefile to use ares_cancel and ares_version | ||||||
|   | |||||||
| @@ -13,6 +13,7 @@ Makefile.in | |||||||
| Makefile.dj | Makefile.dj | ||||||
| Makefile.m32 | Makefile.m32 | ||||||
| Makefile.netware | Makefile.netware | ||||||
|  | Makefile.vc6 | ||||||
| install-sh | install-sh | ||||||
| mkinstalldirs | mkinstalldirs | ||||||
| configure | configure | ||||||
|   | |||||||
| @@ -4,18 +4,17 @@ lib_LTLIBRARIES = libcares.la | |||||||
|  |  | ||||||
| man_MANS = $(MANPAGES) | man_MANS = $(MANPAGES) | ||||||
|  |  | ||||||
| MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/adig/adig.mak	\ | MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/vc.dsw vc/ahost/ahost.dep \ | ||||||
|  vc/adig/adig.plg vc/vc.dsw vc/ahost/ahost.dep vc/ahost/ahost.dsp	\ |  vc/ahost/ahost.dsp vc/areslib/areslib.dep vc/areslib/areslib.dsp	   \ | ||||||
|  vc/ahost/ahost.mak vc/ahost/ahost.plg vc/areslib/areslib.dep		\ |  vc/areslib/areslib.dsw | ||||||
|  vc/areslib/areslib.dsp vc/areslib/areslib.mak vc/areslib/areslib.plg |  | ||||||
|  |  | ||||||
| # adig and ahost are just sample programs and thus not mentioned with the | # adig and ahost are just sample programs and thus not mentioned with the | ||||||
| # regular sources and headers | # regular sources and headers | ||||||
| EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \ | EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \ | ||||||
|  $(MSVCFILES) |  $(MSVCFILES) AUTHORS | ||||||
|  |  | ||||||
|  |  | ||||||
| VER=-version-info 0:0:0 | VER=-version-info 1:0:0 | ||||||
| # This flag accepts an argument of the form current[:revision[:age]]. So, | # This flag accepts an argument of the form current[:revision[:age]]. So, | ||||||
| # passing -version-info 3:12:1 sets current to 3, revision to 12, and age to | # passing -version-info 3:12:1 sets current to 3, revision to 12, and age to | ||||||
| # 1. | # 1. | ||||||
|   | |||||||
| @@ -9,7 +9,12 @@ include Makefile.inc | |||||||
| WATT32_ROOT = $(subst \,/,$(WATT_ROOT)) | WATT32_ROOT = $(subst \,/,$(WATT_ROOT)) | ||||||
|  |  | ||||||
| CC      = gcc | CC      = gcc | ||||||
| CFLAGS  = -O2 -Wall -DWATT32 -Dselect=select_s -I$(WATT32_ROOT)/inc | CFLAGS  = -O2 -Wall -DWATT32 -Dselect=select_s -DHAVE_AF_INET6 \ | ||||||
|  |           -DHAVE_PF_INET6 -DHAVE_IOCTLSOCKET -DHAVE_STRUCT_IN6_ADDR \ | ||||||
|  |           -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \ | ||||||
|  |           -DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 \ | ||||||
|  |           -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID -I$(WATT32_ROOT)/inc | ||||||
|  |  | ||||||
| LDFLAGS = -s | LDFLAGS = -s | ||||||
| EX_LIBS = $(WATT32_ROOT)/lib/libwatt.a | EX_LIBS = $(WATT32_ROOT)/lib/libwatt.a | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,15 +1,18 @@ | |||||||
| CSOURCES = ares_fds.c ares_process.c ares_free_hostent.c ares_query.c	   \ | CSOURCES = ares_fds.c ares_getsock.c ares_process.c ares_free_hostent.c	\ | ||||||
| ares__close_sockets.c ares_free_string.c ares_search.c ares__get_hostent.c \ | ares_query.c ares__close_sockets.c ares_free_string.c ares_search.c	\ | ||||||
| ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c	   \ | ares__get_hostent.c ares_gethostbyaddr.c ares_send.c ares__read_line.c	\ | ||||||
| ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c	   \ | ares_gethostbyname.c ares_strerror.c ares_cancel.c ares_init.c		\ | ||||||
| ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c	   \ | ares_timeout.c ares_destroy.c ares_mkquery.c ares_version.c		\ | ||||||
| windows_port.c ares_expand_string.c ares_parse_ptr_reply.c | ares_expand_name.c ares_parse_a_reply.c windows_port.c			\ | ||||||
|  | ares_expand_string.c ares_parse_ptr_reply.c ares_parse_aaaa_reply.c	\ | ||||||
|  | ares_getnameinfo.c inet_net_pton.c bitncmp.c inet_ntop.c | ||||||
|  |  | ||||||
| HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h nameser.h | HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h          \ | ||||||
|  |            nameser.h inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h | ||||||
|  |  | ||||||
| MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \ | MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \ | ||||||
|  ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3		    \ |  ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3                \ | ||||||
|  ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3	    \ |  ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3        \ | ||||||
|  ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3		    \ |  ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3                 \ | ||||||
|  ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3	    \ |  ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3      \ | ||||||
|  ares_version.3 ares_cancel.3 |  ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.3 | ||||||
|   | |||||||
| @@ -7,29 +7,21 @@ | |||||||
| ## Quick hack by Guenter; comments to: /dev/nul | ## Quick hack by Guenter; comments to: /dev/nul | ||||||
|  |  | ||||||
| CC = gcc | CC = gcc | ||||||
| AR = ar |  | ||||||
| RANLIB = ranlib | RANLIB = ranlib | ||||||
| STRIP = strip -g |  | ||||||
| #RM = rm -f  |  | ||||||
|  |  | ||||||
| ######################################################## | ######################################################## | ||||||
| ## Nothing more to do below this line! | ## Nothing more to do below this line! | ||||||
|  |  | ||||||
| LIB=libcares.a | LIB=libcares.a | ||||||
| CC=gcc | CC=gcc | ||||||
| #CPPFLAGS=@CPPFLAGS@ | CFLAGS=-O2 -Wall | ||||||
| WARN_FLAGS=-Wall |  | ||||||
| CFLAGS=-O2 |  | ||||||
| CFLAGS+=${WARN_CFLAGS} ${ERROR_CFLAGS} |  | ||||||
| DEFS=-DMINGW32 |  | ||||||
| LDFLAGS=-s | LDFLAGS=-s | ||||||
| LIBS=-lwsock32 | LIBS=-lwsock32 | ||||||
| ALL_CFLAGS=${CPPFLAGS} ${CFLAGS} ${DEFS} |  | ||||||
|  |  | ||||||
| MANPAGES := $(patsubst %.c,%.o,$(wildcard ares_*.3)) | MANPAGES := $(patsubst %.c,%.o,$(wildcard ares_*.3)) | ||||||
|  |  | ||||||
| OBJS	:= $(patsubst %.c,%.o,$(wildcard ares_*.c)) | OBJS	:= $(patsubst %.c,%.o,$(wildcard ares_*.c)) | ||||||
| OBJS	+= windows_port.o | OBJS	+= windows_port.o inet_ntop.o inet_net_pton.o bitncmp.o | ||||||
|  |  | ||||||
| $(LIB): ${OBJS} | $(LIB): ${OBJS} | ||||||
| 	ar cru $@ ${OBJS} | 	ar cru $@ ${OBJS} | ||||||
| @@ -51,7 +43,7 @@ ahost.exe: ahost.o $(LIB) | |||||||
| ${OBJS}: ares.h ares_dns.h ares_private.h | ${OBJS}: ares.h ares_dns.h ares_private.h | ||||||
|  |  | ||||||
| .c.o: | .c.o: | ||||||
| 	${CC} -c ${ALL_CFLAGS} $< | 	${CC} -c ${CFLAGS} $< | ||||||
|  |  | ||||||
| check: | check: | ||||||
|  |  | ||||||
| @@ -73,3 +65,4 @@ clean: | |||||||
|  |  | ||||||
| distclean: clean | distclean: clean | ||||||
| 	rm -f config.cache config.log config.status Makefile | 	rm -f config.cache config.log config.status Makefile | ||||||
|  |  | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ endif | |||||||
| TARGETS = adig.nlm ahost.nlm | TARGETS = adig.nlm ahost.nlm | ||||||
| LTARGET = libcares.lib | LTARGET = libcares.lib | ||||||
| VERSION	= $(LIBCARES_VERSION) | VERSION	= $(LIBCARES_VERSION) | ||||||
| COPYR	= Copyright (c) 1996 - 2004, Daniel Stenberg, <daniel@haxx.se> | COPYR	= Copyright (C) 1996 - 2005, Daniel Stenberg, <daniel@haxx.se> | ||||||
| DESCR	= cURL $(subst .def,,$(notdir $@)) $(LIBCARES_VERSION_STR) - http://curl.haxx.se | DESCR	= cURL $(subst .def,,$(notdir $@)) $(LIBCARES_VERSION_STR) - http://curl.haxx.se | ||||||
| MTSAFE	= YES | MTSAFE	= YES | ||||||
| STACK	= 64000 | STACK	= 64000 | ||||||
| @@ -89,7 +89,7 @@ LDFLAGS	= -T | |||||||
| AR	= ar | AR	= ar | ||||||
| ARFLAGS	= -cq | ARFLAGS	= -cq | ||||||
| CFLAGS	+= -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing | CFLAGS	+= -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing | ||||||
| CFLAGS	+= -Wall -Wno-format # -pedantic | CFLAGS	+= -Wall -Wno-format -Wno-uninitialized # -pedantic | ||||||
| ifeq ($(LIBARCH),LIBC) | ifeq ($(LIBARCH),LIBC) | ||||||
| 	PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o | 	PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o | ||||||
| else | else | ||||||
| @@ -104,7 +104,7 @@ SDK_LIBC = $(NDK_ROOT)/libc | |||||||
|  |  | ||||||
| ifeq ($(LIBARCH),LIBC) | ifeq ($(LIBARCH),LIBC) | ||||||
| 	INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks | 	INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks | ||||||
| 	INCLUDES += -I$(SDK_LIBC)/include/winsock | 	# INCLUDES += -I$(SDK_LIBC)/include/winsock | ||||||
| 	CFLAGS += -D_POSIX_SOURCE | 	CFLAGS += -D_POSIX_SOURCE | ||||||
| #	CFLAGS += -D__ANSIC__ | #	CFLAGS += -D__ANSIC__ | ||||||
| else | else | ||||||
| @@ -126,7 +126,10 @@ DL	= ' | |||||||
| #-include $(NDKBASE)/nlmconv/ncpfs.inc | #-include $(NDKBASE)/nlmconv/ncpfs.inc | ||||||
| endif | endif | ||||||
|  |  | ||||||
| OBJS	:= $(patsubst %.c,$(OBJDIR)/%.o,$(wildcard ares_*.c)) | # Makefile.inc provides the CSOURCES and HHEADERS defines | ||||||
|  | include Makefile.inc | ||||||
|  |  | ||||||
|  | OBJS	:= $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) | ||||||
|  |  | ||||||
| .PHONY: lib nlm prebuild dist install clean | .PHONY: lib nlm prebuild dist install clean | ||||||
|  |  | ||||||
| @@ -256,6 +259,7 @@ config.h: Makefile.netware | |||||||
| 	@echo $(DL)#define VERSION "$(LIBCURL_VERSION_STR)"$(DL) >> $@ | 	@echo $(DL)#define VERSION "$(LIBCURL_VERSION_STR)"$(DL) >> $@ | ||||||
| 	@echo $(DL)#define PACKAGE_BUGREPORT "curl-bug@haxx.se"$(DL) >> $@ | 	@echo $(DL)#define PACKAGE_BUGREPORT "curl-bug@haxx.se"$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@ | ||||||
|  | 	@echo $(DL)#define HAVE_ARPA_NAMESER_H 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@ | ||||||
| @@ -297,6 +301,13 @@ config.h: Makefile.netware | |||||||
| 	@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@ | 	@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@ | ||||||
| 	@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ | 	@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ | 	@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ | ||||||
|  | 	@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ | ||||||
|  | 	@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@ | ||||||
|  | 	@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@ | ||||||
|  | 	@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@ | ||||||
|  | 	@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@ | ||||||
|  | 	@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@ | ||||||
|  | 	@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@ | ||||||
| ifdef NW_WINSOCK | ifdef NW_WINSOCK | ||||||
| 	@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@ | ||||||
| else | else | ||||||
|   | |||||||
							
								
								
									
										190
									
								
								ares/Makefile.vc6
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								ares/Makefile.vc6
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,190 @@ | |||||||
|  | # $Id$ | ||||||
|  | # | ||||||
|  | # C-ares makefile for MSVC6+ | ||||||
|  | # G. Vanem <giva@bgnett.no>. | ||||||
|  | # | ||||||
|  |  | ||||||
|  | CFG_MODEL   = MD | ||||||
|  | DEBUG_MODEL = d | ||||||
|  | USE_WATT32  = 0 | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Configurations: | ||||||
|  | #  -MD   - msvcrt.dll,  threads, release (normal) | ||||||
|  | #  -MDd  - msvcrtd.dll, threads, debug | ||||||
|  | #  -ML   - libc, no threads,     release | ||||||
|  | #  -MLd  - libc, no threads,     debug | ||||||
|  | #  -MT   - libc, threads,        release | ||||||
|  | #  -MTd  - libc, threads,        debug | ||||||
|  |  | ||||||
|  | CC = cl | ||||||
|  |  | ||||||
|  | CFLAGS  = -nologo -$(CFG_MODEL)$(DEBUG_MODEL) -W3 -Yd -Zi | ||||||
|  | LDFLAGS = -machine:i386 -map | ||||||
|  |  | ||||||
|  | OBJ_DIR  = VC6_obj | ||||||
|  | DEF_FILE = cares.def | ||||||
|  |  | ||||||
|  | !if "$(USE_WATT32)" == "1" | ||||||
|  | CFLAGS  = $(CFLAGS) -UWIN32 -DWATT32 -I$(WATT_ROOT)\inc | ||||||
|  | EX_LIBS = $(WATT_ROOT)\lib\wattcpvc_imp.lib | ||||||
|  |  | ||||||
|  | !else | ||||||
|  | CFLAGS  = $(CFLAGS) -DWIN32 -DWIN32_LEAN_AND_MEAN | ||||||
|  | EX_LIBS = advapi32.lib ws2_32.lib | ||||||
|  | !endif | ||||||
|  |  | ||||||
|  | !if "$(DEBUG_MODEL)" == "d" | ||||||
|  | CFLAGS  = $(CFLAGS) -D_DEBUG -GZ | ||||||
|  | LDFLAGS = $(LDFLAGS) -debug -fixed:no | ||||||
|  |  | ||||||
|  | !else | ||||||
|  | CFLAGS  = $(CFLAGS) -O2 -Og | ||||||
|  | LDFLAGS = $(LDFLAGS) -release | ||||||
|  | !endif | ||||||
|  |  | ||||||
|  | OBJECTS = $(OBJ_DIR)\ares_fds.obj              \ | ||||||
|  |           $(OBJ_DIR)\ares_process.obj          \ | ||||||
|  |           $(OBJ_DIR)\ares_free_hostent.obj     \ | ||||||
|  |           $(OBJ_DIR)\ares_query.obj            \ | ||||||
|  |           $(OBJ_DIR)\ares__close_sockets.obj   \ | ||||||
|  |           $(OBJ_DIR)\ares_free_string.obj      \ | ||||||
|  |           $(OBJ_DIR)\ares_search.obj           \ | ||||||
|  |           $(OBJ_DIR)\ares__get_hostent.obj     \ | ||||||
|  |           $(OBJ_DIR)\ares_gethostbyaddr.obj    \ | ||||||
|  |           $(OBJ_DIR)\ares_getsock.obj          \ | ||||||
|  |           $(OBJ_DIR)\ares_send.obj             \ | ||||||
|  |           $(OBJ_DIR)\ares__read_line.obj       \ | ||||||
|  |           $(OBJ_DIR)\ares_gethostbyname.obj    \ | ||||||
|  |           $(OBJ_DIR)\ares_getnameinfo.obj      \ | ||||||
|  |           $(OBJ_DIR)\ares_strerror.obj         \ | ||||||
|  |           $(OBJ_DIR)\ares_cancel.obj           \ | ||||||
|  |           $(OBJ_DIR)\ares_init.obj             \ | ||||||
|  |           $(OBJ_DIR)\ares_timeout.obj          \ | ||||||
|  |           $(OBJ_DIR)\ares_destroy.obj          \ | ||||||
|  |           $(OBJ_DIR)\ares_mkquery.obj          \ | ||||||
|  |           $(OBJ_DIR)\ares_version.obj          \ | ||||||
|  |           $(OBJ_DIR)\ares_expand_name.obj      \ | ||||||
|  |           $(OBJ_DIR)\ares_parse_a_reply.obj    \ | ||||||
|  |           $(OBJ_DIR)\ares_parse_aaaa_reply.obj \ | ||||||
|  |           $(OBJ_DIR)\windows_port.obj          \ | ||||||
|  |           $(OBJ_DIR)\ares_expand_string.obj    \ | ||||||
|  |           $(OBJ_DIR)\ares_parse_ptr_reply.obj  \ | ||||||
|  |           $(OBJ_DIR)\bitncmp.obj               \ | ||||||
|  |           $(OBJ_DIR)\inet_net_pton.obj         \ | ||||||
|  |           $(OBJ_DIR)\inet_ntop.obj | ||||||
|  |  | ||||||
|  | all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe | ||||||
|  |  | ||||||
|  | $(OBJ_DIR): | ||||||
|  |        mkdir $(OBJ_DIR) | ||||||
|  |  | ||||||
|  | cares.lib: $(OBJ_DIR) $(OBJECTS) | ||||||
|  |        lib -nologo -out:$@ $(OBJECTS) | ||||||
|  |  | ||||||
|  | cares_imp.lib cares.dll: $(OBJ_DIR) $(DEF_FILE) $(OBJECTS) | ||||||
|  |        link $(LDFLAGS) -dll -implib:cares_imp.lib -out:cares.dll \ | ||||||
|  |             -def:$(DEF_FILE) $(OBJECTS) $(EX_LIBS) | ||||||
|  |  | ||||||
|  | $(DEF_FILE): $(OBJECTS) Makefile.VC6 | ||||||
|  |        @echo ; Generated. DO NOT EDIT  > $@ | ||||||
|  |        @echo LIBRARY cares.dll        >> $@ | ||||||
|  |        @echo EXPORTS                  >> $@ | ||||||
|  |        @echo   ares_cancel            >> $@ | ||||||
|  |        @echo   ares_destroy           >> $@ | ||||||
|  |        @echo   ares_expand_name       >> $@ | ||||||
|  |        @echo   ares_expand_string     >> $@ | ||||||
|  |        @echo   ares_fds               >> $@ | ||||||
|  |        @echo   ares_free_hostent      >> $@ | ||||||
|  |        @echo   ares_free_string       >> $@ | ||||||
|  |        @echo   ares_gethostbyaddr     >> $@ | ||||||
|  |        @echo   ares_gethostbyname     >> $@ | ||||||
|  |        @echo   ares_getsock           >> $@ | ||||||
|  |        @echo   ares_init              >> $@ | ||||||
|  |        @echo   ares_init_options      >> $@ | ||||||
|  |        @echo   ares_mkquery           >> $@ | ||||||
|  |        @echo   ares_parse_a_reply     >> $@ | ||||||
|  |        @echo   ares_parse_ptr_reply   >> $@ | ||||||
|  |        @echo   ares_process           >> $@ | ||||||
|  |        @echo   ares_query             >> $@ | ||||||
|  |        @echo   ares_search            >> $@ | ||||||
|  |        @echo   ares_strerror          >> $@ | ||||||
|  |        @echo   ares_strncasecmp       >> $@ | ||||||
|  |        @echo   ares_strcasecmp        >> $@ | ||||||
|  |        @echo   ares_timeout           >> $@ | ||||||
|  |        @echo   ares_version           >> $@ | ||||||
|  |        @echo   ares_inet_net_pton     >> $@ | ||||||
|  |        @echo   ares_inet_ntop         >> $@ | ||||||
|  |        @echo   ares_inet_pton         >> $@ | ||||||
|  |        @echo   ares_writev            >> $@ | ||||||
|  |        @echo   ares_getnameinfo       >> $@ | ||||||
|  |        @echo   ares_gettimeofday      >> $@ | ||||||
|  |        @echo   ares_parse_aaaa_reply  >> $@ | ||||||
|  |  | ||||||
|  | ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj cares_imp.lib | ||||||
|  |        link $(LDFLAGS) -out:$@ $(OBJ_DIR)\ahost.obj cares_imp.lib $(EX_LIBS) | ||||||
|  |  | ||||||
|  | adig.exe: $(OBJ_DIR) $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib | ||||||
|  |        link $(LDFLAGS) -out:$@ $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib $(EX_LIBS) | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  |        - del $(OBJ_DIR)\*.obj *.ilk *.pdb *.pbt *.pbi *.pbo *._xe *.map | ||||||
|  |  | ||||||
|  | vclean realclean: clean | ||||||
|  |        - del $(DEF_FILE) cares.lib cares_imp.* cares.dll ahost.exe adig.exe | ||||||
|  |        - rd $(OBJ_DIR) | ||||||
|  |  | ||||||
|  | .c{$(OBJ_DIR)}.obj: | ||||||
|  |        $(CC) $(CFLAGS) -Fo$*.obj -c $< | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Copyright "gcc -MM .." | ||||||
|  | # | ||||||
|  | $(OBJ_DIR)\ares_fds.obj: ares_fds.c setup.h ares.h ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_process.obj: ares_process.c setup.h nameser.h ares.h ares_dns.h \ | ||||||
|  |   ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_free_hostent.obj: ares_free_hostent.c setup.h ares.h ares_private.h \ | ||||||
|  |   ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_query.obj: ares_query.c setup.h nameser.h ares.h ares_dns.h \ | ||||||
|  |   ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares__close_sockets.obj: ares__close_sockets.c setup.h ares.h \ | ||||||
|  |   ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_free_string.obj: ares_free_string.c setup.h ares.h | ||||||
|  | $(OBJ_DIR)\ares_search.obj: ares_search.c setup.h nameser.h ares.h ares_private.h \ | ||||||
|  |   ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares__get_hostent.obj: ares__get_hostent.c setup.h ares.h ares_private.h \ | ||||||
|  |   ares_ipv6.h inet_net_pton.h | ||||||
|  | $(OBJ_DIR)\ares_gethostbyaddr.obj: ares_gethostbyaddr.c setup.h nameser.h ares.h \ | ||||||
|  |   ares_private.h ares_ipv6.h inet_net_pton.h | ||||||
|  | $(OBJ_DIR)\ares_send.obj: ares_send.c setup.h nameser.h ares.h ares_dns.h \ | ||||||
|  |   ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares__read_line.obj: ares__read_line.c setup.h ares.h ares_private.h \ | ||||||
|  |   ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_gethostbyname.obj: ares_gethostbyname.c setup.h nameser.h ares.h \ | ||||||
|  |   ares_private.h ares_ipv6.h inet_net_pton.h bitncmp.h | ||||||
|  | $(OBJ_DIR)\ares_strerror.obj: ares_strerror.c setup.h ares.h | ||||||
|  | $(OBJ_DIR)\ares_cancel.obj: ares_cancel.c setup.h ares.h ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_init.obj: ares_init.c setup.h nameser.h ares.h ares_private.h \ | ||||||
|  |   ares_ipv6.h inet_net_pton.h | ||||||
|  | $(OBJ_DIR)\ares_timeout.obj: ares_timeout.c setup.h ares.h ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_destroy.obj: ares_destroy.c setup.h ares.h ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_mkquery.obj: ares_mkquery.c setup.h nameser.h ares.h ares_dns.h | ||||||
|  | $(OBJ_DIR)\ares_version.obj: ares_version.c setup.h ares_version.h | ||||||
|  | $(OBJ_DIR)\ares_expand_name.obj: ares_expand_name.c setup.h nameser.h ares.h \ | ||||||
|  |   ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_parse_a_reply.obj: ares_parse_a_reply.c setup.h nameser.h ares.h \ | ||||||
|  |   ares_dns.h ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\windows_port.obj: windows_port.c setup.h nameser.h ares.h ares_private.h \ | ||||||
|  |   ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_expand_string.obj: ares_expand_string.c setup.h nameser.h ares.h \ | ||||||
|  |   ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_parse_ptr_reply.obj: ares_parse_ptr_reply.c setup.h nameser.h ares.h \ | ||||||
|  |   ares_dns.h ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_parse_aaaa_reply.obj: ares_parse_aaaa_reply.c setup.h nameser.h ares.h \ | ||||||
|  |   ares_dns.h inet_net_pton.h ares_private.h ares_ipv6.h | ||||||
|  | $(OBJ_DIR)\ares_getnameinfo.obj: ares_getnameinfo.c setup.h nameser.h ares.h \ | ||||||
|  |   ares_private.h ares_ipv6.h inet_ntop.h | ||||||
|  | $(OBJ_DIR)\inet_net_pton.obj: inet_net_pton.c setup.h nameser.h ares_ipv6.h \ | ||||||
|  |   inet_net_pton.h | ||||||
|  | $(OBJ_DIR)\bitncmp.obj: bitncmp.c bitncmp.h | ||||||
|  | $(OBJ_DIR)\inet_ntop.obj: inet_ntop.c setup.h nameser.h ares_ipv6.h inet_ntop.h | ||||||
| @@ -1,4 +1,637 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_HEADER_WINDOWS | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for compilable and valid windows.h header  | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [ | ||||||
|  |   AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [ | ||||||
|  |     AC_COMPILE_IFELSE([ | ||||||
|  |       AC_LANG_PROGRAM([ | ||||||
|  | #undef inline | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  |       ],[ | ||||||
|  |         int dummy=2*WINVER; | ||||||
|  |       ]) | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_windows_h="yes" | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_windows_h="no" | ||||||
|  |     ]) | ||||||
|  |   ]) | ||||||
|  |   if test "x$ac_cv_header_windows_h" = "xyes"; then | ||||||
|  |     AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1, | ||||||
|  |       [Define to 1 if you have the windows.h header file.]) | ||||||
|  |     AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1, | ||||||
|  |       [Define to avoid automatic inclusion of winsock.h]) | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_HEADER_WINSOCK | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for compilable and valid winsock.h header  | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [ | ||||||
|  |   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl | ||||||
|  |   AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [ | ||||||
|  |     AC_COMPILE_IFELSE([ | ||||||
|  |       AC_LANG_PROGRAM([ | ||||||
|  | #undef inline | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #include <winsock.h> | ||||||
|  |       ],[ | ||||||
|  |         int dummy=WSACleanup(); | ||||||
|  |       ]) | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_winsock_h="yes" | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_winsock_h="no" | ||||||
|  |     ]) | ||||||
|  |   ]) | ||||||
|  |   if test "x$ac_cv_header_winsock_h" = "xyes"; then | ||||||
|  |     AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1, | ||||||
|  |       [Define to 1 if you have the winsock.h header file.]) | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_HEADER_WINSOCK2 | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for compilable and valid winsock2.h header  | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [ | ||||||
|  |   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl | ||||||
|  |   AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [ | ||||||
|  |     AC_COMPILE_IFELSE([ | ||||||
|  |       AC_LANG_PROGRAM([ | ||||||
|  | #undef inline | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #include <winsock2.h> | ||||||
|  |       ],[ | ||||||
|  |         int dummy=2*IPPROTO_ESP; | ||||||
|  |       ]) | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_winsock2_h="yes" | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_winsock2_h="no" | ||||||
|  |     ]) | ||||||
|  |   ]) | ||||||
|  |   if test "x$ac_cv_header_winsock2_h" = "xyes"; then | ||||||
|  |     AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1, | ||||||
|  |       [Define to 1 if you have the winsock2.h header file.]) | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_HEADER_WS2TCPIP | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for compilable and valid ws2tcpip.h header | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [ | ||||||
|  |   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl | ||||||
|  |   AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [ | ||||||
|  |     AC_COMPILE_IFELSE([ | ||||||
|  |       AC_LANG_PROGRAM([ | ||||||
|  | #undef inline | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #include <winsock2.h> | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  |       ],[ | ||||||
|  |         int dummy=2*IP_PKTINFO; | ||||||
|  |       ]) | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_ws2tcpip_h="yes" | ||||||
|  |     ],[ | ||||||
|  |       ac_cv_header_ws2tcpip_h="no" | ||||||
|  |     ]) | ||||||
|  |   ]) | ||||||
|  |   if test "x$ac_cv_header_ws2tcpip_h" = "xyes"; then | ||||||
|  |     AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1, | ||||||
|  |       [Define to 1 if you have the ws2tcpip.h header file.]) | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_TYPE_SOCKLEN_T | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for existing socklen_t type, and provide | ||||||
|  | dnl an equivalent type if socklen_t not available | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [ | ||||||
|  |   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl | ||||||
|  |   AC_CHECK_TYPE([socklen_t], ,[ | ||||||
|  |     AC_CACHE_CHECK([for socklen_t equivalent],  | ||||||
|  |       [curl_cv_socklen_t_equiv], [ | ||||||
|  |       curl_cv_socklen_t_equiv="unknown" | ||||||
|  |       for arg2 in "struct sockaddr" void; do | ||||||
|  |         for t in int size_t unsigned long "unsigned long"; do | ||||||
|  |           AC_COMPILE_IFELSE([ | ||||||
|  |             AC_LANG_PROGRAM([ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_WINSOCK_H | ||||||
|  | #include <winsock.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |               int getpeername (int, $arg2 *, $t *); | ||||||
|  |             ],[ | ||||||
|  |               $t len=0; | ||||||
|  |               getpeername(0,0,&len); | ||||||
|  |             ]) | ||||||
|  |           ],[ | ||||||
|  |              curl_cv_socklen_t_equiv="$t" | ||||||
|  |              break 2 | ||||||
|  |           ]) | ||||||
|  |         done | ||||||
|  |       done | ||||||
|  |     ]) | ||||||
|  |     if test "$curl_cv_socklen_t_equiv" = "unknown"; then | ||||||
|  |       AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) | ||||||
|  |     else | ||||||
|  |       AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv, | ||||||
|  |         [type to use in place of socklen_t if not defined]) | ||||||
|  |     fi | ||||||
|  |   ],[ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |   ]) | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_FUNC_GETNAMEINFO | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Test if the getnameinfo function is available,  | ||||||
|  | dnl and check the types of five of its arguments. | ||||||
|  | dnl If the function succeeds HAVE_GETNAMEINFO will be | ||||||
|  | dnl defined, defining the types of the arguments in | ||||||
|  | dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2, | ||||||
|  | dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7. | ||||||
|  | dnl This function is experimental and its results shall | ||||||
|  | dnl not be trusted while this notice is in place ------ | ||||||
|  |  | ||||||
|  | AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [ | ||||||
|  |   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl | ||||||
|  |   AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl | ||||||
|  |   AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h) | ||||||
|  |   # | ||||||
|  |   AC_MSG_CHECKING([for getnameinfo]) | ||||||
|  |   AC_LINK_IFELSE([ | ||||||
|  |       AC_LANG_FUNC_LINK_TRY([getnameinfo]) | ||||||
|  |     ],[ | ||||||
|  |       AC_MSG_RESULT([yes]) | ||||||
|  |       curl_cv_getnameinfo="yes" | ||||||
|  |     ],[ | ||||||
|  |       AC_MSG_RESULT([no]) | ||||||
|  |       curl_cv_getnameinfo="no" | ||||||
|  |   ]) | ||||||
|  |   # | ||||||
|  |   if test "$curl_cv_getnameinfo" != "yes"; then | ||||||
|  |     AC_MSG_CHECKING([deeper for getnameinfo]) | ||||||
|  |     AC_TRY_LINK([ | ||||||
|  |       ],[ | ||||||
|  |         getnameinfo(); | ||||||
|  |       ],[ | ||||||
|  |         AC_MSG_RESULT([yes]) | ||||||
|  |         curl_cv_getnameinfo="yes" | ||||||
|  |       ],[ | ||||||
|  |         AC_MSG_RESULT([but still no]) | ||||||
|  |         curl_cv_getnameinfo="no" | ||||||
|  |     ]) | ||||||
|  |   fi | ||||||
|  |   # | ||||||
|  |   if test "$curl_cv_getnameinfo" != "yes"; then | ||||||
|  |     AC_MSG_CHECKING([deeper and deeper for getnameinfo]) | ||||||
|  |     AC_TRY_LINK([ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETDB_H | ||||||
|  | #include <netdb.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |       ],[ | ||||||
|  |         getnameinfo(0, 0, 0, 0, 0, 0, 0); | ||||||
|  |       ],[  | ||||||
|  |         AC_MSG_RESULT([yes]) | ||||||
|  |         curl_cv_getnameinfo="yes" | ||||||
|  |       ],[ | ||||||
|  |         AC_MSG_RESULT([but still no]) | ||||||
|  |         curl_cv_getnameinfo="no" | ||||||
|  |     ]) | ||||||
|  |   fi | ||||||
|  |   # | ||||||
|  |   if test "$curl_cv_getnameinfo" = "yes"; then | ||||||
|  |     AC_CACHE_CHECK([types of arguments for getnameinfo], | ||||||
|  |       [curl_cv_func_getnameinfo_args], [ | ||||||
|  |       curl_cv_func_getnameinfo_args="unknown" | ||||||
|  |       for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do | ||||||
|  |         for gni_arg2 in 'socklen_t' 'size_t' 'int'; do | ||||||
|  |           for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int' 'DWORD'; do | ||||||
|  |             for gni_arg7 in 'int' 'unsigned int'; do | ||||||
|  |               AC_COMPILE_IFELSE([ | ||||||
|  |                 AC_LANG_PROGRAM([ | ||||||
|  | #undef inline  | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501) | ||||||
|  | #undef _WIN32_WINNT | ||||||
|  | #define _WIN32_WINNT 0x0501 | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h>  | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #define GNICALLCONV WSAAPI | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETDB_H | ||||||
|  | #include <netdb.h> | ||||||
|  | #endif | ||||||
|  | #define GNICALLCONV | ||||||
|  | #endif | ||||||
|  |                   extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2, | ||||||
|  |                                          char *, $gni_arg46, | ||||||
|  |                                          char *, $gni_arg46, | ||||||
|  |                                          $gni_arg7); | ||||||
|  |                 ],[ | ||||||
|  |                   $gni_arg2 salen=0; | ||||||
|  |                   $gni_arg46 hostlen=0; | ||||||
|  |                   $gni_arg46 servlen=0; | ||||||
|  |                   $gni_arg7 flags=0; | ||||||
|  |                   int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags); | ||||||
|  |                 ]) | ||||||
|  |               ],[ | ||||||
|  |                  curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7" | ||||||
|  |                  break 4 | ||||||
|  |               ]) | ||||||
|  |             done | ||||||
|  |           done | ||||||
|  |         done | ||||||
|  |       done | ||||||
|  |     ]) # AC_CACHE_CHECK | ||||||
|  |     if test "$curl_cv_func_getnameinfo_args" = "unknown"; then | ||||||
|  |       AC_MSG_WARN([Cannot find proper types to use for getnameinfo args]) | ||||||
|  |       AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined]) | ||||||
|  |     else | ||||||
|  |       gni_prev_IFS=$IFS; IFS=',' | ||||||
|  |       set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'` | ||||||
|  |       IFS=$gni_prev_IFS | ||||||
|  |       shift | ||||||
|  |       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $[1], | ||||||
|  |         [Define to the type of arg 1 for getnameinfo.]) | ||||||
|  |       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2], | ||||||
|  |         [Define to the type of arg 2 for getnameinfo.]) | ||||||
|  |       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3], | ||||||
|  |         [Define to the type of args 4 and 6 for getnameinfo.]) | ||||||
|  |       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4], | ||||||
|  |         [Define to the type of arg 7 for getnameinfo.]) | ||||||
|  |       AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1, | ||||||
|  |         [Define to 1 if you have the getnameinfo function.]) | ||||||
|  |       ac_cv_func_getnameinfo="yes" | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | ]) # AC_DEFUN | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl CURL_CHECK_NONBLOCKING_SOCKET | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for how to set a socket to non-blocking state. There seems to exist | ||||||
|  | dnl four known different ways, with the one used almost everywhere being POSIX | ||||||
|  | dnl and XPG3, while the other different ways for different systems (old BSD, | ||||||
|  | dnl Windows and Amiga). | ||||||
|  | dnl | ||||||
|  | dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the | ||||||
|  | dnl O_NONBLOCK define is found but does not work. This condition is attempted | ||||||
|  | dnl to get caught in this script by using an excessive number of #ifdefs... | ||||||
|  | dnl | ||||||
|  | AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET], | ||||||
|  | [ | ||||||
|  |   AC_MSG_CHECKING([non-blocking sockets style]) | ||||||
|  |  | ||||||
|  |   AC_TRY_COMPILE([ | ||||||
|  | /* headers for O_NONBLOCK test */ | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | #include <fcntl.h> | ||||||
|  | ],[ | ||||||
|  | /* try to compile O_NONBLOCK */ | ||||||
|  |  | ||||||
|  | #if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) | ||||||
|  | # if defined(__SVR4) || defined(__srv4__) | ||||||
|  | #  define PLATFORM_SOLARIS | ||||||
|  | # else | ||||||
|  | #  define PLATFORM_SUNOS4 | ||||||
|  | # endif | ||||||
|  | #endif | ||||||
|  | #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4) | ||||||
|  | # define PLATFORM_AIX_V3 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__) | ||||||
|  | #error "O_NONBLOCK does not work on this platform" | ||||||
|  | #endif | ||||||
|  |   int socket; | ||||||
|  |   int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK); | ||||||
|  | ],[ | ||||||
|  | dnl the O_NONBLOCK test was fine | ||||||
|  | nonblock="O_NONBLOCK" | ||||||
|  | AC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets]) | ||||||
|  | ],[ | ||||||
|  | dnl the code was bad, try a different program now, test 2 | ||||||
|  |  | ||||||
|  |   AC_TRY_COMPILE([ | ||||||
|  | /* headers for FIONBIO test */ | ||||||
|  | #include <unistd.h> | ||||||
|  | #include <stropts.h> | ||||||
|  | ],[ | ||||||
|  | /* FIONBIO source test (old-style unix) */ | ||||||
|  |  int socket; | ||||||
|  |  int flags = ioctl(socket, FIONBIO, &flags); | ||||||
|  | ],[ | ||||||
|  | dnl FIONBIO test was good | ||||||
|  | nonblock="FIONBIO" | ||||||
|  | AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets]) | ||||||
|  | ],[ | ||||||
|  | dnl FIONBIO test was also bad | ||||||
|  | dnl the code was bad, try a different program now, test 3 | ||||||
|  |  | ||||||
|  |   AC_TRY_COMPILE([ | ||||||
|  | /* headers for ioctlsocket test (Windows) */ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_WINSOCK_H | ||||||
|  | #include <winsock.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | ],[ | ||||||
|  | /* ioctlsocket source code */ | ||||||
|  |  SOCKET sd; | ||||||
|  |  unsigned long flags = 0; | ||||||
|  |  sd = socket(0, 0, 0); | ||||||
|  |  ioctlsocket(sd, FIONBIO, &flags); | ||||||
|  | ],[ | ||||||
|  | dnl ioctlsocket test was good | ||||||
|  | nonblock="ioctlsocket" | ||||||
|  | AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets]) | ||||||
|  | ],[ | ||||||
|  | dnl ioctlsocket didnt compile!, go to test 4 | ||||||
|  |  | ||||||
|  |   AC_TRY_LINK([ | ||||||
|  | /* headers for IoctlSocket test (Amiga?) */ | ||||||
|  | #include <sys/ioctl.h> | ||||||
|  | ],[ | ||||||
|  | /* IoctlSocket source code */ | ||||||
|  |  int socket; | ||||||
|  |  int flags = IoctlSocket(socket, FIONBIO, (long)1); | ||||||
|  | ],[ | ||||||
|  | dnl ioctlsocket test was good | ||||||
|  | nonblock="IoctlSocket" | ||||||
|  | AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets]) | ||||||
|  | ],[ | ||||||
|  | dnl Ioctlsocket didnt compile, do test 5! | ||||||
|  |   AC_TRY_COMPILE([ | ||||||
|  | /* headers for SO_NONBLOCK test (BeOS) */ | ||||||
|  | #include <socket.h> | ||||||
|  | ],[ | ||||||
|  | /* SO_NONBLOCK source code */ | ||||||
|  |  long b = 1; | ||||||
|  |  int socket; | ||||||
|  |  int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); | ||||||
|  | ],[ | ||||||
|  | dnl the SO_NONBLOCK test was good | ||||||
|  | nonblock="SO_NONBLOCK" | ||||||
|  | AC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets]) | ||||||
|  | ],[ | ||||||
|  | dnl test 5 didnt compile! | ||||||
|  | nonblock="nada" | ||||||
|  | AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets]) | ||||||
|  | ]) | ||||||
|  | dnl end of fifth test | ||||||
|  |  | ||||||
|  | ]) | ||||||
|  | dnl end of forth test | ||||||
|  |  | ||||||
|  | ]) | ||||||
|  | dnl end of third test | ||||||
|  |  | ||||||
|  | ]) | ||||||
|  | dnl end of second test | ||||||
|  |  | ||||||
|  | ]) | ||||||
|  | dnl end of non-blocking try-compile test | ||||||
|  |   AC_MSG_RESULT($nonblock) | ||||||
|  |  | ||||||
|  |   if test "$nonblock" = "nada"; then | ||||||
|  |     AC_MSG_WARN([non-block sockets disabled]) | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl TYPE_SOCKADDR_STORAGE | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but | ||||||
|  | dnl AIX 4.3 is one known exception. | ||||||
|  | AC_DEFUN([TYPE_SOCKADDR_STORAGE], | ||||||
|  | [ | ||||||
|  |    AC_CHECK_TYPE([struct sockaddr_storage], | ||||||
|  |         AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1, | ||||||
|  |                   [if struct sockaddr_storage is defined]), , | ||||||
|  |    [ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_ARPA_INET_H | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |    ]) | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl TYPE_IN_ADDR_T | ||||||
|  | dnl ------------------------------------------------- | ||||||
|  | dnl Check for in_addr_t: it is used to receive the return code of inet_addr() | ||||||
|  | dnl and a few other things. | ||||||
|  | AC_DEFUN([TYPE_IN_ADDR_T], | ||||||
|  | [ | ||||||
|  |    AC_CHECK_TYPE([in_addr_t], ,[ | ||||||
|  |       AC_MSG_CHECKING([for in_addr_t equivalent]) | ||||||
|  |       AC_CACHE_VAL([curl_cv_in_addr_t_equiv], | ||||||
|  |       [ | ||||||
|  |          curl_cv_in_addr_t_equiv= | ||||||
|  |          for t in "unsigned long" int size_t unsigned long; do | ||||||
|  |             AC_TRY_COMPILE([ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_WINSOCK_H | ||||||
|  | #include <winsock.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_ARPA_INET_H | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |             ],[ | ||||||
|  |                $t data = inet_addr ("1.2.3.4"); | ||||||
|  |             ],[ | ||||||
|  |                curl_cv_in_addr_t_equiv="$t" | ||||||
|  |                break | ||||||
|  |             ]) | ||||||
|  |          done | ||||||
|  |  | ||||||
|  |          if test "x$curl_cv_in_addr_t_equiv" = x; then | ||||||
|  |             AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t]) | ||||||
|  |          fi | ||||||
|  |       ]) | ||||||
|  |       AC_MSG_RESULT($curl_cv_in_addr_t_equiv) | ||||||
|  |       AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv, | ||||||
|  | 			[type to use in place of in_addr_t if not defined])], | ||||||
|  |       [ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_WINSOCK_H | ||||||
|  | #include <winsock.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_ARPA_INET_H | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |   ]) dnl AC_CHECK_TYPE | ||||||
|  | ]) dnl AC_DEFUN | ||||||
|  |  | ||||||
|  |  | ||||||
| dnl We create a function for detecting which compiler we use and then set as | dnl We create a function for detecting which compiler we use and then set as | ||||||
| dnl pendantic compiler options as possible for that particular compiler. The | dnl pendantic compiler options as possible for that particular compiler. The | ||||||
| dnl options are only used for debug-builds. | dnl options are only used for debug-builds. | ||||||
| @@ -99,3 +732,97 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS], | |||||||
|  |  | ||||||
| ]) dnl end of AC_DEFUN() | ]) dnl end of AC_DEFUN() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl This macro determines if the specified struct exists in the specified file | ||||||
|  | dnl Syntax: | ||||||
|  | dnl CARES_CHECK_STRUCT(headers, struct name, if found, [if not found]) | ||||||
|  |  | ||||||
|  | AC_DEFUN([CARES_CHECK_STRUCT], [ | ||||||
|  |   AC_MSG_CHECKING([for struct $2]) | ||||||
|  |   AC_TRY_COMPILE([$1],  | ||||||
|  |     [ | ||||||
|  |       struct $2 struct_instance; | ||||||
|  |     ], ac_struct="yes", ac_found="no") | ||||||
|  |   if test "$ac_struct" = "yes" ; then | ||||||
|  |     AC_MSG_RESULT(yes) | ||||||
|  |     $3 | ||||||
|  |   else | ||||||
|  |     AC_MSG_RESULT(no) | ||||||
|  |     $4 | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  | dnl This macro determines if the specified constant exists in the specified file | ||||||
|  | dnl Syntax: | ||||||
|  | dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found]) | ||||||
|  |  | ||||||
|  | AC_DEFUN([CARES_CHECK_CONSTANT], [ | ||||||
|  |   AC_MSG_CHECKING([for $2]) | ||||||
|  |   AC_EGREP_CPP(VARIABLEWASDEFINED, | ||||||
|  |    [ | ||||||
|  |       $1 | ||||||
|  |  | ||||||
|  |       #ifdef $2 | ||||||
|  |         VARIABLEWASDEFINED | ||||||
|  |       #else | ||||||
|  |         NJET | ||||||
|  |       #endif | ||||||
|  |     ], ac_constant="yes", ac_constant="no" | ||||||
|  |   ) | ||||||
|  |   if test "$ac_constant" = "yes" ; then | ||||||
|  |     AC_MSG_RESULT(yes) | ||||||
|  |     $3 | ||||||
|  |   else | ||||||
|  |     AC_MSG_RESULT(no) | ||||||
|  |     $4 | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl This macro determines how many parameters getservbyport_r takes | ||||||
|  | AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [ | ||||||
|  |   AC_MSG_CHECKING([how many arguments getservbyport_r takes]) | ||||||
|  |   AC_TRY_LINK( | ||||||
|  |     [#include <netdb.h>], | ||||||
|  |     [ | ||||||
|  |       int p1, p5; | ||||||
|  |       char *p2, p4[4096]; | ||||||
|  |       struct servent *p3, *p6; | ||||||
|  |       getservbyport_r(p1, p2, p3, p4, p5, &p6); | ||||||
|  |     ], ac_func_getservbyport_r=6, | ||||||
|  |     [AC_TRY_LINK( | ||||||
|  |       [#include <netdb.h>], | ||||||
|  |       [ | ||||||
|  |         int p1, p5; | ||||||
|  |         char *p2, p4[4096]; | ||||||
|  |         struct servent *p3; | ||||||
|  |         getservbyport_r(p1, p2, p3, p4, p5); | ||||||
|  |       ], ac_func_getservbyport_r=5, | ||||||
|  |       [AC_TRY_LINK( | ||||||
|  |         [#include <netdb.h>], | ||||||
|  |         [ | ||||||
|  |           int p1; | ||||||
|  |           char *p2; | ||||||
|  |           struct servent *p3; | ||||||
|  |           struct servent_data p4; | ||||||
|  |           getservbyport_r(p1, p2, p3, &p4); | ||||||
|  |         ], ac_func_getservbyport_r=4, ac_func_getservbyport_r=0 | ||||||
|  |       )] | ||||||
|  |     )] | ||||||
|  |   ) | ||||||
|  | if test $ac_func_getservbyport_r != "0" ; then | ||||||
|  |   AC_MSG_RESULT($ac_func_getservbyport_r) | ||||||
|  |   AC_DEFINE(HAVE_GETSERVBYPORT_R, 1, [Specifies whether getservbyport_r is present]) | ||||||
|  |   AC_DEFINE_UNQUOTED(GETSERVBYPORT_R_ARGS, $ac_func_getservbyport_r, [Specifies the number of arguments to  | ||||||
|  | getservbyport_r]) | ||||||
|  |   if test $ac_func_getservbyport_r = "4" ; then | ||||||
|  |    AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, sizeof(struct servent_data), [Specifies the size of the buffer to pass to  | ||||||
|  | getservbyport_r]) | ||||||
|  |   else | ||||||
|  |    AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, 4096, [Specifies the size of the buffer to pass to getservbyport_r]) | ||||||
|  |   fi | ||||||
|  | else | ||||||
|  |   AC_MSG_RESULT([not found]) | ||||||
|  | fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								ares/adig.c
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								ares/adig.c
									
									
									
									
									
								
							| @@ -27,14 +27,23 @@ | |||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #include <netdb.h> | #include <netdb.h> | ||||||
| #endif | #endif | ||||||
|  | #ifdef HAVE_GETOPT_H | ||||||
|  | #include <getopt.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <ctype.h> | #include <ctype.h> | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
|  |  | ||||||
| #include "ares.h" | #include "ares.h" | ||||||
| #include "ares_dns.h" | #include "ares_dns.h" | ||||||
|  | #include "inet_ntop.h" | ||||||
|  |  | ||||||
|  | #ifdef WATT32 | ||||||
|  | #undef WIN32  /* Redefined in MingW headers */ | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #ifndef INADDR_NONE | #ifndef INADDR_NONE | ||||||
| #define INADDR_NONE 0xffffffff | #define INADDR_NONE 0xffffffff | ||||||
| @@ -45,8 +54,10 @@ | |||||||
| #define T_SRV 33 /* server selection */ | #define T_SRV 33 /* server selection */ | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifndef optind | ||||||
| extern int optind; | extern int optind; | ||||||
| extern char *optarg; | extern char *optarg; | ||||||
|  | #endif | ||||||
|  |  | ||||||
| struct nv { | struct nv { | ||||||
|   const char *name; |   const char *name; | ||||||
| @@ -216,7 +227,7 @@ int main(int argc, char **argv) | |||||||
|           /* Set the TCP port number. */ |           /* Set the TCP port number. */ | ||||||
|           if (!isdigit((unsigned char)*optarg)) |           if (!isdigit((unsigned char)*optarg)) | ||||||
|             usage(); |             usage(); | ||||||
|           options.tcp_port = strtol(optarg, NULL, 0); |           options.tcp_port = (unsigned short)strtol(optarg, NULL, 0); | ||||||
|           optmask |= ARES_OPT_TCP_PORT; |           optmask |= ARES_OPT_TCP_PORT; | ||||||
|           break; |           break; | ||||||
|  |  | ||||||
| @@ -224,7 +235,7 @@ int main(int argc, char **argv) | |||||||
|           /* Set the UDP port number. */ |           /* Set the UDP port number. */ | ||||||
|           if (!isdigit((unsigned char)*optarg)) |           if (!isdigit((unsigned char)*optarg)) | ||||||
|             usage(); |             usage(); | ||||||
|           options.udp_port = strtol(optarg, NULL, 0); |           options.udp_port = (unsigned short)strtol(optarg, NULL, 0); | ||||||
|           optmask |= ARES_OPT_UDP_PORT; |           optmask |= ARES_OPT_UDP_PORT; | ||||||
|           break; |           break; | ||||||
|         } |         } | ||||||
| @@ -412,7 +423,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|   char *name; |   char *name; | ||||||
|   int type, dnsclass, ttl, dlen, status; |   int type, dnsclass, ttl, dlen, status; | ||||||
|   long len; |   long len; | ||||||
|   struct in_addr addr; |   char addr[46]; | ||||||
|  |  | ||||||
|   /* Parse the RR name. */ |   /* Parse the RR name. */ | ||||||
|   status = ares_expand_name(aptr, abuf, alen, &name, &len); |   status = ares_expand_name(aptr, abuf, alen, &name, &len); | ||||||
| @@ -474,12 +485,12 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|       len = *p; |       len = *p; | ||||||
|       if (p + len + 1 > aptr + dlen) |       if (p + len + 1 > aptr + dlen) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t%.*s", len, p + 1); |       printf("\t%.*s", (int)len, p + 1); | ||||||
|       p += len + 1; |       p += len + 1; | ||||||
|       len = *p; |       len = *p; | ||||||
|       if (p + len + 1 > aptr + dlen) |       if (p + len + 1 > aptr + dlen) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t%.*s", len, p + 1); |       printf("\t%.*s", (int)len, p + 1); | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case T_MINFO: |     case T_MINFO: | ||||||
| @@ -504,7 +515,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|        */ |        */ | ||||||
|       if (dlen < 2) |       if (dlen < 2) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t%d", (aptr[0] << 8) | aptr[1]); |       printf("\t%d", DNS__16BIT(aptr)); | ||||||
|       status = ares_expand_name(aptr + 2, abuf, alen, &name, &len); |       status = ares_expand_name(aptr + 2, abuf, alen, &name, &len); | ||||||
|       if (status != ARES_SUCCESS) |       if (status != ARES_SUCCESS) | ||||||
|         return NULL; |         return NULL; | ||||||
| @@ -531,12 +542,9 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|       p += len; |       p += len; | ||||||
|       if (p + 20 > aptr + dlen) |       if (p + 20 > aptr + dlen) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t\t\t\t\t\t( %d %d %d %d %d )", |       printf("\t\t\t\t\t\t( %lu %lu %lu %lu %lu )", | ||||||
|              (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3], |              DNS__32BIT(p), DNS__32BIT(p+4), DNS__32BIT(p+8), | ||||||
|              (p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7], |              DNS__32BIT(p+12), DNS__32BIT(p+16)); | ||||||
|              (p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11], |  | ||||||
|              (p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15], |  | ||||||
|              (p[16] << 24) | (p[17] << 16) | (p[18] << 8) | p[19]); |  | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case T_TXT: |     case T_TXT: | ||||||
| @@ -548,7 +556,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|           len = *p; |           len = *p; | ||||||
|           if (p + len + 1 > aptr + dlen) |           if (p + len + 1 > aptr + dlen) | ||||||
|             return NULL; |             return NULL; | ||||||
|           printf("\t%.*s", len, p + 1); |           printf("\t%.*s", (int)len, p + 1); | ||||||
|           p += len + 1; |           p += len + 1; | ||||||
|         } |         } | ||||||
|       break; |       break; | ||||||
| @@ -557,8 +565,14 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|       /* The RR data is a four-byte Internet address. */ |       /* The RR data is a four-byte Internet address. */ | ||||||
|       if (dlen != 4) |       if (dlen != 4) | ||||||
|         return NULL; |         return NULL; | ||||||
|       memcpy(&addr, aptr, sizeof(struct in_addr)); |       printf("\t%s", ares_inet_ntop(AF_INET,aptr,addr,sizeof(addr))); | ||||||
|       printf("\t%s", inet_ntoa(addr)); |       break; | ||||||
|  |  | ||||||
|  |     case T_AAAA: | ||||||
|  |       /* The RR data is a 16-byte IPv6 address. */ | ||||||
|  |       if (dlen != 16) | ||||||
|  |         return NULL; | ||||||
|  |       printf("\t%s", ares_inet_ntop(AF_INET6,aptr,addr,sizeof(addr))); | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case T_WKS: |     case T_WKS: | ||||||
| @@ -583,6 +597,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|  |  | ||||||
|     default: |     default: | ||||||
|       printf("\t[Unknown RR; cannot parse]"); |       printf("\t[Unknown RR; cannot parse]"); | ||||||
|  |       break; | ||||||
|     } |     } | ||||||
|   printf("\n"); |   printf("\n"); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								ares/ahost.c
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								ares/ahost.c
									
									
									
									
									
								
							| @@ -29,13 +29,23 @@ | |||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  |  | ||||||
| #include "ares.h" | #include "ares.h" | ||||||
| #include "ares_dns.h" | #include "ares_dns.h" | ||||||
|  | #include "inet_ntop.h" | ||||||
|  | #include "inet_net_pton.h" | ||||||
|  |  | ||||||
| #ifndef INADDR_NONE | #ifndef INADDR_NONE | ||||||
| #define INADDR_NONE 0xffffffff | #define INADDR_NONE 0xffffffff | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifndef HAVE_STRUCT_IN6_ADDR | ||||||
|  | struct in6_addr | ||||||
|  | { | ||||||
|  |   unsigned char s6_addr[16]; | ||||||
|  | }; | ||||||
|  | #endif | ||||||
|  |  | ||||||
| static void callback(void *arg, int status, struct hostent *host); | static void callback(void *arg, int status, struct hostent *host); | ||||||
| static void usage(void); | static void usage(void); | ||||||
|  |  | ||||||
| @@ -45,7 +55,8 @@ int main(int argc, char **argv) | |||||||
|   int status, nfds; |   int status, nfds; | ||||||
|   fd_set read_fds, write_fds; |   fd_set read_fds, write_fds; | ||||||
|   struct timeval *tvp, tv; |   struct timeval *tvp, tv; | ||||||
|   struct in_addr addr; |   struct in_addr addr4; | ||||||
|  |   struct in6_addr addr6; | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|   WORD wVersionRequested = MAKEWORD(1,1); |   WORD wVersionRequested = MAKEWORD(1,1); | ||||||
| @@ -66,13 +77,20 @@ int main(int argc, char **argv) | |||||||
|   /* Initiate the queries, one per command-line argument. */ |   /* Initiate the queries, one per command-line argument. */ | ||||||
|   for (argv++; *argv; argv++) |   for (argv++; *argv; argv++) | ||||||
|     { |     { | ||||||
|       addr.s_addr = inet_addr(*argv); |       if (ares_inet_pton(AF_INET, *argv, &addr4) == 1) | ||||||
|       if (addr.s_addr == INADDR_NONE) |         { | ||||||
|         ares_gethostbyname(channel, *argv, AF_INET, callback, *argv); |           ares_gethostbyaddr(channel, &addr4, sizeof(addr4), AF_INET, callback, | ||||||
|  |                              *argv); | ||||||
|  |         } | ||||||
|  |       else if (ares_inet_pton(AF_INET6, *argv, &addr6) == 1) | ||||||
|  |         { | ||||||
|  |           ares_gethostbyaddr(channel, &addr6, sizeof(addr6), AF_INET6, callback, | ||||||
|  |                              *argv); | ||||||
|  |         } | ||||||
|       else |       else | ||||||
|         { |         { | ||||||
|           ares_gethostbyaddr(channel, &addr, sizeof(addr), AF_INET, callback, |           /* assume user wants A-records */ | ||||||
|                              *argv); |           ares_gethostbyname(channel, *argv, AF_INET, callback, *argv); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -95,7 +113,6 @@ int main(int argc, char **argv) | |||||||
|  |  | ||||||
| static void callback(void *arg, int status, struct hostent *host) | static void callback(void *arg, int status, struct hostent *host) | ||||||
| { | { | ||||||
|   struct in_addr addr; |  | ||||||
|   char **p; |   char **p; | ||||||
|  |  | ||||||
|   if (status != ARES_SUCCESS) |   if (status != ARES_SUCCESS) | ||||||
| @@ -106,8 +123,21 @@ static void callback(void *arg, int status, struct hostent *host) | |||||||
|  |  | ||||||
|   for (p = host->h_addr_list; *p; p++) |   for (p = host->h_addr_list; *p; p++) | ||||||
|     { |     { | ||||||
|       memcpy(&addr, *p, sizeof(struct in_addr)); |       char addr_buf[46] = "??"; | ||||||
|       printf("%-32s\t%s\n", host->h_name, inet_ntoa(addr)); |  | ||||||
|  |       ares_inet_ntop(host->h_addrtype, *p, addr_buf, sizeof(addr_buf)); | ||||||
|  |       printf("%-32s\t%s", host->h_name, addr_buf); | ||||||
|  | #if 0 | ||||||
|  |       if (host->h_aliases[0]) | ||||||
|  |         { | ||||||
|  |            int i; | ||||||
|  |  | ||||||
|  | 	   printf (", Aliases: "); | ||||||
|  | 	   for (i = 0; host->h_aliases[i]; i++) | ||||||
|  |                printf("%s ", host->h_aliases[i]); | ||||||
|  |         } | ||||||
|  | #endif | ||||||
|  |       puts(""); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										64
									
								
								ares/ares.h
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								ares/ares.h
									
									
									
									
									
								
							| @@ -29,12 +29,14 @@ | |||||||
|  |  | ||||||
| #if defined(WATT32) | #if defined(WATT32) | ||||||
|   #include <netinet/in.h> |   #include <netinet/in.h> | ||||||
|  |   #include <sys/socket.h> | ||||||
|   #include <tcp.h> |   #include <tcp.h> | ||||||
| #elif defined(WIN32) | #elif defined(WIN32) | ||||||
|   #include <winsock.h> |   #include <winsock2.h> | ||||||
|   #include <windows.h> |   #include <windows.h> | ||||||
| #else | #else | ||||||
|   #include <netinet/in.h> |   #include <netinet/in.h> | ||||||
|  |   #include <sys/socket.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef  __cplusplus | #ifdef  __cplusplus | ||||||
| @@ -64,6 +66,13 @@ extern "C" { | |||||||
| #define ARES_EDESTRUCTION       16 | #define ARES_EDESTRUCTION       16 | ||||||
| #define ARES_EBADSTR            17 | #define ARES_EBADSTR            17 | ||||||
|  |  | ||||||
|  | /* ares_getnameinfo error codes */ | ||||||
|  | #define ARES_EBADFLAGS          18 | ||||||
|  |  | ||||||
|  | /* ares_getaddrinfo error codes */ | ||||||
|  | #define ARES_ENONAME            19 | ||||||
|  | #define ARES_EBADHINTS          20 | ||||||
|  |  | ||||||
| /* Flag values */ | /* Flag values */ | ||||||
| #define ARES_FLAG_USEVC         (1 << 0) | #define ARES_FLAG_USEVC         (1 << 0) | ||||||
| #define ARES_FLAG_PRIMARY       (1 << 1) | #define ARES_FLAG_PRIMARY       (1 << 1) | ||||||
| @@ -85,6 +94,47 @@ extern "C" { | |||||||
| #define ARES_OPT_DOMAINS        (1 << 7) | #define ARES_OPT_DOMAINS        (1 << 7) | ||||||
| #define ARES_OPT_LOOKUPS        (1 << 8) | #define ARES_OPT_LOOKUPS        (1 << 8) | ||||||
|  |  | ||||||
|  | /* Nameinfo flag values */ | ||||||
|  | #define ARES_NI_NOFQDN                  (1 << 0) | ||||||
|  | #define ARES_NI_NUMERICHOST             (1 << 1) | ||||||
|  | #define ARES_NI_NAMEREQD                (1 << 2) | ||||||
|  | #define ARES_NI_NUMERICSERV             (1 << 3) | ||||||
|  | #define ARES_NI_DGRAM                   (1 << 4) | ||||||
|  | #define ARES_NI_TCP                     0 | ||||||
|  | #define ARES_NI_UDP                     ARES_NI_DGRAM | ||||||
|  | #define ARES_NI_SCTP                    (1 << 5) | ||||||
|  | #define ARES_NI_DCCP                    (1 << 6) | ||||||
|  | #define ARES_NI_NUMERICSCOPE            (1 << 7) | ||||||
|  | #define ARES_NI_LOOKUPHOST              (1 << 8) | ||||||
|  | #define ARES_NI_LOOKUPSERVICE           (1 << 9) | ||||||
|  | /* Reserved for future use */ | ||||||
|  | #define ARES_NI_IDN                     (1 << 10) | ||||||
|  | #define ARES_NI_IDN_ALLOW_UNASSIGNED    (1 << 11) | ||||||
|  | #define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12) | ||||||
|  |  | ||||||
|  | /* Addrinfo flag values */ | ||||||
|  | #define ARES_AI_CANONNAME               (1 << 0) | ||||||
|  | #define ARES_AI_NUMERICHOST             (1 << 1) | ||||||
|  | #define ARES_AI_PASSIVE                 (1 << 2) | ||||||
|  | #define ARES_AI_NUMERICSERV             (1 << 3) | ||||||
|  | #define ARES_AI_V4MAPPED                (1 << 4) | ||||||
|  | #define ARES_AI_ALL                     (1 << 5) | ||||||
|  | #define ARES_AI_ADDRCONFIG              (1 << 6) | ||||||
|  | /* Reserved for future use */ | ||||||
|  | #define ARES_AI_IDN                     (1 << 10) | ||||||
|  | #define ARES_AI_IDN_ALLOW_UNASSIGNED    (1 << 11) | ||||||
|  | #define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12) | ||||||
|  | #define ARES_AI_CANONIDN                (1 << 13) | ||||||
|  |  | ||||||
|  | #define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \ | ||||||
|  |                       ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \ | ||||||
|  |                       ARES_AI_ADDRCONFIG) | ||||||
|  | #define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about this | ||||||
|  |                                   many sockets */ | ||||||
|  | #define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num))) | ||||||
|  | #define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \ | ||||||
|  |                                          ARES_GETSOCK_MAXNUM))) | ||||||
|  |  | ||||||
| struct ares_options { | struct ares_options { | ||||||
|   int flags; |   int flags; | ||||||
|   int timeout; |   int timeout; | ||||||
| @@ -101,12 +151,15 @@ struct ares_options { | |||||||
|  |  | ||||||
| struct hostent; | struct hostent; | ||||||
| struct timeval; | struct timeval; | ||||||
|  | struct sockaddr; | ||||||
| struct ares_channeldata; | struct ares_channeldata; | ||||||
| typedef struct ares_channeldata *ares_channel; | typedef struct ares_channeldata *ares_channel; | ||||||
| typedef void (*ares_callback)(void *arg, int status, unsigned char *abuf, | typedef void (*ares_callback)(void *arg, int status, unsigned char *abuf, | ||||||
|                               int alen); |                               int alen); | ||||||
| typedef void (*ares_host_callback)(void *arg, int status, | typedef void (*ares_host_callback)(void *arg, int status, | ||||||
|                                    struct hostent *hostent); |                                    struct hostent *hostent); | ||||||
|  | typedef void (*ares_nameinfo_callback)(void *arg, int status, | ||||||
|  |                                        char *node, char *service); | ||||||
|  |  | ||||||
| int ares_init(ares_channel *channelptr); | int ares_init(ares_channel *channelptr); | ||||||
| int ares_init_options(ares_channel *channelptr, struct ares_options *options, | int ares_init_options(ares_channel *channelptr, struct ares_options *options, | ||||||
| @@ -123,8 +176,12 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family, | |||||||
|                         ares_host_callback callback, void *arg); |                         ares_host_callback callback, void *arg); | ||||||
| void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | ||||||
|                         int family, ares_host_callback callback, void *arg); |                         int family, ares_host_callback callback, void *arg); | ||||||
|  | void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, | ||||||
|  |                       socklen_t salen, int flags, | ||||||
|  |                       ares_nameinfo_callback callback, | ||||||
|  |                       void *arg); | ||||||
| int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds); | int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds); | ||||||
|  | int ares_getsock(ares_channel channel, int *socks, int numsocks); | ||||||
| struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv, | struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv, | ||||||
|                              struct timeval *tv); |                              struct timeval *tv); | ||||||
| void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds); | void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds); | ||||||
| @@ -137,12 +194,13 @@ int ares_expand_string(const unsigned char *encoded, const unsigned char *abuf, | |||||||
|                      int alen, unsigned char **s, long *enclen); |                      int alen, unsigned char **s, long *enclen); | ||||||
| int ares_parse_a_reply(const unsigned char *abuf, int alen, | int ares_parse_a_reply(const unsigned char *abuf, int alen, | ||||||
|                        struct hostent **host); |                        struct hostent **host); | ||||||
|  | int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, | ||||||
|  |                        struct hostent **host); | ||||||
| int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, | int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, | ||||||
|                          int addrlen, int family, struct hostent **host); |                          int addrlen, int family, struct hostent **host); | ||||||
| void ares_free_string(void *str); | void ares_free_string(void *str); | ||||||
| void ares_free_hostent(struct hostent *host); | void ares_free_hostent(struct hostent *host); | ||||||
| const char *ares_strerror(int code); | const char *ares_strerror(int code); | ||||||
| void ares_free_errmem(char *mem); |  | ||||||
|  |  | ||||||
| #ifdef  __cplusplus | #ifdef  __cplusplus | ||||||
| } | } | ||||||
|   | |||||||
| @@ -30,12 +30,15 @@ | |||||||
|  |  | ||||||
| #include "ares.h" | #include "ares.h" | ||||||
| #include "ares_private.h" | #include "ares_private.h" | ||||||
|  | #include "inet_net_pton.h" | ||||||
|  |  | ||||||
| int ares__get_hostent(FILE *fp, struct hostent **host) | int ares__get_hostent(FILE *fp, int family, struct hostent **host) | ||||||
| { | { | ||||||
|   char *line = NULL, *p, *q, *canonical, **alias; |   char *line = NULL, *p, *q, *canonical, **alias; | ||||||
|   int status, linesize, end_at_hostname, naliases; |   int status, linesize, end_at_hostname, naliases; | ||||||
|   struct in_addr addr; |   struct in_addr addr; | ||||||
|  |   struct in6_addr addr6; | ||||||
|  |   int addrlen = sizeof(struct in_addr); | ||||||
|   struct hostent *hostent = NULL; |   struct hostent *hostent = NULL; | ||||||
|  |  | ||||||
|   while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) |   while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) | ||||||
| @@ -56,6 +59,17 @@ int ares__get_hostent(FILE *fp, struct hostent **host) | |||||||
|       *p = 0; |       *p = 0; | ||||||
|       addr.s_addr = inet_addr(line); |       addr.s_addr = inet_addr(line); | ||||||
|       if (addr.s_addr == INADDR_NONE) |       if (addr.s_addr == INADDR_NONE) | ||||||
|  |        { | ||||||
|  |           if (ares_inet_pton(AF_INET6, line, &addr6) > 0) | ||||||
|  |             { | ||||||
|  |               if (family != AF_INET6) | ||||||
|  |                 continue; | ||||||
|  |               addrlen = sizeof(struct in6_addr); | ||||||
|  |             } | ||||||
|  |           else | ||||||
|  |             continue; | ||||||
|  |        } | ||||||
|  |       else if (family != AF_INET) | ||||||
|         continue; |         continue; | ||||||
|  |  | ||||||
|       /* Get the canonical hostname. */ |       /* Get the canonical hostname. */ | ||||||
| @@ -100,7 +114,7 @@ int ares__get_hostent(FILE *fp, struct hostent **host) | |||||||
|       hostent->h_addr_list = malloc(2 * sizeof(char *)); |       hostent->h_addr_list = malloc(2 * sizeof(char *)); | ||||||
|       if (!hostent->h_addr_list) |       if (!hostent->h_addr_list) | ||||||
|         break; |         break; | ||||||
|       hostent->h_addr_list[0] = malloc(sizeof(struct in_addr)); |       hostent->h_addr_list[0] = malloc(addrlen); | ||||||
|       if (!hostent->h_addr_list[0]) |       if (!hostent->h_addr_list[0]) | ||||||
|         break; |         break; | ||||||
|       hostent->h_aliases = malloc((naliases + 1) * sizeof(char *)); |       hostent->h_aliases = malloc((naliases + 1) * sizeof(char *)); | ||||||
| @@ -134,9 +148,12 @@ int ares__get_hostent(FILE *fp, struct hostent **host) | |||||||
|         } |         } | ||||||
|       hostent->h_aliases[naliases] = NULL; |       hostent->h_aliases[naliases] = NULL; | ||||||
|  |  | ||||||
|       hostent->h_addrtype = AF_INET; |       hostent->h_addrtype = family; | ||||||
|       hostent->h_length = sizeof(struct in_addr); |       hostent->h_length = addrlen; | ||||||
|       memcpy(hostent->h_addr_list[0], &addr, sizeof(struct in_addr)); |       if (family == AF_INET) | ||||||
|  |         memcpy(hostent->h_addr_list[0], &addr, addrlen); | ||||||
|  |       else if (family == AF_INET6) | ||||||
|  |         memcpy(hostent->h_addr_list[0], &addr6, addrlen); | ||||||
|       hostent->h_addr_list[1] = NULL; |       hostent->h_addr_list[1] = NULL; | ||||||
|       *host = hostent; |       *host = hostent; | ||||||
|       free(line); |       free(line); | ||||||
|   | |||||||
| @@ -50,7 +50,7 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize) | |||||||
|       if ((*buf)[len - 1] == '\n') |       if ((*buf)[len - 1] == '\n') | ||||||
|         { |         { | ||||||
|           (*buf)[len - 1] = 0; |           (*buf)[len - 1] = 0; | ||||||
|           return ARES_SUCCESS; |           break; | ||||||
|         } |         } | ||||||
|       offset = len; |       offset = len; | ||||||
|  |  | ||||||
| @@ -61,4 +61,5 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize) | |||||||
|       *buf = newbuf; |       *buf = newbuf; | ||||||
|       *bufsize *= 2; |       *bufsize *= 2; | ||||||
|     } |     } | ||||||
|  |   return ARES_SUCCESS; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -34,6 +34,6 @@ might have been stored in their arguments. | |||||||
| .BR ares_init (3) | .BR ares_init (3) | ||||||
| .BR ares_destroy (3) | .BR ares_destroy (3) | ||||||
| .SH NOTES | .SH NOTES | ||||||
| This function is not compatible with ares. | This function was added in c-ares 1.2.0 | ||||||
| .SH AUTHOR | .SH AUTHOR | ||||||
| Dirk Manske | Dirk Manske | ||||||
|   | |||||||
| @@ -18,6 +18,18 @@ | |||||||
| #ifndef ARES__DNS_H | #ifndef ARES__DNS_H | ||||||
| #define ARES__DNS_H | #define ARES__DNS_H | ||||||
|  |  | ||||||
|  | #ifdef ARES_BIG_ENDIAN | ||||||
|  | /* big-endian aware versions */ | ||||||
|  | #define DNS__16BIT(p)                   (((p)[1] << 8) | (p)[0]) | ||||||
|  | #define DNS__32BIT(p)                   (((p)[3] << 24) | ((p)[2] << 16) | \ | ||||||
|  |                                          ((p)[1] << 8) | (p)[0]) | ||||||
|  | #define DNS__SET16BIT(p, v)             (((p)[1] = ((v) >> 8) & 0xff), \ | ||||||
|  |                                          ((p)[0] = (v) & 0xff)) | ||||||
|  | #define DNS__SET32BIT(p, v)             (((p)[3] = ((v) >> 24) & 0xff), \ | ||||||
|  |                                          ((p)[2] = ((v) >> 16) & 0xff), \ | ||||||
|  |                                          ((p)[1] = ((v) >> 8) & 0xff), \ | ||||||
|  |                                          ((p)[0] = (v) & 0xff)) | ||||||
|  | #else | ||||||
| #define DNS__16BIT(p)                   (((p)[0] << 8) | (p)[1]) | #define DNS__16BIT(p)                   (((p)[0] << 8) | (p)[1]) | ||||||
| #define DNS__32BIT(p)                   (((p)[0] << 24) | ((p)[1] << 16) | \ | #define DNS__32BIT(p)                   (((p)[0] << 24) | ((p)[1] << 16) | \ | ||||||
|                                          ((p)[2] << 8) | (p)[3]) |                                          ((p)[2] << 8) | (p)[3]) | ||||||
| @@ -27,6 +39,16 @@ | |||||||
|                                          ((p)[1] = ((v) >> 16) & 0xff), \ |                                          ((p)[1] = ((v) >> 16) & 0xff), \ | ||||||
|                                          ((p)[2] = ((v) >> 8) & 0xff), \ |                                          ((p)[2] = ((v) >> 8) & 0xff), \ | ||||||
|                                          ((p)[3] = (v) & 0xff)) |                                          ((p)[3] = (v) & 0xff)) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if 0 | ||||||
|  | /* we cannot use this approach on systems where we can't access 16/32 bit | ||||||
|  |    data on un-aligned addresses */ | ||||||
|  | #define DNS__16BIT(p)                   ntohs(*(unsigned short*)(p)) | ||||||
|  | #define DNS__32BIT(p)                   ntohl(*(unsigned long*)(p)) | ||||||
|  | #define DNS__SET16BIT(p, v)             *(unsigned short*)(p) = htons(v) | ||||||
|  | #define DNS__SET32BIT(p, v)             *(unsigned long*)(p) = htonl(v) | ||||||
|  | #endif | ||||||
|  |  | ||||||
| /* Macros for parsing a DNS header */ | /* Macros for parsing a DNS header */ | ||||||
| #define DNS_HEADER_QID(h)               DNS__16BIT(h) | #define DNS_HEADER_QID(h)               DNS__16BIT(h) | ||||||
|   | |||||||
| @@ -21,6 +21,9 @@ | |||||||
| #else | #else | ||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| @@ -103,6 +106,8 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf, | |||||||
|   /* Nuke the trailing period if we wrote one. */ |   /* Nuke the trailing period if we wrote one. */ | ||||||
|   if (q > *s) |   if (q > *s) | ||||||
|     *(q - 1) = 0; |     *(q - 1) = 0; | ||||||
|  |   else | ||||||
|  |     *q = 0; /* zero terminate */ | ||||||
|  |  | ||||||
|   return ARES_SUCCESS; |   return ARES_SUCCESS; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -44,13 +46,13 @@ int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds) | |||||||
|             nfds = server->udp_socket + 1; |             nfds = server->udp_socket + 1; | ||||||
|         } |         } | ||||||
|       if (server->tcp_socket != ARES_SOCKET_BAD) |       if (server->tcp_socket != ARES_SOCKET_BAD) | ||||||
|         { |        { | ||||||
|           FD_SET(server->tcp_socket, read_fds); |          FD_SET(server->tcp_socket, read_fds); | ||||||
|           if (server->qhead) |          if (server->qhead) | ||||||
|             FD_SET(server->tcp_socket, write_fds); |            FD_SET(server->tcp_socket, write_fds); | ||||||
|           if (server->tcp_socket >= nfds) |          if (server->tcp_socket >= nfds) | ||||||
|             nfds = server->tcp_socket + 1; |            nfds = server->tcp_socket + 1; | ||||||
|         } | 	} | ||||||
|     } |     } | ||||||
|   return (int)nfds; |   return (int)nfds; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -28,8 +28,8 @@ The | |||||||
| .I ares_free_hostent | .I ares_free_hostent | ||||||
| function frees a | function frees a | ||||||
| .B struct hostent | .B struct hostent | ||||||
| allocated by one of the functions \fIares_parse_a_reply(3)\fP or | allocated by one of the functions \fIares_parse_a_reply(3)\fP, | ||||||
| \fIares_parse_ptr_reply(3)\fP. | \fIares_parse_aaaa_reply(3)\fP, or \fIares_parse_ptr_reply(3)\fP. | ||||||
| .SH NOTES | .SH NOTES | ||||||
| It is not necessary (and is not correct) to free the host structure passed to | It is not necessary (and is not correct) to free the host structure passed to | ||||||
| the callback functions for \fIares_gethostbyname(3)\fP or | the callback functions for \fIares_gethostbyname(3)\fP or | ||||||
| @@ -37,6 +37,7 @@ the callback functions for \fIares_gethostbyname(3)\fP or | |||||||
| host structures when the callback returns. | host structures when the callback returns. | ||||||
| .SH SEE ALSO | .SH SEE ALSO | ||||||
| .BR ares_parse_a_reply (3), | .BR ares_parse_a_reply (3), | ||||||
|  | .BR ares_parse_aaaa_reply (3), | ||||||
| .BR ares_parse_ptr_reply (3) | .BR ares_parse_ptr_reply (3) | ||||||
| .SH AUTHOR | .SH AUTHOR | ||||||
| Greg Hudson, MIT Information Systems | Greg Hudson, MIT Information Systems | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -12,7 +14,6 @@ | |||||||
|  * this software for any purpose.  It is provided "as is" |  * this software for any purpose.  It is provided "as is" | ||||||
|  * without express or implied warranty. |  * without express or implied warranty. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
|  |  | ||||||
| @@ -23,6 +24,9 @@ | |||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <netdb.h> | #include <netdb.h> | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| @@ -31,6 +35,7 @@ | |||||||
|  |  | ||||||
| #include "ares.h" | #include "ares.h" | ||||||
| #include "ares_private.h" | #include "ares_private.h" | ||||||
|  | #include "inet_net_pton.h" | ||||||
|  |  | ||||||
| #ifdef WATT32 | #ifdef WATT32 | ||||||
| #undef WIN32 | #undef WIN32 | ||||||
| @@ -39,7 +44,8 @@ | |||||||
| struct addr_query { | struct addr_query { | ||||||
|   /* Arguments passed to ares_gethostbyaddr() */ |   /* Arguments passed to ares_gethostbyaddr() */ | ||||||
|   ares_channel channel; |   ares_channel channel; | ||||||
|   struct in_addr addr; |   union ares_addr addr; | ||||||
|  |   int family; | ||||||
|   ares_host_callback callback; |   ares_host_callback callback; | ||||||
|   void *arg; |   void *arg; | ||||||
|  |  | ||||||
| @@ -51,14 +57,21 @@ static void addr_callback(void *arg, int status, unsigned char *abuf, | |||||||
|                           int alen); |                           int alen); | ||||||
| static void end_aquery(struct addr_query *aquery, int status, | static void end_aquery(struct addr_query *aquery, int status, | ||||||
|                        struct hostent *host); |                        struct hostent *host); | ||||||
| static int file_lookup(struct in_addr *addr, struct hostent **host); | static int file_lookup(union ares_addr *addr, int family, struct hostent **host); | ||||||
|  |  | ||||||
| void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | ||||||
|                         int family, ares_host_callback callback, void *arg) |                         int family, ares_host_callback callback, void *arg) | ||||||
| { | { | ||||||
|   struct addr_query *aquery; |   struct addr_query *aquery; | ||||||
|  |  | ||||||
|   if (family != AF_INET || addrlen != sizeof(struct in_addr)) |   if (family != AF_INET && family != AF_INET6) | ||||||
|  |     { | ||||||
|  |       callback(arg, ARES_ENOTIMP, NULL); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   if ((family == AF_INET && addrlen != sizeof(struct in_addr)) || | ||||||
|  |       (family == AF_INET6 && addrlen != sizeof(struct in6_addr))) | ||||||
|     { |     { | ||||||
|       callback(arg, ARES_ENOTIMP, NULL); |       callback(arg, ARES_ENOTIMP, NULL); | ||||||
|       return; |       return; | ||||||
| @@ -71,7 +84,11 @@ void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | |||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|   aquery->channel = channel; |   aquery->channel = channel; | ||||||
|   memcpy(&aquery->addr, addr, sizeof(aquery->addr)); |   if (family == AF_INET) | ||||||
|  |     memcpy(&aquery->addr.addr4, addr, sizeof(struct in_addr)); | ||||||
|  |   else | ||||||
|  |     memcpy(&aquery->addr.addr6, addr, sizeof(struct in6_addr)); | ||||||
|  |   aquery->family = family; | ||||||
|   aquery->callback = callback; |   aquery->callback = callback; | ||||||
|   aquery->arg = arg; |   aquery->arg = arg; | ||||||
|   aquery->remaining_lookups = channel->lookups; |   aquery->remaining_lookups = channel->lookups; | ||||||
| @@ -82,7 +99,7 @@ void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | |||||||
| static void next_lookup(struct addr_query *aquery) | static void next_lookup(struct addr_query *aquery) | ||||||
| { | { | ||||||
|   const char *p; |   const char *p; | ||||||
|   char name[64]; |   char name[128]; | ||||||
|   int a1, a2, a3, a4, status; |   int a1, a2, a3, a4, status; | ||||||
|   struct hostent *host; |   struct hostent *host; | ||||||
|   unsigned long addr; |   unsigned long addr; | ||||||
| @@ -92,18 +109,38 @@ static void next_lookup(struct addr_query *aquery) | |||||||
|       switch (*p) |       switch (*p) | ||||||
|         { |         { | ||||||
|         case 'b': |         case 'b': | ||||||
|           addr = ntohl(aquery->addr.s_addr); |           if (aquery->family == AF_INET) | ||||||
|           a1 = (int)((addr >> 24) & 0xff); |             { | ||||||
|           a2 = (int)((addr >> 16) & 0xff); |               addr = ntohl(aquery->addr.addr4.s_addr); | ||||||
|           a3 = (int)((addr >> 8) & 0xff); |               a1 = (int)((addr >> 24) & 0xff); | ||||||
|           a4 = (int)(addr & 0xff); |               a2 = (int)((addr >> 16) & 0xff); | ||||||
|           sprintf(name, "%d.%d.%d.%d.in-addr.arpa", a4, a3, a2, a1); |               a3 = (int)((addr >> 8) & 0xff); | ||||||
|           aquery->remaining_lookups = p + 1; |               a4 = (int)(addr & 0xff); | ||||||
|           ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, |               sprintf(name, "%d.%d.%d.%d.in-addr.arpa", a4, a3, a2, a1); | ||||||
|                      aquery); |               aquery->remaining_lookups = p + 1; | ||||||
|  |               ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, | ||||||
|  |                          aquery); | ||||||
|  |             } | ||||||
|  |           else | ||||||
|  |             { | ||||||
|  |               unsigned char *bytes; | ||||||
|  |               bytes = (unsigned char *)&aquery->addr.addr6.s6_addr; | ||||||
|  |               sprintf(name, "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa", | ||||||
|  |                       bytes[15]&0xf, bytes[15] >> 4, bytes[14]&0xf, bytes[14] >> 4, | ||||||
|  |                       bytes[13]&0xf, bytes[13] >> 4, bytes[12]&0xf, bytes[12] >> 4, | ||||||
|  |                       bytes[11]&0xf, bytes[11] >> 4, bytes[10]&0xf, bytes[10] >> 4, | ||||||
|  |                       bytes[9]&0xf, bytes[9] >> 4, bytes[8]&0xf, bytes[8] >> 4, | ||||||
|  |                       bytes[7]&0xf, bytes[7] >> 4, bytes[6]&0xf, bytes[6] >> 4, | ||||||
|  |                       bytes[5]&0xf, bytes[5] >> 4, bytes[4]&0xf, bytes[4] >> 4, | ||||||
|  |                       bytes[3]&0xf, bytes[3] >> 4, bytes[2]&0xf, bytes[2] >> 4, | ||||||
|  |                       bytes[1]&0xf, bytes[1] >> 4, bytes[0]&0xf, bytes[0] >> 4); | ||||||
|  |               aquery->remaining_lookups = p + 1; | ||||||
|  |               ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, | ||||||
|  |                          aquery); | ||||||
|  |             } | ||||||
|           return; |           return; | ||||||
|         case 'f': |         case 'f': | ||||||
|           status = file_lookup(&aquery->addr, &host); |           status = file_lookup(&aquery->addr, aquery->family, &host); | ||||||
|           if (status != ARES_ENOTFOUND) |           if (status != ARES_ENOTFOUND) | ||||||
|             { |             { | ||||||
|               end_aquery(aquery, status, host); |               end_aquery(aquery, status, host); | ||||||
| @@ -122,8 +159,12 @@ static void addr_callback(void *arg, int status, unsigned char *abuf, int alen) | |||||||
|  |  | ||||||
|   if (status == ARES_SUCCESS) |   if (status == ARES_SUCCESS) | ||||||
|     { |     { | ||||||
|       status = ares_parse_ptr_reply(abuf, alen, &aquery->addr, |       if (aquery->family == AF_INET) | ||||||
|                                     sizeof(struct in_addr), AF_INET, &host); |         status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr4, | ||||||
|  |                                       sizeof(struct in_addr), AF_INET, &host); | ||||||
|  |       else | ||||||
|  |         status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr6, | ||||||
|  |                                       sizeof(struct in6_addr), AF_INET6, &host); | ||||||
|       end_aquery(aquery, status, host); |       end_aquery(aquery, status, host); | ||||||
|     } |     } | ||||||
|   else if (status == ARES_EDESTRUCTION) |   else if (status == ARES_EDESTRUCTION) | ||||||
| @@ -141,27 +182,26 @@ static void end_aquery(struct addr_query *aquery, int status, | |||||||
|   free(aquery); |   free(aquery); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int file_lookup(struct in_addr *addr, struct hostent **host) | static int file_lookup(union ares_addr *addr, int family, struct hostent **host) | ||||||
| { | { | ||||||
|   FILE *fp; |   FILE *fp; | ||||||
|   int status; |   int status; | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|  |  | ||||||
|   char PATH_HOSTS[MAX_PATH]; |   char PATH_HOSTS[MAX_PATH]; | ||||||
|   if (IS_NT()) { |   if (IS_NT()) { | ||||||
|         char tmp[MAX_PATH]; |     char tmp[MAX_PATH]; | ||||||
|         HKEY hkeyHosts; |     HKEY hkeyHosts; | ||||||
|  |  | ||||||
|         if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts) |     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts) | ||||||
|                 == ERROR_SUCCESS) |         == ERROR_SUCCESS) | ||||||
|         { |     { | ||||||
|                 DWORD dwLength = MAX_PATH; |       DWORD dwLength = MAX_PATH; | ||||||
|                 RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, tmp, |       RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp, | ||||||
|                         &dwLength); |                       &dwLength); | ||||||
|                 ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH); |       ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH); | ||||||
|                 RegCloseKey(hkeyHosts); |       RegCloseKey(hkeyHosts); | ||||||
|         } |     } | ||||||
|   } |   } | ||||||
|   else |   else | ||||||
|     GetWindowsDirectory(PATH_HOSTS, MAX_PATH); |     GetWindowsDirectory(PATH_HOSTS, MAX_PATH); | ||||||
| @@ -179,11 +219,23 @@ static int file_lookup(struct in_addr *addr, struct hostent **host) | |||||||
|   fp = fopen(PATH_HOSTS, "r"); |   fp = fopen(PATH_HOSTS, "r"); | ||||||
|   if (!fp) |   if (!fp) | ||||||
|     return ARES_ENOTFOUND; |     return ARES_ENOTFOUND; | ||||||
|  |   while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS) | ||||||
|   while ((status = ares__get_hostent(fp, host)) == ARES_SUCCESS) |  | ||||||
|     { |     { | ||||||
|       if (memcmp((*host)->h_addr, addr, sizeof(struct in_addr)) == 0) |       if (family != (*host)->h_addrtype) | ||||||
|         break; |         { | ||||||
|  |           ares_free_hostent(*host); | ||||||
|  |           continue; | ||||||
|  |         } | ||||||
|  |       if (family == AF_INET) | ||||||
|  |         { | ||||||
|  |           if (memcmp((*host)->h_addr, &addr->addr4, sizeof(struct in_addr)) == 0) | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |       else if (family == AF_INET6) | ||||||
|  |         { | ||||||
|  |           if (memcmp((*host)->h_addr, &addr->addr6, sizeof(struct in6_addr)) == 0) | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|       ares_free_hostent(*host); |       ares_free_hostent(*host); | ||||||
|     } |     } | ||||||
|   fclose(fp); |   fclose(fp); | ||||||
|   | |||||||
| @@ -23,8 +23,13 @@ | |||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <arpa/inet.h> | #include <arpa/inet.h> | ||||||
| #include <netdb.h> | #include <netdb.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_H | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
| #endif | #endif | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| @@ -33,6 +38,8 @@ | |||||||
|  |  | ||||||
| #include "ares.h" | #include "ares.h" | ||||||
| #include "ares_private.h" | #include "ares_private.h" | ||||||
|  | #include "inet_net_pton.h" | ||||||
|  | #include "bitncmp.h" | ||||||
|  |  | ||||||
| #ifdef WATT32 | #ifdef WATT32 | ||||||
| #undef WIN32 | #undef WIN32 | ||||||
| @@ -44,7 +51,7 @@ struct host_query { | |||||||
|   char *name; |   char *name; | ||||||
|   ares_host_callback callback; |   ares_host_callback callback; | ||||||
|   void *arg; |   void *arg; | ||||||
|  |   int family; | ||||||
|   const char *remaining_lookups; |   const char *remaining_lookups; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -53,13 +60,17 @@ static void host_callback(void *arg, int status, unsigned char *abuf, | |||||||
|                           int alen); |                           int alen); | ||||||
| static void end_hquery(struct host_query *hquery, int status, | static void end_hquery(struct host_query *hquery, int status, | ||||||
|                        struct hostent *host); |                        struct hostent *host); | ||||||
| static int fake_hostent(const char *name, ares_host_callback callback, | static int fake_hostent(const char *name, int family, ares_host_callback callback, | ||||||
|                         void *arg); |                         void *arg); | ||||||
| static int file_lookup(const char *name, struct hostent **host); | static int file_lookup(const char *name, int family, struct hostent **host); | ||||||
| static void sort_addresses(struct hostent *host, struct apattern *sortlist, | static void sort_addresses(struct hostent *host, struct apattern *sortlist, | ||||||
|                            int nsort); |                            int nsort); | ||||||
|  | static void sort6_addresses(struct hostent *host, struct apattern *sortlist, | ||||||
|  |                            int nsort); | ||||||
| static int get_address_index(struct in_addr *addr, struct apattern *sortlist, | static int get_address_index(struct in_addr *addr, struct apattern *sortlist, | ||||||
|                              int nsort); |                              int nsort); | ||||||
|  | static int get6_address_index(struct in6_addr *addr, struct apattern *sortlist, | ||||||
|  |                              int nsort); | ||||||
|  |  | ||||||
| void ares_gethostbyname(ares_channel channel, const char *name, int family, | void ares_gethostbyname(ares_channel channel, const char *name, int family, | ||||||
|                         ares_host_callback callback, void *arg) |                         ares_host_callback callback, void *arg) | ||||||
| @@ -67,13 +78,13 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family, | |||||||
|   struct host_query *hquery; |   struct host_query *hquery; | ||||||
|  |  | ||||||
|   /* Right now we only know how to look up Internet addresses. */ |   /* Right now we only know how to look up Internet addresses. */ | ||||||
|   if (family != AF_INET) |   if (family != AF_INET && family != AF_INET6) | ||||||
|     { |     { | ||||||
|       callback(arg, ARES_ENOTIMP, NULL); |       callback(arg, ARES_ENOTIMP, NULL); | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   if (fake_hostent(name, callback, arg)) |   if (fake_hostent(name, family, callback, arg)) | ||||||
|     return; |     return; | ||||||
|  |  | ||||||
|   /* Allocate and fill in the host query structure. */ |   /* Allocate and fill in the host query structure. */ | ||||||
| @@ -85,6 +96,7 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family, | |||||||
|     } |     } | ||||||
|   hquery->channel = channel; |   hquery->channel = channel; | ||||||
|   hquery->name = strdup(name); |   hquery->name = strdup(name); | ||||||
|  |   hquery->family = family; | ||||||
|   if (!hquery->name) |   if (!hquery->name) | ||||||
|     { |     { | ||||||
|       free(hquery); |       free(hquery); | ||||||
| @@ -112,13 +124,17 @@ static void next_lookup(struct host_query *hquery) | |||||||
|         case 'b': |         case 'b': | ||||||
|           /* DNS lookup */ |           /* DNS lookup */ | ||||||
|           hquery->remaining_lookups = p + 1; |           hquery->remaining_lookups = p + 1; | ||||||
|           ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, |           if (hquery->family == AF_INET6) | ||||||
|                       hquery); |             ares_search(hquery->channel, hquery->name, C_IN, T_AAAA, host_callback, | ||||||
|  |                         hquery); | ||||||
|  |           else | ||||||
|  |             ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, | ||||||
|  |                         hquery); | ||||||
|           return; |           return; | ||||||
|  |  | ||||||
|         case 'f': |         case 'f': | ||||||
|           /* Host file lookup */ |           /* Host file lookup */ | ||||||
|           status = file_lookup(hquery->name, &host); |           status = file_lookup(hquery->name, hquery->family, &host); | ||||||
|           if (status != ARES_ENOTFOUND) |           if (status != ARES_ENOTFOUND) | ||||||
|             { |             { | ||||||
|               end_hquery(hquery, status, host); |               end_hquery(hquery, status, host); | ||||||
| @@ -138,11 +154,27 @@ static void host_callback(void *arg, int status, unsigned char *abuf, int alen) | |||||||
|  |  | ||||||
|   if (status == ARES_SUCCESS) |   if (status == ARES_SUCCESS) | ||||||
|     { |     { | ||||||
|       status = ares_parse_a_reply(abuf, alen, &host); |       if (hquery->family == AF_INET) | ||||||
|       if (host && channel->nsort) |         { | ||||||
|         sort_addresses(host, channel->sortlist, channel->nsort); |           status = ares_parse_a_reply(abuf, alen, &host); | ||||||
|  |           if (host && channel->nsort) | ||||||
|  |             sort_addresses(host, channel->sortlist, channel->nsort); | ||||||
|  |         } | ||||||
|  |       else if (hquery->family == AF_INET6) | ||||||
|  |         { | ||||||
|  |           status = ares_parse_aaaa_reply(abuf, alen, &host); | ||||||
|  |           if (host && channel->nsort) | ||||||
|  |             sort6_addresses(host, channel->sortlist, channel->nsort); | ||||||
|  |         } | ||||||
|       end_hquery(hquery, status, host); |       end_hquery(hquery, status, host); | ||||||
|     } |     } | ||||||
|  |   else if (status == ARES_ENODATA && hquery->family == AF_INET6) | ||||||
|  |     { | ||||||
|  |       /* There was no AAAA now lookup an A */ | ||||||
|  |       hquery->family = AF_INET; | ||||||
|  |       ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, | ||||||
|  |                   hquery); | ||||||
|  |     } | ||||||
|   else if (status == ARES_EDESTRUCTION) |   else if (status == ARES_EDESTRUCTION) | ||||||
|     end_hquery(hquery, status, NULL); |     end_hquery(hquery, status, NULL); | ||||||
|   else |   else | ||||||
| @@ -162,36 +194,34 @@ static void end_hquery(struct host_query *hquery, int status, | |||||||
| /* If the name looks like an IP address, fake up a host entry, end the | /* If the name looks like an IP address, fake up a host entry, end the | ||||||
|  * query immediately, and return true.  Otherwise return false. |  * query immediately, and return true.  Otherwise return false. | ||||||
|  */ |  */ | ||||||
| static int fake_hostent(const char *name, ares_host_callback callback, | static int fake_hostent(const char *name, int family, ares_host_callback callback, | ||||||
|                         void *arg) |                         void *arg) | ||||||
| { | { | ||||||
|   struct in_addr addr; |  | ||||||
|   struct hostent hostent; |   struct hostent hostent; | ||||||
|   const char *p; |  | ||||||
|   char *aliases[1] = { NULL }; |   char *aliases[1] = { NULL }; | ||||||
|   char *addrs[2]; |   char *addrs[2]; | ||||||
|  |   int result = 0; | ||||||
|  |   struct in_addr in; | ||||||
|  |   struct in6_addr in6; | ||||||
|  |  | ||||||
|   /* It only looks like an IP address if it's all numbers and dots. */ |   if (family == AF_INET) | ||||||
|   for (p = name; *p; p++) |     result = ((in.s_addr = inet_addr(name)) == INADDR_NONE ? 0 : 1); | ||||||
|     { |   else if (family == AF_INET6) | ||||||
|       if (!isdigit((unsigned char)*p) && *p != '.') |     result = (ares_inet_pton(AF_INET6, name, &in6) < 1 ? 0 : 1); | ||||||
|         return 0; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|   /* It also only looks like an IP address if it's non-zero-length and |   if (!result) | ||||||
|    * doesn't end with a dot. |  | ||||||
|    */ |  | ||||||
|   if (p == name || *(p - 1) == '.') |  | ||||||
|     return 0; |     return 0; | ||||||
|  |  | ||||||
|   /* It looks like an IP address.  Figure out what IP address it is. */ |   if (family == AF_INET) | ||||||
|   addr.s_addr = inet_addr(name); |  | ||||||
|   if (addr.s_addr == INADDR_NONE) |  | ||||||
|     { |     { | ||||||
|       callback(arg, ARES_EBADNAME, NULL); |       hostent.h_length = sizeof(struct in_addr); | ||||||
|       return 1; |       addrs[0] = (char *)∈ | ||||||
|  |     } | ||||||
|  |   else if (family == AF_INET6) | ||||||
|  |     { | ||||||
|  |       hostent.h_length = sizeof(struct in6_addr); | ||||||
|  |       addrs[0] = (char *)&in6; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   /* Duplicate the name, to avoid a constness violation. */ |   /* Duplicate the name, to avoid a constness violation. */ | ||||||
|   hostent.h_name = strdup(name); |   hostent.h_name = strdup(name); | ||||||
|   if (!hostent.h_name) |   if (!hostent.h_name) | ||||||
| @@ -201,11 +231,9 @@ static int fake_hostent(const char *name, ares_host_callback callback, | |||||||
|     } |     } | ||||||
|  |  | ||||||
|   /* Fill in the rest of the host structure and terminate the query. */ |   /* Fill in the rest of the host structure and terminate the query. */ | ||||||
|   addrs[0] = (char *) &addr; |  | ||||||
|   addrs[1] = NULL; |   addrs[1] = NULL; | ||||||
|   hostent.h_aliases = aliases; |   hostent.h_aliases = aliases; | ||||||
|   hostent.h_addrtype = AF_INET; |   hostent.h_addrtype = family; | ||||||
|   hostent.h_length = sizeof(struct in_addr); |  | ||||||
|   hostent.h_addr_list = addrs; |   hostent.h_addr_list = addrs; | ||||||
|   callback(arg, ARES_SUCCESS, &hostent); |   callback(arg, ARES_SUCCESS, &hostent); | ||||||
|  |  | ||||||
| @@ -213,7 +241,7 @@ static int fake_hostent(const char *name, ares_host_callback callback, | |||||||
|   return 1; |   return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int file_lookup(const char *name, struct hostent **host) | static int file_lookup(const char *name, int family, struct hostent **host) | ||||||
| { | { | ||||||
|   FILE *fp; |   FILE *fp; | ||||||
|   char **alias; |   char **alias; | ||||||
| @@ -222,18 +250,18 @@ static int file_lookup(const char *name, struct hostent **host) | |||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|   char PATH_HOSTS[MAX_PATH]; |   char PATH_HOSTS[MAX_PATH]; | ||||||
|   if (IS_NT()) { |   if (IS_NT()) { | ||||||
|         char tmp[MAX_PATH]; |     char tmp[MAX_PATH]; | ||||||
|         HKEY hkeyHosts; |     HKEY hkeyHosts; | ||||||
|  |  | ||||||
|         if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts) |     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts) | ||||||
|                 == ERROR_SUCCESS) |         == ERROR_SUCCESS) | ||||||
|         { |     { | ||||||
|                 DWORD dwLength = MAX_PATH; |       DWORD dwLength = MAX_PATH; | ||||||
|                 RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, tmp, |       RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp, | ||||||
|                         &dwLength); |                       &dwLength); | ||||||
|                 ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH); |       ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH); | ||||||
|                 RegCloseKey(hkeyHosts); |       RegCloseKey(hkeyHosts); | ||||||
|         } |     } | ||||||
|   } |   } | ||||||
|   else |   else | ||||||
|     GetWindowsDirectory(PATH_HOSTS, MAX_PATH); |     GetWindowsDirectory(PATH_HOSTS, MAX_PATH); | ||||||
| @@ -252,7 +280,7 @@ static int file_lookup(const char *name, struct hostent **host) | |||||||
|   if (!fp) |   if (!fp) | ||||||
|     return ARES_ENOTFOUND; |     return ARES_ENOTFOUND; | ||||||
|  |  | ||||||
|   while ((status = ares__get_hostent(fp, host)) == ARES_SUCCESS) |   while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS) | ||||||
|     { |     { | ||||||
|       if (strcasecmp((*host)->h_name, name) == 0) |       if (strcasecmp((*host)->h_name, name) == 0) | ||||||
|         break; |         break; | ||||||
| @@ -310,8 +338,66 @@ static int get_address_index(struct in_addr *addr, struct apattern *sortlist, | |||||||
|  |  | ||||||
|   for (i = 0; i < nsort; i++) |   for (i = 0; i < nsort; i++) | ||||||
|     { |     { | ||||||
|       if ((addr->s_addr & sortlist[i].mask.s_addr) == sortlist[i].addr.s_addr) |       if (sortlist[i].family != AF_INET) | ||||||
|         break; |         continue; | ||||||
|  |       if (sortlist[i].type == PATTERN_MASK) | ||||||
|  |         { | ||||||
|  |           if ((addr->s_addr & sortlist[i].mask.addr.addr4.s_addr) | ||||||
|  |               == sortlist[i].addr.addr4.s_addr) | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |       else | ||||||
|  |         { | ||||||
|  |           if (!ares_bitncmp(&addr->s_addr, &sortlist[i].addr.addr4.s_addr, | ||||||
|  |                             sortlist[i].mask.bits)) | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|   return i; |   return i; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void sort6_addresses(struct hostent *host, struct apattern *sortlist, | ||||||
|  |                            int nsort) | ||||||
|  | { | ||||||
|  |   struct in6_addr a1, a2; | ||||||
|  |   int i1, i2, ind1, ind2; | ||||||
|  |  | ||||||
|  |   /* This is a simple insertion sort, not optimized at all.  i1 walks | ||||||
|  |    * through the address list, with the loop invariant that everything | ||||||
|  |    * to the left of i1 is sorted.  In the loop body, the value at i1 is moved | ||||||
|  |    * back through the list (via i2) until it is in sorted order. | ||||||
|  |    */ | ||||||
|  |   for (i1 = 0; host->h_addr_list[i1]; i1++) | ||||||
|  |     { | ||||||
|  |       memcpy(&a1, host->h_addr_list[i1], sizeof(struct in6_addr)); | ||||||
|  |       ind1 = get6_address_index(&a1, sortlist, nsort); | ||||||
|  |       for (i2 = i1 - 1; i2 >= 0; i2--) | ||||||
|  |         { | ||||||
|  |           memcpy(&a2, host->h_addr_list[i2], sizeof(struct in6_addr)); | ||||||
|  |           ind2 = get6_address_index(&a2, sortlist, nsort); | ||||||
|  |           if (ind2 <= ind1) | ||||||
|  |             break; | ||||||
|  |           memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in6_addr)); | ||||||
|  |         } | ||||||
|  |       memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in6_addr)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Find the first entry in sortlist which matches addr.  Return nsort | ||||||
|  |  * if none of them match. | ||||||
|  |  */ | ||||||
|  | static int get6_address_index(struct in6_addr *addr, struct apattern *sortlist, | ||||||
|  |                              int nsort) | ||||||
|  | { | ||||||
|  |   int i; | ||||||
|  |  | ||||||
|  |   for (i = 0; i < nsort; i++) | ||||||
|  |     { | ||||||
|  |       if (sortlist[i].family != AF_INET6) | ||||||
|  |         continue; | ||||||
|  |         if (!ares_bitncmp(&addr->s6_addr, &sortlist[i].addr.addr6.s6_addr, sortlist[i].mask.bits)) | ||||||
|  |           break; | ||||||
|  |     } | ||||||
|  |   return i; | ||||||
|  | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										145
									
								
								ares/ares_getnameinfo.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								ares/ares_getnameinfo.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | |||||||
|  | .\" $Id$ | ||||||
|  | .\" | ||||||
|  | .\" Copyright 2005 by Dominick Meglio. | ||||||
|  | .\" | ||||||
|  | .\" Permission to use, copy, modify, and distribute this | ||||||
|  | .\" software and its documentation for any purpose and without | ||||||
|  | .\" fee is hereby granted, provided that the above copyright | ||||||
|  | .\" notice appear in all copies and that both that copyright | ||||||
|  | .\" notice and this permission notice appear in supporting | ||||||
|  | .\" documentation, and that the name of M.I.T. not be used in | ||||||
|  | .\" advertising or publicity pertaining to distribution of the | ||||||
|  | .\" software without specific, written prior permission. | ||||||
|  | .\" M.I.T. makes no representations about the suitability of | ||||||
|  | .\" this software for any purpose.  It is provided "as is" | ||||||
|  | .\" without express or implied warranty. | ||||||
|  | .\" | ||||||
|  | .TH ARES_GETNAMEINFO 3 "16 May 2005" | ||||||
|  | .SH NAME | ||||||
|  | ares_getnameinfo \- Address-to-nodename translation in protocol-independent manner | ||||||
|  | .SH SYNOPSIS | ||||||
|  | .nf | ||||||
|  | .B #include <ares.h> | ||||||
|  | .PP | ||||||
|  | .B typedef void (*ares_nameinfo_callback)(void *\fIarg\fP, int \fIstatus\fP, | ||||||
|  | .B	char *\fInode\fP, char *\fIservice\fP) | ||||||
|  | .PP | ||||||
|  | .B void ares_getnameinfo(ares_channel \fIchannel\fP, const struct sockaddr *\fIsa\fP, | ||||||
|  | .B 	socklen_t \fIsalen\fP, int \fIflags\fP, ares_nameinfo_callback \fIcallback\fP, | ||||||
|  | .B 	void *\fIarg\fP) | ||||||
|  | .fi | ||||||
|  | .SH DESCRIPTION | ||||||
|  | The | ||||||
|  | .B ares_getnameinfo | ||||||
|  | function is defined for protocol-independent address translation. The function | ||||||
|  | is a combination of \fIares_gethostbyaddr(3)\fP and \fIgetservbyport(3)\fP. The function will | ||||||
|  | translate the address either by executing a host query on the name service channel | ||||||
|  | identified by | ||||||
|  | .IR channel  | ||||||
|  | or it will attempt to resolve it locally if possible. | ||||||
|  | The parameters | ||||||
|  | .I sa | ||||||
|  | and | ||||||
|  | .I len | ||||||
|  | give the address as a sockaddr structure, and | ||||||
|  | .I flags | ||||||
|  | gives the options that the function will use.  Valid flags are listed below: | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_NI_NOFQDN | ||||||
|  | Only the nodename portion of the FQDN is returned for local hosts. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_NI_NUMERICHOST | ||||||
|  | The numeric form of the hostname is returned rather than the name. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_NI_NAMEREQD | ||||||
|  | An error is returned if the hostname cannot be found in the DNS. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_NI_NUMERICSERV | ||||||
|  | The numeric form of the service is returned rather than the name. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_NI_TCP | ||||||
|  | The service name is to be looked up for the TCP protocol. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_NI_UDP | ||||||
|  | The service name is to be looked up for the UDP protocol. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_NI_SCTP | ||||||
|  | The service name is to be looked up for the SCTP protocol. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_NI_DCCP | ||||||
|  | The service name is to be looked up for the DCCP protocol. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_NI_NUMERICSCOPE | ||||||
|  | The numeric form of the scope ID is returned rather than the name. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_NI_LOOKUPHOST | ||||||
|  | A hostname lookup is being requested. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_NI_LOOKUPSERVICE | ||||||
|  | A service name lookup is being requested. | ||||||
|  | .PP | ||||||
|  | When the query | ||||||
|  | is complete or has  | ||||||
|  | failed, the ares library will invoke \fIcallback\fP.  Completion or failure of  | ||||||
|  | the query may happen immediately, or may happen during a later call to | ||||||
|  | \fIares_process(3)\fP, \fIares_destroy(3)\fP or \fIares_cancel(3)\fP. | ||||||
|  | .PP | ||||||
|  | The callback argument | ||||||
|  | .I arg | ||||||
|  | is copied from the | ||||||
|  | .B ares_getnameinfo | ||||||
|  | argument | ||||||
|  | .IR arg . | ||||||
|  | The callback argument | ||||||
|  | .I status | ||||||
|  | indicates whether the query succeeded and, if not, how it failed.  It | ||||||
|  | may have any of the following values: | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_SUCCESS | ||||||
|  | The host lookup completed successfully. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_ENOTIMP | ||||||
|  | The ares library does not know how to look up addresses of type | ||||||
|  | .IR family . | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_ENOTFOUND | ||||||
|  | The address | ||||||
|  | .I addr | ||||||
|  | was not found. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_ENOMEM | ||||||
|  | Memory was exhausted. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_EDESTRUCTION | ||||||
|  | The name service channel | ||||||
|  | .I channel | ||||||
|  | is being destroyed; the query will not be completed. | ||||||
|  | .TP 19 | ||||||
|  | .B ARES_EBADFLAGS | ||||||
|  | The | ||||||
|  | .I flags | ||||||
|  | parameter contains an illegal value. | ||||||
|  | .PP | ||||||
|  | On successful completion of the query, the callback argument | ||||||
|  | .I node | ||||||
|  | contains a string representing the hostname (assuming  | ||||||
|  | .B ARES_NI_LOOKUPHOST | ||||||
|  | was specified). Additionally,  | ||||||
|  | .I service | ||||||
|  | contains a string representing the service name (assuming | ||||||
|  | .B ARES_NI_LOOKUPSERVICE | ||||||
|  | was specified). | ||||||
|  | If the query did not complete successfully, or one of the values | ||||||
|  | was not requested,  | ||||||
|  | .I node | ||||||
|  | or | ||||||
|  | .I service | ||||||
|  | will be  | ||||||
|  | .BR NULL . | ||||||
|  | .SH SEE ALSO | ||||||
|  | .BR ares_process (3), | ||||||
|  | .BR ares_getaddrinfo (3) | ||||||
|  | .SH AUTHOR | ||||||
|  | Dominick Meglio | ||||||
|  | .br | ||||||
|  | Copyright 2005 by Dominick Meglio. | ||||||
							
								
								
									
										382
									
								
								ares/ares_getnameinfo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										382
									
								
								ares/ares_getnameinfo.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,382 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
|  | /* Copyright 2005 by Dominick Meglio | ||||||
|  |  * | ||||||
|  |  * Permission to use, copy, modify, and distribute this | ||||||
|  |  * software and its documentation for any purpose and without | ||||||
|  |  * fee is hereby granted, provided that the above copyright | ||||||
|  |  * notice appear in all copies and that both that copyright | ||||||
|  |  * notice and this permission notice appear in supporting | ||||||
|  |  * documentation, and that the name of M.I.T. not be used in | ||||||
|  |  * advertising or publicity pertaining to distribution of the | ||||||
|  |  * software without specific, written prior permission. | ||||||
|  |  * M.I.T. makes no representations about the suitability of | ||||||
|  |  * this software for any purpose.  It is provided "as is" | ||||||
|  |  * without express or implied warranty. | ||||||
|  |  */ | ||||||
|  | #include "setup.h" | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <ctype.h> | ||||||
|  |  | ||||||
|  | #if defined(WIN32) && !defined(WATT32) | ||||||
|  | #include "nameser.h" | ||||||
|  | #else | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #include <netdb.h> | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | #include <arpa/nameser.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef HAVE_NET_IF_H | ||||||
|  | #include <net/if.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef HAVE_UNISTD_H | ||||||
|  | #include <unistd.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
|  | #include "ares.h" | ||||||
|  | #include "ares_private.h" | ||||||
|  | #include "ares_ipv6.h" | ||||||
|  | #include "inet_ntop.h" | ||||||
|  |  | ||||||
|  | #ifdef WATT32 | ||||||
|  | #undef WIN32 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | struct nameinfo_query { | ||||||
|  |   ares_nameinfo_callback callback; | ||||||
|  |   void *arg; | ||||||
|  |   union { | ||||||
|  |     struct sockaddr_in addr4; | ||||||
|  |     struct sockaddr_in6 addr6; | ||||||
|  |   } addr; | ||||||
|  |   int family; | ||||||
|  |   int flags; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||||
|  | #define IPBUFSIZ 40+IF_NAMESIZE | ||||||
|  | #else | ||||||
|  | #define IPBUFSIZ 40 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | static void nameinfo_callback(void *arg, int status, struct hostent *host); | ||||||
|  | static char *lookup_service(unsigned short port, int flags, | ||||||
|  |                             char *buf, size_t buflen); | ||||||
|  | #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||||
|  | static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid, | ||||||
|  |                            char *buf, size_t buflen); | ||||||
|  | #endif | ||||||
|  | static char *ares_striendstr(const char *s1, const char *s2); | ||||||
|  |  | ||||||
|  | void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t salen, | ||||||
|  |                       int flags, ares_nameinfo_callback callback, void *arg) | ||||||
|  | { | ||||||
|  |   struct sockaddr_in *addr = NULL; | ||||||
|  |   struct sockaddr_in6 *addr6 = NULL; | ||||||
|  |   struct nameinfo_query *niquery; | ||||||
|  |  | ||||||
|  |   /* Verify the buffer size */ | ||||||
|  |   if (salen == sizeof(struct sockaddr_in)) | ||||||
|  |     addr = (struct sockaddr_in *)sa; | ||||||
|  |   else if (salen == sizeof(struct sockaddr_in6)) | ||||||
|  |     addr6 = (struct sockaddr_in6 *)sa; | ||||||
|  |   else | ||||||
|  |     { | ||||||
|  |       callback(arg, ARES_ENOTIMP, NULL, NULL); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   /* If neither, assume they want a host */ | ||||||
|  |   if (!(flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST)) | ||||||
|  |     flags |= ARES_NI_LOOKUPHOST; | ||||||
|  |  | ||||||
|  |   /* All they want is a service, no need for DNS */ | ||||||
|  |   if ((flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST)) | ||||||
|  |     { | ||||||
|  |       char buf[33], *service; | ||||||
|  |       unsigned int port = 0; | ||||||
|  |  | ||||||
|  |       if (salen == sizeof(struct sockaddr_in)) | ||||||
|  |         port = addr->sin_port; | ||||||
|  |       else | ||||||
|  |         port = addr6->sin6_port; | ||||||
|  |       service = lookup_service(port, flags, buf, sizeof(buf)); | ||||||
|  |       callback(arg, ARES_SUCCESS, NULL, service); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   /* They want a host lookup */ | ||||||
|  |   if ((flags & ARES_NI_LOOKUPHOST)) | ||||||
|  |     { | ||||||
|  |      /* A numeric host can be handled without DNS */ | ||||||
|  |      if ((flags & ARES_NI_NUMERICHOST)) | ||||||
|  |       { | ||||||
|  |         unsigned int port = 0; | ||||||
|  |         char ipbuf[IPBUFSIZ]; | ||||||
|  |         char srvbuf[33]; | ||||||
|  |         char *service = NULL; | ||||||
|  |         ipbuf[0] = 0; | ||||||
|  |  | ||||||
|  |         /* Specifying not to lookup a host, but then saying a host | ||||||
|  |          * is required has to be illegal. | ||||||
|  |          */ | ||||||
|  |         if (flags & ARES_NI_NAMEREQD) | ||||||
|  |           { | ||||||
|  |             callback(arg, ARES_EBADFLAGS, NULL, NULL); | ||||||
|  |             return; | ||||||
|  |           } | ||||||
|  |         if (salen == sizeof(struct sockaddr_in6)) | ||||||
|  |           { | ||||||
|  |             ares_inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, IPBUFSIZ); | ||||||
|  |             port = addr6->sin6_port; | ||||||
|  |             /* If the system supports scope IDs, use it */ | ||||||
|  | #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||||
|  |             append_scopeid(addr6, flags, ipbuf, sizeof(ipbuf)); | ||||||
|  | #endif | ||||||
|  |           } | ||||||
|  |         else | ||||||
|  |           { | ||||||
|  |             ares_inet_ntop(AF_INET, &addr->sin_addr, ipbuf, IPBUFSIZ); | ||||||
|  |             port = addr->sin_port; | ||||||
|  |           } | ||||||
|  |         /* They also want a service */ | ||||||
|  |         if (flags & ARES_NI_LOOKUPSERVICE) | ||||||
|  |           service = lookup_service(port, flags, srvbuf, sizeof(srvbuf)); | ||||||
|  |         callback(arg, ARES_SUCCESS, ipbuf, service); | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |     /* This is where a DNS lookup becomes necessary */ | ||||||
|  |     else | ||||||
|  |       { | ||||||
|  |         niquery = malloc(sizeof(struct nameinfo_query)); | ||||||
|  |         if (!niquery) | ||||||
|  |           { | ||||||
|  |             callback(arg, ARES_ENOMEM, NULL, NULL); | ||||||
|  |             return; | ||||||
|  |           } | ||||||
|  |         niquery->callback = callback; | ||||||
|  |         niquery->arg = arg; | ||||||
|  |         niquery->flags = flags; | ||||||
|  |         if (sa->sa_family == AF_INET) | ||||||
|  |           { | ||||||
|  |             niquery->family = AF_INET; | ||||||
|  |             memcpy(&niquery->addr.addr4, addr, sizeof(addr)); | ||||||
|  |             ares_gethostbyaddr(channel, &addr->sin_addr, sizeof(struct in_addr), AF_INET, | ||||||
|  |                                nameinfo_callback, niquery); | ||||||
|  |           } | ||||||
|  |         else | ||||||
|  |           { | ||||||
|  |             niquery->family = AF_INET6; | ||||||
|  |             memcpy(&niquery->addr.addr6, addr6, sizeof(addr6)); | ||||||
|  |             ares_gethostbyaddr(channel, &addr6->sin6_addr, sizeof(struct in6_addr), AF_INET6, | ||||||
|  |                                nameinfo_callback, niquery); | ||||||
|  |           } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void nameinfo_callback(void *arg, int status, struct hostent *host) | ||||||
|  | { | ||||||
|  |   struct nameinfo_query *niquery = (struct nameinfo_query *) arg; | ||||||
|  |   char srvbuf[33]; | ||||||
|  |   char *service = NULL; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   if (status == ARES_SUCCESS) | ||||||
|  |     { | ||||||
|  |       /* They want a service too */ | ||||||
|  |       if (niquery->flags & ARES_NI_LOOKUPSERVICE) | ||||||
|  |         { | ||||||
|  |           if (niquery->family == AF_INET) | ||||||
|  |             service = lookup_service(niquery->addr.addr4.sin_port, | ||||||
|  |                                      niquery->flags, srvbuf, sizeof(srvbuf)); | ||||||
|  |           else | ||||||
|  |             service = lookup_service(niquery->addr.addr6.sin6_port, | ||||||
|  |                                      niquery->flags, srvbuf, sizeof(srvbuf)); | ||||||
|  |         } | ||||||
|  |       /* NOFQDN means we have to strip off the domain name portion. | ||||||
|  |          We do this by determining our own domain name, then searching the string | ||||||
|  |          for this domain name and removing it. | ||||||
|  |        */ | ||||||
|  |       if (niquery->flags & ARES_NI_NOFQDN) | ||||||
|  |         { | ||||||
|  |            char buf[255]; | ||||||
|  |            char *domain; | ||||||
|  |            gethostname(buf, 255); | ||||||
|  |            if ((domain = strchr(buf, '.'))) | ||||||
|  |              { | ||||||
|  |                char *end = ares_striendstr(host->h_name, domain); | ||||||
|  |                if (end) | ||||||
|  |                  *end = 0; | ||||||
|  |              } | ||||||
|  |         } | ||||||
|  |       niquery->callback(niquery->arg, ARES_SUCCESS, host->h_name, service); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |   /* We couldn't find the host, but it's OK, we can use the IP */ | ||||||
|  |   else if (status == ARES_ENOTFOUND && !(niquery->flags & ARES_NI_NAMEREQD)) | ||||||
|  |     { | ||||||
|  |       char ipbuf[IPBUFSIZ]; | ||||||
|  |       if (niquery->family == AF_INET) | ||||||
|  |         ares_inet_ntop(AF_INET, &niquery->addr.addr4.sin_addr, ipbuf, IPBUFSIZ); | ||||||
|  |       else | ||||||
|  |         { | ||||||
|  |           ares_inet_ntop(AF_INET6, &niquery->addr.addr6.sin6_addr, ipbuf, IPBUFSIZ); | ||||||
|  | #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||||
|  |           append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf, sizeof(ipbuf)); | ||||||
|  | #endif | ||||||
|  |         } | ||||||
|  |       /* They want a service too */ | ||||||
|  |       if (niquery->flags & ARES_NI_LOOKUPSERVICE) | ||||||
|  |         { | ||||||
|  |           if (niquery->family == AF_INET) | ||||||
|  |             service = lookup_service(niquery->addr.addr4.sin_port, | ||||||
|  |                                      niquery->flags, srvbuf, sizeof(srvbuf)); | ||||||
|  |           else | ||||||
|  |             service = lookup_service(niquery->addr.addr6.sin6_port, | ||||||
|  |                                      niquery->flags, srvbuf, sizeof(srvbuf)); | ||||||
|  |         } | ||||||
|  |       niquery->callback(niquery->arg, ARES_SUCCESS, ipbuf, service); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |   niquery->callback(niquery->arg, status, NULL, NULL); | ||||||
|  |   free(niquery); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static char *lookup_service(unsigned short port, int flags, | ||||||
|  |                             char *buf, size_t buflen) | ||||||
|  | { | ||||||
|  |   const char *proto; | ||||||
|  |   struct servent *sep; | ||||||
|  | #ifdef HAVE_GETSERVBYPORT_R | ||||||
|  |   struct servent se; | ||||||
|  | #endif | ||||||
|  |   char tmpbuf[4096]; | ||||||
|  |  | ||||||
|  |   if (port) | ||||||
|  |     {  | ||||||
|  |       if (flags & ARES_NI_NUMERICSERV) | ||||||
|  |         sep = NULL; | ||||||
|  |       else | ||||||
|  |         {  | ||||||
|  |           if (flags & ARES_NI_UDP) | ||||||
|  |             proto = "udp"; | ||||||
|  |           else if (flags & ARES_NI_SCTP) | ||||||
|  |             proto = "sctp"; | ||||||
|  |           else if (flags & ARES_NI_DCCP) | ||||||
|  |             proto = "dccp"; | ||||||
|  |           else | ||||||
|  |             proto = "tcp"; | ||||||
|  | #ifdef HAVE_GETSERVBYPORT_R | ||||||
|  |           sep = &se; | ||||||
|  |           memset(tmpbuf, 0, sizeof(tmpbuf)); | ||||||
|  | #if GETSERVBYPORT_R_ARGS == 6 | ||||||
|  |           if (getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf), &sep) != 0) | ||||||
|  |             sep = NULL; | ||||||
|  | #elif GETSERVBYPORT_R_ARGS == 5 | ||||||
|  |           sep = getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf)); | ||||||
|  | #elif GETSERVBYPORT_R_ARGS == 4 | ||||||
|  |           if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0) | ||||||
|  |             sep = NULL; | ||||||
|  | #else      | ||||||
|  |           /* Lets just hope the OS uses TLS! */ | ||||||
|  |           sep = getservbyport(port, proto); | ||||||
|  | #endif     | ||||||
|  | #else      | ||||||
|  |           /* Lets just hope the OS uses TLS! */ | ||||||
|  |           sep = getservbyport(port, proto); | ||||||
|  | #endif     | ||||||
|  |         }  | ||||||
|  |       if (sep && sep->s_name) | ||||||
|  |         /* get service name */ | ||||||
|  |         strcpy(tmpbuf, sep->s_name); | ||||||
|  |       else | ||||||
|  |         /* get port as a string */ | ||||||
|  |         sprintf(tmpbuf, "%u", ntohs(port)); | ||||||
|  |       if (strlen(tmpbuf) < buflen) | ||||||
|  |         /* return it if buffer big enough */ | ||||||
|  |         strcpy(buf, tmpbuf); | ||||||
|  |       else | ||||||
|  |         /* avoid reusing previous one */ | ||||||
|  |         buf[0] = '\0'; | ||||||
|  |       return buf; | ||||||
|  |     } | ||||||
|  |   buf[0] = '\0'; | ||||||
|  |   return NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||||
|  | static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, | ||||||
|  |                            char *buf, size_t buflen) | ||||||
|  | { | ||||||
|  |   char fmt_u[] = "%u"; | ||||||
|  |   char fmt_lu[] = "%lu"; | ||||||
|  |   char tmpbuf[IF_NAMESIZE + 2]; | ||||||
|  |   size_t bufl; | ||||||
|  |   char *fmt = (sizeof(addr6->sin6_scope_id) > sizeof(unsigned int))?fmt_lu:fmt_u; | ||||||
|  |  | ||||||
|  |   tmpbuf[0] = '%'; | ||||||
|  |  | ||||||
|  | #ifdef HAVE_IF_INDEXTONAME | ||||||
|  |   if ((flags & ARES_NI_NUMERICSCOPE) || | ||||||
|  |       (!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr) | ||||||
|  |        && !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr))) | ||||||
|  |     { | ||||||
|  |        sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id); | ||||||
|  |     } | ||||||
|  |   else | ||||||
|  |     { | ||||||
|  |       if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL) | ||||||
|  |         sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id); | ||||||
|  |     } | ||||||
|  | #else | ||||||
|  |   sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id); | ||||||
|  |   (void) flags; | ||||||
|  | #endif | ||||||
|  |   tmpbuf[IF_NAMESIZE + 1] = '\0'; | ||||||
|  |   bufl = strlen(buf); | ||||||
|  |  | ||||||
|  |   if(bufl + strlen(tmpbuf) < buflen) | ||||||
|  |     /* only append the scopeid string if it fits in the target buffer */ | ||||||
|  |     strcpy(&buf[bufl], tmpbuf); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* Determines if s1 ends with the string in s2 (case-insensitive) */ | ||||||
|  | static char *ares_striendstr(const char *s1, const char *s2) | ||||||
|  | { | ||||||
|  |   const char *c1, *c2, *c1_begin; | ||||||
|  |   size_t s1_len = strlen(s1), s2_len = strlen(s2); | ||||||
|  |  | ||||||
|  |   /* If the substr is longer than the full str, it can't match */ | ||||||
|  |   if (s2_len > s1_len) | ||||||
|  |     return NULL; | ||||||
|  |  | ||||||
|  |   /* Jump to the end of s1 minus the length of s2 */ | ||||||
|  |   c1_begin = s1+s1_len-s2_len; | ||||||
|  |   c1 = (const char *)c1_begin; | ||||||
|  |   c2 = s2; | ||||||
|  |   while (c2 < s2+s2_len) | ||||||
|  |     { | ||||||
|  |       if (tolower(*c1) != tolower(*c2)) | ||||||
|  |         return NULL; | ||||||
|  |       else | ||||||
|  |         { | ||||||
|  |           c1++; | ||||||
|  |           c2++; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |   if (c2 == c1 && c2 == NULL) | ||||||
|  |     return (char *)c1_begin; | ||||||
|  |   return NULL; | ||||||
|  | } | ||||||
							
								
								
									
										58
									
								
								ares/ares_getsock.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								ares/ares_getsock.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | |||||||
|  | .\" $Id$ | ||||||
|  | .\" | ||||||
|  | .\" Copyright 1998 by Daniel Stenberg | ||||||
|  | .\" | ||||||
|  | .\" Permission to use, copy, modify, and distribute this | ||||||
|  | .\" software and its documentation for any purpose and without | ||||||
|  | .\" fee is hereby granted, provided that the above copyright | ||||||
|  | .\" notice appear in all copies and that both that copyright | ||||||
|  | .\" notice and this permission notice appear in supporting | ||||||
|  | .\" documentation, and that the name of M.I.T. not be used in | ||||||
|  | .\" advertising or publicity pertaining to distribution of the | ||||||
|  | .\" software without specific, written prior permission. | ||||||
|  | .\" M.I.T. makes no representations about the suitability of | ||||||
|  | .\" this software for any purpose.  It is provided "as is" | ||||||
|  | .\" without express or implied warranty. | ||||||
|  | .\" | ||||||
|  | .TH ARES_GETSOCK 3 "22 December 2005" | ||||||
|  | .SH NAME | ||||||
|  | ares_getsock \- get file descriptors to wait on | ||||||
|  | .SH SYNOPSIS | ||||||
|  | .nf | ||||||
|  | .B #include <ares.h> | ||||||
|  | .PP | ||||||
|  | .B int ares_getsock(ares_channel \fIchannel\fP, int *\fIsocks\fP,  | ||||||
|  | .B int \fInumsocks\fP); | ||||||
|  | .fi | ||||||
|  | .SH DESCRIPTION | ||||||
|  | The | ||||||
|  | .B ares_getsock | ||||||
|  | function retrieves the set of file descriptors which the calling | ||||||
|  | application should wait on for reading and/or writing for the | ||||||
|  | processing of name service queries pending on the name service channel | ||||||
|  | identified by | ||||||
|  | .IR channel . | ||||||
|  | File descriptors will be set in the integer array pointed to by | ||||||
|  | \fIsocks\fP. | ||||||
|  | \fInumsocks\fP is the size of the given array in number of ints. | ||||||
|  |  | ||||||
|  | This function can only return information about up to 16 sockets. If more are | ||||||
|  | in use (however unlikely that is), they are simply not reported back. | ||||||
|  | .SH RETURN VALUES | ||||||
|  | \fBares_getsock\fP returns a bitmask for what actions to wait for on the | ||||||
|  | different sockets. The ares.h header file provides these convenience macros to | ||||||
|  | extract the information appropriately: | ||||||
|  |  | ||||||
|  | .nf | ||||||
|  | #define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about | ||||||
|  |                                   this many sockets */ | ||||||
|  | #define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num))) | ||||||
|  | #define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \ | ||||||
|  |                                          ARES_GETSOCK_MAXNUM))) | ||||||
|  | .fi | ||||||
|  | .SH NOTES | ||||||
|  | This function was added in c-ares 1.3.1 | ||||||
|  | .SH SEE ALSO | ||||||
|  | .BR ares_timeout (3), | ||||||
|  | .BR ares_fds (3), | ||||||
|  | .BR ares_process (3) | ||||||
							
								
								
									
										71
									
								
								ares/ares_getsock.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								ares/ares_getsock.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
|  | /* Copyright 2005 by Daniel Stenberg. | ||||||
|  |  * | ||||||
|  |  * Permission to use, copy, modify, and distribute this software and its | ||||||
|  |  * documentation for any purpose and without fee is hereby granted, provided | ||||||
|  |  * that the above copyright notice appear in all copies and that both that | ||||||
|  |  * copyright notice and this permission notice appear in supporting | ||||||
|  |  * documentation, and that the name of M.I.T. not be used in advertising or | ||||||
|  |  * publicity pertaining to distribution of the software without specific, | ||||||
|  |  * written prior permission.  M.I.T. makes no representations about the | ||||||
|  |  * suitability of this software for any purpose.  It is provided "as is" | ||||||
|  |  * without express or implied warranty. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "setup.h" | ||||||
|  | #include <sys/types.h> | ||||||
|  |  | ||||||
|  | #ifdef HAVE_SYS_TIME_H | ||||||
|  | #include <sys/time.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include "ares.h" | ||||||
|  | #include "ares_private.h" | ||||||
|  |  | ||||||
|  | int ares_getsock(ares_channel channel, | ||||||
|  |                  int *s, | ||||||
|  |                  int numsocks) /* size of the 'socks' array */ | ||||||
|  | { | ||||||
|  |   struct server_state *server; | ||||||
|  |   ares_socket_t nfds; | ||||||
|  |   int i; | ||||||
|  |   int sockindex=0; | ||||||
|  |   int bitmap = 0; | ||||||
|  |   unsigned int setbits = 0xffffffff; | ||||||
|  |  | ||||||
|  |   ares_socket_t *socks = (ares_socket_t *)s; | ||||||
|  |  | ||||||
|  |   /* No queries, no file descriptors. */ | ||||||
|  |   if (!channel->queries) | ||||||
|  |     return 0; | ||||||
|  |  | ||||||
|  |   nfds = 0; | ||||||
|  |   for (i = 0; i < channel->nservers; i++) | ||||||
|  |     { | ||||||
|  |       server = &channel->servers[i]; | ||||||
|  |       if (server->udp_socket != ARES_SOCKET_BAD) | ||||||
|  |         { | ||||||
|  |           if(sockindex >= numsocks) | ||||||
|  |             break; | ||||||
|  |           socks[sockindex] = server->udp_socket; | ||||||
|  |           bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); | ||||||
|  |           sockindex++; | ||||||
|  |         } | ||||||
|  |       if (server->tcp_socket != ARES_SOCKET_BAD) | ||||||
|  |        { | ||||||
|  |          if(sockindex >= numsocks) | ||||||
|  |            break; | ||||||
|  |          socks[sockindex] = server->tcp_socket; | ||||||
|  |          bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); | ||||||
|  |          sockindex++; | ||||||
|  |  | ||||||
|  |          if (server->qhead) { | ||||||
|  |            /* then the tcp socket is also writable! */ | ||||||
|  |            bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex-1); | ||||||
|  |          } | ||||||
|  |  | ||||||
|  |        } | ||||||
|  |     } | ||||||
|  |   return (int)nfds; | ||||||
|  | } | ||||||
							
								
								
									
										135
									
								
								ares/ares_init.c
									
									
									
									
									
								
							
							
						
						
									
										135
									
								
								ares/ares_init.c
									
									
									
									
									
								
							| @@ -27,10 +27,17 @@ | |||||||
| #include <sys/time.h> | #include <sys/time.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <arpa/inet.h> | #include <arpa/inet.h> | ||||||
| #include <netdb.h> | #include <netdb.h> | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
| #ifdef HAVE_UNISTD_H | #ifdef HAVE_UNISTD_H | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #endif | #endif | ||||||
| @@ -44,6 +51,7 @@ | |||||||
| #include <errno.h> | #include <errno.h> | ||||||
| #include "ares.h" | #include "ares.h" | ||||||
| #include "ares_private.h" | #include "ares_private.h" | ||||||
|  | #include "inet_net_pton.h" | ||||||
|  |  | ||||||
| #ifdef WATT32 | #ifdef WATT32 | ||||||
| #undef WIN32  /* Redefined in MingW/MSVC headers */ | #undef WIN32  /* Redefined in MingW/MSVC headers */ | ||||||
| @@ -54,19 +62,23 @@ static int init_by_options(ares_channel channel, struct ares_options *options, | |||||||
| static int init_by_environment(ares_channel channel); | static int init_by_environment(ares_channel channel); | ||||||
| static int init_by_resolv_conf(ares_channel channel); | static int init_by_resolv_conf(ares_channel channel); | ||||||
| static int init_by_defaults(ares_channel channel); | static int init_by_defaults(ares_channel channel); | ||||||
|  |  | ||||||
|  | static int config_nameserver(struct server_state **servers, int *nservers, | ||||||
|  |                              char *str); | ||||||
|  | static int set_search(ares_channel channel, const char *str); | ||||||
|  | static int set_options(ares_channel channel, const char *str); | ||||||
|  | static const char *try_option(const char *p, const char *q, const char *opt); | ||||||
|  | #ifndef WIN32 | ||||||
|  | static int sortlist_alloc(struct apattern **sortlist, int *nsort, struct apattern *pat); | ||||||
|  | static int ip_addr(const char *s, int len, struct in_addr *addr); | ||||||
|  | static void natural_mask(struct apattern *pat); | ||||||
| static int config_domain(ares_channel channel, char *str); | static int config_domain(ares_channel channel, char *str); | ||||||
| static int config_lookup(ares_channel channel, const char *str, | static int config_lookup(ares_channel channel, const char *str, | ||||||
|                          const char *bindch, const char *filech); |                          const char *bindch, const char *filech); | ||||||
| static int config_nameserver(struct server_state **servers, int *nservers, |  | ||||||
|                              char *str); |  | ||||||
| static int config_sortlist(struct apattern **sortlist, int *nsort, | static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||||
|                            const char *str); |                            const char *str); | ||||||
| static int set_search(ares_channel channel, const char *str); |  | ||||||
| static int set_options(ares_channel channel, const char *str); |  | ||||||
| static char *try_config(char *s, const char *opt); | static char *try_config(char *s, const char *opt); | ||||||
| static const char *try_option(const char *p, const char *q, const char *opt); | #endif | ||||||
| static int ip_addr(const char *s, int len, struct in_addr *addr); |  | ||||||
| static void natural_mask(struct apattern *pat); |  | ||||||
|  |  | ||||||
| int ares_init(ares_channel *channelptr) | int ares_init(ares_channel *channelptr) | ||||||
| { | { | ||||||
| @@ -264,7 +276,8 @@ static int get_res_nt(HKEY hKey, const char *subkey, char **obuf) | |||||||
|   if (!*obuf) |   if (!*obuf) | ||||||
|     return 0; |     return 0; | ||||||
|  |  | ||||||
|   if (RegQueryValueEx(hKey, subkey, 0, NULL, *obuf, &size) != ERROR_SUCCESS) |   if (RegQueryValueEx(hKey, subkey, 0, NULL, | ||||||
|  |                       (LPBYTE)*obuf, &size) != ERROR_SUCCESS) | ||||||
|   { |   { | ||||||
|     free(*obuf); |     free(*obuf); | ||||||
|     return 0; |     return 0; | ||||||
| @@ -314,6 +327,7 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size) | |||||||
|   size_t         ip_size = sizeof("255.255.255.255,")-1; |   size_t         ip_size = sizeof("255.255.255.255,")-1; | ||||||
|   size_t         left = ret_size; |   size_t         left = ret_size; | ||||||
|   char          *ret = ret_buf; |   char          *ret = ret_buf; | ||||||
|  |   HRESULT        res; | ||||||
|  |  | ||||||
|   if (!fi) |   if (!fi) | ||||||
|      return (0); |      return (0); | ||||||
| @@ -326,7 +340,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size) | |||||||
|   if (!GetNetworkParams) |   if (!GetNetworkParams) | ||||||
|      goto quit; |      goto quit; | ||||||
|  |  | ||||||
|   if ((*GetNetworkParams) (fi, &size) != ERROR_BUFFER_OVERFLOW) |   res = (*GetNetworkParams) (fi, &size); | ||||||
|  |   if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS)) | ||||||
|      goto quit; |      goto quit; | ||||||
|  |  | ||||||
|   fi = alloca (size); |   fi = alloca (size); | ||||||
| @@ -489,7 +504,7 @@ DhcpNameServer | |||||||
|   if (status == ARES_SUCCESS) |   if (status == ARES_SUCCESS) | ||||||
|     status = ARES_EOF; |     status = ARES_EOF; | ||||||
|  |  | ||||||
| #elif defined(riscos) | #elif defined(__riscos__) | ||||||
|  |  | ||||||
|   /* Under RISC OS, name servers are listed in the |   /* Under RISC OS, name servers are listed in the | ||||||
|      system variable Inet$Resolvers, space separated. */ |      system variable Inet$Resolvers, space separated. */ | ||||||
| @@ -709,6 +724,7 @@ static int init_by_defaults(ares_channel channel) | |||||||
|   return ARES_SUCCESS; |   return ARES_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #ifndef WIN32 | ||||||
| static int config_domain(ares_channel channel, char *str) | static int config_domain(ares_channel channel, char *str) | ||||||
| { | { | ||||||
|   char *q; |   char *q; | ||||||
| @@ -749,6 +765,8 @@ static int config_lookup(ares_channel channel, const char *str, | |||||||
|   return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM; |   return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| static int config_nameserver(struct server_state **servers, int *nservers, | static int config_nameserver(struct server_state **servers, int *nservers, | ||||||
|                              char *str) |                              char *str) | ||||||
| { | { | ||||||
| @@ -810,39 +828,74 @@ static int config_nameserver(struct server_state **servers, int *nservers, | |||||||
|   return ARES_SUCCESS; |   return ARES_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #ifndef WIN32 | ||||||
| static int config_sortlist(struct apattern **sortlist, int *nsort, | static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||||
|                            const char *str) |                            const char *str) | ||||||
| { | { | ||||||
|   struct apattern pat, *newsort; |   struct apattern pat; | ||||||
|   const char *q; |   const char *q; | ||||||
|  |  | ||||||
|   /* Add sortlist entries. */ |   /* Add sortlist entries. */ | ||||||
|   while (*str && *str != ';') |   while (*str && *str != ';') | ||||||
|     { |     { | ||||||
|  |       int bits; | ||||||
|  |       char ipbuf[16], ipbufpfx[32]; | ||||||
|  |       /* Find just the IP */ | ||||||
|       q = str; |       q = str; | ||||||
|       while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q)) |       while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q)) | ||||||
|         q++; |         q++; | ||||||
|       if (ip_addr(str, (int)(q - str), &pat.addr) == 0) |       memcpy(ipbuf, str, (int)(q-str)); | ||||||
|  |       ipbuf[(int)(q-str)] = 0; | ||||||
|  |       /* Find the prefix */ | ||||||
|  |       if (*q == '/') | ||||||
|         { |         { | ||||||
|           /* We have a pattern address; now determine the mask. */ |           const char *str2 = q+1; | ||||||
|           if (*q == '/') |           while (*q && *q != ';' && !isspace((unsigned char)*q)) | ||||||
|  |             q++; | ||||||
|  |           memcpy(ipbufpfx, str, (int)(q-str)); | ||||||
|  |           ipbufpfx[(int)(q-str)] = 0; | ||||||
|  |           str = str2; | ||||||
|  |         } | ||||||
|  |       else | ||||||
|  |         ipbufpfx[0] = 0; | ||||||
|  |       /* Lets see if it is CIDR */ | ||||||
|  |       /* First we'll try IPv6 */ | ||||||
|  |       if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf, | ||||||
|  |                                      &pat.addr.addr6, | ||||||
|  |                                      sizeof(pat.addr.addr6))) > 0) | ||||||
|  |         { | ||||||
|  |           pat.type = PATTERN_CIDR; | ||||||
|  |           pat.mask.bits = bits; | ||||||
|  |           pat.family = AF_INET6; | ||||||
|  |           if (!sortlist_alloc(sortlist, nsort, &pat)) | ||||||
|  |             return ARES_ENOMEM; | ||||||
|  |         } | ||||||
|  |       if (ipbufpfx && | ||||||
|  |           (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addr.addr4, | ||||||
|  |                                      sizeof(pat.addr.addr4))) > 0) | ||||||
|  |         { | ||||||
|  |           pat.type = PATTERN_CIDR; | ||||||
|  |           pat.mask.bits = bits; | ||||||
|  |           pat.family = AF_INET; | ||||||
|  |           if (!sortlist_alloc(sortlist, nsort, &pat)) | ||||||
|  |             return ARES_ENOMEM; | ||||||
|  |         } | ||||||
|  |       /* See if it is just a regular IP */ | ||||||
|  |       else if (ip_addr(ipbuf, (int)(q-str), &pat.addr.addr4) == 0) | ||||||
|  |         { | ||||||
|  |           if (ipbufpfx) | ||||||
|             { |             { | ||||||
|               str = q + 1; |               memcpy(ipbuf, str, (int)(q-str)); | ||||||
|               while (*q && *q != ';' && !isspace((unsigned char)*q)) |               ipbuf[(int)(q-str)] = 0; | ||||||
|                 q++; |               if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr.addr4) != 0) | ||||||
|               if (ip_addr(str, (int)(q - str), &pat.mask) != 0) |  | ||||||
|                 natural_mask(&pat); |                 natural_mask(&pat); | ||||||
|             } |             } | ||||||
|           else |           else | ||||||
|             natural_mask(&pat); |             natural_mask(&pat); | ||||||
|  |           pat.family = AF_INET; | ||||||
|           /* Add this pattern to our list. */ |           pat.type = PATTERN_MASK; | ||||||
|           newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); |           if (!sortlist_alloc(sortlist, nsort, &pat)) | ||||||
|           if (!newsort) |  | ||||||
|             return ARES_ENOMEM; |             return ARES_ENOMEM; | ||||||
|           newsort[*nsort] = pat; |  | ||||||
|           *sortlist = newsort; |  | ||||||
|           (*nsort)++; |  | ||||||
|         } |         } | ||||||
|       else |       else | ||||||
|         { |         { | ||||||
| @@ -856,6 +909,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | |||||||
|  |  | ||||||
|   return ARES_SUCCESS; |   return ARES_SUCCESS; | ||||||
| } | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
| static int set_search(ares_channel channel, const char *str) | static int set_search(ares_channel channel, const char *str) | ||||||
| { | { | ||||||
| @@ -937,6 +991,7 @@ static int set_options(ares_channel channel, const char *str) | |||||||
|   return ARES_SUCCESS; |   return ARES_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #ifndef WIN32 | ||||||
| static char *try_config(char *s, const char *opt) | static char *try_config(char *s, const char *opt) | ||||||
| { | { | ||||||
|   size_t len; |   size_t len; | ||||||
| @@ -950,21 +1005,34 @@ static char *try_config(char *s, const char *opt) | |||||||
|   return s; |   return s; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| static const char *try_option(const char *p, const char *q, const char *opt) | static const char *try_option(const char *p, const char *q, const char *opt) | ||||||
| { | { | ||||||
|   size_t len = strlen(opt); |   size_t len = strlen(opt); | ||||||
|   return ((size_t)(q - p) > len && !strncmp(p, opt, len)) ? &p[len] : NULL; |   return ((size_t)(q - p) > len && !strncmp(p, opt, len)) ? &p[len] : NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int ip_addr(const char *s, int len, struct in_addr *addr) | #ifndef WIN32 | ||||||
|  | static int sortlist_alloc(struct apattern **sortlist, int *nsort, | ||||||
|  |                           struct apattern *pat) | ||||||
|  | { | ||||||
|  |   struct apattern *newsort; | ||||||
|  |   newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); | ||||||
|  |   if (!newsort) | ||||||
|  |     return 0; | ||||||
|  |   newsort[*nsort] = *pat; | ||||||
|  |   *sortlist = newsort; | ||||||
|  |   (*nsort)++; | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int ip_addr(const char *ipbuf, int len, struct in_addr *addr) | ||||||
| { | { | ||||||
|   char ipbuf[16]; |  | ||||||
|  |  | ||||||
|   /* Four octets and three periods yields at most 15 characters. */ |   /* Four octets and three periods yields at most 15 characters. */ | ||||||
|   if (len > 15) |   if (len > 15) | ||||||
|     return -1; |     return -1; | ||||||
|   memcpy(ipbuf, s, len); |  | ||||||
|   ipbuf[len] = 0; |  | ||||||
|  |  | ||||||
|   addr->s_addr = inet_addr(ipbuf); |   addr->s_addr = inet_addr(ipbuf); | ||||||
|   if (addr->s_addr == INADDR_NONE && strcmp(ipbuf, "255.255.255.255") != 0) |   if (addr->s_addr == INADDR_NONE && strcmp(ipbuf, "255.255.255.255") != 0) | ||||||
| @@ -979,15 +1047,16 @@ static void natural_mask(struct apattern *pat) | |||||||
|   /* Store a host-byte-order copy of pat in a struct in_addr.  Icky, |   /* Store a host-byte-order copy of pat in a struct in_addr.  Icky, | ||||||
|    * but portable. |    * but portable. | ||||||
|    */ |    */ | ||||||
|   addr.s_addr = ntohl(pat->addr.s_addr); |   addr.s_addr = ntohl(pat->addr.addr4.s_addr); | ||||||
|  |  | ||||||
|   /* This is out of date in the CIDR world, but some people might |   /* This is out of date in the CIDR world, but some people might | ||||||
|    * still rely on it. |    * still rely on it. | ||||||
|    */ |    */ | ||||||
|   if (IN_CLASSA(addr.s_addr)) |   if (IN_CLASSA(addr.s_addr)) | ||||||
|     pat->mask.s_addr = htonl(IN_CLASSA_NET); |     pat->mask.addr.addr4.s_addr = htonl(IN_CLASSA_NET); | ||||||
|   else if (IN_CLASSB(addr.s_addr)) |   else if (IN_CLASSB(addr.s_addr)) | ||||||
|     pat->mask.s_addr = htonl(IN_CLASSB_NET); |     pat->mask.addr.addr4.s_addr = htonl(IN_CLASSB_NET); | ||||||
|   else |   else | ||||||
|     pat->mask.s_addr = htonl(IN_CLASSC_NET); |     pat->mask.addr.addr4.s_addr = htonl(IN_CLASSC_NET); | ||||||
| } | } | ||||||
|  | #endif | ||||||
|   | |||||||
							
								
								
									
										81
									
								
								ares/ares_ipv6.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								ares/ares_ipv6.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Permission to use, copy, modify, and distribute this | ||||||
|  |  * software and its documentation for any purpose and without | ||||||
|  |  * fee is hereby granted, provided that the above copyright | ||||||
|  |  * notice appear in all copies and that both that copyright | ||||||
|  |  * notice and this permission notice appear in supporting | ||||||
|  |  * documentation, and that the name of M.I.T. not be used in | ||||||
|  |  * advertising or publicity pertaining to distribution of the | ||||||
|  |  * software without specific, written prior permission. | ||||||
|  |  * M.I.T. makes no representations about the suitability of | ||||||
|  |  * this software for any purpose.  It is provided "as is" | ||||||
|  |  * without express or implied warranty. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef ARES_IPV6_H | ||||||
|  | #define ARES_IPV6_H | ||||||
|  |  | ||||||
|  | #ifndef HAVE_PF_INET6 | ||||||
|  | #define PF_INET6 AF_INET6 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef HAVE_STRUCT_IN6_ADDR | ||||||
|  | struct in6_addr | ||||||
|  | { | ||||||
|  |   unsigned char s6_addr[16]; | ||||||
|  | }; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef HAVE_STRUCT_SOCKADDR_IN6 | ||||||
|  | struct sockaddr_in6 | ||||||
|  | { | ||||||
|  |   unsigned short  sin6_family; | ||||||
|  |   unsigned short  sin6_port; | ||||||
|  |   unsigned long   sin6_flowinfo; | ||||||
|  |   struct in6_addr sin6_addr; | ||||||
|  |   unsigned int    sin6_scope_id; | ||||||
|  | }; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef HAVE_STRUCT_ADDRINFO | ||||||
|  | struct addrinfo | ||||||
|  | { | ||||||
|  |   int ai_flags; | ||||||
|  |   int ai_family; | ||||||
|  |   int ai_socktype; | ||||||
|  |   int ai_protocol; | ||||||
|  |   size_t ai_addrlen; | ||||||
|  |   char *ai_cannonname; | ||||||
|  |   struct sockaddr *ai_addr; | ||||||
|  |   struct addrinfo *ai_next; | ||||||
|  | }; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef NS_IN6ADDRSZ | ||||||
|  | #if SIZEOF_STRUCT_IN6_ADDR == 0 | ||||||
|  | /* We cannot have it set to zero, so we pick a fixed value here */ | ||||||
|  | #define NS_IN6ADDRSZ 16 | ||||||
|  | #else | ||||||
|  | #define NS_IN6ADDRSZ SIZEOF_STRUCT_IN6_ADDR | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef NS_INADDRSZ | ||||||
|  | #define NS_INADDRSZ SIZEOF_STRUCT_IN_ADDR | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef NS_INT16SZ | ||||||
|  | #define NS_INT16SZ 2 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef IF_NAMESIZE | ||||||
|  | #ifdef IFNAMSIZ | ||||||
|  | #define IF_NAMESIZE IFNAMSIZ | ||||||
|  | #else | ||||||
|  | #define IF_NAMESIZE 256 | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif /* ARES_IPV6_H */ | ||||||
| @@ -21,6 +21,9 @@ | |||||||
| #else | #else | ||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|   | |||||||
| @@ -24,6 +24,9 @@ | |||||||
| #include <arpa/inet.h> | #include <arpa/inet.h> | ||||||
| #include <netdb.h> | #include <netdb.h> | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|   | |||||||
							
								
								
									
										64
									
								
								ares/ares_parse_aaaa_reply.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								ares/ares_parse_aaaa_reply.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | .\" $Id$ | ||||||
|  | .\" | ||||||
|  | .\" Copyright 2005 by Dominick Meglio. | ||||||
|  | .\" | ||||||
|  | .\" Permission to use, copy, modify, and distribute this | ||||||
|  | .\" software and its documentation for any purpose and without | ||||||
|  | .\" fee is hereby granted, provided that the above copyright | ||||||
|  | .\" notice appear in all copies and that both that copyright | ||||||
|  | .\" notice and this permission notice appear in supporting | ||||||
|  | .\" documentation, and that the name of M.I.T. not be used in | ||||||
|  | .\" advertising or publicity pertaining to distribution of the | ||||||
|  | .\" software without specific, written prior permission. | ||||||
|  | .\" M.I.T. makes no representations about the suitability of | ||||||
|  | .\" this software for any purpose.  It is provided "as is" | ||||||
|  | .\" without express or implied warranty. | ||||||
|  | .\" | ||||||
|  | .TH ARES_PARSE_AAAA_REPLY 3 "10 March 2005" | ||||||
|  | .SH NAME | ||||||
|  | ares_parse_aaaa_reply \- Parse a reply to a DNS query of type AAAA into a hostent | ||||||
|  | .SH SYNOPSIS | ||||||
|  | .nf | ||||||
|  | .B #include <ares.h> | ||||||
|  | .PP | ||||||
|  | .B int ares_parse_aaaa_reply(const unsigned char *\fIabuf\fP, int \fIalen\fP, | ||||||
|  | .B 	struct hostent **\fIhost\fP); | ||||||
|  | .fi | ||||||
|  | .SH DESCRIPTION | ||||||
|  | The | ||||||
|  | .B ares_parse_aaaa_reply | ||||||
|  | function parses the response to a query of type AAAA into a | ||||||
|  | .BR "struct hostent" . | ||||||
|  | The parameters | ||||||
|  | .I abuf | ||||||
|  | and | ||||||
|  | .I alen | ||||||
|  | give the contents of the response.  The result is stored in allocated | ||||||
|  | memory and a pointer to it stored into the variable pointed to by | ||||||
|  | .IR host . | ||||||
|  | It is the caller's responsibility to free the resulting host structure | ||||||
|  | using | ||||||
|  | .BR ares_free_hostent (3) | ||||||
|  | when it is no longer needed. | ||||||
|  | .SH RETURN VALUES | ||||||
|  | .B ares_parse_aaaa_reply | ||||||
|  | can return any of the following values: | ||||||
|  | .TP 15 | ||||||
|  | .B ARES_SUCCESS | ||||||
|  | The response was successfully parsed. | ||||||
|  | .TP 15 | ||||||
|  | .B ARES_EBADRESP | ||||||
|  | The response was malformatted. | ||||||
|  | .TP 15 | ||||||
|  | .B ARES_ENODATA | ||||||
|  | The response did not contain an answer to the query. | ||||||
|  | .TP 15 | ||||||
|  | .B ARES_ENOMEM | ||||||
|  | Memory was exhausted. | ||||||
|  | .SH SEE ALSO | ||||||
|  | .BR ares_gethostbyname (3), | ||||||
|  | .BR ares_free_hostent (3) | ||||||
|  | .SH AUTHOR | ||||||
|  | Dominick Meglio | ||||||
|  | .br | ||||||
|  | Copyright 2005 by Dominick Meglio. | ||||||
							
								
								
									
										179
									
								
								ares/ares_parse_aaaa_reply.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								ares/ares_parse_aaaa_reply.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,179 @@ | |||||||
|  | /* Copyright 2005 Dominick Meglio | ||||||
|  |  * | ||||||
|  |  * Permission to use, copy, modify, and distribute this | ||||||
|  |  * software and its documentation for any purpose and without | ||||||
|  |  * fee is hereby granted, provided that the above copyright | ||||||
|  |  * notice appear in all copies and that both that copyright | ||||||
|  |  * notice and this permission notice appear in supporting | ||||||
|  |  * documentation, and that the name of M.I.T. not be used in | ||||||
|  |  * advertising or publicity pertaining to distribution of the | ||||||
|  |  * software without specific, written prior permission. | ||||||
|  |  * M.I.T. makes no representations about the suitability of | ||||||
|  |  * this software for any purpose.  It is provided "as is" | ||||||
|  |  * without express or implied warranty. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "setup.h" | ||||||
|  | #include <sys/types.h> | ||||||
|  |  | ||||||
|  | #if defined(WIN32) && !defined(WATT32) | ||||||
|  | #include "nameser.h" | ||||||
|  | #else | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | #include <netdb.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_H | ||||||
|  | #include <arpa/nameser.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include "ares.h" | ||||||
|  | #include "ares_dns.h" | ||||||
|  | #include "inet_net_pton.h" | ||||||
|  | #include "ares_private.h" | ||||||
|  |  | ||||||
|  | int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, | ||||||
|  |                        struct hostent **host) | ||||||
|  | { | ||||||
|  |   unsigned int qdcount, ancount; | ||||||
|  |   int status, i, rr_type, rr_class, rr_len, naddrs; | ||||||
|  |   int naliases; | ||||||
|  |   long len; | ||||||
|  |   const unsigned char *aptr; | ||||||
|  |   char *hostname, *rr_name, *rr_data, **aliases; | ||||||
|  |   struct in6_addr *addrs; | ||||||
|  |   struct hostent *hostent; | ||||||
|  |  | ||||||
|  |   /* Set *host to NULL for all failure cases. */ | ||||||
|  |   *host = NULL; | ||||||
|  |  | ||||||
|  |   /* Give up if abuf doesn't have room for a header. */ | ||||||
|  |   if (alen < HFIXEDSZ) | ||||||
|  |     return ARES_EBADRESP; | ||||||
|  |  | ||||||
|  |   /* Fetch the question and answer count from the header. */ | ||||||
|  |   qdcount = DNS_HEADER_QDCOUNT(abuf); | ||||||
|  |   ancount = DNS_HEADER_ANCOUNT(abuf); | ||||||
|  |   if (qdcount != 1) | ||||||
|  |     return ARES_EBADRESP; | ||||||
|  |  | ||||||
|  |   /* Expand the name from the question, and skip past the question. */ | ||||||
|  |   aptr = abuf + HFIXEDSZ; | ||||||
|  |   status = ares_expand_name(aptr, abuf, alen, &hostname, &len); | ||||||
|  |   if (status != ARES_SUCCESS) | ||||||
|  |     return status; | ||||||
|  |   if (aptr + len + QFIXEDSZ > abuf + alen) | ||||||
|  |     { | ||||||
|  |       free(hostname); | ||||||
|  |       return ARES_EBADRESP; | ||||||
|  |     } | ||||||
|  |   aptr += len + QFIXEDSZ; | ||||||
|  |  | ||||||
|  |   /* Allocate addresses and aliases; ancount gives an upper bound for both. */ | ||||||
|  |   addrs = malloc(ancount * sizeof(struct in6_addr)); | ||||||
|  |   if (!addrs) | ||||||
|  |     { | ||||||
|  |       free(hostname); | ||||||
|  |       return ARES_ENOMEM; | ||||||
|  |     } | ||||||
|  |   aliases = malloc((ancount + 1) * sizeof(char *)); | ||||||
|  |   if (!aliases) | ||||||
|  |     { | ||||||
|  |       free(hostname); | ||||||
|  |       free(addrs); | ||||||
|  |       return ARES_ENOMEM; | ||||||
|  |     } | ||||||
|  |   naddrs = 0; | ||||||
|  |   naliases = 0; | ||||||
|  |  | ||||||
|  |   /* Examine each answer resource record (RR) in turn. */ | ||||||
|  |   for (i = 0; i < (int)ancount; i++) | ||||||
|  |     { | ||||||
|  |       /* Decode the RR up to the data field. */ | ||||||
|  |       status = ares_expand_name(aptr, abuf, alen, &rr_name, &len); | ||||||
|  |       if (status != ARES_SUCCESS) | ||||||
|  |         break; | ||||||
|  |       aptr += len; | ||||||
|  |       if (aptr + RRFIXEDSZ > abuf + alen) | ||||||
|  |         { | ||||||
|  |           status = ARES_EBADRESP; | ||||||
|  |           break; | ||||||
|  |         } | ||||||
|  |       rr_type = DNS_RR_TYPE(aptr); | ||||||
|  |       rr_class = DNS_RR_CLASS(aptr); | ||||||
|  |       rr_len = DNS_RR_LEN(aptr); | ||||||
|  |       aptr += RRFIXEDSZ; | ||||||
|  |  | ||||||
|  |       if (rr_class == C_IN && rr_type == T_AAAA | ||||||
|  |           && rr_len == sizeof(struct in6_addr) | ||||||
|  |           && strcasecmp(rr_name, hostname) == 0) | ||||||
|  |         { | ||||||
|  |           memcpy(&addrs[naddrs], aptr, sizeof(struct in6_addr)); | ||||||
|  |           naddrs++; | ||||||
|  |           status = ARES_SUCCESS; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |       if (rr_class == C_IN && rr_type == T_CNAME) | ||||||
|  |         { | ||||||
|  |           /* Record the RR name as an alias. */ | ||||||
|  |           aliases[naliases] = rr_name; | ||||||
|  |           naliases++; | ||||||
|  |  | ||||||
|  |           /* Decode the RR data and replace the hostname with it. */ | ||||||
|  |           status = ares_expand_name(aptr, abuf, alen, &rr_data, &len); | ||||||
|  |           if (status != ARES_SUCCESS) | ||||||
|  |             break; | ||||||
|  |           free(hostname); | ||||||
|  |           hostname = rr_data; | ||||||
|  |         } | ||||||
|  |       else | ||||||
|  |         free(rr_name); | ||||||
|  |  | ||||||
|  |       aptr += rr_len; | ||||||
|  |       if (aptr > abuf + alen) | ||||||
|  |         { | ||||||
|  |           status = ARES_EBADRESP; | ||||||
|  |           break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   if (status == ARES_SUCCESS && naddrs == 0) | ||||||
|  |     status = ARES_ENODATA; | ||||||
|  |   if (status == ARES_SUCCESS) | ||||||
|  |     { | ||||||
|  |       /* We got our answer.  Allocate memory to build the host entry. */ | ||||||
|  |       aliases[naliases] = NULL; | ||||||
|  |       hostent = malloc(sizeof(struct hostent)); | ||||||
|  |       if (hostent) | ||||||
|  |         { | ||||||
|  |           hostent->h_addr_list = malloc((naddrs + 1) * sizeof(char *)); | ||||||
|  |           if (hostent->h_addr_list) | ||||||
|  |             { | ||||||
|  |               /* Fill in the hostent and return successfully. */ | ||||||
|  |               hostent->h_name = hostname; | ||||||
|  |               hostent->h_aliases = aliases; | ||||||
|  |               hostent->h_addrtype = AF_INET6; | ||||||
|  |               hostent->h_length = sizeof(struct in6_addr); | ||||||
|  |               for (i = 0; i < naddrs; i++) | ||||||
|  |                 hostent->h_addr_list[i] = (char *) &addrs[i]; | ||||||
|  |               hostent->h_addr_list[naddrs] = NULL; | ||||||
|  |               *host = hostent; | ||||||
|  |               return ARES_SUCCESS; | ||||||
|  |             } | ||||||
|  |           free(hostent); | ||||||
|  |         } | ||||||
|  |       status = ARES_ENOMEM; | ||||||
|  |     } | ||||||
|  |   for (i = 0; i < naliases; i++) | ||||||
|  |     free(aliases[i]); | ||||||
|  |   free(aliases); | ||||||
|  |   free(addrs); | ||||||
|  |   free(hostname); | ||||||
|  |   return status; | ||||||
|  | } | ||||||
| @@ -23,6 +23,9 @@ | |||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <netdb.h> | #include <netdb.h> | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|   | |||||||
| @@ -33,6 +33,10 @@ | |||||||
| #define writev(s,v,c)     writev_s(s,v,c) | #define writev(s,v,c)     writev_s(s,v,c) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef NETWARE | ||||||
|  | #include <time.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #define DEFAULT_TIMEOUT         5 | #define DEFAULT_TIMEOUT         5 | ||||||
| #define DEFAULT_TRIES           4 | #define DEFAULT_TRIES           4 | ||||||
| #ifndef INADDR_NONE | #ifndef INADDR_NONE | ||||||
| @@ -58,6 +62,10 @@ | |||||||
| #define PATH_RESOLV_CONF "sys:/etc/resolv.cfg" | #define PATH_RESOLV_CONF "sys:/etc/resolv.cfg" | ||||||
| #define PATH_HOSTS              "sys:/etc/hosts" | #define PATH_HOSTS              "sys:/etc/hosts" | ||||||
|  |  | ||||||
|  | #elif defined(__riscos__) | ||||||
|  |  | ||||||
|  | #define PATH_HOSTS             "InetDBase:Hosts" | ||||||
|  |  | ||||||
| #else | #else | ||||||
|  |  | ||||||
| #define PATH_RESOLV_CONF        "/etc/resolv.conf" | #define PATH_RESOLV_CONF        "/etc/resolv.conf" | ||||||
| @@ -69,6 +77,8 @@ | |||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #include "ares_ipv6.h" | ||||||
|  |  | ||||||
| struct send_request { | struct send_request { | ||||||
|   /* Remaining data to send */ |   /* Remaining data to send */ | ||||||
|   const unsigned char *data; |   const unsigned char *data; | ||||||
| @@ -124,9 +134,23 @@ struct query { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| /* An IP address pattern; matches an IP address X if X & mask == addr */ | /* An IP address pattern; matches an IP address X if X & mask == addr */ | ||||||
|  | #define PATTERN_MASK 0x1 | ||||||
|  | #define PATTERN_CIDR 0x2 | ||||||
|  |  | ||||||
|  | union ares_addr { | ||||||
|  |   struct in_addr addr4; | ||||||
|  |   struct in6_addr addr6; | ||||||
|  | }; | ||||||
|  |  | ||||||
| struct apattern { | struct apattern { | ||||||
|   struct in_addr addr; |   union ares_addr addr; | ||||||
|   struct in_addr mask; |   union | ||||||
|  |   { | ||||||
|  |     union ares_addr addr; | ||||||
|  |     unsigned short bits; | ||||||
|  |   } mask; | ||||||
|  |   int family; | ||||||
|  |   unsigned short type; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct ares_channeldata { | struct ares_channeldata { | ||||||
| @@ -156,7 +180,7 @@ struct ares_channeldata { | |||||||
|  |  | ||||||
| void ares__send_query(ares_channel channel, struct query *query, time_t now); | void ares__send_query(ares_channel channel, struct query *query, time_t now); | ||||||
| void ares__close_sockets(struct server_state *server); | void ares__close_sockets(struct server_state *server); | ||||||
| int ares__get_hostent(FILE *fp, struct hostent **host); | int ares__get_hostent(FILE *fp, int family, struct hostent **host); | ||||||
| int ares__read_line(FILE *fp, char **buf, int *bufsize); | int ares__read_line(FILE *fp, char **buf, int *bufsize); | ||||||
|  |  | ||||||
| #ifdef CURLDEBUG | #ifdef CURLDEBUG | ||||||
| @@ -164,9 +188,5 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize); | |||||||
|    libcurl lowlevel code from within library is ugly and only works when |    libcurl lowlevel code from within library is ugly and only works when | ||||||
|    c-ares is built and linked with a similarly debug-build libcurl, but we do |    c-ares is built and linked with a similarly debug-build libcurl, but we do | ||||||
|    this anyway for convenience. */ |    this anyway for convenience. */ | ||||||
| #ifndef CURL_EXTERN |  | ||||||
| /* ugly hack to make this compile */ |  | ||||||
| #define CURL_EXTERN |  | ||||||
| #endif |  | ||||||
| #include "../lib/memdebug.h" | #include "../lib/memdebug.h" | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -27,9 +27,19 @@ | |||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <netdb.h> | #include <netdb.h> | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
|  | #endif /* WIN32 && !WATT32 */ | ||||||
|  |  | ||||||
| #ifdef HAVE_UNISTD_H | #ifdef HAVE_UNISTD_H | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #endif | #endif | ||||||
|  | #ifdef HAVE_SYS_IOCTL_H | ||||||
|  | #include <sys/ioctl.h> | ||||||
|  | #endif | ||||||
|  | #ifdef NETWARE | ||||||
|  | #include <sys/filio.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <string.h> | #include <string.h> | ||||||
| @@ -42,6 +52,11 @@ | |||||||
| #include "ares_dns.h" | #include "ares_dns.h" | ||||||
| #include "ares_private.h" | #include "ares_private.h" | ||||||
|  |  | ||||||
|  | #ifndef TRUE | ||||||
|  | /* at least Solaris 7 does not have TRUE at this point */ | ||||||
|  | #define TRUE 1 | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) | #if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) | ||||||
| #define GET_ERRNO()  WSAGetLastError() | #define GET_ERRNO()  WSAGetLastError() | ||||||
| #else | #else | ||||||
| @@ -89,7 +104,7 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now) | |||||||
|   struct iovec *vec; |   struct iovec *vec; | ||||||
|   int i; |   int i; | ||||||
|   ssize_t scount; |   ssize_t scount; | ||||||
|   int wcount; |   ssize_t wcount; | ||||||
|   size_t n; |   size_t n; | ||||||
|  |  | ||||||
|   for (i = 0; i < channel->nservers; i++) |   for (i = 0; i < channel->nservers; i++) | ||||||
| @@ -150,7 +165,8 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now) | |||||||
|           /* Can't allocate iovecs; just send the first request. */ |           /* Can't allocate iovecs; just send the first request. */ | ||||||
|           sendreq = server->qhead; |           sendreq = server->qhead; | ||||||
|  |  | ||||||
|           scount = send(server->tcp_socket, sendreq->data, sendreq->len, 0); |           scount = send(server->tcp_socket, (void *)sendreq->data, | ||||||
|  |                         sendreq->len, 0); | ||||||
|  |  | ||||||
|           if (scount < 0) |           if (scount < 0) | ||||||
|             { |             { | ||||||
| @@ -198,8 +214,8 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now) | |||||||
|            * what's left to read of it). |            * what's left to read of it). | ||||||
|            */ |            */ | ||||||
|           count = recv(server->tcp_socket, |           count = recv(server->tcp_socket, | ||||||
|                        server->tcp_lenbuf + server->tcp_buffer_pos, |                        (void *)(server->tcp_lenbuf + server->tcp_lenbuf_pos), | ||||||
|                        2 - server->tcp_buffer_pos, 0); |                        2 - server->tcp_lenbuf_pos, 0); | ||||||
|           if (count <= 0) |           if (count <= 0) | ||||||
|             { |             { | ||||||
|               handle_error(channel, i, now); |               handle_error(channel, i, now); | ||||||
| @@ -224,7 +240,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now) | |||||||
|         { |         { | ||||||
|           /* Read data into the allocated buffer. */ |           /* Read data into the allocated buffer. */ | ||||||
|           count = recv(server->tcp_socket, |           count = recv(server->tcp_socket, | ||||||
|                        server->tcp_buffer + server->tcp_buffer_pos, |                        (void *)(server->tcp_buffer + server->tcp_buffer_pos), | ||||||
|                        server->tcp_length - server->tcp_buffer_pos, 0); |                        server->tcp_length - server->tcp_buffer_pos, 0); | ||||||
|           if (count <= 0) |           if (count <= 0) | ||||||
|             { |             { | ||||||
| @@ -266,7 +282,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds, | |||||||
|           !FD_ISSET(server->udp_socket, read_fds)) |           !FD_ISSET(server->udp_socket, read_fds)) | ||||||
|         continue; |         continue; | ||||||
|  |  | ||||||
|       count = recv(server->udp_socket, buf, sizeof(buf), 0); |       count = recv(server->udp_socket, (void *)buf, sizeof(buf), 0); | ||||||
|       if (count <= 0) |       if (count <= 0) | ||||||
|         handle_error(channel, i, now); |         handle_error(channel, i, now); | ||||||
|  |  | ||||||
| @@ -451,7 +467,8 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now) | |||||||
|               return; |               return; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|       if (send(server->udp_socket, query->qbuf, query->qlen, 0) == -1) |       if (send(server->udp_socket, (void *)query->qbuf, | ||||||
|  |                query->qlen, 0) == -1) | ||||||
|         { |         { | ||||||
|           query->skip_server[query->server] = 1; |           query->skip_server[query->server] = 1; | ||||||
|           next_server(channel, query, now); |           next_server(channel, query, now); | ||||||
| @@ -463,10 +480,77 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * nonblock() set the given socket to either blocking or non-blocking mode | ||||||
|  |  * based on the 'nonblock' boolean argument. This function is highly portable. | ||||||
|  |  */ | ||||||
|  | static int nonblock(ares_socket_t sockfd,    /* operate on this */ | ||||||
|  |                     int nonblock   /* TRUE or FALSE */) | ||||||
|  | { | ||||||
|  | #undef SETBLOCK | ||||||
|  | #define SETBLOCK 0 | ||||||
|  | #ifdef HAVE_O_NONBLOCK | ||||||
|  |   /* most recent unix versions */ | ||||||
|  |   int flags; | ||||||
|  |  | ||||||
|  |   flags = fcntl(sockfd, F_GETFL, 0); | ||||||
|  |   if (TRUE == nonblock) | ||||||
|  |     return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); | ||||||
|  |   else | ||||||
|  |     return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); | ||||||
|  | #undef SETBLOCK | ||||||
|  | #define SETBLOCK 1 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(HAVE_FIONBIO) && (SETBLOCK == 0) | ||||||
|  |   /* older unix versions */ | ||||||
|  |   int flags; | ||||||
|  |  | ||||||
|  |   flags = nonblock; | ||||||
|  |   return ioctl(sockfd, FIONBIO, &flags); | ||||||
|  | #undef SETBLOCK | ||||||
|  | #define SETBLOCK 2 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0) | ||||||
|  |   /* Windows? */ | ||||||
|  |   unsigned long flags; | ||||||
|  |   flags = nonblock; | ||||||
|  |  | ||||||
|  |   return ioctlsocket(sockfd, FIONBIO, &flags); | ||||||
|  | #undef SETBLOCK | ||||||
|  | #define SETBLOCK 3 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(HAVE_IOCTLSOCKET_CASE) && (SETBLOCK == 0) | ||||||
|  |   /* presumably for Amiga */ | ||||||
|  |   return IoctlSocket(sockfd, FIONBIO, (long)nonblock); | ||||||
|  | #undef SETBLOCK | ||||||
|  | #define SETBLOCK 4 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(HAVE_SO_NONBLOCK) && (SETBLOCK == 0) | ||||||
|  |   /* BeOS */ | ||||||
|  |   long b = nonblock ? 1 : 0; | ||||||
|  |   return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); | ||||||
|  | #undef SETBLOCK | ||||||
|  | #define SETBLOCK 5 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef HAVE_DISABLED_NONBLOCKING | ||||||
|  |   return 0; /* returns success */ | ||||||
|  | #undef SETBLOCK | ||||||
|  | #define SETBLOCK 6 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if (SETBLOCK == 0) | ||||||
|  | #error "no non-blocking method was found/used/set" | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
| static int open_tcp_socket(ares_channel channel, struct server_state *server) | static int open_tcp_socket(ares_channel channel, struct server_state *server) | ||||||
| { | { | ||||||
|   ares_socket_t s; |   ares_socket_t s; | ||||||
|   int flags; |  | ||||||
|   struct sockaddr_in sockin; |   struct sockaddr_in sockin; | ||||||
|  |  | ||||||
|   /* Acquire a socket. */ |   /* Acquire a socket. */ | ||||||
| @@ -475,25 +559,7 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server) | |||||||
|     return -1; |     return -1; | ||||||
|  |  | ||||||
|   /* Set the socket non-blocking. */ |   /* Set the socket non-blocking. */ | ||||||
|  |   nonblock(s, TRUE); | ||||||
| #if defined(WIN32) || defined(WATT32) |  | ||||||
|   flags = 1; |  | ||||||
|   ioctlsocket(s, FIONBIO, &flags); |  | ||||||
| #else |  | ||||||
|   flags = fcntl(s, F_GETFL, 0); |  | ||||||
|  |  | ||||||
|   if (flags == -1) |  | ||||||
|     { |  | ||||||
|       closesocket(s); |  | ||||||
|       return -1; |  | ||||||
|     } |  | ||||||
|   flags |= O_NONBLOCK; |  | ||||||
|   if (fcntl(s, F_SETFL, flags) == -1) |  | ||||||
|     { |  | ||||||
|       closesocket(s); |  | ||||||
|       return -1; |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   /* Connect to the server. */ |   /* Connect to the server. */ | ||||||
|   memset(&sockin, 0, sizeof(sockin)); |   memset(&sockin, 0, sizeof(sockin)); | ||||||
| @@ -524,6 +590,9 @@ static int open_udp_socket(ares_channel channel, struct server_state *server) | |||||||
|   if (s == ARES_SOCKET_BAD) |   if (s == ARES_SOCKET_BAD) | ||||||
|     return -1; |     return -1; | ||||||
|  |  | ||||||
|  |   /* Set the socket non-blocking. */ | ||||||
|  |   nonblock(s, TRUE); | ||||||
|  |  | ||||||
|   /* Connect to the server. */ |   /* Connect to the server. */ | ||||||
|   memset(&sockin, 0, sizeof(sockin)); |   memset(&sockin, 0, sizeof(sockin)); | ||||||
|   sockin.sin_family = AF_INET; |   sockin.sin_family = AF_INET; | ||||||
|   | |||||||
| @@ -21,6 +21,9 @@ | |||||||
| #else | #else | ||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|   | |||||||
| @@ -21,6 +21,9 @@ | |||||||
| #else | #else | ||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||||
|  | #include <arpa/nameser_compat.h> | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|   | |||||||
| @@ -38,7 +38,8 @@ const char *ares_strerror(int code) | |||||||
|     "Error reading file", |     "Error reading file", | ||||||
|     "Out of memory", |     "Out of memory", | ||||||
|     "Channel is being destroyed", |     "Channel is being destroyed", | ||||||
|     "Misformatted string" |     "Misformatted string", | ||||||
|  |     "Illegal flags specified" | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext))); |   assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext))); | ||||||
|   | |||||||
| @@ -4,12 +4,12 @@ | |||||||
| #define ARES__VERSION_H | #define ARES__VERSION_H | ||||||
|  |  | ||||||
| #define ARES_VERSION_MAJOR 1 | #define ARES_VERSION_MAJOR 1 | ||||||
| #define ARES_VERSION_MINOR 2 | #define ARES_VERSION_MINOR 3 | ||||||
| #define ARES_VERSION_PATCH 0 | #define ARES_VERSION_PATCH 1 | ||||||
| #define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ | #define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ | ||||||
|                        (ARES_VERSION_MINOR<<8)|\ |                        (ARES_VERSION_MINOR<<8)|\ | ||||||
|                        (ARES_VERSION_PATCH)) |                        (ARES_VERSION_PATCH)) | ||||||
| #define ARES_VERSION_STR "1.2.0" | #define ARES_VERSION_STR "1.3.1" | ||||||
|  |  | ||||||
| const char *ares_version(int *version); | const char *ares_version(int *version); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										60
									
								
								ares/bitncmp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								ares/bitncmp.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") | ||||||
|  |  * Copyright (c) 1996,1999 by Internet Software Consortium. | ||||||
|  |  * | ||||||
|  |  * Permission to use, copy, modify, and distribute this software for any | ||||||
|  |  * purpose with or without fee is hereby granted, provided that the above | ||||||
|  |  * copyright notice and this permission notice appear in all copies. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES | ||||||
|  |  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||||
|  |  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR | ||||||
|  |  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||||
|  |  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||||
|  |  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||||
|  |  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef HAVE_BITNCMP | ||||||
|  |  | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include "bitncmp.h" | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * int | ||||||
|  |  * bitncmp(l, r, n) | ||||||
|  |  *	compare bit masks l and r, for n bits. | ||||||
|  |  * return: | ||||||
|  |  *	-1, 1, or 0 in the libc tradition. | ||||||
|  |  * note: | ||||||
|  |  *	network byte order assumed.  this means 192.5.5.240/28 has | ||||||
|  |  *	0x11110000 in its fourth octet. | ||||||
|  |  * author: | ||||||
|  |  *	Paul Vixie (ISC), June 1996 | ||||||
|  |  */ | ||||||
|  | int | ||||||
|  | ares_bitncmp(const void *l, const void *r, int n) { | ||||||
|  | 	unsigned int lb, rb; | ||||||
|  | 	int x, b; | ||||||
|  |  | ||||||
|  | 	b = n / 8; | ||||||
|  | 	x = memcmp(l, r, b); | ||||||
|  | 	if (x) | ||||||
|  | 		return (x); | ||||||
|  |  | ||||||
|  | 	lb = ((const unsigned char *)l)[b]; | ||||||
|  | 	rb = ((const unsigned char *)r)[b]; | ||||||
|  | 	for (b = n % 8; b > 0; b--) { | ||||||
|  | 		if ((lb & 0x80) != (rb & 0x80)) { | ||||||
|  | 			if (lb & 0x80) | ||||||
|  | 				return (1); | ||||||
|  | 			return (-1); | ||||||
|  | 		} | ||||||
|  | 		lb <<= 1; | ||||||
|  | 		rb <<= 1; | ||||||
|  | 	} | ||||||
|  | 	return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
							
								
								
									
										26
									
								
								ares/bitncmp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								ares/bitncmp.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Permission to use, copy, modify, and distribute this | ||||||
|  |  * software and its documentation for any purpose and without | ||||||
|  |  * fee is hereby granted, provided that the above copyright | ||||||
|  |  * notice appear in all copies and that both that copyright | ||||||
|  |  * notice and this permission notice appear in supporting | ||||||
|  |  * documentation, and that the name of M.I.T. not be used in | ||||||
|  |  * advertising or publicity pertaining to distribution of the | ||||||
|  |  * software without specific, written prior permission. | ||||||
|  |  * M.I.T. makes no representations about the suitability of | ||||||
|  |  * this software for any purpose.  It is provided "as is" | ||||||
|  |  * without express or implied warranty. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef BITNCMP_H | ||||||
|  | #define BITNCMP_H | ||||||
|  |  | ||||||
|  | #ifndef HAVE_BITNCMP | ||||||
|  | int ares_bitncmp(const void *l, const void *r, int n); | ||||||
|  | #else | ||||||
|  | #define ares_bitncmp(x,y,z) bitncmp(x,y,z) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif /* BITNCMP_H */ | ||||||
| @@ -1,7 +1,7 @@ | |||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| libtoolize --copy --automake --force | ${LIBTOOLIZE:-libtoolize} --copy --automake --force | ||||||
| aclocal | ${ACLOCAL:-aclocal} $ACLOCAL_FLAGS | ||||||
| autoheader | ${AUTOHEADER:-autoheader} | ||||||
| autoconf | ${AUTOCONF:-autoconf} | ||||||
| automake --add-missing | ${AUTOMAKE:-automake} --add-missing | ||||||
|   | |||||||
							
								
								
									
										87
									
								
								ares/config-win32.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								ares/config-win32.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | |||||||
|  | #ifndef __ARES_CONFIG_WIN32_H | ||||||
|  | #define __ARES_CONFIG_WIN32_H | ||||||
|  |  | ||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
|  | /* Copyright (C) 2004 - 2005 by Daniel Stenberg et al | ||||||
|  |  * | ||||||
|  |  * Permission to use, copy, modify, and distribute this software and its | ||||||
|  |  * documentation for any purpose and without fee is hereby granted, provided | ||||||
|  |  * that the above copyright notice appear in all copies and that both that | ||||||
|  |  * copyright notice and this permission notice appear in supporting | ||||||
|  |  * documentation, and that the name of M.I.T. not be used in advertising or | ||||||
|  |  * publicity pertaining to distribution of the software without specific, | ||||||
|  |  * written prior permission.  M.I.T. makes no representations about the | ||||||
|  |  * suitability of this software for any purpose.  It is provided "as is" | ||||||
|  |  * without express or implied warranty. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* ================================================================ */ | ||||||
|  | /*    ares/config-win32.h - Hand crafted config file for windows    */ | ||||||
|  | /* ================================================================ */ | ||||||
|  |  | ||||||
|  | /* ---------------------------------------------------------------- */ | ||||||
|  | /*                          HEADER FILES                            */ | ||||||
|  | /* ---------------------------------------------------------------- */ | ||||||
|  |  | ||||||
|  | /* Define if you have the <getopt.h> header file.  */ | ||||||
|  | #if defined(__MINGW32__) | ||||||
|  | #define HAVE_GETOPT_H 1 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* Define if you have the <unistd.h> header file.  */ | ||||||
|  | #if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \ | ||||||
|  |     defined(__POCC__) | ||||||
|  | #define HAVE_UNISTD_H 1 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* Define if you have the <windows.h> header file.  */ | ||||||
|  | #define HAVE_WINDOWS_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <winsock.h> header file.  */ | ||||||
|  | #define HAVE_WINSOCK_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <winsock2.h> header file.  */ | ||||||
|  | #define HAVE_WINSOCK2_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <ws2tcpip.h> header file.  */ | ||||||
|  | #define HAVE_WS2TCPIP_H 1 | ||||||
|  |  | ||||||
|  | /* ---------------------------------------------------------------- */ | ||||||
|  | /*                             FUNCTIONS                            */ | ||||||
|  | /* ---------------------------------------------------------------- */ | ||||||
|  |  | ||||||
|  | /* Define if you have the ioctlsocket function.  */ | ||||||
|  | #define HAVE_IOCTLSOCKET 1 | ||||||
|  |  | ||||||
|  | /* ---------------------------------------------------------------- */ | ||||||
|  | /*                          STRUCT RELATED                          */ | ||||||
|  | /* ---------------------------------------------------------------- */ | ||||||
|  |  | ||||||
|  | /* Define this if you have struct addrinfo */ | ||||||
|  | #define HAVE_STRUCT_ADDRINFO 1 | ||||||
|  |  | ||||||
|  | /* Define this if you have struct sockaddr_storage */ | ||||||
|  | #define HAVE_STRUCT_SOCKADDR_STORAGE 1 | ||||||
|  |  | ||||||
|  | /* ---------------------------------------------------------------- */ | ||||||
|  | /*                         IPV6 COMPATIBILITY                       */ | ||||||
|  | /* ---------------------------------------------------------------- */ | ||||||
|  |  | ||||||
|  | /* Define this if you have address family AF_INET6 */ | ||||||
|  | #define HAVE_AF_INET6 1 | ||||||
|  |  | ||||||
|  | /* Define this if you have protocol family PF_INET6 */ | ||||||
|  | #define HAVE_PF_INET6 1 | ||||||
|  |  | ||||||
|  | /* Define this if you have struct in6_addr */ | ||||||
|  | #define HAVE_STRUCT_IN6_ADDR 1 | ||||||
|  |  | ||||||
|  | /* Define this if you have struct sockaddr_in6 */ | ||||||
|  | #define HAVE_STRUCT_SOCKADDR_IN6 1 | ||||||
|  |  | ||||||
|  | /* Define this if you have sockaddr_in6 with scopeid */ | ||||||
|  | #define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif  /* __ARES_CONFIG_WIN32_H */ | ||||||
| @@ -1,5 +1,8 @@ | |||||||
|  |  | ||||||
| dnl Process this file with autoconf to produce a configure script. | dnl Process this file with autoconf to produce a configure script. | ||||||
|  | AC_PREREQ(2.57) | ||||||
| AC_INIT(ares_init.c) | AC_INIT(ares_init.c) | ||||||
|  | AC_CONFIG_SRCDIR([ares_ipv6.h]) | ||||||
| AM_CONFIG_HEADER(config.h) | AM_CONFIG_HEADER(config.h) | ||||||
| AM_MAINTAINER_MODE | AM_MAINTAINER_MODE | ||||||
| AM_INIT_AUTOMAKE(c-ares, CVS) | AM_INIT_AUTOMAKE(c-ares, CVS) | ||||||
| @@ -13,13 +16,12 @@ solaris*) | |||||||
| 	;; | 	;; | ||||||
| esac | esac | ||||||
|  |  | ||||||
| # check for ssize_t |  | ||||||
| AC_CHECK_TYPE(ssize_t, , |  | ||||||
|    AC_DEFINE(ssize_t, int, [the signed version of size_t])) |  | ||||||
|  |  | ||||||
| AC_SEARCH_LIBS(gethostbyname, nsl) | AC_SEARCH_LIBS(gethostbyname, nsl) | ||||||
| AC_SEARCH_LIBS(socket, socket) | AC_SEARCH_LIBS(socket, socket) | ||||||
|  |  | ||||||
|  | dnl check for cygwin stuff | ||||||
|  | AC_LIBTOOL_WIN32_DLL | ||||||
|  |  | ||||||
| dnl ************************************************************ | dnl ************************************************************ | ||||||
| dnl Option to switch on debug options. This makes an assumption that | dnl Option to switch on debug options. This makes an assumption that | ||||||
| dnl this is built as an 'ares' subdir in the curl source tree. Subject for | dnl this is built as an 'ares' subdir in the curl source tree. Subject for | ||||||
| @@ -38,8 +40,9 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]), | |||||||
|     dnl when doing the debug stuff, use static library only |     dnl when doing the debug stuff, use static library only | ||||||
|     AC_DISABLE_SHARED |     AC_DISABLE_SHARED | ||||||
|  |  | ||||||
|     dnl Checks for standard header files, to make memdebug.h inclusions bettter |     dnl the entire --enable-debug is a hack that lives and runs on top of | ||||||
|     AC_HEADER_STDC |     dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier | ||||||
|  |     AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl]) | ||||||
|  |  | ||||||
|     CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include" |     CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include" | ||||||
|     CFLAGS="$CFLAGS -g"  |     CFLAGS="$CFLAGS -g"  | ||||||
| @@ -53,14 +56,453 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]), | |||||||
|        AC_MSG_RESULT(no) |        AC_MSG_RESULT(no) | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | dnl libtool setup | ||||||
| AC_PROG_LIBTOOL | AC_PROG_LIBTOOL | ||||||
|  |  | ||||||
|  | dnl Checks for header files. | ||||||
|  | AC_HEADER_STDC | ||||||
|  |  | ||||||
|  | dnl ********************************************************************** | ||||||
|  | dnl Make sure that our checks for headers windows.h winsock.h winsock2.h  | ||||||
|  | dnl and ws2tcpip.h take precedence over any other further checks which  | ||||||
|  | dnl could be done later using AC_CHECK_HEADER or AC_CHECK_HEADERS for | ||||||
|  | dnl this specific header files. And do them before its results are used. | ||||||
|  | dnl ********************************************************************** | ||||||
|  |  | ||||||
|  | CURL_CHECK_HEADER_WINDOWS | ||||||
|  | CURL_CHECK_HEADER_WINSOCK | ||||||
|  | CURL_CHECK_HEADER_WINSOCK2 | ||||||
|  | CURL_CHECK_HEADER_WS2TCPIP | ||||||
|  |  | ||||||
| dnl check for a few basic system headers we need | dnl check for a few basic system headers we need | ||||||
| AC_CHECK_HEADERS( | AC_CHECK_HEADERS( | ||||||
|        sys/types.h \ |        sys/types.h \ | ||||||
|        sys/time.h \ |        sys/time.h \ | ||||||
|        sys/select.h \ |        sys/select.h \ | ||||||
|        sys/socket.h \ |        sys/socket.h \ | ||||||
|        ) |        sys/ioctl.h \ | ||||||
|  |        netdb.h \ | ||||||
|  |        netinet/in.h \ | ||||||
|  |        net/if.h \ | ||||||
|  |        arpa/nameser.h \ | ||||||
|  |        arpa/nameser_compat.h \ | ||||||
|  |        arpa/inet.h, | ||||||
|  | dnl to do if not found | ||||||
|  | [], | ||||||
|  | dnl to do if found | ||||||
|  | [], | ||||||
|  | dnl default includes | ||||||
|  | [ | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_TIME_H | ||||||
|  | #include <sys/time.h> | ||||||
|  | #endif | ||||||
|  | dnl We do this default-include simply to make sure that the nameser_compat.h | ||||||
|  | dnl header *REALLY* can be include after the new nameser.h. It seems AIX 5.1 | ||||||
|  | dnl (and others?) is not designed to allow this. | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_H | ||||||
|  | #include <arpa/nameser.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | dnl *Sigh* these are needed in order for net/if.h to get properly detected. | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | ] | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | dnl Checks for typedefs, structures, and compiler characteristics. | ||||||
|  | AC_C_CONST | ||||||
|  | AC_TYPE_SIZE_T | ||||||
|  | AC_HEADER_TIME | ||||||
|  |  | ||||||
|  | AC_CHECK_SIZEOF(curl_off_t, ,[ | ||||||
|  | #include <stdio.h> | ||||||
|  | #include "$srcdir/include/curl/curl.h" | ||||||
|  | ]) | ||||||
|  | AC_CHECK_SIZEOF(size_t) | ||||||
|  | AC_CHECK_SIZEOF(long) | ||||||
|  | AC_CHECK_SIZEOF(time_t) | ||||||
|  |  | ||||||
|  | AC_CHECK_TYPE(long long, | ||||||
|  |    [AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports long long])] | ||||||
|  |    longlong="yes"   | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | if test "xyes" = "x$longlong"; then | ||||||
|  |   AC_MSG_CHECKING([if numberLL works]) | ||||||
|  |   AC_COMPILE_IFELSE([long long val = 1000LL;], | ||||||
|  |    [AC_DEFINE(HAVE_LL, 1, [if your compiler supports LL])] | ||||||
|  |    AC_MSG_RESULT(yes), | ||||||
|  |    AC_MSG_RESULT(no) | ||||||
|  |   ) | ||||||
|  | fi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # check for ssize_t | ||||||
|  | AC_CHECK_TYPE(ssize_t, , | ||||||
|  |    AC_DEFINE(ssize_t, int, [the signed version of size_t])) | ||||||
|  |  | ||||||
|  | # Check for socklen_t or equivalent | ||||||
|  | CURL_CHECK_TYPE_SOCKLEN_T | ||||||
|  |  | ||||||
|  | TYPE_IN_ADDR_T | ||||||
|  |  | ||||||
|  | TYPE_SOCKADDR_STORAGE | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl check for AF_INET6 | ||||||
|  | CARES_CHECK_CONSTANT( | ||||||
|  |   [ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |   ], [PF_INET6],  | ||||||
|  |      AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.]) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | dnl check for PF_INET6 | ||||||
|  | CARES_CHECK_CONSTANT( | ||||||
|  |   [ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |   ], [AF_INET6],  | ||||||
|  |      AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.]) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl check for the in6_addr structure | ||||||
|  | CARES_CHECK_STRUCT( | ||||||
|  |   [ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |   ], [in6_addr],  | ||||||
|  |      AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.]) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | dnl check for the sockaddr_in6 structure | ||||||
|  | CARES_CHECK_STRUCT( | ||||||
|  |   [ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |   ], [sockaddr_in6],  | ||||||
|  |      AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1, | ||||||
|  |        [Define to 1 if you have struct sockaddr_in6.]) ac_have_sockaddr_in6=yes | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | AC_CHECK_MEMBER(struct sockaddr_in6.sin6_scope_id, | ||||||
|  |     AC_DEFINE_UNQUOTED(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID,1, | ||||||
|  |       [Define to 1 if your struct sockaddr_in6 has sin6_scope_id.]) | ||||||
|  |    , , | ||||||
|  |   [ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |   ]) | ||||||
|  |  | ||||||
|  | dnl check for the addrinfo structure | ||||||
|  | AC_CHECK_MEMBER(struct addrinfo.ai_flags, | ||||||
|  |      AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1, | ||||||
|  |        [Define to 1 if you have struct addrinfo.]),, | ||||||
|  |   [ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETDB_H | ||||||
|  | #include <netdb.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |   ] | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | AC_CHECK_FUNCS( bitncmp \ | ||||||
|  |                 if_indextoname, | ||||||
|  | dnl if found | ||||||
|  | [], | ||||||
|  | dnl if not found, $ac_func is the name we check for | ||||||
|  | func="$ac_func" | ||||||
|  | AC_MSG_CHECKING([deeper for $func]) | ||||||
|  | AC_TRY_LINK( [], | ||||||
|  |              [ $func ();], | ||||||
|  |              AC_MSG_RESULT(yes!) | ||||||
|  |              eval "ac_cv_func_$func=yes" | ||||||
|  |              def=`echo "HAVE_$func" | tr 'a-z' 'A-Z'` | ||||||
|  |              AC_DEFINE_UNQUOTED($def, 1, [If you have $func]), | ||||||
|  |              AC_MSG_RESULT(but still no) | ||||||
|  |              ) | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl check for inet_pton | ||||||
|  | AC_CHECK_FUNCS(inet_pton) | ||||||
|  | dnl Some systems have it, but not IPv6 | ||||||
|  | if test "$ac_cv_func_inet_pton" = "yes" ; then | ||||||
|  | AC_MSG_CHECKING(if inet_pton supports IPv6) | ||||||
|  | AC_TRY_RUN( | ||||||
|  |   [ | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | int main() | ||||||
|  |   { | ||||||
|  |     struct in6_addr addr6; | ||||||
|  |     if (inet_pton(AF_INET6, "::1", &addr6) < 1) | ||||||
|  |       exit(1); | ||||||
|  |     else | ||||||
|  |       exit(0); | ||||||
|  |   } | ||||||
|  |   ], [ | ||||||
|  |        AC_MSG_RESULT(yes) | ||||||
|  |        AC_DEFINE_UNQUOTED(HAVE_INET_PTON_IPV6,1,[Define to 1 if inet_pton supports IPv6.]) | ||||||
|  |      ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) | ||||||
|  | fi | ||||||
|  | dnl Check for inet_net_pton | ||||||
|  | AC_CHECK_FUNCS(inet_net_pton) | ||||||
|  | dnl Again, some systems have it, but not IPv6 | ||||||
|  | if test "$ac_cv_func_inet_net_pton" = "yes" ; then | ||||||
|  | AC_MSG_CHECKING(if inet_net_pton supports IPv6) | ||||||
|  | AC_TRY_RUN( | ||||||
|  |   [ | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | int main() | ||||||
|  |   { | ||||||
|  |     struct in6_addr addr6; | ||||||
|  |     if (inet_net_pton(AF_INET6, "::1", &addr6, sizeof(addr6)) < 1) | ||||||
|  |       exit(1); | ||||||
|  |     else | ||||||
|  |       exit(0); | ||||||
|  |   } | ||||||
|  |   ], [ | ||||||
|  |        AC_MSG_RESULT(yes) | ||||||
|  |        AC_DEFINE_UNQUOTED(HAVE_INET_NET_PTON_IPV6,1,[Define to 1 if inet_net_pton supports IPv6.]) | ||||||
|  |      ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) | ||||||
|  | fi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl Check for inet_ntop | ||||||
|  | AC_CHECK_FUNCS(inet_ntop) | ||||||
|  | dnl Again, some systems have it, but not IPv6 | ||||||
|  | if test "$ac_cv_func_inet_ntop" = "yes" ; then | ||||||
|  | AC_MSG_CHECKING(if inet_ntop supports IPv6) | ||||||
|  | AC_TRY_RUN( | ||||||
|  |   [ | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #include <errno.h> | ||||||
|  | int main() | ||||||
|  |   { | ||||||
|  |     struct in6_addr addr6; | ||||||
|  |     char buf[128]; | ||||||
|  |     if (inet_ntop(AF_INET6, &addr6, buf, 128) == 0 && errno == EAFNOSUPPORT) | ||||||
|  |       exit(1); | ||||||
|  |     else | ||||||
|  |       exit(0); | ||||||
|  |   } | ||||||
|  |   ], [ | ||||||
|  |        AC_MSG_RESULT(yes) | ||||||
|  |        AC_DEFINE_UNQUOTED(HAVE_INET_NTOP_IPV6,1,[Define to 1 if inet_ntop supports IPv6.]) | ||||||
|  |      ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | AC_CHECK_SIZEOF(struct in6_addr, , | ||||||
|  | [ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | ] | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | AC_CHECK_SIZEOF(struct in_addr, , | ||||||
|  | [ | ||||||
|  | #undef inline | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #define WIN32_LEAN_AND_MEAN | ||||||
|  | #endif | ||||||
|  | #include <windows.h> | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | ] | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl Check if the getnameinfo function is available | ||||||
|  | dnl and get the types of five of its arguments. | ||||||
|  | CURL_CHECK_FUNC_GETNAMEINFO | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl God bless non-standardized functions! We need to see which getservbyport_r variant is available | ||||||
|  | CARES_CHECK_GETSERVBYPORT_R | ||||||
|  |  | ||||||
|  | CURL_CHECK_NONBLOCKING_SOCKET | ||||||
|  |  | ||||||
|  | AC_C_BIGENDIAN( | ||||||
|  |     [AC_DEFINE(ARES_BIG_ENDIAN, 1, [define this if ares is built for a big endian system])], | ||||||
|  |     , | ||||||
|  |     [AC_MSG_WARN([couldn't figure out endianess, assuming little endian!])] | ||||||
|  | ) | ||||||
|  |  | ||||||
| AC_OUTPUT(Makefile) | AC_OUTPUT(Makefile) | ||||||
|   | |||||||
							
								
								
									
										439
									
								
								ares/inet_net_pton.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										439
									
								
								ares/inet_net_pton.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,439 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") | ||||||
|  |  * Copyright (c) 1996,1999 by Internet Software Consortium. | ||||||
|  |  * | ||||||
|  |  * Permission to use, copy, modify, and distribute this software for any | ||||||
|  |  * purpose with or without fee is hereby granted, provided that the above | ||||||
|  |  * copyright notice and this permission notice appear in all copies. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES | ||||||
|  |  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||||
|  |  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR | ||||||
|  |  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||||
|  |  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||||
|  |  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||||
|  |  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "setup.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <sys/types.h> | ||||||
|  |  | ||||||
|  | #if defined(WIN32) && !defined(WATT32) | ||||||
|  | #include "nameser.h" | ||||||
|  | #else | ||||||
|  |  | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_H | ||||||
|  | #include <arpa/nameser.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_ARPA_INET_H | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <ctype.h> | ||||||
|  | #include <errno.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  |  | ||||||
|  | #include "ares_ipv6.h" | ||||||
|  | #include "inet_net_pton.h" | ||||||
|  |  | ||||||
|  | #if !defined(HAVE_INET_NET_PTON) || !defined(HAVE_INET_NET_PTON_IPV6) || \ | ||||||
|  |     !defined(HAVE_INET_PTON) || !defined(HAVE_INET_PTON_IPV6) | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * static int | ||||||
|  |  * inet_net_pton_ipv4(src, dst, size) | ||||||
|  |  *      convert IPv4 network number from presentation to network format. | ||||||
|  |  *      accepts hex octets, hex strings, decimal octets, and /CIDR. | ||||||
|  |  *      "size" is in bytes and describes "dst". | ||||||
|  |  * return: | ||||||
|  |  *      number of bits, either imputed classfully or specified with /CIDR, | ||||||
|  |  *      or -1 if some failure occurred (check errno).  ENOENT means it was | ||||||
|  |  *      not an IPv4 network specification. | ||||||
|  |  * note: | ||||||
|  |  *      network byte order assumed.  this means 192.5.5.240/28 has | ||||||
|  |  *      0b11110000 in its fourth octet. | ||||||
|  |  * author: | ||||||
|  |  *      Paul Vixie (ISC), June 1996 | ||||||
|  |  */ | ||||||
|  | static int | ||||||
|  | inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | ||||||
|  | { | ||||||
|  |   static const char xdigits[] = "0123456789abcdef"; | ||||||
|  |   static const char digits[] = "0123456789"; | ||||||
|  |   int n, ch, tmp = 0, dirty, bits; | ||||||
|  |   const unsigned char *odst = dst; | ||||||
|  |  | ||||||
|  |   ch = *src++; | ||||||
|  |   if (ch == '0' && (src[0] == 'x' || src[0] == 'X') | ||||||
|  |       && isascii((unsigned char)(src[1])) | ||||||
|  |       && isxdigit((unsigned char)(src[1]))) { | ||||||
|  |     /* Hexadecimal: Eat nybble string. */ | ||||||
|  |     if (size <= 0U) | ||||||
|  |       goto emsgsize; | ||||||
|  |     dirty = 0; | ||||||
|  |     src++;  /* skip x or X. */ | ||||||
|  |     while ((ch = *src++) != '\0' && isascii(ch) && isxdigit(ch)) { | ||||||
|  |       if (isupper(ch)) | ||||||
|  |         ch = tolower(ch); | ||||||
|  |       n = (int)(strchr(xdigits, ch) - xdigits); | ||||||
|  |       if (dirty == 0) | ||||||
|  |         tmp = n; | ||||||
|  |       else | ||||||
|  |         tmp = (tmp << 4) | n; | ||||||
|  |       if (++dirty == 2) { | ||||||
|  |         if (size-- <= 0U) | ||||||
|  |           goto emsgsize; | ||||||
|  |         *dst++ = (unsigned char) tmp; | ||||||
|  |         dirty = 0; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (dirty) {  /* Odd trailing nybble? */ | ||||||
|  |       if (size-- <= 0U) | ||||||
|  |         goto emsgsize; | ||||||
|  |       *dst++ = (unsigned char) (tmp << 4); | ||||||
|  |     } | ||||||
|  |   } else if (isascii(ch) && isdigit(ch)) { | ||||||
|  |     /* Decimal: eat dotted digit string. */ | ||||||
|  |     for (;;) { | ||||||
|  |       tmp = 0; | ||||||
|  |       do { | ||||||
|  |         n = (int)(strchr(digits, ch) - digits); | ||||||
|  |         tmp *= 10; | ||||||
|  |         tmp += n; | ||||||
|  |         if (tmp > 255) | ||||||
|  |           goto enoent; | ||||||
|  |       } while ((ch = *src++) != '\0' && | ||||||
|  |                isascii(ch) && isdigit(ch)); | ||||||
|  |       if (size-- <= 0U) | ||||||
|  |         goto emsgsize; | ||||||
|  |       *dst++ = (unsigned char) tmp; | ||||||
|  |       if (ch == '\0' || ch == '/') | ||||||
|  |         break; | ||||||
|  |       if (ch != '.') | ||||||
|  |         goto enoent; | ||||||
|  |       ch = *src++; | ||||||
|  |       if (!isascii(ch) || !isdigit(ch)) | ||||||
|  |         goto enoent; | ||||||
|  |     } | ||||||
|  |   } else | ||||||
|  |     goto enoent; | ||||||
|  |  | ||||||
|  |   bits = -1; | ||||||
|  |   if (ch == '/' && isascii((unsigned char)(src[0])) && | ||||||
|  |       isdigit((unsigned char)(src[0])) && dst > odst) { | ||||||
|  |     /* CIDR width specifier.  Nothing can follow it. */ | ||||||
|  |     ch = *src++;    /* Skip over the /. */ | ||||||
|  |     bits = 0; | ||||||
|  |     do { | ||||||
|  |       n = (int)(strchr(digits, ch) - digits); | ||||||
|  |       bits *= 10; | ||||||
|  |       bits += n; | ||||||
|  |     } while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch)); | ||||||
|  |     if (ch != '\0') | ||||||
|  |       goto enoent; | ||||||
|  |     if (bits > 32) | ||||||
|  |       goto emsgsize; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* Firey death and destruction unless we prefetched EOS. */ | ||||||
|  |   if (ch != '\0') | ||||||
|  |     goto enoent; | ||||||
|  |  | ||||||
|  |   /* If nothing was written to the destination, we found no address. */ | ||||||
|  |   if (dst == odst) | ||||||
|  |     goto enoent; | ||||||
|  |   /* If no CIDR spec was given, infer width from net class. */ | ||||||
|  |   if (bits == -1) { | ||||||
|  |     if (*odst >= 240)       /* Class E */ | ||||||
|  |       bits = 32; | ||||||
|  |     else if (*odst >= 224)  /* Class D */ | ||||||
|  |       bits = 8; | ||||||
|  |     else if (*odst >= 192)  /* Class C */ | ||||||
|  |       bits = 24; | ||||||
|  |     else if (*odst >= 128)  /* Class B */ | ||||||
|  |       bits = 16; | ||||||
|  |     else                    /* Class A */ | ||||||
|  |       bits = 8; | ||||||
|  |     /* If imputed mask is narrower than specified octets, widen. */ | ||||||
|  |     if (bits < ((dst - odst) * 8)) | ||||||
|  |       bits = (int)(dst - odst) * 8; | ||||||
|  |     /* | ||||||
|  |      * If there are no additional bits specified for a class D | ||||||
|  |      * address adjust bits to 4. | ||||||
|  |      */ | ||||||
|  |     if (bits == 8 && *odst == 224) | ||||||
|  |       bits = 4; | ||||||
|  |   } | ||||||
|  |   /* Extend network to cover the actual mask. */ | ||||||
|  |   while (bits > ((dst - odst) * 8)) { | ||||||
|  |     if (size-- <= 0U) | ||||||
|  |       goto emsgsize; | ||||||
|  |     *dst++ = '\0'; | ||||||
|  |   } | ||||||
|  |   return (bits); | ||||||
|  |  | ||||||
|  |   enoent: | ||||||
|  |   errno = ENOENT; | ||||||
|  |   return (-1); | ||||||
|  |  | ||||||
|  |   emsgsize: | ||||||
|  |   errno = EMSGSIZE; | ||||||
|  |   return (-1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int | ||||||
|  | getbits(const char *src, int *bitsp) | ||||||
|  | { | ||||||
|  |   static const char digits[] = "0123456789"; | ||||||
|  |   int n; | ||||||
|  |   int val; | ||||||
|  |   char ch; | ||||||
|  |  | ||||||
|  |   val = 0; | ||||||
|  |   n = 0; | ||||||
|  |   while ((ch = *src++) != '\0') { | ||||||
|  |     const char *pch; | ||||||
|  |  | ||||||
|  |     pch = strchr(digits, ch); | ||||||
|  |     if (pch != NULL) { | ||||||
|  |       if (n++ != 0 && val == 0)       /* no leading zeros */ | ||||||
|  |         return (0); | ||||||
|  |       val *= 10; | ||||||
|  |       val += (pch - digits); | ||||||
|  |       if (val > 128)                  /* range */ | ||||||
|  |         return (0); | ||||||
|  |       continue; | ||||||
|  |     } | ||||||
|  |     return (0); | ||||||
|  |   } | ||||||
|  |   if (n == 0) | ||||||
|  |     return (0); | ||||||
|  |   *bitsp = val; | ||||||
|  |   return (1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int | ||||||
|  | getv4(const char *src, unsigned char *dst, int *bitsp) | ||||||
|  | { | ||||||
|  |   static const char digits[] = "0123456789"; | ||||||
|  |   unsigned char *odst = dst; | ||||||
|  |   int n; | ||||||
|  |   unsigned int val; | ||||||
|  |   char ch; | ||||||
|  |  | ||||||
|  |   val = 0; | ||||||
|  |   n = 0; | ||||||
|  |   while ((ch = *src++) != '\0') { | ||||||
|  |     const char *pch; | ||||||
|  |  | ||||||
|  |     pch = strchr(digits, ch); | ||||||
|  |     if (pch != NULL) { | ||||||
|  |       if (n++ != 0 && val == 0)       /* no leading zeros */ | ||||||
|  |         return (0); | ||||||
|  |       val *= 10; | ||||||
|  |       val += (pch - digits); | ||||||
|  |       if (val > 255)                  /* range */ | ||||||
|  |         return (0); | ||||||
|  |       continue; | ||||||
|  |     } | ||||||
|  |     if (ch == '.' || ch == '/') { | ||||||
|  |       if (dst - odst > 3)             /* too many octets? */ | ||||||
|  |         return (0); | ||||||
|  |       *dst++ = val; | ||||||
|  |       if (ch == '/') | ||||||
|  |         return (getbits(src, bitsp)); | ||||||
|  |       val = 0; | ||||||
|  |       n = 0; | ||||||
|  |       continue; | ||||||
|  |     } | ||||||
|  |     return (0); | ||||||
|  |   } | ||||||
|  |   if (n == 0) | ||||||
|  |     return (0); | ||||||
|  |   if (dst - odst > 3)             /* too many octets? */ | ||||||
|  |     return (0); | ||||||
|  |   *dst++ = val; | ||||||
|  |   return (1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int | ||||||
|  | inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) | ||||||
|  | { | ||||||
|  |   static const char xdigits_l[] = "0123456789abcdef", | ||||||
|  |     xdigits_u[] = "0123456789ABCDEF"; | ||||||
|  |   unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; | ||||||
|  |   const char *xdigits, *curtok; | ||||||
|  |   int ch, saw_xdigit; | ||||||
|  |   unsigned int val; | ||||||
|  |   int digits; | ||||||
|  |   int bits; | ||||||
|  |   size_t bytes; | ||||||
|  |   int words; | ||||||
|  |   int ipv4; | ||||||
|  |  | ||||||
|  |   memset((tp = tmp), '\0', NS_IN6ADDRSZ); | ||||||
|  |   endp = tp + NS_IN6ADDRSZ; | ||||||
|  |   colonp = NULL; | ||||||
|  |   /* Leading :: requires some special handling. */ | ||||||
|  |   if (*src == ':') | ||||||
|  |     if (*++src != ':') | ||||||
|  |       goto enoent; | ||||||
|  |   curtok = src; | ||||||
|  |   saw_xdigit = 0; | ||||||
|  |   val = 0; | ||||||
|  |   digits = 0; | ||||||
|  |   bits = -1; | ||||||
|  |   ipv4 = 0; | ||||||
|  |   while ((ch = *src++) != '\0') { | ||||||
|  |     const char *pch; | ||||||
|  |  | ||||||
|  |     if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) | ||||||
|  |       pch = strchr((xdigits = xdigits_u), ch); | ||||||
|  |     if (pch != NULL) { | ||||||
|  |       val <<= 4; | ||||||
|  |       val |= (pch - xdigits); | ||||||
|  |       if (++digits > 4) | ||||||
|  |         goto enoent; | ||||||
|  |       saw_xdigit = 1; | ||||||
|  |       continue; | ||||||
|  |     } | ||||||
|  |     if (ch == ':') { | ||||||
|  |       curtok = src; | ||||||
|  |       if (!saw_xdigit) { | ||||||
|  |         if (colonp) | ||||||
|  |           goto enoent; | ||||||
|  |         colonp = tp; | ||||||
|  |         continue; | ||||||
|  |       } else if (*src == '\0') | ||||||
|  |         goto enoent; | ||||||
|  |       if (tp + NS_INT16SZ > endp) | ||||||
|  |         return (0); | ||||||
|  |       *tp++ = (unsigned char) (val >> 8) & 0xff; | ||||||
|  |       *tp++ = (unsigned char) val & 0xff; | ||||||
|  |       saw_xdigit = 0; | ||||||
|  |       digits = 0; | ||||||
|  |       val = 0; | ||||||
|  |       continue; | ||||||
|  |     } | ||||||
|  |     if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && | ||||||
|  |         getv4(curtok, tp, &bits) > 0) { | ||||||
|  |       tp += NS_INADDRSZ; | ||||||
|  |       saw_xdigit = 0; | ||||||
|  |       ipv4 = 1; | ||||||
|  |       break;  /* '\0' was seen by inet_pton4(). */ | ||||||
|  |     } | ||||||
|  |     if (ch == '/' && getbits(src, &bits) > 0) | ||||||
|  |       break; | ||||||
|  |     goto enoent; | ||||||
|  |   } | ||||||
|  |   if (saw_xdigit) { | ||||||
|  |     if (tp + NS_INT16SZ > endp) | ||||||
|  |       goto enoent; | ||||||
|  |     *tp++ = (unsigned char) (val >> 8) & 0xff; | ||||||
|  |     *tp++ = (unsigned char) val & 0xff; | ||||||
|  |   } | ||||||
|  |   if (bits == -1) | ||||||
|  |     bits = 128; | ||||||
|  |  | ||||||
|  |   words = (bits + 15) / 16; | ||||||
|  |   if (words < 2) | ||||||
|  |     words = 2; | ||||||
|  |   if (ipv4) | ||||||
|  |     words = 8; | ||||||
|  |   endp =  tmp + 2 * words; | ||||||
|  |  | ||||||
|  |   if (colonp != NULL) { | ||||||
|  |     /* | ||||||
|  |      * Since some memmove()'s erroneously fail to handle | ||||||
|  |      * overlapping regions, we'll do the shift by hand. | ||||||
|  |      */ | ||||||
|  |     const int n = (int)(tp - colonp); | ||||||
|  |     int i; | ||||||
|  |  | ||||||
|  |     if (tp == endp) | ||||||
|  |       goto enoent; | ||||||
|  |     for (i = 1; i <= n; i++) { | ||||||
|  |       endp[- i] = colonp[n - i]; | ||||||
|  |       colonp[n - i] = 0; | ||||||
|  |     } | ||||||
|  |     tp = endp; | ||||||
|  |   } | ||||||
|  |   if (tp != endp) | ||||||
|  |     goto enoent; | ||||||
|  |  | ||||||
|  |   bytes = (bits + 7) / 8; | ||||||
|  |   if (bytes > size) | ||||||
|  |     goto emsgsize; | ||||||
|  |   memcpy(dst, tmp, bytes); | ||||||
|  |   return (bits); | ||||||
|  |  | ||||||
|  |   enoent: | ||||||
|  |   errno = ENOENT; | ||||||
|  |   return (-1); | ||||||
|  |  | ||||||
|  |   emsgsize: | ||||||
|  |   errno = EMSGSIZE; | ||||||
|  |   return (-1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * int | ||||||
|  |  * inet_net_pton(af, src, dst, size) | ||||||
|  |  *      convert network number from presentation to network format. | ||||||
|  |  *      accepts hex octets, hex strings, decimal octets, and /CIDR. | ||||||
|  |  *      "size" is in bytes and describes "dst". | ||||||
|  |  * return: | ||||||
|  |  *      number of bits, either imputed classfully or specified with /CIDR, | ||||||
|  |  *      or -1 if some failure occurred (check errno).  ENOENT means it was | ||||||
|  |  *      not a valid network specification. | ||||||
|  |  * author: | ||||||
|  |  *      Paul Vixie (ISC), June 1996 | ||||||
|  |  */ | ||||||
|  | int | ||||||
|  | ares_inet_net_pton(int af, const char *src, void *dst, size_t size) | ||||||
|  | { | ||||||
|  |   switch (af) { | ||||||
|  |   case AF_INET: | ||||||
|  |     return (inet_net_pton_ipv4(src, dst, size)); | ||||||
|  |   case AF_INET6: | ||||||
|  |     return (inet_net_pton_ipv6(src, dst, size)); | ||||||
|  |   default: | ||||||
|  |     errno = EAFNOSUPPORT; | ||||||
|  |     return (-1); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if !defined(HAVE_INET_PTON) || !defined(HAVE_INET_PTON_IPV6) | ||||||
|  | int ares_inet_pton(int af, const char *src, void *dst) | ||||||
|  | { | ||||||
|  |   int size, result; | ||||||
|  |  | ||||||
|  |   if (af == AF_INET) | ||||||
|  |     size = sizeof(struct in_addr); | ||||||
|  |   else if (af == AF_INET6) | ||||||
|  |     size = sizeof(struct in6_addr); | ||||||
|  |   else | ||||||
|  |   { | ||||||
|  |     errno = EAFNOSUPPORT; | ||||||
|  |     return -1; | ||||||
|  |   } | ||||||
|  |   result = ares_inet_net_pton(af, src, dst, size); | ||||||
|  |   if (result == -1 && errno == ENOENT) | ||||||
|  |     return 0; | ||||||
|  |   return (result > -1 ? 1 : -1); | ||||||
|  | } | ||||||
|  | #endif | ||||||
							
								
								
									
										31
									
								
								ares/inet_net_pton.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								ares/inet_net_pton.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Permission to use, copy, modify, and distribute this | ||||||
|  |  * software and its documentation for any purpose and without | ||||||
|  |  * fee is hereby granted, provided that the above copyright | ||||||
|  |  * notice appear in all copies and that both that copyright | ||||||
|  |  * notice and this permission notice appear in supporting | ||||||
|  |  * documentation, and that the name of M.I.T. not be used in | ||||||
|  |  * advertising or publicity pertaining to distribution of the | ||||||
|  |  * software without specific, written prior permission. | ||||||
|  |  * M.I.T. makes no representations about the suitability of | ||||||
|  |  * this software for any purpose.  It is provided "as is" | ||||||
|  |  * without express or implied warranty. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef INET_NET_PTON_H | ||||||
|  | #define INET_NET_PTON_H | ||||||
|  |  | ||||||
|  | #if defined(HAVE_INET_PTON) && defined(HAVE_INET_PTON_IPV6) | ||||||
|  | #define ares_inet_pton(x,y,z) inet_pton(x,y,z) | ||||||
|  | #else | ||||||
|  | int ares_inet_pton(int af, const char *src, void *dst); | ||||||
|  | #endif | ||||||
|  | #if defined(HAVE_INET_NET_PTON) && defined(HAVE_INET_NET_PTON_IPV6) | ||||||
|  | #define ares_inet_net_pton(w,x,y,z) inet_net_pton(w,x,y,z) | ||||||
|  | #else | ||||||
|  | int ares_inet_net_pton(int af, const char *src, void *dst, size_t size); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif /* INET_NET_PTON_H */ | ||||||
							
								
								
									
										220
									
								
								ares/inet_ntop.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								ares/inet_ntop.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,220 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
|  | /* Copyright (c) 1996 by Internet Software Consortium. | ||||||
|  |  * | ||||||
|  |  * Permission to use, copy, modify, and distribute this software for any | ||||||
|  |  * purpose with or without fee is hereby granted, provided that the above | ||||||
|  |  * copyright notice and this permission notice appear in all copies. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS | ||||||
|  |  * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES | ||||||
|  |  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE | ||||||
|  |  * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | ||||||
|  |  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR | ||||||
|  |  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS | ||||||
|  |  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | ||||||
|  |  * SOFTWARE. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "setup.h" | ||||||
|  |  | ||||||
|  | #include <sys/types.h> | ||||||
|  |  | ||||||
|  | #if defined(WIN32) && !defined(WATT32) | ||||||
|  | #include "nameser.h" | ||||||
|  | #else | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_ARPA_NAMESER_H | ||||||
|  | #include <arpa/nameser.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_ARPA_INET_H | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <ctype.h> | ||||||
|  | #include <errno.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  |  | ||||||
|  | #include "ares_ipv6.h" | ||||||
|  | #include "inet_ntop.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if !defined(HAVE_INET_NTOP) || !defined(HAVE_INET_NTOP_IPV6) | ||||||
|  |  | ||||||
|  | #ifdef SPRINTF_CHAR | ||||||
|  | # define SPRINTF(x) strlen(sprintf/**/x) | ||||||
|  | #else | ||||||
|  | # define SPRINTF(x) ((size_t)sprintf x) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * WARNING: Don't even consider trying to compile this on a system where | ||||||
|  |  * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | static const char *inet_ntop4(const unsigned char *src, char *dst, size_t size); | ||||||
|  | static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size); | ||||||
|  |  | ||||||
|  | /* char * | ||||||
|  |  * inet_ntop(af, src, dst, size) | ||||||
|  |  *     convert a network format address to presentation format. | ||||||
|  |  * return: | ||||||
|  |  *     pointer to presentation format address (`dst'), or NULL (see errno). | ||||||
|  |  * author: | ||||||
|  |  *     Paul Vixie, 1996. | ||||||
|  |  */ | ||||||
|  | const char * | ||||||
|  | ares_inet_ntop(int af, const void *src, char *dst, size_t size) | ||||||
|  | { | ||||||
|  |   switch (af) | ||||||
|  |     { | ||||||
|  |     case AF_INET: | ||||||
|  |       return (inet_ntop4(src, dst, size)); | ||||||
|  |     case AF_INET6: | ||||||
|  |       return (inet_ntop6(src, dst, size)); | ||||||
|  |     default: | ||||||
|  |       errno = EAFNOSUPPORT; | ||||||
|  |       return (NULL); | ||||||
|  |     } | ||||||
|  |   /* NOTREACHED */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* const char * | ||||||
|  |  * inet_ntop4(src, dst, size) | ||||||
|  |  *     format an IPv4 address, more or less like inet_ntoa() | ||||||
|  |  * return: | ||||||
|  |  *     `dst' (as a const) | ||||||
|  |  * notes: | ||||||
|  |  *     (1) uses no statics | ||||||
|  |  *     (2) takes a unsigned char* not an in_addr as input | ||||||
|  |  * author: | ||||||
|  |  *     Paul Vixie, 1996. | ||||||
|  |  */ | ||||||
|  | static const char * | ||||||
|  | inet_ntop4(const unsigned char *src, char *dst, size_t size) | ||||||
|  | { | ||||||
|  |   static const char fmt[] = "%u.%u.%u.%u"; | ||||||
|  |   char tmp[sizeof "255.255.255.255"]; | ||||||
|  |  | ||||||
|  |   if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) | ||||||
|  |     { | ||||||
|  |       errno = ENOSPC; | ||||||
|  |       return (NULL); | ||||||
|  |     } | ||||||
|  |     strcpy(dst, tmp); | ||||||
|  |     return (dst); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* const char * | ||||||
|  |  * inet_ntop6(src, dst, size) | ||||||
|  |  *    convert IPv6 binary address into presentation (printable) format | ||||||
|  |  * author: | ||||||
|  |  *    Paul Vixie, 1996. | ||||||
|  |  */ | ||||||
|  | static const char * | ||||||
|  | inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||||
|  | { | ||||||
|  |   /* | ||||||
|  |    * Note that int32_t and int16_t need only be "at least" large enough | ||||||
|  |    * to contain a value of the specified size.  On some systems, like | ||||||
|  |    * Crays, there is no such thing as an integer variable with 16 bits. | ||||||
|  |    * Keep this in mind if you think this function should have been coded | ||||||
|  |    * to use pointer overlays.  All the world's not a VAX. | ||||||
|  |    */ | ||||||
|  |   char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; | ||||||
|  |   struct { int base, len; } best = { 0,0 }, cur = { 0,0 }; | ||||||
|  |   unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; | ||||||
|  |   int i; | ||||||
|  |  | ||||||
|  |   /* | ||||||
|  |    * Preprocess: | ||||||
|  |    *  Copy the input (bytewise) array into a wordwise array. | ||||||
|  |    *  Find the longest run of 0x00's in src[] for :: shorthanding. | ||||||
|  |    */ | ||||||
|  |   memset(words, '\0', sizeof words); | ||||||
|  |   for (i = 0; i < NS_IN6ADDRSZ; i++) | ||||||
|  |       words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); | ||||||
|  |   best.base = -1; | ||||||
|  |   cur.base = -1; | ||||||
|  |   for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) | ||||||
|  |     { | ||||||
|  |       if (words[i] == 0) | ||||||
|  |         { | ||||||
|  |           if (cur.base == -1) | ||||||
|  |             cur.base = i, cur.len = 1; | ||||||
|  |           else | ||||||
|  |             cur.len++; | ||||||
|  |         } | ||||||
|  |       else | ||||||
|  |         { | ||||||
|  |           if (cur.base != -1) | ||||||
|  |             { | ||||||
|  |               if (best.base == -1 || cur.len > best.len) | ||||||
|  |                 best = cur; | ||||||
|  |               cur.base = -1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |   if (cur.base != -1) | ||||||
|  |     { | ||||||
|  |       if (best.base == -1 || cur.len > best.len) | ||||||
|  |         best = cur; | ||||||
|  |     } | ||||||
|  |   if (best.base != -1 && best.len < 2) | ||||||
|  |     best.base = -1; | ||||||
|  |  | ||||||
|  |   /* | ||||||
|  |    * Format the result. | ||||||
|  |    */ | ||||||
|  |   tp = tmp; | ||||||
|  |   for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) | ||||||
|  |     { | ||||||
|  |       /* Are we inside the best run of 0x00's? */ | ||||||
|  |       if (best.base != -1 && i >= best.base && | ||||||
|  |           i < (best.base + best.len)) | ||||||
|  |         { | ||||||
|  |           if (i == best.base) | ||||||
|  |              *tp++ = ':'; | ||||||
|  |           continue; | ||||||
|  |         } | ||||||
|  |       /* Are we following an initial run of 0x00s or any real hex? */ | ||||||
|  |       if (i != 0) | ||||||
|  |         *tp++ = ':'; | ||||||
|  |       /* Is this address an encapsulated IPv4? */ | ||||||
|  |       if (i == 6 && best.base == 0 && | ||||||
|  |           (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) | ||||||
|  |         { | ||||||
|  |           if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) | ||||||
|  |             return (NULL); | ||||||
|  |           tp += strlen(tp); | ||||||
|  |           break; | ||||||
|  |         } | ||||||
|  |         tp += SPRINTF((tp, "%x", words[i])); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   /* Was it a trailing run of 0x00's? */ | ||||||
|  |   if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) | ||||||
|  |     *tp++ = ':'; | ||||||
|  |   *tp++ = '\0'; | ||||||
|  |  | ||||||
|  |   /* | ||||||
|  |    * Check for overflow, copy, and we're done. | ||||||
|  |    */ | ||||||
|  |   if ((size_t)(tp - tmp) > size) | ||||||
|  |     { | ||||||
|  |       errno = ENOSPC; | ||||||
|  |       return (NULL); | ||||||
|  |     } | ||||||
|  |   strcpy(dst, tmp); | ||||||
|  |   return (dst); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
							
								
								
									
										26
									
								
								ares/inet_ntop.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								ares/inet_ntop.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Permission to use, copy, modify, and distribute this | ||||||
|  |  * software and its documentation for any purpose and without | ||||||
|  |  * fee is hereby granted, provided that the above copyright | ||||||
|  |  * notice appear in all copies and that both that copyright | ||||||
|  |  * notice and this permission notice appear in supporting | ||||||
|  |  * documentation, and that the name of M.I.T. not be used in | ||||||
|  |  * advertising or publicity pertaining to distribution of the | ||||||
|  |  * software without specific, written prior permission. | ||||||
|  |  * M.I.T. makes no representations about the suitability of | ||||||
|  |  * this software for any purpose.  It is provided "as is" | ||||||
|  |  * without express or implied warranty. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef INET_NTOP_H | ||||||
|  | #define INET_NTOP_H | ||||||
|  |  | ||||||
|  | #ifdef HAVE_INET_NTOP | ||||||
|  | #define ares_inet_ntop(w,x,y,z) inet_ntop(w,x,y,z) | ||||||
|  | #else | ||||||
|  | const char *ares_inet_ntop(int af, const void *src, char *dst, size_t size); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif /* INET_NET_NTOP_H */ | ||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| #ifndef ARES_NAMESER_H | #ifndef ARES_NAMESER_H | ||||||
| #define ARES_NAMESER_H | #define ARES_NAMESER_H | ||||||
|  |  | ||||||
| @@ -16,6 +18,8 @@ | |||||||
|  |  | ||||||
| #define EINPROGRESS WSAEINPROGRESS | #define EINPROGRESS WSAEINPROGRESS | ||||||
| #define EWOULDBLOCK WSAEWOULDBLOCK | #define EWOULDBLOCK WSAEWOULDBLOCK | ||||||
|  | #define EMSGSIZE     WSAEMSGSIZE | ||||||
|  | #define EAFNOSUPPORT WSAEAFNOSUPPORT | ||||||
|  |  | ||||||
| /* Structure for scatter/gather I/O.  */ | /* Structure for scatter/gather I/O.  */ | ||||||
| struct iovec | struct iovec | ||||||
| @@ -37,7 +41,9 @@ int ares_gettimeofday(struct timeval *tv, struct timezone *tz); | |||||||
| #endif  /* !NETWARE */ | #endif  /* !NETWARE */ | ||||||
|  |  | ||||||
| #define NS_CMPRSFLGS  0xc0 | #define NS_CMPRSFLGS  0xc0 | ||||||
|  | #define NS_IN6ADDRSZ  16 | ||||||
|  | #define NS_INT16SZ    2 | ||||||
|  | #define NS_INADDRSZ   4 | ||||||
|  |  | ||||||
|   /* Flag bits indicating name compression. */ |   /* Flag bits indicating name compression. */ | ||||||
| #define INDIR_MASK    NS_CMPRSFLGS | #define INDIR_MASK    NS_CMPRSFLGS | ||||||
|   | |||||||
							
								
								
									
										102
									
								
								ares/setup.h
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								ares/setup.h
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | |||||||
| #ifndef ARES_SETUP_H | #ifndef __ARES_SETUP_H | ||||||
| #define ARES_SETUP_H | #define __ARES_SETUP_H | ||||||
|  |  | ||||||
| /* Copyright (C) 2004 by Daniel Stenberg et al | /* Copyright (C) 2004 - 2005 by Daniel Stenberg et al | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this software and its |  * Permission to use, copy, modify, and distribute this software and its | ||||||
|  * documentation for any purpose and without fee is hereby granted, provided |  * documentation for any purpose and without fee is hereby granted, provided | ||||||
| @@ -14,16 +14,79 @@ | |||||||
|  * without express or implied warranty. |  * without express or implied warranty. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | #if !defined(WIN32) && defined(__WIN32__) | ||||||
|  | /* Borland fix */ | ||||||
|  | #define WIN32 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if !defined(WIN32) && defined(_WIN32) | ||||||
|  | /* VS2005 on x64 fix */ | ||||||
|  | #define WIN32 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Include configuration script results or hand-crafted | ||||||
|  |  * configuration file for platforms which lack config tool. | ||||||
|  |  */ | ||||||
|  |  | ||||||
| #ifdef HAVE_CONFIG_H | #ifdef HAVE_CONFIG_H | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #else | #else | ||||||
| /* simple work-around for now, for systems without configure support */ |  | ||||||
|  | #ifdef WIN32 | ||||||
|  | #include "config-win32.h" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif /* HAVE_CONFIG_H */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Include header files for windows builds before redefining anything. | ||||||
|  |  * Use this preproessor block only to include or exclude windows.h, | ||||||
|  |  * winsock2.h, ws2tcpip.h or winsock.h. Any other windows thing belongs | ||||||
|  |  * to any other further and independant block. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifdef HAVE_WINDOWS_H | ||||||
|  | #  ifndef WIN32_LEAN_AND_MEAN | ||||||
|  | #    define WIN32_LEAN_AND_MEAN | ||||||
|  | #  endif | ||||||
|  | #  include <windows.h> | ||||||
|  | #  ifdef HAVE_WINSOCK2_H | ||||||
|  | #    include <winsock2.h> | ||||||
|  | #    ifdef HAVE_WS2TCPIP_H | ||||||
|  | #       include <ws2tcpip.h> | ||||||
|  | #    endif | ||||||
|  | #  else | ||||||
|  | #    ifdef HAVE_WINSOCK_H | ||||||
|  | #      include <winsock.h> | ||||||
|  | #    endif | ||||||
|  | #  endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Work-arounds for systems without configure support | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef HAVE_CONFIG_H | ||||||
|  |  | ||||||
|  | #if defined(__DJGPP__) || (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || \ | ||||||
|  |     defined(__POCC__) | ||||||
|  | #else | ||||||
| #define ssize_t int | #define ssize_t int | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Recent autoconf versions define these symbols in config.h. We don't want | #ifndef HAVE_WS2TCPIP_H | ||||||
|    them (since they collide with the libcurl ones when we build | #define socklen_t int | ||||||
|    --enable-debug) so we undef them again here. */ | #endif | ||||||
|  |  | ||||||
|  | #endif /* HAVE_CONFIG_H */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Recent autoconf versions define these symbols in config.h. We don't | ||||||
|  |  * want them (since they collide with the libcurl ones when we build | ||||||
|  |  *  --enable-debug) so we undef them again here. | ||||||
|  |  */ | ||||||
|  |  | ||||||
| #undef PACKAGE_STRING | #undef PACKAGE_STRING | ||||||
| #undef PACKAGE_TARNAME | #undef PACKAGE_TARNAME | ||||||
| #undef PACKAGE_VERSION | #undef PACKAGE_VERSION | ||||||
| @@ -32,9 +95,11 @@ | |||||||
| #undef VERSION | #undef VERSION | ||||||
| #undef PACKAGE | #undef PACKAGE | ||||||
|  |  | ||||||
| /* now typedef our socket type */ | /* | ||||||
|  |  * Typedef our socket type | ||||||
|  |  */ | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include <winsock.h> |  | ||||||
| typedef SOCKET ares_socket_t; | typedef SOCKET ares_socket_t; | ||||||
| #define ARES_SOCKET_BAD INVALID_SOCKET | #define ARES_SOCKET_BAD INVALID_SOCKET | ||||||
| #else | #else | ||||||
| @@ -42,14 +107,16 @@ typedef int ares_socket_t; | |||||||
| #define ARES_SOCKET_BAD -1 | #define ARES_SOCKET_BAD -1 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Assume a few thing unless they're set by configure | /* | ||||||
|  |  * Assume a few thing unless they're set by configure | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) | #if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) | ||||||
| #define HAVE_SYS_TIME_H | #define HAVE_SYS_TIME_H | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER) | #if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER) | ||||||
| #define HAVE_UNISTD_H  | #define HAVE_UNISTD_H 1 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS) | #if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS) | ||||||
| @@ -57,7 +124,7 @@ typedef int ares_socket_t; | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if (defined(WIN32) || defined(WATT32)) && \ | #if (defined(WIN32) || defined(WATT32)) && \ | ||||||
|    !(defined(__MINGW32__) || defined(NETWARE)) |    !(defined(__MINGW32__) || defined(NETWARE) || defined(__DJGPP__)) | ||||||
| /* protos for the functions we provide in windows_port.c */ | /* protos for the functions we provide in windows_port.c */ | ||||||
| int ares_strncasecmp(const char *s1, const char *s2, int n); | int ares_strncasecmp(const char *s1, const char *s2, int n); | ||||||
| int ares_strcasecmp(const char *s1, const char *s2); | int ares_strcasecmp(const char *s1, const char *s2); | ||||||
| @@ -69,4 +136,13 @@ int ares_strcasecmp(const char *s1, const char *s2); | |||||||
| #define strcasecmp(a,b) ares_strcasecmp(a,b) | #define strcasecmp(a,b) ares_strcasecmp(a,b) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* ARES_SETUP_H */ | /* IPv6 compatibility */ | ||||||
|  | #if !defined(HAVE_AF_INET6) | ||||||
|  | #if defined(HAVE_PF_INET6) | ||||||
|  | #define AF_INET6 PF_INET6 | ||||||
|  | #else | ||||||
|  | #define AF_INET6 AF_MAX+1 | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif /* __ARES_SETUP_H */ | ||||||
|   | |||||||
| @@ -1,213 +0,0 @@ | |||||||
| # Microsoft Developer Studio Generated NMAKE File, Based on adig.dsp |  | ||||||
| !IF "$(CFG)" == "" |  | ||||||
| CFG=adig - Win32 Debug |  | ||||||
| !MESSAGE No configuration specified. Defaulting to adig - Win32 Debug. |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| !IF "$(CFG)" != "adig - Win32 Release" && "$(CFG)" != "adig - Win32 Debug" |  | ||||||
| !MESSAGE Invalid configuration "$(CFG)" specified. |  | ||||||
| !MESSAGE You can specify a configuration when running NMAKE |  | ||||||
| !MESSAGE by defining the macro CFG on the command line. For example: |  | ||||||
| !MESSAGE  |  | ||||||
| !MESSAGE NMAKE /f "adig.mak" CFG="adig - Win32 Debug" |  | ||||||
| !MESSAGE  |  | ||||||
| !MESSAGE Possible choices for configuration are: |  | ||||||
| !MESSAGE  |  | ||||||
| !MESSAGE "adig - Win32 Release" (based on "Win32 (x86) Console Application") |  | ||||||
| !MESSAGE "adig - Win32 Debug" (based on "Win32 (x86) Console Application") |  | ||||||
| !MESSAGE  |  | ||||||
| !ERROR An invalid configuration is specified. |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| !IF "$(OS)" == "Windows_NT" |  | ||||||
| NULL= |  | ||||||
| !ELSE  |  | ||||||
| NULL=nul |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| CPP=cl.exe |  | ||||||
| RSC=rc.exe |  | ||||||
|  |  | ||||||
| !IF  "$(CFG)" == "adig - Win32 Release" |  | ||||||
|  |  | ||||||
| OUTDIR=.\Release |  | ||||||
| INTDIR=.\Release |  | ||||||
| # Begin Custom Macros |  | ||||||
| OutDir=.\Release |  | ||||||
| # End Custom Macros |  | ||||||
|  |  | ||||||
| !IF "$(RECURSE)" == "0"  |  | ||||||
|  |  | ||||||
| ALL : "$(OUTDIR)\adig.exe" |  | ||||||
|  |  | ||||||
| !ELSE  |  | ||||||
|  |  | ||||||
| ALL : "areslib - Win32 Release" "$(OUTDIR)\adig.exe" |  | ||||||
|  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| !IF "$(RECURSE)" == "1"  |  | ||||||
| CLEAN :"areslib - Win32 ReleaseCLEAN"  |  | ||||||
| !ELSE  |  | ||||||
| CLEAN : |  | ||||||
| !ENDIF  |  | ||||||
| 	-@erase "$(INTDIR)\adig.obj" |  | ||||||
| 	-@erase "$(INTDIR)\getopt.obj" |  | ||||||
| 	-@erase "$(INTDIR)\vc60.idb" |  | ||||||
| 	-@erase "$(OUTDIR)\adig.exe" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)" : |  | ||||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" |  | ||||||
|  |  | ||||||
| CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\adig.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c  |  | ||||||
| BSC32=bscmake.exe |  | ||||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\adig.bsc"  |  | ||||||
| BSC32_SBRS= \ |  | ||||||
| 	 |  | ||||||
| LINK32=link.exe |  | ||||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\adig.pdb" /machine:I386 /out:"$(OUTDIR)\adig.exe" /libpath:"..\areslib\Release"  |  | ||||||
| LINK32_OBJS= \ |  | ||||||
| 	"$(INTDIR)\adig.obj" \ |  | ||||||
| 	"$(INTDIR)\getopt.obj" \ |  | ||||||
| 	"..\areslib\Release\areslib.lib" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)\adig.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) |  | ||||||
|     $(LINK32) @<< |  | ||||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) |  | ||||||
| << |  | ||||||
|  |  | ||||||
| !ELSEIF  "$(CFG)" == "adig - Win32 Debug" |  | ||||||
|  |  | ||||||
| OUTDIR=.\Debug |  | ||||||
| INTDIR=.\Debug |  | ||||||
| # Begin Custom Macros |  | ||||||
| OutDir=.\Debug |  | ||||||
| # End Custom Macros |  | ||||||
|  |  | ||||||
| !IF "$(RECURSE)" == "0"  |  | ||||||
|  |  | ||||||
| ALL : "$(OUTDIR)\adig.exe" |  | ||||||
|  |  | ||||||
| !ELSE  |  | ||||||
|  |  | ||||||
| ALL : "areslib - Win32 Debug" "$(OUTDIR)\adig.exe" |  | ||||||
|  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| !IF "$(RECURSE)" == "1"  |  | ||||||
| CLEAN :"areslib - Win32 DebugCLEAN"  |  | ||||||
| !ELSE  |  | ||||||
| CLEAN : |  | ||||||
| !ENDIF  |  | ||||||
| 	-@erase "$(INTDIR)\adig.obj" |  | ||||||
| 	-@erase "$(INTDIR)\getopt.obj" |  | ||||||
| 	-@erase "$(INTDIR)\vc60.idb" |  | ||||||
| 	-@erase "$(INTDIR)\vc60.pdb" |  | ||||||
| 	-@erase "$(OUTDIR)\adig.exe" |  | ||||||
| 	-@erase "$(OUTDIR)\adig.ilk" |  | ||||||
| 	-@erase "$(OUTDIR)\adig.pdb" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)" : |  | ||||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" |  | ||||||
|  |  | ||||||
| CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\adig.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ  /c  |  | ||||||
| BSC32=bscmake.exe |  | ||||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\adig.bsc"  |  | ||||||
| BSC32_SBRS= \ |  | ||||||
| 	 |  | ||||||
| LINK32=link.exe |  | ||||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\adig.pdb" /debug /machine:I386 /out:"$(OUTDIR)\adig.exe" /pdbtype:sept /libpath:"..\areslib\Debug"  |  | ||||||
| LINK32_OBJS= \ |  | ||||||
| 	"$(INTDIR)\adig.obj" \ |  | ||||||
| 	"$(INTDIR)\getopt.obj" \ |  | ||||||
| 	"..\areslib\Debug\areslib.lib" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)\adig.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) |  | ||||||
|     $(LINK32) @<< |  | ||||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) |  | ||||||
| << |  | ||||||
|  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| .c{$(INTDIR)}.obj:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cpp{$(INTDIR)}.obj:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cxx{$(INTDIR)}.obj:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .c{$(INTDIR)}.sbr:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cpp{$(INTDIR)}.sbr:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cxx{$(INTDIR)}.sbr:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !IF "$(NO_EXTERNAL_DEPS)" != "1" |  | ||||||
| !IF EXISTS("adig.dep") |  | ||||||
| !INCLUDE "adig.dep" |  | ||||||
| !ELSE  |  | ||||||
| !MESSAGE Warning: cannot find "adig.dep" |  | ||||||
| !ENDIF  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !IF "$(CFG)" == "adig - Win32 Release" || "$(CFG)" == "adig - Win32 Debug" |  | ||||||
| SOURCE=..\..\adig.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\adig.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\getopt.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\getopt.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !IF  "$(CFG)" == "adig - Win32 Release" |  | ||||||
|  |  | ||||||
| "areslib - Win32 Release" :  |  | ||||||
|    cd "\ARES-1.1.1\vc\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"  |  | ||||||
|    cd "..\adig" |  | ||||||
|  |  | ||||||
| "areslib - Win32 ReleaseCLEAN" :  |  | ||||||
|    cd "\ARES-1.1.1\vc\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN  |  | ||||||
|    cd "..\adig" |  | ||||||
|  |  | ||||||
| !ELSEIF  "$(CFG)" == "adig - Win32 Debug" |  | ||||||
|  |  | ||||||
| "areslib - Win32 Debug" :  |  | ||||||
|    cd "\ARES-1.1.1\vc\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"  |  | ||||||
|    cd "..\adig" |  | ||||||
|  |  | ||||||
| "areslib - Win32 DebugCLEAN" :  |  | ||||||
|    cd "\ARES-1.1.1\vc\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN  |  | ||||||
|    cd "..\adig" |  | ||||||
|  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| @@ -1,77 +0,0 @@ | |||||||
| <html> |  | ||||||
| <body> |  | ||||||
| <pre> |  | ||||||
| <h1>Build Log</h1> |  | ||||||
| <h3> |  | ||||||
| --------------------Configuration: areslib - Win32 Release-------------------- |  | ||||||
| </h3> |  | ||||||
| <h3>Command Lines</h3> |  | ||||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615A.tmp" with contents |  | ||||||
| [ |  | ||||||
| /nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"Release/areslib.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c  |  | ||||||
| "Z:\ARES-1.1.1\ares_gethostbyname.c" |  | ||||||
| "Z:\ARES-1.1.1\ares_init.c" |  | ||||||
| ] |  | ||||||
| Creating command line "cl.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615A.tmp"  |  | ||||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615B.tmp" with contents |  | ||||||
| [ |  | ||||||
| /nologo /out:"Release\areslib.lib"  |  | ||||||
| ".\Release\ares__close_sockets.obj" |  | ||||||
| ".\Release\ares__get_hostent.obj" |  | ||||||
| ".\Release\ares__read_line.obj" |  | ||||||
| ".\Release\ares_destroy.obj" |  | ||||||
| ".\Release\ares_expand_name.obj" |  | ||||||
| ".\Release\ares_fds.obj" |  | ||||||
| ".\Release\ares_free_errmem.obj" |  | ||||||
| ".\Release\ares_free_hostent.obj" |  | ||||||
| ".\Release\ares_free_string.obj" |  | ||||||
| ".\Release\ares_gethostbyaddr.obj" |  | ||||||
| ".\Release\ares_gethostbyname.obj" |  | ||||||
| ".\Release\ares_init.obj" |  | ||||||
| ".\Release\ares_mkquery.obj" |  | ||||||
| ".\Release\ares_parse_a_reply.obj" |  | ||||||
| ".\Release\ares_parse_ptr_reply.obj" |  | ||||||
| ".\Release\ares_process.obj" |  | ||||||
| ".\Release\ares_query.obj" |  | ||||||
| ".\Release\ares_search.obj" |  | ||||||
| ".\Release\ares_send.obj" |  | ||||||
| ".\Release\ares_strerror.obj" |  | ||||||
| ".\Release\ares_timeout.obj" |  | ||||||
| ".\Release\windows_port.obj" |  | ||||||
| ] |  | ||||||
| Creating command line "link.exe -lib @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615B.tmp" |  | ||||||
| <h3>Output Window</h3> |  | ||||||
| Compiling... |  | ||||||
| ares_gethostbyname.c |  | ||||||
| Z:\ARES-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| ares_init.c |  | ||||||
| Z:\ARES-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| Z:\ARES-1.1.1\ares_init.c(141) : warning C4013: '_getpid' undefined; assuming extern returning int |  | ||||||
| Z:\ARES-1.1.1\ares_init.c(236) : warning C4101: 'p' : unreferenced local variable |  | ||||||
| Z:\ARES-1.1.1\ares_init.c(237) : warning C4101: 'linesize' : unreferenced local variable |  | ||||||
| Z:\ARES-1.1.1\ares_init.c(235) : warning C4101: 'fp' : unreferenced local variable |  | ||||||
| Creating library... |  | ||||||
| <h3> |  | ||||||
| --------------------Configuration: adig - Win32 Release-------------------- |  | ||||||
| </h3> |  | ||||||
| <h3>Command Lines</h3> |  | ||||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615C.tmp" with contents |  | ||||||
| [ |  | ||||||
| wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"Release/adig.pdb" /machine:I386 /out:"Release/adig.exe" /libpath:"..\areslib\Release"  |  | ||||||
| ".\Release\adig.obj" |  | ||||||
| ".\Release\getopt.obj" |  | ||||||
| "\ARES-1.1.1\vc\areslib\Release\areslib.lib" |  | ||||||
| ] |  | ||||||
| Creating command line "link.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615C.tmp" |  | ||||||
| <h3>Output Window</h3> |  | ||||||
| Linking... |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| <h3>Results</h3> |  | ||||||
| adig.exe - 0 error(s), 6 warning(s) |  | ||||||
| </pre> |  | ||||||
| </body> |  | ||||||
| </html> |  | ||||||
| @@ -1,223 +0,0 @@ | |||||||
| # Microsoft Developer Studio Generated NMAKE File, Based on ahost.dsp |  | ||||||
| !IF "$(CFG)" == "" |  | ||||||
| CFG=ahost - Win32 Debug |  | ||||||
| !MESSAGE No configuration specified. Defaulting to ahost - Win32 Debug. |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| !IF "$(CFG)" != "ahost - Win32 Release" && "$(CFG)" != "ahost - Win32 Debug" |  | ||||||
| !MESSAGE Invalid configuration "$(CFG)" specified. |  | ||||||
| !MESSAGE You can specify a configuration when running NMAKE |  | ||||||
| !MESSAGE by defining the macro CFG on the command line. For example: |  | ||||||
| !MESSAGE  |  | ||||||
| !MESSAGE NMAKE /f "ahost.mak" CFG="ahost - Win32 Debug" |  | ||||||
| !MESSAGE  |  | ||||||
| !MESSAGE Possible choices for configuration are: |  | ||||||
| !MESSAGE  |  | ||||||
| !MESSAGE "ahost - Win32 Release" (based on "Win32 (x86) Console Application") |  | ||||||
| !MESSAGE "ahost - Win32 Debug" (based on "Win32 (x86) Console Application") |  | ||||||
| !MESSAGE  |  | ||||||
| !ERROR An invalid configuration is specified. |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| !IF "$(OS)" == "Windows_NT" |  | ||||||
| NULL= |  | ||||||
| !ELSE  |  | ||||||
| NULL=nul |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| CPP=cl.exe |  | ||||||
| RSC=rc.exe |  | ||||||
|  |  | ||||||
| !IF  "$(CFG)" == "ahost - Win32 Release" |  | ||||||
|  |  | ||||||
| OUTDIR=.\Release |  | ||||||
| INTDIR=.\Release |  | ||||||
| # Begin Custom Macros |  | ||||||
| OutDir=.\Release |  | ||||||
| # End Custom Macros |  | ||||||
|  |  | ||||||
| !IF "$(RECURSE)" == "0"  |  | ||||||
|  |  | ||||||
| ALL : "$(OUTDIR)\ahost.exe" |  | ||||||
|  |  | ||||||
| !ELSE  |  | ||||||
|  |  | ||||||
| ALL : "areslib - Win32 Release" "$(OUTDIR)\ahost.exe" |  | ||||||
|  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| !IF "$(RECURSE)" == "1"  |  | ||||||
| CLEAN :"areslib - Win32 ReleaseCLEAN"  |  | ||||||
| !ELSE  |  | ||||||
| CLEAN : |  | ||||||
| !ENDIF  |  | ||||||
| 	-@erase "$(INTDIR)\ahost.obj" |  | ||||||
| 	-@erase "$(INTDIR)\vc60.idb" |  | ||||||
| 	-@erase "$(OUTDIR)\ahost.exe" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)" : |  | ||||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" |  | ||||||
|  |  | ||||||
| CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\ahost.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c  |  | ||||||
| BSC32=bscmake.exe |  | ||||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\ahost.bsc"  |  | ||||||
| BSC32_SBRS= \ |  | ||||||
| 	 |  | ||||||
| LINK32=link.exe |  | ||||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\ahost.pdb" /machine:I386 /out:"$(OUTDIR)\ahost.exe" /libpath:"..\areslib\Release"  |  | ||||||
| LINK32_OBJS= \ |  | ||||||
| 	"$(INTDIR)\ahost.obj" \ |  | ||||||
| 	"..\areslib\Release\areslib.lib" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)\ahost.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) |  | ||||||
|     $(LINK32) @<< |  | ||||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) |  | ||||||
| << |  | ||||||
|  |  | ||||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" |  | ||||||
|  |  | ||||||
| OUTDIR=.\Debug |  | ||||||
| INTDIR=.\Debug |  | ||||||
| # Begin Custom Macros |  | ||||||
| OutDir=.\Debug |  | ||||||
| # End Custom Macros |  | ||||||
|  |  | ||||||
| !IF "$(RECURSE)" == "0"  |  | ||||||
|  |  | ||||||
| ALL : "$(OUTDIR)\ahost.exe" "$(OUTDIR)\ahost.bsc" |  | ||||||
|  |  | ||||||
| !ELSE  |  | ||||||
|  |  | ||||||
| ALL : "areslib - Win32 Debug" "$(OUTDIR)\ahost.exe" "$(OUTDIR)\ahost.bsc" |  | ||||||
|  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| !IF "$(RECURSE)" == "1"  |  | ||||||
| CLEAN :"areslib - Win32 DebugCLEAN"  |  | ||||||
| !ELSE  |  | ||||||
| CLEAN : |  | ||||||
| !ENDIF  |  | ||||||
| 	-@erase "$(INTDIR)\ahost.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ahost.sbr" |  | ||||||
| 	-@erase "$(INTDIR)\vc60.idb" |  | ||||||
| 	-@erase "$(INTDIR)\vc60.pdb" |  | ||||||
| 	-@erase "$(OUTDIR)\ahost.bsc" |  | ||||||
| 	-@erase "$(OUTDIR)\ahost.exe" |  | ||||||
| 	-@erase "$(OUTDIR)\ahost.ilk" |  | ||||||
| 	-@erase "$(OUTDIR)\ahost.pdb" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)" : |  | ||||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" |  | ||||||
|  |  | ||||||
| CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fp"$(INTDIR)\ahost.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ  /c  |  | ||||||
| BSC32=bscmake.exe |  | ||||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\ahost.bsc"  |  | ||||||
| BSC32_SBRS= \ |  | ||||||
| 	"$(INTDIR)\ahost.sbr" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)\ahost.bsc" : "$(OUTDIR)" $(BSC32_SBRS) |  | ||||||
|     $(BSC32) @<< |  | ||||||
|   $(BSC32_FLAGS) $(BSC32_SBRS) |  | ||||||
| << |  | ||||||
|  |  | ||||||
| LINK32=link.exe |  | ||||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\ahost.pdb" /debug /machine:I386 /out:"$(OUTDIR)\ahost.exe" /pdbtype:sept /libpath:"..\areslib\Debug"  |  | ||||||
| LINK32_OBJS= \ |  | ||||||
| 	"$(INTDIR)\ahost.obj" \ |  | ||||||
| 	"..\areslib\Debug\areslib.lib" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)\ahost.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) |  | ||||||
|     $(LINK32) @<< |  | ||||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) |  | ||||||
| << |  | ||||||
|  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| .c{$(INTDIR)}.obj:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cpp{$(INTDIR)}.obj:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cxx{$(INTDIR)}.obj:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .c{$(INTDIR)}.sbr:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cpp{$(INTDIR)}.sbr:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cxx{$(INTDIR)}.sbr:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $<  |  | ||||||
| << |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !IF "$(NO_EXTERNAL_DEPS)" != "1" |  | ||||||
| !IF EXISTS("ahost.dep") |  | ||||||
| !INCLUDE "ahost.dep" |  | ||||||
| !ELSE  |  | ||||||
| !MESSAGE Warning: cannot find "ahost.dep" |  | ||||||
| !ENDIF  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !IF "$(CFG)" == "ahost - Win32 Release" || "$(CFG)" == "ahost - Win32 Debug" |  | ||||||
| SOURCE=..\..\ahost.c |  | ||||||
|  |  | ||||||
| !IF  "$(CFG)" == "ahost - Win32 Release" |  | ||||||
|  |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ahost.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" |  | ||||||
|  |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ahost.obj"	"$(INTDIR)\ahost.sbr" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| !IF  "$(CFG)" == "ahost - Win32 Release" |  | ||||||
|  |  | ||||||
| "areslib - Win32 Release" :  |  | ||||||
|    cd "\ARES-1.1.1\vc\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"  |  | ||||||
|    cd "..\ahost" |  | ||||||
|  |  | ||||||
| "areslib - Win32 ReleaseCLEAN" :  |  | ||||||
|    cd "\ARES-1.1.1\vc\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN  |  | ||||||
|    cd "..\ahost" |  | ||||||
|  |  | ||||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" |  | ||||||
|  |  | ||||||
| "areslib - Win32 Debug" :  |  | ||||||
|    cd "\ARES-1.1.1\vc\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"  |  | ||||||
|    cd "..\ahost" |  | ||||||
|  |  | ||||||
| "areslib - Win32 DebugCLEAN" :  |  | ||||||
|    cd "\ARES-1.1.1\vc\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN  |  | ||||||
|    cd "..\ahost" |  | ||||||
|  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !ENDIF  |  | ||||||
|  |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| <html> |  | ||||||
| <body> |  | ||||||
| <pre> |  | ||||||
| <h1>Build Log</h1> |  | ||||||
| <h3> |  | ||||||
| --------------------Configuration: ahost - Win32 Release-------------------- |  | ||||||
| </h3> |  | ||||||
| <h3>Command Lines</h3> |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| <h3>Results</h3> |  | ||||||
| ahost.exe - 0 error(s), 0 warning(s) |  | ||||||
| </pre> |  | ||||||
| </body> |  | ||||||
| </html> |  | ||||||
| @@ -63,8 +63,8 @@ LIB32=link.exe -lib | |||||||
| # PROP Output_Dir "Debug" | # PROP Output_Dir "Debug" | ||||||
| # PROP Intermediate_Dir "Debug" | # PROP Intermediate_Dir "Debug" | ||||||
| # PROP Target_Dir "" | # PROP Target_Dir "" | ||||||
| # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ  /c | # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c | ||||||
| # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ  /c | # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c | ||||||
| # ADD BASE RSC /l 0x409 /d "_DEBUG" | # ADD BASE RSC /l 0x409 /d "_DEBUG" | ||||||
| # ADD RSC /l 0x409 /d "_DEBUG" | # ADD RSC /l 0x409 /d "_DEBUG" | ||||||
| BSC32=bscmake.exe | BSC32=bscmake.exe | ||||||
| @@ -97,6 +97,10 @@ SOURCE=..\..\ares__read_line.c | |||||||
| # End Source File | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\ares_cancel.c | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_destroy.c | SOURCE=..\..\ares_destroy.c | ||||||
| # End Source File | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
| @@ -137,6 +141,10 @@ SOURCE=..\..\ares_parse_a_reply.c | |||||||
| # End Source File | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\ares_parse_aaaa_reply.c | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_parse_ptr_reply.c | SOURCE=..\..\ares_parse_ptr_reply.c | ||||||
| # End Source File | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
| @@ -153,14 +161,6 @@ SOURCE=..\..\ares_search.c | |||||||
| # End Source File | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_cancel.c |  | ||||||
| # End Source File |  | ||||||
| # Begin Source File |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_version.c |  | ||||||
| # End Source File |  | ||||||
| # Begin Source File |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_send.c | SOURCE=..\..\ares_send.c | ||||||
| # End Source File | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
| @@ -173,6 +173,22 @@ SOURCE=..\..\ares_timeout.c | |||||||
| # End Source File | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\ares_version.c | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\bitncmp.c | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\inet_net_pton.c | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\inet_ntop.c | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
| SOURCE=..\..\windows_port.c | SOURCE=..\..\windows_port.c | ||||||
| # End Source File | # End Source File | ||||||
| # End Group | # End Group | ||||||
| @@ -189,7 +205,7 @@ SOURCE=..\..\ares_dns.h | |||||||
| # End Source File | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_version.h | SOURCE=..\..\ares_ipv6.h | ||||||
| # End Source File | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
|  |  | ||||||
| @@ -197,6 +213,22 @@ SOURCE=..\..\ares_private.h | |||||||
| # End Source File | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\ares_version.h | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\bitncmp.h | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\inet_net_pton.h | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\inet_ntop.h | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
| SOURCE=..\..\nameser.h | SOURCE=..\..\nameser.h | ||||||
| # End Source File | # End Source File | ||||||
| # End Group | # End Group | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								ares/vc/areslib/areslib.dsw
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								ares/vc/areslib/areslib.dsw
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | Microsoft Developer Studio Workspace File, Format Version 6.00 | ||||||
|  | # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
|  | Project: "areslib"=.\areslib.dsp - Package Owner=<4> | ||||||
|  |  | ||||||
|  | Package=<5> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | Package=<4> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
|  | Global: | ||||||
|  |  | ||||||
|  | Package=<5> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | Package=<3> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
| @@ -1,367 +0,0 @@ | |||||||
| # Microsoft Developer Studio Generated NMAKE File, Based on areslib.dsp |  | ||||||
| !IF "$(CFG)" == "" |  | ||||||
| CFG=areslib - Win32 Debug |  | ||||||
| !MESSAGE No configuration specified. Defaulting to areslib - Win32 Debug. |  | ||||||
| !ENDIF |  | ||||||
|  |  | ||||||
| !IF "$(CFG)" != "areslib - Win32 Release" && "$(CFG)" != "areslib - Win32 Debug" |  | ||||||
| !MESSAGE Invalid configuration "$(CFG)" specified. |  | ||||||
| !MESSAGE You can specify a configuration when running NMAKE |  | ||||||
| !MESSAGE by defining the macro CFG on the command line. For example: |  | ||||||
| !MESSAGE |  | ||||||
| !MESSAGE NMAKE /f "areslib.mak" CFG="areslib - Win32 Debug" |  | ||||||
| !MESSAGE |  | ||||||
| !MESSAGE Possible choices for configuration are: |  | ||||||
| !MESSAGE |  | ||||||
| !MESSAGE "areslib - Win32 Release" (based on "Win32 (x86) Static Library") |  | ||||||
| !MESSAGE "areslib - Win32 Debug" (based on "Win32 (x86) Static Library") |  | ||||||
| !MESSAGE |  | ||||||
| !ERROR An invalid configuration is specified. |  | ||||||
| !ENDIF |  | ||||||
|  |  | ||||||
| !IF "$(OS)" == "Windows_NT" |  | ||||||
| NULL= |  | ||||||
| !ELSE |  | ||||||
| NULL=nul |  | ||||||
| !ENDIF |  | ||||||
|  |  | ||||||
| CPP=cl.exe |  | ||||||
| RSC=rc.exe |  | ||||||
|  |  | ||||||
| !IF  "$(CFG)" == "areslib - Win32 Release" |  | ||||||
|  |  | ||||||
| OUTDIR=.\Release |  | ||||||
| INTDIR=.\Release |  | ||||||
| # Begin Custom Macros |  | ||||||
| OutDir=.\Release |  | ||||||
| # End Custom Macros |  | ||||||
|  |  | ||||||
| ALL : "$(OUTDIR)\areslib.lib" |  | ||||||
|  |  | ||||||
|  |  | ||||||
| CLEAN : |  | ||||||
| 	-@erase "$(INTDIR)\ares__close_sockets.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares__get_hostent.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares__read_line.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_destroy.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_expand_name.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_fds.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_free_hostent.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_free_string.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_gethostbyaddr.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_gethostbyname.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_init.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_mkquery.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_parse_a_reply.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_parse_ptr_reply.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_process.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_query.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_search.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_send.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_strerror.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_timeout.obj" |  | ||||||
| 	-@erase "$(INTDIR)\vc60.idb" |  | ||||||
| 	-@erase "$(INTDIR)\windows_port.obj" |  | ||||||
| 	-@erase "$(OUTDIR)\areslib.lib" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)" : |  | ||||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" |  | ||||||
|  |  | ||||||
| CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c |  | ||||||
| BSC32=bscmake.exe |  | ||||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc" |  | ||||||
| BSC32_SBRS= \ |  | ||||||
|  |  | ||||||
| LIB32=link.exe -lib |  | ||||||
| LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib" |  | ||||||
| LIB32_OBJS= \ |  | ||||||
| 	"$(INTDIR)\ares__close_sockets.obj" \ |  | ||||||
| 	"$(INTDIR)\ares__get_hostent.obj" \ |  | ||||||
| 	"$(INTDIR)\ares__read_line.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_destroy.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_expand_name.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_fds.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_free_hostent.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_free_string.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_gethostbyaddr.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_gethostbyname.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_init.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_mkquery.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_parse_a_reply.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_parse_ptr_reply.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_process.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_query.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_search.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_cancel.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_version.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_send.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_strerror.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_timeout.obj" \ |  | ||||||
| 	"$(INTDIR)\windows_port.obj" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) |  | ||||||
|     $(LIB32) @<< |  | ||||||
|   $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) |  | ||||||
| << |  | ||||||
|  |  | ||||||
| !ELSEIF  "$(CFG)" == "areslib - Win32 Debug" |  | ||||||
|  |  | ||||||
| OUTDIR=.\Debug |  | ||||||
| INTDIR=.\Debug |  | ||||||
| # Begin Custom Macros |  | ||||||
| OutDir=.\Debug |  | ||||||
| # End Custom Macros |  | ||||||
|  |  | ||||||
| ALL : "$(OUTDIR)\areslib.lib" |  | ||||||
|  |  | ||||||
|  |  | ||||||
| CLEAN : |  | ||||||
| 	-@erase "$(INTDIR)\ares__close_sockets.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares__get_hostent.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares__read_line.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_destroy.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_expand_name.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_fds.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_free_hostent.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_free_string.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_gethostbyaddr.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_gethostbyname.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_init.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_mkquery.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_parse_a_reply.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_parse_ptr_reply.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_process.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_query.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_search.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_cancel.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_version.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_send.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_strerror.obj" |  | ||||||
| 	-@erase "$(INTDIR)\ares_timeout.obj" |  | ||||||
| 	-@erase "$(INTDIR)\vc60.idb" |  | ||||||
| 	-@erase "$(INTDIR)\vc60.pdb" |  | ||||||
| 	-@erase "$(INTDIR)\windows_port.obj" |  | ||||||
| 	-@erase "$(OUTDIR)\areslib.lib" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)" : |  | ||||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" |  | ||||||
|  |  | ||||||
| CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ  /c |  | ||||||
| BSC32=bscmake.exe |  | ||||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc" |  | ||||||
| BSC32_SBRS= \ |  | ||||||
|  |  | ||||||
| LIB32=link.exe -lib |  | ||||||
| LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib" |  | ||||||
| LIB32_OBJS= \ |  | ||||||
| 	"$(INTDIR)\ares__close_sockets.obj" \ |  | ||||||
| 	"$(INTDIR)\ares__get_hostent.obj" \ |  | ||||||
| 	"$(INTDIR)\ares__read_line.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_destroy.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_expand_name.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_fds.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_free_hostent.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_free_string.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_gethostbyaddr.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_gethostbyname.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_init.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_mkquery.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_parse_a_reply.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_parse_ptr_reply.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_process.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_query.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_search.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_send.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_strerror.obj" \ |  | ||||||
| 	"$(INTDIR)\ares_timeout.obj" \ |  | ||||||
| 	"$(INTDIR)\windows_port.obj" |  | ||||||
|  |  | ||||||
| "$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) |  | ||||||
|     $(LIB32) @<< |  | ||||||
|   $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) |  | ||||||
| << |  | ||||||
|  |  | ||||||
| !ENDIF |  | ||||||
|  |  | ||||||
| .c{$(INTDIR)}.obj:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $< |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cpp{$(INTDIR)}.obj:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $< |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cxx{$(INTDIR)}.obj:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $< |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .c{$(INTDIR)}.sbr:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $< |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cpp{$(INTDIR)}.sbr:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $< |  | ||||||
| << |  | ||||||
|  |  | ||||||
| .cxx{$(INTDIR)}.sbr:: |  | ||||||
|    $(CPP) @<< |  | ||||||
|    $(CPP_PROJ) $< |  | ||||||
| << |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !IF "$(NO_EXTERNAL_DEPS)" != "1" |  | ||||||
| !IF EXISTS("areslib.dep") |  | ||||||
| !INCLUDE "areslib.dep" |  | ||||||
| !ELSE |  | ||||||
| !MESSAGE Warning: cannot find "areslib.dep" |  | ||||||
| !ENDIF |  | ||||||
| !ENDIF |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !IF "$(CFG)" == "areslib - Win32 Release" || "$(CFG)" == "areslib - Win32 Debug" |  | ||||||
| SOURCE=..\..\ares__close_sockets.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares__close_sockets.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares__get_hostent.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares__get_hostent.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares__read_line.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares__read_line.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_destroy.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_destroy.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_expand_name.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_expand_name.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_fds.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_fds.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_free_hostent.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_free_hostent.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_free_string.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_free_string.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_gethostbyaddr.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_gethostbyaddr.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_gethostbyname.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_gethostbyname.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_init.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_init.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_mkquery.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_mkquery.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_parse_a_reply.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_parse_a_reply.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_parse_ptr_reply.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_parse_ptr_reply.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_process.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_process.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_query.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_query.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_search.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_search.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_version.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_version.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_cancel.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_cancel.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_send.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_strerror.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_strerror.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_timeout.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\ares_timeout.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| SOURCE=..\..\windows_port.c |  | ||||||
|  |  | ||||||
| "$(INTDIR)\windows_port.obj" : $(SOURCE) "$(INTDIR)" |  | ||||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| !ENDIF |  | ||||||
|  |  | ||||||
| @@ -1,125 +0,0 @@ | |||||||
| <html> |  | ||||||
| <body> |  | ||||||
| <pre> |  | ||||||
| <h1>Build Log</h1> |  | ||||||
| <h3> |  | ||||||
| --------------------Configuration: areslib - Win32 Release-------------------- |  | ||||||
| </h3> |  | ||||||
| <h3>Command Lines</h3> |  | ||||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603D.tmp" with contents |  | ||||||
| [ |  | ||||||
| /nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"Release/areslib.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c  |  | ||||||
| "Z:\ares-1.1.1\ares__close_sockets.c" |  | ||||||
| "Z:\ares-1.1.1\ares__get_hostent.c" |  | ||||||
| "Z:\ares-1.1.1\ares__read_line.c" |  | ||||||
| "Z:\ares-1.1.1\ares_destroy.c" |  | ||||||
| "Z:\ares-1.1.1\ares_expand_name.c" |  | ||||||
| "Z:\ares-1.1.1\ares_fds.c" |  | ||||||
| "Z:\ares-1.1.1\ares_free_errmem.c" |  | ||||||
| "Z:\ares-1.1.1\ares_free_hostent.c" |  | ||||||
| "Z:\ares-1.1.1\ares_free_string.c" |  | ||||||
| "Z:\ares-1.1.1\ares_gethostbyaddr.c" |  | ||||||
| "Z:\ares-1.1.1\ares_gethostbyname.c" |  | ||||||
| "Z:\ares-1.1.1\ares_init.c" |  | ||||||
| "Z:\ares-1.1.1\ares_mkquery.c" |  | ||||||
| "Z:\ares-1.1.1\ares_parse_a_reply.c" |  | ||||||
| "Z:\ares-1.1.1\ares_parse_ptr_reply.c" |  | ||||||
| "Z:\ares-1.1.1\ares_process.c" |  | ||||||
| "Z:\ares-1.1.1\ares_query.c" |  | ||||||
| "Z:\ares-1.1.1\ares_search.c" |  | ||||||
| "Z:\ares-1.1.1\ares_send.c" |  | ||||||
| "Z:\ares-1.1.1\ares_strerror.c" |  | ||||||
| "Z:\ares-1.1.1\ares_timeout.c" |  | ||||||
| "Z:\ares-1.1.1\windows_port.c" |  | ||||||
| ] |  | ||||||
| Creating command line "cl.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603D.tmp"  |  | ||||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603E.tmp" with contents |  | ||||||
| [ |  | ||||||
| /nologo /out:"Release\areslib.lib"  |  | ||||||
| ".\Release\ares__close_sockets.obj" |  | ||||||
| ".\Release\ares__get_hostent.obj" |  | ||||||
| ".\Release\ares__read_line.obj" |  | ||||||
| ".\Release\ares_destroy.obj" |  | ||||||
| ".\Release\ares_expand_name.obj" |  | ||||||
| ".\Release\ares_fds.obj" |  | ||||||
| ".\Release\ares_free_errmem.obj" |  | ||||||
| ".\Release\ares_free_hostent.obj" |  | ||||||
| ".\Release\ares_free_string.obj" |  | ||||||
| ".\Release\ares_gethostbyaddr.obj" |  | ||||||
| ".\Release\ares_gethostbyname.obj" |  | ||||||
| ".\Release\ares_init.obj" |  | ||||||
| ".\Release\ares_mkquery.obj" |  | ||||||
| ".\Release\ares_parse_a_reply.obj" |  | ||||||
| ".\Release\ares_parse_ptr_reply.obj" |  | ||||||
| ".\Release\ares_process.obj" |  | ||||||
| ".\Release\ares_query.obj" |  | ||||||
| ".\Release\ares_search.obj" |  | ||||||
| ".\Release\ares_send.obj" |  | ||||||
| ".\Release\ares_strerror.obj" |  | ||||||
| ".\Release\ares_timeout.obj" |  | ||||||
| ".\Release\windows_port.obj" |  | ||||||
| ] |  | ||||||
| Creating command line "link.exe -lib @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603E.tmp" |  | ||||||
| <h3>Output Window</h3> |  | ||||||
| Compiling... |  | ||||||
| ares__close_sockets.c |  | ||||||
| Z:\ares-1.1.1\ares__close_sockets.c(46) : warning C4013: 'close' undefined; assuming extern returning int |  | ||||||
| ares__get_hostent.c |  | ||||||
| ares__read_line.c |  | ||||||
| ares_destroy.c |  | ||||||
| ares_expand_name.c |  | ||||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| ares_fds.c |  | ||||||
| ares_free_errmem.c |  | ||||||
| ares_free_hostent.c |  | ||||||
| ares_free_string.c |  | ||||||
| ares_gethostbyaddr.c |  | ||||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| ares_gethostbyname.c |  | ||||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| ares_init.c |  | ||||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| Z:\ares-1.1.1\ares_init.c(141) : warning C4013: '_getpid' undefined; assuming extern returning int |  | ||||||
| Z:\ares-1.1.1\ares_init.c(236) : warning C4101: 'p' : unreferenced local variable |  | ||||||
| Z:\ares-1.1.1\ares_init.c(237) : warning C4101: 'linesize' : unreferenced local variable |  | ||||||
| Z:\ares-1.1.1\ares_init.c(235) : warning C4101: 'fp' : unreferenced local variable |  | ||||||
| ares_mkquery.c |  | ||||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| ares_parse_a_reply.c |  | ||||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| Z:\ares-1.1.1\ares_parse_a_reply.c(90) : warning C4018: '<' : signed/unsigned mismatch |  | ||||||
| ares_parse_ptr_reply.c |  | ||||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| Z:\ares-1.1.1\ares_parse_ptr_reply.c(71) : warning C4018: '<' : signed/unsigned mismatch |  | ||||||
| ares_process.c |  | ||||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| ares_query.c |  | ||||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| ares_search.c |  | ||||||
| Z:\ares-1.1.1\ares_search.c(229) : warning C4013: 'strncasecmp' undefined; assuming extern returning int |  | ||||||
| ares_send.c |  | ||||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| ares_strerror.c |  | ||||||
| ares_timeout.c |  | ||||||
| windows_port.c |  | ||||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition |  | ||||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' |  | ||||||
| Creating library... |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| <h3>Results</h3> |  | ||||||
| areslib.lib - 0 error(s), 19 warning(s) |  | ||||||
| </pre> |  | ||||||
| </body> |  | ||||||
| </html> |  | ||||||
							
								
								
									
										83
									
								
								buildconf
									
									
									
									
									
								
							
							
						
						
									
										83
									
								
								buildconf
									
									
									
									
									
								
							| @@ -1,4 +1,26 @@ | |||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  | #*************************************************************************** | ||||||
|  | #                                  _   _ ____  _ | ||||||
|  | #  Project                     ___| | | |  _ \| | | ||||||
|  | #                             / __| | | | |_) | | | ||||||
|  | #                            | (__| |_| |  _ <| |___ | ||||||
|  | #                             \___|\___/|_| \_\_____| | ||||||
|  | # | ||||||
|  | # Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||||
|  | # | ||||||
|  | # This software is licensed as described in the file COPYING, which | ||||||
|  | # you should have received as part of this distribution. The terms | ||||||
|  | # are also available at http://curl.haxx.se/docs/copyright.html. | ||||||
|  | # | ||||||
|  | # You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||||
|  | # copies of the Software, and permit persons to whom the Software is | ||||||
|  | # furnished to do so, under the terms of the COPYING file. | ||||||
|  | # | ||||||
|  | # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||||
|  | # KIND, either express or implied. | ||||||
|  | # | ||||||
|  | # $Id$ | ||||||
|  | ########################################################################### | ||||||
|  |  | ||||||
| die(){ | die(){ | ||||||
| 	echo "$@" | 	echo "$@" | ||||||
| @@ -13,7 +35,8 @@ findtool(){ | |||||||
|   IFS=":" |   IFS=":" | ||||||
|   for path in $PATH |   for path in $PATH | ||||||
|   do |   do | ||||||
|     if test -r "$path/$file"; then |     # echo "checks for $file in $path" >&2 | ||||||
|  |     if test -f "$path/$file"; then | ||||||
|       echo "$path/$file" |       echo "$path/$file" | ||||||
|       return |       return | ||||||
|     fi |     fi | ||||||
| @@ -24,7 +47,7 @@ findtool(){ | |||||||
| # autoconf 2.57 or newer | # autoconf 2.57 or newer | ||||||
| # | # | ||||||
| need_autoconf="2.57" | need_autoconf="2.57" | ||||||
| ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` | ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` | ||||||
| if test -z "$ac_version"; then | if test -z "$ac_version"; then | ||||||
|   echo "buildconf: autoconf not found." |   echo "buildconf: autoconf not found." | ||||||
|   echo "            You need autoconf version $need_autoconf or newer installed." |   echo "            You need autoconf version $need_autoconf or newer installed." | ||||||
| @@ -45,7 +68,7 @@ echo "buildconf: autoconf version $ac_version (ok)" | |||||||
| #-------------------------------------------------------------------------- | #-------------------------------------------------------------------------- | ||||||
| # autoheader 2.50 or newer | # autoheader 2.50 or newer | ||||||
| # | # | ||||||
| ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` | ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` | ||||||
| if test -z "$ah_version"; then | if test -z "$ah_version"; then | ||||||
|   echo "buildconf: autoheader not found." |   echo "buildconf: autoheader not found." | ||||||
|   echo "            You need autoheader version 2.50 or newer installed." |   echo "            You need autoheader version 2.50 or newer installed." | ||||||
| @@ -67,7 +90,7 @@ echo "buildconf: autoheader version $ah_version (ok)" | |||||||
| # automake 1.7 or newer | # automake 1.7 or newer | ||||||
| # | # | ||||||
| need_automake="1.7" | need_automake="1.7" | ||||||
| am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'` | am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -n 1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'` | ||||||
| if test -z "$am_version"; then | if test -z "$am_version"; then | ||||||
|   echo "buildconf: automake not found." |   echo "buildconf: automake not found." | ||||||
|   echo "            You need automake version $need_automake or newer installed." |   echo "            You need automake version $need_automake or newer installed." | ||||||
| @@ -85,6 +108,13 @@ fi | |||||||
|  |  | ||||||
| echo "buildconf: automake version $am_version (ok)" | echo "buildconf: automake version $am_version (ok)" | ||||||
|  |  | ||||||
|  | ac=`findtool ${ACLOCAL:-aclocal}` | ||||||
|  | if test -z "$ac"; then | ||||||
|  |   echo "buildconf: aclocal not found. Weird automake installation!" | ||||||
|  |   exit 1 | ||||||
|  | else | ||||||
|  |   echo "buildconf: aclocal found" | ||||||
|  | fi | ||||||
|  |  | ||||||
| #-------------------------------------------------------------------------- | #-------------------------------------------------------------------------- | ||||||
| # libtool check | # libtool check | ||||||
| @@ -99,13 +129,18 @@ LIBTOOL_WANTED_VERSION=1.4.2 | |||||||
| # glibtool, with 'libtool' being something completely different. | # glibtool, with 'libtool' being something completely different. | ||||||
| libtool=`findtool glibtool 2>/dev/null` | libtool=`findtool glibtool 2>/dev/null` | ||||||
| if test ! -x "$libtool"; then | if test ! -x "$libtool"; then | ||||||
|   libtool=`findtool libtool` |   libtool=`findtool ${LIBTOOL:-libtool}` | ||||||
| fi | fi | ||||||
|  |  | ||||||
| # set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found | if test -z "$LIBTOOLIZE"; then | ||||||
| LIBTOOLIZE="${libtool}ize" |   # set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found | ||||||
|  |   # $libtool is already the full path | ||||||
|  |   libtoolize="${libtool}ize" | ||||||
|  | else | ||||||
|  |   libtoolize=`findtool $LIBTOOLIZE` | ||||||
|  | fi | ||||||
|  |  | ||||||
| lt_pversion=`$libtool --version 2>/dev/null|head -1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'` | lt_pversion=`$libtool --version 2>/dev/null|head -n 1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'` | ||||||
| if test -z "$lt_pversion"; then | if test -z "$lt_pversion"; then | ||||||
|   echo "buildconf: libtool not found." |   echo "buildconf: libtool not found." | ||||||
|   echo "            You need libtool version $LIBTOOL_WANTED_VERSION or newer installed" |   echo "            You need libtool version $LIBTOOL_WANTED_VERSION or newer installed" | ||||||
| @@ -142,10 +177,17 @@ fi | |||||||
|  |  | ||||||
| echo "buildconf: libtool version $lt_version (ok)" | echo "buildconf: libtool version $lt_version (ok)" | ||||||
|  |  | ||||||
|  | if test -f "$libtoolize"; then | ||||||
|  |   echo "buildconf: libtoolize found" | ||||||
|  | else | ||||||
|  |   echo "buildconf: libtoolize not found. Weird libtool installation!" | ||||||
|  |   exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
| #-------------------------------------------------------------------------- | #-------------------------------------------------------------------------- | ||||||
| # m4 check | # m4 check | ||||||
| # | # | ||||||
| m4=`${M4:-m4} --version 2>/dev/null|head -1`; | m4=`${M4:-m4} --version 2>/dev/null|head -n 1`; | ||||||
| m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'` | m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'` | ||||||
|  |  | ||||||
| if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then | if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then | ||||||
| @@ -155,17 +197,26 @@ else | |||||||
|   exit 1 |   exit 1 | ||||||
| fi | fi | ||||||
|  |  | ||||||
|  | #-------------------------------------------------------------------------- | ||||||
|  | # perl check | ||||||
|  | # | ||||||
|  | PERL=`findtool ${PERL:-perl}` | ||||||
|  |  | ||||||
| # ------------------------------------------------------------ | # ------------------------------------------------------------ | ||||||
|  |  | ||||||
| # run the correct scripts now | # run the correct scripts now | ||||||
|  |  | ||||||
| echo "buildconf: running libtoolize" | echo "buildconf: running libtoolize" | ||||||
| ${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed" | $libtoolize --copy --automake --force || die "The libtoolize command failed" | ||||||
| echo "buildconf: running aclocal" | echo "buildconf: running aclocal" | ||||||
| ${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The aclocal command line failed" | ${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The aclocal command line failed" | ||||||
| echo "buildconf: running aclocal hack to convert all mv to mv -f" | if test -n "$PERL"; then | ||||||
| perl -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4 |   echo "buildconf: running aclocal hack to convert all mv to mv -f" | ||||||
|  |   $PERL -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4 | ||||||
|  | else | ||||||
|  |   echo "buildconf: perl not found" | ||||||
|  |   exit 1 | ||||||
|  | fi | ||||||
| echo "buildconf: running autoheader" | echo "buildconf: running autoheader" | ||||||
| ${AUTOHEADER:-autoheader} || die "The autoheader command failed" | ${AUTOHEADER:-autoheader} || die "The autoheader command failed" | ||||||
| echo "buildconf: cp lib/config.h.in src/config.h.in" | echo "buildconf: cp lib/config.h.in src/config.h.in" | ||||||
| @@ -175,15 +226,13 @@ ${AUTOCONF:-autoconf}     || die "The autoconf command failed" | |||||||
|  |  | ||||||
| if test -d ares; then | if test -d ares; then | ||||||
|   cd ares |   cd ares | ||||||
|   echo "buildconf: running aclocal in the ares directory" |   echo "buildconf: running in ares" | ||||||
|   ${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed" |   ./buildconf | ||||||
|   echo "buildconf: running autoconf in the ares directory" |  | ||||||
|   ${AUTOCONF:-autoconf}     || die "The ares autoconf command failed" |  | ||||||
|   cd .. |   cd .. | ||||||
| fi | fi | ||||||
|  |  | ||||||
| echo "buildconf: running automake" | echo "buildconf: running automake" | ||||||
| ${AUTOMAKE:-automake} -a  || die "The automake command failed" | ${AUTOMAKE:-automake} -a -c  || die "The automake command failed" | ||||||
|  |  | ||||||
| echo "buildconf: OK" | echo "buildconf: OK" | ||||||
| exit 0 | exit 0 | ||||||
|   | |||||||
							
								
								
									
										819
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										819
									
								
								configure.ac
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -60,6 +60,9 @@ while test $# -gt 0; do | |||||||
|     --feature|--features) |     --feature|--features) | ||||||
| 	if test "@USE_SSLEAY@" = "1"; then | 	if test "@USE_SSLEAY@" = "1"; then | ||||||
|           echo "SSL" |           echo "SSL" | ||||||
|  |           NTLM=1 # OpenSSL implies NTLM | ||||||
|  |         elif test -n "@USE_GNUTLS@"; then | ||||||
|  |           echo "SSL" | ||||||
|         fi |         fi | ||||||
| 	if test "@KRB4_ENABLED@" = "1"; then | 	if test "@KRB4_ENABLED@" = "1"; then | ||||||
|           echo "KRB4" |           echo "KRB4" | ||||||
| @@ -73,6 +76,16 @@ while test $# -gt 0; do | |||||||
| 	if test "@HAVE_ARES@" = "1"; then | 	if test "@HAVE_ARES@" = "1"; then | ||||||
|           echo "AsynchDNS" |           echo "AsynchDNS" | ||||||
|         fi |         fi | ||||||
|  | 	if test "@IDN_ENABLED@" = "1"; then | ||||||
|  |           echo "IDN" | ||||||
|  |         fi | ||||||
|  | 	if test "@USE_WINDOWS_SSPI@" = "1"; then | ||||||
|  |           echo "SSPI" | ||||||
|  |           NTLM=1 | ||||||
|  |         fi | ||||||
|  | 	if test "$NTLM" = "1"; then | ||||||
|  |           echo "NTLM" | ||||||
|  |         fi | ||||||
| 	;; | 	;; | ||||||
|  |  | ||||||
|     --protocols) |     --protocols) | ||||||
| @@ -88,9 +101,6 @@ while test $# -gt 0; do | |||||||
|             echo "FTPS" |             echo "FTPS" | ||||||
|           fi |           fi | ||||||
|         fi |         fi | ||||||
| 	if test "@CURL_DISABLE_GOPHER@" != "1"; then |  | ||||||
|           echo "GOPHER" |  | ||||||
|         fi |  | ||||||
| 	if test "@CURL_DISABLE_FILE@" != "1"; then | 	if test "@CURL_DISABLE_FILE@" != "1"; then | ||||||
|           echo "FILE" |           echo "FILE" | ||||||
|         fi |         fi | ||||||
| @@ -103,6 +113,9 @@ while test $# -gt 0; do | |||||||
| 	if test "@CURL_DISABLE_DICT@" != "1"; then | 	if test "@CURL_DISABLE_DICT@" != "1"; then | ||||||
|           echo "DICT" |           echo "DICT" | ||||||
|         fi |         fi | ||||||
|  | 	if test "@CURL_DISABLE_TFTP@" != "1"; then | ||||||
|  |           echo "TFTP" | ||||||
|  |         fi | ||||||
| 	;; | 	;; | ||||||
|     --version) |     --version) | ||||||
| 	echo libcurl @VERSION@ | 	echo libcurl @VERSION@ | ||||||
|   | |||||||
| @@ -75,10 +75,15 @@ Java | |||||||
|   Maintained by Vic Hanson |   Maintained by Vic Hanson | ||||||
|   http://curl.haxx.se/libcurl/java/ |   http://curl.haxx.se/libcurl/java/ | ||||||
|  |  | ||||||
|  | Lisp | ||||||
|  |  | ||||||
|  |   Written by Liam Healy | ||||||
|  |   http://common-lisp.net/project/cl-curl/ | ||||||
|  |  | ||||||
| Lua | Lua | ||||||
|  |  | ||||||
|   Written by Steve Dekorte |   LuaCURL Written by Alexander Marinov | ||||||
|   http://curl.haxx.se/libcurl/lua/ |   http://luacurl.luaforge.net/ | ||||||
|  |  | ||||||
| Mono | Mono | ||||||
|  |  | ||||||
| @@ -87,8 +92,8 @@ Mono | |||||||
|  |  | ||||||
| .NET | .NET | ||||||
|  |  | ||||||
|   Written by Jeffrey Phillips |   libcurl-net Written by Jeffrey Phillips | ||||||
|   http://www.seasideresearch.com/downloads.html |   http://sourceforge.net/projects/libcurl-net/ | ||||||
|  |  | ||||||
| Object-Pascal | Object-Pascal | ||||||
|  |  | ||||||
| @@ -145,13 +150,23 @@ Scheme | |||||||
|   Bigloo binding written by Kirill Lisovsky |   Bigloo binding written by Kirill Lisovsky | ||||||
|   http://curl.haxx.se/libcurl/scheme/ |   http://curl.haxx.se/libcurl/scheme/ | ||||||
|  |  | ||||||
|  | S-Lang | ||||||
|  |  | ||||||
|  |   S-Lang binding written by John E Davis | ||||||
|  |   http://www.jedsoft.org/slang/modules/curl.html | ||||||
|  |  | ||||||
| Tcl | Tcl | ||||||
|  |  | ||||||
|   Tclcurl is written by Andr<64>s Garc<72>a |   Tclcurl is written by Andr<64>s Garc<72>a | ||||||
|   http://personal1.iddeo.es/andresgarci/tclcurl/english/docs.html |   http://personal1.iddeo.es/andresgarci/tclcurl/english/docs.html | ||||||
|  |  | ||||||
| Q | Visual Basic | ||||||
|  |  | ||||||
|  |   libcurl-vb is written by Jeffrey Phillips | ||||||
|  |   http://sourceforge.net/projects/libcurl-vb/ | ||||||
|  |  | ||||||
|  | Q | ||||||
|  |   The libcurl module is part of the default install | ||||||
|   http://q-lang.sourceforge.net/ |   http://q-lang.sourceforge.net/ | ||||||
|  |  | ||||||
| wxWidgets | wxWidgets | ||||||
|   | |||||||
| @@ -4,11 +4,11 @@ | |||||||
|                             | (__| |_| |  _ <| |___ |                             | (__| |_| |  _ <| |___ | ||||||
|                              \___|\___/|_| \_\_____| |                              \___|\___/|_| \_\_____| | ||||||
|  |  | ||||||
| To Think About When Contributing Source Code |                         When Contributing Source Code | ||||||
|  |  | ||||||
|  This document is intended to offer some simple guidelines that can be useful |  This document is intended to offer guidelines that can be useful to keep in | ||||||
|  to keep in mind when you decide to contribute to the project. This concerns |  mind when you decide to contribute to the project. This concerns new features | ||||||
|  new features as well as corrections to existing flaws or bugs. |  as well as corrections to existing flaws or bugs. | ||||||
|  |  | ||||||
| Join the Community | Join the Community | ||||||
|  |  | ||||||
| @@ -20,13 +20,26 @@ Join the Community | |||||||
| The License Issue | The License Issue | ||||||
|  |  | ||||||
|  When contributing with code, you agree to put your changes and new code under |  When contributing with code, you agree to put your changes and new code under | ||||||
|  the same license curl and libcurl is already using unless stated otherwise. |  the same license curl and libcurl is already using unless stated and agreed | ||||||
|  |  otherwise. | ||||||
|  |  | ||||||
|  If you add a larger piece of code, you can opt to make that file or set of |  If you add a larger piece of code, you can opt to make that file or set of | ||||||
|  files to use a different license as long as they don't enforce any changes to |  files to use a different license as long as they don't enforce any changes to | ||||||
|  the rest of the package and they make sense. Such "separate parts" can not be |  the rest of the package and they make sense. Such "separate parts" can not be | ||||||
|  GPL (as we don't want the GPL virus to attack users of libcurl) but they must |  GPL licensed (as we don't want copyleft to affect users of libcurl) but they | ||||||
|  use "GPL compatible" licenses. |  must use "GPL compatible" licenses (as we want to allow users to use libcurl | ||||||
|  |  properly in GPL licensed environments). | ||||||
|  |  | ||||||
|  |  When changing existing source code, you do not alter the copyright of the | ||||||
|  |  original file(s). The copyright will still be owned by the original | ||||||
|  |  creator(s) or those who have been assigned copyright by the original | ||||||
|  |  author(s). | ||||||
|  |  | ||||||
|  |  By submitting a patch to the curl project, you are assumed to have the right | ||||||
|  |  to the code and to be allowed by your employer or whatever to hand over that | ||||||
|  |  patch/code to us. We will credit you for your changes as far as possible, to | ||||||
|  |  give credit but also to keep a trace back to who made what changes. Please | ||||||
|  |  always provide us with your full real name when contributing! | ||||||
|  |  | ||||||
| What To Read | What To Read | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										226
									
								
								docs/DISTRO-DILEMMA
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								docs/DISTRO-DILEMMA
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,226 @@ | |||||||
|  |   Date: October 27, 2005 | ||||||
|  |   Author: Daniel Stenberg <daniel@haxx.se> | ||||||
|  |   URL: http://curl.haxx.se/legal/distro-dilemma.html | ||||||
|  |  | ||||||
|  | Condition | ||||||
|  |  | ||||||
|  |  This document is written to describe the situation as it is right | ||||||
|  |  now. libcurl 7.15.0 is currently the latest version available. Things may (or | ||||||
|  |  perhaps will) of course change in the future. | ||||||
|  |  | ||||||
|  |  This document reflects my view and understanding of these things. Please tell | ||||||
|  |  me where and how you think I'm wrong, and I'll try to correct my mistakes. | ||||||
|  |  | ||||||
|  | Background  | ||||||
|  |  | ||||||
|  |  The Free Software Foundation has deemed the Original BSD license[1] to be | ||||||
|  |  "incompatible"[2] with GPL[3]. I'd rather say it is the other way around, but | ||||||
|  |  the point is the same: if you distribute a binary version of a GPL program, | ||||||
|  |  it MUST NOT be linked with any Original BSD-licensed parts or | ||||||
|  |  libraries. Doing so will violate the GPL license. For a long time, very many | ||||||
|  |  GPL licensed programs have avoided this license mess by adding an | ||||||
|  |  exception[8] to their license. And many others have just closed their eyes | ||||||
|  |  for this problem. | ||||||
|  |  | ||||||
|  |  libcurl is MIT-style[4] licensed - how on earth did this dilemma fall onto | ||||||
|  |  our plates? | ||||||
|  |  | ||||||
|  |  libcurl is only a little library. libcurl can be built to use OpenSSL for its | ||||||
|  |  SSL/TLS capabilities. OpenSSL is basically Original BSD licensed[5]. | ||||||
|  |  | ||||||
|  |  If libcurl built to use OpenSSL is used by a GPL-licensed application and you | ||||||
|  |  decide to distribute a binary version of it (Linux distros - for example - | ||||||
|  |  tend to), you have a clash. GPL vs Original BSD. | ||||||
|  |  | ||||||
|  |  This dilemma is not libcurl-specific nor is it specific to any particular | ||||||
|  |  Linux distro. (This article mentions and refers to Debian several times, but | ||||||
|  |  only because Debian seems to be the only Linux distro to have faced this | ||||||
|  |  issue yet since no other distro is shipping libcurl built with two SSL | ||||||
|  |  libraries.) | ||||||
|  |  | ||||||
|  | Part of the Operating System | ||||||
|  |  | ||||||
|  |  This would not be a problem if the used lib would be considered part of the | ||||||
|  |  underlying operating system, as then the GPL license has an exception | ||||||
|  |  clause[6] that allows applications to use such libs without having to be | ||||||
|  |  allowed to distribute it or its sources. Possibly some distros will claim | ||||||
|  |  that OpenSSL is part of their operating system. | ||||||
|  |  | ||||||
|  |  Debian does however not take this stance and has officially(?) claimed that | ||||||
|  |  OpenSSL is not a required part of the Debian operating system | ||||||
|  |  | ||||||
|  | Debian-legal | ||||||
|  |  | ||||||
|  |  In August 2004 I figured I should start pulling people's attention to this to | ||||||
|  |  see if anyone has any bright ideas or if they would dismiss my worries based | ||||||
|  |  on some elegant writing I had missed somewhere: | ||||||
|  |  | ||||||
|  |  My post to debian-legal on August 12 2004: | ||||||
|  |  | ||||||
|  |         http://lists.debian.org/debian-legal/2004/08/msg00279.html | ||||||
|  |  | ||||||
|  |  Several people agreed then that this is a known and rather big problem, but | ||||||
|  |  the following discussion didn't result in much. | ||||||
|  |  | ||||||
|  | GnuTLS | ||||||
|  |  | ||||||
|  |  With the release of libcurl 7.14.0 (May 2005), it can now get built to use | ||||||
|  |  GnuTLS instead of OpenSSL. GnuTLS is a LGPL[7] licensed library that offers a | ||||||
|  |  matching set of features as OpenSSL does. Now, you can build and distribute | ||||||
|  |  an SSL capable libcurl without including any Original BSD licensed code. | ||||||
|  |  | ||||||
|  |  I believe Debian is the first distro to provide libcurl/GnutTLS packages. | ||||||
|  |  | ||||||
|  | GnuTLS vs OpenSSL | ||||||
|  |  | ||||||
|  |  While these two libraries offer similar features, they are not equal. Both | ||||||
|  |  libraries have features the other one lacks. libcurl does not (yet) offer a | ||||||
|  |  standardized stable ABI if you decide to switch from using libcurl-openssl to | ||||||
|  |  libcurl-gnutls or vice versa. The GnuTLS support is very recent in libcurl | ||||||
|  |  and it has not been tested nor used very extensively, while the OpenSSL | ||||||
|  |  equivalent code has been used and thus matured for more than seven (7) years. | ||||||
|  |  | ||||||
|  |  In August 2005, the debian-devel mailing list discovered the license issue as | ||||||
|  |  a GPL licensed application wanted SSL capabilities from libcurl and thus was | ||||||
|  |  forced to use the GnuTLS powered libcurl. For a reason that is unknown to me, | ||||||
|  |  the application authors didn't want to or was unable to add an exception to | ||||||
|  |  their GPL license. Alas, the license problem hit the fan again. | ||||||
|  |  | ||||||
|  |  GnuTLS | ||||||
|  |    - LGPL licensened | ||||||
|  |    - supports SRP | ||||||
|  |    - lacks SSLv2 support | ||||||
|  |    - lacks MD2 support (used by at least some CA certs) | ||||||
|  |  | ||||||
|  |  OpenSSL | ||||||
|  |    - Original BSD licensened | ||||||
|  |    - lacks SRP | ||||||
|  |    - supports SSLv2 | ||||||
|  |    - older and more widely used | ||||||
|  |  | ||||||
|  | The Better License, Original BSD or LGPL? | ||||||
|  |  | ||||||
|  |  It isn't obvious or without debate to any objective interested party that | ||||||
|  |  either of these licenses are the "better" or even the "preferred" one in a | ||||||
|  |  generic situation. | ||||||
|  |  | ||||||
|  |  Instead, I think we should accept the fact that the SSL/TLS libraries and | ||||||
|  |  their different licenses will fit different applications and their authors | ||||||
|  |  differently depending on the applications' licenses and their general usage | ||||||
|  |  pattern (considering how LGPL libraries for example can be burdensome for | ||||||
|  |  embedded systems usage). | ||||||
|  |  | ||||||
|  |  In Debian land, there seems to be a common opinion that LGPL is "maximally | ||||||
|  |  compatible" with apps while Original BSD is not. Like this: | ||||||
|  |  | ||||||
|  |         http://lists.debian.org/debian-devel/2005/09/msg01417.html | ||||||
|  |  | ||||||
|  | More SSL Libraries | ||||||
|  |  | ||||||
|  |  In libcurl, there's no stopping us here. There are at least a few more Open | ||||||
|  |  Source/Free SSL/TLS libraries and we would very much like to support them as | ||||||
|  |  well, to offer application authors an even wider scope of choice. | ||||||
|  |  | ||||||
|  | Application Angle of this Problem | ||||||
|  |  | ||||||
|  |  libcurl is built to use one SSL/TLS library. It uses a single fixed name (by | ||||||
|  |  default), and applications are built/linked to use that single lib. Replacing | ||||||
|  |  one libcurl instance with another one that uses the other SSL/TLS library | ||||||
|  |  might break one or more applications (due to ABI differences and/or different | ||||||
|  |  feature set). You want your application to use the libcurl it was built for. | ||||||
|  |  | ||||||
|  | Project cURL Angle of this Problem | ||||||
|  |  | ||||||
|  |  We distribute libcurl and everyone may build libcurl with either library. At | ||||||
|  |  their choice. This problem is not directly a problem of ours. It merely | ||||||
|  |  affects users - GPL application authors only - of our lib as it comes | ||||||
|  |  included and delivered on some distros. | ||||||
|  |  | ||||||
|  |  libcurl has different ABI when built with different SSL/TLS libraries due to | ||||||
|  |  two reasons: | ||||||
|  |  | ||||||
|  |  1. No one has worked on fixing this. The mutex/lock callbacks should be set | ||||||
|  |     with a generic libcurl function that should use the proper underlying | ||||||
|  |     functions. | ||||||
|  |  | ||||||
|  |  2. The CURLOPT_SSL_CTX_FUNCTION option is not possible to "emulate" on GnuTLS | ||||||
|  |     but simply requires OpenSSL. | ||||||
|  |  | ||||||
|  | Distro Angle of this Problem | ||||||
|  |  | ||||||
|  |  A distro can provide separate libcurls built with different SSL/TLS libraries | ||||||
|  |  to work around this, but at least Debian seems to be very hostile against | ||||||
|  |  such an approach, probably since it makes things like devel packages for the | ||||||
|  |  different libs collide since they would provide the same include files and | ||||||
|  |  man pages etc. | ||||||
|  |  | ||||||
|  | Fixing the Only Problem | ||||||
|  |  | ||||||
|  |  The only problem is thus for distributions that want to offer libcurl | ||||||
|  |  versions built with more than one SSL/TLS library. | ||||||
|  |  | ||||||
|  |  Debian is now (since mid September 2005) providing two different devel | ||||||
|  |  packages, one for libcurl built with OpenSSL and one built with GnuTLS. They | ||||||
|  |  use different .so names and can this both be installed in a single system | ||||||
|  |  simultaneously. This has previously been said as a transitional system not | ||||||
|  |  desired to keep in the long run. | ||||||
|  |  | ||||||
|  |  Since multiple libcurl binaries using different names are ruled out, we need | ||||||
|  |  to come up with a way to have one single libcurl that someone uses different | ||||||
|  |  underlying libraries. The best(?) approach currently suggested involves this: | ||||||
|  |  | ||||||
|  |  A new intermediate library (named lib2 so far in the discussions) with the | ||||||
|  |  single purpose of providing libcurl with SSL/TLS capabilities. It would have | ||||||
|  |  a unified API and ABI no matter what underlying library it would use. | ||||||
|  |  | ||||||
|  |  There would be one lib2 binary provided for each supported SSL/TLS library. | ||||||
|  |  For example: lib2-openssl, lib2-gnutls, lib2-yassl, lib2-matrixssl and | ||||||
|  |  lib2-nossl. Yes, take note of the last one that provides the lib2 ABI but | ||||||
|  |  that lacks the actual powers. | ||||||
|  |  | ||||||
|  |  When libcurl is built and linked, it will be linked against a lib2 with the | ||||||
|  |  set ABI. | ||||||
|  |  | ||||||
|  |  When you link an app against libcurl, it would also need to provide one of | ||||||
|  |  the (many) lib2 libs to decide what approach that fits the app. An app that | ||||||
|  |  doesn't want SSL at all would still need to link with the lib2-nossl lib. | ||||||
|  |  | ||||||
|  |  GPL apps can pick the lib2-gnutls, others may pick the lib2-openssl. | ||||||
|  |  | ||||||
|  |  This concept works equally well both for shared and static libraries. | ||||||
|  |  | ||||||
|  |  A positive side effect of this approach could be a more generic "de facto" | ||||||
|  |  standard API for SSL/TLS libraries. | ||||||
|  |  | ||||||
|  | When Will This Happen | ||||||
|  |  | ||||||
|  |  Note again that this is not a problem in curl, it doesn't solve any actual | ||||||
|  |  technical problems in our project. Don't hold your breath for this to happen | ||||||
|  |  very soon (if at all) unless you step forward and contribute. | ||||||
|  |  | ||||||
|  |  The suggestion that is outlined above is still only a suggestion. Feel free | ||||||
|  |  to bring a better idea! | ||||||
|  |  | ||||||
|  |  Also, to keep in mind: I don't want this new concept to have too much of an | ||||||
|  |  impact on the existing code. Preferably it should be possible to build the | ||||||
|  |  code like today (without the use of lib2), should you decide to ignore the | ||||||
|  |  problems outlined in this document. | ||||||
|  |  | ||||||
|  |  Update: Work on this has been initiated by Richard Atterer: | ||||||
|  |  | ||||||
|  |         http://curl.haxx.se/mail/lib-2005-09/0066.html | ||||||
|  |  | ||||||
|  | Footnotes | ||||||
|  |  | ||||||
|  |  [1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6 | ||||||
|  |  [2] = http://www.fsf.org/licensing/essays/bsd.html | ||||||
|  |  [3] = http://www.fsf.org/licensing/licenses/gpl.html | ||||||
|  |  [4] = http://curl.haxx.se/docs/copyright.html | ||||||
|  |  [5] = http://www.openssl.org/source/license.html | ||||||
|  |  [6] = http://www.fsf.org/licensing/licenses/gpl.html end of section 3 | ||||||
|  |  [7] = http://www.fsf.org/licensing/licenses/lgpl.html | ||||||
|  |  [8] = http://en.wikipedia.org/wiki/OpenSSL_exception | ||||||
|  |  | ||||||
|  | Feedback/Updates provided by | ||||||
|  |  | ||||||
|  |  Eric Cooper | ||||||
							
								
								
									
										241
									
								
								docs/FAQ
									
									
									
									
									
								
							
							
						
						
									
										241
									
								
								docs/FAQ
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| Updated: December 21, 2004 (http://curl.haxx.se/docs/faq.html) | Updated: November 2, 2005 (http://curl.haxx.se/docs/faq.html) | ||||||
|                                   _   _ ____  _ |                                   _   _ ____  _ | ||||||
|                               ___| | | |  _ \| | |                               ___| | | |  _ \| | | ||||||
|                              / __| | | | |_) | | |                              / __| | | | |_) | | | ||||||
| @@ -16,6 +16,8 @@ FAQ | |||||||
|   1.6 What do you get for making curl? |   1.6 What do you get for making curl? | ||||||
|   1.7 What about CURL from curl.com? |   1.7 What about CURL from curl.com? | ||||||
|   1.8 I have a problem who do I mail? |   1.8 I have a problem who do I mail? | ||||||
|  |   1.9 Where do I buy commercial support for curl? | ||||||
|  |   1.10 How many are using curl? | ||||||
|  |  | ||||||
|  2. Install Related Problems |  2. Install Related Problems | ||||||
|   2.1 configure doesn't find OpenSSL even when it is installed |   2.1 configure doesn't find OpenSSL even when it is installed | ||||||
| @@ -43,6 +45,7 @@ FAQ | |||||||
|   3.15 Can I do recursive fetches with curl? |   3.15 Can I do recursive fetches with curl? | ||||||
|   3.16 What certificates do I need when I use SSL? |   3.16 What certificates do I need when I use SSL? | ||||||
|   3.17 How do I list the root dir of an FTP server? |   3.17 How do I list the root dir of an FTP server? | ||||||
|  |   3.18 Can I use curl to send a POST/PUT and not wait for a response? | ||||||
|  |  | ||||||
|  4. Running Problems |  4. Running Problems | ||||||
|   4.1 Problems connecting to SSL servers. |   4.1 Problems connecting to SSL servers. | ||||||
| @@ -63,6 +66,8 @@ FAQ | |||||||
|   4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! |   4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! | ||||||
|   4.11 Why does my HTTP range requests return the full document? |   4.11 Why does my HTTP range requests return the full document? | ||||||
|   4.12 Why do I get "certificate verify failed" ? |   4.12 Why do I get "certificate verify failed" ? | ||||||
|  |   4.13 Why is curl -R on Windows one hour off? | ||||||
|  |   4.14 Redirects work in browser but not with curl! | ||||||
|  |  | ||||||
|  5. libcurl Issues |  5. libcurl Issues | ||||||
|   5.1 Is libcurl thread-safe? |   5.1 Is libcurl thread-safe? | ||||||
| @@ -74,6 +79,9 @@ FAQ | |||||||
|   5.7 Link errors when building libcurl on Windows! |   5.7 Link errors when building libcurl on Windows! | ||||||
|   5.8 libcurl.so.3: open failed: No such file or directory |   5.8 libcurl.so.3: open failed: No such file or directory | ||||||
|   5.9 How does libcurl resolve host names? |   5.9 How does libcurl resolve host names? | ||||||
|  |   5.10 How do I prevent libcurl from writing the response to stdout? | ||||||
|  |   5.11 How do I make libcurl not receive the whole HTTP response? | ||||||
|  |   5.12 Can I make libcurl fake or hide my real IP address? | ||||||
|  |  | ||||||
|  6. License Issues |  6. License Issues | ||||||
|   6.1 I have a GPL program, can I use the libcurl library? |   6.1 I have a GPL program, can I use the libcurl library? | ||||||
| @@ -82,6 +90,7 @@ FAQ | |||||||
|   6.4 I have a program that uses LGPL libraries, can I use libcurl? |   6.4 I have a program that uses LGPL libraries, can I use libcurl? | ||||||
|   6.5 Can I modify curl/libcurl for my program and keep the changes secret? |   6.5 Can I modify curl/libcurl for my program and keep the changes secret? | ||||||
|   6.6 Can you please change the curl/libcurl license to XXXX? |   6.6 Can you please change the curl/libcurl license to XXXX? | ||||||
|  |   6.7 What are my obligations when using libcurl in my commerical apps? | ||||||
|  |  | ||||||
|  7. PHP/CURL Issues |  7. PHP/CURL Issues | ||||||
|   7.1 What is PHP/CURL? |   7.1 What is PHP/CURL? | ||||||
| @@ -97,7 +106,7 @@ FAQ | |||||||
|   cURL is the name of the project. The name is a play on 'Client for URLs', |   cURL is the name of the project. The name is a play on 'Client for URLs', | ||||||
|   originally with URL spelled in uppercase to make it obvious it deals with |   originally with URL spelled in uppercase to make it obvious it deals with | ||||||
|   URLs. The fact it can also be pronounced 'see URL' also helped, it works as |   URLs. The fact it can also be pronounced 'see URL' also helped, it works as | ||||||
|   an abbrivation for "Client URL Request Library" or why not the recursive |   an abbreviation for "Client URL Request Library" or why not the recursive | ||||||
|   version: "Curl URL Request Library". |   version: "Curl URL Request Library". | ||||||
|  |  | ||||||
|   The cURL project produces two products: |   The cURL project produces two products: | ||||||
| @@ -105,7 +114,7 @@ FAQ | |||||||
|   libcurl |   libcurl | ||||||
|  |  | ||||||
|     A free and easy-to-use client-side URL transfer library, supporting FTP, |     A free and easy-to-use client-side URL transfer library, supporting FTP, | ||||||
|     FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and LDAP.  libcurl supports |     FTPS, HTTP, HTTPS, TELNET, DICT, FILE and LDAP.  libcurl supports | ||||||
|     HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP |     HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP | ||||||
|     form based upload, proxies, cookies, user+password authentication, file |     form based upload, proxies, cookies, user+password authentication, file | ||||||
|     transfer resume, http proxy tunneling and more! |     transfer resume, http proxy tunneling and more! | ||||||
| @@ -123,16 +132,15 @@ FAQ | |||||||
|     A command line tool for getting or sending files using URL syntax. |     A command line tool for getting or sending files using URL syntax. | ||||||
|  |  | ||||||
|     Since curl uses libcurl, it supports a range of common Internet protocols, |     Since curl uses libcurl, it supports a range of common Internet protocols, | ||||||
|     currently including HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and |     currently including HTTP, HTTPS, FTP, FTPS, LDAP, DICT, TELNET and FILE. | ||||||
|     FILE. |  | ||||||
|  |  | ||||||
|   We pronounce curl and cURL with an initial k sound: [kurl]. |   We pronounce curl and cURL with an initial k sound: [kurl]. | ||||||
|  |  | ||||||
|   NOTE: there are numerous sub-projects and related projects that also use the |   There are numerous sub-projects and related projects that also use the word | ||||||
|   word curl in the project names in various combinations, but you should take |   curl in the project names in various combinations, but you should take | ||||||
|   notice that this FAQ is directed at the command-line tool named curl (and |   notice that this FAQ is directed at the command-line tool named curl (and | ||||||
|   libcurl the library), and may therefore not be valid for other curl-related |   libcurl the library), and may therefore not be valid for other curl-related | ||||||
|   projects. |   projects. (There is however a small section for the PHP/CURL in this FAQ.) | ||||||
|  |  | ||||||
|   1.2 What is libcurl? |   1.2 What is libcurl? | ||||||
|  |  | ||||||
| @@ -142,6 +150,10 @@ FAQ | |||||||
|   You can use libcurl for free in your application, be it open source, |   You can use libcurl for free in your application, be it open source, | ||||||
|   commercial or closed-source. |   commercial or closed-source. | ||||||
|  |  | ||||||
|  |   libcurl is most probably the most portable, most powerful and most often | ||||||
|  |   used C-based multi-platform file transfer library on this planet - be it | ||||||
|  |   open source or commercial. | ||||||
|  |  | ||||||
|   1.3 What is curl not? |   1.3 What is curl not? | ||||||
|  |  | ||||||
|   Curl is *not* a wget clone. That is a common misconception.  Never, during |   Curl is *not* a wget clone. That is a common misconception.  Never, during | ||||||
| @@ -193,15 +205,14 @@ FAQ | |||||||
|  |  | ||||||
|   1.5 Who makes curl? |   1.5 Who makes curl? | ||||||
|  |  | ||||||
|   curl and libcurl are not made by any single individual. Sure, Daniel |   curl and libcurl are not made by any single individual. Daniel Stenberg is | ||||||
|   Stenberg writes the major parts, but other persons' submissions are |   project leader and main developer, but other persons' submissions are | ||||||
|   important and crucial. Anyone can contribute and post their changes and |   important and crucial. Anyone can contribute and post their changes and | ||||||
|   improvements and have them inserted in the main sources (of course on the |   improvements and have them inserted in the main sources (of course on the | ||||||
|   condition that developers agree on that the fixes are good). |   condition that developers agree on that the fixes are good). | ||||||
|  |  | ||||||
|   The list of contributors in the docs/THANKS file is only a small part of all |   The full list of the more than 450 contributors is found in the docs/THANKS | ||||||
|   the people that every day provide us with bug reports, suggestions, ideas |   file. | ||||||
|   and source code. |  | ||||||
|  |  | ||||||
|   curl is developed by a community, with Daniel at the wheel. |   curl is developed by a community, with Daniel at the wheel. | ||||||
|  |  | ||||||
| @@ -216,12 +227,8 @@ FAQ | |||||||
|   have sponsored certain parts of the development in the past and I hope some |   have sponsored certain parts of the development in the past and I hope some | ||||||
|   will continue to do so in the future. |   will continue to do so in the future. | ||||||
|  |  | ||||||
|   If you want to support our project with a donation or similar, one way of |   If you want to support our project, consider a donation or a banner-program | ||||||
|   doing that would be to buy "gift certificates" at useful online shopping |   or even better: by helping us coding, documenting, testing etc. | ||||||
|   sites, such as amazon.com or thinkgeek.com. Another way would be to sponsor |  | ||||||
|   us through a banner-program or even better: by helping us coding, |  | ||||||
|   documenting, testing etc. You're welcome to send us a buck using paypal, as |  | ||||||
|   described here: http://curl.haxx.se/donation.html |  | ||||||
|  |  | ||||||
|   1.7 What about CURL from curl.com? |   1.7 What about CURL from curl.com? | ||||||
|  |  | ||||||
| @@ -252,6 +259,58 @@ FAQ | |||||||
|   users thanks to the web based archives of the mailing lists), thus saving us |   users thanks to the web based archives of the mailing lists), thus saving us | ||||||
|   from having to repeat ourselves even more. Thanks for respecting this. |   from having to repeat ourselves even more. Thanks for respecting this. | ||||||
|  |  | ||||||
|  |   If you have found or simply suspect a security problem in curl or libcurl, | ||||||
|  |   mail curl-security at haxx.se (closed list of receivers, mails are not | ||||||
|  |   disclosed) and tell. Then we can produce a fix in a timely manner before the | ||||||
|  |   flaw is announced to the world, thus lessen the impact the problem will have | ||||||
|  |   on existing users. | ||||||
|  |  | ||||||
|  |   1.9 Where do I buy commercial support for curl? | ||||||
|  |  | ||||||
|  |   curl is fully open source. It means you can hire any skilled engineer to fix | ||||||
|  |   your curl-related problems. | ||||||
|  |  | ||||||
|  |   We list available alternatives on the curl web site: | ||||||
|  |   http://curl.haxx.se/support.html | ||||||
|  |  | ||||||
|  |   1.10 How many are using curl? | ||||||
|  |  | ||||||
|  |   It is impossible to tell. | ||||||
|  |  | ||||||
|  |   We don't know how many users that knowingly have installed and use curl. | ||||||
|  |  | ||||||
|  |   We don't know how many users that use curl without knowing that they are in | ||||||
|  |   fact using it. | ||||||
|  |  | ||||||
|  |   We don't know how many users that downloaded or installed curl and then | ||||||
|  |   never use it. | ||||||
|  |  | ||||||
|  |   Some facts to use as input to the math: | ||||||
|  |  | ||||||
|  |   curl packages have been downloaded from the curl.haxx.se site well over a | ||||||
|  |   million times. curl is installed by default with most Linux | ||||||
|  |   distributions. curl is installed by default with Mac OS X. curl and libcurl | ||||||
|  |   as used by numerous applications that include libcurl binaries in their | ||||||
|  |   distribution packages (like Adobe Acrobat Reader and Google Earth). | ||||||
|  |  | ||||||
|  |   More than 40 known named companies use curl in commercial environments and | ||||||
|  |   products. More than 100 known named open source projects depend on | ||||||
|  |   (lib)curl. | ||||||
|  |  | ||||||
|  |   In a poll on the curl web site mid-2005, more than 50% of the 300+ answers | ||||||
|  |   estimated a user base of one million users or more. | ||||||
|  |  | ||||||
|  |   In March 2005, the "Linux Counter project" estimated a total Linux user base | ||||||
|  |   of some 29 millions, while Netcraft detected some 4 million "active" Linux | ||||||
|  |   based web servers. A guess is that a fair amount of these Linux | ||||||
|  |   installations have curl installed. | ||||||
|  |  | ||||||
|  |   http://curl.haxx.se/docs/companies.html | ||||||
|  |   http://curl.haxx.se/docs/programs.html | ||||||
|  |   http://curl.haxx.se/libcurl/using/apps.html | ||||||
|  |   http://counter.li.org/estimates.php | ||||||
|  |   http://news.netcraft.com/archives/2005/03/14/fedora_makes_rapid_progress.html | ||||||
|  |  | ||||||
|  |  | ||||||
| 2. Install Related Problems | 2. Install Related Problems | ||||||
|  |  | ||||||
| @@ -296,8 +355,8 @@ FAQ | |||||||
|  |  | ||||||
|   2.2 Does curl work/build with other SSL libraries? |   2.2 Does curl work/build with other SSL libraries? | ||||||
|  |  | ||||||
|   Curl has been written to use OpenSSL, although there should not be much |   Curl has been written to use OpenSSL or GnuTLS, although there should not be | ||||||
|   problems using a different library. If anyone does "port" curl to use a |   many problems using a different library. If anyone does "port" curl to use a | ||||||
|   different SSL library, we are of course very interested in getting the |   different SSL library, we are of course very interested in getting the | ||||||
|   patch! |   patch! | ||||||
|  |  | ||||||
| @@ -392,6 +451,8 @@ FAQ | |||||||
|  |  | ||||||
|      curl -L http://redirector.com |      curl -L http://redirector.com | ||||||
|  |  | ||||||
|  |   Not all redirects are HTTP ones, see 4.14 | ||||||
|  |  | ||||||
|   3.9 How do I use curl in my favorite programming language? |   3.9 How do I use curl in my favorite programming language? | ||||||
|  |  | ||||||
|   There exist many language interfaces/bindings for curl that integrates it |   There exist many language interfaces/bindings for curl that integrates it | ||||||
| @@ -503,24 +564,26 @@ FAQ | |||||||
|     If the server doesn't require this, you don't need a client certificate. |     If the server doesn't require this, you don't need a client certificate. | ||||||
|  |  | ||||||
|   - Server certificate. The server you communicate with has a server |   - Server certificate. The server you communicate with has a server | ||||||
|     certificate. You can and should verify this certficate to make sure that |     certificate. You can and should verify this certificate to make sure that | ||||||
|     you are truly talking to the real server and not a server impersonating |     you are truly talking to the real server and not a server impersonating | ||||||
|     it. The server certificate verifaction process is made by using a |     it. | ||||||
|     Certificate Authority certificate ("CA cert") that was used to sign the |  | ||||||
|     server certificate. Server certificate verification is enabled by default |  | ||||||
|     in curl and libcurl and is often the reason for problems as explained in |  | ||||||
|     FAQ entry 4.12 and the SSLCERTS document |  | ||||||
|     (http://curl.haxx.se/docs/sslcerts.html). Server certificates that are |  | ||||||
|     "self-signed" or otherwise signed by a CA that you do not have a CA cert |  | ||||||
|     for, cannot be verified. If the verification during a connect fails, you |  | ||||||
|     are refused access. You then need to explicitly disable the verification |  | ||||||
|     to connect to the server. |  | ||||||
|  |  | ||||||
|   - Certificate Authority certificate ("CA cert"). You often have several CA |   - Certificate Authority certificate ("CA cert"). You often have several CA | ||||||
|     certs in a CA cert bundle that can be used to verify a server certificate |     certs in a CA cert bundle that can be used to verify a server certificate | ||||||
|     that was signed by one of the authorities in the bundle. curl comes with a |     that was signed by one of the authorities in the bundle. curl comes with a | ||||||
|     default CA cert bundle. You can override the default. |     default CA cert bundle. You can override the default. | ||||||
|  |  | ||||||
|  |     The server certificate verification process is made by using a Certificate | ||||||
|  |     Authority certificate ("CA cert") that was used to sign the server | ||||||
|  |     certificate. Server certificate verification is enabled by default in curl | ||||||
|  |     and libcurl and is often the reason for problems as explained in FAQ entry | ||||||
|  |     4.12 and the SSLCERTS document | ||||||
|  |     (http://curl.haxx.se/docs/sslcerts.html). Server certificates that are | ||||||
|  |     "self-signed" or otherwise signed by a CA that you do not have a CA cert | ||||||
|  |     for, cannot be verified. If the verification during a connect fails, you | ||||||
|  |     are refused access. You then need to explicitly disable the verification | ||||||
|  |     to connect to the server. | ||||||
|  |  | ||||||
|   3.17 How do I list the root dir of an FTP server? |   3.17 How do I list the root dir of an FTP server? | ||||||
|  |  | ||||||
|   There are two ways. The way defined in the RFC is to use an encoded slash |   There are two ways. The way defined in the RFC is to use an encoded slash | ||||||
| @@ -533,6 +596,12 @@ FAQ | |||||||
|  |  | ||||||
|      curl ftp://ftp.sunet.se//tmp/ |      curl ftp://ftp.sunet.se//tmp/ | ||||||
|  |  | ||||||
|  |   3.18 Can I use curl to send a POST/PUT and not wait for a response? | ||||||
|  |   | ||||||
|  |   No. | ||||||
|  |  | ||||||
|  |   But you could easily write your own program using libcurl to do such stunts. | ||||||
|  |  | ||||||
|  |  | ||||||
| 4. Running Problems | 4. Running Problems | ||||||
|  |  | ||||||
| @@ -726,6 +795,28 @@ FAQ | |||||||
|   Details are also in the SSLCERTS file in the release archives, found online |   Details are also in the SSLCERTS file in the release archives, found online | ||||||
|   here: http://curl.haxx.se/docs/sslcerts.html |   here: http://curl.haxx.se/docs/sslcerts.html | ||||||
|  |  | ||||||
|  |   4.13 Why is curl -R on Windows one hour off? | ||||||
|  |  | ||||||
|  |   During daylight savings time, when -R is used, curl will set a time that | ||||||
|  |   appears one hour off. This happens due to a flaw in how Windows stores and | ||||||
|  |   uses file modification times and it is not easily worked around. For details | ||||||
|  |   on this problem, read this: http://www.codeproject.com/datetime/dstbugs.asp | ||||||
|  |  | ||||||
|  |   4.14 Redirects work in browser but not with curl! | ||||||
|  |  | ||||||
|  |   curl supports HTTP redirects fine (see item 3.8). Browsers generally support | ||||||
|  |   at least two other ways to perform directs that curl does not: | ||||||
|  |  | ||||||
|  |   - Meta tags. You can write a HTML tag that will cause the browser to | ||||||
|  |     redirect to another given URL after a certain time. | ||||||
|  |  | ||||||
|  |   - Javascript. You can write a javascript program embeded in a HTML page | ||||||
|  |     that redirects the browser to another given URL. | ||||||
|  |  | ||||||
|  |   There is no way to make curl follow these redirects. You must either | ||||||
|  |   manually figure out what the page is set to do, or you write a script that | ||||||
|  |   parses the results and fetches the new URL. | ||||||
|  |  | ||||||
|  |  | ||||||
| 5. libcurl Issues | 5. libcurl Issues | ||||||
|  |  | ||||||
| @@ -733,12 +824,20 @@ FAQ | |||||||
|  |  | ||||||
|   Yes. |   Yes. | ||||||
|  |  | ||||||
|   We have written the libcurl code specificly adjusted for multi-threaded |   We have written the libcurl code specifically adjusted for multi-threaded | ||||||
|   programs. libcurl will use thread-safe functions instead of non-safe ones if |   programs. libcurl will use thread-safe functions instead of non-safe ones if | ||||||
|   your system has such. |   your system has such. | ||||||
|  |  | ||||||
|   We would appreciate some kind of report or README file from those who have |   If you use a OpenSSL-powered libcurl in a multi-threaded environment, you | ||||||
|   used libcurl in a threaded environment. |   need to provide one or two locking functions: | ||||||
|  |  | ||||||
|  |     http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION | ||||||
|  |  | ||||||
|  |   If you use a GnuTLS-powered libcurl in a multi-threaded environment, you | ||||||
|  |   need to provide locking function(s) for libgcrypt (which is used by GnuTLS | ||||||
|  |   for the crypto functions). | ||||||
|  |  | ||||||
|  |     http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html | ||||||
|  |  | ||||||
|   5.2 How can I receive all data into a large memory chunk? |   5.2 How can I receive all data into a large memory chunk? | ||||||
|  |  | ||||||
| @@ -750,8 +849,8 @@ FAQ | |||||||
|  |  | ||||||
|   One solution to this problem could be to have a pointer to a struct that you |   One solution to this problem could be to have a pointer to a struct that you | ||||||
|   pass to the callback function. You set the pointer using the |   pass to the callback function. You set the pointer using the | ||||||
|   curl_easy_setopt(CURLOPT_FILE) function. Then that pointer will be passed to |   CURLOPT_WRITEDATA option. Then that pointer will be passed to the callback | ||||||
|   the callback instead of a FILE * to a file: |   instead of a FILE * to a file: | ||||||
|  |  | ||||||
|         /* imaginary struct */ |         /* imaginary struct */ | ||||||
|         struct MemoryStruct { |         struct MemoryStruct { | ||||||
| @@ -858,7 +957,10 @@ FAQ | |||||||
|  |  | ||||||
|   5.9 How does libcurl resolve host names? |   5.9 How does libcurl resolve host names? | ||||||
|  |  | ||||||
|   libcurl includes a number of different name resolve functions: |   libcurl supports a large a number of different name resolve functions. One | ||||||
|  |   of them is picked at build-time and will be used unconditionally. Thus, if | ||||||
|  |   you want to change name resolver function you must rebuild libcurl and tell | ||||||
|  |   it to use a different function. | ||||||
|  |  | ||||||
|   - The non-ipv6 resolver that can use one out of four host name resolve calls |   - The non-ipv6 resolver that can use one out of four host name resolve calls | ||||||
|     (depending on what your system supports): |     (depending on what your system supports): | ||||||
| @@ -871,12 +973,43 @@ FAQ | |||||||
|   - The ipv6-resolver that uses getaddrinfo() |   - The ipv6-resolver that uses getaddrinfo() | ||||||
|  |  | ||||||
|   - The c-ares based name resolver that uses the c-ares library for resolves. |   - The c-ares based name resolver that uses the c-ares library for resolves. | ||||||
|  |     Using this offers asynchronous name resolves but it currently has no IPv6 | ||||||
|  |     support. | ||||||
|  |  | ||||||
|   - The Windows threaded resolver. It use: |   - The Windows threaded resolver. It use: | ||||||
|  |  | ||||||
|     A - gethostbyname() on plain ipv4 windows hosts |     A - gethostbyname() on plain ipv4 windows hosts | ||||||
|     B - getaddrinfo() on ipv6-enabled windows hosts |     B - getaddrinfo() on ipv6-enabled windows hosts | ||||||
|  |  | ||||||
|  |   Also note that libcurl never resolves or reverse-lookups addresses given as | ||||||
|  |   pure numbers, such as 127.0.0.1 or ::1. | ||||||
|  |  | ||||||
|  |   5.10 How do I prevent libcurl from writing the response to stdout? | ||||||
|  |  | ||||||
|  |   libcurl provides a default built-in write function that writes received data | ||||||
|  |   to stdout. Set the CURLOPT_WRITEFUNCTION to receive the data, or possibly | ||||||
|  |   set CURLOPT_WRITEDATA to a different FILE * handle. | ||||||
|  |  | ||||||
|  |   5.11 How do I make libcurl not receive the whole HTTP response? | ||||||
|  |  | ||||||
|  |   You make the write callback (or progress callback) return an error and | ||||||
|  |   libcurl will then abort the transfer. | ||||||
|  |  | ||||||
|  |   5.12 Can I make libcurl fake or hide my real IP address? | ||||||
|  |  | ||||||
|  |   No. libcurl operates on a higher level than so. Besides, faking IP address | ||||||
|  |   would imply sending IP packages with a made-up source address, and then you | ||||||
|  |   normally get a problem with intercepting the packages sent back as they | ||||||
|  |   would then not be routed to you! | ||||||
|  |  | ||||||
|  |   If you use a proxy to access remote sites, the sites will not see your local | ||||||
|  |   IP address but instead the address of the proxy. | ||||||
|  |  | ||||||
|  |   Also note that on many networks NATs or other IP-munging techniques are used | ||||||
|  |   that makes you see and use a different IP address locally than what the | ||||||
|  |   remote server will see you coming from. | ||||||
|  |  | ||||||
|  |  | ||||||
| 6. License Issues | 6. License Issues | ||||||
|  |  | ||||||
|   Curl and libcurl are released under a MIT/X derivate license. The license is |   Curl and libcurl are released under a MIT/X derivate license. The license is | ||||||
| @@ -884,6 +1017,9 @@ FAQ | |||||||
|   is just a brief summary for the cases we get the most questions. (Parts of |   is just a brief summary for the cases we get the most questions. (Parts of | ||||||
|   this section was much enhanced by Bjorn Reese.) |   this section was much enhanced by Bjorn Reese.) | ||||||
|  |  | ||||||
|  |   We are not lawyers and this is not legal advice. You should probably consult | ||||||
|  |   one if you want true and accurate legal insights without our prejudice. | ||||||
|  |  | ||||||
|   6.1 I have a GPL program, can I use the libcurl library? |   6.1 I have a GPL program, can I use the libcurl library? | ||||||
|  |  | ||||||
|   Yes! |   Yes! | ||||||
| @@ -928,13 +1064,38 @@ FAQ | |||||||
|   libraries that use it. It should be possible for everyone to use libcurl or |   libraries that use it. It should be possible for everyone to use libcurl or | ||||||
|   curl in their projects, no matter what license they already have in use. |   curl in their projects, no matter what license they already have in use. | ||||||
|  |  | ||||||
|  |   6.7 What are my obligations when using libcurl in my commerical apps? | ||||||
|  |  | ||||||
|  |   Next to none. All you need to adhere to is the MIT-style license (stated in | ||||||
|  |   the COPYING file) which basically says you have to include the copyright | ||||||
|  |   notice in "all copies" and that you may not use the copyright holder's name | ||||||
|  |   when promoting your software. | ||||||
|  |  | ||||||
|  |   You do not have to release any of your source code. | ||||||
|  |  | ||||||
|  |   You do not have to reveal or make public any changes to the libcurl source | ||||||
|  |   code. | ||||||
|  |  | ||||||
|  |   You do not have to reveal or make public that you are using libcurl within | ||||||
|  |   your app. | ||||||
|  |  | ||||||
|  |   As can be seen here: http://curl.haxx.se/docs/companies.html and | ||||||
|  |   elsewhere, more and more companies are dicovering the power | ||||||
|  |   of libcurl and take advantage of it even in commercial environments. | ||||||
|  |  | ||||||
|  |  | ||||||
| 7. PHP/CURL Issues | 7. PHP/CURL Issues | ||||||
|  |  | ||||||
|   7.1 What is PHP/CURL? |   7.1 What is PHP/CURL? | ||||||
|  |  | ||||||
|   The module for PHP that makes it possible for PHP programs to access curl- |   The module for PHP that makes it possible for PHP programs to access curl- | ||||||
|   functions from within PHP. We often call it PHP/CURL to differentiate from |   functions from within PHP. | ||||||
|   curl the command line tool and libcurl the library. |  | ||||||
|  |   In the cURL project we call this module PHP/CURL to differentiate it from | ||||||
|  |   curl the command line tool and libcurl the library. The PHP team however | ||||||
|  |   does not refer to it like this (for unknown reasons). They call it plain | ||||||
|  |   CURL (often using all caps) which causes much confusion to users which in | ||||||
|  |   turn gives us a higher question load. | ||||||
|  |  | ||||||
|   7.2 Who write PHP/CURL? |   7.2 Who write PHP/CURL? | ||||||
|  |  | ||||||
|   | |||||||
| @@ -62,11 +62,11 @@ HTTP | |||||||
|  |  | ||||||
| HTTPS (*1) | HTTPS (*1) | ||||||
|  - (all the HTTP features) |  - (all the HTTP features) | ||||||
|  - using certificates |  - using client certificates | ||||||
|  - verify server certificate |  - verify server certificate | ||||||
|  - via http-proxy |  - via http-proxy | ||||||
|  - select desired encryption |  - select desired encryption | ||||||
|  - force usage of a specific SSL version (SSLv2, SSLv3 or TLSv1) |  - force usage of a specific SSL version (SSLv2(*7), SSLv3 or TLSv1) | ||||||
|  |  | ||||||
| FTP | FTP | ||||||
|  - download |  - download | ||||||
| @@ -95,6 +95,9 @@ FTPS (*1) | |||||||
|  - implicit "AUTH TSL" and "AUTH SSL" usage to "upgrade" plain ftp:// |  - implicit "AUTH TSL" and "AUTH SSL" usage to "upgrade" plain ftp:// | ||||||
|    connection to use SSL for both or one of the connections |    connection to use SSL for both or one of the connections | ||||||
|  |  | ||||||
|  | TFTP | ||||||
|  |  - download / upload | ||||||
|  |  | ||||||
| TELNET | TELNET | ||||||
|  - connection negotiation |  - connection negotiation | ||||||
|  - custom telnet options |  - custom telnet options | ||||||
| @@ -106,10 +109,6 @@ LDAP (*2) | |||||||
| DICT | DICT | ||||||
|  - extended DICT URL support |  - extended DICT URL support | ||||||
|  |  | ||||||
| GOPHER |  | ||||||
|  - GET |  | ||||||
|  - via http-proxy |  | ||||||
|  |  | ||||||
| FILE | FILE | ||||||
|  - URL support |  - URL support | ||||||
|  - "uploads" |  - "uploads" | ||||||
| @@ -118,9 +117,10 @@ FILE | |||||||
| FOOTNOTES | FOOTNOTES | ||||||
| ========= | ========= | ||||||
|  |  | ||||||
|   *1 = requires OpenSSL |   *1 = requires OpenSSL or GnuTLS | ||||||
|   *2 = requires OpenLDAP |   *2 = requires OpenLDAP | ||||||
|   *3 = requires a GSSAPI-compliant library, such as Heimdal or similar. |   *3 = requires a GSSAPI-compliant library, such as Heimdal or similar. | ||||||
|   *4 = requires FBopenssl |   *4 = requires FBopenssl | ||||||
|   *5 = requires a krb4 library, such as the MIT one or similar. |   *5 = requires a krb4 library, such as the MIT one or similar. | ||||||
|   *6 = requires c-ares |   *6 = requires c-ares | ||||||
|  |   *7 = requires OpenSSL specificly, as GnuTLS only supports SSLv3 and TLSv1 | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								docs/HISTORY
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								docs/HISTORY
									
									
									
									
									
								
							| @@ -114,6 +114,8 @@ distributions and otherwise retrieved as part of other software. | |||||||
| September 2002, with the release of curl 7.10 it is released under the MIT | September 2002, with the release of curl 7.10 it is released under the MIT | ||||||
| license only. | license only. | ||||||
|  |  | ||||||
|  | January 2003. Started working on the distributed curl tests. The autobuilds. | ||||||
|  |  | ||||||
| February 2003, the curl site averages at 20000 visits weekly. At any given | February 2003, the curl site averages at 20000 visits weekly. At any given | ||||||
| moment, there's an average of 3 people browsing the curl.haxx.se site. | moment, there's an average of 3 people browsing the curl.haxx.se site. | ||||||
|  |  | ||||||
| @@ -139,3 +141,13 @@ August 2004: | |||||||
|  Number of public functions in libcurl:    36 |  Number of public functions in libcurl:    36 | ||||||
|  Amount of public web site mirrors:        12 |  Amount of public web site mirrors:        12 | ||||||
|  Number of known libcurl bindings:         26 |  Number of known libcurl bindings:         26 | ||||||
|  |  | ||||||
|  | April 2005: | ||||||
|  |  | ||||||
|  | GnuTLS can now optionally be used for the secure layer when curl is built. | ||||||
|  |  | ||||||
|  | September 2005: | ||||||
|  |  | ||||||
|  | TFTP support was added. | ||||||
|  |  | ||||||
|  | More than 100,000 unique visitors of the curl web site. 25 mirrors. | ||||||
|   | |||||||
							
								
								
									
										296
									
								
								docs/INSTALL
									
									
									
									
									
								
							
							
						
						
									
										296
									
								
								docs/INSTALL
									
									
									
									
									
								
							| @@ -132,172 +132,150 @@ UNIX | |||||||
| Win32 | Win32 | ||||||
| ===== | ===== | ||||||
|  |  | ||||||
|    Without SSL: |    MingW32 | ||||||
|  |    ------- | ||||||
|  |  | ||||||
|       MingW32 (GCC-2.95) style |    Run the 'mingw32.bat' file to get the proper environment variables set, | ||||||
|       ------------------------ |    then run 'make mingw32' in the root dir. Use  'make mingw32-ssl' to build | ||||||
|         Run the 'mingw32.bat' file to get the proper environment variables |    curl SSL enabled. | ||||||
|         set, then run 'make mingw32' in the root dir. |  | ||||||
|  |  | ||||||
|         If you have any problems linking libraries or finding header files, be |    If you have any problems linking libraries or finding header files, be sure | ||||||
|         sure to verify that the provided "Makefile.m32" files use the proper |    to verify that the provided "Makefile.m32" files use the proper paths, and | ||||||
|         paths, and adjust as necessary. |    adjust as necessary. | ||||||
|  |  | ||||||
|       Cygwin style |    Cygwin | ||||||
|       ------------ |    ------ | ||||||
|         Almost identical to the unix installation. Run the configure script in |  | ||||||
|         the curl root with 'sh configure'. Make sure you have the sh |  | ||||||
|         executable in /bin/ or you'll see the configure fail towards the end. |  | ||||||
|  |  | ||||||
|         Run 'make' |    Almost identical to the unix installation. Run the configure script in the | ||||||
|  |    curl root with 'sh configure'. Make sure you have the sh executable in | ||||||
|  |    /bin/ or you'll see the configure fail towards the end. | ||||||
|  |  | ||||||
|       Microsoft command line style |    Run 'make' | ||||||
|       ---------------------------- |  | ||||||
|         Run the 'vcvars32.bat' file to get the proper environment variables |  | ||||||
|         set, then run 'nmake vc' in the root dir. |  | ||||||
|  |  | ||||||
|         The vcvars32.bat file is part of the Microsoft development |    Dev-Cpp | ||||||
|         environment. |    ------- | ||||||
|  |  | ||||||
|       IDE-style |    See the separate INSTALL.devcpp file for details. | ||||||
|       ------------------------- |  | ||||||
|         If you use VC++, Borland or similar compilers. Include all lib source |  | ||||||
|         files in a static lib "project" (all .c and .h files that is). |  | ||||||
|         (you should name it libcurl or similar) |  | ||||||
|  |  | ||||||
|         Make the sources in the src/ drawer be a "win32 console application" |    MSVC from command line | ||||||
|         project. Name it curl. |    ---------------------- | ||||||
|  |  | ||||||
|         For VC++ 6, there's an included Makefile.vc6 that should be possible |    Run the 'vcvars32.bat' file to get a proper environment. The | ||||||
|         to use out-of-the-box. |    vcvars32.bat file is part of the Microsoft development environment and | ||||||
|  |    you may find it in 'C:\Program Files\Microsoft Visual Studio\vc98\bin' | ||||||
|  |    provided that you installed Visual C/C++ 6 in the default directory. | ||||||
|  |  | ||||||
|  |    Then run 'nmake vc' in curl's root directory. | ||||||
|  |  | ||||||
|  |    If you want to compile with zlib support, you will need to build | ||||||
|  |    zlib (http://www.gzip.org/zlib/) as well. Please read the zlib | ||||||
|  |    documentation on how to compile zlib. Define the ZLIB_PATH environment | ||||||
|  |    variable to the location of zlib.h and zlib.lib, for example: | ||||||
|  |  | ||||||
|  |      set ZLIB_PATH=c:\zlib-1.2.1 | ||||||
|  |  | ||||||
|  |    Then run 'nmake vc-zlib' in curl's root directory. | ||||||
|  |  | ||||||
|  |    If you want to compile with SSL support you need the OpenSSL package. | ||||||
|  |    Please read the OpenSSL documentation on how to compile and install | ||||||
|  |    the OpenSSL libraries.  The build process of OpenSSL generates the | ||||||
|  |    libeay32.dll and ssleay32.dll files in the out32dll subdirectory in | ||||||
|  |    the OpenSSL home directory.  OpenSSL static libraries (libeay32.lib, | ||||||
|  |    ssleay32.lib, RSAglue.lib) are created in the out32 subdirectory. | ||||||
|  |  | ||||||
|  |    Before running nmake define the OPENSSL_PATH environment variable with | ||||||
|  |    the root/base directory of OpenSSL, for example: | ||||||
|  |  | ||||||
|  |      set OPENSSL_PATH=c:\openssl-0.9.7d | ||||||
|  |  | ||||||
|  |    Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root | ||||||
|  |    directory.  'nmake vc-ssl' will create a libcurl static and dynamic | ||||||
|  |    libraries in the lib subdirectory, as well as a statically linked | ||||||
|  |    version of curl.exe in the src subdirectory.  This statically linked | ||||||
|  |    version is a standalone executable not requiring any DLL at | ||||||
|  |    runtime. This make method requires that you have the static OpenSSL | ||||||
|  |    libraries available in OpenSSL's out32 subdirectory. | ||||||
|  |    'nmake vc-ssl-dll' creates the libcurl dynamic library and | ||||||
|  |    links curl.exe against libcurl and OpenSSL dynamically. | ||||||
|  |    This executable requires libcurl.dll and the OpenSSL DLLs | ||||||
|  |    at runtime. | ||||||
|  |    Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support. | ||||||
|  |  | ||||||
|  |    Borland C++ compiler | ||||||
|  |    --------------------- | ||||||
|  |  | ||||||
|  |    compile openssl | ||||||
|  |  | ||||||
|  |    Make sure you include the paths to curl/include and openssl/inc32 in | ||||||
|  |    your bcc32.cnf file | ||||||
|  |  | ||||||
|  |    eg : -I"c:\Bcc55\include;c:\path_curl\include;c:\path_openssl\inc32" | ||||||
|  |  | ||||||
|  |    Check to make sure that all of the sources listed in lib/Makefile.b32 | ||||||
|  |    are present in the /path_to_curl/lib directory. (Check the src | ||||||
|  |    directory for missing ones.) | ||||||
|  |  | ||||||
|  |    Make sure the environment variable "BCCDIR" is set to the install | ||||||
|  |    location for the compiler eg : c:\Borland\BCC55 | ||||||
|  |  | ||||||
|  |    command line: | ||||||
|  |    make -f /path_to_curl/lib/Makefile-ssl.b32 | ||||||
|  |  | ||||||
|  |    compile simplessl.c with appropriate links | ||||||
|  |  | ||||||
|  |    c:\curl\docs\examples\> bcc32 -L c:\path_to_curl\lib\libcurl.lib | ||||||
|  |                                  -L c:\borland\bcc55\lib\psdk\ws2_32.lib | ||||||
|  |                                  -L c:\openssl\out32\libeay32.lib | ||||||
|  |                                  -L c:\openssl\out32\ssleay32.lib | ||||||
|  |                                  simplessl.c | ||||||
|  |  | ||||||
|  |  | ||||||
|    With SSL: |    MSVC IDE | ||||||
|  |    -------- | ||||||
|  |  | ||||||
|       MingW32 (GCC-2.95) style |    If you use VC++, Borland or similar compilers. Include all lib source | ||||||
|       ------------------------ |    files in a static lib "project" (all .c and .h files that is). | ||||||
|         Run the 'mingw32.bat' file to get the proper environment variables |    (you should name it libcurl or similar) | ||||||
|         set, then run 'make mingw32-ssl' in the root dir. |  | ||||||
|  |  | ||||||
|         If you have any problems linking libraries or finding header files, be |    Make the sources in the src/ drawer be a "win32 console application" | ||||||
|         sure to look at the provided "Makefile.m32" files for the proper |    project. Name it curl. | ||||||
|         paths, and adjust as necessary. |  | ||||||
|  |  | ||||||
|       Cygwin style |    For VC++ 6, there's an included Makefile.vc6 that should be possible | ||||||
|       ------------ |    to use out-of-the-box. | ||||||
|         Haven't done, nor got any reports on how to do. It should although be |  | ||||||
|         identical to the unix setup for the same purpose. See above. |  | ||||||
|  |  | ||||||
|       Microsoft command line style |  | ||||||
|       ---------------------------- |  | ||||||
|  |  | ||||||
|         Run the 'vcvars32.bat' file to get a proper environment. The |  | ||||||
|         vcvars32.bat file is part of the Microsoft development environment and |  | ||||||
|         you may find it in 'C:\Program Files\Microsoft Visual Studio\vc98\bin' |  | ||||||
|         provided that you installed Visual C/C++ 6 in the default directory. |  | ||||||
|  |  | ||||||
|         Then run 'nmake vc' in curl's root directory. |  | ||||||
|  |  | ||||||
|         If you want to compile with zlib support, you will need to build |  | ||||||
|         zlib (http://www.gzip.org/zlib/) as well. Please read the zlib |  | ||||||
|         documentation on how to compile zlib. Define the ZLIB_PATH environment |  | ||||||
|         variable to the location of zlib.h and zlib.lib, for example: |  | ||||||
|  |  | ||||||
|           set ZLIB_PATH=c:\zlib-1.2.1 |  | ||||||
|  |  | ||||||
|         Then run 'nmake vc-zlib' in curl's root directory. |  | ||||||
|  |  | ||||||
|         If you want to compile with SSL support you need the OpenSSL package. |  | ||||||
|         Please read the OpenSSL documentation on how to compile and install |  | ||||||
|         the OpenSSL libraries.  The build process of OpenSSL generates the |  | ||||||
|         libeay32.dll and ssleay32.dll files in the out32dll subdirectory in |  | ||||||
|         the OpenSSL home directory.  OpenSSL static libraries (libeay32.lib, |  | ||||||
|         ssleay32.lib, RSAglue.lib) are created in the out32 subdirectory. |  | ||||||
|  |  | ||||||
|         Before running nmake define the OPENSSL_PATH environment variable with |  | ||||||
|         the root/base directory of OpenSSL, for example: |  | ||||||
|  |  | ||||||
|           set OPENSSL_PATH=c:\openssl-0.9.7d |  | ||||||
|  |  | ||||||
|         Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root |  | ||||||
|         directory.  'nmake vc-ssl' will create a libcurl static and dynamic |  | ||||||
|         libraries in the lib subdirectory, as well as a statically linked |  | ||||||
|         version of curl.exe in the src subdirectory.  This statically linked |  | ||||||
|         version is a standalone executable not requiring any DLL at |  | ||||||
|         runtime. This make method requires that you have the static OpenSSL |  | ||||||
|         libraries available in OpenSSL's out32 subdirectory. |  | ||||||
|         'nmake vc-ssl-dll' creates the libcurl dynamic library and |  | ||||||
|         links curl.exe against libcurl and OpenSSL dynamically. |  | ||||||
|         This executable requires libcurl.dll and the OpenSSL DLLs |  | ||||||
|         at runtime. |  | ||||||
|         Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support. |  | ||||||
|  |  | ||||||
|       Microsoft / Borland style |  | ||||||
|       ------------------------- |  | ||||||
|         If you have OpenSSL, and want curl to take advantage of it, edit your |  | ||||||
|         project properties to use the SSL include path, link with the SSL libs |  | ||||||
|         and define the USE_SSLEAY symbol. |  | ||||||
|  |  | ||||||
|       Using Borland C++ compiler version 5.5.1 (available as free download |  | ||||||
|       from Borland's site) |  | ||||||
|       --------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
|         compile openssl |  | ||||||
|  |  | ||||||
|         Make sure you include the paths to curl/include and openssl/inc32 in |  | ||||||
|         your bcc32.cnf file |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         eg : -I"c:\Bcc55\include;c:\path_curl\include;c:\path_openssl\inc32" |    Disabling Specific Protocols in Win32 builds | ||||||
|  |    -------------------------------------------- | ||||||
|  |  | ||||||
|         Check to make sure that all of the sources listed in lib/Makefile.b32 |    The configure utility, unfortunately, is not available for the Windows | ||||||
|         are present in the /path_to_curl/lib directory. (Check the src |    environment, therefore, you cannot use the various disable-protocol | ||||||
|         directory for missing ones.) |    options of the configure utility on this platform. | ||||||
|  |  | ||||||
|         Make sure the environment variable "BCCDIR" is set to the install |    However, you can use the following defines to disable specific | ||||||
|         location for the compiler eg : c:\Borland\BCC55 |    protocols: | ||||||
|  |  | ||||||
|         command line: |    HTTP_ONLY             disables all protocols except HTTP | ||||||
|         make -f /path_to_curl/lib/Makefile-ssl.b32 |    CURL_DISABLE_FTP      disables FTP | ||||||
|  |    CURL_DISABLE_LDAP     disables LDAP | ||||||
|  |    CURL_DISABLE_TELNET   disables TELNET | ||||||
|  |    CURL_DISABLE_DICT     disables DICT | ||||||
|  |    CURL_DISABLE_FILE     disables FILE | ||||||
|  |  | ||||||
|         compile simplessl.c with appropriate links |    If you want to set any of these defines you have the following | ||||||
|  |    possibilities: | ||||||
|  |  | ||||||
|         c:\curl\docs\examples\> bcc32 -L c:\path_to_curl\lib\libcurl.lib |    - Modify lib/setup.h | ||||||
|                                       -L c:\borland\bcc55\lib\psdk\ws2_32.lib |    - Modify lib/Makefile.vc6 | ||||||
|                                       -L c:\openssl\out32\libeay32.lib |    - Add defines to Project/Settings/C/C++/General/Preprocessor Definitions | ||||||
|                                       -L c:\openssl\out32\ssleay32.lib |      in the curllib.dsw/curllib.dsp Visual C++ 6 IDE project. | ||||||
|                                       simplessl.c |  | ||||||
|  |  | ||||||
|    Disabling Specific Protocols: |  | ||||||
|  |  | ||||||
|       The configure utility, unfortunately, is not available for the Windows |  | ||||||
|       environment, therefore, you cannot use the various disable-protocol |  | ||||||
|       options of the configure utility on this platform. |  | ||||||
|  |  | ||||||
|       However, you can use the following defines to disable specific |  | ||||||
|       protocols: |  | ||||||
|  |  | ||||||
|       HTTP_ONLY             disables all protocols except HTTP |  | ||||||
|       CURL_DISABLE_FTP      disables FTP |  | ||||||
|       CURL_DISABLE_LDAP     disables LDAP |  | ||||||
|       CURL_DISABLE_TELNET   disables TELNET |  | ||||||
|       CURL_DISABLE_DICT     disables DICT |  | ||||||
|       CURL_DISABLE_FILE     disables FILE |  | ||||||
|       CURL_DISABLE_GOPHER   disables GOPHER |  | ||||||
|  |  | ||||||
|       If you want to set any of these defines you have the following |  | ||||||
|       possibilities: |  | ||||||
|  |  | ||||||
|       - Modify lib/setup.h |  | ||||||
|       - Modify lib/Makefile.vc6 |  | ||||||
|       - Add defines to Project/Settings/C/C++/General/Preprocessor Definitions |  | ||||||
|         in the curllib.dsw/curllib.dsp Visual C++ 6 IDE project. |  | ||||||
|  |  | ||||||
|  |  | ||||||
|    Important (with SSL or not): |    Important static libcurl usage note | ||||||
|       When building an application that uses the static libcurl library, you |    ----------------------------------- | ||||||
|       must add '-DCURL_STATICLIB' to your CFLAGS.  Otherwise the linker will |  | ||||||
|       look for dynamic import symbols. |    When building an application that uses the static libcurl library, you must | ||||||
|  |    add '-DCURL_STATICLIB' to your CFLAGS.  Otherwise the linker will look for | ||||||
|  |    dynamic import symbols. | ||||||
|  |  | ||||||
|  |  | ||||||
| IBM OS/2 | IBM OS/2 | ||||||
| @@ -462,21 +440,19 @@ NetWare | |||||||
|    - optional zlib sources (at the moment only dynamic linking with zlib.imp); |    - optional zlib sources (at the moment only dynamic linking with zlib.imp); | ||||||
|      sources with NetWare Makefile can be obtained from: |      sources with NetWare Makefile can be obtained from: | ||||||
|      http://www.gknw.com/mirror/zlib/ |      http://www.gknw.com/mirror/zlib/ | ||||||
|  |    - optional OpenSSL sources (version 0.9.8 or later which builds with BSD); | ||||||
|  |  | ||||||
|    Set a search path to your compiler, linker and tools; if you want to have |    Set a search path to your compiler, linker and tools; on Linux make | ||||||
|    zlib support then set the environment var ZLIB_PATH pointing to your zlib |    sure that the var OSTYPE contains the string 'linux'; and then type | ||||||
|    sources, on Linux make sure the var OSTYPE contains the string 'linux'; |    'make netware' from the top source directory; other tagets available | ||||||
|    and finally type 'make netware' from the top source directory... |    are 'netware-ssl', 'netware-ssl-zlib', 'netware-zlib' and 'netware-ares'; | ||||||
|    I found on some Linux systems (RH9) that OS detection didnlt work although |    if you need other combinations you can control the build with the | ||||||
|  |    environment variables WITH_SSL, WITH_ZLIB, WITH_ARES and ENABLE_IPV6. | ||||||
|  |    I found on some Linux systems (RH9) that OS detection didnt work although | ||||||
|    a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it |    a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it | ||||||
|    with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...; |    with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked... | ||||||
|    other options are currently not supported, although partly prepared. |  | ||||||
|    The Ares lib builds arlready fine, and both test tools work fine at least |  | ||||||
|    when build with CodeWarrior...; don't know yet why they fail when build with |  | ||||||
|    gcc though; if you want to compile with Ares support then set an env var |  | ||||||
|    WITH_ARES=1; I've not tested yet including libares into curl. |  | ||||||
|    Any help in testing appreciated! |    Any help in testing appreciated! | ||||||
|    Builds automatically created 4 times a day from current CVS are here: |    Builds automatically created 8 times a day from current CVS are here: | ||||||
|    http://www.gknw.com/mirror/curl/autobuilds/ |    http://www.gknw.com/mirror/curl/autobuilds/ | ||||||
|    the status of these builds can be viewed at the autobuild table: |    the status of these builds can be viewed at the autobuild table: | ||||||
|    http://curl.haxx.se/auto/ |    http://curl.haxx.se/auto/ | ||||||
| @@ -578,17 +554,17 @@ PORTS | |||||||
|         - MIPS IRIX 6.2, 6.5 |         - MIPS IRIX 6.2, 6.5 | ||||||
|         - MIPS Linux |         - MIPS Linux | ||||||
|         - Pocket PC/Win CE 3.0 |         - Pocket PC/Win CE 3.0 | ||||||
|         - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1 |         - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2 | ||||||
|         - PowerPC Darwin 1.0 |         - PowerPC Darwin 1.0 | ||||||
|         - PowerPC Linux |         - PowerPC Linux | ||||||
|         - PowerPC Mac OS 9 |         - PowerPC Mac OS 9 | ||||||
|         - PowerPC Mac OS X |         - PowerPC Mac OS X | ||||||
|         - SINIX-Z v5 |         - SINIX-Z v5 | ||||||
|         - Sparc Linux |         - Sparc Linux | ||||||
|         - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8 |         - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10 | ||||||
|         - Sparc SunOS 4.1.X |         - Sparc SunOS 4.1.X | ||||||
|         - StrongARM (and other ARM) RISC OS 3.1, 4.02 |         - StrongARM (and other ARM) RISC OS 3.1, 4.02 | ||||||
|         - StrongARM Linux 2.4 |         - StrongARM/ARM7/ARM9 Linux 2.4, 2.6 | ||||||
|         - StrongARM NetBSD 1.4.1 |         - StrongARM NetBSD 1.4.1 | ||||||
|         - Ultrix 4.3a |         - Ultrix 4.3a | ||||||
|         - i386 BeOS |         - i386 BeOS | ||||||
| @@ -596,14 +572,14 @@ PORTS | |||||||
|         - i386 Esix 4.1 |         - i386 Esix 4.1 | ||||||
|         - i386 FreeBSD |         - i386 FreeBSD | ||||||
|         - i386 HURD |         - i386 HURD | ||||||
|         - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4 |         - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6 | ||||||
|         - i386 NetBSD |         - i386 NetBSD | ||||||
|         - i386 Novell NetWare |         - i386 Novell NetWare | ||||||
|         - i386 OS/2 |         - i386 OS/2 | ||||||
|         - i386 OpenBSD |         - i386 OpenBSD | ||||||
|         - i386 SCO unix |         - i386 SCO unix | ||||||
|         - i386 Solaris 2.7 |         - i386 Solaris 2.7 | ||||||
|         - i386 Windows 95, 98, ME, NT, 2000 |         - i386 Windows 95, 98, ME, NT, 2000, XP, 2003 | ||||||
|         - i386 QNX 6 |         - i386 QNX 6 | ||||||
|         - i486 ncr-sysv4.3.03 (NCR MP-RAS) |         - i486 ncr-sysv4.3.03 (NCR MP-RAS) | ||||||
|         - ia64 Linux 2.3.99 |         - ia64 Linux 2.3.99 | ||||||
|   | |||||||
							
								
								
									
										302
									
								
								docs/INSTALL.devcpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										302
									
								
								docs/INSTALL.devcpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,302 @@ | |||||||
|  | DevCpp-Mingw Install & Compilation                                   Sept 2005 | ||||||
|  | ================================== | ||||||
|  |  | ||||||
|  | Reference Emails available at curl@haxx.se:  | ||||||
|  |  | ||||||
|  |   Libcurl Install and Use Issues | ||||||
|  |   Awaiting an Answer for Win 32 Install  | ||||||
|  |   res = curl_easy_perform(curl); Error | ||||||
|  |   Makefile Issues | ||||||
|  |    | ||||||
|  |  | ||||||
|  | Having previously done a thorough review of what was available that met my | ||||||
|  | requirements under GPL, I settled for Libcurl as the software of choice for | ||||||
|  | many reasons not the least of which was the support. | ||||||
|  |  | ||||||
|  | Background | ||||||
|  | ---------- | ||||||
|  |  | ||||||
|  | This quest started when I innocently tried to incorporate the libcurl library | ||||||
|  | into my simple source code. I figured that a few easy steps would accomplish | ||||||
|  | this without major headaches. I had no idea that I would be facing an almost | ||||||
|  | insurmountable challenge. | ||||||
|  |  | ||||||
|  | The main problem lies in two areas. First the bulk of support for libcurl | ||||||
|  | exists for a Unix/linux command line environments. This is of little help when | ||||||
|  | it comes to Windows O/S. | ||||||
|  |  | ||||||
|  | Secondly the help that does exist for the Windows O/S focused around mingw | ||||||
|  | thru a command line argument environment. | ||||||
|  |  | ||||||
|  | You may ask "Why is this a problem?" | ||||||
|  |  | ||||||
|  | I'm using a Windows O/S with DevCpp. For those of you who are unfamiliar with | ||||||
|  | DevCpp, it is a window shell GUI that replaces the command line environment | ||||||
|  | for gcc. A definite improvement that I am unwilling to give up. However using | ||||||
|  | DevCpp presented its own set of issues. Inadvertently I also made some | ||||||
|  | careless errors such as compiling the 7.14 version of Makefile with an older | ||||||
|  | version of source code. Thanks to Dan Fandrich for picking this up. | ||||||
|  |  | ||||||
|  | I did eventually with the help of Daniel, Phillipe and others manage to | ||||||
|  | implement successfully (the only mingw available version) | ||||||
|  | curl-7.13.0-win32-ssl-devel-mingw32 into the DevCpp environment. Only the | ||||||
|  | dynamic libcurl.dll libcurldll.a libraries worked. The static library which I | ||||||
|  | was interested in did not. Furthermore when I tried to implement one of the | ||||||
|  | examples included with the curl package (get info.c) it caused the executable | ||||||
|  | to crash. Tracing the bug I found it in the code and function res = | ||||||
|  | curl_easy_perform(curl);. | ||||||
|  |  | ||||||
|  | At this point I had to make a choice as to whether invest my limited | ||||||
|  | time-energy resource to fixing the bug or to compile the new version | ||||||
|  | available. After searching the archives I found a very similar or the same bug | ||||||
|  | reported from version 7.12x on. Daniel did inform me that he thought that this | ||||||
|  | bug had been fixed with the latest version. So I proceeded to compile the | ||||||
|  | latest SSL version where I faced other challenges. | ||||||
|  |  | ||||||
|  | In order to make this process unremarkable for others using the same | ||||||
|  | environment I decided to document the process so that others will find it | ||||||
|  | routine. It would be a shame if newbies could not implement this excellent | ||||||
|  | package for their use. | ||||||
|  |  | ||||||
|  | I would like to thank the many others in this forum and in the DevCpp forum | ||||||
|  | for their help. Without your help I may either have given up or it would have | ||||||
|  | taken me many times longer to achieve success. | ||||||
|  |  | ||||||
|  | The Cookbook Approach | ||||||
|  | --------------------- | ||||||
|  |  | ||||||
|  | This discussion will be confined to a SSL static library compilation and | ||||||
|  | installation. Limited mention and comments will be inserted where appropriate | ||||||
|  | to help with non-SSL, dynamic libraries and executables. | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    Using Makefile from DevCpp to compile Libcurl libraries | ||||||
|  |  | ||||||
|  | Preamble | ||||||
|  | -------- | ||||||
|  |  | ||||||
|  | Using the latest version release - curl-7.14.0.tar.gz. Curl source code is | ||||||
|  | platform independent. This simply means that the source code can be compiled | ||||||
|  | for any Operating System (Linux/Unix Windows etc. and variations of thereof). | ||||||
|  |  | ||||||
|  | The first thing to note is that inside curl-7.14.0 you will find two folders | ||||||
|  | lib and src. Both contain Makefile.m32 (required for win mingw library or exe | ||||||
|  | compilation) files which are different. The main difference between these two | ||||||
|  | folders and the makefiles is that the src folder contents are used to compile | ||||||
|  | an executable file(curl.exe) while the lib folder contents are used to compile | ||||||
|  | a static (libcurl.a) and dynamic (libcurl.dll & libcurldll.a) file that can be | ||||||
|  | used to compile libcurl with your own source code so that one can use and | ||||||
|  | access all libcurl functions. | ||||||
|  |  | ||||||
|  | Before we start please make sure that DevCpp is installed properly. In | ||||||
|  | particular make sure you have no spaces in the name of any of the directories | ||||||
|  | and subdirectories where DevCpp is installed. Failure to comply with the | ||||||
|  | install instructions may produce erratic behaviour in DevCpp. For further info | ||||||
|  | check the following sites | ||||||
|  |  | ||||||
|  | http://aditsu.freeunixhost.com/dev-cpp-faq.html | ||||||
|  | http://sourceforge.net/forum/message.php?msg_id=3252213 | ||||||
|  |  | ||||||
|  | As I have mentioned before I will confine this to the SSL Library compilations | ||||||
|  | but the process is very similar for compilation of the executable - curl.exe; | ||||||
|  | just substitute the src folder makefile in its stead. | ||||||
|  |  | ||||||
|  | First use a text processor Notepad, or your own favourite text processor. To | ||||||
|  | engage your favourite text processor, select Makefile.m32 click once with your | ||||||
|  | mouse on file icon; icon turns blue, press the shift key and right-click on | ||||||
|  | mouse, menu appears select "Open with", select your favourite text processor. | ||||||
|  |  | ||||||
|  | Next read the contents of Makefile.m32. It includes instructions on its use. | ||||||
|  |  | ||||||
|  | Method I - DOS Command Line | ||||||
|  | --------------------------- | ||||||
|  |   | ||||||
|  | Note - The only reason I have included this method is that Method II which is | ||||||
|  | the preferred method for compiling does not allow for the setting of option | ||||||
|  | switches (e.g. SSL = 1 or SSL =0). At least that's what they tell me at the | ||||||
|  | Dev-Cpp forum. | ||||||
|  |  | ||||||
|  | 1 - Make a copy of (D:\Dev-Cpp\bin) bin folder and name it "bin Original" | ||||||
|  | place it in the Dev-Cpp installed directory (D:\Dev-Cpp\ for this example) | ||||||
|  |  | ||||||
|  | 2 - Copy the entire contents of the LIB folder of curl-7.14.0.tar.gz or zip | ||||||
|  | version into the bin folder above (D:\Dev-Cpp\bin). The reason being is that | ||||||
|  | the make.exe file resides in this folder. Make.exe will use - Makefile.m32, | ||||||
|  | Makefile.inc, and the source code included in the lib folder to compile the | ||||||
|  | source code. There is a PATH issue with make.exe that remains unresolved at | ||||||
|  | least for me. Unless the entire source code to be compiled is placed entirely | ||||||
|  | within the directory of make.exe an error message will be generated - "file | ||||||
|  | xxxx.yyy not available". | ||||||
|  |  | ||||||
|  | 3- Go to Dev-Cpp\bin and double click on make .exe. You will see a DOS window | ||||||
|  | quickly pop up and close very quickly. Not to worry! Please do not skip this | ||||||
|  | step. | ||||||
|  |  | ||||||
|  | 4- Click on the start button\Programs\MS-DOS Prompt.Once the DOS Window is up | ||||||
|  | Type the disk drive letter (e.g. E: ) engage the enter button. The path should | ||||||
|  | automatically take you to the directory of the make.exe file. | ||||||
|  |  | ||||||
|  | 5- To compile the source code simply type at the DOS prompt make -f | ||||||
|  | Makefile.m32 as per instructions contained in the Makefile.m32 file (use any | ||||||
|  | text processor to read instructions). I don't believe that this makefile | ||||||
|  | allows for the option of non SSL. Ignore any warnings. | ||||||
|  |  | ||||||
|  | 6- Collect and make copies of libcurl.a, libcurl.dll, libcurldll.a and any *.o | ||||||
|  | compilations you might need in another directory outside of the bin directory | ||||||
|  | as you will need this files shortly to set up libcurl for use with | ||||||
|  | Dev-cpp. For most apps *.o is not required. Later on we will show what to do | ||||||
|  | with these files. | ||||||
|  |  | ||||||
|  | 7- You are finished but before closing we need to do cleanup - erase the bin | ||||||
|  | folder and rename the "bin Original" folder created in step 1 to bin. | ||||||
|  |  | ||||||
|  | Note to compile a curl executable the process is probably similar but instead | ||||||
|  | of using the LIB folder contents use the SRC folder contents and Makefiles in | ||||||
|  | curl-7.14.0.tar.gz. File directories relative placements must be respected for | ||||||
|  | compiling to take place successfully. This may not be possible with the PATH | ||||||
|  | problem that make.exe experiences. If anyone has solved this PATH issue and | ||||||
|  | please make sure it actually works on Win 9x/2000/XP before letting me | ||||||
|  | know. Then please let me or Daniel in on the solution so that it can be | ||||||
|  | included with these instructions. Thanks. | ||||||
|  |  | ||||||
|  | or | ||||||
|  |  | ||||||
|  | Method II - Dev-Cpp GUI | ||||||
|  | ----------------------- | ||||||
|  |  | ||||||
|  | 1- Copy the entire contents of the LIB folder of curl-7.14.0.tar.gz or zip | ||||||
|  | version into any folder outside of (Dev-Cpp\bin). | ||||||
|  |  | ||||||
|  | 2- Drop the File/New/click on Project. | ||||||
|  |  | ||||||
|  | 3- New Project Dialogue box appears. Double click on the Static Library. | ||||||
|  |  | ||||||
|  | 4- Create Project Dialogue box appears. Select the LIB folder location to | ||||||
|  | place and locate your Project File Name. Placing the Project File Name | ||||||
|  | elsewhere may cause problems (PATH issue problem again). | ||||||
|  |  | ||||||
|  | 5- Drop down the Project/Project Options. Project Options Dialogue box | ||||||
|  | appears. | ||||||
|  |  | ||||||
|  | 6- Select the Makefile tab in the Project Options Dialogue Box. Check Box - | ||||||
|  | Use Custom Makefile. Click on the Folder icon at the extreme right of the | ||||||
|  | Check Box. Select Makefile.m32 in the folder wherever you have placed the | ||||||
|  | contents of the LIB Folder. Press OK and close the Dialogue Box. | ||||||
|  |  | ||||||
|  | 7- Drop the Menu Project/Click on Add to Project. Open File Dialogue Box | ||||||
|  | appears.  The Dialogue Box should open in the folder wherever you have placed | ||||||
|  | the contents of the LIB Folder. If not go there. | ||||||
|  |  | ||||||
|  | 8- Select Crtl-A to select all files in the LIB folder. Click on open to add | ||||||
|  | files and close box. Wait till all files are added. This may take 30 seconds | ||||||
|  | or longer. | ||||||
|  |  | ||||||
|  | 9- Drop the Menu Execute/Click on Compile.  | ||||||
|  |  | ||||||
|  | 10- That's it. | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    The following steps must be completed if Curl is to work properly | ||||||
|  |    ================================================================= | ||||||
|  |  | ||||||
|  | LIB folder inclusions (*.a placement) | ||||||
|  | ------------------------------------- | ||||||
|  |  | ||||||
|  | 1- Refer to Method I - DOS Command Line point # 6 Take libcurl.a, libcurldll.a | ||||||
|  | and install it in the directory C( or whichever drive Dev is installed) | ||||||
|  | :\Dev-Cpp\lib. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Include Folder | ||||||
|  | -------------- | ||||||
|  |  | ||||||
|  | 1- Create a new folder by the name of curl (do not change the name curl to | ||||||
|  | some other name as it will cause major issues) in the directory | ||||||
|  | C:\Dev-Cpp\include. | ||||||
|  |  | ||||||
|  | 2- Copy the entire contents of the curl folder of curl-7.14.0.tar.gz or zip | ||||||
|  |  version into the newly created curl directory - C:\Dev-Cpp\include\curl. | ||||||
|  |  | ||||||
|  | Links To Include And Lib Folder | ||||||
|  | ------------------------------- | ||||||
|  |  | ||||||
|  | 1- Drop the Menu - Tools\Compiler Options\Directories\Libraries. Make sure | ||||||
|  | that C( or whichever drive Dev is installed):\DEV-CPP\lib is included. | ||||||
|  |  | ||||||
|  | 2- Next select the Menu - Tools\Compiler Options\Directories\C Includes. Make | ||||||
|  | sure that C:\DEV-CPP\include and C:\Dev-Cpp\include\curl are included. | ||||||
|  |  | ||||||
|  | 3- Next select the Menu - Tools\Compiler Options\Directories\C++ | ||||||
|  | Includes. Make sure that C:\DEV-CPP\include and C:\Dev-Cpp\include\curl are | ||||||
|  | included. | ||||||
|  |  | ||||||
|  | Linker Links | ||||||
|  | ------------ | ||||||
|  |  | ||||||
|  | 1- Drop the Menu - Tools\Compiler Options\Directories\Compiler. | ||||||
|  |  | ||||||
|  | 2- Make sure that the box "Add these commands to the linker command line" is | ||||||
|  | checked. | ||||||
|  |  | ||||||
|  | 3- Include in the white space immediately below the box referred in 2 -lcurl | ||||||
|  | -lws2_32 -lwinmm. | ||||||
|  |  | ||||||
|  | SSL Files | ||||||
|  | --------- | ||||||
|  |  | ||||||
|  | 1- Get the latest openSSL (as of time of this writing) | ||||||
|  | openssl-0.9.7e-win32-bin.zip for the minimalist package of the openssl-0.9.7e | ||||||
|  | binaries ported to MS Windows 95/98/NT/XP using the MingW32/GCC-3.1 | ||||||
|  | development environment. The file may be downloaded at | ||||||
|  | http://curl.haxx.se/download/. | ||||||
|  |  | ||||||
|  | 2- Open the above zip file. You will find two files - SDL.dll, | ||||||
|  | SDL_mixer.dll. Install them in the directory C:\WINDOWS\SYSTEM32 for Win 9x | ||||||
|  | users and c:\winnt\system32 for NT-family users. | ||||||
|  |  | ||||||
|  | Multithreading Files | ||||||
|  | -------------------- | ||||||
|  |  | ||||||
|  | To be completed | ||||||
|  |  | ||||||
|  | #define | ||||||
|  | ------- | ||||||
|  |  | ||||||
|  | 1- Make sure that your program includes the following - #define CURL_STATICLIB | ||||||
|  | must be declared FIRST before any other define functions may be | ||||||
|  | added. Otherwise you may experience link errors. | ||||||
|  |  | ||||||
|  | 2- Don't forget to include   #include "curl/curl.h". | ||||||
|  |  | ||||||
|  | e.g. | ||||||
|  |     #define CURL_STATICLIB  | ||||||
|  | #include <windows.h> | ||||||
|  |     #include "curl/curl.h" | ||||||
|  | #include <fstream> | ||||||
|  | #include <iostream> | ||||||
|  | #include <vector> | ||||||
|  | etc... | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Static or Dynamic Library | ||||||
|  | ------------------------- | ||||||
|  |  | ||||||
|  | The above steps apply for the use by a static library. Should you choose to | ||||||
|  | use a dynamic library you will be required to perform these additional steps. | ||||||
|  |  | ||||||
|  | 1- Refer to Method I - DOS Command Line point # 6. Install libcurl.dll in the | ||||||
|  | directory C:\WINDOWS\SYSTEM32 for Win 9x users and c:\winnt\system32 for | ||||||
|  | NT-family users. | ||||||
|  |  | ||||||
|  | 2- Refer to Linker Links point 3 - Replace -lcurl with -lcurldll. | ||||||
|  |  | ||||||
|  | Voila you're done. | ||||||
|  |  | ||||||
|  | The non-SSL static Library build may not be possible to use at least as of the | ||||||
|  | time of this writing - v7.14. Check reference emails - Phillipe and I found it | ||||||
|  | impossible to fully compile as certain files were missing for linking. No big | ||||||
|  | loss as SSL is a major plus. | ||||||
|  |  | ||||||
|  | Hope this Helps | ||||||
|  |  | ||||||
|  | Tom | ||||||
| @@ -3,12 +3,65 @@ join in and help us correct one or more of these! Also be sure to check the | |||||||
| changelog of the current development status, as one or more of these problems | changelog of the current development status, as one or more of these problems | ||||||
| may have been fixed since this was written! | may have been fixed since this was written! | ||||||
|  |  | ||||||
|  | 32. (At least on Windows) If libcurl is built with c-ares and there's no DNS | ||||||
|  |   server configured in the system, the ares_init() call fails and thus | ||||||
|  |   curl_easy_init() fails as well. This causes weird effects for people who use | ||||||
|  |   numerical IP addresses only. | ||||||
|  |  | ||||||
|  | 31. "curl-config --libs" will include details set in LDFLAGS when configure is | ||||||
|  |   run that might be needed only for building libcurl. Similarly, it might | ||||||
|  |   include options that perhaps aren't suitable both for static and dynamic | ||||||
|  |   linking. Further, curl-config --cflags suffers from the same effects with | ||||||
|  |   CFLAGS/CPPFLAGS. | ||||||
|  |  | ||||||
|  | 30. You need to use -g to the command line tool in order to use RFC2732-style | ||||||
|  |   IPv6 numerical addresses in URLs. | ||||||
|  |  | ||||||
|  | 29. IPv6 URLs with zone ID is not supported. | ||||||
|  |   http://www.ietf.org/internet-drafts/draft-fenner-literal-zone-02.txt | ||||||
|  |   specifies the use of a plus sign instead of a percent when specifying zone | ||||||
|  |   IDs in URLs to get around the problem of percent signs being | ||||||
|  |   special. According to the reporter, Firefox deals with the URL _with_ a | ||||||
|  |   percent letter (which seems like a blatant URL spec violation). | ||||||
|  |  | ||||||
|  |    See http://curl.haxx.se/bug/view.cgi?id=1371118 | ||||||
|  |  | ||||||
|  | 28. The TFTP code is not portable and will fail on some architectures. | ||||||
|  |  | ||||||
|  | 26. NTLM authentication using SSPI (on Windows) when (lib)curl is running in | ||||||
|  |   "system context" will make it use wrong(?) user name - at least when compared | ||||||
|  |   to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=1281867 | ||||||
|  |  | ||||||
|  | 25. When doing a CONNECT request with curl it doesn't properly handle if the | ||||||
|  |   proxy closes the connection within the authentication "negotiation phase". | ||||||
|  |   Like if you do HTTPS or similar over a proxy and you use perhaps | ||||||
|  |   --proxy-anyauth. There's work in progress on this problem, and a recent | ||||||
|  |   patch was posted here: http://curl.haxx.se/mail/lib-2005-08/0074.html | ||||||
|  |  | ||||||
|  | 23. We don't support SOCKS for IPv6. We don't support FTPS over a SOCKS proxy. | ||||||
|  |   We don't have any test cases for SOCKS proxy. We probably have even more | ||||||
|  |   bugs and lack of features when a SOCKS proxy is used. And there seem to be a | ||||||
|  |   problem with SOCKS when doing FTP: See | ||||||
|  |   http://curl.haxx.se/bug/view.cgi?id=1371540 | ||||||
|  |  | ||||||
|  | 22. Sending files to a FTP server using curl on VMS, might lead to curl | ||||||
|  |   complaining on "unaligned file size" on completion. The problem is related | ||||||
|  |   to VMS file structures and the perceived file sizes stat() returns. A | ||||||
|  |   possible fix would involve sending a "STRU VMS" command. | ||||||
|  |   http://curl.haxx.se/bug/view.cgi?id=1156287 | ||||||
|  |    | ||||||
|  | 21. FTP ASCII transfers do not follow RFC959. They don't convert the data | ||||||
|  |    accordingly (not for sending nor for receiving). RFC 959 section 3.1.1.1 | ||||||
|  |    clearly describes how this should be done: | ||||||
|  |  | ||||||
|  |      The sender converts the data from an internal character representation to | ||||||
|  |      the standard 8-bit NVT-ASCII representation (see the Telnet | ||||||
|  |      specification).  The receiver will convert the data from the standard | ||||||
|  |      form to his own internal form. | ||||||
|  |  | ||||||
| 19. FTP 3rd party transfers with the multi interface doesn't work. Test: | 19. FTP 3rd party transfers with the multi interface doesn't work. Test: | ||||||
|   define CURL_MULTIEASY, rebuild curl, run test case 230 - 232. |   define CURL_MULTIEASY, rebuild curl, run test case 230 - 232. | ||||||
|  |  | ||||||
| 18. test case 57 has </test> that should be </client> but when corrected, the |  | ||||||
|   test case fails! |  | ||||||
|  |  | ||||||
| 16. FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>, | 16. FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>, | ||||||
|   <password>, and <fpath> components, encoded as "%00".  The problem is that |   <password>, and <fpath> components, encoded as "%00".  The problem is that | ||||||
|   curl_unescape does not detect this, but instead returns a shortened C |   curl_unescape does not detect this, but instead returns a shortened C | ||||||
| @@ -19,10 +72,6 @@ may have been fixed since this was written! | |||||||
|   would not meaningfully support NUL characters within RFC 959 <string>, |   would not meaningfully support NUL characters within RFC 959 <string>, | ||||||
|   anyway (e.g., UNIX pathnames may not contain NUL). |   anyway (e.g., UNIX pathnames may not contain NUL). | ||||||
|  |  | ||||||
| 15. Test case 241 fails on all systems that support IPv6 but that don't have |  | ||||||
|   the host name 'ip6-localhost' in /etc/hosts (or similar) since the test case |  | ||||||
|   uses that host name to test the IPv6 name to address resolver. |  | ||||||
|  |  | ||||||
| 14. Test case 165 might fail on system which has libidn present, but with an | 14. Test case 165 might fail on system which has libidn present, but with an | ||||||
|   old iconv version (2.1.3 is a known bad version), since it doesn't recognize |   old iconv version (2.1.3 is a known bad version), since it doesn't recognize | ||||||
|   the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the |   the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the | ||||||
| @@ -42,11 +91,12 @@ may have been fixed since this was written! | |||||||
| 10. To get HTTP Negotiate authentication to work fine, you need to provide a | 10. To get HTTP Negotiate authentication to work fine, you need to provide a | ||||||
|   (fake) user name (this concerns both curl and the lib) because the code |   (fake) user name (this concerns both curl and the lib) because the code | ||||||
|   wrongly only considers authentication if there's a user name provided. |   wrongly only considers authentication if there's a user name provided. | ||||||
|   Bug report #1004841. How? http://curl.haxx.se/mail/lib-2004-08/0182.html |   http://curl.haxx.se/bug/view.cgi?id=1004841. How? | ||||||
|  |   http://curl.haxx.se/mail/lib-2004-08/0182.html | ||||||
|  |  | ||||||
| 9. --limit-rate using -d or -F does not work. This is because the limit logic | 9. --limit-rate using -d or -F does not work. This is because the limit logic | ||||||
|   is provided by the curl app in its read/write callbacks, and when doing |   is provided by the curl app in its read/write callbacks, and when doing | ||||||
|   -d/-F the callbacks aren't used! Bug report #921395. |   -d/-F the callbacks aren't used! http://curl.haxx.se/bug/view.cgi?id=921395 | ||||||
|  |  | ||||||
| 8. Doing resumed upload over HTTP does not work with '-C -', because curl | 8. Doing resumed upload over HTTP does not work with '-C -', because curl | ||||||
|   doesn't do a HEAD first to get the initial size. This needs to be done |   doesn't do a HEAD first to get the initial size. This needs to be done | ||||||
| @@ -69,11 +119,6 @@ may have been fixed since this was written! | |||||||
|   libcurl thinks of it as the *compressed* length. Some explanations are here: |   libcurl thinks of it as the *compressed* length. Some explanations are here: | ||||||
|   http://curl.haxx.se/mail/lib-2003-06/0146.html |   http://curl.haxx.se/mail/lib-2003-06/0146.html | ||||||
|  |  | ||||||
| 4. IPv6 support on AIX 4.3.3 doesn't work due to a missing sockaddr_storage |  | ||||||
|   struct. It has been reported to work on AIX 5.1 though. |  | ||||||
|  |  | ||||||
| 3. GOPHER transfers seem broken |  | ||||||
|  |  | ||||||
| 2. If a HTTP server responds to a HEAD request and includes a body (thus | 2. If a HTTP server responds to a HEAD request and includes a body (thus | ||||||
|   violating the RFC2616), curl won't wait to read the response but just stop |   violating the RFC2616), curl won't wait to read the response but just stop | ||||||
|   reading and return back. If a second request (let's assume a GET) is then |   reading and return back. If a second request (let's assume a GET) is then | ||||||
| @@ -83,7 +128,3 @@ may have been fixed since this was written! | |||||||
|   and havoc is what happens. |   and havoc is what happens. | ||||||
|   More details on this is found in this libcurl mailing list thread: |   More details on this is found in this libcurl mailing list thread: | ||||||
|   http://curl.haxx.se/mail/lib-2002-08/0000.html |   http://curl.haxx.se/mail/lib-2002-08/0000.html | ||||||
|  |  | ||||||
| 1. LDAP support requires that not only the OpenLDAP shared libraries be |  | ||||||
|    present at run time, but the development libraries (liblber.so and |  | ||||||
|    libldap.so) as well (not applicable to Windows). |  | ||||||
|   | |||||||
| @@ -12,12 +12,11 @@ I am not a lawyer and this is not legal advice! | |||||||
|  |  | ||||||
| One common dilemma is that GPL[1]-licensed code is not allowed to be linked | One common dilemma is that GPL[1]-licensed code is not allowed to be linked | ||||||
| with code licensed under the Original BSD license (with the announcement | with code licensed under the Original BSD license (with the announcement | ||||||
| clause, unless there's a specified exception in the GPL-licensed module). You | clause). You may still build your own copies that use them all, but | ||||||
| may still build your own copies that use them all, but distributing them as | distributing them as binaries would be to violate the GPL license - unless you | ||||||
| binaries would be to violate the GPL license - unless you accompany your | accompany your license with an exception[2]. This particular problem was | ||||||
| license with an exception[2]. This particular problem was addressed when the | addressed when the Modified BSD license was created, which does not have the | ||||||
| Modified BSD license was created, which does not have the annoncement clause | annoncement clause that collides with GPL. | ||||||
| that collides with GPL. |  | ||||||
|  |  | ||||||
| libcurl http://curl.haxx.se/docs/copyright.html | libcurl http://curl.haxx.se/docs/copyright.html | ||||||
|  |  | ||||||
| @@ -28,59 +27,80 @@ libcurl http://curl.haxx.se/docs/copyright.html | |||||||
|  |  | ||||||
| OpenSSL http://www.openssl.org/source/license.html | OpenSSL http://www.openssl.org/source/license.html | ||||||
|  |  | ||||||
|         Uses an Original BSD-style license with an announement clause that |         (May be used for SSL/TLS support) Uses an Original BSD-style license | ||||||
|         makes it "incompatible" with GPL. You are not allowed to ship binaries |         with an announement clause that makes it "incompatible" with GPL. You | ||||||
|         that link with OpenSSL that includes GPL code (unless that specific |         are not allowed to ship binaries that link with OpenSSL that includes | ||||||
|         GPL code includes an exception for OpenSSL - a habit that is growing |         GPL code (unless that specific GPL code includes an exception for | ||||||
|         more and more common). |         OpenSSL - a habit that is growing more and more common). If OpenSSL's | ||||||
|  |         licensing is a problem for you, consider using GnuTLS instead. | ||||||
|  |  | ||||||
|  | GnuTLS  http://www.gnutls.org/ | ||||||
|  |  | ||||||
|  |         (May be used for SSL/TLS support) Uses the LGPL[3] license. If this is | ||||||
|  |         a problem for you, consider using OpenSSL instead. Also note that | ||||||
|  |         GnuTLS itself depends on and uses other libs (libgcrypt and | ||||||
|  |         libgpg-error) and they too are LGPL- or GPL-licensed. | ||||||
|  |  | ||||||
| c-ares  http://daniel.haxx.se/projects/c-ares/license.html | c-ares  http://daniel.haxx.se/projects/c-ares/license.html | ||||||
|  |  | ||||||
|         Uses an MIT license that is very liberal and imposes no restrictions |         (Used for asynchronous name resolves) Uses an MIT license that is very | ||||||
|         on any other library or part you may link with. |         liberal and imposes no restrictions on any other library or part you | ||||||
|  |         may link with. | ||||||
|  |  | ||||||
| zlib    http://www.gzip.org/zlib/zlib_license.html | zlib    http://www.gzip.org/zlib/zlib_license.html | ||||||
|  |  | ||||||
|         Uses an MIT-style license that shouldn't collide with any other |         (Used for compressed Transfer-Encoding support) Uses an MIT-style | ||||||
|         library. |         license that shouldn't collide with any other library. | ||||||
|  |  | ||||||
| krb4 | krb4 | ||||||
|  |  | ||||||
|         While nothing in particular says that a Kerberos4 library must use any |         While nothing in particular says that a Kerberos4 library must use any | ||||||
|         particular license, the one I've tried and used successfully so far |         particular license, the one I've tried and used successfully so far | ||||||
|         (kth-krb4) is Original BSD-licensed with the announcement clause. Some |         (kth-krb4) is partly Original BSD-licensed with the announcement | ||||||
|         of the code in libcurl that is written to deal with Kerberos4 likewise |         clause. Some of the code in libcurl that is written to deal with | ||||||
|         have such a license. |         Kerberos4 is Modified BSD-licensed. | ||||||
|  |  | ||||||
| GSSAPI | MIT Kerberos http://web.mit.edu/kerberos/www/dist/ | ||||||
|  |  | ||||||
|         While nothing in particular says that a GSS/Kerberos5 library must use |         (May be used for GSS support) MIT licensed, that shouldn't collide | ||||||
|         any particular license, the one I've used (Heimdal) is Original BSD- |         with any other parts. | ||||||
|         licensed with the announcement clause. |  | ||||||
|  | Heimdal http://www.pdc.kth.se/heimdal/ | ||||||
|  |  | ||||||
|  |         (May be used for GSS support) Heimdal is Original BSD licensed with | ||||||
|  |         the announcement clause. | ||||||
|  |  | ||||||
|  | GNU GSS http://www.gnu.org/software/gss/ | ||||||
|  |  | ||||||
|  |         (May be used for GSS support) GNU GSS is GPL licensed. Note that you | ||||||
|  |         may not distribute binary curl packages that uses this if you build | ||||||
|  |         curl to also link and use any Original BSD licensed libraries! | ||||||
|  |  | ||||||
| fbopenssl | fbopenssl | ||||||
|  |  | ||||||
|         Unclear license. Based on its name, I assume that it uses the OpenSSL |         (Used for SPNEGO support) Unclear license. Based on its name, I assume | ||||||
|         license and thus shares the same issues as described for OpenSSL |         that it uses the OpenSSL license and thus shares the same issues as | ||||||
|         above. |         described for OpenSSL above. | ||||||
|  |  | ||||||
| libidn  http://www.gnu.org/licenses/lgpl.html | libidn  http://www.gnu.org/licenses/lgpl.html | ||||||
|  |  | ||||||
|         Uses the GNU Lesser General Public License. LGPL is a variation of GPL |         (Used for IDNA support) Uses the GNU Lesser General Public | ||||||
|         with slightly less aggressive "copyleft". This license requires more |         License. LGPL is a variation of GPL with slightly less aggressive | ||||||
|         requirements to be met when distributing binaries, see the license for |         "copyleft". This license requires more requirements to be met when | ||||||
|         details. Also note that if you distribute a binary that includes this |         distributing binaries, see the license for details. Also note that if | ||||||
|         library, you must also include the full LGPL license text. Please |         you distribute a binary that includes this library, you must also | ||||||
|         properly point out what parts of the distributed package that the |         include the full LGPL license text. Please properly point out what | ||||||
|         license addresses. |         parts of the distributed package that the license addresses. | ||||||
|  |  | ||||||
| OpenLDAP http://www.openldap.org/software/release/license.html | OpenLDAP http://www.openldap.org/software/release/license.html | ||||||
|  |  | ||||||
|         Uses a Modified BSD-style license. Since libcurl uses OpenLDAP as a |         (Used for LDAP support) Uses a Modified BSD-style license. Since | ||||||
|         shared library only, I have not heard of anyone that ships OpenLDAP |         libcurl uses OpenLDAP as a shared library only, I have not heard of | ||||||
|         linked with libcurl in an app. |         anyone that ships OpenLDAP linked with libcurl in an app. | ||||||
|  |  | ||||||
|  |  | ||||||
| [1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html | [1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html | ||||||
| [2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on | [2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on | ||||||
|       how to write such an exception to the GPL |       how to write such an exception to the GPL | ||||||
|  | [3] = LGPL - GNU Lesser General Public License: | ||||||
|  |       http://www.gnu.org/licenses/lgpl.html | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								docs/MANUAL
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								docs/MANUAL
									
									
									
									
									
								
							| @@ -23,10 +23,6 @@ SIMPLE USAGE | |||||||
|  |  | ||||||
|         curl ftp://cool.haxx.se/ |         curl ftp://cool.haxx.se/ | ||||||
|  |  | ||||||
|   Get a gopher document from funet's gopher server: |  | ||||||
|  |  | ||||||
|         curl gopher://gopher.funet.fi |  | ||||||
|  |  | ||||||
|   Get the definition of curl from a dictionary: |   Get the definition of curl from a dictionary: | ||||||
|  |  | ||||||
|         curl dict://dict.org/m:curl |         curl dict://dict.org/m:curl | ||||||
| @@ -94,10 +90,6 @@ USING PASSWORDS | |||||||
|  |  | ||||||
|    Probably most commonly used with private certificates, as explained below. |    Probably most commonly used with private certificates, as explained below. | ||||||
|  |  | ||||||
|  GOPHER |  | ||||||
|  |  | ||||||
|    Curl features no password support for gopher. |  | ||||||
|  |  | ||||||
| PROXY | PROXY | ||||||
|  |  | ||||||
|  Get an ftp file using a proxy named my-proxy that uses port 888: |  Get an ftp file using a proxy named my-proxy that uses port 888: | ||||||
| @@ -299,6 +291,13 @@ POST (HTTP) | |||||||
|  |  | ||||||
|         curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif"  |         curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif"  | ||||||
|  |  | ||||||
|  |   To send a field value literally without interpreting a leading '@' | ||||||
|  |   or '<', or an embedded ';type=', use --form-string instead of | ||||||
|  |   -F. This is recommended when the value is obtained from a user or | ||||||
|  |   some other unpredictable source. Under these circumstances, using | ||||||
|  |   -F instead of --form-string would allow a user to trick curl into | ||||||
|  |   uploading a file. | ||||||
|  |  | ||||||
| REFERRER | REFERRER | ||||||
|  |  | ||||||
|   A HTTP request has the option to include information about which address |   A HTTP request has the option to include information about which address | ||||||
| @@ -741,7 +740,7 @@ ENVIRONMENT VARIABLES | |||||||
|  |  | ||||||
|   Curl reads and understands the following environment variables: |   Curl reads and understands the following environment variables: | ||||||
|  |  | ||||||
|         http_proxy, HTTPS_PROXY, FTP_PROXY, GOPHER_PROXY |         http_proxy, HTTPS_PROXY, FTP_PROXY | ||||||
|  |  | ||||||
|   They should be set for protocol-specific proxies. General proxy should be |   They should be set for protocol-specific proxies. General proxy should be | ||||||
|   set with |   set with | ||||||
|   | |||||||
| @@ -14,10 +14,10 @@ SUBDIRS = examples libcurl | |||||||
|  |  | ||||||
| CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES) | CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES) | ||||||
|  |  | ||||||
| EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS	\ | EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS	 \ | ||||||
|  README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS	\ |  README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS	 \ | ||||||
|  KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL		\ |  KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL		 \ | ||||||
|  $(PDFPAGES) LICENSE-MIXING README.netware |  $(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp | ||||||
|  |  | ||||||
| MAN2HTML= roffit < $< >$@ | MAN2HTML= roffit < $< >$@ | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										593
									
								
								docs/THANKS
									
									
									
									
									
								
							
							
						
						
									
										593
									
								
								docs/THANKS
									
									
									
									
									
								
							| @@ -1,110 +1,493 @@ | |||||||
|  This project has been alive for several years. Countless people have provided |  This project has been alive for many years. Countless people have provided | ||||||
|  feedback that have improved curl. Here follows a (incomplete) list of people |  feedback that have improved curl. Here follows a list of people that have | ||||||
|  that have contributed with non-trivial parts: |  contributed (a-z order). | ||||||
|  |  | ||||||
| Daniel Stenberg <daniel@haxx.se> |  If you have contributed but are missing here, please let us know! | ||||||
| Rafael Sagula <sagula@inf.ufrgs.br> |  | ||||||
| Sampo Kellomaki <sampo@iki.fi> | Adrian Schuur | ||||||
| Linas Vepstas <linas@linas.org> | Alan Pinstein | ||||||
| Bjorn Reese <breese@mail1.stofanet.dk> | Albert Chin-A-Young | ||||||
| Johan Anderson <johan@homemail.com> | Albert Choy | ||||||
| Kjell Ericson <Kjell.Ericson@haxx.se> | Aleksandar Milivojevic | ||||||
| Troy Engel <tengel@sonic.net> | Alex Neblett | ||||||
| Ryan Nelson <ryan@inch.com> | Alex Suykov | ||||||
| Bj<EFBFBD>rn Stenberg <bjorn@haxx.se> | Alex aka WindEagle | ||||||
| Angus Mackay <amackay@gus.ml.org> | Alexander Kourakos | ||||||
| Eric Young <eay@cryptsoft.com> |  | ||||||
| Simon Dick <simond@totally.irrelevant.org> |  | ||||||
| Oren Tirosh <oren@monty.hishome.net> |  | ||||||
| Steven G. Johnson <stevenj@alum.mit.edu> |  | ||||||
| Gilbert Ramirez Jr. <gram@verdict.uthscsa.edu> |  | ||||||
| Andr<EFBFBD>s Garc<72>a <ornalux@redestb.es> |  | ||||||
| Douglas E. Wegscheid <wegscd@whirlpool.com> |  | ||||||
| Mark Butler <butlerm@xmission.com> |  | ||||||
| Eric Thelin <eric@generation-i.com> |  | ||||||
| Marc Boucher <marc@mbsi.ca> |  | ||||||
| Greg Onufer <Greg.Onufer@Eng.Sun.COM> |  | ||||||
| Doug Kaufman <dkaufman@rahul.net> |  | ||||||
| David Eriksson <david@2good.com> |  | ||||||
| Ralph Beckmann <rabe@uni-paderborn.de> |  | ||||||
| T. Yamada <tai@imasy.or.jp> |  | ||||||
| Lars J. Aas <larsa@sim.no> |  | ||||||
| J<EFBFBD>rn Hartroth <Joern.Hartroth@computer.org> |  | ||||||
| Matthew Clarke <clamat@van.maves.ca> |  | ||||||
| Linus Nielsen Feltzing <linus@haxx.se> |  | ||||||
| Felix von Leitner <felix@convergence.de> |  | ||||||
| Dan Zitter <dzitter@zitter.net> |  | ||||||
| Jongki Suwandi <Jongki.Suwandi@eng.sun.com> |  | ||||||
| Chris Maltby <chris@aurema.com> |  | ||||||
| Ron Zapp <rzapper@yahoo.com> |  | ||||||
| Paul Marquis <pmarquis@iname.com> |  | ||||||
| Ellis Pritchard <ellis@citria.com> |  | ||||||
| Damien Adant <dams@usa.net> |  | ||||||
| Chris <cbayliss@csc.come> |  | ||||||
| Marco G. Salvagno <mgs@whiz.cjb.net> |  | ||||||
| Paul Marquis <pmarquis@iname.com> |  | ||||||
| David LeBlanc <dleblanc@qnx.com> |  | ||||||
| Rich Gray at Plus Technologies |  | ||||||
| Luong Dinh Dung <u8luong@lhsystems.hu> |  | ||||||
| Torsten Foertsch <torsten.foertsch@gmx.net> |  | ||||||
| Kristian K<>hntopp <kris@koehntopp.de> |  | ||||||
| Fred Noz <FNoz@siac.com> |  | ||||||
| Caolan McNamara <caolan@csn.ul.ie> |  | ||||||
| Albert Chin-A-Young <china@thewrittenword.com> |  | ||||||
| Stephen Kick <skick@epicrealm.com> |  | ||||||
| Martin Hedenfalk <mhe@stacken.kth.se> |  | ||||||
| Richard Prescott <rip at step.polymtl.ca> |  | ||||||
| Jason S. Priebe <priebe@wral-tv.com> |  | ||||||
| T. Bharath <TBharath@responsenetworks.com> |  | ||||||
| Alexander Kourakos <awk@users.sourceforge.net> |  | ||||||
| James Griffiths <griffiths_james@yahoo.com> |  | ||||||
| Loic Dachary <loic@senga.org> |  | ||||||
| Robert Weaver <robert.weaver@sabre.com> |  | ||||||
| Ingo Ralf Blum <ingoralfblum@ingoralfblum.com> |  | ||||||
| Jun-ichiro itojun Hagino <itojun@iijlab.net> |  | ||||||
| Frederic Lepied <flepied@mandrakesoft.com> |  | ||||||
| Georg Horn <horn@koblenz-net.de> |  | ||||||
| Cris Bailiff <c.bailiff@awayweb.com> |  | ||||||
| Sterling Hughes <sterling@designmultimedia.com> |  | ||||||
| S. Moonesamy |  | ||||||
| Ingo Wilken <iw@WWW.Ecce-Terram.DE> |  | ||||||
| Pawel A. Gajda <mis@k2.net.pl> |  | ||||||
| Patrick Bihan-Faou |  | ||||||
| Nico Baggus <Nico.Baggus@mail.ing.nl> |  | ||||||
| Sergio Ballestrero |  | ||||||
| Andrew Francis <locust@familyhealth.com.au> |  | ||||||
| Tomasz Lacki <Tomasz.Lacki@primark.pl> |  | ||||||
| Georg Huettenegger <georg@ist.org> |  | ||||||
| John Lask <johnlask@hotmail.com> |  | ||||||
| Eric Lavigne <erlavigne@wanadoo.fr> |  | ||||||
| Marcus Webster <marcus.webster@phocis.com> |  | ||||||
| G<EFBFBD>tz Babin-Ebell <babin<69>ebell@trustcenter.de> |  | ||||||
| Andreas Damm <andreas-sourceforge@radab.org> |  | ||||||
| Jacky Lam <sylam@emsoftltd.com> |  | ||||||
| James Gallagher <jgallagher@gso.uri.edu> |  | ||||||
| Kjetil Jacobsen <kjetilja@cs.uit.no> |  | ||||||
| Markus F.X.J. Oberhumer <markus@oberhumer.com> |  | ||||||
| Miklos Nemeth <mnemeth@kfkisystems.com> |  | ||||||
| Kevin Roth <kproth@users.sourceforge.net> |  | ||||||
| Ralph Mitchell <rmitchell@eds.com> |  | ||||||
| Dan Fandrich <dan@coneharvesters.com> |  | ||||||
| Jean-Philippe Barrette-LaPierre <jpb@rrette.com> |  | ||||||
| Richard Bramante <RBramante@on.com> |  | ||||||
| Daniel Kouril <kouril@ics.muni.cz> |  | ||||||
| Dirk Manske <dm@nettraffic.de> |  | ||||||
| David Meyer <meyer@paracel.com> |  | ||||||
| Dominick Meglio <codemstr@ptd.net> |  | ||||||
| Gisle Vanem <gvanem@broadpark.no> |  | ||||||
| Giuseppe Attardi <attardi@di.unipi.it> |  | ||||||
| Tor Arntsen <tor@spacetec.no> |  | ||||||
| David Byron <DByron@everdreamcorp.com> |  | ||||||
| David Phillips |  | ||||||
| Alexander Krasnostavsky | Alexander Krasnostavsky | ||||||
| G<EFBFBD>nter Knauf | Alexander Lazic | ||||||
|  | Alexander Zhuravlev | ||||||
|  | Alexis Carvalho | ||||||
|  | Amol Pattekar | ||||||
|  | Andi Jahja | ||||||
|  | Andreas Damm | ||||||
|  | Andreas Olsson | ||||||
|  | Andreas Rieke | ||||||
|  | Andres Garcia | ||||||
|  | Andrew Benham | ||||||
|  | Andrew Bushnell | ||||||
|  | Andrew Francis | ||||||
|  | Andrew Fuller | ||||||
|  | Andr<EFBFBD>s Garc<72>a | ||||||
|  | Andy Cedilnik | ||||||
|  | Andy Serpa | ||||||
|  | Angus Mackay | ||||||
|  | Antoine Calando | ||||||
|  | Anton Kalmykov | ||||||
|  | Arkadiusz Miskiewicz | ||||||
|  | Augustus Saunders | ||||||
|  | Avery Fay | ||||||
|  | Ben Greear | ||||||
|  | Ben Madsen | ||||||
|  | Benjamin Gerard | ||||||
| Bertrand Demiddelaer | Bertrand Demiddelaer | ||||||
| Peter Sylvester | Bjorn Reese | ||||||
| Alexis S. L. Carvalho | Bj<EFBFBD>rn Stenberg | ||||||
|  | Bob Schader | ||||||
|  | Brad Burdick | ||||||
|  | Bradford Bruce | ||||||
|  | Brent Beardsley | ||||||
|  | Brian Akins | ||||||
|  | Brian R Duffy | ||||||
|  | Bruce Mitchener | ||||||
|  | Bryan Henderson | ||||||
|  | Bryan Kemp | ||||||
|  | Caolan McNamara | ||||||
| Casey O'Donnell | Casey O'Donnell | ||||||
| Marty Kuhrt | Chih-Chung Chang | ||||||
| James Bursa | Chris "Bob Bob" | ||||||
|  | Chris Combes | ||||||
|  | Chris Gaukroger | ||||||
|  | Chris Maltby | ||||||
|  | Christian Kurz | ||||||
|  | Christian Robottom Reis | ||||||
|  | Christophe Demory | ||||||
|  | Christophe Legry | ||||||
|  | Christopher R. Palmer | ||||||
|  | Clarence Gardner | ||||||
|  | Clifford Wolf | ||||||
|  | Cody Jones | ||||||
|  | Colin Watson | ||||||
|  | Colm Buckley | ||||||
|  | Cory Nelson | ||||||
|  | Craig Davison | ||||||
|  | Craig Markwardt | ||||||
|  | Cris Bailiff | ||||||
|  | Cyrill Osterwalder | ||||||
|  | Damien Adant | ||||||
|  | Dan Becker | ||||||
|  | Dan C | ||||||
|  | Dan Fandrich | ||||||
|  | Dan Torop | ||||||
|  | Dan Zitter | ||||||
|  | Daniel Stenberg | ||||||
|  | Daniel at touchtunes | ||||||
|  | Darryl House | ||||||
|  | Dave Dribin | ||||||
|  | Dave Halbakken | ||||||
|  | Dave Hamilton | ||||||
|  | Dave May | ||||||
|  | David Byron | ||||||
|  | David Cohen | ||||||
|  | David Eriksson | ||||||
|  | David Houlder | ||||||
|  | David Hull | ||||||
|  | David J Meyer | ||||||
|  | David James | ||||||
|  | David Kimdon | ||||||
|  | David Lang | ||||||
|  | David LeBlanc | ||||||
|  | David Odin | ||||||
|  | David Phillips | ||||||
|  | David Shaw | ||||||
|  | David Tarendash | ||||||
|  | David Thiel | ||||||
|  | David Yan | ||||||
|  | Detlef Schmier | ||||||
|  | Diego Casorran | ||||||
|  | Dima Barsky | ||||||
|  | Dimitris Sarris | ||||||
|  | Dinar | ||||||
|  | Dirk Eddelbuettel | ||||||
|  | Dirk Manske | ||||||
|  | Dmitry Bartsevich | ||||||
|  | Dolbneff A.V | ||||||
|  | Domenico Andreoli | ||||||
|  | Dominick Meglio | ||||||
|  | Doug Kaufman | ||||||
|  | Doug Porter | ||||||
|  | Douglas E. Wegscheid | ||||||
|  | Douglas R. Horner | ||||||
|  | Dov Murik | ||||||
|  | Duane Cathey | ||||||
|  | Dustin Boswell | ||||||
|  | Dylan Ellicott | ||||||
|  | Dylan Salisbury | ||||||
|  | Early Ehlinger | ||||||
|  | Edin Kadribasic | ||||||
|  | Ellis Pritchard | ||||||
|  | Emiliano Ida | ||||||
|  | Enrico Scholz | ||||||
|  | Enrik Berkhan | ||||||
|  | Eric Cooper | ||||||
|  | Eric Lavigne | ||||||
|  | Eric Melville | ||||||
|  | Eric Rautman | ||||||
|  | Eric Thelin | ||||||
|  | Eric Vergnaud | ||||||
|  | Eric Young | ||||||
|  | Erick Nuwendam | ||||||
|  | Erwan Legrand | ||||||
|  | Erwin Authried | ||||||
|  | Eugene Kotlyarov | ||||||
|  | Evan Jordan | ||||||
|  | Fabrizio Ammollo | ||||||
|  | Fedor Karpelevitch | ||||||
|  | Felix von Leitner | ||||||
|  | Florian Schoppmann | ||||||
|  | Forrest Cahoon | ||||||
|  | Frank Keeney | ||||||
|  | Frank Ticheler | ||||||
|  | Fred New | ||||||
|  | Fred Noz | ||||||
|  | Frederic Lepied | ||||||
|  | Gautam Mani | ||||||
|  | Gaz Iqbal | ||||||
|  | Georg Horn | ||||||
|  | Georg Huettenegger | ||||||
|  | Georg Wicherski | ||||||
|  | Gerd v. Egidy | ||||||
|  | Gerhard Herre | ||||||
|  | Giaslas Georgios | ||||||
|  | Gilad | ||||||
|  | Gilbert Ramirez Jr. | ||||||
|  | Gisle Vanem | ||||||
|  | Giuseppe Attardi | ||||||
|  | Giuseppe D'Ambrosio | ||||||
|  | Glen Nakamura | ||||||
|  | Glen Scott | ||||||
| Greg Hewgill | Greg Hewgill | ||||||
|  | Greg Onufer | ||||||
|  | Grigory Entin | ||||||
|  | Guenole Bescon | ||||||
|  | Guillaume Arluison | ||||||
|  | Gustaf Hui | ||||||
|  | Gwenole Beauchesne | ||||||
|  | G<EFBFBD>tz Babin-Ebell | ||||||
|  | G<EFBFBD>nter Knauf | ||||||
|  | Hamish Mackenzie | ||||||
|  | Hanno Kranzhoff | ||||||
|  | Hans Steegers | ||||||
|  | Hardeep Singh | ||||||
|  | Harshal Pradhan | ||||||
|  | Heikki Korpela | ||||||
|  | Henrik Storner | ||||||
|  | Hzhijun | ||||||
|  | Ian Ford | ||||||
|  | Ian Gulliver | ||||||
|  | Ian Wilkes | ||||||
|  | Ignacio Vazquez-Abrams | ||||||
|  | Igor Polyakov | ||||||
|  | Ilguiz Latypov | ||||||
|  | Ingo Ralf Blum | ||||||
|  | Ingo Wilken | ||||||
|  | Jacky Lam | ||||||
|  | Jacob Meuser | ||||||
|  | James Bursa | ||||||
|  | James Clancy | ||||||
|  | James Cone | ||||||
|  | James Gallagher | ||||||
|  | James Griffiths | ||||||
|  | James MacMillan | ||||||
|  | Jamie Lokier | ||||||
|  | Jamie Newton | ||||||
|  | Jamie Wilkinson | ||||||
|  | Jan Kunder | ||||||
|  | Jason S. Priebe | ||||||
|  | Jaz Fresh | ||||||
|  | Jean Jacques Drouin | ||||||
|  | Jean-Claude Chauve | ||||||
|  | Jean-Louis Lemaire | ||||||
|  | Jean-Marc Ranger | ||||||
|  | Jean-Philippe Barrette-LaPierre | ||||||
|  | Jeff Lawson | ||||||
|  | Jeff Phillips | ||||||
|  | Jeff Pohlmeyer | ||||||
|  | Jeffrey Pohlmeyer | ||||||
|  | Jeremy Friesner | ||||||
|  | Jesper Jensen | ||||||
|  | Jesse Noller | ||||||
|  | Jim Drash | ||||||
|  | Joe Halpin | ||||||
|  | Joel Chen | ||||||
|  | Johan Anderson | ||||||
|  | Johan Nilsson | ||||||
|  | John Crow | ||||||
|  | John Janssen | ||||||
|  | John Kelly | ||||||
|  | John Lask | ||||||
|  | John McGowan | ||||||
|  | Jon Grubbs | ||||||
|  | Jon Travis | ||||||
|  | Jon Turner | ||||||
|  | Jonas Forsman | ||||||
|  | Jonatan Lander | ||||||
|  | Jonathan Hseu | ||||||
|  | Jongki Suwandi | ||||||
|  | Josh Kapell | ||||||
|  | Juan F. Codagnone | ||||||
|  | Juan Ignacio Herv<72>s | ||||||
|  | Juergen Wilke | ||||||
|  | Jukka Pihl | ||||||
|  | Julian Noble | ||||||
|  | Jun-ichiro itojun Hagino | ||||||
|  | Jurij Smakov | ||||||
|  | J<EFBFBD>rg Mueller-Tolk | ||||||
|  | J<EFBFBD>rn Hartroth | ||||||
|  | Kai Sommerfeld | ||||||
|  | Kai-Uwe Rommel | ||||||
|  | Kang-Jin Lee | ||||||
|  | Karl Moerder | ||||||
|  | Karol Pietrzak | ||||||
|  | Keith MacDonald | ||||||
|  | Keith McGuigan | ||||||
|  | Ken Hirsch | ||||||
|  | Ken Rastatter | ||||||
|  | Kent Boortz | ||||||
|  | Kevin Fisk | ||||||
|  | Kevin Lussier | ||||||
|  | Kevin Roth | ||||||
|  | Kimmo Kinnunen | ||||||
|  | Kjell Ericson | ||||||
|  | Kjetil Jacobsen | ||||||
|  | Klevtsov Vadim | ||||||
|  | Kris Kennaway | ||||||
|  | Krishnendu Majumdar | ||||||
|  | Kristian K<>hntopp | ||||||
|  | Kyle Sallee | ||||||
|  | Lachlan O'Dea | ||||||
|  | Larry Campbell | ||||||
|  | Larry Fahnoe | ||||||
|  | Lars Gustafsson | ||||||
|  | Lars J. Aas | ||||||
|  | Lars Nilsson | ||||||
|  | Lars Torben Wilson | ||||||
|  | Legoff Vincent | ||||||
|  | Lehel Bernadt | ||||||
|  | Len Krause | ||||||
|  | Linas Vepstas | ||||||
|  | Ling Thio | ||||||
|  | Linus Nielsen Feltzing | ||||||
|  | Loic Dachary | ||||||
|  | Loren Kirkby | ||||||
|  | Luca Altea | ||||||
|  | Luca Alteas | ||||||
|  | Lucas Adamski | ||||||
|  | Lukasz Czekierda | ||||||
|  | Luke Call | ||||||
|  | Luong Dinh Dung | ||||||
|  | Maciej W. Rozycki | ||||||
|  | Marc Boucher | ||||||
|  | Marcelo Juchem  | ||||||
|  | Marcin Konicki | ||||||
|  | Marco G. Salvagno | ||||||
|  | Marcus Webster | ||||||
|  | Mario Schroeder | ||||||
|  | Mark Butler | ||||||
|  | Markus Moeller | ||||||
|  | Markus Oberhumer | ||||||
|  | Martijn Koster | ||||||
|  | Martin C. Martin | ||||||
|  | Martin Hedenfalk | ||||||
|  | Marty Kuhrt | ||||||
|  | Maruko | ||||||
|  | Massimiliano Ziccardi | ||||||
|  | Mathias Axelsson | ||||||
|  | Mats Lidell | ||||||
|  | Matt Veenstra | ||||||
|  | Matthew Blain | ||||||
|  | Matthew Clarke | ||||||
|  | Maurice Barnum | ||||||
|  | Mekonikum | ||||||
|  | Mettgut Jamalla | ||||||
|  | Michael Benedict | ||||||
|  | Michael Curtis | ||||||
|  | Michael Jahn | ||||||
|  | Michael Mealling | ||||||
|  | Michael Wallner | ||||||
|  | Michal Bonino | ||||||
|  | Michal Marek | ||||||
|  | Mihai Ionescu | ||||||
|  | Mike Bytnar | ||||||
|  | Mike Dobbs | ||||||
|  | Miklos Nemeth | ||||||
|  | Mitz Wark | ||||||
|  | Mohamed Lrhazi | ||||||
|  | Mohun Biswas | ||||||
|  | Moonesamy | ||||||
|  | Nathan O'Sullivan | ||||||
|  | Naveen Noel | ||||||
|  | Neil Dunbar | ||||||
|  | Neil Spring | ||||||
|  | Nic Roets | ||||||
|  | Nick Gimbrone | ||||||
|  | Nick Humfrey | ||||||
|  | Nico Baggus | ||||||
|  | Nicolas Berloquin | ||||||
|  | Nicolas Croiset | ||||||
|  | Nicolas Fran<61>ois | ||||||
|  | Niels van Tongeren | ||||||
|  | Nikita Schmidt | ||||||
|  | Nis Jorgensen | ||||||
|  | Nodak Sodak | ||||||
|  | Norbert Novotny | ||||||
|  | Ofer | ||||||
|  | Oren Tirosh | ||||||
|  | P R Schaffner | ||||||
|  | Patrick Bihan-Faou | ||||||
|  | Patrick Smith | ||||||
|  | Paul Harrington | ||||||
|  | Paul Marquis | ||||||
|  | Paul Moore | ||||||
|  | Paul Nolan | ||||||
|  | Pavel Cenek | ||||||
|  | Pavel Orehov | ||||||
|  | Pawel A. Gajda | ||||||
|  | Pedro Neves | ||||||
|  | Pete Su | ||||||
|  | Peter Bray | ||||||
|  | Peter Forret | ||||||
|  | Peter Pentchev | ||||||
|  | Peter Su | ||||||
|  | Peter Sylvester | ||||||
|  | Peter Todd | ||||||
|  | Peter Verhas | ||||||
|  | Peter Wullinger | ||||||
|  | Peteris Krumins | ||||||
|  | Phil Karn | ||||||
|  | Philip Gladstone | ||||||
|  | Philippe Hameau | ||||||
|  | Philippe Raoult | ||||||
|  | Philippe Vaucher | ||||||
|  | Pierre | ||||||
|  | Puneet Pawaia | ||||||
|  | Quagmire | ||||||
|  | Rafael Sagula | ||||||
|  | Ralph Beckmann | ||||||
|  | Ralph Mitchell | ||||||
|  | Ramana Mokkapati | ||||||
|  | Randy McMurchy | ||||||
|  | Reinout van Schouwen | ||||||
|  | Renaud Chaillat | ||||||
|  | Renaud Duhaut | ||||||
|  | Rene Bernhardt | ||||||
|  | Rene Rebe | ||||||
|  | Ricardo Cadime | ||||||
|  | Rich Gray | ||||||
|  | Richard Archer | ||||||
|  | Richard Atterer | ||||||
|  | Richard Bramante | ||||||
|  | Richard Clayton | ||||||
|  | Richard Cooper | ||||||
|  | Richard Gorton | ||||||
|  | Richard Prescott | ||||||
|  | Rick Jones | ||||||
|  | Rick Richardson | ||||||
|  | Rob Stanzel | ||||||
|  | Robert D. Young | ||||||
|  | Robert Olson | ||||||
|  | Robert Weaver | ||||||
|  | Robin Kay | ||||||
|  | Rodney Simmons | ||||||
|  | Roland Krikava | ||||||
|  | Roland Zimmermann | ||||||
|  | Roman Koifman | ||||||
|  | Ron Zapp | ||||||
|  | Rosimildo da Silva | ||||||
|  | Roy Shan | ||||||
|  | Rune Kleveland | ||||||
|  | Ryan Nelson | ||||||
|  | S. Moonesamy | ||||||
|  | Salvador D<>vila | ||||||
|  | Salvatore Sorrentino | ||||||
|  | Sampo Kellomaki | ||||||
|  | Samuel D<>az Garc<72>a | ||||||
|  | Samuel Listopad | ||||||
|  | Sander Gates | ||||||
|  | Saul good | ||||||
|  | Scott Davis | ||||||
|  | Sebastien Willemijns | ||||||
|  | Sergio Ballestrero | ||||||
|  | Seshubabu Pasam | ||||||
|  | Shard | ||||||
|  | Shawn Poulson | ||||||
|  | Shmulik Regev | ||||||
|  | Siddhartha Prakash Jain | ||||||
|  | Simon Dick | ||||||
|  | Simon Josefsson | ||||||
|  | Simon Liu | ||||||
|  | Spiridonoff A.V | ||||||
|  | Stadler Stephan | ||||||
|  | Stefan Esser | ||||||
|  | Stefan Ulrich | ||||||
|  | Stephan Bergmann | ||||||
|  | Stephen Kick | ||||||
|  | Stephen More | ||||||
|  | Sterling Hughes | ||||||
|  | Steve Green | ||||||
|  | Steve Lhomme | ||||||
|  | Steve Marx | ||||||
|  | Steve Oliphant | ||||||
|  | Steven Bazyl | ||||||
|  | Steven G. Johnson | ||||||
|  | Stoned Elipot | ||||||
|  | Sven Neuhaus | ||||||
|  | S<EFBFBD>bastien Willemijns | ||||||
|  | T. Bharath | ||||||
|  | T. Yamada | ||||||
|  | Temprimus | ||||||
|  | Thomas Schwinge | ||||||
|  | Thomas Tonino | ||||||
|  | Tim Baker | ||||||
|  | Tim Bartley | ||||||
|  | Tim Costello | ||||||
|  | Tim Sneddon | ||||||
|  | Toby Peterson | ||||||
|  | Todd Kulesza | ||||||
|  | Tom Benoist | ||||||
|  | Tom Lee | ||||||
|  | Tom Mattison | ||||||
|  | Tom Moers | ||||||
|  | Tom Zerucha | ||||||
|  | Tomas Pospisek | ||||||
|  | Tomas Szepe | ||||||
|  | Tomasz Lacki | ||||||
|  | Tommy Tam | ||||||
|  | Ton Voon | ||||||
|  | Tor Arntsen | ||||||
|  | Torsten Foertsch | ||||||
|  | Toshiyuki Maezawa | ||||||
|  | Traian Nicolescu | ||||||
|  | Troels Walsted Hansen | ||||||
|  | Troy Engel | ||||||
|  | Tupone Alfredo | ||||||
|  | Ulf H<>rnhammar | ||||||
|  | Ulrich Zadow | ||||||
|  | Vilmos Nebehaj | ||||||
|  | Vincent Bronner | ||||||
|  | Vincent Penquerc'h | ||||||
|  | Vincent Sanders | ||||||
|  | Vojtech Janota | ||||||
|  | Vojtech Minarik | ||||||
|  | Walter J. Mack | ||||||
|  | Wayne Haigh | ||||||
|  | Werner Koch | ||||||
|  | Wesley Laxton | ||||||
|  | Wez Furlong | ||||||
|  | Wilfredo Sanchez | ||||||
|  | Wojciech Zwiefka | ||||||
|  | Yang Tse | ||||||
|  | Yarram Sunil | ||||||
|  | Zvi Har'El  | ||||||
|  | nk | ||||||
|  | swalkaus at yahoo.com | ||||||
|  | tommink[at]post.pl | ||||||
|   | |||||||
							
								
								
									
										90
									
								
								docs/TODO
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								docs/TODO
									
									
									
									
									
								
							| @@ -26,25 +26,46 @@ TODO | |||||||
|  |  | ||||||
|  * More data sharing. curl_share_* functions already exist and work, and they |  * More data sharing. curl_share_* functions already exist and work, and they | ||||||
|    can be extended to share more. For example, enable sharing of the ares |    can be extended to share more. For example, enable sharing of the ares | ||||||
|    channel. |    channel and the connection cache. | ||||||
|  |  | ||||||
|  * Introduce a new error code indicating authentication problems (for proxy |  * Introduce a new error code indicating authentication problems (for proxy | ||||||
|    CONNECT error 407 for example). This cannot be an error code, we must not |    CONNECT error 407 for example). This cannot be an error code, we must not | ||||||
|    return informational stuff as errors, consider a new info returned by |    return informational stuff as errors, consider a new info returned by | ||||||
|    curl_easy_getinfo() #845941 |    curl_easy_getinfo() http://curl.haxx.se/bug/view.cgi?id=845941 | ||||||
|  |  | ||||||
|  * Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and |  * Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and | ||||||
|    SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete. |    SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete. | ||||||
|  |    To support ipv6 interface addresses properly. | ||||||
|  |  | ||||||
|  * Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and |  * Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and | ||||||
|    GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan. |    GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan. | ||||||
|  |  | ||||||
|  |  * Add option that changes the interval in which the progress callback is | ||||||
|  |    called at most. | ||||||
|  |  | ||||||
|  |  * Make libcurl built with c-ares use c-ares' IPv6 abilities. They weren't | ||||||
|  |    present when we first added c-ares support but they have been added since! | ||||||
|  |    When this is done and works, we can actually start considering making c-ares | ||||||
|  |    powered libcurl the default build (which of course would require that we'd | ||||||
|  |    bundle the c-ares source code in the libcurl source code releases). | ||||||
|  |  | ||||||
|  |  * Support CONNECT 407 responses that kill the connection and expect the | ||||||
|  |    client to reconnect to complete the authentication. Currently libcurl | ||||||
|  |    assumes that a proxy connection will be kept alive. | ||||||
|  |  | ||||||
|  |  * Make the curl/*.h headers include the proper system includes based on what | ||||||
|  |    was present at the time when configure was run. Currently, the sys/select.h | ||||||
|  |    header is for example included by curl/multi.h only on specific platforms | ||||||
|  |    we know MUST have it. This is error-prone. We therefore want the header | ||||||
|  |    files to adapt to configure results. Those results must be stored in a new | ||||||
|  |    header and they must use a curl name space, i.e not be HAVE_* prefix (as | ||||||
|  |    that would risk collide with other apps that use libcurl and that runs | ||||||
|  |    configure). | ||||||
|  |  | ||||||
|  LIBCURL - multi interface |  LIBCURL - multi interface | ||||||
|  |  | ||||||
|  * Add a curl_multi_fdset() alternative that returns only two arrays with file |  * Add a curl_multi_fdset() alternative. this allows apps to avoid the | ||||||
|    desrciptors for reading and writing to allow the app to use whatever |    FD_SETSIZE problem with select(). | ||||||
|    function it prefers. Plus, this allows apps to avoid the FD_SETSIZE problem |  | ||||||
|    with select(). |  | ||||||
|  |  | ||||||
|  * Add curl_multi_timeout() to make libcurl's ares-functionality better. |  * Add curl_multi_timeout() to make libcurl's ares-functionality better. | ||||||
|  |  | ||||||
| @@ -59,6 +80,17 @@ TODO | |||||||
|    ready to accept read data. Today libcurl feeds the data as soon as it is |    ready to accept read data. Today libcurl feeds the data as soon as it is | ||||||
|    available for reading, no matter what. |    available for reading, no matter what. | ||||||
|  |  | ||||||
|  |  * Add curl_multi_socket() and family to the multi interface that gets file | ||||||
|  |    descriptors, as an alternative to the curl_multi_fdset(). This is necessary | ||||||
|  |    to allow apps to properly avoid the FD_SETSIZE problem. | ||||||
|  |  | ||||||
|  |  * Make curl_easy_perform() a wrapper-function that simply creates a multi | ||||||
|  |    handle, adds the easy handle to it, runs curl_multi_perform() until the | ||||||
|  |    transfer is done, then detach the easy handle, destroy the multi handle and | ||||||
|  |    return the easy handle's return code. This will thus make everything | ||||||
|  |    internally use and assume the multi interface. The select()-loop should use | ||||||
|  |    curl_multi_socket(). | ||||||
|  |  | ||||||
|  DOCUMENTATION |  DOCUMENTATION | ||||||
|  |  | ||||||
|  * More and better |  * More and better | ||||||
| @@ -68,12 +100,9 @@ TODO | |||||||
|  * Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in |  * Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in | ||||||
|    the process to avoid doing a resolve and connect in vain. |    the process to avoid doing a resolve and connect in vain. | ||||||
|  |  | ||||||
|  * Code overhaul to make it more state-machine like and to _never_ block on |  | ||||||
|    waiting for server responses when used with the multi interface. |  | ||||||
|  |  | ||||||
|  * Support GSS/Kerberos 5 for ftp file transfer. This will allow user |  * Support GSS/Kerberos 5 for ftp file transfer. This will allow user | ||||||
|    authentication and file encryption.  Possible libraries and example clients |    authentication and file encryption.  Possible libraries and example clients | ||||||
|    are available from MIT or Heimdal. Requsted by Markus Moeller. |    are available from MIT or Heimdal. Requested by Markus Moeller. | ||||||
|  |  | ||||||
|  * REST fix for servers not behaving well on >2GB requests. This should fail |  * REST fix for servers not behaving well on >2GB requests. This should fail | ||||||
|    if the server doesn't set the pointer to the requested index. The tricky |    if the server doesn't set the pointer to the requested index. The tricky | ||||||
| @@ -146,14 +175,31 @@ TODO | |||||||
|    it be? There's so much that could be done if it were! (brought by Chris |    it be? There's so much that could be done if it were! (brought by Chris | ||||||
|    Clark) |    Clark) | ||||||
|  |  | ||||||
|  * Make curl's SSL layer option capable of using other free SSL libraries. |  * Make curl's SSL layer capable of using other free SSL libraries.  Such as | ||||||
|    Such as the Mozilla Security Services |    Mozilla Security Services | ||||||
|    (http://www.mozilla.org/projects/security/pki/nss/) and GnuTLS |    (http://www.mozilla.org/projects/security/pki/nss/), MatrixSSL | ||||||
|    (http://www.gnu.org/software/gnutls/) This subject has been brought up |    (http://www.matrixssl.org/) or yaSSL (http://yassl.com/). At least the | ||||||
|    again recently since GPL-licensed applications that link with libcurl MAY |    latter two could be alternatives for those looking to reduce the footprint | ||||||
|    NOT distribute binaries that use OpenSSL without adding an exception clause |    of libcurl built with OpenSSL or GnuTLS. | ||||||
|    to the GPL license. See the LICENSE-MIXING document and this: |  | ||||||
|    http://www.gnome.org/~markmc/openssl-and-the-gpl.html |  * Peter Sylvester's patch for SRP on the TLS layer. | ||||||
|  |    Awaits OpenSSL support for this, no need to support this in libcurl before | ||||||
|  |    there's an OpenSSL release that does it. | ||||||
|  |  | ||||||
|  |  * make the configure --with-ssl option first check for OpenSSL and then for | ||||||
|  |    GnuTLS if OpenSSL wasn't detected. | ||||||
|  |  | ||||||
|  |  GnuTLS | ||||||
|  |  | ||||||
|  |  * Get NTLM working using the functions provided by libgcrypt, since GnuTLS | ||||||
|  |    already depends on that to function. Not strictly SSL/TLS related, but | ||||||
|  |    hey... Another option is to get available DES and MD4 source code from the | ||||||
|  |    cryptopp library. They are fine license-wise, but are C++. | ||||||
|  |  | ||||||
|  |  * SSL engine stuff? | ||||||
|  |  | ||||||
|  |  * Work out a common method with Peter Sylvester's OpenSSL-patch for SRP | ||||||
|  |    on the TLS to provide name and password | ||||||
|  |  | ||||||
|  LDAP |  LDAP | ||||||
|  |  | ||||||
| @@ -163,12 +209,6 @@ TODO | |||||||
|  |  | ||||||
|  NEW PROTOCOLS |  NEW PROTOCOLS | ||||||
|  |  | ||||||
|  * TFTP - RFC1350 (protocol) and RFC3617 (URI format) |  | ||||||
|  |  | ||||||
|    Dan Fandrich: I wrote a tftp protocol module as part of the I-Boot |  | ||||||
|    bootloader under a BSD-style license with attribution clause |  | ||||||
|    http://download.intrinsyc.com/supported/tools/i-boot-lite/i-boot-lite-1.8/src/libs/net/tftp.c |  | ||||||
|  |  | ||||||
|  * RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description) |  * RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description) | ||||||
|  |  | ||||||
|  * SFTP/SCP/SSH (no RFCs for protocol nor URI/URL format). An implementation |  * SFTP/SCP/SSH (no RFCs for protocol nor URI/URL format). An implementation | ||||||
| @@ -190,7 +230,7 @@ TODO | |||||||
|  * Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'. |  * Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'. | ||||||
|    Requested by Dane Jensen and others. This is easily scripted though. |    Requested by Dane Jensen and others. This is easily scripted though. | ||||||
|  |  | ||||||
|  * Add an option that prevents cURL from overwiting existing local files. When |  * Add an option that prevents cURL from overwriting existing local files. When | ||||||
|    used, and there already is an existing file with the target file name |    used, and there already is an existing file with the target file name | ||||||
|    (either -O or -o), a number should be appended (and increased if already |    (either -O or -o), a number should be appended (and increased if already | ||||||
|    existing). So that index.html becomes first index.html.1 and then |    existing). So that index.html becomes first index.html.1 and then | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ Version Numbers and Releases | |||||||
|    N is pre-release number |    N is pre-release number | ||||||
|  |  | ||||||
|  One of these numbers will get bumped in each new release. The numbers to the |  One of these numbers will get bumped in each new release. The numbers to the | ||||||
|  right of a bumped number will be reset to zero. If Z is zero, it is not |  right of a bumped number will be reset to zero. If Z is zero, it may not be | ||||||
|  included in the version number. The pre release number is only included in |  included in the version number. The pre release number is only included in | ||||||
|  pre releases (they're never used in public, official, releases). |  pre releases (they're never used in public, official, releases). | ||||||
|  |  | ||||||
| @@ -49,7 +49,7 @@ Version Numbers and Releases | |||||||
|  |  | ||||||
|  As a service to any application that might want to support new libcurl |  As a service to any application that might want to support new libcurl | ||||||
|  features while still being able to build with older versions, all releases |  features while still being able to build with older versions, all releases | ||||||
|  have the libcurl version stored in the curl/curl.h file using a static |  have the libcurl version stored in the curl/curlver.h file using a static | ||||||
|  numbering scheme that can be used for comparison. The version number is |  numbering scheme that can be used for comparison. The version number is | ||||||
|  defined as: |  defined as: | ||||||
|          |          | ||||||
| @@ -62,3 +62,6 @@ Version Numbers and Releases | |||||||
|  This 6-digit hexadecimal number does not show pre-release number, and it is |  This 6-digit hexadecimal number does not show pre-release number, and it is | ||||||
|  always a greater number in a more recent release. It makes comparisons with |  always a greater number in a more recent release. It makes comparisons with | ||||||
|  greater than and less than work. |  greater than and less than work. | ||||||
|  |  | ||||||
|  |  This number is also available as three separate defines: | ||||||
|  |  LIBCURL_VERSION_MAJOR, LIBCURL_VERSION_MINOR and LIBCURL_VERSION_PATCH. | ||||||
|   | |||||||
| @@ -53,10 +53,10 @@ in $prefix/lib and its header files are installed in $prefix/include and so | |||||||
| on. The prefix is set with "configure --prefix". | on. The prefix is set with "configure --prefix". | ||||||
| .IP "--protocols" | .IP "--protocols" | ||||||
| Lists what particular protocols the installed libcurl was built to support. At | Lists what particular protocols the installed libcurl was built to support. At | ||||||
| the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, GOPHER, | the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, FILE, | ||||||
| FILE, TELNET, LDAP, DICT. Do not assume any particular order. The protocols | TELNET, LDAP, DICT. Do not assume any particular order. The protocols will | ||||||
| will be listed using uppercase and are separated by newlines. There may be | be listed using uppercase and are separated by newlines. There may be none, | ||||||
| none, one or several protocols in the list. (Added in 7.13.0) | one or several protocols in the list. (Added in 7.13.0) | ||||||
| .IP "--version" | .IP "--version" | ||||||
| Outputs version information about the installed libcurl. | Outputs version information about the installed libcurl. | ||||||
| .IP "--vernum" | .IP "--vernum" | ||||||
| @@ -64,7 +64,7 @@ Outputs version information about the installed libcurl, in numerical mode. | |||||||
| This outputs the version number, in hexadecimal, with 8 bits for each part; | This outputs the version number, in hexadecimal, with 8 bits for each part; | ||||||
| major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl | major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl | ||||||
| 12.13.14 would appear as 0c0d0e... Note that the initial zero might be | 12.13.14 would appear as 0c0d0e... Note that the initial zero might be | ||||||
| omitted. | omitted. (This option was broken in the 7.15.0 release.) | ||||||
| .SH "EXAMPLES" | .SH "EXAMPLES" | ||||||
| What linker options do I need when I link with libcurl? | What linker options do I need when I link with libcurl? | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										306
									
								
								docs/curl.1
									
									
									
									
									
								
							
							
						
						
									
										306
									
								
								docs/curl.1
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | |||||||
| .\" *                            | (__| |_| |  _ <| |___ | .\" *                            | (__| |_| |  _ <| |___ | ||||||
| .\" *                             \___|\___/|_| \_\_____| | .\" *                             \___|\___/|_| \_\_____| | ||||||
| .\" * | .\" * | ||||||
| .\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | .\" * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||||
| .\" * | .\" * | ||||||
| .\" * This software is licensed as described in the file COPYING, which | .\" * This software is licensed as described in the file COPYING, which | ||||||
| .\" * you should have received as part of this distribution. The terms | .\" * you should have received as part of this distribution. The terms | ||||||
| @@ -21,7 +21,7 @@ | |||||||
| .\" * $Id$ | .\" * $Id$ | ||||||
| .\" ************************************************************************** | .\" ************************************************************************** | ||||||
| .\" | .\" | ||||||
| .TH curl 1 "25 Jan 2005" "Curl 7.13.0" "Curl Manual" | .TH curl 1 "21 Feb 2006" "Curl 7.15.2" "Curl Manual" | ||||||
| .SH NAME | .SH NAME | ||||||
| curl \- transfer a URL | curl \- transfer a URL | ||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| @@ -30,8 +30,8 @@ curl \- transfer a URL | |||||||
| .SH DESCRIPTION | .SH DESCRIPTION | ||||||
| .B curl | .B curl | ||||||
| is a tool to transfer data from or to a server, using one of the supported | is a tool to transfer data from or to a server, using one of the supported | ||||||
| protocols (HTTP, HTTPS, FTP, FTPS, GOPHER, DICT, TELNET, LDAP or FILE). The | protocols (HTTP, HTTPS, FTP, FTPS, TFTP, DICT, TELNET, LDAP or FILE). | ||||||
| command is designed to work without user interaction. | The command is designed to work without user interaction. | ||||||
|  |  | ||||||
| curl offers a busload of useful tricks like proxy support, user | curl offers a busload of useful tricks like proxy support, user | ||||||
| authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file | authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file | ||||||
| @@ -64,11 +64,40 @@ several ones next to each other: | |||||||
| You can specify any amount of URLs on the command line. They will be fetched | You can specify any amount of URLs on the command line. They will be fetched | ||||||
| in a sequential manner in the specified order. | in a sequential manner in the specified order. | ||||||
|  |  | ||||||
|  | Since curl 7.15.1 you can also specify step counter for the ranges, so that | ||||||
|  | you can get every Nth number or letter: | ||||||
|  |  | ||||||
|  |  http://www.numericals.com/file[1-100:10].txt | ||||||
|  |  http://www.letters.com/file[a-z:2].txt | ||||||
|  |  | ||||||
|  | If you specify URL without protocol:// prefix, curl will attempt to guess what | ||||||
|  | protocol you might want. It will then default to HTTP but try other protocols | ||||||
|  | based on often-used host name prefixes. For example, for host names starting | ||||||
|  | with "ftp." curl will assume you want to speak FTP. | ||||||
|  |  | ||||||
| Curl will attempt to re-use connections for multiple file transfers, so that | Curl will attempt to re-use connections for multiple file transfers, so that | ||||||
| getting many files from the same server will not do multiple connects / | getting many files from the same server will not do multiple connects / | ||||||
| handshakes. This improves speed. Of course this is only done on files | handshakes. This improves speed. Of course this is only done on files | ||||||
| specified on a single command line and cannot be used between separate curl | specified on a single command line and cannot be used between separate curl | ||||||
| invokes. | invokes. | ||||||
|  | .SH "PROGRESS METER" | ||||||
|  | curl normally displays a progress meter during operations, indicating amount | ||||||
|  | of transfered data, transfer speeds and estimated time left etc. | ||||||
|  |  | ||||||
|  | However, since curl displays data to the terminal by default, if you invoke | ||||||
|  | curl to do an operation and it is about to write data to the terminal, it | ||||||
|  | \fIdisables\fP the progress meter as otherwise it would mess up the output | ||||||
|  | mixing progress meter and response data. | ||||||
|  |  | ||||||
|  | If you want a progress meter for HTTP POST or PUT requests, you need to | ||||||
|  | redirect the response output to a file, using shell redirect (>), -o [file] or | ||||||
|  | similar. | ||||||
|  |  | ||||||
|  | It is not the same case for FTP upload as that operation is not spitting out | ||||||
|  | any response data to the terminal. | ||||||
|  |  | ||||||
|  | If you prefer a progress "bar" instead of the regular meter, \fI-#\fP is your | ||||||
|  | friend. | ||||||
| .SH OPTIONS | .SH OPTIONS | ||||||
| .IP "-a/--append" | .IP "-a/--append" | ||||||
| (FTP) When used in an FTP upload, this will tell curl to append to the target | (FTP) When used in an FTP upload, this will tell curl to append to the target | ||||||
| @@ -89,7 +118,7 @@ most secure one the remote site claims it supports. This is done by first | |||||||
| doing a request and checking the response-headers, thus inducing an extra | doing a request and checking the response-headers, thus inducing an extra | ||||||
| network round-trip. This is used instead of setting a specific authentication | network round-trip. This is used instead of setting a specific authentication | ||||||
| method, which you can do with \fI--basic\fP, \fI--digest\fP, \fI--ntlm\fP, and | method, which you can do with \fI--basic\fP, \fI--digest\fP, \fI--ntlm\fP, and | ||||||
| \fI--negotiate\fP. (Added in 7.10.6) | \fI--negotiate\fP. | ||||||
|  |  | ||||||
| Note that using --anyauth is not recommended if you do uploads from stdin, | Note that using --anyauth is not recommended if you do uploads from stdin, | ||||||
| since it may require data to be sent twice and then the client must be able to | since it may require data to be sent twice and then the client must be able to | ||||||
| @@ -129,7 +158,7 @@ If this option is used twice, the second one will disable ASCII usage. | |||||||
| (HTTP) Tells curl to use HTTP Basic authentication. This is the default and | (HTTP) Tells curl to use HTTP Basic authentication. This is the default and | ||||||
| this option is usually pointless, unless you use it to override a previously | this option is usually pointless, unless you use it to override a previously | ||||||
| set option that sets a different authentication method (such as \fI--ntlm\fP, | set option that sets a different authentication method (such as \fI--ntlm\fP, | ||||||
| \fI--digest\fP and \fI--negotiate\fP). (Added in 7.10.6) | \fI--digest\fP and \fI--negotiate\fP). | ||||||
|  |  | ||||||
| If this option is used several times, the following occurrences make no | If this option is used several times, the following occurrences make no | ||||||
| difference. | difference. | ||||||
| @@ -187,7 +216,8 @@ To create remote directories when using FTP, try \fI--ftp-create-dirs\fP. | |||||||
| .IP "--crlf" | .IP "--crlf" | ||||||
| (FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390). | (FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390). | ||||||
|  |  | ||||||
| If this option is used twice, the second will again disable crlf converting. | If this option is used several times, the following occurrences make no | ||||||
|  | difference. | ||||||
| .IP "-d/--data <data>" | .IP "-d/--data <data>" | ||||||
| (HTTP) Sends the specified data in a POST request to the HTTP server, in a way | (HTTP) Sends the specified data in a POST request to the HTTP server, in a way | ||||||
| that can emulate as if a user has filled in a HTML form and pressed the submit | that can emulate as if a user has filled in a HTML form and pressed the submit | ||||||
| @@ -231,7 +261,7 @@ append data. | |||||||
| prevents the password from being sent over the wire in clear text. Use this in | prevents the password from being sent over the wire in clear text. Use this in | ||||||
| combination with the normal \fI-u/--user\fP option to set user name and | combination with the normal \fI-u/--user\fP option to set user name and | ||||||
| password. See also \fI--ntlm\fP, \fI--negotiate\fP and \fI--anyauth\fP for | password. See also \fI--ntlm\fP, \fI--negotiate\fP and \fI--anyauth\fP for | ||||||
| related options. (Added in curl 7.10.6) | related options. | ||||||
|  |  | ||||||
| If this option is used several times, the following occurrences make no | If this option is used several times, the following occurrences make no | ||||||
| difference. | difference. | ||||||
| @@ -241,7 +271,7 @@ active FTP transfers. Curl will normally always first attempt to use EPRT, | |||||||
| then LPRT before using PORT, but with this option, it will use PORT right | then LPRT before using PORT, but with this option, it will use PORT right | ||||||
| away. EPRT and LPRT are extensions to the original FTP protocol, may not work | away. EPRT and LPRT are extensions to the original FTP protocol, may not work | ||||||
| on all servers but enable more functionality in a better way than the | on all servers but enable more functionality in a better way than the | ||||||
| traditional PORT command. (Added in 7.10.5) | traditional PORT command. | ||||||
|  |  | ||||||
| If this option is used several times, each occurrence will toggle this on/off. | If this option is used several times, each occurrence will toggle this on/off. | ||||||
| .IP "--disable-epsv" | .IP "--disable-epsv" | ||||||
| @@ -265,9 +295,9 @@ If this option is used several times, the last one will be used. | |||||||
| .IP "-e/--referer <URL>" | .IP "-e/--referer <URL>" | ||||||
| (HTTP) Sends the "Referer Page" information to the HTTP server. This can also | (HTTP) Sends the "Referer Page" information to the HTTP server. This can also | ||||||
| be set with the \fI-H/--header\fP flag of course.  When used with | be set with the \fI-H/--header\fP flag of course.  When used with | ||||||
| \fI-L/--location\fP you can append ";auto" to the referer URL to make curl | \fI-L/--location\fP you can append ";auto" to the --referer URL to make curl | ||||||
| automatically set the previous URL when it follows a Location: header. The | automatically set the previous URL when it follows a Location: header. The | ||||||
| ";auto" string can be used alone, even if you don't set an initial referer. | \&";auto" string can be used alone, even if you don't set an initial --referer. | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. | If this option is used several times, the last one will be used. | ||||||
| .IP "--engine <name>" | .IP "--engine <name>" | ||||||
| @@ -325,9 +355,9 @@ If this option is used several times, the last one will be used. | |||||||
| .IP "-f/--fail" | .IP "-f/--fail" | ||||||
| (HTTP) Fail silently (no output at all) on server errors. This is mostly done | (HTTP) Fail silently (no output at all) on server errors. This is mostly done | ||||||
| like this to better enable scripts etc to better deal with failed attempts. In | like this to better enable scripts etc to better deal with failed attempts. In | ||||||
| normal cases when a HTTP server fails to deliver a document, it returns a HTML | normal cases when a HTTP server fails to deliver a document, it returns an | ||||||
| document stating so (which often also describes why and more). This flag will | HTML document stating so (which often also describes why and more). This flag | ||||||
| prevent curl from outputting that and fail silently instead. | will prevent curl from outputting that and return error 22. | ||||||
|  |  | ||||||
| If this option is used twice, the second will again disable silent failure. | If this option is used twice, the second will again disable silent failure. | ||||||
| .IP "--ftp-account [data]" | .IP "--ftp-account [data]" | ||||||
| @@ -339,15 +369,43 @@ If this option is used twice, the second will override the previous use. | |||||||
| .IP "--ftp-create-dirs" | .IP "--ftp-create-dirs" | ||||||
| (FTP) When an FTP URL/operation uses a path that doesn't currently exist on | (FTP) When an FTP URL/operation uses a path that doesn't currently exist on | ||||||
| the server, the standard behavior of curl is to fail. Using this option, curl | the server, the standard behavior of curl is to fail. Using this option, curl | ||||||
| will instead attempt to create missing directories. (Added in 7.10.7) | will instead attempt to create missing directories. | ||||||
|  |  | ||||||
| If this option is used twice, the second will again disable silent failure. | If this option is used twice, the second will again disable directory creation. | ||||||
|  | .IP "--ftp-method [method]" | ||||||
|  | (FTP) Control what method curl should use to reach a file on a FTP(S) | ||||||
|  | server. The method argument should be one of the following alternatives: | ||||||
|  | .RS | ||||||
|  | .IP multicwd | ||||||
|  | curl does a single CWD operation for each path part in the given URL. For deep | ||||||
|  | hierarchies this means very many commands. This is how RFC1738 says it should | ||||||
|  | be done. This is the default but the slowest behavior. | ||||||
|  | .IP nocwd | ||||||
|  | curl does no CWD at all. curl will do SIZE, RETR, STOR etc and give a full | ||||||
|  | path to the server for all these commands. This is the fastest behavior. | ||||||
|  | .IP singlecwd | ||||||
|  | curl does one CWD with the full target directory and then operates on the file | ||||||
|  | \&"normally" (like in the multicwd case). This is somewhat more standards | ||||||
|  | compliant than 'nocwd' but without the full penalty of 'multicwd'. | ||||||
|  | .RE | ||||||
| .IP "--ftp-pasv" | .IP "--ftp-pasv" | ||||||
| (FTP) Use PASV when transfering. PASV is the internal default behavior, but | (FTP) Use PASV when transferring. PASV is the internal default behavior, but | ||||||
| using this option can be used to override a previous --ftp-port option. (Added | using this option can be used to override a previous --ftp-port option. (Added | ||||||
| in 7.11.0) | in 7.11.0) | ||||||
|  |  | ||||||
| If this option is used twice, the second will again disable silent failure. | If this option is used several times, the following occurrences make no | ||||||
|  | difference. | ||||||
|  |  | ||||||
|  | .IP "--ftp-skip-pasv-ip" | ||||||
|  | (FTP) Tell curl to not use the IP address the server suggests in its response | ||||||
|  | to curl's PASV command when curl connects the data connection. Instead curl | ||||||
|  | will re-use the same IP address it already uses for the control | ||||||
|  | connection. (Added in 7.14.2) | ||||||
|  |  | ||||||
|  | This option has no effect if PORT, EPRT or EPSV is used instead of PASV. | ||||||
|  |  | ||||||
|  | If this option is used twice, the second will again use the server's suggested | ||||||
|  | address. | ||||||
| .IP "--ftp-ssl" | .IP "--ftp-ssl" | ||||||
| (FTP) Make the FTP connection switch to use SSL/TLS. (Added in 7.11.0) | (FTP) Make the FTP connection switch to use SSL/TLS. (Added in 7.11.0) | ||||||
|  |  | ||||||
| @@ -380,9 +438,20 @@ or | |||||||
|  |  | ||||||
| \fBcurl\fP -F "name=daniel;type=text/foo" url.com | \fBcurl\fP -F "name=daniel;type=text/foo" url.com | ||||||
|  |  | ||||||
|  | You can also explicitly change the name field of an file upload part by | ||||||
|  | setting filename=, like this: | ||||||
|  |  | ||||||
|  | \fBcurl\fP -F "file=@localfile;filename=nameinpost" url.com | ||||||
|  |  | ||||||
| See further examples and details in the MANUAL. | See further examples and details in the MANUAL. | ||||||
|  |  | ||||||
| This option can be used multiple times. | This option can be used multiple times. | ||||||
|  | .IP "--form-string <name=string>" | ||||||
|  | (HTTP) Similar to \fI--form\fP except that the value string for the named | ||||||
|  | parameter is used literally. Leading \&'@' and \&'<' characters, and the | ||||||
|  | \&';type=' string in the value have no special meaning. Use this in preference | ||||||
|  | to \fI--form\fP if there's any possibility that the string value may | ||||||
|  | accidentally trigger the \&'@' or \&'<' features of \fI--form\fP. | ||||||
| .IP "-g/--globoff" | .IP "-g/--globoff" | ||||||
| This option switches off the "URL globbing parser". When you set this option, | This option switches off the "URL globbing parser". When you set this option, | ||||||
| you can specify URLs that contain the letters {}[] without having them being | you can specify URLs that contain the letters {}[] without having them being | ||||||
| @@ -397,7 +466,8 @@ with a '?'  separator. | |||||||
| If used in combination with -I, the POST data will instead be appended to the | If used in combination with -I, the POST data will instead be appended to the | ||||||
| URL with a HEAD request. | URL with a HEAD request. | ||||||
|  |  | ||||||
| If used multiple times, nothing special happens. | If this option is used several times, the following occurrences make no | ||||||
|  | difference. | ||||||
| .IP "-h/--help" | .IP "-h/--help" | ||||||
| Usage help. | Usage help. | ||||||
| .IP "-H/--header <header>" | .IP "-H/--header <header>" | ||||||
| @@ -410,9 +480,19 @@ set headers without knowing perfectly well what you're doing. Replacing an | |||||||
| internal header with one without content on the right side of the colon will | internal header with one without content on the right side of the colon will | ||||||
| prevent that header from appearing. | prevent that header from appearing. | ||||||
|  |  | ||||||
|  | curl will make sure that each header you add/replace get sent with the proper | ||||||
|  | end of line marker, you should thus \fBnot\fP add that as a part of the header | ||||||
|  | content: do not add newlines or carriage returns they will only mess things up | ||||||
|  | for you. | ||||||
|  |  | ||||||
| See also the \fI-A/--user-agent\fP and \fI-e/--referer\fP options. | See also the \fI-A/--user-agent\fP and \fI-e/--referer\fP options. | ||||||
|  |  | ||||||
| This option can be used multiple times to add/replace/remove multiple headers. | This option can be used multiple times to add/replace/remove multiple headers. | ||||||
|  | .IP "--ignore-content-length" | ||||||
|  | (HTTP) | ||||||
|  | Ignore the Content-Length header. This is particularly useful for servers | ||||||
|  | running Apache 1.x, which will report incorrect Content-Length for files | ||||||
|  | larger than 2 gigabytes. | ||||||
| .IP "-i/--include" | .IP "-i/--include" | ||||||
| (HTTP) | (HTTP) | ||||||
| Include the HTTP-header in the output. The HTTP-header includes things | Include the HTTP-header in the output. The HTTP-header includes things | ||||||
| @@ -438,15 +518,14 @@ If this option is used twice, the second will again disable header only. | |||||||
| (HTTP) When curl is told to read cookies from a given file, this option will | (HTTP) When curl is told to read cookies from a given file, this option will | ||||||
| make it discard all "session cookies". This will basically have the same effect | make it discard all "session cookies". This will basically have the same effect | ||||||
| as if a new session is started. Typical browsers always discard session | as if a new session is started. Typical browsers always discard session | ||||||
| cookies when they're closed down. (Added in 7.9.7) | cookies when they're closed down. | ||||||
|  |  | ||||||
| If this option is used several times, each occurrence will toggle this on/off. | If this option is used several times, each occurrence will toggle this on/off. | ||||||
| .IP "-k/--insecure" | .IP "-k/--insecure" | ||||||
| (SSL) This option explicitly allows curl to perform "insecure" SSL connections | (SSL) This option explicitly allows curl to perform "insecure" SSL connections | ||||||
| and transfers. Starting with curl 7.10, all SSL connections will be attempted | and transfers. All SSL connections are attempted to be made secure by using | ||||||
| to be made secure by using the CA certificate bundle installed by | the CA certificate bundle installed by default. This makes all connections | ||||||
| default. This makes all connections considered "insecure" to fail unless | considered "insecure" to fail unless \fI-k/--insecure\fP is used. | ||||||
| \fI-k/--insecure\fP is used. |  | ||||||
|  |  | ||||||
| If this option is used twice, the second time will again disable it. | If this option is used twice, the second time will again disable it. | ||||||
| .IP "--key <key>" | .IP "--key <key>" | ||||||
| @@ -473,7 +552,7 @@ Specify which config file to read curl arguments from. The config file is a | |||||||
| text file in which command line arguments can be written which then will be | text file in which command line arguments can be written which then will be | ||||||
| used as if they were written on the actual command line. Options and their | used as if they were written on the actual command line. Options and their | ||||||
| parameters must be specified on the same config file line. If the parameter is | parameters must be specified on the same config file line. If the parameter is | ||||||
| to contain white spaces, the parameter must be inclosed within quotes.  If the | to contain white spaces, the parameter must be enclosed within quotes.  If the | ||||||
| first column of a config line is a '#' character, the rest of the line will be | first column of a config line is a '#' character, the rest of the line will be | ||||||
| treated as a comment. | treated as a comment. | ||||||
|  |  | ||||||
| @@ -486,6 +565,20 @@ line. So, it could look similar to this: | |||||||
| url = "http://curl.haxx.se/docs/" | url = "http://curl.haxx.se/docs/" | ||||||
|  |  | ||||||
| This option can be used multiple times. | This option can be used multiple times. | ||||||
|  |  | ||||||
|  | When curl is invoked, it always (unless \fI-q\fP is used) checks for a default | ||||||
|  | config file and uses it if found. The default config file is checked for in | ||||||
|  | the following places in this order: | ||||||
|  |  | ||||||
|  | 1) curl tries to find the "home dir": It first checks for the CURL_HOME and | ||||||
|  | then the HOME environment variables. Failing that, it uses getpwuid() on | ||||||
|  | unix-like systems (which returns the home dir given the current user in your | ||||||
|  | system). On Windows, it then checks for the APPDATA variable, or as a last | ||||||
|  | resort the '%USERPROFILE%\Application Data'. | ||||||
|  |  | ||||||
|  | 2) On windows, if there is no _curlrc file in the home dir, it checks for one | ||||||
|  | in the same dir the executable curl is placed. On unix-like systems, it will | ||||||
|  | simply try to load .curlrc from the determined home dir. | ||||||
| .IP "--limit-rate <speed>" | .IP "--limit-rate <speed>" | ||||||
| Specify the maximum transfer rate you want curl to use. This feature is useful | Specify the maximum transfer rate you want curl to use. This feature is useful | ||||||
| if you have a limited pipe and you'd like your transfer not use your entire | if you have a limited pipe and you'd like your transfer not use your entire | ||||||
| @@ -499,8 +592,6 @@ If you are also using the \fI-Y/--speed-limit\fP option, that option will take | |||||||
| precedence and might cripple the rate-limiting slightly, to help keeping the | precedence and might cripple the rate-limiting slightly, to help keeping the | ||||||
| speed-limit logic working. | speed-limit logic working. | ||||||
|  |  | ||||||
| This option was introduced in curl 7.10. |  | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. | If this option is used several times, the last one will be used. | ||||||
| .IP "-l/--list-only" | .IP "-l/--list-only" | ||||||
| (FTP) | (FTP) | ||||||
| @@ -514,15 +605,21 @@ list only files in their response to NLST; they do not include | |||||||
| subdirectories and symbolic links. | subdirectories and symbolic links. | ||||||
|  |  | ||||||
| If this option is used twice, the second will again disable list only. | If this option is used twice, the second will again disable list only. | ||||||
|  | .IP "--local-port <num>[-num]" | ||||||
|  | Set a prefered number or range of local port numbers to use for the | ||||||
|  | connection(s).  Note that port numbers by nature is a scarce resource that | ||||||
|  | will be busy at times so setting this range to something too narrow might | ||||||
|  | cause unnecessary connection setup failures. (Added in 7.15.2) | ||||||
| .IP "-L/--location" | .IP "-L/--location" | ||||||
| (HTTP/HTTPS) If the server reports that the requested page has a different | (HTTP/HTTPS) If the server reports that the requested page has moved to a | ||||||
| location (indicated with the header line Location:) this flag will let curl | different location (indicated with a Location: header and a 3XX response code) | ||||||
| attempt to reattempt the get on the new place. If used together with | this option will make curl redo the request on the new place. If used together | ||||||
| \fI-i/--include\fP or \fI-I/--head\fP, headers from all requested pages will | with \fI-i/--include\fP or \fI-I/--head\fP, headers from all requested pages | ||||||
| be shown. If authentication is used, curl will only send its credentials to | will be shown. When authentication is used, curl only sends its credentials to | ||||||
| the initial host, so if a redirect takes curl to a different host, it won't | the initial host. If a redirect takes curl to a different host, it won't be | ||||||
| intercept the user+password. See also \fI--location-trusted\fP on how to | able to intercept the user+password. See also \fI--location-trusted\fP on how | ||||||
| change this. | to change this. You can limit the amount of redirects to follow by using the | ||||||
|  | \fI--max-redirs\fP option. | ||||||
|  |  | ||||||
| If this option is used twice, the second will again disable location following. | If this option is used twice, the second will again disable location following. | ||||||
| .IP "--location-trusted" | .IP "--location-trusted" | ||||||
| @@ -544,8 +641,7 @@ this given limit. This concerns both FTP and HTTP transfers. | |||||||
| .IP "-m/--max-time <seconds>" | .IP "-m/--max-time <seconds>" | ||||||
| Maximum time in seconds that you allow the whole operation to take.  This is | Maximum time in seconds that you allow the whole operation to take.  This is | ||||||
| useful for preventing your batch jobs from hanging for hours due to slow | useful for preventing your batch jobs from hanging for hours due to slow | ||||||
| networks or links going down.  This doesn't work fully in win32 systems.  See | networks or links going down.  See also the \fI--connect-timeout\fP option. | ||||||
| also the \fI--connect-timeout\fP option. |  | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. | If this option is used several times, the last one will be used. | ||||||
| .IP "-M/--manual" | .IP "-M/--manual" | ||||||
| @@ -564,7 +660,7 @@ directory. | |||||||
|  |  | ||||||
| A quick and very simple example of how to setup a \fI.netrc\fP to allow curl | A quick and very simple example of how to setup a \fI.netrc\fP to allow curl | ||||||
| to ftp to the machine host.domain.com with user name \&'myself' and password | to ftp to the machine host.domain.com with user name \&'myself' and password | ||||||
| 'secret' should look similar to: | \&'secret' should look similar to: | ||||||
|  |  | ||||||
| .B "machine host.domain.com login myself password secret" | .B "machine host.domain.com login myself password secret" | ||||||
|  |  | ||||||
| @@ -577,12 +673,16 @@ Very similar to \fI--netrc\fP, but this option makes the .netrc usage | |||||||
| designed by Microsoft and is used in their web applications. It is primarily | designed by Microsoft and is used in their web applications. It is primarily | ||||||
| meant as a support for Kerberos5 authentication but may be also used along | meant as a support for Kerberos5 authentication but may be also used along | ||||||
| with another authentication methods. For more information see IETF draft | with another authentication methods. For more information see IETF draft | ||||||
| draft-brezak-spnego-http-04.txt. (Added in 7.10.6) | draft-brezak-spnego-http-04.txt. | ||||||
|  |  | ||||||
| This option requires that the library was built with GSSAPI support. This is | This option requires that the library was built with GSSAPI support. This is | ||||||
| not very common. Use \fI-V/--version\fP to see if your version supports | not very common. Use \fI-V/--version\fP to see if your version supports | ||||||
| GSS-Negotiate. | GSS-Negotiate. | ||||||
|  |  | ||||||
|  | When using this option, you must also provide a fake -u/--user option to | ||||||
|  | activate the authentication code properly. Sending a '-u :' is enough as the | ||||||
|  | user name and password from the -u option aren't actually used. | ||||||
|  |  | ||||||
| If this option is used several times, the following occurrences make no | If this option is used several times, the following occurrences make no | ||||||
| difference. | difference. | ||||||
| .IP "-N/--no-buffer" | .IP "-N/--no-buffer" | ||||||
| @@ -598,7 +698,7 @@ designed by Microsoft and is used by IIS web servers. It is a proprietary | |||||||
| protocol, reversed engineered by clever people and implemented in curl based | protocol, reversed engineered by clever people and implemented in curl based | ||||||
| on their efforts. This kind of behavior should not be endorsed, you should | on their efforts. This kind of behavior should not be endorsed, you should | ||||||
| encourage everyone who uses NTLM to switch to a public and documented | encourage everyone who uses NTLM to switch to a public and documented | ||||||
| authentication method instead. Such as Digest. (Added in 7.10.6) | authentication method instead. Such as Digest. | ||||||
|  |  | ||||||
| If you want to enable NTLM for your proxy authentication, then use | If you want to enable NTLM for your proxy authentication, then use | ||||||
| \fI--proxy-ntlm\fP. | \fI--proxy-ntlm\fP. | ||||||
| @@ -628,11 +728,21 @@ dynamically. | |||||||
| Write output to a local file named like the remote file we get. (Only the file | Write output to a local file named like the remote file we get. (Only the file | ||||||
| part of the remote file is used, the path is cut off.) | part of the remote file is used, the path is cut off.) | ||||||
|  |  | ||||||
|  | The remote file name to use for saving is extracted from the given URL, | ||||||
|  | nothing else. | ||||||
|  |  | ||||||
| You may use this option as many times as you have number of URLs. | You may use this option as many times as you have number of URLs. | ||||||
| .IP "--pass <phrase>" | .IP "--pass <phrase>" | ||||||
| (SSL) Pass phrase for the private key | (SSL) Pass phrase for the private key | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. | If this option is used several times, the last one will be used. | ||||||
|  | .IP "--proxy-anyauth" | ||||||
|  | Tells curl to pick a suitable authentication method when communicating with | ||||||
|  | the given proxy. This will cause an extra request/response round-trip. (Added | ||||||
|  | in 7.13.2) | ||||||
|  |  | ||||||
|  | If this option is used twice, the second will again disable the proxy use-any | ||||||
|  | authentication. | ||||||
| .IP "--proxy-basic" | .IP "--proxy-basic" | ||||||
| Tells curl to use HTTP Basic authentication when communicating with the given | Tells curl to use HTTP Basic authentication when communicating with the given | ||||||
| proxy. Use \fI--basic\fP for enabling HTTP Basic with a remote host. Basic is | proxy. Use \fI--basic\fP for enabling HTTP Basic with a remote host. Basic is | ||||||
| @@ -672,16 +782,18 @@ i.e "192.168.10.1" to specify exact IP number | |||||||
| .IP "host name" | .IP "host name" | ||||||
| i.e "my.host.domain" to specify machine | i.e "my.host.domain" to specify machine | ||||||
| .IP "-" | .IP "-" | ||||||
| (any single-letter string) to make it pick the machine's default | make curl pick the same IP address that is already used for the control | ||||||
|  | connection | ||||||
| .RE | .RE | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. Disable the | If this option is used several times, the last one will be used. Disable the | ||||||
| use of PORT with \fI--ftp-pasv\fP. Disable the attempt to use the EPRT command | use of PORT with \fI--ftp-pasv\fP. Disable the attempt to use the EPRT command | ||||||
| instead of PORT by using \fI--disable-eprt\fP. EPRT is really PORT++. | instead of PORT by using \fI--disable-eprt\fP. EPRT is really PORT++. | ||||||
| .IP "-q" | .IP "-q" | ||||||
| If used as the first parameter on the command line, the \fI$HOME/.curlrc\fP | If used as the first parameter on the command line, the \fIcurlrc\fP config | ||||||
| file will not be read and used as a config file. | file will not be read and used. See the \fI-K/--config\fP for details on the | ||||||
| .IP "-Q/--quote <comand>" | default config file search path. | ||||||
|  | .IP "-Q/--quote <command>" | ||||||
| (FTP) Send an arbitrary command to the remote FTP server. Quote commands are | (FTP) Send an arbitrary command to the remote FTP server. Quote commands are | ||||||
| sent BEFORE the transfer is taking place (just after the initial PWD command | sent BEFORE the transfer is taking place (just after the initial PWD command | ||||||
| to be exact). To make commands take place after a successful transfer, prefix | to be exact). To make commands take place after a successful transfer, prefix | ||||||
| @@ -711,7 +823,7 @@ specifies the second 500 bytes | |||||||
| .B -500 | .B -500 | ||||||
| specifies the last 500 bytes | specifies the last 500 bytes | ||||||
| .TP | .TP | ||||||
| .B 9500 | .B 9500- | ||||||
| specifies the bytes from offset 9500 and forward | specifies the bytes from offset 9500 and forward | ||||||
| .TP | .TP | ||||||
| .B 0-0,-1 | .B 0-0,-1 | ||||||
| @@ -752,7 +864,7 @@ for all forthcoming retries it will double the waiting time until it reaches | |||||||
| 10 minutes which then will be the delay between the rest of the retries.  By | 10 minutes which then will be the delay between the rest of the retries.  By | ||||||
| using \fI--retry-delay\fP you disable this exponential backoff algorithm. See | using \fI--retry-delay\fP you disable this exponential backoff algorithm. See | ||||||
| also \fI--retry-max-time\fP to limit the total time allowed for | also \fI--retry-max-time\fP to limit the total time allowed for | ||||||
| retries. (Option added in 7.12.3) | retries. (Added in 7.12.3) | ||||||
|  |  | ||||||
| If this option is used multiple times, the last occurrence decide the amount. | If this option is used multiple times, the last occurrence decide the amount. | ||||||
| .IP "--retry-delay <seconds>" | .IP "--retry-delay <seconds>" | ||||||
| @@ -760,7 +872,7 @@ Make curl sleep this amount of time between each retry when a transfer has | |||||||
| failed with a transient error (it changes the default backoff time algorithm | failed with a transient error (it changes the default backoff time algorithm | ||||||
| between retries). This option is only interesting if \fI--retry\fP is also | between retries). This option is only interesting if \fI--retry\fP is also | ||||||
| used. Setting this delay to zero will make curl use the default backoff time. | used. Setting this delay to zero will make curl use the default backoff time. | ||||||
| (Option added in 7.12.3) | (Added in 7.12.3) | ||||||
|  |  | ||||||
| If this option is used multiple times, the last occurrence decide the amount. | If this option is used multiple times, the last occurrence decide the amount. | ||||||
| .IP "--retry-max-time <seconds>" | .IP "--retry-max-time <seconds>" | ||||||
| @@ -769,26 +881,36 @@ done as usual (see \fI--retry\fP) as long as the timer hasn't reached this | |||||||
| given limit. Notice that if the timer hasn't reached the limit, the request | given limit. Notice that if the timer hasn't reached the limit, the request | ||||||
| will be made and while performing, it may take longer than this given time | will be made and while performing, it may take longer than this given time | ||||||
| period. To limit a single request\'s maximum time, use \fI-m/--max-time\fP. | period. To limit a single request\'s maximum time, use \fI-m/--max-time\fP. | ||||||
| Set this option to zero to not timeout retries. (Option added in 7.12.3) | Set this option to zero to not timeout retries. (Added in 7.12.3) | ||||||
|  |  | ||||||
| If this option is used multiple times, the last occurrence decide the amount. | If this option is used multiple times, the last occurrence decide the amount. | ||||||
| .IP "-s/--silent" | .IP "-s/--silent" | ||||||
| Silent mode. Don't show progress meter or error messages.  Makes | Silent mode. Don't show progress meter or error messages.  Makes | ||||||
| Curl mute. | Curl mute. | ||||||
|  |  | ||||||
| If this option is used twice, the second will again disable mute. | If this option is used twice, the second will again disable silent mode. | ||||||
| .IP "-S/--show-error" | .IP "-S/--show-error" | ||||||
| When used with -s it makes curl show error message if it fails. | When used with -s it makes curl show error message if it fails. | ||||||
|  |  | ||||||
| If this option is used twice, the second will again disable show error. | If this option is used twice, the second will again disable show error. | ||||||
| .IP "--socks <host[:port]>" | .IP "--socks4 <host[:port]>" | ||||||
| Use the specified SOCKS5 proxy. If the port number is not specified, it is | Use the specified SOCKS4 proxy. If the port number is not specified, it is | ||||||
| assumed at port 1080. (Option added in 7.11.1) | assumed at port 1080. (Added in 7.15.2) | ||||||
|  |  | ||||||
| This option overrides any previous use of \fI-x/--proxy\fP, as they are | This option overrides any previous use of \fI-x/--proxy\fP, as they are | ||||||
| mutually exclusive. | mutually exclusive. | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. | If this option is used several times, the last one will be used. | ||||||
|  | .IP "--socks5 <host[:port]>" | ||||||
|  | Use the specified SOCKS5 proxy. If the port number is not specified, it is | ||||||
|  | assumed at port 1080. (Added in 7.11.1) | ||||||
|  |  | ||||||
|  | This option overrides any previous use of \fI-x/--proxy\fP, as they are | ||||||
|  | mutually exclusive. | ||||||
|  |  | ||||||
|  | If this option is used several times, the last one will be used. (This option | ||||||
|  | was previously wrongly documented and used as --socks without the number | ||||||
|  | appended.) | ||||||
| .IP "--stderr <file>" | .IP "--stderr <file>" | ||||||
| Redirect all writes to stderr to the specified file instead. If the file name | Redirect all writes to stderr to the specified file instead. If the file name | ||||||
| is a plain '-', it is instead written to stdout. This option has no point when | is a plain '-', it is instead written to stdout. This option has no point when | ||||||
| @@ -818,13 +940,10 @@ this is used on a http(s) server, the PUT command will be used. | |||||||
|  |  | ||||||
| Use the file name "-" (a single dash) to use stdin instead of a given file. | Use the file name "-" (a single dash) to use stdin instead of a given file. | ||||||
|  |  | ||||||
| Before 7.10.8, when this option was used several times, the last one was used. | You can specify one -T for each URL on the command line. Each -T + URL pair | ||||||
|  | specifies what to upload and to where. curl also supports "globbing" of the -T | ||||||
| In curl 7.10.8 and later, you can specify one -T for each URL on the command | argument, meaning that you can upload multiple files to a single URL by using | ||||||
| line. Each -T + URL pair specifies what to upload and to where. curl also | the same URL globbing style supported in the URL, like this: | ||||||
| supports "globbing" of the -T argument, meaning that you can upload multiple |  | ||||||
| files to a single URL by using the same URL globbing style supported in the |  | ||||||
| URL, like this: |  | ||||||
|  |  | ||||||
| curl -T "{file1,file2}" http://www.uploadtothissite.com | curl -T "{file1,file2}" http://www.uploadtothissite.com | ||||||
|  |  | ||||||
| @@ -836,8 +955,7 @@ Enables a full trace dump of all incoming and outgoing data, including | |||||||
| descriptive information, to the given output file. Use "-" as filename to have | descriptive information, to the given output file. Use "-" as filename to have | ||||||
| the output sent to stdout. | the output sent to stdout. | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. (Added in | If this option is used several times, the last one will be used. | ||||||
| 7.9.7) |  | ||||||
| .IP "--trace-ascii <file>" | .IP "--trace-ascii <file>" | ||||||
| Enables a full trace dump of all incoming and outgoing data, including | Enables a full trace dump of all incoming and outgoing data, including | ||||||
| descriptive information, to the given output file. Use "-" as filename to have | descriptive information, to the given output file. Use "-" as filename to have | ||||||
| @@ -847,16 +965,28 @@ This is very similar to \fI--trace\fP, but leaves out the hex part and only | |||||||
| shows the ASCII part of the dump. It makes smaller output that might be easier | shows the ASCII part of the dump. It makes smaller output that might be easier | ||||||
| to read for untrained humans. | to read for untrained humans. | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. (Added in | If this option is used several times, the last one will be used. | ||||||
| 7.9.7) | .IP "--trace-time" | ||||||
|  | Prepends a time stamp to each trace or verbose line that curl displays. | ||||||
|  | (Added in 7.14.0) | ||||||
|  |  | ||||||
|  | If this option is used several times, each occurrence will toggle it on/off. | ||||||
| .IP "-u/--user <user:password>" | .IP "-u/--user <user:password>" | ||||||
| Specify user and password to use for server authentication. Overrides | Specify user and password to use for server authentication. Overrides | ||||||
| \fI-n/--netrc\fP and \fI--netrc-optional\fP. | \fI-n/--netrc\fP and \fI--netrc-optional\fP. | ||||||
|  |  | ||||||
|  | If you use an SSPI-enabled curl binary and do NTLM autentication, you can | ||||||
|  | force curl to pick up the user name and password from your environment by | ||||||
|  | simply specifying a single colon with this option: "-u :". | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. | If this option is used several times, the last one will be used. | ||||||
| .IP "-U/--proxy-user <user:password>" | .IP "-U/--proxy-user <user:password>" | ||||||
| Specify user and password to use for proxy authentication. | Specify user and password to use for proxy authentication. | ||||||
|  |  | ||||||
|  | If you use an SSPI-enabled curl binary and do NTLM autentication, you can | ||||||
|  | force curl to pick up the user name and password from your environment by | ||||||
|  | simply specifying a single colon with this option: "-U :". | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. | If this option is used several times, the last one will be used. | ||||||
| .IP "--url <URL>" | .IP "--url <URL>" | ||||||
| Specify a URL to fetch. This option is mostly handy when you want to specify | Specify a URL to fetch. This option is mostly handy when you want to specify | ||||||
| @@ -866,9 +996,9 @@ This option may be used any number of times. To control where this URL is | |||||||
| written, use the \fI-o/--output\fP or the \fI-O/--remote-name\fP options. | written, use the \fI-o/--output\fP or the \fI-O/--remote-name\fP options. | ||||||
| .IP "-v/--verbose" | .IP "-v/--verbose" | ||||||
| Makes the fetching more verbose/talkative. Mostly usable for debugging. Lines | Makes the fetching more verbose/talkative. Mostly usable for debugging. Lines | ||||||
| starting with '>' means data sent by curl, '<' means data received by curl | starting with '>' means "header data" sent by curl, '<' means "header data" | ||||||
| that is hidden in normal cases and lines starting with '*' means additional | received by curl that is hidden in normal cases and lines starting with '*' | ||||||
| info provided by curl. | means additional info provided by curl. | ||||||
|  |  | ||||||
| Note that if you only want HTTP headers in the output, \fI-i/--include\fP | Note that if you only want HTTP headers in the output, \fI-i/--include\fP | ||||||
| might be option you're looking for. | might be option you're looking for. | ||||||
| @@ -912,13 +1042,16 @@ SPNEGO Negotiate authentication is supported. | |||||||
| This curl supports transfers of large files, files larger than 2GB. | This curl supports transfers of large files, files larger than 2GB. | ||||||
| .IP "IDN" | .IP "IDN" | ||||||
| This curl supports IDN - international domain names. | This curl supports IDN - international domain names. | ||||||
|  | .IP "SSPI" | ||||||
|  | SSPI is supported. If you use NTLM and set a blank user name, curl will | ||||||
|  | authenticate with your current user and password. | ||||||
| .RE | .RE | ||||||
| .IP "-w/--write-out <format>" | .IP "-w/--write-out <format>" | ||||||
| Defines what to display after a completed and successful operation. The format | Defines what to display on stdout after a completed and successful | ||||||
| is a string that may contain plain text mixed with any number of variables. The | operation. The format is a string that may contain plain text mixed with any | ||||||
| string can be specified as "string", to get read from a particular file you | number of variables. The string can be specified as "string", to get read from | ||||||
| specify it "@filename" and to tell curl to read the format from stdin you | a particular file you specify it "@filename" and to tell curl to read the | ||||||
| write "@-". | format from stdin you write "@-". | ||||||
|  |  | ||||||
| The variables present in the output format will be substituted by the value or | The variables present in the output format will be substituted by the value or | ||||||
| text that curl thinks fit, as described below. All variables are specified | text that curl thinks fit, as described below. All variables are specified | ||||||
| @@ -991,7 +1124,7 @@ The average download speed that curl measured for the complete download. | |||||||
| The average upload speed that curl measured for the complete upload. | The average upload speed that curl measured for the complete upload. | ||||||
| .TP | .TP | ||||||
| .B content_type | .B content_type | ||||||
| The Content-Type of the requested document, if there was any. (Added in 7.9.5) | The Content-Type of the requested document, if there was any. | ||||||
| .TP | .TP | ||||||
| .B num_connects | .B num_connects | ||||||
| Number of new connects made in the recent transfer. (Added in 7.12.3) | Number of new connects made in the recent transfer. (Added in 7.12.3) | ||||||
| @@ -1014,12 +1147,16 @@ transparently be converted to HTTP. It means that certain protocol specific | |||||||
| operations might not be available. This is not the case if you can tunnel | operations might not be available. This is not the case if you can tunnel | ||||||
| through the proxy, as done with the \fI-p/--proxytunnel\fP option. | through the proxy, as done with the \fI-p/--proxytunnel\fP option. | ||||||
|  |  | ||||||
|  | Starting with 7.14.1, the proxy host can be specified the exact same way as | ||||||
|  | the proxy environment variables, include protocol prefix (http://) and | ||||||
|  | embedded user + password. | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. | If this option is used several times, the last one will be used. | ||||||
| .IP "-X/--request <command>" | .IP "-X/--request <command>" | ||||||
| (HTTP) | (HTTP) Specifies a custom request method to use when communicating with the | ||||||
| Specifies a custom request to use when communicating with the HTTP server. | HTTP server.  The specified request will be used instead of the method | ||||||
| The specified request will be used instead of the standard GET. Read the | otherwise used (which defaults to GET). Read the HTTP 1.1 specification for | ||||||
| HTTP 1.1 specification for details and explanations. | details and explanations. | ||||||
|  |  | ||||||
| (FTP) | (FTP) | ||||||
| Specifies a custom FTP command to use instead of LIST when doing file lists | Specifies a custom FTP command to use instead of LIST when doing file lists | ||||||
| @@ -1056,7 +1193,8 @@ If this option is used several times, the last one will be used. | |||||||
| .IP "--max-redirs <num>" | .IP "--max-redirs <num>" | ||||||
| Set maximum number of redirection-followings allowed. If \fI-L/--location\fP | Set maximum number of redirection-followings allowed. If \fI-L/--location\fP | ||||||
| is used, this option can be used to prevent curl from following redirections | is used, this option can be used to prevent curl from following redirections | ||||||
| \&"in absurdum". | \&"in absurdum". By default, the limit is set to 50 redirections. Set this | ||||||
|  | option to -1 to make it limitless. | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. | If this option is used several times, the last one will be used. | ||||||
| .IP "-0/--http1.0" | .IP "-0/--http1.0" | ||||||
| @@ -1085,11 +1223,11 @@ Note that not all FTP server allow 3rd party transfers. (Added in 7.13.0) | |||||||
| .IP "-4/--ipv4" | .IP "-4/--ipv4" | ||||||
| If libcurl is capable of resolving an address to multiple IP versions (which | If libcurl is capable of resolving an address to multiple IP versions (which | ||||||
| it is if it is ipv6-capable), this option tells libcurl to resolve names to | it is if it is ipv6-capable), this option tells libcurl to resolve names to | ||||||
| IPv4 addresses only. (Added in 7.10.8) | IPv4 addresses only. | ||||||
| .IP "-6/--ipv6" | .IP "-6/--ipv6" | ||||||
| If libcurl is capable of resolving an address to multiple IP versions (which | If libcurl is capable of resolving an address to multiple IP versions (which | ||||||
| it is if it is ipv6-capable), this option tells libcurl to resolve names to | it is if it is ipv6-capable), this option tells libcurl to resolve names to | ||||||
| IPv6 addresses only. (Added in 7.10.8) | IPv6 addresses only. | ||||||
| .IP "-#/--progress-bar" | .IP "-#/--progress-bar" | ||||||
| Make curl display progress information as a progress bar instead of the | Make curl display progress information as a progress bar instead of the | ||||||
| default statistics. | default statistics. | ||||||
| @@ -1107,13 +1245,11 @@ Sets proxy server to use for HTTP. | |||||||
| Sets proxy server to use for HTTPS. | Sets proxy server to use for HTTPS. | ||||||
| .IP "FTP_PROXY [protocol://]<host>[:port]" | .IP "FTP_PROXY [protocol://]<host>[:port]" | ||||||
| Sets proxy server to use for FTP. | Sets proxy server to use for FTP. | ||||||
| .IP "GOPHER_PROXY [protocol://]<host>[:port]" |  | ||||||
| Sets proxy server to use for GOPHER. |  | ||||||
| .IP "ALL_PROXY [protocol://]<host>[:port]" | .IP "ALL_PROXY [protocol://]<host>[:port]" | ||||||
| Sets proxy server to use if no protocol-specific proxy is set. | Sets proxy server to use if no protocol-specific proxy is set. | ||||||
| .IP "NO_PROXY <comma-separated list of hosts>" | .IP "NO_PROXY <comma-separated list of hosts>" | ||||||
| list of host names that shouldn't go through any proxy. If set to a asterisk | list of host names that shouldn't go through any proxy. If set to a asterisk | ||||||
| '*' only, it matches all hosts. | \&'*' only, it matches all hosts. | ||||||
| .SH EXIT CODES | .SH EXIT CODES | ||||||
| There exists a bunch of different error codes and their corresponding error | There exists a bunch of different error codes and their corresponding error | ||||||
| messages that may appear during bad conditions. At the time of this writing, | messages that may appear during bad conditions. At the time of this writing, | ||||||
| @@ -1135,7 +1271,9 @@ Failed to connect to host. | |||||||
| .IP 8 | .IP 8 | ||||||
| FTP weird server reply. The server sent data curl couldn't parse. | FTP weird server reply. The server sent data curl couldn't parse. | ||||||
| .IP 9 | .IP 9 | ||||||
| FTP access denied. The server denied login. | FTP access denied. The server denied login or denied access to the particular | ||||||
|  | resource or directory you wanted to reach. Most often you tried to change to a | ||||||
|  | directory that doesn't exist on the server. | ||||||
| .IP 10 | .IP 10 | ||||||
| FTP user/password incorrect. Either one or both were not accepted by the | FTP user/password incorrect. Either one or both were not accepted by the | ||||||
| server. | server. | ||||||
| @@ -1263,5 +1401,5 @@ http://curl.haxx.se | |||||||
| ftp://ftp.sunet.se/pub/www/utilities/curl/ | ftp://ftp.sunet.se/pub/www/utilities/curl/ | ||||||
| .SH "SEE ALSO" | .SH "SEE ALSO" | ||||||
| .BR ftp (1), | .BR ftp (1), | ||||||
| .BR wget (1), | .BR wget (1) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,8 @@ EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.c		\ | |||||||
|  post-callback.c multi-app.c multi-double.c multi-single.c		\ |  post-callback.c multi-app.c multi-double.c multi-single.c		\ | ||||||
|  multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c		\ |  multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c		\ | ||||||
|  multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c	\ |  multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c	\ | ||||||
|  anyauthput.c htmltitle.cc |  anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c		\ | ||||||
|  |  cookie_interface.c cacertinmem.c synctime.c | ||||||
|  |  | ||||||
| all: | all: | ||||||
| 	@echo "done" | 	@echo "done" | ||||||
|   | |||||||
| @@ -33,6 +33,8 @@ we expect you to actually torture our web site with your tests! Thanks. | |||||||
| EXAMPLES | EXAMPLES | ||||||
|  |  | ||||||
| anyauthput.c   - HTTP PUT using "any" authentication method | anyauthput.c   - HTTP PUT using "any" authentication method | ||||||
|  | cacertinmem.c  - Use a built-in PEM certificate to retrieve a https page | ||||||
|  | cookie_interface.c - shows usage of simple cookie interface | ||||||
| curlgtk.c      - download using a GTK progress bar | curlgtk.c      - download using a GTK progress bar | ||||||
| curlx.c        - getting file info from the remote cert data | curlx.c        - getting file info from the remote cert data | ||||||
| debug.c        - showing how to use the debug callback | debug.c        - showing how to use the debug callback | ||||||
| @@ -55,6 +57,7 @@ multi-double.c - a multi-interface app doing two simultaneous transfers | |||||||
| multi-post.c   - a multi-interface app doing a multipart formpost | multi-post.c   - a multi-interface app doing a multipart formpost | ||||||
| multi-single.c - a multi-interface app getting a single file | multi-single.c - a multi-interface app getting a single file | ||||||
| multithread.c  - an example using multi-treading transfering multiple files | multithread.c  - an example using multi-treading transfering multiple files | ||||||
|  | opensslthreadlock.c - show how to do locking when using OpenSSL multi-threaded | ||||||
| persistant.c   - request two URLs with a persistant connection | persistant.c   - request two URLs with a persistant connection | ||||||
| post-callback.c - send a HTTP POST using a callback | post-callback.c - send a HTTP POST using a callback | ||||||
| postit2.c      - send a HTTP multipart formpost | postit2.c      - send a HTTP multipart formpost | ||||||
| @@ -62,3 +65,4 @@ sepheaders.c   - download headers to a separate file | |||||||
| simple.c       - the most simple download a URL source | simple.c       - the most simple download a URL source | ||||||
| simplepost.c   - HTTP POST | simplepost.c   - HTTP POST | ||||||
| simplessl.c    - HTTPS example with certificates many options set | simplessl.c    - HTTPS example with certificates many options set | ||||||
|  | synctime.c     - Sync local time by extracing date from remote HTTP servers | ||||||
|   | |||||||
							
								
								
									
										138
									
								
								docs/examples/cacertinmem.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								docs/examples/cacertinmem.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | |||||||
|  | /***************************************************************************** | ||||||
|  |  *                                  _   _ ____  _ | ||||||
|  |  *  Project                     ___| | | |  _ \| | | ||||||
|  |  *                             / __| | | | |_) | | | ||||||
|  |  *                            | (__| |_| |  _ <| |___ | ||||||
|  |  *                             \___|\___/|_| \_\_____| | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  |  * | ||||||
|  |  * Example using a "in core" PEM certificate to retrieve a https page. | ||||||
|  |  * Written by Theo Borm | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* on a netBSD system with OPENSSL& LIBCURL installed from | ||||||
|  |  * pkgsrc (using default paths) this program can be compiled using: | ||||||
|  |  * gcc -I/usr/pkg/include -L/usr/pkg/lib -lcurl -Wl,-R/usr/pkg/lib -lssl | ||||||
|  |  * -lcrypto -lz -o curlcacerttest curlcacerttest.c | ||||||
|  |  * on other operating systems you may want to change paths to headers | ||||||
|  |  * and libraries | ||||||
|  | */ | ||||||
|  | #include <openssl/ssl.h> | ||||||
|  | #include <curl/curl.h> | ||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
|  | size_t writefunction( void *ptr, size_t size, size_t nmemb, void *stream) | ||||||
|  | { | ||||||
|  |   fwrite(ptr,size,nmemb,stream); | ||||||
|  |   return(nmemb*size); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static CURLcode sslctx_function(CURL * curl, void * sslctx, void * parm) | ||||||
|  | { | ||||||
|  |   X509_STORE * store; | ||||||
|  |   X509 * cert=NULL; | ||||||
|  |   BIO * bio; | ||||||
|  |   char * mypem = /* www.cacert.org */ | ||||||
|  |     "-----BEGIN CERTIFICATE-----\n"\ | ||||||
|  |     "MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\n"\ | ||||||
|  |     "IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB\n"\ | ||||||
|  |     "IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA\n"\ | ||||||
|  |     "Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO\n"\ | ||||||
|  |     "BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi\n"\ | ||||||
|  |     "MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ\n"\ | ||||||
|  |     "ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\n"\ | ||||||
|  |     "CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ\n"\ | ||||||
|  |     "8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6\n"\ | ||||||
|  |     "zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y\n"\ | ||||||
|  |     "fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7\n"\ | ||||||
|  |     "w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc\n"\ | ||||||
|  |     "G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k\n"\ | ||||||
|  |     "epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q\n"\ | ||||||
|  |     "laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ\n"\ | ||||||
|  |     "QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU\n"\ | ||||||
|  |     "fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826\n"\ | ||||||
|  |     "YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w\n"\ | ||||||
|  |     "ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY\n"\ | ||||||
|  |     "gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe\n"\ | ||||||
|  |     "MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0\n"\ | ||||||
|  |     "IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy\n"\ | ||||||
|  |     "dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw\n"\ | ||||||
|  |     "czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0\n"\ | ||||||
|  |     "dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl\n"\ | ||||||
|  |     "aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC\n"\ | ||||||
|  |     "AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg\n"\ | ||||||
|  |     "b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB\n"\ | ||||||
|  |     "ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc\n"\ | ||||||
|  |     "nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg\n"\ | ||||||
|  |     "18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c\n"\ | ||||||
|  |     "gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl\n"\ | ||||||
|  |     "Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY\n"\ | ||||||
|  |     "sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T\n"\ | ||||||
|  |     "SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF\n"\ | ||||||
|  |     "CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum\n"\ | ||||||
|  |     "GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk\n"\ | ||||||
|  |     "zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW\n"\ | ||||||
|  |     "omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD\n"\ | ||||||
|  |     "-----END CERTIFICATE-----\n"; | ||||||
|  |   /* get a BIO */ | ||||||
|  |   bio=BIO_new_mem_buf(mypem, -1); | ||||||
|  |   /* use it to read the PEM formatted certificate from memory into an X509 | ||||||
|  |    * structure that SSL can use | ||||||
|  |    */ | ||||||
|  |   PEM_read_bio_X509(bio, &cert, 0, NULL); | ||||||
|  |   if (cert == NULL) | ||||||
|  |     printf("PEM_read_bio_X509 failed...\n"); | ||||||
|  |  | ||||||
|  |   /* get a pointer to the X509 certificate store (which may be empty!) */ | ||||||
|  |   store=SSL_CTX_get_cert_store((SSL_CTX *)sslctx); | ||||||
|  |  | ||||||
|  |   /* add our certificate to this store */ | ||||||
|  |   if (X509_STORE_add_cert(store, cert)==0) | ||||||
|  |     printf("error adding certificate\n"); | ||||||
|  |  | ||||||
|  |   /* all set to go */ | ||||||
|  |   return CURLE_OK ; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |   CURL * ch; | ||||||
|  |   CURLcode rv; | ||||||
|  |  | ||||||
|  |   rv=curl_global_init(CURL_GLOBAL_ALL); | ||||||
|  |   ch=curl_easy_init(); | ||||||
|  |   rv=curl_easy_setopt(ch,CURLOPT_VERBOSE, 0); | ||||||
|  |   rv=curl_easy_setopt(ch,CURLOPT_HEADER, 0); | ||||||
|  |   rv=curl_easy_setopt(ch,CURLOPT_NOPROGRESS, 1); | ||||||
|  |   rv=curl_easy_setopt(ch,CURLOPT_NOSIGNAL, 1); | ||||||
|  |   rv=curl_easy_setopt(ch,CURLOPT_WRITEFUNCTION, *writefunction); | ||||||
|  |   rv=curl_easy_setopt(ch,CURLOPT_WRITEDATA, stdout); | ||||||
|  |   rv=curl_easy_setopt(ch,CURLOPT_HEADERFUNCTION, *writefunction); | ||||||
|  |   rv=curl_easy_setopt(ch,CURLOPT_WRITEHEADER, stderr); | ||||||
|  |   rv=curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM"); | ||||||
|  |   rv=curl_easy_setopt(ch,CURLOPT_SSL_VERIFYPEER,1); | ||||||
|  |   rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.cacert.org/"); | ||||||
|  |  | ||||||
|  |   /* first try: retrieve page without cacerts' certificate -> will fail | ||||||
|  |    */ | ||||||
|  |   rv=curl_easy_perform(ch); | ||||||
|  |   if (rv==CURLE_OK) | ||||||
|  |     printf("*** transfer succeeded ***\n"); | ||||||
|  |   else | ||||||
|  |     printf("*** transfer failed ***\n"); | ||||||
|  |  | ||||||
|  |   /* second try: retrieve page using cacerts' certificate -> will succeed | ||||||
|  |    * load the certificate by installing a function doing the nescessary | ||||||
|  |    * "modifications" to the SSL CONTEXT just before link init | ||||||
|  |    */ | ||||||
|  |   rv=curl_easy_setopt(ch,CURLOPT_SSL_CTX_FUNCTION, *sslctx_function); | ||||||
|  |   rv=curl_easy_perform(ch); | ||||||
|  |   if (rv==CURLE_OK) | ||||||
|  |     printf("*** transfer succeeded ***\n"); | ||||||
|  |   else | ||||||
|  |     printf("*** transfer failed ***\n"); | ||||||
|  |  | ||||||
|  |   curl_easy_cleanup(ch); | ||||||
|  |   curl_global_cleanup(); | ||||||
|  | } | ||||||
							
								
								
									
										110
									
								
								docs/examples/cookie_interface.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								docs/examples/cookie_interface.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | |||||||
|  | /***************************************************************************** | ||||||
|  |  *                                  _   _ ____  _ | ||||||
|  |  *  Project                     ___| | | |  _ \| | | ||||||
|  |  *                             / __| | | | |_) | | | ||||||
|  |  *                            | (__| |_| |  _ <| |___ | ||||||
|  |  *                             \___|\___/|_| \_\_____| | ||||||
|  |  * | ||||||
|  |  *  This example shows usage of simple cookie interface.  | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <errno.h> | ||||||
|  | #include <time.h> | ||||||
|  |  | ||||||
|  | #include <curl/curl.h> | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | print_cookies(CURL *curl) | ||||||
|  | { | ||||||
|  |   CURLcode res; | ||||||
|  |   struct curl_slist *cookies; | ||||||
|  |   struct curl_slist *nc; | ||||||
|  |   int i; | ||||||
|  |  | ||||||
|  |   printf("Cookies, curl knows:\n"); | ||||||
|  |   res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies); | ||||||
|  |   if (res != CURLE_OK) { | ||||||
|  |     fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", curl_easy_strerror(res)); | ||||||
|  |     exit(1); | ||||||
|  |   } | ||||||
|  |   nc = cookies, i = 1; | ||||||
|  |   while (nc) { | ||||||
|  |     printf("[%d]: %s\n", i, nc->data); | ||||||
|  |     nc = nc->next; | ||||||
|  |     i++; | ||||||
|  |   } | ||||||
|  |   if (i == 1) { | ||||||
|  |     printf("(none)\n"); | ||||||
|  |   } | ||||||
|  |   curl_slist_free_all(cookies); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main(void) | ||||||
|  | { | ||||||
|  |   CURL *curl; | ||||||
|  |   CURLcode res; | ||||||
|  |  | ||||||
|  |   curl_global_init(CURL_GLOBAL_ALL); | ||||||
|  |   curl = curl_easy_init(); | ||||||
|  |   if (curl) { | ||||||
|  |     char nline[256]; | ||||||
|  |  | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com/"); /* google.com sets "PREF" cookie */ | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* just to start the cookie engine */ | ||||||
|  |     res = curl_easy_perform(curl); | ||||||
|  |     if (res != CURLE_OK) { | ||||||
|  |       fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res)); | ||||||
|  |       return 1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     print_cookies(curl); | ||||||
|  |  | ||||||
|  |     printf("Erasing curl's knowledge of cookies!\n"); | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL"); | ||||||
|  |  | ||||||
|  |     print_cookies(curl); | ||||||
|  |  | ||||||
|  |     printf("-----------------------------------------------\n" | ||||||
|  |            "Setting a cookie \"PREF\" via cookie interface:\n"); | ||||||
|  | #ifdef WIN32 | ||||||
|  | #define snprintf _snprintf | ||||||
|  | #endif | ||||||
|  |     /* Netscape format cookie */ | ||||||
|  |     snprintf(nline, 256, "%s\t%s\t%s\t%s\t%u\t%s\t%s", | ||||||
|  |       ".google.com", "TRUE", "/", "FALSE", time(NULL) + 31337, "PREF", "hello google, i like you very much!"); | ||||||
|  |     res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline); | ||||||
|  |     if (res != CURLE_OK) { | ||||||
|  |       fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res)); | ||||||
|  |       return 1;             | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* HTTP-header style cookie */ | ||||||
|  |     snprintf(nline, 256, | ||||||
|  |       "Set-Cookie: OLD_PREF=3d141414bf4209321; " | ||||||
|  |       "expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com"); | ||||||
|  |     res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline); | ||||||
|  |     if (res != CURLE_OK) { | ||||||
|  |       fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res)); | ||||||
|  |       return 1;             | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     print_cookies(curl); | ||||||
|  |  | ||||||
|  |     res = curl_easy_perform(curl); | ||||||
|  |     if (res != CURLE_OK) { | ||||||
|  |       fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res)); | ||||||
|  |       return 1; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   else { | ||||||
|  |     fprintf(stderr, "Curl init failed!\n"); | ||||||
|  |     return 1; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   curl_global_cleanup(); | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
| @@ -14,6 +14,8 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
| #include <curl/curl.h> | #include <curl/curl.h> | ||||||
| #include <curl/types.h> | #include <curl/types.h> | ||||||
| @@ -37,7 +39,7 @@ void *myrealloc(void *ptr, size_t size) | |||||||
| size_t | size_t | ||||||
| WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) | WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) | ||||||
| { | { | ||||||
|   register int realsize = size * nmemb; |   size_t realsize = size * nmemb; | ||||||
|   struct MemoryStruct *mem = (struct MemoryStruct *)data; |   struct MemoryStruct *mem = (struct MemoryStruct *)data; | ||||||
|  |  | ||||||
|   mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1); |   mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1); | ||||||
| @@ -93,5 +95,8 @@ int main(int argc, char **argv) | |||||||
|    * you're done with it, you should free() it as a nice application. |    * you're done with it, you should free() it as a nice application. | ||||||
|    */ |    */ | ||||||
|  |  | ||||||
|  |   if(chunk.memory) | ||||||
|  |     free(chunk.memory); | ||||||
|  |  | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										118
									
								
								docs/examples/htmltidy.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								docs/examples/htmltidy.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,118 @@ | |||||||
|  | /***************************************************************************** | ||||||
|  |  *                                  _   _ ____  _ | ||||||
|  |  *  Project                     ___| | | |  _ \| | | ||||||
|  |  *                             / __| | | | |_) | | | ||||||
|  |  *                            | (__| |_| |  _ <| |___ | ||||||
|  |  *                             \___|\___/|_| \_\_____| | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  |  * | ||||||
|  |  * Download a document and use libtidy to parse the HTML. | ||||||
|  |  * Written by Jeff Pohlmeyer | ||||||
|  |  * | ||||||
|  |  * LibTidy => http://tidy.sourceforge.net | ||||||
|  |  * | ||||||
|  |  * gcc -Wall -I/usr/local/include tidycurl.c -lcurl -ltidy -o tidycurl | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <tidy/tidy.h> | ||||||
|  | #include <tidy/buffio.h> | ||||||
|  | #include <curl/curl.h> | ||||||
|  |  | ||||||
|  | /* curl write callback, to fill tidy's input buffer...  */ | ||||||
|  | uint write_cb(char *in, uint size, uint nmemb, TidyBuffer *out) | ||||||
|  | { | ||||||
|  |   uint r; | ||||||
|  |   r = size * nmemb; | ||||||
|  |   tidyBufAppend( out, in, r ); | ||||||
|  |   return(r); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Traverse the document tree */ | ||||||
|  | void dumpNode(TidyDoc doc, TidyNode tnod, int indent ) | ||||||
|  | { | ||||||
|  |   TidyNode child; | ||||||
|  |   for ( child = tidyGetChild(tnod); child; child = tidyGetNext(child) ) | ||||||
|  |   { | ||||||
|  |     ctmbstr name = tidyNodeGetName( child ); | ||||||
|  |     if ( name ) | ||||||
|  |     { | ||||||
|  |       /* if it has a name, then it's an HTML tag ... */ | ||||||
|  |       TidyAttr attr; | ||||||
|  |       printf( "%*.*s%s ", indent, indent, "<", name); | ||||||
|  |       /* walk the attribute list */ | ||||||
|  |       for ( attr=tidyAttrFirst(child); attr; attr=tidyAttrNext(attr) ) { | ||||||
|  |         printf(tidyAttrName(attr)); | ||||||
|  |         tidyAttrValue(attr)?printf("=\"%s\" ", | ||||||
|  |                                    tidyAttrValue(attr)):printf(" "); | ||||||
|  |       } | ||||||
|  |       printf( ">\n"); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |       /* if it doesn't have a name, then it's probably text, cdata, etc... */ | ||||||
|  |       TidyBuffer buf; | ||||||
|  |       tidyBufInit(&buf); | ||||||
|  |       tidyNodeGetText(doc, child, &buf); | ||||||
|  |       printf("%*.*s\n", indent, indent, buf.bp?(char *)buf.bp:""); | ||||||
|  |       tidyBufFree(&buf); | ||||||
|  |     } | ||||||
|  |     dumpNode( doc, child, indent + 4 ); /* recursive */ | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int main(int argc, char **argv ) | ||||||
|  | { | ||||||
|  |   CURL *curl; | ||||||
|  |   char curl_errbuf[CURL_ERROR_SIZE]; | ||||||
|  |   TidyDoc tdoc; | ||||||
|  |   TidyBuffer docbuf = {0}; | ||||||
|  |   TidyBuffer tidy_errbuf = {0}; | ||||||
|  |   int err; | ||||||
|  |   if ( argc == 2) { | ||||||
|  |     curl = curl_easy_init(); | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_URL, argv[1]); | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf); | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_NOPROGRESS, no); | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_VERBOSE, yes); | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb); | ||||||
|  |  | ||||||
|  |     tdoc = tidyCreate(); | ||||||
|  |     tidyOptSetBool(tdoc, TidyForceOutput, yes); /* try harder */ | ||||||
|  |     tidyOptSetInt(tdoc, TidyWrapLen, 4096); | ||||||
|  |     tidySetErrorBuffer( tdoc, &tidy_errbuf ); | ||||||
|  |     tidyBufInit(&docbuf); | ||||||
|  |  | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &docbuf); | ||||||
|  |     err=curl_easy_perform(curl); | ||||||
|  |     if ( !err ) { | ||||||
|  |       err = tidyParseBuffer(tdoc, &docbuf); /* parse the input */ | ||||||
|  |       if ( err >= 0 ) { | ||||||
|  |         err = tidyCleanAndRepair(tdoc); /* fix any problems */ | ||||||
|  |         if ( err >= 0 ) { | ||||||
|  |           err = tidyRunDiagnostics(tdoc); /* load tidy error buffer */ | ||||||
|  |           if ( err >= 0 ) { | ||||||
|  |             dumpNode( tdoc, tidyGetRoot(tdoc), 0 ); /* walk the tree */ | ||||||
|  |             fprintf(stderr, "%s\n", tidy_errbuf.bp); /* show errors */ | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |       fprintf(stderr, "%s\n", curl_errbuf); | ||||||
|  |  | ||||||
|  |     /* clean-up */ | ||||||
|  |     curl_easy_cleanup(curl); | ||||||
|  |     tidyBufFree(&docbuf); | ||||||
|  |     tidyBufFree(&tidy_errbuf); | ||||||
|  |     tidyRelease(tdoc); | ||||||
|  |     return(err); | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |   else | ||||||
|  |     printf( "usage: %s <url>\n", argv[0] ); | ||||||
|  |  | ||||||
|  |   return(0); | ||||||
|  | } | ||||||
| @@ -131,7 +131,7 @@ static bool init(CURL *&conn, char *url) | |||||||
| //  libxml start element callback function | //  libxml start element callback function | ||||||
| // | // | ||||||
|  |  | ||||||
| static void startElement(void *voidContext, | static void StartElement(void *voidContext, | ||||||
|                          const xmlChar *name, |                          const xmlChar *name, | ||||||
|                          const xmlChar **attributes) |                          const xmlChar **attributes) | ||||||
| { | { | ||||||
| @@ -148,7 +148,7 @@ static void startElement(void *voidContext, | |||||||
| //  libxml end element callback function | //  libxml end element callback function | ||||||
| // | // | ||||||
|  |  | ||||||
| static void endElement(void *voidContext, | static void EndElement(void *voidContext, | ||||||
|                        const xmlChar *name) |                        const xmlChar *name) | ||||||
| { | { | ||||||
|   Context *context = (Context *)voidContext; |   Context *context = (Context *)voidContext; | ||||||
| @@ -173,7 +173,7 @@ static void handleCharacters(Context *context, | |||||||
| //  libxml PCDATA callback function | //  libxml PCDATA callback function | ||||||
| // | // | ||||||
|  |  | ||||||
| static void characters(void *voidContext, | static void Characters(void *voidContext, | ||||||
|                        const xmlChar *chars, |                        const xmlChar *chars, | ||||||
|                        int length) |                        int length) | ||||||
| { | { | ||||||
| @@ -215,10 +215,10 @@ static htmlSAXHandler saxHandler = | |||||||
|   NULL, |   NULL, | ||||||
|   NULL, |   NULL, | ||||||
|   NULL, |   NULL, | ||||||
|   startElement, |   StartElement, | ||||||
|   endElement, |   EndElement, | ||||||
|   NULL, |   NULL, | ||||||
|   characters, |   Characters, | ||||||
|   NULL, |   NULL, | ||||||
|   NULL, |   NULL, | ||||||
|   NULL, |   NULL, | ||||||
|   | |||||||
| @@ -20,7 +20,8 @@ PROGRAMS  = fopen.exe ftpget.exe ftpgetresp.exe ftpupload.exe \ | |||||||
|             multi-double.exe multi-post.exe multi-single.exe \ |             multi-double.exe multi-post.exe multi-single.exe \ | ||||||
|             persistant.exe post-callback.exe postit2.exe \ |             persistant.exe post-callback.exe postit2.exe \ | ||||||
|             sepheaders.exe simple.exe simplessl.exe https.exe \ |             sepheaders.exe simple.exe simplessl.exe https.exe \ | ||||||
|             ftp3rdparty.exe getinfo.exe anyauthput.exe |             ftp3rdparty.exe getinfo.exe anyauthput.exe \ | ||||||
|  |             cookie_interface.exe | ||||||
|  |  | ||||||
| all: $(PROGRAMS) | all: $(PROGRAMS) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										77
									
								
								docs/examples/opensslthreadlock.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								docs/examples/opensslthreadlock.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | |||||||
|  | /***************************************************************************** | ||||||
|  |  *                                  _   _ ____  _ | ||||||
|  |  *  Project                     ___| | | |  _ \| | | ||||||
|  |  *                             / __| | | | |_) | | | ||||||
|  |  *                            | (__| |_| |  _ <| |___ | ||||||
|  |  *                             \___|\___/|_| \_\_____| | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  |  * | ||||||
|  |  * Example source code to show one way to set the necessary OpenSSL locking | ||||||
|  |  * callbacks if you want to do multi-threaded transfers with HTTPS/FTPS with | ||||||
|  |  * libcurl built to use OpenSSL. | ||||||
|  |  * | ||||||
|  |  * This is not a complete stand-alone example. | ||||||
|  |  * | ||||||
|  |  * Author: Jeremy Brown | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define MUTEX_TYPE       pthread_mutex_t | ||||||
|  | #define MUTEX_SETUP(x)   pthread_mutex_init(&(x), NULL) | ||||||
|  | #define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x)) | ||||||
|  | #define MUTEX_LOCK(x)    pthread_mutex_lock(&(x)) | ||||||
|  | #define MUTEX_UNLOCK(x)  pthread_mutex_unlock(&(x)) | ||||||
|  | #define THREAD_ID        pthread_self(  ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void handle_error(const char *file, int lineno, const char *msg){ | ||||||
|  |      fprintf(stderr, ** %s:%i %s\n, file, lineno, msg); | ||||||
|  |      ERR_print_errors_fp(stderr); | ||||||
|  |      /* exit(-1); */ | ||||||
|  |  } | ||||||
|  |  | ||||||
|  | /* This array will store all of the mutexes available to OpenSSL. */ | ||||||
|  | static MUTEX_TYPE *mutex_buf= NULL; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void locking_function(int mode, int n, const char * file, int line) | ||||||
|  | { | ||||||
|  |   if (mode & CRYPTO_LOCK) | ||||||
|  |     MUTEX_LOCK(mutex_buf[n]); | ||||||
|  |   else | ||||||
|  |     MUTEX_UNLOCK(mutex_buf[n]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static unsigned long id_function(void) | ||||||
|  | { | ||||||
|  |   return ((unsigned long)THREAD_ID); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int thread_setup(void) | ||||||
|  | { | ||||||
|  |   int i; | ||||||
|  |  | ||||||
|  |   mutex_buf = (MUTEX_TYPE *)malloc(CRYPTO_num_locks(  ) * sizeof(MUTEX_TYPE)); | ||||||
|  |   if (!mutex_buf) | ||||||
|  |     return 0; | ||||||
|  |   for (i = 0;  i < CRYPTO_num_locks(  );  i++) | ||||||
|  |     MUTEX_SETUP(mutex_buf[i]); | ||||||
|  |   CRYPTO_set_id_callback(id_function); | ||||||
|  |   CRYPTO_set_locking_callback(locking_function); | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int thread_cleanup(void) | ||||||
|  | { | ||||||
|  |   int i; | ||||||
|  |  | ||||||
|  |   if (!mutex_buf) | ||||||
|  |     return 0; | ||||||
|  |   CRYPTO_set_id_callback(NULL); | ||||||
|  |   CRYPTO_set_locking_callback(NULL); | ||||||
|  |   for (i = 0;  i < CRYPTO_num_locks(  );  i++) | ||||||
|  |     MUTEX_CLEANUP(mutex_buf[i]); | ||||||
|  |   free(mutex_buf); | ||||||
|  |   mutex_buf = NULL; | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
| @@ -78,7 +78,7 @@ int main(void) | |||||||
|       curl_slist *chunk = NULL; |       curl_slist *chunk = NULL; | ||||||
|  |  | ||||||
|       chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked"); |       chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked"); | ||||||
|       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER); |       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); | ||||||
|       /* use curl_slist_free_all() after the *perform() call to free this |       /* use curl_slist_free_all() after the *perform() call to free this | ||||||
|          list again */ |          list again */ | ||||||
|     } |     } | ||||||
| @@ -101,7 +101,7 @@ int main(void) | |||||||
|       curl_slist *chunk = NULL; |       curl_slist *chunk = NULL; | ||||||
|  |  | ||||||
|       chunk = curl_slist_append(chunk, "Expect:"); |       chunk = curl_slist_append(chunk, "Expect:"); | ||||||
|       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER); |       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); | ||||||
|       /* use curl_slist_free_all() after the *perform() call to free this |       /* use curl_slist_free_all() after the *perform() call to free this | ||||||
|          list again */ |          list again */ | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										339
									
								
								docs/examples/synctime.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										339
									
								
								docs/examples/synctime.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,339 @@ | |||||||
|  | /***************************************************************************** | ||||||
|  |  *                                  _   _ ____  _ | ||||||
|  |  *  Project                     ___| | | |  _ \| | | ||||||
|  |  *                             / __| | | | |_) | | | ||||||
|  |  *                            | (__| |_| |  _ <| |___ | ||||||
|  |  *                             \___|\___/|_| \_\_____| | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  |  * | ||||||
|  |  * This example code only builds as-is on Windows. | ||||||
|  |  * | ||||||
|  |  * Synchronising your computer clock via Internet time server usually relies | ||||||
|  |  * on DAYTIME, TIME, or NTP protocols. These protocols provide good accurate | ||||||
|  |  * time synchronisation but it does not work very well through a | ||||||
|  |  * firewall/proxy. Some adjustment has to be made to the firewall/proxy for | ||||||
|  |  * these protocols to work properly. | ||||||
|  |  * | ||||||
|  |  * There is an indirect method. Since most webserver provide server time in | ||||||
|  |  * their HTTP header, therefore you could synchronise your computer clock | ||||||
|  |  * using HTTP protocol which has no problem with firewall/proxy. | ||||||
|  |  * | ||||||
|  |  * For this software to work, you should take note of these items. | ||||||
|  |  * 1. Your firewall/proxy must allow your computer to surf internet. | ||||||
|  |  * 2. Webserver system time must in sync with the NTP time server, | ||||||
|  |  *    or at least provide an accurate time keeping. | ||||||
|  |  * 3. Webserver HTTP header does not provide the milliseconds units, | ||||||
|  |  *    so there is no way to get very accurate time. | ||||||
|  |  * 4. This software could only provide an accuracy of +- a few seconds, | ||||||
|  |  *    as Round-Trip delay time is not taken into consideration. | ||||||
|  |  *    Compensation of network, firewall/proxy delay cannot be simply divide | ||||||
|  |  *    the Round-Trip delay time by half. | ||||||
|  |  * 5. Win32 SetSystemTime() API will set your computer clock according to | ||||||
|  |  *    GMT/UTC time. Therefore your computer timezone must be properly set. | ||||||
|  |  * 6. Webserver data should not be cached by the proxy server. Some | ||||||
|  |  *    webserver provide Cache-Control to prevent caching. | ||||||
|  |  * | ||||||
|  |  * References: | ||||||
|  |  * http://tf.nist.gov/timefreq/service/its.htm | ||||||
|  |  * http://tf.nist.gov/timefreq/service/firewall.htm | ||||||
|  |  * | ||||||
|  |  * Usage: | ||||||
|  |  * This software will synchronise your computer clock only when you issue | ||||||
|  |  * it with --synctime. By default, it only display the webserver's clock. | ||||||
|  |  * | ||||||
|  |  * Written by: Frank (contributed to libcurl) | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, | ||||||
|  |  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY | ||||||
|  |  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. | ||||||
|  |  * | ||||||
|  |  * IN NO EVENT SHALL THE AUTHOR OF THIS SOFTWARE BE LIABLE FOR | ||||||
|  |  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, | ||||||
|  |  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||||||
|  |  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF | ||||||
|  |  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | ||||||
|  |  * OF THIS SOFTWARE. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <time.h> | ||||||
|  | #include <windows.h> | ||||||
|  | #include <curl/curl.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define MAX_STRING              256 | ||||||
|  | #define MAX_STRING1             MAX_STRING+1 | ||||||
|  |  | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |   char http_proxy[MAX_STRING1]; | ||||||
|  |   char proxy_user[MAX_STRING1]; | ||||||
|  |   char timeserver[MAX_STRING1]; | ||||||
|  | } conf_t; | ||||||
|  |  | ||||||
|  | char DefaultTimeServer[4][MAX_STRING1] = | ||||||
|  | { | ||||||
|  |   "http://nist.time.gov/timezone.cgi?UTC/s/0", | ||||||
|  |   "http://www.google.com/", | ||||||
|  |   "http://www.worldtimeserver.com/current_time_in_UTC.aspx", | ||||||
|  |   "http://www.worldtime.com/cgi-bin/wt.cgi" | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | char *DayStr[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; | ||||||
|  | char *MthStr[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", | ||||||
|  |                   "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; | ||||||
|  |  | ||||||
|  | int  ShowAllHeader; | ||||||
|  | int  AutoSyncTime; | ||||||
|  | SYSTEMTIME SYSTime; | ||||||
|  | SYSTEMTIME LOCALTime; | ||||||
|  |  | ||||||
|  | #define HTTP_COMMAND_HEAD       0 | ||||||
|  | #define HTTP_COMMAND_GET        1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | size_t SyncTime_CURL_WriteOutput(void *ptr, size_t size, size_t nmemb, | ||||||
|  |                                  void *stream) | ||||||
|  | { | ||||||
|  |   fwrite(ptr, size, nmemb, stream); | ||||||
|  |   return(nmemb*size); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | size_t SyncTime_CURL_WriteHeader(void *ptr, size_t size, size_t nmemb, | ||||||
|  |                                  void *stream) | ||||||
|  | { | ||||||
|  |   int   i, RetVal; | ||||||
|  |   char  TmpStr1[26], TmpStr2[26]; | ||||||
|  |  | ||||||
|  |   if (ShowAllHeader == 1) | ||||||
|  |     fprintf(stderr, "%s", (char *)(ptr)); | ||||||
|  |  | ||||||
|  |   if (strncmp((char *)(ptr), "Date:", 5) == 0) { | ||||||
|  |     if (ShowAllHeader == 0) | ||||||
|  |       fprintf(stderr, "HTTP Server. %s", (char *)(ptr)); | ||||||
|  |  | ||||||
|  |     if (AutoSyncTime == 1) { | ||||||
|  |       *TmpStr1 = 0; | ||||||
|  |       *TmpStr2 = 0; | ||||||
|  |       if (strlen((char *)(ptr)) > 50) /* Can prevent buffer overflow to | ||||||
|  |                                          TmpStr1 & 2? */ | ||||||
|  |         AutoSyncTime = 0; | ||||||
|  |       else { | ||||||
|  |         RetVal = sscanf ((char *)(ptr), "Date: %s %d %s %d %d:%d:%d", | ||||||
|  |                          TmpStr1, &SYSTime.wDay, TmpStr2, &SYSTime.wYear, | ||||||
|  |                          &SYSTime.wHour, &SYSTime.wMinute, &SYSTime.wSecond); | ||||||
|  |  | ||||||
|  |         if (RetVal == 7) { | ||||||
|  |  | ||||||
|  |           SYSTime.wMilliseconds = 500;    /* adjust to midpoint, 0.5 sec */ | ||||||
|  |           for (i=0; i<12; i++) { | ||||||
|  |             if (strcmp(MthStr[i], TmpStr2) == 0) { | ||||||
|  |               SYSTime.wMonth = i+1; | ||||||
|  |               break; | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |           AutoSyncTime = 3;       /* Computer clock will be adjusted */ | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |           AutoSyncTime = 0;       /* Error in sscanf() fields conversion */ | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if (strncmp((char *)(ptr), "X-Cache: HIT", 12) == 0) { | ||||||
|  |     fprintf(stderr, "ERROR: HTTP Server data is cached." | ||||||
|  |             " Server Date is no longer valid.\n"); | ||||||
|  |     AutoSyncTime = 0; | ||||||
|  |   } | ||||||
|  |   return(nmemb*size); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void SyncTime_CURL_Init(CURL *curl, char *proxy_port, | ||||||
|  |                         char *proxy_user_password) | ||||||
|  | { | ||||||
|  |   if (strlen(proxy_port) > 0) | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_PROXY, proxy_port); | ||||||
|  |  | ||||||
|  |   if (strlen(proxy_user_password) > 0) | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, proxy_user_password); | ||||||
|  |  | ||||||
|  |   /* Trick Webserver by claiming that you are using Microsoft WinXP SP2, IE6 */ | ||||||
|  |   curl_easy_setopt(curl, CURLOPT_USERAGENT, | ||||||
|  |                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); | ||||||
|  |   curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, *SyncTime_CURL_WriteOutput); | ||||||
|  |   curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, *SyncTime_CURL_WriteHeader); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int SyncTime_CURL_Fetch(CURL *curl, char *URL_Str, char *OutFileName, | ||||||
|  |                         int HttpGetBody) | ||||||
|  | { | ||||||
|  |   FILE *outfile; | ||||||
|  |   CURLcode res; | ||||||
|  |  | ||||||
|  |   outfile = NULL; | ||||||
|  |   if (HttpGetBody == HTTP_COMMAND_HEAD) | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_NOBODY, 1); | ||||||
|  |   else { | ||||||
|  |     outfile = fopen(OutFileName, "wb"); | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   curl_easy_setopt(curl, CURLOPT_URL, URL_Str); | ||||||
|  |   res = curl_easy_perform(curl); | ||||||
|  |   if (outfile != NULL) | ||||||
|  |     fclose(outfile); | ||||||
|  |   return res;  /* (CURLE_OK) */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void showUsage(void) | ||||||
|  | { | ||||||
|  |   fprintf(stderr, "SYNCTIME: Synchronising computer clock with time server" | ||||||
|  |           " using HTTP protocol.\n"); | ||||||
|  |   fprintf(stderr, "Usage   : SYNCTIME [Option]\n"); | ||||||
|  |   fprintf(stderr, "Options :\n"); | ||||||
|  |   fprintf(stderr, " --server=WEBSERVER        Use this time server instead" | ||||||
|  |           " of default.\n"); | ||||||
|  |   fprintf(stderr, " --showall                 Show all HTTP header.\n"); | ||||||
|  |   fprintf(stderr, " --synctime                Synchronising computer clock" | ||||||
|  |           " with time server.\n"); | ||||||
|  |   fprintf(stderr, " --proxy-user=USER[:PASS]  Set proxy username and" | ||||||
|  |           " password.\n"); | ||||||
|  |   fprintf(stderr, " --proxy=HOST[:PORT]       Use HTTP proxy on given" | ||||||
|  |           " port.\n"); | ||||||
|  |   fprintf(stderr, " --help                    Print this help.\n"); | ||||||
|  |   fprintf(stderr, "\n"); | ||||||
|  |   return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int conf_init(conf_t *conf) | ||||||
|  | { | ||||||
|  |   int i; | ||||||
|  |  | ||||||
|  |   *conf->http_proxy       = 0; | ||||||
|  |   for (i=0; i<MAX_STRING1; i++) | ||||||
|  |     conf->proxy_user[i]     = 0;    /* Clean up password from memory */ | ||||||
|  |   *conf->timeserver       = 0; | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(int argc, char *argv[]) | ||||||
|  | { | ||||||
|  |   CURL    *curl; | ||||||
|  |   conf_t  conf[1]; | ||||||
|  |   int     OptionIndex; | ||||||
|  |   struct  tm *lt; | ||||||
|  |   struct  tm *gmt; | ||||||
|  |   time_t  tt; | ||||||
|  |   time_t  tt_local; | ||||||
|  |   time_t  tt_gmt; | ||||||
|  |   double  tzonediffFloat; | ||||||
|  |   int     tzonediffWord; | ||||||
|  |   char    timeBuf[61]; | ||||||
|  |   char    tzoneBuf[16]; | ||||||
|  |   int     RetValue; | ||||||
|  |  | ||||||
|  |   OptionIndex     = 0; | ||||||
|  |   ShowAllHeader   = 0;    /* Do not show HTTP Header */ | ||||||
|  |   AutoSyncTime    = 0;    /* Do not synchronise computer clock */ | ||||||
|  |   RetValue        = 0;    /* Successful Exit */ | ||||||
|  |   conf_init(conf); | ||||||
|  |  | ||||||
|  |   if (argc > 1) { | ||||||
|  |     while (OptionIndex < argc) { | ||||||
|  |       if (strncmp(argv[OptionIndex], "--server=", 9) == 0) | ||||||
|  |         snprintf(conf->timeserver, MAX_STRING, "%s", &argv[OptionIndex][9]); | ||||||
|  |  | ||||||
|  |       if (strcmp(argv[OptionIndex], "--showall") == 0) | ||||||
|  |         ShowAllHeader = 1; | ||||||
|  |  | ||||||
|  |       if (strcmp(argv[OptionIndex], "--synctime") == 0) | ||||||
|  |         AutoSyncTime = 1; | ||||||
|  |  | ||||||
|  |       if (strncmp(argv[OptionIndex], "--proxy-user=", 13) == 0) | ||||||
|  |         snprintf(conf->proxy_user, MAX_STRING, "%s", &argv[OptionIndex][13]); | ||||||
|  |  | ||||||
|  |       if (strncmp(argv[OptionIndex], "--proxy=", 8) == 0) | ||||||
|  |         snprintf(conf->http_proxy, MAX_STRING, "%s", &argv[OptionIndex][8]); | ||||||
|  |  | ||||||
|  |       if ((strcmp(argv[OptionIndex], "--help") == 0) || | ||||||
|  |           (strcmp(argv[OptionIndex], "/?") == 0)) { | ||||||
|  |         showUsage(); | ||||||
|  |         return 0; | ||||||
|  |       } | ||||||
|  |       OptionIndex++; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if (*conf->timeserver == 0)     /* Use default server for time information */ | ||||||
|  |     snprintf(conf->timeserver, MAX_STRING, "%s", DefaultTimeServer[0]); | ||||||
|  |  | ||||||
|  |   /* Init CURL before usage */ | ||||||
|  |   curl_global_init(CURL_GLOBAL_ALL); | ||||||
|  |   curl = curl_easy_init(); | ||||||
|  |   if (curl) { | ||||||
|  |     SyncTime_CURL_Init(curl, conf->http_proxy, conf->proxy_user); | ||||||
|  |  | ||||||
|  |     /* Calculating time diff between GMT and localtime */ | ||||||
|  |     tt       = time(0); | ||||||
|  |     lt       = localtime(&tt); | ||||||
|  |     tt_local = mktime(lt); | ||||||
|  |     gmt      = gmtime(&tt); | ||||||
|  |     tt_gmt   = mktime(gmt); | ||||||
|  |     tzonediffFloat = difftime(tt_local, tt_gmt); | ||||||
|  |     tzonediffWord  = (int)(tzonediffFloat/3600.0); | ||||||
|  |  | ||||||
|  |     if ((double)(tzonediffWord * 3600) == tzonediffFloat) | ||||||
|  |       snprintf(tzoneBuf, 15, "%+03d'00'", tzonediffWord); | ||||||
|  |     else | ||||||
|  |       snprintf(tzoneBuf, 15, "%+03d'30'", tzonediffWord); | ||||||
|  |  | ||||||
|  |     /* Get current system time and local time */ | ||||||
|  |     GetSystemTime(&SYSTime); | ||||||
|  |     GetLocalTime(&LOCALTime); | ||||||
|  |     snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ", | ||||||
|  |              DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay, | ||||||
|  |              MthStr[LOCALTime.wMonth-1], LOCALTime.wYear, | ||||||
|  |              LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond, | ||||||
|  |              LOCALTime.wMilliseconds); | ||||||
|  |     fprintf(stderr, "\nBefore HTTP. Date: %s%s\n\n", timeBuf, tzoneBuf); | ||||||
|  |  | ||||||
|  |     /* HTTP HEAD command to the Webserver */ | ||||||
|  |     fprintf(stderr, "Fetch: %s\n", conf->timeserver); | ||||||
|  |     SyncTime_CURL_Fetch(curl, conf->timeserver, "index.htm", | ||||||
|  |                         HTTP_COMMAND_HEAD); | ||||||
|  |  | ||||||
|  |     GetLocalTime(&LOCALTime); | ||||||
|  |     snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ", | ||||||
|  |              DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay, | ||||||
|  |              MthStr[LOCALTime.wMonth-1], LOCALTime.wYear, | ||||||
|  |              LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond, | ||||||
|  |              LOCALTime.wMilliseconds); | ||||||
|  |     fprintf(stderr, "\nAfter  HTTP. Date: %s%s\n", timeBuf, tzoneBuf); | ||||||
|  |  | ||||||
|  |     if (AutoSyncTime == 3) { | ||||||
|  |       /* Synchronising computer clock */ | ||||||
|  |       if (!SetSystemTime(&SYSTime)) {  /* Set system time */ | ||||||
|  |         fprintf(stderr, "ERROR: Unable to set system time.\n"); | ||||||
|  |         RetValue = 1; | ||||||
|  |       } | ||||||
|  |       else { | ||||||
|  |         /* Successfully re-adjusted computer clock */ | ||||||
|  |         GetLocalTime(&LOCALTime); | ||||||
|  |         snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ", | ||||||
|  |                  DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay, | ||||||
|  |                  MthStr[LOCALTime.wMonth-1], LOCALTime.wYear, | ||||||
|  |                  LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond, | ||||||
|  |                  LOCALTime.wMilliseconds); | ||||||
|  |         fprintf(stderr, "\nNew System's Date: %s%s\n", timeBuf, tzoneBuf); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* Cleanup before exit */ | ||||||
|  |     conf_init(conf); | ||||||
|  |     curl_easy_cleanup(curl); | ||||||
|  |   } | ||||||
|  |   return RetValue; | ||||||
|  | } | ||||||
| @@ -2,7 +2,7 @@ | |||||||
| .\" nroff -man [file] | .\" nroff -man [file] | ||||||
| .\" $Id$ | .\" $Id$ | ||||||
| .\" | .\" | ||||||
| .TH curl_easy_getinfo 3 "22 Dec 2004" "libcurl 7.12.3" "libcurl Manual" | .TH curl_easy_getinfo 3 "6 Oct 2005" "libcurl 7.12.3" "libcurl Manual" | ||||||
| .SH NAME | .SH NAME | ||||||
| curl_easy_getinfo - extract information from a curl handle | curl_easy_getinfo - extract information from a curl handle | ||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| @@ -15,9 +15,9 @@ Request internal information from the curl session with this function.  The | |||||||
| third argument \fBMUST\fP be a pointer to a long, a pointer to a char *, a | third argument \fBMUST\fP be a pointer to a long, a pointer to a char *, a | ||||||
| pointer to a struct curl_slist * or a pointer to a double (as this | pointer to a struct curl_slist * or a pointer to a double (as this | ||||||
| documentation describes further down).  The data pointed-to will be filled in | documentation describes further down).  The data pointed-to will be filled in | ||||||
| accordingly and can be relied upon only if the function returns CURLE_OK. | accordingly and can be relied upon only if the function returns CURLE_OK.  Use | ||||||
| This function is intended to get used AFTER a performed transfer, all results | this function AFTER a performed transfer if you want to get transfer- oriented | ||||||
| from this function are undefined until the transfer is completed. | data. | ||||||
|  |  | ||||||
| You should not free the memory returned by this function unless it is | You should not free the memory returned by this function unless it is | ||||||
| explictly mentioned below. | explictly mentioned below. | ||||||
| @@ -35,12 +35,14 @@ this. | |||||||
| Pass a pointer to a long to receive the last received proxy response code to a | Pass a pointer to a long to receive the last received proxy response code to a | ||||||
| CONNECT request. | CONNECT request. | ||||||
| .IP CURLINFO_FILETIME | .IP CURLINFO_FILETIME | ||||||
| Pass a pointer to a long to receive the remote time of the retrieved | Pass a pointer to a long to receive the remote time of the retrieved document | ||||||
| document. If you get -1, it can be because of many reasons (unknown, the | (in number of seconds since 1 jan 1970 in the GMT/UTC time zone). If you get | ||||||
| server hides it or the server doesn't support the command that tells document | -1, it can be because of many reasons (unknown, the server hides it or the | ||||||
| time etc) and the time of the document is unknown. Note that you must tell the | server doesn't support the command that tells document time etc) and the time | ||||||
| server to collect this information before the transfer is made, by using the | of the document is unknown. Note that you must tell the server to collect this | ||||||
| CURLOPT_FILETIME option to \fIcurl_easy_setopt(3)\fP. (Added in 7.5) | information before the transfer is made, by using the CURLOPT_FILETIME option | ||||||
|  | to \fIcurl_easy_setopt(3)\fP or you will unconditionally get a -1 back. (Added | ||||||
|  | in 7.5) | ||||||
| .IP CURLINFO_TOTAL_TIME | .IP CURLINFO_TOTAL_TIME | ||||||
| Pass a pointer to a double to receive the total transaction time in seconds | Pass a pointer to a double to receive the total transaction time in seconds | ||||||
| for the previous transfer. This time does not include the connect time, so if | for the previous transfer. This time does not include the connect time, so if | ||||||
| @@ -132,6 +134,54 @@ counted).  Combined with \fICURLINFO_REDIRECT_COUNT\fP you are able to know | |||||||
| how many times libcurl successfully reused existing connection(s) or not.  See | how many times libcurl successfully reused existing connection(s) or not.  See | ||||||
| the Connection Options of \fIcurl_easy_setopt(3)\fP to see how libcurl tries | the Connection Options of \fIcurl_easy_setopt(3)\fP to see how libcurl tries | ||||||
| to make persistent connections to save time.  (Added in 7.12.3) | to make persistent connections to save time.  (Added in 7.12.3) | ||||||
|  | .IP CURLINFO_COOKIELIST | ||||||
|  | Pass a pointer to a 'struct curl_slist *' to receive a linked-list of all | ||||||
|  | cookies cURL knows (expired ones, too). Don't forget to | ||||||
|  | \fIcurl_slist_free_all(3)\fP the list after it has been used.  If there are no | ||||||
|  | cookies (cookies for the handle have not been enabled or simply none have been | ||||||
|  | received) 'struct curl_slist *' will be set to point to NULL. (Added in | ||||||
|  | 7.14.1) | ||||||
|  | .IP CURLINFO_LASTSOCKET | ||||||
|  | Pass a pointer to a long to receive the last socket used by this curl | ||||||
|  | session. If the socket is no longer valid, -1 is returned. When you finish | ||||||
|  | working with the socket, you must call curl_easy_cleanup() as usual and let | ||||||
|  | libcurl close the socket and cleanup other resources associated with the | ||||||
|  | handle. This is typically used in combination with \fICURLOPT_CONNECT_ONLY\fP. | ||||||
|  | (Added in 7.15.2) | ||||||
|  | .SH TIMES | ||||||
|  | .NF | ||||||
|  | An overview of the six time values available from curl_easy_getinfo() | ||||||
|  |  | ||||||
|  | curl_easy_perform() | ||||||
|  |     | | ||||||
|  |     |--NT | ||||||
|  |     |--|--CT | ||||||
|  |     |--|--|--PT | ||||||
|  |     |--|--|--|--ST | ||||||
|  |           |--|--|--TT | ||||||
|  |     |--|--|--|--|--RT | ||||||
|  | .FI | ||||||
|  | .IP NT | ||||||
|  | \fICURLINFO_NAMELOOKUP_TIME\fP. The time it took from the start until the name | ||||||
|  | resolving was completed. | ||||||
|  | .IP CT | ||||||
|  | \fICURLINFO_CONNECT_TIME\fP. The time it took from the start until the connect | ||||||
|  | to the remote host (or proxy) was completed. | ||||||
|  | .IP PT | ||||||
|  | \fICURLINFO_PRETRANSFER_TIME\fP. The time it took from the start until the | ||||||
|  | file transfer is just about to begin. This includes all pre-transfer commands | ||||||
|  | and negotiations that are specific to the particular protocol(s) involved. | ||||||
|  | .IP ST | ||||||
|  | \fICURLINFO_STARTTRANSFER_TIME\fP. The time it took from the start until the | ||||||
|  | first byte is just about to be transferred. | ||||||
|  | .IP TT | ||||||
|  | \fICURLINFO_TOTAL_TIME\fP. Time of the previous transfer. This time does not | ||||||
|  | include the connect time (CT), so if you want the complete operation time, you | ||||||
|  | should add that. | ||||||
|  | .IP RT | ||||||
|  | \fICURLINFO_REDIRECT_TIME\fP. The time it took for all redirection steps | ||||||
|  | include name lookup, connect, pretransfer and transfer before final | ||||||
|  | transaction was started. So, this is zero if no redirection took place. | ||||||
| .SH RETURN VALUE | .SH RETURN VALUE | ||||||
| If the operation was successful, CURLE_OK is returned. Otherwise an | If the operation was successful, CURLE_OK is returned. Otherwise an | ||||||
| appropriate error code will be returned. | appropriate error code will be returned. | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user