Compare commits
	
		
			438 Commits
		
	
	
		
			curl-7_14_
			...
			curl-7_15_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 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 | 
| @@ -12,3 +12,4 @@ depcomp | |||||||
| config.guess | config.guess | ||||||
| config.sub | config.sub | ||||||
| ltmain.sh | ltmain.sh | ||||||
|  | libcurl.pc | ||||||
|   | |||||||
							
								
								
									
										547
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										547
									
								
								CHANGES
									
									
									
									
									
								
							| @@ -7,6 +7,548 @@ | |||||||
|                                   Changelog |                                   Changelog | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Version 7.15.1 (7 December 2005) | ||||||
|  |  | ||||||
|  | Daniel (6 December 2005) | ||||||
|  | - Full text here: http://curl.haxx.se/docs/adv_20051207.html Pointed out by | ||||||
|  |   Stefan Esser. | ||||||
|  |  | ||||||
|  |   VULNERABILITY | ||||||
|  |  | ||||||
|  |   libcurl's URL parser function can overflow a malloced buffer in two ways, if | ||||||
|  |   given a too long URL. | ||||||
|  |  | ||||||
|  |   These overflows happen if you | ||||||
|  |   | ||||||
|  |   1 - pass in a URL with no protocol (like "http://") prefix, using no slash | ||||||
|  |       and the string is 256 bytes or longer. This leads to a single zero byte | ||||||
|  |       overflow of the malloced buffer. | ||||||
|  |  | ||||||
|  |   2 - pass in a URL with only a question mark as separator (no slash) between | ||||||
|  |       the host and the query part of the URL. This leads to a single zero byte | ||||||
|  |       overflow of the malloced buffer. | ||||||
|  |  | ||||||
|  |   Both overflows can be made with the same input string, leading to two single | ||||||
|  |   zero byte overwrites. | ||||||
|  |  | ||||||
|  |   The affected flaw cannot be triggered by a redirect, but the long URL must | ||||||
|  |   be passed in "directly" to libcurl. It makes this a "local" problem. Of | ||||||
|  |   course, lots of programs may still pass in user-provided URLs to libcurl | ||||||
|  |   without doing much syntax checking of their own, allowing a user to exploit | ||||||
|  |   this vulnerability. | ||||||
|  |  | ||||||
|  |   There is no known exploit at the time of this writing. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Daniel (2 December 2005) | ||||||
|  | - Jamie Newton pointed out that libcurl's file:// code would close() a zero | ||||||
|  |   file descriptor if given a non-existing file. | ||||||
|  |  | ||||||
|  | Daniel (24 November 2005) | ||||||
|  | - Doug Kaufman provided a set of patches to make curl build fine on DJGPP | ||||||
|  |   again using configure. | ||||||
|  |  | ||||||
|  | - Yang Tse provided a whole series of patches to clear up compiler warnings on | ||||||
|  |   MSVC 6. | ||||||
|  |  | ||||||
|  | Daniel (17 November 2005) | ||||||
|  | - I extended a patch from David Shaw to make libcurl _always_ provide an error | ||||||
|  |   string in the given error buffer to address the flaw mention on 21 sep 2005. | ||||||
|  |  | ||||||
|  | Daniel (16 November 2005) | ||||||
|  | - Applied Albert Chin's patch that makes the libcurl.pc pkgconfig file get | ||||||
|  |   installed on 'make install' time. | ||||||
|  |  | ||||||
|  | Daniel (14 November 2005) | ||||||
|  | - Quagmire reported that he needed to raise a NTLM buffer for SSPI to work | ||||||
|  |   properly for a case, and so we did. We raised it even for non-SSPI builds | ||||||
|  |   but it should not do any harm. http://curl.haxx.se/bug/view.cgi?id=1356715 | ||||||
|  |  | ||||||
|  | - Jan Kunder's debian bug report | ||||||
|  |   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=338680 identified a weird | ||||||
|  |   error message for when you try to upload a file and the requested directory | ||||||
|  |   doesn't exist on the target server. | ||||||
|  |  | ||||||
|  | - Yang Tse fixed compiler warnings in lib/ssluse.c with OpenSSL 0.9.8 and in | ||||||
|  |   lib/memdebug.h that showed up in his msvc builds. | ||||||
|  |  | ||||||
|  | Daniel (13 November 2005) | ||||||
|  | - Debian bug report 338681 by Jan Kunder: make curl better detect and report | ||||||
|  |   bad limit-rate units: | ||||||
|  |   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=338681 Now curl will return | ||||||
|  |   error if a bad unit is used. | ||||||
|  |  | ||||||
|  | - Thanks to this nice summary of poll() implementations: | ||||||
|  |   http://www.greenend.org.uk/rjk/2001/06/poll.html and further tests by Eugene | ||||||
|  |   Kotlyarov, we now know that cygwin's poll returns only POLLHUP on remote | ||||||
|  |   connectin closure so we check for that case (too) and re-enable poll for | ||||||
|  |   cygwin builds. | ||||||
|  |  | ||||||
|  | Daniel (12 November 2005) | ||||||
|  | - Eugene Kotlyarov found out that cygwin's poll() function isn't doing things | ||||||
|  |   right: http://curl.haxx.se/mail/archive-2005-11/0045.html so we now disable | ||||||
|  |   poll() and use select() on cygwin too (we already do the same choice on Mac | ||||||
|  |   OS X) | ||||||
|  |  | ||||||
|  | - Dima Barsky patched problem #1348930: the GnuTLS code completely ignored | ||||||
|  |   client certificates! (http://curl.haxx.se/bug/view.cgi?id=1348930). | ||||||
|  |  | ||||||
|  | Daniel (10 November 2005) | ||||||
|  | - David Lang fixed IPv6 support for TFTP! | ||||||
|  |  | ||||||
|  | - Introducing range stepping to the curl globbing support. Now you can specify | ||||||
|  |   step counter by adding :[num] within the brackets when specifying a range: | ||||||
|  |  | ||||||
|  |    [1-100:10] | ||||||
|  |    [a-z:2] | ||||||
|  |  | ||||||
|  |   If no step counter is set, it defaults to 1 as before: | ||||||
|  |  | ||||||
|  |    [1-100] | ||||||
|  |    [d-h] | ||||||
|  |  | ||||||
|  | Daniel (8 November 2005) | ||||||
|  | - Removed the use of AI_CANONNAME in the IPv6-enabled resolver functions since | ||||||
|  |   we really have no use for reverse lookups of the address. | ||||||
|  |  | ||||||
|  |   I truly hope these are the last reverse lookups we had lingering in the | ||||||
|  |   code! | ||||||
|  |  | ||||||
|  | - Dmitry Bartsevich discovered some issues in compatibilty of SSPI-enabled | ||||||
|  |   version of libcurl with different Windows versions. Current version of | ||||||
|  |   libcurl imports SSPI functions from secur32.dll. However, under Windows NT | ||||||
|  |   4.0 these functions are located in security.dll, under Windows 9x - in | ||||||
|  |   secur32.dll and Windows 2000 and XP contains both these DLLs (security.dll | ||||||
|  |   just forwards calls to secur32.dll). | ||||||
|  |  | ||||||
|  |   Dmitry's patch loads proper library dynamically depending on Windows | ||||||
|  |   version. Function InitSecurityInterface() is used to obtain pointers to all | ||||||
|  |   of SSPI function in one structure. | ||||||
|  |  | ||||||
|  | Daniel (31 October 2005) | ||||||
|  | - Vilmos Nebehaj improved libcurl's LDAP abilities: | ||||||
|  |  | ||||||
|  |   The LDAP code in libcurl can't handle LDAP servers of LDAPv3 nor binary | ||||||
|  |   attributes in LDAP objects. So, I made a quick patch to address these | ||||||
|  |   problems. | ||||||
|  |  | ||||||
|  |   The solution is simple: if we connect to an LDAP server, first try LDAPv3 | ||||||
|  |   (which is the preferred protocol as of now) and then fall back to LDAPv2. | ||||||
|  |   In case of binary attributes, we first convert them to base64, just like the | ||||||
|  |   openldap client does. It uses ldap_get_values_len() instead of | ||||||
|  |   ldap_get_values() to be able to retrieve binary attributes correctly. I | ||||||
|  |   defined the necessary LDAP macros in lib/ldap.c to be able to compile | ||||||
|  |   libcurl without the presence of libldap | ||||||
|  |  | ||||||
|  | Daniel (27 October 2005) | ||||||
|  | - Nis Jorgensen filed bug report #1338648 | ||||||
|  |   (http://curl.haxx.se/bug/view.cgi?id=1338648) which really is more of a | ||||||
|  |   feature request, but anyway. It pointed out that --max-redirs did not allow | ||||||
|  |   it to be set to 0, which then would return an error code on the first | ||||||
|  |   Location: found. Based on Nis' patch, now libcurl supports CURLOPT_MAXREDIRS | ||||||
|  |   set to 0, or -1 for infinity. Added test case 274 to verify. | ||||||
|  |  | ||||||
|  | - tommink[at]post.pl reported in bug report #1337723 | ||||||
|  |   (http://curl.haxx.se/bug/view.cgi?id=1337723) that curl could not upload | ||||||
|  |   binary data from stdin on Windows if the data contained control-Z (hex 1a) | ||||||
|  |   since that is treated as end-of-file when read in text mode. Gisle Vanem | ||||||
|  |   pointed out the fix, and I made both -T and --data-binary take advantage of | ||||||
|  |   it. | ||||||
|  |  | ||||||
|  | - Jaz Fresh pointed out that if you used "-r [number]" as was wrongly described | ||||||
|  |   in the man page, curl would send an invalid HTTP Range: header. The correct | ||||||
|  |   way would be to use "-r [number]-" or even "-r -[number]". Starting now, | ||||||
|  |   curl will warn if this is discovered, and automatically append a dash to the | ||||||
|  |   range before passing it to libcurl. | ||||||
|  |  | ||||||
|  | Daniel (25 October 2005) | ||||||
|  | - Amol Pattekar reported a bug with great detail and a fine example in bug | ||||||
|  |   #1326306 (http://curl.haxx.se/bug/view.cgi?id=1326306). When using the multi | ||||||
|  |   interface and connecting to a host with multiple IP addresses, and one of | ||||||
|  |   the addresses fails to connect (the server must exist and respond, just not | ||||||
|  |   accept connections) libcurl leaks a socket descriptor. Thanks to the fine | ||||||
|  |   report, I could find and fix this. | ||||||
|  |  | ||||||
|  | Daniel (22 October 2005) | ||||||
|  | - Dima Barsky reported a problem with GnuTLS-enabled libcurl in bug report | ||||||
|  |   #1334338 (http://curl.haxx.se/bug/view.cgi?id=1334338). When reading an SSL | ||||||
|  |   stream from a server and the server requests a "rehandshake", the current | ||||||
|  |   code simply returns this as an error. I have no good way to test this, but | ||||||
|  |   I've added a crude attempt of dealing with this situation slightly better - | ||||||
|  |   it makes a blocking handshake if this happens. Done like this because fixing | ||||||
|  |   this the "proper" way (that would handshake asynchronously) will require | ||||||
|  |   quite some work and I really need a good way to test this to do such a | ||||||
|  |   change. | ||||||
|  |  | ||||||
|  | Daniel (21 October 2005) | ||||||
|  | - "Ofer" reported a problem when libcurl re-used a connection and failed to do | ||||||
|  |   it, it could then accidentally actually crash. Presumably, this concerns FTP | ||||||
|  |   connections.  http://curl.haxx.se/bug/view.cgi?id=1330310 | ||||||
|  |  | ||||||
|  | - Temprimus improved the MSVC makefile so that the static debug SSL libs are | ||||||
|  |   linked to the executable and not to the libcurld.lib | ||||||
|  |   http://curl.haxx.se/bug/view.cgi?id=1326676 | ||||||
|  |  | ||||||
|  | - Bradford Bruce made the windows resolver code properly return | ||||||
|  |   CURLE_COULDNT_RESOLVE_PROXY and CURLE_COULDNT_RESOLVE_HOST on resolving | ||||||
|  |   errors (as documented). | ||||||
|  |  | ||||||
|  | Daniel (20 October 2005) | ||||||
|  | - Dave Dribin made libcurl understand and handle cases when the server | ||||||
|  |   (wrongly) sends *two* WWW-Authenticate headers for Digest. While this should | ||||||
|  |   never happen in a sane world, libcurl previously got into an infinite loop | ||||||
|  |   when this occurred. Dave added test 273 to verify this. | ||||||
|  |  | ||||||
|  | - Temprimus improved the MSVC makefile: "makes a build option available so if | ||||||
|  |   you set rtlibcfg=static for the make, then it would build with /MT. The | ||||||
|  |   default behaviour is /MD (the original)." | ||||||
|  |   http://curl.haxx.se/bug/view.cgi?id=1326665 | ||||||
|  |  | ||||||
|  | Daniel (14 October 2005) | ||||||
|  | - Reverted the LIBCURL_VERSION_NUM change from October 6. As Dave Dribin | ||||||
|  |   reported, the define is used by the configure script and is assumed to use | ||||||
|  |   the 0xYYXXZZ format. This made "curl-config --vernum" fail in the 7.15.0 | ||||||
|  |   release version. | ||||||
|  |  | ||||||
|  | Version 7.15.0 (13 October 2005) | ||||||
|  |  | ||||||
|  | Daniel (12 October 2005) | ||||||
|  | - Michael Sutton of iDEFENSE reported and I fixed a securitfy flaw in the NTLM | ||||||
|  |   code that would overflow a buffer if given a too long user name or domain | ||||||
|  |   name. This would happen if you enable NTLM authentication and either | ||||||
|  |  | ||||||
|  |   A - pass in a user name and domain name to libcurl that together are longer | ||||||
|  |       than 192 bytes | ||||||
|  |  | ||||||
|  |   B - allow (lib)curl to follow HTTP "redirects" (Location: and the | ||||||
|  |       appropriate HTTP 30x response code) and the new URL contains a URL with | ||||||
|  |       a user name and domain name that together are longer than 192 bytes | ||||||
|  |  | ||||||
|  |   See http://curl.haxx.se/docs/security.html for further details and updates | ||||||
|  |  | ||||||
|  | Daniel (5 October 2005) | ||||||
|  | - Darryl House reported a problem with using -z to download files from FTP. | ||||||
|  |   It turned out that if the given time stamp was exact the same as the remote | ||||||
|  |   time stamp, the file would still wrongly be downloaded. Added test case 272 | ||||||
|  |   to verify. | ||||||
|  |  | ||||||
|  | Daniel (4 October 2005) | ||||||
|  | - Domenico Andreoli fixed a man page malformat and removed odd (0xa0) bytes | ||||||
|  |   from the configure script. | ||||||
|  |  | ||||||
|  | - Michael Wallner reported that the date parser had wrong offset stored for | ||||||
|  |   the MEST and CEST time zones. | ||||||
|  |  | ||||||
|  | Daniel (27 September 2005) | ||||||
|  | - David Yan filed bug #1299181 (http://curl.haxx.se/bug/view.cgi?id=1299181) | ||||||
|  |   that identified a silly problem with Content-Range: headers with the 'bytes' | ||||||
|  |   keyword written in a different case than all lowercase! It would cause a | ||||||
|  |   segfault! | ||||||
|  |  | ||||||
|  | - TJ Saunders of the proftpd project identified and pointed out problems with | ||||||
|  |   the modified FTPS negotiation change of August 19 2005. Thus, we revert the | ||||||
|  |   change back to pre-7.14.1 status. | ||||||
|  |  | ||||||
|  | Daniel (21 September 2005) | ||||||
|  | - Fixed "cut off" sentence in the libcurl-tutorial man page: | ||||||
|  |   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=329305 | ||||||
|  |  | ||||||
|  | - Clarified in the curl_easy_setopt man page what the default | ||||||
|  |   CURLOPT_WRITEFUNCTION and CURLOPT_WRITEDATA mean: | ||||||
|  |   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=329311 | ||||||
|  |  | ||||||
|  | - Clarified in the curl_easy_setopt man page that CURLOPT_ERRORBUFFER | ||||||
|  |   sometimes doesn't fill in the buffer even though it is supposed to: | ||||||
|  |   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=329313 | ||||||
|  |  | ||||||
|  | - When CURLE_URL_MALFORMAT is returned due to a missing URL, it now has an | ||||||
|  |   error string set. | ||||||
|  |  | ||||||
|  | Daniel (19 September 2005) | ||||||
|  | - Dmitry Bartsevich made the SSPI support work on Windows 9x as well. | ||||||
|  |  | ||||||
|  | Daniel (15 September 2005) | ||||||
|  | - Added a TFTP server to the test suite and made the test suite capable of | ||||||
|  |   using it. | ||||||
|  |  | ||||||
|  | Daniel (7 September 2005) | ||||||
|  | - Ben Madsen's detailed reports that funnily enough only occurred with certain | ||||||
|  |   glibc versions turned out to be curl using an already closed file handle | ||||||
|  |   during certain conditions (like when saving FTP server "headers"). | ||||||
|  |  | ||||||
|  | - Scott Davis helped me track down a problem in the test HTTP server that made | ||||||
|  |   test case 56 wrongly fail at times. It turned out it was due to the server | ||||||
|  |   finding the end of a chunked-encoded POST too early. | ||||||
|  |  | ||||||
|  | Daniel (6 September 2005) | ||||||
|  | - Now curl warns if an unknown variable is used in the -w/--writeout argument. | ||||||
|  |  | ||||||
|  | Daniel (4 September 2005) | ||||||
|  | - I applied Nicolas Fran<61>ois' man page patch he posted to the Debian bug | ||||||
|  |   tracker. It corrected two lines that started with apostrophes, which isn't | ||||||
|  |   legal nroff format. http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=326511 | ||||||
|  |  | ||||||
|  | - Added --ftp-skip-pasv-ip to the command line tool, that sets the new | ||||||
|  |   CURLOPT_FTP_SKIP_PASV_IP option. It makes libcurl re-use the control | ||||||
|  |   connection's IP address when setting up the data connection instead of | ||||||
|  |   extractting the IP address from the PASV response. It has turned out this | ||||||
|  |   feature is frequently needed by people to circumvent silly servers and silly | ||||||
|  |   firewalls, especially when FTPS is used and the PASV command-response is | ||||||
|  |   sent encrtyped. | ||||||
|  |  | ||||||
|  |   Sponsored by CU*Answers | ||||||
|  |  | ||||||
|  | Daniel (1 September 2005) | ||||||
|  | - John Kelly added TFTP support to libcurl. A bunch of new error codes was | ||||||
|  |   added. TODO: add them to docs. add TFTP server to test suite. add TFTP to | ||||||
|  |   list of protocols whereever those are mentioned. | ||||||
|  |  | ||||||
|  | Version 7.14.1 (1 September 2005) | ||||||
|  |  | ||||||
|  | Daniel (29 August 2005) | ||||||
|  | - Kevin Lussier pointed out a problem with curllib.dsp and how to fix it. | ||||||
|  |  | ||||||
|  | - Igor Polyakov fixed a rather nasty problem with the threaded name resolver | ||||||
|  |   for Windows, that could lead to an Access Violation when the multi interface | ||||||
|  |   was used due to an issue with how the resolver thread was and was not | ||||||
|  |   terminated. | ||||||
|  |  | ||||||
|  | - Simon Josefsson brought a patch that allows curl to get built to use GNU GSS | ||||||
|  |   instead of MIT/Heimdal for GSS capabilities. | ||||||
|  |  | ||||||
|  | Daniel (24 August 2005) | ||||||
|  | - Toby Peterson added CURLOPT_IGNORE_CONTENT_LENGTH to the library, accessible | ||||||
|  |   from the command line tool with --ignore-content-length. This will make it | ||||||
|  |   easier to download files from Apache 1.x (and similar) servers that are | ||||||
|  |   still having problems serving files larger than 2 or 4 GB. When this option | ||||||
|  |   is enabled, curl will simply have to wait for the server to close the | ||||||
|  |   connection to signal end of transfer. I wrote test case 269 that runs a | ||||||
|  |   simple test to verify that this works. | ||||||
|  |  | ||||||
|  | - (Trying hard to exclude emotions now.) valgrind version 3 suddenly renamed | ||||||
|  |   the --logfile command line option to --log-file, and thus the test script | ||||||
|  |   valgrind autodetection now has yet another version check to do and then it | ||||||
|  |   alters the valgrind command line accordingly. | ||||||
|  |  | ||||||
|  | - Fixed CA cert verification using GnuTLS with the default bundle, which | ||||||
|  |   previously failed due to GnuTLS not allowing x509 v1 CA certs by default. | ||||||
|  |   Ralph Mitchell reported. | ||||||
|  |  | ||||||
|  | Daniel (19 August 2005) | ||||||
|  | - Norbert Novotny had problems with FTPS and he helped me work out a patch | ||||||
|  |   that made curl run fine in his end. The key was to make sure we do the | ||||||
|  |   SSL/TLS negotiation immediately after the TCP connect is done and not after | ||||||
|  |   a few other commands have been sent like we did previously. I don't consider | ||||||
|  |   this change necessary to obey the standards, I think this server is pickier | ||||||
|  |   than what the specs allow it to be, but I can't see how this modified | ||||||
|  |   libcurl code can add any problems to those who are interpreting the | ||||||
|  |   standards more liberally. | ||||||
|  |  | ||||||
|  | Daniel (17 August 2005) | ||||||
|  | - Jeff Pohlmeyer found out that if you ask libcurl to load a cookiefile (with | ||||||
|  |   CURLOPT_COOKIEFILE), add a cookie (with CURLOPT_COOKIELIST), tell it to | ||||||
|  |   write the result to a given cookie jar and then never actually call | ||||||
|  |   curl_easy_perform() - the given file(s) to read was never read but the | ||||||
|  |   output file was written and thus it caused a "funny" result. | ||||||
|  |  | ||||||
|  | - While doing some tests for the bug above, I noticed that Firefox generates | ||||||
|  |   large numbers (for the expire time) in the cookies.txt file and libcurl | ||||||
|  |   didn't treat them properly. Now it does. | ||||||
|  |  | ||||||
|  | Daniel (15 August 2005) | ||||||
|  | - Added more verbose "warning" messages to the curl client for cases where it | ||||||
|  |   fails to open/read files etc to help users diagnose why it doesn't do what | ||||||
|  |   you'd expect it to. Converted lots of old messages to use the new generic | ||||||
|  |   function I wrote for this purpose. | ||||||
|  |  | ||||||
|  | Daniel (13 August 2005) | ||||||
|  | - James Bursa identified a libcurl HTTP bug and a good way to repeat it. If a | ||||||
|  |   site responds with bad HTTP response that doesn't contain any header at all, | ||||||
|  |   only a response body, and the write callback returns 0 to abort the | ||||||
|  |   transfer, it didn't have any real effect but the write callback would be | ||||||
|  |   called once more anyway. | ||||||
|  |  | ||||||
|  | Daniel (12 August 2005) | ||||||
|  | - Based on Richard Clayton's reports, I found out that using curl -d @filename | ||||||
|  |   when 'filename' was not possible to access made curl use a GET request | ||||||
|  |   instead. | ||||||
|  |  | ||||||
|  | - The time condition illegal syntax warning is now inhibited if -s is used. | ||||||
|  |  | ||||||
|  | Daniel (10 August 2005) | ||||||
|  | - Mario Schroeder found out that one of the debug callbacks calls that regards | ||||||
|  |   SSL data with the CURLINFO_TEXT type claimed that the data was one byte | ||||||
|  |   larger than it actually is, thus falsely telling the application that the | ||||||
|  |   terminating zero was part of the data. | ||||||
|  |  | ||||||
|  | Daniel (9 August 2005) | ||||||
|  | - Christopher R. Palmer fixed the offsets used for date parsings when the time | ||||||
|  |   zone name of a daylight savings time was used. For example, PDT vs PDS. This | ||||||
|  |   flaw was introduced with the new date parser (11 sep 2004 - 7.12.2). | ||||||
|  |   Fortunately, no web server or cookie string etc should be using such time | ||||||
|  |   zone names thus limiting the effect of this bug. | ||||||
|  |  | ||||||
|  | Daniel (8 August 2005) | ||||||
|  | - Jon Grubbs filed bug report #1249962 | ||||||
|  |   (http://curl.haxx.se/bug/view.cgi?id=1249962) which identified a problem | ||||||
|  |   with NTLM on a HTTP proxy if an FTP URL was given. libcurl now properly | ||||||
|  |   switches to pure HTTP internally when an HTTP proxy is used, even for FTP | ||||||
|  |   URLs. The problem would also occur with other multi-pass auth methods. | ||||||
|  |  | ||||||
|  | Daniel (7 August 2005) | ||||||
|  | - When curl is built with GnuTLS, curl-config didn't include "SSL" when | ||||||
|  |   --features was used. | ||||||
|  |  | ||||||
|  | Daniel (28 July 2005) | ||||||
|  | - If any of the options CURLOPT_HTTPGET, CURLOPT_POST and CURLOPT_HTTPPOST is | ||||||
|  |   set to 1, CURLOPT_NOBODY will now automatically be set to 0. | ||||||
|  |  | ||||||
|  | Daniel (27 July 2005) | ||||||
|  | - Dan Fandrich changes over the last week: fixed numerous minor configure | ||||||
|  |   option parsing flaws: --without-gnutls, --without-spnego --without-gssapi | ||||||
|  |   and --without-krb4. Spellfixed several error messages. | ||||||
|  |  | ||||||
|  | - Peteris Krumins added CURLOPT_COOKIELIST and CURLINFO_COOKIELIST, which is a | ||||||
|  |   simple interface to extracting and setting cookies in libcurl's internal | ||||||
|  |   "cookie jar". See the new cookie_interface.c example code. | ||||||
|  |  | ||||||
|  | Daniel (13 July 2005) | ||||||
|  | - Diego Casorran provided patches to make curl build fine on Amiga again. | ||||||
|  |  | ||||||
|  | Daniel (12 July 2005) | ||||||
|  | - Adrian Schuur added trailer support in the chunked encoding stream. The | ||||||
|  |   trailer is then sent to the normal header callback/stream. I wrote up test | ||||||
|  |   case 266 to verify the basic functionality. Do note that test case 34 | ||||||
|  |   contains a flawed chunked encoding stream that still works the same. | ||||||
|  |  | ||||||
|  | Daniel (5 July 2005) | ||||||
|  | - Gisle Vanem came up with a nice little work-around for bug #1230118 | ||||||
|  |   (http://curl.haxx.se/bug/view.cgi?id=1230118). It seems the Windows (MSVC) | ||||||
|  |   libc time functions may return data one hour off if TZ is not set and | ||||||
|  |   automatic DST adjustment is enabled. This made curl_getdate() return wrong | ||||||
|  |   value, and it also concerned internal cookie expirations etc. | ||||||
|  |  | ||||||
|  | Daniel (4 July 2005) | ||||||
|  | - Andrew Bushnell provided enough info for me to tell that we badly needed to | ||||||
|  |   fix the CONNECT authentication code with multi-pass auth methods (such as | ||||||
|  |   NTLM) as it didn't previously properly ignore response-bodies - in fact it | ||||||
|  |   stopped reading after all response headers had been received. This could | ||||||
|  |   lead to libcurl sending the next request and reading the body from the first | ||||||
|  |   request as response to the second request. (I also renamed the function, | ||||||
|  |   which wasn't strictly necessary but...) | ||||||
|  |  | ||||||
|  |   The best fix would to once and for all make the CONNECT code use the | ||||||
|  |   ordinary request sending/receiving code, treating it as any ordinary request | ||||||
|  |   instead of the special-purpose function we have now. It should make it | ||||||
|  |   better for multi-interface too. And possibly lead to less code... | ||||||
|  |  | ||||||
|  |   Added test case 265 for this. It doesn't work as a _really_ good test case | ||||||
|  |   since the test proxy is too stupid, but the test case helps when running the | ||||||
|  |   debugger to verify. | ||||||
|  |  | ||||||
|  | Daniel (30 June 2005) | ||||||
|  | - Dan Fandrich improved the configure script's ability to figure out what kind | ||||||
|  |   of strerror_r() API that is used when cross-compiling. If __GLIB__ is | ||||||
|  |   defined, it assumes the glibc API. If not, it issues a notice as before that | ||||||
|  |   the user needs to manually edit lib/config.h for this. | ||||||
|  |  | ||||||
|  | Daniel (23 June 2005) | ||||||
|  | - David Shaw's fix that unifies proxy string treatment so that a proxy given | ||||||
|  |   with CURLOPT_PROXY can use a http:// prefix and user + password. The user | ||||||
|  |   and password fields are now also URL decoded properly. Test case 264 added | ||||||
|  |   to verify. | ||||||
|  |  | ||||||
|  | Daniel (22 June 2005) | ||||||
|  | - David Shaw updated libcurl.m4 | ||||||
|  |  | ||||||
|  | Daniel (14 June 2005) | ||||||
|  | - Gisle Vanem fixed a potential thread handle leak. Bug report #1216500 | ||||||
|  |   (http://curl.haxx.se/bug/view.cgi?id=1216500).  Comment in | ||||||
|  |   http://curl.haxx.se/mail/lib-2005-06/0059.html | ||||||
|  |  | ||||||
|  | Daniel (13 June 2005) | ||||||
|  | - Made buildconf run libtoolize in the ares dir too (inspired by Tupone's | ||||||
|  |   reverted patch). | ||||||
|  |  | ||||||
|  | Daniel (9 June 2005) | ||||||
|  | - Incorporated Tupone's findtool fix in buildconf (slightly edited) | ||||||
|  |  | ||||||
|  | - Incorporated Tupone's head -n fix in buildconf. | ||||||
|  |  | ||||||
|  | Daniel (8 June 2005) | ||||||
|  | - Reverted Tupone's patch again, it broke numerous autobuilds. Let's apply it | ||||||
|  |   in pieces, one by one and see what we need to adjust to work all over. | ||||||
|  |  | ||||||
|  | Daniel (6 June 2005) | ||||||
|  | - Tupone Alfredo fixed three problems in buildconf: | ||||||
|  |  | ||||||
|  |   1) findtool does look per tool in PATH and think ./perl is the perl | ||||||
|  |   executable, while is just a local directory (I have . in the PATH) | ||||||
|  |  | ||||||
|  |   2) I got several warning for head -1 deprecated in favour of head -n 1 | ||||||
|  |   | ||||||
|  |   3) ares directory is missing some file (missing is missing :-) ) because | ||||||
|  |   automake and friends is not run. | ||||||
|  |  | ||||||
|  | Daniel (3 June 2005) | ||||||
|  | - Added docs/libcurl/getinfo-times, based on feedback from 'Edi': | ||||||
|  |   http://curl.haxx.se/feedback/display.cgi?id=11178325798299&support=yes | ||||||
|  |  | ||||||
|  | - Andres Garcia provided yet another text mode patch for several test cases so | ||||||
|  |   that they do text comparisions better on Windows (newline-wise). | ||||||
|  |  | ||||||
|  | Daniel (1 June 2005) | ||||||
|  | - The configure check for c-ares now adds the cares lib before the other libs, | ||||||
|  |   to make it build fine with mingw. Inspired by Tupone Alfredo's bug report | ||||||
|  |   and patch: http://curl.haxx.se/bug/view.cgi?id=1212940 | ||||||
|  |  | ||||||
|  | Daniel (31 May 2005) | ||||||
|  | - Todd Kulesza reported a flaw in the proxy option, since a numerical IPv6 | ||||||
|  |   address was not possible to use. It is now, but requires it written | ||||||
|  |   RFC2732-style, within brackets - which incidently is how you enter numerical | ||||||
|  |   IPv6 addresses in URLs. Test case 263 added to verify. | ||||||
|  |  | ||||||
|  | Daniel (30 May 2005) | ||||||
|  | - Eric Cooper reported about a problem with HTTP servers that responds with | ||||||
|  |   binary zeroes within the headers. They confused libcurl to do wrong so the | ||||||
|  |   downloaded headers become incomplete. The fix is now verified with test case | ||||||
|  |   262. http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=310948 | ||||||
|  |  | ||||||
|  | Daniel (25 May 2005) | ||||||
|  | - Fixed problems with the test suite, and in particular the FTP test cases | ||||||
|  |   since it previously was failing every now and then in a nonsense manner. | ||||||
|  |  | ||||||
|  | - --trace-time now outputs the full microsecond, all 6 digits. | ||||||
|  |  | ||||||
|  | Daniel (24 May 2005) | ||||||
|  | - Andres Garcia provided a text mode patch for several test cases so that they | ||||||
|  |   do text comparisions better on Windows (newline-wise). | ||||||
|  |  | ||||||
|  | - Any 2xx response (and not just 200) is now considered a fine response to | ||||||
|  |   TYPE, as some servers obviously sends a 226 there. Added test case 261 to | ||||||
|  |   verify. Based on a question/report by Georg Wicherski. | ||||||
|  |  | ||||||
|  | Daniel (20 May 2005) | ||||||
|  | - Improved runtests.pl to allow stdout tests to be mode=text as well, just | ||||||
|  |   as file comparisons already supports. Added this info to the FILEFORMAT | ||||||
|  |   docs. | ||||||
|  |  | ||||||
|  | Daniel (18 May 2005) | ||||||
|  | - John McGowan identified a problem in bug report #1204435 | ||||||
|  |   (http://curl.haxx.se/bug/view.cgi?id=1204435) with malformed URLs like | ||||||
|  |   "http://somehost?data" as it added a slash too much in the request ("GET | ||||||
|  |   /?data/"...). Added test case 260 to verify. | ||||||
|  |  | ||||||
|  | - The configure check for strerror_r() failed to detect the proper API at | ||||||
|  |   times, like on HP-UX 10.20. Then lib/strerror.c badly assumed the glibc | ||||||
|  |   version if the posix define wasn't set (since it _had_ found a strerror_r). | ||||||
|  |  | ||||||
|  | Daniel (16 May 2005) | ||||||
|  | - The gmtime_r() function in HP-UX 10.20 is broken. About 13 test cases fail | ||||||
|  |   due to this. There's now a configure check that attempts to detect the bad | ||||||
|  |   function and not use it on such systems. | ||||||
|  |  | ||||||
| Version 7.14.0 (16 May 2005) | Version 7.14.0 (16 May 2005) | ||||||
|  |  | ||||||
| Daniel (13 May 2005) | Daniel (13 May 2005) | ||||||
| @@ -19,8 +561,9 @@ Daniel (12 May 2005) | |||||||
| - When doing a second request (after a disconnect) using the same easy handle, | - When doing a second request (after a disconnect) using the same easy handle, | ||||||
|   over a proxy that uses NTLM authentication, libcurl failed to use NTLM again |   over a proxy that uses NTLM authentication, libcurl failed to use NTLM again | ||||||
|   properly (the auth method was accidentally reset to the same as had been set |   properly (the auth method was accidentally reset to the same as had been set | ||||||
|   for host auth, which defaults to Basic). Bug report #1200661 identified the |   for host auth, which defaults to Basic). Bug report #1200661 | ||||||
|   the problem and the fix. |   (http://curl.haxx.se/bug/view.cgi?id=1200661) identified the the problem and | ||||||
|  |   the fix. | ||||||
|  |  | ||||||
| - If -z/--time-cond is used with an invalid date syntax, this is no longer | - If -z/--time-cond is used with an invalid date syntax, this is no longer | ||||||
|   silently discarded. Instead a proper warning message is diplayed that |   silently discarded. Instead a proper warning message is diplayed that | ||||||
|   | |||||||
| @@ -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 {} \; | ||||||
|   | |||||||
| @@ -200,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 | ||||||
|   | |||||||
							
								
								
									
										69
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								README
									
									
									
									
									
								
							| @@ -26,50 +26,39 @@ 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.miscellaneousmirror.org/ | ||||||
|         Germany   -- http://curl.kgt.org/ |         Germany      http://curl.mirror.at.stealer.net/ | ||||||
|         Germany   -- http://curl.mirror.at.stealer.net/ |         Germany      http://curl.mirroring.de/ | ||||||
|         Germany   -- http://curl.netmirror.org/ |         Germany      http://curl.mons-new-media.de/ | ||||||
|         Russia    -- http://curl.tsuren.net/ |         Germany      http://curl.triplemind.com/ | ||||||
|         Taiwan    -- http://curl.cs.pu.edu.tw/ |         Germany      http://curl.freemirror.de/ | ||||||
|         Thailand  -- http://curl.siamu.ac.th/ |         Netherlands  http://curl.nedmirror.nl/ | ||||||
|         US (CA)   -- http://curl.mirror.redwire.net/ |         Russia       http://curl.tsuren.net/ | ||||||
|         US (CA)   -- http://curl.mirrormonster.com/ |         Taiwan       http://curl.cs.pu.edu.tw/ | ||||||
|         US (CA)   -- http://curl.signal42.com/ |         Thailand     http://curl.siamu.ac.th/ | ||||||
|         US (TX)   -- http://curl.109k.com/ |         US (AZ)      http://curl.islandofpoker.com/ | ||||||
|  |         US (CA)      http://curl.mirror.redwire.net/ | ||||||
| DOWNLOAD |         US (CA)      http://curl.mirrormonster.com/ | ||||||
|  |         US (CA)      http://curl.signal42.com/ | ||||||
|   The official download mirror sites are: |         US (CA)      http://curl.tolix.org/ | ||||||
|  |         US (CA)      http://curl.webhosting76.com/ | ||||||
|         Australia -- http://curl.planetmirror.com/download.html |         US (CA)      http://curl.meulie.net/ | ||||||
|         Austria   -- http://curl.gds.tuwien.ac.at/download.html |         US (FL)      http://curl.hoxt.com/ | ||||||
|         Estonia   -- http://curl.wildyou.net/download.html |         US (TX)      http://curl.109k.com/ | ||||||
|         Germany   -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/ |         US (TX)      http://curl.mirrors.cyberservers.net/ | ||||||
|         Germany   -- http://curl.mirror.at.stealer.net/download.html |         US (TX)      http://curl.seekmeup.com/ | ||||||
|         Germany   -- http://curl.netmirror.org/download.html |         US (TX)      http://curl.hostingzero.com/ | ||||||
|         Germany   -- http://www.mirrorspace.org/curl/ |  | ||||||
|         Hongkong  -- http://www.execve.net/curl/ |  | ||||||
|         Russia    -- http://curl.tsuren.net/download.html |  | ||||||
|         Sweden    -- ftp://ftp.sunet.se/pub/www/utilities/curl/ |  | ||||||
|         Sweden    -- http://cool.haxx.se/curl/ |  | ||||||
|         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,58 +1,61 @@ | |||||||
| Curl and libcurl 7.14.0 | Curl and libcurl 7.15.1 | ||||||
|  |  | ||||||
|  Public curl release number:               88 |  Public curl release number:               91 | ||||||
|  Releases counted from the very beginning: 115 |  Releases counted from the very beginning: 118 | ||||||
|  Available command line options:           107 |  Available command line options:           109 | ||||||
|  Available curl_easy_setopt() options:     122 |  Available curl_easy_setopt() options:     125 | ||||||
|  Number of public functions in libcurl:    46 |  Number of public functions in libcurl:    46 | ||||||
|  Amount of public web site mirrors:        23 |  Amount of public web site mirrors:        27 | ||||||
|  Number of known libcurl bindings:         31 |  Number of known libcurl bindings:         32 | ||||||
|  Number of contributors:                   437 |  Number of contributors:                   459 | ||||||
|  |  | ||||||
| This release includes the following changes: | This release includes the following changes: | ||||||
|  |  | ||||||
|  o modified default HTTP request headers |  o the libcurl.pc pkgconfig file now gets installed on make install | ||||||
|  o curl --trace-time added for time stamping trace logs |  o URL globbing now offers "range steps": [1-100:10] | ||||||
|  o curl now respects the SSL_CERT_DIR and SSL_CERT_PATH environment variables |  o LDAPv3 is now the preferred LDAP protocol version | ||||||
|  o more search paths for curl's default .curlrc config file check |  o --max-redirs and CURLOPT_MAXREDIRS set to 0 limits redirects | ||||||
|  o GnuTLS support, use configure --with-gnutls. Work on this was sponsored |  o improved MSVC makefile | ||||||
|    by The Written Word. |  | ||||||
|  |  | ||||||
| This release includes the following bugfixes: | This release includes the following bugfixes: | ||||||
|  |  | ||||||
|  o uses select() instead of poll() even on Mac OS X 10.4 |  o buffer overflow problem: http://curl.haxx.se/docs/adv_20051207.html | ||||||
|  o reconnected proxy use with NTLM auth on the same handle |  o using file:// on non-existing files are properly handled | ||||||
|  o warns about bad -z date syntax |  o builds fine on DJGPP | ||||||
|  o docs/THANKS now contains all known contributors |  o CURLOPT_ERRORBUFFER is now always filled in on errors | ||||||
|  o builds out-of-the-box on (presumably ipv6-enabled) AIX 4.3 hosts |  o curl outputs error on bad --limit-rate units | ||||||
|  o curl --head could wrongly complain on bad chunked-encoding |  o fixed libcurl's use of poll() on cygwin | ||||||
|  o --interface SIGSEGVed on a bad address |  o the GnuTLS code didn't support client certificates | ||||||
|  o kill the HTTPS server better when stopping the test suite |  o TFTP over IPv6 works | ||||||
|  o builds fine with VS2005 on x64 |  o no reverse lookups on IP addresses when ipv6-enabled | ||||||
|  o auth fix for HTTP redirects and .netrc usage |  o SSPI compatibility fix: using the proper DLLs | ||||||
|  o FTP uploads show the progress meter easier |  o binary LDAP properties are now shown base64 encoded | ||||||
|  o MSVC makefile fixes for static libcurl builds |  o Windows uploads from stdin using curl can now contain ctrl-Z bytes | ||||||
|  o configure fix for static libcurl build on Windows |  o -r [num] would produce an invalid HTTP Range: header | ||||||
|  o --retry-delay |  o multi interface with multi IP hosts could leak socket descriptors | ||||||
|  o POST with read callback now uses Expect: 100-continue |  o the GnuTLS code didn't handle rehandshakes | ||||||
|  o CURLOPT_PORT didn't actually use the set port number |  o re-use of a dead FTP connection | ||||||
|  o HTTP 304 response with Content-Length: header |  o name resolve error codes fixed for Windows builds | ||||||
|  o time-conditioned FTP uploads |  o double WWW-Authenticate Digest headers are now handled | ||||||
|  |  o curl-config --vernum fixed | ||||||
|  |  | ||||||
| Other curl-related news since the previous public release: | Other curl-related news since the previous public release: | ||||||
|  |  | ||||||
|  o http://curl.mirroring.de/ is a new german curl mirror |  o FTP-SSL is now RFC4217 | ||||||
|  o pycurl 7.13.2: http://pycurl.sf.net/ |  o CurlPas 2005-11-05 was released: http://curlpas.sf.net/ | ||||||
|  o TclCurl 0.13.2: http://personal1.iddeo.es/andresgarci/tclcurl/english/ |  o pycurl 7.15.0 was released http://pycurl.sf.net | ||||||
|  o http://curl.webhosting76.com/ is a new US curl mirror |  o New web mirrors: | ||||||
|  o http://curl.meulie.net/ is a new Canadian curl mirror |    http://curl.triplemind.com/ located in Mannheim, Germany | ||||||
|  |    http://curl.nedmirror.nl located in Amsterdam, the Netherlands | ||||||
|  |    http://curl.hoxt.com located in Florida, US | ||||||
|  |  | ||||||
| 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: | ||||||
|  |  | ||||||
|  Christophe Legry, Cory Nelson, Gisle Vanem, Dan Fandrich, Toshiyuki Maezawa, |  Dave Dribin, Bradford Bruce, Temprimus, Ofer, Dima Barsky, Amol Pattekar, Jaz | ||||||
|  Olivier, Andres Garcia, Dave Dribin, Alex Suykov, Cory Nelson, Fred New, |  Fresh, tommink[at]post.pl, Gisle Vanem, Nis Jorgensen, Vilmos Nebehaj, Dmitry | ||||||
|  Paul Moore, Alexander Zhuravlev, Bryan Henderson, Jeremy Brown, Allan, |  Bartsevich, David Lang, Eugene Kotlyarov, Jan Kunder, Yang Tse, Quagmire, | ||||||
|  Grigory Entin |  Albert Chin, David Shaw, Doug Kaufman, Bryan Henderson, Jamie Newton, Stefan | ||||||
|  |  Esser | ||||||
|  |  | ||||||
|         Thanks! (and sorry if I forgot to mention someone) |         Thanks! (and sorry if I forgot to mention someone) | ||||||
|   | |||||||
							
								
								
									
										39
									
								
								TODO-RELEASE
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								TODO-RELEASE
									
									
									
									
									
								
							| @@ -1,40 +1,7 @@ | |||||||
| Issues not sorted in any particular order. | To get fixed in 7.15.0 (planned release: November 2005) | ||||||
|  |  | ||||||
| To get fixed in 7.14.0 (planned release: May/June 2005) |  | ||||||
| ====================== | ====================== | ||||||
|  |  | ||||||
|    - Make the tests run better on more platforms. | 60 - CONNECT 407 responses that kills the connection (not very likely though) | ||||||
|  |  | ||||||
| To get fixed in 7.14.1 (planned release: June 2005) | 63 -  | ||||||
| ====================== |  | ||||||
|  |  | ||||||
| 58 - Fix KNOWN_BUGS #19: "FTP 3rd party transfers with the multi interface |  | ||||||
|      doesn't work" |  | ||||||
|  |  | ||||||
| 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. |  | ||||||
|  |  | ||||||
| To get fixed in 7.15.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). |  | ||||||
|  |  | ||||||
| To get fixed in 7.16.0 |  | ||||||
| ====================== |  | ||||||
|  |  | ||||||
| 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. |  | ||||||
|  |  | ||||||
| 60 -  |  | ||||||
|   | |||||||
							
								
								
									
										62
									
								
								acinclude.m4
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								acinclude.m4
									
									
									
									
									
								
							| @@ -141,6 +141,9 @@ AC_DEFUN([TYPE_SOCKADDR_STORAGE], | |||||||
| #endif | #endif | ||||||
| #ifdef HAVE_ARPA_INET_H | #ifdef HAVE_ARPA_INET_H | ||||||
| #include <arpa/inet.h> | #include <arpa/inet.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
| #endif | #endif | ||||||
|    ]) |    ]) | ||||||
|  |  | ||||||
| @@ -192,8 +195,7 @@ AC_DEFUN([TYPE_SOCKLEN_T], | |||||||
| ]) | ]) | ||||||
|  |  | ||||||
| dnl Check for in_addr_t: it is used to receive the return code of inet_addr() | dnl Check for in_addr_t: it is used to receive the return code of inet_addr() | ||||||
| dnl and a few other things. If not found, we set it to unsigned int, as even | dnl and a few other things. | ||||||
| dnl 64-bit implementations use to set it to a 32-bit type. |  | ||||||
| AC_DEFUN([TYPE_IN_ADDR_T], | AC_DEFUN([TYPE_IN_ADDR_T], | ||||||
| [ | [ | ||||||
|    AC_CHECK_TYPE([in_addr_t], ,[ |    AC_CHECK_TYPE([in_addr_t], ,[ | ||||||
| @@ -417,34 +419,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]) | ||||||
| @@ -466,8 +459,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 | ||||||
| @@ -756,15 +761,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 | ||||||
|   | |||||||
							
								
								
									
										52
									
								
								ares/CHANGES
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								ares/CHANGES
									
									
									
									
									
								
							| @@ -1,5 +1,57 @@ | |||||||
|   Changelog for the c-ares project |   Changelog for the c-ares project | ||||||
|  |  | ||||||
|  | * 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 | * May 14 | ||||||
|  |  | ||||||
| - Added an inet_ntop function from BIND for systems that do not have it. | - Added an inet_ntop function from BIND for systems that do not have it. | ||||||
|   | |||||||
| @@ -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,10 +4,9 @@ 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 | ||||||
| @@ -15,7 +14,7 @@ EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \ | |||||||
|  $(MSVCFILES) AUTHORS |  $(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,17 +1,18 @@ | |||||||
| CSOURCES = ares_fds.c ares_process.c ares_free_hostent.c ares_query.c	   \ | CSOURCES = ares_fds.c ares_process.c ares_free_hostent.c ares_query.c       \ | ||||||
| ares__close_sockets.c ares_free_string.c ares_search.c ares__get_hostent.c \ | ares__close_sockets.c ares_free_string.c ares_search.c ares__get_hostent.c  \ | ||||||
| ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c	   \ | ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c     \ | ||||||
| ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c	   \ | ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c     \ | ||||||
| ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c	   \ | ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c       \ | ||||||
| windows_port.c ares_expand_string.c ares_parse_ptr_reply.c                 \ | windows_port.c ares_expand_string.c ares_parse_ptr_reply.c                  \ | ||||||
| ares_parse_aaaa_reply.c inet_net_pton.c bitncmp.c inet_ntop.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          \ | ||||||
|            inet_net_pton.h ares_ipv6.h bitncmp.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_parse_aaaa_reply.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 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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 | ||||||
| @@ -304,6 +304,8 @@ config.h: Makefile.netware | |||||||
| 	@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_PF_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_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_IN6_ADDR 16$(DL) >> $@ | ||||||
| 	@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@ | 	@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@ | ||||||
| ifdef NW_WINSOCK | ifdef NW_WINSOCK | ||||||
|   | |||||||
							
								
								
									
										188
									
								
								ares/Makefile.vc6
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								ares/Makefile.vc6
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,188 @@ | |||||||
|  | # $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) -W2 -Yd -Zi | ||||||
|  | LDFLAGS = -machine:i386 -map -warn:2 | ||||||
|  |  | ||||||
|  | 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 -debugtype:coff -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_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: $(OBJECTS) | ||||||
|  |        lib -nologo -out:$@ $(OBJECTS) | ||||||
|  |  | ||||||
|  | cares_imp.lib cares.dll: $(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_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)\ahost.obj cares_imp.lib | ||||||
|  |        link $(LDFLAGS) -out:$@ $(OBJ_DIR)\ahost.obj cares_imp.lib $(EX_LIBS) | ||||||
|  |  | ||||||
|  | adig.exe: $(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,3 +1,126 @@ | |||||||
|  | dnl Check for how to set a socket to non-blocking state. There seems to exist | ||||||
|  | dnl four known different ways, with the one used almost everywhere being POSIX | ||||||
|  | dnl and XPG3, while the other different ways for different systems (old BSD, | ||||||
|  | dnl Windows and Amiga). | ||||||
|  | dnl | ||||||
|  | dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the | ||||||
|  | dnl O_NONBLOCK define is found but does not work. This condition is attempted | ||||||
|  | dnl to get caught in this script by using an excessive number of #ifdefs... | ||||||
|  | dnl | ||||||
|  | AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET], | ||||||
|  | [ | ||||||
|  |   AC_MSG_CHECKING([non-blocking sockets style]) | ||||||
|  |  | ||||||
|  |   AC_TRY_COMPILE([ | ||||||
|  | /* headers for O_NONBLOCK test */ | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | #include <fcntl.h> | ||||||
|  | ],[ | ||||||
|  | /* try to compile O_NONBLOCK */ | ||||||
|  |  | ||||||
|  | #if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) | ||||||
|  | # if defined(__SVR4) || defined(__srv4__) | ||||||
|  | #  define PLATFORM_SOLARIS | ||||||
|  | # else | ||||||
|  | #  define PLATFORM_SUNOS4 | ||||||
|  | # endif | ||||||
|  | #endif | ||||||
|  | #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4) | ||||||
|  | # define PLATFORM_AIX_V3 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__) | ||||||
|  | #error "O_NONBLOCK does not work on this platform" | ||||||
|  | #endif | ||||||
|  |   int socket; | ||||||
|  |   int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK); | ||||||
|  | ],[ | ||||||
|  | dnl the O_NONBLOCK test was fine | ||||||
|  | nonblock="O_NONBLOCK" | ||||||
|  | AC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets]) | ||||||
|  | ],[ | ||||||
|  | dnl the code was bad, try a different program now, test 2 | ||||||
|  |  | ||||||
|  |   AC_TRY_COMPILE([ | ||||||
|  | /* headers for FIONBIO test */ | ||||||
|  | #include <unistd.h> | ||||||
|  | #include <stropts.h> | ||||||
|  | ],[ | ||||||
|  | /* FIONBIO source test (old-style unix) */ | ||||||
|  |  int socket; | ||||||
|  |  int flags = ioctl(socket, FIONBIO, &flags); | ||||||
|  | ],[ | ||||||
|  | dnl FIONBIO test was good | ||||||
|  | nonblock="FIONBIO" | ||||||
|  | AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets]) | ||||||
|  | ],[ | ||||||
|  | dnl FIONBIO test was also bad | ||||||
|  | dnl the code was bad, try a different program now, test 3 | ||||||
|  |  | ||||||
|  |   AC_TRY_COMPILE([ | ||||||
|  | /* headers for ioctlsocket test (cygwin?) */ | ||||||
|  | #include <windows.h> | ||||||
|  | ],[ | ||||||
|  | /* ioctlsocket source code */ | ||||||
|  |  int socket; | ||||||
|  |  unsigned long flags = ioctlsocket(socket, FIONBIO, &flags); | ||||||
|  | ],[ | ||||||
|  | dnl ioctlsocket test was good | ||||||
|  | nonblock="ioctlsocket" | ||||||
|  | AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets]) | ||||||
|  | ],[ | ||||||
|  | dnl ioctlsocket didnt compile!, go to test 4 | ||||||
|  |  | ||||||
|  |   AC_TRY_LINK([ | ||||||
|  | /* headers for IoctlSocket test (Amiga?) */ | ||||||
|  | #include <sys/ioctl.h> | ||||||
|  | ],[ | ||||||
|  | /* IoctlSocket source code */ | ||||||
|  |  int socket; | ||||||
|  |  int flags = IoctlSocket(socket, FIONBIO, (long)1); | ||||||
|  | ],[ | ||||||
|  | dnl ioctlsocket test was good | ||||||
|  | nonblock="IoctlSocket" | ||||||
|  | AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets]) | ||||||
|  | ],[ | ||||||
|  | dnl Ioctlsocket didnt compile, do test 5! | ||||||
|  |   AC_TRY_COMPILE([ | ||||||
|  | /* headers for SO_NONBLOCK test (BeOS) */ | ||||||
|  | #include <socket.h> | ||||||
|  | ],[ | ||||||
|  | /* SO_NONBLOCK source code */ | ||||||
|  |  long b = 1; | ||||||
|  |  int socket; | ||||||
|  |  int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); | ||||||
|  | ],[ | ||||||
|  | dnl the SO_NONBLOCK test was good | ||||||
|  | nonblock="SO_NONBLOCK" | ||||||
|  | AC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets]) | ||||||
|  | ],[ | ||||||
|  | dnl test 5 didnt compile! | ||||||
|  | nonblock="nada" | ||||||
|  | AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets]) | ||||||
|  | ]) | ||||||
|  | dnl end of fifth test | ||||||
|  |  | ||||||
|  | ]) | ||||||
|  | dnl end of forth test | ||||||
|  |  | ||||||
|  | ]) | ||||||
|  | dnl end of third test | ||||||
|  |  | ||||||
|  | ]) | ||||||
|  | dnl end of second test | ||||||
|  |  | ||||||
|  | ]) | ||||||
|  | dnl end of non-blocking try-compile test | ||||||
|  |   AC_MSG_RESULT($nonblock) | ||||||
|  |  | ||||||
|  |   if test "$nonblock" = "nada"; then | ||||||
|  |     AC_MSG_WARN([non-block sockets disabled]) | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
| dnl We create a function for detecting which compiler we use and then set as | dnl We create a function for detecting which compiler we use and then set as | ||||||
| dnl pendantic compiler options as possible for that particular compiler. The | dnl pendantic compiler options as possible for that particular compiler. The | ||||||
| @@ -146,3 +269,50 @@ AC_DEFUN([CARES_CHECK_CONSTANT], [ | |||||||
| ]) | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | dnl This macro determines how many parameters getservbyport_r takes | ||||||
|  | AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [ | ||||||
|  |   AC_MSG_CHECKING([how many arguments getservbyport_r takes]) | ||||||
|  |   AC_TRY_COMPILE( | ||||||
|  |     [#include <netdb.h>], | ||||||
|  |     [ | ||||||
|  |       int p1, p5; | ||||||
|  |       char *p2, p4[4096]; | ||||||
|  |       struct servent *p3, *p6; | ||||||
|  |       getservbyport_r(p1, p2, p3, p4, p5, &p6); | ||||||
|  |     ], ac_func_getservbyport_r=6, | ||||||
|  |     [AC_TRY_COMPILE( | ||||||
|  |       [#include <netdb.h>], | ||||||
|  |       [ | ||||||
|  |         int p1, p5; | ||||||
|  |         char *p2, p4[4096]; | ||||||
|  |         struct servent *p3; | ||||||
|  |         getservbyport_r(p1, p2, p3, p4, p5); | ||||||
|  |       ], ac_func_getservbyport_r=5, | ||||||
|  |       [AC_TRY_COMPILE( | ||||||
|  |         [#include <netdb.h>], | ||||||
|  |         [ | ||||||
|  |           int p1; | ||||||
|  |           char *p2; | ||||||
|  |           struct servent *p3; | ||||||
|  |           struct servent_data p4; | ||||||
|  |           getservbyport_r(p1, p2, p3, &p4); | ||||||
|  |         ], ac_func_getservbyport_r=4, ac_func_getservbyport_r=0 | ||||||
|  |       )] | ||||||
|  |     )] | ||||||
|  |   ) | ||||||
|  | if test $ac_func_getservbyport_r != "0" ; then | ||||||
|  |   AC_MSG_RESULT($ac_func_getservbyport_r) | ||||||
|  |   AC_DEFINE(HAVE_GETSERVBYPORT_R, 1, [Specifies whether getservbyport_r is present]) | ||||||
|  |   AC_DEFINE_UNQUOTED(GETSERVBYPORT_R_ARGS, $ac_func_getservbyport_r, [Specifies the number of arguments to  | ||||||
|  | getservbyport_r]) | ||||||
|  |   if test $ac_func_getservbyport_r = "4" ; then | ||||||
|  |    AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, sizeof(struct servent_data), [Specifies the size of the buffer to pass to  | ||||||
|  | getservbyport_r]) | ||||||
|  |   else | ||||||
|  |    AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, 4096, [Specifies the size of the buffer to pass to getservbyport_r]) | ||||||
|  |   fi | ||||||
|  | else | ||||||
|  |   AC_MSG_RESULT([not found]) | ||||||
|  | fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										41
									
								
								ares/adig.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								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; | ||||||
| @@ -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(""); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										54
									
								
								ares/ares.h
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								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,42 @@ 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) | ||||||
|  |  | ||||||
| struct ares_options { | struct ares_options { | ||||||
|   int flags; |   int flags; | ||||||
|   int timeout; |   int timeout; | ||||||
| @@ -101,12 +146,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,7 +171,9 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family, | |||||||
|                         ares_host_callback callback, void *arg); |                         ares_host_callback callback, void *arg); | ||||||
| void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | ||||||
|                         int family, ares_host_callback callback, void *arg); |                         int family, ares_host_callback callback, void *arg); | ||||||
|  | void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, | ||||||
|  |                       socklen_t salen, int flags, ares_nameinfo_callback callback, | ||||||
|  |                       void *arg); | ||||||
| int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds); | int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds); | ||||||
| struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv, | struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv, | ||||||
|                              struct timeval *tv); |                              struct timeval *tv); | ||||||
|   | |||||||
| @@ -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) | ||||||
|   | |||||||
| @@ -106,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 | ||||||
| @@ -107,7 +109,7 @@ static void next_lookup(struct addr_query *aquery) | |||||||
|       switch (*p) |       switch (*p) | ||||||
|         { |         { | ||||||
|         case 'b': |         case 'b': | ||||||
| 	  if (aquery->family == AF_INET) |           if (aquery->family == AF_INET) | ||||||
|             { |             { | ||||||
|               addr = ntohl(aquery->addr.addr4.s_addr); |               addr = ntohl(aquery->addr.addr4.s_addr); | ||||||
|               a1 = (int)((addr >> 24) & 0xff); |               a1 = (int)((addr >> 24) & 0xff); | ||||||
|   | |||||||
| @@ -124,10 +124,10 @@ 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; | ||||||
| 	  if (hquery->family == AF_INET6) |           if (hquery->family == AF_INET6) | ||||||
| 	    ares_search(hquery->channel, hquery->name, C_IN, T_AAAA, host_callback, |             ares_search(hquery->channel, hquery->name, C_IN, T_AAAA, host_callback, | ||||||
| 	                hquery); |                         hquery); | ||||||
| 	  else |           else | ||||||
|             ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, |             ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, | ||||||
|                         hquery); |                         hquery); | ||||||
|           return; |           return; | ||||||
|   | |||||||
							
								
								
									
										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. | ||||||
							
								
								
									
										388
									
								
								ares/ares_getnameinfo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										388
									
								
								ares/ares_getnameinfo.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,388 @@ | |||||||
|  | /* $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); | ||||||
|  | #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); | ||||||
|  |       callback(arg, ARES_SUCCESS, NULL, service); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   /* They want a host lookup */ | ||||||
|  |   if ((flags & ARES_NI_LOOKUPHOST)) | ||||||
|  |     { | ||||||
|  |      /* A numeric host can be handled without DNS */ | ||||||
|  |      if ((flags & ARES_NI_NUMERICHOST)) | ||||||
|  |       { | ||||||
|  |         unsigned int port = 0; | ||||||
|  |         char ipbuf[IPBUFSIZ]; | ||||||
|  |         char srvbuf[32]; | ||||||
|  |         char *service = NULL; | ||||||
|  |         ipbuf[0] = 0; | ||||||
|  |  | ||||||
|  |         /* Specifying not to lookup a host, but then saying a host | ||||||
|  |          * is required has to be illegal. | ||||||
|  |          */ | ||||||
|  |         if (flags & ARES_NI_NAMEREQD) | ||||||
|  |           { | ||||||
|  |             callback(arg, ARES_EBADFLAGS, NULL, NULL); | ||||||
|  |             return; | ||||||
|  |           } | ||||||
|  |         if (salen == sizeof(struct sockaddr_in6)) | ||||||
|  |           { | ||||||
|  |             ares_inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, IPBUFSIZ); | ||||||
|  |             port = addr6->sin6_port; | ||||||
|  |             /* If the system supports scope IDs, use it */ | ||||||
|  | #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||||
|  |             append_scopeid(addr6, flags, ipbuf, 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); | ||||||
|  |         callback(arg, ARES_SUCCESS, ipbuf, service); | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |     /* This is where a DNS lookup becomes necessary */ | ||||||
|  |     else | ||||||
|  |       { | ||||||
|  |         niquery = malloc(sizeof(struct nameinfo_query)); | ||||||
|  |         if (!niquery) | ||||||
|  |           { | ||||||
|  |             callback(arg, ARES_ENOMEM, NULL, NULL); | ||||||
|  |             return; | ||||||
|  |           } | ||||||
|  |         niquery->callback = callback; | ||||||
|  |         niquery->arg = arg; | ||||||
|  |         niquery->flags = flags; | ||||||
|  |         if (sa->sa_family == AF_INET) | ||||||
|  |           { | ||||||
|  |             niquery->family = AF_INET; | ||||||
|  |             memcpy(&niquery->addr.addr4, addr, sizeof(addr)); | ||||||
|  |             ares_gethostbyaddr(channel, &addr->sin_addr, sizeof(struct in_addr), AF_INET, | ||||||
|  |                                nameinfo_callback, niquery); | ||||||
|  |           } | ||||||
|  |         else | ||||||
|  |           { | ||||||
|  |             niquery->family = AF_INET6; | ||||||
|  |             memcpy(&niquery->addr.addr6, addr6, sizeof(addr6)); | ||||||
|  |             ares_gethostbyaddr(channel, &addr6->sin6_addr, sizeof(struct in6_addr), AF_INET6, | ||||||
|  |                                nameinfo_callback, niquery); | ||||||
|  |           } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void nameinfo_callback(void *arg, int status, struct hostent *host) | ||||||
|  | { | ||||||
|  |   struct nameinfo_query *niquery = (struct nameinfo_query *) arg; | ||||||
|  |   char srvbuf[33]; | ||||||
|  |   char *service = NULL; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   if (status == ARES_SUCCESS) | ||||||
|  |     { | ||||||
|  |       /* They want a service too */ | ||||||
|  |       if (niquery->flags & ARES_NI_LOOKUPSERVICE) | ||||||
|  |         { | ||||||
|  |           if (niquery->family == AF_INET) | ||||||
|  |             service = lookup_service(niquery->addr.addr4.sin_port, | ||||||
|  |                                      niquery->flags, srvbuf); | ||||||
|  |           else | ||||||
|  |             service = lookup_service(niquery->addr.addr6.sin6_port, | ||||||
|  |                                      niquery->flags, srvbuf); | ||||||
|  |         } | ||||||
|  |       /* NOFQDN means we have to strip off the domain name portion. | ||||||
|  |          We do this by determining our own domain name, then searching the string | ||||||
|  |          for this domain name and removing it. | ||||||
|  |        */ | ||||||
|  |       if (niquery->flags & ARES_NI_NOFQDN) | ||||||
|  |         { | ||||||
|  |            char buf[255]; | ||||||
|  |            char *domain; | ||||||
|  |            gethostname(buf, 255); | ||||||
|  |            if ((domain = strchr(buf, '.'))) | ||||||
|  |              { | ||||||
|  |                char *end = ares_striendstr(host->h_name, domain); | ||||||
|  |                if (end) | ||||||
|  |                  *end = 0; | ||||||
|  |              } | ||||||
|  |         } | ||||||
|  |       niquery->callback(niquery->arg, ARES_SUCCESS, host->h_name, service); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |   /* We couldn't find the host, but it's OK, we can use the IP */ | ||||||
|  |   else if (status == ARES_ENOTFOUND && !(niquery->flags & ARES_NI_NAMEREQD)) | ||||||
|  |     { | ||||||
|  |       char ipbuf[IPBUFSIZ]; | ||||||
|  |       if (niquery->family == AF_INET) | ||||||
|  |         ares_inet_ntop(AF_INET, &niquery->addr.addr4.sin_addr, ipbuf, IPBUFSIZ); | ||||||
|  |       else | ||||||
|  |         { | ||||||
|  |           ares_inet_ntop(AF_INET6, &niquery->addr.addr6.sin6_addr, ipbuf, IPBUFSIZ); | ||||||
|  | #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||||
|  |           append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf, 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); | ||||||
|  |           else | ||||||
|  |             service = lookup_service(niquery->addr.addr6.sin6_port, | ||||||
|  |                                      niquery->flags, srvbuf); | ||||||
|  |         } | ||||||
|  |       niquery->callback(niquery->arg, ARES_SUCCESS, ipbuf, service); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |   niquery->callback(niquery->arg, status, NULL, NULL); | ||||||
|  |   free(niquery); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static char *lookup_service(unsigned short port, int flags, | ||||||
|  |                             char *buf) /* 33 bytes buffer */ | ||||||
|  | { | ||||||
|  |   if (port) | ||||||
|  |     { | ||||||
|  |       /* Just return the port as a string */ | ||||||
|  |       if (flags & ARES_NI_NUMERICSERV) | ||||||
|  |         sprintf(buf, "%u", ntohs(port)); | ||||||
|  |       else | ||||||
|  |         { | ||||||
|  |           struct servent *se; | ||||||
|  |           const char *proto; | ||||||
|  | #ifdef HAVE_GETSERVBYPORT_R | ||||||
|  | #if GETSERVBYPORT_R_ARGS == 6 | ||||||
|  |           struct servent ret; | ||||||
|  |           char buf[4096]; | ||||||
|  |           int len = 4096; | ||||||
|  | #elif GETSERVBYPORT_R_ARGS == 5 | ||||||
|  |           char buf[4096]; | ||||||
|  |           int len = 4096; | ||||||
|  | #elif GETSERVBYPORT_R_ARGS == 4 | ||||||
|  |           struct servent ret; | ||||||
|  |           struct servent_data sed; | ||||||
|  | #endif | ||||||
|  | #endif /* HAVE_GETSERVBYPORT_R */ | ||||||
|  |           if (flags & ARES_NI_UDP) | ||||||
|  |             proto = "udp"; | ||||||
|  |           else if (flags & ARES_NI_SCTP) | ||||||
|  |             proto = "sctp"; | ||||||
|  |           else if (flags & ARES_NI_DCCP) | ||||||
|  |             proto = "dccp"; | ||||||
|  |           else | ||||||
|  |             proto = "tcp"; | ||||||
|  | #ifdef HAVE_GETSERVBYPORT_R | ||||||
|  | #if GETSERVBYPORT_R_ARGS == 6 | ||||||
|  |           se = &ret; | ||||||
|  |           if (getservbyport_r(port, proto, se, buf, len, &ret)) | ||||||
|  |             se = NULL; | ||||||
|  | #elif GETSERVBYPORT_R_ARGS == 5 | ||||||
|  |           se = getservbyport_r(port, proto, se, buf, len); | ||||||
|  | #elif GETSERVBYPORT_R_ARGS == 4 | ||||||
|  |           se = &ret; | ||||||
|  |           if (getservbyport_r(port, proto, se, &sed) == -1) | ||||||
|  |             se = NULL; | ||||||
|  | #else | ||||||
|  |           /* Lets just hope the OS uses TLS! */ | ||||||
|  |           se = getservbyport(port, proto); | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  |           /* Lets just hope the OS uses TLS! */ | ||||||
|  |           se = getservbyport(port, proto); | ||||||
|  | #endif | ||||||
|  |           if (se && se->s_name) { | ||||||
|  |             size_t len = strlen(se->s_name); | ||||||
|  |             if(len < 33) { | ||||||
|  |               strcpy(buf, se->s_name); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |               /* too big name to fit the buffer */ | ||||||
|  |               buf[0]=0; | ||||||
|  |           } | ||||||
|  |           else | ||||||
|  |             sprintf(buf, "%u", ntohs(port)); | ||||||
|  |         } | ||||||
|  |       return buf; | ||||||
|  |     } | ||||||
|  |   return NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||||
|  | static 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; | ||||||
|  | } | ||||||
| @@ -327,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); | ||||||
| @@ -339,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); | ||||||
| @@ -858,7 +860,8 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | |||||||
|         ipbufpfx[0] = 0; |         ipbufpfx[0] = 0; | ||||||
|       /* Lets see if it is CIDR */ |       /* Lets see if it is CIDR */ | ||||||
|       /* First we'll try IPv6 */ |       /* First we'll try IPv6 */ | ||||||
|       if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf, &pat.addr.addr6,  |       if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf, | ||||||
|  |                                      &pat.addr.addr6, | ||||||
|                                      sizeof(pat.addr.addr6))) > 0) |                                      sizeof(pat.addr.addr6))) > 0) | ||||||
|         { |         { | ||||||
|           pat.type = PATTERN_CIDR; |           pat.type = PATTERN_CIDR; | ||||||
| @@ -890,7 +893,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | |||||||
|           else |           else | ||||||
|             natural_mask(&pat); |             natural_mask(&pat); | ||||||
|           pat.family = AF_INET; |           pat.family = AF_INET; | ||||||
| 	  pat.type = PATTERN_MASK; |           pat.type = PATTERN_MASK; | ||||||
|           if (!sortlist_alloc(sortlist, nsort, &pat)) |           if (!sortlist_alloc(sortlist, nsort, &pat)) | ||||||
|             return ARES_ENOMEM; |             return ARES_ENOMEM; | ||||||
|         } |         } | ||||||
| @@ -1011,7 +1014,8 @@ static const char *try_option(const char *p, const char *q, const char *opt) | |||||||
| } | } | ||||||
|  |  | ||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
| static int sortlist_alloc(struct apattern **sortlist, int *nsort, struct apattern *pat) | static int sortlist_alloc(struct apattern **sortlist, int *nsort, | ||||||
|  |                           struct apattern *pat) | ||||||
| { | { | ||||||
|   struct apattern *newsort; |   struct apattern *newsort; | ||||||
|   newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); |   newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); | ||||||
|   | |||||||
| @@ -28,6 +28,31 @@ struct in6_addr | |||||||
| }; | }; | ||||||
| #endif | #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 | #ifndef NS_IN6ADDRSZ | ||||||
| #if SIZEOF_STRUCT_IN6_ADDR == 0 | #if SIZEOF_STRUCT_IN6_ADDR == 0 | ||||||
| /* We cannot have it set to zero, so we pick a fixed value here */ | /* We cannot have it set to zero, so we pick a fixed value here */ | ||||||
| @@ -45,4 +70,12 @@ struct in6_addr | |||||||
| #define NS_INT16SZ 2 | #define NS_INT16SZ 2 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifndef IF_NAMESIZE | ||||||
|  | #ifdef IFNAMSIZ | ||||||
|  | #define IF_NAMESIZE IFNAMSIZ | ||||||
|  | #else | ||||||
|  | #define IF_NAMESIZE 256 | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #endif /* ARES_IPV6_H */ | #endif /* ARES_IPV6_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 | ||||||
|   | |||||||
| @@ -33,6 +33,12 @@ | |||||||
| #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 | #endif | ||||||
|  |  | ||||||
| #include <string.h> | #include <string.h> | ||||||
| @@ -45,6 +51,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 | ||||||
| @@ -153,7 +164,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) | ||||||
|             { |             { | ||||||
| @@ -201,8 +213,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); | ||||||
| @@ -227,7 +239,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) | ||||||
|             { |             { | ||||||
| @@ -269,7 +281,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); | ||||||
|  |  | ||||||
| @@ -454,7 +466,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); | ||||||
| @@ -466,13 +479,76 @@ 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) | ||||||
| { | { | ||||||
| #if defined(WIN32) |  | ||||||
|   u_long flags; |  | ||||||
| #else |  | ||||||
|   int flags; |  | ||||||
| #endif |  | ||||||
|   ares_socket_t s; |   ares_socket_t s; | ||||||
|   struct sockaddr_in sockin; |   struct sockaddr_in sockin; | ||||||
|  |  | ||||||
| @@ -482,25 +558,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)); | ||||||
| @@ -531,6 +589,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; | ||||||
|   | |||||||
| @@ -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))); | ||||||
|   | |||||||
							
								
								
									
										35
									
								
								ares/config-win32.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								ares/config-win32.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | /* $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. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef __CONFIG_WIN32_H | ||||||
|  | #define __CONFIG_WIN32_H | ||||||
|  |  | ||||||
|  | #if defined(__MINGW32__) | ||||||
|  | #define HAVE_GETOPT_H | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(__MINGW32__) || defined(__WATCOMC__) | ||||||
|  | #define HAVE_UNISTD_H | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define HAVE_AF_INET6 | ||||||
|  | #define HAVE_PF_INET6 | ||||||
|  | #define HAVE_IOCTLSOCKET | ||||||
|  | #define HAVE_STRUCT_IN6_ADDR | ||||||
|  | #define HAVE_STRUCT_SOCKADDR_IN6 | ||||||
|  | #define HAVE_STRUCT_ADDRINFO | ||||||
|  | #define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||||
|  |  | ||||||
|  | #endif  /* __CONFIG_WIN32_H */ | ||||||
| @@ -65,8 +65,12 @@ AC_CHECK_HEADERS( | |||||||
|        sys/time.h \ |        sys/time.h \ | ||||||
|        sys/select.h \ |        sys/select.h \ | ||||||
|        sys/socket.h \ |        sys/socket.h \ | ||||||
|        winsock.h \ |        sys/ioctl.h \ | ||||||
|  |        netdb.h \ | ||||||
|  |        winsock2.h \ | ||||||
|  |        ws2tcpip.h \ | ||||||
|        netinet/in.h \ |        netinet/in.h \ | ||||||
|  |        net/if.h \ | ||||||
|        arpa/nameser.h \ |        arpa/nameser.h \ | ||||||
|        arpa/nameser_compat.h \ |        arpa/nameser_compat.h \ | ||||||
|        arpa/inet.h, , , |        arpa/inet.h, , , | ||||||
| @@ -80,9 +84,31 @@ dnl (and others?) is not designed to allow this. | |||||||
| #ifdef HAVE_ARPA_NAMESER_H | #ifdef HAVE_ARPA_NAMESER_H | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
| #endif | #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_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #endif | ||||||
| ] | ] | ||||||
|   ) |   ) | ||||||
|  |  | ||||||
|  | AC_CHECK_TYPE(socklen_t, , | ||||||
|  |    AC_DEFINE(socklen_t, int, [the length of a socket address]),  | ||||||
|  |    [ | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #endif | ||||||
|  |    ]) | ||||||
|  |  | ||||||
| dnl check for AF_INET6 | dnl check for AF_INET6 | ||||||
| CARES_CHECK_CONSTANT( | CARES_CHECK_CONSTANT( | ||||||
|   [ |   [ | ||||||
| @@ -92,8 +118,8 @@ CARES_CHECK_CONSTANT( | |||||||
| #ifdef HAVE_SYS_SOCKET_H | #ifdef HAVE_SYS_SOCKET_H | ||||||
| #include <sys/socket.h> | #include <sys/socket.h> | ||||||
| #endif | #endif | ||||||
| #ifdef HAVE_WINSOCK_H | #ifdef HAVE_WINSOCK2_H | ||||||
| #include <winsock.h> | #include <winsock2.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   ], [PF_INET6],  |   ], [PF_INET6],  | ||||||
| @@ -109,8 +135,8 @@ CARES_CHECK_CONSTANT( | |||||||
| #ifdef HAVE_SYS_SOCKET_H | #ifdef HAVE_SYS_SOCKET_H | ||||||
| #include <sys/socket.h> | #include <sys/socket.h> | ||||||
| #endif | #endif | ||||||
| #ifdef HAVE_WINSOCK_H | #ifdef HAVE_WINSOCK2_H | ||||||
| #include <winsock.h> | #include <winsock2.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   ], [AF_INET6],  |   ], [AF_INET6],  | ||||||
| @@ -124,8 +150,11 @@ CARES_CHECK_STRUCT( | |||||||
| #ifdef HAVE_SYS_TYPES_H | #ifdef HAVE_SYS_TYPES_H | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #endif | #endif | ||||||
| #ifdef HAVE_WINSOCK_H | #ifdef HAVE_WINSOCK2_H | ||||||
| #include <winsock.h> | #include <winsock2.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
| #endif | #endif | ||||||
| #ifdef HAVE_NETINET_IN_H | #ifdef HAVE_NETINET_IN_H | ||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| @@ -134,6 +163,71 @@ CARES_CHECK_STRUCT( | |||||||
|      AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.]) |      AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.]) | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | dnl check for the sockaddr_in6 structure | ||||||
|  | CARES_CHECK_STRUCT( | ||||||
|  |   [ | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  |   ], [sockaddr_in6],  | ||||||
|  |      AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1, | ||||||
|  |        [Define to 1 if you have struct sockaddr_in6.]) ac_have_sockaddr_in6=yes | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | AC_CHECK_MEMBER(struct sockaddr_in6.sin6_scope_id, | ||||||
|  |     AC_DEFINE_UNQUOTED(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID,1, | ||||||
|  |       [Define to 1 if your struct sockaddr_in6 has sin6_scope_id.]) | ||||||
|  |    , , | ||||||
|  |   [ | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_WINSOCK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  |   ]) | ||||||
|  |  | ||||||
|  | dnl check for the addrinfo structure | ||||||
|  | AC_CHECK_MEMBER(struct addrinfo.ai_flags, | ||||||
|  |      AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1, | ||||||
|  |        [Define to 1 if you have struct addrinfo.]),, | ||||||
|  |   [ | ||||||
|  | #ifdef HAVE_SYS_TYPES_H | ||||||
|  | #include <sys/types.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_WINSOCaK2_H | ||||||
|  | #include <winsock2.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_WS2TCPIP_H | ||||||
|  | #include <ws2tcpip.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETINET_IN_H | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_SYS_SOCKET_H | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #endif | ||||||
|  | #ifdef HAVE_NETDB_H | ||||||
|  | #include <netdb.h> | ||||||
|  | #endif | ||||||
|  |   ] | ||||||
|  | ) | ||||||
|  |  | ||||||
| dnl check for inet_pton | dnl check for inet_pton | ||||||
| AC_CHECK_FUNCS(inet_pton) | AC_CHECK_FUNCS(inet_pton) | ||||||
| dnl Some systems have it, but not IPv6 | dnl Some systems have it, but not IPv6 | ||||||
| @@ -268,7 +362,17 @@ AC_CHECK_SIZEOF(struct in_addr, , | |||||||
| ] | ] | ||||||
| ) | ) | ||||||
|  |  | ||||||
| AC_CHECK_FUNCS(bitncmp) | AC_CHECK_FUNCS([bitncmp if_indextoname]) | ||||||
|  |  | ||||||
|  | dnl God bless non-standardized functions! We need to see which getservbyport_r variant is available | ||||||
|  | CARES_CHECK_GETSERVBYPORT_R | ||||||
|  |  | ||||||
|  | CURL_CHECK_NONBLOCKING_SOCKET | ||||||
|  |  | ||||||
|  | AC_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) | ||||||
|   | |||||||
							
								
								
									
										232
									
								
								ares/inet_ntop.c
									
									
									
									
									
								
							
							
						
						
									
										232
									
								
								ares/inet_ntop.c
									
									
									
									
									
								
							| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright (c) 1996 by Internet Software Consortium. | /* Copyright (c) 1996 by Internet Software Consortium. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this software for any |  * Permission to use, copy, modify, and distribute this software for any | ||||||
| @@ -63,144 +65,156 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size); | |||||||
|  |  | ||||||
| /* char * | /* char * | ||||||
|  * inet_ntop(af, src, dst, size) |  * inet_ntop(af, src, dst, size) | ||||||
|  *	convert a network format address to presentation format. |  *     convert a network format address to presentation format. | ||||||
|  * return: |  * return: | ||||||
|  *	pointer to presentation format address (`dst'), or NULL (see errno). |  *     pointer to presentation format address (`dst'), or NULL (see errno). | ||||||
|  * author: |  * author: | ||||||
|  *	Paul Vixie, 1996. |  *     Paul Vixie, 1996. | ||||||
|  */ |  */ | ||||||
| const char * | const char * | ||||||
| ares_inet_ntop(int af, const void *src, char *dst, size_t size) | ares_inet_ntop(int af, const void *src, char *dst, size_t size) | ||||||
| { | { | ||||||
|  |   switch (af) | ||||||
| 	switch (af) { |     { | ||||||
| 	case AF_INET: |     case AF_INET: | ||||||
| 		return (inet_ntop4(src, dst, size)); |       return (inet_ntop4(src, dst, size)); | ||||||
| 	case AF_INET6: |     case AF_INET6: | ||||||
| 		return (inet_ntop6(src, dst, size)); |       return (inet_ntop6(src, dst, size)); | ||||||
| 	default: |     default: | ||||||
| 		errno = EAFNOSUPPORT; |       errno = EAFNOSUPPORT; | ||||||
| 		return (NULL); |       return (NULL); | ||||||
| 	} |     } | ||||||
| 	/* NOTREACHED */ |   /* NOTREACHED */ | ||||||
| } | } | ||||||
|  |  | ||||||
| /* const char * | /* const char * | ||||||
|  * inet_ntop4(src, dst, size) |  * inet_ntop4(src, dst, size) | ||||||
|  *	format an IPv4 address, more or less like inet_ntoa() |  *     format an IPv4 address, more or less like inet_ntoa() | ||||||
|  * return: |  * return: | ||||||
|  *	`dst' (as a const) |  *     `dst' (as a const) | ||||||
|  * notes: |  * notes: | ||||||
|  *	(1) uses no statics |  *     (1) uses no statics | ||||||
|  *	(2) takes a unsigned char* not an in_addr as input |  *     (2) takes a unsigned char* not an in_addr as input | ||||||
|  * author: |  * author: | ||||||
|  *	Paul Vixie, 1996. |  *     Paul Vixie, 1996. | ||||||
|  */ |  */ | ||||||
| static const char * | static const char * | ||||||
| inet_ntop4(const unsigned char *src, char *dst, size_t size) | inet_ntop4(const unsigned char *src, char *dst, size_t size) | ||||||
| { | { | ||||||
| 	static const char fmt[] = "%u.%u.%u.%u"; |   static const char fmt[] = "%u.%u.%u.%u"; | ||||||
| 	char tmp[sizeof "255.255.255.255"]; |   char tmp[sizeof "255.255.255.255"]; | ||||||
|  |  | ||||||
| 	if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) { |   if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) | ||||||
| 		errno = ENOSPC; |     { | ||||||
| 		return (NULL); |       errno = ENOSPC; | ||||||
| 	} |       return (NULL); | ||||||
| 	strcpy(dst, tmp); |     } | ||||||
| 	return (dst); |     strcpy(dst, tmp); | ||||||
|  |     return (dst); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* const char * | /* const char * | ||||||
|  * inet_ntop6(src, dst, size) |  * inet_ntop6(src, dst, size) | ||||||
|  *	convert IPv6 binary address into presentation (printable) format |  *    convert IPv6 binary address into presentation (printable) format | ||||||
|  * author: |  * author: | ||||||
|  *	Paul Vixie, 1996. |  *    Paul Vixie, 1996. | ||||||
|  */ |  */ | ||||||
| static const char * | static const char * | ||||||
| inet_ntop6(const unsigned char *src, char *dst, size_t size) | 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 |    * 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 |    * 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. |    * 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 |    * Keep this in mind if you think this function should have been coded | ||||||
| 	 * to use pointer overlays.  All the world's not a VAX. |    * 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; |   char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; | ||||||
| 	struct { int base, len; } best, cur; |   struct { int base, len; } best = { 0,0 }, cur = { 0,0 }; | ||||||
| 	unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; |   unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; | ||||||
| 	int i; |   int i; | ||||||
|  |  | ||||||
| 	/* |   /* | ||||||
| 	 * Preprocess: |    * Preprocess: | ||||||
| 	 *	Copy the input (bytewise) array into a wordwise array. |    *  Copy the input (bytewise) array into a wordwise array. | ||||||
| 	 *	Find the longest run of 0x00's in src[] for :: shorthanding. |    *  Find the longest run of 0x00's in src[] for :: shorthanding. | ||||||
| 	 */ |    */ | ||||||
| 	memset(words, '\0', sizeof words); |   memset(words, '\0', sizeof words); | ||||||
| 	for (i = 0; i < NS_IN6ADDRSZ; i++) |   for (i = 0; i < NS_IN6ADDRSZ; i++) | ||||||
| 		words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); |       words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); | ||||||
| 	best.base = -1; |   best.base = -1; | ||||||
| 	cur.base = -1; |   cur.base = -1; | ||||||
| 	for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { |   for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) | ||||||
| 		if (words[i] == 0) { |     { | ||||||
| 			if (cur.base == -1) |       if (words[i] == 0) | ||||||
| 				cur.base = i, cur.len = 1; |         { | ||||||
| 			else |           if (cur.base == -1) | ||||||
| 				cur.len++; |             cur.base = i, cur.len = 1; | ||||||
| 		} else { |           else | ||||||
| 			if (cur.base != -1) { |             cur.len++; | ||||||
| 				if (best.base == -1 || cur.len > best.len) |         } | ||||||
| 					best = cur; |       else | ||||||
| 				cur.base = -1; |         { | ||||||
| 			} |           if (cur.base != -1) | ||||||
| 		} |             { | ||||||
| 	} |               if (best.base == -1 || cur.len > best.len) | ||||||
| 	if (cur.base != -1) { |                 best = cur; | ||||||
| 		if (best.base == -1 || cur.len > best.len) |               cur.base = -1; | ||||||
| 			best = cur; |             } | ||||||
| 	} |         } | ||||||
| 	if (best.base != -1 && best.len < 2) |     } | ||||||
| 		best.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. |    * Format the result. | ||||||
| 	 */ |    */ | ||||||
| 	tp = tmp; |   tp = tmp; | ||||||
| 	for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { |   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 && |       /* Are we inside the best run of 0x00's? */ | ||||||
| 		    i < (best.base + best.len)) { |       if (best.base != -1 && i >= best.base && | ||||||
| 			if (i == best.base) |           i < (best.base + best.len)) | ||||||
| 				*tp++ = ':'; |         { | ||||||
| 			continue; |           if (i == best.base) | ||||||
| 		} |              *tp++ = ':'; | ||||||
| 		/* Are we following an initial run of 0x00s or any real hex? */ |           continue; | ||||||
| 		if (i != 0) |         } | ||||||
| 			*tp++ = ':'; |       /* Are we following an initial run of 0x00s or any real hex? */ | ||||||
| 		/* Is this address an encapsulated IPv4? */ |       if (i != 0) | ||||||
| 		if (i == 6 && best.base == 0 && |         *tp++ = ':'; | ||||||
| 		    (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { |       /* Is this address an encapsulated IPv4? */ | ||||||
| 			if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) |       if (i == 6 && best.base == 0 && | ||||||
| 				return (NULL); |           (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) | ||||||
| 			tp += strlen(tp); |         { | ||||||
| 			break; |           if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) | ||||||
| 		} |             return (NULL); | ||||||
| 		tp += SPRINTF((tp, "%x", words[i])); |           tp += strlen(tp); | ||||||
| 	} |           break; | ||||||
| 	/* Was it a trailing run of 0x00's? */ |         } | ||||||
| 	if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) |         tp += SPRINTF((tp, "%x", words[i])); | ||||||
| 		*tp++ = ':'; |     } | ||||||
| 	*tp++ = '\0'; |  | ||||||
|  |  | ||||||
| 	/* |   /* Was it a trailing run of 0x00's? */ | ||||||
| 	 * Check for overflow, copy, and we're done. |   if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) | ||||||
| 	 */ |     *tp++ = ':'; | ||||||
| 	if ((size_t)(tp - tmp) > size) { |   *tp++ = '\0'; | ||||||
| 		errno = ENOSPC; |  | ||||||
| 		return (NULL); |   /* | ||||||
| 	} |    * Check for overflow, copy, and we're done. | ||||||
| 	strcpy(dst, tmp); |    */ | ||||||
| 	return (dst); |   if ((size_t)(tp - tmp) > size) | ||||||
|  |     { | ||||||
|  |       errno = ENOSPC; | ||||||
|  |       return (NULL); | ||||||
|  |     } | ||||||
|  |   strcpy(dst, tmp); | ||||||
|  |   return (dst); | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| #ifndef ARES_NAMESER_H | #ifndef ARES_NAMESER_H | ||||||
| #define ARES_NAMESER_H | #define ARES_NAMESER_H | ||||||
|  |  | ||||||
| @@ -16,7 +18,7 @@ | |||||||
|  |  | ||||||
| #define EINPROGRESS WSAEINPROGRESS | #define EINPROGRESS WSAEINPROGRESS | ||||||
| #define EWOULDBLOCK WSAEWOULDBLOCK | #define EWOULDBLOCK WSAEWOULDBLOCK | ||||||
| #define EMSGSIZE WSAEMSGSIZE | #define EMSGSIZE     WSAEMSGSIZE | ||||||
| #define EAFNOSUPPORT WSAEAFNOSUPPORT | #define EAFNOSUPPORT WSAEAFNOSUPPORT | ||||||
|  |  | ||||||
| /* Structure for scatter/gather I/O.  */ | /* Structure for scatter/gather I/O.  */ | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								ares/setup.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								ares/setup.h
									
									
									
									
									
								
							| @@ -17,9 +17,19 @@ | |||||||
| #ifdef HAVE_CONFIG_H | #ifdef HAVE_CONFIG_H | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #else | #else | ||||||
|  |  | ||||||
|  | #ifdef WIN32 | ||||||
|  | #include "config-win32.h" | ||||||
|  | #endif | ||||||
|  |  | ||||||
| /* simple work-around for now, for systems without configure support */ | /* simple work-around for now, for systems without configure support */ | ||||||
|  | #ifndef __DJGPP__ | ||||||
| #define ssize_t int | #define ssize_t int | ||||||
| #endif | #endif | ||||||
|  | #ifndef _MSC_VER | ||||||
|  | #define socklen_t int | ||||||
|  | #endif | ||||||
|  | #endif  /* HAVE_CONFIG_H */ | ||||||
|  |  | ||||||
| /* Recent autoconf versions define these symbols in config.h. We don't want | /* Recent autoconf versions define these symbols in config.h. We don't want | ||||||
|    them (since they collide with the libcurl ones when we build |    them (since they collide with the libcurl ones when we build | ||||||
| @@ -34,7 +44,8 @@ | |||||||
|  |  | ||||||
| /* now typedef our socket type */ | /* now typedef our socket type */ | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include <winsock.h> | #include <winsock2.h> | ||||||
|  | #include <ws2tcpip.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 | ||||||
| @@ -57,7 +68,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); | ||||||
|   | |||||||
| @@ -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 "..\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"  |  | ||||||
|    cd "..\adig" |  | ||||||
|  |  | ||||||
| "areslib - Win32 ReleaseCLEAN" :  |  | ||||||
|    cd "..\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN  |  | ||||||
|    cd "..\adig" |  | ||||||
|  |  | ||||||
| !ELSEIF  "$(CFG)" == "adig - Win32 Debug" |  | ||||||
|  |  | ||||||
| "areslib - Win32 Debug" :  |  | ||||||
|    cd "..\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"  |  | ||||||
|    cd "..\adig" |  | ||||||
|  |  | ||||||
| "areslib - Win32 DebugCLEAN" :  |  | ||||||
|    cd "..\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 "..\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"  |  | ||||||
|    cd "..\ahost" |  | ||||||
|  |  | ||||||
| "areslib - Win32 ReleaseCLEAN" :  |  | ||||||
|    cd "..\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN  |  | ||||||
|    cd "..\ahost" |  | ||||||
|  |  | ||||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" |  | ||||||
|  |  | ||||||
| "areslib - Win32 Debug" :  |  | ||||||
|    cd "..\areslib" |  | ||||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"  |  | ||||||
|    cd "..\ahost" |  | ||||||
|  |  | ||||||
| "areslib - Win32 DebugCLEAN" :  |  | ||||||
|    cd "..\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> |  | ||||||
							
								
								
									
										20
									
								
								buildconf
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								buildconf
									
									
									
									
									
								
							| @@ -13,7 +13,7 @@ findtool(){ | |||||||
|   IFS=":" |   IFS=":" | ||||||
|   for path in $PATH |   for path in $PATH | ||||||
|   do |   do | ||||||
|     if test -r "$path/$file"; then |     if test -f "$path/$file"; then | ||||||
|       echo "$path/$file" |       echo "$path/$file" | ||||||
|       return |       return | ||||||
|     fi |     fi | ||||||
| @@ -24,7 +24,7 @@ findtool(){ | |||||||
| # autoconf 2.57 or newer | # autoconf 2.57 or newer | ||||||
| # | # | ||||||
| need_autoconf="2.57" | need_autoconf="2.57" | ||||||
| ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` | ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` | ||||||
| if test -z "$ac_version"; then | if test -z "$ac_version"; then | ||||||
|   echo "buildconf: autoconf not found." |   echo "buildconf: autoconf not found." | ||||||
|   echo "            You need autoconf version $need_autoconf or newer installed." |   echo "            You need autoconf version $need_autoconf or newer installed." | ||||||
| @@ -45,7 +45,7 @@ echo "buildconf: autoconf version $ac_version (ok)" | |||||||
| #-------------------------------------------------------------------------- | #-------------------------------------------------------------------------- | ||||||
| # autoheader 2.50 or newer | # autoheader 2.50 or newer | ||||||
| # | # | ||||||
| ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` | ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` | ||||||
| if test -z "$ah_version"; then | if test -z "$ah_version"; then | ||||||
|   echo "buildconf: autoheader not found." |   echo "buildconf: autoheader not found." | ||||||
|   echo "            You need autoheader version 2.50 or newer installed." |   echo "            You need autoheader version 2.50 or newer installed." | ||||||
| @@ -67,7 +67,7 @@ echo "buildconf: autoheader version $ah_version (ok)" | |||||||
| # automake 1.7 or newer | # automake 1.7 or newer | ||||||
| # | # | ||||||
| need_automake="1.7" | need_automake="1.7" | ||||||
| am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'` | am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -n 1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'` | ||||||
| if test -z "$am_version"; then | if test -z "$am_version"; then | ||||||
|   echo "buildconf: automake not found." |   echo "buildconf: automake not found." | ||||||
|   echo "            You need automake version $need_automake or newer installed." |   echo "            You need automake version $need_automake or newer installed." | ||||||
| @@ -113,7 +113,7 @@ fi | |||||||
| # set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found | # set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found | ||||||
| LIBTOOLIZE="${libtool}ize" | LIBTOOLIZE="${libtool}ize" | ||||||
|  |  | ||||||
| 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" | ||||||
| @@ -160,7 +160,7 @@ 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 | ||||||
| @@ -199,15 +199,17 @@ ${AUTOCONF:-autoconf}     || die "The autoconf command failed" | |||||||
|  |  | ||||||
| if test -d ares; then | if test -d ares; then | ||||||
|   cd ares |   cd ares | ||||||
|   echo "buildconf: running aclocal in the ares directory" |   echo "buildconf: running ares/libtoolize" | ||||||
|  | ${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed" | ||||||
|  |   echo "buildconf: running ares/aclocal" | ||||||
|   ${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed" |   ${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed" | ||||||
|   echo "buildconf: running autoconf in the ares directory" |   echo "buildconf: running ares/autoconf" | ||||||
|   ${AUTOCONF:-autoconf}     || die "The ares autoconf command failed" |   ${AUTOCONF:-autoconf}     || die "The ares autoconf command failed" | ||||||
|   cd .. |   cd .. | ||||||
| fi | fi | ||||||
|  |  | ||||||
| echo "buildconf: running automake" | echo "buildconf: running automake" | ||||||
| ${AUTOMAKE:-automake} -a  || die "The automake command failed" | ${AUTOMAKE:-automake} -a -c  || die "The automake command failed" | ||||||
|  |  | ||||||
| echo "buildconf: OK" | echo "buildconf: OK" | ||||||
| exit 0 | exit 0 | ||||||
|   | |||||||
							
								
								
									
										247
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										247
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -122,13 +122,13 @@ case $host in | |||||||
|   *-*-mingw*) |   *-*-mingw*) | ||||||
|     AC_DEFINE(BUILDING_LIBCURL, 1, [when building libcurl itself]) |     AC_DEFINE(BUILDING_LIBCURL, 1, [when building libcurl itself]) | ||||||
|     AC_MSG_RESULT(yes) |     AC_MSG_RESULT(yes) | ||||||
|  <EFBFBD> <20>AC_MSG_CHECKING([if we need CURL_STATICLIB]) |     AC_MSG_CHECKING([if we need CURL_STATICLIB]) | ||||||
|     if test "X$enable_shared" = "Xno" |     if test "X$enable_shared" = "Xno" | ||||||
|     then |     then | ||||||
|       AC_DEFINE(CURL_STATICLIB, 1, [when not building a shared library]) |       AC_DEFINE(CURL_STATICLIB, 1, [when not building a shared library]) | ||||||
|       AC_MSG_RESULT(yes) |       AC_MSG_RESULT(yes) | ||||||
|  <EFBFBD> <20>else |     else | ||||||
|  <EFBFBD> <20> <20>AC_MSG_RESULT(no) |       AC_MSG_RESULT(no) | ||||||
|     fi |     fi | ||||||
|     ;; |     ;; | ||||||
|   *) |   *) | ||||||
| @@ -251,6 +251,21 @@ AC_HELP_STRING([--disable-telnet],[Disable TELNET support]), | |||||||
|   esac ], |   esac ], | ||||||
|        AC_MSG_RESULT(yes) |        AC_MSG_RESULT(yes) | ||||||
| ) | ) | ||||||
|  | AC_MSG_CHECKING([whether to support tftp]) | ||||||
|  | AC_ARG_ENABLE(tftp, | ||||||
|  | AC_HELP_STRING([--enable-tftp],[Enable TFTP support]) | ||||||
|  | AC_HELP_STRING([--disable-tftp],[Disable TFTP support]), | ||||||
|  | [ case "$enableval" in | ||||||
|  |   no) | ||||||
|  |        AC_MSG_RESULT(no) | ||||||
|  |        AC_DEFINE(CURL_DISABLE_TFTP, 1, [to disable TFTP]) | ||||||
|  |        AC_SUBST(CURL_DISABLE_TFTP, [1]) | ||||||
|  |        ;; | ||||||
|  |   *)   AC_MSG_RESULT(yes) | ||||||
|  |        ;; | ||||||
|  |   esac ], | ||||||
|  |        AC_MSG_RESULT(yes) | ||||||
|  | ) | ||||||
|  |  | ||||||
| dnl ********************************************************************** | dnl ********************************************************************** | ||||||
| dnl Check for built-in manual | dnl Check for built-in manual | ||||||
| @@ -567,14 +582,15 @@ OPT_KRB4=off | |||||||
| AC_ARG_WITH(krb4,dnl | AC_ARG_WITH(krb4,dnl | ||||||
| AC_HELP_STRING([--with-krb4=DIR],[where to look for Kerberos4]),[ | AC_HELP_STRING([--with-krb4=DIR],[where to look for Kerberos4]),[ | ||||||
|   OPT_KRB4="$withval" |   OPT_KRB4="$withval" | ||||||
|   if test X"$OPT_KRB4" != Xyes |   if test X"$OPT_KRB4" != Xno; then | ||||||
|   then |     want_krb4="yes" | ||||||
|     LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib$libsuff" |     if test X"$OPT_KRB4" != Xyes; then | ||||||
|     KRB4LIB="$OPT_KRB4/lib$libsuff" |       LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib$libsuff" | ||||||
|     CPPFLAGS="$CPPFLAGS -I$OPT_KRB4/include" |       KRB4LIB="$OPT_KRB4/lib$libsuff" | ||||||
|     KRB4INC="$OPT_KRB4/include" |       CPPFLAGS="$CPPFLAGS -I$OPT_KRB4/include" | ||||||
|  |       KRB4INC="$OPT_KRB4/include" | ||||||
|  |     fi | ||||||
|   fi |   fi | ||||||
|   want_krb4="yes" |  | ||||||
|  ]) |  ]) | ||||||
|  |  | ||||||
| AC_MSG_CHECKING([if Kerberos4 support is requested]) | AC_MSG_CHECKING([if Kerberos4 support is requested]) | ||||||
| @@ -643,10 +659,13 @@ dnl ********************************************************************** | |||||||
|  |  | ||||||
| AC_ARG_WITH(spnego, | AC_ARG_WITH(spnego, | ||||||
|   AC_HELP_STRING([--with-spnego=DIR], |   AC_HELP_STRING([--with-spnego=DIR], | ||||||
|                  [Specify location of SPNEGO library fbopenssl]), |                  [Specify location of SPNEGO library fbopenssl]), [ | ||||||
|   [ SPNEGO_ROOT="$withval" |   SPNEGO_ROOT="$withval" | ||||||
|     want_spnego="yes" ] |   if test x"$SPNEGO_ROOT" != xno; then | ||||||
| ) |     want_spnego="yes" | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
| AC_MSG_CHECKING([if SPNEGO support is requested]) | AC_MSG_CHECKING([if SPNEGO support is requested]) | ||||||
| if test x"$want_spnego" = xyes; then | if test x"$want_spnego" = xyes; then | ||||||
|  |  | ||||||
| @@ -683,19 +702,24 @@ AC_ARG_WITH(gssapi-includes, | |||||||
| AC_ARG_WITH(gssapi-libs, | AC_ARG_WITH(gssapi-libs, | ||||||
|   AC_HELP_STRING([--with-gssapi-libs=DIR], |   AC_HELP_STRING([--with-gssapi-libs=DIR], | ||||||
|   		 [Specify location of GSSAPI libs]), |   		 [Specify location of GSSAPI libs]), | ||||||
|   [ GSSAPI_LIBS="-L$withval -lgssapi" |   [ GSSAPI_LIBS="-L$withval" | ||||||
|     want_gss="yes" ] |     want_gss="yes" ] | ||||||
| ) | ) | ||||||
|  |  | ||||||
| AC_ARG_WITH(gssapi, | AC_ARG_WITH(gssapi, | ||||||
|   AC_HELP_STRING([--with-gssapi=DIR], |   AC_HELP_STRING([--with-gssapi=DIR], | ||||||
|                  [Where to look for GSSAPI]), |                  [Where to look for GSSAPI]), [ | ||||||
|   [ GSSAPI_ROOT="$withval" |   GSSAPI_ROOT="$withval" | ||||||
|     want_gss="yes" ] |   if test x"$GSSAPI_ROOT" != xno; then | ||||||
| ) |     want_gss="yes"  | ||||||
|  |   fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  | save_CPPFLAGS="$CPPFLAGS" | ||||||
| AC_MSG_CHECKING([if GSSAPI support is requested]) | AC_MSG_CHECKING([if GSSAPI support is requested]) | ||||||
| if test x"$want_gss" = xyes; then | if test x"$want_gss" = xyes; then | ||||||
|  |   AC_MSG_RESULT(yes) | ||||||
|  |  | ||||||
|   if test -z "$GSSAPI_INCS"; then |   if test -z "$GSSAPI_INCS"; then | ||||||
|      if test -f "$GSSAPI_ROOT/bin/krb5-config"; then |      if test -f "$GSSAPI_ROOT/bin/krb5-config"; then | ||||||
|         GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi` |         GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi` | ||||||
| @@ -705,7 +729,48 @@ if test x"$want_gss" = xyes; then | |||||||
|   fi |   fi | ||||||
|   CPPFLAGS="$CPPFLAGS $GSSAPI_INCS" |   CPPFLAGS="$CPPFLAGS $GSSAPI_INCS" | ||||||
|  |  | ||||||
|   if test -z "$GSSAPI_LIB_DIR"; then |   AC_CHECK_HEADER(gss.h, | ||||||
|  |     [ | ||||||
|  |       dnl found in the given dirs | ||||||
|  |       AC_DEFINE(HAVE_GSSGNU, 1, [if you have the GNU gssapi libraries]) | ||||||
|  |       gnu_gss=yes | ||||||
|  |     ], | ||||||
|  |     [ | ||||||
|  |       dnl not found, check Heimdal | ||||||
|  |       AC_CHECK_HEADER(gssapi.h, | ||||||
|  |         [ | ||||||
|  |           dnl found in the given dirs | ||||||
|  |           AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries]) | ||||||
|  |         ], | ||||||
|  |         [ | ||||||
|  |           dnl not found, check in gssapi/ subdir  | ||||||
|  |           AC_CHECK_HEADER(gssapi/gssapi.h, | ||||||
|  |             [ | ||||||
|  |               dnl found  | ||||||
|  |               AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries]) | ||||||
|  |             ], | ||||||
|  |             [ | ||||||
|  |               dnl no header found, disabling GSS | ||||||
|  |               want_gss=no | ||||||
|  |               AC_MSG_WARN(disabling GSSAPI since no header files was found) | ||||||
|  |             ] | ||||||
|  |           ) | ||||||
|  |         ] | ||||||
|  |       )         | ||||||
|  |     ] | ||||||
|  |   ) | ||||||
|  | else | ||||||
|  |   AC_MSG_RESULT(no) | ||||||
|  | fi | ||||||
|  | if test x"$want_gss" = xyes; then | ||||||
|  |   AC_DEFINE(HAVE_GSSAPI, 1, [if you have the gssapi libraries]) | ||||||
|  |  | ||||||
|  |   curl_gss_msg="enabled (MIT/Heimdal)" | ||||||
|  |  | ||||||
|  |   if test -n "$gnu_gss"; then | ||||||
|  |     curl_gss_msg="enabled (GNU GSS)" | ||||||
|  |     LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR -lgss" | ||||||
|  |   elif test -z "$GSSAPI_LIB_DIR"; then | ||||||
|      if test -f "$GSSAPI_ROOT/bin/krb5-config"; then |      if test -f "$GSSAPI_ROOT/bin/krb5-config"; then | ||||||
|         gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi` |         gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi` | ||||||
| 	LDFLAGS="$LDFLAGS $gss_ldflags" | 	LDFLAGS="$LDFLAGS $gss_ldflags" | ||||||
| @@ -715,31 +780,10 @@ if test x"$want_gss" = xyes; then | |||||||
|         LDFLAGS="$LDFLAGS -lgssapi" |         LDFLAGS="$LDFLAGS -lgssapi" | ||||||
|      fi |      fi | ||||||
|   else |   else | ||||||
|      LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR" |      LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR -lgssapi" | ||||||
|   fi |   fi | ||||||
|  |  | ||||||
|   AC_MSG_RESULT(yes) |  | ||||||
|   AC_DEFINE(HAVE_GSSAPI, 1, [if you have the gssapi libraries]) |  | ||||||
|  |  | ||||||
|   curl_gss_msg="enabled" |  | ||||||
|  |  | ||||||
|   AC_CHECK_HEADER(gssapi.h, |  | ||||||
|     [ |  | ||||||
|        dnl found in the given dirs |  | ||||||
|       AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries]) |  | ||||||
|     ], |  | ||||||
|     [ |  | ||||||
|       dnl not found, check in gssapi/ subdir  |  | ||||||
|       AC_CHECK_HEADER(gssapi/gssapi.h, |  | ||||||
|         dnl found  |  | ||||||
|         AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries]) |  | ||||||
|       ) |  | ||||||
|        |  | ||||||
|     ] |  | ||||||
|   ) |  | ||||||
|  |  | ||||||
| else | else | ||||||
|   AC_MSG_RESULT(no) |   CPPFLAGS="$save_CPPFLAGS" | ||||||
| fi | fi | ||||||
|    |    | ||||||
| dnl ********************************************************************** | dnl ********************************************************************** | ||||||
| @@ -768,20 +812,24 @@ if test X"$OPT_SSL" != Xno; then | |||||||
|       dnl only do pkg-config magic when not cross-compiling |       dnl only do pkg-config magic when not cross-compiling | ||||||
|       PKGTEST="yes" |       PKGTEST="yes" | ||||||
|     fi |     fi | ||||||
|     EXTRA_SSL=/usr/local/ssl ;; |     PREFIX_OPENSSL=/usr/local/ssl | ||||||
|  |     LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff" | ||||||
|  |     ;; | ||||||
|   off) |   off) | ||||||
|     dnl no --with-ssl option given, just check default places |     dnl no --with-ssl option given, just check default places | ||||||
|     if test x$cross_compiling != xyes; then |     if test x$cross_compiling != xyes; then | ||||||
|       dnl only do pkg-config magic when not cross-compiling |       dnl only do pkg-config magic when not cross-compiling | ||||||
|       PKGTEST="yes" |       PKGTEST="yes" | ||||||
|     fi |     fi | ||||||
|     EXTRA_SSL= ;; |     PREFIX_OPENSSL= | ||||||
|  |     ;; | ||||||
|   *) |   *) | ||||||
|     dnl check the given --with-ssl spot |     dnl check the given --with-ssl spot | ||||||
|     PKGTEST="no" |     PKGTEST="no" | ||||||
|     EXTRA_SSL=$OPT_SSL |     PREFIX_OPENSSL=$OPT_SSL | ||||||
|     LDFLAGS="$LDFLAGS -L$EXTRA_SSL/lib$libsuff" |     LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff" | ||||||
|     CPPFLAGS="$CPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include" |     LDFLAGS="$LDFLAGS -L$LIB_OPENSSL" | ||||||
|  |     CPPFLAGS="$CPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include" | ||||||
|     ;; |     ;; | ||||||
|   esac |   esac | ||||||
|  |  | ||||||
| @@ -803,6 +851,8 @@ if test X"$OPT_SSL" != Xno; then | |||||||
|         SSL_LDFLAGS=`$PKGCONFIG --libs-only-L openssl 2>/dev/null` |         SSL_LDFLAGS=`$PKGCONFIG --libs-only-L openssl 2>/dev/null` | ||||||
|         SSL_CPPFLAGS=`$PKGCONFIG --cflags-only-I openssl 2>/dev/null` |         SSL_CPPFLAGS=`$PKGCONFIG --cflags-only-I openssl 2>/dev/null` | ||||||
|  |  | ||||||
|  | 	LIB_OPENSSL=`echo $SSL_LDFLAGS | sed -e 's/-L//g'` | ||||||
|  |  | ||||||
|         dnl use the values pkg-config reported |         dnl use the values pkg-config reported | ||||||
|         LIBS="$LIBS $SSL_LIBS" |         LIBS="$LIBS $SSL_LIBS" | ||||||
|         CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS" |         CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS" | ||||||
| @@ -832,8 +882,8 @@ if test X"$OPT_SSL" != Xno; then | |||||||
|      HAVECRYPTO="yes" |      HAVECRYPTO="yes" | ||||||
|      LIBS="-lcrypto $LIBS" |      LIBS="-lcrypto $LIBS" | ||||||
|      ],[ |      ],[ | ||||||
|      LDFLAGS="$CLEANLDFLAGS -L$EXTRA_SSL/lib$libsuff" |      LDFLAGS="$CLEANLDFLAGS -L$LIB_OPENSSL" | ||||||
|      CPPFLAGS="$CLEANCPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include" |      CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include" | ||||||
|      AC_CHECK_LIB(crypto, CRYPTO_add_lock,[ |      AC_CHECK_LIB(crypto, CRYPTO_add_lock,[ | ||||||
|        HAVECRYPTO="yes" |        HAVECRYPTO="yes" | ||||||
|        LIBS="-lcrypto $LIBS"], [ |        LIBS="-lcrypto $LIBS"], [ | ||||||
| @@ -918,11 +968,15 @@ if test X"$OPT_SSL" != Xno; then | |||||||
|   fi |   fi | ||||||
|  |  | ||||||
|   if test "$OPENSSL_ENABLED" = "1"; then |   if test "$OPENSSL_ENABLED" = "1"; then | ||||||
|     dnl when the ssl shared libs were found in a path that the run-time linker |     if test -n "$LIB_OPENSSL"; then | ||||||
|     dnl doesn't search through, we need to add it to LD_LIBRARY_PATH to |        dnl when the ssl shared libs were found in a path that the run-time | ||||||
|     dnl prevent further configure tests to fail due to this |        dnl linker doesn't search through, we need to add it to LD_LIBRARY_PATH | ||||||
|     LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$EXTRA_SSL/lib$libsuff" |        dnl to prevent further configure tests to fail due to this | ||||||
|     export LD_LIBRARY_PATH |  | ||||||
|  |        LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_OPENSSL" | ||||||
|  |        export LD_LIBRARY_PATH | ||||||
|  |        AC_MSG_NOTICE([Added $LIB_OPENSSL to LD_LIBRARY_PATH]) | ||||||
|  |     fi | ||||||
|   fi |   fi | ||||||
|  |  | ||||||
| fi | fi | ||||||
| @@ -964,7 +1018,7 @@ dnl FIX: only check for GnuTLS if OpenSSL is not enabled | |||||||
| dnl ---------------------------------------------------- | dnl ---------------------------------------------------- | ||||||
|  |  | ||||||
| dnl Default to compiler & linker defaults for GnuTLS files & libraries. | dnl Default to compiler & linker defaults for GnuTLS files & libraries. | ||||||
| OPT_GNUTLS=off | OPT_GNUTLS=no | ||||||
|  |  | ||||||
| AC_ARG_WITH(gnutls,dnl | AC_ARG_WITH(gnutls,dnl | ||||||
| AC_HELP_STRING([--with-gnutls=PATH],[where to look for GnuTLS, PATH points to the installation root (default: /usr/local/)]) | AC_HELP_STRING([--with-gnutls=PATH],[where to look for GnuTLS, PATH points to the installation root (default: /usr/local/)]) | ||||||
| @@ -973,7 +1027,7 @@ AC_HELP_STRING([--without-gnutls], [disable GnuTLS detection]), | |||||||
|  |  | ||||||
| if test "$OPENSSL_ENABLED" != "1"; then | if test "$OPENSSL_ENABLED" != "1"; then | ||||||
|  |  | ||||||
|   if test X"$OPT_GNUTLS" != Xoff; then |   if test X"$OPT_GNUTLS" != Xno; then | ||||||
|     if test "x$OPT_GNUTLS" = "xyes"; then |     if test "x$OPT_GNUTLS" = "xyes"; then | ||||||
|      check=`libgnutls-config --version 2>/dev/null` |      check=`libgnutls-config --version 2>/dev/null` | ||||||
|      if test -n "$check"; then |      if test -n "$check"; then | ||||||
| @@ -1023,6 +1077,7 @@ if test "$OPENSSL_ENABLED" != "1"; then | |||||||
|  |  | ||||||
|         LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$gtlsprefix/lib$libsuff" |         LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$gtlsprefix/lib$libsuff" | ||||||
|         export LD_LIBRARY_PATH |         export LD_LIBRARY_PATH | ||||||
|  |         AC_MSG_NOTICE([Added $gtlsprefix/lib$libsuff to LD_LIBRARY_PATH]) | ||||||
|       fi |       fi | ||||||
|  |  | ||||||
|     fi |     fi | ||||||
| @@ -1168,7 +1223,6 @@ case "$LIBIDN" in | |||||||
|        dnl if there is a given path, check that FIRST |        dnl if there is a given path, check that FIRST | ||||||
|        if test -n "$LIBIDN"; then |        if test -n "$LIBIDN"; then | ||||||
|          if test "x$LIBIDN" != "xyes"; then |          if test "x$LIBIDN" != "xyes"; then | ||||||
|             AC_MSG_WARN([moo moo $LIBIDN]) |  | ||||||
|             oldLDFLAGS=$LDFLAGS |             oldLDFLAGS=$LDFLAGS | ||||||
|             oldCPPFLAGS=$CPPFLAGS |             oldCPPFLAGS=$CPPFLAGS | ||||||
|             LDFLAGS="$LDFLAGS -L$LIBIDN/lib" |             LDFLAGS="$LDFLAGS -L$LIBIDN/lib" | ||||||
| @@ -1254,7 +1308,7 @@ else | |||||||
|   dnl is there a strerror_r() |   dnl is there a strerror_r() | ||||||
|   CURL_CHECK_STRERROR_R() |   CURL_CHECK_STRERROR_R() | ||||||
|  |  | ||||||
|   AC_CHECK_FUNCS( gmtime_r ) |   checkfor_gmtime_r="yes" | ||||||
| fi | fi | ||||||
|  |  | ||||||
| dnl for recent AIX versions, we skip all the thread-safe checks above since | dnl for recent AIX versions, we skip all the thread-safe checks above since | ||||||
| @@ -1290,7 +1344,47 @@ if test "x$RECENTAIX" = "xyes"; then | |||||||
|   dnl is there a strerror_r() |   dnl is there a strerror_r() | ||||||
|   CURL_CHECK_STRERROR_R() |   CURL_CHECK_STRERROR_R() | ||||||
|  |  | ||||||
|   AC_CHECK_FUNCS( gmtime_r ) |   checkfor_gmtime_r="yes" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | if test x$cross_compiling != xyes; then | ||||||
|  |  | ||||||
|  |   if test x$checkfor_gmtime_r = xyes; then | ||||||
|  |  | ||||||
|  |     dnl if gmtime_r was found, verify that it actuall works, as (at least) HPUX | ||||||
|  |     dnl 10.20 is known to have a buggy one. If it doesn't work, disable use of | ||||||
|  |     dnl it. | ||||||
|  |  | ||||||
|  |     AC_MSG_CHECKING([if gmtime_r exists and works]) | ||||||
|  |     AC_RUN_IFELSE([[ | ||||||
|  |     #include <time.h> | ||||||
|  |     int main(void) | ||||||
|  |     { | ||||||
|  |     time_t local = 1170352587; | ||||||
|  |     struct tm *gmt; | ||||||
|  |     struct tm keeper; | ||||||
|  |     putenv("TZ=CST6CDT"); | ||||||
|  |     tzset(); | ||||||
|  |     gmt = gmtime_r(&local, &keeper); | ||||||
|  |     if(gmt) { | ||||||
|  |       return 0; | ||||||
|  |     } | ||||||
|  |     return 1; /* failure */ | ||||||
|  |     } | ||||||
|  |      ]], | ||||||
|  |      dnl success, do nothing | ||||||
|  |      AC_MSG_RESULT(yes) | ||||||
|  |      AC_DEFINE(HAVE_GMTIME_R, 1, [if you have (a working) gmtime_r]) | ||||||
|  |      , | ||||||
|  |      dnl failure, now disable the function | ||||||
|  |      AC_MSG_RESULT(no) | ||||||
|  |     , | ||||||
|  |     dnl not invoked when crosscompiling) | ||||||
|  |     ]) | ||||||
|  |   fi | ||||||
|  | else | ||||||
|  |   dnl and for crosscompilings | ||||||
|  |   AC_CHECK_FUNCS(gmtime_r) | ||||||
| fi | fi | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1340,6 +1434,8 @@ AC_CHECK_HEADERS( | |||||||
|         libgen.h \ |         libgen.h \ | ||||||
|         locale.h \ |         locale.h \ | ||||||
|         errno.h \ |         errno.h \ | ||||||
|  |         arpa/tftp.h \ | ||||||
|  |         sys/filio.h \ | ||||||
|         setjmp.h, |         setjmp.h, | ||||||
| dnl to do if not found | dnl to do if not found | ||||||
| [], | [], | ||||||
| @@ -1408,6 +1504,13 @@ dnl Checks for library functions. | |||||||
| dnl AC_PROG_GCC_TRADITIONAL | dnl AC_PROG_GCC_TRADITIONAL | ||||||
| AC_TYPE_SIGNAL | AC_TYPE_SIGNAL | ||||||
| dnl AC_FUNC_VPRINTF | dnl AC_FUNC_VPRINTF | ||||||
|  | case $host in | ||||||
|  |   *msdosdjgpp) | ||||||
|  |      ac_cv_func_pipe=no | ||||||
|  |      skipcheck_pipe=yes | ||||||
|  |      AC_MSG_NOTICE([skip check for pipe on msdosdjgpp]) | ||||||
|  |     ;; | ||||||
|  | esac | ||||||
| AC_CHECK_FUNCS( strtoll \ | AC_CHECK_FUNCS( strtoll \ | ||||||
|                 socket \ |                 socket \ | ||||||
|                 select \ |                 select \ | ||||||
| @@ -1445,7 +1548,9 @@ AC_CHECK_FUNCS( strtoll \ | |||||||
| dnl if found | dnl if found | ||||||
| [], | [], | ||||||
| dnl if not found, $ac_func is the name we check for | dnl if not found, $ac_func is the name we check for | ||||||
|   func="$ac_func" | func="$ac_func" | ||||||
|  | eval skipcheck=\$skipcheck_$func | ||||||
|  | if test "x$skipcheck" != "xyes"; then | ||||||
|   AC_MSG_CHECKING([deeper for $func]) |   AC_MSG_CHECKING([deeper for $func]) | ||||||
|   AC_TRY_LINK( [], |   AC_TRY_LINK( [], | ||||||
|                [ $func ();], |                [ $func ();], | ||||||
| @@ -1455,7 +1560,7 @@ dnl if not found, $ac_func is the name we check for | |||||||
|                AC_DEFINE_UNQUOTED($def, 1, [If you have $func]), |                AC_DEFINE_UNQUOTED($def, 1, [If you have $func]), | ||||||
|                AC_MSG_RESULT(but still no) |                AC_MSG_RESULT(but still no) | ||||||
|                ) |                ) | ||||||
|  | fi | ||||||
| ) | ) | ||||||
|  |  | ||||||
| dnl For some reason, the check above doesn't properly detect select() with | dnl For some reason, the check above doesn't properly detect select() with | ||||||
| @@ -1493,6 +1598,19 @@ AC_CHECK_DECL(basename, , | |||||||
| #ifdef HAVE_LIBGEN_H | #ifdef HAVE_LIBGEN_H | ||||||
| #include <libgen.h> | #include <libgen.h> | ||||||
| #endif | #endif | ||||||
|  | #ifdef HAVE_UNISTD_H | ||||||
|  | #include <unistd.h> | ||||||
|  | #endif | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | AC_CHECK_DECL(inet_pton, , | ||||||
|  |               AC_DEFINE(HAVE_NO_INET_PTON_PROTO, 1, | ||||||
|  |                         [Defined if no inet_pton() prototype available]), | ||||||
|  | [ | ||||||
|  | #ifdef HAVE_ARPA_INET_H | ||||||
|  | #include <arpa/inet.h> | ||||||
|  | #endif | ||||||
|  | ] | ||||||
| ) | ) | ||||||
|  |  | ||||||
| AC_MSG_CHECKING([if we are Mac OS X (to disable poll)]) | AC_MSG_CHECKING([if we are Mac OS X (to disable poll)]) | ||||||
| @@ -1594,7 +1712,7 @@ AC_HELP_STRING([--disable-ares],[Disable ares for name lookups]), | |||||||
|   *)   AC_MSG_RESULT(yes) |   *)   AC_MSG_RESULT(yes) | ||||||
|  |  | ||||||
|        if test "x$IPV6_ENABLED" = "x1"; then |        if test "x$IPV6_ENABLED" = "x1"; then | ||||||
|          AC_MSG_ERROR([ares doesn't work with ipv6, disable ipv6 to use ares]) |          AC_MSG_NOTICE([ares may not work properly with ipv6]) | ||||||
|        fi |        fi | ||||||
|  |  | ||||||
|        AC_DEFINE(USE_ARES, 1, [Define if you want to enable ares support]) |        AC_DEFINE(USE_ARES, 1, [Define if you want to enable ares support]) | ||||||
| @@ -1603,7 +1721,7 @@ AC_HELP_STRING([--disable-ares],[Disable ares for name lookups]), | |||||||
|        AC_SUBST(HAVE_ARES) |        AC_SUBST(HAVE_ARES) | ||||||
|        curl_ares_msg="enabled" |        curl_ares_msg="enabled" | ||||||
|  |  | ||||||
|        LIBS="$LIBS -lcares" |        LIBS="-lcares $LIBS" | ||||||
|  |  | ||||||
|        dnl For backwards compatibility default to includes/lib in srcdir/ares |        dnl For backwards compatibility default to includes/lib in srcdir/ares | ||||||
|        dnl If a value is specified it is assumed that the libs are in $val/lib |        dnl If a value is specified it is assumed that the libs are in $val/lib | ||||||
| @@ -1688,7 +1806,6 @@ AC_HELP_STRING([--disable-sspi],[Disable SSPI]), | |||||||
|        AC_MSG_RESULT(yes) |        AC_MSG_RESULT(yes) | ||||||
|        AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support]) |        AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support]) | ||||||
|        AC_SUBST(USE_WINDOWS_SSPI) |        AC_SUBST(USE_WINDOWS_SSPI) | ||||||
|        LIBS="$LIBS -lsecur32" |  | ||||||
|        curl_sspi_msg="yes" |        curl_sspi_msg="yes" | ||||||
|        ;; |        ;; | ||||||
|   *) |   *) | ||||||
|   | |||||||
| @@ -60,7 +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 |           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" | ||||||
| @@ -114,6 +116,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@ | ||||||
|   | |||||||
| @@ -82,8 +82,8 @@ Lisp | |||||||
|  |  | ||||||
| Lua | Lua | ||||||
|  |  | ||||||
|   Written by Steve Dekorte |   LuaCURL Written by Alexander Marinov | ||||||
|   http://curl.haxx.se/libcurl/lua/ |   http://luacurl.luaforge.net/ | ||||||
|  |  | ||||||
| Mono | Mono | ||||||
|  |  | ||||||
| @@ -150,6 +150,11 @@ 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 | ||||||
| @@ -161,7 +166,7 @@ Visual Basic | |||||||
|   http://sourceforge.net/projects/libcurl-vb/ |   http://sourceforge.net/projects/libcurl-vb/ | ||||||
|  |  | ||||||
| Q | 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 | ||||||
							
								
								
									
										183
									
								
								docs/FAQ
									
									
									
									
									
								
							
							
						
						
									
										183
									
								
								docs/FAQ
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| Updated: April 13, 2005 (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 | ||||||
| @@ -64,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? | ||||||
| @@ -86,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? | ||||||
| @@ -132,11 +137,11 @@ FAQ | |||||||
|  |  | ||||||
|   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? | ||||||
|  |  | ||||||
| @@ -146,6 +151,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 | ||||||
| @@ -197,15 +206,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. | ||||||
|  |  | ||||||
| @@ -220,12 +228,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? | ||||||
|  |  | ||||||
| @@ -256,6 +260,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 | ||||||
|  |  | ||||||
| @@ -396,6 +452,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 | ||||||
| @@ -509,22 +567,24 @@ FAQ | |||||||
|   - 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 certificate 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 verification 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 | ||||||
| @@ -541,6 +601,8 @@ FAQ | |||||||
|   |   | ||||||
|   No. |   No. | ||||||
|  |  | ||||||
|  |   But you could easily write your own program using libcurl to do such stunts. | ||||||
|  |  | ||||||
|  |  | ||||||
| 4. Running Problems | 4. Running Problems | ||||||
|  |  | ||||||
| @@ -734,6 +796,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 | ||||||
|  |  | ||||||
| @@ -754,7 +838,7 @@ FAQ | |||||||
|   need to provide locking function(s) for libgcrypt (which is used by GnuTLS |   need to provide locking function(s) for libgcrypt (which is used by GnuTLS | ||||||
|   for the crypto functions). |   for the crypto functions). | ||||||
|  |  | ||||||
|     [informative link missing] |     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? | ||||||
|  |  | ||||||
| @@ -766,8 +850,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 { | ||||||
| @@ -874,7 +958,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): | ||||||
| @@ -887,6 +974,8 @@ 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: | ||||||
|  |  | ||||||
| @@ -899,8 +988,8 @@ FAQ | |||||||
|   5.10 How do I prevent libcurl from writing the response to stdout? |   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 |   libcurl provides a default built-in write function that writes received data | ||||||
|   to stdout. Set a WRITEFUNCTION to receive the data, or possibly set |   to stdout. Set the CURLOPT_WRITEFUNCTION to receive the data, or possibly | ||||||
|   WRITEDATA to a different FILE * handle. |   set CURLOPT_WRITEDATA to a different FILE * handle. | ||||||
|  |  | ||||||
|   5.11 How do I make libcurl not receive the whole HTTP response? |   5.11 How do I make libcurl not receive the whole HTTP response? | ||||||
|  |  | ||||||
| @@ -929,6 +1018,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! | ||||||
| @@ -973,13 +1065,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 | ||||||
| @@ -118,9 +121,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 | ||||||
|   | |||||||
| @@ -145,3 +145,9 @@ August 2004: | |||||||
| April 2005: | April 2005: | ||||||
|  |  | ||||||
| GnuTLS can now optionally be used for the secure layer when curl is built. | 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. | ||||||
|   | |||||||
							
								
								
									
										289
									
								
								docs/INSTALL
									
									
									
									
									
								
							
							
						
						
									
										289
									
								
								docs/INSTALL
									
									
									
									
									
								
							| @@ -132,172 +132,151 @@ 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 | ||||||
|  |    CURL_DISABLE_GOPHER   disables GOPHER | ||||||
|  |  | ||||||
|         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 +441,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/ | ||||||
| @@ -588,7 +565,7 @@ PORTS | |||||||
|         - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10 |         - 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 | ||||||
|   | |||||||
							
								
								
									
										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,11 +3,33 @@ 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! | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  |  | ||||||
|  | 24. Harshal Pradhan's Use-after-free with libcurl+ares. This probably occurs | ||||||
|  |   because there is a pending ares callback that gets called after the | ||||||
|  |   connection struct has been freed in libcurl: | ||||||
|  |         http://curl.haxx.se/mail/lib-2005-08/0022.html | ||||||
|  |   Fixing this properly most likely requires a new c-ares function. | ||||||
|  |  | ||||||
|  | 23. We don't support SOCKS for IPv6. We don't support FTPS over a SOCKS proxy. | ||||||
|  |   We don't have any test cases for SOCKS proxy. We probably have even more | ||||||
|  |   bugs and lack of features when a SOCKS proxy is used. | ||||||
|  |  | ||||||
| 22. Sending files to a FTP server using curl on VMS, might lead to curl | 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 |   complaining on "unaligned file size" on completion. The problem is related | ||||||
|   to VMS file structures and the perceived file sizes stat() returns. A |   to VMS file structures and the perceived file sizes stat() returns. A | ||||||
|   possible fix would involve sending a "STRU VMS" command. |   possible fix would involve sending a "STRU VMS" command. | ||||||
|   http://sourceforge.net/support/tracker.php?aid=1156287 |   http://curl.haxx.se/bug/view.cgi?id=1156287 | ||||||
|    |    | ||||||
| 21. FTP ASCII transfers do not follow RFC959. They don't convert the data | 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 |    accordingly (not for sending nor for receiving). RFC 959 section 3.1.1.1 | ||||||
| @@ -18,14 +40,6 @@ may have been fixed since this was written! | |||||||
|      specification).  The receiver will convert the data from the standard |      specification).  The receiver will convert the data from the standard | ||||||
|      form to his own internal form. |      form to his own internal form. | ||||||
|  |  | ||||||
| 20. valgrind errors occur too often when 'make test' is used. It is because |  | ||||||
|   too many third-party libs and tools have problems. When curl is built |  | ||||||
|   without --disable-shared, the testing is done with a front-end script which |  | ||||||
|   makes the valgrind testing include (ba)sh as well and that often causes |  | ||||||
|   valgrind errors. Either we improve the valgrind error scanner a lot to |  | ||||||
|   better identify (lib)curl errors only, or we disable valgrind checking by |  | ||||||
|   default. |  | ||||||
|  |  | ||||||
| 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. | ||||||
|  |  | ||||||
| @@ -42,10 +56,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 | ||||||
| @@ -65,11 +75,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 | ||||||
|   | |||||||
| @@ -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,29 +27,30 @@ libcurl http://curl.haxx.se/docs/copyright.html | |||||||
|  |  | ||||||
| OpenSSL http://www.openssl.org/source/license.html | OpenSSL http://www.openssl.org/source/license.html | ||||||
|  |  | ||||||
|         Uses an Original BSD-style license with an announement clause that |         (May be used for SSL/TLS support) Uses an Original BSD-style license | ||||||
|         makes it "incompatible" with GPL. You are not allowed to ship binaries |         with an announement clause that makes it "incompatible" with GPL. You | ||||||
|         that link with OpenSSL that includes GPL code (unless that specific |         are not allowed to ship binaries that link with OpenSSL that includes | ||||||
|         GPL code includes an exception for OpenSSL - a habit that is growing |         GPL code (unless that specific GPL code includes an exception for | ||||||
|         more and more common). If OpenSSL's licensing is a problem for you, |         OpenSSL - a habit that is growing more and more common). If OpenSSL's | ||||||
|         consider using GnuTLS instead. |         licensing is a problem for you, consider using GnuTLS instead. | ||||||
|  |  | ||||||
| GnuTLS  http://www.gnutls.org/ | GnuTLS  http://www.gnutls.org/ | ||||||
|  |  | ||||||
|         Uses the LGPL[3] license. If this is a problem for you, consider using |         (May be used for SSL/TLS support) Uses the LGPL[3] license. If this is | ||||||
|         OpenSSL instead. Also note that GnuTLS itself depends on and uses |         a problem for you, consider using OpenSSL instead. Also note that | ||||||
|         other libs (libgcrypt and libgpg-error) and they too are LGPL- or |         GnuTLS itself depends on and uses other libs (libgcrypt and | ||||||
|         GPL-licensed. |         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 | ||||||
|  |  | ||||||
| @@ -60,33 +60,43 @@ krb4 | |||||||
|         of the code in libcurl that is written to deal with Kerberos4 likewise |         of the code in libcurl that is written to deal with Kerberos4 likewise | ||||||
|         have such a license. |         have such a license. | ||||||
|  |  | ||||||
| GSSAPI | MIT Kerberos http://web.mit.edu/kerberos/www/dist/ | ||||||
|  |  | ||||||
|         While nothing in particular says that a GSS/Kerberos5 library must use |         (May be used for GSS support) MIT licensed, that shouldn't collide | ||||||
|         any particular license, the one I've used (Heimdal) is Original BSD- |         with any other parts. | ||||||
|         licensed with the announcement clause. |  | ||||||
|  | Heimdal http://www.pdc.kth.se/heimdal/ | ||||||
|  |  | ||||||
|  |         (May be used for GSS support) Heimdal is Original BSD licensed with | ||||||
|  |         the announcement clause. | ||||||
|  |  | ||||||
|  | GNU GSS http://www.gnu.org/software/gss/ | ||||||
|  |  | ||||||
|  |         (May be used for GSS support) GNU GSS is GPL licensed. Note that you | ||||||
|  |         may not distribute binary curl packages that uses this if you build | ||||||
|  |         curl to also link and use any Original BSD licensed libraries! | ||||||
|  |  | ||||||
| fbopenssl | fbopenssl | ||||||
|  |  | ||||||
|         Unclear license. Based on its name, I assume that it uses the OpenSSL |         (Used for SPNEGO support) Unclear license. Based on its name, I assume | ||||||
|         license and thus shares the same issues as described for OpenSSL |         that it uses the OpenSSL license and thus shares the same issues as | ||||||
|         above. |         described for OpenSSL above. | ||||||
|  |  | ||||||
| libidn  http://www.gnu.org/licenses/lgpl.html | libidn  http://www.gnu.org/licenses/lgpl.html | ||||||
|  |  | ||||||
|         Uses the GNU Lesser General Public License. LGPL is a variation of GPL |         (Used for IDNA support) Uses the GNU Lesser General Public | ||||||
|         with slightly less aggressive "copyleft". This license requires more |         License. LGPL is a variation of GPL with slightly less aggressive | ||||||
|         requirements to be met when distributing binaries, see the license for |         "copyleft". This license requires more requirements to be met when | ||||||
|         details. Also note that if you distribute a binary that includes this |         distributing binaries, see the license for details. Also note that if | ||||||
|         library, you must also include the full LGPL license text. Please |         you distribute a binary that includes this library, you must also | ||||||
|         properly point out what parts of the distributed package that the |         include the full LGPL license text. Please properly point out what | ||||||
|         license addresses. |         parts of the distributed package that the license addresses. | ||||||
|  |  | ||||||
| OpenLDAP http://www.openldap.org/software/release/license.html | OpenLDAP http://www.openldap.org/software/release/license.html | ||||||
|  |  | ||||||
|         Uses a Modified BSD-style license. Since libcurl uses OpenLDAP as a |         (Used for LDAP support) Uses a Modified BSD-style license. Since | ||||||
|         shared library only, I have not heard of anyone that ships OpenLDAP |         libcurl uses OpenLDAP as a shared library only, I have not heard of | ||||||
|         linked with libcurl in an app. |         anyone that ships OpenLDAP linked with libcurl in an app. | ||||||
|  |  | ||||||
|  |  | ||||||
| [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 | ||||||
|   | |||||||
| @@ -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 < $< >$@ | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										547
									
								
								docs/THANKS
									
									
									
									
									
								
							
							
						
						
									
										547
									
								
								docs/THANKS
									
									
									
									
									
								
							| @@ -4,91 +4,462 @@ | |||||||
|  |  | ||||||
|  If you have contributed but are missing here, please let us know! |  If you have contributed but are missing here, please let us know! | ||||||
|  |  | ||||||
| Alan Pinstein, Albert Chin-A-Young, Albert Choy, Aleksandar Milivojevic, Alex | Adrian Schuur | ||||||
| aka WindEagle, Alex Neblett, Alex Suykov, Alexander Kourakos, Alexander | Alan Pinstein | ||||||
| Krasnostavsky, Alexander Zhuravlev, Alexis Carvalho, Andi Jahja, Andreas Damm, | Albert Chin-A-Young | ||||||
| Andreas Olsson, Andreas Rieke, Andrew Francis, Andrew Fuller, Andr<64>s Garc<72>a, | Albert Choy | ||||||
| Andy Cedilnik, Andy Serpa, Angus Mackay, Antoine Calando, Anton Kalmykov, | Aleksandar Milivojevic | ||||||
| Arkadiusz Miskiewicz, Augustus Saunders, Avery Fay, Ben Greear, Benjamin | Alex Neblett | ||||||
| Gerard, Bertrand Demiddelaer, Bjorn Reese, Bj<42>rn Stenberg, Bob Schader, Brad | Alex Suykov | ||||||
| Burdick, Brent Beardsley, Brian Akins, Brian R Duffy, Bruce Mitchener, Bryan | Alex aka WindEagle | ||||||
| Henderson, Bryan Henderson , Bryan Kemp, Caolan McNamara, Casey O'Donnell, | Alexander Kourakos | ||||||
| Chih-Chung Chang, Chris "Bob Bob", Chris Combes, Chris Gaukroger, Chris | Alexander Krasnostavsky | ||||||
| Maltby, Christian Kurz, Christian Robottom Reis, Christophe Demory, Christophe | Alexander Zhuravlev | ||||||
| Legry, Christopher R. Palmer, Clarence Gardner, Clifford Wolf, Cody Jones, | Alexis Carvalho | ||||||
| Colin Watson, Colm Buckley, Cory Nelson, Craig Davison, Craig Markwardt, Cris | Andi Jahja | ||||||
| Bailiff, Cyrill Osterwalder, Damien Adant, Dan Becker, Dan C, Dan Fandrich, | Andreas Damm | ||||||
| Dan Torop, Dan Zitter, Daniel at touchtunes, Daniel Stenberg, Dave Dribin, | Andreas Olsson | ||||||
| Dave Halbakken, Dave Hamilton, Dave May, David Byron, David Cohen, David | Andreas Rieke | ||||||
| Eriksson, David Houlder, David Hull, David J Meyer, David James, David Kimdon, | Andres Garcia | ||||||
| David LeBlanc, David Odin, David Phillips, David Shaw, David Tarendash, David | Andrew Bushnell | ||||||
| Thiel, Detlef Schmier, Diego Casorran, Dimitris Sarris, Dinar, Dirk | Andrew Francis | ||||||
| Eddelbuettel, Dirk Manske, Dolbneff A.V, Domenico Andreoli, Dominick Meglio, | Andrew Fuller | ||||||
| Doug Kaufman, Doug Porter, Douglas E. Wegscheid, Douglas R. Horner, Dustin | Andr<EFBFBD>s Garc<72>a | ||||||
| Boswell, Dylan Ellicott, Dylan Salisbury, Early Ehlinger, Edin Kadribasic, | Andy Cedilnik | ||||||
| Ellis Pritchard, Emiliano Ida, Enrico Scholz, Enrik Berkhan, Eric Lavigne, | Andy Serpa | ||||||
| Eric Melville, Eric Rautman, Eric Thelin, Eric Vergnaud, Eric Young, Erick | Angus Mackay | ||||||
| Nuwendam, Erwan Legrand, Erwin Authried, Evan Jordan, Fabrizio Ammollo, Fedor | Antoine Calando | ||||||
| Karpelevitch, Felix von Leitner, Florian Schoppmann, Forrest Cahoon, Frank | Anton Kalmykov | ||||||
| Keeney, Frank Ticheler, Fred New, Fred Noz, Frederic Lepied, Gautam Mani, Gaz | Arkadiusz Miskiewicz | ||||||
| Iqbal, Georg Horn, Georg Huettenegger, Gerd v. Egidy, Gerhard Herre, Giaslas | Augustus Saunders | ||||||
| Georgios, Gilad, Gilbert Ramirez Jr., Gisle Vanem, Giuseppe Attardi, Giuseppe | Avery Fay | ||||||
| D'Ambrosio, Glen Nakamura, Glen Scott, Greg Hewgill, Greg Onufer, Grigory | Ben Greear | ||||||
| Entin, Guenole Bescon, Guillaume Arluison, Gustaf Hui, Gwenole Beauchesne, | Ben Madsen | ||||||
| G<EFBFBD>tz Babin-Ebell, G<>nter Knauf, Hamish Mackenzie, Hanno Kranzhoff, Hans | Benjamin Gerard | ||||||
| Steegers, Hardeep Singh, Harshal Pradhan, Heikki Korpela, Henrik Storner, | Bertrand Demiddelaer | ||||||
| Hzhijun, Ian Ford, Ian Gulliver, Ian Wilkes, Ignacio Vazquez-Abrams, Ilguiz | Bjorn Reese | ||||||
| Latypov, Ingo Ralf Blum, Ingo Wilken, Jacky Lam, Jacob Meuser, James Bursa, | Bj<EFBFBD>rn Stenberg | ||||||
| James Clancy, James Cone, James Gallagher, James Griffiths, James MacMillan, | Bob Schader | ||||||
| Jamie Lokier, Jamie Wilkinson, Jason S. Priebe, Jean-Claude Chauve, Jean-Louis | Brad Burdick | ||||||
| Lemaire, Jean-Marc Ranger, Jean-Philippe Barrette-LaPierre, Jeff Lawson, Jeff | Brent Beardsley | ||||||
| Phillips, Jeffrey Pohlmeyer, Jeremy Friesner, Jesper Jensen, Jesse Noller, Jim | Brian Akins | ||||||
| Drash, Joe Halpin, Joel Chen, Johan Anderson, Johan Nilsson, John Crow, John | Brian R Duffy | ||||||
| Janssen, John Lask, John McGowan, Jon Travis, Jon Turner, Jonas Forsman, | Bruce Mitchener | ||||||
| Jonatan Lander, Jonathan Hseu, Jongki Suwandi, Josh Kapell, Juan F. Codagnone, | Bryan Henderson | ||||||
| Juan Ignacio Herv<72>s, Juergen Wilke, Jukka Pihl, Julian Noble, Jun-ichiro | Bryan Henderson  | ||||||
| itojun Hagino, Jurij Smakov, J<>rg Mueller-Tolk, J<>rn Hartroth, Kai Sommerfeld, | Bryan Kemp | ||||||
| Kai-Uwe Rommel, Kang-Jin Lee, Karol Pietrzak, Keith MacDonald, Keith McGuigan, | Caolan McNamara | ||||||
| Ken Hirsch, Ken Rastatter, Kevin Fisk, Kevin Roth, Kimmo Kinnunen, Kjell | Casey O'Donnell | ||||||
| Ericson, Kjetil Jacobsen, Klevtsov Vadim, Kris Kennaway, Krishnendu Majumdar, | Chih-Chung Chang | ||||||
| Kristian K<>hntopp, Kyle Sallee, Lachlan O'Dea, Larry Campbell, Larry Fahnoe, | Chris "Bob Bob" | ||||||
| Lars Gustafsson, Lars J. Aas, Lars Nilsson, Lars Torben Wilson, Legoff | Chris Combes | ||||||
| Vincent, Lehel Bernadt, Len Krause, Linas Vepstas, Ling Thio, Linus Nielsen | Chris Gaukroger | ||||||
| Feltzing, Loic Dachary, Loren Kirkby, Luca Altea, Luca Alteas, Lucas Adamski, | Chris Maltby | ||||||
| Lukasz Czekierda, Luke Call, Luong Dinh Dung, Maciej W. Rozycki, Marc Boucher, | Christian Kurz | ||||||
| Marcelo Juchem , Marcin Konicki, Marco G. Salvagno, Marcus Webster, Mark | Christian Robottom Reis | ||||||
| Butler, Markus Moeller, Markus Oberhumer, Martijn Koster, Martin C. Martin, | Christophe Demory | ||||||
| Martin Hedenfalk, Marty Kuhrt, Maruko, Massimiliano Ziccardi, Mathias | Christophe Legry | ||||||
| Axelsson, Mats Lidell, Matt Veenstra, Matthew Blain, Matthew Clarke, Maurice | Christopher R. Palmer | ||||||
| Barnum, Mekonikum, Mettgut Jamalla, Michael Benedict, Michael Curtis, Michael | Clarence Gardner | ||||||
| Mealling, Michal Bonino, Mihai Ionescu, Mike Bytnar, Mike Dobbs, Miklos | Clifford Wolf | ||||||
| Nemeth, Mitz Wark, Mohamed Lrhazi, Mohun Biswas, Moonesamy, Nathan O'Sullivan, | Cody Jones | ||||||
| Naveen Noel, Neil Dunbar, Neil Spring, Nic Roets, Nick Gimbrone, Nick Humfrey, | Colin Watson | ||||||
| Nico Baggus, Nicolas Berloquin, Nicolas Croiset, Niels van Tongeren, Nikita | Colm Buckley | ||||||
| Schmidt, nk, Nodak Sodak, Oren Tirosh, P R Schaffner, Patrick Bihan-Faou, | Cory Nelson | ||||||
| Patrick Smith, Paul Harrington, Paul Marquis, Paul Moore, Paul Nolan, Pavel | Craig Davison | ||||||
| Cenek, Pavel Orehov, Pawel A. Gajda, Pedro Neves, Pete Su, Peter Bray, Peter | Craig Markwardt | ||||||
| Forret, Peter Pentchev, Peter Sylvester, Peter Todd, Peter Verhas, Peter | Cris Bailiff | ||||||
| Wullinger, Phil Karn, Philip Gladstone, Philippe Hameau, Philippe Raoult, | Cyrill Osterwalder | ||||||
| Pierre, Puneet Pawaia, Rafael Sagula, Ralph Beckmann, Ralph Mitchell, Ramana | Damien Adant | ||||||
| Mokkapati, Randy McMurchy, Reinout van Schouwen, Renaud Chaillat, Renaud | Dan Becker | ||||||
| Duhaut, Rene Bernhardt, Rene Rebe, Ricardo Cadime, Rich Gray, Richard Archer, | Dan C | ||||||
| Richard Atterer, Richard Bramante, Richard Cooper, Richard Gorton, Richard | Dan Fandrich | ||||||
| Prescott, Rick Jones, Rick Richardson, Rob Stanzel, Robert D. Young, Robert | Dan Torop | ||||||
| Olson, Robert Weaver, Robin Kay, Rodney Simmons, Roland Krikava, Roland | Dan Zitter | ||||||
| Zimmermann, Roman Koifman, Ron Zapp, Rosimildo da Silva, Roy Shan, Rune | Daniel Stenberg | ||||||
| Kleveland, Ryan Nelson, S. Moonesamy, Salvador D<>vila, Salvatore Sorrentino, | Daniel at touchtunes | ||||||
| Sampo Kellomaki, Samuel D<>az Garc<72>a, Samuel Listopad, Sander Gates, Saul good, | Darryl House | ||||||
| Sebastien Willemijns, Sergio Ballestrero, Seshubabu Pasam, Shard, Shawn | Dave Dribin | ||||||
| Poulson, Siddhartha Prakash Jain, Simon Dick, Simon Liu, Spiridonoff A.V, | Dave Halbakken | ||||||
| Stadler Stephan, Stefan Ulrich, Stephan Bergmann, Stephen Kick, Stephen More, | Dave Hamilton | ||||||
| Sterling Hughes, Steve Green, Steve Lhomme, Steve Marx, Steve Oliphant, Steven | Dave May | ||||||
| Bazyl, Steven G. Johnson, Stoned Elipot, Sven Neuhaus, swalkaus at yahoo.com, | David Byron | ||||||
| S<EFBFBD>bastien Willemijns, T. Bharath, T. Yamada, Thomas Schwinge, Thomas Tonino, | David Cohen | ||||||
| Tim Baker, Tim Bartley, Tim Costello, Tim Sneddon, Toby Peterson, Tom Benoist, | David Eriksson | ||||||
| Tom Lee, Tom Mattison, Tom Moers, Tom Zerucha, Tomas Pospisek, Tomas Szepe, | David Houlder | ||||||
| Tomasz Lacki, Tommy Tam, Ton Voon, Tor Arntsen, Torsten Foertsch, Toshiyuki | David Hull | ||||||
| Maezawa, Traian Nicolescu, Troels Walsted Hansen, Troy Engel, Ulrich Zadow, | David J Meyer | ||||||
| Vincent Bronner, Vincent Penquerc'h, Vincent Sanders, Vojtech Janota, Vojtech | David James | ||||||
| Minarik, Walter J. Mack, Wayne Haigh, Werner Koch, Wesley Laxton, Wez Furlong, | David Kimdon | ||||||
| Wilfredo Sanchez, Wojciech Zwiefka, Yarram Sunil, Zvi Har'El | David LeBlanc | ||||||
|  | David Odin | ||||||
|  | David Phillips | ||||||
|  | David Shaw | ||||||
|  | David Tarendash | ||||||
|  | David Thiel | ||||||
|  | David Yan | ||||||
|  | Detlef Schmier | ||||||
|  | Diego Casorran | ||||||
|  | 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 | ||||||
|  | Dustin Boswell | ||||||
|  | Dylan Ellicott | ||||||
|  | Dylan Salisbury | ||||||
|  | Early Ehlinger | ||||||
|  | Edin Kadribasic | ||||||
|  | Ellis Pritchard | ||||||
|  | Emiliano Ida | ||||||
|  | Enrico Scholz | ||||||
|  | Enrik Berkhan | ||||||
|  | Eric Cooper | ||||||
|  | Eric Lavigne | ||||||
|  | Eric Melville | ||||||
|  | Eric Rautman | ||||||
|  | Eric Thelin | ||||||
|  | Eric Vergnaud | ||||||
|  | Eric Young | ||||||
|  | Erick Nuwendam | ||||||
|  | Erwan Legrand | ||||||
|  | Erwin Authried | ||||||
|  | Evan Jordan | ||||||
|  | Fabrizio Ammollo | ||||||
|  | Fedor Karpelevitch | ||||||
|  | Felix von Leitner | ||||||
|  | Florian Schoppmann | ||||||
|  | Forrest Cahoon | ||||||
|  | Frank Keeney | ||||||
|  | Frank Ticheler | ||||||
|  | Fred New | ||||||
|  | Fred Noz | ||||||
|  | Frederic Lepied | ||||||
|  | Gautam Mani | ||||||
|  | Gaz Iqbal | ||||||
|  | Georg Horn | ||||||
|  | Georg Huettenegger | ||||||
|  | Georg Wicherski | ||||||
|  | Gerd v. Egidy | ||||||
|  | Gerhard Herre | ||||||
|  | Giaslas Georgios | ||||||
|  | Gilad | ||||||
|  | Gilbert Ramirez Jr. | ||||||
|  | Gisle Vanem | ||||||
|  | Giuseppe Attardi | ||||||
|  | Giuseppe D'Ambrosio | ||||||
|  | Glen Nakamura | ||||||
|  | Glen Scott | ||||||
|  | Greg Hewgill | ||||||
|  | Greg Onufer | ||||||
|  | Grigory Entin | ||||||
|  | Guenole Bescon | ||||||
|  | Guillaume Arluison | ||||||
|  | Gustaf Hui | ||||||
|  | Gwenole Beauchesne | ||||||
|  | G<EFBFBD>tz Babin-Ebell | ||||||
|  | G<EFBFBD>nter Knauf | ||||||
|  | Hamish Mackenzie | ||||||
|  | Hanno Kranzhoff | ||||||
|  | Hans Steegers | ||||||
|  | Hardeep Singh | ||||||
|  | Harshal Pradhan | ||||||
|  | Heikki Korpela | ||||||
|  | Henrik Storner | ||||||
|  | Hzhijun | ||||||
|  | Ian Ford | ||||||
|  | Ian Gulliver | ||||||
|  | Ian Wilkes | ||||||
|  | Ignacio Vazquez-Abrams | ||||||
|  | Igor Polyakov | ||||||
|  | Ilguiz Latypov | ||||||
|  | Ingo Ralf Blum | ||||||
|  | Ingo Wilken | ||||||
|  | Jacky Lam | ||||||
|  | Jacob Meuser | ||||||
|  | James Bursa | ||||||
|  | James Clancy | ||||||
|  | James Cone | ||||||
|  | James Gallagher | ||||||
|  | James Griffiths | ||||||
|  | James MacMillan | ||||||
|  | Jamie Lokier | ||||||
|  | Jamie Wilkinson | ||||||
|  | Jason S. Priebe | ||||||
|  | Jean-Claude Chauve | ||||||
|  | Jean-Louis Lemaire | ||||||
|  | Jean-Marc Ranger | ||||||
|  | Jean-Philippe Barrette-LaPierre | ||||||
|  | Jeff Lawson | ||||||
|  | Jeff Phillips | ||||||
|  | Jeff Pohlmeyer | ||||||
|  | Jeffrey Pohlmeyer | ||||||
|  | Jeremy Friesner | ||||||
|  | Jesper Jensen | ||||||
|  | Jesse Noller | ||||||
|  | Jim Drash | ||||||
|  | Joe Halpin | ||||||
|  | Joel Chen | ||||||
|  | Johan Anderson | ||||||
|  | Johan Nilsson | ||||||
|  | John Crow | ||||||
|  | John Janssen | ||||||
|  | John 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 | ||||||
|  | Karol Pietrzak | ||||||
|  | Keith MacDonald | ||||||
|  | Keith McGuigan | ||||||
|  | Ken Hirsch | ||||||
|  | Ken Rastatter | ||||||
|  | Kevin Fisk | ||||||
|  | Kevin Lussier | ||||||
|  | Kevin Roth | ||||||
|  | Kimmo Kinnunen | ||||||
|  | Kjell Ericson | ||||||
|  | Kjetil Jacobsen | ||||||
|  | Klevtsov Vadim | ||||||
|  | Kris Kennaway | ||||||
|  | Krishnendu Majumdar | ||||||
|  | Kristian K<>hntopp | ||||||
|  | Kyle Sallee | ||||||
|  | Lachlan O'Dea | ||||||
|  | Larry Campbell | ||||||
|  | Larry Fahnoe | ||||||
|  | Lars Gustafsson | ||||||
|  | Lars J. Aas | ||||||
|  | Lars Nilsson | ||||||
|  | Lars Torben Wilson | ||||||
|  | Legoff Vincent | ||||||
|  | Lehel Bernadt | ||||||
|  | Len Krause | ||||||
|  | Linas Vepstas | ||||||
|  | Ling Thio | ||||||
|  | Linus Nielsen Feltzing | ||||||
|  | Loic Dachary | ||||||
|  | Loren Kirkby | ||||||
|  | Luca Altea | ||||||
|  | Luca Alteas | ||||||
|  | Lucas Adamski | ||||||
|  | Lukasz Czekierda | ||||||
|  | Luke Call | ||||||
|  | Luong Dinh Dung | ||||||
|  | Maciej W. Rozycki | ||||||
|  | Marc Boucher | ||||||
|  | Marcelo Juchem  | ||||||
|  | Marcin Konicki | ||||||
|  | Marco G. Salvagno | ||||||
|  | Marcus Webster | ||||||
|  | Mario Schroeder | ||||||
|  | Mark Butler | ||||||
|  | Markus Moeller | ||||||
|  | Markus Oberhumer | ||||||
|  | Martijn Koster | ||||||
|  | Martin C. Martin | ||||||
|  | Martin Hedenfalk | ||||||
|  | Marty Kuhrt | ||||||
|  | Maruko | ||||||
|  | Massimiliano Ziccardi | ||||||
|  | Mathias Axelsson | ||||||
|  | Mats Lidell | ||||||
|  | Matt Veenstra | ||||||
|  | Matthew Blain | ||||||
|  | Matthew Clarke | ||||||
|  | Maurice Barnum | ||||||
|  | Mekonikum | ||||||
|  | Mettgut Jamalla | ||||||
|  | Michael Benedict | ||||||
|  | Michael Curtis | ||||||
|  | Michael Mealling | ||||||
|  | Michael Wallner | ||||||
|  | Michal Bonino | ||||||
|  | Mihai Ionescu | ||||||
|  | Mike Bytnar | ||||||
|  | Mike Dobbs | ||||||
|  | Miklos Nemeth | ||||||
|  | Mitz Wark | ||||||
|  | Mohamed Lrhazi | ||||||
|  | Mohun Biswas | ||||||
|  | Moonesamy | ||||||
|  | Nathan O'Sullivan | ||||||
|  | Naveen Noel | ||||||
|  | Neil Dunbar | ||||||
|  | Neil Spring | ||||||
|  | Nic Roets | ||||||
|  | Nick Gimbrone | ||||||
|  | Nick Humfrey | ||||||
|  | Nico Baggus | ||||||
|  | Nicolas Berloquin | ||||||
|  | Nicolas Croiset | ||||||
|  | Nicolas Fran<61>ois | ||||||
|  | Niels van Tongeren | ||||||
|  | Nikita Schmidt | ||||||
|  | Nodak Sodak | ||||||
|  | Norbert Novotny | ||||||
|  | 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 Sylvester | ||||||
|  | Peter Todd | ||||||
|  | Peter Verhas | ||||||
|  | Peter Wullinger | ||||||
|  | Peteris Krumins | ||||||
|  | Phil Karn | ||||||
|  | Philip Gladstone | ||||||
|  | Philippe Hameau | ||||||
|  | Philippe Raoult | ||||||
|  | Pierre | ||||||
|  | Puneet Pawaia | ||||||
|  | Rafael Sagula | ||||||
|  | Ralph Beckmann | ||||||
|  | Ralph Mitchell | ||||||
|  | Ramana Mokkapati | ||||||
|  | Randy McMurchy | ||||||
|  | Reinout van Schouwen | ||||||
|  | Renaud Chaillat | ||||||
|  | Renaud Duhaut | ||||||
|  | Rene Bernhardt | ||||||
|  | Rene Rebe | ||||||
|  | Ricardo Cadime | ||||||
|  | Rich Gray | ||||||
|  | Richard Archer | ||||||
|  | Richard Atterer | ||||||
|  | Richard Bramante | ||||||
|  | Richard Clayton | ||||||
|  | Richard Cooper | ||||||
|  | Richard Gorton | ||||||
|  | Richard Prescott | ||||||
|  | Rick Jones | ||||||
|  | Rick Richardson | ||||||
|  | Rob Stanzel | ||||||
|  | Robert D. Young | ||||||
|  | Robert Olson | ||||||
|  | Robert Weaver | ||||||
|  | Robin Kay | ||||||
|  | Rodney Simmons | ||||||
|  | Roland Krikava | ||||||
|  | Roland Zimmermann | ||||||
|  | Roman Koifman | ||||||
|  | Ron Zapp | ||||||
|  | Rosimildo da Silva | ||||||
|  | Roy Shan | ||||||
|  | Rune Kleveland | ||||||
|  | Ryan Nelson | ||||||
|  | S. Moonesamy | ||||||
|  | Salvador D<>vila | ||||||
|  | Salvatore Sorrentino | ||||||
|  | Sampo Kellomaki | ||||||
|  | Samuel D<>az Garc<72>a | ||||||
|  | Samuel Listopad | ||||||
|  | Sander Gates | ||||||
|  | Saul good | ||||||
|  | Scott Davis | ||||||
|  | Sebastien Willemijns | ||||||
|  | Sergio Ballestrero | ||||||
|  | Seshubabu Pasam | ||||||
|  | Shard | ||||||
|  | Shawn Poulson | ||||||
|  | Siddhartha Prakash Jain | ||||||
|  | Simon Dick | ||||||
|  | Simon Josefsson | ||||||
|  | Simon Liu | ||||||
|  | Spiridonoff A.V | ||||||
|  | Stadler Stephan | ||||||
|  | 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 | ||||||
|  | Thomas Schwinge | ||||||
|  | Thomas Tonino | ||||||
|  | Tim Baker | ||||||
|  | Tim Bartley | ||||||
|  | Tim Costello | ||||||
|  | Tim Sneddon | ||||||
|  | Toby Peterson | ||||||
|  | Todd Kulesza | ||||||
|  | Tom Benoist | ||||||
|  | Tom Lee | ||||||
|  | Tom Mattison | ||||||
|  | Tom Moers | ||||||
|  | Tom Zerucha | ||||||
|  | Tomas Pospisek | ||||||
|  | Tomas Szepe | ||||||
|  | Tomasz Lacki | ||||||
|  | Tommy Tam | ||||||
|  | Ton Voon | ||||||
|  | Tor Arntsen | ||||||
|  | Torsten Foertsch | ||||||
|  | Toshiyuki Maezawa | ||||||
|  | Traian Nicolescu | ||||||
|  | Troels Walsted Hansen | ||||||
|  | Troy Engel | ||||||
|  | Tupone Alfredo | ||||||
|  | Ulrich Zadow | ||||||
|  | Vincent Bronner | ||||||
|  | Vincent Penquerc'h | ||||||
|  | Vincent Sanders | ||||||
|  | Vojtech Janota | ||||||
|  | Vojtech Minarik | ||||||
|  | Walter J. Mack | ||||||
|  | Wayne Haigh | ||||||
|  | Werner Koch | ||||||
|  | Wesley Laxton | ||||||
|  | Wez Furlong | ||||||
|  | Wilfredo Sanchez | ||||||
|  | Wojciech Zwiefka | ||||||
|  | Yarram Sunil | ||||||
|  | Zvi Har'El  | ||||||
|  | nk | ||||||
|  | swalkaus at yahoo.com | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								docs/TODO
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								docs/TODO
									
									
									
									
									
								
							| @@ -31,7 +31,7 @@ TODO | |||||||
|  * 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. | ||||||
| @@ -40,6 +40,9 @@ TODO | |||||||
|  * 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. | ||||||
|  |  | ||||||
|  LIBCURL - multi interface |  LIBCURL - multi interface | ||||||
|  |  | ||||||
|  * Add a curl_multi_fdset() alternative. this allows apps to avoid the |  * Add a curl_multi_fdset() alternative. this allows apps to avoid the | ||||||
| @@ -58,6 +61,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 | ||||||
| @@ -69,7 +83,7 @@ TODO | |||||||
|  |  | ||||||
|  * 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 | ||||||
| @@ -149,6 +163,25 @@ TODO | |||||||
|    latter two could be alternatives for those looking to reduce the footprint |    latter two could be alternatives for those looking to reduce the footprint | ||||||
|    of libcurl built with OpenSSL or GnuTLS. |    of libcurl built with OpenSSL or GnuTLS. | ||||||
|  |  | ||||||
|  |  * Peter Sylvester's patch for SRP on the TLS layer. | ||||||
|  |    Awaits OpenSSL support for this, no need to support this in libcurl before | ||||||
|  |    there's an OpenSSL release that does it. | ||||||
|  |  | ||||||
|  |  * make the configure --with-ssl option first check for OpenSSL and then for | ||||||
|  |    GnuTLS if OpenSSL wasn't detected. | ||||||
|  |  | ||||||
|  |  GnuTLS | ||||||
|  |  | ||||||
|  |  * Get NTLM working using the functions provided by libgcrypt, since GnuTLS | ||||||
|  |    already depends on that to function. Not strictly SSL/TLS related, but | ||||||
|  |    hey... Another option is to get available DES and MD4 source code from the | ||||||
|  |    cryptopp library. They are fine license-wise, but are C++. | ||||||
|  |  | ||||||
|  |  * SSL engine stuff? | ||||||
|  |  | ||||||
|  |  * Work out a common method with Peter Sylvester's OpenSSL-patch for SRP | ||||||
|  |    on the TLS to provide name and password | ||||||
|  |  | ||||||
|  LDAP |  LDAP | ||||||
|  |  | ||||||
|  * Look over the implementation. The looping will have to "go away" from the |  * Look over the implementation. The looping will have to "go away" from the | ||||||
| @@ -157,12 +190,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 | ||||||
| @@ -184,7 +211,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 | ||||||
|   | |||||||
| @@ -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? | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										86
									
								
								docs/curl.1
									
									
									
									
									
								
							
							
						
						
									
										86
									
								
								docs/curl.1
									
									
									
									
									
								
							| @@ -21,7 +21,7 @@ | |||||||
| .\" * $Id$ | .\" * $Id$ | ||||||
| .\" ************************************************************************** | .\" ************************************************************************** | ||||||
| .\" | .\" | ||||||
| .TH curl 1 "28 Apr 2005" "Curl 7.14.0" "Curl Manual" | .TH curl 1 "24 Nov 2005" "Curl 7.15.1" "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, GOPHER, DICT, TELNET, LDAP or | ||||||
| command is designed to work without user interaction. | FILE). 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,6 +64,17 @@ 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 | ||||||
| @@ -347,6 +358,15 @@ If this option is used twice, the second will again disable silent failure. | |||||||
| 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. | ||||||
|  | .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 disable silent failure. | If this option is used twice, the second will again disable silent failure. | ||||||
| .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) | ||||||
| @@ -421,9 +441,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 | ||||||
| @@ -569,8 +599,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" | ||||||
| @@ -589,7 +618,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" | ||||||
|  |  | ||||||
| @@ -608,6 +637,10 @@ 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" | ||||||
| @@ -747,7 +780,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 | ||||||
| @@ -894,10 +927,18 @@ If this option is used several times, each occurrence will toggle it on/off. | |||||||
| 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 | ||||||
| @@ -958,11 +999,11 @@ SSPI is supported. If you use NTLM and set a blank user name, curl will | |||||||
| authenticate with your current user and password. | 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 | ||||||
| @@ -1058,12 +1099,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 | ||||||
| @@ -1100,7 +1145,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" | ||||||
| @@ -1157,7 +1203,7 @@ Sets proxy server to use for GOPHER. | |||||||
| 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, | ||||||
| @@ -1179,7 +1225,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. | ||||||
|   | |||||||
| @@ -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 htmltidy.c opensslthreadlock.c |  anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c		\ | ||||||
|  |  cookie_interface.c cacertinmem.c | ||||||
|  |  | ||||||
| all: | all: | ||||||
| 	@echo "done" | 	@echo "done" | ||||||
|   | |||||||
							
								
								
									
										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> | ||||||
| @@ -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; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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,47 @@ 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) | ||||||
|  | .SH TIMES | ||||||
|  | .NF | ||||||
|  | An overview of the six time values available from curl_easy_getinfo() | ||||||
|  |  | ||||||
|  | curk_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. | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ | |||||||
| .\" * $Id$ | .\" * $Id$ | ||||||
| .\" ************************************************************************** | .\" ************************************************************************** | ||||||
| .\" | .\" | ||||||
| .TH curl_easy_setopt 3 "12 May 2005" "libcurl 7.14.0" "libcurl Manual" | .TH curl_easy_setopt 3 "27 Oct 2005" "libcurl 7.14.2" "libcurl Manual" | ||||||
| .SH NAME | .SH NAME | ||||||
| curl_easy_setopt - set options for a curl easy handle | curl_easy_setopt - set options for a curl easy handle | ||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| @@ -44,11 +44,11 @@ between transfers, so if you want subsequent transfers with different options, | |||||||
| you must change them between the transfers. You can optionally reset all | you must change them between the transfers. You can optionally reset all | ||||||
| options back to internal default with \fIcurl_easy_reset(3)\fP. | options back to internal default with \fIcurl_easy_reset(3)\fP. | ||||||
|  |  | ||||||
| \fBNOTE:\fP strings passed to libcurl as 'char *' arguments, will not be | Strings passed to libcurl as 'char *' arguments, will not be copied by the | ||||||
| copied by the library. Instead you should keep them available until libcurl no | library. Instead you should keep them available until libcurl no longer needs | ||||||
| longer needs them. Failing to do so will cause very odd behavior or even | them. Failing to do so will cause very odd behavior or even crashes. libcurl | ||||||
| crashes. libcurl will need them until you call \fIcurl_easy_cleanup(3)\fP or | will need them until you call \fIcurl_easy_cleanup(3)\fP or you set the same | ||||||
| you set the same option again to use a different pointer. | option again to use a different pointer. | ||||||
|  |  | ||||||
| The \fIhandle\fP is the return code from a \fIcurl_easy_init(3)\fP or | The \fIhandle\fP is the return code from a \fIcurl_easy_init(3)\fP or | ||||||
| \fIcurl_easy_duphandle(3)\fP call. | \fIcurl_easy_duphandle(3)\fP call. | ||||||
| @@ -70,8 +70,8 @@ preceding the data (like HTTP). | |||||||
| A non-zero parameter tells the library to shut off the built-in progress meter | A non-zero parameter tells the library to shut off the built-in progress meter | ||||||
| completely. | completely. | ||||||
|  |  | ||||||
| \fBNOTE:\fP future versions of libcurl is likely to not have any built-in | Future versions of libcurl is likely to not have any built-in progress meter | ||||||
| progress meter at all. | at all. | ||||||
| .IP CURLOPT_NOSIGNAL | .IP CURLOPT_NOSIGNAL | ||||||
| Pass a long. If it is non-zero, libcurl will not use any functions that | Pass a long. If it is non-zero, libcurl will not use any functions that | ||||||
| install signal handlers or any functions that cause signals to be sent to the | install signal handlers or any functions that cause signals to be sent to the | ||||||
| @@ -96,19 +96,26 @@ transfer and return \fICURLE_WRITE_ERROR\fP. | |||||||
| This function may be called with zero bytes data if the transfered file is | This function may be called with zero bytes data if the transfered file is | ||||||
| empty. | empty. | ||||||
|  |  | ||||||
|  | Set this option to NULL to get the internal default function. The internal | ||||||
|  | default function will write the data to the FILE * given with | ||||||
|  | \fICURLOPT_WRITEDATA\fP. | ||||||
|  |  | ||||||
| Set the \fIstream\fP argument with the \fICURLOPT_WRITEDATA\fP option. | Set the \fIstream\fP argument with the \fICURLOPT_WRITEDATA\fP option. | ||||||
|  |  | ||||||
| \fBNOTE:\fP you will be passed as much data as possible in all invokes, but | The callback function will be passed as much data as possible in all invokes, | ||||||
| you cannot possibly make any assumptions. It may be one byte, it may be | but you cannot possibly make any assumptions. It may be one byte, it may be | ||||||
| thousands. The maximum amount of data that can be passed to the write callback | thousands. The maximum amount of data that can be passed to the write callback | ||||||
| is defined in the curl.h header file: CURL_MAX_WRITE_SIZE. | is defined in the curl.h header file: CURL_MAX_WRITE_SIZE. | ||||||
| .IP CURLOPT_WRITEDATA | .IP CURLOPT_WRITEDATA | ||||||
| Data pointer to pass to the file write function. Note that if you specify the | Data pointer to pass to the file write function. If you use the | ||||||
| \fICURLOPT_WRITEFUNCTION\fP, this is the pointer you'll get as input. If you | \fICURLOPT_WRITEFUNCTION\fP option, this is the pointer you'll get as | ||||||
| don't use a callback, you must pass a 'FILE *' as libcurl will pass this to | input. If you don't use a callback, you must pass a 'FILE *' as libcurl will | ||||||
| fwrite() when writing data. | pass this to fwrite() when writing data. | ||||||
|  |  | ||||||
| \fBNOTE:\fP If you're using libcurl as a win32 DLL, you MUST use the | The internal \fICURLOPT_WRITEFUNCTION\fP will write the data to the FILE * | ||||||
|  | given with this option, or to stdout if this option hasn't been set. | ||||||
|  |  | ||||||
|  | If you're using libcurl as a win32 DLL, you \fBMUST\fP use the | ||||||
| \fICURLOPT_WRITEFUNCTION\fP if you set this option or you will experience | \fICURLOPT_WRITEFUNCTION\fP if you set this option or you will experience | ||||||
| crashes. | crashes. | ||||||
|  |  | ||||||
| @@ -129,15 +136,20 @@ server expected it, like when you've told you will upload N bytes and you | |||||||
| upload less than N bytes), you may experience that the server "hangs" waiting | upload less than N bytes), you may experience that the server "hangs" waiting | ||||||
| for the rest of the data that won't come. | for the rest of the data that won't come. | ||||||
|  |  | ||||||
| In libcurl 7.12.1 and later, the read callback may return | The read callback may return \fICURL_READFUNC_ABORT\fP to stop the current | ||||||
| \fICURL_READFUNC_ABORT\fP to stop the current operation at once, with a | operation immediately, resulting in a \fICURLE_ABORTED_BY_CALLBACK\fP error | ||||||
| \fICURLE_ABORTED_BY_CALLBACK\fP error code from the transfer. | code from the transfer (Added in 7.12.1) | ||||||
| .IP CURLOPT_READDATA |  | ||||||
| Data pointer to pass to the file read function. Note that if you specify the |  | ||||||
| \fICURLOPT_READFUNCTION\fP, this is the pointer you'll get as input. If you |  | ||||||
| don't specify a read callback, this must be a valid FILE *. |  | ||||||
|  |  | ||||||
| \fBNOTE:\fP If you're using libcurl as a win32 DLL, you MUST use a | If you set the callback pointer to NULL, or doesn't set it at all, the default | ||||||
|  | internal read function will be used. It is simply doing an fread() on the FILE | ||||||
|  | * stream set with \fICURLOPT_READDATA\fP. | ||||||
|  | .IP CURLOPT_READDATA | ||||||
|  | Data pointer to pass to the file read function. If you use the | ||||||
|  | \fICURLOPT_READFUNCTION\fP option, this is the pointer you'll get as input. If | ||||||
|  | you don't specify a read callback but instead rely on the default internal | ||||||
|  | read function, this data must be a valid readable FILE *. | ||||||
|  |  | ||||||
|  | If you're using libcurl as a win32 DLL, you MUST use a | ||||||
| \fICURLOPT_READFUNCTION\fP if you set this option. | \fICURLOPT_READFUNCTION\fP if you set this option. | ||||||
|  |  | ||||||
| This option is also known with the older name \fICURLOPT_INFILE\fP, the name | This option is also known with the older name \fICURLOPT_INFILE\fP, the name | ||||||
| @@ -163,28 +175,38 @@ data, the upload size will remain 0). Returning a non-zero value from this | |||||||
| callback will cause libcurl to abort the transfer and return | callback will cause libcurl to abort the transfer and return | ||||||
| \fICURLE_ABORTED_BY_CALLBACK\fP. | \fICURLE_ABORTED_BY_CALLBACK\fP. | ||||||
|  |  | ||||||
| Also note that \fICURLOPT_NOPROGRESS\fP must be set to FALSE to make this | \fICURLOPT_NOPROGRESS\fP must be set to FALSE to make this function actually | ||||||
| function actually get called. | get called. | ||||||
| .IP CURLOPT_PROGRESSDATA | .IP CURLOPT_PROGRESSDATA | ||||||
| Pass a pointer that will be untouched by libcurl and passed as the first | Pass a pointer that will be untouched by libcurl and passed as the first | ||||||
| argument in the progress callback set with \fICURLOPT_PROGRESSFUNCTION\fP. | argument in the progress callback set with \fICURLOPT_PROGRESSFUNCTION\fP. | ||||||
| .IP CURLOPT_HEADERFUNCTION | .IP CURLOPT_HEADERFUNCTION | ||||||
| Function pointer that should match the following prototype: \fIsize_t | Function pointer that should match the following prototype: \fIsize_t | ||||||
| function( void *ptr, size_t size, size_t nmemb, void *stream);\fP. This | function( void *ptr, size_t size, size_t nmemb, void *stream);\fP. This | ||||||
| function gets called by libcurl as soon as there is received header data that | function gets called by libcurl as soon as it has received header data. The | ||||||
| needs to be written down. The headers are guaranteed to be written one-by-one | header callback will be called once for each header and only complete header | ||||||
| and only complete lines are written. Parsing headers should be easy enough | lines are passed on to the callback. Parsing headers should be easy enough | ||||||
| using this. The size of the data pointed to by \fIptr\fP is \fIsize\fP | using this. The size of the data pointed to by \fIptr\fP is \fIsize\fP | ||||||
| multiplied with \fInmemb\fP.  The pointer named \fIstream\fP will be the one | multiplied with \fInmemb\fP. Do not assume that the header line is zero | ||||||
| you passed to libcurl with the \fICURLOPT_WRITEHEADER\fP option.  Return the | terminated! The pointer named \fIstream\fP is the one you set with the | ||||||
| number of bytes actually written or return -1 to signal error to the library | \fICURLOPT_WRITEHEADER\fP option. The callback function must return the number | ||||||
|  | of bytes actually taken care of, or return -1 to signal error to the library | ||||||
| (it will cause it to abort the transfer with a \fICURLE_WRITE_ERROR\fP return | (it will cause it to abort the transfer with a \fICURLE_WRITE_ERROR\fP return | ||||||
| code). | code). | ||||||
|  |  | ||||||
|  | Since 7.14.1: When a server sends a chunked encoded transfer, it may contain a | ||||||
|  | trailer. That trailer is identical to a HTTP header and if such a trailer is | ||||||
|  | received it is passed to the application using this callback as well. There | ||||||
|  | are several ways to detect it being a trailer and not an ordinary header: 1) | ||||||
|  | it comes after the response-body. 2) it comes after the final header line (CR | ||||||
|  | LF) 3) a Trailer: header among the response-headers mention what header to | ||||||
|  | expect in the trailer. | ||||||
| .IP CURLOPT_WRITEHEADER | .IP CURLOPT_WRITEHEADER | ||||||
| Pass a pointer to be used to write the header part of the received data to. If | (This option is also known as \fBCURLOPT_HEADERDATA\fP) Pass a pointer to be | ||||||
| you don't use your own callback to take care of the writing, this must be a | used to write the header part of the received data to. If you don't use your | ||||||
| valid FILE *. See also the \fICURLOPT_HEADERFUNCTION\fP option above on how to | own callback to take care of the writing, this must be a valid FILE *. See | ||||||
| set a custom get-all-headers callback. | also the \fICURLOPT_HEADERFUNCTION\fP option above on how to set a custom | ||||||
|  | get-all-headers callback. | ||||||
| .IP CURLOPT_DEBUGFUNCTION | .IP CURLOPT_DEBUGFUNCTION | ||||||
| Function pointer that should match the following prototype: \fIint | Function pointer that should match the following prototype: \fIint | ||||||
| curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *);\fP | curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *);\fP | ||||||
| @@ -223,10 +245,13 @@ perform operation will return the error code from this callback function.  Set | |||||||
| the \fIparm\fP argument with the \fICURLOPT_SSL_CTX_DATA\fP option. This | the \fIparm\fP argument with the \fICURLOPT_SSL_CTX_DATA\fP option. This | ||||||
| option was introduced in 7.11.0. | option was introduced in 7.11.0. | ||||||
|  |  | ||||||
| \fBNOTE:\fP To use this properly, a non-trivial amount of knowledge of the | This function will get called on all new connections made to a server, during | ||||||
| openssl libraries is necessary. Using this function allows for example to use | the SSL negotiation. The SSL_CTX pointer will be a new one every time. | ||||||
| openssl callbacks to add additional validation code for certificates, and even |  | ||||||
| to change the actual URI of an HTTPS request (example used in the lib509 test | To use this properly, a non-trivial amount of knowledge of the openssl | ||||||
|  | libraries is necessary. Using this function allows for example to use openssl | ||||||
|  | callbacks to add additional validation code for certificates, and even to | ||||||
|  | change the actual URI of an HTTPS request (example used in the lib509 test | ||||||
| case).  See also the example section for a replacement of the key, certificate | case).  See also the example section for a replacement of the key, certificate | ||||||
| and trust file settings. | and trust file settings. | ||||||
| .IP CURLOPT_SSL_CTX_DATA | .IP CURLOPT_SSL_CTX_DATA | ||||||
| @@ -236,14 +261,15 @@ parameter, otherwise \fBNULL\fP. (Added in 7.11.0) | |||||||
| .SH ERROR OPTIONS | .SH ERROR OPTIONS | ||||||
| .IP CURLOPT_ERRORBUFFER | .IP CURLOPT_ERRORBUFFER | ||||||
| Pass a char * to a buffer that the libcurl may store human readable error | Pass a char * to a buffer that the libcurl may store human readable error | ||||||
| messages in. This may be more helpful than just the return code from the | messages in. This may be more helpful than just the return code from | ||||||
| library. The buffer must be at least CURL_ERROR_SIZE big. | \fIcurl_easy_perform\fP. The buffer must be at least CURL_ERROR_SIZE big. | ||||||
|  |  | ||||||
| Use \fICURLOPT_VERBOSE\fP and \fICURLOPT_DEBUGFUNCTION\fP to better | Use \fICURLOPT_VERBOSE\fP and \fICURLOPT_DEBUGFUNCTION\fP to better | ||||||
| debug/trace why errors happen. | debug/trace why errors happen. | ||||||
|  |  | ||||||
| \fBNote:\fP if the library does not return an error, the buffer may not have | If the library does not return an error, the buffer may not have been | ||||||
| been touched. Do not rely on the contents in those cases. | touched. Do not rely on the contents in those cases. | ||||||
|  |  | ||||||
| .IP CURLOPT_STDERR | .IP CURLOPT_STDERR | ||||||
| Pass a FILE * as parameter. Tell libcurl to use this stream instead of stderr | Pass a FILE * as parameter. Tell libcurl to use this stream instead of stderr | ||||||
| when showing the progress meter and displaying \fICURLOPT_VERBOSE\fP data. | when showing the progress meter and displaying \fICURLOPT_VERBOSE\fP data. | ||||||
| @@ -264,7 +290,7 @@ given protocol of the set URL is not supported, libcurl will return on error | |||||||
| \fIcurl_multi_perform(3)\fP. Use \fIcurl_version_info(3)\fP for detailed info | \fIcurl_multi_perform(3)\fP. Use \fIcurl_version_info(3)\fP for detailed info | ||||||
| on which protocols that are supported. | on which protocols that are supported. | ||||||
|  |  | ||||||
| \fBNOTE:\fP \fICURLOPT_URL\fP is the only option that must be set before | \fICURLOPT_URL\fP is the only option that must be set before | ||||||
| \fIcurl_easy_perform(3)\fP is called. | \fIcurl_easy_perform(3)\fP is called. | ||||||
| .IP CURLOPT_PROXY | .IP CURLOPT_PROXY | ||||||
| Set HTTP proxy to use. The parameter should be a char * to a zero terminated | Set HTTP proxy to use. The parameter should be a char * to a zero terminated | ||||||
| @@ -274,15 +300,20 @@ be prefixed with [protocol]:// since any such prefix will be ignored. The | |||||||
| proxy's port number may optionally be specified with the separate option | proxy's port number may optionally be specified with the separate option | ||||||
| \fICURLOPT_PROXYPORT\fP. | \fICURLOPT_PROXYPORT\fP. | ||||||
|  |  | ||||||
| \fBNOTE:\fP when you tell the library to use an HTTP proxy, libcurl will | When you tell the library to use an HTTP proxy, libcurl will transparently | ||||||
| transparently convert operations to HTTP even if you specify an FTP URL | convert operations to HTTP even if you specify an FTP URL etc. This may have | ||||||
| etc. This may have an impact on what other features of the library you can | an impact on what other features of the library you can use, such as | ||||||
| use, such as \fICURLOPT_QUOTE\fP and similar FTP specifics that don't work | \fICURLOPT_QUOTE\fP and similar FTP specifics that don't work unless you | ||||||
| unless you tunnel through the HTTP proxy. Such tunneling is activated with | tunnel through the HTTP proxy. Such tunneling is activated with | ||||||
| \fICURLOPT_HTTPPROXYTUNNEL\fP. | \fICURLOPT_HTTPPROXYTUNNEL\fP. | ||||||
|  |  | ||||||
| \fBNOTE2:\fP libcurl respects the environment variables \fBhttp_proxy\fP, | libcurl respects the environment variables \fBhttp_proxy\fP, \fBftp_proxy\fP, | ||||||
| \fBftp_proxy\fP, \fBall_proxy\fP etc, if any of those is set. | \fBall_proxy\fP etc, if any of those is set. The \fICURLOPT_PROXY\fP option | ||||||
|  | does however override any possibly set environment variables. | ||||||
|  |  | ||||||
|  | Starting with 7.14.1, the proxy host string can be specified the exact same | ||||||
|  | way as the proxy environment variables, include protocol prefix (http://) and | ||||||
|  | embedded user + password. | ||||||
| .IP CURLOPT_PROXYPORT | .IP CURLOPT_PROXYPORT | ||||||
| Pass a long with this option to set the proxy port to connect to unless it is | Pass a long with this option to set the proxy port to connect to unless it is | ||||||
| specified in the proxy string \fICURLOPT_PROXY\fP. | specified in the proxy string \fICURLOPT_PROXY\fP. | ||||||
| @@ -292,9 +323,9 @@ this are \fICURLPROXY_HTTP\fP and \fICURLPROXY_SOCKS5\fP, with the HTTP one | |||||||
| being default. (Added in 7.10) | being default. (Added in 7.10) | ||||||
| .IP CURLOPT_HTTPPROXYTUNNEL | .IP CURLOPT_HTTPPROXYTUNNEL | ||||||
| Set the parameter to non-zero to get the library to tunnel all operations | Set the parameter to non-zero to get the library to tunnel all operations | ||||||
| through a given HTTP proxy. Note that there is a big difference between using | through a given HTTP proxy. There is a big difference between using a proxy | ||||||
| a proxy and to tunnel through it. If you don't know what this means, you | and to tunnel through it. If you don't know what this means, you probably | ||||||
| probably don't want this tunneling option. | don't want this tunneling option. | ||||||
| .IP CURLOPT_INTERFACE | .IP CURLOPT_INTERFACE | ||||||
| Pass a char * as parameter. This set the interface name to use as outgoing | Pass a char * as parameter. This set the interface name to use as outgoing | ||||||
| network interface. The name can be an interface name, an IP address or a host | network interface. The name can be an interface name, an IP address or a host | ||||||
| @@ -313,10 +344,14 @@ thread-safe and this will use a global variable. | |||||||
| to using the share interface instead! See \fICURLOPT_SHARE\fP and | to using the share interface instead! See \fICURLOPT_SHARE\fP and | ||||||
| \fIcurl_share_init(3)\fP. | \fIcurl_share_init(3)\fP. | ||||||
| .IP CURLOPT_BUFFERSIZE | .IP CURLOPT_BUFFERSIZE | ||||||
| Pass a long specifying your preferred size for the receive buffer in libcurl. | Pass a long specifying your preferred size (in bytes) for the receive buffer | ||||||
| The main point of this would be that the write callback gets called more often | in libcurl.  The main point of this would be that the write callback gets | ||||||
| and with smaller chunks. This is just treated as a request, not an order. You | called more often and with smaller chunks. This is just treated as a request, | ||||||
| cannot be guaranteed to actually get the given size. (Added in 7.10) | not an order. You cannot be guaranteed to actually get the given size. (Added | ||||||
|  | in 7.10) | ||||||
|  |  | ||||||
|  | This size is by default set as big as possible (CURL_MAX_WRITE_SIZE), so it | ||||||
|  | only makse sense to use this option if you want it smaller. | ||||||
| .IP CURLOPT_PORT | .IP CURLOPT_PORT | ||||||
| Pass a long specifying what remote port number to connect to, instead of the | Pass a long specifying what remote port number to connect to, instead of the | ||||||
| one specified in the URL or the default port for the used protocol. | one specified in the URL or the default port for the used protocol. | ||||||
| @@ -342,9 +377,9 @@ This parameter controls the preference of libcurl between using user names and | |||||||
| passwords from your \fI~/.netrc\fP file, relative to user names and passwords | passwords from your \fI~/.netrc\fP file, relative to user names and passwords | ||||||
| in the URL supplied with \fICURLOPT_URL\fP. | in the URL supplied with \fICURLOPT_URL\fP. | ||||||
|  |  | ||||||
| \fBNote:\fP libcurl uses a user name (and supplied or prompted password) | libcurl uses a user name (and supplied or prompted password) supplied with | ||||||
| supplied with \fICURLOPT_USERPWD\fP in preference to any of the options | \fICURLOPT_USERPWD\fP in preference to any of the options controlled by this | ||||||
| controlled by this parameter. | parameter. | ||||||
|  |  | ||||||
| Pass a long, set to one of the values described below. | Pass a long, set to one of the values described below. | ||||||
| .RS | .RS | ||||||
| @@ -368,9 +403,8 @@ and to search the file with the host only. | |||||||
| Only machine name, user name and password are taken into account | Only machine name, user name and password are taken into account | ||||||
| (init macros and similar things aren't supported). | (init macros and similar things aren't supported). | ||||||
|  |  | ||||||
| \fBNote:\fP libcurl does not verify that the file has the correct properties | libcurl does not verify that the file has the correct properties set (as the | ||||||
| set (as the standard Unix ftp client does). It should only be readable by | standard Unix ftp client does). It should only be readable by user. | ||||||
| user. |  | ||||||
| .IP CURLOPT_NETRC_FILE | .IP CURLOPT_NETRC_FILE | ||||||
| Pass a char * as parameter, pointing to a zero terminated string containing | Pass a char * as parameter, pointing to a zero terminated string containing | ||||||
| the full path name to the file you want libcurl to use as .netrc file. If this | the full path name to the file you want libcurl to use as .netrc file. If this | ||||||
| @@ -380,6 +414,11 @@ find the a .netrc file in the current user's home directory. (Added in 7.10.9) | |||||||
| Pass a char * as parameter, which should be [user name]:[password] to use for | Pass a char * as parameter, which should be [user name]:[password] to use for | ||||||
| the connection. Use \fICURLOPT_HTTPAUTH\fP to decide authentication method. | the connection. Use \fICURLOPT_HTTPAUTH\fP to decide authentication method. | ||||||
|  |  | ||||||
|  | When using NTLM, you can set domain by prepending it to the user name and | ||||||
|  | separating the domain and name with a forward (/) or backward slash (\\). Like | ||||||
|  | this: "domain/user:password" or "domain\\user:password". Some HTTP servers (on | ||||||
|  | Windows) support this style even for Basic authentication. | ||||||
|  |  | ||||||
| When using HTTP and \fICURLOPT_FOLLOWLOCATION\fP, libcurl might perform | When using HTTP and \fICURLOPT_FOLLOWLOCATION\fP, libcurl might perform | ||||||
| several requests to possibly different hosts. libcurl will only send this user | several requests to possibly different hosts. libcurl will only send this user | ||||||
| and password information to hosts using the initial host name (unless | and password information to hosts using the initial host name (unless | ||||||
| @@ -395,9 +434,9 @@ Pass a long as parameter, which is set to a bitmask, to tell libcurl what | |||||||
| authentication method(s) you want it to use. The available bits are listed | authentication method(s) you want it to use. The available bits are listed | ||||||
| below. If more than one bit is set, libcurl will first query the site to see | below. If more than one bit is set, libcurl will first query the site to see | ||||||
| what authentication methods it supports and then pick the best one you allow | what authentication methods it supports and then pick the best one you allow | ||||||
| it to use. Note that for some methods, this will induce an extra network | it to use. For some methods, this will induce an extra network round-trip. Set | ||||||
| round-trip. Set the actual name and password with the \fICURLOPT_USERPWD\fP | the actual name and password with the \fICURLOPT_USERPWD\fP option. (Added in | ||||||
| option. (Added in 7.10.6) | 7.10.6) | ||||||
| .RS | .RS | ||||||
| .IP CURLAUTH_BASIC | .IP CURLAUTH_BASIC | ||||||
| HTTP Basic authentication. This is the default choice, and the only method | HTTP Basic authentication. This is the default choice, and the only method | ||||||
| @@ -415,15 +454,14 @@ applications. It is primarily meant as a support for Kerberos5 authentication | |||||||
| but may be also used along with another authentication methods. For more | but may be also used along with another authentication methods. For more | ||||||
| information see IETF draft draft-brezak-spnego-http-04.txt. | information see IETF draft draft-brezak-spnego-http-04.txt. | ||||||
|  |  | ||||||
| \fBNOTE\fP that you need to build libcurl with a suitable GSS-API library for | You need to build libcurl with a suitable GSS-API library for this to work. | ||||||
| this to work. |  | ||||||
| .IP CURLAUTH_NTLM | .IP CURLAUTH_NTLM | ||||||
| HTTP NTLM authentication. A proprietary protocol invented and used by | HTTP NTLM authentication. A proprietary protocol invented and used by | ||||||
| Microsoft. It uses a challenge-response and hash concept similar to Digest, to | Microsoft. It uses a challenge-response and hash concept similar to Digest, to | ||||||
| prevent the password from being eavesdropped. | prevent the password from being eavesdropped. | ||||||
|  |  | ||||||
| \fBNOTE\fP that you need to build libcurl with SSL support for this option to | You need to build libcurl with OpenSSL support for this option to work, or | ||||||
| work. | build libcurl on Windows. | ||||||
| .IP CURLAUTH_ANY | .IP CURLAUTH_ANY | ||||||
| This is a convenience macro that sets all bits and thus makes libcurl pick any | This is a convenience macro that sets all bits and thus makes libcurl pick any | ||||||
| it finds suitable. libcurl will automatically select the one it finds most | it finds suitable. libcurl will automatically select the one it finds most | ||||||
| @@ -438,11 +476,11 @@ Pass a long as parameter, which is set to a bitmask, to tell libcurl what | |||||||
| authentication method(s) you want it to use for your proxy authentication.  If | authentication method(s) you want it to use for your proxy authentication.  If | ||||||
| more than one bit is set, libcurl will first query the site to see what | more than one bit is set, libcurl will first query the site to see what | ||||||
| authentication methods it supports and then pick the best one you allow it to | authentication methods it supports and then pick the best one you allow it to | ||||||
| use. Note that for some methods, this will induce an extra network | use. For some methods, this will induce an extra network round-trip. Set the | ||||||
| round-trip. Set the actual name and password with the | actual name and password with the \fICURLOPT_PROXYUSERPWD\fP option. The | ||||||
| \fICURLOPT_PROXYUSERPWD\fP option. The bitmask can be constructed by or'ing | bitmask can be constructed by or'ing together the bits listed above for the | ||||||
| together the bits listed above for the \fICURLOPT_HTTPAUTH\fP option. As of | \fICURLOPT_HTTPAUTH\fP option. As of this writing, only Basic, Digest and NTLM | ||||||
| this writing, only Basic, Digest and NTLM work. (Added in 7.10.7) | work. (Added in 7.10.7) | ||||||
| .SH HTTP OPTIONS | .SH HTTP OPTIONS | ||||||
| .IP CURLOPT_AUTOREFERER | .IP CURLOPT_AUTOREFERER | ||||||
| Pass a non-zero parameter to enable this. When enabled, libcurl will | Pass a non-zero parameter to enable this. When enabled, libcurl will | ||||||
| @@ -465,19 +503,21 @@ lib/README.encoding for details. | |||||||
| A non-zero parameter tells the library to follow any Location: header that the | A non-zero parameter tells the library to follow any Location: header that the | ||||||
| server sends as part of an HTTP header. | server sends as part of an HTTP header. | ||||||
|  |  | ||||||
| \fBNOTE:\fP this means that the library will re-send the same request on the | This means that the library will re-send the same request on the new location | ||||||
| new location and follow new Location: headers all the way until no more such | and follow new Location: headers all the way until no more such headers are | ||||||
| headers are returned. \fICURLOPT_MAXREDIRS\fP can be used to limit the number | returned. \fICURLOPT_MAXREDIRS\fP can be used to limit the number of redirects | ||||||
| of redirects libcurl will follow. | libcurl will follow. | ||||||
| .IP CURLOPT_UNRESTRICTED_AUTH | .IP CURLOPT_UNRESTRICTED_AUTH | ||||||
| A non-zero parameter tells the library it can continue to send authentication | A non-zero parameter tells the library it can continue to send authentication | ||||||
| (user+password) when following locations, even when hostname changed. Note | (user+password) when following locations, even when hostname changed. This | ||||||
| that this is meaningful only when setting \fICURLOPT_FOLLOWLOCATION\fP. | option is meaningful only when setting \fICURLOPT_FOLLOWLOCATION\fP. | ||||||
| .IP CURLOPT_MAXREDIRS | .IP CURLOPT_MAXREDIRS | ||||||
| Pass a long. The set number will be the redirection limit. If that many | Pass a long. The set number will be the redirection limit. If that many | ||||||
| redirections have been followed, the next redirect will cause an error | redirections have been followed, the next redirect will cause an error | ||||||
| (\fICURLE_TOO_MANY_REDIRECTS\fP). This option only makes sense if the | (\fICURLE_TOO_MANY_REDIRECTS\fP). This option only makes sense if the | ||||||
| \fICURLOPT_FOLLOWLOCATION\fP is used at the same time. | \fICURLOPT_FOLLOWLOCATION\fP is used at the same time. Added in 7.15.1: | ||||||
|  | Setting the limit to 0 will make libcurl refuse any redirect. Set it to -1 for | ||||||
|  | an infinite number of redirects (which is the default) | ||||||
| .IP CURLOPT_PUT | .IP CURLOPT_PUT | ||||||
| A non-zero parameter tells the library to use HTTP PUT to transfer data. The | A non-zero parameter tells the library to use HTTP PUT to transfer data. The | ||||||
| data should be set with \fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP. | data should be set with \fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP. | ||||||
| @@ -511,8 +551,11 @@ adding a header like "Transfer-Encoding: chunked" with | |||||||
| \fICURLOPT_HTTPHEADER\fP. With HTTP 1.0 or without chunked transfer, you must | \fICURLOPT_HTTPHEADER\fP. With HTTP 1.0 or without chunked transfer, you must | ||||||
| specify the size in the request. | specify the size in the request. | ||||||
|  |  | ||||||
| NOTE: if you have issued a POST request and want to make a HEAD or GET | When setting \fICURLOPT_POST\fP to a non-zero value, it will automatically set | ||||||
| instead, you must explictly pick the new request type using | \fICURLOPT_NOBODY\fP to 0 (since 7.14.1). | ||||||
|  |  | ||||||
|  | If you issue a POST request and then want to make a HEAD or GET using the same | ||||||
|  | re-used handle, you must explictly set the new request type using | ||||||
| \fICURLOPT_NOBODY\fP or \fICURLOPT_HTTPGET\fP or similar. | \fICURLOPT_NOBODY\fP or \fICURLOPT_HTTPGET\fP or similar. | ||||||
| .IP CURLOPT_POSTFIELDS | .IP CURLOPT_POSTFIELDS | ||||||
| Pass a char * as parameter, which should be the full data to post in an HTTP | Pass a char * as parameter, which should be the full data to post in an HTTP | ||||||
| @@ -528,8 +571,8 @@ commonly used one by HTML forms. See also the \fICURLOPT_POST\fP. Using | |||||||
| Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. | Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. | ||||||
| You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual. | You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual. | ||||||
|  |  | ||||||
| \fBNote:\fP to make multipart/formdata posts (aka rfc1867-posts), check out | To make multipart/formdata posts (aka rfc1867-posts), check out the | ||||||
| the \fICURLOPT_HTTPPOST\fP option. | \fICURLOPT_HTTPPOST\fP option. | ||||||
| .IP CURLOPT_POSTFIELDSIZE | .IP CURLOPT_POSTFIELDSIZE | ||||||
| If you want to post data to the server without letting libcurl do a strlen() | If you want to post data to the server without letting libcurl do a strlen() | ||||||
| to measure the data size, this option must be used. When this option is used | to measure the data size, this option must be used. When this option is used | ||||||
| @@ -550,6 +593,9 @@ must remain intact until you close this curl handle again with | |||||||
|  |  | ||||||
| Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. | Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. | ||||||
| You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual. | You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual. | ||||||
|  |  | ||||||
|  | When setting \fICURLOPT_HTTPPOST\fP, it will automatically set | ||||||
|  | \fICURLOPT_NOBODY\fP to 0 (since 7.14.1). | ||||||
| .IP CURLOPT_REFERER | .IP CURLOPT_REFERER | ||||||
| Pass a pointer to a zero terminated string as parameter. It will be used to | Pass a pointer to a zero terminated string as parameter. It will be used to | ||||||
| set the Referer: header in the http request sent to the remote server. This | set the Referer: header in the http request sent to the remote server. This | ||||||
| @@ -581,7 +627,7 @@ request-line are headers. | |||||||
|  |  | ||||||
| Pass a NULL to this to reset back to no custom headers. | Pass a NULL to this to reset back to no custom headers. | ||||||
|  |  | ||||||
| \fBNOTE:\fP The most commonly replaced headers have "shortcuts" in the options | The most commonly replaced headers have "shortcuts" in the options | ||||||
| \fICURLOPT_COOKIE\fP, \fICURLOPT_USERAGENT\fP and \fICURLOPT_REFERER\fP. | \fICURLOPT_COOKIE\fP, \fICURLOPT_USERAGENT\fP and \fICURLOPT_REFERER\fP. | ||||||
| .IP CURLOPT_HTTP200ALIASES | .IP CURLOPT_HTTP200ALIASES | ||||||
| Pass a pointer to a linked list of aliases to be treated as valid HTTP 200 | Pass a pointer to a linked list of aliases to be treated as valid HTTP 200 | ||||||
| @@ -594,9 +640,9 @@ The linked list should be a fully valid list of struct curl_slist structs, and | |||||||
| be properly filled in.  Use \fIcurl_slist_append(3)\fP to create the list and | be properly filled in.  Use \fIcurl_slist_append(3)\fP to create the list and | ||||||
| \fIcurl_slist_free_all(3)\fP to clean up an entire list. | \fIcurl_slist_free_all(3)\fP to clean up an entire list. | ||||||
|  |  | ||||||
| \fBNOTE:\fP The alias itself is not parsed for any version strings.  So if your | The alias itself is not parsed for any version strings.  So if your alias is | ||||||
| alias is "MYHTTP/9.9", Libcurl will not treat the server as responding with | \&"MYHTTP/9.9", Libcurl will not treat the server as responding with HTTP | ||||||
| HTTP version 9.9.  Instead Libcurl will use the value set by option | version 9.9.  Instead Libcurl will use the value set by option | ||||||
| \fICURLOPT_HTTP_VERSION\fP. | \fICURLOPT_HTTP_VERSION\fP. | ||||||
| .IP CURLOPT_COOKIE | .IP CURLOPT_COOKIE | ||||||
| Pass a pointer to a zero terminated string as parameter. It will be used to | Pass a pointer to a zero terminated string as parameter. It will be used to | ||||||
| @@ -620,6 +666,9 @@ dumped to a file. | |||||||
| Given an empty or non-existing file or by passing the empty string (""), this | Given an empty or non-existing file or by passing the empty string (""), this | ||||||
| option will enable cookies for this curl handle, making it understand and | option will enable cookies for this curl handle, making it understand and | ||||||
| parse received cookies and then use matching cookies in future request. | parse received cookies and then use matching cookies in future request. | ||||||
|  |  | ||||||
|  | If you use this option multiple times, you just add more files to read. | ||||||
|  | Subsequent files will add more cookies. | ||||||
| .IP CURLOPT_COOKIEJAR | .IP CURLOPT_COOKIEJAR | ||||||
| Pass a file name as char *, zero terminated. This will make libcurl write all | Pass a file name as char *, zero terminated. This will make libcurl write all | ||||||
| internally known cookies to the specified file when \fIcurl_easy_cleanup(3)\fP | internally known cookies to the specified file when \fIcurl_easy_cleanup(3)\fP | ||||||
| @@ -628,7 +677,7 @@ instead have the cookies written to stdout. Using this option also enables | |||||||
| cookies for this session, so if you for example follow a location it will make | cookies for this session, so if you for example follow a location it will make | ||||||
| matching cookies get sent accordingly. | matching cookies get sent accordingly. | ||||||
|  |  | ||||||
| \fBNOTE:\fP If the cookie jar file can't be created or written to (when the | If the cookie jar file can't be created or written to (when the | ||||||
| \fIcurl_easy_cleanup(3)\fP is called), libcurl will not and cannot report an | \fIcurl_easy_cleanup(3)\fP is called), libcurl will not and cannot report an | ||||||
| error for this. Using \fICURLOPT_VERBOSE\fP or \fICURLOPT_DEBUGFUNCTION\fP | error for this. Using \fICURLOPT_VERBOSE\fP or \fICURLOPT_DEBUGFUNCTION\fP | ||||||
| will get a warning to display, but that is the only visible feedback you get | will get a warning to display, but that is the only visible feedback you get | ||||||
| @@ -640,10 +689,18 @@ cookies" from the previous session. By default, libcurl always stores and | |||||||
| loads all cookies, independent if they are session cookies are not. Session | loads all cookies, independent if they are session cookies are not. Session | ||||||
| cookies are cookies without expiry date and they are meant to be alive and | cookies are cookies without expiry date and they are meant to be alive and | ||||||
| existing for this "session" only. | existing for this "session" only. | ||||||
|  | .IP CURLOPT_COOKIELIST | ||||||
|  | Pass a char * to a cookie string. Cookie can be either in Netscape / Mozilla | ||||||
|  | format or just regular HTTP-style header (Set-Cookie: ...) format. If cURL | ||||||
|  | cookie engine was not enabled it will enable its cookie engine.  Passing a | ||||||
|  | magic string \&"ALL" will erase all cookies known by cURL. (Added in 7.14.1) | ||||||
| .IP CURLOPT_HTTPGET | .IP CURLOPT_HTTPGET | ||||||
| Pass a long. If the long is non-zero, this forces the HTTP request to get back | Pass a long. If the long is non-zero, this forces the HTTP request to get back | ||||||
| to GET. usable if a POST, HEAD, PUT or a custom request have been used | to GET. usable if a POST, HEAD, PUT or a custom request have been used | ||||||
| previously using the same curl handle. | previously using the same curl handle. | ||||||
|  |  | ||||||
|  | When setting \fICURLOPT_HTTPGET\fP to a non-zero value, it will automatically | ||||||
|  | set \fICURLOPT_NOBODY\fP to 0 (since 7.14.1). | ||||||
| .IP CURLOPT_HTTP_VERSION | .IP CURLOPT_HTTP_VERSION | ||||||
| Pass a long, set to one of the values described below. They force libcurl to | Pass a long, set to one of the values described below. They force libcurl to | ||||||
| use the specific HTTP versions. This is not sensible to do unless you have a | use the specific HTTP versions. This is not sensible to do unless you have a | ||||||
| @@ -656,6 +713,12 @@ it thinks fit. | |||||||
| Enforce HTTP 1.0 requests. | Enforce HTTP 1.0 requests. | ||||||
| .IP CURL_HTTP_VERSION_1_1 | .IP CURL_HTTP_VERSION_1_1 | ||||||
| Enforce HTTP 1.1 requests. | Enforce HTTP 1.1 requests. | ||||||
|  | .IP CURLOPT_IGNORE_CONTENT_LENGTH | ||||||
|  | Ignore the Content-Length header. This is useful for Apache 1.x (and similar | ||||||
|  | servers) which will report incorrect content length for files over 2 | ||||||
|  | gigabytes. If this option is used, curl will not be able to accurately report | ||||||
|  | progress, and will simply stop the download when the server ends the | ||||||
|  | connection. (added in 7.14.1) | ||||||
| .RE | .RE | ||||||
| .SH FTP OPTIONS | .SH FTP OPTIONS | ||||||
| .IP CURLOPT_FTPPORT | .IP CURLOPT_FTPPORT | ||||||
| @@ -721,11 +784,19 @@ directory. (Added in 7.10.7) | |||||||
| .IP CURLOPT_FTP_RESPONSE_TIMEOUT | .IP CURLOPT_FTP_RESPONSE_TIMEOUT | ||||||
| Pass a long.  Causes curl to set a timeout period (in seconds) on the amount | Pass a long.  Causes curl to set a timeout period (in seconds) on the amount | ||||||
| of time that the server is allowed to take in order to generate a response | of time that the server is allowed to take in order to generate a response | ||||||
| message for a command before the session is considered hung.  Note that while | message for a command before the session is considered hung.  While curl is | ||||||
| curl is waiting for a response, this value overrides \fICURLOPT_TIMEOUT\fP. It | waiting for a response, this value overrides \fICURLOPT_TIMEOUT\fP. It is | ||||||
| is recommended that if used in conjunction with \fICURLOPT_TIMEOUT\fP, you set | recommended that if used in conjunction with \fICURLOPT_TIMEOUT\fP, you set | ||||||
| \fICURLOPT_FTP_RESPONSE_TIMEOUT\fP to a value smaller than | \fICURLOPT_FTP_RESPONSE_TIMEOUT\fP to a value smaller than | ||||||
| \fICURLOPT_TIMEOUT\fP.  (Added in 7.10.8) | \fICURLOPT_TIMEOUT\fP.  (Added in 7.10.8) | ||||||
|  | .IP CURLOPT_FTP_SKIP_PASV_IP | ||||||
|  | Pass a long. If set to a non-zero value, it instructs libcurl to not use the | ||||||
|  | IP address the server suggests in its 227-response to libcurl's PASV command | ||||||
|  | when libcurl connects the data connection. Instead libcurl will re-use the | ||||||
|  | same IP address it already uses for the control connection. But it will use | ||||||
|  | the port number from the 227-response. (Added in 7.14.2) | ||||||
|  |  | ||||||
|  | This option has no effect if PORT, EPRT or EPSV is used instead of PASV. | ||||||
| .IP CURLOPT_FTP_SSL | .IP CURLOPT_FTP_SSL | ||||||
| Pass a long using one of the values from below, to make libcurl use your | Pass a long using one of the values from below, to make libcurl use your | ||||||
| desired level of SSL for the ftp transfer. (Added in 7.11.0) | desired level of SSL for the ftp transfer. (Added in 7.11.0) | ||||||
| @@ -770,11 +841,14 @@ this data is sent off using the ACCT command. (Added in 7.13.0) | |||||||
| .SH PROTOCOL OPTIONS | .SH PROTOCOL OPTIONS | ||||||
| .IP CURLOPT_TRANSFERTEXT | .IP CURLOPT_TRANSFERTEXT | ||||||
| A non-zero parameter tells the library to use ASCII mode for ftp transfers, | A non-zero parameter tells the library to use ASCII mode for ftp transfers, | ||||||
| instead of the default binary transfer. For LDAP transfers it gets the data in | instead of the default binary transfer. For win32 systems it does not set the | ||||||
| plain text instead of HTML and for win32 systems it does not set the stdout to | stdout to binary mode. This option can be usable when transferring text data | ||||||
| binary mode. This option can be usable when transferring text data between | between systems with different views on certain characters, such as newlines | ||||||
| systems with different views on certain characters, such as newlines or | or similar. | ||||||
| similar. |  | ||||||
|  | libcurl does not do a complete ASCII conversion when doing ASCII transfers | ||||||
|  | over FTP. This is a known limitation/flaw that nobody has rectified. libcurl | ||||||
|  | simply sets the mode to ascii and performs a standard transfer. | ||||||
| .IP CURLOPT_CRLF | .IP CURLOPT_CRLF | ||||||
| Convert Unix newlines to CRLF newlines on transfers. | Convert Unix newlines to CRLF newlines on transfers. | ||||||
| .IP CURLOPT_RANGE | .IP CURLOPT_RANGE | ||||||
| @@ -800,11 +874,11 @@ server supports the command first. | |||||||
|  |  | ||||||
| Restore to the internal default by setting this to NULL. | Restore to the internal default by setting this to NULL. | ||||||
|  |  | ||||||
| \fBNOTE:\fP Many people have wrongly used this option to replace the entire | Many people have wrongly used this option to replace the entire request with | ||||||
| request with their own, including multiple headers and POST contents. While | their own, including multiple headers and POST contents. While that might work | ||||||
| that might work in many cases, it will cause libcurl to send invalid requests | in many cases, it will cause libcurl to send invalid requests and it could | ||||||
| and it could possibly confuse the remote server badly. Use \fICURLOPT_POST\fP | possibly confuse the remote server badly. Use \fICURLOPT_POST\fP and | ||||||
| and \fICURLOPT_POSTFIELDS\fP to set POST data. Use \fICURLOPT_HTTPHEADER\fP to | \fICURLOPT_POSTFIELDS\fP to set POST data. Use \fICURLOPT_HTTPHEADER\fP to | ||||||
| replace or extend the set of headers sent by libcurl. Use | replace or extend the set of headers sent by libcurl. Use | ||||||
| \fICURLOPT_HTTP_VERSION\fP to change HTTP version. | \fICURLOPT_HTTP_VERSION\fP to change HTTP version. | ||||||
| .IP CURLOPT_FILETIME | .IP CURLOPT_FILETIME | ||||||
| @@ -818,9 +892,8 @@ A non-zero parameter tells the library to not include the body-part in the | |||||||
| output. This is only relevant for protocols that have separate header and body | output. This is only relevant for protocols that have separate header and body | ||||||
| parts. On HTTP(S) servers, this will make libcurl do a HEAD request. | parts. On HTTP(S) servers, this will make libcurl do a HEAD request. | ||||||
|  |  | ||||||
| To change back to GET, you should use \fICURLOPT_HTTPGET\fP. To change back to | To change request to GET, you should use \fICURLOPT_HTTPGET\fP. Change request | ||||||
| POST, you should use \fICURLOPT_POST\fP. Setting \fICURLOPT_NOBODY\fP to zero | to POST with \fICURLOPT_POST\fP etc. | ||||||
| has no effect. |  | ||||||
| .IP CURLOPT_INFILESIZE | .IP CURLOPT_INFILESIZE | ||||||
| When uploading a file to a remote site, this option should be used to tell | When uploading a file to a remote site, this option should be used to tell | ||||||
| libcurl what the expected size of the infile is. This value should be passed | libcurl what the expected size of the infile is. This value should be passed | ||||||
| @@ -849,26 +922,26 @@ Pass a long as parameter. This allows you to specify the maximum size (in | |||||||
| bytes) of a file to download. If the file requested is larger than this value, | bytes) of a file to download. If the file requested is larger than this value, | ||||||
| the transfer will not start and CURLE_FILESIZE_EXCEEDED will be returned. | the transfer will not start and CURLE_FILESIZE_EXCEEDED will be returned. | ||||||
|  |  | ||||||
| \fBNOTE:\fP The file size is not always known prior to download, and for such | The file size is not always known prior to download, and for such files this | ||||||
| files this option has no effect even if the file transfer ends up being larger | option has no effect even if the file transfer ends up being larger than this | ||||||
| than this given limit. This concerns both FTP and HTTP transfers. | given limit. This concerns both FTP and HTTP transfers. | ||||||
| .IP CURLOPT_MAXFILESIZE_LARGE | .IP CURLOPT_MAXFILESIZE_LARGE | ||||||
| Pass a curl_off_t as parameter. This allows you to specify the maximum size | Pass a curl_off_t as parameter. This allows you to specify the maximum size | ||||||
| (in bytes) of a file to download. If the file requested is larger than this | (in bytes) of a file to download. If the file requested is larger than this | ||||||
| value, the transfer will not start and \fICURLE_FILESIZE_EXCEEDED\fP will be | value, the transfer will not start and \fICURLE_FILESIZE_EXCEEDED\fP will be | ||||||
| returned. (Added in 7.11.0) | returned. (Added in 7.11.0) | ||||||
|  |  | ||||||
| \fBNOTE:\fP The file size is not always known prior to download, and for such | The file size is not always known prior to download, and for such files this | ||||||
| files this option has no effect even if the file transfer ends up being larger | option has no effect even if the file transfer ends up being larger than this | ||||||
| than this given limit. This concerns both FTP and HTTP transfers. | given limit. This concerns both FTP and HTTP transfers. | ||||||
| .IP CURLOPT_TIMECONDITION | .IP CURLOPT_TIMECONDITION | ||||||
| Pass a long as parameter. This defines how the \fICURLOPT_TIMEVALUE\fP time | Pass a long as parameter. This defines how the \fICURLOPT_TIMEVALUE\fP time | ||||||
| value is treated. You can set this parameter to \fICURL_TIMECOND_IFMODSINCE\fP | value is treated. You can set this parameter to \fICURL_TIMECOND_IFMODSINCE\fP | ||||||
| or \fICURL_TIMECOND_IFUNMODSINCE\fP. This feature applies to HTTP and FTP. | or \fICURL_TIMECOND_IFUNMODSINCE\fP. This feature applies to HTTP and FTP. | ||||||
|  |  | ||||||
| \fBNOTE:\fP The last modification time of a file is not always known and in such | The last modification time of a file is not always known and in such instances | ||||||
| instances this feature will have no effect even if the given time condition | this feature will have no effect even if the given time condition would have | ||||||
| would have not been met. | not been met. | ||||||
| .IP CURLOPT_TIMEVALUE | .IP CURLOPT_TIMEVALUE | ||||||
| Pass a long as parameter. This should be the time in seconds since 1 jan 1970, | Pass a long as parameter. This should be the time in seconds since 1 jan 1970, | ||||||
| and the time will be used in a condition as specified with | and the time will be used in a condition as specified with | ||||||
| @@ -881,8 +954,8 @@ considerable time and limiting operations to less than a few minutes risk | |||||||
| aborting perfectly normal operations. This option will cause curl to use the | aborting perfectly normal operations. This option will cause curl to use the | ||||||
| SIGALRM to enable time-outing system calls. | SIGALRM to enable time-outing system calls. | ||||||
|  |  | ||||||
| \fBNOTE:\fP this is not recommended to use in unix multi-threaded programs, as | In unix-like systems, this might cause signals to be used unless | ||||||
| it uses signals unless \fICURLOPT_NOSIGNAL\fP (see above) is set. | \fICURLOPT_NOSIGNAL\fP is set. | ||||||
| .IP CURLOPT_LOW_SPEED_LIMIT | .IP CURLOPT_LOW_SPEED_LIMIT | ||||||
| Pass a long as parameter. It contains the transfer speed in bytes per second | Pass a long as parameter. It contains the transfer speed in bytes per second | ||||||
| that the transfer should be below during \fICURLOPT_LOW_SPEED_TIME\fP seconds | that the transfer should be below during \fICURLOPT_LOW_SPEED_TIME\fP seconds | ||||||
| @@ -903,9 +976,9 @@ When reaching the maximum limit, curl uses the \fICURLOPT_CLOSEPOLICY\fP to | |||||||
| figure out which of the existing connections to close to prevent the number of | figure out which of the existing connections to close to prevent the number of | ||||||
| open connections to increase. | open connections to increase. | ||||||
|  |  | ||||||
| \fBNOTE:\fP if you already have performed transfers with this curl handle, | If you already have performed transfers with this curl handle, setting a | ||||||
| setting a smaller MAXCONNECTS than before may cause open connections to get | smaller MAXCONNECTS than before may cause open connections to get closed | ||||||
| closed unnecessarily. | unnecessarily. | ||||||
| .IP CURLOPT_CLOSEPOLICY | .IP CURLOPT_CLOSEPOLICY | ||||||
| Pass a long. This option sets what policy libcurl should use when the | Pass a long. This option sets what policy libcurl should use when the | ||||||
| connection cache is filled and one of the open connections has to be closed to | connection cache is filled and one of the open connections has to be closed to | ||||||
| @@ -937,8 +1010,8 @@ it has connected, this option is of no more use. Set to zero to disable | |||||||
| connection timeout (it will then only timeout on the system's internal | connection timeout (it will then only timeout on the system's internal | ||||||
| timeouts). See also the \fICURLOPT_TIMEOUT\fP option. | timeouts). See also the \fICURLOPT_TIMEOUT\fP option. | ||||||
|  |  | ||||||
| \fBNOTE:\fP this is not recommended to use in unix multi-threaded programs, as | In unix-like systems, this might cause signals to be used unless | ||||||
| it uses signals unless \fICURLOPT_NOSIGNAL\fP (see above) is set. | \fICURLOPT_NOSIGNAL\fP is set. | ||||||
| .IP CURLOPT_IPRESOLVE | .IP CURLOPT_IPRESOLVE | ||||||
| Allows an application to select what kind of IP addresses to use when | Allows an application to select what kind of IP addresses to use when | ||||||
| resolving host names. This is only interesting when using host names that | resolving host names. This is only interesting when using host names that | ||||||
| @@ -975,9 +1048,9 @@ changed with \fICURLOPT_SSLKEYTYPE\fP. | |||||||
| Pass a pointer to a zero terminated string as parameter. The string should be | Pass a pointer to a zero terminated string as parameter. The string should be | ||||||
| the format of your private key. Supported formats are "PEM", "DER" and "ENG". | the format of your private key. Supported formats are "PEM", "DER" and "ENG". | ||||||
|  |  | ||||||
| \fBNOTE:\fP The format "ENG" enables you to load the private key from a crypto | The format "ENG" enables you to load the private key from a crypto engine. In | ||||||
| engine. In this case \fICURLOPT_SSLKEY\fP is used as an identifier passed to | this case \fICURLOPT_SSLKEY\fP is used as an identifier passed to the | ||||||
| the engine. You have to set the crypto engine with \fICURLOPT_SSLENGINE\fP. | engine. You have to set the crypto engine with \fICURLOPT_SSLENGINE\fP. | ||||||
| \&"DER" format key file currently does not work because of a bug in OpenSSL. | \&"DER" format key file currently does not work because of a bug in OpenSSL. | ||||||
| .IP CURLOPT_SSLKEYPASSWD | .IP CURLOPT_SSLKEYPASSWD | ||||||
| Pass a pointer to a zero terminated string as parameter. It will be used as | Pass a pointer to a zero terminated string as parameter. It will be used as | ||||||
| @@ -987,14 +1060,14 @@ Pass a pointer to a zero terminated string as parameter. It will be used as | |||||||
| the identifier for the crypto engine you want to use for your private | the identifier for the crypto engine you want to use for your private | ||||||
| key. | key. | ||||||
|  |  | ||||||
| \fBNOTE:\fP If the crypto device cannot be loaded, | If the crypto device cannot be loaded, \fICURLE_SSL_ENGINE_NOTFOUND\fP is | ||||||
| \fICURLE_SSL_ENGINE_NOTFOUND\fP is returned. | returned. | ||||||
| .IP CURLOPT_SSLENGINE_DEFAULT | .IP CURLOPT_SSLENGINE_DEFAULT | ||||||
| Sets the actual crypto engine as the default for (asymmetric) crypto | Sets the actual crypto engine as the default for (asymmetric) crypto | ||||||
| operations. | operations. | ||||||
|  |  | ||||||
| \fBNOTE:\fP If the crypto device cannot be set, | If the crypto device cannot be set, \fICURLE_SSL_ENGINE_SETFAILED\fP is | ||||||
| \fICURLE_SSL_ENGINE_SETFAILED\fP is returned. | returned. | ||||||
| .IP CURLOPT_SSLVERSION | .IP CURLOPT_SSLVERSION | ||||||
| Pass a long as parameter to control what version of SSL/TLS to attempt to use. | Pass a long as parameter to control what version of SSL/TLS to attempt to use. | ||||||
| The available options are: | The available options are: | ||||||
| @@ -1060,26 +1133,25 @@ socket. It will be used to seed the random engine for SSL. | |||||||
| .IP CURLOPT_SSL_VERIFYHOST | .IP CURLOPT_SSL_VERIFYHOST | ||||||
| Pass a long as parameter. | Pass a long as parameter. | ||||||
|  |  | ||||||
| This option determines whether curl verifies that the server claims to be | This option determines whether libcurl verifies that the server cert is for | ||||||
| who you want it to be. | the server it is known as. | ||||||
|  |  | ||||||
| When negotiating an SSL connection, the server sends a certificate | When negotiating an SSL connection, the server sends a certificate indicating | ||||||
| indicating its identity. | its identity. | ||||||
|  |  | ||||||
| When \fICURLOPT_SSL_VERIFYHOST\fP is 2, that certificate must indicate | When \fICURLOPT_SSL_VERIFYHOST\fP is 2, that certificate must indicate that | ||||||
| that the server is the server to which you meant to connect, or the | the server is the server to which you meant to connect, or the connection | ||||||
| connection fails. | fails. | ||||||
|  |  | ||||||
| Curl considers the server the intended one when the Common Name field | Curl considers the server the intended one when the Common Name field or a | ||||||
| or a Subject Alternate Name field in the certificate matches the host | Subject Alternate Name field in the certificate matches the host name in the | ||||||
| name in the URL to which you told Curl to connect. | URL to which you told Curl to connect. | ||||||
|  |  | ||||||
| When the value is 1, the certificate must contain a Common Name field, | When the value is 1, the certificate must contain a Common Name field, but it | ||||||
| but it doesn't matter what name it says.  (This is not ordinarily a | doesn't matter what name it says.  (This is not ordinarily a useful setting). | ||||||
| useful setting). |  | ||||||
|  |  | ||||||
| When the value is 0, the connection succeeds regardless of the names in | When the value is 0, the connection succeeds regardless of the names in the | ||||||
| the certificate. | certificate. | ||||||
|  |  | ||||||
| The default, since 7.10, is 2. | The default, since 7.10, is 2. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,4 +23,4 @@ You must curl_free() the returned string when you're done with it. | |||||||
| .SH RETURN VALUE | .SH RETURN VALUE | ||||||
| A pointer to a zero terminated string or NULL if it failed. | A pointer to a zero terminated string or NULL if it failed. | ||||||
| .SH "SEE ALSO" | .SH "SEE ALSO" | ||||||
| .BR curl_unescape(3), curl_free(3), RFC 2396 | .BR curl_unescape "(3), " curl_free "(3), " RFC 2396 | ||||||
|   | |||||||
| @@ -90,7 +90,7 @@ followed by a pointer to a string to a name, will make libcurl use the given | |||||||
| name in the file upload part, instead of the actual file name given to | name in the file upload part, instead of the actual file name given to | ||||||
| \fICURLFORM_FILE\fP. | \fICURLFORM_FILE\fP. | ||||||
|  |  | ||||||
| .IP BCURLFORM_BUFFER | .IP CURLFORM_BUFFER | ||||||
| followed by a string, tells libcurl that a buffer is to be used to upload data | followed by a string, tells libcurl that a buffer is to be used to upload data | ||||||
| instead of using a file. The given string is used as the value of the file | instead of using a file. The given string is used as the value of the file | ||||||
| name field in the content header. | name field in the content header. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| .\" nroff -man [file] | .\" nroff -man [file] | ||||||
| .\" $Id$ | .\" $Id$ | ||||||
| .\" | .\" | ||||||
| .TH curl_getdate 3 "5 March 2001" "libcurl 7.0" "libcurl Manual" | .TH curl_getdate 3 "12 Aug 2005" "libcurl 7.0" "libcurl Manual" | ||||||
| .SH NAME | .SH NAME | ||||||
| curl_getdate - Convert an date string to number of seconds since January 1, | curl_getdate - Convert an date string to number of seconds since January 1, | ||||||
| 1970 | 1970 | ||||||
| @@ -26,7 +26,7 @@ order of the items is immaterial.  A date string may contain many flavors of | |||||||
| items: | items: | ||||||
| .TP 0.8i | .TP 0.8i | ||||||
| .B calendar date items | .B calendar date items | ||||||
| Can be specified several ways. Month names can only be three-letter | Can be specified several ways. Month names can only be three-letter english | ||||||
| abbrivations, numbers can be zero-prefixed and the year may use 2 or 4 digits. | abbrivations, numbers can be zero-prefixed and the year may use 2 or 4 digits. | ||||||
| Examples: 06 Nov 1994, 06-Nov-94 and Nov-94 6. | Examples: 06 Nov 1994, 06-Nov-94 and Nov-94 6. | ||||||
| .TP | .TP | ||||||
| @@ -94,7 +94,7 @@ crippled mktime(), \fIcurl_getdate\fP will return -1 in this case. | |||||||
| .SH REWRITE | .SH REWRITE | ||||||
| The former version of this function was built with yacc and was not only very | The former version of this function was built with yacc and was not only very | ||||||
| large, it was also never quite understood and it wasn't possible to build with | large, it was also never quite understood and it wasn't possible to build with | ||||||
| non-GNU tools since only Bison could make it thread-safe! | non-GNU tools since only GNU Bison could make it thread-safe! | ||||||
|  |  | ||||||
| The rewrite was done for 7.12.2. The new one is much smaller and use simpler | The rewrite was done for 7.12.2. The new one is much smaller and use simpler | ||||||
| code. | code. | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								docs/libcurl/getinfo-times
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								docs/libcurl/getinfo-times
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | An overview of the six time values available from curl_easy_getinfo() | ||||||
|  |  | ||||||
|  | curk_easy_perform() | ||||||
|  |     | | ||||||
|  |     |--NT | ||||||
|  |     |--|--CT | ||||||
|  |     |--|--|--PT | ||||||
|  |     |--|--|--|--ST | ||||||
|  |           |--|--|--TT | ||||||
|  |     |--|--|--|--|--RT | ||||||
|  |  | ||||||
|  | NT = CURLINFO_NAMELOOKUP_TIME. The time it took from the start until the name | ||||||
|  |      resolving was completed. | ||||||
|  | CT = CURLINFO_CONNECT_TIME. The time it took from the start until the connect | ||||||
|  |      to the remote host (or proxy) was completed. | ||||||
|  | PT = CURLINFO_PRETRANSFER_TIME. 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. | ||||||
|  | ST = CURLINFO_STARTTRANSFER_TIME. The time it took from the start until the | ||||||
|  |      first byte is just about to be transferred. | ||||||
|  | TT = CURLINFO_TOTAL_TIME. 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. | ||||||
|  | RT = CURLINFO_REDIRECT_TIME. 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. | ||||||
| @@ -196,8 +196,7 @@ Initiating the SSL Engine failed | |||||||
| The remote server denied curl to login (Added in 7.13.1) | The remote server denied curl to login (Added in 7.13.1) | ||||||
| .SH "CURLMcode" | .SH "CURLMcode" | ||||||
| This is the generic return code used by functions in the libcurl multi | This is the generic return code used by functions in the libcurl multi | ||||||
| interface. Also consider \fIcurl_multi_strerror(3)\fI. | interface. Also consider \fIcurl_multi_strerror(3)\fP. | ||||||
|  |  | ||||||
| .IP "CURLM_CALL_MULTI_PERFORM (-1)" | .IP "CURLM_CALL_MULTI_PERFORM (-1)" | ||||||
| This is not really an error. It means you should call | This is not really an error. It means you should call | ||||||
| \fIcurl_multi_perform(3)\fP again without doing select() or similar in between. | \fIcurl_multi_perform(3)\fP again without doing select() or similar in between. | ||||||
| @@ -213,9 +212,7 @@ You are doomed. | |||||||
| This can only be returned if libcurl bugs. Please report it to us! | This can only be returned if libcurl bugs. Please report it to us! | ||||||
| .SH "CURLSHcode" | .SH "CURLSHcode" | ||||||
| The "share" interface will return a CURLSHcode to indicate when an error has | The "share" interface will return a CURLSHcode to indicate when an error has | ||||||
| occurred.  Also consider \fIcurl_share_strerror(3)\fI. | occurred.  Also consider \fIcurl_share_strerror(3)\fP. | ||||||
|  |  | ||||||
| CURLSHcode is one of the following: |  | ||||||
| .IP "CURLSHE_OK (0)" | .IP "CURLSHE_OK (0)" | ||||||
| All fine. Proceed as usual. | All fine. Proceed as usual. | ||||||
| .IP "CURLSHE_BAD_OPTION (1)" | .IP "CURLSHE_BAD_OPTION (1)" | ||||||
|   | |||||||
| @@ -243,7 +243,7 @@ where it'll store a human readable error message as well. | |||||||
| If you then want to transfer another file, the handle is ready to be used | If you then want to transfer another file, the handle is ready to be used | ||||||
| again. Mind you, it is even preferred that you re-use an existing handle if | again. Mind you, it is even preferred that you re-use an existing handle if | ||||||
| you intend to make another transfer. libcurl will then attempt to re-use the | you intend to make another transfer. libcurl will then attempt to re-use the | ||||||
| previous | previous connection. | ||||||
|  |  | ||||||
| .SH "Multi-threading Issues" | .SH "Multi-threading Issues" | ||||||
| The first basic rule is that you must \fBnever\fP share a libcurl handle (be | The first basic rule is that you must \fBnever\fP share a libcurl handle (be | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| # LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION], | # LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION], | ||||||
| #                       [ACTION-IF-YES], [ACTION-IF-NO]) | #                       [ACTION-IF-YES], [ACTION-IF-NO]) | ||||||
| # ---------------------------------------------------------- | # ---------------------------------------------------------- | ||||||
| #      David Shaw <dshaw@jabberwocky.com>   Jan-23-2005 | #      David Shaw <dshaw@jabberwocky.com>   Jun-21-2005 | ||||||
| # | # | ||||||
| # Checks for libcurl.  DEFAULT-ACTION is the string yes or no to | # Checks for libcurl.  DEFAULT-ACTION is the string yes or no to | ||||||
| # specify whether to default to --with-libcurl or --without-libcurl. | # specify whether to default to --with-libcurl or --without-libcurl. | ||||||
| @@ -32,13 +32,7 @@ | |||||||
| # found is after version 7.7.2, the first version that included the | # found is after version 7.7.2, the first version that included the | ||||||
| # curl-config script.  Note that it is very important for people | # curl-config script.  Note that it is very important for people | ||||||
| # packaging binary versions of libcurl to include this script! | # packaging binary versions of libcurl to include this script! | ||||||
| # Without curl-config, we can only make educated guesses as to what | # Without curl-config, we can only guess what protocols are available. | ||||||
| # protocols are available.  Specifically, we assume that all of HTTP, |  | ||||||
| # FTP, GOPHER, FILE, TELNET, LDAP, and DICT exist, and (if SSL exists) |  | ||||||
| # HTTPS is present.  All of these protocols existed when libcurl was |  | ||||||
| # first created in version 7, so this is a safe assumption.  If the |  | ||||||
| # version is 7.11.0 or later, FTPS is assumed to be present as well. |  | ||||||
| # FTPS existed before then, but was not yet fully standards compliant. |  | ||||||
|  |  | ||||||
| AC_DEFUN([LIBCURL_CHECK_CONFIG], | AC_DEFUN([LIBCURL_CHECK_CONFIG], | ||||||
| [ | [ | ||||||
| @@ -103,6 +97,15 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG], | |||||||
|            fi |            fi | ||||||
|            if test x"$LIBCURL" = "x" ; then |            if test x"$LIBCURL" = "x" ; then | ||||||
|               LIBCURL=`$_libcurl_config --libs` |               LIBCURL=`$_libcurl_config --libs` | ||||||
|  |  | ||||||
|  |               # This is so silly, but Apple actually has a bug in their | ||||||
|  | 	      # curl-config script.  Fixed in Tiger, but there are still | ||||||
|  | 	      # lots of Panther installs around. | ||||||
|  |               case "${host}" in | ||||||
|  |                  powerpc-apple-darwin7*) | ||||||
|  |                     LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'` | ||||||
|  |                  ;; | ||||||
|  |               esac | ||||||
|            fi |            fi | ||||||
|  |  | ||||||
| 	   # All curl-config scripts support --feature | 	   # All curl-config scripts support --feature | ||||||
| @@ -130,8 +133,8 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG], | |||||||
|            [ |            [ | ||||||
|            _libcurl_save_cppflags=$CPPFLAGS |            _libcurl_save_cppflags=$CPPFLAGS | ||||||
|            CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" |            CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" | ||||||
|            _libcurl_save_ldflags=$LDFLAGS |            _libcurl_save_libs=$LIBS | ||||||
|            LDFLAGS="$LDFLAGS $LIBCURL" |            LIBS="$LIBS $LIBCURL" | ||||||
|  |  | ||||||
|            AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[ |            AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[ | ||||||
| /* Try and use a few common options to force a failure if we are | /* Try and use a few common options to force a failure if we are | ||||||
| @@ -147,12 +150,30 @@ x=CURLOPT_VERBOSE; | |||||||
| ]),libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no) | ]),libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no) | ||||||
|  |  | ||||||
|            CPPFLAGS=$_libcurl_save_cppflags |            CPPFLAGS=$_libcurl_save_cppflags | ||||||
|            LDFLAGS=$_libcurl_save_ldflags |            LIBS=$_libcurl_save_libs | ||||||
|            unset _libcurl_save_cppflags |            unset _libcurl_save_cppflags | ||||||
|            unset _libcurl_save_ldflags |            unset _libcurl_save_libs | ||||||
|            ]) |            ]) | ||||||
|  |  | ||||||
|         if test $libcurl_cv_lib_curl_usable = yes ; then |         if test $libcurl_cv_lib_curl_usable = yes ; then | ||||||
|  |  | ||||||
|  | 	   # Does curl_free() exist in this version of libcurl? | ||||||
|  | 	   # If not, fake it with free() | ||||||
|  |  | ||||||
|  |            _libcurl_save_cppflags=$CPPFLAGS | ||||||
|  |            CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" | ||||||
|  |            _libcurl_save_libs=$LIBS | ||||||
|  |            LIBS="$LIBS $LIBCURL" | ||||||
|  |  | ||||||
|  |            AC_CHECK_FUNC(curl_free,, | ||||||
|  |   	      AC_DEFINE(curl_free,free, | ||||||
|  | 		[Define curl_free() as free() if our version of curl lacks curl_free.])) | ||||||
|  |  | ||||||
|  |            CPPFLAGS=$_libcurl_save_cppflags | ||||||
|  |            LIBS=$_libcurl_save_libs | ||||||
|  |            unset _libcurl_save_cppflags | ||||||
|  |            unset _libcurl_save_libs | ||||||
|  |  | ||||||
|            AC_DEFINE(HAVE_LIBCURL,1, |            AC_DEFINE(HAVE_LIBCURL,1, | ||||||
|              [Define to 1 if you have a functional curl library.]) |              [Define to 1 if you have a functional curl library.]) | ||||||
|            AC_SUBST(LIBCURL_CPPFLAGS) |            AC_SUBST(LIBCURL_CPPFLAGS) | ||||||
|   | |||||||
							
								
								
									
										20
									
								
								hiper/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								hiper/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | # | ||||||
|  | # Build a little app for the Hiper project | ||||||
|  | # During dev at least, we use a static libcurl. | ||||||
|  | # | ||||||
|  |  | ||||||
|  | LDFLAGS = -lcrypt -lidn -lssl -lcrypto -ldl -lz -lresolv -L../ares/.libs -lcares | ||||||
|  | LIBCURL = -L../lib/.libs/ -lcurl | ||||||
|  | CFLAGS = -I../include -g -DHAVE_CURL_MULTI_SOCKET | ||||||
|  |  | ||||||
|  | hiper: hiper.o $(LIBCURL) | ||||||
|  | 	$(CC) -o $@ $< $(LIBCURL) $(LDFLAGS) | ||||||
|  |  | ||||||
|  | hiper.o: hiper.c | ||||||
|  | 	$(CC) $(CFLAGS) -c $< | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	rm hiper.o hiper | ||||||
|  |  | ||||||
|  | $(LIBCURL): | ||||||
|  | 	(cd ../lib && make) | ||||||
							
								
								
									
										34
									
								
								hiper/collecturls.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								hiper/collecturls.pl
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | #!/usr/bin/perl | ||||||
|  |  | ||||||
|  | # 1) http://randomurl.com/body.php | ||||||
|  | # 2) http://random.yahoo.com/fast/ryl | ||||||
|  | # 3) http://www.uroulette.com/visit | ||||||
|  |  | ||||||
|  | # 1) very slow, responds with URL in body meta style: | ||||||
|  | # <meta http-equiv="refresh" content="0; url=http://www.webmasterworld.com/forum85/735.htm"> | ||||||
|  |  | ||||||
|  | # 2) Responds with non-HTTP headers like: | ||||||
|  | # Status: 301 | ||||||
|  | # Location: http://www.adaptive.net/ | ||||||
|  |  | ||||||
|  | # 3) ordinary 30X code and Location: | ||||||
|  |  | ||||||
|  | my $url; | ||||||
|  | map { $url .= " http://www.uroulette.com/visit"; } (1 .. 12); | ||||||
|  |  | ||||||
|  | print $url."\n"; | ||||||
|  |  | ||||||
|  | my $count=0; | ||||||
|  |  | ||||||
|  | open(DUMP, ">>dump"); | ||||||
|  |  | ||||||
|  | while(1) { | ||||||
|  |     my @getit = `curl -si $url`; | ||||||
|  |     for my $l (@getit) { | ||||||
|  |         if($l =~ /^Location: (.*)/) { | ||||||
|  |             print DUMP "$1\n"; | ||||||
|  |             print STDERR "$count\r"; | ||||||
|  |             $count++; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										377
									
								
								hiper/hiper.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										377
									
								
								hiper/hiper.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,377 @@ | |||||||
|  | /***************************************************************************** | ||||||
|  |  *                                  _   _ ____  _ | ||||||
|  |  *  Project                     ___| | | |  _ \| | | ||||||
|  |  *                             / __| | | | |_) | | | ||||||
|  |  *                            | (__| |_| |  _ <| |___ | ||||||
|  |  *                             \___|\___/|_| \_\_____| | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  |  * | ||||||
|  |  * Connect to N sites simultanouesly and download data. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <sys/time.h> | ||||||
|  | #include <time.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | #include <sys/poll.h> | ||||||
|  |  | ||||||
|  | #include <curl/curl.h> | ||||||
|  |  | ||||||
|  | /* The number of simultanoues connections/transfers we do */ | ||||||
|  | #define NCONNECTIONS 2000 | ||||||
|  |  | ||||||
|  | /* The least number of connections we are interested in, so when we go below | ||||||
|  |    this amount we can just as well stop */ | ||||||
|  | #define NMARGIN 50 | ||||||
|  |  | ||||||
|  | /* Number of loops (seconds) we allow the total download amount and alive | ||||||
|  |    connections to remain the same until we bail out. Set this slightly higher | ||||||
|  |    when using asynch supported libcurl. */ | ||||||
|  | #define IDLE_TIME 10 | ||||||
|  |  | ||||||
|  | struct globalinfo { | ||||||
|  |   size_t dlcounter; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | struct connection { | ||||||
|  |   CURL *e; | ||||||
|  |   int id; /* just a counter for easy browsing */ | ||||||
|  |   char url[80]; | ||||||
|  |   size_t dlcounter; | ||||||
|  |   struct globalinfo *global; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static size_t | ||||||
|  | writecallback(void *ptr, size_t size, size_t nmemb, void *data) | ||||||
|  | { | ||||||
|  |   size_t realsize = size * nmemb; | ||||||
|  |   struct connection *c = (struct connection *)data; | ||||||
|  |  | ||||||
|  |   c->dlcounter += realsize; | ||||||
|  |   c->global->dlcounter += realsize; | ||||||
|  |  | ||||||
|  | #if 0 | ||||||
|  |   printf("%02d: %d, total %d\n", | ||||||
|  |          c->id, c->dlcounter, c->global->dlcounter); | ||||||
|  | #endif | ||||||
|  |   return realsize; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* return the diff between two timevals, in us */ | ||||||
|  | static long tvdiff(struct timeval *newer, struct timeval *older) | ||||||
|  | { | ||||||
|  |   return (newer->tv_sec-older->tv_sec)*1000000+ | ||||||
|  |     (newer->tv_usec-older->tv_usec); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* store the start time of the program in this variable */ | ||||||
|  | static struct timeval timer; | ||||||
|  |  | ||||||
|  | static void timer_start(void) | ||||||
|  | { | ||||||
|  |   /* capture the time of the start moment */ | ||||||
|  |   gettimeofday(&timer, NULL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static struct timeval cont; /* at this moment we continued */ | ||||||
|  |  | ||||||
|  | int still_running; /* keep number of running handles */ | ||||||
|  |  | ||||||
|  | struct conncount { | ||||||
|  |   long time_us; | ||||||
|  |   long laps; | ||||||
|  |   long maxtime; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | struct conncount timecount[NCONNECTIONS+1]; | ||||||
|  |  | ||||||
|  | static struct timeval timerpause; | ||||||
|  | static void timer_pause(void) | ||||||
|  | { | ||||||
|  |   /* capture the time of the pause moment */ | ||||||
|  |   gettimeofday(&timerpause, NULL); | ||||||
|  |  | ||||||
|  |   /* If we have a previous continue (all times except the first), we can now | ||||||
|  |      store the time for a whole "lap" */ | ||||||
|  |   if(cont.tv_sec) { | ||||||
|  |     long lap; | ||||||
|  |  | ||||||
|  |     lap = tvdiff(&timerpause, &cont); | ||||||
|  |  | ||||||
|  |     timecount[still_running].time_us += lap; | ||||||
|  |     timecount[still_running].laps++; /* number of times added */ | ||||||
|  |  | ||||||
|  |     if(lap > timecount[still_running].maxtime) { | ||||||
|  |       timecount[still_running].maxtime = lap; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static long paused; /* amount of us we have been pausing */ | ||||||
|  |  | ||||||
|  | static void timer_continue(void) | ||||||
|  | { | ||||||
|  |   /* Capture the time of the restored operation moment, now calculate how long | ||||||
|  |      time we were paused and added that to the 'paused' variable. | ||||||
|  |    */ | ||||||
|  |   gettimeofday(&cont, NULL); | ||||||
|  |  | ||||||
|  |   paused += tvdiff(&cont, &timerpause); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static long total; /* amount of us from start to stop */ | ||||||
|  | static void timer_stop(void) | ||||||
|  | { | ||||||
|  |   struct timeval stop; | ||||||
|  |   /* Capture the time of the operation stopped moment, now calculate how long | ||||||
|  |      time we were running and how much of that pausing. | ||||||
|  |    */ | ||||||
|  |   gettimeofday(&stop, NULL); | ||||||
|  |  | ||||||
|  |   total = tvdiff(&stop, &timer); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | struct globalinfo info; | ||||||
|  | struct connection conns[NCONNECTIONS]; | ||||||
|  |  | ||||||
|  | long selects; | ||||||
|  | long selectsalive; | ||||||
|  | long timeouts; | ||||||
|  |  | ||||||
|  | long perform; | ||||||
|  | long performalive; | ||||||
|  | long performselect; | ||||||
|  | long topselect; | ||||||
|  |  | ||||||
|  | static void report(void) | ||||||
|  | { | ||||||
|  |   int i; | ||||||
|  |   long active = total - paused; | ||||||
|  |   long numdl = 0; | ||||||
|  |  | ||||||
|  |   for(i=0; i < NCONNECTIONS; i++) { | ||||||
|  |     if(conns[i].dlcounter) | ||||||
|  |       numdl++; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   printf("Summary from %d simultanoues transfers:\n", | ||||||
|  |          NCONNECTIONS); | ||||||
|  |  | ||||||
|  |   printf("Total time %ldus - Paused %ldus = Active %ldus =\n Active/total" | ||||||
|  |          " %ldus\n", | ||||||
|  |          total, paused, active, active/NCONNECTIONS); | ||||||
|  |  | ||||||
|  |   printf(" Active/(connections that delivered data) = %ldus\n", | ||||||
|  |          active/numdl); | ||||||
|  |  | ||||||
|  |   printf("%d out of %d connections provided data\n", numdl, NCONNECTIONS); | ||||||
|  |  | ||||||
|  |   printf("%d calls to curl_multi_perform(), average %d alive. " | ||||||
|  |          "Average time: %dus\n", | ||||||
|  |          perform, performalive/perform, active/perform); | ||||||
|  |  | ||||||
|  |   printf("%d calls to select(), average %d alive\n", | ||||||
|  |          selects, selectsalive/selects); | ||||||
|  |   printf(" Average number of readable connections per select() return: %d\n", | ||||||
|  |          performselect/selects); | ||||||
|  |   printf(" Max number of readable connections for a single select() " | ||||||
|  |          "return: %d\n", | ||||||
|  |          topselect); | ||||||
|  |  | ||||||
|  |   printf("%ld select() timeouts\n", timeouts); | ||||||
|  |  | ||||||
|  |   for(i=1; i< NCONNECTIONS; i++) { | ||||||
|  |     if(timecount[i].laps) { | ||||||
|  |       printf("Time %d connections, average %ld max %ld (%ld laps) average/conn: %ld\n", | ||||||
|  |              i, | ||||||
|  |              timecount[i].time_us/timecount[i].laps, | ||||||
|  |              timecount[i].maxtime, | ||||||
|  |              timecount[i].laps, | ||||||
|  |              (timecount[i].time_us/timecount[i].laps)/i ); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(int argc, char **argv) | ||||||
|  | { | ||||||
|  |   CURLM *multi_handle; | ||||||
|  |   CURLMsg *msg; | ||||||
|  |   CURLcode code = CURLE_OK; | ||||||
|  |   CURLMcode mcode = CURLM_OK; | ||||||
|  |   int rc; | ||||||
|  |   int i; | ||||||
|  |   FILE *urls; | ||||||
|  |   int startindex=0; | ||||||
|  |   char buffer[256]; | ||||||
|  |  | ||||||
|  |   int prevalive=-1; | ||||||
|  |   int prevsamecounter=0; | ||||||
|  |   int prevtotal = -1; | ||||||
|  |  | ||||||
|  |   memset(&info, 0, sizeof(struct globalinfo)); | ||||||
|  |  | ||||||
|  |   if(argc < 2) { | ||||||
|  |     printf("Usage: hiper [file] [start index]\n"); | ||||||
|  |     return 1; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   urls = fopen(argv[1], "r"); | ||||||
|  |   if(!urls) | ||||||
|  |     /* failed to open list of urls */ | ||||||
|  |     return 1; | ||||||
|  |  | ||||||
|  |   if(argc > 2) | ||||||
|  |     startindex = atoi(argv[2]); | ||||||
|  |  | ||||||
|  |   if(startindex) { | ||||||
|  |     /* Pass this many lines before we start using URLs from the file. On | ||||||
|  |        repeated invokes, try using different indexes to avoid torturing the | ||||||
|  |        same servers. */ | ||||||
|  |     while(startindex--) { | ||||||
|  |       if(!fgets(buffer, sizeof(buffer), urls)) | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* init the multi stack */ | ||||||
|  |   multi_handle = curl_multi_init(); | ||||||
|  |  | ||||||
|  |   for(i=0; i< NCONNECTIONS; i++) { | ||||||
|  |     CURL *e; | ||||||
|  |     char *nl; | ||||||
|  |  | ||||||
|  |     memset(&conns[i], 0, sizeof(struct connection)); | ||||||
|  |  | ||||||
|  |     /* read a line from the file of URLs */ | ||||||
|  |     if(!fgets(conns[i].url, sizeof(conns[i].url), urls)) | ||||||
|  |       /* failed to read a line */ | ||||||
|  |       break; | ||||||
|  |  | ||||||
|  |     /* strip off trailing newlines */ | ||||||
|  |     nl = strchr(conns[i].url, '\n'); | ||||||
|  |     if(nl) | ||||||
|  |       *nl=0; /* cut */ | ||||||
|  |  | ||||||
|  |     printf("%d: Add URL %s\n", i, conns[i].url); | ||||||
|  |  | ||||||
|  |     e  = curl_easy_init(); | ||||||
|  |     conns[i].e = e; | ||||||
|  |     conns[i].id = i; | ||||||
|  |     conns[i].global = &info; | ||||||
|  |  | ||||||
|  |     curl_easy_setopt(e, CURLOPT_URL, conns[i].url); | ||||||
|  |     curl_easy_setopt(e, CURLOPT_WRITEFUNCTION, writecallback); | ||||||
|  |     curl_easy_setopt(e, CURLOPT_WRITEDATA, &conns[i]); | ||||||
|  | #if 0 | ||||||
|  |     curl_easy_setopt(e, CURLOPT_VERBOSE, 1); | ||||||
|  |     curl_easy_setopt(e, CURLOPT_ERRORBUFFER, errorbuffer); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     /* add the easy to the multi */ | ||||||
|  |     curl_multi_add_handle(multi_handle, e); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |     /* we start some action by calling perform right away */ | ||||||
|  |   while(CURLM_CALL_MULTI_PERFORM == | ||||||
|  |         curl_multi_perform(multi_handle, &still_running)); | ||||||
|  |  | ||||||
|  |   printf("Starting timer!\n"); | ||||||
|  |   timer_start(); | ||||||
|  |  | ||||||
|  |   while(still_running) { | ||||||
|  |     struct timeval timeout; | ||||||
|  |     int rc; /* select() return code */ | ||||||
|  |  | ||||||
|  |     fd_set fdread; | ||||||
|  |     fd_set fdwrite; | ||||||
|  |     fd_set fdexcep; | ||||||
|  |     int maxfd; | ||||||
|  |  | ||||||
|  |     FD_ZERO(&fdread); | ||||||
|  |     FD_ZERO(&fdwrite); | ||||||
|  |     FD_ZERO(&fdexcep); | ||||||
|  |  | ||||||
|  |     /* set a suitable timeout to play around with */ | ||||||
|  |     timeout.tv_sec = 0; | ||||||
|  |     timeout.tv_usec = 50000; | ||||||
|  |  | ||||||
|  |     /* get file descriptors from the transfers */ | ||||||
|  |     curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); | ||||||
|  |  | ||||||
|  |     timer_pause(); | ||||||
|  |     selects++; | ||||||
|  |     selectsalive += still_running; | ||||||
|  |     rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||||
|  |  | ||||||
|  |     /* Output this here to make it outside the timer */ | ||||||
|  |     printf("Running: %d (%d bytes)\n", still_running, info.dlcounter); | ||||||
|  |  | ||||||
|  |     timer_continue(); | ||||||
|  |  | ||||||
|  |     switch(rc) { | ||||||
|  |     case -1: | ||||||
|  |       /* select error */ | ||||||
|  |       break; | ||||||
|  |     case 0: | ||||||
|  |       timeouts++; | ||||||
|  |     default: | ||||||
|  |       /* timeout or readable/writable sockets */ | ||||||
|  |       do { | ||||||
|  |         perform++; | ||||||
|  |         performalive += still_running; | ||||||
|  |       } | ||||||
|  |       while(CURLM_CALL_MULTI_PERFORM == | ||||||
|  |             curl_multi_perform(multi_handle, &still_running)); | ||||||
|  |  | ||||||
|  |       performselect += rc; | ||||||
|  |       if(rc > topselect) | ||||||
|  |         topselect = rc; | ||||||
|  |       break; | ||||||
|  |     } | ||||||
|  |     if(still_running < NMARGIN) { | ||||||
|  |       printf("Only %d connections left alive, existing\n", | ||||||
|  |              still_running); | ||||||
|  |       break; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if((prevalive == still_running) && (prevtotal == info.dlcounter) && | ||||||
|  |        info.dlcounter) { | ||||||
|  |       /* The same amount of still alive transfers as last lap, increase | ||||||
|  |          counter. Only do this if _anything_ has been downloaded since it | ||||||
|  |          tends to come here during the initial name lookup phase when using | ||||||
|  |          asynch DNS libcurl otherwise. | ||||||
|  |        */ | ||||||
|  |       prevsamecounter++; | ||||||
|  |  | ||||||
|  |       if(prevsamecounter >= IDLE_TIME) { | ||||||
|  |         /* for the sake of being efficient, we stop the operation when | ||||||
|  |            IDLE_TIME has passed without any bytes transfered */ | ||||||
|  |         printf("Idle time (%d secs) reached (with %d still claimed alive)," | ||||||
|  |                " exiting\n", | ||||||
|  |                IDLE_TIME, still_running); | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |       prevsamecounter=0; | ||||||
|  |     } | ||||||
|  |     prevalive = still_running; | ||||||
|  |     prevtotal = info.dlcounter; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   timer_stop(); | ||||||
|  |  | ||||||
|  |   curl_multi_cleanup(multi_handle); | ||||||
|  |  | ||||||
|  |   /* cleanup all the easy handles */ | ||||||
|  |   for(i=0; i< NCONNECTIONS; i++) | ||||||
|  |     curl_easy_cleanup(conns[i].e); | ||||||
|  |  | ||||||
|  |   report(); | ||||||
|  |  | ||||||
|  |   return code; | ||||||
|  | } | ||||||
| @@ -309,6 +309,13 @@ typedef enum { | |||||||
|   CURLE_SSL_ENGINE_INITFAILED,   /* 66 - failed to initialise ENGINE */ |   CURLE_SSL_ENGINE_INITFAILED,   /* 66 - failed to initialise ENGINE */ | ||||||
|   CURLE_LOGIN_DENIED,            /* 67 - user, password or similar was not |   CURLE_LOGIN_DENIED,            /* 67 - user, password or similar was not | ||||||
|                                     accepted and we failed to login */ |                                     accepted and we failed to login */ | ||||||
|  |   CURLE_TFTP_NOTFOUND,           /* 68 - file not found on server */ | ||||||
|  |   CURLE_TFTP_PERM,               /* 69 - permission problem on server */ | ||||||
|  |   CURLE_TFTP_DISKFULL,           /* 70 - out of disk space on server */ | ||||||
|  |   CURLE_TFTP_ILLEGAL,            /* 71 - Illegal TFTP operation */ | ||||||
|  |   CURLE_TFTP_UNKNOWNID,          /* 72 - Unknown transfer ID */ | ||||||
|  |   CURLE_TFTP_EXISTS,             /* 73 - File already exists */ | ||||||
|  |   CURLE_TFTP_NOSUCHUSER,         /* 74 - No such user */ | ||||||
|   CURL_LAST /* never use! */ |   CURL_LAST /* never use! */ | ||||||
| } CURLcode; | } CURLcode; | ||||||
|  |  | ||||||
| @@ -890,6 +897,21 @@ typedef enum { | |||||||
|      "account" info */ |      "account" info */ | ||||||
|   CINIT(FTP_ACCOUNT, OBJECTPOINT, 134), |   CINIT(FTP_ACCOUNT, OBJECTPOINT, 134), | ||||||
|  |  | ||||||
|  |   /* feed cookies into cookie engine */ | ||||||
|  |   CINIT(COOKIELIST, OBJECTPOINT, 135), | ||||||
|  |  | ||||||
|  |   /* ignore Content-Length */ | ||||||
|  |   CINIT(IGNORE_CONTENT_LENGTH, LONG, 136), | ||||||
|  |  | ||||||
|  |   /* Set to non-zero to skip the IP address received in a 227 PASV FTP server | ||||||
|  |      response. Typically used for FTP-SSL purposes but is not restricted to | ||||||
|  |      that. libcurl will then instead use the same IP address it used for the | ||||||
|  |      control connection. */ | ||||||
|  |   CINIT(FTP_SKIP_PASV_IP, LONG, 137), | ||||||
|  |  | ||||||
|  |   /* Select "file method" to use when doing FTP */ | ||||||
|  |   CINIT(FTP_FILEMETHOD, LONG, 138), | ||||||
|  |  | ||||||
|   CURLOPT_LASTENTRY /* the last unused */ |   CURLOPT_LASTENTRY /* the last unused */ | ||||||
| } CURLoption; | } CURLoption; | ||||||
|  |  | ||||||
| @@ -1202,11 +1224,10 @@ CURL_EXTERN void curl_slist_free_all(struct curl_slist *); | |||||||
|  * DESCRIPTION |  * DESCRIPTION | ||||||
|  * |  * | ||||||
|  * Returns the time, in seconds since 1 Jan 1970 of the time string given in |  * Returns the time, in seconds since 1 Jan 1970 of the time string given in | ||||||
|  * the first argument. The time argument in the second parameter is for cases |  * the first argument. The time argument in the second parameter is unused | ||||||
|  * where the specified time is relative now, like 'two weeks' or 'tomorrow' |  * and should be set to NULL. | ||||||
|  * etc. |  | ||||||
|  */ |  */ | ||||||
| CURL_EXTERN time_t curl_getdate(const char *p, const time_t *now); | CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused); | ||||||
|  |  | ||||||
| #define CURLINFO_STRING   0x100000 | #define CURLINFO_STRING   0x100000 | ||||||
| #define CURLINFO_LONG     0x200000 | #define CURLINFO_LONG     0x200000 | ||||||
| @@ -1244,6 +1265,7 @@ typedef enum { | |||||||
|   CURLINFO_OS_ERRNO         = CURLINFO_LONG   + 25, |   CURLINFO_OS_ERRNO         = CURLINFO_LONG   + 25, | ||||||
|   CURLINFO_NUM_CONNECTS     = CURLINFO_LONG   + 26, |   CURLINFO_NUM_CONNECTS     = CURLINFO_LONG   + 26, | ||||||
|   CURLINFO_SSL_ENGINES      = CURLINFO_SLIST  + 27, |   CURLINFO_SSL_ENGINES      = CURLINFO_SLIST  + 27, | ||||||
|  |   CURLINFO_COOKIELIST       = CURLINFO_SLIST  + 28, | ||||||
|   /* Fill in new entries below here! */ |   /* Fill in new entries below here! */ | ||||||
|  |  | ||||||
|   CURLINFO_LASTONE          = 28 |   CURLINFO_LASTONE          = 28 | ||||||
|   | |||||||
| @@ -28,7 +28,13 @@ | |||||||
|  |  | ||||||
| /* This is the version number of the libcurl package from which this header | /* This is the version number of the libcurl package from which this header | ||||||
|    file origins: */ |    file origins: */ | ||||||
| #define LIBCURL_VERSION "7.14.0-CVS" | #define LIBCURL_VERSION "7.15.1-CVS" | ||||||
|  |  | ||||||
|  | /* The numeric version number is also available "in parts" by using these | ||||||
|  |    defines: */ | ||||||
|  | #define LIBCURL_VERSION_MAJOR 7 | ||||||
|  | #define LIBCURL_VERSION_MINOR 15 | ||||||
|  | #define LIBCURL_VERSION_PATCH 1 | ||||||
|  |  | ||||||
| /* This is the numeric version of the libcurl version number, meant for easier | /* This is the numeric version of the libcurl version number, meant for easier | ||||||
|    parsing and comparions by programs. The LIBCURL_VERSION_NUM define will |    parsing and comparions by programs. The LIBCURL_VERSION_NUM define will | ||||||
| @@ -37,19 +43,14 @@ | |||||||
|          0xXXYYZZ |          0xXXYYZZ | ||||||
|  |  | ||||||
|    Where XX, YY and ZZ are the main version, release and patch numbers in |    Where XX, YY and ZZ are the main version, release and patch numbers in | ||||||
|    hexadecimal. All three numbers are always represented using two digits.  1.2 |    hexadecimal (using 8 bits each). All three numbers are always represented | ||||||
|    would appear as "0x010200" while version 9.11.7 appears as "0x090b07". |    using two digits.  1.2 would appear as "0x010200" while version 9.11.7 | ||||||
|  |    appears as "0x090b07". | ||||||
|  |  | ||||||
|    This 6-digit hexadecimal number does not show pre-release number, and it is |    This 6-digit (24 bits) hexadecimal number does not show pre-release number, | ||||||
|    always a greater number in a more recent release. It makes comparisons with |    and it is always a greater number in a more recent release. It makes | ||||||
|    greater than and less than work. |    comparisons with greater than and less than work. | ||||||
| */ | */ | ||||||
| #define LIBCURL_VERSION_NUM 0x070e00 | #define LIBCURL_VERSION_NUM 0x070f01 | ||||||
|  |  | ||||||
| /* The numeric version number is also available "in parts" by using these |  | ||||||
|    defines: */ |  | ||||||
| #define LIBCURL_VERSION_MAJOR 7 |  | ||||||
| #define LIBCURL_VERSION_MINOR 14 |  | ||||||
| #define LIBCURL_VERSION_PATCH 0 |  | ||||||
|  |  | ||||||
| #endif /* __CURL_CURLVER_H */ | #endif /* __CURL_CURLVER_H */ | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | #ifndef __CURL_MPRINTF_H | ||||||
|  | #define __CURL_MPRINTF_H | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
|  *                                  _   _ ____  _ |  *                                  _   _ ____  _ | ||||||
|  *  Project                     ___| | | |  _ \| | |  *  Project                     ___| | | |  _ \| | | ||||||
| @@ -21,9 +23,6 @@ | |||||||
|  * $Id$ |  * $Id$ | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
| #ifndef H_MPRINTF |  | ||||||
| #define H_MPRINTF |  | ||||||
|  |  | ||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
| #include <stdio.h> /* needed for FILE */ | #include <stdio.h> /* needed for FILE */ | ||||||
|  |  | ||||||
| @@ -53,4 +52,4 @@ CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); | |||||||
| # define vaprintf curl_mvaprintf | # define vaprintf curl_mvaprintf | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* H_MPRINTF */ | #endif /* __CURL_MPRINTF_H */ | ||||||
|   | |||||||
| @@ -66,6 +66,15 @@ | |||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * This header file should not really need to include "curl.h" since curl.h | ||||||
|  |  * itself includes this file and we expect user applications to do #include | ||||||
|  |  * <curl/curl.h> without the need for especially including multi.h. | ||||||
|  |  * | ||||||
|  |  * For some reason we added this include here at one point, and rather than to | ||||||
|  |  * break existing (wrongly written) libcurl applications, we leave it as-is | ||||||
|  |  * but with this warning attached. | ||||||
|  |  */ | ||||||
| #include "curl.h" | #include "curl.h" | ||||||
|  |  | ||||||
| #ifdef  __cplusplus | #ifdef  __cplusplus | ||||||
| @@ -91,7 +100,7 @@ typedef int curl_socket_t; | |||||||
| #endif /* HAVE_CURL_MULTI_SOCKET */ | #endif /* HAVE_CURL_MULTI_SOCKET */ | ||||||
|  |  | ||||||
| typedef enum { | typedef enum { | ||||||
|   CURLM_CALL_MULTI_PERFORM=-1, /* please call curl_multi_perform() soon */ |   CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() soon */ | ||||||
|   CURLM_OK, |   CURLM_OK, | ||||||
|   CURLM_BAD_HANDLE,      /* the passed-in handle is not a valid CURLM handle */ |   CURLM_BAD_HANDLE,      /* the passed-in handle is not a valid CURLM handle */ | ||||||
|   CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ |   CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ | ||||||
|   | |||||||
| @@ -8,10 +8,11 @@ TARGETS = libcurl_wc.lib libcurl_wc.dll libcurl_wc_imp.lib | |||||||
|  |  | ||||||
| CC = wcc386 | CC = wcc386 | ||||||
|  |  | ||||||
| CFLAGS = -3r -mf -d3 -hc -zff -zgf -zq -zm -s -fr=con -w2 -fpi -oilrtfm -bt=nt -bd & | CFLAGS = -3r -mf -d3 -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm -bt=nt -bd & | ||||||
|          -d+ -dWIN32 -dHAVE_LONGLONG -dCURL_CA_BUNDLE=getenv("CURL_CA_BUNDLE") & |          -d+ -dWIN32 -dHAVE_LONGLONG -dCURL_CA_BUNDLE=getenv("CURL_CA_BUNDLE")     & | ||||||
|          -dBUILDING_LIBCURL -dWITHOUT_MM_LIB -dHAVE_SPNEGO=1 -dENABLE_IPV6     & |          -dBUILDING_LIBCURL -dWITHOUT_MM_LIB -dHAVE_SPNEGO=1 -dENABLE_IPV6         & | ||||||
|          -dDEBUG_THREADING_GETADDRINFO -dDEBUG=1 -dCURLDEBUG -I. -I..\include |          -dDEBUG_THREADING_GETADDRINFO -dDEBUG=1 -dCURLDEBUG -d_WIN32_WINNT=0x0501 & | ||||||
|  |          -I. -I..\include | ||||||
|  |  | ||||||
| OBJ_DIR  = Watcom_obj | OBJ_DIR  = Watcom_obj | ||||||
| LIB_ARG  = $(OBJ_DIR)\wlib.arg | LIB_ARG  = $(OBJ_DIR)\wlib.arg | ||||||
| @@ -44,7 +45,7 @@ OBJS = $(OBJ_DIR)\transfer.obj         $(OBJ_DIR)\file.obj       & | |||||||
|        $(OBJ_DIR)\hostip6.obj          $(OBJ_DIR)\inet_ntop.obj  & |        $(OBJ_DIR)\hostip6.obj          $(OBJ_DIR)\inet_ntop.obj  & | ||||||
|        $(OBJ_DIR)\hostsyn.obj          $(OBJ_DIR)\parsedate.obj  & |        $(OBJ_DIR)\hostsyn.obj          $(OBJ_DIR)\parsedate.obj  & | ||||||
|        $(OBJ_DIR)\select.obj           $(OBJ_DIR)\sslgen.obj     & |        $(OBJ_DIR)\select.obj           $(OBJ_DIR)\sslgen.obj     & | ||||||
|        $(OBJ_DIR)\gtls.obj |        $(OBJ_DIR)\gtls.obj             $(OBJ_DIR)\tftp.obj | ||||||
|  |  | ||||||
| RESOURCE = $(OBJ_DIR)\libcurl.res | RESOURCE = $(OBJ_DIR)\libcurl.res | ||||||
|  |  | ||||||
| @@ -362,3 +363,9 @@ $(OBJ_DIR)\gtls.obj: gtls.c setup.h config-win32.h | |||||||
| $(OBJ_DIR)\sslgen.obj: sslgen.c setup.h config-win32.h urldata.h cookie.h & | $(OBJ_DIR)\sslgen.obj: sslgen.c setup.h config-win32.h urldata.h cookie.h & | ||||||
|   formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h sslgen.h & |   formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h sslgen.h & | ||||||
|   ssluse.h gtls.h sendf.h strequal.h url.h memory.h memdebug.h |   ssluse.h gtls.h sendf.h strequal.h url.h memory.h memdebug.h | ||||||
|  |  | ||||||
|  | $(OBJ_DIR)\tftp.obj: tftp.c setup.h config-win32.h urldata.h cookie.h & | ||||||
|  |   ..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h & | ||||||
|  |   ..\include\curl\multi.h formdata.h http_chunks.h hostip.h hash.h llist.h & | ||||||
|  |   transfer.h sendf.h tftp.h progress.h ..\include\curl\mprintf.h memory.h & | ||||||
|  |   select.h memdebug.h | ||||||
| @@ -8,7 +8,7 @@ CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c	\ | |||||||
|   content_encoding.c share.c http_digest.c md5.c http_negotiate.c	\ |   content_encoding.c share.c http_digest.c md5.c http_negotiate.c	\ | ||||||
|   http_ntlm.c inet_pton.c strtoofft.c strerror.c hostares.c hostasyn.c	\ |   http_ntlm.c inet_pton.c strtoofft.c strerror.c hostares.c hostasyn.c	\ | ||||||
|   hostip4.c hostip6.c hostsyn.c hostthre.c inet_ntop.c parsedate.c	\ |   hostip4.c hostip6.c hostsyn.c hostthre.c inet_ntop.c parsedate.c	\ | ||||||
|   select.c gtls.c sslgen.c |   select.c gtls.c sslgen.c tftp.c | ||||||
|  |  | ||||||
| HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h	\ | HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h	\ | ||||||
|   progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h	\ |   progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h	\ | ||||||
| @@ -18,5 +18,6 @@ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h	\ | |||||||
|   share.h md5.h http_digest.h http_negotiate.h http_ntlm.h ca-bundle.h	\ |   share.h md5.h http_digest.h http_negotiate.h http_ntlm.h ca-bundle.h	\ | ||||||
|   inet_pton.h strtoofft.h strerror.h inet_ntop.h curlx.h memory.h	\ |   inet_pton.h strtoofft.h strerror.h inet_ntop.h curlx.h memory.h	\ | ||||||
|   setup.h transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h   \ |   setup.h transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h   \ | ||||||
|   gtls.h |   gtls.h tftp.h sockaddr.h | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -13,15 +13,17 @@ NDKBASE	= c:/novell | |||||||
| endif | endif | ||||||
|  |  | ||||||
| # Edit the path below to point to the base of your Zlib sources. | # Edit the path below to point to the base of your Zlib sources. | ||||||
| #ZLIB_PATH = ../../zlib-1.2.2 | ifndef ZLIB_PATH | ||||||
|  | ZLIB_PATH = ../../zlib-1.2.3 | ||||||
|  | endif | ||||||
|  |  | ||||||
| # Edit the path below to point to the base of your OpenSSL package. | # Edit the path below to point to the base of your OpenSSL package. | ||||||
| ifndef OPENSSL_PATH | ifndef OPENSSL_PATH | ||||||
| OPENSSL_PATH = ../../openssl-0.9.7g | OPENSSL_PATH = ../../openssl-0.9.8 | ||||||
| endif | endif | ||||||
|  |  | ||||||
| ifndef INSTDIR | ifndef INSTDIR | ||||||
| INSTDIR	= ../curl-$(LIBCURL_VERSION_STR)-bin-nw | INSTDIR	= ..$(DS)curl-$(LIBCURL_VERSION_STR)-bin-nw | ||||||
| endif | endif | ||||||
|  |  | ||||||
| # Edit the vars below to change NLM target settings. | # Edit the vars below to change NLM target settings. | ||||||
| @@ -103,8 +105,6 @@ else | |||||||
| endif | endif | ||||||
| endif | endif | ||||||
|  |  | ||||||
| LDLIBS	= |  | ||||||
|  |  | ||||||
| NDK_ROOT = $(NDKBASE)/ndk | NDK_ROOT = $(NDKBASE)/ndk | ||||||
| SDK_CLIB = $(NDK_ROOT)/nwsdk | SDK_CLIB = $(NDK_ROOT)/nwsdk | ||||||
| SDK_LIBC = $(NDK_ROOT)/libc | SDK_LIBC = $(NDK_ROOT)/libc | ||||||
| @@ -114,21 +114,26 @@ INCLUDES = -I. -I../include | |||||||
|  |  | ||||||
| ifdef WITH_ARES | ifdef WITH_ARES | ||||||
| 	INCLUDES += -I../ares | 	INCLUDES += -I../ares | ||||||
| 	LIBCARES = ../ares/libcares.lib | 	LDLIBS = ../ares/libcares.lib | ||||||
| endif | endif | ||||||
| ifdef ZLIB_PATH | ifdef WITH_SSL | ||||||
| 	INCLUDES += -I$(ZLIB_PATH) |  | ||||||
| 	IMPORTS = @$(ZLIB_PATH)/nw/zlib.imp |  | ||||||
| 	MODULES = libz.nlm |  | ||||||
| endif |  | ||||||
| ifdef SSL |  | ||||||
| 	INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_libc -I$(OPENSSL_PATH)/outinc_nw_libc/openssl | 	INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_libc -I$(OPENSSL_PATH)/outinc_nw_libc/openssl | ||||||
| 	LIBSSL = $(OPENSSL_PATH)/out_nw_libc/crypto.lib $(OPENSSL_PATH)/out_nw_libc/ssl.lib | 	LDLIBS += $(OPENSSL_PATH)/out_nw_libc/crypto.lib $(OPENSSL_PATH)/out_nw_libc/ssl.lib | ||||||
|  | 	IMPORTS += GetProcessSwitchCount RunningProcess | ||||||
|  | endif | ||||||
|  | ifdef WITH_ZLIB | ||||||
|  | 	INCLUDES += -I$(ZLIB_PATH) | ||||||
|  | ifdef LINK_STATIC | ||||||
|  | 	LDLIBS += $(ZLIB_PATH)/nw/libz.lib | ||||||
|  | else | ||||||
|  | 	IMPORTS += @$(ZLIB_PATH)/nw/libz.imp | ||||||
|  | 	MODULES += libz.nlm | ||||||
|  | endif | ||||||
| endif | endif | ||||||
|  |  | ||||||
| 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 | ||||||
| 	# INCLUDES += -I$(SDK_LDAP)/libc/inc | 	# INCLUDES += -I$(SDK_LDAP)/libc/inc | ||||||
| 	CFLAGS += -D_POSIX_SOURCE | 	CFLAGS += -D_POSIX_SOURCE | ||||||
| 	# CFLAGS += -D__ANSIC__ | 	# CFLAGS += -D__ANSIC__ | ||||||
| @@ -152,13 +157,16 @@ endif | |||||||
|  |  | ||||||
| ifeq ($(findstring linux,$(OSTYPE)),linux) | ifeq ($(findstring linux,$(OSTYPE)),linux) | ||||||
| DL	= ' | DL	= ' | ||||||
|  | DS	= / | ||||||
| #-include $(NDKBASE)/nlmconv/ncpfs.inc | #-include $(NDKBASE)/nlmconv/ncpfs.inc | ||||||
|  | else | ||||||
|  | DS	= \\ | ||||||
| endif | endif | ||||||
|  |  | ||||||
| # Makefile.inc provides the CSOURCES and HHEADERS defines | # Makefile.inc provides the CSOURCES and HHEADERS defines | ||||||
| include Makefile.inc | include Makefile.inc | ||||||
|  |  | ||||||
| OBJS	:= $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) $(LIBCARES) $(LIBSSL) | OBJS	:= $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) $(LDLIBS) | ||||||
|  |  | ||||||
| OBJL	= $(OBJS) $(OBJDIR)/nwlib.o | OBJL	= $(OBJS) $(OBJDIR)/nwlib.o | ||||||
|  |  | ||||||
| @@ -189,6 +197,9 @@ install: $(INSTDIR) all | |||||||
| 	@$(CP) ../COPYING $(INSTDIR) | 	@$(CP) ../COPYING $(INSTDIR) | ||||||
| 	@$(CP) ../README $(INSTDIR) | 	@$(CP) ../README $(INSTDIR) | ||||||
| 	@$(CP) ../RELEASE-NOTES $(INSTDIR) | 	@$(CP) ../RELEASE-NOTES $(INSTDIR) | ||||||
|  | ifdef WITH_SSL | ||||||
|  | 	@$(CP) ca-bundle.crt $(INSTDIR) | ||||||
|  | endif | ||||||
|  |  | ||||||
| clean: | clean: | ||||||
| 	-$(RM) config.h ca-bundle.h | 	-$(RM) config.h ca-bundle.h | ||||||
| @@ -274,11 +285,8 @@ ifdef IMPORTS | |||||||
| 	@echo $(DL)import $(IMPORTS)$(DL) >> $@ | 	@echo $(DL)import $(IMPORTS)$(DL) >> $@ | ||||||
| endif | endif | ||||||
| ifeq ($(LD),nlmconv) | ifeq ($(LD),nlmconv) | ||||||
| ifdef WITH_ARES | ifdef LDLIBS | ||||||
| 	@echo $(DL)input $(LIBCARES)$(DL) >> $@ | 	@echo $(DL)input $(LDLIBS)$(DL) >> $@ | ||||||
| endif |  | ||||||
| ifdef SSL |  | ||||||
| 	@echo $(DL)input $(LIBSSL)$(DL) >> $@ |  | ||||||
| endif | endif | ||||||
| 	@echo $(DL)input $(OBJL)$(DL) >> $@ | 	@echo $(DL)input $(OBJL)$(DL) >> $@ | ||||||
| 	@echo $(DL)input $(PRELUDE)$(DL) >> $@ | 	@echo $(DL)input $(PRELUDE)$(DL) >> $@ | ||||||
| @@ -293,7 +301,7 @@ config.h: Makefile.netware | |||||||
| 	@echo $(DL)*/$(DL) >> $@ | 	@echo $(DL)*/$(DL) >> $@ | ||||||
| 	@echo $(DL)#define OS "i586-pc-NetWare"$(DL) >> $@ | 	@echo $(DL)#define OS "i586-pc-NetWare"$(DL) >> $@ | ||||||
| 	@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 "a suitable curl mailing list => http://curl.haxx.se/mail/"$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_ARPA_INET_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) >> $@ | ||||||
| @@ -336,6 +344,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 DISABLE_LDAP | ifdef DISABLE_LDAP | ||||||
| 	@echo $(DL)#define CURL_DISABLE_LDAP 1$(DL) >> $@ | 	@echo $(DL)#define CURL_DISABLE_LDAP 1$(DL) >> $@ | ||||||
| else | else | ||||||
| @@ -355,11 +370,11 @@ endif | |||||||
| ifdef WITH_ARES | ifdef WITH_ARES | ||||||
| 	@echo $(DL)#define USE_ARES 1$(DL) >> $@ | 	@echo $(DL)#define USE_ARES 1$(DL) >> $@ | ||||||
| endif | endif | ||||||
| ifdef ZLIB_PATH | ifdef WITH_ZLIB | ||||||
| 	@echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@ | ||||||
| endif | endif | ||||||
| ifdef SSL | ifdef WITH_SSL | ||||||
| 	@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@ | 	@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define USE_OPENSSL 1$(DL) >> $@ | 	@echo $(DL)#define USE_OPENSSL 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@ | ||||||
|   | |||||||
| @@ -19,7 +19,6 @@ | |||||||
| # files in the "cfg" directory, but then the make file | # files in the "cfg" directory, but then the make file | ||||||
| # in \src would need to be changed. | # in \src would need to be changed. | ||||||
| # | # | ||||||
| # $Id: Makefile.vc6,v 1.17 2004/01/13 08:57:01 bagder Exp $ |  | ||||||
| ############################################################## | ############################################################## | ||||||
|  |  | ||||||
| # | # | ||||||
| @@ -67,8 +66,8 @@ USEMM_LIBS = YES | |||||||
| ############################################################# | ############################################################# | ||||||
| ## Nothing more to do below this line! | ## Nothing more to do below this line! | ||||||
|  |  | ||||||
| CCNODBG    = cl.exe /MD /O2 /DNDEBUG | CCNODBG    = cl.exe /O2 /DNDEBUG | ||||||
| CCDEBUG    = cl.exe /MDd /Od /Gm /Zi /D_DEBUG /GZ | CCDEBUG    = cl.exe /Od /Gm /Zi /D_DEBUG /GZ | ||||||
| CFLAGSSSL  = /DUSE_SSLEAY /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl" | CFLAGSSSL  = /DUSE_SSLEAY /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl" | ||||||
| CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" | CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" | ||||||
| CFLAGS     = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL | CFLAGS     = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL | ||||||
| @@ -90,9 +89,20 @@ CFGSET     = FALSE | |||||||
|  |  | ||||||
| !IFDEF WINDOWS_SSPI | !IFDEF WINDOWS_SSPI | ||||||
| CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include | CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include | ||||||
| LFLAGS = $(LFLAGS) $(WINDOWS_SDK_PATH)\lib\secur32.lib |  | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
|  | ############################################################## | ||||||
|  | # Runtime library configuration | ||||||
|  |  | ||||||
|  | RTLIB   = /MD | ||||||
|  | RTLIBD  = /MDd | ||||||
|  |  | ||||||
|  | !IF "$(RTLIBCFG)" == "static" | ||||||
|  | RTLIB  = /MT | ||||||
|  | RTLIBD = /MTd | ||||||
|  | !ENDIF | ||||||
|  |  | ||||||
|  |  | ||||||
| ###################### | ###################### | ||||||
| # release | # release | ||||||
|  |  | ||||||
| @@ -100,7 +110,7 @@ LFLAGS = $(LFLAGS) $(WINDOWS_SDK_PATH)\lib\secur32.lib | |||||||
| TARGET = $(LIB_NAME).lib | TARGET = $(LIB_NAME).lib | ||||||
| DIROBJ = $(CFG) | DIROBJ = $(CFG) | ||||||
| LNK    = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) | LNK    = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC     = $(CCNODBG) $(CFLAGSLIB) | CC     = $(CCNODBG) $(RTLIB) $(CFLAGSLIB) | ||||||
| CFGSET = TRUE | CFGSET = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -112,7 +122,7 @@ TARGET   = $(LIB_NAME).lib | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LNK      = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | LNK      = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC       = $(CCNODBG) $(CFLAGSZLIB) $(CFLAGSLIB) | CC       = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -122,7 +132,7 @@ CFGSET   = TRUE | |||||||
| !IF "$(CFG)" == "release-dll" | !IF "$(CFG)" == "release-dll" | ||||||
| TARGET = $(LIB_NAME).dll | TARGET = $(LIB_NAME).dll | ||||||
| DIROBJ = $(CFG) | DIROBJ = $(CFG) | ||||||
| LNK    = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | LNK    = $(LNKDLL) $(RTLIB) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||||
| CC     = $(CCNODBG) | CC     = $(CCNODBG) | ||||||
| CFGSET = TRUE | CFGSET = TRUE | ||||||
| RESOURCE = $(DIROBJ)\libcurl.res | RESOURCE = $(DIROBJ)\libcurl.res | ||||||
| @@ -136,7 +146,7 @@ TARGET   = $(LIB_NAME).lib | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||||
| LNK      = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | LNK      = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSLIB) | CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -148,7 +158,7 @@ TARGET   = $(LIB_NAME).dll | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||||
| LNK      = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) $(SSLLIBS) $(LFLAGSSSL) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | LNK      = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) $(SSLLIBS) $(LFLAGSSSL) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||||
| CC       = $(CCNODBG) $(CFLAGSSSL) | CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -161,7 +171,7 @@ DIROBJ   = $(CFG) | |||||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LNK      = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | LNK      = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -173,7 +183,7 @@ TARGET   = $(LIB_NAME).dll | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||||
| CC       = $(CCNODBG) $(CFLAGSSSL) | CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| RESOURCE = $(DIROBJ)\libcurl.res | RESOURCE = $(DIROBJ)\libcurl.res | ||||||
| !ENDIF | !ENDIF | ||||||
| @@ -186,7 +196,7 @@ TARGET   = $(LIB_NAME).lib | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LNK      = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | LNK      = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC       = $(CCNODBG) $(CFLAGSZLIB) $(CFLAGSLIB) | CC       = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -199,7 +209,7 @@ DIROBJ   = $(CFG) | |||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||||
| LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -211,7 +221,7 @@ TARGET   = $(LIB_NAME).dll | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LNK      = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | LNK      = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||||
| CC       = $(CCNODBG) $(CFLAGSZLIB) | CC       = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| RESOURCE = $(DIROBJ)\libcurl.res | RESOURCE = $(DIROBJ)\libcurl.res | ||||||
| !ENDIF | !ENDIF | ||||||
| @@ -225,7 +235,7 @@ DIROBJ   = $(CFG) | |||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB) | CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| RESOURCE = $(DIROBJ)\libcurl.res | RESOURCE = $(DIROBJ)\libcurl.res | ||||||
| !ENDIF | !ENDIF | ||||||
| @@ -237,7 +247,7 @@ RESOURCE = $(DIROBJ)\libcurl.res | |||||||
| TARGET = $(LIB_NAME_DEBUG).lib | TARGET = $(LIB_NAME_DEBUG).lib | ||||||
| DIROBJ = $(CFG) | DIROBJ = $(CFG) | ||||||
| LNK    = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) | LNK    = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC     = $(CCDEBUG) $(CFLAGSLIB) | CC     = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB) | ||||||
| CFGSET = TRUE | CFGSET = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -248,8 +258,8 @@ CFGSET = TRUE | |||||||
| TARGET   = $(LIB_NAME_DEBUG).lib | TARGET   = $(LIB_NAME_DEBUG).lib | ||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||||
| LNK      = $(LNKLIB) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | LNK      = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSLIB) | CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -261,7 +271,7 @@ TARGET   = $(LIB_NAME_DEBUG).lib | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LNK      = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | LNK      = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC       = $(CCDEBUG) $(CFLAGSZLIB) $(CFLAGSLIB) | CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -273,7 +283,7 @@ TARGET   = $(LIB_NAME_DEBUG).lib | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll | LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll | ||||||
| LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSLIB) | CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -285,8 +295,8 @@ TARGET   = $(LIB_NAME_DEBUG).lib | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||||
| LNK      = $(LNKLIB) $(SSLLIBS) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | LNK      = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -298,7 +308,7 @@ TARGET   = $(LIB_NAME_DEBUG).lib | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LNK      = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | LNK      = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC       = $(CCDEBUG) $(CFLAGSZLIB) $(CFLAGSLIB) | CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -311,7 +321,7 @@ DIROBJ   = $(CFG) | |||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||||
| LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| !ENDIF | !ENDIF | ||||||
|  |  | ||||||
| @@ -322,7 +332,7 @@ CFGSET   = TRUE | |||||||
| TARGET = $(LIB_NAME_DEBUG).dll | TARGET = $(LIB_NAME_DEBUG).dll | ||||||
| DIROBJ = $(CFG) | DIROBJ = $(CFG) | ||||||
| LNK    = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | LNK    = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||||
| CC     = $(CCDEBUG) | CC     = $(CCDEBUG) $(RTLIBD)  | ||||||
| CFGSET = TRUE | CFGSET = TRUE | ||||||
| RESOURCE = $(DIROBJ)\libcurl.res | RESOURCE = $(DIROBJ)\libcurl.res | ||||||
| !ENDIF | !ENDIF | ||||||
| @@ -335,7 +345,7 @@ TARGET   = $(LIB_NAME_DEBUG).dll | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) | CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| RESOURCE = $(DIROBJ)\libcurl.res | RESOURCE = $(DIROBJ)\libcurl.res | ||||||
| !ENDIF | !ENDIF | ||||||
| @@ -348,7 +358,7 @@ TARGET   = $(LIB_NAME_DEBUG).dll | |||||||
| DIROBJ   = $(CFG) | DIROBJ   = $(CFG) | ||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LNK      = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | LNK      = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||||
| CC       = $(CCDEBUG) $(CFLAGSZLIB) | CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| RESOURCE = $(DIROBJ)\libcurl.res | RESOURCE = $(DIROBJ)\libcurl.res | ||||||
| !ENDIF | !ENDIF | ||||||
| @@ -362,7 +372,7 @@ DIROBJ   = $(CFG) | |||||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB) | CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) | ||||||
| CFGSET   = TRUE | CFGSET   = TRUE | ||||||
| RESOURCE = $(DIROBJ)\libcurl.res | RESOURCE = $(DIROBJ)\libcurl.res | ||||||
| !ENDIF | !ENDIF | ||||||
| @@ -469,6 +479,7 @@ X_OBJS= \ | |||||||
| 	$(DIROBJ)\strerror.obj \ | 	$(DIROBJ)\strerror.obj \ | ||||||
| 	$(DIROBJ)\select.obj \ | 	$(DIROBJ)\select.obj \ | ||||||
| 	$(DIROBJ)\content_encoding.obj \ | 	$(DIROBJ)\content_encoding.obj \ | ||||||
|  | 	$(DIROBJ)\tftp.obj \ | ||||||
| 	$(RESOURCE) | 	$(RESOURCE) | ||||||
|  |  | ||||||
| all : $(TARGET) | all : $(TARGET) | ||||||
|   | |||||||
| @@ -1,17 +0,0 @@ | |||||||
| Things to fix for the GnuTLS support |  | ||||||
| ==================================== |  | ||||||
|  |  | ||||||
| * make the configure --with-ssl option first check for OpenSSL and then for |  | ||||||
|   GnuTLS if OpenSSL wasn't detected. |  | ||||||
|  |  | ||||||
| * 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? |  | ||||||
|  |  | ||||||
|   SRP for TLS |  | ||||||
|  |  | ||||||
| * Work out a common method with Peter Sylvester's OpenSSL-patch for SRP |  | ||||||
|   on the TLS to provide name and password |  | ||||||
| @@ -22,28 +22,53 @@ | |||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
| #include "amigaos.h" | #include "amigaos.h" | ||||||
| #include <stdio.h> /* for stderr */ | #include <amitcp/socketbasetags.h> | ||||||
|  |  | ||||||
| struct Library *SocketBase = NULL; | struct Library *SocketBase = NULL; | ||||||
|  | extern int errno, h_errno; | ||||||
|  |  | ||||||
|  | #ifdef __libnix__ | ||||||
|  | #include <stabs.h> | ||||||
|  | void __request(const char *msg); | ||||||
|  | #else | ||||||
|  | # define __request( msg )	Printf( msg "\n\a") | ||||||
|  | #endif | ||||||
|  |  | ||||||
| void amiga_cleanup() | void amiga_cleanup() | ||||||
| { | { | ||||||
|   if(SocketBase) | 	if(SocketBase) { | ||||||
|     CloseLibrary(SocketBase); | 		CloseLibrary(SocketBase); | ||||||
|  | 		SocketBase = NULL; | ||||||
|   SocketBase = NULL; | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| BOOL amiga_init() | BOOL amiga_init() | ||||||
| { | { | ||||||
|   if(!SocketBase) | 	if(!SocketBase) | ||||||
|     SocketBase = OpenLibrary("bsdsocket.library", 4); | 		SocketBase = OpenLibrary("bsdsocket.library", 4); | ||||||
| 	 | 	 | ||||||
|   if(!SocketBase) { | 	if(!SocketBase) { | ||||||
|     fprintf(stderr, "No TCP/IP Stack running!\n\a"); | 		__request("No TCP/IP Stack running!"); | ||||||
|     return FALSE; | 		return FALSE; | ||||||
|   } | 	} | ||||||
| 	 | 	 | ||||||
|   atexit(amiga_cleanup); | 	if(SocketBaseTags( | ||||||
|   return TRUE; | 		SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno))), (ULONG) &errno, | ||||||
|  | //		SBTM_SETVAL(SBTC_HERRNOLONGPTR),	   (ULONG) &h_errno, | ||||||
|  | 		SBTM_SETVAL(SBTC_LOGTAGPTR),		   (ULONG) "cURL", | ||||||
|  | 	TAG_DONE)) { | ||||||
|  | 		 | ||||||
|  | 		__request("SocketBaseTags ERROR"); | ||||||
|  | 		return FALSE; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | #ifndef __libnix__ | ||||||
|  | 	atexit(amiga_cleanup); | ||||||
|  | #endif | ||||||
|  | 	 | ||||||
|  | 	return TRUE; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #ifdef __libnix__ | ||||||
|  | ADD2EXIT(amiga_cleanup,-50); | ||||||
|  | #endif | ||||||
|   | |||||||
| @@ -32,13 +32,19 @@ | |||||||
| #include <proto/exec.h> | #include <proto/exec.h> | ||||||
| #include <proto/dos.h> | #include <proto/dos.h> | ||||||
|  |  | ||||||
| #include <bsdsocket.h> | #include <sys/socket.h> | ||||||
|  |  | ||||||
| #include "config-amigaos.h" | #include "config-amigaos.h" | ||||||
|  |  | ||||||
| #define select(args...) WaitSelect( args, NULL) | #ifndef select | ||||||
| #define inet_ntoa(x)    Inet_NtoA( x ## .s_addr) | # define select(args...) WaitSelect( args, NULL) | ||||||
| #define ioctl(a,b,c,d)  IoctlSocket( (LONG)a, (ULONG)b, (char*)c) | #endif | ||||||
|  | #ifndef inet_ntoa | ||||||
|  | # define inet_ntoa(x)    Inet_NtoA( x ## .s_addr) | ||||||
|  | #endif | ||||||
|  | #ifndef ioctl | ||||||
|  | # define ioctl(a,b,c,d)  IoctlSocket( (LONG)a, (ULONG)b, (char*)c) | ||||||
|  | #endif | ||||||
| #define _AMIGASF        1 | #define _AMIGASF        1 | ||||||
|  |  | ||||||
| extern void amiga_cleanup(); | extern void amiga_cleanup(); | ||||||
|   | |||||||
| @@ -54,6 +54,7 @@ | |||||||
| #define HAVE_UTIME_H 1 | #define HAVE_UTIME_H 1 | ||||||
| #define HAVE_WRITABLE_ARGV 1 | #define HAVE_WRITABLE_ARGV 1 | ||||||
| #define HAVE_ZLIB_H 1 | #define HAVE_ZLIB_H 1 | ||||||
|  | #define HAVE_SYS_IOCTL_H 1 | ||||||
|  |  | ||||||
| #define USE_OPENSSL 1 | #define USE_OPENSSL 1 | ||||||
| #define USE_SSLEAY 1 | #define USE_SSLEAY 1 | ||||||
| @@ -80,7 +81,9 @@ | |||||||
| #define TIME_WITH_SYS_TIME 1 | #define TIME_WITH_SYS_TIME 1 | ||||||
|  |  | ||||||
| #define in_addr_t int | #define in_addr_t int | ||||||
| #define socklen_t int | #ifndef socklen_t | ||||||
|  | # define socklen_t int | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #ifndef O_RDONLY | #ifndef O_RDONLY | ||||||
| # define O_RDONLY 0x0000 | # define O_RDONLY 0x0000 | ||||||
|   | |||||||
| @@ -27,7 +27,10 @@ | |||||||
| /* #undef size_t */ | /* #undef size_t */ | ||||||
|  |  | ||||||
| /* Define this to 'int' if ssize_t is not an available typedefed type */ | /* Define this to 'int' if ssize_t is not an available typedefed type */ | ||||||
|  | #if defined(__WATCOMC__) && (__WATCOMC__ >= 1240) | ||||||
|  | #else | ||||||
| #define ssize_t int | #define ssize_t int | ||||||
|  | #endif | ||||||
|  |  | ||||||
| /* Define this to 'int' if socklen_t is not an available typedefed type */ | /* Define this to 'int' if socklen_t is not an available typedefed type */ | ||||||
| #if !defined(ENABLE_IPV6) && ((_MSC_VER < 1300) || !defined(USE_SSLEAY)) | #if !defined(ENABLE_IPV6) && ((_MSC_VER < 1300) || !defined(USE_SSLEAY)) | ||||||
| @@ -232,6 +235,9 @@ | |||||||
| /* use ioctlsocket() for non-blocking sockets */ | /* use ioctlsocket() for non-blocking sockets */ | ||||||
| #define HAVE_IOCTLSOCKET | #define HAVE_IOCTLSOCKET | ||||||
|  |  | ||||||
|  | /* Define this if you have struct sockaddr_storage */ | ||||||
|  | #define HAVE_STRUCT_SOCKADDR_STORAGE | ||||||
|  |  | ||||||
| /* lber dynamic library file */ | /* lber dynamic library file */ | ||||||
| /* #undef DL_LBER_FILE */ | /* #undef DL_LBER_FILE */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -359,13 +359,13 @@ static CURLcode bindlocal(struct connectdata *conn, | |||||||
|  |  | ||||||
|       } /* end of if  h */ |       } /* end of if  h */ | ||||||
|       else { |       else { | ||||||
|         failf(data,"could't find my own IP address (%s)", myhost); |         failf(data,"couldn't find my own IP address (%s)", myhost); | ||||||
|         return CURLE_HTTP_PORT_FAILED; |         return CURLE_HTTP_PORT_FAILED; | ||||||
|       } |       } | ||||||
|     } /* end of inet_addr */ |     } /* end of inet_addr */ | ||||||
|  |  | ||||||
|     else { |     else { | ||||||
|       failf(data, "could't find my own IP address (%s)", myhost); |       failf(data, "couldn't find my own IP address (%s)", myhost); | ||||||
|       return CURLE_HTTP_PORT_FAILED; |       return CURLE_HTTP_PORT_FAILED; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -472,6 +472,9 @@ static bool trynextip(struct connectdata *conn, | |||||||
|   if(sockindex != FIRSTSOCKET) |   if(sockindex != FIRSTSOCKET) | ||||||
|     return TRUE; /* no next */ |     return TRUE; /* no next */ | ||||||
|  |  | ||||||
|  |   /* first close the failed socket */ | ||||||
|  |   sclose(conn->sock[sockindex]); | ||||||
|  |  | ||||||
|   /* try the next address */ |   /* try the next address */ | ||||||
|   ai = conn->ip_addr->ai_next; |   ai = conn->ip_addr->ai_next; | ||||||
|  |  | ||||||
| @@ -631,8 +634,9 @@ singleipconnect(struct connectdata *conn, | |||||||
|   int error; |   int error; | ||||||
|   bool conected; |   bool conected; | ||||||
|   struct SessionHandle *data = conn->data; |   struct SessionHandle *data = conn->data; | ||||||
|   curl_socket_t sockfd = socket(ai->ai_family, ai->ai_socktype, |   curl_socket_t sockfd; | ||||||
|                                 ai->ai_protocol); |  | ||||||
|  |   sockfd = socket(ai->ai_family, conn->socktype, ai->ai_protocol); | ||||||
|   if (sockfd == CURL_SOCKET_BAD) |   if (sockfd == CURL_SOCKET_BAD) | ||||||
|     return CURL_SOCKET_BAD; |     return CURL_SOCKET_BAD; | ||||||
|  |  | ||||||
| @@ -660,7 +664,11 @@ singleipconnect(struct connectdata *conn, | |||||||
|   /* set socket non-blocking */ |   /* set socket non-blocking */ | ||||||
|   Curl_nonblock(sockfd, TRUE); |   Curl_nonblock(sockfd, TRUE); | ||||||
|  |  | ||||||
|   rc = connect(sockfd, ai->ai_addr, (socklen_t)ai->ai_addrlen); |   /* Connect TCP sockets, bind UDP */ | ||||||
|  |   if(conn->socktype == SOCK_STREAM) | ||||||
|  |     rc = connect(sockfd, ai->ai_addr, (socklen_t)ai->ai_addrlen); | ||||||
|  |   else | ||||||
|  |     rc = 0; | ||||||
|  |  | ||||||
|   if(-1 == rc) { |   if(-1 == rc) { | ||||||
|     error = Curl_ourerrno(); |     error = Curl_ourerrno(); | ||||||
|   | |||||||
							
								
								
									
										118
									
								
								lib/cookie.c
									
									
									
									
									
								
							
							
						
						
									
										118
									
								
								lib/cookie.c
									
									
									
									
									
								
							| @@ -85,12 +85,17 @@ Example set of cookies: | |||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  |  | ||||||
|  | #define _MPRINTF_REPLACE /* without this on windows OS we get undefined reference to snprintf */ | ||||||
|  | #include <curl/mprintf.h> | ||||||
|  |  | ||||||
| #include "urldata.h" | #include "urldata.h" | ||||||
| #include "cookie.h" | #include "cookie.h" | ||||||
| #include "strequal.h" | #include "strequal.h" | ||||||
| #include "strtok.h" | #include "strtok.h" | ||||||
| #include "sendf.h" | #include "sendf.h" | ||||||
| #include "memory.h" | #include "memory.h" | ||||||
|  | #include "share.h" | ||||||
|  | #include "strtoofft.h" | ||||||
|  |  | ||||||
| /* The last #include file should be: */ | /* The last #include file should be: */ | ||||||
| #ifdef CURLDEBUG | #ifdef CURLDEBUG | ||||||
| @@ -130,6 +135,27 @@ static bool tailmatch(const char *little, const char *bigone) | |||||||
|   return (bool)strequal(little, bigone+biglen-littlelen); |   return (bool)strequal(little, bigone+biglen-littlelen); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Load cookies from all given cookie files (CURLOPT_COOKIEFILE). | ||||||
|  |  */ | ||||||
|  | void Curl_cookie_loadfiles(struct SessionHandle *data) | ||||||
|  | { | ||||||
|  |   struct curl_slist *list = data->change.cookielist; | ||||||
|  |   if(list) { | ||||||
|  |     Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); | ||||||
|  |     while(list) { | ||||||
|  |       data->cookies = Curl_cookie_init(data, | ||||||
|  |                                        list->data, | ||||||
|  |                                        data->cookies, | ||||||
|  |                                        data->set.cookiesession); | ||||||
|  |       list = list->next; | ||||||
|  |     } | ||||||
|  |     Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); | ||||||
|  |     curl_slist_free_all(data->change.cookielist); /* clean up list */ | ||||||
|  |     data->change.cookielist = NULL; /* don't do this again! */ | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * |  * | ||||||
|  * Curl_cookie_add() |  * Curl_cookie_add() | ||||||
| @@ -317,7 +343,7 @@ Curl_cookie_add(struct SessionHandle *data, | |||||||
|               badcookie = TRUE; |               badcookie = TRUE; | ||||||
|               break; |               break; | ||||||
|             } |             } | ||||||
|             co->expires = (long)curl_getdate(what, &now); |             co->expires = curl_getdate(what, &now); | ||||||
|           } |           } | ||||||
|           else if(!co->name) { |           else if(!co->name) { | ||||||
|             co->name = strdup(name); |             co->name = strdup(name); | ||||||
| @@ -470,7 +496,7 @@ Curl_cookie_add(struct SessionHandle *data, | |||||||
|         co->secure = (bool)strequal(ptr, "TRUE"); |         co->secure = (bool)strequal(ptr, "TRUE"); | ||||||
|         break; |         break; | ||||||
|       case 4: |       case 4: | ||||||
|         co->expires = atoi(ptr); |         co->expires = curlx_strtoofft(ptr, NULL, 10); | ||||||
|         break; |         break; | ||||||
|       case 5: |       case 5: | ||||||
|         co->name = strdup(ptr); |         co->name = strdup(ptr); | ||||||
| @@ -816,6 +842,34 @@ void Curl_cookie_cleanup(struct CookieInfo *c) | |||||||
|    } |    } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* get_netscape_format() | ||||||
|  |  * | ||||||
|  |  * Formats a string for Netscape output file, w/o a newline at the end. | ||||||
|  |  * | ||||||
|  |  * Function returns a char * to a formatted line. Has to be free()d | ||||||
|  | */ | ||||||
|  | static char *get_netscape_format(const struct Cookie *co) | ||||||
|  | { | ||||||
|  |    return aprintf( | ||||||
|  |      "%s%s\t" /* domain */ | ||||||
|  |      "%s\t"   /* tailmatch */ | ||||||
|  |      "%s\t"   /* path */ | ||||||
|  |      "%s\t"   /* secure */ | ||||||
|  |      "%" FORMAT_OFF_T "\t"   /* expires */ | ||||||
|  |      "%s\t"   /* name */ | ||||||
|  |      "%s",    /* value */ | ||||||
|  |      /* Make sure all domains are prefixed with a dot if they allow | ||||||
|  |         tailmatching. This is Mozilla-style. */ | ||||||
|  |      (co->tailmatch && co->domain && co->domain[0] != '.')? ".":"", | ||||||
|  |      co->domain?co->domain:"unknown", | ||||||
|  |      co->tailmatch?"TRUE":"FALSE", | ||||||
|  |      co->path?co->path:"/", | ||||||
|  |      co->secure?"TRUE":"FALSE", | ||||||
|  |      co->expires, | ||||||
|  |      co->name, | ||||||
|  |      co->value?co->value:""); | ||||||
|  | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Curl_cookie_output() |  * Curl_cookie_output() | ||||||
|  * |  * | ||||||
| @@ -847,6 +901,8 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere) | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   if(c) { |   if(c) { | ||||||
|  |     char *format_ptr; | ||||||
|  |  | ||||||
|     fputs("# Netscape HTTP Cookie File\n" |     fputs("# Netscape HTTP Cookie File\n" | ||||||
|           "# http://www.netscape.com/newsref/std/cookie_spec.html\n" |           "# http://www.netscape.com/newsref/std/cookie_spec.html\n" | ||||||
|           "# This file was generated by libcurl! Edit at your own risk.\n\n", |           "# This file was generated by libcurl! Edit at your own risk.\n\n", | ||||||
| @@ -854,26 +910,13 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere) | |||||||
|     co = c->cookies; |     co = c->cookies; | ||||||
|  |  | ||||||
|     while(co) { |     while(co) { | ||||||
|       fprintf(out, |       format_ptr = get_netscape_format(co); | ||||||
|               "%s%s\t" /* domain */ |       if (format_ptr == NULL) { | ||||||
|               "%s\t" /* tailmatch */ |         fprintf(out, "#\n# Fatal libcurl error\n"); | ||||||
|               "%s\t" /* path */ |         return 1; | ||||||
|               "%s\t" /* secure */ |       } | ||||||
|               "%u\t" /* expires */ |       fprintf(out, "%s\n", format_ptr); | ||||||
|               "%s\t" /* name */ |       free(format_ptr); | ||||||
|               "%s\n", /* value */ |  | ||||||
|  |  | ||||||
|               /* Make sure all domains are prefixed with a dot if they allow |  | ||||||
|                  tailmatching. This is Mozilla-style. */ |  | ||||||
|               (co->tailmatch && co->domain && co->domain[0] != '.')? ".":"", |  | ||||||
|               co->domain?co->domain:"unknown", |  | ||||||
|               co->tailmatch?"TRUE":"FALSE", |  | ||||||
|               co->path?co->path:"/", |  | ||||||
|               co->secure?"TRUE":"FALSE", |  | ||||||
|               (unsigned int)co->expires, |  | ||||||
|               co->name, |  | ||||||
|               co->value?co->value:""); |  | ||||||
|  |  | ||||||
|       co=co->next; |       co=co->next; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -884,4 +927,35 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere) | |||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | struct curl_slist *Curl_cookie_list(struct SessionHandle *data) | ||||||
|  | { | ||||||
|  |   struct curl_slist *list = NULL; | ||||||
|  |   struct curl_slist *beg; | ||||||
|  |   struct Cookie *c; | ||||||
|  |   char *line; | ||||||
|  |  | ||||||
|  |   if ((data->cookies == NULL) || | ||||||
|  |       (data->cookies->numcookies == 0)) | ||||||
|  |     return NULL; | ||||||
|  |  | ||||||
|  |   c = data->cookies->cookies; | ||||||
|  |  | ||||||
|  |   beg = list; | ||||||
|  |   while (c) { | ||||||
|  |     /* fill the list with _all_ the cookies we know */ | ||||||
|  |     line = get_netscape_format(c); | ||||||
|  |     if (line == NULL) { | ||||||
|  |       /* get_netscape_format returns null only if we run out of memory */ | ||||||
|  |  | ||||||
|  |       curl_slist_free_all(beg); /* free some memory */ | ||||||
|  |       return NULL; | ||||||
|  |     } | ||||||
|  |     list = curl_slist_append(list, line); | ||||||
|  |     free(line); | ||||||
|  |     c = c->next; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return list; | ||||||
|  | } | ||||||
|  |  | ||||||
| #endif /* CURL_DISABLE_HTTP || CURL_DISABLE_COOKIES */ | #endif /* CURL_DISABLE_HTTP || CURL_DISABLE_COOKIES */ | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								lib/cookie.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								lib/cookie.h
									
									
									
									
									
								
							| @@ -38,7 +38,7 @@ struct Cookie { | |||||||
|   char *value;       /* name = <this> */ |   char *value;       /* name = <this> */ | ||||||
|   char *path;         /* path = <this> */ |   char *path;         /* path = <this> */ | ||||||
|   char *domain;      /* domain = <this> */ |   char *domain;      /* domain = <this> */ | ||||||
|   long expires;    /* expires = <this> */ |   curl_off_t expires;  /* expires = <this> */ | ||||||
|   char *expirestr;   /* the plain text version */ |   char *expirestr;   /* the plain text version */ | ||||||
|   bool tailmatch;    /* weather we do tail-matchning of the domain name */ |   bool tailmatch;    /* weather we do tail-matchning of the domain name */ | ||||||
|  |  | ||||||
| @@ -92,4 +92,12 @@ void Curl_cookie_freelist(struct Cookie *); | |||||||
| void Curl_cookie_cleanup(struct CookieInfo *); | void Curl_cookie_cleanup(struct CookieInfo *); | ||||||
| int Curl_cookie_output(struct CookieInfo *, char *); | int Curl_cookie_output(struct CookieInfo *, char *); | ||||||
|  |  | ||||||
|  | #if defined(CURL_DISABLE_HTTP) || defined(CURL_DISABLE_COOKIES) | ||||||
|  | #define Curl_cookie_list(x) NULL | ||||||
|  | #define Curl_cookie_loadfiles(x) | ||||||
|  | #else | ||||||
|  | struct curl_slist *Curl_cookie_list(struct SessionHandle *data); | ||||||
|  | void Curl_cookie_loadfiles(struct SessionHandle *data); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
							
								
								
									
										36
									
								
								lib/easy.c
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								lib/easy.c
									
									
									
									
									
								
							| @@ -308,49 +308,19 @@ CURL *curl_easy_init(void) | |||||||
|  * curl_easy_setopt() is the external interface for setting options on an |  * curl_easy_setopt() is the external interface for setting options on an | ||||||
|  * easy handle. |  * easy handle. | ||||||
|  */ |  */ | ||||||
| typedef int (*func_T)(void); |  | ||||||
| CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...) | CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...) | ||||||
| { | { | ||||||
|   va_list arg; |   va_list arg; | ||||||
|   func_T param_func = (func_T)0; |  | ||||||
|   long param_long = 0; |  | ||||||
|   void *param_obj = NULL; |  | ||||||
|   curl_off_t param_offset = 0; |  | ||||||
|   struct SessionHandle *data = curl; |   struct SessionHandle *data = curl; | ||||||
|   CURLcode ret=CURLE_FAILED_INIT; |   CURLcode ret; | ||||||
|  |  | ||||||
|   if(!curl) |   if(!curl) | ||||||
|     return CURLE_BAD_FUNCTION_ARGUMENT; |     return CURLE_BAD_FUNCTION_ARGUMENT; | ||||||
|  |  | ||||||
|   va_start(arg, tag); |   va_start(arg, tag); | ||||||
|  |  | ||||||
|   /* PORTING NOTE: |   ret = Curl_setopt(data, tag, arg); | ||||||
|      Object pointers can't necessarily be casted to function pointers and |  | ||||||
|      therefore we need to know what type it is and read the correct type |  | ||||||
|      at once. This should also correct problems with different sizes of |  | ||||||
|      the types. |  | ||||||
|   */ |  | ||||||
|  |  | ||||||
|   if(tag < CURLOPTTYPE_OBJECTPOINT) { |  | ||||||
|     /* This is a LONG type */ |  | ||||||
|     param_long = va_arg(arg, long); |  | ||||||
|     ret = Curl_setopt(data, tag, param_long); |  | ||||||
|   } |  | ||||||
|   else if(tag < CURLOPTTYPE_FUNCTIONPOINT) { |  | ||||||
|     /* This is a object pointer type */ |  | ||||||
|     param_obj = va_arg(arg, void *); |  | ||||||
|     ret = Curl_setopt(data, tag, param_obj); |  | ||||||
|   } |  | ||||||
|   else if(tag < CURLOPTTYPE_OFF_T) { |  | ||||||
|     /* This is a function pointer type */ |  | ||||||
|     param_func = va_arg(arg, func_T ); |  | ||||||
|     ret = Curl_setopt(data, tag, param_func); |  | ||||||
|   } |  | ||||||
|   else { |  | ||||||
|     /* This is a curl_off_t type */ |  | ||||||
|     param_offset = va_arg(arg, curl_off_t); |  | ||||||
|     ret = Curl_setopt(data, tag, param_offset); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   va_end(arg); |   va_end(arg); | ||||||
|   return ret; |   return ret; | ||||||
|   | |||||||
| @@ -158,12 +158,12 @@ CURLcode Curl_file_connect(struct connectdata *conn) | |||||||
| #endif | #endif | ||||||
|   file->freepath = real_path; /* free this when done */ |   file->freepath = real_path; /* free this when done */ | ||||||
|  |  | ||||||
|  |   file->fd = fd; | ||||||
|   if(!conn->data->set.upload && (fd == -1)) { |   if(!conn->data->set.upload && (fd == -1)) { | ||||||
|     failf(conn->data, "Couldn't open file %s", conn->path); |     failf(conn->data, "Couldn't open file %s", conn->path); | ||||||
|     Curl_file_done(conn, CURLE_FILE_COULDNT_READ_FILE); |     Curl_file_done(conn, CURLE_FILE_COULDNT_READ_FILE); | ||||||
|     return CURLE_FILE_COULDNT_READ_FILE; |     return CURLE_FILE_COULDNT_READ_FILE; | ||||||
|   } |   } | ||||||
|   file->fd = fd; |  | ||||||
|  |  | ||||||
|   return CURLE_OK; |   return CURLE_OK; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -105,7 +105,7 @@ Content-Disposition: form-data; name="FILECONTENT" | |||||||
| /* Length of the random boundary string. */ | /* Length of the random boundary string. */ | ||||||
| #define BOUNDARY_LENGTH 40 | #define BOUNDARY_LENGTH 40 | ||||||
|  |  | ||||||
| #ifndef CURL_DISABLE_HTTP | #if !defined(CURL_DISABLE_HTTP) || defined(USE_SSLEAY) | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| @@ -128,6 +128,10 @@ Content-Disposition: form-data; name="FILECONTENT" | |||||||
| /* The last #include file should be: */ | /* The last #include file should be: */ | ||||||
| #include "memdebug.h" | #include "memdebug.h" | ||||||
|  |  | ||||||
|  | #endif  /* !defined(CURL_DISABLE_HTTP) || defined(USE_SSLEAY) */ | ||||||
|  |  | ||||||
|  | #ifndef CURL_DISABLE_HTTP | ||||||
|  |  | ||||||
| #if defined(HAVE_BASENAME) && defined(NEED_BASENAME_PROTO) | #if defined(HAVE_BASENAME) && defined(NEED_BASENAME_PROTO) | ||||||
| /* This system has a basename() but no prototype for it! */ | /* This system has a basename() but no prototype for it! */ | ||||||
| char *basename(char *path); | char *basename(char *path); | ||||||
| @@ -1511,7 +1515,7 @@ int main() | |||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif | #endif  /* _FORM_DEBUG */ | ||||||
|  |  | ||||||
| #else  /* CURL_DISABLE_HTTP */ | #else  /* CURL_DISABLE_HTTP */ | ||||||
| CURLFORMcode curl_formadd(struct curl_httppost **httppost, | CURLFORMcode curl_formadd(struct curl_httppost **httppost, | ||||||
| @@ -1531,6 +1535,8 @@ void curl_formfree(struct curl_httppost *form) | |||||||
|  |  | ||||||
| #endif  /* CURL_DISABLE_HTTP */ | #endif  /* CURL_DISABLE_HTTP */ | ||||||
|  |  | ||||||
|  | #if !defined(CURL_DISABLE_HTTP) || defined(USE_SSLEAY) | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Curl_FormBoundary() creates a suitable boundary string and returns an |  * Curl_FormBoundary() creates a suitable boundary string and returns an | ||||||
|  * allocated one. This is also used by SSL-code so it must be present even |  * allocated one. This is also used by SSL-code so it must be present even | ||||||
| @@ -1563,3 +1569,5 @@ char *Curl_FormBoundary(void) | |||||||
|  |  | ||||||
|   return retstring; |   return retstring; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #endif  /* !defined(CURL_DISABLE_HTTP) || defined(USE_SSLEAY) */ | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user