Compare commits
	
		
			363 Commits
		
	
	
		
			pre-sockfi
			...
			curl-7_14_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 6e1a986e0f | ||
|   | e0785ade35 | ||
|   | 0177ed6f03 | ||
|   | c62635a3b5 | ||
|   | 0177476fd2 | ||
|   | 76d7dface7 | ||
|   | 982ba21460 | ||
|   | 6081c60556 | ||
|   | 2fe3c22108 | ||
|   | 75dbb3189a | ||
|   | 32330300a9 | ||
|   | 64414df27e | ||
|   | f98ec86798 | ||
|   | 87bbd13899 | ||
|   | 51a4493add | ||
|   | 5effe8f336 | ||
|   | 296eb2bd61 | ||
|   | 9853acba66 | ||
|   | 09cb9c782d | ||
|   | 575ce905b2 | ||
|   | 54887af471 | ||
|   | 573350637e | ||
|   | 49a16f7121 | ||
|   | a4773fcbbb | ||
|   | 1e038c4bc6 | ||
|   | 6ba19692a3 | ||
|   | 432dfe2b8f | ||
|   | a142372750 | ||
|   | f14195f786 | ||
|   | 9d54f9a6b7 | ||
|   | ebb91191bf | ||
|   | 8742e294d4 | ||
|   | 8882d1fa1b | ||
|   | 0c37ab5255 | ||
|   | 747a05844d | ||
|   | c7b7bf32f8 | ||
|   | 710ee3b0e0 | ||
|   | 7a8993892d | ||
|   | 5e16a77fa9 | ||
|   | ef35519696 | ||
|   | d5baaf7756 | ||
|   | 2a94387fc3 | ||
|   | 6a5c2b0fc3 | ||
|   | fc281d6440 | ||
|   | e22ac39da4 | ||
|   | 34cadb1e54 | ||
|   | 94692b904e | ||
|   | 18f3087afd | ||
|   | 15bc228ae9 | ||
|   | 2b7a38d032 | ||
|   | 90e1a6905a | ||
|   | c36af24cbd | ||
|   | a676c18502 | ||
|   | 362912ff83 | ||
|   | 46ff13f243 | ||
|   | 340a67a6f8 | ||
|   | 9294c1e76c | ||
|   | fd704f8de0 | ||
|   | d9ca9154d1 | ||
|   | 35110eca73 | ||
|   | 9ad92b3007 | ||
|   | 2f78c96330 | ||
|   | 639857ceb2 | ||
|   | 162f58c53c | ||
|   | 84c4d96e71 | ||
|   | c0d343d56d | ||
|   | 6d14a80608 | ||
|   | f451bb7c49 | ||
|   | 20b17d6b04 | ||
|   | bb2317b63c | ||
|   | 189461dc98 | ||
|   | 69af552bc1 | ||
|   | 0ae6ff9f72 | ||
|   | 8b571fbbb1 | ||
|   | f3fcd409d5 | ||
|   | a47532f88a | ||
|   | 6c157a404b | ||
|   | 4f8a49143d | ||
|   | 493d6033aa | ||
|   | 8f219af884 | ||
|   | aeb04136f7 | ||
|   | 0b8f57bf06 | ||
|   | 6508d446e1 | ||
|   | 82cb462bb4 | ||
|   | 9a264bf610 | ||
|   | 57007e80a9 | ||
|   | b6c876bdb6 | ||
|   | 57afae79eb | ||
|   | 84c2184909 | ||
|   | e358a24a75 | ||
|   | 9da9d00c62 | ||
|   | ec3f269d1f | ||
|   | 1c388a52a5 | ||
|   | 34a827bbfe | ||
|   | 726b9e2240 | ||
|   | 2236ba0d20 | ||
|   | 463c0f7096 | ||
|   | e49a7e361c | ||
|   | 6e87cf5b30 | ||
|   | 5872e8dd7e | ||
|   | e81d4ac8c8 | ||
|   | 4922904991 | ||
|   | decae2dcda | ||
|   | 16bbd13af7 | ||
|   | ee0666c8df | ||
|   | a8a8ae2e92 | ||
|   | fd1148a728 | ||
|   | 74c7b41ee7 | ||
|   | 465e19dbe9 | ||
|   | 86660c73e5 | ||
|   | 6d8a208df2 | ||
|   | c3a826fdce | ||
|   | c5d6a42abf | ||
|   | d49c144297 | ||
|   | e7de7d5eb3 | ||
|   | 20005a83d2 | ||
|   | 27926030f9 | ||
|   | 701de67b79 | ||
|   | 883479f01e | ||
|   | b37a0b0512 | ||
|   | 5c5d5270d2 | ||
|   | 36461fb2aa | ||
|   | d8dcd5e472 | ||
|   | c51b46c982 | ||
|   | b1b63c1dd1 | ||
|   | 30c93d66eb | ||
|   | 3b60bb7259 | ||
|   | c73f8e835f | ||
|   | 93558c4299 | ||
|   | 396cff5779 | ||
|   | 336154e729 | ||
|   | bb0aba34fa | ||
|   | 1dc0ce9562 | ||
|   | e4aee168b5 | ||
|   | 2c10c895da | ||
|   | c04fae3096 | ||
|   | a214af0830 | ||
|   | f21bc46e82 | ||
|   | 044327a488 | ||
|   | c4bbcc83b6 | ||
|   | eb162b73c2 | ||
|   | 29aafb9cea | ||
|   | 40eb7d0d48 | ||
|   | 1dcb2b7e65 | ||
|   | 5470b9aa73 | ||
|   | 050bd7dd0b | ||
|   | f75038634f | ||
|   | 300b4a9158 | ||
|   | 52071f3476 | ||
|   | 42ddd745f8 | ||
|   | a7846189cd | ||
|   | 4762995d1f | ||
|   | e3a530eb61 | ||
|   | d1235ff058 | ||
|   | 4370e92dbd | ||
|   | 50e9522a06 | ||
|   | b5bb9aa8e3 | ||
|   | cf2e365f23 | ||
|   | 72e532cb67 | ||
|   | ac5635f77d | ||
|   | 640d67c119 | ||
|   | 3e79693e3b | ||
|   | d55d3c2fd0 | ||
|   | 3aced17c75 | ||
|   | bac63914db | ||
|   | 6a63c51f7c | ||
|   | 632cf13767 | ||
|   | e7012a515c | ||
|   | 6b638af92f | ||
|   | c654b79c53 | ||
|   | bee7b874ea | ||
|   | 9c3fc592f7 | ||
|   | 4eab7a1ebc | ||
|   | 3d985688e4 | ||
|   | 17ea2631cd | ||
|   | b749910e6c | ||
|   | eff36caea8 | ||
|   | 6ff092f140 | ||
|   | 28bb36e53d | ||
|   | 4a091bbd8a | ||
|   | e99a6b813e | ||
|   | b9e5302f27 | ||
|   | dd7b6aef39 | ||
|   | 910b8b6a69 | ||
|   | c3207e215f | ||
|   | f83be11b85 | ||
|   | 45bce1062a | ||
|   | 8cb344bf3c | ||
|   | fcc4518cdc | ||
|   | c84839eb91 | ||
|   | 1f878aee69 | ||
|   | 84fd4686e2 | ||
|   | ede9fb4fcc | ||
|   | 723aef71e8 | ||
|   | 48964a911e | ||
|   | 6a35cb60fd | ||
|   | 1e51c3a832 | ||
|   | 205dda2b39 | ||
|   | 1c18d19da0 | ||
|   | 645729e943 | ||
|   | f425a25c98 | ||
|   | aaace2e802 | ||
|   | 3f16d9fbc9 | ||
|   | 3afc57bab8 | ||
|   | 55225106b6 | ||
|   | 1a31bff9fe | ||
|   | 4eaa3329ec | ||
|   | 028d78b993 | ||
|   | 944af98be6 | ||
|   | 2789b2b0ad | ||
|   | 7dded571de | ||
|   | 95fe8372e8 | ||
|   | ecdcb0ef67 | ||
|   | 6a04a03eb5 | ||
|   | 0c96056a94 | ||
|   | f518a5e231 | ||
|   | f581c1062e | ||
|   | 0b3deceea3 | ||
|   | fa4cd8868c | ||
|   | 8c573ca7f3 | ||
|   | 5a5cf3a51d | ||
|   | 3f23e8443e | ||
|   | a00f9b093c | ||
|   | 5f538ce3f8 | ||
|   | ebcaa3d579 | ||
|   | 60e26199a2 | ||
|   | 11defd180c | ||
|   | c82c1691ee | ||
|   | 364562f209 | ||
|   | 5d9fc28fa7 | ||
|   | e5ec5c284f | ||
|   | a90e33ad71 | ||
|   | 62ab21ce7d | ||
|   | cc8e8db1e5 | ||
|   | b19cba2016 | ||
|   | 315a9c95d5 | ||
|   | e010ac9706 | ||
|   | e4c0a85da0 | ||
|   | d3e4cdd5b0 | ||
|   | 763b812dc7 | ||
|   | 3269dfb4ab | ||
|   | e816bd259f | ||
|   | a295408e09 | ||
|   | 42a34c7cd7 | ||
|   | 9a72751958 | ||
|   | 314e6fa80b | ||
|   | b2b66f749a | ||
|   | 708ed6fded | ||
|   | 5c30fa50d6 | ||
|   | fc33c424d9 | ||
|   | b04d6dd0b1 | ||
|   | 9c5f79c56a | ||
|   | ef5eea689a | ||
|   | fd191deb49 | ||
|   | e1da1ff7d3 | ||
|   | 2b00ed7ef8 | ||
|   | d960ea959d | ||
|   | 274842ec41 | ||
|   | c06da7c84a | ||
|   | cea117b509 | ||
|   | 6078c938b2 | ||
|   | 9e95dd4821 | ||
|   | 0cc8b57d4f | ||
|   | 2179e6e797 | ||
|   | 7dde3d1825 | ||
|   | a0fe950b75 | ||
|   | 44985e8884 | ||
|   | f03366bcbf | ||
|   | d43ea83033 | ||
|   | 11bdba0007 | ||
|   | 07e58aaa79 | ||
|   | a31ddd363b | ||
|   | ed9e10f2d8 | ||
|   | 02ae3c2810 | ||
|   | 669ebb5f71 | ||
|   | 9a3e0e52cb | ||
|   | b0f856213d | ||
|   | 6f4ff1f2bf | ||
|   | d3eea61f1f | ||
|   | d59d81fae8 | ||
|   | 329ca40b6f | ||
|   | e71bd416f4 | ||
|   | ad66fc6cc2 | ||
|   | d12b44204b | ||
|   | 4be2136de4 | ||
|   | c4dbed040b | ||
|   | 366b62af2d | ||
|   | a6955aa486 | ||
|   | ad30341fa2 | ||
|   | 23da55a9f1 | ||
|   | 41e6292e7b | ||
|   | ae1d6f29d9 | ||
|   | ccfc1ddbef | ||
|   | 002de1eae2 | ||
|   | 63621bae81 | ||
|   | 85f9e6c4b9 | ||
|   | 967ec296c0 | ||
|   | c6aae9b1d7 | ||
|   | 913c370c25 | ||
|   | e5472bbd21 | ||
|   | 957c258c6d | ||
|   | abee109cd1 | ||
|   | 502e5ae6e1 | ||
|   | b8417be1f2 | ||
|   | 9e037431b4 | ||
|   | f71b3676bb | ||
|   | 50fe7b5e35 | ||
|   | 9fb253388b | ||
|   | 8cf1786296 | ||
|   | 51b17b299c | ||
|   | 78882e4642 | ||
|   | 8465a367a4 | ||
|   | 3bcfe678ab | ||
|   | d5403f3a5b | ||
|   | 26abb48533 | ||
|   | 177848ed27 | ||
|   | 656a2e93d7 | ||
|   | 6b1220b61d | ||
|   | 9d7330d879 | ||
|   | 26a5954fa0 | ||
|   | 01165e08e0 | ||
|   | 6e1633a6c5 | ||
|   | a8ff0a21bf | ||
|   | b8bc6bed97 | ||
|   | 1a4402038c | ||
|   | 5ac51cc9b5 | ||
|   | c12159ce21 | ||
|   | 4485503ecc | ||
|   | 200ac588cc | ||
|   | 0bb040822d | ||
|   | 543fbe14ee | ||
|   | e02ab66120 | ||
|   | 76c7c694c5 | ||
|   | f0057977b7 | ||
|   | e8e43f06af | ||
|   | 04b35e86d5 | ||
|   | 64ab85da4f | ||
|   | b8d7a13ea3 | ||
|   | 78a76dc905 | ||
|   | 5fa5fff0e9 | ||
|   | d323b3d816 | ||
|   | b685b5672a | ||
|   | 8f6c2f87c8 | ||
|   | f30e8b11eb | ||
|   | 8bd6d6a4de | ||
|   | b3a8f438fc | ||
|   | e78ddf0a95 | ||
|   | 5f0366c2cb | ||
|   | 779ca09775 | ||
|   | 313f1a1e83 | ||
|   | 21337f4776 | ||
|   | 53a8e5655b | ||
|   | 2d85585ae1 | ||
|   | 63d109f7be | ||
|   | c904b6b5bf | ||
|   | 6a27449922 | ||
|   | 9a9c07f571 | ||
|   | 4382204e1b | ||
|   | 6d3114efe2 | ||
|   | b62baaed95 | ||
|   | 9b391e531b | ||
|   | a0c7a6d22b | ||
|   | 14424f7058 | 
							
								
								
									
										401
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										401
									
								
								CHANGES
									
									
									
									
									
								
							| @@ -6,6 +6,407 @@ | ||||
|  | ||||
|                                   Changelog | ||||
|  | ||||
|  | ||||
| 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 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. 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. | ||||
|   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) #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. | ||||
|  | ||||
| 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 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) | ||||
|  | ||||
| Daniel (13 May 2005) | ||||
| - Grigory Entin reported that curl's configure detects a fine poll() for Mac | ||||
|   OS X 10.4 (while 10.3 or later detected a "bad" one), but the executable | ||||
|   doesn't work as good as if built without poll(). I've adjusted the configure | ||||
|   to always skip the fine-poll() test on Mac OS X (darwin). | ||||
|  | ||||
| Daniel (12 May 2005) | ||||
| - 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 | ||||
|   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 | ||||
|   the problem and the fix. | ||||
|  | ||||
| - 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 | ||||
|   informs about it. But it still continues without the condition. | ||||
|  | ||||
| Version 7.14.0-pre2 (11 May 2005) | ||||
|  | ||||
| Daniel (11 May 2005) | ||||
| - Starting now, libcurl sends a little different set of headers in its default | ||||
|   HTTP requests: | ||||
|    | ||||
|   A) Normal non-proxy HTTP: | ||||
|     - no more "Pragma: no-cache" (this only makes sense to proxies) | ||||
|  | ||||
|   B) Non-CONNECT HTTP request over proxy: | ||||
|     - "Pragma: no-cache" is used (like before) | ||||
|     - "Proxy-Connection: Keep-alive" (for older style 1.0-proxies) | ||||
|  | ||||
|   C) CONNECT HTTP request over proxy: | ||||
|     - "Host: [name]:[port]" | ||||
|     - "Proxy-Connection: Keep-alive" | ||||
|  | ||||
|   The A) case is mostly to reduce the default header size and remove a | ||||
|   pointless header. | ||||
|  | ||||
|   The B) is to address (rare) problems with HTTP 1.0 proxies | ||||
|  | ||||
|   The C) headers are both to address (rare) problems with some proxies. The | ||||
|   code in libcurl that deals with CONNECT requests need a rewrite, but it | ||||
|   feels like a too big a job for me to do now. Details are added in the code | ||||
|   comments for now. | ||||
|  | ||||
|   Updated a large amount of test cases to reflect the news. | ||||
|  | ||||
| Daniel (10 May 2005) | ||||
| - Half-baked attempt to bail out if select() returns _only_ errorfds when the | ||||
|   transfer is in progress. An attempt to fix Allan's problem. See | ||||
|   http://curl.haxx.se/mail/lib-2005-05/0073.html and the rest of that thread | ||||
|   for details. | ||||
|  | ||||
|   I'm still not sure this is the right fix, but... | ||||
|  | ||||
| Version 7.14.0-pre1 (9 May 2005) | ||||
|  | ||||
| Daniel (2 May 2005) | ||||
| - Sort of "fixed" KNOWN_BUGS #4: curl now builds IPv6 enabled on AIX 4.3. At | ||||
|   least it should no longer cause a compiler error. However, it does not have | ||||
|   AI_NUMERICHOST so we cannot getaddrinfo() any numerical addresses with it | ||||
|   (we use that for FTP PORT/EPRT)! So, I modified the configure check that | ||||
|   checks if the getaddrinfo() is working, to use AI_NUMERICHOST since then | ||||
|   it'll fail on AIX 4.3 and it will automatically build with IPv6 support | ||||
|   disabled. | ||||
|  | ||||
| - Added --trace-time that when used adds a time stamp to each trace line that | ||||
|   --trace, --trace-ascii and --verbose output. I also made the '>' display | ||||
|   separate each line on the linefeed so that HTTP requests etc look nicer in | ||||
|   the -v output. | ||||
|  | ||||
| - Made curl recognize the environment variables Lynx (and others?) support for | ||||
|   pointing out the CA cert path/file: SSL_CERT_DIR and SSL_CERT_FILE. If | ||||
|   CURL_CA_BUNDLE is not set, they are checked afterwards. | ||||
|  | ||||
|   Like before: on windows if none of these are set, it checks for the ca cert | ||||
|   file like this: | ||||
|  | ||||
|   1. application's directory | ||||
|   2. current working directory | ||||
|   3. Windows System directory (e.g. C:\windows\system32) | ||||
|   4. Windows Directory (e.g. C:\windows) | ||||
|   5. all directories along %PATH% | ||||
|  | ||||
| Daniel (1 May 2005) | ||||
| - The runtests.pl script now starts test servers by doing fork() and exec() | ||||
|   instead of the previous approach. This is less complicated and should | ||||
|   hopefully lead to less "leaked" servers (servers that aren't stopped | ||||
|   properly when the tests are stopped). | ||||
|  | ||||
| - Alexander Zhuravlev found a case when you did "curl -I [URL]" and it | ||||
|   complained on the chunked encoding, even though a HEAD should never return a | ||||
|   body and thus it cannot be a chunked-encoding problem! | ||||
|  | ||||
| Daniel (30 April 2005) | ||||
| - Alexander Zhuravlev found out that (lib)curl SIGSEGVed when using | ||||
|   --interface on an address that can't be bound. | ||||
|  | ||||
| Daniel (28 April 2005) | ||||
| - Working on fixing up test cases to mark sections as 'mode=text' for things | ||||
|   that curl writes as text files, since then they can get different line | ||||
|   endings depending on OS. Andr<64>s Garc<72>a helps me work this out. | ||||
|  | ||||
|   Did lots of other minor tweaks on the test scripts to work better and more | ||||
|   reliably find test servers and also kill test servers. | ||||
|  | ||||
| - Dan Fandrich pointed out how the runtests.pl script killed the HTTP server | ||||
|   instead of the HTTPS server when closing it down. | ||||
|  | ||||
| Daniel (27 April 2005) | ||||
| - Paul Moore made curl check for the .curlrc file (_curlrc on windows) on two | ||||
|   more places. First, CURL_HOME is a new environment variable that is used | ||||
|   instead of HOME if it is set, to point out where the default config file | ||||
|   lives. If there's no config file in the dir pointed out by one of the | ||||
|   environment variables, the Windows version will instead check the same | ||||
|   directory the executable curl is located in. | ||||
|  | ||||
| Daniel (26 April 2005) | ||||
| - Cory Nelson's work on nuking compiler warnings when building on x64 with | ||||
|   VS2005. | ||||
|  | ||||
| Daniel (25 April 2005) | ||||
| - Fred New reported a bug where we used Basic auth and user name and password | ||||
|   in .netrc, and when following a Location: the subsequent requests didn't | ||||
|   properly use the auth as found in the netrc file. Added test case 257 to | ||||
|   verify my fix. | ||||
|  | ||||
| - Based on feedback from Cory Nelson, I added some preprocessor magic in | ||||
|   */setup.h and */config-win32.h to build fine with VS2005 on x64. | ||||
|  | ||||
| Daniel (23 April 2005) | ||||
| - Alex Suykov made the curl tool now assume that uploads using HTTP:// or | ||||
|   HTTPS:// are the only ones that show output and thus motivates a switched | ||||
|   off progress meter if the output is sent to the terminal. This makes FTP | ||||
|   uploads without '>', -o or -O show the progress meter. | ||||
|  | ||||
| Daniel (22 April 2005) | ||||
| - Dave Dribin's MSVC makefile fix: set CURL_STATICLIB when it builds static | ||||
|   library variants. | ||||
|  | ||||
| - Andres Garcia fixed configure to set the proper define when building static | ||||
|   libcurl on windows. | ||||
|  | ||||
| - --retry-delay didn't work. | ||||
|  | ||||
| Daniel (18 April 2005) | ||||
| - Olivier reported that even though he used CURLOPT_PORT, libcurl clearly | ||||
|   still used the default port. He was right. I fixed the problem and added the | ||||
|   test cases 521, 522 and 523 to verify the fix. | ||||
|  | ||||
| - Toshiyuki Maezawa reported that when doing a POST with a read callback, | ||||
|   libcurl didn't properly send an Expect: 100-continue header. It does now. | ||||
|  | ||||
| - I committed by mig change in the test suite's FTP server that moves out all | ||||
|   socket/TCP code to a separate C program named sockfilt. And added 4 new | ||||
|   test cases for FTP over IPv6. | ||||
|  | ||||
| Daniel (8 April 2005) | ||||
| - Cory Nelson reported a problem with a HTTP server that responded with a 304 | ||||
|   response containing an "illegal" Content-Length: header, which was not | ||||
|   | ||||
| @@ -200,9 +200,21 @@ netware: | ||||
| 	$(MAKE) -C lib -f Makefile.netware | ||||
| 	$(MAKE) -C src -f Makefile.netware | ||||
|  | ||||
| netware-ares: | ||||
| 	$(MAKE) -C lib -f Makefile.netware WITH_ARES=1 | ||||
| 	$(MAKE) -C src -f Makefile.netware WITH_ARES=1 | ||||
|  | ||||
| netware-ssl: | ||||
| 	$(MAKE) -C lib -f Makefile.netware SSL=1 | ||||
| 	$(MAKE) -C src -f Makefile.netware SSL=1 | ||||
| 	$(MAKE) -C lib -f Makefile.netware WITH_SSL=1 | ||||
| 	$(MAKE) -C src -f Makefile.netware WITH_SSL=1 | ||||
|  | ||||
| netware-ssl-zlib: | ||||
| 	$(MAKE) -C lib -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1 | ||||
| 	$(MAKE) -C src -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1 | ||||
|  | ||||
| netware-zlib: | ||||
| 	$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1 | ||||
| 	$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1 | ||||
|  | ||||
| netware-clean: | ||||
| 	$(MAKE) -C lib -f Makefile.netware clean | ||||
|   | ||||
							
								
								
									
										37
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								README
									
									
									
									
									
								
							| @@ -26,50 +26,37 @@ CONTACT | ||||
|   If you have problems, questions, ideas or suggestions, please contact us | ||||
|   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 | ||||
|  | ||||
|   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/ | ||||
|         Australia -- http://curl.planetmirror.com/ | ||||
|         Austria   -- http://curl.gds.tuwien.ac.at/ | ||||
|         Canada    -- http://curl.meulie.net/ | ||||
|         Denmark   -- http://curl.cofman.dk/ | ||||
|         Estonia   -- http://curl.wildyou.net/ | ||||
|         France    -- http://curl.mirror.internet.tp/ | ||||
|         Germany   -- http://curl.kgt.org/ | ||||
|         Germany   -- http://curl.miscellaneousmirror.org/ | ||||
|         Germany   -- http://curl.mirror.at.stealer.net/ | ||||
|         Germany   -- http://curl.mirroring.de/ | ||||
|         Germany   -- http://curl.mons-new-media.de/ | ||||
|         Germany   -- http://curl.netmirror.org/ | ||||
|         Russia    -- http://curl.tsuren.net/ | ||||
|         Taiwan    -- http://curl.cs.pu.edu.tw/ | ||||
|         Thailand  -- http://curl.siamu.ac.th/ | ||||
|         US (AZ)   -- http://curl.islandofpoker.com/ | ||||
|         US (CA)   -- http://curl.mirror.redwire.net/ | ||||
|         US (CA)   -- http://curl.mirrormonster.com/ | ||||
|         US (CA)   -- http://curl.signal42.com/ | ||||
|         US (CA)   -- http://curl.tolix.org/ | ||||
|         US (CA)   -- http://curl.webhosting76.com/ | ||||
|         US (TX)   -- http://curl.109k.com/ | ||||
|  | ||||
| DOWNLOAD | ||||
|  | ||||
|   The official download mirror sites are: | ||||
|  | ||||
|         Australia -- http://curl.planetmirror.com/download.html | ||||
|         Austria   -- http://curl.gds.tuwien.ac.at/download.html | ||||
|         Estonia   -- http://curl.wildyou.net/download.html | ||||
|         Germany   -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/ | ||||
|         Germany   -- http://curl.mirror.at.stealer.net/download.html | ||||
|         Germany   -- http://curl.netmirror.org/download.html | ||||
|         Germany   -- http://www.mirrorspace.org/curl/ | ||||
|         Hongkong  -- http://www.execve.net/curl/ | ||||
|         Russia    -- http://curl.tsuren.net/download.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 | ||||
|         US (TX)   -- http://curl.mirrors.cyberservers.net/ | ||||
|         US (TX)   -- http://curl.seekmeup.com/ | ||||
|         US (TX)   -- http://curl.hostingzero.com/ | ||||
|  | ||||
| CVS | ||||
|  | ||||
|   | ||||
| @@ -1,31 +1,74 @@ | ||||
| Curl and libcurl 7.14.0 | ||||
| Curl and libcurl 7.14.1 | ||||
|  | ||||
|  Public curl release number:               88 | ||||
|  Releases counted from the very beginning: 115 | ||||
|  Available command line options:           106 | ||||
|  Available curl_easy_setopt() options:     122 | ||||
|  Public curl release number:               89 | ||||
|  Releases counted from the very beginning: 116 | ||||
|  Available command line options:           108 | ||||
|  Available curl_easy_setopt() options:     123 | ||||
|  Number of public functions in libcurl:    46 | ||||
|  Amount of public web site mirrors:        21 | ||||
|  Amount of public web site mirrors:        25 | ||||
|  Number of known libcurl bindings:         31 | ||||
|  Number of contributors:                   447 | ||||
|  | ||||
| This release includes the following changes: | ||||
|  | ||||
|  o GnuTLS support, use configure --with-gnutls. Work on this was sponsored | ||||
|    by The Written Word. | ||||
|  o GNU GSS support | ||||
|  o --ignore-content-length and CURLOPT_IGNORE_CONTENT_LENGTH added | ||||
|  o negotiates data connection SSL earlier when doing FTPS with PASV | ||||
|  o CURLOPT_COOKIELIST and CURLINFO_COOKIELIST | ||||
|  o trailer support for chunked encoded data streams  | ||||
|  o -x/CURL_PROXY strings may now contain user+password | ||||
|  o --trace-time now outputs the full microsecond, all 6 digits | ||||
|  | ||||
| This release includes the following bugfixes: | ||||
|  | ||||
|  o HTTP 304 response with Content-Length: header | ||||
|  o time-conditioned FTP uploads | ||||
|  o MSVC build problem with the DSP file | ||||
|  o windows threaded resolver access violation with multi interface | ||||
|  o test suite works with valgrind 3 | ||||
|  o CA cert verification with GnuTLS builds | ||||
|  o handles expiry times in cookie files that go beyond 32 bits in size | ||||
|  o several client problems with files, such as doing -d @file when the file | ||||
|    isn't readable now gets a warning displayed | ||||
|  o write callback abort didn't always "take" | ||||
|  o the curl -z "bad syntax" warning is now hidden when -s is used | ||||
|  o curl -d @nonexisting no longer makes a GET | ||||
|  o minor debug callback data size | ||||
|  o date parsing of dates including daylight savings time zone names | ||||
|  o using NTLM over proxy with an FTP URL | ||||
|  o curl-config --features now displays SSL when built with GnuTLS too | ||||
|  o CURLOPT_HTTPGET, CURLOPT_POST and CURLOPT_HTTPPOST reset CURLOPT_NOBODY | ||||
|  o builds fine on AmigaOS again | ||||
|  o corrected date parsing on Windows with auto-DST-adjust enabled | ||||
|  o treats CONNECT 407 responses with bodies better during Digest/NTLM auth | ||||
|  o improved strerror_r() API guessing when cross-compiling | ||||
|  o debug builds work on Tru64 | ||||
|  o improved libcurl.m4 | ||||
|  o possible memory leak in windows name resolves | ||||
|  o c-ares enabled build with mingw | ||||
|  o proxy host set with numerical IPv6 address | ||||
|  o better treatment of binary zeroes in HTTP response headers | ||||
|  o fixed the notorious FTP server failure in the test suite | ||||
|  o better checking of text output in the test suite on windows | ||||
|  o FTP servers' TYPE command response check made less strict | ||||
|  o URL-without-slash as in http://somehost?data | ||||
|  o strerror_r() configure check for HP-UX 10.20 (and others) | ||||
|  o time parse work-around on HP-UX 10.20 since its gmtime_r() is broken | ||||
|  | ||||
| Other curl-related news since the previous public release: | ||||
|  | ||||
|  o http://curl.mirroring.de/ is a new german curl mirror | ||||
|  o pycurl 7.13.2: http://pycurl.sf.net/ | ||||
|  o cURLpp 0.5.2 was released at http://rrette.com/curlpp.html | ||||
|  o Rexx/CURL 1.3 was released at http://rexxcurl.sf.net/ | ||||
|  o http://curl.miscellaneousmirror.org is a new German curl mirror | ||||
|  o LuaCURL by Alexander Marinov at http://luacurl.luaforge.net/ | ||||
|  o http://curl.hostingzero.com/ is a new US curl mirror | ||||
|  o ocurl 0.2.1 was released at http://sourceforge.net/projects/ocurl | ||||
|  | ||||
| This release would not have looked like this without help, code, reports and | ||||
| advice from friends like these: | ||||
|  | ||||
|  Christophe Legry,Cory Nelson  | ||||
|  John McGowan, Georg Wicherski, Andres Garcia, Eric Cooper, Todd Kulesza, | ||||
|  Tupone Alfredo, Gisle Vanem, David Shaw, Andrew Bushnell, Dan Fandrich, | ||||
|  Adrian Schuur, Diego Casorran, Peteris Krumins, Jon Grubbs, Christopher | ||||
|  R. Palmer, Mario Schroeder, Richard Clayton, James Bursa, Jeff Pohlmeyer, | ||||
|  Norbert Novotny, Toby Peterson, Simon Josefsson, Igor Polyakov, Kevin Lussier | ||||
|  | ||||
|         Thanks! (and sorry if I forgot to mention someone) | ||||
|   | ||||
							
								
								
									
										31
									
								
								TODO-RELEASE
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								TODO-RELEASE
									
									
									
									
									
								
							| @@ -1,35 +1,12 @@ | ||||
| Issues not sorted in any particular order. | ||||
|  | ||||
| To get fixed in 7.14.1 (planned release: June 2005) | ||||
| To get fixed in 7.14.1 (planned release: August 2005) | ||||
| ====================== | ||||
|  | ||||
| 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 | ||||
| To get fixed in 7.14.2 (planned release: October 2005) | ||||
| ====================== | ||||
|  | ||||
| 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. | ||||
| 60 - CONNECT 407 responses that kills the connection | ||||
|  | ||||
| 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). | ||||
| 63 -  | ||||
|  | ||||
| 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 -  | ||||
|   | ||||
							
								
								
									
										82
									
								
								acinclude.m4
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								acinclude.m4
									
									
									
									
									
								
							| @@ -122,6 +122,30 @@ dnl end of non-blocking try-compile test | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
| dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but | ||||
| dnl AIX 4.3 is one known exception. | ||||
| AC_DEFUN([TYPE_SOCKADDR_STORAGE], | ||||
| [ | ||||
|    AC_CHECK_TYPE([struct sockaddr_storage], | ||||
|         AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1, | ||||
|                   [if struct sockaddr_storage is defined]), , | ||||
|    [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_INET_H | ||||
| #include <arpa/inet.h> | ||||
| #endif | ||||
|    ]) | ||||
|  | ||||
| ]) | ||||
|  | ||||
| dnl Check for socklen_t: historically on BSD it is an int, and in | ||||
| dnl POSIX 1g it is a type of its own, but some platforms use different | ||||
| dnl types for the argument to getsockopt, getpeername, etc.  So we | ||||
| @@ -168,8 +192,7 @@ AC_DEFUN([TYPE_SOCKLEN_T], | ||||
| ]) | ||||
|  | ||||
| dnl Check for in_addr_t: it is used to receive the return code of inet_addr() | ||||
| dnl and a few other things. If not found, we set it to unsigned int, as even | ||||
| dnl 64-bit implementations use to set it to a 32-bit type. | ||||
| dnl and a few other things. | ||||
| AC_DEFUN([TYPE_IN_ADDR_T], | ||||
| [ | ||||
|    AC_CHECK_TYPE([in_addr_t], ,[ | ||||
| @@ -234,7 +257,7 @@ exit (h == NULL ? 1 : 0); }],[ | ||||
| ]) | ||||
|  | ||||
| dnl ************************************************************ | ||||
| dnl check for working getaddrinfo() | ||||
| dnl check for working getaddrinfo() that works with AI_NUMERICHOST | ||||
| dnl | ||||
| AC_DEFUN([CURL_CHECK_WORKING_GETADDRINFO],[ | ||||
|   AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[ | ||||
| @@ -249,6 +272,7 @@ int main(void) | ||||
|     int error; | ||||
|  | ||||
|     memset(&hints, 0, sizeof(hints)); | ||||
|     hints.ai_flags = AI_NUMERICHOST; | ||||
|     hints.ai_family = AF_UNSPEC; | ||||
|     hints.ai_socktype = SOCK_STREAM; | ||||
|     error = getaddrinfo("127.0.0.1", "8080", &hints, &ai); | ||||
| @@ -392,34 +416,25 @@ dnl      int strerror_r(int errnum, char *buf, size_t n); | ||||
| dnl | ||||
| AC_DEFUN([CURL_CHECK_STRERROR_R], | ||||
| [ | ||||
|   dnl determine of strerror_r is present | ||||
|   AC_CHECK_FUNCS(strerror_r,[ | ||||
|   AC_CHECK_FUNCS(strerror_r) | ||||
|  | ||||
|   if test "x$ac_cv_func_strerror_r" = "xyes"; then | ||||
|  | ||||
|     AC_MSG_CHECKING(whether strerror_r is declared) | ||||
|     AC_EGREP_CPP(strerror_r,[ | ||||
| #include <string.h>],[ | ||||
|       strerror_r="yes" | ||||
|       AC_MSG_RESULT(yes)],[ | ||||
|       AC_MSG_RESULT(no) | ||||
|       AC_MSG_CHECKING(whether strerror_r with -D_THREAD_SAFE is declared) | ||||
|       AC_MSG_CHECKING(whether strerror_r with -D_REENTRANT is declared) | ||||
|       AC_EGREP_CPP(strerror_r,[ | ||||
| #define _THREAD_SAFE | ||||
| #define _REENTRANT | ||||
| #include <string.h>],[ | ||||
|         strerror_r="yes" | ||||
| 	CPPFLAGS="-D_THREAD_SAFE $CPPFLAGS" | ||||
| 	CPPFLAGS="-D_REENTRANT $CPPFLAGS" | ||||
| 	AC_MSG_RESULT(yes)], | ||||
| 	AC_MSG_RESULT(no))])]) | ||||
|  | ||||
|   if test "x$strerror_r" = "xyes"; then | ||||
|  | ||||
|     dnl check if strerror_r is properly declared in the headers | ||||
|     AC_CHECK_DECL(strerror_r, , | ||||
| 	AC_MSG_RESULT(no) | ||||
|         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 with _THREAD_SAFE | ||||
|     ]) dnl plain cpp for it | ||||
|  | ||||
|     dnl determine if this strerror_r() is glibc or POSIX | ||||
|     AC_MSG_CHECKING([for a glibc strerror_r API]) | ||||
| @@ -441,8 +456,20 @@ main () { | ||||
|     AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()]) | ||||
|     AC_MSG_RESULT([yes]), | ||||
|     AC_MSG_RESULT([no]), | ||||
|     dnl cross-compiling! | ||||
|  | ||||
|     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 | ||||
| @@ -731,15 +758,18 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS], | ||||
|          fi | ||||
|  | ||||
|          dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on | ||||
|          dnl on i686-Linux as it gives us heaps with false positives | ||||
|          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 | ||||
|            dnl gcc 3.3 and later | ||||
|            WARN="$WARN -Wendif-labels -Wstrict-prototypes" | ||||
|          fi | ||||
|  | ||||
|          if test "$gccnum" -ge "304"; then | ||||
|            # try -Wunreachable-code on gcc 3.4 | ||||
|            WARN="$WARN -Wunreachable-code" | ||||
|            # try these on gcc 3.4 | ||||
|            WARN="$WARN -Wdeclaration-after-statement" | ||||
|          fi | ||||
|  | ||||
|          for flag in $CPPFLAGS; do | ||||
|   | ||||
							
								
								
									
										40
									
								
								ares/CHANGES
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								ares/CHANGES
									
									
									
									
									
								
							| @@ -1,5 +1,45 @@ | ||||
|   Changelog for the c-ares project | ||||
|  | ||||
| Version 1.3.0 (August 29, 2004) | ||||
|  | ||||
| * August 21 | ||||
|  | ||||
| - Alfredo Tupone provided a fix for the Windows code in get_iphlpapi_dns_info() | ||||
|   when getting the DNS server etc. | ||||
|  | ||||
| * June 19 | ||||
|  | ||||
| - Added some checks for the addrinfo structure. | ||||
|  | ||||
| * June 2 | ||||
|  | ||||
| - William Ahern: | ||||
|  | ||||
|   Make UDP sockets non-blocking. I've confirmed that at least on Linux 2.4 a | ||||
|   read event can come back from poll() on a valid SOCK_DGRAM socket but | ||||
|   recv(2) will still block. This patch doesn't ignore EAGAIN in | ||||
|   read_udp_packets(), though maybe it should. (This patch was edited by Daniel | ||||
|   Stenberg and a new configure test was added (imported from curl's configure) | ||||
|   to properly detect what non-blocking socket approach to use.) | ||||
|  | ||||
|   I'm not quite sure how this was happening, but I've been seeing PTR queries | ||||
|   which seem to return empty responses. At least, they were empty when calling | ||||
|   ares_expand_name() on the record. Here's a patch which guarantees to | ||||
|   NUL-terminate the expanded name. The old behavior failed to NUL-terminate if | ||||
|   len was 0, and this was causing strlen() to run past the end of the buffer | ||||
|   after calling ares_expand_name() and getting ARES_SUCCESS as the return | ||||
|   value. If q is not greater than *s then it's equal and *s is always | ||||
|   allocated with at least one byte. | ||||
|  | ||||
| * May 16 | ||||
|  | ||||
| - Added ares_getnameinfo which mimics the getnameinfo API (another feature | ||||
|   that could use testing). | ||||
|  | ||||
| * May 14 | ||||
|  | ||||
| - Added an inet_ntop function from BIND for systems that do not have it. | ||||
|  | ||||
| * April 9 | ||||
|  | ||||
| - Made sortlist support IPv6 (this can probably use some testing). | ||||
|   | ||||
| @@ -15,7 +15,7 @@ EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \ | ||||
|  $(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, | ||||
| # passing -version-info 3:12:1 sets current to 3, revision to 12, and age to | ||||
| # 1. | ||||
|   | ||||
| @@ -4,14 +4,15 @@ ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c	   \ | ||||
| ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c     \ | ||||
| ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c       \ | ||||
| windows_port.c ares_expand_string.c ares_parse_ptr_reply.c                  \ | ||||
| ares_parse_aaaa_reply.c inet_net_pton.c bitncmp.c | ||||
| ares_parse_aaaa_reply.c ares_getnameinfo.c inet_net_pton.c bitncmp.c        \ | ||||
| inet_ntop.c | ||||
|  | ||||
| HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h nameser.h \ | ||||
|            inet_net_pton.h | ||||
| HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h          \ | ||||
|            nameser.h inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h | ||||
|  | ||||
| MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \ | ||||
|  ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3                \ | ||||
|  ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3        \ | ||||
|  ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3                 \ | ||||
|  ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3      \ | ||||
|  ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 | ||||
|  ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.3 | ||||
|   | ||||
| @@ -89,7 +89,7 @@ LDFLAGS	= -T | ||||
| AR	= ar | ||||
| ARFLAGS	= -cq | ||||
| 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) | ||||
| 	PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o | ||||
| else | ||||
| @@ -104,7 +104,7 @@ SDK_LIBC = $(NDK_ROOT)/libc | ||||
|  | ||||
| ifeq ($(LIBARCH),LIBC) | ||||
| 	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__ANSIC__ | ||||
| else | ||||
| @@ -126,7 +126,10 @@ DL	= ' | ||||
| #-include $(NDKBASE)/nlmconv/ncpfs.inc | ||||
| endif | ||||
|  | ||||
| OBJS	:= $(patsubst %.c,$(OBJDIR)/%.o,$(wildcard ares_*.c)) | ||||
| # Makefile.inc provides the CSOURCES and HHEADERS defines | ||||
| include Makefile.inc | ||||
|  | ||||
| OBJS	:= $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) | ||||
|  | ||||
| .PHONY: lib nlm prebuild dist install clean | ||||
|  | ||||
| @@ -256,6 +259,7 @@ config.h: Makefile.netware | ||||
| 	@echo $(DL)#define VERSION "$(LIBCURL_VERSION_STR)"$(DL) >> $@ | ||||
| 	@echo $(DL)#define PACKAGE_BUGREPORT "curl-bug@haxx.se"$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_ARPA_NAMESER_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@ | ||||
| @@ -297,8 +301,13 @@ config.h: Makefile.netware | ||||
| 	@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@ | ||||
| 	@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@ | ||||
| 	@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@ | ||||
| ifdef NW_WINSOCK | ||||
| 	@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@ | ||||
| else | ||||
|   | ||||
| @@ -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 pendantic compiler options as possible for that particular compiler. The | ||||
| @@ -119,6 +242,26 @@ AC_DEFUN([CARES_CHECK_STRUCT], [ | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
| dnl This macro determins if the specified struct contains a specific member. | ||||
| dnl Syntax: | ||||
| dnl CARES_CHECK_STRUCT_MEMBER(headers, struct name, member name, if found, [if not found]) | ||||
|  | ||||
| AC_DEFUN([CARES_CHECK_STRUCT_MEMBER], [ | ||||
|   AC_MSG_CHECKING([if struct $2 has member $3]) | ||||
|   AC_TRY_COMPILE([$1],  | ||||
|     [ | ||||
|       struct $2 struct_instance; | ||||
|       struct_instance.$3 = 0; | ||||
|     ], ac_struct="yes", ac_found="no") | ||||
|   if test "$ac_struct" = "yes" ; then | ||||
|     AC_MSG_RESULT(yes) | ||||
|     $4 | ||||
|   else | ||||
|     AC_MSG_RESULT(no) | ||||
|     $5 | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
| dnl This macro determines if the specified constant exists in the specified file | ||||
| dnl Syntax: | ||||
| dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found]) | ||||
|   | ||||
							
								
								
									
										30
									
								
								ares/ares.h
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								ares/ares.h
									
									
									
									
									
								
							| @@ -29,12 +29,14 @@ | ||||
|  | ||||
| #if defined(WATT32) | ||||
|   #include <netinet/in.h> | ||||
|   #include <sys/socket.h> | ||||
|   #include <tcp.h> | ||||
| #elif defined(WIN32) | ||||
|   #include <winsock.h> | ||||
|   #include <windows.h> | ||||
| #else | ||||
|   #include <netinet/in.h> | ||||
|   #include <sys/socket.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef  __cplusplus | ||||
| @@ -64,6 +66,9 @@ extern "C" { | ||||
| #define ARES_EDESTRUCTION       16 | ||||
| #define ARES_EBADSTR            17 | ||||
|  | ||||
| /* ares_getnameinfo error codes */ | ||||
| #define ARES_EBADFLAGS          18 | ||||
|  | ||||
| /* Flag values */ | ||||
| #define ARES_FLAG_USEVC         (1 << 0) | ||||
| #define ARES_FLAG_PRIMARY       (1 << 1) | ||||
| @@ -85,6 +90,24 @@ extern "C" { | ||||
| #define ARES_OPT_DOMAINS        (1 << 7) | ||||
| #define ARES_OPT_LOOKUPS        (1 << 8) | ||||
|  | ||||
| /* Nameinfo flag values */ | ||||
| #define ARES_NI_NOFQDN                  (1 << 0) | ||||
| #define ARES_NI_NUMERICHOST             (1 << 1) | ||||
| #define ARES_NI_NAMEREQD                (1 << 2) | ||||
| #define ARES_NI_NUMERICSERV             (1 << 3) | ||||
| #define ARES_NI_DGRAM                   (1 << 4) | ||||
| #define ARES_NI_TCP                     0 | ||||
| #define ARES_NI_UDP                     ARES_NI_DGRAM | ||||
| #define ARES_NI_SCTP                    (1 << 5) | ||||
| #define ARES_NI_DCCP                    (1 << 6) | ||||
| #define ARES_NI_NUMERICSCOPE            (1 << 7) | ||||
| #define ARES_NI_LOOKUPHOST              (1 << 8) | ||||
| #define ARES_NI_LOOKUPSERVICE           (1 << 9) | ||||
| /* Reserved for future use */ | ||||
| #define ARES_NI_IDN                     (1 << 10) | ||||
| #define ARES_NI_ALLOW_UNASSIGNED        (1 << 11) | ||||
| #define ARES_NI_USE_STD3_ASCII_RULES    (1 << 12) | ||||
|  | ||||
| struct ares_options { | ||||
|   int flags; | ||||
|   int timeout; | ||||
| @@ -101,12 +124,15 @@ struct ares_options { | ||||
|  | ||||
| struct hostent; | ||||
| struct timeval; | ||||
| struct sockaddr; | ||||
| struct ares_channeldata; | ||||
| typedef struct ares_channeldata *ares_channel; | ||||
| typedef void (*ares_callback)(void *arg, int status, unsigned char *abuf, | ||||
|                               int alen); | ||||
| typedef void (*ares_host_callback)(void *arg, int status, | ||||
|                                    struct hostent *hostent); | ||||
| typedef void (*ares_nameinfo_callback)(void *arg, int status, | ||||
|                                        char *node, char *service); | ||||
|  | ||||
| int ares_init(ares_channel *channelptr); | ||||
| int ares_init_options(ares_channel *channelptr, struct ares_options *options, | ||||
| @@ -123,7 +149,9 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family, | ||||
|                         ares_host_callback callback, void *arg); | ||||
| void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | ||||
|                         int family, ares_host_callback callback, void *arg); | ||||
|  | ||||
| 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); | ||||
| struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv, | ||||
|                              struct timeval *tv); | ||||
|   | ||||
| @@ -106,6 +106,8 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf, | ||||
|   /* Nuke the trailing period if we wrote one. */ | ||||
|   if (q > *s) | ||||
|     *(q - 1) = 0; | ||||
|   else | ||||
|     *q = 0; /* zero terminate */ | ||||
|  | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|   | ||||
| @@ -28,8 +28,8 @@ The | ||||
| .I ares_free_hostent | ||||
| function frees a | ||||
| .B struct hostent | ||||
| allocated by one of the functions \fIares_parse_a_reply(3)\fP or | ||||
| \fIares_parse_ptr_reply(3)\fP. | ||||
| allocated by one of the functions \fIares_parse_a_reply(3)\fP, | ||||
| \fIares_parse_aaaa_reply(3)\fP, or \fIares_parse_ptr_reply(3)\fP. | ||||
| .SH NOTES | ||||
| It is not necessary (and is not correct) to free the host structure passed to | ||||
| the callback functions for \fIares_gethostbyname(3)\fP or | ||||
| @@ -37,6 +37,7 @@ the callback functions for \fIares_gethostbyname(3)\fP or | ||||
| host structures when the callback returns. | ||||
| .SH SEE ALSO | ||||
| .BR ares_parse_a_reply (3), | ||||
| .BR ares_parse_aaaa_reply (3), | ||||
| .BR ares_parse_ptr_reply (3) | ||||
| .SH AUTHOR | ||||
| Greg Hudson, MIT Information Systems | ||||
|   | ||||
| @@ -23,8 +23,13 @@ | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_H | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|   | ||||
							
								
								
									
										145
									
								
								ares/ares_getnameinfo.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								ares/ares_getnameinfo.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .\" Copyright 2005 by Dominick Meglio. | ||||
| .\" | ||||
| .\" Permission to use, copy, modify, and distribute this | ||||
| .\" software and its documentation for any purpose and without | ||||
| .\" fee is hereby granted, provided that the above copyright | ||||
| .\" notice appear in all copies and that both that copyright | ||||
| .\" notice and this permission notice appear in supporting | ||||
| .\" documentation, and that the name of M.I.T. not be used in | ||||
| .\" advertising or publicity pertaining to distribution of the | ||||
| .\" software without specific, written prior permission. | ||||
| .\" M.I.T. makes no representations about the suitability of | ||||
| .\" this software for any purpose.  It is provided "as is" | ||||
| .\" without express or implied warranty. | ||||
| .\" | ||||
| .TH ARES_GETNAMEINFO 3 "16 May 2005" | ||||
| .SH NAME | ||||
| ares_getnameinfo \- Address-to-nodename translation in protocol-independent manner | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B typedef void (*ares_nameinfo_callback)(void *\fIarg\fP, int \fIstatus\fP, | ||||
| .B	char *\fInode\fP, char *\fIservice\fP) | ||||
| .PP | ||||
| .B void ares_getnameinfo(ares_channel \fIchannel\fP, const struct sockaddr *\fIsa\fP, | ||||
| .B 	socklen_t \fIsalen\fP, int \fIflags\fP, ares_nameinfo_callback \fIcallback\fP, | ||||
| .B 	void *\fIarg\fP) | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_getnameinfo | ||||
| function is defined for protocol-independent address translation. The function | ||||
| is a combination of \fIares_gethostbyaddr(3)\fP and \fIgetservbyport(3)\fP. The function will | ||||
| translate the address either by executing a host query on the name service channel | ||||
| identified by | ||||
| .IR channel  | ||||
| or it will attempt to resolve it locally if possible. | ||||
| The parameters | ||||
| .I sa | ||||
| and | ||||
| .I len | ||||
| give the address as a sockaddr structure, and | ||||
| .I flags | ||||
| gives the options that the function will use.  Valid flags are listed below: | ||||
| .TP 19 | ||||
| .B ARES_NI_NOFQDN | ||||
| Only the nodename portion of the FQDN is returned for local hosts. | ||||
| .TP 19 | ||||
| .B ARES_NI_NUMERICHOST | ||||
| The numeric form of the hostname is returned rather than the name. | ||||
| .TP 19 | ||||
| .B ARES_NI_NAMEREQD | ||||
| An error is returned if the hostname cannot be found in the DNS. | ||||
| .TP 19 | ||||
| .B ARES_NI_NUMERICSERV | ||||
| The numeric form of the service is returned rather than the name. | ||||
| .TP 19 | ||||
| .B ARES_NI_TCP | ||||
| The service name is to be looked up for the TCP protocol. | ||||
| .TP 19 | ||||
| .B ARES_NI_UDP | ||||
| The service name is to be looked up for the UDP protocol. | ||||
| .TP 19 | ||||
| .B ARES_NI_SCTP | ||||
| The service name is to be looked up for the SCTP protocol. | ||||
| .TP 19 | ||||
| .B ARES_NI_DCCP | ||||
| The service name is to be looked up for the DCCP protocol. | ||||
| .TP 19 | ||||
| .B ARES_NI_NUMERICSCOPE | ||||
| The numeric form of the scope ID is returned rather than the name. | ||||
| .TP 19 | ||||
| .B ARES_NI_LOOKUPHOST | ||||
| A hostname lookup is being requested. | ||||
| .TP 19 | ||||
| .B ARES_NI_LOOKUPSERVICE | ||||
| A service name lookup is being requested. | ||||
| .PP | ||||
| When the query | ||||
| is complete or has  | ||||
| failed, the ares library will invoke \fIcallback\fP.  Completion or failure of  | ||||
| the query may happen immediately, or may happen during a later call to | ||||
| \fIares_process(3)\fP, \fIares_destroy(3)\fP or \fIares_cancel(3)\fP. | ||||
| .PP | ||||
| The callback argument | ||||
| .I arg | ||||
| is copied from the | ||||
| .B ares_getnameinfo | ||||
| argument | ||||
| .IR arg . | ||||
| The callback argument | ||||
| .I status | ||||
| indicates whether the query succeeded and, if not, how it failed.  It | ||||
| may have any of the following values: | ||||
| .TP 19 | ||||
| .B ARES_SUCCESS | ||||
| The host lookup completed successfully. | ||||
| .TP 19 | ||||
| .B ARES_ENOTIMP | ||||
| The ares library does not know how to look up addresses of type | ||||
| .IR family . | ||||
| .TP 19 | ||||
| .B ARES_ENOTFOUND | ||||
| The address | ||||
| .I addr | ||||
| was not found. | ||||
| .TP 19 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .TP 19 | ||||
| .B ARES_EDESTRUCTION | ||||
| The name service channel | ||||
| .I channel | ||||
| is being destroyed; the query will not be completed. | ||||
| .TP 19 | ||||
| .B ARES_EBADFLAGS | ||||
| The | ||||
| .I flags | ||||
| parameter contains an illegal value. | ||||
| .PP | ||||
| On successful completion of the query, the callback argument | ||||
| .I node | ||||
| contains a string representing the hostname (assuming  | ||||
| .B ARES_NI_LOOKUPHOST | ||||
| was specified). Additionally,  | ||||
| .I service | ||||
| contains a string representing the service name (assuming | ||||
| .B ARES_NI_LOOKUPSERVICE | ||||
| was specified). | ||||
| If the query did not complete successfully, or one of the values | ||||
| was not requested,  | ||||
| .I node | ||||
| or | ||||
| .I service | ||||
| will be  | ||||
| .BR NULL . | ||||
| .SH SEE ALSO | ||||
| .BR ares_process (3), | ||||
| .BR ares_getaddrinfo (3) | ||||
| .SH AUTHOR | ||||
| Dominick Meglio | ||||
| .br | ||||
| Copyright 2005 by Dominick Meglio. | ||||
							
								
								
									
										331
									
								
								ares/ares_getnameinfo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										331
									
								
								ares/ares_getnameinfo.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,331 @@ | ||||
| /* Copyright 2005 by Dominick Meglio | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
|  * software and its documentation for any purpose and without | ||||
|  * fee is hereby granted, provided that the above copyright | ||||
|  * notice appear in all copies and that both that copyright | ||||
|  * notice and this permission notice appear in supporting | ||||
|  * documentation, and that the name of M.I.T. not be used in | ||||
|  * advertising or publicity pertaining to distribution of the | ||||
|  * software without specific, written prior permission. | ||||
|  * M.I.T. makes no representations about the suitability of | ||||
|  * this software for any purpose.  It is provided "as is" | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
| #include <ctype.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_NET_IF_H | ||||
| #include <net/if.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_UNISTD_H | ||||
| #include <unistd.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
| #include "ares_ipv6.h" | ||||
| #include "inet_ntop.h" | ||||
|  | ||||
| #ifdef WATT32 | ||||
| #undef WIN32 | ||||
| #endif | ||||
|  | ||||
| struct nameinfo_query { | ||||
|   ares_nameinfo_callback callback; | ||||
|   void *arg; | ||||
|   union { | ||||
|     struct sockaddr_in addr4; | ||||
|     struct sockaddr_in6 addr6; | ||||
|   } addr; | ||||
|   int family; | ||||
|   int flags; | ||||
| }; | ||||
|  | ||||
| #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||
| #define IPBUFSIZ 40+IF_NAMESIZE | ||||
| #else | ||||
| #define IPBUFSIZ 40 | ||||
| #endif | ||||
|  | ||||
| static void nameinfo_callback(void *arg, int status, struct hostent *host); | ||||
| static char *lookup_service(unsigned short port, int flags, char *buf); | ||||
| #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||
| static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid, char *buf); | ||||
| #endif | ||||
| static char *ares_striendstr(const char *s1, const char *s2); | ||||
|  | ||||
| void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t salen, | ||||
|                       int flags, ares_nameinfo_callback callback, void *arg) | ||||
| { | ||||
|   struct sockaddr_in *addr; | ||||
|   struct sockaddr_in6 *addr6; | ||||
|   struct nameinfo_query *niquery; | ||||
|  | ||||
|   /* Verify the buffer size */ | ||||
|   if (salen == sizeof(struct sockaddr_in)) | ||||
|     addr = (struct sockaddr_in *)sa; | ||||
|   else if (salen == sizeof(struct sockaddr_in6)) | ||||
|     addr6 = (struct sockaddr_in6 *)sa; | ||||
|   else | ||||
|     { | ||||
|       callback(arg, ARES_ENOTIMP, NULL, NULL); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   /* If neither, assume they want a host */ | ||||
|   if (!(flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST)) | ||||
|     flags |= ARES_NI_LOOKUPHOST; | ||||
|  | ||||
|   /* All they want is a service, no need for DNS */ | ||||
|   if ((flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST)) | ||||
|     { | ||||
|       char buf[33], *service; | ||||
|       unsigned int port = 0; | ||||
|  | ||||
|       if (salen == sizeof(struct sockaddr_in)) | ||||
|         port = addr->sin_port; | ||||
|       else | ||||
|         port = addr6->sin6_port; | ||||
|       service = lookup_service(port, flags, buf); | ||||
|       callback(arg, ARES_SUCCESS, NULL, service); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   /* They want a host lookup */ | ||||
|   if ((flags & ARES_NI_LOOKUPHOST)) | ||||
|     { | ||||
|      /* A numeric host can be handled without DNS */ | ||||
|      if ((flags & ARES_NI_NUMERICHOST)) | ||||
|       { | ||||
|         unsigned int port = 0; | ||||
|         char ipbuf[IPBUFSIZ]; | ||||
|         char srvbuf[32]; | ||||
|         char *service = NULL; | ||||
|         ipbuf[0] = 0; | ||||
|  | ||||
|         /* Specifying not to lookup a host, but then saying a host  | ||||
|          * is required has to be illegal. | ||||
|          */ | ||||
|         if (flags & ARES_NI_NAMEREQD) | ||||
|           { | ||||
|             callback(arg, ARES_EBADFLAGS, NULL, NULL); | ||||
|             return; | ||||
|           } | ||||
|         if (salen == sizeof(struct sockaddr_in6)) | ||||
|           { | ||||
|             ares_inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, IPBUFSIZ); | ||||
|             port = addr6->sin6_port; | ||||
|             /* If the system supports scope IDs, use it */ | ||||
| #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||
|             append_scopeid(addr6, flags, ipbuf); | ||||
| #endif | ||||
|           } | ||||
|         else | ||||
|           { | ||||
|             ares_inet_ntop(AF_INET, &addr->sin_addr, ipbuf, IPBUFSIZ); | ||||
|             port = addr->sin_port; | ||||
|           } | ||||
|         /* They also want a service */ | ||||
|         if (flags & ARES_NI_LOOKUPSERVICE) | ||||
|           service = lookup_service(port, flags, srvbuf); | ||||
|         callback(arg, ARES_SUCCESS, ipbuf, service); | ||||
|         return; | ||||
|       } | ||||
|     /* This is where a DNS lookup becomes necessary */ | ||||
|     else | ||||
|       { | ||||
|         niquery = malloc(sizeof(struct nameinfo_query)); | ||||
|         if (!niquery) | ||||
|           { | ||||
|             callback(arg, ARES_ENOMEM, NULL, NULL); | ||||
|             return; | ||||
|           } | ||||
|         niquery->callback = callback; | ||||
|         niquery->arg = arg; | ||||
|         niquery->flags = flags; | ||||
|         if (sa->sa_family == AF_INET)  | ||||
|           { | ||||
|             niquery->family = AF_INET; | ||||
|             memcpy(&niquery->addr.addr4, addr, sizeof(addr)); | ||||
|             ares_gethostbyaddr(channel, &addr->sin_addr, sizeof(struct in_addr), AF_INET,  | ||||
|                                nameinfo_callback, niquery); | ||||
|           } | ||||
|         else | ||||
|           { | ||||
|             niquery->family = AF_INET6; | ||||
|             memcpy(&niquery->addr.addr6, addr6, sizeof(addr6)); | ||||
|             ares_gethostbyaddr(channel, &addr6->sin6_addr, sizeof(struct in6_addr), AF_INET6,  | ||||
|                                nameinfo_callback, niquery); | ||||
|           } | ||||
|       } | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void nameinfo_callback(void *arg, int status, struct hostent *host) | ||||
| { | ||||
|   struct nameinfo_query *niquery = (struct nameinfo_query *) arg; | ||||
|   char srvbuf[33]; | ||||
|   char *service = NULL; | ||||
|  | ||||
|  | ||||
|   if (status == ARES_SUCCESS) | ||||
|     { | ||||
|       /* They want a service too */ | ||||
|       if (niquery->flags & ARES_NI_LOOKUPSERVICE) | ||||
|         { | ||||
|           if (niquery->family == AF_INET) | ||||
|             service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags, srvbuf); | ||||
|           else | ||||
|             service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags, srvbuf); | ||||
|         } | ||||
|       /* NOFQDN means we have to strip off the domain name portion. | ||||
|          We do this by determining our own domain name, then searching the string | ||||
|          for this domain name and removing it. | ||||
|        */ | ||||
|       if (niquery->flags & ARES_NI_NOFQDN) | ||||
|         { | ||||
|            char buf[255]; | ||||
|            char *domain; | ||||
|            gethostname(buf, 255); | ||||
|            if ((domain = strchr(buf, '.'))) | ||||
|              { | ||||
|                char *end = ares_striendstr(host->h_name, domain); | ||||
|                if (end) | ||||
|                  *end = 0; | ||||
|              }         | ||||
|         } | ||||
|       niquery->callback(niquery->arg, ARES_SUCCESS, host->h_name, service); | ||||
|       return; | ||||
|     } | ||||
|   /* We couldn't find the host, but it's OK, we can use the IP */ | ||||
|   else if (status == ARES_ENOTFOUND && !(niquery->flags & ARES_NI_NAMEREQD)) | ||||
|     { | ||||
|       char ipbuf[IPBUFSIZ]; | ||||
|       if (niquery->family == AF_INET) | ||||
|         ares_inet_ntop(AF_INET, &niquery->addr.addr4.sin_addr, ipbuf, IPBUFSIZ); | ||||
|       else | ||||
|         { | ||||
|           ares_inet_ntop(AF_INET6, &niquery->addr.addr6.sin6_addr, ipbuf, IPBUFSIZ); | ||||
| #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||
|           append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf); | ||||
| #endif | ||||
|         } | ||||
|       /* They want a service too */ | ||||
|       if (niquery->flags & ARES_NI_LOOKUPSERVICE) | ||||
|         { | ||||
|           if (niquery->family == AF_INET) | ||||
|             service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags, srvbuf); | ||||
|           else | ||||
|             service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags, srvbuf); | ||||
|         } | ||||
|       niquery->callback(niquery->arg, ARES_SUCCESS, ipbuf, service); | ||||
|       return; | ||||
|     } | ||||
|   niquery->callback(niquery->arg, status, NULL, NULL); | ||||
|   free(niquery); | ||||
| } | ||||
|  | ||||
| static char *lookup_service(unsigned short port, int flags, char *buf) | ||||
| { | ||||
|   if (port) | ||||
|     { | ||||
|       /* Just return the port as a string */ | ||||
|       if (flags & ARES_NI_NUMERICSERV) | ||||
|         sprintf(buf, "%u", ntohs(port)); | ||||
|       else | ||||
|         { | ||||
|           struct servent *se; | ||||
|           const char *proto; | ||||
|   | ||||
|           if (flags & ARES_NI_UDP) | ||||
|             proto = "udp"; | ||||
|           else if (flags & ARES_NI_SCTP) | ||||
|             proto = "sctp"; | ||||
|           else if (flags & ARES_NI_DCCP) | ||||
|             proto = "dccp"; | ||||
|           else | ||||
|             proto = "tcp"; | ||||
|           se = getservbyport(port, proto); | ||||
|           if (se && se->s_name) | ||||
|             strcpy(buf, se->s_name); | ||||
|           else | ||||
|             sprintf(buf, "%u", ntohs(port)); | ||||
|         } | ||||
|       return buf; | ||||
|     } | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||
| static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, char *buf) | ||||
| { | ||||
|   char tmpbuf[IF_NAMESIZE + 1]; | ||||
|  | ||||
|   tmpbuf[0] = '%'; | ||||
| #ifdef HAVE_IF_INDEXTONAME | ||||
|   if ((flags & ARES_NI_NUMERICSCOPE) || (!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr) | ||||
|       && !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr))) | ||||
|     { | ||||
|        sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL) | ||||
|         sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id); | ||||
|     } | ||||
| #else | ||||
|   sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id); | ||||
| #endif | ||||
|   strcat(buf, tmpbuf); | ||||
|   return buf; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /* Determines if s1 ends with the string in s2 (case-insensitive) */ | ||||
| static char *ares_striendstr(const char *s1, const char *s2) | ||||
| { | ||||
|   const char *c1, *c2, *c1_begin; | ||||
|   size_t s1_len = strlen(s1), s2_len = strlen(s2); | ||||
|  | ||||
|   /* If the substr is longer than the full str, it can't match */ | ||||
|   if (s2_len > s1_len) | ||||
|     return NULL; | ||||
|  | ||||
|   /* Jump to the end of s1 minus the length of s2 */ | ||||
|   c1_begin = s1+s1_len-s2_len; | ||||
|   c1 = (const char *)c1_begin; | ||||
|   c2 = s2; | ||||
|   while (c2 < s2+s2_len) | ||||
|     { | ||||
|       if (tolower(*c1) != tolower(*c2)) | ||||
|         return NULL; | ||||
|       else | ||||
|         { | ||||
|           c1++; | ||||
|           c2++; | ||||
|         } | ||||
|     } | ||||
|   if (c2 == c1 && c2 == NULL) | ||||
|     return (char *)c1_begin; | ||||
|   return NULL; | ||||
| } | ||||
| @@ -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         left = ret_size; | ||||
|   char          *ret = ret_buf; | ||||
|   HRESULT        res; | ||||
|  | ||||
|   if (!fi) | ||||
|      return (0); | ||||
| @@ -339,7 +340,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size) | ||||
|   if (!GetNetworkParams) | ||||
|      goto quit; | ||||
|  | ||||
|   if ((*GetNetworkParams) (fi, &size) != ERROR_BUFFER_OVERFLOW) | ||||
|   res = (*GetNetworkParams) (fi, &size); | ||||
|   if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS)) | ||||
|      goto quit; | ||||
|  | ||||
|   fi = alloca (size); | ||||
| @@ -858,7 +860,8 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||
|         ipbufpfx[0] = 0; | ||||
|       /* Lets see if it is CIDR */ | ||||
|       /* First we'll try IPv6 */ | ||||
|       if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf, &pat.addr.addr6,  | ||||
|       if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf, | ||||
|                                      &pat.addr.addr6, | ||||
|                                      sizeof(pat.addr.addr6))) > 0) | ||||
|         { | ||||
|           pat.type = PATTERN_CIDR; | ||||
| @@ -1010,7 +1013,9 @@ static const char *try_option(const char *p, const char *q, const char *opt) | ||||
|   return ((size_t)(q - p) > len && !strncmp(p, opt, len)) ? &p[len] : NULL; | ||||
| } | ||||
|  | ||||
| static int sortlist_alloc(struct apattern **sortlist, int *nsort, struct apattern *pat) | ||||
| #ifndef WIN32 | ||||
| static int sortlist_alloc(struct apattern **sortlist, int *nsort, | ||||
|                           struct apattern *pat) | ||||
| { | ||||
|   struct apattern *newsort; | ||||
|   newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); | ||||
| @@ -1022,7 +1027,6 @@ static int sortlist_alloc(struct apattern **sortlist, int *nsort, struct apatter | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| #ifndef WIN32 | ||||
| static int ip_addr(const char *ipbuf, int len, struct in_addr *addr) | ||||
| { | ||||
|  | ||||
|   | ||||
| @@ -28,9 +28,39 @@ struct in6_addr | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_STRUCT_SOCKADDR_IN6 | ||||
| struct sockaddr_in6 | ||||
| { | ||||
|   unsigned short  sin6_family; | ||||
|   unsigned short  sin6_port; | ||||
|   unsigned long   sin6_flowinfo; | ||||
|   struct in6_addr sin6_addr; | ||||
|   unsigned int    sin6_scope_id; | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_STRUCT_ADDRINFO | ||||
| struct addrinfo | ||||
| { | ||||
|   int ai_flags; | ||||
|   int ai_family; | ||||
|   int ai_socktype; | ||||
|   int ai_protocol; | ||||
|   size_t ai_addrlen; | ||||
|   char *ai_cannonname; | ||||
|   struct sockaddr *ai_addr; | ||||
|   struct addrinfo *ai_next; | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| #ifndef NS_IN6ADDRSZ | ||||
| #if SIZEOF_STRUCT_IN6_ADDR == 0 | ||||
| /* We cannot have it set to zero, so we pick a fixed value here */ | ||||
| #define NS_IN6ADDRSZ 16 | ||||
| #else | ||||
| #define NS_IN6ADDRSZ SIZEOF_STRUCT_IN6_ADDR | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef NS_INADDRSZ | ||||
| #define NS_INADDRSZ SIZEOF_STRUCT_IN_ADDR | ||||
| @@ -40,4 +70,12 @@ struct in6_addr | ||||
| #define NS_INT16SZ 2 | ||||
| #endif | ||||
|  | ||||
| #ifndef IF_NAMESIZE | ||||
| #ifdef IFNAMSIZ | ||||
| #define IF_NAMESIZE IFNAMSIZ | ||||
| #else | ||||
| #define IF_NAMESIZE 256 | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #endif /* ARES_IPV6_H */ | ||||
|   | ||||
| @@ -23,8 +23,13 @@ | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_H | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|   | ||||
| @@ -33,6 +33,10 @@ | ||||
| #define writev(s,v,c)     writev_s(s,v,c) | ||||
| #endif | ||||
|  | ||||
| #ifdef NETWARE | ||||
| #include <time.h> | ||||
| #endif | ||||
|  | ||||
| #define DEFAULT_TIMEOUT         5 | ||||
| #define DEFAULT_TRIES           4 | ||||
| #ifndef INADDR_NONE | ||||
|   | ||||
| @@ -33,6 +33,12 @@ | ||||
| #ifdef HAVE_UNISTD_H | ||||
| #include <unistd.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_IOCTL_H | ||||
| #include <sys/ioctl.h> | ||||
| #endif | ||||
| #ifdef NETWARE | ||||
| #include <sys/filio.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <string.h> | ||||
| @@ -45,6 +51,11 @@ | ||||
| #include "ares_dns.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| #ifndef TRUE | ||||
| /* at least Solaris 7 does not have TRUE at this point */ | ||||
| #define TRUE 1 | ||||
| #endif | ||||
|  | ||||
| #if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) | ||||
| #define GET_ERRNO()  WSAGetLastError() | ||||
| #else | ||||
| @@ -466,13 +477,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) | ||||
| { | ||||
| #if defined(WIN32) | ||||
|   u_long flags; | ||||
| #else | ||||
|   int flags; | ||||
| #endif | ||||
|   ares_socket_t s; | ||||
|   struct sockaddr_in sockin; | ||||
|  | ||||
| @@ -482,25 +556,7 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server) | ||||
|     return -1; | ||||
|  | ||||
|   /* Set the socket non-blocking. */ | ||||
|  | ||||
| #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 | ||||
|   nonblock(s, TRUE); | ||||
|  | ||||
|   /* Connect to the server. */ | ||||
|   memset(&sockin, 0, sizeof(sockin)); | ||||
| @@ -531,6 +587,9 @@ static int open_udp_socket(ares_channel channel, struct server_state *server) | ||||
|   if (s == ARES_SOCKET_BAD) | ||||
|     return -1; | ||||
|  | ||||
|   /* Set the socket non-blocking. */ | ||||
|   nonblock(s, TRUE); | ||||
|  | ||||
|   /* Connect to the server. */ | ||||
|   memset(&sockin, 0, sizeof(sockin)); | ||||
|   sockin.sin_family = AF_INET; | ||||
|   | ||||
| @@ -38,7 +38,8 @@ const char *ares_strerror(int code) | ||||
|     "Error reading file", | ||||
|     "Out of memory", | ||||
|     "Channel is being destroyed", | ||||
|     "Misformatted string" | ||||
|     "Misformatted string", | ||||
|     "Illegal flags specified" | ||||
|   }; | ||||
|  | ||||
|   assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext))); | ||||
|   | ||||
| @@ -4,12 +4,12 @@ | ||||
| #define ARES__VERSION_H | ||||
|  | ||||
| #define ARES_VERSION_MAJOR 1 | ||||
| #define ARES_VERSION_MINOR 2 | ||||
| #define ARES_VERSION_MINOR 3 | ||||
| #define ARES_VERSION_PATCH 0 | ||||
| #define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ | ||||
|                        (ARES_VERSION_MINOR<<8)|\ | ||||
|                        (ARES_VERSION_PATCH)) | ||||
| #define ARES_VERSION_STR "1.2.0" | ||||
| #define ARES_VERSION_STR "1.3.0" | ||||
|  | ||||
| const char *ares_version(int *version); | ||||
|  | ||||
|   | ||||
| @@ -65,8 +65,10 @@ AC_CHECK_HEADERS( | ||||
|        sys/time.h \ | ||||
|        sys/select.h \ | ||||
|        sys/socket.h \ | ||||
|        sys/ioctl.h \ | ||||
|        winsock.h \ | ||||
|        netinet/in.h \ | ||||
|        net/if.h \ | ||||
|        arpa/nameser.h \ | ||||
|        arpa/nameser_compat.h \ | ||||
|        arpa/inet.h, , , | ||||
| @@ -80,9 +82,31 @@ dnl (and others?) is not designed to allow this. | ||||
| #ifdef HAVE_ARPA_NAMESER_H | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
|  | ||||
| dnl *Sigh* these are needed in order for net/if.h to get properly detected. | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| ] | ||||
|   ) | ||||
|  | ||||
| AC_CHECK_TYPE(socklen_t, , | ||||
|    AC_DEFINE(socklen_t, int, [the length of a socket address]),  | ||||
|    [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
|    ]) | ||||
|  | ||||
| dnl check for AF_INET6 | ||||
| CARES_CHECK_CONSTANT( | ||||
|   [ | ||||
| @@ -134,6 +158,58 @@ CARES_CHECK_STRUCT( | ||||
|      AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.]) | ||||
| ) | ||||
|  | ||||
| dnl check for the sockaddr_in6 structure | ||||
| CARES_CHECK_STRUCT( | ||||
|   [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
|   ], [sockaddr_in6],  | ||||
|      AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1, | ||||
|        [Define to 1 if you have struct sockaddr_in6.]) ac_have_sockaddr_in6=yes | ||||
| ) | ||||
|  | ||||
| if test "$ac_have_sockaddr_in6" = "yes" ; then | ||||
| CARES_CHECK_STRUCT_MEMBER( | ||||
|   [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
|   ], [sockaddr_in6], [sin6_scope_id], | ||||
|      AC_DEFINE_UNQUOTED(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID,1, | ||||
|        [Define to 1 if your struct sockaddr_in6 has sin6_scope_id.]) | ||||
| ) | ||||
| fi | ||||
|  | ||||
| dnl check for the addrinfo structure | ||||
| CARES_CHECK_STRUCT( | ||||
|   [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
|   ], [addrinfo],  | ||||
|      AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1, | ||||
|        [Define to 1 if you have struct addrinfo.]) | ||||
| ) | ||||
|  | ||||
| dnl check for inet_pton | ||||
| AC_CHECK_FUNCS(inet_pton) | ||||
| dnl Some systems have it, but not IPv6 | ||||
| @@ -199,6 +275,42 @@ int main() | ||||
|      ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) | ||||
| fi | ||||
|  | ||||
|  | ||||
| dnl Check for inet_ntop | ||||
| AC_CHECK_FUNCS(inet_ntop) | ||||
| dnl Again, some systems have it, but not IPv6 | ||||
| if test "$ac_cv_func_inet_ntop" = "yes" ; then | ||||
| AC_MSG_CHECKING(if inet_ntop supports IPv6) | ||||
| AC_TRY_RUN( | ||||
|   [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #include <errno.h> | ||||
| int main() | ||||
|   { | ||||
|     struct in6_addr addr6; | ||||
|     char buf[128]; | ||||
|     if (inet_ntop(AF_INET6, &addr6, buf, 128) == 0 && errno == EAFNOSUPPORT) | ||||
|       exit(1); | ||||
|     else | ||||
|       exit(0); | ||||
|   } | ||||
|   ], [ | ||||
|        AC_MSG_RESULT(yes) | ||||
|        AC_DEFINE_UNQUOTED(HAVE_INET_NTOP_IPV6,1,[Define to 1 if inet_ntop supports IPv6.]) | ||||
|      ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) | ||||
| fi | ||||
|  | ||||
| AC_CHECK_SIZEOF(struct in6_addr, , | ||||
| [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| @@ -232,7 +344,8 @@ AC_CHECK_SIZEOF(struct in_addr, , | ||||
| ] | ||||
| ) | ||||
|  | ||||
| AC_CHECK_FUNCS(bitncmp) | ||||
| AC_CHECK_FUNCS([bitncmp if_indextoname]) | ||||
|  | ||||
| CURL_CHECK_NONBLOCKING_SOCKET | ||||
|  | ||||
| AC_OUTPUT(Makefile) | ||||
|   | ||||
| @@ -68,7 +68,8 @@ | ||||
|  *      Paul Vixie (ISC), June 1996 | ||||
|  */ | ||||
| static int | ||||
| inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) { | ||||
| inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | ||||
| { | ||||
|   static const char xdigits[] = "0123456789abcdef"; | ||||
|   static const char digits[] = "0123456789"; | ||||
|   int n, ch, tmp = 0, dirty, bits; | ||||
| @@ -86,7 +87,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) { | ||||
|     while ((ch = *src++) != '\0' && isascii(ch) && isxdigit(ch)) { | ||||
|       if (isupper(ch)) | ||||
|         ch = tolower(ch); | ||||
| 			n = strchr(xdigits, ch) - xdigits; | ||||
|       n = (int)(strchr(xdigits, ch) - xdigits); | ||||
|       if (dirty == 0) | ||||
|         tmp = n; | ||||
|       else | ||||
| @@ -108,7 +109,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) { | ||||
|     for (;;) { | ||||
|       tmp = 0; | ||||
|       do { | ||||
| 				n = strchr(digits, ch) - digits; | ||||
|         n = (int)(strchr(digits, ch) - digits); | ||||
|         tmp *= 10; | ||||
|         tmp += n; | ||||
|         if (tmp > 255) | ||||
| @@ -136,7 +137,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) { | ||||
|     ch = *src++;    /* Skip over the /. */ | ||||
|     bits = 0; | ||||
|     do { | ||||
| 			n = strchr(digits, ch) - digits; | ||||
|       n = (int)(strchr(digits, ch) - digits); | ||||
|       bits *= 10; | ||||
|       bits += n; | ||||
|     } while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch)); | ||||
| @@ -167,7 +168,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) { | ||||
|       bits = 8; | ||||
|     /* If imputed mask is narrower than specified octets, widen. */ | ||||
|     if (bits < ((dst - odst) * 8)) | ||||
| 			bits = (dst - odst) * 8; | ||||
|       bits = (int)(dst - odst) * 8; | ||||
|     /* | ||||
|      * If there are no additional bits specified for a class D | ||||
|      * address adjust bits to 4. | ||||
| @@ -193,7 +194,8 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) { | ||||
| } | ||||
|  | ||||
| static int | ||||
| getbits(const char *src, int *bitsp) { | ||||
| getbits(const char *src, int *bitsp) | ||||
| { | ||||
|   static const char digits[] = "0123456789"; | ||||
|   int n; | ||||
|   int val; | ||||
| @@ -223,7 +225,8 @@ getbits(const char *src, int *bitsp) { | ||||
| } | ||||
|  | ||||
| static int | ||||
| getv4(const char *src, unsigned char *dst, int *bitsp) { | ||||
| getv4(const char *src, unsigned char *dst, int *bitsp) | ||||
| { | ||||
|   static const char digits[] = "0123456789"; | ||||
|   unsigned char *odst = dst; | ||||
|   int n; | ||||
| @@ -266,7 +269,8 @@ getv4(const char *src, unsigned char *dst, int *bitsp) { | ||||
| } | ||||
|  | ||||
| static int | ||||
| inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) { | ||||
| inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) | ||||
| { | ||||
|   static const char xdigits_l[] = "0123456789abcdef", | ||||
|     xdigits_u[] = "0123456789ABCDEF"; | ||||
|   unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; | ||||
| @@ -355,7 +359,7 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) { | ||||
|      * Since some memmove()'s erroneously fail to handle | ||||
|      * overlapping regions, we'll do the shift by hand. | ||||
|      */ | ||||
| 		const int n = tp - colonp; | ||||
|     const int n = (int)(tp - colonp); | ||||
|     int i; | ||||
|  | ||||
|     if (tp == endp) | ||||
| @@ -398,7 +402,8 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) { | ||||
|  *      Paul Vixie (ISC), June 1996 | ||||
|  */ | ||||
| int | ||||
| ares_inet_net_pton(int af, const char *src, void *dst, size_t size) { | ||||
| ares_inet_net_pton(int af, const char *src, void *dst, size_t size) | ||||
| { | ||||
|   switch (af) { | ||||
|   case AF_INET: | ||||
|     return (inet_net_pton_ipv4(src, dst, size)); | ||||
| @@ -413,7 +418,8 @@ ares_inet_net_pton(int af, const char *src, void *dst, size_t size) { | ||||
| #endif | ||||
|  | ||||
| #if !defined(HAVE_INET_PTON) || !defined(HAVE_INET_PTON_IPV6) | ||||
| int ares_inet_pton(int af, const char *src, void *dst) { | ||||
| int ares_inet_pton(int af, const char *src, void *dst) | ||||
| { | ||||
|   int size, result; | ||||
|  | ||||
|   if (af == AF_INET) | ||||
|   | ||||
							
								
								
									
										206
									
								
								ares/inet_ntop.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								ares/inet_ntop.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,206 @@ | ||||
| /* Copyright (c) 1996 by Internet Software Consortium. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software for any | ||||
|  * purpose with or without fee is hereby granted, provided that the above | ||||
|  * copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS | ||||
|  * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES | ||||
|  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE | ||||
|  * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | ||||
|  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR | ||||
|  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS | ||||
|  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | ||||
|  * SOFTWARE. | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
|  | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_NAMESER_H | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_INET_H | ||||
| #include <arpa/inet.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <ctype.h> | ||||
| #include <errno.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "ares_ipv6.h" | ||||
| #include "inet_ntop.h" | ||||
|  | ||||
|  | ||||
| #if !defined(HAVE_INET_NTOP) || !defined(HAVE_INET_NTOP_IPV6) | ||||
|  | ||||
| #ifdef SPRINTF_CHAR | ||||
| # define SPRINTF(x) strlen(sprintf/**/x) | ||||
| #else | ||||
| # define SPRINTF(x) ((size_t)sprintf x) | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * WARNING: Don't even consider trying to compile this on a system where | ||||
|  * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX. | ||||
|  */ | ||||
|  | ||||
| static const char *inet_ntop4(const unsigned char *src, char *dst, size_t size); | ||||
| static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size); | ||||
|  | ||||
| /* char * | ||||
|  * inet_ntop(af, src, dst, size) | ||||
|  *	convert a network format address to presentation format. | ||||
|  * return: | ||||
|  *	pointer to presentation format address (`dst'), or NULL (see errno). | ||||
|  * author: | ||||
|  *	Paul Vixie, 1996. | ||||
|  */ | ||||
| const char * | ||||
| ares_inet_ntop(int af, const void *src, char *dst, size_t size) | ||||
| { | ||||
|  | ||||
| 	switch (af) { | ||||
| 	case AF_INET: | ||||
| 		return (inet_ntop4(src, dst, size)); | ||||
| 	case AF_INET6: | ||||
| 		return (inet_ntop6(src, dst, size)); | ||||
| 	default: | ||||
| 		errno = EAFNOSUPPORT; | ||||
| 		return (NULL); | ||||
| 	} | ||||
| 	/* NOTREACHED */ | ||||
| } | ||||
|  | ||||
| /* const char * | ||||
|  * inet_ntop4(src, dst, size) | ||||
|  *	format an IPv4 address, more or less like inet_ntoa() | ||||
|  * return: | ||||
|  *	`dst' (as a const) | ||||
|  * notes: | ||||
|  *	(1) uses no statics | ||||
|  *	(2) takes a unsigned char* not an in_addr as input | ||||
|  * author: | ||||
|  *	Paul Vixie, 1996. | ||||
|  */ | ||||
| static const char * | ||||
| inet_ntop4(const unsigned char *src, char *dst, size_t size) | ||||
| { | ||||
| 	static const char fmt[] = "%u.%u.%u.%u"; | ||||
| 	char tmp[sizeof "255.255.255.255"]; | ||||
|  | ||||
| 	if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) { | ||||
| 		errno = ENOSPC; | ||||
| 		return (NULL); | ||||
| 	} | ||||
| 	strcpy(dst, tmp); | ||||
| 	return (dst); | ||||
| } | ||||
|  | ||||
| /* const char * | ||||
|  * inet_ntop6(src, dst, size) | ||||
|  *	convert IPv6 binary address into presentation (printable) format | ||||
|  * author: | ||||
|  *	Paul Vixie, 1996. | ||||
|  */ | ||||
| static const char * | ||||
| inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||
| { | ||||
| 	/* | ||||
| 	 * Note that int32_t and int16_t need only be "at least" large enough | ||||
| 	 * to contain a value of the specified size.  On some systems, like | ||||
| 	 * Crays, there is no such thing as an integer variable with 16 bits. | ||||
| 	 * Keep this in mind if you think this function should have been coded | ||||
| 	 * to use pointer overlays.  All the world's not a VAX. | ||||
| 	 */ | ||||
| 	char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; | ||||
| 	struct { int base, len; } best, cur; | ||||
| 	unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; | ||||
| 	int i; | ||||
|  | ||||
| 	/* | ||||
| 	 * Preprocess: | ||||
| 	 *	Copy the input (bytewise) array into a wordwise array. | ||||
| 	 *	Find the longest run of 0x00's in src[] for :: shorthanding. | ||||
| 	 */ | ||||
| 	memset(words, '\0', sizeof words); | ||||
| 	for (i = 0; i < NS_IN6ADDRSZ; i++) | ||||
| 		words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); | ||||
| 	best.base = -1; | ||||
| 	cur.base = -1; | ||||
| 	for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { | ||||
| 		if (words[i] == 0) { | ||||
| 			if (cur.base == -1) | ||||
| 				cur.base = i, cur.len = 1; | ||||
| 			else | ||||
| 				cur.len++; | ||||
| 		} else { | ||||
| 			if (cur.base != -1) { | ||||
| 				if (best.base == -1 || cur.len > best.len) | ||||
| 					best = cur; | ||||
| 				cur.base = -1; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if (cur.base != -1) { | ||||
| 		if (best.base == -1 || cur.len > best.len) | ||||
| 			best = cur; | ||||
| 	} | ||||
| 	if (best.base != -1 && best.len < 2) | ||||
| 		best.base = -1; | ||||
|  | ||||
| 	/* | ||||
| 	 * Format the result. | ||||
| 	 */ | ||||
| 	tp = tmp; | ||||
| 	for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { | ||||
| 		/* Are we inside the best run of 0x00's? */ | ||||
| 		if (best.base != -1 && i >= best.base && | ||||
| 		    i < (best.base + best.len)) { | ||||
| 			if (i == best.base) | ||||
| 				*tp++ = ':'; | ||||
| 			continue; | ||||
| 		} | ||||
| 		/* Are we following an initial run of 0x00s or any real hex? */ | ||||
| 		if (i != 0) | ||||
| 			*tp++ = ':'; | ||||
| 		/* Is this address an encapsulated IPv4? */ | ||||
| 		if (i == 6 && best.base == 0 && | ||||
| 		    (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { | ||||
| 			if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) | ||||
| 				return (NULL); | ||||
| 			tp += strlen(tp); | ||||
| 			break; | ||||
| 		} | ||||
| 		tp += SPRINTF((tp, "%x", words[i])); | ||||
| 	} | ||||
| 	/* Was it a trailing run of 0x00's? */ | ||||
| 	if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) | ||||
| 		*tp++ = ':'; | ||||
| 	*tp++ = '\0'; | ||||
|  | ||||
| 	/* | ||||
| 	 * Check for overflow, copy, and we're done. | ||||
| 	 */ | ||||
| 	if ((size_t)(tp - tmp) > size) { | ||||
| 		errno = ENOSPC; | ||||
| 		return (NULL); | ||||
| 	} | ||||
| 	strcpy(dst, tmp); | ||||
| 	return (dst); | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										26
									
								
								ares/inet_ntop.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								ares/inet_ntop.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
|  * software and its documentation for any purpose and without | ||||
|  * fee is hereby granted, provided that the above copyright | ||||
|  * notice appear in all copies and that both that copyright | ||||
|  * notice and this permission notice appear in supporting | ||||
|  * documentation, and that the name of M.I.T. not be used in | ||||
|  * advertising or publicity pertaining to distribution of the | ||||
|  * software without specific, written prior permission. | ||||
|  * M.I.T. makes no representations about the suitability of | ||||
|  * this software for any purpose.  It is provided "as is" | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| #ifndef INET_NTOP_H | ||||
| #define INET_NTOP_H | ||||
|  | ||||
| #ifdef HAVE_INET_NTOP | ||||
| #define ares_inet_ntop(w,x,y,z) inet_ntop(w,x,y,z) | ||||
| #else | ||||
| const char *ares_inet_ntop(int af, const void *src, char *dst, size_t size); | ||||
| #endif | ||||
|  | ||||
| #endif /* INET_NET_NTOP_H */ | ||||
| @@ -19,6 +19,7 @@ | ||||
| #else | ||||
| /* simple work-around for now, for systems without configure support */ | ||||
| #define ssize_t int | ||||
| #define socklen_t int | ||||
| #endif | ||||
|  | ||||
| /* Recent autoconf versions define these symbols in config.h. We don't want | ||||
|   | ||||
							
								
								
									
										18
									
								
								buildconf
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								buildconf
									
									
									
									
									
								
							| @@ -13,7 +13,7 @@ findtool(){ | ||||
|   IFS=":" | ||||
|   for path in $PATH | ||||
|   do | ||||
|     if test -r "$path/$file"; then | ||||
|     if test -f "$path/$file"; then | ||||
|       echo "$path/$file" | ||||
|       return | ||||
|     fi | ||||
| @@ -24,7 +24,7 @@ findtool(){ | ||||
| # autoconf 2.57 or newer | ||||
| # | ||||
| 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 | ||||
|   echo "buildconf: autoconf not found." | ||||
|   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 | ||||
| # | ||||
| 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 | ||||
|   echo "buildconf: autoheader not found." | ||||
|   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 | ||||
| # | ||||
| 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 | ||||
|   echo "buildconf: automake not found." | ||||
|   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 | ||||
| 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 | ||||
|   echo "buildconf: libtool not found." | ||||
|   echo "            You need libtool version $LIBTOOL_WANTED_VERSION or newer installed" | ||||
| @@ -160,7 +160,7 @@ fi | ||||
| #-------------------------------------------------------------------------- | ||||
| # 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]* *$//'` | ||||
|  | ||||
| if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then | ||||
| @@ -199,9 +199,11 @@ ${AUTOCONF:-autoconf}     || die "The autoconf command failed" | ||||
|  | ||||
| if test -d ares; then | ||||
|   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" | ||||
|   echo "buildconf: running autoconf in the ares directory" | ||||
|   echo "buildconf: running ares/autoconf" | ||||
|   ${AUTOCONF:-autoconf}     || die "The ares autoconf command failed" | ||||
|   cd .. | ||||
| fi | ||||
|   | ||||
							
								
								
									
										287
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										287
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -122,6 +122,14 @@ case $host in | ||||
|   *-*-mingw*) | ||||
|     AC_DEFINE(BUILDING_LIBCURL, 1, [when building libcurl itself]) | ||||
|     AC_MSG_RESULT(yes) | ||||
|  <20> <20>AC_MSG_CHECKING([if we need CURL_STATICLIB]) | ||||
|     if test "X$enable_shared" = "Xno" | ||||
|     then | ||||
|       AC_DEFINE(CURL_STATICLIB, 1, [when not building a shared library]) | ||||
|       AC_MSG_RESULT(yes) | ||||
|  <20> <20>else | ||||
|  <20> <20> <20>AC_MSG_RESULT(no) | ||||
|     fi | ||||
|     ;; | ||||
|   *) | ||||
|     AC_MSG_RESULT(no) | ||||
| @@ -559,14 +567,15 @@ OPT_KRB4=off | ||||
| AC_ARG_WITH(krb4,dnl | ||||
| AC_HELP_STRING([--with-krb4=DIR],[where to look for Kerberos4]),[ | ||||
|   OPT_KRB4="$withval" | ||||
|   if test X"$OPT_KRB4" != Xyes | ||||
|   then | ||||
|   if test X"$OPT_KRB4" != Xno; then | ||||
|     want_krb4="yes" | ||||
|     if test X"$OPT_KRB4" != Xyes; then | ||||
|       LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib$libsuff" | ||||
|       KRB4LIB="$OPT_KRB4/lib$libsuff" | ||||
|       CPPFLAGS="$CPPFLAGS -I$OPT_KRB4/include" | ||||
|       KRB4INC="$OPT_KRB4/include" | ||||
|     fi | ||||
|   want_krb4="yes" | ||||
|   fi | ||||
|  ]) | ||||
|  | ||||
| AC_MSG_CHECKING([if Kerberos4 support is requested]) | ||||
| @@ -635,10 +644,13 @@ dnl ********************************************************************** | ||||
|  | ||||
| AC_ARG_WITH(spnego, | ||||
|   AC_HELP_STRING([--with-spnego=DIR], | ||||
|                  [Specify location of SPNEGO library fbopenssl]), | ||||
|   [ SPNEGO_ROOT="$withval" | ||||
|     want_spnego="yes" ] | ||||
| ) | ||||
|                  [Specify location of SPNEGO library fbopenssl]), [ | ||||
|   SPNEGO_ROOT="$withval" | ||||
|   if test x"$SPNEGO_ROOT" != xno; then | ||||
|     want_spnego="yes" | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
| AC_MSG_CHECKING([if SPNEGO support is requested]) | ||||
| if test x"$want_spnego" = xyes; then | ||||
|  | ||||
| @@ -675,19 +687,24 @@ AC_ARG_WITH(gssapi-includes, | ||||
| AC_ARG_WITH(gssapi-libs, | ||||
|   AC_HELP_STRING([--with-gssapi-libs=DIR], | ||||
|   		 [Specify location of GSSAPI libs]), | ||||
|   [ GSSAPI_LIBS="-L$withval -lgssapi" | ||||
|   [ GSSAPI_LIBS="-L$withval" | ||||
|     want_gss="yes" ] | ||||
| ) | ||||
|  | ||||
| AC_ARG_WITH(gssapi, | ||||
|   AC_HELP_STRING([--with-gssapi=DIR], | ||||
|                  [Where to look for GSSAPI]), | ||||
|   [ GSSAPI_ROOT="$withval" | ||||
|     want_gss="yes" ] | ||||
| ) | ||||
|                  [Where to look for GSSAPI]), [ | ||||
|   GSSAPI_ROOT="$withval" | ||||
|   if test x"$GSSAPI_ROOT" != xno; then | ||||
|     want_gss="yes"  | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
| save_CPPFLAGS="$CPPFLAGS" | ||||
| AC_MSG_CHECKING([if GSSAPI support is requested]) | ||||
| if test x"$want_gss" = xyes; then | ||||
|   AC_MSG_RESULT(yes) | ||||
|  | ||||
|   if test -z "$GSSAPI_INCS"; then | ||||
|      if test -f "$GSSAPI_ROOT/bin/krb5-config"; then | ||||
|         GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi` | ||||
| @@ -697,7 +714,48 @@ if test x"$want_gss" = xyes; then | ||||
|   fi | ||||
|   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 | ||||
|         gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi` | ||||
| 	LDFLAGS="$LDFLAGS $gss_ldflags" | ||||
| @@ -707,31 +765,10 @@ if test x"$want_gss" = xyes; then | ||||
|         LDFLAGS="$LDFLAGS -lgssapi" | ||||
|      fi | ||||
|   else | ||||
|      LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR" | ||||
|      LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR -lgssapi" | ||||
|   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 | ||||
|   AC_MSG_RESULT(no) | ||||
|   CPPFLAGS="$save_CPPFLAGS" | ||||
| fi | ||||
|    | ||||
| dnl ********************************************************************** | ||||
| @@ -760,20 +797,24 @@ if test X"$OPT_SSL" != Xno; then | ||||
|       dnl only do pkg-config magic when not cross-compiling | ||||
|       PKGTEST="yes" | ||||
|     fi | ||||
|     EXTRA_SSL=/usr/local/ssl ;; | ||||
|     PREFIX_OPENSSL=/usr/local/ssl | ||||
|     LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff" | ||||
|     ;; | ||||
|   off) | ||||
|     dnl no --with-ssl option given, just check default places | ||||
|     if test x$cross_compiling != xyes; then | ||||
|       dnl only do pkg-config magic when not cross-compiling | ||||
|       PKGTEST="yes" | ||||
|     fi | ||||
|     EXTRA_SSL= ;; | ||||
|     PREFIX_OPENSSL= | ||||
|     ;; | ||||
|   *) | ||||
|     dnl check the given --with-ssl spot | ||||
|     PKGTEST="no" | ||||
|     EXTRA_SSL=$OPT_SSL | ||||
|     LDFLAGS="$LDFLAGS -L$EXTRA_SSL/lib$libsuff" | ||||
|     CPPFLAGS="$CPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include" | ||||
|     PREFIX_OPENSSL=$OPT_SSL | ||||
|     LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff" | ||||
|     LDFLAGS="$LDFLAGS -L$LIB_OPENSSL" | ||||
|     CPPFLAGS="$CPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include" | ||||
|     ;; | ||||
|   esac | ||||
|  | ||||
| @@ -795,6 +836,8 @@ if test X"$OPT_SSL" != Xno; then | ||||
|         SSL_LDFLAGS=`$PKGCONFIG --libs-only-L 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 | ||||
|         LIBS="$LIBS $SSL_LIBS" | ||||
|         CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS" | ||||
| @@ -824,8 +867,8 @@ if test X"$OPT_SSL" != Xno; then | ||||
|      HAVECRYPTO="yes" | ||||
|      LIBS="-lcrypto $LIBS" | ||||
|      ],[ | ||||
|      LDFLAGS="$CLEANLDFLAGS -L$EXTRA_SSL/lib$libsuff" | ||||
|      CPPFLAGS="$CLEANCPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include" | ||||
|      LDFLAGS="$CLEANLDFLAGS -L$LIB_OPENSSL" | ||||
|      CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include" | ||||
|      AC_CHECK_LIB(crypto, CRYPTO_add_lock,[ | ||||
|        HAVECRYPTO="yes" | ||||
|        LIBS="-lcrypto $LIBS"], [ | ||||
| @@ -836,10 +879,7 @@ if test X"$OPT_SSL" != Xno; then | ||||
|     ]) | ||||
|  | ||||
|  | ||||
|   if test X"$HAVECRYPTO" != X"yes"; then | ||||
|       AC_MSG_WARN([crypto lib was not found; SSL will be disabled]) | ||||
|  | ||||
|   else | ||||
|   if test X"$HAVECRYPTO" = X"yes"; then | ||||
|     dnl This is only reasonable to do if crypto actually is there: check for | ||||
|     dnl SSL libs NOTE: it is important to do this AFTER the crypto lib | ||||
|  | ||||
| @@ -894,11 +934,6 @@ if test X"$OPT_SSL" != Xno; then | ||||
|     fi | ||||
|   fi | ||||
|  | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the CA bundle | ||||
| dnl ********************************************************************** | ||||
|  | ||||
|   if test X"$OPENSSL_ENABLED" = X"1"; then | ||||
|     dnl If the ENGINE library seems to be around, check for the OpenSSL engine | ||||
|     dnl stuff, it is kind of "separated" from the main SSL check | ||||
| @@ -908,30 +943,6 @@ dnl ********************************************************************** | ||||
|                 AC_CHECK_FUNCS( ENGINE_load_builtin_engines ) | ||||
|               ]) | ||||
|  | ||||
|     AC_MSG_CHECKING([CA cert bundle install path]) | ||||
|  | ||||
|     AC_ARG_WITH(ca-bundle, | ||||
| AC_HELP_STRING([--with-ca-bundle=FILE], [File name to install the CA bundle as]) | ||||
| AC_HELP_STRING([--without-ca-bundle], [Don't install the CA bundle]), | ||||
|     [ ca="$withval" ], | ||||
|     [ | ||||
|       if test "x$prefix" != xNONE; then | ||||
|         ca="\${prefix}/share/curl/curl-ca-bundle.crt" | ||||
|       else | ||||
|         ca="$ac_default_prefix/share/curl/curl-ca-bundle.crt" | ||||
|       fi | ||||
|     ] ) | ||||
|  | ||||
|     if test X"$OPT_SSL" = Xno; then | ||||
|       ca="no" | ||||
|     fi | ||||
|  | ||||
|     if test "x$ca" != "xno"; then | ||||
|       CURL_CA_BUNDLE='"'$ca'"' | ||||
|       AC_SUBST(CURL_CA_BUNDLE)   | ||||
|     fi | ||||
|     AC_MSG_RESULT([$ca]) | ||||
|  | ||||
|     dnl these can only exist if openssl exists | ||||
|  | ||||
|     AC_CHECK_FUNCS( RAND_status \ | ||||
| @@ -942,17 +953,19 @@ AC_HELP_STRING([--without-ca-bundle], [Don't install the CA bundle]), | ||||
|   fi | ||||
|  | ||||
|   if test "$OPENSSL_ENABLED" = "1"; then | ||||
|     dnl when the ssl shared libs were found in a path that the run-time linker | ||||
|     dnl doesn't search through, we need to add it to LD_LIBRARY_PATH to | ||||
|     dnl prevent further configure tests to fail due to this | ||||
|     LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$EXTRA_SSL/lib$libsuff" | ||||
|     if test -n "$LIB_OPENSSL"; then | ||||
|        dnl when the ssl shared libs were found in a path that the run-time | ||||
|        dnl linker doesn't search through, we need to add it to LD_LIBRARY_PATH | ||||
|        dnl to prevent further configure tests to fail due to this | ||||
|  | ||||
|        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 | ||||
|  | ||||
| AM_CONDITIONAL(CABUNDLE, test x$ca != xno) | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the random seed preferences  | ||||
| dnl ********************************************************************** | ||||
| @@ -990,7 +1003,7 @@ dnl FIX: only check for GnuTLS if OpenSSL is not enabled | ||||
| dnl ---------------------------------------------------- | ||||
|  | ||||
| dnl Default to compiler & linker defaults for GnuTLS files & libraries. | ||||
| OPT_GNUTLS=off | ||||
| OPT_GNUTLS=no | ||||
|  | ||||
| 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/)]) | ||||
| @@ -999,7 +1012,7 @@ AC_HELP_STRING([--without-gnutls], [disable GnuTLS detection]), | ||||
|  | ||||
| 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 | ||||
|      check=`libgnutls-config --version 2>/dev/null` | ||||
|      if test -n "$check"; then | ||||
| @@ -1009,14 +1022,15 @@ if test "$OPENSSL_ENABLED" != "1"; then | ||||
|        gtlsprefix=`libgnutls-config --prefix` | ||||
|      fi | ||||
|     else | ||||
|       addlib="-L$OPT_GNUTLS/lib -lgnutls" | ||||
|       addcflags="-I$OPT_GNUTLS/include" | ||||
|       addlib=`$OPT_GNUTLS/bin/libgnutls-config --libs` | ||||
|       addcflags=`$OPT_GNUTLS/bin/libgnutls-config --cflags` | ||||
|       version=`$OPT_GNUTLS/bin/libgnutls-config --version 2>/dev/null` | ||||
|       gtlsprefix=$OPT_GNUTLS | ||||
|       if test -z "$version"; then | ||||
|         version="unknown" | ||||
|       fi | ||||
|     fi | ||||
|     if test -n "$addlib"; then | ||||
|  | ||||
|       CLEANLDFLAGS="$LDFLAGS" | ||||
|       CLEANCPPFLAGS="$CPPFLAGS" | ||||
| @@ -1048,7 +1062,11 @@ if test "$OPENSSL_ENABLED" != "1"; then | ||||
|  | ||||
|         LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$gtlsprefix/lib$libsuff" | ||||
|         export LD_LIBRARY_PATH | ||||
|         AC_MSG_NOTICE([Added $gtlsprefix/lib$libsuff to LD_LIBRARY_PATH]) | ||||
|       fi | ||||
|  | ||||
|     fi | ||||
|  | ||||
|   fi dnl GNUTLS not disabled | ||||
|  | ||||
|   if test X"$USE_GNUTLS" != "Xyes"; then | ||||
| @@ -1058,6 +1076,38 @@ if test "$OPENSSL_ENABLED" != "1"; then | ||||
|  | ||||
| fi dnl OPENSSL != 1 | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the CA bundle | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| if test X"$USE_GNUTLS$OPENSSL_ENABLED" != "X"; then | ||||
|  | ||||
|   AC_MSG_CHECKING([CA cert bundle install path]) | ||||
|  | ||||
|   AC_ARG_WITH(ca-bundle, | ||||
| AC_HELP_STRING([--with-ca-bundle=FILE], [File name to install the CA bundle as]) | ||||
| AC_HELP_STRING([--without-ca-bundle], [Don't install the CA bundle]), | ||||
|     [ ca="$withval" ], | ||||
|     [ | ||||
|       if test "x$prefix" != xNONE; then | ||||
|         ca="\${prefix}/share/curl/curl-ca-bundle.crt" | ||||
|       else | ||||
|         ca="$ac_default_prefix/share/curl/curl-ca-bundle.crt" | ||||
|       fi | ||||
|     ] ) | ||||
|  | ||||
|     if test "x$ca" != "xno"; then | ||||
|       CURL_CA_BUNDLE='"'$ca'"' | ||||
|       AC_SUBST(CURL_CA_BUNDLE)   | ||||
|     fi | ||||
|     AC_MSG_RESULT([$ca]) | ||||
| fi dnl only done if some kind of SSL was enabled | ||||
|  | ||||
| AM_CONDITIONAL(CABUNDLE, test x$ca != xno) | ||||
|  | ||||
|  | ||||
|  | ||||
|    | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the presence of ZLIB libraries and headers | ||||
| dnl ********************************************************************** | ||||
| @@ -1158,7 +1208,6 @@ case "$LIBIDN" in | ||||
|        dnl if there is a given path, check that FIRST | ||||
|        if test -n "$LIBIDN"; then | ||||
|          if test "x$LIBIDN" != "xyes"; then | ||||
|             AC_MSG_WARN([moo moo $LIBIDN]) | ||||
|             oldLDFLAGS=$LDFLAGS | ||||
|             oldCPPFLAGS=$CPPFLAGS | ||||
|             LDFLAGS="$LDFLAGS -L$LIBIDN/lib" | ||||
| @@ -1244,7 +1293,7 @@ else | ||||
|   dnl is there a strerror_r() | ||||
|   CURL_CHECK_STRERROR_R() | ||||
|  | ||||
|   AC_CHECK_FUNCS( gmtime_r ) | ||||
|   checkfor_gmtime_r="yes" | ||||
| fi | ||||
|  | ||||
| dnl for recent AIX versions, we skip all the thread-safe checks above since | ||||
| @@ -1280,6 +1329,46 @@ if test "x$RECENTAIX" = "xyes"; then | ||||
|   dnl is there a strerror_r() | ||||
|   CURL_CHECK_STRERROR_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 | ||||
|  | ||||
| @@ -1390,6 +1479,8 @@ AC_CHECK_TYPE(ssize_t, , | ||||
| TYPE_SOCKLEN_T | ||||
| TYPE_IN_ADDR_T | ||||
|  | ||||
| TYPE_SOCKADDR_STORAGE | ||||
|  | ||||
| AC_FUNC_SELECT_ARGTYPES | ||||
|  | ||||
| dnl Checks for library functions. | ||||
| @@ -1483,6 +1574,19 @@ AC_CHECK_DECL(basename, , | ||||
| #endif | ||||
| ) | ||||
|  | ||||
| AC_MSG_CHECKING([if we are Mac OS X (to disable poll)]) | ||||
| disable_poll=no | ||||
| case $host in | ||||
|   *-*-darwin*) | ||||
|     disable_poll="yes"; | ||||
|     ;; | ||||
|   *) | ||||
|     ;; | ||||
| esac | ||||
| AC_MSG_RESULT($disable_poll) | ||||
|  | ||||
| if test "$disable_poll" = "no"; then | ||||
|  | ||||
|   dnl poll() might be badly emulated, as in Mac OS X 10.3 (and other BSDs?) and | ||||
|   dnl to find out we make an extra check here! | ||||
|   if test "$ac_cv_func_poll" = "yes"; then | ||||
| @@ -1504,8 +1608,8 @@ if test "$ac_cv_func_poll" = "yes"; then | ||||
|     AC_MSG_RESULT(cross-compiling assumes yes) | ||||
|     AC_DEFINE(HAVE_POLL_FINE, 1, [If you have a fine poll]) | ||||
|     ) dnl end of AC_RUN_IFELSE | ||||
| fi | ||||
|  | ||||
|   fi dnl poll() was found | ||||
| fi dnl poll()-check is not disabled | ||||
|  | ||||
|  | ||||
| AC_PATH_PROG( PERL, perl, ,  | ||||
| @@ -1578,7 +1682,7 @@ AC_HELP_STRING([--disable-ares],[Disable ares for name lookups]), | ||||
|        AC_SUBST(HAVE_ARES) | ||||
|        curl_ares_msg="enabled" | ||||
|  | ||||
|        LIBS="$LIBS -lcares" | ||||
|        LIBS="-lcares $LIBS" | ||||
|  | ||||
|        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 | ||||
| @@ -1796,4 +1900,5 @@ AC_MSG_NOTICE([Configured to build curl/libcurl: | ||||
|   Built-in manual: ${curl_manual_msg} | ||||
|   Verbose errors:  ${curl_verbose_msg} | ||||
|   SSPI support:    ${curl_sspi_msg} | ||||
|   ca cert path:    ${ca} | ||||
| ]) | ||||
|   | ||||
| @@ -60,7 +60,9 @@ while test $# -gt 0; do | ||||
|     --feature|--features) | ||||
| 	if test "@USE_SSLEAY@" = "1"; then | ||||
|           echo "SSL" | ||||
|           NTLM=1 | ||||
|           NTLM=1 # OpenSSL implies NTLM | ||||
|         elif test -n "@USE_GNUTLS@"; then | ||||
|           echo "SSL" | ||||
|         fi | ||||
| 	if test "@KRB4_ENABLED@" = "1"; then | ||||
|           echo "KRB4" | ||||
|   | ||||
| @@ -82,8 +82,8 @@ Lisp | ||||
|  | ||||
| Lua | ||||
|  | ||||
|   Written by Steve Dekorte | ||||
|   http://curl.haxx.se/libcurl/lua/ | ||||
|   LuaCURL Written by Alexander Marinov | ||||
|   http://luacurl.luaforge.net/ | ||||
|  | ||||
| Mono | ||||
|  | ||||
|   | ||||
							
								
								
									
										186
									
								
								docs/DISTRO-DILEMMA
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								docs/DISTRO-DILEMMA
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | ||||
| Date: September 1, 2005 | ||||
| Author: Daniel Stenberg <daniel@haxx.se> | ||||
| URL: http://curl.haxx.se/legal/distro-dilemma.html | ||||
|  | ||||
| Condition | ||||
|  | ||||
|  This document is written to describe the sitution as it is right now. libcurl | ||||
|  7.14.0 is currently the latest version available. Things may (or perhaps | ||||
|  will) of course change in the future. | ||||
|  | ||||
|  This document reflects my view and understanding of these things. Please tell | ||||
|  me where and how you think I'm wrong, and I'll try to correct my mistakes. | ||||
|  | ||||
| Background  | ||||
|  | ||||
|  The Free Software Foundation has deemed the Original BSD license[1] to be | ||||
|  "incompatible"[2] with GPL[3]. I'd rather say it is the other way around, but | ||||
|  the point is the same: if you distribute a binary version of a GPL program, | ||||
|  it MUST NOT be linked with any Original BSD-licenced parts or | ||||
|  libraries. Doing so will violate the GPL license. For a long time, very many | ||||
|  GPL licensed programs have avoided this license mess by adding an | ||||
|  exception[8] to their license. And many others have just closed their eyes | ||||
|  for this problem. | ||||
|  | ||||
|  libcurl is MIT-style[4] licensed - how on earth did this dilemma fall onto | ||||
|  our plates? | ||||
|  | ||||
|  libcurl is only a little library. libcurl can be built to use OpenSSL for its | ||||
|  SSL/TLS capabilities. OpenSSL is basically Original BSD licensed[5]. | ||||
|  | ||||
|  If libcurl built to use OpenSSL is used by a GPL-licensed application and you | ||||
|  decide to distribute a binary version of it (Linux distros - for example - | ||||
|  tend to), you have a clash. GPL vs Original BSD. | ||||
|  | ||||
|  This dilemma is not libcurl-specific nor is it specific to any particular | ||||
|  Linux distro. | ||||
|  | ||||
| Part of the Operating System | ||||
|  | ||||
|  This would not be a problem if the used lib would be considered part of the | ||||
|  uderlying operating system, as then the GPL license has an exception | ||||
|  clause[6] that allows applications to use such libs without having to be | ||||
|  allowed to distribute it or its sources. Possibly some distros will claim | ||||
|  that OpenSSL is part of their operating system. | ||||
|  | ||||
|  Debian does however not take this stance and has officially(?) claimed that | ||||
|  OpenSSL is not a required part of the Debian operating system | ||||
|  | ||||
| Debian-legal | ||||
|  | ||||
|  In August 2004 I figured I should start pulling people's attention to this to | ||||
|  see if anyone has any bright ideas or if they would dismiss my worries based | ||||
|  on some elegant writing I had missed somewhere: | ||||
|  | ||||
|  My post to debian-legal on August 12 2004: | ||||
|  | ||||
|         http://lists.debian.org/debian-legal/2004/08/msg00279.html | ||||
|  | ||||
|  Several people agreed then that this is a known and rather big problem, but | ||||
|  the following discussion didn't result in much. | ||||
|  | ||||
| GnuTLS | ||||
|  | ||||
|  With the release of libcurl 7.14.0 (May 2005), it can now get built to use | ||||
|  GnuTLS instead of OpenSSL. GnuTLS is a LGPL[7] licensed library that offers a | ||||
|  matching set of features as OpenSSL does. Now, you can build and distribute | ||||
|  an SSL capable libcurl without including any Original BSD licensed code. | ||||
|  | ||||
|  I believe Debian is the first distro to provide libcurl/GnutTLS packages. | ||||
|  | ||||
| GnuTLS vs OpenSSL | ||||
|  | ||||
|  While these two libraries offer similar features, they are not equal. Both | ||||
|  libraries have features the other one lacks. libcurl does not (yet) offer a | ||||
|  standardized stable ABI if you decide to switch from using libcurl-openssl to | ||||
|  libcurl-gnutls or vice versa. The GnuTLS support is very recent in libcurl | ||||
|  and it has not been tested nor used very extensively, while the OpenSSL | ||||
|  equivalent code has been used and thus matured for more than seven (7) years. | ||||
|  | ||||
|  In August 2005, the debian-devel mailing list discovered the license issue as | ||||
|  a GPL licensed application wanted SSL capabilities from libcurl and thus was | ||||
|  forced to use the GnuTLS powered libcurl. For a reason that is unknown to me, | ||||
|  the application authors didn't want to or was unable to add an exception to | ||||
|  their GPL license. Alas, the license problem hit the fan again. | ||||
|  | ||||
| The Better License, Original BSD or LGPL? | ||||
|  | ||||
|  It isn't obvious or without debate to any objective interested party that | ||||
|  either of these licenses are the "better" or even the "preferred" one in a | ||||
|  generic situation. | ||||
|  | ||||
|  Instead, I think we should accept the fact that the SSL/TLS libraries and | ||||
|  their different licenses will fit different applications and their authors | ||||
|  differently depending on the applications' licenses and their general usage | ||||
|  pattern (considering how LGPL libraries can be burdonsome for embedded | ||||
|  systems usage). | ||||
|  | ||||
| More SSL Libraries | ||||
|  | ||||
|  In libcurl, there's no stopping us here. There are at least a few more Open | ||||
|  Source/Free SSL/TLS libraries and we would very much like to support them as | ||||
|  well, to offer application authors an even wider scope of choice. | ||||
|  | ||||
| Application Angle of this Problem | ||||
|  | ||||
|  libcurl is built to use one SSL/TLS library. It uses a single fixed name (by | ||||
|  default), and applications are built/linked to use that single lib. Replacing | ||||
|  one libcurl instance with another one that uses the other SSL/TLS library | ||||
|  might break one or more applications (due to ABI differences and/or different | ||||
|  feature set). You want your application to use the libcurl it was built for. | ||||
|  | ||||
| Project cURL Angle of this Problem | ||||
|  | ||||
|  We distribute libcurl and everyone may build libcurl with either library. At | ||||
|  their choice. This problem is not directly a problem of ours. It merely | ||||
|  affects users - GPL application authors only - of our lib as it comes | ||||
|  included and delivered on some distros. | ||||
|  | ||||
| Distro Angle of this Problem | ||||
|  | ||||
|  A distro can provide separate libcurls built with different SSL/TLS libraries | ||||
|  to work around this, but at least Debian seems to be very hostile against | ||||
|  such an approach, probably since it makes things like devel packages for the | ||||
|  different libs collide since they would provide the same include files and | ||||
|  man pages etc. | ||||
|  | ||||
| Fixing the Only Problem | ||||
|  | ||||
|  The only problem is thus for distributions that want to offer libcurl | ||||
|  versions built with more than one SSL/TLS library. | ||||
|  | ||||
|  Since multiple libcurl binaries using different names are ruled out, we need | ||||
|  to come up with a way to have one single libcurl that someone uses different | ||||
|  underlying libraries. The best(?) approach currently suggested involves this: | ||||
|  | ||||
|  A new intermediate library (named lib2 so far in the discussions) with the | ||||
|  single purpose of providing libcurl with SSL/TLS capabilities. It would have | ||||
|  a unified API and ABI no matter what underlying library it would use. | ||||
|  | ||||
|  There would be one lib2 binary provided for each supported SSL/TLS library. | ||||
|  For example: lib2-openssl, lib2-gnutls, lib2-yassl, lib2-matrixssl and | ||||
|  lib2-nossl. Yes, take note of the last one that provides the lib2 ABI but | ||||
|  that lacks the actual powers. | ||||
|  | ||||
|  When libcurl is built and linked, it will be linked against a lib2 with the | ||||
|  set ABI. | ||||
|  | ||||
|  When you link an app against libcurl, it would also need to provide one of | ||||
|  the (many) lib2 libs to decide what approach that fits the app. An app that | ||||
|  doesn't want SSL at all would still need to link with the lib2-nossl lib. | ||||
|  | ||||
|  GPL apps can pick the lib2-gnutls, others may pick the lib2-openssl. | ||||
|  | ||||
|  This concept works equally well both for shared and static libraries. | ||||
|  | ||||
|  A positive side effect of this approach could be a more generic "de facto" | ||||
|  standard API for SSL/TLS libraries. | ||||
|  | ||||
| When Will This Happen | ||||
|  | ||||
|  Note again that this is not a problem in curl, it doesn't solve any actual | ||||
|  technical problems in our project. Don't hold your breath for this to happen | ||||
|  very soon (if at all) unless you step forward and contribute. | ||||
|  | ||||
|  The suggestion that is outlined above is still only a suggestion. Feel free | ||||
|  to bring a better idea! | ||||
|  | ||||
|  Also, to keep in mind: I don't want this new concept to have too much of an | ||||
|  impact on the existing code. Preferably it should be possible to build the | ||||
|  code like today (without the use of lib2), should you decide to ignore the | ||||
|  problems outlined in this document. | ||||
|  | ||||
| Footnotes | ||||
|  | ||||
|  [1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6 | ||||
|  [2] = http://www.fsf.org/licensing/essays/bsd.html | ||||
|  [3] = http://www.fsf.org/licensing/licenses/gpl.html | ||||
|  [4] = http://curl.haxx.se/docs/copyright.html | ||||
|  [5] = http://www.openssl.org/source/license.html | ||||
|  [6] = http://www.fsf.org/licensing/licenses/gpl.html end of section 3 | ||||
|  [7] = http://www.fsf.org/licensing/licenses/lgpl.html | ||||
|  [8] = http://en.wikipedia.org/wiki/OpenSSL_exception | ||||
|  | ||||
| Feedback/Updates provided by | ||||
|  | ||||
|  Eric Cooper | ||||
							
								
								
									
										68
									
								
								docs/FAQ
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								docs/FAQ
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| Updated: April 13, 2005 (http://curl.haxx.se/docs/faq.html) | ||||
| Updated: August 26, 2005 (http://curl.haxx.se/docs/faq.html) | ||||
|                                   _   _ ____  _ | ||||
|                               ___| | | |  _ \| | | ||||
|                              / __| | | | |_) | | | ||||
| @@ -64,6 +64,8 @@ FAQ | ||||
|   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.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.1 Is libcurl thread-safe? | ||||
| @@ -132,11 +134,11 @@ FAQ | ||||
|  | ||||
|   We pronounce curl and cURL with an initial k sound: [kurl]. | ||||
|  | ||||
|   NOTE: there are numerous sub-projects and related projects that also use the | ||||
|   word curl in the project names in various combinations, but you should take | ||||
|   There are numerous sub-projects and related projects that also use the word | ||||
|   curl in the project names in various combinations, but you should take | ||||
|   notice that this FAQ is directed at the command-line tool named curl (and | ||||
|   libcurl the library), and may therefore not be valid for other curl-related | ||||
|   projects. | ||||
|   projects. (There is however a small section for the PHP/CURL in this FAQ.) | ||||
|  | ||||
|   1.2 What is libcurl? | ||||
|  | ||||
| @@ -197,15 +199,14 @@ FAQ | ||||
|  | ||||
|   1.5 Who makes curl? | ||||
|  | ||||
|   curl and libcurl are not made by any single individual. Sure, Daniel | ||||
|   Stenberg writes the major parts, but other persons' submissions are | ||||
|   curl and libcurl are not made by any single individual. Daniel Stenberg is | ||||
|   project leader and main developer, but other persons' submissions are | ||||
|   important and crucial. Anyone can contribute and post their changes and | ||||
|   improvements and have them inserted in the main sources (of course on the | ||||
|   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 people that every day provide us with bug reports, suggestions, ideas | ||||
|   and source code. | ||||
|   The full list of the more than 400 contributors is found in the docs/THANKS | ||||
|   file. | ||||
|  | ||||
|   curl is developed by a community, with Daniel at the wheel. | ||||
|  | ||||
| @@ -220,12 +221,8 @@ FAQ | ||||
|   have sponsored certain parts of the development in the past and I hope some | ||||
|   will continue to do so in the future. | ||||
|  | ||||
|   If you want to support our project with a donation or similar, one way of | ||||
|   doing that would be to buy "gift certificates" at useful online shopping | ||||
|   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 | ||||
|   If you want to support our project, consider a donation or a banner-program | ||||
|   or even better: by helping us coding, documenting, testing etc. | ||||
|  | ||||
|   1.7 What about CURL from curl.com? | ||||
|  | ||||
| @@ -256,6 +253,12 @@ FAQ | ||||
|   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. | ||||
|  | ||||
|   If you have found or simply suspect a security problem in curl or libcurl, | ||||
|   mail curl-security at haxx.se (closed list of receivers, mails are not | ||||
|   disclosed) and tell. Then we can produce a fix in a timely manner before the | ||||
|   flaw is announced to the world, thus lessen the impact the problem will have | ||||
|   on existing users. | ||||
|  | ||||
|  | ||||
| 2. Install Related Problems | ||||
|  | ||||
| @@ -396,6 +399,8 @@ FAQ | ||||
|  | ||||
|      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? | ||||
|  | ||||
|   There exist many language interfaces/bindings for curl that integrates it | ||||
| @@ -734,6 +739,28 @@ FAQ | ||||
|   Details are also in the SSLCERTS file in the release archives, found online | ||||
|   here: http://curl.haxx.se/docs/sslcerts.html | ||||
|  | ||||
|   4.13 Why is curl -R on Windows one hour off? | ||||
|  | ||||
|   During daylight savings time, when -R is used, curl will set a time that | ||||
|   appears one hour off. This happens due to a flaw in how Windows stores and | ||||
|   uses file modification times and it is not easily worked around. For details | ||||
|   on this problem, read this: http://www.codeproject.com/datetime/dstbugs.asp | ||||
|  | ||||
|   4.14 Redirects work in browser but not with curl! | ||||
|  | ||||
|   curl supports HTTP redirects fine (see item 3.8). Browsers generally support | ||||
|   at least two other ways to perform directs that curl does not: | ||||
|  | ||||
|     1 - Meta tags. You can write a HTML tag that will cause the browser to | ||||
|         redirect to another given URL after a certain time. | ||||
|  | ||||
|     2 - Javascript. You can write a javascript program embeded in a HTML page | ||||
|         that redirects the browser to another given URL. | ||||
|  | ||||
|   There is no way to make curl follow these redirects. You must either | ||||
|   manually figure out what the page is set to do, or you write a script that | ||||
|   parses the results and fetches the new URL. | ||||
|  | ||||
|  | ||||
| 5. libcurl Issues | ||||
|  | ||||
| @@ -754,7 +781,7 @@ FAQ | ||||
|   need to provide locking function(s) for libgcrypt (which is used by GnuTLS | ||||
|   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? | ||||
|  | ||||
| @@ -978,8 +1005,13 @@ FAQ | ||||
|   7.1 What is PHP/CURL? | ||||
|  | ||||
|   The module for PHP that makes it possible for PHP programs to access curl- | ||||
|   functions from within PHP. We often call it PHP/CURL to differentiate from | ||||
|   curl the command line tool and libcurl the library. | ||||
|   functions from within PHP. | ||||
|  | ||||
|   In the cURL project we call this module PHP/CURL to differentiate it from | ||||
|   curl the command line tool and libcurl the library. The PHP team however | ||||
|   does not refer to it like this (for unknown reasons). They call it plain | ||||
|   CURL (often using all caps) which causes much confusion to users which in | ||||
|   turn gives us a higher question load. | ||||
|  | ||||
|   7.2 Who write PHP/CURL? | ||||
|  | ||||
|   | ||||
| @@ -62,11 +62,11 @@ HTTP | ||||
|  | ||||
| HTTPS (*1) | ||||
|  - (all the HTTP features) | ||||
|  - using certificates | ||||
|  - using client certificates | ||||
|  - verify server certificate | ||||
|  - via http-proxy | ||||
|  - 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 | ||||
|  - download | ||||
| @@ -118,9 +118,10 @@ FILE | ||||
| FOOTNOTES | ||||
| ========= | ||||
|  | ||||
|   *1 = requires OpenSSL | ||||
|   *1 = requires OpenSSL or GnuTLS | ||||
|   *2 = requires OpenLDAP | ||||
|   *3 = requires a GSSAPI-compliant library, such as Heimdal or similar. | ||||
|   *4 = requires FBopenssl | ||||
|   *5 = requires a krb4 library, such as the MIT one or similar. | ||||
|   *6 = requires c-ares | ||||
|   *7 = requires OpenSSL specificly, as GnuTLS only supports SSLv3 and TLSv1 | ||||
|   | ||||
| @@ -114,6 +114,8 @@ distributions and otherwise retrieved as part of other software. | ||||
| September 2002, with the release of curl 7.10 it is released under the MIT | ||||
| license only. | ||||
|  | ||||
| January 2003. Started working on the distributed curl tests. The autobuilds. | ||||
|  | ||||
| February 2003, the curl site averages at 20000 visits weekly. At any given | ||||
| moment, there's an average of 3 people browsing the curl.haxx.se site. | ||||
|  | ||||
|   | ||||
							
								
								
									
										32
									
								
								docs/INSTALL
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								docs/INSTALL
									
									
									
									
									
								
							| @@ -462,21 +462,19 @@ NetWare | ||||
|    - optional zlib sources (at the moment only dynamic linking with zlib.imp); | ||||
|      sources with NetWare Makefile can be obtained from: | ||||
|      http://www.gknw.com/mirror/zlib/ | ||||
|    - optional OpenSSL sources (version 0.9.8 or later which builds with BSD); | ||||
|  | ||||
|    Set a search path to your compiler, linker and tools; if you want to have | ||||
|    zlib support then set the environment var ZLIB_PATH pointing to your zlib | ||||
|    sources, on Linux make sure the var OSTYPE contains the string 'linux'; | ||||
|    and finally type 'make netware' from the top source directory... | ||||
|    I found on some Linux systems (RH9) that OS detection didnlt work although | ||||
|    Set a search path to your compiler, linker and tools; on Linux make | ||||
|    sure that the var OSTYPE contains the string 'linux'; and then type | ||||
|    'make netware' from the top source directory; other tagets available | ||||
|    are 'netware-ssl', 'netware-ssl-zlib', 'netware-zlib' and 'netware-ares'; | ||||
|    if you need other combinations you can control the build with the | ||||
|    environment variables WITH_SSL, WITH_ZLIB, WITH_ARES and ENABLE_IPV6. | ||||
|    I found on some Linux systems (RH9) that OS detection didnt work although | ||||
|    a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it | ||||
|    with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...; | ||||
|    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. | ||||
|    with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked... | ||||
|    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/ | ||||
|    the status of these builds can be viewed at the autobuild table: | ||||
|    http://curl.haxx.se/auto/ | ||||
| @@ -578,17 +576,17 @@ PORTS | ||||
|         - MIPS IRIX 6.2, 6.5 | ||||
|         - MIPS Linux | ||||
|         - Pocket PC/Win CE 3.0 | ||||
|         - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1 | ||||
|         - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2 | ||||
|         - PowerPC Darwin 1.0 | ||||
|         - PowerPC Linux | ||||
|         - PowerPC Mac OS 9 | ||||
|         - PowerPC Mac OS X | ||||
|         - SINIX-Z v5 | ||||
|         - Sparc Linux | ||||
|         - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8 | ||||
|         - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10 | ||||
|         - Sparc SunOS 4.1.X | ||||
|         - 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 | ||||
|         - Ultrix 4.3a | ||||
|         - i386 BeOS | ||||
| @@ -596,14 +594,14 @@ PORTS | ||||
|         - i386 Esix 4.1 | ||||
|         - i386 FreeBSD | ||||
|         - i386 HURD | ||||
|         - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4 | ||||
|         - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6 | ||||
|         - i386 NetBSD | ||||
|         - i386 Novell NetWare | ||||
|         - i386 OS/2 | ||||
|         - i386 OpenBSD | ||||
|         - i386 SCO unix | ||||
|         - i386 Solaris 2.7 | ||||
|         - i386 Windows 95, 98, ME, NT, 2000 | ||||
|         - i386 Windows 95, 98, ME, NT, 2000, XP, 2003 | ||||
|         - i386 QNX 6 | ||||
|         - i486 ncr-sysv4.3.03 (NCR MP-RAS) | ||||
|         - ia64 Linux 2.3.99 | ||||
|   | ||||
| @@ -3,6 +3,22 @@ join in and help us correct one or more of these! Also be sure to check the | ||||
| changelog of the current development status, as one or more of these problems | ||||
| may have been fixed since this was written! | ||||
|  | ||||
| 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 | ||||
|   complaining on "unaligned file size" on completion. The problem is related | ||||
|   to VMS file structures and the perceived file sizes stat() returns. A | ||||
| @@ -18,14 +34,6 @@ may have been fixed since this was written! | ||||
|      specification).  The receiver will convert the data from the standard | ||||
|      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: | ||||
|   define CURL_MULTIEASY, rebuild curl, run test case 230 - 232. | ||||
|  | ||||
| @@ -42,10 +50,6 @@ may have been fixed since this was written! | ||||
|   would not meaningfully support NUL characters within RFC 959 <string>, | ||||
|   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 | ||||
|   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 | ||||
| @@ -92,9 +96,6 @@ may have been fixed since this was written! | ||||
|   libcurl thinks of it as the *compressed* length. Some explanations are here: | ||||
|   http://curl.haxx.se/mail/lib-2003-06/0146.html | ||||
|  | ||||
| 4. IPv6 support on AIX 4.3.3 doesn't work due to a missing sockaddr_storage | ||||
|   struct. It has been reported to work on AIX 5.1 though. | ||||
|  | ||||
| 3. GOPHER transfers seem broken | ||||
|  | ||||
| 2. If a HTTP server responds to a HEAD request and includes a body (thus | ||||
|   | ||||
| @@ -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 | ||||
| with code licensed under the Original BSD license (with the announcement | ||||
| clause, unless there's a specified exception in the GPL-licensed module). You | ||||
| may still build your own copies that use them all, but distributing them as | ||||
| binaries would be to violate the GPL license - unless you accompany your | ||||
| license with an exception[2]. This particular problem was addressed when the | ||||
| Modified BSD license was created, which does not have the annoncement clause | ||||
| that collides with GPL. | ||||
| clause). You may still build your own copies that use them all, but | ||||
| distributing them as binaries would be to violate the GPL license - unless you | ||||
| accompany your license with an exception[2]. This particular problem was | ||||
| addressed when the Modified BSD license was created, which does not have the | ||||
| annoncement clause that collides with GPL. | ||||
|  | ||||
| libcurl http://curl.haxx.se/docs/copyright.html | ||||
|  | ||||
| @@ -28,29 +27,30 @@ libcurl http://curl.haxx.se/docs/copyright.html | ||||
|  | ||||
| OpenSSL http://www.openssl.org/source/license.html | ||||
|  | ||||
|         Uses an Original BSD-style license with an announement clause that | ||||
|         makes it "incompatible" with GPL. You are not allowed to ship binaries | ||||
|         that link with OpenSSL that includes GPL code (unless that specific | ||||
|         GPL code includes an exception for OpenSSL - a habit that is growing | ||||
|         more and more common). If OpenSSL's licensing is a problem for you, | ||||
|         consider using GnuTLS instead. | ||||
|         (May be used for SSL/TLS support) Uses an Original BSD-style license | ||||
|         with an announement clause that makes it "incompatible" with GPL. You | ||||
|         are not allowed to ship binaries that link with OpenSSL that includes | ||||
|         GPL code (unless that specific GPL code includes an exception for | ||||
|         OpenSSL - a habit that is growing more and more common). If OpenSSL's | ||||
|         licensing is a problem for you, consider using GnuTLS instead. | ||||
|  | ||||
| GnuTLS  http://www.gnutls.org/ | ||||
|  | ||||
|         Uses the LGPL[3] license. If this is a problem for you, consider using | ||||
|         OpenSSL instead. Also note that GnuTLS itself depends on and uses | ||||
|         other libs (libgcrypt and libgpg-error) and they too are LGPL- or | ||||
|         GPL-licensed. | ||||
|         (May be used for SSL/TLS support) Uses the LGPL[3] license. If this is | ||||
|         a problem for you, consider using OpenSSL instead. Also note that | ||||
|         GnuTLS itself depends on and uses other libs (libgcrypt and | ||||
|         libgpg-error) and they too are LGPL- or GPL-licensed. | ||||
|  | ||||
| c-ares  http://daniel.haxx.se/projects/c-ares/license.html | ||||
|  | ||||
|         Uses an MIT license that is very liberal and imposes no restrictions | ||||
|         on any other library or part you may link with. | ||||
|         (Used for asynchronous name resolves) Uses an MIT license that is very | ||||
|         liberal and imposes no restrictions on any other library or part you | ||||
|         may link with. | ||||
|  | ||||
| zlib    http://www.gzip.org/zlib/zlib_license.html | ||||
|  | ||||
|         Uses an MIT-style license that shouldn't collide with any other | ||||
|         library. | ||||
|         (Used for compressed Transfer-Encoding support) Uses an MIT-style | ||||
|         license that shouldn't collide with any other library. | ||||
|  | ||||
| krb4 | ||||
|  | ||||
| @@ -60,33 +60,43 @@ krb4 | ||||
|         of the code in libcurl that is written to deal with Kerberos4 likewise | ||||
|         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 | ||||
|         any particular license, the one I've used (Heimdal) is Original BSD- | ||||
|         licensed with the announcement clause. | ||||
|         (May be used for GSS support) MIT licensed, that shouldn't collide | ||||
|         with any other parts. | ||||
|  | ||||
| Heimdal http://www.pdc.kth.se/heimdal/ | ||||
|  | ||||
|         (May be used for GSS support) Heimdal is Original BSD licensed with | ||||
|         the announcement clause. | ||||
|  | ||||
| GNU GSS http://www.gnu.org/software/gss/ | ||||
|  | ||||
|         (May be used for GSS support) GNU GSS is GPL licensed. Note that you | ||||
|         may not distribute binary curl packages that uses this if you build | ||||
|         curl to also link and use any Original BSD licensed libraries! | ||||
|  | ||||
| fbopenssl | ||||
|  | ||||
|         Unclear license. Based on its name, I assume that it uses the OpenSSL | ||||
|         license and thus shares the same issues as described for OpenSSL | ||||
|         above. | ||||
|         (Used for SPNEGO support) Unclear license. Based on its name, I assume | ||||
|         that it uses the OpenSSL license and thus shares the same issues as | ||||
|         described for OpenSSL above. | ||||
|  | ||||
| libidn  http://www.gnu.org/licenses/lgpl.html | ||||
|  | ||||
|         Uses the GNU Lesser General Public License. LGPL is a variation of GPL | ||||
|         with slightly less aggressive "copyleft". This license requires more | ||||
|         requirements to be met when distributing binaries, see the license for | ||||
|         details. Also note that if you distribute a binary that includes this | ||||
|         library, you must also include the full LGPL license text. Please | ||||
|         properly point out what parts of the distributed package that the | ||||
|         license addresses. | ||||
|         (Used for IDNA support) Uses the GNU Lesser General Public | ||||
|         License. LGPL is a variation of GPL with slightly less aggressive | ||||
|         "copyleft". This license requires more requirements to be met when | ||||
|         distributing binaries, see the license for details. Also note that if | ||||
|         you distribute a binary that includes this library, you must also | ||||
|         include the full LGPL license text. Please properly point out what | ||||
|         parts of the distributed package that the license addresses. | ||||
|  | ||||
| OpenLDAP http://www.openldap.org/software/release/license.html | ||||
|  | ||||
|         Uses a Modified BSD-style license. Since libcurl uses OpenLDAP as a | ||||
|         shared library only, I have not heard of anyone that ships OpenLDAP | ||||
|         linked with libcurl in an app. | ||||
|         (Used for LDAP support) Uses a Modified BSD-style license. Since | ||||
|         libcurl uses OpenLDAP as a shared library only, I have not heard of | ||||
|         anyone that ships OpenLDAP linked with libcurl in an app. | ||||
|  | ||||
|  | ||||
| [1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html | ||||
|   | ||||
| @@ -17,7 +17,7 @@ CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES) | ||||
| EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS	\ | ||||
|  README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS	\ | ||||
|  KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL		\ | ||||
|  $(PDFPAGES) LICENSE-MIXING README.netware | ||||
|  $(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA | ||||
|  | ||||
| MAN2HTML= roffit < $< >$@ | ||||
|  | ||||
|   | ||||
							
								
								
									
										553
									
								
								docs/THANKS
									
									
									
									
									
								
							
							
						
						
									
										553
									
								
								docs/THANKS
									
									
									
									
									
								
							| @@ -1,110 +1,453 @@ | ||||
|  This project has been alive for several years. Countless people have provided | ||||
|  feedback that have improved curl. Here follows a (incomplete) list of people | ||||
|  that have contributed with non-trivial parts: | ||||
|  This project has been alive for many years. Countless people have provided | ||||
|  feedback that have improved curl. Here follows a list of people that have | ||||
|  contributed (a-z order). | ||||
|  | ||||
| Daniel Stenberg <daniel@haxx.se> | ||||
| Rafael Sagula <sagula@inf.ufrgs.br> | ||||
| Sampo Kellomaki <sampo@iki.fi> | ||||
| Linas Vepstas <linas@linas.org> | ||||
| Bjorn Reese <breese@mail1.stofanet.dk> | ||||
| Johan Anderson <johan@homemail.com> | ||||
| Kjell Ericson <Kjell.Ericson@haxx.se> | ||||
| Troy Engel <tengel@sonic.net> | ||||
| Ryan Nelson <ryan@inch.com> | ||||
| Bj<EFBFBD>rn Stenberg <bjorn@haxx.se> | ||||
| Angus Mackay <amackay@gus.ml.org> | ||||
| Eric Young <eay@cryptsoft.com> | ||||
| Simon Dick <simond@totally.irrelevant.org> | ||||
| Oren Tirosh <oren@monty.hishome.net> | ||||
| Steven G. Johnson <stevenj@alum.mit.edu> | ||||
| Gilbert Ramirez Jr. <gram@verdict.uthscsa.edu> | ||||
| Andr<EFBFBD>s Garc<72>a <ornalux@redestb.es> | ||||
| Douglas E. Wegscheid <wegscd@whirlpool.com> | ||||
| Mark Butler <butlerm@xmission.com> | ||||
| Eric Thelin <eric@generation-i.com> | ||||
| Marc Boucher <marc@mbsi.ca> | ||||
| Greg Onufer <Greg.Onufer@Eng.Sun.COM> | ||||
| Doug Kaufman <dkaufman@rahul.net> | ||||
| David Eriksson <david@2good.com> | ||||
| Ralph Beckmann <rabe@uni-paderborn.de> | ||||
| T. Yamada <tai@imasy.or.jp> | ||||
| Lars J. Aas <larsa@sim.no> | ||||
| J<EFBFBD>rn Hartroth <Joern.Hartroth@computer.org> | ||||
| Matthew Clarke <clamat@van.maves.ca> | ||||
| Linus Nielsen Feltzing <linus@haxx.se> | ||||
| Felix von Leitner <felix@convergence.de> | ||||
| Dan Zitter <dzitter@zitter.net> | ||||
| Jongki Suwandi <Jongki.Suwandi@eng.sun.com> | ||||
| Chris Maltby <chris@aurema.com> | ||||
| Ron Zapp <rzapper@yahoo.com> | ||||
| Paul Marquis <pmarquis@iname.com> | ||||
| Ellis Pritchard <ellis@citria.com> | ||||
| Damien Adant <dams@usa.net> | ||||
| Chris <cbayliss@csc.come> | ||||
| Marco G. Salvagno <mgs@whiz.cjb.net> | ||||
| Paul Marquis <pmarquis@iname.com> | ||||
| David LeBlanc <dleblanc@qnx.com> | ||||
| Rich Gray at Plus Technologies | ||||
| Luong Dinh Dung <u8luong@lhsystems.hu> | ||||
| Torsten Foertsch <torsten.foertsch@gmx.net> | ||||
| Kristian K<>hntopp <kris@koehntopp.de> | ||||
| Fred Noz <FNoz@siac.com> | ||||
| Caolan McNamara <caolan@csn.ul.ie> | ||||
| Albert Chin-A-Young <china@thewrittenword.com> | ||||
| Stephen Kick <skick@epicrealm.com> | ||||
| Martin Hedenfalk <mhe@stacken.kth.se> | ||||
| Richard Prescott <rip at step.polymtl.ca> | ||||
| Jason S. Priebe <priebe@wral-tv.com> | ||||
| T. Bharath <TBharath@responsenetworks.com> | ||||
| Alexander Kourakos <awk@users.sourceforge.net> | ||||
| James Griffiths <griffiths_james@yahoo.com> | ||||
| Loic Dachary <loic@senga.org> | ||||
| Robert Weaver <robert.weaver@sabre.com> | ||||
| Ingo Ralf Blum <ingoralfblum@ingoralfblum.com> | ||||
| Jun-ichiro itojun Hagino <itojun@iijlab.net> | ||||
| Frederic Lepied <flepied@mandrakesoft.com> | ||||
| Georg Horn <horn@koblenz-net.de> | ||||
| Cris Bailiff <c.bailiff@awayweb.com> | ||||
| Sterling Hughes <sterling@designmultimedia.com> | ||||
| S. Moonesamy | ||||
| Ingo Wilken <iw@WWW.Ecce-Terram.DE> | ||||
| Pawel A. Gajda <mis@k2.net.pl> | ||||
| Patrick Bihan-Faou | ||||
| Nico Baggus <Nico.Baggus@mail.ing.nl> | ||||
| Sergio Ballestrero | ||||
| Andrew Francis <locust@familyhealth.com.au> | ||||
| Tomasz Lacki <Tomasz.Lacki@primark.pl> | ||||
| Georg Huettenegger <georg@ist.org> | ||||
| John Lask <johnlask@hotmail.com> | ||||
| Eric Lavigne <erlavigne@wanadoo.fr> | ||||
| Marcus Webster <marcus.webster@phocis.com> | ||||
| G<EFBFBD>tz Babin-Ebell <babin<69>ebell@trustcenter.de> | ||||
| Andreas Damm <andreas-sourceforge@radab.org> | ||||
| Jacky Lam <sylam@emsoftltd.com> | ||||
| James Gallagher <jgallagher@gso.uri.edu> | ||||
| Kjetil Jacobsen <kjetilja@cs.uit.no> | ||||
| Markus F.X.J. Oberhumer <markus@oberhumer.com> | ||||
| Miklos Nemeth <mnemeth@kfkisystems.com> | ||||
| Kevin Roth <kproth@users.sourceforge.net> | ||||
| Ralph Mitchell <rmitchell@eds.com> | ||||
| Dan Fandrich <dan@coneharvesters.com> | ||||
| Jean-Philippe Barrette-LaPierre <jpb@rrette.com> | ||||
| Richard Bramante <RBramante@on.com> | ||||
| Daniel Kouril <kouril@ics.muni.cz> | ||||
| Dirk Manske <dm@nettraffic.de> | ||||
| David Meyer <meyer@paracel.com> | ||||
| Dominick Meglio <codemstr@ptd.net> | ||||
| Gisle Vanem <gvanem@broadpark.no> | ||||
| Giuseppe Attardi <attardi@di.unipi.it> | ||||
| Tor Arntsen <tor@spacetec.no> | ||||
| David Byron <DByron@everdreamcorp.com> | ||||
| David Phillips | ||||
|  If you have contributed but are missing here, please let us know! | ||||
|  | ||||
| Adrian Schuur | ||||
| Alan Pinstein | ||||
| Albert Chin-A-Young | ||||
| Albert Choy | ||||
| Aleksandar Milivojevic | ||||
| Alex aka WindEagle | ||||
| Alex Neblett | ||||
| Alex Suykov | ||||
| Alexander Kourakos | ||||
| Alexander Krasnostavsky | ||||
| G<EFBFBD>nter Knauf | ||||
| Alexander Zhuravlev | ||||
| Alexis Carvalho | ||||
| Andi Jahja | ||||
| Andr<EFBFBD>s Garc<72>a | ||||
| Andreas Damm | ||||
| Andreas Olsson | ||||
| Andreas Rieke | ||||
| Andres Garcia | ||||
| Andrew Bushnell | ||||
| Andrew Francis | ||||
| Andrew Fuller | ||||
| Andy Cedilnik | ||||
| Andy Serpa | ||||
| Angus Mackay | ||||
| Antoine Calando | ||||
| Anton Kalmykov | ||||
| Arkadiusz Miskiewicz | ||||
| Augustus Saunders | ||||
| Avery Fay | ||||
| Ben Greear | ||||
| Benjamin Gerard | ||||
| Bertrand Demiddelaer | ||||
| Peter Sylvester | ||||
| Alexis S. L. Carvalho | ||||
| Bj<EFBFBD>rn Stenberg | ||||
| Bjorn Reese | ||||
| Bob Schader | ||||
| Brad Burdick | ||||
| Brent Beardsley | ||||
| Brian Akins | ||||
| Brian R Duffy | ||||
| Bruce Mitchener | ||||
| Bryan Henderson | ||||
| Bryan Henderson  | ||||
| Bryan Kemp | ||||
| Caolan McNamara | ||||
| Casey O'Donnell | ||||
| Marty Kuhrt | ||||
| James Bursa | ||||
| Chih-Chung Chang | ||||
| Chris "Bob Bob" | ||||
| Chris Combes | ||||
| Chris Gaukroger | ||||
| Chris Maltby | ||||
| Christian Kurz | ||||
| Christian Robottom Reis | ||||
| Christophe Demory | ||||
| Christophe Legry | ||||
| Christopher R. Palmer | ||||
| Clarence Gardner | ||||
| Clifford Wolf | ||||
| Cody Jones | ||||
| Colin Watson | ||||
| Colm Buckley | ||||
| Cory Nelson | ||||
| Craig Davison | ||||
| Craig Markwardt | ||||
| Cris Bailiff | ||||
| Cyrill Osterwalder | ||||
| Damien Adant | ||||
| Dan Becker | ||||
| Dan C | ||||
| Dan Fandrich | ||||
| Dan Torop | ||||
| Dan Zitter | ||||
| Daniel at touchtunes | ||||
| Daniel Stenberg | ||||
| Dave Dribin | ||||
| Dave Halbakken | ||||
| Dave Hamilton | ||||
| Dave May | ||||
| David Byron | ||||
| David Cohen | ||||
| David Eriksson | ||||
| David Houlder | ||||
| David Hull | ||||
| David J Meyer | ||||
| David James | ||||
| David Kimdon | ||||
| David LeBlanc | ||||
| David Odin | ||||
| David Phillips | ||||
| David Shaw | ||||
| David Tarendash | ||||
| David Thiel | ||||
| Detlef Schmier | ||||
| Diego Casorran | ||||
| Dimitris Sarris | ||||
| Dinar | ||||
| Dirk Eddelbuettel | ||||
| Dirk Manske | ||||
| Dolbneff A.V | ||||
| Domenico Andreoli | ||||
| Dominick Meglio | ||||
| Doug Kaufman | ||||
| Doug Porter | ||||
| Douglas E. Wegscheid | ||||
| Douglas R. Horner | ||||
| Dustin Boswell | ||||
| Dylan Ellicott | ||||
| Dylan Salisbury | ||||
| Early Ehlinger | ||||
| Edin Kadribasic | ||||
| Ellis Pritchard | ||||
| Emiliano Ida | ||||
| Enrico Scholz | ||||
| Enrik Berkhan | ||||
| Eric Cooper | ||||
| Eric Lavigne | ||||
| Eric Melville | ||||
| Eric Rautman | ||||
| Eric Thelin | ||||
| Eric Vergnaud | ||||
| Eric Young | ||||
| Erick Nuwendam | ||||
| Erwan Legrand | ||||
| Erwin Authried | ||||
| Evan Jordan | ||||
| Fabrizio Ammollo | ||||
| Fedor Karpelevitch | ||||
| Felix von Leitner | ||||
| Florian Schoppmann | ||||
| Forrest Cahoon | ||||
| Frank Keeney | ||||
| Frank Ticheler | ||||
| Fred New | ||||
| Fred Noz | ||||
| Frederic Lepied | ||||
| G<EFBFBD>nter Knauf | ||||
| G<EFBFBD>tz Babin-Ebell | ||||
| Gautam Mani | ||||
| Gaz Iqbal | ||||
| Georg Horn | ||||
| Georg Huettenegger | ||||
| Georg Wicherski | ||||
| Gerd v. Egidy | ||||
| Gerhard Herre | ||||
| Giaslas Georgios | ||||
| Gilad | ||||
| Gilbert Ramirez Jr. | ||||
| Gisle Vanem | ||||
| Giuseppe Attardi | ||||
| Giuseppe D'Ambrosio | ||||
| Glen Nakamura | ||||
| Glen Scott | ||||
| Greg Hewgill | ||||
| Greg Onufer | ||||
| Grigory Entin | ||||
| Guenole Bescon | ||||
| Guillaume Arluison | ||||
| Gustaf Hui | ||||
| Gwenole Beauchesne | ||||
| Hamish Mackenzie | ||||
| Hanno Kranzhoff | ||||
| Hans Steegers | ||||
| Hardeep Singh | ||||
| Harshal Pradhan | ||||
| Heikki Korpela | ||||
| Henrik Storner | ||||
| Hzhijun | ||||
| Ian Ford | ||||
| Ian Gulliver | ||||
| Ian Wilkes | ||||
| Ignacio Vazquez-Abrams | ||||
| Ilguiz Latypov | ||||
| Ingo Ralf Blum | ||||
| Ingo Wilken | ||||
| J<EFBFBD>rg Mueller-Tolk | ||||
| J<EFBFBD>rn Hartroth | ||||
| Jacky Lam | ||||
| Jacob Meuser | ||||
| James Bursa | ||||
| James Clancy | ||||
| James Cone | ||||
| James Gallagher | ||||
| James Griffiths | ||||
| James MacMillan | ||||
| Jamie Lokier | ||||
| Jamie Wilkinson | ||||
| Jason S. Priebe | ||||
| Jean-Claude Chauve | ||||
| Jean-Louis Lemaire | ||||
| Jean-Marc Ranger | ||||
| Jean-Philippe Barrette-LaPierre | ||||
| Jeff Lawson | ||||
| Jeff Phillips | ||||
| Jeff Pohlmeyer | ||||
| Jeffrey Pohlmeyer | ||||
| Jeremy Friesner | ||||
| Jesper Jensen | ||||
| Jesse Noller | ||||
| Jim Drash | ||||
| Joe Halpin | ||||
| Joel Chen | ||||
| Johan Anderson | ||||
| Johan Nilsson | ||||
| John Crow | ||||
| John Janssen | ||||
| John Lask | ||||
| John McGowan | ||||
| Jon Grubbs | ||||
| Jon Travis | ||||
| Jon Turner | ||||
| Jonas Forsman | ||||
| Jonatan Lander | ||||
| Jonathan Hseu | ||||
| Jongki Suwandi | ||||
| Josh Kapell | ||||
| Juan F. Codagnone | ||||
| Juan Ignacio Herv<72>s | ||||
| Juergen Wilke | ||||
| Jukka Pihl | ||||
| Julian Noble | ||||
| Jun-ichiro itojun Hagino | ||||
| Jurij Smakov | ||||
| Kai Sommerfeld | ||||
| Kai-Uwe Rommel | ||||
| Kang-Jin Lee | ||||
| Karol Pietrzak | ||||
| Keith MacDonald | ||||
| Keith McGuigan | ||||
| Ken Hirsch | ||||
| Ken Rastatter | ||||
| Kevin Fisk | ||||
| Kevin Roth | ||||
| Kimmo Kinnunen | ||||
| Kjell Ericson | ||||
| Kjetil Jacobsen | ||||
| Klevtsov Vadim | ||||
| Kris Kennaway | ||||
| Krishnendu Majumdar | ||||
| Kristian K<>hntopp | ||||
| Kyle Sallee | ||||
| Lachlan O'Dea | ||||
| Larry Campbell | ||||
| Larry Fahnoe | ||||
| Lars Gustafsson | ||||
| Lars J. Aas | ||||
| Lars Nilsson | ||||
| Lars Torben Wilson | ||||
| Legoff Vincent | ||||
| Lehel Bernadt | ||||
| Len Krause | ||||
| Linas Vepstas | ||||
| Ling Thio | ||||
| Linus Nielsen Feltzing | ||||
| Loic Dachary | ||||
| Loren Kirkby | ||||
| Luca Altea | ||||
| Luca Alteas | ||||
| Lucas Adamski | ||||
| Lukasz Czekierda | ||||
| Luke Call | ||||
| Luong Dinh Dung | ||||
| Maciej W. Rozycki | ||||
| Marc Boucher | ||||
| Marcelo Juchem  | ||||
| Marcin Konicki | ||||
| Marco G. Salvagno | ||||
| Marcus Webster | ||||
| Mario Schroeder | ||||
| Mark Butler | ||||
| Markus Moeller | ||||
| Markus Oberhumer | ||||
| Martijn Koster | ||||
| Martin C. Martin | ||||
| Martin Hedenfalk | ||||
| Marty Kuhrt | ||||
| Maruko | ||||
| Massimiliano Ziccardi | ||||
| Mathias Axelsson | ||||
| Mats Lidell | ||||
| Matt Veenstra | ||||
| Matthew Blain | ||||
| Matthew Clarke | ||||
| Maurice Barnum | ||||
| Mekonikum | ||||
| Mettgut Jamalla | ||||
| Michael Benedict | ||||
| Michael Curtis | ||||
| Michael Mealling | ||||
| Michal Bonino | ||||
| Mihai Ionescu | ||||
| Mike Bytnar | ||||
| Mike Dobbs | ||||
| Miklos Nemeth | ||||
| Mitz Wark | ||||
| Mohamed Lrhazi | ||||
| Mohun Biswas | ||||
| Moonesamy | ||||
| Nathan O'Sullivan | ||||
| Naveen Noel | ||||
| Neil Dunbar | ||||
| Neil Spring | ||||
| Nic Roets | ||||
| Nick Gimbrone | ||||
| Nick Humfrey | ||||
| Nico Baggus | ||||
| Nicolas Berloquin | ||||
| Nicolas Croiset | ||||
| Niels van Tongeren | ||||
| Nikita Schmidt | ||||
| nk | ||||
| Nodak Sodak | ||||
| Oren Tirosh | ||||
| P R Schaffner | ||||
| Patrick Bihan-Faou | ||||
| Patrick Smith | ||||
| Paul Harrington | ||||
| Paul Marquis | ||||
| Paul Moore | ||||
| Paul Nolan | ||||
| Pavel Cenek | ||||
| Pavel Orehov | ||||
| Pawel A. Gajda | ||||
| Pedro Neves | ||||
| Pete Su | ||||
| Peter Bray | ||||
| Peter Forret | ||||
| Peter Pentchev | ||||
| Peter Sylvester | ||||
| Peter Todd | ||||
| Peter Verhas | ||||
| Peter Wullinger | ||||
| Peteris Krumins | ||||
| Phil Karn | ||||
| Philip Gladstone | ||||
| Philippe Hameau | ||||
| Philippe Raoult | ||||
| Pierre | ||||
| Puneet Pawaia | ||||
| Rafael Sagula | ||||
| Ralph Beckmann | ||||
| Ralph Mitchell | ||||
| Ramana Mokkapati | ||||
| Randy McMurchy | ||||
| Reinout van Schouwen | ||||
| Renaud Chaillat | ||||
| Renaud Duhaut | ||||
| Rene Bernhardt | ||||
| Rene Rebe | ||||
| Ricardo Cadime | ||||
| Rich Gray | ||||
| Richard Archer | ||||
| Richard Atterer | ||||
| Richard Bramante | ||||
| Richard Clayton | ||||
| Richard Cooper | ||||
| Richard Gorton | ||||
| Richard Prescott | ||||
| Rick Jones | ||||
| Rick Richardson | ||||
| Rob Stanzel | ||||
| Robert D. Young | ||||
| Robert Olson | ||||
| Robert Weaver | ||||
| Robin Kay | ||||
| Rodney Simmons | ||||
| Roland Krikava | ||||
| Roland Zimmermann | ||||
| Roman Koifman | ||||
| Ron Zapp | ||||
| Rosimildo da Silva | ||||
| Roy Shan | ||||
| Rune Kleveland | ||||
| Ryan Nelson | ||||
| S<EFBFBD>bastien Willemijns | ||||
| S. Moonesamy | ||||
| Salvador D<>vila | ||||
| Salvatore Sorrentino | ||||
| Sampo Kellomaki | ||||
| Samuel D<>az Garc<72>a | ||||
| Samuel Listopad | ||||
| Sander Gates | ||||
| Saul good | ||||
| Sebastien Willemijns | ||||
| Sergio Ballestrero | ||||
| Seshubabu Pasam | ||||
| Shard | ||||
| Shawn Poulson | ||||
| Siddhartha Prakash Jain | ||||
| Simon Dick | ||||
| 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 | ||||
| swalkaus at yahoo.com | ||||
| 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  | ||||
|   | ||||
							
								
								
									
										40
									
								
								docs/TODO
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								docs/TODO
									
									
									
									
									
								
							| @@ -40,6 +40,9 @@ TODO | ||||
|  * 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. | ||||
|  | ||||
|  * Add option that changes the interval in which the progress callback is | ||||
|    called at most. | ||||
|  | ||||
|  LIBCURL - multi interface | ||||
|  | ||||
|  * 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 | ||||
|    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 | ||||
|  | ||||
|  * More and better | ||||
| @@ -143,8 +157,30 @@ TODO | ||||
|    Clark) | ||||
|  | ||||
|  * Make curl's SSL layer capable of using other free SSL libraries.  Such as | ||||
|    the Mozilla Security Services: | ||||
|    http://www.mozilla.org/projects/security/pki/nss/ | ||||
|    Mozilla Security Services | ||||
|    (http://www.mozilla.org/projects/security/pki/nss/), MatrixSSL | ||||
|    (http://www.matrixssl.org/) or yaSSL (http://yassl.com/). At least the | ||||
|    latter two could be alternatives for those looking to reduce the footprint | ||||
|    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 | ||||
|  | ||||
|   | ||||
| @@ -20,7 +20,7 @@ Version Numbers and Releases | ||||
|    N is pre-release number | ||||
|  | ||||
|  One of these numbers will get bumped in each new release. The numbers to the | ||||
|  right of a bumped number will be reset to zero. If Z is zero, it is not | ||||
|  right of a bumped number will be reset to zero. If Z is zero, it may not be | ||||
|  included in the version number. The pre release number is only included in | ||||
|  pre releases (they're never used in public, official, releases). | ||||
|  | ||||
| @@ -49,7 +49,7 @@ Version Numbers and Releases | ||||
|  | ||||
|  As a service to any application that might want to support new libcurl | ||||
|  features while still being able to build with older versions, all releases | ||||
|  have the libcurl version stored in the curl/curl.h file using a static | ||||
|  have the libcurl version stored in the curl/curlver.h file using a static | ||||
|  numbering scheme that can be used for comparison. The version number is | ||||
|  defined as: | ||||
|          | ||||
| @@ -62,3 +62,6 @@ Version Numbers and Releases | ||||
|  This 6-digit hexadecimal number does not show pre-release number, and it is | ||||
|  always a greater number in a more recent release. It makes comparisons with | ||||
|  greater than and less than work. | ||||
|  | ||||
|  This number is also available as three separate defines: | ||||
|  LIBCURL_VERSION_MAJOR, LIBCURL_VERSION_MINOR and LIBCURL_VERSION_PATCH. | ||||
|   | ||||
							
								
								
									
										64
									
								
								docs/curl.1
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								docs/curl.1
									
									
									
									
									
								
							| @@ -21,7 +21,7 @@ | ||||
| .\" * $Id$ | ||||
| .\" ************************************************************************** | ||||
| .\" | ||||
| .TH curl 1 "05 Apr 2005" "Curl 7.13.3" "Curl Manual" | ||||
| .TH curl 1 "12 Aug 2005" "Curl 7.14.1" "Curl Manual" | ||||
| .SH NAME | ||||
| curl \- transfer a URL | ||||
| .SH SYNOPSIS | ||||
| @@ -421,9 +421,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 | ||||
| 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. | ||||
|  | ||||
| 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" | ||||
| (HTTP) | ||||
| Include the HTTP-header in the output. The HTTP-header includes things | ||||
| @@ -497,6 +507,20 @@ line. So, it could look similar to this: | ||||
| url = "http://curl.haxx.se/docs/" | ||||
|  | ||||
| This option can be used multiple times. | ||||
|  | ||||
| When curl is invoked, it always (unless \fI-q\fP is used) checks for a default | ||||
| config file and uses it if found. The default config file is checked for in | ||||
| the following places in this order: | ||||
|  | ||||
| 1) curl tries to find the "home dir": It first checks for the CURL_HOME and | ||||
| then the HOME environment variables. Failing that, it uses getpwuid() on | ||||
| unix-like systems (which returns the home dir given the current user in your | ||||
| system). On Windows, it then checks for the APPDATA variable, or as a last | ||||
| resort the '%USERPROFILE%\Application Data'. | ||||
|  | ||||
| 2) On windows, if there is no _curlrc file in the home dir, it checks for one | ||||
| in the same dir the executable curl is placed. On unix-like systems, it will | ||||
| simply try to load .curlrc from the determined home dir. | ||||
| .IP "--limit-rate <speed>" | ||||
| Specify the maximum transfer rate you want curl to use. This feature is useful | ||||
| if you have a limited pipe and you'd like your transfer not use your entire | ||||
| @@ -700,8 +724,9 @@ If this option is used several times, the last one will be used. Disable the | ||||
| use of PORT with \fI--ftp-pasv\fP. Disable the attempt to use the EPRT command | ||||
| instead of PORT by using \fI--disable-eprt\fP. EPRT is really PORT++. | ||||
| .IP "-q" | ||||
| If used as the first parameter on the command line, the \fI$HOME/.curlrc\fP | ||||
| file will not be read and used as a config file. | ||||
| If used as the first parameter on the command line, the \fIcurlrc\fP config | ||||
| file will not be read and used. See the \fI-K/--config\fP for details on the | ||||
| default config file search path. | ||||
| .IP "-Q/--quote <command>" | ||||
| (FTP) Send an arbitrary command to the remote FTP server. Quote commands are | ||||
| sent BEFORE the transfer is taking place (just after the initial PWD command | ||||
| @@ -870,6 +895,11 @@ to read for untrained humans. | ||||
|  | ||||
| If this option is used several times, the last one will be used. (Added in | ||||
| 7.9.7) | ||||
| .IP "--trace-time" | ||||
| Prepends a time stamp to each trace or verbose line that curl displays. | ||||
|  | ||||
| If this option is used several times, each occurrence will toggle it on/off. | ||||
| (Added in 7.14.0        ) | ||||
| .IP "-u/--user <user:password>" | ||||
| Specify user and password to use for server authentication. Overrides | ||||
| \fI-n/--netrc\fP and \fI--netrc-optional\fP. | ||||
| @@ -887,9 +917,9 @@ This option may be used any number of times. To control where this URL is | ||||
| written, use the \fI-o/--output\fP or the \fI-O/--remote-name\fP options. | ||||
| .IP "-v/--verbose" | ||||
| Makes the fetching more verbose/talkative. Mostly usable for debugging. Lines | ||||
| starting with '>' means data sent by curl (this data may in itself contain | ||||
| newlines), '<' means data received by curl that is hidden in normal cases and | ||||
| lines starting with '*' means additional info provided by curl. | ||||
| starting with '>' means "header data" sent by curl, '<' means "header data" | ||||
| received by curl that is hidden in normal cases and lines starting with '*' | ||||
| means additional info provided by curl. | ||||
|  | ||||
| Note that if you only want HTTP headers in the output, \fI-i/--include\fP | ||||
| might be option you're looking for. | ||||
| @@ -938,11 +968,11 @@ SSPI is supported. If you use NTLM and set a blank user name, curl will | ||||
| authenticate with your current user and password. | ||||
| .RE | ||||
| .IP "-w/--write-out <format>" | ||||
| Defines what to display after a completed and successful operation. The format | ||||
| is a string that may contain plain text mixed with any number of variables. The | ||||
| string can be specified as "string", to get read from a particular file you | ||||
| specify it "@filename" and to tell curl to read the format from stdin you | ||||
| write "@-". | ||||
| Defines what to display on stdout after a completed and successful | ||||
| operation. The format is a string that may contain plain text mixed with any | ||||
| number of variables. The string can be specified as "string", to get read from | ||||
| a particular file you specify it "@filename" and to tell curl to read the | ||||
| format from stdin you write "@-". | ||||
|  | ||||
| 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 | ||||
| @@ -1038,12 +1068,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 | ||||
| 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. | ||||
| .IP "-X/--request <command>" | ||||
| (HTTP) | ||||
| Specifies a custom request to use when communicating with the HTTP server. | ||||
| The specified request will be used instead of the standard GET. Read the | ||||
| HTTP 1.1 specification for details and explanations. | ||||
| (HTTP) Specifies a custom request method to use when communicating with the | ||||
| HTTP server.  The specified request will be used instead of the method | ||||
| otherwise used (which defaults to GET). Read the HTTP 1.1 specification for | ||||
| details and explanations. | ||||
|  | ||||
| (FTP) | ||||
| Specifies a custom FTP command to use instead of LIST when doing file lists | ||||
|   | ||||
| @@ -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		\ | ||||
|  multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c		\ | ||||
|  multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c	\ | ||||
|  anyauthput.c htmltitle.cc htmltidy.c | ||||
|  anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c		\ | ||||
|  cookie_interface.c cacertinmem.c | ||||
|  | ||||
| all: | ||||
| 	@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; | ||||
| } | ||||
| @@ -20,7 +20,8 @@ PROGRAMS  = fopen.exe ftpget.exe ftpgetresp.exe ftpupload.exe \ | ||||
|             multi-double.exe multi-post.exe multi-single.exe \ | ||||
|             persistant.exe post-callback.exe postit2.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) | ||||
|  | ||||
|   | ||||
							
								
								
									
										77
									
								
								docs/examples/opensslthreadlock.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								docs/examples/opensslthreadlock.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| /***************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * $Id$ | ||||
|  * | ||||
|  * Example source code to show one way to set the necessary OpenSSL locking | ||||
|  * callbacks if you want to do multi-threaded transfers with HTTPS/FTPS with | ||||
|  * libcurl built to use OpenSSL. | ||||
|  * | ||||
|  * This is not a complete stand-alone example. | ||||
|  * | ||||
|  * Author: Jeremy Brown | ||||
|  */ | ||||
|  | ||||
| #define MUTEX_TYPE       pthread_mutex_t | ||||
| #define MUTEX_SETUP(x)   pthread_mutex_init(&(x), NULL) | ||||
| #define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x)) | ||||
| #define MUTEX_LOCK(x)    pthread_mutex_lock(&(x)) | ||||
| #define MUTEX_UNLOCK(x)  pthread_mutex_unlock(&(x)) | ||||
| #define THREAD_ID        pthread_self(  ) | ||||
|  | ||||
|  | ||||
| void handle_error(const char *file, int lineno, const char *msg){ | ||||
|      fprintf(stderr, ** %s:%i %s\n, file, lineno, msg); | ||||
|      ERR_print_errors_fp(stderr); | ||||
|      /* exit(-1); */ | ||||
|  } | ||||
|  | ||||
| /* This array will store all of the mutexes available to OpenSSL. */ | ||||
| static MUTEX_TYPE *mutex_buf= NULL; | ||||
|  | ||||
|  | ||||
| static void locking_function(int mode, int n, const char * file, int line) | ||||
| { | ||||
|   if (mode & CRYPTO_LOCK) | ||||
|     MUTEX_LOCK(mutex_buf[n]); | ||||
|   else | ||||
|     MUTEX_UNLOCK(mutex_buf[n]); | ||||
| } | ||||
|  | ||||
| static unsigned long id_function(void) | ||||
| { | ||||
|   return ((unsigned long)THREAD_ID); | ||||
| } | ||||
|  | ||||
| int thread_setup(void) | ||||
| { | ||||
|   int i; | ||||
|  | ||||
|   mutex_buf = (MUTEX_TYPE *)malloc(CRYPTO_num_locks(  ) * sizeof(MUTEX_TYPE)); | ||||
|   if (!mutex_buf) | ||||
|     return 0; | ||||
|   for (i = 0;  i < CRYPTO_num_locks(  );  i++) | ||||
|     MUTEX_SETUP(mutex_buf[i]); | ||||
|   CRYPTO_set_id_callback(id_function); | ||||
|   CRYPTO_set_locking_callback(locking_function); | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| int thread_cleanup(void) | ||||
| { | ||||
|   int i; | ||||
|  | ||||
|   if (!mutex_buf) | ||||
|     return 0; | ||||
|   CRYPTO_set_id_callback(NULL); | ||||
|   CRYPTO_set_locking_callback(NULL); | ||||
|   for (i = 0;  i < CRYPTO_num_locks(  );  i++) | ||||
|     MUTEX_CLEANUP(mutex_buf[i]); | ||||
|   free(mutex_buf); | ||||
|   mutex_buf = NULL; | ||||
|   return 1; | ||||
| } | ||||
| @@ -52,7 +52,8 @@ PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf			\ | ||||
|  | ||||
| CLEANFILES = $(HTMLPAGES) $(PDFPAGES) | ||||
|  | ||||
| EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) libcurl.m4 | ||||
| EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) libcurl.m4 \ | ||||
|  getinfo-times | ||||
|  | ||||
| MAN2HTML= roffit --mandir=. < $< >$@ | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
| 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 | ||||
| accordingly and can be relied upon only if the function returns CURLE_OK. | ||||
| This function is intended to get used AFTER a performed transfer, all results | ||||
| from this function are undefined until the transfer is completed. | ||||
| accordingly and can be relied upon only if the function returns CURLE_OK.  Use | ||||
| this function AFTER a performed transfer if you want to get transfer- oriented | ||||
| data. | ||||
|  | ||||
| You should not free the memory returned by this function unless it is | ||||
| explictly mentioned below. | ||||
| @@ -35,12 +35,14 @@ this. | ||||
| Pass a pointer to a long to receive the last received proxy response code to a | ||||
| CONNECT request. | ||||
| .IP CURLINFO_FILETIME | ||||
| Pass a pointer to a long to receive the remote time of the retrieved | ||||
| document. If you get -1, it can be because of many reasons (unknown, the | ||||
| server hides it or the server doesn't support the command that tells document | ||||
| time etc) and the time of the document is unknown. Note that you must tell the | ||||
| server to collect this information before the transfer is made, by using the | ||||
| CURLOPT_FILETIME option to \fIcurl_easy_setopt(3)\fP. (Added in 7.5) | ||||
| Pass a pointer to a long to receive the remote time of the retrieved document | ||||
| (in number of seconds since 1 jan 1970 in the GMT/UTC time zone). If you get | ||||
| -1, it can be because of many reasons (unknown, the server hides it or the | ||||
| server doesn't support the command that tells document time etc) and the time | ||||
| of the document is unknown. Note that you must tell the server to collect this | ||||
| 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 | ||||
| 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 | ||||
| @@ -132,6 +134,13 @@ counted).  Combined with \fICURLINFO_REDIRECT_COUNT\fP you are able to know | ||||
| 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 | ||||
| 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 RETURN VALUE | ||||
| If the operation was successful, CURLE_OK is returned. Otherwise an | ||||
| appropriate error code will be returned. | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
| .\" * $Id$ | ||||
| .\" ************************************************************************** | ||||
| .\" | ||||
| .TH curl_easy_setopt 3 "25 Jan 2005" "libcurl 7.13.0" "libcurl Manual" | ||||
| .TH curl_easy_setopt 3 "28 Jul 2005" "libcurl 7.14.1" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_easy_setopt - set options for a curl easy handle | ||||
| .SH SYNOPSIS | ||||
| @@ -171,20 +171,30 @@ argument in the progress callback set with \fICURLOPT_PROGRESSFUNCTION\fP. | ||||
| .IP CURLOPT_HEADERFUNCTION | ||||
| Function pointer that should match the following prototype: \fIsize_t | ||||
| 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 | ||||
| needs to be written down. The headers are guaranteed to be written one-by-one | ||||
| and only complete lines are written. Parsing headers should be easy enough | ||||
| function gets called by libcurl as soon as it has received header data. The | ||||
| header callback will be called once for each header and only complete header | ||||
| 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 | ||||
| multiplied with \fInmemb\fP.  The pointer named \fIstream\fP will be the one | ||||
| you passed to libcurl with the \fICURLOPT_WRITEHEADER\fP option.  Return the | ||||
| number of bytes actually written or return -1 to signal error to the library | ||||
| multiplied with \fInmemb\fP. Do not assume that the header line is zero | ||||
| terminated! The pointer named \fIstream\fP is the one you set with the | ||||
| \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 | ||||
| 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 | ||||
| Pass a pointer to be used to write the header part of the received data to. If | ||||
| you don't use your own callback to take care of the writing, this must be a | ||||
| valid FILE *. See also the \fICURLOPT_HEADERFUNCTION\fP option above on how to | ||||
| set a custom get-all-headers callback. | ||||
| (This option is also known as \fBCURLOPT_HEADERDATA\fP) Pass a pointer to be | ||||
| used to write the header part of the received data to. If you don't use your | ||||
| own callback to take care of the writing, this must be a valid FILE *. See | ||||
| also the \fICURLOPT_HEADERFUNCTION\fP option above on how to set a custom | ||||
| get-all-headers callback. | ||||
| .IP CURLOPT_DEBUGFUNCTION | ||||
| Function pointer that should match the following prototype: \fIint | ||||
| curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *);\fP | ||||
| @@ -223,6 +233,9 @@ 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 | ||||
| option was introduced in 7.11.0. | ||||
|  | ||||
| This function will get called on all new connections made to a server, during | ||||
| the SSL negotiation. The SSL_CTX pointer will be a new one every time. | ||||
|  | ||||
| \fBNOTE:\fP 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 | ||||
| @@ -274,15 +287,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 | ||||
| \fICURLOPT_PROXYPORT\fP. | ||||
|  | ||||
| \fBNOTE:\fP when you tell the library to use an HTTP proxy, libcurl will | ||||
| transparently convert operations to HTTP even if you specify an FTP URL | ||||
| etc. This may have an impact on what other features of the library you can | ||||
| use, such as \fICURLOPT_QUOTE\fP and similar FTP specifics that don't work | ||||
| unless you tunnel through the HTTP proxy. Such tunneling is activated with | ||||
| When you tell the library to use an HTTP proxy, libcurl will transparently | ||||
| convert operations to HTTP even if you specify an FTP URL etc. This may have | ||||
| an impact on what other features of the library you can use, such as | ||||
| \fICURLOPT_QUOTE\fP and similar FTP specifics that don't work unless you | ||||
| tunnel through the HTTP proxy. Such tunneling is activated with | ||||
| \fICURLOPT_HTTPPROXYTUNNEL\fP. | ||||
|  | ||||
| \fBNOTE2:\fP libcurl respects the environment variables \fBhttp_proxy\fP, | ||||
| \fBftp_proxy\fP, \fBall_proxy\fP etc, if any of those is set. | ||||
| libcurl respects the environment variables \fBhttp_proxy\fP, \fBftp_proxy\fP, | ||||
| \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 | ||||
| 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. | ||||
| @@ -410,7 +428,7 @@ is a more secure way to do authentication over public networks than the | ||||
| regular old-fashioned Basic method. | ||||
| .IP CURLAUTH_GSSNEGOTIATE | ||||
| HTTP GSS-Negotiate authentication. The GSS-Negotiate (also known as plain | ||||
| "Negotiate") method was designed by Microsoft and is used in their web | ||||
| \&"Negotiate") method was designed by Microsoft and is used in their web | ||||
| applications. It is primarily meant as a support for Kerberos5 authentication | ||||
| but may be also used along with another authentication methods. For more | ||||
| information see IETF draft draft-brezak-spnego-http-04.txt. | ||||
| @@ -442,7 +460,7 @@ use. Note that for some methods, this will induce an extra network | ||||
| round-trip. Set the actual name and password with the | ||||
| \fICURLOPT_PROXYUSERPWD\fP option. The bitmask can be constructed by or'ing | ||||
| together the bits listed above for the \fICURLOPT_HTTPAUTH\fP option. As of | ||||
| this writing, only Basic and NTLM work. (Added in 7.10.7) | ||||
| this writing, only Basic, Digest and NTLM work. (Added in 7.10.7) | ||||
| .SH HTTP OPTIONS | ||||
| .IP CURLOPT_AUTOREFERER | ||||
| Pass a non-zero parameter to enable this. When enabled, libcurl will | ||||
| @@ -511,8 +529,11 @@ adding a header like "Transfer-Encoding: chunked" with | ||||
| \fICURLOPT_HTTPHEADER\fP. With HTTP 1.0 or without chunked transfer, you must | ||||
| specify the size in the request. | ||||
|  | ||||
| NOTE: if you have issued a POST request and want to make a HEAD or GET | ||||
| instead, you must explictly pick the new request type using | ||||
| When setting \fICURLOPT_POST\fP to a non-zero value, it will automatically set | ||||
| \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. | ||||
| .IP CURLOPT_POSTFIELDS | ||||
| Pass a char * as parameter, which should be the full data to post in an HTTP | ||||
| @@ -550,6 +571,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. | ||||
| 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 | ||||
| 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 | ||||
| @@ -620,6 +644,9 @@ dumped to a file. | ||||
| 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 | ||||
| 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 | ||||
| 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 | ||||
| @@ -640,10 +667,18 @@ cookies" from the previous session. By default, libcurl always stores and | ||||
| 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 | ||||
| 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 | ||||
| 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 | ||||
| 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 | ||||
| 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 | ||||
| @@ -656,6 +691,12 @@ it thinks fit. | ||||
| Enforce HTTP 1.0 requests. | ||||
| .IP CURL_HTTP_VERSION_1_1 | ||||
| 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 | ||||
| .SH FTP OPTIONS | ||||
| .IP CURLOPT_FTPPORT | ||||
| @@ -770,11 +811,15 @@ this data is sent off using the ACCT command. (Added in 7.13.0) | ||||
| .SH PROTOCOL OPTIONS | ||||
| .IP CURLOPT_TRANSFERTEXT | ||||
| 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 | ||||
| plain text instead of HTML and for win32 systems it does not set the stdout to | ||||
| binary mode. This option can be usable when transferring text data between | ||||
| systems with different views on certain characters, such as newlines or | ||||
| similar. | ||||
| instead of the default binary transfer. For win32 systems it does not set the | ||||
| stdout to binary mode. This option can be usable when transferring text data | ||||
| between systems with different views on certain characters, such as newlines | ||||
| or similar. | ||||
|  | ||||
| \fBNOTE:\fP 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 | ||||
| Convert Unix newlines to CRLF newlines on transfers. | ||||
| .IP CURLOPT_RANGE | ||||
| @@ -818,9 +863,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 | ||||
| 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 | ||||
| POST, you should use \fICURLOPT_POST\fP. Setting \fICURLOPT_NOBODY\fP to zero | ||||
| has no effect. | ||||
| To change request to GET, you should use \fICURLOPT_HTTPGET\fP. Change request | ||||
| to POST with \fICURLOPT_POST\fP etc. | ||||
| .IP CURLOPT_INFILESIZE | ||||
| 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 | ||||
| @@ -996,28 +1040,60 @@ operations. | ||||
| \fBNOTE:\fP If the crypto device cannot be set, | ||||
| \fICURLE_SSL_ENGINE_SETFAILED\fP is returned. | ||||
| .IP CURLOPT_SSLVERSION | ||||
| Pass a long as parameter. Set what version of SSL to attempt to use, 2 or | ||||
| 3. By default, the SSL library will try to solve this by itself although some | ||||
| servers make this difficult why you at times may have to use this option. | ||||
| Pass a long as parameter to control what version of SSL/TLS to attempt to use. | ||||
| The available options are: | ||||
| .RS | ||||
| .IP CURL_SSLVERSION_DEFAULT | ||||
| The default action. When libcurl built with OpenSSL, this will attempt to | ||||
| figure out the remote SSL protocol version. Unfortunately there are a lot of | ||||
| ancient and broken servers in use which cannot handle this technique and will | ||||
| fail to connect. When libcurl is built with GnuTLS, this will mean SSLv3. | ||||
| .IP CURL_SSLVERSION_TLSv1 | ||||
| Force TLSv1 | ||||
| .IP CURL_SSLVERSION_SSLv2 | ||||
| Force SSLv2 | ||||
| .IP CURL_SSLVERSION_SSLv3 | ||||
| Force SSLv3 | ||||
| .RE | ||||
| .IP CURLOPT_SSL_VERIFYPEER | ||||
| Pass a long that is set to a zero value to stop curl from verifying the peer's | ||||
| certificate (7.10 starting setting this option to non-zero by default). | ||||
| Alternate certificates to verify against can be specified with the | ||||
| \fICURLOPT_CAINFO\fP option or a certificate directory can be specified with | ||||
| the \fICURLOPT_CAPATH\fP option.  As of 7.10, curl installs a default bundle. | ||||
| \fICURLOPT_SSL_VERIFYHOST\fP may also need to be set to 1 or 0 if | ||||
| \fICURLOPT_SSL_VERIFYPEER\fP is disabled (it defaults to 2). | ||||
| Pass a long as parameter. | ||||
|  | ||||
| This option determines whether curl verifies the authenticity of the | ||||
| peer's certificate.  A nonzero value means curl verifies; zero means it | ||||
| doesn't.  The default is nonzero, but before 7.10, it was zero. | ||||
|  | ||||
| When negotiating an SSL connection, the server sends a certificate | ||||
| indicating its identity.  Curl verifies whether the certificate is | ||||
| authentic, i.e. that you can trust that the server is who the | ||||
| certificate says it is.  This trust is based on a chain of digital | ||||
| signatures, rooted in certification authority (CA) certificates you | ||||
| supply.  As of 7.10, curl installs a default bundle of CA certificates | ||||
| and you can specify alternate certificates with the | ||||
| \fICURLOPT_CAINFO\fP option or the \fICURLOPT_CAPATH\fP option. | ||||
|  | ||||
| When \fICURLOPT_SSL_VERIFYPEER\fP is nonzero, and the verification | ||||
| fails to prove that the certificate is authentic, the connection | ||||
| fails.  When the option is zero, the connection succeeds regardless. | ||||
|  | ||||
| Authenticating the certificate is not by itself very useful.  You | ||||
| typically want to ensure that the server, as authentically identified | ||||
| by its certificate, is the server you mean to be talking to.  Use | ||||
| \fICURLOPT_SSL_VERIFYHOST\fP to control that. | ||||
| .IP CURLOPT_CAINFO | ||||
| Pass a char * to a zero terminated string naming a file holding one or more | ||||
| certificates to verify the peer with. This only makes sense when used in | ||||
| combination with the \fICURLOPT_SSL_VERIFYPEER\fP option. | ||||
| certificates to verify the peer with.  This makes sense only when used in | ||||
| combination with the \fICURLOPT_SSL_VERIFYPEER\fP option.  If | ||||
| \fICURLOPT_SSL_VERIFYPEER\fP is zero, \fICURLOPT_CAINFO\fP need not | ||||
| even indicate an accessible file. | ||||
| .IP CURLOPT_CAPATH | ||||
| Pass a char * to a zero terminated string naming a directory holding multiple | ||||
| CA certificates to verify the peer with. The certificate directory must be | ||||
| prepared using the openssl c_rehash utility. This only makes sense when used | ||||
| in combination with the \fICURLOPT_SSL_VERIFYPEER\fP option. The | ||||
| \fICURLOPT_CAPATH\fP function apparently does not work in Windows due to some | ||||
| limitation in openssl. (Added in 7.9.8) | ||||
| Pass a char * to a zero terminated string naming a directory holding | ||||
| multiple CA certificates to verify the peer with. The certificate | ||||
| directory must be prepared using the openssl c_rehash utility. This | ||||
| makes sense only when used in combination with the | ||||
| \fICURLOPT_SSL_VERIFYPEER\fP option.  If \fICURLOPT_SSL_VERIFYPEER\fP | ||||
| is zero, \fICURLOPT_CAPATH\fP need not even indicate an accessible | ||||
| path.  The \fICURLOPT_CAPATH\fP function apparently does not work in | ||||
| Windows due to some limitation in openssl. (Added in 7.9.8) | ||||
| .IP CURLOPT_RANDOM_FILE | ||||
| Pass a char * to a zero terminated file name. The file will be used to read | ||||
| from to seed the random engine for SSL. The more random the specified file is, | ||||
| @@ -1026,9 +1102,34 @@ the more secure the SSL connection will become. | ||||
| Pass a char * to the zero terminated path name to the Entropy Gathering Daemon | ||||
| socket. It will be used to seed the random engine for SSL. | ||||
| .IP CURLOPT_SSL_VERIFYHOST | ||||
| Pass a long. Set if we should verify the Common name from the peer certificate | ||||
| in the SSL handshake, set 1 to check existence, 2 to ensure that it matches | ||||
| the provided hostname. This is by default set to 2. (default changed in 7.10) | ||||
| Pass a long as parameter. | ||||
|  | ||||
| This option determines whether curl verifies that the server claims to be | ||||
| who you want it to be. | ||||
|  | ||||
| When negotiating an SSL connection, the server sends a certificate | ||||
| indicating its identity. | ||||
|  | ||||
| When \fICURLOPT_SSL_VERIFYHOST\fP is 2, that certificate must indicate | ||||
| that the server is the server to which you meant to connect, or the | ||||
| connection fails. | ||||
|  | ||||
| Curl considers the server the intended one when the Common Name field | ||||
| or a Subject Alternate Name field in the certificate matches the host | ||||
| name in the URL to which you told Curl to connect. | ||||
|  | ||||
| When the value is 1, the certificate must contain a Common Name field, | ||||
| but it doesn't matter what name it says.  (This is not ordinarily a | ||||
| useful setting). | ||||
|  | ||||
| When the value is 0, the connection succeeds regardless of the names in | ||||
| the certificate. | ||||
|  | ||||
| The default, since 7.10, is 2. | ||||
|  | ||||
| The checking this option controls is of the identity that the server | ||||
| \fIclaims\fP.  The server could be lying.  To control lying, see | ||||
| \fICURLOPT_SSL_VERIFYPEER\fP. | ||||
| .IP CURLOPT_SSL_CIPHER_LIST | ||||
| Pass a char *, pointing to a zero terminated string holding the list of | ||||
| ciphers to use for the SSL connection. The list must be syntactically correct, | ||||
|   | ||||
| @@ -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 | ||||
| \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 | ||||
| instead of using a file. The given string is used as the value of the file | ||||
| name field in the content header. | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| .\" nroff -man [file] | ||||
| .\" $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 | ||||
| curl_getdate - Convert an date string to number of seconds since January 1, | ||||
| 1970 | ||||
| @@ -26,7 +26,7 @@ order of the items is immaterial.  A date string may contain many flavors of | ||||
| items: | ||||
| .TP 0.8i | ||||
| .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. | ||||
| Examples: 06 Nov 1994, 06-Nov-94 and Nov-94 6. | ||||
| .TP | ||||
| @@ -94,7 +94,7 @@ crippled mktime(), \fIcurl_getdate\fP will return -1 in this case. | ||||
| .SH REWRITE | ||||
| 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 | ||||
| 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 | ||||
| code. | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .TH curl_multi_fdset 3 "18 Apr 2005" "libcurl 7.9.5" "libcurl Manual" | ||||
| .TH curl_multi_fdset 3 "25 Apr 2005" "libcurl 7.9.5" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_multi_fdset - extracts file descriptor information from a multi handle | ||||
| .SH SYNOPSIS | ||||
| @@ -21,6 +21,10 @@ but be sure to FD_ZERO them before calling this function as | ||||
| otherwise remove any other. The \fIcurl_multi_perform(3)\fP function should be | ||||
| called as soon as one of them are ready to be read from or written to. | ||||
|  | ||||
| If no file descriptors are set by libcurl, \fImax_fd\fP will contain -1 when | ||||
| this function returns. Otherwise it will contain the higher descriptor number | ||||
| libcurl set. | ||||
|  | ||||
| You should also be aware that when doing select(), you should consider using a | ||||
| rather small (single-digit number of seconds) timeout and call | ||||
| \fIcurl_multi_perform\fP regularly - even if no activity has been seen on the | ||||
|   | ||||
							
								
								
									
										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) | ||||
| .SH "CURLMcode" | ||||
| 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)" | ||||
| This is not really an error. It means you should call | ||||
| \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! | ||||
| .SH "CURLSHcode" | ||||
| The "share" interface will return a CURLSHcode to indicate when an error has | ||||
| occurred.  Also consider \fIcurl_share_strerror(3)\fI. | ||||
|  | ||||
| CURLSHcode is one of the following: | ||||
| occurred.  Also consider \fIcurl_share_strerror(3)\fP. | ||||
| .IP "CURLSHE_OK (0)" | ||||
| All fine. Proceed as usual. | ||||
| .IP "CURLSHE_BAD_OPTION (1)" | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
| .\" * $Id$ | ||||
| .\" ************************************************************************** | ||||
| .\" | ||||
| .TH libcurl-tutorial 3 "25 Jan 2005" "libcurl" "libcurl programming" | ||||
| .TH libcurl-tutorial 3 "9 May 2005" "libcurl" "libcurl programming" | ||||
| .SH NAME | ||||
| libcurl-tutorial \- libcurl programming tutorial | ||||
| .SH "Objective" | ||||
| @@ -246,17 +246,27 @@ you intend to make another transfer. libcurl will then attempt to re-use the | ||||
| previous | ||||
|  | ||||
| .SH "Multi-threading Issues" | ||||
| libcurl is completely thread safe, except for two issues: signals and alarm | ||||
| handlers. Signals are needed for a SIGPIPE handler, and the alarm() call is | ||||
| used to deal with timeouts (during DNS lookup). | ||||
| The first basic rule is that you must \fBnever\fP share a libcurl handle (be | ||||
| it easy or multi or whatever) between multiple threads. Only use one handle in | ||||
| one thread at a time. | ||||
|  | ||||
| libcurl is completely thread safe, except for two issues: signals and SSL/TLS | ||||
| handlers. Signals are used timeouting name resolves (during DNS lookup) - when | ||||
| built without c-ares support and not on Windows.. | ||||
|  | ||||
| If you are accessing HTTPS or FTPS URLs in a multi-threaded manner, you are | ||||
| then of course using OpenSSL multi-threaded and it has itself a few | ||||
| requirements on this. Basically, you need to provide one or two functions to | ||||
| allow it to function properly. For all details, see this: | ||||
| then of course using OpenSSL/GnuTLS multi-threaded and those libs have their | ||||
| own requirements on this issue. Basically, you need to provide one or two | ||||
| functions to allow it to function properly. For all details, see this: | ||||
|  | ||||
| OpenSSL | ||||
|  | ||||
|    http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION | ||||
|  | ||||
| GnuTLS | ||||
|  | ||||
|  http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html | ||||
|  | ||||
| When using multiple threads you should set the CURLOPT_NOSIGNAL option to | ||||
| TRUE for all handles. Everything will work fine except that timeouts are not | ||||
| honored during the DNS lookup - which you can work around by building libcurl | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| # LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION], | ||||
| #                       [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 | ||||
| # 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 | ||||
| # curl-config script.  Note that it is very important for people | ||||
| # packaging binary versions of libcurl to include this script! | ||||
| # Without curl-config, we can only make educated guesses as to what | ||||
| # 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. | ||||
| # Without curl-config, we can only guess what protocols are available. | ||||
|  | ||||
| AC_DEFUN([LIBCURL_CHECK_CONFIG], | ||||
| [ | ||||
| @@ -103,6 +97,15 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG], | ||||
|            fi | ||||
|            if test x"$LIBCURL" = "x" ; then | ||||
|               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 | ||||
|  | ||||
| 	   # All curl-config scripts support --feature | ||||
| @@ -130,8 +133,8 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG], | ||||
|            [ | ||||
|            _libcurl_save_cppflags=$CPPFLAGS | ||||
|            CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" | ||||
|            _libcurl_save_ldflags=$LDFLAGS | ||||
|            LDFLAGS="$LDFLAGS $LIBCURL" | ||||
|            _libcurl_save_libs=$LIBS | ||||
|            LIBS="$LIBS $LIBCURL" | ||||
|  | ||||
|            AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[ | ||||
| /* 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) | ||||
|  | ||||
|            CPPFLAGS=$_libcurl_save_cppflags | ||||
|            LDFLAGS=$_libcurl_save_ldflags | ||||
|            LIBS=$_libcurl_save_libs | ||||
|            unset _libcurl_save_cppflags | ||||
|            unset _libcurl_save_ldflags | ||||
|            unset _libcurl_save_libs | ||||
|            ]) | ||||
|  | ||||
|         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, | ||||
|              [Define to 1 if you have a functional curl library.]) | ||||
|            AC_SUBST(LIBCURL_CPPFLAGS) | ||||
|   | ||||
| @@ -890,6 +890,12 @@ typedef enum { | ||||
|      "account" info */ | ||||
|   CINIT(FTP_ACCOUNT, OBJECTPOINT, 134), | ||||
|  | ||||
|   /* feed cookies into cookie engine */ | ||||
|   CINIT(COOKIELIST, OBJECTPOINT, 135), | ||||
|  | ||||
|   /* ignore Content-Length */ | ||||
|   CINIT(IGNORE_CONTENT_LENGTH, LONG, 136), | ||||
|  | ||||
|   CURLOPT_LASTENTRY /* the last unused */ | ||||
| } CURLoption; | ||||
|  | ||||
| @@ -1202,11 +1208,10 @@ CURL_EXTERN void curl_slist_free_all(struct curl_slist *); | ||||
|  * DESCRIPTION | ||||
|  * | ||||
|  * 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 | ||||
|  * where the specified time is relative now, like 'two weeks' or 'tomorrow' | ||||
|  * etc. | ||||
|  * the first argument. The time argument in the second parameter is unused | ||||
|  * and should be set to NULL. | ||||
|  */ | ||||
| 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_LONG     0x200000 | ||||
| @@ -1244,6 +1249,7 @@ typedef enum { | ||||
|   CURLINFO_OS_ERRNO         = CURLINFO_LONG   + 25, | ||||
|   CURLINFO_NUM_CONNECTS     = CURLINFO_LONG   + 26, | ||||
|   CURLINFO_SSL_ENGINES      = CURLINFO_SLIST  + 27, | ||||
|   CURLINFO_COOKIELIST       = CURLINFO_SLIST  + 28, | ||||
|   /* Fill in new entries below here! */ | ||||
|  | ||||
|   CURLINFO_LASTONE          = 28 | ||||
|   | ||||
| @@ -28,7 +28,7 @@ | ||||
|  | ||||
| /* This is the version number of the libcurl package from which this header | ||||
|    file origins: */ | ||||
| #define LIBCURL_VERSION "7.14.0-CVS" | ||||
| #define LIBCURL_VERSION "7.14.1-CVS" | ||||
|  | ||||
| /* This is the numeric version of the libcurl version number, meant for easier | ||||
|    parsing and comparions by programs. The LIBCURL_VERSION_NUM define will | ||||
| @@ -44,12 +44,12 @@ | ||||
|    always a greater number in a more recent release. It makes comparisons with | ||||
|    greater than and less than work. | ||||
| */ | ||||
| #define LIBCURL_VERSION_NUM 0x070e00 | ||||
| #define LIBCURL_VERSION_NUM 0x070e01 | ||||
|  | ||||
| /* 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 | ||||
| #define LIBCURL_VERSION_PATCH 1 | ||||
|  | ||||
| #endif /* __CURL_CURLVER_H */ | ||||
|   | ||||
| @@ -23,16 +23,8 @@ | ||||
|  * $Id$ | ||||
|  ***************************************************************************/ | ||||
| /* | ||||
|   This is meant to be the "external" header file. Don't give away any | ||||
|   internals here! | ||||
|   This is an "external" header file. Don't give away any internals here! | ||||
|  | ||||
|   This document presents a mixture of ideas from at least: | ||||
|   - Daniel Stenberg | ||||
|   - Steve Dekorte | ||||
|   - Sterling Hughes | ||||
|   - Ben Greear | ||||
|  | ||||
|   ------------------------------------------- | ||||
|   GOALS | ||||
|  | ||||
|   o Enable a "pull" interface. The application that uses libcurl decides where | ||||
| @@ -82,6 +74,22 @@ extern "C" { | ||||
|  | ||||
| typedef void CURLM; | ||||
|  | ||||
| #ifdef HAVE_CURL_MULTI_SOCKET /* this is not set by anything yet */ | ||||
|  | ||||
| #ifndef curl_socket_typedef | ||||
| /* Public socket typedef */ | ||||
| #ifdef WIN32 | ||||
| typedef SOCKET curl_socket_t; | ||||
| #define CURL_SOCKET_BAD INVALID_SOCKET | ||||
| #else | ||||
| typedef int curl_socket_t; | ||||
| #define CURL_SOCKET_BAD -1 | ||||
| #endif | ||||
| #define curl_socket_typedef | ||||
| #endif /* curl_socket_typedef */ | ||||
|  | ||||
| #endif /* HAVE_CURL_MULTI_SOCKET */ | ||||
|  | ||||
| typedef enum { | ||||
|   CURLM_CALL_MULTI_PERFORM=-1, /* please call curl_multi_perform() soon */ | ||||
|   CURLM_OK, | ||||
| @@ -113,6 +121,7 @@ typedef struct CURLMsg CURLMsg; | ||||
|  * Name:    curl_multi_init() | ||||
|  * | ||||
|  * Desc:    inititalize multi-style curl usage | ||||
|  * | ||||
|  * Returns: a new CURLM handle to use in all 'curl_multi' functions. | ||||
|  */ | ||||
| CURL_EXTERN CURLM *curl_multi_init(void); | ||||
| @@ -121,6 +130,7 @@ CURL_EXTERN CURLM *curl_multi_init(void); | ||||
|  * Name:    curl_multi_add_handle() | ||||
|  * | ||||
|  * Desc:    add a standard curl handle to the multi stack | ||||
|  * | ||||
|  * Returns: CURLMcode type, general multi error code. | ||||
|  */ | ||||
| CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, | ||||
| @@ -130,6 +140,7 @@ CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, | ||||
|   * Name:    curl_multi_remove_handle() | ||||
|   * | ||||
|   * Desc:    removes a curl handle from the multi stack again | ||||
|   * | ||||
|   * Returns: CURLMcode type, general multi error code. | ||||
|   */ | ||||
| CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, | ||||
| @@ -141,6 +152,7 @@ CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, | ||||
|   * Desc:    Ask curl for its fd_set sets. The app can use these to select() or | ||||
|   *          poll() on. We want curl_multi_perform() called as soon as one of | ||||
|   *          them are ready. | ||||
|   * | ||||
|   * Returns: CURLMcode type, general multi error code. | ||||
|   */ | ||||
| CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, | ||||
| @@ -175,6 +187,7 @@ CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, | ||||
|   *          touch any individual easy handles in any way. We need to define | ||||
|   *          in what state those handles will be if this function is called | ||||
|   *          in the middle of a transfer. | ||||
|   * | ||||
|   * Returns: CURLMcode type, general multi error code. | ||||
|   */ | ||||
| CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle); | ||||
| @@ -211,16 +224,107 @@ CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle, | ||||
|                                           int *msgs_in_queue); | ||||
|  | ||||
| /* | ||||
|  * NAME curl_multi_strerror() | ||||
|  * Name:    curl_multi_strerror() | ||||
|  * | ||||
|  * DESCRIPTION | ||||
|  * Desc:    The curl_multi_strerror function may be used to turn a CURLMcode | ||||
|  *          value into the equivalent human readable error string.  This is | ||||
|  *          useful for printing meaningful error messages. | ||||
|  * | ||||
|  * The curl_multi_strerror function may be used to turn a CURLMcode value | ||||
|  * into the equivalent human readable error string.  This is useful | ||||
|  * for printing meaningful error messages. | ||||
|  * Returns: A pointer to a zero-terminated error message. | ||||
|  */ | ||||
| CURL_EXTERN const char *curl_multi_strerror(CURLMcode); | ||||
|  | ||||
| #ifdef HAVE_CURL_MULTI_SOCKET | ||||
| /* | ||||
|  * Name:    curl_multi_socket() and | ||||
|  *          curl_multi_socket_all() | ||||
|  * | ||||
|  * Desc:    An alternative version of curl_multi_perform() that allows the | ||||
|  *          application to pass in one of the file descriptors that have been | ||||
|  *          detected to have "action" on them and let libcurl perform. This | ||||
|  *          allows libcurl to not have to scan through all possible file | ||||
|  *          descriptors to check for this. The app is recommended to pass in | ||||
|  *          the 'easy' argument (or set it to CURL_EASY_NONE) to make libcurl | ||||
|  *          figure out the internal structure even faster and easier.  If the | ||||
|  *          easy argument is set to something else than CURL_EASY_NONE, the | ||||
|  *          's' (socket) argument will be ignored by libcurl. | ||||
|  * | ||||
|  *          It also informs the application about updates in the socket (file | ||||
|  *          descriptor) status by doing none, one or multiple calls to the | ||||
|  *          curl_socket_callback. It thus updates the status with changes | ||||
|  *          since the previous time this function was used. If 'callback' is | ||||
|  *          NULL, no callback will be called. A status change may also be a | ||||
|  *          new timeout only, having the same IN/OUT status as before. | ||||
|  * | ||||
|  *          If a previous wait for socket action(s) timed out, you should call | ||||
|  *          this function with the socket argument set to | ||||
|  *          CURL_SOCKET_TIMEOUT. If you want to force libcurl to (re-)check | ||||
|  *          all its internal sockets, and call the callback with status for | ||||
|  *          all sockets no matter what the previous state is, you call | ||||
|  *          curl_multi_socket_all() instead. | ||||
|  * | ||||
|  *          curl_multi_perform() is thus the equivalent of calling | ||||
|  *          curl_multi_socket_all(handle, NULL, NULL); | ||||
|  * | ||||
|  *          IMPLEMENTATION: libcurl will need an internal hash table to map | ||||
|  *          socket numbers to internal easy handles for the cases when 'easy' | ||||
|  *          is set to CURL_EASY_NONE. | ||||
|  * | ||||
|  *          Regarding the timeout argument in the callback: it is the timeout | ||||
|  *          (in milliseconds) for waiting on action on this socket (and the | ||||
|  *          given time period starts when the callback is called) until you | ||||
|  *          should call curl_multi_socket() with the timeout stuff mentioned | ||||
|  *          above. If "actions" happens on the socket before the timeout | ||||
|  *          happens, remember that the timout timer keeps ticking until told | ||||
|  *          otherwise. | ||||
|  * | ||||
|  *          The "what" argument has one of five values: | ||||
|  * | ||||
|  *            0 CURL_POLL_NONE (0)   - register, not interested in readiness | ||||
|  *            1 CURL_POLL_IN         - register, interested in read readiness | ||||
|  *            2 CURL_POLL_OUT        - register, interested in write readiness | ||||
|  *            3 CURL_POLL_INOUT      - register, interested in both | ||||
|  *            4 CURL_POLL_REMOVE     - deregister | ||||
|  */ | ||||
| #define CURL_POLL_NONE   0 | ||||
| #define CURL_POLL_IN     1 | ||||
| #define CURL_POLL_OUT    2 | ||||
| #define CURL_POLL_INOUT  3 | ||||
| #define CURL_POLL_REMOVE 4 | ||||
|  | ||||
| #define CURL_EASY_NONE (CURL *)0 | ||||
| #define CURL_EASY_TIMEOUT (CURL *)0 | ||||
| #define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD | ||||
|  | ||||
| typedef int (*curl_socket_callback)(CURL *easy,      /* easy handle */ | ||||
|                                     curl_socket_t s, /* socket */ | ||||
|                                     int what,        /* see above */ | ||||
|                                     long ms,         /* timeout for wait */ | ||||
|                                     void *userp);    /* "private" pointer */ | ||||
|  | ||||
| CURLMcode curl_multi_socket(CURLM *multi_handle, | ||||
|                             curl_socket_t s, | ||||
|                             CURL *easy, | ||||
|                             curl_socket_callback callback, | ||||
|                             void *userp); /* passed to callback */ | ||||
|  | ||||
| CURLMcode curl_multi_socket_all(CURLM *multi_handle, | ||||
|                                 curl_socket_callback callback, | ||||
|                                 void *userp); /* passed to callback */ | ||||
|  | ||||
| /* | ||||
|  * Name:    curl_multi_timeout() | ||||
|  * | ||||
|  * Desc:    Returns the maximum number of milliseconds the app is allowed to | ||||
|  *          wait before curl_multi_socket() or curl_multi_perform() must be | ||||
|  *          called (to allow libcurl's timed events to take place). | ||||
|  * | ||||
|  * Returns: CURLM error code. | ||||
|  */ | ||||
| CURLMcode curl_multi_timeout(CURLM *multi_handle, long *milliseconds); | ||||
|  | ||||
| #endif /* HAVE_CURL_MULTI_SOCKET */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } /* end of extern "C" */ | ||||
| #endif | ||||
|   | ||||
| @@ -13,15 +13,17 @@ NDKBASE	= c:/novell | ||||
| endif | ||||
|  | ||||
| # Edit the path below to point to the base of your Zlib sources. | ||||
| #ZLIB_PATH = ../../zlib-1.2.1 | ||||
| ifndef ZLIB_PATH | ||||
| ZLIB_PATH = ../../zlib-1.2.3 | ||||
| endif | ||||
|  | ||||
| # Edit the path below to point to the base of your OpenSSL package. | ||||
| ifndef OPENSSL_PATH | ||||
| OPENSSL_PATH = ../../openssl-0.9.7d | ||||
| OPENSSL_PATH = ../../openssl-0.9.8 | ||||
| endif | ||||
|  | ||||
| ifndef INSTDIR | ||||
| INSTDIR	= ../curl-$(LIBCURL_VERSION_STR)-bin-nw | ||||
| INSTDIR	= ..$(DS)curl-$(LIBCURL_VERSION_STR)-bin-nw | ||||
| endif | ||||
|  | ||||
| # Edit the vars below to change NLM target settings. | ||||
| @@ -103,8 +105,6 @@ else | ||||
| endif | ||||
| endif | ||||
|  | ||||
| LDLIBS	= | ||||
|  | ||||
| NDK_ROOT = $(NDKBASE)/ndk | ||||
| SDK_CLIB = $(NDK_ROOT)/nwsdk | ||||
| SDK_LIBC = $(NDK_ROOT)/libc | ||||
| @@ -114,21 +114,26 @@ INCLUDES = -I. -I../include | ||||
|  | ||||
| ifdef WITH_ARES | ||||
| 	INCLUDES += -I../ares | ||||
| 	LIBCARES = ../ares/libcares.lib | ||||
| 	LDLIBS = ../ares/libcares.lib | ||||
| endif | ||||
| ifdef ZLIB_PATH | ||||
| 	INCLUDES += -I$(ZLIB_PATH) | ||||
| 	IMPORTS = @$(ZLIB_PATH)/nw/zlib.imp | ||||
| 	MODULES = libz.nlm | ||||
| endif | ||||
| ifdef SSL | ||||
| ifdef WITH_SSL | ||||
| 	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 | ||||
|  | ||||
| ifeq ($(LIBARCH),LIBC) | ||||
| 	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 | ||||
| 	CFLAGS += -D_POSIX_SOURCE | ||||
| 	# CFLAGS += -D__ANSIC__ | ||||
| @@ -152,13 +157,16 @@ endif | ||||
|  | ||||
| ifeq ($(findstring linux,$(OSTYPE)),linux) | ||||
| DL	= ' | ||||
| DS	= / | ||||
| #-include $(NDKBASE)/nlmconv/ncpfs.inc | ||||
| else | ||||
| DS	= \\ | ||||
| endif | ||||
|  | ||||
| # Makefile.inc provides the CSOURCES and HHEADERS defines | ||||
| 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 | ||||
|  | ||||
| @@ -189,6 +197,9 @@ install: $(INSTDIR) all | ||||
| 	@$(CP) ../COPYING $(INSTDIR) | ||||
| 	@$(CP) ../README $(INSTDIR) | ||||
| 	@$(CP) ../RELEASE-NOTES $(INSTDIR) | ||||
| ifdef WITH_SSL | ||||
| 	@$(CP) ca-bundle.crt $(INSTDIR) | ||||
| endif | ||||
|  | ||||
| clean: | ||||
| 	-$(RM) config.h ca-bundle.h | ||||
| @@ -274,11 +285,8 @@ ifdef IMPORTS | ||||
| 	@echo $(DL)import $(IMPORTS)$(DL) >> $@ | ||||
| endif | ||||
| ifeq ($(LD),nlmconv) | ||||
| ifdef WITH_ARES | ||||
| 	@echo $(DL)input $(LIBCARES)$(DL) >> $@ | ||||
| endif | ||||
| ifdef SSL | ||||
| 	@echo $(DL)input $(LIBSSL)$(DL) >> $@ | ||||
| ifdef LDLIBS | ||||
| 	@echo $(DL)input $(LDLIBS)$(DL) >> $@ | ||||
| endif | ||||
| 	@echo $(DL)input $(OBJL)$(DL) >> $@ | ||||
| 	@echo $(DL)input $(PRELUDE)$(DL) >> $@ | ||||
| @@ -336,7 +344,21 @@ config.h: Makefile.netware | ||||
| 	@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@ | ||||
| 	@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@ | ||||
| 	@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@ | ||||
| ifdef DISABLE_LDAP | ||||
| 	@echo $(DL)#define CURL_DISABLE_LDAP 1$(DL) >> $@ | ||||
| else | ||||
| 	@echo $(DL)#define DL_LDAP_FILE "lldapsdk.nlm"$(DL) >> $@ | ||||
| endif | ||||
| ifdef ENABLE_IPV6 | ||||
| 	@echo $(DL)#define ENABLE_IPV6 1$(DL) >> $@ | ||||
| endif | ||||
| ifdef NW_WINSOCK | ||||
| 	@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@ | ||||
| else | ||||
| @@ -348,11 +370,11 @@ endif | ||||
| ifdef WITH_ARES | ||||
| 	@echo $(DL)#define USE_ARES 1$(DL) >> $@ | ||||
| endif | ||||
| ifdef ZLIB_PATH | ||||
| ifdef WITH_ZLIB | ||||
| 	@echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@ | ||||
| endif | ||||
| ifdef SSL | ||||
| ifdef WITH_SSL | ||||
| 	@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define USE_OPENSSL 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@ | ||||
|   | ||||
| @@ -72,6 +72,7 @@ CCDEBUG    = cl.exe /MDd /Od /Gm /Zi /D_DEBUG /GZ | ||||
| CFLAGSSSL  = /DUSE_SSLEAY /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl" | ||||
| CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)" | ||||
| CFLAGS     = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL | ||||
| CFLAGSLIB  = /DCURL_STATICLIB | ||||
| LNKDLL     = link.exe /DLL | ||||
| LNKLIB     = link.exe /lib | ||||
| LFLAGS     = /nologo | ||||
| @@ -99,7 +100,7 @@ LFLAGS = $(LFLAGS) $(WINDOWS_SDK_PATH)\lib\secur32.lib | ||||
| TARGET = $(LIB_NAME).lib | ||||
| DIROBJ = $(CFG) | ||||
| LNK    = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC     = $(CCNODBG) | ||||
| CC     = $(CCNODBG) $(CFLAGSLIB) | ||||
| CFGSET = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -111,7 +112,7 @@ TARGET   = $(LIB_NAME).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(CFLAGSZLIB) | ||||
| CC       = $(CCNODBG) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -135,7 +136,7 @@ TARGET   = $(LIB_NAME).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||
| LNK      = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -160,7 +161,7 @@ DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB) | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -185,7 +186,7 @@ TARGET   = $(LIB_NAME).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(CFLAGSZLIB) | ||||
| CC       = $(CCNODBG) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -198,7 +199,7 @@ DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||
| LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB) | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -236,7 +237,7 @@ RESOURCE = $(DIROBJ)\libcurl.res | ||||
| TARGET = $(LIB_NAME_DEBUG).lib | ||||
| DIROBJ = $(CFG) | ||||
| LNK    = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC     = $(CCDEBUG) | ||||
| CC     = $(CCDEBUG) $(CFLAGSLIB) | ||||
| CFGSET = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -248,7 +249,7 @@ TARGET   = $(LIB_NAME_DEBUG).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||
| LNK      = $(LNKLIB) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -260,7 +261,7 @@ TARGET   = $(LIB_NAME_DEBUG).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(CFLAGSZLIB) | ||||
| CC       = $(CCDEBUG) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -272,7 +273,7 @@ TARGET   = $(LIB_NAME_DEBUG).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll | ||||
| LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -285,7 +286,7 @@ DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||
| LNK      = $(LNKLIB) $(SSLLIBS) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB) | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -297,7 +298,7 @@ TARGET   = $(LIB_NAME_DEBUG).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(CFLAGSZLIB) | ||||
| CC       = $(CCDEBUG) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -310,7 +311,7 @@ DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||
| LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB) | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
|   | ||||
| @@ -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,17 +22,25 @@ | ||||
|  ***************************************************************************/ | ||||
|  | ||||
| #include "amigaos.h" | ||||
| #include <stdio.h> /* for stderr */ | ||||
| #include <amitcp/socketbasetags.h> | ||||
|  | ||||
| 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() | ||||
| { | ||||
|   if(SocketBase) | ||||
| 	if(SocketBase) { | ||||
| 		CloseLibrary(SocketBase); | ||||
|  | ||||
| 		SocketBase = NULL; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| BOOL amiga_init() | ||||
| { | ||||
| @@ -40,10 +48,27 @@ BOOL amiga_init() | ||||
| 		SocketBase = OpenLibrary("bsdsocket.library", 4); | ||||
| 	 | ||||
| 	if(!SocketBase) { | ||||
|     fprintf(stderr, "No TCP/IP Stack running!\n\a"); | ||||
| 		__request("No TCP/IP Stack running!"); | ||||
| 		return FALSE; | ||||
| 	} | ||||
| 	 | ||||
| 	if(SocketBaseTags( | ||||
| 		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/dos.h> | ||||
|  | ||||
| #include <bsdsocket.h> | ||||
| #include <sys/socket.h> | ||||
|  | ||||
| #include "config-amigaos.h" | ||||
|  | ||||
| #ifndef select | ||||
| # define select(args...) WaitSelect( args, NULL) | ||||
| #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 | ||||
|  | ||||
| extern void amiga_cleanup(); | ||||
|   | ||||
| @@ -54,6 +54,7 @@ | ||||
| #define HAVE_UTIME_H 1 | ||||
| #define HAVE_WRITABLE_ARGV 1 | ||||
| #define HAVE_ZLIB_H 1 | ||||
| #define HAVE_SYS_IOCTL_H 1 | ||||
|  | ||||
| #define USE_OPENSSL 1 | ||||
| #define USE_SSLEAY 1 | ||||
| @@ -80,7 +81,9 @@ | ||||
| #define TIME_WITH_SYS_TIME 1 | ||||
|  | ||||
| #define in_addr_t int | ||||
| #ifndef socklen_t | ||||
| # define socklen_t int | ||||
| #endif | ||||
|  | ||||
| #ifndef O_RDONLY | ||||
| # define O_RDONLY 0x0000 | ||||
|   | ||||
| @@ -235,6 +235,10 @@ | ||||
| /* lber dynamic library file */ | ||||
| /* #undef DL_LBER_FILE */ | ||||
|  | ||||
| /* Defines set for VS2005 to _not_ deprecate a few functions we use. */ | ||||
| #define _CRT_SECURE_NO_DEPRECATE | ||||
| #define _CRT_NONSTDC_NO_DEPRECATE | ||||
|  | ||||
| /* ldap dynamic library file */ | ||||
| #define DL_LDAP_FILE "wldap32.dll" | ||||
|  | ||||
|   | ||||
| @@ -15,6 +15,7 @@ | ||||
| #define HAVE_BASENAME          1 | ||||
| #define HAVE_CLOSESOCKET       1 | ||||
| #define HAVE_FCNTL_H           1 | ||||
| #define HAVE_FIONBIO           1 | ||||
| #define HAVE_GETHOSTBYADDR     1 | ||||
| #define HAVE_GETHOSTNAME       1 | ||||
| #define HAVE_GETPASS           1 | ||||
| @@ -104,7 +105,10 @@ | ||||
|  | ||||
| #define in_addr_t  u_long | ||||
| #define socklen_t  int | ||||
|  | ||||
| #if __GNUC__ < 4   /* gcc 4.x built-in ? */ | ||||
| #define ssize_t    int | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|   | ||||
| @@ -133,6 +133,7 @@ int Curl_nonblock(curl_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; | ||||
| @@ -142,46 +143,52 @@ int Curl_nonblock(curl_socket_t sockfd,    /* operate on this */ | ||||
|     return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); | ||||
|   else | ||||
|     return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); | ||||
| #undef SETBLOCK | ||||
| #define SETBLOCK 1 | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_FIONBIO | ||||
| #if defined(HAVE_FIONBIO) && (SETBLOCK == 0) | ||||
|   /* older unix versions */ | ||||
|   int flags; | ||||
|  | ||||
|   flags = nonblock; | ||||
|   return ioctl(sockfd, FIONBIO, &flags); | ||||
| #undef SETBLOCK | ||||
| #define SETBLOCK 2 | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_IOCTLSOCKET | ||||
| #if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0) | ||||
|   /* Windows? */ | ||||
|   unsigned long flags; | ||||
|   flags = nonblock; | ||||
|  | ||||
|   return ioctlsocket(sockfd, FIONBIO, &flags); | ||||
| #undef SETBLOCK | ||||
| #define SETBLOCK 3 | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_IOCTLSOCKET_CASE | ||||
| #if defined(HAVE_IOCTLSOCKET_CASE) && (SETBLOCK == 0) | ||||
|   /* presumably for Amiga */ | ||||
|   return IoctlSocket(sockfd, FIONBIO, (long)nonblock); | ||||
| #undef SETBLOCK | ||||
| #define SETBLOCK 4 | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_SO_NONBLOCK | ||||
| #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 | ||||
|  | ||||
| #ifndef SETBLOCK | ||||
| #if (SETBLOCK == 0) | ||||
| #error "no non-blocking method was found/used/set" | ||||
| #endif | ||||
| } | ||||
| @@ -345,19 +352,20 @@ static CURLcode bindlocal(struct connectdata *conn, | ||||
|  | ||||
|         if(!bindworked) { | ||||
|           data->state.os_errno = Curl_ourerrno(); | ||||
|           failf(data, "%s", Curl_strerror(conn, data->state.os_errno)); | ||||
|           failf(data, "bind failure: %s", | ||||
|                 Curl_strerror(conn, data->state.os_errno)); | ||||
|           return CURLE_HTTP_PORT_FAILED; | ||||
|         } | ||||
|  | ||||
|       } /* end of if  h */ | ||||
|       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; | ||||
|       } | ||||
|     } /* end of inet_addr */ | ||||
|  | ||||
|     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; | ||||
|     } | ||||
|  | ||||
| @@ -645,14 +653,14 @@ singleipconnect(struct connectdata *conn, | ||||
|     CURLcode res = bindlocal(conn, sockfd); | ||||
|     if(res) { | ||||
|       sclose(sockfd); /* close socket and bail out */ | ||||
|       return res; | ||||
|       return CURL_SOCKET_BAD; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /* set socket non-blocking */ | ||||
|   Curl_nonblock(sockfd, TRUE); | ||||
|  | ||||
|   rc = connect(sockfd, ai->ai_addr, ai->ai_addrlen); | ||||
|   rc = connect(sockfd, ai->ai_addr, (socklen_t)ai->ai_addrlen); | ||||
|  | ||||
|   if(-1 == rc) { | ||||
|     error = Curl_ourerrno(); | ||||
|   | ||||
							
								
								
									
										118
									
								
								lib/cookie.c
									
									
									
									
									
								
							
							
						
						
									
										118
									
								
								lib/cookie.c
									
									
									
									
									
								
							| @@ -85,12 +85,17 @@ Example set of cookies: | ||||
| #include <stdlib.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 "cookie.h" | ||||
| #include "strequal.h" | ||||
| #include "strtok.h" | ||||
| #include "sendf.h" | ||||
| #include "memory.h" | ||||
| #include "share.h" | ||||
| #include "strtoofft.h" | ||||
|  | ||||
| /* The last #include file should be: */ | ||||
| #ifdef CURLDEBUG | ||||
| @@ -130,6 +135,27 @@ static bool tailmatch(const char *little, const char *bigone) | ||||
|   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() | ||||
| @@ -309,7 +335,7 @@ Curl_cookie_add(struct SessionHandle *data, | ||||
|               break; | ||||
|             } | ||||
|             co->expires = | ||||
|               atoi((*co->maxage=='\"')?&co->maxage[1]:&co->maxage[0]) + now; | ||||
|               atoi((*co->maxage=='\"')?&co->maxage[1]:&co->maxage[0]) + (long)now; | ||||
|           } | ||||
|           else if(strequal("expires", name)) { | ||||
|             co->expirestr=strdup(whatptr); | ||||
| @@ -470,7 +496,7 @@ Curl_cookie_add(struct SessionHandle *data, | ||||
|         co->secure = (bool)strequal(ptr, "TRUE"); | ||||
|         break; | ||||
|       case 4: | ||||
|         co->expires = atoi(ptr); | ||||
|         co->expires = curlx_strtoofft(ptr, NULL, 10); | ||||
|         break; | ||||
|       case 5: | ||||
|         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() | ||||
|  * | ||||
| @@ -847,6 +901,8 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere) | ||||
|   } | ||||
|  | ||||
|   if(c) { | ||||
|     char *format_ptr; | ||||
|  | ||||
|     fputs("# Netscape HTTP Cookie File\n" | ||||
|           "# http://www.netscape.com/newsref/std/cookie_spec.html\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; | ||||
|  | ||||
|     while(co) { | ||||
|       fprintf(out, | ||||
|               "%s%s\t" /* domain */ | ||||
|               "%s\t" /* tailmatch */ | ||||
|               "%s\t" /* path */ | ||||
|               "%s\t" /* secure */ | ||||
|               "%u\t" /* expires */ | ||||
|               "%s\t" /* name */ | ||||
|               "%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:""); | ||||
|  | ||||
|       format_ptr = get_netscape_format(co); | ||||
|       if (format_ptr == NULL) { | ||||
|         fprintf(out, "#\n# Fatal libcurl error\n"); | ||||
|         return 1; | ||||
|       } | ||||
|       fprintf(out, "%s\n", format_ptr); | ||||
|       free(format_ptr); | ||||
|       co=co->next; | ||||
|     } | ||||
|   } | ||||
| @@ -884,4 +927,35 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere) | ||||
|   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 */ | ||||
|   | ||||
							
								
								
									
										10
									
								
								lib/cookie.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								lib/cookie.h
									
									
									
									
									
								
							| @@ -38,7 +38,7 @@ struct Cookie { | ||||
|   char *value;       /* name = <this> */ | ||||
|   char *path;         /* path = <this> */ | ||||
|   char *domain;      /* domain = <this> */ | ||||
|   long expires;    /* expires = <this> */ | ||||
|   curl_off_t expires;  /* expires = <this> */ | ||||
|   char *expirestr;   /* the plain text version */ | ||||
|   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 *); | ||||
| 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 | ||||
|   | ||||
							
								
								
									
										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 | ||||
|  * easy handle. | ||||
|  */ | ||||
| typedef int (*func_T)(void); | ||||
|  | ||||
| CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...) | ||||
| { | ||||
|   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; | ||||
|   CURLcode ret=CURLE_FAILED_INIT; | ||||
|   CURLcode ret; | ||||
|  | ||||
|   if(!curl) | ||||
|     return CURLE_BAD_FUNCTION_ARGUMENT; | ||||
|  | ||||
|   va_start(arg, tag); | ||||
|  | ||||
|   /* PORTING NOTE: | ||||
|      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); | ||||
|   } | ||||
|   ret = Curl_setopt(data, tag, arg); | ||||
|  | ||||
|   va_end(arg); | ||||
|   return ret; | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -464,7 +464,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost, | ||||
|         return_value = CURL_FORMADD_OPTION_TWICE; | ||||
|       else | ||||
|         current_form->namelength = | ||||
|           array_state?(long)array_value:va_arg(params, long); | ||||
|           array_state?(long)array_value:(long)va_arg(params, long); | ||||
|       break; | ||||
|  | ||||
|       /* | ||||
| @@ -1550,7 +1550,7 @@ char *Curl_FormBoundary(void) | ||||
|   if(!retstring) | ||||
|     return NULL; /* failed */ | ||||
|  | ||||
|   srand(time(NULL)+randomizer++); /* seed */ | ||||
|   srand((unsigned int)time(NULL)+randomizer++); /* seed */ | ||||
|  | ||||
|   strcpy(retstring, "----------------------------"); | ||||
|  | ||||
|   | ||||
							
								
								
									
										128
									
								
								lib/ftp.c
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								lib/ftp.c
									
									
									
									
									
								
							| @@ -174,9 +174,13 @@ static bool isBadFtpString(const char *string) | ||||
|  * to us. This function will sit and wait here until the server has | ||||
|  * connected. | ||||
|  * | ||||
|  * If FTP-SSL is used and SSL is requested for the data connection, this | ||||
|  * function will do that transport layer handshake too. | ||||
|  * | ||||
|  */ | ||||
| static CURLcode AllowServerConnect(struct connectdata *conn) | ||||
| { | ||||
|   CURLcode result; | ||||
|   int timeout_ms; | ||||
|   struct SessionHandle *data = conn->data; | ||||
|   curl_socket_t sock = conn->sock[SECONDARYSOCKET]; | ||||
| @@ -209,12 +213,12 @@ static CURLcode AllowServerConnect(struct connectdata *conn) | ||||
|   default: | ||||
|     /* we have received data here */ | ||||
|     { | ||||
|       curl_socket_t s; | ||||
|       size_t size = sizeof(struct sockaddr_in); | ||||
|       curl_socket_t s = CURL_SOCKET_BAD; | ||||
|       socklen_t size = (socklen_t) sizeof(struct sockaddr_in); | ||||
|       struct sockaddr_in add; | ||||
|  | ||||
|       getsockname(sock, (struct sockaddr *) &add, (socklen_t *)&size); | ||||
|       s=accept(sock, (struct sockaddr *) &add, (socklen_t *)&size); | ||||
|       if(0 == getsockname(sock, (struct sockaddr *) &add, &size)) | ||||
|         s=accept(sock, (struct sockaddr *) &add, &size); | ||||
|  | ||||
|       sclose(sock); /* close the first socket */ | ||||
|  | ||||
| @@ -231,6 +235,17 @@ static CURLcode AllowServerConnect(struct connectdata *conn) | ||||
|     break; | ||||
|   } | ||||
|  | ||||
|   /* If PASV is used, this is is made elsewhere */ | ||||
|   if(conn->ssl[SECONDARYSOCKET].use) { | ||||
|     /* since we only have a plaintext TCP connection here, we must now | ||||
|        do the TLS stuff */ | ||||
|     infof(data, "Doing the SSL/TLS handshake on the data stream\n"); | ||||
|     /* BLOCKING */ | ||||
|     result = Curl_ssl_connect(conn, SECONDARYSOCKET); | ||||
|     if(result) | ||||
|       return result; | ||||
|   } | ||||
|  | ||||
|   return CURLE_OK; | ||||
| } | ||||
|  | ||||
| @@ -266,8 +281,8 @@ static CURLcode ftp_readresp(curl_socket_t sockfd, | ||||
|  | ||||
|   ptr=buf + ftp->nread_resp; | ||||
|  | ||||
|   perline= ptr-ftp->linestart_resp; /* number of bytes in the current line, | ||||
|                                        so far */ | ||||
|   perline= (int)(ptr-ftp->linestart_resp); /* number of bytes in the current | ||||
|                                               line, so far */ | ||||
|   keepon=TRUE; | ||||
|  | ||||
|   while((ftp->nread_resp<BUFSIZE) && (keepon && !result)) { | ||||
| @@ -777,9 +792,12 @@ static CURLcode ftp_state_use_port(struct connectdata *conn, | ||||
|   /****************************************************************** | ||||
|    * IPv6-specific section | ||||
|    */ | ||||
|  | ||||
|   struct addrinfo *res, *ai; | ||||
| #ifdef HAVE_STRUCT_SOCKADDR_STORAGE | ||||
|   struct sockaddr_storage ss; | ||||
| #else | ||||
|   char ss[256]; /* this should be big enough to fit a lot */ | ||||
| #endif | ||||
|   struct addrinfo *res, *ai; | ||||
|   socklen_t sslen; | ||||
|   char hbuf[NI_MAXHOST]; | ||||
|   struct sockaddr *sa=(struct sockaddr *)&ss; | ||||
| @@ -866,13 +884,13 @@ static CURLcode ftp_state_use_port(struct connectdata *conn, | ||||
|   } | ||||
|  | ||||
|   if (portsock == CURL_SOCKET_BAD) { | ||||
|     failf(data, "%s", Curl_strerror(conn,error)); | ||||
|     failf(data, "socket failure: %s", Curl_strerror(conn,error)); | ||||
|     return CURLE_FTP_PORT_FAILED; | ||||
|   } | ||||
|  | ||||
|   sslen = sizeof(ss); | ||||
|   if (getsockname(portsock, sa, &sslen) < 0) { | ||||
|     failf(data, "%s", Curl_strerror(conn,Curl_ourerrno())); | ||||
|     failf(data, "getsockname(): %s", Curl_strerror(conn,Curl_ourerrno())); | ||||
|     return CURLE_FTP_PORT_FAILED; | ||||
|   } | ||||
|  | ||||
| @@ -1107,7 +1125,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn, | ||||
|     } | ||||
|   } | ||||
|   else { | ||||
|     failf(data, "could't find IP address to use"); | ||||
|     failf(data, "couldn't find IP address to use"); | ||||
|     return CURLE_FTP_PORT_FAILED; | ||||
|   } | ||||
|  | ||||
| @@ -1667,8 +1685,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, | ||||
|  | ||||
|     /* BLOCKING */ | ||||
|     /* We want "seamless" FTP operations through HTTP proxy tunnel */ | ||||
|     result = Curl_ConnectHTTPProxyTunnel(conn, SECONDARYSOCKET, | ||||
|                                          newhost, newport); | ||||
|     result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, newhost, newport); | ||||
|     if(CURLE_OK != result) | ||||
|       return result; | ||||
|   } | ||||
| @@ -1739,7 +1756,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn, | ||||
|                  "%04d%02d%02d %02d:%02d:%02d GMT", | ||||
|                  year, month, day, hour, minute, second); | ||||
|         /* now, convert this into a time() value: */ | ||||
|         data->info.filetime = curl_getdate(buf, &secs); | ||||
|         data->info.filetime = (long)curl_getdate(buf, &secs); | ||||
|       } | ||||
|  | ||||
|       /* If we asked for a time of the file and we actually got one as well, | ||||
| @@ -1823,10 +1840,17 @@ static CURLcode ftp_state_type_resp(struct connectdata *conn, | ||||
|   CURLcode result = CURLE_OK; | ||||
|   struct SessionHandle *data=conn->data; | ||||
|  | ||||
|   if(ftpcode != 200) { | ||||
|   if(ftpcode/100 != 2) { | ||||
|     /* "sasserftpd" and "(u)r(x)bot ftpd" both responds with 226 after a | ||||
|        successful 'TYPE I'. While that is not as RFC959 says, it is still a | ||||
|        positive response code and we allow that. */ | ||||
|     failf(data, "Couldn't set desired mode"); | ||||
|     return CURLE_FTP_COULDNT_SET_BINARY; /* FIX */ | ||||
|   } | ||||
|   if(ftpcode != 200) | ||||
|     infof(data, "Got a %03d response code instead of the assumed 200\n", | ||||
|           ftpcode); | ||||
|  | ||||
|   if(instate == FTP_TYPE) | ||||
|     result = ftp_state_post_type(conn); | ||||
|   else if(instate == FTP_LIST_TYPE) | ||||
| @@ -2008,16 +2032,6 @@ static CURLcode ftp_state_stor_resp(struct connectdata *conn, | ||||
|       return result; | ||||
|   } | ||||
|  | ||||
|   if(conn->ssl[SECONDARYSOCKET].use) { | ||||
|     /* since we only have a plaintext TCP connection here, we must now | ||||
|        do the TLS stuff */ | ||||
|     infof(data, "Doing the SSL/TLS handshake on the data stream\n"); | ||||
|     /* BLOCKING */ | ||||
|     result = Curl_ssl_connect(conn, SECONDARYSOCKET); | ||||
|     if(result) | ||||
|       return result; | ||||
|   } | ||||
|  | ||||
|   *(ftp->bytecountp)=0; | ||||
|  | ||||
|   /* When we know we're uploading a specified file, we can get the file | ||||
| @@ -2086,7 +2100,7 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn, | ||||
|       char *bytes; | ||||
|       bytes=strstr(buf, " bytes"); | ||||
|       if(bytes--) { | ||||
|         long in=bytes-buf; | ||||
|         long in=(long)(bytes-buf); | ||||
|         /* this is a hint there is size information in there! ;-) */ | ||||
|         while(--in) { | ||||
|           /* scan for the left parenthesis and break there */ | ||||
| @@ -2117,15 +2131,6 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn, | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     if(conn->ssl[SECONDARYSOCKET].use) { | ||||
|       /* since we only have a plaintext TCP connection here, we must now | ||||
|          do the TLS stuff */ | ||||
|       infof(data, "Doing the SSL/TLS handshake on the data stream\n"); | ||||
|       result = Curl_ssl_connect(conn, SECONDARYSOCKET); | ||||
|       if(result) | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     if(size > conn->maxdownload && conn->maxdownload > 0) | ||||
|       size = conn->size = conn->maxdownload; | ||||
|  | ||||
| @@ -2148,7 +2153,7 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn, | ||||
|       state(conn, FTP_STOP); /* this phase is over */ | ||||
|     } | ||||
|     else { | ||||
|       failf(data, "%s", buf+4); | ||||
|       failf(data, "RETR response: %03d", ftpcode); | ||||
|       return CURLE_FTP_COULDNT_RETR_FILE; | ||||
|     } | ||||
|   } | ||||
| @@ -2160,11 +2165,9 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn, | ||||
| static CURLcode ftp_state_loggedin(struct connectdata *conn) | ||||
| { | ||||
|   CURLcode result = CURLE_OK; | ||||
|   struct SessionHandle *data = conn->data; | ||||
|   infof(data, "We have successfully logged in\n"); | ||||
|  | ||||
| #ifdef HAVE_KRB4 | ||||
|   if(data->set.krb4) { | ||||
|   if(conn->data->set.krb4) { | ||||
|     /* We are logged in, asked to use Kerberos. Set the requested | ||||
|      * protection level | ||||
|      */ | ||||
| @@ -2276,7 +2279,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) | ||||
|   static const char * const ftpauth[]  = { | ||||
|     "SSL", "TLS" | ||||
|   }; | ||||
|   size_t nread; | ||||
|   size_t nread = 0; | ||||
|  | ||||
|   if(ftp->sendleft) { | ||||
|     /* we have a piece of a command still left to send */ | ||||
| @@ -2487,7 +2490,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) | ||||
|         } | ||||
|       } | ||||
|       state(conn, FTP_STOP); /* we are done with the CONNECT phase! */ | ||||
|       infof(data, "protocol connect phase DONE\n"); | ||||
|       DEBUGF(infof(data, "protocol connect phase DONE\n")); | ||||
|       break; | ||||
|  | ||||
|     case FTP_QUOTE: | ||||
| @@ -2677,7 +2680,7 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn) | ||||
|  | ||||
|     rc = Curl_select(ftp->sendleft?CURL_SOCKET_BAD:sock, /* reading */ | ||||
|                      ftp->sendleft?sock:CURL_SOCKET_BAD, /* writing */ | ||||
|                      timeout_ms); | ||||
|                      (int)timeout_ms); | ||||
|  | ||||
|     if(rc == -1) { | ||||
|       failf(data, "select error"); | ||||
| @@ -2737,7 +2740,7 @@ CURLcode Curl_ftp_connect(struct connectdata *conn, | ||||
|   if (conn->bits.tunnel_proxy) { | ||||
|     /* BLOCKING */ | ||||
|     /* We want "seamless" FTP operations through HTTP proxy tunnel */ | ||||
|     result = Curl_ConnectHTTPProxyTunnel(conn, FIRSTSOCKET, | ||||
|     result = Curl_proxyCONNECT(conn, FIRSTSOCKET, | ||||
|                                conn->host.name, conn->remote_port); | ||||
|     if(CURLE_OK != result) | ||||
|       return result; | ||||
| @@ -3026,7 +3029,6 @@ static CURLcode ftp_range(struct connectdata *conn) | ||||
|   curl_off_t totalsize=-1; | ||||
|   char *ptr; | ||||
|   char *ptr2; | ||||
|   struct SessionHandle *data = conn->data; | ||||
|   struct FTP *ftp = conn->proto.ftp; | ||||
|  | ||||
|   if(conn->bits.use_range && conn->range) { | ||||
| @@ -3041,26 +3043,29 @@ static CURLcode ftp_range(struct connectdata *conn) | ||||
|     if((-1 == to) && (from>=0)) { | ||||
|       /* X - */ | ||||
|       conn->resume_from = from; | ||||
|       infof(data, "FTP RANGE %" FORMAT_OFF_T " to end of file\n", from); | ||||
|       DEBUGF(infof(conn->data, "FTP RANGE %" FORMAT_OFF_T " to end of file\n", | ||||
|                    from)); | ||||
|     } | ||||
|     else if(from < 0) { | ||||
|       /* -Y */ | ||||
|       totalsize = -from; | ||||
|       conn->maxdownload = -from; | ||||
|       conn->resume_from = from; | ||||
|       infof(data, "FTP RANGE the last %" FORMAT_OFF_T " bytes\n", totalsize); | ||||
|       DEBUGF(infof(conn->data, "FTP RANGE the last %" FORMAT_OFF_T " bytes\n", | ||||
|                    totalsize)); | ||||
|     } | ||||
|     else { | ||||
|       /* X-Y */ | ||||
|       totalsize = to-from; | ||||
|       conn->maxdownload = totalsize+1; /* include the last mentioned byte */ | ||||
|       conn->resume_from = from; | ||||
|       infof(data, "FTP RANGE from %" FORMAT_OFF_T | ||||
|             " getting %" FORMAT_OFF_T " bytes\n", from, conn->maxdownload); | ||||
|       DEBUGF(infof(conn->data, "FTP RANGE from %" FORMAT_OFF_T | ||||
|                    " getting %" FORMAT_OFF_T " bytes\n", | ||||
|                    from, conn->maxdownload)); | ||||
|     } | ||||
|     infof(data, "range-download from %" FORMAT_OFF_T | ||||
|     DEBUGF(infof(conn->data, "range-download from %" FORMAT_OFF_T | ||||
|                  " to %" FORMAT_OFF_T ", totally %" FORMAT_OFF_T " bytes\n", | ||||
|           from, to, conn->maxdownload); | ||||
|                  from, to, conn->maxdownload)); | ||||
|     ftp->dont_check = TRUE; /* dont check for successful transfer */ | ||||
|   } | ||||
|   return CURLE_OK; | ||||
| @@ -3082,11 +3087,23 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn) | ||||
|   /* the ftp struct is inited in Curl_ftp_connect() */ | ||||
|   struct FTP *ftp = conn->proto.ftp; | ||||
|  | ||||
|   infof(data, "DO-MORE phase starts\n"); | ||||
|   DEBUGF(infof(data, "DO-MORE phase starts\n")); | ||||
|  | ||||
|   if(!ftp->no_transfer && !conn->bits.no_body) { | ||||
|     /* a transfer is about to take place */ | ||||
|  | ||||
|     if(conn->ssl[SECONDARYSOCKET].use && | ||||
|        !data->set.ftp_use_port) { | ||||
|       /* PASV is used and we just got the data connection connected, then | ||||
|          it is time to handshake the secure stuff. */ | ||||
|  | ||||
|       infof(data, "Doing the SSL/TLS handshake on the data stream\n"); | ||||
|       /* BLOCKING */ | ||||
|       result = Curl_ssl_connect(conn, SECONDARYSOCKET); | ||||
|       if(result) | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     if(data->set.upload) { | ||||
|       NBFTPSENDF(conn, "TYPE %c", data->set.ftp_ascii?'A':'I'); | ||||
|       state(conn, FTP_STOR_TYPE); | ||||
| @@ -3119,7 +3136,7 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn) | ||||
|     result=Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL); | ||||
|  | ||||
|   /* end of transfer */ | ||||
|   infof(data, "DO-MORE phase ends\n"); | ||||
|   DEBUGF(infof(data, "DO-MORE phase ends\n")); | ||||
|  | ||||
|   return result; | ||||
| } | ||||
| @@ -3141,9 +3158,8 @@ CURLcode ftp_perform(struct connectdata *conn, | ||||
| { | ||||
|   /* this is FTP and no proxy */ | ||||
|   CURLcode result=CURLE_OK; | ||||
|   struct SessionHandle *data=conn->data; | ||||
|  | ||||
|   infof(data, "DO phase starts\n"); | ||||
|   DEBUGF(infof(conn->data, "DO phase starts\n")); | ||||
|  | ||||
|   *dophase_done = FALSE; /* not done yet */ | ||||
|  | ||||
| @@ -3162,7 +3178,7 @@ CURLcode ftp_perform(struct connectdata *conn, | ||||
|   *connected = conn->bits.tcpconnect; | ||||
|  | ||||
|   if(*dophase_done) | ||||
|     infof(data, "DO phase is comlete\n"); | ||||
|     DEBUGF(infof(conn->data, "DO phase is complete\n")); | ||||
|  | ||||
|   return result; | ||||
| } | ||||
| @@ -3819,7 +3835,7 @@ CURLcode Curl_ftp_doing(struct connectdata *conn, | ||||
|   if(*dophase_done) { | ||||
|     result = ftp_dophase_done(conn, FALSE /* not connected */); | ||||
|  | ||||
|     infof(conn->data, "DO phase is comlete\n"); | ||||
|     DEBUGF(infof(conn->data, "DO phase is complete\n")); | ||||
|   } | ||||
|   return result; | ||||
| } | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -184,6 +184,9 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...) | ||||
|   case CURLINFO_SSL_ENGINES: | ||||
|     *param_slistp = Curl_ssl_engines_list(data); | ||||
|     break; | ||||
|   case CURLINFO_COOKIELIST: | ||||
|     *param_slistp = Curl_cookie_list(data); | ||||
|     break; | ||||
|   default: | ||||
|     return CURLE_BAD_FUNCTION_ARGUMENT; | ||||
|   } | ||||
|   | ||||
							
								
								
									
										15
									
								
								lib/gtls.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								lib/gtls.c
									
									
									
									
									
								
							| @@ -151,13 +151,18 @@ Curl_gtls_connect(struct connectdata *conn, | ||||
|  | ||||
|   if(data->set.ssl.CAfile) { | ||||
|     /* set the trusted CA cert bundle file */ | ||||
|     gnutls_certificate_set_verify_flags(conn->ssl[sockindex].cred, | ||||
|                                         GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT); | ||||
|  | ||||
|     rc = gnutls_certificate_set_x509_trust_file(conn->ssl[sockindex].cred, | ||||
|                                                 data->set.ssl.CAfile, | ||||
|                                                 GNUTLS_X509_FMT_PEM); | ||||
|     if(rc < 0) { | ||||
|     if(rc < 0) | ||||
|       infof(data, "error reading ca cert file %s (%s)\n", | ||||
|             data->set.ssl.CAfile, gnutls_strerror(rc)); | ||||
|     } | ||||
|     else | ||||
|       infof(data, "found %d certificates in %s\n", | ||||
|             rc, data->set.ssl.CAfile); | ||||
|   } | ||||
|  | ||||
|   /* Initialize TLS session as a client */ | ||||
| @@ -308,9 +313,13 @@ Curl_gtls_connect(struct connectdata *conn, | ||||
|   size=sizeof(certbuf); | ||||
|   rc = gnutls_x509_crt_get_dn_by_oid(x509_cert, GNUTLS_OID_X520_COMMON_NAME, | ||||
|                                      0, /* the first and only one */ | ||||
|                                      TRUE, /* give to me raw please */ | ||||
|                                      FALSE, | ||||
|                                      certbuf, | ||||
|                                      &size); | ||||
|   if(rc) { | ||||
|     infof(data, "error fetching CN from cert:%s\n", | ||||
|           gnutls_strerror(rc)); | ||||
|   } | ||||
|  | ||||
|   /* This function will check if the given certificate's subject matches the | ||||
|      given hostname. This is a basic implementation of the matching described | ||||
|   | ||||
| @@ -26,8 +26,6 @@ | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #define _REENTRANT | ||||
|  | ||||
| #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) | ||||
| #include <malloc.h> | ||||
| #else | ||||
|   | ||||
| @@ -26,8 +26,6 @@ | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #define _REENTRANT | ||||
|  | ||||
| #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) | ||||
| #include <malloc.h> | ||||
| #else | ||||
|   | ||||
| @@ -26,8 +26,6 @@ | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #define _REENTRANT | ||||
|  | ||||
| #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) | ||||
| #include <malloc.h> | ||||
| #else | ||||
|   | ||||
| @@ -26,8 +26,6 @@ | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #define _REENTRANT | ||||
|  | ||||
| #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) | ||||
| #include <malloc.h> | ||||
| #else | ||||
| @@ -174,9 +172,8 @@ Curl_addrinfo *Curl_ip2addr(in_addr_t num, char *hostname, int port) | ||||
| /* | ||||
|  * Curl_getaddrinfo() - the ipv4 synchronous version. | ||||
|  * | ||||
|  * The original code to this function was once stolen from the Dancer source | ||||
|  * code, written by Bjorn Reese, it has since been patched and modified | ||||
|  * considerably. | ||||
|  * The original code to this function was from the Dancer source code, written | ||||
|  * by Bjorn Reese, it has since been patched and modified considerably. | ||||
|  * | ||||
|  * gethostbyname_r() is the thread-safe version of the gethostbyname() | ||||
|  * function. When we build for plain IPv4, we attempt to use this | ||||
|   | ||||
| @@ -26,8 +26,6 @@ | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #define _REENTRANT | ||||
|  | ||||
| #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) | ||||
| #include <malloc.h> | ||||
| #else | ||||
|   | ||||
| @@ -26,8 +26,6 @@ | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #define _REENTRANT | ||||
|  | ||||
| #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) | ||||
| #include <malloc.h> | ||||
| #else | ||||
|   | ||||
							
								
								
									
										233
									
								
								lib/hostthre.c
									
									
									
									
									
								
							
							
						
						
									
										233
									
								
								lib/hostthre.c
									
									
									
									
									
								
							| @@ -26,8 +26,6 @@ | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #define _REENTRANT | ||||
|  | ||||
| #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) | ||||
| #include <malloc.h> | ||||
| #else | ||||
| @@ -159,11 +157,119 @@ struct thread_data { | ||||
|   FILE *stderr_file; | ||||
|   HANDLE mutex_waiting;  /* marks that we are still waiting for a resolve */ | ||||
|   HANDLE event_resolved; /* marks that the thread obtained the information */ | ||||
|   HANDLE event_thread_started; /* marks that the thread has initialized and | ||||
|                                   started */ | ||||
|   HANDLE mutex_terminate; /* serializes access to flag_terminate */ | ||||
|   HANDLE event_terminate; /* flag for thread to terminate instead of calling | ||||
|                              callbacks */ | ||||
| #ifdef CURLRES_IPV6 | ||||
|   struct addrinfo hints; | ||||
| #endif | ||||
| }; | ||||
|  | ||||
| /* Data for synchronization between resolver thread and its parent */ | ||||
| struct thread_sync_data { | ||||
|   HANDLE mutex_waiting;   /* thread_data.mutex_waiting duplicate */ | ||||
|   HANDLE mutex_terminate; /* thread_data.mutex_terminate duplicate */ | ||||
|   HANDLE event_terminate; /* thread_data.event_terminate duplicate */ | ||||
|   char * hostname;        /* hostname to resolve, Curl_async.hostname | ||||
|                              duplicate */ | ||||
| }; | ||||
|  | ||||
| /* Destroy resolver thread synchronization data */ | ||||
| void destroy_thread_sync_data(struct thread_sync_data * tsd) | ||||
| { | ||||
|   if (tsd->hostname) { | ||||
|     free(tsd->hostname); | ||||
|     tsd->hostname = NULL; | ||||
|   } | ||||
|   if (tsd->event_terminate) { | ||||
|     CloseHandle(tsd->event_terminate); | ||||
|     tsd->event_terminate = NULL; | ||||
|   } | ||||
|   if (tsd->mutex_terminate) { | ||||
|     CloseHandle(tsd->mutex_terminate); | ||||
|     tsd->mutex_terminate = NULL; | ||||
|   } | ||||
|   if (tsd->mutex_waiting) { | ||||
|     CloseHandle(tsd->mutex_waiting); | ||||
|     tsd->mutex_waiting = NULL; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /* Initialize resolver thread synchronization data */ | ||||
| BOOL init_thread_sync_data(struct thread_data * td, | ||||
|                            char * hostname, | ||||
|                            struct thread_sync_data * tsd) | ||||
| { | ||||
|   HANDLE curr_proc = GetCurrentProcess(); | ||||
|  | ||||
|   memset(tsd, 0, sizeof(tsd)); | ||||
|   if (!DuplicateHandle(curr_proc, td->mutex_waiting, | ||||
|                        curr_proc, &tsd->mutex_waiting, 0, FALSE, | ||||
|                        DUPLICATE_SAME_ACCESS)) { | ||||
|     /* failed to duplicate the mutex, no point in continuing */ | ||||
|     destroy_thread_sync_data(tsd); | ||||
|     return FALSE; | ||||
|   } | ||||
|   if (!DuplicateHandle(curr_proc, td->mutex_terminate, | ||||
|                        curr_proc, &tsd->mutex_terminate, 0, FALSE, | ||||
|                        DUPLICATE_SAME_ACCESS)) { | ||||
|     /* failed to duplicate the mutex, no point in continuing */ | ||||
|     destroy_thread_sync_data(tsd); | ||||
|     return FALSE; | ||||
|   } | ||||
|   if (!DuplicateHandle(curr_proc, td->event_terminate, | ||||
|                        curr_proc, &tsd->event_terminate, 0, FALSE, | ||||
|                        DUPLICATE_SAME_ACCESS)) { | ||||
|     /* failed to duplicate the event, no point in continuing */ | ||||
|     destroy_thread_sync_data(tsd); | ||||
|     return FALSE; | ||||
|   } | ||||
|   /* Copying hostname string because original can be destroyed by parent | ||||
|    * thread during gethostbyname execution. | ||||
|    */ | ||||
|   tsd->hostname = strdup(hostname); | ||||
|   if (!tsd->hostname) { | ||||
|     /* Memory allocation failed */ | ||||
|     destroy_thread_sync_data(tsd); | ||||
|     return FALSE; | ||||
|   } | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| /* acquire resolver thread synchronization */ | ||||
| BOOL acquire_thread_sync(struct thread_sync_data * tsd) | ||||
| { | ||||
|   /* is the thread initiator still waiting for us ? */ | ||||
|   if (WaitForSingleObject(tsd->mutex_waiting, 0) == WAIT_TIMEOUT) { | ||||
|     /* yes, it is */ | ||||
|  | ||||
|     /* Waiting access to event_terminate */ | ||||
|     if (WaitForSingleObject(tsd->mutex_terminate, INFINITE) != WAIT_OBJECT_0) { | ||||
|       /* Something went wrong - now just ignoring */ | ||||
|     } | ||||
|     else { | ||||
|       if (WaitForSingleObject(tsd->event_terminate, 0) != WAIT_TIMEOUT) { | ||||
|         /* Parent thread signaled us to terminate. | ||||
|          * This means that all data in conn->async is now destroyed | ||||
|          * and we cannot use it. | ||||
|          */ | ||||
|       } | ||||
|       else { | ||||
|         return TRUE; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| /* release resolver thread synchronization */ | ||||
| void release_thread_sync(struct thread_sync_data * tsd) | ||||
| { | ||||
|   ReleaseMutex(tsd->mutex_terminate); | ||||
| } | ||||
|  | ||||
| #if defined(CURLRES_IPV4) | ||||
| /* | ||||
|  * gethostbyname_thread() resolves a name, calls the Curl_addrinfo4_callback | ||||
| @@ -179,17 +285,13 @@ static unsigned __stdcall gethostbyname_thread (void *arg) | ||||
|   struct hostent *he; | ||||
|   int    rc = 0; | ||||
|  | ||||
|   /* Duplicate the passed mutex handle. | ||||
|   /* Duplicate the passed mutex and event handles. | ||||
|    * This allows us to use it even after the container gets destroyed | ||||
|    * due to a resolver timeout. | ||||
|    */ | ||||
|   HANDLE mutex_waiting = NULL; | ||||
|   HANDLE curr_proc = GetCurrentProcess(); | ||||
|  | ||||
|   if (!DuplicateHandle(curr_proc, td->mutex_waiting, | ||||
|                        curr_proc, &mutex_waiting, 0, FALSE, | ||||
|                        DUPLICATE_SAME_ACCESS)) { | ||||
|     /* failed to duplicate the mutex, no point in continuing */ | ||||
|   struct thread_sync_data tsd = {0}; | ||||
|   if (!init_thread_sync_data(td, conn->async.hostname, &tsd)) { | ||||
|     /* thread synchronization data initialization failed */ | ||||
|     return -1; | ||||
|   } | ||||
|  | ||||
| @@ -202,17 +304,18 @@ static unsigned __stdcall gethostbyname_thread (void *arg) | ||||
| #endif | ||||
|  | ||||
|   WSASetLastError (conn->async.status = NO_DATA); /* pending status */ | ||||
|   he = gethostbyname (conn->async.hostname); | ||||
|  | ||||
|   /* is the thread initiator still waiting for us ? */ | ||||
|   if (WaitForSingleObject(mutex_waiting, 0) == WAIT_TIMEOUT) { | ||||
|     /* yes, it is */ | ||||
|   /* Signaling that we have initialized all copies of data and handles we | ||||
|      need */ | ||||
|   SetEvent(td->event_thread_started); | ||||
|  | ||||
|     /* Mark that we have obtained the information, and that we are | ||||
|      * calling back with it. | ||||
|      */ | ||||
|   he = gethostbyname (tsd.hostname); | ||||
|  | ||||
|   /* is parent thread waiting for us and are we able to access conn members? */ | ||||
|   if (acquire_thread_sync(&tsd)) { | ||||
|     /* Mark that we have obtained the information, and that we are calling | ||||
|      * back with it. */ | ||||
|     SetEvent(td->event_resolved); | ||||
|  | ||||
|     if (he) { | ||||
|       rc = Curl_addrinfo4_callback(conn, CURL_ASYNC_SUCCESS, he); | ||||
|     } | ||||
| @@ -221,10 +324,11 @@ static unsigned __stdcall gethostbyname_thread (void *arg) | ||||
|     } | ||||
|     TRACE(("Winsock-error %d, addr %s\n", conn->async.status, | ||||
|            he ? inet_ntoa(*(struct in_addr*)he->h_addr) : "unknown")); | ||||
|     release_thread_sync(&tsd); | ||||
|   } | ||||
|  | ||||
|   /* clean up */ | ||||
|   CloseHandle(mutex_waiting); | ||||
|   destroy_thread_sync_data(&tsd); | ||||
|  | ||||
|   return (rc); | ||||
|   /* An implicit _endthreadex() here */ | ||||
| @@ -246,18 +350,15 @@ static unsigned __stdcall getaddrinfo_thread (void *arg) | ||||
|   struct addrinfo    *res; | ||||
|   char   service [NI_MAXSERV]; | ||||
|   int    rc; | ||||
|   struct addrinfo hints = td->hints; | ||||
|  | ||||
|   /* Duplicate the passed mutex handle. | ||||
|    * This allows us to use it even after the container gets destroyed | ||||
|    * due to a resolver timeout. | ||||
|    */ | ||||
|   HANDLE mutex_waiting = NULL; | ||||
|   HANDLE curr_proc = GetCurrentProcess(); | ||||
|  | ||||
|   if (!DuplicateHandle(curr_proc, td->mutex_waiting, | ||||
|                        curr_proc, &mutex_waiting, 0, FALSE, | ||||
|                        DUPLICATE_SAME_ACCESS)) { | ||||
|     /* failed to duplicate the mutex, no point in continuing */ | ||||
|   struct thread_sync_data tsd = {0}; | ||||
|   if (!init_thread_sync_data(td, conn->async.hostname, &tsd)) { | ||||
|     /* thread synchronization data initialization failed */ | ||||
|     return -1; | ||||
|   } | ||||
|  | ||||
| @@ -269,15 +370,16 @@ static unsigned __stdcall getaddrinfo_thread (void *arg) | ||||
|  | ||||
|   WSASetLastError(conn->async.status = NO_DATA); /* pending status */ | ||||
|  | ||||
|   rc = getaddrinfo(conn->async.hostname, service, &td->hints, &res); | ||||
|   /* Signaling that we have initialized all copies of data and handles we | ||||
|      need */ | ||||
|   SetEvent(td->event_thread_started); | ||||
|  | ||||
|   /* is the thread initiator still waiting for us ? */ | ||||
|   if (WaitForSingleObject(mutex_waiting, 0) == WAIT_TIMEOUT) { | ||||
|     /* yes, it is */ | ||||
|   rc = getaddrinfo(tsd.hostname, service, &hints, &res); | ||||
|  | ||||
|     /* Mark that we have obtained the information, and that we are | ||||
|      * calling back with it. | ||||
|      */ | ||||
|   /* is parent thread waiting for us and are we able to access conn members? */ | ||||
|   if (acquire_thread_sync(&tsd)) { | ||||
|     /* Mark that we have obtained the information, and that we are calling | ||||
|        back with it. */ | ||||
|     SetEvent(td->event_resolved); | ||||
|  | ||||
|     if (rc == 0) { | ||||
| @@ -290,10 +392,11 @@ static unsigned __stdcall getaddrinfo_thread (void *arg) | ||||
|       rc = Curl_addrinfo6_callback(conn, (int)WSAGetLastError(), NULL); | ||||
|       TRACE(("Winsock-error %d, no address\n", conn->async.status)); | ||||
|     } | ||||
|     release_thread_sync(&tsd); | ||||
|   } | ||||
|  | ||||
|   /* clean up */ | ||||
|   CloseHandle(mutex_waiting); | ||||
|   destroy_thread_sync_data(&tsd); | ||||
|  | ||||
|   return (rc); | ||||
|   /* An implicit _endthreadex() here */ | ||||
| @@ -301,7 +404,7 @@ static unsigned __stdcall getaddrinfo_thread (void *arg) | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Curl_destroy_thread_data() cleans up async resolver data. | ||||
|  * Curl_destroy_thread_data() cleans up async resolver data and thread handle. | ||||
|  * Complementary of ares_destroy. | ||||
|  */ | ||||
| void Curl_destroy_thread_data (struct Curl_async *async) | ||||
| @@ -313,6 +416,24 @@ void Curl_destroy_thread_data (struct Curl_async *async) | ||||
|     struct thread_data *td = (struct thread_data*) async->os_specific; | ||||
|     curl_socket_t sock = td->dummy_sock; | ||||
|  | ||||
|     if (td->mutex_terminate && td->event_terminate) { | ||||
|       /* Signaling resolver thread to terminate */ | ||||
|       if (WaitForSingleObject(td->mutex_terminate, INFINITE) == WAIT_OBJECT_0) { | ||||
|         SetEvent(td->event_terminate); | ||||
|         ReleaseMutex(td->mutex_terminate); | ||||
|       } | ||||
|       else { | ||||
|         /* Something went wrong - just ignoring it */ | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (td->mutex_terminate) | ||||
|       CloseHandle(td->mutex_terminate); | ||||
|     if (td->event_terminate) | ||||
|       CloseHandle(td->event_terminate); | ||||
|     if (td->event_thread_started) | ||||
|       CloseHandle(td->event_thread_started); | ||||
|  | ||||
|     if (sock != CURL_SOCKET_BAD) | ||||
|       sclose(sock); | ||||
|  | ||||
| @@ -323,6 +444,9 @@ void Curl_destroy_thread_data (struct Curl_async *async) | ||||
|     if (td->event_resolved) | ||||
|       CloseHandle(td->event_resolved); | ||||
|  | ||||
|     if (td->thread_hnd) | ||||
|       CloseHandle(td->thread_hnd); | ||||
|  | ||||
|     free(async->os_specific); | ||||
|   } | ||||
|   async->hostname = NULL; | ||||
| @@ -340,6 +464,7 @@ static bool init_resolve_thread (struct connectdata *conn, | ||||
|                                  const Curl_addrinfo *hints) | ||||
| { | ||||
|   struct thread_data *td = calloc(sizeof(*td), 1); | ||||
|   HANDLE thread_and_event[2] = {0}; | ||||
|  | ||||
|   if (!td) { | ||||
|     SetLastError(ENOMEM); | ||||
| @@ -380,6 +505,31 @@ static bool init_resolve_thread (struct connectdata *conn, | ||||
|     SetLastError(EAGAIN); | ||||
|     return FALSE; | ||||
|   } | ||||
|   /* Create the mutex used to serialize access to event_terminated | ||||
|    * between us and resolver thread. | ||||
|    */ | ||||
|   td->mutex_terminate = CreateMutex(NULL, FALSE, NULL); | ||||
|   if (td->mutex_terminate == NULL) { | ||||
|     Curl_destroy_thread_data(&conn->async); | ||||
|     SetLastError(EAGAIN); | ||||
|     return FALSE; | ||||
|   } | ||||
|   /* Create the event used to signal thread that it should terminate. | ||||
|    */ | ||||
|   td->event_terminate = CreateEvent(NULL, TRUE, FALSE, NULL); | ||||
|   if (td->event_terminate == NULL) { | ||||
|     Curl_destroy_thread_data(&conn->async); | ||||
|     SetLastError(EAGAIN); | ||||
|     return FALSE; | ||||
|   } | ||||
|   /* Create the event used by thread to inform it has initialized its own data. | ||||
|    */ | ||||
|   td->event_thread_started = CreateEvent(NULL, TRUE, FALSE, NULL); | ||||
|   if (td->event_thread_started == NULL) { | ||||
|     Curl_destroy_thread_data(&conn->async); | ||||
|     SetLastError(EAGAIN); | ||||
|     return FALSE; | ||||
|   } | ||||
|  | ||||
|   td->stderr_file = stderr; | ||||
|  | ||||
| @@ -405,6 +555,15 @@ static bool init_resolve_thread (struct connectdata *conn, | ||||
|      Curl_destroy_thread_data(&conn->async); | ||||
|      return FALSE; | ||||
|   } | ||||
|   /* Waiting until the thread will initialize its data or it will exit due errors. | ||||
|    */ | ||||
|   thread_and_event[0] = td->thread_hnd; | ||||
|   thread_and_event[1] = td->event_thread_started; | ||||
|   if (WaitForMultipleObjects(sizeof(thread_and_event) / sizeof(thread_and_event[0]), thread_and_event, FALSE, INFINITE) == WAIT_FAILED) { | ||||
|     /* The resolver thread has been created, | ||||
|      * most probably it works now - ignoring this "minor" error | ||||
|      */ | ||||
|   } | ||||
|   /* This socket is only to keep Curl_resolv_fdset() and select() happy; | ||||
|    * should never become signalled for read/write since it's unbound but | ||||
|    * Windows needs atleast 1 socket in select(). | ||||
| @@ -483,8 +642,6 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn, | ||||
|  | ||||
|   TRACE(("elapsed %lu ms\n", GetTickCount()-ticks)); | ||||
|  | ||||
|   CloseHandle(td->thread_hnd); | ||||
|  | ||||
|   if(entry) | ||||
|     *entry = conn->async.dns; | ||||
|  | ||||
| @@ -550,7 +707,7 @@ CURLcode Curl_resolv_fdset(struct connectdata *conn, | ||||
|  | ||||
|   if (td && td->dummy_sock != CURL_SOCKET_BAD) { | ||||
|     FD_SET(td->dummy_sock,write_fd_set); | ||||
|     *max_fdp = td->dummy_sock; | ||||
|     *max_fdp = (int)td->dummy_sock; | ||||
|   } | ||||
|   (void) read_fd_set; | ||||
|   return CURLE_OK; | ||||
|   | ||||
							
								
								
									
										257
									
								
								lib/http.c
									
									
									
									
									
								
							
							
						
						
									
										257
									
								
								lib/http.c
									
									
									
									
									
								
							| @@ -96,6 +96,7 @@ | ||||
| #include "memory.h" | ||||
| #include "select.h" | ||||
| #include "parsedate.h" /* for the week day and month names */ | ||||
| #include "strtoofft.h" | ||||
|  | ||||
| #define _MPRINTF_REPLACE /* use our functions only */ | ||||
| #include <curl/mprintf.h> | ||||
| @@ -465,6 +466,7 @@ Curl_http_output_auth(struct connectdata *conn, | ||||
|   /* To prevent the user+password to get sent to other than the original | ||||
|      host due to a location-follow, we do some weirdo checks here */ | ||||
|   if(!data->state.this_is_a_follow || | ||||
|      conn->bits.netrc || | ||||
|      !data->state.first_host || | ||||
|      curl_strequal(data->state.first_host, conn->host.name) || | ||||
|      data->set.http_disable_hostname_check_before_authentication) { | ||||
| @@ -810,6 +812,8 @@ struct send_buffer { | ||||
| }; | ||||
| typedef struct send_buffer send_buffer; | ||||
|  | ||||
| static CURLcode add_custom_headers(struct connectdata *conn, | ||||
|                                    send_buffer *req_buffer); | ||||
| static CURLcode | ||||
|  add_buffer(send_buffer *in, const void *inptr, size_t size); | ||||
|  | ||||
| @@ -884,10 +888,11 @@ CURLcode add_buffer_send(send_buffer *in, | ||||
|  | ||||
|     *bytes_written += amount; | ||||
|  | ||||
|     if(http) { | ||||
|       if((size_t)amount != size) { | ||||
|       /* The whole request could not be sent in one system call. We must queue | ||||
|          it up and send it later when we get the chance. We must not loop here | ||||
|          and wait until it might work again. */ | ||||
|         /* The whole request could not be sent in one system call. We must | ||||
|            queue it up and send it later when we get the chance. We must not | ||||
|            loop here and wait until it might work again. */ | ||||
|  | ||||
|         size -= amount; | ||||
|  | ||||
| @@ -913,6 +918,18 @@ CURLcode add_buffer_send(send_buffer *in, | ||||
|       http->sending = HTTPSEND_BODY; | ||||
|       /* the full buffer was sent, clean up and return */ | ||||
|     } | ||||
|     else { | ||||
|       if((size_t)amount != size) | ||||
|         /* We have no continue-send mechanism now, fail. This can only happen | ||||
|            when this function is used from the CONNECT sending function. We | ||||
|            currently (stupidly) assume that the whole request is always sent | ||||
|            away in the first single chunk. | ||||
|  | ||||
|            This needs FIXing. | ||||
|         */ | ||||
|         return CURLE_SEND_ERROR; | ||||
|     } | ||||
|   } | ||||
|   if(in->buffer) | ||||
|     free(in->buffer); | ||||
|   free(in); | ||||
| @@ -1037,12 +1054,17 @@ Curl_compareheader(char *headerline,    /* line to check */ | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * ConnectHTTPProxyTunnel() requires that we're connected to a HTTP proxy. This | ||||
|  * Curl_proxyCONNECT() requires that we're connected to a HTTP proxy. This | ||||
|  * function will issue the necessary commands to get a seamless tunnel through | ||||
|  * this proxy. After that, the socket can be used just as a normal socket. | ||||
|  * | ||||
|  * This badly needs to be rewritten. CONNECT should be sent and dealt with | ||||
|  * like any ordinary HTTP request, and not specially crafted like this. This | ||||
|  * function only remains here like this for now since the rewrite is a bit too | ||||
|  * much work to do at the moment. | ||||
|  */ | ||||
|  | ||||
| CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, | ||||
| CURLcode Curl_proxyCONNECT(struct connectdata *conn, | ||||
|                            int sockindex, | ||||
|                            char *hostname, | ||||
|                            int remote_port) | ||||
| @@ -1054,7 +1076,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, | ||||
|   int res; | ||||
|   size_t nread;   /* total size read */ | ||||
|   int perline; /* count bytes per line */ | ||||
|   bool keepon=TRUE; | ||||
|   int keepon=TRUE; | ||||
|   ssize_t gotbytes; | ||||
|   char *ptr; | ||||
|   long timeout = | ||||
| @@ -1062,6 +1084,8 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, | ||||
|   char *line_start; | ||||
|   char *host_port; | ||||
|   curl_socket_t tunnelsocket = conn->sock[sockindex]; | ||||
|   send_buffer *req_buffer; | ||||
|   curl_off_t cl=0; | ||||
|  | ||||
| #define SELECT_OK      0 | ||||
| #define SELECT_ERROR   1 | ||||
| @@ -1079,26 +1103,66 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, | ||||
|       conn->newurl = NULL; | ||||
|     } | ||||
|  | ||||
|     /* initialize a dynamic send-buffer */ | ||||
|     req_buffer = add_buffer_init(); | ||||
|  | ||||
|     if(!req_buffer) | ||||
|       return CURLE_OUT_OF_MEMORY; | ||||
|  | ||||
|     host_port = aprintf("%s:%d", hostname, remote_port); | ||||
|     if(!host_port) | ||||
|       return CURLE_OUT_OF_MEMORY; | ||||
|  | ||||
|     /* Setup the proxy-authorization header, if any */ | ||||
|     result = Curl_http_output_auth(conn, (char *)"CONNECT", host_port, TRUE); | ||||
|     if(CURLE_OK == result) { | ||||
|  | ||||
|       /* OK, now send the connect request to the proxy */ | ||||
|     if(CURLE_OK == result) { | ||||
|       char *host=(char *)""; | ||||
|       const char *proxyconn=""; | ||||
|       char *ptr; | ||||
|  | ||||
|       ptr = checkheaders(data, "Host:"); | ||||
|       if(!ptr) { | ||||
|         host = aprintf("Host: %s\r\n", host_port); | ||||
|         if(!host) | ||||
|           result = CURLE_OUT_OF_MEMORY; | ||||
|       } | ||||
|       ptr = checkheaders(data, "Proxy-Connection:"); | ||||
|       if(!ptr) | ||||
|         proxyconn = "Proxy-Connection: Keep-Alive\r\n"; | ||||
|  | ||||
|       if(CURLE_OK == result) { | ||||
|         /* Send the connect request to the proxy */ | ||||
|         /* BLOCKING */ | ||||
|         result = | ||||
|         Curl_sendf(tunnelsocket, conn, | ||||
|                    "CONNECT %s:%d HTTP/1.0\015\012" | ||||
|                    "%s" | ||||
|                    "%s" | ||||
|                    "\r\n", | ||||
|           add_bufferf(req_buffer, | ||||
|                       "CONNECT %s:%d HTTP/1.0\r\n" | ||||
|                       "%s"  /* Host: */ | ||||
|                       "%s"  /* Proxy-Authorization */ | ||||
|                       "%s"  /* User-Agent */ | ||||
|                       "%s", /* Proxy-Connection */ | ||||
|                       hostname, remote_port, | ||||
|                       host, | ||||
|                       conn->allocptr.proxyuserpwd? | ||||
|                       conn->allocptr.proxyuserpwd:"", | ||||
|                    data->set.useragent?conn->allocptr.uagent:"" | ||||
|                    ); | ||||
|                       data->set.useragent?conn->allocptr.uagent:"", | ||||
|                       proxyconn); | ||||
|  | ||||
|         if(CURLE_OK == result) | ||||
|           result = add_custom_headers(conn, req_buffer); | ||||
|  | ||||
|         if(host && *host) | ||||
|           free(host); | ||||
|  | ||||
|         if(CURLE_OK == result) | ||||
|           /* CRLF terminate the request */ | ||||
|           result = add_bufferf(req_buffer, "\r\n"); | ||||
|  | ||||
|         if(CURLE_OK == result) | ||||
|           /* Now send off the request */ | ||||
|           result = add_buffer_send(req_buffer, conn, | ||||
|                                    &data->info.request_size); | ||||
|       } | ||||
|       if(result) | ||||
|         failf(data, "Failed sending CONNECT to proxy"); | ||||
|     } | ||||
| @@ -1152,6 +1216,18 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, | ||||
|           int i; | ||||
|  | ||||
|           nread += gotbytes; | ||||
|  | ||||
|           if(keepon > TRUE) { | ||||
|             /* This means we are currently ignoring a response-body, so we | ||||
|                simply count down our counter and make sure to break out of the | ||||
|                loop when we're done! */ | ||||
|             cl -= gotbytes; | ||||
|             if(cl<=0) { | ||||
|               keepon = FALSE; | ||||
|               break; | ||||
|             } | ||||
|           } | ||||
|           else | ||||
|           for(i = 0; i < gotbytes; ptr++, i++) { | ||||
|             perline++; /* amount of bytes in this line so far */ | ||||
|             if(*ptr=='\n') { | ||||
| @@ -1179,6 +1255,20 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, | ||||
|               if(('\r' == line_start[0]) || | ||||
|                  ('\n' == line_start[0])) { | ||||
|                 /* end of response-headers from the proxy */ | ||||
|                 if(cl && (407 == k->httpcode) && !data->state.authproblem) { | ||||
|                   /* If we get a 407 response code with content length when we | ||||
|                    * have no auth problem, we must ignore the whole | ||||
|                    * response-body */ | ||||
|                   keepon = 2; | ||||
|                   infof(data, "Ignore %" FORMAT_OFF_T | ||||
|                         " bytes of response-body\n", cl); | ||||
|                   cl -= (gotbytes - i);/* remove the remaining chunk of what | ||||
|                                           we already read */ | ||||
|                   if(cl<=0) | ||||
|                     /* if the whole thing was already read, we are done! */ | ||||
|                     keepon=FALSE; | ||||
|                 } | ||||
|                 else | ||||
|                   keepon = FALSE; | ||||
|                 break; /* breaks out of for-loop, not switch() */ | ||||
|               } | ||||
| @@ -1194,6 +1284,10 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, | ||||
|                 if(result) | ||||
|                   return result; | ||||
|               } | ||||
|               else if(checkprefix("Content-Length:", line_start)) { | ||||
|                 cl = curlx_strtoofft(line_start + strlen("Content-Length:"), | ||||
|                                      NULL, 10); | ||||
|               } | ||||
|               else if(2 == sscanf(line_start, "HTTP/1.%d %d", | ||||
|                                   &subversion, | ||||
|                                   &k->httpcode)) { | ||||
| @@ -1260,7 +1354,7 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done) | ||||
|   if(conn->bits.tunnel_proxy) { | ||||
|  | ||||
|     /* either SSL over proxy, or explicitly asked for */ | ||||
|     result = Curl_ConnectHTTPProxyTunnel(conn, FIRSTSOCKET, | ||||
|     result = Curl_proxyCONNECT(conn, FIRSTSOCKET, | ||||
|                                conn->host.name, | ||||
|                                conn->remote_port); | ||||
|     if(CURLE_OK != result) | ||||
| @@ -1347,6 +1441,62 @@ CURLcode Curl_http_done(struct connectdata *conn, | ||||
|   return CURLE_OK; | ||||
| } | ||||
|  | ||||
| /* check and possibly add an Expect: header */ | ||||
| static CURLcode expect100(struct SessionHandle *data, | ||||
|                           send_buffer *req_buffer) | ||||
| { | ||||
|   CURLcode result = CURLE_OK; | ||||
|   if((data->set.httpversion != CURL_HTTP_VERSION_1_0) && | ||||
|      !checkheaders(data, "Expect:")) { | ||||
|     /* if not doing HTTP 1.0 or disabled explicitly, we add a Expect: | ||||
|        100-continue to the headers which actually speeds up post | ||||
|        operations (as there is one packet coming back from the web | ||||
|        server) */ | ||||
|     result = add_bufferf(req_buffer, | ||||
|                          "Expect: 100-continue\r\n"); | ||||
|     if(result == CURLE_OK) | ||||
|       data->set.expect100header = TRUE; | ||||
|   } | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| static CURLcode add_custom_headers(struct connectdata *conn, | ||||
|                                    send_buffer *req_buffer) | ||||
| { | ||||
|   CURLcode result = CURLE_OK; | ||||
|   char *ptr; | ||||
|   struct curl_slist *headers=conn->data->set.headers; | ||||
|  | ||||
|   while(headers) { | ||||
|     ptr = strchr(headers->data, ':'); | ||||
|     if(ptr) { | ||||
|       /* we require a colon for this to be a true header */ | ||||
|  | ||||
|       ptr++; /* pass the colon */ | ||||
|       while(*ptr && isspace((int)*ptr)) | ||||
|         ptr++; | ||||
|  | ||||
|       if(*ptr) { | ||||
|         /* only send this if the contents was non-blank */ | ||||
|  | ||||
|         if(conn->allocptr.host && | ||||
|            /* a Host: header was sent already, don't pass on any custom Host: | ||||
|               header as that will produce *two* in the same request! */ | ||||
|            curl_strnequal("Host:", headers->data, 5)) | ||||
|           ; | ||||
|         else { | ||||
|  | ||||
|           result = add_bufferf(req_buffer, "%s\r\n", headers->data); | ||||
|           if(result) | ||||
|             return result; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     headers = headers->next; | ||||
|   } | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Curl_http() gets called from the generic Curl_do() function when a HTTP | ||||
|  * request is to be performed. This creates and sends a properly constructed | ||||
| @@ -1598,8 +1748,10 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) | ||||
|   } | ||||
|  | ||||
|  | ||||
|   if(!checkheaders(data, "Pragma:")) | ||||
|     http->p_pragma = "Pragma: no-cache\r\n"; | ||||
|   http->p_pragma = | ||||
|     (!checkheaders(data, "Pragma:") && | ||||
|      (conn->bits.httpproxy && !conn->bits.tunnel_proxy) )? | ||||
|     "Pragma: no-cache\r\n":NULL; | ||||
|  | ||||
|   if(!checkheaders(data, "Accept:")) | ||||
|     http->p_accept = "Accept: */*\r\n"; | ||||
| @@ -1705,7 +1857,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) | ||||
|       data->set.httpversion==CURL_HTTP_VERSION_1_0?"1.0":"1.1"; | ||||
|  | ||||
|     send_buffer *req_buffer; | ||||
|     struct curl_slist *headers=data->set.headers; | ||||
|     curl_off_t postsize; /* off_t type to be able to hold a large file size */ | ||||
|  | ||||
|     /* initialize a dynamic send-buffer */ | ||||
| @@ -1728,6 +1879,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) | ||||
|                   "%s" /* accept */ | ||||
|                   "%s" /* accept-encoding */ | ||||
|                   "%s" /* referer */ | ||||
|                   "%s" /* Proxy-Connection */ | ||||
|                   "%s",/* transfer-encoding */ | ||||
|  | ||||
|                 request, | ||||
| @@ -1746,6 +1898,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) | ||||
|                 (data->set.encoding && *data->set.encoding && conn->allocptr.accept_encoding)? | ||||
|                 conn->allocptr.accept_encoding:"", | ||||
|                 (data->change.referer && conn->allocptr.ref)?conn->allocptr.ref:"" /* Referer: <data> */, | ||||
|                 (conn->bits.httpproxy && !conn->bits.tunnel_proxy)? | ||||
|                   "Proxy-Connection: Keep-Alive\r\n":"", | ||||
|                 te | ||||
|                 ); | ||||
|  | ||||
| @@ -1852,33 +2006,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     while(headers) { | ||||
|       ptr = strchr(headers->data, ':'); | ||||
|       if(ptr) { | ||||
|         /* we require a colon for this to be a true header */ | ||||
|  | ||||
|         ptr++; /* pass the colon */ | ||||
|         while(*ptr && isspace((int)*ptr)) | ||||
|           ptr++; | ||||
|  | ||||
|         if(*ptr) { | ||||
|           /* only send this if the contents was non-blank */ | ||||
|  | ||||
|           if(conn->allocptr.host && | ||||
|             /* a Host: header was sent already, don't pass on any custom Host: | ||||
|                header as that will produce *two* in the same request! */ | ||||
|              curl_strnequal("Host:", headers->data, 5)) | ||||
|             ; | ||||
|           else { | ||||
|  | ||||
|             result = add_bufferf(req_buffer, "%s\r\n", headers->data); | ||||
|     result = add_custom_headers(conn, req_buffer); | ||||
|     if(result) | ||||
|       return result; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       headers = headers->next; | ||||
|     } | ||||
|  | ||||
|     http->postdata = NULL;  /* nothing to post at this point */ | ||||
|     Curl_pgrsSetUploadSize(data, 0); /* upload size is 0 atm */ | ||||
| @@ -1928,18 +2058,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) | ||||
|           return result; | ||||
|       } | ||||
|  | ||||
|       if((data->set.httpversion != CURL_HTTP_VERSION_1_0) && | ||||
|          !checkheaders(data, "Expect:")) { | ||||
|         /* if not doing HTTP 1.0 or disabled explicitly, we add a Expect: | ||||
|            100-continue to the headers which actually speeds up post | ||||
|            operations (as there is one packet coming back from the web | ||||
|            server) */ | ||||
|         result = add_bufferf(req_buffer, | ||||
|                              "Expect: 100-continue\r\n"); | ||||
|       result = expect100(data, req_buffer); | ||||
|       if(result) | ||||
|         return result; | ||||
|         data->set.expect100header = TRUE; | ||||
|       } | ||||
|  | ||||
|       if(!checkheaders(data, "Content-Type:")) { | ||||
|         /* Get Content-Type: line from Curl_formpostheader. | ||||
| @@ -2002,18 +2123,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) | ||||
|           return result; | ||||
|       } | ||||
|  | ||||
|       if((data->set.httpversion != CURL_HTTP_VERSION_1_0) && | ||||
|          !checkheaders(data, "Expect:")) { | ||||
|         /* if not HTTP 1.0 or disabled explicitly, we add a Expect: | ||||
|            100-continue to the headers which actually speeds up post | ||||
|            operations (as there is one packet coming back from the web | ||||
|            server) */ | ||||
|         result = add_bufferf(req_buffer, | ||||
|                              "Expect: 100-continue\r\n"); | ||||
|       result = expect100(data, req_buffer); | ||||
|       if(result) | ||||
|         return result; | ||||
|         data->set.expect100header = TRUE; | ||||
|       } | ||||
|  | ||||
|       result = add_buffer(req_buffer, "\r\n", 2); /* end of headers */ | ||||
|       if(result) | ||||
| @@ -2121,21 +2233,18 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) | ||||
|           /* set the upload size to the progress meter */ | ||||
|           Curl_pgrsSetUploadSize(data, http->postsize); | ||||
|  | ||||
|           if((data->set.httpversion != CURL_HTTP_VERSION_1_0) && | ||||
|              !checkheaders(data, "Expect:")) { | ||||
|             /* if not HTTP 1.0 or disabled explicitly, we add a Expect: | ||||
|                100-continue to the headers which actually speeds up post | ||||
|                operations (as there is one packet coming back from the web | ||||
|                server) */ | ||||
|             add_bufferf(req_buffer, | ||||
|                         "Expect: 100-continue\r\n"); | ||||
|             data->set.expect100header = TRUE; | ||||
|           } | ||||
|           result = expect100(data, req_buffer); | ||||
|           if(result) | ||||
|             return result; | ||||
|  | ||||
|           add_buffer(req_buffer, "\r\n", 2); /* end of headers! */ | ||||
|         } | ||||
|       } | ||||
|       else { | ||||
|         result = expect100(data, req_buffer); | ||||
|         if(result) | ||||
|           return result; | ||||
|  | ||||
|         add_buffer(req_buffer, "\r\n", 2); /* end of headers! */ | ||||
|  | ||||
|         if(data->set.postfieldsize) { | ||||
|   | ||||
| @@ -29,7 +29,7 @@ bool Curl_compareheader(char *headerline,     /* line to check */ | ||||
|                         const char *content); /* content string to find */ | ||||
|  | ||||
| /* ftp can use this as well */ | ||||
| CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, | ||||
| CURLcode Curl_proxyCONNECT(struct connectdata *conn, | ||||
|                            int tunnelsocket, | ||||
|                            char *hostname, int remote_port); | ||||
|  | ||||
|   | ||||
| @@ -153,12 +153,19 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, | ||||
|       if(*datap == '\n') { | ||||
|         /* we're now expecting data to come, unless size was zero! */ | ||||
|         if(0 == ch->datasize) { | ||||
|           ch->state = CHUNK_STOP; /* stop reading! */ | ||||
|           if (conn->bits.trailerHdrPresent!=TRUE) { | ||||
|             /* No Trailer: header found - revert to original Curl processing */ | ||||
|             ch->state = CHUNK_STOP; | ||||
|             if (1 == length) { | ||||
|             /* This was the final byte, return right now */ | ||||
|                /* This is the final byte, return right now */ | ||||
|                return CHUNKE_STOP; | ||||
|             } | ||||
|           } | ||||
|           else { | ||||
|             ch->state = CHUNK_TRAILER; /* attempt to read trailers */ | ||||
|             conn->trlPos=0; | ||||
|           } | ||||
|         } | ||||
|         else | ||||
|           ch->state = CHUNK_DATA; | ||||
|       } | ||||
| @@ -250,6 +257,64 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, | ||||
|         return CHUNKE_BAD_CHUNK; | ||||
|       break; | ||||
|  | ||||
|     case CHUNK_TRAILER: | ||||
|       /* conn->trailer is assumed to be freed in url.c on a | ||||
|          connection basis */ | ||||
|       if (conn->trlPos >= conn->trlMax) { | ||||
|         char *ptr; | ||||
|         if(conn->trlMax) { | ||||
|           conn->trlMax *= 2; | ||||
|           ptr = (char*)realloc(conn->trailer,conn->trlMax); | ||||
|         } | ||||
|         else { | ||||
|           conn->trlMax=128; | ||||
|           ptr = (char*)malloc(conn->trlMax); | ||||
|         } | ||||
|         if(!ptr) | ||||
|           return CHUNKE_OUT_OF_MEMORY; | ||||
|         conn->trailer = ptr; | ||||
|       } | ||||
|       conn->trailer[conn->trlPos++]=*datap; | ||||
|  | ||||
|       if(*datap == '\r') | ||||
|         ch->state = CHUNK_TRAILER_CR; | ||||
|       else { | ||||
|         datap++; | ||||
|         length--; | ||||
|      } | ||||
|       break; | ||||
|  | ||||
|     case CHUNK_TRAILER_CR: | ||||
|       if(*datap == '\r') { | ||||
|         ch->state = CHUNK_TRAILER_POSTCR; | ||||
|         datap++; | ||||
|         length--; | ||||
|       } | ||||
|       else | ||||
|         return CHUNKE_BAD_CHUNK; | ||||
|       break; | ||||
|  | ||||
|     case CHUNK_TRAILER_POSTCR: | ||||
|       if (*datap == '\n') { | ||||
|         conn->trailer[conn->trlPos++]='\n'; | ||||
|         conn->trailer[conn->trlPos]=0; | ||||
|         if (conn->trlPos==2) { | ||||
|           ch->state = CHUNK_STOP; | ||||
|           return CHUNKE_STOP; | ||||
|         } | ||||
|         else { | ||||
|           Curl_client_write(conn->data, CLIENTWRITE_HEADER, | ||||
|                             conn->trailer, conn->trlPos); | ||||
|         } | ||||
|         ch->state = CHUNK_TRAILER; | ||||
|         conn->trlPos=0; | ||||
|         datap++; | ||||
|         length--; | ||||
|       } | ||||
|       else | ||||
|         return CHUNKE_BAD_CHUNK; | ||||
|       break; | ||||
|  | ||||
|     case CHUNK_STOP: | ||||
|       /* If we arrive here, there is data left in the end of the buffer | ||||
|          even if there's no more chunks to read */ | ||||
|   | ||||
| @@ -52,8 +52,8 @@ typedef enum { | ||||
|   /* POSTCR should get a CR and nothing else, then move to POSTLF */ | ||||
|   CHUNK_POSTCR, | ||||
|  | ||||
|   /* POSTLF should get a LF and nothing else, then move back to HEX as | ||||
|      the CRLF combination marks the end of a chunk */ | ||||
|   /* POSTLF should get a LF and nothing else, then move back to HEX as the | ||||
|      CRLF combination marks the end of a chunk */ | ||||
|   CHUNK_POSTLF, | ||||
|  | ||||
|   /* This is mainly used to really mark that we're out of the game. | ||||
| @@ -62,7 +62,22 @@ typedef enum { | ||||
|      buffer! */ | ||||
|   CHUNK_STOP, | ||||
|  | ||||
|   /* At this point optional trailer headers can be found, unless the next line | ||||
|      is CRLF */ | ||||
|   CHUNK_TRAILER, | ||||
|  | ||||
|   /* A trailer CR has been found - next state is CHUNK_TRAILER_POSTCR. | ||||
|      Next char must be a LF */ | ||||
|   CHUNK_TRAILER_CR, | ||||
|  | ||||
|   /* A trailer LF must be found now, otherwise CHUNKE_BAD_CHUNK will be | ||||
|      signalled If this is an empty trailer CHUNKE_STOP will be signalled. | ||||
|      Otherwise the trailer will be broadcasted via Curl_client_write() and the | ||||
|      next state will be CHUNK_TRAILER */ | ||||
|   CHUNK_TRAILER_POSTCR, | ||||
|  | ||||
|   CHUNK_LAST /* never use */ | ||||
|  | ||||
| } ChunkyState; | ||||
|  | ||||
| typedef enum { | ||||
| @@ -74,6 +89,7 @@ typedef enum { | ||||
|   CHUNKE_WRITE_ERROR, | ||||
|   CHUNKE_STATE_ERROR, | ||||
|   CHUNKE_BAD_ENCODING, | ||||
|   CHUNKE_OUT_OF_MEMORY, | ||||
|   CHUNKE_LAST | ||||
| } CHUNKcode; | ||||
|  | ||||
|   | ||||
| @@ -39,7 +39,8 @@ CURLntlm Curl_input_ntlm(struct connectdata *conn, bool proxy, char *header); | ||||
| CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy); | ||||
|  | ||||
| void Curl_ntlm_cleanup(struct connectdata *conn); | ||||
| #if !defined(USE_SSLEAY) && !defined(USE_WINDOWS_SSPI) | ||||
| #if (!defined(USE_SSLEAY) && !defined(USE_WINDOWS_SSPI)) || \ | ||||
|     defined(CURL_DISABLE_HTTP) | ||||
| #define Curl_ntlm_cleanup(x) | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -34,7 +34,8 @@ | ||||
| #include "if2ip.h" | ||||
|  | ||||
| #if !defined(WIN32) && !defined(__BEOS__) && !defined(__CYGWIN32__) && \ | ||||
|     !defined(__riscos__) && !defined(__INTERIX) && !defined(NETWARE) | ||||
|     !defined(__riscos__) && !defined(__INTERIX) && !defined(NETWARE) && \ | ||||
|     !defined(_AMIGASF) | ||||
|  | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
|   | ||||
| @@ -1,5 +1,27 @@ | ||||
| #ifndef __INET_NTOA_R_H | ||||
| #define __INET_NTOA_R_H | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|  * are also available at http://curl.haxx.se/docs/copyright.html. | ||||
|  * | ||||
|  * You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||
|  * copies of the Software, and permit persons to whom the Software is | ||||
|  * furnished to do so, under the terms of the COPYING file. | ||||
|  * | ||||
|  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||
|  * KIND, either express or implied. | ||||
|  * | ||||
|  * $Id$ | ||||
|  ***************************************************************************/ | ||||
|  | ||||
| #include "setup.h" | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,19 @@ | ||||
| /* | ||||
|  * Copyright (C) 1996-2001  Internet Software Consortium. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software for any | ||||
|  * purpose with or without fee is hereby granted, provided that the above | ||||
|  * copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM | ||||
|  * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL | ||||
|  * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, | ||||
|  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING | ||||
|  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, | ||||
|  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION | ||||
|  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  */ | ||||
| /* | ||||
|  * Original code by Paul Vixie. "curlified" by Gisle Vanem. | ||||
|  */ | ||||
|   | ||||
| @@ -114,7 +114,7 @@ inet_pton4(const char *src, unsigned char *dst) | ||||
|     const char *pch; | ||||
|  | ||||
|     if ((pch = strchr(digits, ch)) != NULL) { | ||||
|       u_int val = *tp * 10 + (pch - digits); | ||||
|       u_int val = *tp * 10 + (u_int)(pch - digits); | ||||
|  | ||||
|       if (val > 255) | ||||
|         return (0); | ||||
|   | ||||
| @@ -49,4 +49,5 @@ EXPORTS | ||||
| 	curl_multi_strerror @ 41; | ||||
| 	curl_share_strerror @ 42; | ||||
| 	curl_easy_reset @ 43; | ||||
| 	curl_mvsnprintf @ 44 ; | ||||
|  | ||||
|   | ||||
| @@ -23,6 +23,7 @@ | ||||
| 	curl_msprintf, | ||||
| 	curl_msnprintf, | ||||
| 	curl_mvfprintf, | ||||
| 	curl_mvsnprintf, | ||||
| 	curl_strequal, | ||||
| 	curl_strnequal, | ||||
| 	curl_easy_duphandle, | ||||
|   | ||||
| @@ -30,7 +30,7 @@ BEGIN | ||||
|       VALUE "OriginalFilename", "libcurl.dll\0" | ||||
|       VALUE "ProductName",      "The cURL library\0" | ||||
|       VALUE "ProductVersion",   LIBCURL_VERSION "\0" | ||||
|       VALUE "LegalCopyright",   "Copyright 1996-2004 by Daniel Stenberg. http://curl.haxx.se/docs/copyright.html\0" | ||||
|       VALUE "LegalCopyright",   "Copyright 1996-2005 by Daniel Stenberg. http://curl.haxx.se/docs/copyright.html\0" | ||||
|     END | ||||
|   END | ||||
|  | ||||
|   | ||||
| @@ -7,8 +7,8 @@ | ||||
| ATCPSDKI=	/GG/netinclude | ||||
|  | ||||
|  | ||||
| CC	=	gcc | ||||
| CFLAGS	=	-I$(ATCPSDKI) -m68020-60 -noixemul -I. -I../include -W -Wall | ||||
| CC	=	m68k-amigaos-gcc | ||||
| CFLAGS	=	-I$(ATCPSDKI) -m68020-60 -O2 -msoft-float -noixemul -g -I. -I../include -W -Wall | ||||
|  | ||||
| OBJS = amigaos.c base64.c connect.c content_encoding.c cookie.c dict.c easy.c \ | ||||
| 	escape.c file.c formdata.c ftp.c getenv.c getinfo.c hash.c hostip.c   \ | ||||
| @@ -17,7 +17,7 @@ OBJS = amigaos.c base64.c connect.c content_encoding.c cookie.c dict.c easy.c \ | ||||
| 	ldap.c llist.c md5.c memdebug.c mprintf.c multi.c netrc.c parsedate.c \ | ||||
| 	progress.c security.c select.c sendf.c share.c speedcheck.c ssluse.c  \ | ||||
| 	strequal.c strtok.c telnet.c timeval.c transfer.c url.c version.c \ | ||||
| 	sslgen.c gtls.c | ||||
| 	sslgen.c gtls.c strerror.c | ||||
|  | ||||
| all:	$(OBJS:.c=.o) | ||||
| 	ar cru libcurl.a $(OBJS:.c=.o) | ||||
|   | ||||
							
								
								
									
										253
									
								
								lib/makefile.dj
									
									
									
									
									
								
							
							
						
						
									
										253
									
								
								lib/makefile.dj
									
									
									
									
									
								
							| @@ -32,247 +32,264 @@ realclean vclean: clean | ||||
| # DO NOT DELETE THIS LINE | ||||
| $(OBJ_DIR)/file.o: file.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h progress.h sendf.h escape.h \ | ||||
|   file.h speedcheck.h getinfo.h transfer.h url.h memory.h \ | ||||
|   ../include/curl/mprintf.h memdebug.h | ||||
|   file.h speedcheck.h getinfo.h transfer.h url.h memory.h parsedate.h \ | ||||
|   ../include/curl/mprintf.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/timeval.o: timeval.c timeval.h setup.h config.h | ||||
| $(OBJ_DIR)/base64.o: base64.c setup.h config.h ../include/curl/mprintf.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h base64.h memory.h memdebug.h | ||||
|   ../include/curl/multi.h base64.h memory.h ../include/curl/curl.h \ | ||||
|   memdebug.h memory.h | ||||
| $(OBJ_DIR)/hostip.o: hostip.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \ | ||||
|   inet_ntop.h ../include/curl/mprintf.h memory.h memdebug.h | ||||
|   inet_ntop.h ../include/curl/mprintf.h memory.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/progress.o: progress.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h progress.h \ | ||||
|   ../include/curl/mprintf.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h urldata.h cookie.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   sendf.h progress.h ../include/curl/mprintf.h | ||||
| $(OBJ_DIR)/formdata.o: formdata.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h strequal.h memory.h \ | ||||
|   ../include/curl/mprintf.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h strequal.h \ | ||||
|   memory.h ../include/curl/mprintf.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/cookie.o: cookie.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h strequal.h strtok.h sendf.h \ | ||||
|   memory.h memdebug.h | ||||
|   memory.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/http.o: http.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h transfer.h sendf.h progress.h \ | ||||
|   base64.h strequal.h ssluse.h http_digest.h http_ntlm.h http_negotiate.h \ | ||||
|   url.h share.h http.h memory.h select.h ../include/curl/mprintf.h \ | ||||
|   memdebug.h | ||||
|   base64.h strequal.h sslgen.h http_digest.h http_ntlm.h http_negotiate.h \ | ||||
|   url.h share.h http.h memory.h select.h parsedate.h \ | ||||
|   ../include/curl/mprintf.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/sendf.o: sendf.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h connect.h \ | ||||
|   ../include/curl/mprintf.h memory.h strerror.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h urldata.h cookie.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   sendf.h connect.h sslgen.h ../include/curl/mprintf.h memory.h \ | ||||
|   strerror.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/ftp.o: ftp.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h if2ip.h progress.h \ | ||||
|   transfer.h escape.h http.h ftp.h strtoofft.h strequal.h ssluse.h \ | ||||
|   connect.h strerror.h memory.h inet_ntop.h select.h \ | ||||
|   ../include/curl/mprintf.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h urldata.h cookie.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   sendf.h if2ip.h progress.h transfer.h escape.h http.h ftp.h strtoofft.h \ | ||||
|   strequal.h sslgen.h connect.h strerror.h memory.h inet_ntop.h select.h \ | ||||
|   parsedate.h ../include/curl/mprintf.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/url.o: url.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h netrc.h base64.h ssluse.h if2ip.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h netrc.h base64.h sslgen.h \ | ||||
|   transfer.h sendf.h progress.h strequal.h strerror.h escape.h strtok.h \ | ||||
|   share.h content_encoding.h http_digest.h http_negotiate.h select.h \ | ||||
|   ftp.h dict.h telnet.h http.h file.h ldap.h url.h connect.h inet_ntop.h \ | ||||
|   ca-bundle.h ../include/curl/mprintf.h memory.h memdebug.h | ||||
|   multiif.h ftp.h dict.h telnet.h http.h file.h ldap.h url.h connect.h \ | ||||
|   inet_ntop.h http_ntlm.h ca-bundle.h ../include/curl/mprintf.h memory.h \ | ||||
|   memdebug.h memory.h | ||||
| $(OBJ_DIR)/dict.o: dict.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h transfer.h sendf.h progress.h \ | ||||
|   strequal.h dict.h ../include/curl/mprintf.h | ||||
| $(OBJ_DIR)/if2ip.o: if2ip.c setup.h config.h if2ip.h memory.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h memdebug.h | ||||
| $(OBJ_DIR)/if2ip.o: if2ip.c setup.h config.h if2ip.h inet_ntop.h memory.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/speedcheck.o: speedcheck.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h speedcheck.h | ||||
| $(OBJ_DIR)/ldap.o: ldap.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h escape.h transfer.h \ | ||||
|   strequal.h strtok.h ldap.h memory.h ../include/curl/mprintf.h \ | ||||
|   memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h urldata.h cookie.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   sendf.h speedcheck.h | ||||
| $(OBJ_DIR)/ldap.o: ldap.c setup.h config.h | ||||
| $(OBJ_DIR)/ssluse.o: ssluse.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h url.h inet_pton.h \ | ||||
|   ssluse.h connect.h strequal.h select.h ../include/curl/mprintf.h | ||||
|   ssluse.h connect.h strequal.h select.h sslgen.h \ | ||||
|   ../include/curl/mprintf.h | ||||
| $(OBJ_DIR)/version.o: version.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h ../include/curl/mprintf.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h urldata.h cookie.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   sslgen.h ../include/curl/mprintf.h | ||||
| $(OBJ_DIR)/getenv.o: getenv.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h memory.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h memory.h memdebug.h \ | ||||
|   memory.h | ||||
| $(OBJ_DIR)/escape.o: escape.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h memory.h ../include/curl/mprintf.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h memory.h \ | ||||
|   ../include/curl/mprintf.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/mprintf.o: mprintf.c setup.h config.h ../include/curl/mprintf.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h memory.h memdebug.h | ||||
|   ../include/curl/multi.h memory.h ../include/curl/curl.h memdebug.h \ | ||||
|   memory.h | ||||
| $(OBJ_DIR)/telnet.o: telnet.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h transfer.h sendf.h telnet.h \ | ||||
|   ../include/curl/mprintf.h arpa_telnet.h memory.h select.h memdebug.h | ||||
|   ../include/curl/mprintf.h arpa_telnet.h memory.h select.h memdebug.h \ | ||||
|   memory.h | ||||
| $(OBJ_DIR)/netrc.o: netrc.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h netrc.h strequal.h strtok.h memory.h \ | ||||
|   ../include/curl/mprintf.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h netrc.h strequal.h \ | ||||
|   strtok.h memory.h ../include/curl/mprintf.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/getinfo.o: getinfo.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h getinfo.h memory.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h urldata.h cookie.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   getinfo.h memory.h sslgen.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/transfer.o: transfer.c setup.h config.h strtoofft.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h strequal.h urldata.h cookie.h formdata.h \ | ||||
|   timeval.h e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h netrc.h content_encoding.h \ | ||||
|   transfer.h sendf.h speedcheck.h progress.h http.h url.h getinfo.h \ | ||||
|   ssluse.h http_digest.h http_ntlm.h http_negotiate.h share.h memory.h \ | ||||
|   select.h ../include/curl/mprintf.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h strequal.h urldata.h \ | ||||
|   cookie.h formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   netrc.h content_encoding.h transfer.h sendf.h speedcheck.h progress.h \ | ||||
|   http.h url.h getinfo.h sslgen.h http_digest.h http_ntlm.h \ | ||||
|   http_negotiate.h share.h memory.h select.h ../include/curl/mprintf.h \ | ||||
|   memdebug.h memory.h | ||||
| $(OBJ_DIR)/strequal.o: strequal.c setup.h config.h strequal.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h | ||||
| $(OBJ_DIR)/easy.o: easy.c setup.h config.h strequal.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h transfer.h ssluse.h url.h \ | ||||
|   getinfo.h share.h memory.h progress.h ../include/curl/mprintf.h \ | ||||
|   memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h urldata.h cookie.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   transfer.h sslgen.h url.h getinfo.h share.h memory.h progress.h \ | ||||
|   easyif.h ../include/curl/mprintf.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/security.o: security.c setup.h config.h | ||||
| $(OBJ_DIR)/krb4.o: krb4.c setup.h config.h | ||||
| $(OBJ_DIR)/memdebug.o: memdebug.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h ../include/curl/mprintf.h urldata.h cookie.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   memory.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h \ | ||||
|   ../include/curl/mprintf.h urldata.h cookie.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h memory.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/http_chunks.o: http_chunks.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h content_encoding.h http.h \ | ||||
|   memory.h ../include/curl/mprintf.h memdebug.h | ||||
|   memory.h ../include/curl/mprintf.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/strtok.o: strtok.c setup.h config.h strtok.h | ||||
| $(OBJ_DIR)/connect.o: connect.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h if2ip.h strerror.h \ | ||||
|   connect.h memory.h select.h memdebug.h | ||||
|   connect.h memory.h select.h url.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/llist.o: llist.c setup.h config.h llist.h memory.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/hash.o: hash.c setup.h config.h hash.h llist.h memory.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/multi.o: multi.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h transfer.h url.h connect.h \ | ||||
|   progress.h memory.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h urldata.h cookie.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   transfer.h url.h connect.h progress.h memory.h easyif.h multiif.h \ | ||||
|   sendf.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/content_encoding.o: content_encoding.c setup.h config.h urldata.h \ | ||||
|   cookie.h ../include/curl/curl.h ../include/curl/curlver.h \ | ||||
|   ../include/curl/easy.h ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h content_encoding.h \ | ||||
|   memory.h memdebug.h | ||||
|   ../include/curl/easy.h ../include/curl/multi.h ../include/curl/curl.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   sendf.h content_encoding.h memory.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/share.o: share.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h share.h memory.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h urldata.h cookie.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   share.h memory.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/http_digest.o: http_digest.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h strequal.h base64.h md5.h \ | ||||
|   http_digest.h strtok.h url.h memory.h ../include/curl/mprintf.h \ | ||||
|   memdebug.h | ||||
|   memdebug.h memory.h | ||||
| $(OBJ_DIR)/md5.o: md5.c setup.h config.h md5.h | ||||
| $(OBJ_DIR)/http_negotiate.o: http_negotiate.c setup.h config.h | ||||
| $(OBJ_DIR)/http_ntlm.o: http_ntlm.c setup.h config.h | ||||
| $(OBJ_DIR)/inet_pton.o: inet_pton.c setup.h config.h | ||||
| $(OBJ_DIR)/strtoofft.o: strtoofft.c setup.h config.h strtoofft.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h | ||||
| $(OBJ_DIR)/strerror.o: strerror.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h strerror.h urldata.h cookie.h formdata.h \ | ||||
|   timeval.h e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h ../include/curl/mprintf.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h strerror.h urldata.h \ | ||||
|   cookie.h formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   ../include/curl/mprintf.h | ||||
| $(OBJ_DIR)/hostares.o: hostares.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \ | ||||
|   ../include/curl/mprintf.h memory.h memdebug.h | ||||
|   ../include/curl/mprintf.h memory.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/hostasyn.o: hostasyn.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \ | ||||
|   ../include/curl/mprintf.h memory.h memdebug.h | ||||
|   ../include/curl/mprintf.h memory.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/hostip4.o: hostip4.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \ | ||||
|   ../include/curl/mprintf.h memory.h memdebug.h | ||||
|   inet_pton.h ../include/curl/mprintf.h memory.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/hostip6.o: hostip6.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \ | ||||
|   ../include/curl/mprintf.h memory.h memdebug.h | ||||
|   inet_pton.h ../include/curl/mprintf.h memory.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/hostsyn.o: hostsyn.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \ | ||||
|   ../include/curl/mprintf.h memory.h memdebug.h | ||||
|   ../include/curl/mprintf.h memory.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/hostthre.o: hostthre.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h formdata.h timeval.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \ | ||||
|   http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \ | ||||
|   ../include/curl/mprintf.h inet_ntop.h memory.h memdebug.h | ||||
|   ../include/curl/mprintf.h inet_ntop.h memory.h memdebug.h memory.h | ||||
| $(OBJ_DIR)/inet_ntop.o: inet_ntop.c setup.h config.h | ||||
| $(OBJ_DIR)/parsedate.o: parsedate.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h | ||||
| $(OBJ_DIR)/select.o: select.c setup.h config.h select.h | ||||
| $(OBJ_DIR)/gtls.o: gtls.c setup.h config-win32.h | ||||
| $(OBJ_DIR)/sslgen.o: 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 \ | ||||
|   ssluse.h gtls.h sendf.h strequal.h url.h memory.h memdebug.h | ||||
|   ../include/curl/multi.h ../include/curl/curl.h | ||||
| $(OBJ_DIR)/select.o: select.c setup.h config.h ../include/curl/curl.h \ | ||||
|   ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h urldata.h cookie.h \ | ||||
|   formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \ | ||||
|   e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \ | ||||
|   connect.h select.h | ||||
| $(OBJ_DIR)/gtls.o: gtls.c setup.h config.h | ||||
| $(OBJ_DIR)/sslgen.o: sslgen.c setup.h config.h urldata.h cookie.h \ | ||||
|   ../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \ | ||||
|   ../include/curl/multi.h ../include/curl/curl.h formdata.h timeval.h \ | ||||
|   e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.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 memory.h | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user