Compare commits
	
		
			380 Commits
		
	
	
		
			curl-7_15_
			...
			curl-7_15_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | c7e9e60b05 | ||
|   | 47f2e1da73 | ||
|   | 5975229919 | ||
|   | 38295e8a75 | ||
|   | f9612b5eaf | ||
|   | 5cf2ef2ef7 | ||
|   | 938b5c886e | ||
|   | 0618e68200 | ||
|   | bac52f3969 | ||
|   | d494d62953 | ||
|   | 7206181385 | ||
|   | 3f22901a43 | ||
|   | f70f11fc70 | ||
|   | cffebd7fd6 | ||
|   | b8c8e7349f | ||
|   | 8bba99ae56 | ||
|   | b5c5f57613 | ||
|   | 33df856925 | ||
|   | ce09cedd2e | ||
|   | 7d68101f83 | ||
|   | aa50a00898 | ||
|   | 26f112ba55 | ||
|   | 159b9162f8 | ||
|   | d7999f9fcb | ||
|   | f13eba4c78 | ||
|   | 050e82e088 | ||
|   | 88377e5b61 | ||
|   | 241af465fd | ||
|   | 59510a554d | ||
|   | b10aa95d28 | ||
|   | 097bee681a | ||
|   | 8548c2fc61 | ||
|   | dc4fbd2e97 | ||
|   | 60b029869f | ||
|   | f592ea6c30 | ||
|   | a39ac3d94a | ||
|   | 4b23ddc002 | ||
|   | 4486d336a6 | ||
|   | 45e4b811b0 | ||
|   | 0e6a1a4420 | ||
|   | b8bf708db9 | ||
|   | 6fdbb01194 | ||
|   | d29147565c | ||
|   | 75c9430559 | ||
|   | 9ac99a80c3 | ||
|   | a15d107dde | ||
|   | 09897b8146 | ||
|   | 29e446e508 | ||
|   | 10beb36b1c | ||
|   | a65a888866 | ||
|   | 98180b5cc7 | ||
|   | 92009181af | ||
|   | 831bdb9f63 | ||
|   | 50a4dbbb5e | ||
|   | ad6511c313 | ||
|   | 7a37fa4aef | ||
|   | dcee24191f | ||
|   | 87bcb6f377 | ||
|   | b0bc2f00d2 | ||
|   | 3b19c7d0d9 | ||
|   | 12f5c67bf5 | ||
|   | d7a83d8995 | ||
|   | 7725729d90 | ||
|   | e96445bd02 | ||
|   | da2c124675 | ||
|   | 8cb695a963 | ||
|   | 54cbd7e154 | ||
|   | 5994b62930 | ||
|   | 2fbf94b0f3 | ||
|   | 32bc30e210 | ||
|   | f3bc8e6ce1 | ||
|   | 16f3a32bec | ||
|   | c44d2498e3 | ||
|   | 2aed209efa | ||
|   | b55b780d7b | ||
|   | 8d4eb2bc1f | ||
|   | 67bf4f28ff | ||
|   | 803582f8ac | ||
|   | 03603f392a | ||
|   | fcfd6d9504 | ||
|   | c31451cf13 | ||
|   | 5deff1a179 | ||
|   | e236a1c99b | ||
|   | a2f3094eb0 | ||
|   | 65afc576ea | ||
|   | 8971f656b4 | ||
|   | 394ce9ee39 | ||
|   | 67a83c1b34 | ||
|   | 1e8d094274 | ||
|   | 4c35a40858 | ||
|   | 802b2aaf6a | ||
|   | 0e79a8944b | ||
|   | bebf70667d | ||
|   | d9bd5de0b1 | ||
|   | 31c7aa0ba4 | ||
|   | fc2388189f | ||
|   | 4431338691 | ||
|   | bda1e9aeab | ||
|   | 4969ca768d | ||
|   | 2acd1c1642 | ||
|   | e1e753179a | ||
|   | f4cc8153ae | ||
|   | e4d8cb4ee0 | ||
|   | 723a78ae3f | ||
|   | cd9d0d7dec | ||
|   | 665d4f08c8 | ||
|   | 00c7780fcb | ||
|   | 15ab13dc42 | ||
|   | 8a0ca3066e | ||
|   | ea01755bb4 | ||
|   | 69c2084a18 | ||
|   | 99c0a1a7d0 | ||
|   | 5acf997e69 | ||
|   | dd87e4ed39 | ||
|   | 2f8c26ba8a | ||
|   | 81b9793807 | ||
|   | 7278f17e8f | ||
|   | 66c7427df0 | ||
|   | c1a06d858d | ||
|   | 53b5fdbe9e | ||
|   | 687cf0235e | ||
|   | b6e9229cf0 | ||
|   | 089e4848d8 | ||
|   | 58d2e7c6d1 | ||
|   | fa18d6fb76 | ||
|   | 4dcb930247 | ||
|   | 74a299fd08 | ||
|   | 532a560d87 | ||
|   | 0040a60559 | ||
|   | cc34342790 | ||
|   | bdbf6e9d19 | ||
|   | db86f765eb | ||
|   | b11dec5dd5 | ||
|   | 86becc7591 | ||
|   | 8922bc038b | ||
|   | 009f5790a4 | ||
|   | 0536b6c459 | ||
|   | 0e3ebd9841 | ||
|   | 598965a606 | ||
|   | d7a2938849 | ||
|   | a683658675 | ||
|   | 25169f68b7 | ||
|   | e5247ae65d | ||
|   | a718cb05ff | ||
|   | b466ef2581 | ||
|   | c7a634641f | ||
|   | e4388643f1 | ||
|   | bc4208201c | ||
|   | a0d69d52a1 | ||
|   | c23a1be139 | ||
|   | 9799f7afb0 | ||
|   | 6358b24fac | ||
|   | b58634316f | ||
|   | e3657644d6 | ||
|   | 7d1e3ebeed | ||
|   | 9e61dfe85e | ||
|   | 7b51aafa86 | ||
|   | 5f487123df | ||
|   | f1f32477e3 | ||
|   | df2b1251a0 | ||
|   | 02c7cf6fa5 | ||
|   | 60006ff993 | ||
|   | f3af5d7b8e | ||
|   | d551412a32 | ||
|   | 6de67a134e | ||
|   | 8ec31398e0 | ||
|   | fd0d560b47 | ||
|   | cc542269a1 | ||
|   | 7b488a3bef | ||
|   | f448168501 | ||
|   | 80a8fb98db | ||
|   | 898bb397b1 | ||
|   | 74ed5b5ebd | ||
|   | 178afd81a9 | ||
|   | d6eb1a7b98 | ||
|   | 4ff56b15e9 | ||
|   | e6b98d3152 | ||
|   | 5fd8dd2dce | ||
|   | 0ad3e046a4 | ||
|   | d6c5d24af3 | ||
|   | 8a3280a2de | ||
|   | 450a0a647a | ||
|   | 676c0cf123 | ||
|   | a731319321 | ||
|   | 81b06a09b7 | ||
|   | 23b34744d9 | ||
|   | bc8590aa12 | ||
|   | 939d368d5f | ||
|   | 336e3b8baf | ||
|   | 47c06fa308 | ||
|   | b7f447f8d8 | ||
|   | 03af76b631 | ||
|   | e105d5c28f | ||
|   | d6ffb4c177 | ||
|   | 6dbfce1031 | ||
|   | fea5ddf585 | ||
|   | b9f39c2711 | ||
|   | 5acac0309a | ||
|   | 78febad718 | ||
|   | a6a5bba0a9 | ||
|   | 51581c034d | ||
|   | 8f25a95b47 | ||
|   | 7f5d092223 | ||
|   | 2e5cccd1b6 | ||
|   | 2645782f89 | ||
|   | 9533092511 | ||
|   | 6005a461bb | ||
|   | e2df946eee | ||
|   | d14588120f | ||
|   | ab31cfa664 | ||
|   | af1c397969 | ||
|   | 947f9deed5 | ||
|   | ce95eee903 | ||
|   | b15f3bb969 | ||
|   | 998e8cba19 | ||
|   | e3f523ab2a | ||
|   | 36485e56ed | ||
|   | b4113360f6 | ||
|   | 2d71e22f08 | ||
|   | 2ae67c431c | ||
|   | 4b1a91b64f | ||
|   | 4f69318e12 | ||
|   | 1cc98ab50f | ||
|   | a6494602fd | ||
|   | 50ec78b488 | ||
|   | 7d044d14f9 | ||
|   | df03d5a8b2 | ||
|   | 6a0ed81e67 | ||
|   | c94f3e8188 | ||
|   | 1e5f6cc1dc | ||
|   | b1fece74e3 | ||
|   | fdbe0df6e7 | ||
|   | 93d59520e4 | ||
|   | b68d3a073b | ||
|   | 2100311f41 | ||
|   | e1269e3156 | ||
|   | c88d61b044 | ||
|   | f49df54a36 | ||
|   | 952bbc4410 | ||
|   | 1eb4b85d72 | ||
|   | 59b6cb9e91 | ||
|   | e06afaeb7a | ||
|   | 8c6f654b26 | ||
|   | 1d8212e53a | ||
|   | 083c5e17e1 | ||
|   | 272231fb09 | ||
|   | 67b4d9b232 | ||
|   | 21709e1557 | ||
|   | 9c312637d1 | ||
|   | feacad7f68 | ||
|   | 6513303498 | ||
|   | 3e2a52b034 | ||
|   | 176d4e85e9 | ||
|   | 84d30dffb6 | ||
|   | 0fd282b078 | ||
|   | cdf4afbe50 | ||
|   | b222b2304e | ||
|   | fdf9900114 | ||
|   | 5867eb2dd2 | ||
|   | 61f145e3de | ||
|   | b97e7fc730 | ||
|   | 01cbf08064 | ||
|   | fec632e948 | ||
|   | 6aab5b57e1 | ||
|   | d2a27e02ce | ||
|   | b55506a76d | ||
|   | afc2aa2b3f | ||
|   | d055b269ed | ||
|   | 8a246a4a9f | ||
|   | 2f684351bf | ||
|   | 74e5beab9d | ||
|   | b41765f441 | ||
|   | 05a6013f42 | ||
|   | cfff544d67 | ||
|   | 599d9642ca | ||
|   | 0264faaa4e | ||
|   | 4022a60ea7 | ||
|   | 39e366fc11 | ||
|   | 096675824f | ||
|   | 80bfa76ac9 | ||
|   | b2e553a82e | ||
|   | 772b64d9d3 | ||
|   | 92c0de518e | ||
|   | ff96456513 | ||
|   | e89adbef51 | ||
|   | 22a6a6cf81 | ||
|   | fd870e4e8a | ||
|   | d52ed3fff2 | ||
|   | bac17ab7d8 | ||
|   | 9ace303528 | ||
|   | 7e81c35cdc | ||
|   | 0f125d9bcf | ||
|   | d4714517c0 | ||
|   | 280e4bf4c3 | ||
|   | adf462fe05 | ||
|   | c2862742ab | ||
|   | 8a712eb5af | ||
|   | d58790af17 | ||
|   | 9ef7a13403 | ||
|   | a5da1219bb | ||
|   | be524fed38 | ||
|   | 042016b85e | ||
|   | f6da574324 | ||
|   | b09d5c3135 | ||
|   | ec65c3fd53 | ||
|   | 7ca2f31c8d | ||
|   | 2275737a5d | ||
|   | 5e3836055f | ||
|   | 37a6a0bb3e | ||
|   | 6bcca3eca9 | ||
|   | ce40b8d531 | ||
|   | 9f109b94b8 | ||
|   | 89024febde | ||
|   | b7a673c6e2 | ||
|   | 7f68be770d | ||
|   | 4f173f35db | ||
|   | ae9fbe573e | ||
|   | 29676f473d | ||
|   | a5fcb26ab1 | ||
|   | d68b1a1e8c | ||
|   | bd8baed138 | ||
|   | 00a7dda273 | ||
|   | 4dba07c384 | ||
|   | 4d39c6b7cc | ||
|   | 7d6f6158c9 | ||
|   | 6863dbbc0c | ||
|   | 28b96efd8b | ||
|   | 0f82af0f49 | ||
|   | f0d839436f | ||
|   | f1aa4b4127 | ||
|   | ccdb43f7f1 | ||
|   | 72900f0f90 | ||
|   | 3ad958ddb1 | ||
|   | 2c77cc90f4 | ||
|   | db4c33b4fb | ||
|   | 3fb04115fc | ||
|   | 4faaa32aef | ||
|   | cab59b4c32 | ||
|   | 931eff89f5 | ||
|   | 175335808b | ||
|   | e00216581e | ||
|   | 23951ec00c | ||
|   | a8fc5d0f9f | ||
|   | f5e85bab1c | ||
|   | 9a44fa83dc | ||
|   | 6b1e54da62 | ||
|   | b91421b107 | ||
|   | 43b3954fa5 | ||
|   | 80f2e3f263 | ||
|   | 9ea423b4c1 | ||
|   | b259c9c535 | ||
|   | 80f481a5f7 | ||
|   | 115fe1b577 | ||
|   | 06d6ea651e | ||
|   | 966fa848a0 | ||
|   | 6f8fe67ace | ||
|   | d49edc8e09 | ||
|   | 3b9c20fe31 | ||
|   | bd72c5eacf | ||
|   | 9d152a77fd | ||
|   | 33dc28b905 | ||
|   | 43ce64dcca | ||
|   | 9e0882ba98 | ||
|   | c890149c8c | ||
|   | 1a1ab2e2e8 | ||
|   | 715b706caa | ||
|   | bfa9c42c25 | ||
|   | 9d98f97e1b | ||
|   | 5eb5ce6ff3 | ||
|   | be9c873a6e | ||
|   | 034d80f6cd | ||
|   | 021e786c71 | ||
|   | 0c6bb8cb66 | ||
|   | 4d7f08a99e | ||
|   | fdef584681 | ||
|   | f335bac8a3 | ||
|   | 51369753bb | ||
|   | 82a4c2bce3 | ||
|   | e73c6e039e | ||
|   | 19bad0844f | 
| @@ -12,3 +12,4 @@ depcomp | ||||
| config.guess | ||||
| config.sub | ||||
| ltmain.sh | ||||
| libcurl.pc | ||||
|   | ||||
							
								
								
									
										463
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										463
									
								
								CHANGES
									
									
									
									
									
								
							| @@ -6,7 +6,470 @@ | ||||
|  | ||||
|                                   Changelog | ||||
|  | ||||
| Daniel (16 March 2006) | ||||
| - Tor Arntsen provided a RPM spec file for AIX Toolbox, that now is included | ||||
|   in the release archive. | ||||
|  | ||||
| Daniel (14 March 2006) | ||||
| - David McCreedy fixed: | ||||
|  | ||||
|   a bad SSL error message when OpenSSL certificates are verified fine. | ||||
|  | ||||
|   a missing return code assignment in the FTP code | ||||
|  | ||||
| Daniel (7 March 2006) | ||||
| - Markus Koetter filed debian bug report #355715 which identified a problem | ||||
|   with the multi interface and multi-part formposts. The fix from February | ||||
|   22nd could make the Curl_done() function get called twice on the same | ||||
|   connection and it was not designed for that and thus tried to call free() on | ||||
|   an already freed memory area! | ||||
|  | ||||
| - Peter Heuchert made sure the CURLFTPSSL_CONTROL setting for CURLOPT_FTP_SSL | ||||
|   is used properly. | ||||
|  | ||||
| Daniel (6 March 2006) | ||||
| - Lots of users on Windows have reported getting the "SSL: couldn't set | ||||
|   callback" error message so I've now made the setting of that callback not be | ||||
|   as critical as before. The function is only used for additional loggging/ | ||||
|   trace anyway so a failure just means slightly less data. It should still be | ||||
|   able to proceed and connect fine to the server. | ||||
|  | ||||
| Daniel (4 March 2006) | ||||
| - Thomas Klausner provided a patch written by Todd Vierling in bug report | ||||
|   #1442471 that fixes a build problem on Interix. | ||||
|  | ||||
| Daniel (2 March 2006) | ||||
| - FTP upload without a file name part in the URL now causes | ||||
|   curl_easy_perform() to return CURLE_URL_MALFORMAT. Previously it allowed the | ||||
|   upload but named the file "(nil)" (without the quotes). Test case 524 | ||||
|   verifies. | ||||
|  | ||||
| - Added a check for getprotobyname in configure so that it'll be used, thanks | ||||
|   to Gisle Vanem's change the other day. | ||||
|  | ||||
| Daniel (28 February 2006) | ||||
| - Dan Fandrich prevented curl from getting stuck in an endless loop in case we | ||||
|   are out of file handles very early in curl's code where it makes sure that | ||||
|   0, 1 and 2 aren't gonna be used by the lib for transfers. | ||||
|  | ||||
| Daniel (27 February 2006) | ||||
| - Marty Kuhrt pointed out that there were two VMS-specific files missing in | ||||
|   the release archive. | ||||
|  | ||||
| Version 7.15.2 (27 February 2006) | ||||
|  | ||||
| Daniel (22 February 2006) | ||||
| - Lots of work and analysis by "xbx___" in bug #1431750 | ||||
|   (http://curl.haxx.se/bug/view.cgi?id=1431750) helped me identify and fix two | ||||
|   different but related bugs: | ||||
|  | ||||
|   1) Removing an easy handle from a multi handle before the transfer is done | ||||
|      could leave a connection in the connection cache for that handle that is | ||||
|      in a state that isn't suitable for re-use. A subsequent re-use could then | ||||
|      read from a NULL pointer and segfault. | ||||
|  | ||||
|   2) When an easy handle was removed from the multi handle, there could be an | ||||
|      outstanding c-ares DNS name resolve request. When the response arrived, | ||||
|      it caused havoc since the connection struct it "belonged" to could've | ||||
|      been freed already. | ||||
|  | ||||
|   Now Curl_done() is called when an easy handle is removed from a multi handle | ||||
|   pre-maturely (that is, before the transfer was complteted). Curl_done() also | ||||
|   makes sure to cancel all (if any) outstanding c-ares requests. | ||||
|  | ||||
| Daniel (21 February 2006) | ||||
| - Peter Su added support for SOCKS4 proxies. Enable this by setting the proxy | ||||
|   type to the already provided type CURLPROXY_SOCKS4. | ||||
|  | ||||
|   I added a --socks4 option that works like the current --socks5 option but | ||||
|   instead use the socks4 protocol. | ||||
|  | ||||
| Daniel (20 February 2006) | ||||
| - Shmulik Regev fixed an issue with multi-pass authentication and compressed | ||||
|   content when libcurl didn't honor the internal ignorebody flag. | ||||
|  | ||||
| Daniel (18 February 2006) | ||||
| - Ulf H<>rnhammar fixed a format string (printf style) problem in the Negotiate | ||||
|   code. It should however not be the cause of any troubles. He also fixed a | ||||
|   few similar problems in the HTTP test server code. | ||||
|  | ||||
| Daniel (17 February 2006) | ||||
| - Shmulik Regev provided a fix for the DNS cache when using short life times, | ||||
|   as previously it could be holding on to old cached entries longer than | ||||
|   requested. | ||||
|  | ||||
| Daniel (11 February 2006) | ||||
| - Karl Moerder added the CURLOPT_CONNECT_ONLY and CURLINFO_LASTSOCKET options | ||||
|   that an app can use to let libcurl only connect to a remote host and then | ||||
|   extract the socket from libcurl. libcurl will then not attempt to do any | ||||
|   transfer at all after the connect is done. | ||||
|  | ||||
| - Kent Boortz improved the configure check for GnuTLS to properly set LIBS | ||||
|   instead of LDFLAGS. | ||||
|  | ||||
| Daniel (8 February 2006) | ||||
| - Philippe Vaucher provided a brilliant piece of test code that show a problem | ||||
|   with re-used FTP connections. If the second request on the same connection | ||||
|   was set not to fetch a "body", libcurl could get confused and consider it an | ||||
|   attempt to use a dead connection and would go acting mighty strange. | ||||
|  | ||||
| Daniel (2 February 2006) | ||||
| - Make --limit-rate [num] mean bytes. It used to be that but it broke in my | ||||
|   change done in November 2005. | ||||
|  | ||||
| Daniel (30 January 2006) | ||||
| - Added CURLOPT_LOCALPORT and CURLOPT_LOCALPORTRANGE to libcurl. Set with the | ||||
|   curl tool with --local-port. Plain and simply set the range of ports to bind | ||||
|   the local end of connections to. Implemented on to popular demand. | ||||
|  | ||||
| - Based on an error report by Philippe Vaucher, we no longer count a retried | ||||
|   connection setup as a follow-redirect. It turns out 1) this fails when a FTP | ||||
|   connection is re-setup and 2) it does make the max-redirs counter behave | ||||
|   wrong. | ||||
|  | ||||
| Daniel (24 January 2006) | ||||
| - Michal Marek provided a patch for FTP that makes libcurl continue to try | ||||
|   PASV even after EPSV returned a positive response code, if libcurl failed to | ||||
|   connect to the port number the EPSV response said. Obviously some people are | ||||
|   going through protocol-sensitive firewalls (or similar) that don't | ||||
|   understand EPSV and then they don't allow the second connection unless PASV | ||||
|   was used. This also called for a minor fix of test case 238. | ||||
|  | ||||
| Daniel (20 January 2006) | ||||
| - Duane Cathey was one of our friends who reported that curl -P [IP] | ||||
|   (CURLOPT_FTPPORT) didn't work for ipv6-enabed curls if the IP wasn't a | ||||
|   "native" IP while it works fine for ipv6-disabled builds! | ||||
|  | ||||
|   In the process of fixing this, I removed the support for LPRT since I can't | ||||
|   think of many reasons to keep doing it and asking on the mailing list didn't | ||||
|   reveal anyone else that could either. The code that sends EPRT and PORT is | ||||
|   now also a lot simpler than before (IMHO). | ||||
|  | ||||
| Daniel (19 January 2006) | ||||
| - Jon Turner pointed out that doing -P [hostname] (CURLOPT_FTPPORT) with curl | ||||
|   (built ipv4-only) didn't work. | ||||
|  | ||||
| Daniel (18 January 2006) | ||||
| - As reported in bug #1408742 (http://curl.haxx.se/bug/view.cgi?id=1408742), | ||||
|   the configure script complained about a missing "missing" script if you ran | ||||
|   configure within a path whose name included one or more spaces. This is due | ||||
|   to a flaw in automake (1.9.6 and earlier). I've now worked around it by | ||||
|   including an "overloaded" version of the AM_MISSING_HAS_RUN script that'll | ||||
|   be used instead of the one automake ships with. This kludge needs to be | ||||
|   removed once we get an automake version with this problem corrected. | ||||
|   Possibly we'll then need to convert this into a kludge depending on what | ||||
|   automake version that is used and that is gonna be painful and I don't even | ||||
|   want to think about that now...! | ||||
|  | ||||
| Daniel (17 January 2006) | ||||
| - David Shaw: Here is the latest libcurl.m4 autoconf tests. It is updated with | ||||
|   the latest features and protocols that libcurl supports and has a minor fix | ||||
|   to better deal with the obscure case where someone has more than one libcurl | ||||
|   installed at the same time. | ||||
|  | ||||
| Daniel (16 January 2006) | ||||
| - David Shaw finally removed all traces of Gopher and we are now officially | ||||
|   not supporting it. It hasn't been functioning for years anyway, so this is | ||||
|   just finally stating what already was true. And a cleanup at the same time. | ||||
|  | ||||
| - Bryan Henderson turned the 'initialized' variable for curl_global_init() | ||||
|   into a counter, and thus you can now do multiple curl_global_init() and you | ||||
|   are then supposed to do the same amount of calls to curl_global_cleanup(). | ||||
|   Bryan has also updated the docs accordingly. | ||||
|  | ||||
| Daniel (13 January 2006) | ||||
| - Andrew Benham fixed a race condition in the test suite that could cause the | ||||
|   test script to kill all processes in the current process group! | ||||
|  | ||||
| Daniel (12 January 2006) | ||||
| - Michael Jahn: | ||||
|  | ||||
|   Fixed FTP_SKIP_PASV_IP and FTP_USE_EPSV to "do right" when used on FTP thru | ||||
|   HTTP proxy. | ||||
|  | ||||
|   Fixed PROXYTUNNEL to work fine when you do ftp through a proxy.  It would | ||||
|   previously overwrite internal memory and cause unpredicted behaviour! | ||||
|  | ||||
| Daniel (11 January 2006) | ||||
| - I decided to document the "secret option" here now, as I've received *NO* | ||||
|   feedback at all on my mailing list requests from November 2005: | ||||
|  | ||||
|   I'm looking for feedback and comments. I added some experimental code the | ||||
|   other day, that allows a libcurl user to select what method libcurl should | ||||
|   use to reach a file on a FTP(S) server. | ||||
|  | ||||
|   This functionality is available in CVS code and in recent daily snapshots. | ||||
|  | ||||
|   Let me explain... | ||||
|  | ||||
|   The current name for the option is CURLOPT_FTP_FILEMETHOD (--ftp-method for | ||||
|   the command line tool) and you set it to a long (there are currenly no | ||||
|   defines for the argument values, just plain numericals). You can set three | ||||
|   different "methods" that do this: | ||||
|  | ||||
|   1 multicwd - like today, curl will do a single CWD operation for each path | ||||
|            part in the given URL. For deep hierarchies this means very many | ||||
|            commands. This is how RFC1738 says it should be done. This is the | ||||
|            default. | ||||
|  | ||||
|   2 nocwd - no CWD at all is done, curl will do SIZE, RETR, STOR etc and give | ||||
|            a full path to the server. | ||||
|  | ||||
|   3 singlecwd - make one CWD with the full target directory and then operate | ||||
|             on the file "normally". | ||||
|  | ||||
|   (With the command line tool you do --ftp-method [METHOD], where [METHOD] is | ||||
|   one of "multicwd", "nocwd" or "singlecwd".) | ||||
|  | ||||
|   What feedback I'm interested in: | ||||
|  | ||||
|   1 - Do they work at all? Do you find servers where one of these don't work? | ||||
|  | ||||
|   2 - What would proper names for the option and its arguments be, if we | ||||
|       consider this feature good enough to get included and documented in | ||||
|       upcoming releases? | ||||
|  | ||||
|   3 - Should we make libcurl able to "walk through" these options in case of | ||||
|       (path related) failures, or should it fail and let the user redo any | ||||
|       possible retries? | ||||
|  | ||||
|   (This option is not documented in any man page just yet since I'm not sure | ||||
|   these names will be used or if the functionality will end up exactly like | ||||
|   this.  And for the same reasons we have no test cases for these yet.) | ||||
|  | ||||
| Daniel (10 January 2006) | ||||
| - When using a bad path over FTP, as in when libcurl couldn't CWD into all | ||||
|   given subdirs, libcurl would still "remember" the full path as if it is the | ||||
|   current directory libcurl is in so that the next curl_easy_perform() would | ||||
|   get really confused if it tried the same path again - as it would not issue | ||||
|   any CWD commands at all, assuming it is already in the "proper" dir. | ||||
|  | ||||
|   Starting now, a failed CWD command sets a flag that prevents the path to be | ||||
|   "remembered" after returning. | ||||
|  | ||||
| Daniel (7 January 2006) | ||||
| - Michael Jahn fixed so that the second CONNECT when doing FTP over a HTTP | ||||
|   proxy actually used a new connection and not sent the second request on the | ||||
|   first socket! | ||||
|  | ||||
| Daniel (6 January 2006) | ||||
| - Alexander Lazic made the buildconf run the buildconf in the ares dir if that | ||||
|   is present instead of trying to mimic that script in curl's buildconf | ||||
|   script. | ||||
|  | ||||
| Daniel (3 January 2006) | ||||
| - Andres Garcia made the TFTP test server build with mingw. | ||||
|  | ||||
| Daniel (16 December 2005) | ||||
| - Jean Jacques Drouin pointed out that you could only have a user name or | ||||
|   password of 127 bytes or less embedded in a URL, where actually the code | ||||
|   uses a 255 byte buffer for it! Modified now to use the full buffer size. | ||||
|  | ||||
| Daniel (12 December 2005) | ||||
| - Dov Murik corrected the HTTP_ONLY define to disable the TFTP support properly | ||||
|  | ||||
| Version 7.15.1 (7 December 2005) | ||||
|  | ||||
| Daniel (6 December 2005) | ||||
| - Full text here: http://curl.haxx.se/docs/adv_20051207.html Pointed out by | ||||
|   Stefan Esser. | ||||
|  | ||||
|   VULNERABILITY | ||||
|  | ||||
|   libcurl's URL parser function can overflow a malloced buffer in two ways, if | ||||
|   given a too long URL. | ||||
|  | ||||
|   These overflows happen if you | ||||
|   | ||||
|   1 - pass in a URL with no protocol (like "http://") prefix, using no slash | ||||
|       and the string is 256 bytes or longer. This leads to a single zero byte | ||||
|       overflow of the malloced buffer. | ||||
|  | ||||
|   2 - pass in a URL with only a question mark as separator (no slash) between | ||||
|       the host and the query part of the URL. This leads to a single zero byte | ||||
|       overflow of the malloced buffer. | ||||
|  | ||||
|   Both overflows can be made with the same input string, leading to two single | ||||
|   zero byte overwrites. | ||||
|  | ||||
|   The affected flaw cannot be triggered by a redirect, but the long URL must | ||||
|   be passed in "directly" to libcurl. It makes this a "local" problem. Of | ||||
|   course, lots of programs may still pass in user-provided URLs to libcurl | ||||
|   without doing much syntax checking of their own, allowing a user to exploit | ||||
|   this vulnerability. | ||||
|  | ||||
|   There is no known exploit at the time of this writing. | ||||
|  | ||||
|  | ||||
| Daniel (2 December 2005) | ||||
| - Jamie Newton pointed out that libcurl's file:// code would close() a zero | ||||
|   file descriptor if given a non-existing file. | ||||
|  | ||||
| Daniel (24 November 2005) | ||||
| - Doug Kaufman provided a set of patches to make curl build fine on DJGPP | ||||
|   again using configure. | ||||
|  | ||||
| - Yang Tse provided a whole series of patches to clear up compiler warnings on | ||||
|   MSVC 6. | ||||
|  | ||||
| Daniel (17 November 2005) | ||||
| - I extended a patch from David Shaw to make libcurl _always_ provide an error | ||||
|   string in the given error buffer to address the flaw mention on 21 sep 2005. | ||||
|  | ||||
| Daniel (16 November 2005) | ||||
| - Applied Albert Chin's patch that makes the libcurl.pc pkgconfig file get | ||||
|   installed on 'make install' time. | ||||
|  | ||||
| Daniel (14 November 2005) | ||||
| - Quagmire reported that he needed to raise a NTLM buffer for SSPI to work | ||||
|   properly for a case, and so we did. We raised it even for non-SSPI builds | ||||
|   but it should not do any harm. http://curl.haxx.se/bug/view.cgi?id=1356715 | ||||
|  | ||||
| - Jan Kunder's debian bug report | ||||
|   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=338680 identified a weird | ||||
|   error message for when you try to upload a file and the requested directory | ||||
|   doesn't exist on the target server. | ||||
|  | ||||
| - Yang Tse fixed compiler warnings in lib/ssluse.c with OpenSSL 0.9.8 and in | ||||
|   lib/memdebug.h that showed up in his msvc builds. | ||||
|  | ||||
| Daniel (13 November 2005) | ||||
| - Debian bug report 338681 by Jan Kunder: make curl better detect and report | ||||
|   bad limit-rate units: | ||||
|   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=338681 Now curl will return | ||||
|   error if a bad unit is used. | ||||
|  | ||||
| - Thanks to this nice summary of poll() implementations: | ||||
|   http://www.greenend.org.uk/rjk/2001/06/poll.html and further tests by Eugene | ||||
|   Kotlyarov, we now know that cygwin's poll returns only POLLHUP on remote | ||||
|   connectin closure so we check for that case (too) and re-enable poll for | ||||
|   cygwin builds. | ||||
|  | ||||
| Daniel (12 November 2005) | ||||
| - Eugene Kotlyarov found out that cygwin's poll() function isn't doing things | ||||
|   right: http://curl.haxx.se/mail/archive-2005-11/0045.html so we now disable | ||||
|   poll() and use select() on cygwin too (we already do the same choice on Mac | ||||
|   OS X) | ||||
|  | ||||
| - Dima Barsky patched problem #1348930: the GnuTLS code completely ignored | ||||
|   client certificates! (http://curl.haxx.se/bug/view.cgi?id=1348930). | ||||
|  | ||||
| Daniel (10 November 2005) | ||||
| - David Lang fixed IPv6 support for TFTP! | ||||
|  | ||||
| - Introducing range stepping to the curl globbing support. Now you can specify | ||||
|   step counter by adding :[num] within the brackets when specifying a range: | ||||
|  | ||||
|    [1-100:10] | ||||
|    [a-z:2] | ||||
|  | ||||
|   If no step counter is set, it defaults to 1 as before: | ||||
|  | ||||
|    [1-100] | ||||
|    [d-h] | ||||
|  | ||||
| Daniel (8 November 2005) | ||||
| - Removed the use of AI_CANONNAME in the IPv6-enabled resolver functions since | ||||
|   we really have no use for reverse lookups of the address. | ||||
|  | ||||
|   I truly hope these are the last reverse lookups we had lingering in the | ||||
|   code! | ||||
|  | ||||
| - Dmitry Bartsevich discovered some issues in compatibilty of SSPI-enabled | ||||
|   version of libcurl with different Windows versions. Current version of | ||||
|   libcurl imports SSPI functions from secur32.dll. However, under Windows NT | ||||
|   4.0 these functions are located in security.dll, under Windows 9x - in | ||||
|   secur32.dll and Windows 2000 and XP contains both these DLLs (security.dll | ||||
|   just forwards calls to secur32.dll). | ||||
|  | ||||
|   Dmitry's patch loads proper library dynamically depending on Windows | ||||
|   version. Function InitSecurityInterface() is used to obtain pointers to all | ||||
|   of SSPI function in one structure. | ||||
|  | ||||
| Daniel (31 October 2005) | ||||
| - Vilmos Nebehaj improved libcurl's LDAP abilities: | ||||
|  | ||||
|   The LDAP code in libcurl can't handle LDAP servers of LDAPv3 nor binary | ||||
|   attributes in LDAP objects. So, I made a quick patch to address these | ||||
|   problems. | ||||
|  | ||||
|   The solution is simple: if we connect to an LDAP server, first try LDAPv3 | ||||
|   (which is the preferred protocol as of now) and then fall back to LDAPv2. | ||||
|   In case of binary attributes, we first convert them to base64, just like the | ||||
|   openldap client does. It uses ldap_get_values_len() instead of | ||||
|   ldap_get_values() to be able to retrieve binary attributes correctly. I | ||||
|   defined the necessary LDAP macros in lib/ldap.c to be able to compile | ||||
|   libcurl without the presence of libldap | ||||
|  | ||||
| Daniel (27 October 2005) | ||||
| - Nis Jorgensen filed bug report #1338648 | ||||
|   (http://curl.haxx.se/bug/view.cgi?id=1338648) which really is more of a | ||||
|   feature request, but anyway. It pointed out that --max-redirs did not allow | ||||
|   it to be set to 0, which then would return an error code on the first | ||||
|   Location: found. Based on Nis' patch, now libcurl supports CURLOPT_MAXREDIRS | ||||
|   set to 0, or -1 for infinity. Added test case 274 to verify. | ||||
|  | ||||
| - tommink[at]post.pl reported in bug report #1337723 | ||||
|   (http://curl.haxx.se/bug/view.cgi?id=1337723) that curl could not upload | ||||
|   binary data from stdin on Windows if the data contained control-Z (hex 1a) | ||||
|   since that is treated as end-of-file when read in text mode. Gisle Vanem | ||||
|   pointed out the fix, and I made both -T and --data-binary take advantage of | ||||
|   it. | ||||
|  | ||||
| - Jaz Fresh pointed out that if you used "-r [number]" as was wrongly described | ||||
|   in the man page, curl would send an invalid HTTP Range: header. The correct | ||||
|   way would be to use "-r [number]-" or even "-r -[number]". Starting now, | ||||
|   curl will warn if this is discovered, and automatically append a dash to the | ||||
|   range before passing it to libcurl. | ||||
|  | ||||
| Daniel (25 October 2005) | ||||
| - Amol Pattekar reported a bug with great detail and a fine example in bug | ||||
|   #1326306 (http://curl.haxx.se/bug/view.cgi?id=1326306). When using the multi | ||||
|   interface and connecting to a host with multiple IP addresses, and one of | ||||
|   the addresses fails to connect (the server must exist and respond, just not | ||||
|   accept connections) libcurl leaks a socket descriptor. Thanks to the fine | ||||
|   report, I could find and fix this. | ||||
|  | ||||
| Daniel (22 October 2005) | ||||
| - Dima Barsky reported a problem with GnuTLS-enabled libcurl in bug report | ||||
|   #1334338 (http://curl.haxx.se/bug/view.cgi?id=1334338). When reading an SSL | ||||
|   stream from a server and the server requests a "rehandshake", the current | ||||
|   code simply returns this as an error. I have no good way to test this, but | ||||
|   I've added a crude attempt of dealing with this situation slightly better - | ||||
|   it makes a blocking handshake if this happens. Done like this because fixing | ||||
|   this the "proper" way (that would handshake asynchronously) will require | ||||
|   quite some work and I really need a good way to test this to do such a | ||||
|   change. | ||||
|  | ||||
| Daniel (21 October 2005) | ||||
| - "Ofer" reported a problem when libcurl re-used a connection and failed to do | ||||
|   it, it could then accidentally actually crash. Presumably, this concerns FTP | ||||
|   connections.  http://curl.haxx.se/bug/view.cgi?id=1330310 | ||||
|  | ||||
| - Temprimus improved the MSVC makefile so that the static debug SSL libs are | ||||
|   linked to the executable and not to the libcurld.lib | ||||
|   http://curl.haxx.se/bug/view.cgi?id=1326676 | ||||
|  | ||||
| - Bradford Bruce made the windows resolver code properly return | ||||
|   CURLE_COULDNT_RESOLVE_PROXY and CURLE_COULDNT_RESOLVE_HOST on resolving | ||||
|   errors (as documented). | ||||
|  | ||||
| Daniel (20 October 2005) | ||||
| - Dave Dribin made libcurl understand and handle cases when the server | ||||
|   (wrongly) sends *two* WWW-Authenticate headers for Digest. While this should | ||||
|   never happen in a sane world, libcurl previously got into an infinite loop | ||||
|   when this occurred. Dave added test 273 to verify this. | ||||
|  | ||||
| - Temprimus improved the MSVC makefile: "makes a build option available so if | ||||
|   you set rtlibcfg=static for the make, then it would build with /MT. The | ||||
|   default behaviour is /MD (the original)." | ||||
|   http://curl.haxx.se/bug/view.cgi?id=1326665 | ||||
|  | ||||
| Daniel (14 October 2005) | ||||
| - Reverted the LIBCURL_VERSION_NUM change from October 6. As Dave Dribin | ||||
|   reported, the define is used by the configure script and is assumed to use | ||||
|   the 0xYYXXZZ format. This made "curl-config --vernum" fail in the 7.15.0 | ||||
|   release version. | ||||
|  | ||||
| Version 7.15.0 (13 October 2005) | ||||
|  | ||||
|   | ||||
							
								
								
									
										2
									
								
								COPYING
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								COPYING
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| COPYRIGHT AND PERMISSION NOTICE | ||||
|  | ||||
| Copyright (c) 1996 - 2005, Daniel Stenberg, <daniel@haxx.se>. | ||||
| Copyright (c) 1996 - 2006, Daniel Stenberg, <daniel@haxx.se>. | ||||
|  | ||||
| All rights reserved. | ||||
|  | ||||
|   | ||||
| @@ -31,6 +31,9 @@ bin_SCRIPTS = curl-config | ||||
| SUBDIRS = lib src | ||||
| DIST_SUBDIRS = $(SUBDIRS) tests include packages docs | ||||
|  | ||||
| pkgconfigdir = $(libdir)/pkgconfig | ||||
| pkgconfig_DATA = libcurl.pc | ||||
|  | ||||
| dist-hook: | ||||
| 	rm -rf $(top_builddir)/tests/log | ||||
| 	find $(distdir) -name "*.dist" -exec rm {} \; | ||||
|   | ||||
							
								
								
									
										54
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								README
									
									
									
									
									
								
							| @@ -32,31 +32,35 @@ WEB SITE | ||||
|  | ||||
|   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.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/ | ||||
|         US (TX)   -- http://curl.mirrors.cyberservers.net/ | ||||
|         US (TX)   -- http://curl.seekmeup.com/ | ||||
|         US (TX)   -- http://curl.hostingzero.com/ | ||||
|         Sweden       http://curl.haxx.se/ | ||||
|         Australia    http://curl.planetmirror.com/ | ||||
|         Austria      http://curl.gds.tuwien.ac.at/ | ||||
|         Denmark      http://curl.cofman.dk/ | ||||
|         France       http://curl.fastmirror.net/ | ||||
|         Germany      http://curl.freemirror.de/ | ||||
|         Germany      http://curl.mirror-server.net/ | ||||
|         Germany      http://curl.mirror.at.stealer.net/ | ||||
|         Germany      http://curl.mirroring.de/ | ||||
|         Germany      http://curl.miscellaneousmirror.org/ | ||||
|         Germany      http://curl.mons-new-media.de/ | ||||
|         Germany      http://curl.storemypix.com/ | ||||
|         Germany      http://curl.triplemind.com/ | ||||
|         Hong Kong    http://curl.hkmirror.org/ | ||||
|         Japan        http://curl.s-lines.net/ | ||||
|         Netherlands  http://curl.nedmirror.nl/ | ||||
|         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.meulie.net/ | ||||
|         US (CA)      http://curl.mirror.redwire.net/ | ||||
|         US (CA)      http://curl.mirrormonster.com/ | ||||
|         US (CA)      http://curl.signal42.com/ | ||||
|         US (FL)      http://curl.hoxt.com/ | ||||
|         US (TX)      http://curl.109k.com/ | ||||
|         US (TX)      http://curl.hostingzero.com/ | ||||
|         US (TX)      http://curl.mirrors.cyberservers.net/ | ||||
|         US (TX)      http://curl.seekmeup.com/ | ||||
|  | ||||
| CVS | ||||
|  | ||||
|   | ||||
| @@ -1,46 +1,40 @@ | ||||
| Curl and libcurl 7.15.0 | ||||
| Curl and libcurl 7.15.3 | ||||
|  | ||||
|  Public curl release number:               90 | ||||
|  Releases counted from the very beginning: 117 | ||||
|  Available command line options:           109 | ||||
|  Available curl_easy_setopt() options:     124 | ||||
|  Public curl release number:               93 | ||||
|  Releases counted from the very beginning: 120 | ||||
|  Available command line options:           112 | ||||
|  Available curl_easy_setopt() options:     129 | ||||
|  Number of public functions in libcurl:    46 | ||||
|  Amount of public web site mirrors:        24 | ||||
|  Amount of public web site mirrors:        31 | ||||
|  Number of known libcurl bindings:         32 | ||||
|  Number of contributors:                   451 | ||||
|  Number of contributors:                   487 | ||||
|  | ||||
| This release includes the following changes: | ||||
|  | ||||
|  o --ftp-skip-pasv-ip / CURLOPT_FTP_SKIP_PASV_IP (sponsored by CU*Answers) | ||||
|  o TFTP support added | ||||
|  o added docs for --ftp-method and CURLOPT_FTP_FILEMETHOD | ||||
|  | ||||
| This release includes the following bugfixes: | ||||
|  | ||||
|  o user+domain name buffer overflow in the NTLM code (security flaw) | ||||
|  o -z over FTP now considers equal timestamps "not modified since" | ||||
|  o Weird characters removed from the configure script | ||||
|  o Fixed time zone offsets for MEST and CEST for the time parser | ||||
|  o HTTP Content-Range header parser crash | ||||
|  o FTPS negotiation timeouts/errors | ||||
|  o SSPI works even for Windows 9x | ||||
|  o crash in --dump-header on FTP | ||||
|  o test 56 runs better | ||||
|  o TFTP Packet Buffer Overflow Vulnerability: | ||||
|    http://curl.haxx.se/docs/adv_20060320.html | ||||
|  o properly detecting problems with sending the FTP command USER | ||||
|  o wrong error message shown when certificate verification failed | ||||
|  o multi-part formpost with multi interface crash | ||||
|  o the CURLFTPSSL_CONTROL setting for CURLOPT_FTP_SSL is acknowledged | ||||
|  o "SSL: couldn't set callback" is now treated as a less serious problem | ||||
|  o Interix build fix | ||||
|  o fixed curl "hang" when out of file handles at start | ||||
|  o prevent FTP uploads to URLs with trailing slash | ||||
|  | ||||
| Other curl-related news since the previous public release: | ||||
|  | ||||
|  o http://curl.freemirror.de/ is a new German mirror | ||||
|  o All curl relatd mailing list information and subscribers on cool.haxx.se | ||||
|    were lost due to a malicious user exploiting a security hole on the | ||||
|    server. Attempts have been made to put back susbcribers on the lists, but | ||||
|    many have been lost: http://curl.haxx.se/mail/lost.html | ||||
|  o New S-Lang binding: http://curl.haxx.se/libcurl/slang/ | ||||
|  o TclCurl 0.14.1: http://personal1.iddeo.es/andresgarci/tclcurl/english/ | ||||
|  o pycurl 7.14.1: http://pycurl.sf.net/ | ||||
|  o pycurl-7.15.2 has been released: http://pycurl.sf.net | ||||
|  o http://curl.download.nextag.com/ is a new US curl web mirror! | ||||
|  | ||||
| This release would not have looked like this without help, code, reports and | ||||
| advice from friends like these: | ||||
|  | ||||
|  o John Kelly, Nicolas Fran<EFBFBD>ois, Scott Davis, Ben Madsen, Dmitry Bartsevich, | ||||
|    David Yan, Michael Wallner, Domenico Andreoli, Darryl House | ||||
|  Gisle Vanem, Dan Fandrich, Thomas Klausner, Todd Vierling, Peter Heuchert, | ||||
|  Markus Koetter, David McCreedy, Tor Arntsen | ||||
|  | ||||
|         Thanks! (and sorry if I forgot to mention someone) | ||||
|   | ||||
| @@ -1,7 +1,4 @@ | ||||
| To get fixed in 7.15.0 (planned release: November 2005) | ||||
| To get fixed in 7.15.2 (planned release: Febrary 2006) | ||||
| ====================== | ||||
|  | ||||
| 60 - CONNECT 407 responses that kills the connection (not very likely though) | ||||
|  | ||||
| 63 -  | ||||
|  | ||||
| 65 -  | ||||
|   | ||||
							
								
								
									
										539
									
								
								acinclude.m4
									
									
									
									
									
								
							
							
						
						
									
										539
									
								
								acinclude.m4
									
									
									
									
									
								
							| @@ -1,3 +1,393 @@ | ||||
| #*************************************************************************** | ||||
| #                                  _   _ ____  _ | ||||
| #  Project                     ___| | | |  _ \| | | ||||
| #                             / __| | | | |_) | | | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # | ||||
| # This software is licensed as described in the file COPYING, which | ||||
| # you should have received as part of this distribution. The terms | ||||
| # are also available at http://curl.haxx.se/docs/copyright.html. | ||||
| # | ||||
| # You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||
| # copies of the Software, and permit persons to whom the Software is | ||||
| # furnished to do so, under the terms of the COPYING file. | ||||
| # | ||||
| # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||
| # KIND, either express or implied. | ||||
| # | ||||
| # $Id$ | ||||
| ########################################################################### | ||||
|  | ||||
| dnl CURL_CHECK_HEADER_WINDOWS | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for compilable and valid windows.h header  | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [ | ||||
|   AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [ | ||||
|     AC_COMPILE_IFELSE([ | ||||
|       AC_LANG_PROGRAM([ | ||||
| #undef inline | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
|       ],[ | ||||
|         int dummy=2*WINVER; | ||||
|       ]) | ||||
|     ],[ | ||||
|       ac_cv_header_windows_h="yes" | ||||
|     ],[ | ||||
|       ac_cv_header_windows_h="no" | ||||
|     ]) | ||||
|   ]) | ||||
|   if test "x$ac_cv_header_windows_h" = "xyes"; then | ||||
|     AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1, | ||||
|       [Define to 1 if you have the windows.h header file.]) | ||||
|     AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1, | ||||
|       [Define to avoid automatic inclusion of winsock.h]) | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_HEADER_WINSOCK | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for compilable and valid winsock.h header  | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [ | ||||
|   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl | ||||
|   AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [ | ||||
|     AC_COMPILE_IFELSE([ | ||||
|       AC_LANG_PROGRAM([ | ||||
| #undef inline | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #include <winsock.h> | ||||
|       ],[ | ||||
|         int dummy=WSACleanup(); | ||||
|       ]) | ||||
|     ],[ | ||||
|       ac_cv_header_winsock_h="yes" | ||||
|     ],[ | ||||
|       ac_cv_header_winsock_h="no" | ||||
|     ]) | ||||
|   ]) | ||||
|   if test "x$ac_cv_header_winsock_h" = "xyes"; then | ||||
|     AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1, | ||||
|       [Define to 1 if you have the winsock.h header file.]) | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_HEADER_WINSOCK2 | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for compilable and valid winsock2.h header  | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [ | ||||
|   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl | ||||
|   AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [ | ||||
|     AC_COMPILE_IFELSE([ | ||||
|       AC_LANG_PROGRAM([ | ||||
| #undef inline | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #include <winsock2.h> | ||||
|       ],[ | ||||
|         int dummy=2*IPPROTO_ESP; | ||||
|       ]) | ||||
|     ],[ | ||||
|       ac_cv_header_winsock2_h="yes" | ||||
|     ],[ | ||||
|       ac_cv_header_winsock2_h="no" | ||||
|     ]) | ||||
|   ]) | ||||
|   if test "x$ac_cv_header_winsock2_h" = "xyes"; then | ||||
|     AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1, | ||||
|       [Define to 1 if you have the winsock2.h header file.]) | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_HEADER_WS2TCPIP | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for compilable and valid ws2tcpip.h header | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [ | ||||
|   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl | ||||
|   AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [ | ||||
|     AC_COMPILE_IFELSE([ | ||||
|       AC_LANG_PROGRAM([ | ||||
| #undef inline | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #include <winsock2.h> | ||||
| #include <ws2tcpip.h> | ||||
|       ],[ | ||||
|         int dummy=2*IP_PKTINFO; | ||||
|       ]) | ||||
|     ],[ | ||||
|       ac_cv_header_ws2tcpip_h="yes" | ||||
|     ],[ | ||||
|       ac_cv_header_ws2tcpip_h="no" | ||||
|     ]) | ||||
|   ]) | ||||
|   if test "x$ac_cv_header_ws2tcpip_h" = "xyes"; then | ||||
|     AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1, | ||||
|       [Define to 1 if you have the ws2tcpip.h header file.]) | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_TYPE_SOCKLEN_T | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for existing socklen_t type, and provide | ||||
| dnl an equivalent type if socklen_t not available | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [ | ||||
|   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl | ||||
|   AC_CHECK_TYPE([socklen_t], ,[ | ||||
|     AC_CACHE_CHECK([for socklen_t equivalent],  | ||||
|       [curl_cv_socklen_t_equiv], [ | ||||
|       curl_cv_socklen_t_equiv="unknown" | ||||
|       for arg2 in "struct sockaddr" void; do | ||||
|         for t in int size_t unsigned long "unsigned long"; do | ||||
|           AC_COMPILE_IFELSE([ | ||||
|             AC_LANG_PROGRAM([ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #else | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #endif | ||||
|               int getpeername (int, $arg2 *, $t *); | ||||
|             ],[ | ||||
|               $t len=0; | ||||
|               getpeername(0,0,&len); | ||||
|             ]) | ||||
|           ],[ | ||||
|              curl_cv_socklen_t_equiv="$t" | ||||
|              break 2 | ||||
|           ]) | ||||
|         done | ||||
|       done | ||||
|     ]) | ||||
|     if test "$curl_cv_socklen_t_equiv" = "unknown"; then | ||||
|       AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) | ||||
|     else | ||||
|       AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv, | ||||
|         [type to use in place of socklen_t if not defined]) | ||||
|     fi | ||||
|   ],[ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #endif | ||||
|   ]) | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_FUNC_GETNAMEINFO | ||||
| dnl ------------------------------------------------- | ||||
| dnl Test if the getnameinfo function is available,  | ||||
| dnl and check the types of five of its arguments. | ||||
| dnl If the function succeeds HAVE_GETNAMEINFO will be | ||||
| dnl defined, defining the types of the arguments in | ||||
| dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2, | ||||
| dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7. | ||||
| dnl This function is experimental and its results shall | ||||
| dnl not be trusted while this notice is in place ------ | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [ | ||||
|   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl | ||||
|   AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl | ||||
|   AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h) | ||||
|   # | ||||
|   AC_MSG_CHECKING([for getnameinfo]) | ||||
|   AC_LINK_IFELSE([ | ||||
|       AC_LANG_FUNC_LINK_TRY([getnameinfo]) | ||||
|     ],[ | ||||
|       AC_MSG_RESULT([yes]) | ||||
|       curl_cv_getnameinfo="yes" | ||||
|     ],[ | ||||
|       AC_MSG_RESULT([no]) | ||||
|       curl_cv_getnameinfo="no" | ||||
|   ]) | ||||
|   # | ||||
|   if test "$curl_cv_getnameinfo" != "yes"; then | ||||
|     AC_MSG_CHECKING([deeper for getnameinfo]) | ||||
|     AC_TRY_LINK([ | ||||
|       ],[ | ||||
|         getnameinfo(); | ||||
|       ],[ | ||||
|         AC_MSG_RESULT([yes]) | ||||
|         curl_cv_getnameinfo="yes" | ||||
|       ],[ | ||||
|         AC_MSG_RESULT([but still no]) | ||||
|         curl_cv_getnameinfo="no" | ||||
|     ]) | ||||
|   fi | ||||
|   # | ||||
|   if test "$curl_cv_getnameinfo" != "yes"; then | ||||
|     AC_MSG_CHECKING([deeper and deeper for getnameinfo]) | ||||
|     AC_TRY_LINK([ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETDB_H | ||||
| #include <netdb.h> | ||||
| #endif | ||||
| #endif | ||||
|       ],[ | ||||
|         getnameinfo(0, 0, 0, 0, 0, 0, 0); | ||||
|       ],[  | ||||
|         AC_MSG_RESULT([yes]) | ||||
|         curl_cv_getnameinfo="yes" | ||||
|       ],[ | ||||
|         AC_MSG_RESULT([but still no]) | ||||
|         curl_cv_getnameinfo="no" | ||||
|     ]) | ||||
|   fi | ||||
|   # | ||||
|   if test "$curl_cv_getnameinfo" = "yes"; then | ||||
|     AC_CACHE_CHECK([types of arguments for getnameinfo], | ||||
|       [curl_cv_func_getnameinfo_args], [ | ||||
|       curl_cv_func_getnameinfo_args="unknown" | ||||
|       for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do | ||||
|         for gni_arg2 in 'socklen_t' 'size_t' 'int'; do | ||||
|           for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int' 'DWORD'; do | ||||
|             for gni_arg7 in 'int' 'unsigned int'; do | ||||
|               AC_COMPILE_IFELSE([ | ||||
|                 AC_LANG_PROGRAM([ | ||||
| #undef inline  | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501) | ||||
| #undef _WIN32_WINNT | ||||
| #define _WIN32_WINNT 0x0501 | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h>  | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #define GNICALLCONV WSAAPI | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETDB_H | ||||
| #include <netdb.h> | ||||
| #endif | ||||
| #define GNICALLCONV | ||||
| #endif | ||||
|                   extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2, | ||||
|                                          char *, $gni_arg46, | ||||
|                                          char *, $gni_arg46, | ||||
|                                          $gni_arg7); | ||||
|                 ],[ | ||||
|                   $gni_arg2 salen=0; | ||||
|                   $gni_arg46 hostlen=0; | ||||
|                   $gni_arg46 servlen=0; | ||||
|                   $gni_arg7 flags=0; | ||||
|                   int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags); | ||||
|                 ]) | ||||
|               ],[ | ||||
|                  curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7" | ||||
|                  break 4 | ||||
|               ]) | ||||
|             done | ||||
|           done | ||||
|         done | ||||
|       done | ||||
|     ]) # AC_CACHE_CHECK | ||||
|     if test "$curl_cv_func_getnameinfo_args" = "unknown"; then | ||||
|       AC_MSG_WARN([Cannot find proper types to use for getnameinfo args]) | ||||
|       AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined]) | ||||
|     else | ||||
|       gni_prev_IFS=$IFS; IFS=',' | ||||
|       set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'` | ||||
|       IFS=$gni_prev_IFS | ||||
|       shift | ||||
|       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $[1], | ||||
|         [Define to the type of arg 1 for getnameinfo.]) | ||||
|       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2], | ||||
|         [Define to the type of arg 2 for getnameinfo.]) | ||||
|       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3], | ||||
|         [Define to the type of args 4 and 6 for getnameinfo.]) | ||||
|       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4], | ||||
|         [Define to the type of arg 7 for getnameinfo.]) | ||||
|       AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1, | ||||
|         [Define to 1 if you have the getnameinfo function.]) | ||||
|       ac_cv_func_getnameinfo="yes" | ||||
|     fi | ||||
|   fi | ||||
| ]) # AC_DEFUN | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_NONBLOCKING_SOCKET | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for how to set a socket to non-blocking state. There seems to exist | ||||
| dnl 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, | ||||
| @@ -59,12 +449,27 @@ 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?) */ | ||||
| /* headers for ioctlsocket test (Windows) */ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #else | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #endif | ||||
| #endif | ||||
| ],[ | ||||
| /* ioctlsocket source code */ | ||||
|  int socket; | ||||
|  unsigned long flags = ioctlsocket(socket, FIONBIO, &flags); | ||||
|  SOCKET sd; | ||||
|  unsigned long flags = 0; | ||||
|  sd = socket(0, 0, 0); | ||||
|  ioctlsocket(sd, FIONBIO, &flags); | ||||
| ],[ | ||||
| dnl ioctlsocket test was good | ||||
| nonblock="ioctlsocket" | ||||
| @@ -122,6 +527,9 @@ dnl end of non-blocking try-compile test | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl TYPE_SOCKADDR_STORAGE | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but | ||||
| dnl AIX 4.3 is one known exception. | ||||
| AC_DEFUN([TYPE_SOCKADDR_STORAGE], | ||||
| @@ -130,6 +538,16 @@ AC_DEFUN([TYPE_SOCKADDR_STORAGE], | ||||
|         AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1, | ||||
|                   [if struct sockaddr_storage is defined]), , | ||||
|    [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| @@ -142,55 +560,13 @@ AC_DEFUN([TYPE_SOCKADDR_STORAGE], | ||||
| #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 | ||||
| dnl have to test to find something that will work. | ||||
| AC_DEFUN([TYPE_SOCKLEN_T], | ||||
| [ | ||||
|    AC_CHECK_TYPE([socklen_t], ,[ | ||||
|       AC_MSG_CHECKING([for socklen_t equivalent]) | ||||
|       AC_CACHE_VAL([curl_cv_socklen_t_equiv], | ||||
|       [ | ||||
|          # Systems have either "struct sockaddr *" or | ||||
|          # "void *" as the second argument to getpeername | ||||
|          curl_cv_socklen_t_equiv= | ||||
|          for arg2 in "struct sockaddr" void; do | ||||
|             for t in int size_t unsigned long "unsigned long"; do | ||||
|                AC_TRY_COMPILE([ | ||||
|                   #ifdef HAVE_SYS_TYPES_H | ||||
|                   #include <sys/types.h> | ||||
| #endif | ||||
|                   #ifdef HAVE_SYS_SOCKET_H | ||||
|                   #include <sys/socket.h> | ||||
|                   #endif | ||||
|  | ||||
|                   int getpeername (int, $arg2 *, $t *); | ||||
|                ],[ | ||||
|                   $t len; | ||||
|                   getpeername(0,0,&len); | ||||
|                ],[ | ||||
|                   curl_cv_socklen_t_equiv="$t" | ||||
|                   break | ||||
|    ]) | ||||
|             done | ||||
|          done | ||||
|  | ||||
|          if test "x$curl_cv_socklen_t_equiv" = x; then | ||||
|             AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) | ||||
|          fi | ||||
|       ]) | ||||
|       AC_MSG_RESULT($curl_cv_socklen_t_equiv) | ||||
|       AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv, | ||||
| 			[type to use in place of socklen_t if not defined])], | ||||
|       [#include <sys/types.h> | ||||
| #include <sys/socket.h>]) | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl TYPE_IN_ADDR_T | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for in_addr_t: it is used to receive the return code of inet_addr() | ||||
| dnl and a few other things. | ||||
| AC_DEFUN([TYPE_IN_ADDR_T], | ||||
| @@ -202,14 +578,32 @@ AC_DEFUN([TYPE_IN_ADDR_T], | ||||
|          curl_cv_in_addr_t_equiv= | ||||
|          for t in "unsigned long" int size_t unsigned long; do | ||||
|             AC_TRY_COMPILE([ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #else | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_INET_H | ||||
| #include <arpa/inet.h> | ||||
| #endif | ||||
| #endif | ||||
|             ],[ | ||||
|                $t data = inet_addr ("1.2.3.4"); | ||||
| @@ -226,10 +620,36 @@ AC_DEFUN([TYPE_IN_ADDR_T], | ||||
|       AC_MSG_RESULT($curl_cv_in_addr_t_equiv) | ||||
|       AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv, | ||||
| 			[type to use in place of in_addr_t if not defined])], | ||||
|       [#include <sys/types.h> | ||||
|       [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #else | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #include <arpa/inet.h>]) | ||||
| ]) | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_INET_H | ||||
| #include <arpa/inet.h> | ||||
| #endif | ||||
| #endif | ||||
|   ]) dnl AC_CHECK_TYPE | ||||
| ]) dnl AC_DEFUN | ||||
|  | ||||
| dnl ************************************************************ | ||||
| dnl check for "localhost", if it doesn't exist, we can't do the | ||||
| @@ -684,6 +1104,7 @@ if test "$ac_cv_func_gethostbyname_r" = "yes"; then | ||||
| fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl We create a function for detecting which compiler we use and then set as | ||||
| dnl pendantic compiler options as possible for that particular compiler. The | ||||
| dnl options are only used for debug-builds. | ||||
| @@ -881,3 +1302,19 @@ else | ||||
|   AC_MSG_RESULT($DLFOUNDFILE) | ||||
| fi | ||||
| ]) | ||||
|  | ||||
| # This is only a temporary fix. This macro is here to replace the broken one | ||||
| # delivered by the automake project (including the 1.9.6 release). As soon as | ||||
| # they ship a working version we SHOULD remove this work-around. | ||||
|  | ||||
| AC_DEFUN([AM_MISSING_HAS_RUN], | ||||
| [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl | ||||
| test x"${MISSING+set}" = xset || MISSING="\${SHELL} \"$am_aux_dir/missing\"" | ||||
| # Use eval to expand $SHELL | ||||
| if eval "$MISSING --run true"; then | ||||
|   am_missing_run="$MISSING --run " | ||||
| else | ||||
|   am_missing_run= | ||||
|   AC_MSG_WARN([`missing' script is too old or missing]) | ||||
| fi | ||||
| ]) | ||||
|   | ||||
| @@ -11,3 +11,4 @@ Dan Fandrich | ||||
| Gisle Vanem | ||||
| Gunter Knauf | ||||
| Henrik Stoerner | ||||
| Yang Tse | ||||
|   | ||||
							
								
								
									
										24
									
								
								ares/CHANGES
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								ares/CHANGES
									
									
									
									
									
								
							| @@ -1,5 +1,29 @@ | ||||
|   Changelog for the c-ares project | ||||
|  | ||||
| * January 9, 2006 | ||||
|  | ||||
| - Alexander Lazic improved the getservbyport_r() configure check. | ||||
|  | ||||
| * January 6, 2006 | ||||
|  | ||||
| - Alexander Lazic pointed out that the buildconf should use the ACLOCAL_FLAGS | ||||
|   variable for easier controlling what it does and how it runs. | ||||
|  | ||||
| * January 5, 2006 | ||||
|  | ||||
| - James Bursa fixed c-ares to find the hosts file on RISC OS, and made it | ||||
|   build with newer gcc versions that no longer defines "riscos". | ||||
|  | ||||
| * December 22 | ||||
|  | ||||
| - Daniel Stenberg added ares_getsock() that extracts the set of sockets to | ||||
|   wait for action on. Similar to ares_fds() but not restricted to using | ||||
|   select() for the waiting. | ||||
|  | ||||
| * November 25 | ||||
|  | ||||
| - Yang Tse fixed some send() / recv() compiler warnings | ||||
|  | ||||
| * September 18 | ||||
|  | ||||
| - Added constants that will be used by ares_getaddrinfo | ||||
|   | ||||
| @@ -13,6 +13,7 @@ Makefile.in | ||||
| Makefile.dj | ||||
| Makefile.m32 | ||||
| Makefile.netware | ||||
| Makefile.vc6 | ||||
| install-sh | ||||
| mkinstalldirs | ||||
| configure | ||||
|   | ||||
| @@ -4,10 +4,9 @@ lib_LTLIBRARIES = libcares.la | ||||
|  | ||||
| man_MANS = $(MANPAGES) | ||||
|  | ||||
| MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/adig/adig.mak	\ | ||||
|  vc/adig/adig.plg vc/vc.dsw vc/ahost/ahost.dep vc/ahost/ahost.dsp	\ | ||||
|  vc/ahost/ahost.mak vc/ahost/ahost.plg vc/areslib/areslib.dep		\ | ||||
|  vc/areslib/areslib.dsp vc/areslib/areslib.mak vc/areslib/areslib.plg | ||||
| MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/vc.dsw vc/ahost/ahost.dep \ | ||||
|  vc/ahost/ahost.dsp vc/areslib/areslib.dep vc/areslib/areslib.dsp	   \ | ||||
|  vc/areslib/areslib.dsw | ||||
|  | ||||
| # adig and ahost are just sample programs and thus not mentioned with the | ||||
| # regular sources and headers | ||||
|   | ||||
| @@ -9,7 +9,12 @@ include Makefile.inc | ||||
| WATT32_ROOT = $(subst \,/,$(WATT_ROOT)) | ||||
|  | ||||
| CC      = gcc | ||||
| CFLAGS  = -O2 -Wall -DWATT32 -Dselect=select_s -I$(WATT32_ROOT)/inc | ||||
| CFLAGS  = -O2 -Wall -DWATT32 -Dselect=select_s -DHAVE_AF_INET6 \ | ||||
|           -DHAVE_PF_INET6 -DHAVE_IOCTLSOCKET -DHAVE_STRUCT_IN6_ADDR \ | ||||
|           -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \ | ||||
|           -DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 \ | ||||
|           -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID -I$(WATT32_ROOT)/inc | ||||
|  | ||||
| LDFLAGS = -s | ||||
| EX_LIBS = $(WATT32_ROOT)/lib/libwatt.a | ||||
|  | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| CSOURCES = ares_fds.c ares_process.c ares_free_hostent.c ares_query.c       \ | ||||
| ares__close_sockets.c ares_free_string.c ares_search.c ares__get_hostent.c  \ | ||||
| ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c     \ | ||||
| ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c     \ | ||||
| ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c       \ | ||||
| windows_port.c ares_expand_string.c ares_parse_ptr_reply.c                  \ | ||||
| ares_parse_aaaa_reply.c ares_getnameinfo.c inet_net_pton.c bitncmp.c        \ | ||||
| inet_ntop.c | ||||
| CSOURCES = ares_fds.c ares_getsock.c ares_process.c ares_free_hostent.c	\ | ||||
| ares_query.c ares__close_sockets.c ares_free_string.c ares_search.c	\ | ||||
| ares__get_hostent.c ares_gethostbyaddr.c ares_send.c ares__read_line.c	\ | ||||
| ares_gethostbyname.c ares_strerror.c ares_cancel.c ares_init.c		\ | ||||
| ares_timeout.c ares_destroy.c ares_mkquery.c ares_version.c		\ | ||||
| ares_expand_name.c ares_parse_a_reply.c windows_port.c			\ | ||||
| ares_expand_string.c ares_parse_ptr_reply.c 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 inet_ntop.h ares_ipv6.h bitncmp.h | ||||
|   | ||||
| @@ -7,29 +7,21 @@ | ||||
| ## Quick hack by Guenter; comments to: /dev/nul | ||||
|  | ||||
| CC = gcc | ||||
| AR = ar | ||||
| RANLIB = ranlib | ||||
| STRIP = strip -g | ||||
| #RM = rm -f  | ||||
|  | ||||
| ######################################################## | ||||
| ## Nothing more to do below this line! | ||||
|  | ||||
| LIB=libcares.a | ||||
| CC=gcc | ||||
| #CPPFLAGS=@CPPFLAGS@ | ||||
| WARN_FLAGS=-Wall | ||||
| CFLAGS=-O2 | ||||
| CFLAGS+=${WARN_CFLAGS} ${ERROR_CFLAGS} | ||||
| DEFS=-DMINGW32 | ||||
| CFLAGS=-O2 -Wall | ||||
| LDFLAGS=-s | ||||
| LIBS=-lwsock32 | ||||
| ALL_CFLAGS=${CPPFLAGS} ${CFLAGS} ${DEFS} | ||||
|  | ||||
| MANPAGES := $(patsubst %.c,%.o,$(wildcard ares_*.3)) | ||||
|  | ||||
| OBJS	:= $(patsubst %.c,%.o,$(wildcard ares_*.c)) | ||||
| OBJS	+= windows_port.o | ||||
| OBJS	+= windows_port.o inet_ntop.o inet_net_pton.o bitncmp.o | ||||
|  | ||||
| $(LIB): ${OBJS} | ||||
| 	ar cru $@ ${OBJS} | ||||
| @@ -51,7 +43,7 @@ ahost.exe: ahost.o $(LIB) | ||||
| ${OBJS}: ares.h ares_dns.h ares_private.h | ||||
|  | ||||
| .c.o: | ||||
| 	${CC} -c ${ALL_CFLAGS} $< | ||||
| 	${CC} -c ${CFLAGS} $< | ||||
|  | ||||
| check: | ||||
|  | ||||
| @@ -73,3 +65,4 @@ clean: | ||||
|  | ||||
| distclean: clean | ||||
| 	rm -f config.cache config.log config.status Makefile | ||||
|  | ||||
|   | ||||
							
								
								
									
										190
									
								
								ares/Makefile.vc6
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								ares/Makefile.vc6
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,190 @@ | ||||
| # $Id$ | ||||
| # | ||||
| # C-ares makefile for MSVC6+ | ||||
| # G. Vanem <giva@bgnett.no>. | ||||
| # | ||||
|  | ||||
| CFG_MODEL   = MD | ||||
| DEBUG_MODEL = d | ||||
| USE_WATT32  = 0 | ||||
|  | ||||
| # | ||||
| # Configurations: | ||||
| #  -MD   - msvcrt.dll,  threads, release (normal) | ||||
| #  -MDd  - msvcrtd.dll, threads, debug | ||||
| #  -ML   - libc, no threads,     release | ||||
| #  -MLd  - libc, no threads,     debug | ||||
| #  -MT   - libc, threads,        release | ||||
| #  -MTd  - libc, threads,        debug | ||||
|  | ||||
| CC = cl | ||||
|  | ||||
| CFLAGS  = -nologo -$(CFG_MODEL)$(DEBUG_MODEL) -W3 -Yd -Zi | ||||
| LDFLAGS = -machine:i386 -map | ||||
|  | ||||
| OBJ_DIR  = VC6_obj | ||||
| DEF_FILE = cares.def | ||||
|  | ||||
| !if "$(USE_WATT32)" == "1" | ||||
| CFLAGS  = $(CFLAGS) -UWIN32 -DWATT32 -I$(WATT_ROOT)\inc | ||||
| EX_LIBS = $(WATT_ROOT)\lib\wattcpvc_imp.lib | ||||
|  | ||||
| !else | ||||
| CFLAGS  = $(CFLAGS) -DWIN32 -DWIN32_LEAN_AND_MEAN | ||||
| EX_LIBS = advapi32.lib ws2_32.lib | ||||
| !endif | ||||
|  | ||||
| !if "$(DEBUG_MODEL)" == "d" | ||||
| CFLAGS  = $(CFLAGS) -D_DEBUG -GZ | ||||
| LDFLAGS = $(LDFLAGS) -debug -fixed:no | ||||
|  | ||||
| !else | ||||
| CFLAGS  = $(CFLAGS) -O2 -Og | ||||
| LDFLAGS = $(LDFLAGS) -release | ||||
| !endif | ||||
|  | ||||
| OBJECTS = $(OBJ_DIR)\ares_fds.obj              \ | ||||
|           $(OBJ_DIR)\ares_process.obj          \ | ||||
|           $(OBJ_DIR)\ares_free_hostent.obj     \ | ||||
|           $(OBJ_DIR)\ares_query.obj            \ | ||||
|           $(OBJ_DIR)\ares__close_sockets.obj   \ | ||||
|           $(OBJ_DIR)\ares_free_string.obj      \ | ||||
|           $(OBJ_DIR)\ares_search.obj           \ | ||||
|           $(OBJ_DIR)\ares__get_hostent.obj     \ | ||||
|           $(OBJ_DIR)\ares_gethostbyaddr.obj    \ | ||||
|           $(OBJ_DIR)\ares_getsock.obj          \ | ||||
|           $(OBJ_DIR)\ares_send.obj             \ | ||||
|           $(OBJ_DIR)\ares__read_line.obj       \ | ||||
|           $(OBJ_DIR)\ares_gethostbyname.obj    \ | ||||
|           $(OBJ_DIR)\ares_getnameinfo.obj      \ | ||||
|           $(OBJ_DIR)\ares_strerror.obj         \ | ||||
|           $(OBJ_DIR)\ares_cancel.obj           \ | ||||
|           $(OBJ_DIR)\ares_init.obj             \ | ||||
|           $(OBJ_DIR)\ares_timeout.obj          \ | ||||
|           $(OBJ_DIR)\ares_destroy.obj          \ | ||||
|           $(OBJ_DIR)\ares_mkquery.obj          \ | ||||
|           $(OBJ_DIR)\ares_version.obj          \ | ||||
|           $(OBJ_DIR)\ares_expand_name.obj      \ | ||||
|           $(OBJ_DIR)\ares_parse_a_reply.obj    \ | ||||
|           $(OBJ_DIR)\ares_parse_aaaa_reply.obj \ | ||||
|           $(OBJ_DIR)\windows_port.obj          \ | ||||
|           $(OBJ_DIR)\ares_expand_string.obj    \ | ||||
|           $(OBJ_DIR)\ares_parse_ptr_reply.obj  \ | ||||
|           $(OBJ_DIR)\bitncmp.obj               \ | ||||
|           $(OBJ_DIR)\inet_net_pton.obj         \ | ||||
|           $(OBJ_DIR)\inet_ntop.obj | ||||
|  | ||||
| all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe | ||||
|  | ||||
| $(OBJ_DIR): | ||||
|        mkdir $(OBJ_DIR) | ||||
|  | ||||
| cares.lib: $(OBJ_DIR) $(OBJECTS) | ||||
|        lib -nologo -out:$@ $(OBJECTS) | ||||
|  | ||||
| cares_imp.lib cares.dll: $(OBJ_DIR) $(DEF_FILE) $(OBJECTS) | ||||
|        link $(LDFLAGS) -dll -implib:cares_imp.lib -out:cares.dll \ | ||||
|             -def:$(DEF_FILE) $(OBJECTS) $(EX_LIBS) | ||||
|  | ||||
| $(DEF_FILE): $(OBJECTS) Makefile.VC6 | ||||
|        @echo ; Generated. DO NOT EDIT  > $@ | ||||
|        @echo LIBRARY cares.dll        >> $@ | ||||
|        @echo EXPORTS                  >> $@ | ||||
|        @echo   ares_cancel            >> $@ | ||||
|        @echo   ares_destroy           >> $@ | ||||
|        @echo   ares_expand_name       >> $@ | ||||
|        @echo   ares_expand_string     >> $@ | ||||
|        @echo   ares_fds               >> $@ | ||||
|        @echo   ares_free_hostent      >> $@ | ||||
|        @echo   ares_free_string       >> $@ | ||||
|        @echo   ares_gethostbyaddr     >> $@ | ||||
|        @echo   ares_gethostbyname     >> $@ | ||||
|        @echo   ares_getsock           >> $@ | ||||
|        @echo   ares_init              >> $@ | ||||
|        @echo   ares_init_options      >> $@ | ||||
|        @echo   ares_mkquery           >> $@ | ||||
|        @echo   ares_parse_a_reply     >> $@ | ||||
|        @echo   ares_parse_ptr_reply   >> $@ | ||||
|        @echo   ares_process           >> $@ | ||||
|        @echo   ares_query             >> $@ | ||||
|        @echo   ares_search            >> $@ | ||||
|        @echo   ares_strerror          >> $@ | ||||
|        @echo   ares_strncasecmp       >> $@ | ||||
|        @echo   ares_strcasecmp        >> $@ | ||||
|        @echo   ares_timeout           >> $@ | ||||
|        @echo   ares_version           >> $@ | ||||
|        @echo   ares_inet_net_pton     >> $@ | ||||
|        @echo   ares_inet_ntop         >> $@ | ||||
|        @echo   ares_inet_pton         >> $@ | ||||
|        @echo   ares_writev            >> $@ | ||||
|        @echo   ares_getnameinfo       >> $@ | ||||
|        @echo   ares_gettimeofday      >> $@ | ||||
|        @echo   ares_parse_aaaa_reply  >> $@ | ||||
|  | ||||
| ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj cares_imp.lib | ||||
|        link $(LDFLAGS) -out:$@ $(OBJ_DIR)\ahost.obj cares_imp.lib $(EX_LIBS) | ||||
|  | ||||
| adig.exe: $(OBJ_DIR) $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib | ||||
|        link $(LDFLAGS) -out:$@ $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib $(EX_LIBS) | ||||
|  | ||||
| clean: | ||||
|        - del $(OBJ_DIR)\*.obj *.ilk *.pdb *.pbt *.pbi *.pbo *._xe *.map | ||||
|  | ||||
| vclean realclean: clean | ||||
|        - del $(DEF_FILE) cares.lib cares_imp.* cares.dll ahost.exe adig.exe | ||||
|        - rd $(OBJ_DIR) | ||||
|  | ||||
| .c{$(OBJ_DIR)}.obj: | ||||
|        $(CC) $(CFLAGS) -Fo$*.obj -c $< | ||||
|  | ||||
| # | ||||
| # Copyright "gcc -MM .." | ||||
| # | ||||
| $(OBJ_DIR)\ares_fds.obj: ares_fds.c setup.h ares.h ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_process.obj: ares_process.c setup.h nameser.h ares.h ares_dns.h \ | ||||
|   ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_free_hostent.obj: ares_free_hostent.c setup.h ares.h ares_private.h \ | ||||
|   ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_query.obj: ares_query.c setup.h nameser.h ares.h ares_dns.h \ | ||||
|   ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares__close_sockets.obj: ares__close_sockets.c setup.h ares.h \ | ||||
|   ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_free_string.obj: ares_free_string.c setup.h ares.h | ||||
| $(OBJ_DIR)\ares_search.obj: ares_search.c setup.h nameser.h ares.h ares_private.h \ | ||||
|   ares_ipv6.h | ||||
| $(OBJ_DIR)\ares__get_hostent.obj: ares__get_hostent.c setup.h ares.h ares_private.h \ | ||||
|   ares_ipv6.h inet_net_pton.h | ||||
| $(OBJ_DIR)\ares_gethostbyaddr.obj: ares_gethostbyaddr.c setup.h nameser.h ares.h \ | ||||
|   ares_private.h ares_ipv6.h inet_net_pton.h | ||||
| $(OBJ_DIR)\ares_send.obj: ares_send.c setup.h nameser.h ares.h ares_dns.h \ | ||||
|   ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares__read_line.obj: ares__read_line.c setup.h ares.h ares_private.h \ | ||||
|   ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_gethostbyname.obj: ares_gethostbyname.c setup.h nameser.h ares.h \ | ||||
|   ares_private.h ares_ipv6.h inet_net_pton.h bitncmp.h | ||||
| $(OBJ_DIR)\ares_strerror.obj: ares_strerror.c setup.h ares.h | ||||
| $(OBJ_DIR)\ares_cancel.obj: ares_cancel.c setup.h ares.h ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_init.obj: ares_init.c setup.h nameser.h ares.h ares_private.h \ | ||||
|   ares_ipv6.h inet_net_pton.h | ||||
| $(OBJ_DIR)\ares_timeout.obj: ares_timeout.c setup.h ares.h ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_destroy.obj: ares_destroy.c setup.h ares.h ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_mkquery.obj: ares_mkquery.c setup.h nameser.h ares.h ares_dns.h | ||||
| $(OBJ_DIR)\ares_version.obj: ares_version.c setup.h ares_version.h | ||||
| $(OBJ_DIR)\ares_expand_name.obj: ares_expand_name.c setup.h nameser.h ares.h \ | ||||
|   ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_parse_a_reply.obj: ares_parse_a_reply.c setup.h nameser.h ares.h \ | ||||
|   ares_dns.h ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\windows_port.obj: windows_port.c setup.h nameser.h ares.h ares_private.h \ | ||||
|   ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_expand_string.obj: ares_expand_string.c setup.h nameser.h ares.h \ | ||||
|   ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_parse_ptr_reply.obj: ares_parse_ptr_reply.c setup.h nameser.h ares.h \ | ||||
|   ares_dns.h ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_parse_aaaa_reply.obj: ares_parse_aaaa_reply.c setup.h nameser.h ares.h \ | ||||
|   ares_dns.h inet_net_pton.h ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares_getnameinfo.obj: ares_getnameinfo.c setup.h nameser.h ares.h \ | ||||
|   ares_private.h ares_ipv6.h inet_ntop.h | ||||
| $(OBJ_DIR)\inet_net_pton.obj: inet_net_pton.c setup.h nameser.h ares_ipv6.h \ | ||||
|   inet_net_pton.h | ||||
| $(OBJ_DIR)\bitncmp.obj: bitncmp.c bitncmp.h | ||||
| $(OBJ_DIR)\inet_ntop.obj: inet_ntop.c setup.h nameser.h ares_ipv6.h inet_ntop.h | ||||
| @@ -1,3 +1,372 @@ | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_HEADER_WINDOWS | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for compilable and valid windows.h header  | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [ | ||||
|   AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [ | ||||
|     AC_COMPILE_IFELSE([ | ||||
|       AC_LANG_PROGRAM([ | ||||
| #undef inline | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
|       ],[ | ||||
|         int dummy=2*WINVER; | ||||
|       ]) | ||||
|     ],[ | ||||
|       ac_cv_header_windows_h="yes" | ||||
|     ],[ | ||||
|       ac_cv_header_windows_h="no" | ||||
|     ]) | ||||
|   ]) | ||||
|   if test "x$ac_cv_header_windows_h" = "xyes"; then | ||||
|     AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1, | ||||
|       [Define to 1 if you have the windows.h header file.]) | ||||
|     AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1, | ||||
|       [Define to avoid automatic inclusion of winsock.h]) | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_HEADER_WINSOCK | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for compilable and valid winsock.h header  | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [ | ||||
|   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl | ||||
|   AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [ | ||||
|     AC_COMPILE_IFELSE([ | ||||
|       AC_LANG_PROGRAM([ | ||||
| #undef inline | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #include <winsock.h> | ||||
|       ],[ | ||||
|         int dummy=WSACleanup(); | ||||
|       ]) | ||||
|     ],[ | ||||
|       ac_cv_header_winsock_h="yes" | ||||
|     ],[ | ||||
|       ac_cv_header_winsock_h="no" | ||||
|     ]) | ||||
|   ]) | ||||
|   if test "x$ac_cv_header_winsock_h" = "xyes"; then | ||||
|     AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1, | ||||
|       [Define to 1 if you have the winsock.h header file.]) | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_HEADER_WINSOCK2 | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for compilable and valid winsock2.h header  | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [ | ||||
|   AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl | ||||
|   AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [ | ||||
|     AC_COMPILE_IFELSE([ | ||||
|       AC_LANG_PROGRAM([ | ||||
| #undef inline | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #include <winsock2.h> | ||||
|       ],[ | ||||
|         int dummy=2*IPPROTO_ESP; | ||||
|       ]) | ||||
|     ],[ | ||||
|       ac_cv_header_winsock2_h="yes" | ||||
|     ],[ | ||||
|       ac_cv_header_winsock2_h="no" | ||||
|     ]) | ||||
|   ]) | ||||
|   if test "x$ac_cv_header_winsock2_h" = "xyes"; then | ||||
|     AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1, | ||||
|       [Define to 1 if you have the winsock2.h header file.]) | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_HEADER_WS2TCPIP | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for compilable and valid ws2tcpip.h header | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [ | ||||
|   AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl | ||||
|   AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [ | ||||
|     AC_COMPILE_IFELSE([ | ||||
|       AC_LANG_PROGRAM([ | ||||
| #undef inline | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #include <winsock2.h> | ||||
| #include <ws2tcpip.h> | ||||
|       ],[ | ||||
|         int dummy=2*IP_PKTINFO; | ||||
|       ]) | ||||
|     ],[ | ||||
|       ac_cv_header_ws2tcpip_h="yes" | ||||
|     ],[ | ||||
|       ac_cv_header_ws2tcpip_h="no" | ||||
|     ]) | ||||
|   ]) | ||||
|   if test "x$ac_cv_header_ws2tcpip_h" = "xyes"; then | ||||
|     AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1, | ||||
|       [Define to 1 if you have the ws2tcpip.h header file.]) | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_TYPE_SOCKLEN_T | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for existing socklen_t type, and provide | ||||
| dnl an equivalent type if socklen_t not available | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [ | ||||
|   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl | ||||
|   AC_CHECK_TYPE([socklen_t], ,[ | ||||
|     AC_CACHE_CHECK([for socklen_t equivalent],  | ||||
|       [curl_cv_socklen_t_equiv], [ | ||||
|       curl_cv_socklen_t_equiv="unknown" | ||||
|       for arg2 in "struct sockaddr" void; do | ||||
|         for t in int size_t unsigned long "unsigned long"; do | ||||
|           AC_COMPILE_IFELSE([ | ||||
|             AC_LANG_PROGRAM([ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #else | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #endif | ||||
|               int getpeername (int, $arg2 *, $t *); | ||||
|             ],[ | ||||
|               $t len=0; | ||||
|               getpeername(0,0,&len); | ||||
|             ]) | ||||
|           ],[ | ||||
|              curl_cv_socklen_t_equiv="$t" | ||||
|              break 2 | ||||
|           ]) | ||||
|         done | ||||
|       done | ||||
|     ]) | ||||
|     if test "$curl_cv_socklen_t_equiv" = "unknown"; then | ||||
|       AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) | ||||
|     else | ||||
|       AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv, | ||||
|         [type to use in place of socklen_t if not defined]) | ||||
|     fi | ||||
|   ],[ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #endif | ||||
|   ]) | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_FUNC_GETNAMEINFO | ||||
| dnl ------------------------------------------------- | ||||
| dnl Test if the getnameinfo function is available,  | ||||
| dnl and check the types of five of its arguments. | ||||
| dnl If the function succeeds HAVE_GETNAMEINFO will be | ||||
| dnl defined, defining the types of the arguments in | ||||
| dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2, | ||||
| dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7. | ||||
| dnl This function is experimental and its results shall | ||||
| dnl not be trusted while this notice is in place ------ | ||||
|  | ||||
| AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [ | ||||
|   AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl | ||||
|   AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl | ||||
|   AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h) | ||||
|   # | ||||
|   AC_MSG_CHECKING([for getnameinfo]) | ||||
|   AC_LINK_IFELSE([ | ||||
|       AC_LANG_FUNC_LINK_TRY([getnameinfo]) | ||||
|     ],[ | ||||
|       AC_MSG_RESULT([yes]) | ||||
|       curl_cv_getnameinfo="yes" | ||||
|     ],[ | ||||
|       AC_MSG_RESULT([no]) | ||||
|       curl_cv_getnameinfo="no" | ||||
|   ]) | ||||
|   # | ||||
|   if test "$curl_cv_getnameinfo" != "yes"; then | ||||
|     AC_MSG_CHECKING([deeper for getnameinfo]) | ||||
|     AC_TRY_LINK([ | ||||
|       ],[ | ||||
|         getnameinfo(); | ||||
|       ],[ | ||||
|         AC_MSG_RESULT([yes]) | ||||
|         curl_cv_getnameinfo="yes" | ||||
|       ],[ | ||||
|         AC_MSG_RESULT([but still no]) | ||||
|         curl_cv_getnameinfo="no" | ||||
|     ]) | ||||
|   fi | ||||
|   # | ||||
|   if test "$curl_cv_getnameinfo" != "yes"; then | ||||
|     AC_MSG_CHECKING([deeper and deeper for getnameinfo]) | ||||
|     AC_TRY_LINK([ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETDB_H | ||||
| #include <netdb.h> | ||||
| #endif | ||||
| #endif | ||||
|       ],[ | ||||
|         getnameinfo(0, 0, 0, 0, 0, 0, 0); | ||||
|       ],[  | ||||
|         AC_MSG_RESULT([yes]) | ||||
|         curl_cv_getnameinfo="yes" | ||||
|       ],[ | ||||
|         AC_MSG_RESULT([but still no]) | ||||
|         curl_cv_getnameinfo="no" | ||||
|     ]) | ||||
|   fi | ||||
|   # | ||||
|   if test "$curl_cv_getnameinfo" = "yes"; then | ||||
|     AC_CACHE_CHECK([types of arguments for getnameinfo], | ||||
|       [curl_cv_func_getnameinfo_args], [ | ||||
|       curl_cv_func_getnameinfo_args="unknown" | ||||
|       for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do | ||||
|         for gni_arg2 in 'socklen_t' 'size_t' 'int'; do | ||||
|           for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int' 'DWORD'; do | ||||
|             for gni_arg7 in 'int' 'unsigned int'; do | ||||
|               AC_COMPILE_IFELSE([ | ||||
|                 AC_LANG_PROGRAM([ | ||||
| #undef inline  | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501) | ||||
| #undef _WIN32_WINNT | ||||
| #define _WIN32_WINNT 0x0501 | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h>  | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #define GNICALLCONV WSAAPI | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETDB_H | ||||
| #include <netdb.h> | ||||
| #endif | ||||
| #define GNICALLCONV | ||||
| #endif | ||||
|                   extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2, | ||||
|                                          char *, $gni_arg46, | ||||
|                                          char *, $gni_arg46, | ||||
|                                          $gni_arg7); | ||||
|                 ],[ | ||||
|                   $gni_arg2 salen=0; | ||||
|                   $gni_arg46 hostlen=0; | ||||
|                   $gni_arg46 servlen=0; | ||||
|                   $gni_arg7 flags=0; | ||||
|                   int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags); | ||||
|                 ]) | ||||
|               ],[ | ||||
|                  curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7" | ||||
|                  break 4 | ||||
|               ]) | ||||
|             done | ||||
|           done | ||||
|         done | ||||
|       done | ||||
|     ]) # AC_CACHE_CHECK | ||||
|     if test "$curl_cv_func_getnameinfo_args" = "unknown"; then | ||||
|       AC_MSG_WARN([Cannot find proper types to use for getnameinfo args]) | ||||
|       AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined]) | ||||
|     else | ||||
|       gni_prev_IFS=$IFS; IFS=',' | ||||
|       set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'` | ||||
|       IFS=$gni_prev_IFS | ||||
|       shift | ||||
|       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $[1], | ||||
|         [Define to the type of arg 1 for getnameinfo.]) | ||||
|       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2], | ||||
|         [Define to the type of arg 2 for getnameinfo.]) | ||||
|       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3], | ||||
|         [Define to the type of args 4 and 6 for getnameinfo.]) | ||||
|       AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4], | ||||
|         [Define to the type of arg 7 for getnameinfo.]) | ||||
|       AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1, | ||||
|         [Define to 1 if you have the getnameinfo function.]) | ||||
|       ac_cv_func_getnameinfo="yes" | ||||
|     fi | ||||
|   fi | ||||
| ]) # AC_DEFUN | ||||
|  | ||||
|  | ||||
| dnl CURL_CHECK_NONBLOCKING_SOCKET | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for how to set a socket to non-blocking state. There seems to exist | ||||
| dnl four known different ways, with the one used almost everywhere being POSIX | ||||
| dnl and XPG3, while the other different ways for different systems (old BSD, | ||||
| @@ -59,12 +428,27 @@ 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?) */ | ||||
| /* headers for ioctlsocket test (Windows) */ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #else | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #endif | ||||
| #endif | ||||
| ],[ | ||||
| /* ioctlsocket source code */ | ||||
|  int socket; | ||||
|  unsigned long flags = ioctlsocket(socket, FIONBIO, &flags); | ||||
|  SOCKET sd; | ||||
|  unsigned long flags = 0; | ||||
|  sd = socket(0, 0, 0); | ||||
|  ioctlsocket(sd, FIONBIO, &flags); | ||||
| ],[ | ||||
| dnl ioctlsocket test was good | ||||
| nonblock="ioctlsocket" | ||||
| @@ -122,6 +506,132 @@ dnl end of non-blocking try-compile test | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl TYPE_SOCKADDR_STORAGE | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but | ||||
| dnl AIX 4.3 is one known exception. | ||||
| AC_DEFUN([TYPE_SOCKADDR_STORAGE], | ||||
| [ | ||||
|    AC_CHECK_TYPE([struct sockaddr_storage], | ||||
|         AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1, | ||||
|                   [if struct sockaddr_storage is defined]), , | ||||
|    [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_INET_H | ||||
| #include <arpa/inet.h> | ||||
| #endif | ||||
| #endif | ||||
|    ]) | ||||
| ]) | ||||
|  | ||||
|  | ||||
| dnl TYPE_IN_ADDR_T | ||||
| dnl ------------------------------------------------- | ||||
| dnl Check for in_addr_t: it is used to receive the return code of inet_addr() | ||||
| dnl and a few other things. | ||||
| AC_DEFUN([TYPE_IN_ADDR_T], | ||||
| [ | ||||
|    AC_CHECK_TYPE([in_addr_t], ,[ | ||||
|       AC_MSG_CHECKING([for in_addr_t equivalent]) | ||||
|       AC_CACHE_VAL([curl_cv_in_addr_t_equiv], | ||||
|       [ | ||||
|          curl_cv_in_addr_t_equiv= | ||||
|          for t in "unsigned long" int size_t unsigned long; do | ||||
|             AC_TRY_COMPILE([ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #else | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_INET_H | ||||
| #include <arpa/inet.h> | ||||
| #endif | ||||
| #endif | ||||
|             ],[ | ||||
|                $t data = inet_addr ("1.2.3.4"); | ||||
|             ],[ | ||||
|                curl_cv_in_addr_t_equiv="$t" | ||||
|                break | ||||
|             ]) | ||||
|          done | ||||
|  | ||||
|          if test "x$curl_cv_in_addr_t_equiv" = x; then | ||||
|             AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t]) | ||||
|          fi | ||||
|       ]) | ||||
|       AC_MSG_RESULT($curl_cv_in_addr_t_equiv) | ||||
|       AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv, | ||||
| 			[type to use in place of in_addr_t if not defined])], | ||||
|       [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #else | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_INET_H | ||||
| #include <arpa/inet.h> | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|   ]) dnl AC_CHECK_TYPE | ||||
| ]) dnl AC_DEFUN | ||||
|  | ||||
|  | ||||
| dnl We create a function for detecting which compiler we use and then set as | ||||
| dnl pendantic compiler options as possible for that particular compiler. The | ||||
| dnl options are only used for debug-builds. | ||||
| @@ -272,7 +782,7 @@ AC_DEFUN([CARES_CHECK_CONSTANT], [ | ||||
| dnl This macro determines how many parameters getservbyport_r takes | ||||
| AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [ | ||||
|   AC_MSG_CHECKING([how many arguments getservbyport_r takes]) | ||||
|   AC_TRY_COMPILE( | ||||
|   AC_TRY_LINK( | ||||
|     [#include <netdb.h>], | ||||
|     [ | ||||
|       int p1, p5; | ||||
| @@ -280,7 +790,7 @@ AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [ | ||||
|       struct servent *p3, *p6; | ||||
|       getservbyport_r(p1, p2, p3, p4, p5, &p6); | ||||
|     ], ac_func_getservbyport_r=6, | ||||
|     [AC_TRY_COMPILE( | ||||
|     [AC_TRY_LINK( | ||||
|       [#include <netdb.h>], | ||||
|       [ | ||||
|         int p1, p5; | ||||
| @@ -288,7 +798,7 @@ AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [ | ||||
|         struct servent *p3; | ||||
|         getservbyport_r(p1, p2, p3, p4, p5); | ||||
|       ], ac_func_getservbyport_r=5, | ||||
|       [AC_TRY_COMPILE( | ||||
|       [AC_TRY_LINK( | ||||
|         [#include <netdb.h>], | ||||
|         [ | ||||
|           int p1; | ||||
|   | ||||
							
								
								
									
										45
									
								
								ares/adig.c
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								ares/adig.c
									
									
									
									
									
								
							| @@ -27,14 +27,23 @@ | ||||
| #include <unistd.h> | ||||
| #include <netdb.h> | ||||
| #endif | ||||
| #ifdef HAVE_GETOPT_H | ||||
| #include <getopt.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <ctype.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
| #include "inet_ntop.h" | ||||
|  | ||||
| #ifdef WATT32 | ||||
| #undef WIN32  /* Redefined in MingW headers */ | ||||
| #endif | ||||
|  | ||||
| #ifndef INADDR_NONE | ||||
| #define INADDR_NONE 0xffffffff | ||||
| @@ -45,8 +54,10 @@ | ||||
| #define T_SRV 33 /* server selection */ | ||||
| #endif | ||||
|  | ||||
| #ifndef optind | ||||
| extern int optind; | ||||
| extern char *optarg; | ||||
| #endif | ||||
|  | ||||
| struct nv { | ||||
|   const char *name; | ||||
| @@ -216,7 +227,7 @@ int main(int argc, char **argv) | ||||
|           /* Set the TCP port number. */ | ||||
|           if (!isdigit((unsigned char)*optarg)) | ||||
|             usage(); | ||||
|           options.tcp_port = strtol(optarg, NULL, 0); | ||||
|           options.tcp_port = (unsigned short)strtol(optarg, NULL, 0); | ||||
|           optmask |= ARES_OPT_TCP_PORT; | ||||
|           break; | ||||
|  | ||||
| @@ -224,7 +235,7 @@ int main(int argc, char **argv) | ||||
|           /* Set the UDP port number. */ | ||||
|           if (!isdigit((unsigned char)*optarg)) | ||||
|             usage(); | ||||
|           options.udp_port = strtol(optarg, NULL, 0); | ||||
|           options.udp_port = (unsigned short)strtol(optarg, NULL, 0); | ||||
|           optmask |= ARES_OPT_UDP_PORT; | ||||
|           break; | ||||
|         } | ||||
| @@ -412,7 +423,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|   char *name; | ||||
|   int type, dnsclass, ttl, dlen, status; | ||||
|   long len; | ||||
|   struct in_addr addr; | ||||
|   char addr[46]; | ||||
|  | ||||
|   /* Parse the RR name. */ | ||||
|   status = ares_expand_name(aptr, abuf, alen, &name, &len); | ||||
| @@ -474,12 +485,12 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|       len = *p; | ||||
|       if (p + len + 1 > aptr + dlen) | ||||
|         return NULL; | ||||
|       printf("\t%.*s", len, p + 1); | ||||
|       printf("\t%.*s", (int)len, p + 1); | ||||
|       p += len + 1; | ||||
|       len = *p; | ||||
|       if (p + len + 1 > aptr + dlen) | ||||
|         return NULL; | ||||
|       printf("\t%.*s", len, p + 1); | ||||
|       printf("\t%.*s", (int)len, p + 1); | ||||
|       break; | ||||
|  | ||||
|     case T_MINFO: | ||||
| @@ -504,7 +515,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|        */ | ||||
|       if (dlen < 2) | ||||
|         return NULL; | ||||
|       printf("\t%d", (aptr[0] << 8) | aptr[1]); | ||||
|       printf("\t%d", DNS__16BIT(aptr)); | ||||
|       status = ares_expand_name(aptr + 2, abuf, alen, &name, &len); | ||||
|       if (status != ARES_SUCCESS) | ||||
|         return NULL; | ||||
| @@ -531,12 +542,9 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|       p += len; | ||||
|       if (p + 20 > aptr + dlen) | ||||
|         return NULL; | ||||
|       printf("\t\t\t\t\t\t( %d %d %d %d %d )", | ||||
|              (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3], | ||||
|              (p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7], | ||||
|              (p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11], | ||||
|              (p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15], | ||||
|              (p[16] << 24) | (p[17] << 16) | (p[18] << 8) | p[19]); | ||||
|       printf("\t\t\t\t\t\t( %lu %lu %lu %lu %lu )", | ||||
|              DNS__32BIT(p), DNS__32BIT(p+4), DNS__32BIT(p+8), | ||||
|              DNS__32BIT(p+12), DNS__32BIT(p+16)); | ||||
|       break; | ||||
|  | ||||
|     case T_TXT: | ||||
| @@ -548,7 +556,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|           len = *p; | ||||
|           if (p + len + 1 > aptr + dlen) | ||||
|             return NULL; | ||||
|           printf("\t%.*s", len, p + 1); | ||||
|           printf("\t%.*s", (int)len, p + 1); | ||||
|           p += len + 1; | ||||
|         } | ||||
|       break; | ||||
| @@ -557,8 +565,14 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|       /* The RR data is a four-byte Internet address. */ | ||||
|       if (dlen != 4) | ||||
|         return NULL; | ||||
|       memcpy(&addr, aptr, sizeof(struct in_addr)); | ||||
|       printf("\t%s", inet_ntoa(addr)); | ||||
|       printf("\t%s", ares_inet_ntop(AF_INET,aptr,addr,sizeof(addr))); | ||||
|       break; | ||||
|  | ||||
|     case T_AAAA: | ||||
|       /* The RR data is a 16-byte IPv6 address. */ | ||||
|       if (dlen != 16) | ||||
|         return NULL; | ||||
|       printf("\t%s", ares_inet_ntop(AF_INET6,aptr,addr,sizeof(addr))); | ||||
|       break; | ||||
|  | ||||
|     case T_WKS: | ||||
| @@ -583,6 +597,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|  | ||||
|     default: | ||||
|       printf("\t[Unknown RR; cannot parse]"); | ||||
|       break; | ||||
|     } | ||||
|   printf("\n"); | ||||
|  | ||||
|   | ||||
							
								
								
									
										48
									
								
								ares/ahost.c
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								ares/ahost.c
									
									
									
									
									
								
							| @@ -29,13 +29,23 @@ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
| #include "inet_ntop.h" | ||||
| #include "inet_net_pton.h" | ||||
|  | ||||
| #ifndef INADDR_NONE | ||||
| #define INADDR_NONE 0xffffffff | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_STRUCT_IN6_ADDR | ||||
| struct in6_addr | ||||
| { | ||||
|   unsigned char s6_addr[16]; | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| static void callback(void *arg, int status, struct hostent *host); | ||||
| static void usage(void); | ||||
|  | ||||
| @@ -45,7 +55,8 @@ int main(int argc, char **argv) | ||||
|   int status, nfds; | ||||
|   fd_set read_fds, write_fds; | ||||
|   struct timeval *tvp, tv; | ||||
|   struct in_addr addr; | ||||
|   struct in_addr addr4; | ||||
|   struct in6_addr addr6; | ||||
|  | ||||
| #ifdef WIN32 | ||||
|   WORD wVersionRequested = MAKEWORD(1,1); | ||||
| @@ -66,13 +77,20 @@ int main(int argc, char **argv) | ||||
|   /* Initiate the queries, one per command-line argument. */ | ||||
|   for (argv++; *argv; argv++) | ||||
|     { | ||||
|       addr.s_addr = inet_addr(*argv); | ||||
|       if (addr.s_addr == INADDR_NONE) | ||||
|         ares_gethostbyname(channel, *argv, AF_INET, callback, *argv); | ||||
|       if (ares_inet_pton(AF_INET, *argv, &addr4) == 1) | ||||
|         { | ||||
|           ares_gethostbyaddr(channel, &addr4, sizeof(addr4), AF_INET, callback, | ||||
|                              *argv); | ||||
|         } | ||||
|       else if (ares_inet_pton(AF_INET6, *argv, &addr6) == 1) | ||||
|         { | ||||
|           ares_gethostbyaddr(channel, &addr6, sizeof(addr6), AF_INET6, callback, | ||||
|                              *argv); | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           ares_gethostbyaddr(channel, &addr, sizeof(addr), AF_INET, callback, | ||||
|                              *argv); | ||||
|           /* assume user wants A-records */ | ||||
|           ares_gethostbyname(channel, *argv, AF_INET, callback, *argv); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -95,7 +113,6 @@ int main(int argc, char **argv) | ||||
|  | ||||
| static void callback(void *arg, int status, struct hostent *host) | ||||
| { | ||||
|   struct in_addr addr; | ||||
|   char **p; | ||||
|  | ||||
|   if (status != ARES_SUCCESS) | ||||
| @@ -106,8 +123,21 @@ static void callback(void *arg, int status, struct hostent *host) | ||||
|  | ||||
|   for (p = host->h_addr_list; *p; p++) | ||||
|     { | ||||
|       memcpy(&addr, *p, sizeof(struct in_addr)); | ||||
|       printf("%-32s\t%s\n", host->h_name, inet_ntoa(addr)); | ||||
|       char addr_buf[46] = "??"; | ||||
|  | ||||
|       ares_inet_ntop(host->h_addrtype, *p, addr_buf, sizeof(addr_buf)); | ||||
|       printf("%-32s\t%s", host->h_name, addr_buf); | ||||
| #if 0 | ||||
|       if (host->h_aliases[0]) | ||||
|         { | ||||
|            int i; | ||||
|  | ||||
| 	   printf (", Aliases: "); | ||||
| 	   for (i = 0; host->h_aliases[i]; i++) | ||||
|                printf("%s ", host->h_aliases[i]); | ||||
|         } | ||||
| #endif | ||||
|       puts(""); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										11
									
								
								ares/ares.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								ares/ares.h
									
									
									
									
									
								
							| @@ -32,7 +32,7 @@ | ||||
|   #include <sys/socket.h> | ||||
|   #include <tcp.h> | ||||
| #elif defined(WIN32) | ||||
|   #include <winsock.h> | ||||
|   #include <winsock2.h> | ||||
|   #include <windows.h> | ||||
| #else | ||||
|   #include <netinet/in.h> | ||||
| @@ -129,6 +129,11 @@ extern "C" { | ||||
| #define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \ | ||||
|                       ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \ | ||||
|                       ARES_AI_ADDRCONFIG) | ||||
| #define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about this | ||||
|                                   many sockets */ | ||||
| #define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num))) | ||||
| #define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \ | ||||
|                                          ARES_GETSOCK_MAXNUM))) | ||||
|  | ||||
| struct ares_options { | ||||
|   int flags; | ||||
| @@ -172,9 +177,11 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family, | ||||
| 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, | ||||
|                       socklen_t salen, int flags, | ||||
|                       ares_nameinfo_callback callback, | ||||
|                       void *arg); | ||||
| int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds); | ||||
| int ares_getsock(ares_channel channel, int *socks, int numsocks); | ||||
| struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv, | ||||
|                              struct timeval *tv); | ||||
| void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds); | ||||
|   | ||||
| @@ -50,7 +50,7 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize) | ||||
|       if ((*buf)[len - 1] == '\n') | ||||
|         { | ||||
|           (*buf)[len - 1] = 0; | ||||
|           return ARES_SUCCESS; | ||||
|           break; | ||||
|         } | ||||
|       offset = len; | ||||
|  | ||||
| @@ -61,4 +61,5 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize) | ||||
|       *buf = newbuf; | ||||
|       *bufsize *= 2; | ||||
|     } | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|   | ||||
| @@ -34,6 +34,6 @@ might have been stored in their arguments. | ||||
| .BR ares_init (3) | ||||
| .BR ares_destroy (3) | ||||
| .SH NOTES | ||||
| This function is not compatible with ares. | ||||
| This function was added in c-ares 1.2.0 | ||||
| .SH AUTHOR | ||||
| Dirk Manske | ||||
|   | ||||
| @@ -18,6 +18,18 @@ | ||||
| #ifndef ARES__DNS_H | ||||
| #define ARES__DNS_H | ||||
|  | ||||
| #ifdef ARES_BIG_ENDIAN | ||||
| /* big-endian aware versions */ | ||||
| #define DNS__16BIT(p)                   (((p)[1] << 8) | (p)[0]) | ||||
| #define DNS__32BIT(p)                   (((p)[3] << 24) | ((p)[2] << 16) | \ | ||||
|                                          ((p)[1] << 8) | (p)[0]) | ||||
| #define DNS__SET16BIT(p, v)             (((p)[1] = ((v) >> 8) & 0xff), \ | ||||
|                                          ((p)[0] = (v) & 0xff)) | ||||
| #define DNS__SET32BIT(p, v)             (((p)[3] = ((v) >> 24) & 0xff), \ | ||||
|                                          ((p)[2] = ((v) >> 16) & 0xff), \ | ||||
|                                          ((p)[1] = ((v) >> 8) & 0xff), \ | ||||
|                                          ((p)[0] = (v) & 0xff)) | ||||
| #else | ||||
| #define DNS__16BIT(p)                   (((p)[0] << 8) | (p)[1]) | ||||
| #define DNS__32BIT(p)                   (((p)[0] << 24) | ((p)[1] << 16) | \ | ||||
|                                          ((p)[2] << 8) | (p)[3]) | ||||
| @@ -27,6 +39,16 @@ | ||||
|                                          ((p)[1] = ((v) >> 16) & 0xff), \ | ||||
|                                          ((p)[2] = ((v) >> 8) & 0xff), \ | ||||
|                                          ((p)[3] = (v) & 0xff)) | ||||
| #endif | ||||
|  | ||||
| #if 0 | ||||
| /* we cannot use this approach on systems where we can't access 16/32 bit | ||||
|    data on un-aligned addresses */ | ||||
| #define DNS__16BIT(p)                   ntohs(*(unsigned short*)(p)) | ||||
| #define DNS__32BIT(p)                   ntohl(*(unsigned long*)(p)) | ||||
| #define DNS__SET16BIT(p, v)             *(unsigned short*)(p) = htons(v) | ||||
| #define DNS__SET32BIT(p, v)             *(unsigned long*)(p) = htonl(v) | ||||
| #endif | ||||
|  | ||||
| /* Macros for parsing a DNS header */ | ||||
| #define DNS_HEADER_QID(h)               DNS__16BIT(h) | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 2005 by Dominick Meglio | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -68,17 +70,19 @@ struct nameinfo_query { | ||||
| #endif | ||||
|  | ||||
| static void nameinfo_callback(void *arg, int status, struct hostent *host); | ||||
| static char *lookup_service(unsigned short port, int flags, char *buf); | ||||
| static char *lookup_service(unsigned short port, int flags, | ||||
|                             char *buf, size_t buflen); | ||||
| #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||
| static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid, char *buf); | ||||
| static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid, | ||||
|                            char *buf, size_t buflen); | ||||
| #endif | ||||
| static char *ares_striendstr(const char *s1, const char *s2); | ||||
|  | ||||
| void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t salen, | ||||
|                       int flags, ares_nameinfo_callback callback, void *arg) | ||||
| { | ||||
|   struct sockaddr_in *addr; | ||||
|   struct sockaddr_in6 *addr6; | ||||
|   struct sockaddr_in *addr = NULL; | ||||
|   struct sockaddr_in6 *addr6 = NULL; | ||||
|   struct nameinfo_query *niquery; | ||||
|  | ||||
|   /* Verify the buffer size */ | ||||
| @@ -106,7 +110,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t | ||||
|         port = addr->sin_port; | ||||
|       else | ||||
|         port = addr6->sin6_port; | ||||
|       service = lookup_service(port, flags, buf); | ||||
|       service = lookup_service(port, flags, buf, sizeof(buf)); | ||||
|       callback(arg, ARES_SUCCESS, NULL, service); | ||||
|       return; | ||||
|     } | ||||
| @@ -119,7 +123,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t | ||||
|       { | ||||
|         unsigned int port = 0; | ||||
|         char ipbuf[IPBUFSIZ]; | ||||
|         char srvbuf[32]; | ||||
|         char srvbuf[33]; | ||||
|         char *service = NULL; | ||||
|         ipbuf[0] = 0; | ||||
|  | ||||
| @@ -137,7 +141,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t | ||||
|             port = addr6->sin6_port; | ||||
|             /* If the system supports scope IDs, use it */ | ||||
| #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||
|             append_scopeid(addr6, flags, ipbuf); | ||||
|             append_scopeid(addr6, flags, ipbuf, sizeof(ipbuf)); | ||||
| #endif | ||||
|           } | ||||
|         else | ||||
| @@ -147,7 +151,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t | ||||
|           } | ||||
|         /* They also want a service */ | ||||
|         if (flags & ARES_NI_LOOKUPSERVICE) | ||||
|           service = lookup_service(port, flags, srvbuf); | ||||
|           service = lookup_service(port, flags, srvbuf, sizeof(srvbuf)); | ||||
|         callback(arg, ARES_SUCCESS, ipbuf, service); | ||||
|         return; | ||||
|       } | ||||
| @@ -195,10 +199,10 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host) | ||||
|         { | ||||
|           if (niquery->family == AF_INET) | ||||
|             service = lookup_service(niquery->addr.addr4.sin_port, | ||||
|                                      niquery->flags, srvbuf); | ||||
|                                      niquery->flags, srvbuf, sizeof(srvbuf)); | ||||
|           else | ||||
|             service = lookup_service(niquery->addr.addr6.sin6_port, | ||||
|                                      niquery->flags, srvbuf); | ||||
|                                      niquery->flags, srvbuf, sizeof(srvbuf)); | ||||
|         } | ||||
|       /* NOFQDN means we have to strip off the domain name portion. | ||||
|          We do this by determining our own domain name, then searching the string | ||||
| @@ -229,7 +233,7 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host) | ||||
|         { | ||||
|           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); | ||||
|           append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf, sizeof(ipbuf)); | ||||
| #endif | ||||
|         } | ||||
|       /* They want a service too */ | ||||
| @@ -237,10 +241,10 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host) | ||||
|         { | ||||
|           if (niquery->family == AF_INET) | ||||
|             service = lookup_service(niquery->addr.addr4.sin_port, | ||||
|                                      niquery->flags, srvbuf); | ||||
|                                      niquery->flags, srvbuf, sizeof(srvbuf)); | ||||
|           else | ||||
|             service = lookup_service(niquery->addr.addr6.sin6_port, | ||||
|                                      niquery->flags, srvbuf); | ||||
|                                      niquery->flags, srvbuf, sizeof(srvbuf)); | ||||
|         } | ||||
|       niquery->callback(niquery->arg, ARES_SUCCESS, ipbuf, service); | ||||
|       return; | ||||
| @@ -250,28 +254,21 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host) | ||||
| } | ||||
|  | ||||
| static char *lookup_service(unsigned short port, int flags, | ||||
|                             char *buf) /* 33 bytes buffer */ | ||||
|                             char *buf, size_t buflen) | ||||
| { | ||||
|   const char *proto; | ||||
|   struct servent *sep; | ||||
| #ifdef HAVE_GETSERVBYPORT_R | ||||
|   struct servent se; | ||||
| #endif | ||||
|   char tmpbuf[4096]; | ||||
|  | ||||
|   if (port) | ||||
|     {  | ||||
|       /* Just return the port as a string */ | ||||
|       if (flags & ARES_NI_NUMERICSERV) | ||||
|         sprintf(buf, "%u", ntohs(port)); | ||||
|         sep = NULL; | ||||
|       else | ||||
|         {  | ||||
|           struct servent *se; | ||||
|           const char *proto; | ||||
| #if GETSERVBYPORT_R_ARGS == 6 | ||||
|           struct servent ret; | ||||
|           char buf[4096]; | ||||
|           int len = 4096; | ||||
| #elif GETSERVBYPORT_R_ARGS == 5 | ||||
|           char buf[4096]; | ||||
|           int len = 4096; | ||||
| #elif GETSERVBYPORT_R_ARGS == 4 | ||||
|           struct servent ret; | ||||
|           struct servent_data sed; | ||||
| #endif | ||||
|           if (flags & ARES_NI_UDP) | ||||
|             proto = "udp"; | ||||
|           else if (flags & ARES_NI_SCTP) | ||||
| @@ -281,65 +278,77 @@ static char *lookup_service(unsigned short port, int flags, | ||||
|           else | ||||
|             proto = "tcp"; | ||||
| #ifdef HAVE_GETSERVBYPORT_R | ||||
|           sep = &se; | ||||
|           memset(tmpbuf, 0, sizeof(tmpbuf)); | ||||
| #if GETSERVBYPORT_R_ARGS == 6 | ||||
|           se = &ret; | ||||
|           if (getservbyport_r(port, proto, se, buf, len, &ret)) | ||||
|             se = NULL; | ||||
|           if (getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf), &sep) != 0) | ||||
|             sep = NULL; | ||||
| #elif GETSERVBYPORT_R_ARGS == 5 | ||||
|           se = getservbyport_r(port, proto, se, buf, len); | ||||
|           sep = getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf)); | ||||
| #elif GETSERVBYPORT_R_ARGS == 4 | ||||
|           se = &ret; | ||||
|           if (getservbyport_r(port, proto, se, &sed) == -1) | ||||
|             se = NULL; | ||||
|           if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0) | ||||
|             sep = NULL; | ||||
| #else      | ||||
|           /* Lets just hope the OS uses TLS! */ | ||||
|           se = getservbyport(port, proto); | ||||
|           sep = getservbyport(port, proto); | ||||
| #endif     | ||||
| #else      | ||||
|           /* Lets just hope the OS uses TLS! */ | ||||
|           se = getservbyport(port, proto); | ||||
|           sep = getservbyport(port, proto); | ||||
| #endif     | ||||
|           if (se && se->s_name) { | ||||
|             size_t len = strlen(se->s_name); | ||||
|             if(len < 33) { | ||||
|               strcpy(buf, se->s_name); | ||||
|         }  | ||||
|       if (sep && sep->s_name) | ||||
|         /* get service name */ | ||||
|         strcpy(tmpbuf, sep->s_name); | ||||
|       else | ||||
|               /* too big name to fit the buffer */ | ||||
|               buf[0]=0; | ||||
|           } | ||||
|         /* get port as a string */ | ||||
|         sprintf(tmpbuf, "%u", ntohs(port)); | ||||
|       if (strlen(tmpbuf) < buflen) | ||||
|         /* return it if buffer big enough */ | ||||
|         strcpy(buf, tmpbuf); | ||||
|       else | ||||
|             sprintf(buf, "%u", ntohs(port)); | ||||
|         } | ||||
|         /* avoid reusing previous one */ | ||||
|         buf[0] = '\0'; | ||||
|       return buf; | ||||
|     } | ||||
|   buf[0] = '\0'; | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID | ||||
| static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, | ||||
|                             char *buf) | ||||
| static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, | ||||
|                            char *buf, size_t buflen) | ||||
| { | ||||
|   char tmpbuf[IF_NAMESIZE + 1]; | ||||
|   char fmt_u[] = "%u"; | ||||
|   char fmt_lu[] = "%lu"; | ||||
|   char tmpbuf[IF_NAMESIZE + 2]; | ||||
|   size_t bufl; | ||||
|   char *fmt = (sizeof(addr6->sin6_scope_id) > sizeof(unsigned int))?fmt_lu:fmt_u; | ||||
|  | ||||
|   tmpbuf[0] = '%'; | ||||
|  | ||||
| #ifdef HAVE_IF_INDEXTONAME | ||||
|   if ((flags & ARES_NI_NUMERICSCOPE) || | ||||
|       (!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr) | ||||
|        && !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr))) | ||||
|     { | ||||
|        sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id); | ||||
|        sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL) | ||||
|         sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id); | ||||
|         sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id); | ||||
|     } | ||||
| #else | ||||
|   sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id); | ||||
|   sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id); | ||||
|   (void) flags; | ||||
| #endif | ||||
|   strcat(buf, tmpbuf); | ||||
|   return buf; | ||||
|   tmpbuf[IF_NAMESIZE + 1] = '\0'; | ||||
|   bufl = strlen(buf); | ||||
|  | ||||
|   if(bufl + strlen(tmpbuf) < buflen) | ||||
|     /* only append the scopeid string if it fits in the target buffer */ | ||||
|     strcpy(&buf[bufl], tmpbuf); | ||||
| } | ||||
| #endif | ||||
|  | ||||
|   | ||||
							
								
								
									
										58
									
								
								ares/ares_getsock.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								ares/ares_getsock.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .\" Copyright 1998 by Daniel Stenberg | ||||
| .\" | ||||
| .\" Permission to use, copy, modify, and distribute this | ||||
| .\" software and its documentation for any purpose and without | ||||
| .\" fee is hereby granted, provided that the above copyright | ||||
| .\" notice appear in all copies and that both that copyright | ||||
| .\" notice and this permission notice appear in supporting | ||||
| .\" documentation, and that the name of M.I.T. not be used in | ||||
| .\" advertising or publicity pertaining to distribution of the | ||||
| .\" software without specific, written prior permission. | ||||
| .\" M.I.T. makes no representations about the suitability of | ||||
| .\" this software for any purpose.  It is provided "as is" | ||||
| .\" without express or implied warranty. | ||||
| .\" | ||||
| .TH ARES_GETSOCK 3 "22 December 2005" | ||||
| .SH NAME | ||||
| ares_getsock \- get file descriptors to wait on | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B int ares_getsock(ares_channel \fIchannel\fP, int *\fIsocks\fP,  | ||||
| .B int \fInumsocks\fP); | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_getsock | ||||
| function retrieves the set of file descriptors which the calling | ||||
| application should wait on for reading and/or writing for the | ||||
| processing of name service queries pending on the name service channel | ||||
| identified by | ||||
| .IR channel . | ||||
| File descriptors will be set in the integer array pointed to by | ||||
| \fIsocks\fP. | ||||
| \fInumsocks\fP is the size of the given array in number of ints. | ||||
|  | ||||
| This function can only return information about up to 16 sockets. If more are | ||||
| in use (however unlikely that is), they are simply not reported back. | ||||
| .SH RETURN VALUES | ||||
| \fBares_getsock\fP returns a bitmask for what actions to wait for on the | ||||
| different sockets. The ares.h header file provides these convenience macros to | ||||
| extract the information appropriately: | ||||
|  | ||||
| .nf | ||||
| #define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about | ||||
|                                   this many sockets */ | ||||
| #define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num))) | ||||
| #define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \ | ||||
|                                          ARES_GETSOCK_MAXNUM))) | ||||
| .fi | ||||
| .SH NOTES | ||||
| This function was added in c-ares 1.3.1 | ||||
| .SH SEE ALSO | ||||
| .BR ares_timeout (3), | ||||
| .BR ares_fds (3), | ||||
| .BR ares_process (3) | ||||
							
								
								
									
										71
									
								
								ares/ares_getsock.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								ares/ares_getsock.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 2005 by Daniel Stenberg. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software and its | ||||
|  * documentation for any purpose and without fee is hereby granted, provided | ||||
|  * that the above copyright notice appear in all copies and that both that | ||||
|  * copyright notice and this permission notice appear in supporting | ||||
|  * documentation, and that the name of M.I.T. not be used in advertising or | ||||
|  * publicity pertaining to distribution of the software without specific, | ||||
|  * written prior permission.  M.I.T. makes no representations about the | ||||
|  * suitability of this software for any purpose.  It is provided "as is" | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #ifdef HAVE_SYS_TIME_H | ||||
| #include <sys/time.h> | ||||
| #endif | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| int ares_getsock(ares_channel channel, | ||||
|                  int *s, | ||||
|                  int numsocks) /* size of the 'socks' array */ | ||||
| { | ||||
|   struct server_state *server; | ||||
|   ares_socket_t nfds; | ||||
|   int i; | ||||
|   int sockindex=0; | ||||
|   int bitmap = 0; | ||||
|   unsigned int setbits = 0xffffffff; | ||||
|  | ||||
|   ares_socket_t *socks = (ares_socket_t *)s; | ||||
|  | ||||
|   /* No queries, no file descriptors. */ | ||||
|   if (!channel->queries) | ||||
|     return 0; | ||||
|  | ||||
|   nfds = 0; | ||||
|   for (i = 0; i < channel->nservers; i++) | ||||
|     { | ||||
|       server = &channel->servers[i]; | ||||
|       if (server->udp_socket != ARES_SOCKET_BAD) | ||||
|         { | ||||
|           if(sockindex >= numsocks) | ||||
|             break; | ||||
|           socks[sockindex] = server->udp_socket; | ||||
|           bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); | ||||
|           sockindex++; | ||||
|         } | ||||
|       if (server->tcp_socket != ARES_SOCKET_BAD) | ||||
|        { | ||||
|          if(sockindex >= numsocks) | ||||
|            break; | ||||
|          socks[sockindex] = server->tcp_socket; | ||||
|          bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); | ||||
|          sockindex++; | ||||
|  | ||||
|          if (server->qhead) { | ||||
|            /* then the tcp socket is also writable! */ | ||||
|            bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex-1); | ||||
|          } | ||||
|  | ||||
|        } | ||||
|     } | ||||
|   return (int)nfds; | ||||
| } | ||||
| @@ -504,7 +504,7 @@ DhcpNameServer | ||||
|   if (status == ARES_SUCCESS) | ||||
|     status = ARES_EOF; | ||||
|  | ||||
| #elif defined(riscos) | ||||
| #elif defined(__riscos__) | ||||
|  | ||||
|   /* Under RISC OS, name servers are listed in the | ||||
|      system variable Inet$Resolvers, space separated. */ | ||||
|   | ||||
| @@ -62,6 +62,10 @@ | ||||
| #define PATH_RESOLV_CONF "sys:/etc/resolv.cfg" | ||||
| #define PATH_HOSTS              "sys:/etc/hosts" | ||||
|  | ||||
| #elif defined(__riscos__) | ||||
|  | ||||
| #define PATH_HOSTS             "InetDBase:Hosts" | ||||
|  | ||||
| #else | ||||
|  | ||||
| #define PATH_RESOLV_CONF        "/etc/resolv.conf" | ||||
|   | ||||
| @@ -30,6 +30,8 @@ | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif /* WIN32 && !WATT32 */ | ||||
|  | ||||
| #ifdef HAVE_UNISTD_H | ||||
| #include <unistd.h> | ||||
| #endif | ||||
| @@ -39,7 +41,6 @@ | ||||
| #ifdef NETWARE | ||||
| #include <sys/filio.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| @@ -103,7 +104,7 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now) | ||||
|   struct iovec *vec; | ||||
|   int i; | ||||
|   ssize_t scount; | ||||
|   int wcount; | ||||
|   ssize_t wcount; | ||||
|   size_t n; | ||||
|  | ||||
|   for (i = 0; i < channel->nservers; i++) | ||||
| @@ -164,7 +165,8 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now) | ||||
|           /* Can't allocate iovecs; just send the first request. */ | ||||
|           sendreq = server->qhead; | ||||
|  | ||||
|           scount = send(server->tcp_socket, sendreq->data, sendreq->len, 0); | ||||
|           scount = send(server->tcp_socket, (void *)sendreq->data, | ||||
|                         sendreq->len, 0); | ||||
|  | ||||
|           if (scount < 0) | ||||
|             { | ||||
| @@ -212,8 +214,8 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now) | ||||
|            * what's left to read of it). | ||||
|            */ | ||||
|           count = recv(server->tcp_socket, | ||||
|                        server->tcp_lenbuf + server->tcp_buffer_pos, | ||||
|                        2 - server->tcp_buffer_pos, 0); | ||||
|                        (void *)(server->tcp_lenbuf + server->tcp_lenbuf_pos), | ||||
|                        2 - server->tcp_lenbuf_pos, 0); | ||||
|           if (count <= 0) | ||||
|             { | ||||
|               handle_error(channel, i, now); | ||||
| @@ -238,7 +240,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now) | ||||
|         { | ||||
|           /* Read data into the allocated buffer. */ | ||||
|           count = recv(server->tcp_socket, | ||||
|                        server->tcp_buffer + server->tcp_buffer_pos, | ||||
|                        (void *)(server->tcp_buffer + server->tcp_buffer_pos), | ||||
|                        server->tcp_length - server->tcp_buffer_pos, 0); | ||||
|           if (count <= 0) | ||||
|             { | ||||
| @@ -280,7 +282,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds, | ||||
|           !FD_ISSET(server->udp_socket, read_fds)) | ||||
|         continue; | ||||
|  | ||||
|       count = recv(server->udp_socket, buf, sizeof(buf), 0); | ||||
|       count = recv(server->udp_socket, (void *)buf, sizeof(buf), 0); | ||||
|       if (count <= 0) | ||||
|         handle_error(channel, i, now); | ||||
|  | ||||
| @@ -465,7 +467,8 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now) | ||||
|               return; | ||||
|             } | ||||
|         } | ||||
|       if (send(server->udp_socket, query->qbuf, query->qlen, 0) == -1) | ||||
|       if (send(server->udp_socket, (void *)query->qbuf, | ||||
|                query->qlen, 0) == -1) | ||||
|         { | ||||
|           query->skip_server[query->server] = 1; | ||||
|           next_server(channel, query, now); | ||||
|   | ||||
| @@ -5,11 +5,11 @@ | ||||
|  | ||||
| #define ARES_VERSION_MAJOR 1 | ||||
| #define ARES_VERSION_MINOR 3 | ||||
| #define ARES_VERSION_PATCH 0 | ||||
| #define ARES_VERSION_PATCH 1 | ||||
| #define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ | ||||
|                        (ARES_VERSION_MINOR<<8)|\ | ||||
|                        (ARES_VERSION_PATCH)) | ||||
| #define ARES_VERSION_STR "1.3.0" | ||||
| #define ARES_VERSION_STR "1.3.1" | ||||
|  | ||||
| const char *ares_version(int *version); | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| ${LIBTOOLIZE:-libtoolize} --copy --automake --force | ||||
| ${ACLOCAL:-aclocal} | ||||
| ${ACLOCAL:-aclocal} $ACLOCAL_FLAGS | ||||
| ${AUTOHEADER:-autoheader} | ||||
| ${AUTOCONF:-autoconf} | ||||
| ${AUTOMAKE:-automake} --add-missing | ||||
|   | ||||
							
								
								
									
										87
									
								
								ares/config-win32.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								ares/config-win32.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| #ifndef __ARES_CONFIG_WIN32_H | ||||
| #define __ARES_CONFIG_WIN32_H | ||||
|  | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright (C) 2004 - 2005 by Daniel Stenberg et al | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software and its | ||||
|  * documentation for any purpose and without fee is hereby granted, provided | ||||
|  * that the above copyright notice appear in all copies and that both that | ||||
|  * copyright notice and this permission notice appear in supporting | ||||
|  * documentation, and that the name of M.I.T. not be used in advertising or | ||||
|  * publicity pertaining to distribution of the software without specific, | ||||
|  * written prior permission.  M.I.T. makes no representations about the | ||||
|  * suitability of this software for any purpose.  It is provided "as is" | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| /* ================================================================ */ | ||||
| /*    ares/config-win32.h - Hand crafted config file for windows    */ | ||||
| /* ================================================================ */ | ||||
|  | ||||
| /* ---------------------------------------------------------------- */ | ||||
| /*                          HEADER FILES                            */ | ||||
| /* ---------------------------------------------------------------- */ | ||||
|  | ||||
| /* Define if you have the <getopt.h> header file.  */ | ||||
| #if defined(__MINGW32__) | ||||
| #define HAVE_GETOPT_H 1 | ||||
| #endif | ||||
|  | ||||
| /* Define if you have the <unistd.h> header file.  */ | ||||
| #if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \ | ||||
|     defined(__POCC__) | ||||
| #define HAVE_UNISTD_H 1 | ||||
| #endif | ||||
|  | ||||
| /* Define if you have the <windows.h> header file.  */ | ||||
| #define HAVE_WINDOWS_H 1 | ||||
|  | ||||
| /* Define if you have the <winsock.h> header file.  */ | ||||
| #define HAVE_WINSOCK_H 1 | ||||
|  | ||||
| /* Define if you have the <winsock2.h> header file.  */ | ||||
| #define HAVE_WINSOCK2_H 1 | ||||
|  | ||||
| /* Define if you have the <ws2tcpip.h> header file.  */ | ||||
| #define HAVE_WS2TCPIP_H 1 | ||||
|  | ||||
| /* ---------------------------------------------------------------- */ | ||||
| /*                             FUNCTIONS                            */ | ||||
| /* ---------------------------------------------------------------- */ | ||||
|  | ||||
| /* Define if you have the ioctlsocket function.  */ | ||||
| #define HAVE_IOCTLSOCKET 1 | ||||
|  | ||||
| /* ---------------------------------------------------------------- */ | ||||
| /*                          STRUCT RELATED                          */ | ||||
| /* ---------------------------------------------------------------- */ | ||||
|  | ||||
| /* Define this if you have struct addrinfo */ | ||||
| #define HAVE_STRUCT_ADDRINFO 1 | ||||
|  | ||||
| /* Define this if you have struct sockaddr_storage */ | ||||
| #define HAVE_STRUCT_SOCKADDR_STORAGE 1 | ||||
|  | ||||
| /* ---------------------------------------------------------------- */ | ||||
| /*                         IPV6 COMPATIBILITY                       */ | ||||
| /* ---------------------------------------------------------------- */ | ||||
|  | ||||
| /* Define this if you have address family AF_INET6 */ | ||||
| #define HAVE_AF_INET6 1 | ||||
|  | ||||
| /* Define this if you have protocol family PF_INET6 */ | ||||
| #define HAVE_PF_INET6 1 | ||||
|  | ||||
| /* Define this if you have struct in6_addr */ | ||||
| #define HAVE_STRUCT_IN6_ADDR 1 | ||||
|  | ||||
| /* Define this if you have struct sockaddr_in6 */ | ||||
| #define HAVE_STRUCT_SOCKADDR_IN6 1 | ||||
|  | ||||
| /* Define this if you have sockaddr_in6 with scopeid */ | ||||
| #define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 | ||||
|  | ||||
|  | ||||
| #endif  /* __ARES_CONFIG_WIN32_H */ | ||||
| @@ -1,5 +1,8 @@ | ||||
|  | ||||
| dnl Process this file with autoconf to produce a configure script. | ||||
| AC_PREREQ(2.57) | ||||
| AC_INIT(ares_init.c) | ||||
| AC_CONFIG_SRCDIR([ares_ipv6.h]) | ||||
| AM_CONFIG_HEADER(config.h) | ||||
| AM_MAINTAINER_MODE | ||||
| AM_INIT_AUTOMAKE(c-ares, CVS) | ||||
| @@ -13,13 +16,12 @@ solaris*) | ||||
| 	;; | ||||
| esac | ||||
|  | ||||
| # check for ssize_t | ||||
| AC_CHECK_TYPE(ssize_t, , | ||||
|    AC_DEFINE(ssize_t, int, [the signed version of size_t])) | ||||
|  | ||||
| AC_SEARCH_LIBS(gethostbyname, nsl) | ||||
| AC_SEARCH_LIBS(socket, socket) | ||||
|  | ||||
| dnl check for cygwin stuff | ||||
| AC_LIBTOOL_WIN32_DLL | ||||
|  | ||||
| dnl ************************************************************ | ||||
| dnl Option to switch on debug options. This makes an assumption that | ||||
| dnl this is built as an 'ares' subdir in the curl source tree. Subject for | ||||
| @@ -38,9 +40,6 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]), | ||||
|     dnl when doing the debug stuff, use static library only | ||||
|     AC_DISABLE_SHARED | ||||
|  | ||||
|     dnl Checks for standard header files, to make memdebug.h inclusions bettter | ||||
|     AC_HEADER_STDC | ||||
|  | ||||
|     dnl the entire --enable-debug is a hack that lives and runs on top of | ||||
|     dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier | ||||
|     AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl]) | ||||
| @@ -57,8 +56,24 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]), | ||||
|        AC_MSG_RESULT(no) | ||||
| ) | ||||
|  | ||||
| dnl libtool setup | ||||
| AC_PROG_LIBTOOL | ||||
|  | ||||
| dnl Checks for header files. | ||||
| AC_HEADER_STDC | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Make sure that our checks for headers windows.h winsock.h winsock2.h  | ||||
| dnl and ws2tcpip.h take precedence over any other further checks which  | ||||
| dnl could be done later using AC_CHECK_HEADER or AC_CHECK_HEADERS for | ||||
| dnl this specific header files. And do them before its results are used. | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| CURL_CHECK_HEADER_WINDOWS | ||||
| CURL_CHECK_HEADER_WINSOCK | ||||
| CURL_CHECK_HEADER_WINSOCK2 | ||||
| CURL_CHECK_HEADER_WS2TCPIP | ||||
|  | ||||
| dnl check for a few basic system headers we need | ||||
| AC_CHECK_HEADERS( | ||||
|        sys/types.h \ | ||||
| @@ -67,16 +82,23 @@ AC_CHECK_HEADERS( | ||||
|        sys/socket.h \ | ||||
|        sys/ioctl.h \ | ||||
|        netdb.h \ | ||||
|        winsock.h \ | ||||
|        netinet/in.h \ | ||||
|        net/if.h \ | ||||
|        arpa/nameser.h \ | ||||
|        arpa/nameser_compat.h \ | ||||
|        arpa/inet.h, , , | ||||
|        arpa/inet.h, | ||||
| dnl to do if not found | ||||
| [], | ||||
| dnl to do if found | ||||
| [], | ||||
| dnl default includes | ||||
| [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_TIME_H | ||||
| #include <sys/time.h> | ||||
| #endif | ||||
| dnl We do this default-include simply to make sure that the nameser_compat.h | ||||
| dnl header *REALLY* can be include after the new nameser.h. It seems AIX 5.1 | ||||
| dnl (and others?) is not designed to allow this. | ||||
| @@ -88,39 +110,72 @@ 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> | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.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 Checks for typedefs, structures, and compiler characteristics. | ||||
| AC_C_CONST | ||||
| AC_TYPE_SIZE_T | ||||
| AC_HEADER_TIME | ||||
|  | ||||
| AC_CHECK_SIZEOF(curl_off_t, ,[ | ||||
| #include <stdio.h> | ||||
| #include "$srcdir/include/curl/curl.h" | ||||
| ]) | ||||
| AC_CHECK_SIZEOF(size_t) | ||||
| AC_CHECK_SIZEOF(long) | ||||
| AC_CHECK_SIZEOF(time_t) | ||||
|  | ||||
| AC_CHECK_TYPE(long long, | ||||
|    [AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports long long])] | ||||
|    longlong="yes"   | ||||
| ) | ||||
|  | ||||
| if test "xyes" = "x$longlong"; then | ||||
|   AC_MSG_CHECKING([if numberLL works]) | ||||
|   AC_COMPILE_IFELSE([long long val = 1000LL;], | ||||
|    [AC_DEFINE(HAVE_LL, 1, [if your compiler supports LL])] | ||||
|    AC_MSG_RESULT(yes), | ||||
|    AC_MSG_RESULT(no) | ||||
|   ) | ||||
| fi | ||||
|  | ||||
|  | ||||
| # check for ssize_t | ||||
| AC_CHECK_TYPE(ssize_t, , | ||||
|    AC_DEFINE(ssize_t, int, [the signed version of size_t])) | ||||
|  | ||||
| # Check for socklen_t or equivalent | ||||
| CURL_CHECK_TYPE_SOCKLEN_T | ||||
|  | ||||
| TYPE_IN_ADDR_T | ||||
|  | ||||
| TYPE_SOCKADDR_STORAGE | ||||
|  | ||||
|  | ||||
| dnl check for AF_INET6 | ||||
| CARES_CHECK_CONSTANT( | ||||
|   [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
|  | ||||
|   ], [PF_INET6],  | ||||
|      AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.]) | ||||
| ) | ||||
| @@ -128,16 +183,23 @@ CARES_CHECK_CONSTANT( | ||||
| dnl check for PF_INET6 | ||||
| CARES_CHECK_CONSTANT( | ||||
|   [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
|  | ||||
|   ], [AF_INET6],  | ||||
|      AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.]) | ||||
| ) | ||||
| @@ -146,14 +208,25 @@ CARES_CHECK_CONSTANT( | ||||
| dnl check for the in6_addr structure | ||||
| CARES_CHECK_STRUCT( | ||||
|   [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #endif | ||||
|   ], [in6_addr],  | ||||
|      AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.]) | ||||
| @@ -162,14 +235,25 @@ CARES_CHECK_STRUCT( | ||||
| dnl check for the sockaddr_in6 structure | ||||
| CARES_CHECK_STRUCT( | ||||
|   [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #endif | ||||
|   ], [sockaddr_in6],  | ||||
|      AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1, | ||||
| @@ -181,14 +265,25 @@ AC_CHECK_MEMBER(struct sockaddr_in6.sin6_scope_id, | ||||
|       [Define to 1 if your struct sockaddr_in6 has sin6_scope_id.]) | ||||
|    , , | ||||
|   [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #endif | ||||
|   ]) | ||||
|  | ||||
| @@ -197,12 +292,22 @@ AC_CHECK_MEMBER(struct addrinfo.ai_flags, | ||||
|      AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1, | ||||
|        [Define to 1 if you have struct addrinfo.]),, | ||||
|   [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| @@ -211,10 +316,30 @@ AC_CHECK_MEMBER(struct addrinfo.ai_flags, | ||||
| #endif | ||||
| #ifdef HAVE_NETDB_H | ||||
| #include <netdb.h> | ||||
| #endif | ||||
| #endif | ||||
|   ] | ||||
| ) | ||||
|  | ||||
|  | ||||
| AC_CHECK_FUNCS( bitncmp \ | ||||
|                 if_indextoname, | ||||
| dnl if found | ||||
| [], | ||||
| dnl if not found, $ac_func is the name we check for | ||||
| func="$ac_func" | ||||
| AC_MSG_CHECKING([deeper for $func]) | ||||
| AC_TRY_LINK( [], | ||||
|              [ $func ();], | ||||
|              AC_MSG_RESULT(yes!) | ||||
|              eval "ac_cv_func_$func=yes" | ||||
|              def=`echo "HAVE_$func" | tr 'a-z' 'A-Z'` | ||||
|              AC_DEFINE_UNQUOTED($def, 1, [If you have $func]), | ||||
|              AC_MSG_RESULT(but still no) | ||||
|              ) | ||||
| ) | ||||
|  | ||||
|  | ||||
| dnl check for inet_pton | ||||
| AC_CHECK_FUNCS(inet_pton) | ||||
| dnl Some systems have it, but not IPv6 | ||||
| @@ -228,9 +353,6 @@ AC_TRY_RUN( | ||||
| #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 | ||||
| @@ -260,9 +382,6 @@ AC_TRY_RUN( | ||||
| #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 | ||||
| @@ -294,9 +413,6 @@ AC_TRY_RUN( | ||||
| #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 | ||||
| @@ -318,42 +434,75 @@ fi | ||||
|  | ||||
| AC_CHECK_SIZEOF(struct in6_addr, , | ||||
| [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| ] | ||||
| ) | ||||
| AC_CHECK_SIZEOF(struct in_addr, , | ||||
| [ | ||||
| #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 | ||||
| ] | ||||
| ) | ||||
|  | ||||
| AC_CHECK_FUNCS([bitncmp if_indextoname]) | ||||
| AC_CHECK_SIZEOF(struct in_addr, , | ||||
| [ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #ifdef HAVE_WS2TCPIP_H | ||||
| #include <ws2tcpip.h> | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #endif | ||||
| ] | ||||
| ) | ||||
|  | ||||
|  | ||||
| dnl Check if the getnameinfo function is available | ||||
| dnl and get the types of five of its arguments. | ||||
| CURL_CHECK_FUNC_GETNAMEINFO | ||||
|  | ||||
|  | ||||
| dnl God bless non-standardized functions! We need to see which getservbyport_r variant is available | ||||
| CARES_CHECK_GETSERVBYPORT_R | ||||
|  | ||||
| CURL_CHECK_NONBLOCKING_SOCKET | ||||
|  | ||||
| AC_C_BIGENDIAN( | ||||
|     [AC_DEFINE(ARES_BIG_ENDIAN, 1, [define this if ares is built for a big endian system])], | ||||
|     , | ||||
|     [AC_MSG_WARN([couldn't figure out endianess, assuming little endian!])] | ||||
| ) | ||||
|  | ||||
| AC_OUTPUT(Makefile) | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright (c) 1996 by Internet Software Consortium. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software for any | ||||
| @@ -72,8 +74,8 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size); | ||||
| const char * | ||||
| ares_inet_ntop(int af, const void *src, char *dst, size_t size) | ||||
| { | ||||
|  | ||||
| 	switch (af) { | ||||
|   switch (af) | ||||
|     { | ||||
|     case AF_INET: | ||||
|       return (inet_ntop4(src, dst, size)); | ||||
|     case AF_INET6: | ||||
| @@ -102,7 +104,8 @@ 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) { | ||||
|   if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) | ||||
|     { | ||||
|       errno = ENOSPC; | ||||
|       return (NULL); | ||||
|     } | ||||
| @@ -127,7 +130,7 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||
|    * 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; | ||||
|   struct { int base, len; } best = { 0,0 }, cur = { 0,0 }; | ||||
|   unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; | ||||
|   int i; | ||||
|  | ||||
| @@ -141,21 +144,27 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||
|       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) { | ||||
|   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) { | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           if (cur.base != -1) | ||||
|             { | ||||
|               if (best.base == -1 || cur.len > best.len) | ||||
|                 best = cur; | ||||
|               cur.base = -1; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 	if (cur.base != -1) { | ||||
|   if (cur.base != -1) | ||||
|     { | ||||
|       if (best.base == -1 || cur.len > best.len) | ||||
|         best = cur; | ||||
|     } | ||||
| @@ -166,10 +175,12 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||
|    * Format the result. | ||||
|    */ | ||||
|   tp = tmp; | ||||
| 	for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { | ||||
|   for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) | ||||
|     { | ||||
|       /* Are we inside the best run of 0x00's? */ | ||||
|       if (best.base != -1 && i >= best.base && | ||||
| 		    i < (best.base + best.len)) { | ||||
|           i < (best.base + best.len)) | ||||
|         { | ||||
|           if (i == best.base) | ||||
|              *tp++ = ':'; | ||||
|           continue; | ||||
| @@ -179,7 +190,8 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||
|         *tp++ = ':'; | ||||
|       /* Is this address an encapsulated IPv4? */ | ||||
|       if (i == 6 && best.base == 0 && | ||||
| 		    (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { | ||||
|           (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) | ||||
|         { | ||||
|           if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) | ||||
|             return (NULL); | ||||
|           tp += strlen(tp); | ||||
| @@ -187,6 +199,7 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||
|         } | ||||
|         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++ = ':'; | ||||
| @@ -195,12 +208,13 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||
|   /* | ||||
|    * Check for overflow, copy, and we're done. | ||||
|    */ | ||||
| 	if ((size_t)(tp - tmp) > size) { | ||||
|   if ((size_t)(tp - tmp) > size) | ||||
|     { | ||||
|       errno = ENOSPC; | ||||
|       return (NULL); | ||||
|     } | ||||
|   strcpy(dst, tmp); | ||||
|   return (dst); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| #ifndef ARES_NAMESER_H | ||||
| #define ARES_NAMESER_H | ||||
|  | ||||
|   | ||||
							
								
								
									
										88
									
								
								ares/setup.h
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								ares/setup.h
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| #ifndef ARES_SETUP_H | ||||
| #define ARES_SETUP_H | ||||
| #ifndef __ARES_SETUP_H | ||||
| #define __ARES_SETUP_H | ||||
|  | ||||
| /* Copyright (C) 2004 - 2005 by Daniel Stenberg et al | ||||
|  * | ||||
| @@ -14,17 +14,79 @@ | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| #if !defined(WIN32) && defined(__WIN32__) | ||||
| /* Borland fix */ | ||||
| #define WIN32 | ||||
| #endif | ||||
|  | ||||
| #if !defined(WIN32) && defined(_WIN32) | ||||
| /* VS2005 on x64 fix */ | ||||
| #define WIN32 | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Include configuration script results or hand-crafted | ||||
|  * configuration file for platforms which lack config tool. | ||||
|  */ | ||||
|  | ||||
| #ifdef HAVE_CONFIG_H | ||||
| #include "config.h" | ||||
| #else | ||||
| /* simple work-around for now, for systems without configure support */ | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include "config-win32.h" | ||||
| #endif | ||||
|  | ||||
| #endif /* HAVE_CONFIG_H */ | ||||
|  | ||||
| /* | ||||
|  * Include header files for windows builds before redefining anything. | ||||
|  * Use this preproessor block only to include or exclude windows.h, | ||||
|  * winsock2.h, ws2tcpip.h or winsock.h. Any other windows thing belongs | ||||
|  * to any other further and independant block. | ||||
|  */ | ||||
|  | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #  ifndef WIN32_LEAN_AND_MEAN | ||||
| #    define WIN32_LEAN_AND_MEAN | ||||
| #  endif | ||||
| #  include <windows.h> | ||||
| #  ifdef HAVE_WINSOCK2_H | ||||
| #    include <winsock2.h> | ||||
| #    ifdef HAVE_WS2TCPIP_H | ||||
| #       include <ws2tcpip.h> | ||||
| #    endif | ||||
| #  else | ||||
| #    ifdef HAVE_WINSOCK_H | ||||
| #      include <winsock.h> | ||||
| #    endif | ||||
| #  endif | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Work-arounds for systems without configure support | ||||
|  */ | ||||
|  | ||||
| #ifndef HAVE_CONFIG_H | ||||
|  | ||||
| #if defined(__DJGPP__) || (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || \ | ||||
|     defined(__POCC__) | ||||
| #else | ||||
| #define ssize_t int | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_WS2TCPIP_H | ||||
| #define socklen_t int | ||||
| #endif | ||||
|  | ||||
| /* Recent autoconf versions define these symbols in config.h. We don't want | ||||
|    them (since they collide with the libcurl ones when we build | ||||
|    --enable-debug) so we undef them again here. */ | ||||
| #endif /* HAVE_CONFIG_H */ | ||||
|  | ||||
| /* | ||||
|  * Recent autoconf versions define these symbols in config.h. We don't | ||||
|  * want them (since they collide with the libcurl ones when we build | ||||
|  *  --enable-debug) so we undef them again here. | ||||
|  */ | ||||
|  | ||||
| #undef PACKAGE_STRING | ||||
| #undef PACKAGE_TARNAME | ||||
| #undef PACKAGE_VERSION | ||||
| @@ -33,9 +95,11 @@ | ||||
| #undef VERSION | ||||
| #undef PACKAGE | ||||
|  | ||||
| /* now typedef our socket type */ | ||||
| /* | ||||
|  * Typedef our socket type | ||||
|  */ | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include <winsock.h> | ||||
| typedef SOCKET ares_socket_t; | ||||
| #define ARES_SOCKET_BAD INVALID_SOCKET | ||||
| #else | ||||
| @@ -43,8 +107,10 @@ typedef int ares_socket_t; | ||||
| #define ARES_SOCKET_BAD -1 | ||||
| #endif | ||||
|  | ||||
| /* Assume a few thing unless they're set by configure | ||||
| /* | ||||
|  * Assume a few thing unless they're set by configure | ||||
|  */ | ||||
|  | ||||
| #if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) | ||||
| #define HAVE_SYS_TIME_H | ||||
| #endif | ||||
| @@ -58,7 +124,7 @@ typedef int ares_socket_t; | ||||
| #endif | ||||
|  | ||||
| #if (defined(WIN32) || defined(WATT32)) && \ | ||||
|    !(defined(__MINGW32__) || defined(NETWARE)) | ||||
|    !(defined(__MINGW32__) || defined(NETWARE) || defined(__DJGPP__)) | ||||
| /* protos for the functions we provide in windows_port.c */ | ||||
| int ares_strncasecmp(const char *s1, const char *s2, int n); | ||||
| int ares_strcasecmp(const char *s1, const char *s2); | ||||
| @@ -79,4 +145,4 @@ int ares_strcasecmp(const char *s1, const char *s2); | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #endif /* ARES_SETUP_H */ | ||||
| #endif /* __ARES_SETUP_H */ | ||||
|   | ||||
| @@ -1,213 +0,0 @@ | ||||
| # Microsoft Developer Studio Generated NMAKE File, Based on adig.dsp | ||||
| !IF "$(CFG)" == "" | ||||
| CFG=adig - Win32 Debug | ||||
| !MESSAGE No configuration specified. Defaulting to adig - Win32 Debug. | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(CFG)" != "adig - Win32 Release" && "$(CFG)" != "adig - Win32 Debug" | ||||
| !MESSAGE Invalid configuration "$(CFG)" specified. | ||||
| !MESSAGE You can specify a configuration when running NMAKE | ||||
| !MESSAGE by defining the macro CFG on the command line. For example: | ||||
| !MESSAGE  | ||||
| !MESSAGE NMAKE /f "adig.mak" CFG="adig - Win32 Debug" | ||||
| !MESSAGE  | ||||
| !MESSAGE Possible choices for configuration are: | ||||
| !MESSAGE  | ||||
| !MESSAGE "adig - Win32 Release" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE "adig - Win32 Debug" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE  | ||||
| !ERROR An invalid configuration is specified. | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(OS)" == "Windows_NT" | ||||
| NULL= | ||||
| !ELSE  | ||||
| NULL=nul | ||||
| !ENDIF  | ||||
|  | ||||
| CPP=cl.exe | ||||
| RSC=rc.exe | ||||
|  | ||||
| !IF  "$(CFG)" == "adig - Win32 Release" | ||||
|  | ||||
| OUTDIR=.\Release | ||||
| INTDIR=.\Release | ||||
| # Begin Custom Macros | ||||
| OutDir=.\Release | ||||
| # End Custom Macros | ||||
|  | ||||
| !IF "$(RECURSE)" == "0"  | ||||
|  | ||||
| ALL : "$(OUTDIR)\adig.exe" | ||||
|  | ||||
| !ELSE  | ||||
|  | ||||
| ALL : "areslib - Win32 Release" "$(OUTDIR)\adig.exe" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(RECURSE)" == "1"  | ||||
| CLEAN :"areslib - Win32 ReleaseCLEAN"  | ||||
| !ELSE  | ||||
| CLEAN : | ||||
| !ENDIF  | ||||
| 	-@erase "$(INTDIR)\adig.obj" | ||||
| 	-@erase "$(INTDIR)\getopt.obj" | ||||
| 	-@erase "$(INTDIR)\vc60.idb" | ||||
| 	-@erase "$(OUTDIR)\adig.exe" | ||||
|  | ||||
| "$(OUTDIR)" : | ||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||
|  | ||||
| CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\adig.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c  | ||||
| BSC32=bscmake.exe | ||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\adig.bsc"  | ||||
| BSC32_SBRS= \ | ||||
| 	 | ||||
| LINK32=link.exe | ||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\adig.pdb" /machine:I386 /out:"$(OUTDIR)\adig.exe" /libpath:"..\areslib\Release"  | ||||
| LINK32_OBJS= \ | ||||
| 	"$(INTDIR)\adig.obj" \ | ||||
| 	"$(INTDIR)\getopt.obj" \ | ||||
| 	"..\areslib\Release\areslib.lib" | ||||
|  | ||||
| "$(OUTDIR)\adig.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) | ||||
|     $(LINK32) @<< | ||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) | ||||
| << | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "adig - Win32 Debug" | ||||
|  | ||||
| OUTDIR=.\Debug | ||||
| INTDIR=.\Debug | ||||
| # Begin Custom Macros | ||||
| OutDir=.\Debug | ||||
| # End Custom Macros | ||||
|  | ||||
| !IF "$(RECURSE)" == "0"  | ||||
|  | ||||
| ALL : "$(OUTDIR)\adig.exe" | ||||
|  | ||||
| !ELSE  | ||||
|  | ||||
| ALL : "areslib - Win32 Debug" "$(OUTDIR)\adig.exe" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(RECURSE)" == "1"  | ||||
| CLEAN :"areslib - Win32 DebugCLEAN"  | ||||
| !ELSE  | ||||
| CLEAN : | ||||
| !ENDIF  | ||||
| 	-@erase "$(INTDIR)\adig.obj" | ||||
| 	-@erase "$(INTDIR)\getopt.obj" | ||||
| 	-@erase "$(INTDIR)\vc60.idb" | ||||
| 	-@erase "$(INTDIR)\vc60.pdb" | ||||
| 	-@erase "$(OUTDIR)\adig.exe" | ||||
| 	-@erase "$(OUTDIR)\adig.ilk" | ||||
| 	-@erase "$(OUTDIR)\adig.pdb" | ||||
|  | ||||
| "$(OUTDIR)" : | ||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||
|  | ||||
| CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\adig.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ  /c  | ||||
| BSC32=bscmake.exe | ||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\adig.bsc"  | ||||
| BSC32_SBRS= \ | ||||
| 	 | ||||
| LINK32=link.exe | ||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\adig.pdb" /debug /machine:I386 /out:"$(OUTDIR)\adig.exe" /pdbtype:sept /libpath:"..\areslib\Debug"  | ||||
| LINK32_OBJS= \ | ||||
| 	"$(INTDIR)\adig.obj" \ | ||||
| 	"$(INTDIR)\getopt.obj" \ | ||||
| 	"..\areslib\Debug\areslib.lib" | ||||
|  | ||||
| "$(OUTDIR)\adig.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) | ||||
|     $(LINK32) @<< | ||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) | ||||
| << | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| .c{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cpp{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cxx{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .c{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cpp{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cxx{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
|  | ||||
| !IF "$(NO_EXTERNAL_DEPS)" != "1" | ||||
| !IF EXISTS("adig.dep") | ||||
| !INCLUDE "adig.dep" | ||||
| !ELSE  | ||||
| !MESSAGE Warning: cannot find "adig.dep" | ||||
| !ENDIF  | ||||
| !ENDIF  | ||||
|  | ||||
|  | ||||
| !IF "$(CFG)" == "adig - Win32 Release" || "$(CFG)" == "adig - Win32 Debug" | ||||
| SOURCE=..\..\adig.c | ||||
|  | ||||
| "$(INTDIR)\adig.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\getopt.c | ||||
|  | ||||
| "$(INTDIR)\getopt.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| !IF  "$(CFG)" == "adig - Win32 Release" | ||||
|  | ||||
| "areslib - Win32 Release" :  | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"  | ||||
|    cd "..\adig" | ||||
|  | ||||
| "areslib - Win32 ReleaseCLEAN" :  | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN  | ||||
|    cd "..\adig" | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "adig - Win32 Debug" | ||||
|  | ||||
| "areslib - Win32 Debug" :  | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"  | ||||
|    cd "..\adig" | ||||
|  | ||||
| "areslib - Win32 DebugCLEAN" :  | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN  | ||||
|    cd "..\adig" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| @@ -1,77 +0,0 @@ | ||||
| <html> | ||||
| <body> | ||||
| <pre> | ||||
| <h1>Build Log</h1> | ||||
| <h3> | ||||
| --------------------Configuration: areslib - Win32 Release-------------------- | ||||
| </h3> | ||||
| <h3>Command Lines</h3> | ||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615A.tmp" with contents | ||||
| [ | ||||
| /nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"Release/areslib.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c  | ||||
| "Z:\ARES-1.1.1\ares_gethostbyname.c" | ||||
| "Z:\ARES-1.1.1\ares_init.c" | ||||
| ] | ||||
| Creating command line "cl.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615A.tmp"  | ||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615B.tmp" with contents | ||||
| [ | ||||
| /nologo /out:"Release\areslib.lib"  | ||||
| ".\Release\ares__close_sockets.obj" | ||||
| ".\Release\ares__get_hostent.obj" | ||||
| ".\Release\ares__read_line.obj" | ||||
| ".\Release\ares_destroy.obj" | ||||
| ".\Release\ares_expand_name.obj" | ||||
| ".\Release\ares_fds.obj" | ||||
| ".\Release\ares_free_errmem.obj" | ||||
| ".\Release\ares_free_hostent.obj" | ||||
| ".\Release\ares_free_string.obj" | ||||
| ".\Release\ares_gethostbyaddr.obj" | ||||
| ".\Release\ares_gethostbyname.obj" | ||||
| ".\Release\ares_init.obj" | ||||
| ".\Release\ares_mkquery.obj" | ||||
| ".\Release\ares_parse_a_reply.obj" | ||||
| ".\Release\ares_parse_ptr_reply.obj" | ||||
| ".\Release\ares_process.obj" | ||||
| ".\Release\ares_query.obj" | ||||
| ".\Release\ares_search.obj" | ||||
| ".\Release\ares_send.obj" | ||||
| ".\Release\ares_strerror.obj" | ||||
| ".\Release\ares_timeout.obj" | ||||
| ".\Release\windows_port.obj" | ||||
| ] | ||||
| Creating command line "link.exe -lib @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615B.tmp" | ||||
| <h3>Output Window</h3> | ||||
| Compiling... | ||||
| ares_gethostbyname.c | ||||
| Z:\ARES-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_init.c | ||||
| Z:\ARES-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| Z:\ARES-1.1.1\ares_init.c(141) : warning C4013: '_getpid' undefined; assuming extern returning int | ||||
| Z:\ARES-1.1.1\ares_init.c(236) : warning C4101: 'p' : unreferenced local variable | ||||
| Z:\ARES-1.1.1\ares_init.c(237) : warning C4101: 'linesize' : unreferenced local variable | ||||
| Z:\ARES-1.1.1\ares_init.c(235) : warning C4101: 'fp' : unreferenced local variable | ||||
| Creating library... | ||||
| <h3> | ||||
| --------------------Configuration: adig - Win32 Release-------------------- | ||||
| </h3> | ||||
| <h3>Command Lines</h3> | ||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615C.tmp" with contents | ||||
| [ | ||||
| wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"Release/adig.pdb" /machine:I386 /out:"Release/adig.exe" /libpath:"..\areslib\Release"  | ||||
| ".\Release\adig.obj" | ||||
| ".\Release\getopt.obj" | ||||
| "\ARES-1.1.1\vc\areslib\Release\areslib.lib" | ||||
| ] | ||||
| Creating command line "link.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP615C.tmp" | ||||
| <h3>Output Window</h3> | ||||
| Linking... | ||||
|  | ||||
|  | ||||
|  | ||||
| <h3>Results</h3> | ||||
| adig.exe - 0 error(s), 6 warning(s) | ||||
| </pre> | ||||
| </body> | ||||
| </html> | ||||
| @@ -1,223 +0,0 @@ | ||||
| # Microsoft Developer Studio Generated NMAKE File, Based on ahost.dsp | ||||
| !IF "$(CFG)" == "" | ||||
| CFG=ahost - Win32 Debug | ||||
| !MESSAGE No configuration specified. Defaulting to ahost - Win32 Debug. | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(CFG)" != "ahost - Win32 Release" && "$(CFG)" != "ahost - Win32 Debug" | ||||
| !MESSAGE Invalid configuration "$(CFG)" specified. | ||||
| !MESSAGE You can specify a configuration when running NMAKE | ||||
| !MESSAGE by defining the macro CFG on the command line. For example: | ||||
| !MESSAGE  | ||||
| !MESSAGE NMAKE /f "ahost.mak" CFG="ahost - Win32 Debug" | ||||
| !MESSAGE  | ||||
| !MESSAGE Possible choices for configuration are: | ||||
| !MESSAGE  | ||||
| !MESSAGE "ahost - Win32 Release" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE "ahost - Win32 Debug" (based on "Win32 (x86) Console Application") | ||||
| !MESSAGE  | ||||
| !ERROR An invalid configuration is specified. | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(OS)" == "Windows_NT" | ||||
| NULL= | ||||
| !ELSE  | ||||
| NULL=nul | ||||
| !ENDIF  | ||||
|  | ||||
| CPP=cl.exe | ||||
| RSC=rc.exe | ||||
|  | ||||
| !IF  "$(CFG)" == "ahost - Win32 Release" | ||||
|  | ||||
| OUTDIR=.\Release | ||||
| INTDIR=.\Release | ||||
| # Begin Custom Macros | ||||
| OutDir=.\Release | ||||
| # End Custom Macros | ||||
|  | ||||
| !IF "$(RECURSE)" == "0"  | ||||
|  | ||||
| ALL : "$(OUTDIR)\ahost.exe" | ||||
|  | ||||
| !ELSE  | ||||
|  | ||||
| ALL : "areslib - Win32 Release" "$(OUTDIR)\ahost.exe" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(RECURSE)" == "1"  | ||||
| CLEAN :"areslib - Win32 ReleaseCLEAN"  | ||||
| !ELSE  | ||||
| CLEAN : | ||||
| !ENDIF  | ||||
| 	-@erase "$(INTDIR)\ahost.obj" | ||||
| 	-@erase "$(INTDIR)\vc60.idb" | ||||
| 	-@erase "$(OUTDIR)\ahost.exe" | ||||
|  | ||||
| "$(OUTDIR)" : | ||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||
|  | ||||
| CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\ahost.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c  | ||||
| BSC32=bscmake.exe | ||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\ahost.bsc"  | ||||
| BSC32_SBRS= \ | ||||
| 	 | ||||
| LINK32=link.exe | ||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\ahost.pdb" /machine:I386 /out:"$(OUTDIR)\ahost.exe" /libpath:"..\areslib\Release"  | ||||
| LINK32_OBJS= \ | ||||
| 	"$(INTDIR)\ahost.obj" \ | ||||
| 	"..\areslib\Release\areslib.lib" | ||||
|  | ||||
| "$(OUTDIR)\ahost.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) | ||||
|     $(LINK32) @<< | ||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) | ||||
| << | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" | ||||
|  | ||||
| OUTDIR=.\Debug | ||||
| INTDIR=.\Debug | ||||
| # Begin Custom Macros | ||||
| OutDir=.\Debug | ||||
| # End Custom Macros | ||||
|  | ||||
| !IF "$(RECURSE)" == "0"  | ||||
|  | ||||
| ALL : "$(OUTDIR)\ahost.exe" "$(OUTDIR)\ahost.bsc" | ||||
|  | ||||
| !ELSE  | ||||
|  | ||||
| ALL : "areslib - Win32 Debug" "$(OUTDIR)\ahost.exe" "$(OUTDIR)\ahost.bsc" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| !IF "$(RECURSE)" == "1"  | ||||
| CLEAN :"areslib - Win32 DebugCLEAN"  | ||||
| !ELSE  | ||||
| CLEAN : | ||||
| !ENDIF  | ||||
| 	-@erase "$(INTDIR)\ahost.obj" | ||||
| 	-@erase "$(INTDIR)\ahost.sbr" | ||||
| 	-@erase "$(INTDIR)\vc60.idb" | ||||
| 	-@erase "$(INTDIR)\vc60.pdb" | ||||
| 	-@erase "$(OUTDIR)\ahost.bsc" | ||||
| 	-@erase "$(OUTDIR)\ahost.exe" | ||||
| 	-@erase "$(OUTDIR)\ahost.ilk" | ||||
| 	-@erase "$(OUTDIR)\ahost.pdb" | ||||
|  | ||||
| "$(OUTDIR)" : | ||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||
|  | ||||
| CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fp"$(INTDIR)\ahost.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ  /c  | ||||
| BSC32=bscmake.exe | ||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\ahost.bsc"  | ||||
| BSC32_SBRS= \ | ||||
| 	"$(INTDIR)\ahost.sbr" | ||||
|  | ||||
| "$(OUTDIR)\ahost.bsc" : "$(OUTDIR)" $(BSC32_SBRS) | ||||
|     $(BSC32) @<< | ||||
|   $(BSC32_FLAGS) $(BSC32_SBRS) | ||||
| << | ||||
|  | ||||
| LINK32=link.exe | ||||
| LINK32_FLAGS=wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\ahost.pdb" /debug /machine:I386 /out:"$(OUTDIR)\ahost.exe" /pdbtype:sept /libpath:"..\areslib\Debug"  | ||||
| LINK32_OBJS= \ | ||||
| 	"$(INTDIR)\ahost.obj" \ | ||||
| 	"..\areslib\Debug\areslib.lib" | ||||
|  | ||||
| "$(OUTDIR)\ahost.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) | ||||
|     $(LINK32) @<< | ||||
|   $(LINK32_FLAGS) $(LINK32_OBJS) | ||||
| << | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| .c{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cpp{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cxx{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .c{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cpp{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
| .cxx{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $<  | ||||
| << | ||||
|  | ||||
|  | ||||
| !IF "$(NO_EXTERNAL_DEPS)" != "1" | ||||
| !IF EXISTS("ahost.dep") | ||||
| !INCLUDE "ahost.dep" | ||||
| !ELSE  | ||||
| !MESSAGE Warning: cannot find "ahost.dep" | ||||
| !ENDIF  | ||||
| !ENDIF  | ||||
|  | ||||
|  | ||||
| !IF "$(CFG)" == "ahost - Win32 Release" || "$(CFG)" == "ahost - Win32 Debug" | ||||
| SOURCE=..\..\ahost.c | ||||
|  | ||||
| !IF  "$(CFG)" == "ahost - Win32 Release" | ||||
|  | ||||
|  | ||||
| "$(INTDIR)\ahost.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" | ||||
|  | ||||
|  | ||||
| "$(INTDIR)\ahost.obj"	"$(INTDIR)\ahost.sbr" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| !IF  "$(CFG)" == "ahost - Win32 Release" | ||||
|  | ||||
| "areslib - Win32 Release" :  | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"  | ||||
|    cd "..\ahost" | ||||
|  | ||||
| "areslib - Win32 ReleaseCLEAN" :  | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN  | ||||
|    cd "..\ahost" | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" | ||||
|  | ||||
| "areslib - Win32 Debug" :  | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"  | ||||
|    cd "..\ahost" | ||||
|  | ||||
| "areslib - Win32 DebugCLEAN" :  | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN  | ||||
|    cd "..\ahost" | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
|  | ||||
| !ENDIF  | ||||
|  | ||||
| @@ -1,16 +0,0 @@ | ||||
| <html> | ||||
| <body> | ||||
| <pre> | ||||
| <h1>Build Log</h1> | ||||
| <h3> | ||||
| --------------------Configuration: ahost - Win32 Release-------------------- | ||||
| </h3> | ||||
| <h3>Command Lines</h3> | ||||
|  | ||||
|  | ||||
|  | ||||
| <h3>Results</h3> | ||||
| ahost.exe - 0 error(s), 0 warning(s) | ||||
| </pre> | ||||
| </body> | ||||
| </html> | ||||
| @@ -97,6 +97,10 @@ SOURCE=..\..\ares__read_line.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_cancel.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_destroy.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
| @@ -137,6 +141,10 @@ SOURCE=..\..\ares_parse_a_reply.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_parse_aaaa_reply.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_parse_ptr_reply.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
| @@ -153,14 +161,6 @@ SOURCE=..\..\ares_search.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_cancel.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_version.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_send.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
| @@ -173,6 +173,22 @@ SOURCE=..\..\ares_timeout.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_version.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\bitncmp.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\inet_net_pton.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\inet_ntop.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\windows_port.c | ||||
| # End Source File | ||||
| # End Group | ||||
| @@ -189,7 +205,7 @@ SOURCE=..\..\ares_dns.h | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_version.h | ||||
| SOURCE=..\..\ares_ipv6.h | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| @@ -197,6 +213,22 @@ SOURCE=..\..\ares_private.h | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_version.h | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\bitncmp.h | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\inet_net_pton.h | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\inet_ntop.h | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\nameser.h | ||||
| # End Source File | ||||
| # End Group | ||||
|   | ||||
							
								
								
									
										29
									
								
								ares/vc/areslib/areslib.dsw
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								ares/vc/areslib/areslib.dsw
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| Microsoft Developer Studio Workspace File, Format Version 6.00 | ||||
| # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! | ||||
|  | ||||
| ############################################################################### | ||||
|  | ||||
| Project: "areslib"=.\areslib.dsp - Package Owner=<4> | ||||
|  | ||||
| Package=<5> | ||||
| {{{ | ||||
| }}} | ||||
|  | ||||
| Package=<4> | ||||
| {{{ | ||||
| }}} | ||||
|  | ||||
| ############################################################################### | ||||
|  | ||||
| Global: | ||||
|  | ||||
| Package=<5> | ||||
| {{{ | ||||
| }}} | ||||
|  | ||||
| Package=<3> | ||||
| {{{ | ||||
| }}} | ||||
|  | ||||
| ############################################################################### | ||||
|  | ||||
| @@ -1,367 +0,0 @@ | ||||
| # Microsoft Developer Studio Generated NMAKE File, Based on areslib.dsp | ||||
| !IF "$(CFG)" == "" | ||||
| CFG=areslib - Win32 Debug | ||||
| !MESSAGE No configuration specified. Defaulting to areslib - Win32 Debug. | ||||
| !ENDIF | ||||
|  | ||||
| !IF "$(CFG)" != "areslib - Win32 Release" && "$(CFG)" != "areslib - Win32 Debug" | ||||
| !MESSAGE Invalid configuration "$(CFG)" specified. | ||||
| !MESSAGE You can specify a configuration when running NMAKE | ||||
| !MESSAGE by defining the macro CFG on the command line. For example: | ||||
| !MESSAGE | ||||
| !MESSAGE NMAKE /f "areslib.mak" CFG="areslib - Win32 Debug" | ||||
| !MESSAGE | ||||
| !MESSAGE Possible choices for configuration are: | ||||
| !MESSAGE | ||||
| !MESSAGE "areslib - Win32 Release" (based on "Win32 (x86) Static Library") | ||||
| !MESSAGE "areslib - Win32 Debug" (based on "Win32 (x86) Static Library") | ||||
| !MESSAGE | ||||
| !ERROR An invalid configuration is specified. | ||||
| !ENDIF | ||||
|  | ||||
| !IF "$(OS)" == "Windows_NT" | ||||
| NULL= | ||||
| !ELSE | ||||
| NULL=nul | ||||
| !ENDIF | ||||
|  | ||||
| CPP=cl.exe | ||||
| RSC=rc.exe | ||||
|  | ||||
| !IF  "$(CFG)" == "areslib - Win32 Release" | ||||
|  | ||||
| OUTDIR=.\Release | ||||
| INTDIR=.\Release | ||||
| # Begin Custom Macros | ||||
| OutDir=.\Release | ||||
| # End Custom Macros | ||||
|  | ||||
| ALL : "$(OUTDIR)\areslib.lib" | ||||
|  | ||||
|  | ||||
| CLEAN : | ||||
| 	-@erase "$(INTDIR)\ares__close_sockets.obj" | ||||
| 	-@erase "$(INTDIR)\ares__get_hostent.obj" | ||||
| 	-@erase "$(INTDIR)\ares__read_line.obj" | ||||
| 	-@erase "$(INTDIR)\ares_destroy.obj" | ||||
| 	-@erase "$(INTDIR)\ares_expand_name.obj" | ||||
| 	-@erase "$(INTDIR)\ares_fds.obj" | ||||
| 	-@erase "$(INTDIR)\ares_free_hostent.obj" | ||||
| 	-@erase "$(INTDIR)\ares_free_string.obj" | ||||
| 	-@erase "$(INTDIR)\ares_gethostbyaddr.obj" | ||||
| 	-@erase "$(INTDIR)\ares_gethostbyname.obj" | ||||
| 	-@erase "$(INTDIR)\ares_init.obj" | ||||
| 	-@erase "$(INTDIR)\ares_mkquery.obj" | ||||
| 	-@erase "$(INTDIR)\ares_parse_a_reply.obj" | ||||
| 	-@erase "$(INTDIR)\ares_parse_ptr_reply.obj" | ||||
| 	-@erase "$(INTDIR)\ares_process.obj" | ||||
| 	-@erase "$(INTDIR)\ares_query.obj" | ||||
| 	-@erase "$(INTDIR)\ares_search.obj" | ||||
| 	-@erase "$(INTDIR)\ares_send.obj" | ||||
| 	-@erase "$(INTDIR)\ares_strerror.obj" | ||||
| 	-@erase "$(INTDIR)\ares_timeout.obj" | ||||
| 	-@erase "$(INTDIR)\vc60.idb" | ||||
| 	-@erase "$(INTDIR)\windows_port.obj" | ||||
| 	-@erase "$(OUTDIR)\areslib.lib" | ||||
|  | ||||
| "$(OUTDIR)" : | ||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||
|  | ||||
| CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c | ||||
| BSC32=bscmake.exe | ||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc" | ||||
| BSC32_SBRS= \ | ||||
|  | ||||
| LIB32=link.exe -lib | ||||
| LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib" | ||||
| LIB32_OBJS= \ | ||||
| 	"$(INTDIR)\ares__close_sockets.obj" \ | ||||
| 	"$(INTDIR)\ares__get_hostent.obj" \ | ||||
| 	"$(INTDIR)\ares__read_line.obj" \ | ||||
| 	"$(INTDIR)\ares_destroy.obj" \ | ||||
| 	"$(INTDIR)\ares_expand_name.obj" \ | ||||
| 	"$(INTDIR)\ares_fds.obj" \ | ||||
| 	"$(INTDIR)\ares_free_hostent.obj" \ | ||||
| 	"$(INTDIR)\ares_free_string.obj" \ | ||||
| 	"$(INTDIR)\ares_gethostbyaddr.obj" \ | ||||
| 	"$(INTDIR)\ares_gethostbyname.obj" \ | ||||
| 	"$(INTDIR)\ares_init.obj" \ | ||||
| 	"$(INTDIR)\ares_mkquery.obj" \ | ||||
| 	"$(INTDIR)\ares_parse_a_reply.obj" \ | ||||
| 	"$(INTDIR)\ares_parse_ptr_reply.obj" \ | ||||
| 	"$(INTDIR)\ares_process.obj" \ | ||||
| 	"$(INTDIR)\ares_query.obj" \ | ||||
| 	"$(INTDIR)\ares_search.obj" \ | ||||
| 	"$(INTDIR)\ares_cancel.obj" \ | ||||
| 	"$(INTDIR)\ares_version.obj" \ | ||||
| 	"$(INTDIR)\ares_send.obj" \ | ||||
| 	"$(INTDIR)\ares_strerror.obj" \ | ||||
| 	"$(INTDIR)\ares_timeout.obj" \ | ||||
| 	"$(INTDIR)\windows_port.obj" | ||||
|  | ||||
| "$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) | ||||
|     $(LIB32) @<< | ||||
|   $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) | ||||
| << | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "areslib - Win32 Debug" | ||||
|  | ||||
| OUTDIR=.\Debug | ||||
| INTDIR=.\Debug | ||||
| # Begin Custom Macros | ||||
| OutDir=.\Debug | ||||
| # End Custom Macros | ||||
|  | ||||
| ALL : "$(OUTDIR)\areslib.lib" | ||||
|  | ||||
|  | ||||
| CLEAN : | ||||
| 	-@erase "$(INTDIR)\ares__close_sockets.obj" | ||||
| 	-@erase "$(INTDIR)\ares__get_hostent.obj" | ||||
| 	-@erase "$(INTDIR)\ares__read_line.obj" | ||||
| 	-@erase "$(INTDIR)\ares_destroy.obj" | ||||
| 	-@erase "$(INTDIR)\ares_expand_name.obj" | ||||
| 	-@erase "$(INTDIR)\ares_fds.obj" | ||||
| 	-@erase "$(INTDIR)\ares_free_hostent.obj" | ||||
| 	-@erase "$(INTDIR)\ares_free_string.obj" | ||||
| 	-@erase "$(INTDIR)\ares_gethostbyaddr.obj" | ||||
| 	-@erase "$(INTDIR)\ares_gethostbyname.obj" | ||||
| 	-@erase "$(INTDIR)\ares_init.obj" | ||||
| 	-@erase "$(INTDIR)\ares_mkquery.obj" | ||||
| 	-@erase "$(INTDIR)\ares_parse_a_reply.obj" | ||||
| 	-@erase "$(INTDIR)\ares_parse_ptr_reply.obj" | ||||
| 	-@erase "$(INTDIR)\ares_process.obj" | ||||
| 	-@erase "$(INTDIR)\ares_query.obj" | ||||
| 	-@erase "$(INTDIR)\ares_search.obj" | ||||
| 	-@erase "$(INTDIR)\ares_cancel.obj" | ||||
| 	-@erase "$(INTDIR)\ares_version.obj" | ||||
| 	-@erase "$(INTDIR)\ares_send.obj" | ||||
| 	-@erase "$(INTDIR)\ares_strerror.obj" | ||||
| 	-@erase "$(INTDIR)\ares_timeout.obj" | ||||
| 	-@erase "$(INTDIR)\vc60.idb" | ||||
| 	-@erase "$(INTDIR)\vc60.pdb" | ||||
| 	-@erase "$(INTDIR)\windows_port.obj" | ||||
| 	-@erase "$(OUTDIR)\areslib.lib" | ||||
|  | ||||
| "$(OUTDIR)" : | ||||
|     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||
|  | ||||
| CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /I "..\.." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\areslib.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ  /c | ||||
| BSC32=bscmake.exe | ||||
| BSC32_FLAGS=/nologo /o"$(OUTDIR)\areslib.bsc" | ||||
| BSC32_SBRS= \ | ||||
|  | ||||
| LIB32=link.exe -lib | ||||
| LIB32_FLAGS=/nologo /out:"$(OUTDIR)\areslib.lib" | ||||
| LIB32_OBJS= \ | ||||
| 	"$(INTDIR)\ares__close_sockets.obj" \ | ||||
| 	"$(INTDIR)\ares__get_hostent.obj" \ | ||||
| 	"$(INTDIR)\ares__read_line.obj" \ | ||||
| 	"$(INTDIR)\ares_destroy.obj" \ | ||||
| 	"$(INTDIR)\ares_expand_name.obj" \ | ||||
| 	"$(INTDIR)\ares_fds.obj" \ | ||||
| 	"$(INTDIR)\ares_free_hostent.obj" \ | ||||
| 	"$(INTDIR)\ares_free_string.obj" \ | ||||
| 	"$(INTDIR)\ares_gethostbyaddr.obj" \ | ||||
| 	"$(INTDIR)\ares_gethostbyname.obj" \ | ||||
| 	"$(INTDIR)\ares_init.obj" \ | ||||
| 	"$(INTDIR)\ares_mkquery.obj" \ | ||||
| 	"$(INTDIR)\ares_parse_a_reply.obj" \ | ||||
| 	"$(INTDIR)\ares_parse_ptr_reply.obj" \ | ||||
| 	"$(INTDIR)\ares_process.obj" \ | ||||
| 	"$(INTDIR)\ares_query.obj" \ | ||||
| 	"$(INTDIR)\ares_search.obj" \ | ||||
| 	"$(INTDIR)\ares_send.obj" \ | ||||
| 	"$(INTDIR)\ares_strerror.obj" \ | ||||
| 	"$(INTDIR)\ares_timeout.obj" \ | ||||
| 	"$(INTDIR)\windows_port.obj" | ||||
|  | ||||
| "$(OUTDIR)\areslib.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) | ||||
|     $(LIB32) @<< | ||||
|   $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) | ||||
| << | ||||
|  | ||||
| !ENDIF | ||||
|  | ||||
| .c{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $< | ||||
| << | ||||
|  | ||||
| .cpp{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $< | ||||
| << | ||||
|  | ||||
| .cxx{$(INTDIR)}.obj:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $< | ||||
| << | ||||
|  | ||||
| .c{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $< | ||||
| << | ||||
|  | ||||
| .cpp{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $< | ||||
| << | ||||
|  | ||||
| .cxx{$(INTDIR)}.sbr:: | ||||
|    $(CPP) @<< | ||||
|    $(CPP_PROJ) $< | ||||
| << | ||||
|  | ||||
|  | ||||
| !IF "$(NO_EXTERNAL_DEPS)" != "1" | ||||
| !IF EXISTS("areslib.dep") | ||||
| !INCLUDE "areslib.dep" | ||||
| !ELSE | ||||
| !MESSAGE Warning: cannot find "areslib.dep" | ||||
| !ENDIF | ||||
| !ENDIF | ||||
|  | ||||
|  | ||||
| !IF "$(CFG)" == "areslib - Win32 Release" || "$(CFG)" == "areslib - Win32 Debug" | ||||
| SOURCE=..\..\ares__close_sockets.c | ||||
|  | ||||
| "$(INTDIR)\ares__close_sockets.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares__get_hostent.c | ||||
|  | ||||
| "$(INTDIR)\ares__get_hostent.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares__read_line.c | ||||
|  | ||||
| "$(INTDIR)\ares__read_line.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_destroy.c | ||||
|  | ||||
| "$(INTDIR)\ares_destroy.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_expand_name.c | ||||
|  | ||||
| "$(INTDIR)\ares_expand_name.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_fds.c | ||||
|  | ||||
| "$(INTDIR)\ares_fds.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_free_hostent.c | ||||
|  | ||||
| "$(INTDIR)\ares_free_hostent.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_free_string.c | ||||
|  | ||||
| "$(INTDIR)\ares_free_string.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_gethostbyaddr.c | ||||
|  | ||||
| "$(INTDIR)\ares_gethostbyaddr.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_gethostbyname.c | ||||
|  | ||||
| "$(INTDIR)\ares_gethostbyname.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_init.c | ||||
|  | ||||
| "$(INTDIR)\ares_init.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_mkquery.c | ||||
|  | ||||
| "$(INTDIR)\ares_mkquery.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_parse_a_reply.c | ||||
|  | ||||
| "$(INTDIR)\ares_parse_a_reply.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_parse_ptr_reply.c | ||||
|  | ||||
| "$(INTDIR)\ares_parse_ptr_reply.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_process.c | ||||
|  | ||||
| "$(INTDIR)\ares_process.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_query.c | ||||
|  | ||||
| "$(INTDIR)\ares_query.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_search.c | ||||
|  | ||||
| "$(INTDIR)\ares_search.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_version.c | ||||
|  | ||||
| "$(INTDIR)\ares_version.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_cancel.c | ||||
|  | ||||
| "$(INTDIR)\ares_cancel.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_send.c | ||||
|  | ||||
| "$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_strerror.c | ||||
|  | ||||
| "$(INTDIR)\ares_strerror.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\ares_timeout.c | ||||
|  | ||||
| "$(INTDIR)\ares_timeout.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
| SOURCE=..\..\windows_port.c | ||||
|  | ||||
| "$(INTDIR)\windows_port.obj" : $(SOURCE) "$(INTDIR)" | ||||
| 	$(CPP) $(CPP_PROJ) $(SOURCE) | ||||
|  | ||||
|  | ||||
|  | ||||
| !ENDIF | ||||
|  | ||||
| @@ -1,125 +0,0 @@ | ||||
| <html> | ||||
| <body> | ||||
| <pre> | ||||
| <h1>Build Log</h1> | ||||
| <h3> | ||||
| --------------------Configuration: areslib - Win32 Release-------------------- | ||||
| </h3> | ||||
| <h3>Command Lines</h3> | ||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603D.tmp" with contents | ||||
| [ | ||||
| /nologo /MD /W3 /GX /O2 /I "..\.." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"Release/areslib.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c  | ||||
| "Z:\ares-1.1.1\ares__close_sockets.c" | ||||
| "Z:\ares-1.1.1\ares__get_hostent.c" | ||||
| "Z:\ares-1.1.1\ares__read_line.c" | ||||
| "Z:\ares-1.1.1\ares_destroy.c" | ||||
| "Z:\ares-1.1.1\ares_expand_name.c" | ||||
| "Z:\ares-1.1.1\ares_fds.c" | ||||
| "Z:\ares-1.1.1\ares_free_errmem.c" | ||||
| "Z:\ares-1.1.1\ares_free_hostent.c" | ||||
| "Z:\ares-1.1.1\ares_free_string.c" | ||||
| "Z:\ares-1.1.1\ares_gethostbyaddr.c" | ||||
| "Z:\ares-1.1.1\ares_gethostbyname.c" | ||||
| "Z:\ares-1.1.1\ares_init.c" | ||||
| "Z:\ares-1.1.1\ares_mkquery.c" | ||||
| "Z:\ares-1.1.1\ares_parse_a_reply.c" | ||||
| "Z:\ares-1.1.1\ares_parse_ptr_reply.c" | ||||
| "Z:\ares-1.1.1\ares_process.c" | ||||
| "Z:\ares-1.1.1\ares_query.c" | ||||
| "Z:\ares-1.1.1\ares_search.c" | ||||
| "Z:\ares-1.1.1\ares_send.c" | ||||
| "Z:\ares-1.1.1\ares_strerror.c" | ||||
| "Z:\ares-1.1.1\ares_timeout.c" | ||||
| "Z:\ares-1.1.1\windows_port.c" | ||||
| ] | ||||
| Creating command line "cl.exe @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603D.tmp"  | ||||
| Creating temporary file "C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603E.tmp" with contents | ||||
| [ | ||||
| /nologo /out:"Release\areslib.lib"  | ||||
| ".\Release\ares__close_sockets.obj" | ||||
| ".\Release\ares__get_hostent.obj" | ||||
| ".\Release\ares__read_line.obj" | ||||
| ".\Release\ares_destroy.obj" | ||||
| ".\Release\ares_expand_name.obj" | ||||
| ".\Release\ares_fds.obj" | ||||
| ".\Release\ares_free_errmem.obj" | ||||
| ".\Release\ares_free_hostent.obj" | ||||
| ".\Release\ares_free_string.obj" | ||||
| ".\Release\ares_gethostbyaddr.obj" | ||||
| ".\Release\ares_gethostbyname.obj" | ||||
| ".\Release\ares_init.obj" | ||||
| ".\Release\ares_mkquery.obj" | ||||
| ".\Release\ares_parse_a_reply.obj" | ||||
| ".\Release\ares_parse_ptr_reply.obj" | ||||
| ".\Release\ares_process.obj" | ||||
| ".\Release\ares_query.obj" | ||||
| ".\Release\ares_search.obj" | ||||
| ".\Release\ares_send.obj" | ||||
| ".\Release\ares_strerror.obj" | ||||
| ".\Release\ares_timeout.obj" | ||||
| ".\Release\windows_port.obj" | ||||
| ] | ||||
| Creating command line "link.exe -lib @C:\DOCUME~1\liren\LOCALS~1\Temp\RSP603E.tmp" | ||||
| <h3>Output Window</h3> | ||||
| Compiling... | ||||
| ares__close_sockets.c | ||||
| Z:\ares-1.1.1\ares__close_sockets.c(46) : warning C4013: 'close' undefined; assuming extern returning int | ||||
| ares__get_hostent.c | ||||
| ares__read_line.c | ||||
| ares_destroy.c | ||||
| ares_expand_name.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_fds.c | ||||
| ares_free_errmem.c | ||||
| ares_free_hostent.c | ||||
| ares_free_string.c | ||||
| ares_gethostbyaddr.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_gethostbyname.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_init.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| Z:\ares-1.1.1\ares_init.c(141) : warning C4013: '_getpid' undefined; assuming extern returning int | ||||
| Z:\ares-1.1.1\ares_init.c(236) : warning C4101: 'p' : unreferenced local variable | ||||
| Z:\ares-1.1.1\ares_init.c(237) : warning C4101: 'linesize' : unreferenced local variable | ||||
| Z:\ares-1.1.1\ares_init.c(235) : warning C4101: 'fp' : unreferenced local variable | ||||
| ares_mkquery.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_parse_a_reply.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| Z:\ares-1.1.1\ares_parse_a_reply.c(90) : warning C4018: '<' : signed/unsigned mismatch | ||||
| ares_parse_ptr_reply.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| Z:\ares-1.1.1\ares_parse_ptr_reply.c(71) : warning C4018: '<' : signed/unsigned mismatch | ||||
| ares_process.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_query.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_search.c | ||||
| Z:\ares-1.1.1\ares_search.c(229) : warning C4013: 'strncasecmp' undefined; assuming extern returning int | ||||
| ares_send.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| ares_strerror.c | ||||
| ares_timeout.c | ||||
| windows_port.c | ||||
| Z:\ares-1.1.1\nameser.h(153) : warning C4005: 'NOERROR' : macro redefinition | ||||
|         C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\winerror.h(8022) : see previous definition of 'NOERROR' | ||||
| Creating library... | ||||
|  | ||||
|  | ||||
|  | ||||
| <h3>Results</h3> | ||||
| areslib.lib - 0 error(s), 19 warning(s) | ||||
| </pre> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										49
									
								
								buildconf
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								buildconf
									
									
									
									
									
								
							| @@ -1,4 +1,26 @@ | ||||
| #!/bin/sh | ||||
| #*************************************************************************** | ||||
| #                                  _   _ ____  _ | ||||
| #  Project                     ___| | | |  _ \| | | ||||
| #                             / __| | | | |_) | | | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # | ||||
| # This software is licensed as described in the file COPYING, which | ||||
| # you should have received as part of this distribution. The terms | ||||
| # are also available at http://curl.haxx.se/docs/copyright.html. | ||||
| # | ||||
| # You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||
| # copies of the Software, and permit persons to whom the Software is | ||||
| # furnished to do so, under the terms of the COPYING file. | ||||
| # | ||||
| # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||
| # KIND, either express or implied. | ||||
| # | ||||
| # $Id$ | ||||
| ########################################################################### | ||||
|  | ||||
| die(){ | ||||
| 	echo "$@" | ||||
| @@ -13,6 +35,7 @@ findtool(){ | ||||
|   IFS=":" | ||||
|   for path in $PATH | ||||
|   do | ||||
|     # echo "checks for $file in $path" >&2 | ||||
|     if test -f "$path/$file"; then | ||||
|       echo "$path/$file" | ||||
|       return | ||||
| @@ -85,8 +108,7 @@ fi | ||||
|  | ||||
| echo "buildconf: automake version $am_version (ok)" | ||||
|  | ||||
| ac=`findtool aclocal` | ||||
|  | ||||
| ac=`findtool ${ACLOCAL:-aclocal}` | ||||
| if test -z "$ac"; then | ||||
|   echo "buildconf: aclocal not found. Weird automake installation!" | ||||
|   exit 1 | ||||
| @@ -107,11 +129,16 @@ LIBTOOL_WANTED_VERSION=1.4.2 | ||||
| # glibtool, with 'libtool' being something completely different. | ||||
| libtool=`findtool glibtool 2>/dev/null` | ||||
| if test ! -x "$libtool"; then | ||||
|   libtool=`findtool libtool` | ||||
|   libtool=`findtool ${LIBTOOL:-libtool}` | ||||
| fi | ||||
|  | ||||
| if test -z "$LIBTOOLIZE"; then | ||||
|   # set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found | ||||
| LIBTOOLIZE="${libtool}ize" | ||||
|   # $libtool is already the full path | ||||
|   libtoolize="${libtool}ize" | ||||
| else | ||||
|   libtoolize=`findtool $LIBTOOLIZE` | ||||
| fi | ||||
|  | ||||
| lt_pversion=`$libtool --version 2>/dev/null|head -n 1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'` | ||||
| if test -z "$lt_pversion"; then | ||||
| @@ -150,7 +177,7 @@ fi | ||||
|  | ||||
| echo "buildconf: libtool version $lt_version (ok)" | ||||
|  | ||||
| if test -f "$LIBTOOLIZE"; then | ||||
| if test -f "$libtoolize"; then | ||||
|   echo "buildconf: libtoolize found" | ||||
| else | ||||
|   echo "buildconf: libtoolize not found. Weird libtool installation!" | ||||
| @@ -173,14 +200,14 @@ fi | ||||
| #-------------------------------------------------------------------------- | ||||
| # perl check | ||||
| # | ||||
| PERL=`findtool perl` | ||||
| PERL=`findtool ${PERL:-perl}` | ||||
|  | ||||
| # ------------------------------------------------------------ | ||||
|  | ||||
| # run the correct scripts now | ||||
|  | ||||
| echo "buildconf: running libtoolize" | ||||
| ${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed" | ||||
| $libtoolize --copy --automake --force || die "The libtoolize command failed" | ||||
| echo "buildconf: running aclocal" | ||||
| ${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The aclocal command line failed" | ||||
| if test -n "$PERL"; then | ||||
| @@ -199,12 +226,8 @@ ${AUTOCONF:-autoconf}     || die "The autoconf command failed" | ||||
|  | ||||
| if test -d ares; then | ||||
|   cd ares | ||||
|   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 ares/autoconf" | ||||
|   ${AUTOCONF:-autoconf}     || die "The ares autoconf command failed" | ||||
|   echo "buildconf: running in ares" | ||||
|   ./buildconf | ||||
|   cd .. | ||||
| fi | ||||
|  | ||||
|   | ||||
							
								
								
									
										140
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										140
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -1,4 +1,25 @@ | ||||
| dnl $Id$ | ||||
| #*************************************************************************** | ||||
| #                                  _   _ ____  _ | ||||
| #  Project                     ___| | | |  _ \| | | ||||
| #                             / __| | | | |_) | | | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # | ||||
| # This software is licensed as described in the file COPYING, which | ||||
| # you should have received as part of this distribution. The terms | ||||
| # are also available at http://curl.haxx.se/docs/copyright.html. | ||||
| # | ||||
| # You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||
| # copies of the Software, and permit persons to whom the Software is | ||||
| # furnished to do so, under the terms of the COPYING file. | ||||
| # | ||||
| # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||
| # KIND, either express or implied. | ||||
| # | ||||
| # $Id$ | ||||
| ########################################################################### | ||||
| dnl Process this file with autoconf to produce a configure script. | ||||
|  | ||||
| AC_PREREQ(2.57) | ||||
| @@ -140,6 +161,19 @@ dnl The install stuff has already been taken care of by the automake stuff | ||||
| dnl AC_PROG_INSTALL | ||||
| AC_PROG_MAKE_SET | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Make sure that our checks for headers windows.h winsock.h winsock2.h  | ||||
| dnl and ws2tcpip.h take precedence over any other further checks which  | ||||
| dnl could be done later using AC_CHECK_HEADER or AC_CHECK_HEADERS for | ||||
| dnl this specific header files. And do them before its results are used. | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| CURL_CHECK_HEADER_WINDOWS | ||||
| CURL_CHECK_HEADER_WINSOCK | ||||
| CURL_CHECK_HEADER_WINSOCK2 | ||||
| CURL_CHECK_HEADER_WS2TCPIP | ||||
|  | ||||
|  | ||||
| dnl ************************************************************ | ||||
| dnl switch off particular protocols | ||||
| dnl | ||||
| @@ -151,10 +185,8 @@ AC_HELP_STRING([--disable-http],[Disable HTTP support]), | ||||
|   no) | ||||
|        AC_MSG_RESULT(no) | ||||
|        AC_DEFINE(CURL_DISABLE_HTTP, 1, [to disable HTTP]) | ||||
|        AC_MSG_WARN([disable HTTP disables FTP over proxy and GOPHER too]) | ||||
|        AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable GOPHER]) | ||||
|        AC_MSG_WARN([disable HTTP disables FTP over proxy]) | ||||
|        AC_SUBST(CURL_DISABLE_HTTP, [1]) | ||||
|        AC_SUBST(CURL_DISABLE_GOPHER, [1]) | ||||
|        ;; | ||||
|   *)   AC_MSG_RESULT(yes) | ||||
|        ;; | ||||
| @@ -176,21 +208,6 @@ AC_HELP_STRING([--disable-ftp],[Disable FTP support]), | ||||
|   esac ], | ||||
|        AC_MSG_RESULT(yes) | ||||
| ) | ||||
| AC_MSG_CHECKING([whether to support gopher]) | ||||
| AC_ARG_ENABLE(gopher, | ||||
| AC_HELP_STRING([--enable-gopher],[Enable GOPHER support]) | ||||
| AC_HELP_STRING([--disable-gopher],[Disable GOPHER support]), | ||||
| [ case "$enableval" in | ||||
|   no) | ||||
|        AC_MSG_RESULT(no) | ||||
|        AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable GOPHER]) | ||||
|        AC_SUBST(CURL_DISABLE_GOPHER, [1]) | ||||
|        ;; | ||||
|   *)   AC_MSG_RESULT(yes) | ||||
|        ;; | ||||
|   esac ], | ||||
|        AC_MSG_RESULT(yes) | ||||
| ) | ||||
| AC_MSG_CHECKING([whether to support file]) | ||||
| AC_ARG_ENABLE(file, | ||||
| AC_HELP_STRING([--enable-file],[Enable FILE support]) | ||||
| @@ -289,7 +306,6 @@ AC_HELP_STRING([--disable-manual],[Disable built-in manual]), | ||||
| dnl The actual use of the USE_MANUAL variable is done much later in this | ||||
| dnl script to allow other actions to disable it as well. | ||||
|  | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Checks for libraries. | ||||
| dnl ********************************************************************** | ||||
| @@ -795,7 +811,7 @@ OPT_SSL=off | ||||
| dnl Default to no CA bundle | ||||
| ca="no" | ||||
| AC_ARG_WITH(ssl,dnl | ||||
| AC_HELP_STRING([--with-ssl=PATH],[where to look for SSL, PATH points to the SSL installation (default: /usr/local/ssl)]) | ||||
| AC_HELP_STRING([--with-ssl=PATH],[Where to look for OpenSSL, PATH points to the SSL installation (default: /usr/local/ssl); when possible, set the PKG_CONFIG_PATH environment variable instead of using this option]) | ||||
| AC_HELP_STRING([--without-ssl], [disable SSL]), | ||||
|   OPT_SSL=$withval) | ||||
|  | ||||
| @@ -1047,10 +1063,10 @@ if test "$OPENSSL_ENABLED" != "1"; then | ||||
|     fi | ||||
|     if test -n "$addlib"; then | ||||
|  | ||||
|       CLEANLDFLAGS="$LDFLAGS" | ||||
|       CLEANLIBS="$LIBS" | ||||
|       CLEANCPPFLAGS="$CPPFLAGS" | ||||
|    | ||||
|       LDFLAGS="$LDFLAGS $addlib" | ||||
|       LIBS="$LIBS $addlib" | ||||
|       if test "$addcflags" != "-I/usr/include"; then | ||||
|          CPPFLAGS="$CPPFLAGS $addcflags" | ||||
|       fi | ||||
| @@ -1063,7 +1079,7 @@ if test "$OPENSSL_ENABLED" != "1"; then | ||||
|        curl_ssl_msg="enabled (GnuTLS)" | ||||
|        ], | ||||
|        [ | ||||
|          LDFLAGS="$CLEANLDFLAGS" | ||||
|          LIBS="$CLEANLIBS" | ||||
|          CPPFLAGS="$CLEANCPPFLAGS" | ||||
|        ]) | ||||
|    | ||||
| @@ -1288,8 +1304,8 @@ AC_HELP_STRING([--enable-thread],[look for thread-safe functions]), | ||||
|  | ||||
| if test X"$OPT_THREAD" = Xoff | ||||
| then | ||||
|   AC_DEFINE(DISABLED_THREADSAFE, 1, \ | ||||
| Set to explicitly specify we don't want to use thread-safe functions) | ||||
|   AC_DEFINE(DISABLED_THREADSAFE, 1, | ||||
|     [Set to explicitly specify we don't want to use thread-safe functions]) | ||||
| else | ||||
|   if test "$ipv6" != "yes"; then | ||||
|     dnl dig around for gethostbyname_r() | ||||
| @@ -1395,7 +1411,8 @@ dnl ********************************************************************** | ||||
| dnl Checks for header files. | ||||
| AC_HEADER_STDC | ||||
|  | ||||
| dnl First check for the very most basic headers. Then we can use these | ||||
|  | ||||
| dnl Now check for the very most basic headers. Then we can use these | ||||
| dnl ones as default-headers when checking for the rest! | ||||
| AC_CHECK_HEADERS( | ||||
|         sys/types.h \ | ||||
| @@ -1422,8 +1439,6 @@ AC_CHECK_HEADERS( | ||||
|         fcntl.h \ | ||||
|         dlfcn.h \ | ||||
|         alloca.h \ | ||||
|         winsock.h \ | ||||
|         winsock2.h \ | ||||
|         time.h \ | ||||
|         io.h \ | ||||
|         pwd.h \ | ||||
| @@ -1493,7 +1508,9 @@ fi | ||||
| AC_CHECK_TYPE(ssize_t, , | ||||
|    AC_DEFINE(ssize_t, int, [the signed version of size_t])) | ||||
|  | ||||
| TYPE_SOCKLEN_T | ||||
| # Check for socklen_t or equivalent | ||||
| CURL_CHECK_TYPE_SOCKLEN_T | ||||
|  | ||||
| TYPE_IN_ADDR_T | ||||
|  | ||||
| TYPE_SOCKADDR_STORAGE | ||||
| @@ -1504,6 +1521,13 @@ dnl Checks for library functions. | ||||
| dnl AC_PROG_GCC_TRADITIONAL | ||||
| AC_TYPE_SIGNAL | ||||
| dnl AC_FUNC_VPRINTF | ||||
| case $host in | ||||
|   *msdosdjgpp) | ||||
|      ac_cv_func_pipe=no | ||||
|      skipcheck_pipe=yes | ||||
|      AC_MSG_NOTICE([skip check for pipe on msdosdjgpp]) | ||||
|     ;; | ||||
| esac | ||||
| AC_CHECK_FUNCS( strtoll \ | ||||
|                 socket \ | ||||
|                 select \ | ||||
| @@ -1536,12 +1560,15 @@ AC_CHECK_FUNCS( strtoll \ | ||||
|                 ftruncate \ | ||||
|                 pipe \ | ||||
|                 poll \ | ||||
|                 getprotobyname \ | ||||
|                 getrlimit \ | ||||
|                 setrlimit, | ||||
| dnl if found | ||||
| [], | ||||
| dnl if not found, $ac_func is the name we check for | ||||
| func="$ac_func" | ||||
| eval skipcheck=\$skipcheck_$func | ||||
| if test "x$skipcheck" != "xyes"; then | ||||
|   AC_MSG_CHECKING([deeper for $func]) | ||||
|   AC_TRY_LINK( [], | ||||
|                [ $func ();], | ||||
| @@ -1551,21 +1578,38 @@ dnl if not found, $ac_func is the name we check for | ||||
|                AC_DEFINE_UNQUOTED($def, 1, [If you have $func]), | ||||
|                AC_MSG_RESULT(but still no) | ||||
|                ) | ||||
|  | ||||
| fi | ||||
| ) | ||||
|  | ||||
| dnl For some reason, the check above doesn't properly detect select() with | ||||
| dnl Msys/Mingw | ||||
| if test "$ac_cv_func_select" != "yes"; then | ||||
| if test "$ac_cv_func_select" = "no"; then | ||||
|   AC_MSG_CHECKING([for select in ws2_32]) | ||||
|   AC_TRY_LINK([#include <winsock2.h>], | ||||
|                [select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);], | ||||
|                [ dnl worked! | ||||
|   AC_TRY_LINK([ | ||||
| #undef inline | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| #ifndef WIN32_LEAN_AND_MEAN | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #endif | ||||
| #include <windows.h> | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #include <winsock2.h> | ||||
| #else | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #endif | ||||
| #endif | ||||
|     ],[ | ||||
|       select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL); | ||||
|     ],[  | ||||
|       AC_MSG_RESULT([yes]) | ||||
|       HAVE_SELECT="1" | ||||
|                AC_DEFINE_UNQUOTED(HAVE_SELECT,1)], | ||||
|                [AC_MSG_ERROR(You can't compile without a select)] | ||||
|              ) | ||||
|       AC_DEFINE_UNQUOTED(HAVE_SELECT, 1, | ||||
|         [Define to 1 if you have the select function.]) | ||||
|     ],[ | ||||
|       AC_MSG_ERROR([You can't compile without a select]) | ||||
|   ]) | ||||
| fi | ||||
|  | ||||
| dnl sigsetjmp() might be a macro and no function so if it isn't found already | ||||
| @@ -1589,8 +1633,25 @@ AC_CHECK_DECL(basename, , | ||||
| #ifdef HAVE_LIBGEN_H | ||||
| #include <libgen.h> | ||||
| #endif | ||||
| #ifdef HAVE_UNISTD_H | ||||
| #include <unistd.h> | ||||
| #endif | ||||
| ) | ||||
|  | ||||
| AC_CHECK_DECL(inet_pton, , | ||||
|               AC_DEFINE(HAVE_NO_INET_PTON_PROTO, 1, | ||||
|                         [Defined if no inet_pton() prototype available]), | ||||
| [ | ||||
| #ifdef HAVE_ARPA_INET_H | ||||
| #include <arpa/inet.h> | ||||
| #endif | ||||
| ] | ||||
| ) | ||||
|  | ||||
| dnl Check if the getnameinfo function is available | ||||
| dnl and get the types of five of its arguments. | ||||
| CURL_CHECK_FUNC_GETNAMEINFO | ||||
|  | ||||
| AC_MSG_CHECKING([if we are Mac OS X (to disable poll)]) | ||||
| disable_poll=no | ||||
| case $host in | ||||
| @@ -1784,7 +1845,6 @@ AC_HELP_STRING([--disable-sspi],[Disable SSPI]), | ||||
|        AC_MSG_RESULT(yes) | ||||
|        AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support]) | ||||
|        AC_SUBST(USE_WINDOWS_SSPI) | ||||
|        LIBS="$LIBS -lsecur32" | ||||
|        curl_sspi_msg="yes" | ||||
|        ;; | ||||
|   *) | ||||
| @@ -1894,6 +1954,8 @@ AC_CONFIG_FILES([Makefile \ | ||||
|            packages/EPM/curl.list \ | ||||
|            packages/EPM/Makefile \ | ||||
|            packages/vms/Makefile \ | ||||
|            packages/AIX/Makefile \ | ||||
|            packages/AIX/RPM/Makefile \ | ||||
|            curl-config \ | ||||
|            libcurl.pc | ||||
| ]) | ||||
|   | ||||
| @@ -101,9 +101,6 @@ while test $# -gt 0; do | ||||
|             echo "FTPS" | ||||
|           fi | ||||
|         fi | ||||
| 	if test "@CURL_DISABLE_GOPHER@" != "1"; then | ||||
|           echo "GOPHER" | ||||
|         fi | ||||
| 	if test "@CURL_DISABLE_FILE@" != "1"; then | ||||
|           echo "FILE" | ||||
|         fi | ||||
|   | ||||
| @@ -4,11 +4,11 @@ | ||||
|                             | (__| |_| |  _ <| |___ | ||||
|                              \___|\___/|_| \_\_____| | ||||
|  | ||||
| To Think About When Contributing Source Code | ||||
|                         When Contributing Source Code | ||||
|  | ||||
|  This document is intended to offer some simple guidelines that can be useful | ||||
|  to keep in mind when you decide to contribute to the project. This concerns | ||||
|  new features as well as corrections to existing flaws or bugs. | ||||
|  This document is intended to offer guidelines that can be useful to keep in | ||||
|  mind when you decide to contribute to the project. This concerns new features | ||||
|  as well as corrections to existing flaws or bugs. | ||||
|  | ||||
| Join the Community | ||||
|  | ||||
| @@ -20,13 +20,26 @@ Join the Community | ||||
| The License Issue | ||||
|  | ||||
|  When contributing with code, you agree to put your changes and new code under | ||||
|  the same license curl and libcurl is already using unless stated otherwise. | ||||
|  the same license curl and libcurl is already using unless stated and agreed | ||||
|  otherwise. | ||||
|  | ||||
|  If you add a larger piece of code, you can opt to make that file or set of | ||||
|  files to use a different license as long as they don't enforce any changes to | ||||
|  the rest of the package and they make sense. Such "separate parts" can not be | ||||
|  GPL (as we don't want the GPL virus to attack users of libcurl) but they must | ||||
|  use "GPL compatible" licenses. | ||||
|  GPL licensed (as we don't want copyleft to affect users of libcurl) but they | ||||
|  must use "GPL compatible" licenses (as we want to allow users to use libcurl | ||||
|  properly in GPL licensed environments). | ||||
|  | ||||
|  When changing existing source code, you do not alter the copyright of the | ||||
|  original file(s). The copyright will still be owned by the original | ||||
|  creator(s) or those who have been assigned copyright by the original | ||||
|  author(s). | ||||
|  | ||||
|  By submitting a patch to the curl project, you are assumed to have the right | ||||
|  to the code and to be allowed by your employer or whatever to hand over that | ||||
|  patch/code to us. We will credit you for your changes as far as possible, to | ||||
|  give credit but also to keep a trace back to who made what changes. Please | ||||
|  always provide us with your full real name when contributing! | ||||
|  | ||||
| What To Read | ||||
|  | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
|   Date: September 30, 2005 | ||||
|   Date: October 27, 2005 | ||||
|   Author: Daniel Stenberg <daniel@haxx.se> | ||||
|   URL: http://curl.haxx.se/legal/distro-dilemma.html | ||||
|  | ||||
| Condition | ||||
|  | ||||
|  This document is written to describe the situation as it is right | ||||
|  now. libcurl 7.14.1 is currently the latest version available. Things may (or | ||||
|  now. libcurl 7.15.0 is currently the latest version available. Things may (or | ||||
|  perhaps will) of course change in the future. | ||||
|  | ||||
|  This document reflects my view and understanding of these things. Please tell | ||||
| @@ -33,7 +33,10 @@ Background | ||||
|  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. | ||||
|  Linux distro. (This article mentions and refers to Debian several times, but | ||||
|  only because Debian seems to be the only Linux distro to have faced this | ||||
|  issue yet since no other distro is shipping libcurl built with two SSL | ||||
|  libraries.) | ||||
|  | ||||
| Part of the Operating System | ||||
|  | ||||
| @@ -83,6 +86,18 @@ GnuTLS vs OpenSSL | ||||
|  the application authors didn't want to or was unable to add an exception to | ||||
|  their GPL license. Alas, the license problem hit the fan again. | ||||
|  | ||||
|  GnuTLS | ||||
|    - LGPL licensened | ||||
|    - supports SRP | ||||
|    - lacks SSLv2 support | ||||
|    - lacks MD2 support (used by at least some CA certs) | ||||
|  | ||||
|  OpenSSL | ||||
|    - Original BSD licensened | ||||
|    - lacks SRP | ||||
|    - supports SSLv2 | ||||
|    - older and more widely used | ||||
|  | ||||
| The Better License, Original BSD or LGPL? | ||||
|  | ||||
|  It isn't obvious or without debate to any objective interested party that | ||||
| @@ -144,6 +159,12 @@ Fixing the Only Problem | ||||
|  The only problem is thus for distributions that want to offer libcurl | ||||
|  versions built with more than one SSL/TLS library. | ||||
|  | ||||
|  Debian is now (since mid September 2005) providing two different devel | ||||
|  packages, one for libcurl built with OpenSSL and one built with GnuTLS. They | ||||
|  use different .so names and can this both be installed in a single system | ||||
|  simultaneously. This has previously been said as a transitional system not | ||||
|  desired to keep in the long run. | ||||
|  | ||||
|  Since multiple libcurl binaries using different names are ruled out, we need | ||||
|  to come up with a way to have one single libcurl that someone uses different | ||||
|  underlying libraries. The best(?) approach currently suggested involves this: | ||||
|   | ||||
							
								
								
									
										128
									
								
								docs/FAQ
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								docs/FAQ
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| Updated: August 26, 2005 (http://curl.haxx.se/docs/faq.html) | ||||
| Updated: November 2, 2005 (http://curl.haxx.se/docs/faq.html) | ||||
|                                   _   _ ____  _ | ||||
|                               ___| | | |  _ \| | | ||||
|                              / __| | | | |_) | | | ||||
| @@ -16,6 +16,8 @@ FAQ | ||||
|   1.6 What do you get for making curl? | ||||
|   1.7 What about CURL from curl.com? | ||||
|   1.8 I have a problem who do I mail? | ||||
|   1.9 Where do I buy commercial support for curl? | ||||
|   1.10 How many are using curl? | ||||
|  | ||||
|  2. Install Related Problems | ||||
|   2.1 configure doesn't find OpenSSL even when it is installed | ||||
| @@ -88,6 +90,7 @@ FAQ | ||||
|   6.4 I have a program that uses LGPL libraries, can I use libcurl? | ||||
|   6.5 Can I modify curl/libcurl for my program and keep the changes secret? | ||||
|   6.6 Can you please change the curl/libcurl license to XXXX? | ||||
|   6.7 What are my obligations when using libcurl in my commerical apps? | ||||
|  | ||||
|  7. PHP/CURL Issues | ||||
|   7.1 What is PHP/CURL? | ||||
| @@ -111,7 +114,7 @@ FAQ | ||||
|   libcurl | ||||
|  | ||||
|     A free and easy-to-use client-side URL transfer library, supporting FTP, | ||||
|     FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and LDAP.  libcurl supports | ||||
|     FTPS, HTTP, HTTPS, TELNET, DICT, FILE and LDAP.  libcurl supports | ||||
|     HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP | ||||
|     form based upload, proxies, cookies, user+password authentication, file | ||||
|     transfer resume, http proxy tunneling and more! | ||||
| @@ -129,8 +132,7 @@ FAQ | ||||
|     A command line tool for getting or sending files using URL syntax. | ||||
|  | ||||
|     Since curl uses libcurl, it supports a range of common Internet protocols, | ||||
|     currently including HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and | ||||
|     FILE. | ||||
|     currently including HTTP, HTTPS, FTP, FTPS, LDAP, DICT, TELNET and FILE. | ||||
|  | ||||
|   We pronounce curl and cURL with an initial k sound: [kurl]. | ||||
|  | ||||
| @@ -148,6 +150,10 @@ FAQ | ||||
|   You can use libcurl for free in your application, be it open source, | ||||
|   commercial or closed-source. | ||||
|  | ||||
|   libcurl is most probably the most portable, most powerful and most often | ||||
|   used C-based multi-platform file transfer library on this planet - be it | ||||
|   open source or commercial. | ||||
|  | ||||
|   1.3 What is curl not? | ||||
|  | ||||
|   Curl is *not* a wget clone. That is a common misconception.  Never, during | ||||
| @@ -205,7 +211,7 @@ FAQ | ||||
|   improvements and have them inserted in the main sources (of course on the | ||||
|   condition that developers agree on that the fixes are good). | ||||
|  | ||||
|   The full list of the more than 400 contributors is found in the docs/THANKS | ||||
|   The full list of the more than 450 contributors is found in the docs/THANKS | ||||
|   file. | ||||
|  | ||||
|   curl is developed by a community, with Daniel at the wheel. | ||||
| @@ -259,6 +265,52 @@ FAQ | ||||
|   flaw is announced to the world, thus lessen the impact the problem will have | ||||
|   on existing users. | ||||
|  | ||||
|   1.9 Where do I buy commercial support for curl? | ||||
|  | ||||
|   curl is fully open source. It means you can hire any skilled engineer to fix | ||||
|   your curl-related problems. | ||||
|  | ||||
|   We list available alternatives on the curl web site: | ||||
|   http://curl.haxx.se/support.html | ||||
|  | ||||
|   1.10 How many are using curl? | ||||
|  | ||||
|   It is impossible to tell. | ||||
|  | ||||
|   We don't know how many users that knowingly have installed and use curl. | ||||
|  | ||||
|   We don't know how many users that use curl without knowing that they are in | ||||
|   fact using it. | ||||
|  | ||||
|   We don't know how many users that downloaded or installed curl and then | ||||
|   never use it. | ||||
|  | ||||
|   Some facts to use as input to the math: | ||||
|  | ||||
|   curl packages have been downloaded from the curl.haxx.se site well over a | ||||
|   million times. curl is installed by default with most Linux | ||||
|   distributions. curl is installed by default with Mac OS X. curl and libcurl | ||||
|   as used by numerous applications that include libcurl binaries in their | ||||
|   distribution packages (like Adobe Acrobat Reader and Google Earth). | ||||
|  | ||||
|   More than 40 known named companies use curl in commercial environments and | ||||
|   products. More than 100 known named open source projects depend on | ||||
|   (lib)curl. | ||||
|  | ||||
|   In a poll on the curl web site mid-2005, more than 50% of the 300+ answers | ||||
|   estimated a user base of one million users or more. | ||||
|  | ||||
|   In March 2005, the "Linux Counter project" estimated a total Linux user base | ||||
|   of some 29 millions, while Netcraft detected some 4 million "active" Linux | ||||
|   based web servers. A guess is that a fair amount of these Linux | ||||
|   installations have curl installed. | ||||
|  | ||||
|   http://curl.haxx.se/docs/companies.html | ||||
|   http://curl.haxx.se/docs/programs.html | ||||
|   http://curl.haxx.se/libcurl/using/apps.html | ||||
|   http://counter.li.org/estimates.php | ||||
|   http://news.netcraft.com/archives/2005/03/14/fedora_makes_rapid_progress.html | ||||
|  | ||||
|  | ||||
| 2. Install Related Problems | ||||
|  | ||||
| @@ -514,22 +566,24 @@ FAQ | ||||
|   - Server certificate. The server you communicate with has a server | ||||
|     certificate. You can and should verify this certificate to make sure that | ||||
|     you are truly talking to the real server and not a server impersonating | ||||
|     it. The server certificate verification process is made by using a | ||||
|     Certificate Authority certificate ("CA cert") that was used to sign the | ||||
|     server certificate. Server certificate verification is enabled by default | ||||
|     in curl and libcurl and is often the reason for problems as explained in | ||||
|     FAQ entry 4.12 and the SSLCERTS document | ||||
|     (http://curl.haxx.se/docs/sslcerts.html). Server certificates that are | ||||
|     "self-signed" or otherwise signed by a CA that you do not have a CA cert | ||||
|     for, cannot be verified. If the verification during a connect fails, you | ||||
|     are refused access. You then need to explicitly disable the verification | ||||
|     to connect to the server. | ||||
|     it. | ||||
|  | ||||
|   - Certificate Authority certificate ("CA cert"). You often have several CA | ||||
|     certs in a CA cert bundle that can be used to verify a server certificate | ||||
|     that was signed by one of the authorities in the bundle. curl comes with a | ||||
|     default CA cert bundle. You can override the default. | ||||
|  | ||||
|     The server certificate verification process is made by using a Certificate | ||||
|     Authority certificate ("CA cert") that was used to sign the server | ||||
|     certificate. Server certificate verification is enabled by default in curl | ||||
|     and libcurl and is often the reason for problems as explained in FAQ entry | ||||
|     4.12 and the SSLCERTS document | ||||
|     (http://curl.haxx.se/docs/sslcerts.html). Server certificates that are | ||||
|     "self-signed" or otherwise signed by a CA that you do not have a CA cert | ||||
|     for, cannot be verified. If the verification during a connect fails, you | ||||
|     are refused access. You then need to explicitly disable the verification | ||||
|     to connect to the server. | ||||
|  | ||||
|   3.17 How do I list the root dir of an FTP server? | ||||
|  | ||||
|   There are two ways. The way defined in the RFC is to use an encoded slash | ||||
| @@ -546,6 +600,8 @@ FAQ | ||||
|   | ||||
|   No. | ||||
|  | ||||
|   But you could easily write your own program using libcurl to do such stunts. | ||||
|  | ||||
|  | ||||
| 4. Running Problems | ||||
|  | ||||
| @@ -751,10 +807,10 @@ FAQ | ||||
|   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 | ||||
|   - 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 | ||||
|   - 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 | ||||
| @@ -793,8 +849,8 @@ FAQ | ||||
|  | ||||
|   One solution to this problem could be to have a pointer to a struct that you | ||||
|   pass to the callback function. You set the pointer using the | ||||
|   curl_easy_setopt(CURLOPT_FILE) function. Then that pointer will be passed to | ||||
|   the callback instead of a FILE * to a file: | ||||
|   CURLOPT_WRITEDATA option. Then that pointer will be passed to the callback | ||||
|   instead of a FILE * to a file: | ||||
|  | ||||
|         /* imaginary struct */ | ||||
|         struct MemoryStruct { | ||||
| @@ -901,7 +957,10 @@ FAQ | ||||
|  | ||||
|   5.9 How does libcurl resolve host names? | ||||
|  | ||||
|   libcurl includes a number of different name resolve functions: | ||||
|   libcurl supports a large a number of different name resolve functions. One | ||||
|   of them is picked at build-time and will be used unconditionally. Thus, if | ||||
|   you want to change name resolver function you must rebuild libcurl and tell | ||||
|   it to use a different function. | ||||
|  | ||||
|   - The non-ipv6 resolver that can use one out of four host name resolve calls | ||||
|     (depending on what your system supports): | ||||
| @@ -914,6 +973,8 @@ FAQ | ||||
|   - The ipv6-resolver that uses getaddrinfo() | ||||
|  | ||||
|   - The c-ares based name resolver that uses the c-ares library for resolves. | ||||
|     Using this offers asynchronous name resolves but it currently has no IPv6 | ||||
|     support. | ||||
|  | ||||
|   - The Windows threaded resolver. It use: | ||||
|  | ||||
| @@ -926,8 +987,8 @@ FAQ | ||||
|   5.10 How do I prevent libcurl from writing the response to stdout? | ||||
|  | ||||
|   libcurl provides a default built-in write function that writes received data | ||||
|   to stdout. Set a WRITEFUNCTION to receive the data, or possibly set | ||||
|   WRITEDATA to a different FILE * handle. | ||||
|   to stdout. Set the CURLOPT_WRITEFUNCTION to receive the data, or possibly | ||||
|   set CURLOPT_WRITEDATA to a different FILE * handle. | ||||
|  | ||||
|   5.11 How do I make libcurl not receive the whole HTTP response? | ||||
|  | ||||
| @@ -956,6 +1017,9 @@ FAQ | ||||
|   is just a brief summary for the cases we get the most questions. (Parts of | ||||
|   this section was much enhanced by Bjorn Reese.) | ||||
|  | ||||
|   We are not lawyers and this is not legal advice. You should probably consult | ||||
|   one if you want true and accurate legal insights without our prejudice. | ||||
|  | ||||
|   6.1 I have a GPL program, can I use the libcurl library? | ||||
|  | ||||
|   Yes! | ||||
| @@ -1000,6 +1064,26 @@ FAQ | ||||
|   libraries that use it. It should be possible for everyone to use libcurl or | ||||
|   curl in their projects, no matter what license they already have in use. | ||||
|  | ||||
|   6.7 What are my obligations when using libcurl in my commerical apps? | ||||
|  | ||||
|   Next to none. All you need to adhere to is the MIT-style license (stated in | ||||
|   the COPYING file) which basically says you have to include the copyright | ||||
|   notice in "all copies" and that you may not use the copyright holder's name | ||||
|   when promoting your software. | ||||
|  | ||||
|   You do not have to release any of your source code. | ||||
|  | ||||
|   You do not have to reveal or make public any changes to the libcurl source | ||||
|   code. | ||||
|  | ||||
|   You do not have to reveal or make public that you are using libcurl within | ||||
|   your app. | ||||
|  | ||||
|   As can be seen here: http://curl.haxx.se/docs/companies.html and | ||||
|   elsewhere, more and more companies are dicovering the power | ||||
|   of libcurl and take advantage of it even in commercial environments. | ||||
|  | ||||
|  | ||||
| 7. PHP/CURL Issues | ||||
|  | ||||
|   7.1 What is PHP/CURL? | ||||
|   | ||||
| @@ -95,6 +95,9 @@ FTPS (*1) | ||||
|  - implicit "AUTH TSL" and "AUTH SSL" usage to "upgrade" plain ftp:// | ||||
|    connection to use SSL for both or one of the connections | ||||
|  | ||||
| TFTP | ||||
|  - download / upload | ||||
|  | ||||
| TELNET | ||||
|  - connection negotiation | ||||
|  - custom telnet options | ||||
| @@ -106,10 +109,6 @@ LDAP (*2) | ||||
| DICT | ||||
|  - extended DICT URL support | ||||
|  | ||||
| GOPHER | ||||
|  - GET | ||||
|  - via http-proxy | ||||
|  | ||||
| FILE | ||||
|  - URL support | ||||
|  - "uploads" | ||||
|   | ||||
							
								
								
									
										110
									
								
								docs/INSTALL
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								docs/INSTALL
									
									
									
									
									
								
							| @@ -132,64 +132,33 @@ UNIX | ||||
| Win32 | ||||
| ===== | ||||
|  | ||||
|    Without SSL: | ||||
|    MingW32 | ||||
|    ------- | ||||
|  | ||||
|       MingW32 (GCC-2.95) style | ||||
|       ------------------------ | ||||
|         Run the 'mingw32.bat' file to get the proper environment variables | ||||
|         set, then run 'make mingw32' in the root dir. | ||||
|    Run the 'mingw32.bat' file to get the proper environment variables set, | ||||
|    then run 'make mingw32' in the root dir. Use  'make mingw32-ssl' to build | ||||
|    curl SSL enabled. | ||||
|  | ||||
|         If you have any problems linking libraries or finding header files, be | ||||
|         sure to verify that the provided "Makefile.m32" files use the proper | ||||
|         paths, and adjust as necessary. | ||||
|    If you have any problems linking libraries or finding header files, be sure | ||||
|    to verify that the provided "Makefile.m32" files use the proper paths, and | ||||
|    adjust as necessary. | ||||
|  | ||||
|       Cygwin style | ||||
|       ------------ | ||||
|         Almost identical to the unix installation. Run the configure script in | ||||
|         the curl root with 'sh configure'. Make sure you have the sh | ||||
|         executable in /bin/ or you'll see the configure fail towards the end. | ||||
|    Cygwin | ||||
|    ------ | ||||
|  | ||||
|    Almost identical to the unix installation. Run the configure script in the | ||||
|    curl root with 'sh configure'. Make sure you have the sh executable in | ||||
|    /bin/ or you'll see the configure fail towards the end. | ||||
|  | ||||
|    Run 'make' | ||||
|  | ||||
|       Microsoft command line style | ||||
|       ---------------------------- | ||||
|         Run the 'vcvars32.bat' file to get the proper environment variables | ||||
|         set, then run 'nmake vc' in the root dir. | ||||
|    Dev-Cpp | ||||
|    ------- | ||||
|  | ||||
|         The vcvars32.bat file is part of the Microsoft development | ||||
|         environment. | ||||
|    See the separate INSTALL.devcpp file for details. | ||||
|  | ||||
|       IDE-style | ||||
|       ------------------------- | ||||
|         If you use VC++, Borland or similar compilers. Include all lib source | ||||
|         files in a static lib "project" (all .c and .h files that is). | ||||
|         (you should name it libcurl or similar) | ||||
|  | ||||
|         Make the sources in the src/ drawer be a "win32 console application" | ||||
|         project. Name it curl. | ||||
|  | ||||
|         For VC++ 6, there's an included Makefile.vc6 that should be possible | ||||
|         to use out-of-the-box. | ||||
|  | ||||
|  | ||||
|    With SSL: | ||||
|  | ||||
|       MingW32 (GCC-2.95) style | ||||
|       ------------------------ | ||||
|         Run the 'mingw32.bat' file to get the proper environment variables | ||||
|         set, then run 'make mingw32-ssl' in the root dir. | ||||
|  | ||||
|         If you have any problems linking libraries or finding header files, be | ||||
|         sure to look at the provided "Makefile.m32" files for the proper | ||||
|         paths, and adjust as necessary. | ||||
|  | ||||
|       Cygwin style | ||||
|       ------------ | ||||
|         Haven't done, nor got any reports on how to do. It should although be | ||||
|         identical to the unix setup for the same purpose. See above. | ||||
|  | ||||
|       Microsoft command line style | ||||
|       ---------------------------- | ||||
|    MSVC from command line | ||||
|    ---------------------- | ||||
|  | ||||
|    Run the 'vcvars32.bat' file to get a proper environment. The | ||||
|    vcvars32.bat file is part of the Microsoft development environment and | ||||
| @@ -232,22 +201,14 @@ Win32 | ||||
|    at runtime. | ||||
|    Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support. | ||||
|  | ||||
|       Microsoft / Borland style | ||||
|       ------------------------- | ||||
|         If you have OpenSSL, and want curl to take advantage of it, edit your | ||||
|         project properties to use the SSL include path, link with the SSL libs | ||||
|         and define the USE_SSLEAY symbol. | ||||
|  | ||||
|       Using Borland C++ compiler version 5.5.1 (available as free download | ||||
|       from Borland's site) | ||||
|       --------------------------------------------------------------------- | ||||
|    Borland C++ compiler | ||||
|    --------------------- | ||||
|  | ||||
|    compile openssl | ||||
|  | ||||
|    Make sure you include the paths to curl/include and openssl/inc32 in | ||||
|    your bcc32.cnf file | ||||
|  | ||||
|  | ||||
|    eg : -I"c:\Bcc55\include;c:\path_curl\include;c:\path_openssl\inc32" | ||||
|  | ||||
|    Check to make sure that all of the sources listed in lib/Makefile.b32 | ||||
| @@ -268,7 +229,23 @@ Win32 | ||||
|                                  -L c:\openssl\out32\ssleay32.lib | ||||
|                                  simplessl.c | ||||
|  | ||||
|    Disabling Specific Protocols: | ||||
|  | ||||
|    MSVC IDE | ||||
|    -------- | ||||
|  | ||||
|    If you use VC++, Borland or similar compilers. Include all lib source | ||||
|    files in a static lib "project" (all .c and .h files that is). | ||||
|    (you should name it libcurl or similar) | ||||
|  | ||||
|    Make the sources in the src/ drawer be a "win32 console application" | ||||
|    project. Name it curl. | ||||
|  | ||||
|    For VC++ 6, there's an included Makefile.vc6 that should be possible | ||||
|    to use out-of-the-box. | ||||
|  | ||||
|  | ||||
|    Disabling Specific Protocols in Win32 builds | ||||
|    -------------------------------------------- | ||||
|  | ||||
|    The configure utility, unfortunately, is not available for the Windows | ||||
|    environment, therefore, you cannot use the various disable-protocol | ||||
| @@ -283,7 +260,6 @@ Win32 | ||||
|    CURL_DISABLE_TELNET   disables TELNET | ||||
|    CURL_DISABLE_DICT     disables DICT | ||||
|    CURL_DISABLE_FILE     disables FILE | ||||
|       CURL_DISABLE_GOPHER   disables GOPHER | ||||
|  | ||||
|    If you want to set any of these defines you have the following | ||||
|    possibilities: | ||||
| @@ -294,10 +270,12 @@ Win32 | ||||
|      in the curllib.dsw/curllib.dsp Visual C++ 6 IDE project. | ||||
|  | ||||
|  | ||||
|    Important (with SSL or not): | ||||
|       When building an application that uses the static libcurl library, you | ||||
|       must add '-DCURL_STATICLIB' to your CFLAGS.  Otherwise the linker will | ||||
|       look for dynamic import symbols. | ||||
|    Important static libcurl usage note | ||||
|    ----------------------------------- | ||||
|  | ||||
|    When building an application that uses the static libcurl library, you must | ||||
|    add '-DCURL_STATICLIB' to your CFLAGS.  Otherwise the linker will look for | ||||
|    dynamic import symbols. | ||||
|  | ||||
|  | ||||
| IBM OS/2 | ||||
|   | ||||
							
								
								
									
										302
									
								
								docs/INSTALL.devcpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										302
									
								
								docs/INSTALL.devcpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,302 @@ | ||||
| DevCpp-Mingw Install & Compilation                                   Sept 2005 | ||||
| ================================== | ||||
|  | ||||
| Reference Emails available at curl@haxx.se:  | ||||
|  | ||||
|   Libcurl Install and Use Issues | ||||
|   Awaiting an Answer for Win 32 Install  | ||||
|   res = curl_easy_perform(curl); Error | ||||
|   Makefile Issues | ||||
|    | ||||
|  | ||||
| Having previously done a thorough review of what was available that met my | ||||
| requirements under GPL, I settled for Libcurl as the software of choice for | ||||
| many reasons not the least of which was the support. | ||||
|  | ||||
| Background | ||||
| ---------- | ||||
|  | ||||
| This quest started when I innocently tried to incorporate the libcurl library | ||||
| into my simple source code. I figured that a few easy steps would accomplish | ||||
| this without major headaches. I had no idea that I would be facing an almost | ||||
| insurmountable challenge. | ||||
|  | ||||
| The main problem lies in two areas. First the bulk of support for libcurl | ||||
| exists for a Unix/linux command line environments. This is of little help when | ||||
| it comes to Windows O/S. | ||||
|  | ||||
| Secondly the help that does exist for the Windows O/S focused around mingw | ||||
| thru a command line argument environment. | ||||
|  | ||||
| You may ask "Why is this a problem?" | ||||
|  | ||||
| I'm using a Windows O/S with DevCpp. For those of you who are unfamiliar with | ||||
| DevCpp, it is a window shell GUI that replaces the command line environment | ||||
| for gcc. A definite improvement that I am unwilling to give up. However using | ||||
| DevCpp presented its own set of issues. Inadvertently I also made some | ||||
| careless errors such as compiling the 7.14 version of Makefile with an older | ||||
| version of source code. Thanks to Dan Fandrich for picking this up. | ||||
|  | ||||
| I did eventually with the help of Daniel, Phillipe and others manage to | ||||
| implement successfully (the only mingw available version) | ||||
| curl-7.13.0-win32-ssl-devel-mingw32 into the DevCpp environment. Only the | ||||
| dynamic libcurl.dll libcurldll.a libraries worked. The static library which I | ||||
| was interested in did not. Furthermore when I tried to implement one of the | ||||
| examples included with the curl package (get info.c) it caused the executable | ||||
| to crash. Tracing the bug I found it in the code and function res = | ||||
| curl_easy_perform(curl);. | ||||
|  | ||||
| At this point I had to make a choice as to whether invest my limited | ||||
| time-energy resource to fixing the bug or to compile the new version | ||||
| available. After searching the archives I found a very similar or the same bug | ||||
| reported from version 7.12x on. Daniel did inform me that he thought that this | ||||
| bug had been fixed with the latest version. So I proceeded to compile the | ||||
| latest SSL version where I faced other challenges. | ||||
|  | ||||
| In order to make this process unremarkable for others using the same | ||||
| environment I decided to document the process so that others will find it | ||||
| routine. It would be a shame if newbies could not implement this excellent | ||||
| package for their use. | ||||
|  | ||||
| I would like to thank the many others in this forum and in the DevCpp forum | ||||
| for their help. Without your help I may either have given up or it would have | ||||
| taken me many times longer to achieve success. | ||||
|  | ||||
| The Cookbook Approach | ||||
| --------------------- | ||||
|  | ||||
| This discussion will be confined to a SSL static library compilation and | ||||
| installation. Limited mention and comments will be inserted where appropriate | ||||
| to help with non-SSL, dynamic libraries and executables. | ||||
|  | ||||
|  | ||||
|    Using Makefile from DevCpp to compile Libcurl libraries | ||||
|  | ||||
| Preamble | ||||
| -------- | ||||
|  | ||||
| Using the latest version release - curl-7.14.0.tar.gz. Curl source code is | ||||
| platform independent. This simply means that the source code can be compiled | ||||
| for any Operating System (Linux/Unix Windows etc. and variations of thereof). | ||||
|  | ||||
| The first thing to note is that inside curl-7.14.0 you will find two folders | ||||
| lib and src. Both contain Makefile.m32 (required for win mingw library or exe | ||||
| compilation) files which are different. The main difference between these two | ||||
| folders and the makefiles is that the src folder contents are used to compile | ||||
| an executable file(curl.exe) while the lib folder contents are used to compile | ||||
| a static (libcurl.a) and dynamic (libcurl.dll & libcurldll.a) file that can be | ||||
| used to compile libcurl with your own source code so that one can use and | ||||
| access all libcurl functions. | ||||
|  | ||||
| Before we start please make sure that DevCpp is installed properly. In | ||||
| particular make sure you have no spaces in the name of any of the directories | ||||
| and subdirectories where DevCpp is installed. Failure to comply with the | ||||
| install instructions may produce erratic behaviour in DevCpp. For further info | ||||
| check the following sites | ||||
|  | ||||
| http://aditsu.freeunixhost.com/dev-cpp-faq.html | ||||
| http://sourceforge.net/forum/message.php?msg_id=3252213 | ||||
|  | ||||
| As I have mentioned before I will confine this to the SSL Library compilations | ||||
| but the process is very similar for compilation of the executable - curl.exe; | ||||
| just substitute the src folder makefile in its stead. | ||||
|  | ||||
| First use a text processor Notepad, or your own favourite text processor. To | ||||
| engage your favourite text processor, select Makefile.m32 click once with your | ||||
| mouse on file icon; icon turns blue, press the shift key and right-click on | ||||
| mouse, menu appears select "Open with", select your favourite text processor. | ||||
|  | ||||
| Next read the contents of Makefile.m32. It includes instructions on its use. | ||||
|  | ||||
| Method I - DOS Command Line | ||||
| --------------------------- | ||||
|   | ||||
| Note - The only reason I have included this method is that Method II which is | ||||
| the preferred method for compiling does not allow for the setting of option | ||||
| switches (e.g. SSL = 1 or SSL =0). At least that's what they tell me at the | ||||
| Dev-Cpp forum. | ||||
|  | ||||
| 1 - Make a copy of (D:\Dev-Cpp\bin) bin folder and name it "bin Original" | ||||
| place it in the Dev-Cpp installed directory (D:\Dev-Cpp\ for this example) | ||||
|  | ||||
| 2 - Copy the entire contents of the LIB folder of curl-7.14.0.tar.gz or zip | ||||
| version into the bin folder above (D:\Dev-Cpp\bin). The reason being is that | ||||
| the make.exe file resides in this folder. Make.exe will use - Makefile.m32, | ||||
| Makefile.inc, and the source code included in the lib folder to compile the | ||||
| source code. There is a PATH issue with make.exe that remains unresolved at | ||||
| least for me. Unless the entire source code to be compiled is placed entirely | ||||
| within the directory of make.exe an error message will be generated - "file | ||||
| xxxx.yyy not available". | ||||
|  | ||||
| 3- Go to Dev-Cpp\bin and double click on make .exe. You will see a DOS window | ||||
| quickly pop up and close very quickly. Not to worry! Please do not skip this | ||||
| step. | ||||
|  | ||||
| 4- Click on the start button\Programs\MS-DOS Prompt.Once the DOS Window is up | ||||
| Type the disk drive letter (e.g. E: ) engage the enter button. The path should | ||||
| automatically take you to the directory of the make.exe file. | ||||
|  | ||||
| 5- To compile the source code simply type at the DOS prompt make -f | ||||
| Makefile.m32 as per instructions contained in the Makefile.m32 file (use any | ||||
| text processor to read instructions). I don't believe that this makefile | ||||
| allows for the option of non SSL. Ignore any warnings. | ||||
|  | ||||
| 6- Collect and make copies of libcurl.a, libcurl.dll, libcurldll.a and any *.o | ||||
| compilations you might need in another directory outside of the bin directory | ||||
| as you will need this files shortly to set up libcurl for use with | ||||
| Dev-cpp. For most apps *.o is not required. Later on we will show what to do | ||||
| with these files. | ||||
|  | ||||
| 7- You are finished but before closing we need to do cleanup - erase the bin | ||||
| folder and rename the "bin Original" folder created in step 1 to bin. | ||||
|  | ||||
| Note to compile a curl executable the process is probably similar but instead | ||||
| of using the LIB folder contents use the SRC folder contents and Makefiles in | ||||
| curl-7.14.0.tar.gz. File directories relative placements must be respected for | ||||
| compiling to take place successfully. This may not be possible with the PATH | ||||
| problem that make.exe experiences. If anyone has solved this PATH issue and | ||||
| please make sure it actually works on Win 9x/2000/XP before letting me | ||||
| know. Then please let me or Daniel in on the solution so that it can be | ||||
| included with these instructions. Thanks. | ||||
|  | ||||
| or | ||||
|  | ||||
| Method II - Dev-Cpp GUI | ||||
| ----------------------- | ||||
|  | ||||
| 1- Copy the entire contents of the LIB folder of curl-7.14.0.tar.gz or zip | ||||
| version into any folder outside of (Dev-Cpp\bin). | ||||
|  | ||||
| 2- Drop the File/New/click on Project. | ||||
|  | ||||
| 3- New Project Dialogue box appears. Double click on the Static Library. | ||||
|  | ||||
| 4- Create Project Dialogue box appears. Select the LIB folder location to | ||||
| place and locate your Project File Name. Placing the Project File Name | ||||
| elsewhere may cause problems (PATH issue problem again). | ||||
|  | ||||
| 5- Drop down the Project/Project Options. Project Options Dialogue box | ||||
| appears. | ||||
|  | ||||
| 6- Select the Makefile tab in the Project Options Dialogue Box. Check Box - | ||||
| Use Custom Makefile. Click on the Folder icon at the extreme right of the | ||||
| Check Box. Select Makefile.m32 in the folder wherever you have placed the | ||||
| contents of the LIB Folder. Press OK and close the Dialogue Box. | ||||
|  | ||||
| 7- Drop the Menu Project/Click on Add to Project. Open File Dialogue Box | ||||
| appears.  The Dialogue Box should open in the folder wherever you have placed | ||||
| the contents of the LIB Folder. If not go there. | ||||
|  | ||||
| 8- Select Crtl-A to select all files in the LIB folder. Click on open to add | ||||
| files and close box. Wait till all files are added. This may take 30 seconds | ||||
| or longer. | ||||
|  | ||||
| 9- Drop the Menu Execute/Click on Compile.  | ||||
|  | ||||
| 10- That's it. | ||||
|  | ||||
|  | ||||
|    The following steps must be completed if Curl is to work properly | ||||
|    ================================================================= | ||||
|  | ||||
| LIB folder inclusions (*.a placement) | ||||
| ------------------------------------- | ||||
|  | ||||
| 1- Refer to Method I - DOS Command Line point # 6 Take libcurl.a, libcurldll.a | ||||
| and install it in the directory C( or whichever drive Dev is installed) | ||||
| :\Dev-Cpp\lib. | ||||
|  | ||||
|  | ||||
| Include Folder | ||||
| -------------- | ||||
|  | ||||
| 1- Create a new folder by the name of curl (do not change the name curl to | ||||
| some other name as it will cause major issues) in the directory | ||||
| C:\Dev-Cpp\include. | ||||
|  | ||||
| 2- Copy the entire contents of the curl folder of curl-7.14.0.tar.gz or zip | ||||
|  version into the newly created curl directory - C:\Dev-Cpp\include\curl. | ||||
|  | ||||
| Links To Include And Lib Folder | ||||
| ------------------------------- | ||||
|  | ||||
| 1- Drop the Menu - Tools\Compiler Options\Directories\Libraries. Make sure | ||||
| that C( or whichever drive Dev is installed):\DEV-CPP\lib is included. | ||||
|  | ||||
| 2- Next select the Menu - Tools\Compiler Options\Directories\C Includes. Make | ||||
| sure that C:\DEV-CPP\include and C:\Dev-Cpp\include\curl are included. | ||||
|  | ||||
| 3- Next select the Menu - Tools\Compiler Options\Directories\C++ | ||||
| Includes. Make sure that C:\DEV-CPP\include and C:\Dev-Cpp\include\curl are | ||||
| included. | ||||
|  | ||||
| Linker Links | ||||
| ------------ | ||||
|  | ||||
| 1- Drop the Menu - Tools\Compiler Options\Directories\Compiler. | ||||
|  | ||||
| 2- Make sure that the box "Add these commands to the linker command line" is | ||||
| checked. | ||||
|  | ||||
| 3- Include in the white space immediately below the box referred in 2 -lcurl | ||||
| -lws2_32 -lwinmm. | ||||
|  | ||||
| SSL Files | ||||
| --------- | ||||
|  | ||||
| 1- Get the latest openSSL (as of time of this writing) | ||||
| openssl-0.9.7e-win32-bin.zip for the minimalist package of the openssl-0.9.7e | ||||
| binaries ported to MS Windows 95/98/NT/XP using the MingW32/GCC-3.1 | ||||
| development environment. The file may be downloaded at | ||||
| http://curl.haxx.se/download/. | ||||
|  | ||||
| 2- Open the above zip file. You will find two files - SDL.dll, | ||||
| SDL_mixer.dll. Install them in the directory C:\WINDOWS\SYSTEM32 for Win 9x | ||||
| users and c:\winnt\system32 for NT-family users. | ||||
|  | ||||
| Multithreading Files | ||||
| -------------------- | ||||
|  | ||||
| To be completed | ||||
|  | ||||
| #define | ||||
| ------- | ||||
|  | ||||
| 1- Make sure that your program includes the following - #define CURL_STATICLIB | ||||
| must be declared FIRST before any other define functions may be | ||||
| added. Otherwise you may experience link errors. | ||||
|  | ||||
| 2- Don't forget to include   #include "curl/curl.h". | ||||
|  | ||||
| e.g. | ||||
|     #define CURL_STATICLIB  | ||||
| #include <windows.h> | ||||
|     #include "curl/curl.h" | ||||
| #include <fstream> | ||||
| #include <iostream> | ||||
| #include <vector> | ||||
| etc... | ||||
|  | ||||
|  | ||||
| Static or Dynamic Library | ||||
| ------------------------- | ||||
|  | ||||
| The above steps apply for the use by a static library. Should you choose to | ||||
| use a dynamic library you will be required to perform these additional steps. | ||||
|  | ||||
| 1- Refer to Method I - DOS Command Line point # 6. Install libcurl.dll in the | ||||
| directory C:\WINDOWS\SYSTEM32 for Win 9x users and c:\winnt\system32 for | ||||
| NT-family users. | ||||
|  | ||||
| 2- Refer to Linker Links point 3 - Replace -lcurl with -lcurldll. | ||||
|  | ||||
| Voila you're done. | ||||
|  | ||||
| The non-SSL static Library build may not be possible to use at least as of the | ||||
| time of this writing - v7.14. Check reference emails - Phillipe and I found it | ||||
| impossible to fully compile as certain files were missing for linking. No big | ||||
| loss as SSL is a major plus. | ||||
|  | ||||
| Hope this Helps | ||||
|  | ||||
| Tom | ||||
| @@ -3,6 +3,31 @@ 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! | ||||
|  | ||||
| 32. (At least on Windows) If libcurl is built with c-ares and there's no DNS | ||||
|   server configured in the system, the ares_init() call fails and thus | ||||
|   curl_easy_init() fails as well. This causes weird effects for people who use | ||||
|   numerical IP addresses only. | ||||
|  | ||||
| 31. "curl-config --libs" will include details set in LDFLAGS when configure is | ||||
|   run that might be needed only for building libcurl. Similarly, it might | ||||
|   include options that perhaps aren't suitable both for static and dynamic | ||||
|   linking. Further, curl-config --cflags suffers from the same effects with | ||||
|   CFLAGS/CPPFLAGS. | ||||
|  | ||||
| 30. You need to use -g to the command line tool in order to use RFC2732-style | ||||
|   IPv6 numerical addresses in URLs. | ||||
|  | ||||
| 29. IPv6 URLs with zone ID is not supported. | ||||
|   http://www.ietf.org/internet-drafts/draft-fenner-literal-zone-02.txt | ||||
|   specifies the use of a plus sign instead of a percent when specifying zone | ||||
|   IDs in URLs to get around the problem of percent signs being | ||||
|   special. According to the reporter, Firefox deals with the URL _with_ a | ||||
|   percent letter (which seems like a blatant URL spec violation). | ||||
|  | ||||
|    See http://curl.haxx.se/bug/view.cgi?id=1371118 | ||||
|  | ||||
| 28. The TFTP code is not portable and will fail on some architectures. | ||||
|  | ||||
| 26. NTLM authentication using SSPI (on Windows) when (lib)curl is running in | ||||
|   "system context" will make it use wrong(?) user name - at least when compared | ||||
|   to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=1281867 | ||||
| @@ -13,15 +38,11 @@ may have been fixed since this was written! | ||||
|   --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. | ||||
|   bugs and lack of features when a SOCKS proxy is used. And there seem to be a | ||||
|   problem with SOCKS when doing FTP: See | ||||
|   http://curl.haxx.se/bug/view.cgi?id=1371540 | ||||
|  | ||||
| 22. Sending files to a FTP server using curl on VMS, might lead to curl | ||||
|   complaining on "unaligned file size" on completion. The problem is related | ||||
| @@ -41,9 +62,6 @@ may have been fixed since this was written! | ||||
| 19. FTP 3rd party transfers with the multi interface doesn't work. Test: | ||||
|   define CURL_MULTIEASY, rebuild curl, run test case 230 - 232. | ||||
|  | ||||
| 18. test case 57 has </test> that should be </client> but when corrected, the | ||||
|   test case fails! | ||||
|  | ||||
| 16. FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>, | ||||
|   <password>, and <fpath> components, encoded as "%00".  The problem is that | ||||
|   curl_unescape does not detect this, but instead returns a shortened C | ||||
| @@ -101,8 +119,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 | ||||
|  | ||||
| 3. GOPHER transfers seem broken | ||||
|  | ||||
| 2. If a HTTP server responds to a HEAD request and includes a body (thus | ||||
|   violating the RFC2616), curl won't wait to read the response but just stop | ||||
|   reading and return back. If a second request (let's assume a GET) is then | ||||
|   | ||||
| @@ -56,9 +56,9 @@ krb4 | ||||
|  | ||||
|         While nothing in particular says that a Kerberos4 library must use any | ||||
|         particular license, the one I've tried and used successfully so far | ||||
|         (kth-krb4) is Original BSD-licensed with the announcement clause. Some | ||||
|         of the code in libcurl that is written to deal with Kerberos4 likewise | ||||
|         have such a license. | ||||
|         (kth-krb4) is partly Original BSD-licensed with the announcement | ||||
|         clause. Some of the code in libcurl that is written to deal with | ||||
|         Kerberos4 is Modified BSD-licensed. | ||||
|  | ||||
| MIT Kerberos http://web.mit.edu/kerberos/www/dist/ | ||||
|  | ||||
|   | ||||
							
								
								
									
										10
									
								
								docs/MANUAL
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								docs/MANUAL
									
									
									
									
									
								
							| @@ -23,10 +23,6 @@ SIMPLE USAGE | ||||
|  | ||||
|         curl ftp://cool.haxx.se/ | ||||
|  | ||||
|   Get a gopher document from funet's gopher server: | ||||
|  | ||||
|         curl gopher://gopher.funet.fi | ||||
|  | ||||
|   Get the definition of curl from a dictionary: | ||||
|  | ||||
|         curl dict://dict.org/m:curl | ||||
| @@ -94,10 +90,6 @@ USING PASSWORDS | ||||
|  | ||||
|    Probably most commonly used with private certificates, as explained below. | ||||
|  | ||||
|  GOPHER | ||||
|  | ||||
|    Curl features no password support for gopher. | ||||
|  | ||||
| PROXY | ||||
|  | ||||
|  Get an ftp file using a proxy named my-proxy that uses port 888: | ||||
| @@ -748,7 +740,7 @@ ENVIRONMENT VARIABLES | ||||
|  | ||||
|   Curl reads and understands the following environment variables: | ||||
|  | ||||
|         http_proxy, HTTPS_PROXY, FTP_PROXY, GOPHER_PROXY | ||||
|         http_proxy, HTTPS_PROXY, FTP_PROXY | ||||
|  | ||||
|   They should be set for protocol-specific proxies. General proxy should be | ||||
|   set with | ||||
|   | ||||
| @@ -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 DISTRO-DILEMMA | ||||
|  $(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA INSTALL.devcpp | ||||
|  | ||||
| MAN2HTML= roffit < $< >$@ | ||||
|  | ||||
|   | ||||
							
								
								
									
										38
									
								
								docs/THANKS
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								docs/THANKS
									
									
									
									
									
								
							| @@ -14,13 +14,16 @@ Alex Suykov | ||||
| Alex aka WindEagle | ||||
| Alexander Kourakos | ||||
| Alexander Krasnostavsky | ||||
| Alexander Lazic | ||||
| Alexander Zhuravlev | ||||
| Alexis Carvalho | ||||
| Amol Pattekar | ||||
| Andi Jahja | ||||
| Andreas Damm | ||||
| Andreas Olsson | ||||
| Andreas Rieke | ||||
| Andres Garcia | ||||
| Andrew Benham | ||||
| Andrew Bushnell | ||||
| Andrew Francis | ||||
| Andrew Fuller | ||||
| @@ -34,18 +37,19 @@ Arkadiusz Miskiewicz | ||||
| Augustus Saunders | ||||
| Avery Fay | ||||
| Ben Greear | ||||
| Ben Madsen | ||||
| Benjamin Gerard | ||||
| Bertrand Demiddelaer | ||||
| Bjorn Reese | ||||
| Bj<EFBFBD>rn Stenberg | ||||
| Bob Schader | ||||
| Brad Burdick | ||||
| Bradford Bruce | ||||
| Brent Beardsley | ||||
| Brian Akins | ||||
| Brian R Duffy | ||||
| Bruce Mitchener | ||||
| Bryan Henderson | ||||
| Bryan Henderson  | ||||
| Bryan Kemp | ||||
| Caolan McNamara | ||||
| Casey O'Donnell | ||||
| @@ -77,6 +81,7 @@ Dan Torop | ||||
| Dan Zitter | ||||
| Daniel Stenberg | ||||
| Daniel at touchtunes | ||||
| Darryl House | ||||
| Dave Dribin | ||||
| Dave Halbakken | ||||
| Dave Hamilton | ||||
| @@ -89,18 +94,22 @@ David Hull | ||||
| David J Meyer | ||||
| David James | ||||
| David Kimdon | ||||
| David Lang | ||||
| David LeBlanc | ||||
| David Odin | ||||
| David Phillips | ||||
| David Shaw | ||||
| David Tarendash | ||||
| David Thiel | ||||
| David Yan | ||||
| Detlef Schmier | ||||
| Diego Casorran | ||||
| Dima Barsky | ||||
| Dimitris Sarris | ||||
| Dinar | ||||
| Dirk Eddelbuettel | ||||
| Dirk Manske | ||||
| Dmitry Bartsevich | ||||
| Dolbneff A.V | ||||
| Domenico Andreoli | ||||
| Dominick Meglio | ||||
| @@ -108,6 +117,8 @@ Doug Kaufman | ||||
| Doug Porter | ||||
| Douglas E. Wegscheid | ||||
| Douglas R. Horner | ||||
| Dov Murik | ||||
| Duane Cathey | ||||
| Dustin Boswell | ||||
| Dylan Ellicott | ||||
| Dylan Salisbury | ||||
| @@ -127,6 +138,7 @@ Eric Young | ||||
| Erick Nuwendam | ||||
| Erwan Legrand | ||||
| Erwin Authried | ||||
| Eugene Kotlyarov | ||||
| Evan Jordan | ||||
| Fabrizio Ammollo | ||||
| Fedor Karpelevitch | ||||
| @@ -187,8 +199,12 @@ James Gallagher | ||||
| James Griffiths | ||||
| James MacMillan | ||||
| Jamie Lokier | ||||
| Jamie Newton | ||||
| Jamie Wilkinson | ||||
| Jan Kunder | ||||
| Jason S. Priebe | ||||
| Jaz Fresh | ||||
| Jean Jacques Drouin | ||||
| Jean-Claude Chauve | ||||
| Jean-Louis Lemaire | ||||
| Jean-Marc Ranger | ||||
| @@ -207,6 +223,7 @@ Johan Anderson | ||||
| Johan Nilsson | ||||
| John Crow | ||||
| John Janssen | ||||
| John Kelly | ||||
| John Lask | ||||
| John McGowan | ||||
| Jon Grubbs | ||||
| @@ -229,11 +246,13 @@ J | ||||
| Kai Sommerfeld | ||||
| Kai-Uwe Rommel | ||||
| Kang-Jin Lee | ||||
| Karl Moerder | ||||
| Karol Pietrzak | ||||
| Keith MacDonald | ||||
| Keith McGuigan | ||||
| Ken Hirsch | ||||
| Ken Rastatter | ||||
| Kent Boortz | ||||
| Kevin Fisk | ||||
| Kevin Lussier | ||||
| Kevin Roth | ||||
| @@ -292,8 +311,11 @@ Mekonikum | ||||
| Mettgut Jamalla | ||||
| Michael Benedict | ||||
| Michael Curtis | ||||
| Michael Jahn | ||||
| Michael Mealling | ||||
| Michael Wallner | ||||
| Michal Bonino | ||||
| Michal Marek | ||||
| Mihai Ionescu | ||||
| Mike Bytnar | ||||
| Mike Dobbs | ||||
| @@ -312,10 +334,13 @@ Nick Humfrey | ||||
| Nico Baggus | ||||
| Nicolas Berloquin | ||||
| Nicolas Croiset | ||||
| Nicolas Fran<61>ois | ||||
| Niels van Tongeren | ||||
| Nikita Schmidt | ||||
| Nis Jorgensen | ||||
| Nodak Sodak | ||||
| Norbert Novotny | ||||
| Ofer | ||||
| Oren Tirosh | ||||
| P R Schaffner | ||||
| Patrick Bihan-Faou | ||||
| @@ -332,6 +357,7 @@ Pete Su | ||||
| Peter Bray | ||||
| Peter Forret | ||||
| Peter Pentchev | ||||
| Peter Su | ||||
| Peter Sylvester | ||||
| Peter Todd | ||||
| Peter Verhas | ||||
| @@ -341,8 +367,10 @@ Phil Karn | ||||
| Philip Gladstone | ||||
| Philippe Hameau | ||||
| Philippe Raoult | ||||
| Philippe Vaucher | ||||
| Pierre | ||||
| Puneet Pawaia | ||||
| Quagmire | ||||
| Rafael Sagula | ||||
| Ralph Beckmann | ||||
| Ralph Mitchell | ||||
| @@ -386,17 +414,20 @@ Samuel D | ||||
| Samuel Listopad | ||||
| Sander Gates | ||||
| Saul good | ||||
| Scott Davis | ||||
| Sebastien Willemijns | ||||
| Sergio Ballestrero | ||||
| Seshubabu Pasam | ||||
| Shard | ||||
| Shawn Poulson | ||||
| Shmulik Regev | ||||
| Siddhartha Prakash Jain | ||||
| Simon Dick | ||||
| Simon Josefsson | ||||
| Simon Liu | ||||
| Spiridonoff A.V | ||||
| Stadler Stephan | ||||
| Stefan Esser | ||||
| Stefan Ulrich | ||||
| Stephan Bergmann | ||||
| Stephen Kick | ||||
| @@ -413,6 +444,7 @@ Sven Neuhaus | ||||
| S<EFBFBD>bastien Willemijns | ||||
| T. Bharath | ||||
| T. Yamada | ||||
| Temprimus | ||||
| Thomas Schwinge | ||||
| Thomas Tonino | ||||
| Tim Baker | ||||
| @@ -438,7 +470,9 @@ Traian Nicolescu | ||||
| Troels Walsted Hansen | ||||
| Troy Engel | ||||
| Tupone Alfredo | ||||
| Ulf H<>rnhammar | ||||
| Ulrich Zadow | ||||
| Vilmos Nebehaj | ||||
| Vincent Bronner | ||||
| Vincent Penquerc'h | ||||
| Vincent Sanders | ||||
| @@ -451,7 +485,9 @@ Wesley Laxton | ||||
| Wez Furlong | ||||
| Wilfredo Sanchez | ||||
| Wojciech Zwiefka | ||||
| Yang Tse | ||||
| Yarram Sunil | ||||
| Zvi Har'El  | ||||
| nk | ||||
| swalkaus at yahoo.com | ||||
| tommink[at]post.pl | ||||
|   | ||||
							
								
								
									
										29
									
								
								docs/TODO
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								docs/TODO
									
									
									
									
									
								
							| @@ -43,6 +43,25 @@ TODO | ||||
|  * Add option that changes the interval in which the progress callback is | ||||
|    called at most. | ||||
|  | ||||
|  * Make libcurl built with c-ares use c-ares' IPv6 abilities. They weren't | ||||
|    present when we first added c-ares support but they have been added since! | ||||
|    When this is done and works, we can actually start considering making c-ares | ||||
|    powered libcurl the default build (which of course would require that we'd | ||||
|    bundle the c-ares source code in the libcurl source code releases). | ||||
|  | ||||
|  * Support CONNECT 407 responses that kill the connection and expect the | ||||
|    client to reconnect to complete the authentication. Currently libcurl | ||||
|    assumes that a proxy connection will be kept alive. | ||||
|  | ||||
|  * Make the curl/*.h headers include the proper system includes based on what | ||||
|    was present at the time when configure was run. Currently, the sys/select.h | ||||
|    header is for example included by curl/multi.h only on specific platforms | ||||
|    we know MUST have it. This is error-prone. We therefore want the header | ||||
|    files to adapt to configure results. Those results must be stored in a new | ||||
|    header and they must use a curl name space, i.e not be HAVE_* prefix (as | ||||
|    that would risk collide with other apps that use libcurl and that runs | ||||
|    configure). | ||||
|  | ||||
|  LIBCURL - multi interface | ||||
|  | ||||
|  * Add a curl_multi_fdset() alternative. this allows apps to avoid the | ||||
| @@ -83,7 +102,7 @@ TODO | ||||
|  | ||||
|  * Support GSS/Kerberos 5 for ftp file transfer. This will allow user | ||||
|    authentication and file encryption.  Possible libraries and example clients | ||||
|    are available from MIT or Heimdal. Requsted by Markus Moeller. | ||||
|    are available from MIT or Heimdal. Requested by Markus Moeller. | ||||
|  | ||||
|  * REST fix for servers not behaving well on >2GB requests. This should fail | ||||
|    if the server doesn't set the pointer to the requested index. The tricky | ||||
| @@ -190,12 +209,6 @@ TODO | ||||
|  | ||||
|  NEW PROTOCOLS | ||||
|  | ||||
|  * TFTP - RFC1350 (protocol) and RFC3617 (URI format) | ||||
|  | ||||
|    Dan Fandrich: I wrote a tftp protocol module as part of the I-Boot | ||||
|    bootloader under a BSD-style license with attribution clause | ||||
|    http://download.intrinsyc.com/supported/tools/i-boot-lite/i-boot-lite-1.8/src/libs/net/tftp.c | ||||
|  | ||||
|  * RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description) | ||||
|  | ||||
|  * SFTP/SCP/SSH (no RFCs for protocol nor URI/URL format). An implementation | ||||
| @@ -217,7 +230,7 @@ TODO | ||||
|  * Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'. | ||||
|    Requested by Dane Jensen and others. This is easily scripted though. | ||||
|  | ||||
|  * Add an option that prevents cURL from overwiting existing local files. When | ||||
|  * Add an option that prevents cURL from overwriting existing local files. When | ||||
|    used, and there already is an existing file with the target file name | ||||
|    (either -O or -o), a number should be appended (and increased if already | ||||
|    existing). So that index.html becomes first index.html.1 and then | ||||
|   | ||||
| @@ -53,10 +53,10 @@ in $prefix/lib and its header files are installed in $prefix/include and so | ||||
| on. The prefix is set with "configure --prefix". | ||||
| .IP "--protocols" | ||||
| Lists what particular protocols the installed libcurl was built to support. At | ||||
| the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, GOPHER, | ||||
| FILE, TELNET, LDAP, DICT. Do not assume any particular order. The protocols | ||||
| will be listed using uppercase and are separated by newlines. There may be | ||||
| none, one or several protocols in the list. (Added in 7.13.0) | ||||
| the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, FILE, | ||||
| TELNET, LDAP, DICT. Do not assume any particular order. The protocols will | ||||
| be listed using uppercase and are separated by newlines. There may be none, | ||||
| one or several protocols in the list. (Added in 7.13.0) | ||||
| .IP "--version" | ||||
| Outputs version information about the installed libcurl. | ||||
| .IP "--vernum" | ||||
| @@ -64,7 +64,7 @@ Outputs version information about the installed libcurl, in numerical mode. | ||||
| This outputs the version number, in hexadecimal, with 8 bits for each part; | ||||
| major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl | ||||
| 12.13.14 would appear as 0c0d0e... Note that the initial zero might be | ||||
| omitted. | ||||
| omitted. (This option was broken in the 7.15.0 release.) | ||||
| .SH "EXAMPLES" | ||||
| What linker options do I need when I link with libcurl? | ||||
|  | ||||
|   | ||||
							
								
								
									
										205
									
								
								docs/curl.1
									
									
									
									
									
								
							
							
						
						
									
										205
									
								
								docs/curl.1
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * | ||||
| .\" * This software is licensed as described in the file COPYING, which | ||||
| .\" * you should have received as part of this distribution. The terms | ||||
| @@ -21,7 +21,7 @@ | ||||
| .\" * $Id$ | ||||
| .\" ************************************************************************** | ||||
| .\" | ||||
| .TH curl 1 "4 Sep 2005" "Curl 7.14.2" "Curl Manual" | ||||
| .TH curl 1 "21 Feb 2006" "Curl 7.15.2" "Curl Manual" | ||||
| .SH NAME | ||||
| curl \- transfer a URL | ||||
| .SH SYNOPSIS | ||||
| @@ -30,8 +30,8 @@ curl \- transfer a URL | ||||
| .SH DESCRIPTION | ||||
| .B curl | ||||
| is a tool to transfer data from or to a server, using one of the supported | ||||
| protocols (HTTP, HTTPS, FTP, FTPS, TFTP, GOPHER, DICT, TELNET, LDAP or | ||||
| FILE). The command is designed to work without user interaction. | ||||
| protocols (HTTP, HTTPS, FTP, FTPS, TFTP, DICT, TELNET, LDAP or FILE). | ||||
| The command is designed to work without user interaction. | ||||
|  | ||||
| curl offers a busload of useful tricks like proxy support, user | ||||
| authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file | ||||
| @@ -64,6 +64,12 @@ several ones next to each other: | ||||
| You can specify any amount of URLs on the command line. They will be fetched | ||||
| in a sequential manner in the specified order. | ||||
|  | ||||
| Since curl 7.15.1 you can also specify step counter for the ranges, so that | ||||
| you can get every Nth number or letter: | ||||
|  | ||||
|  http://www.numericals.com/file[1-100:10].txt | ||||
|  http://www.letters.com/file[a-z:2].txt | ||||
|  | ||||
| If you specify URL without protocol:// prefix, curl will attempt to guess what | ||||
| protocol you might want. It will then default to HTTP but try other protocols | ||||
| based on often-used host name prefixes. For example, for host names starting | ||||
| @@ -74,6 +80,24 @@ getting many files from the same server will not do multiple connects / | ||||
| handshakes. This improves speed. Of course this is only done on files | ||||
| specified on a single command line and cannot be used between separate curl | ||||
| invokes. | ||||
| .SH "PROGRESS METER" | ||||
| curl normally displays a progress meter during operations, indicating amount | ||||
| of transfered data, transfer speeds and estimated time left etc. | ||||
|  | ||||
| However, since curl displays data to the terminal by default, if you invoke | ||||
| curl to do an operation and it is about to write data to the terminal, it | ||||
| \fIdisables\fP the progress meter as otherwise it would mess up the output | ||||
| mixing progress meter and response data. | ||||
|  | ||||
| If you want a progress meter for HTTP POST or PUT requests, you need to | ||||
| redirect the response output to a file, using shell redirect (>), -o [file] or | ||||
| similar. | ||||
|  | ||||
| It is not the same case for FTP upload as that operation is not spitting out | ||||
| any response data to the terminal. | ||||
|  | ||||
| If you prefer a progress "bar" instead of the regular meter, \fI-#\fP is your | ||||
| friend. | ||||
| .SH OPTIONS | ||||
| .IP "-a/--append" | ||||
| (FTP) When used in an FTP upload, this will tell curl to append to the target | ||||
| @@ -94,7 +118,7 @@ most secure one the remote site claims it supports. This is done by first | ||||
| doing a request and checking the response-headers, thus inducing an extra | ||||
| network round-trip. This is used instead of setting a specific authentication | ||||
| method, which you can do with \fI--basic\fP, \fI--digest\fP, \fI--ntlm\fP, and | ||||
| \fI--negotiate\fP. (Added in 7.10.6) | ||||
| \fI--negotiate\fP. | ||||
|  | ||||
| Note that using --anyauth is not recommended if you do uploads from stdin, | ||||
| since it may require data to be sent twice and then the client must be able to | ||||
| @@ -134,7 +158,7 @@ If this option is used twice, the second one will disable ASCII usage. | ||||
| (HTTP) Tells curl to use HTTP Basic authentication. This is the default and | ||||
| this option is usually pointless, unless you use it to override a previously | ||||
| set option that sets a different authentication method (such as \fI--ntlm\fP, | ||||
| \fI--digest\fP and \fI--negotiate\fP). (Added in 7.10.6) | ||||
| \fI--digest\fP and \fI--negotiate\fP). | ||||
|  | ||||
| If this option is used several times, the following occurrences make no | ||||
| difference. | ||||
| @@ -192,7 +216,8 @@ To create remote directories when using FTP, try \fI--ftp-create-dirs\fP. | ||||
| .IP "--crlf" | ||||
| (FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390). | ||||
|  | ||||
| If this option is used twice, the second will again disable crlf converting. | ||||
| If this option is used several times, the following occurrences make no | ||||
| difference. | ||||
| .IP "-d/--data <data>" | ||||
| (HTTP) Sends the specified data in a POST request to the HTTP server, in a way | ||||
| that can emulate as if a user has filled in a HTML form and pressed the submit | ||||
| @@ -236,7 +261,7 @@ append data. | ||||
| prevents the password from being sent over the wire in clear text. Use this in | ||||
| combination with the normal \fI-u/--user\fP option to set user name and | ||||
| password. See also \fI--ntlm\fP, \fI--negotiate\fP and \fI--anyauth\fP for | ||||
| related options. (Added in curl 7.10.6) | ||||
| related options. | ||||
|  | ||||
| If this option is used several times, the following occurrences make no | ||||
| difference. | ||||
| @@ -246,7 +271,7 @@ active FTP transfers. Curl will normally always first attempt to use EPRT, | ||||
| then LPRT before using PORT, but with this option, it will use PORT right | ||||
| away. EPRT and LPRT are extensions to the original FTP protocol, may not work | ||||
| on all servers but enable more functionality in a better way than the | ||||
| traditional PORT command. (Added in 7.10.5) | ||||
| traditional PORT command. | ||||
|  | ||||
| If this option is used several times, each occurrence will toggle this on/off. | ||||
| .IP "--disable-epsv" | ||||
| @@ -270,9 +295,9 @@ If this option is used several times, the last one will be used. | ||||
| .IP "-e/--referer <URL>" | ||||
| (HTTP) Sends the "Referer Page" information to the HTTP server. This can also | ||||
| be set with the \fI-H/--header\fP flag of course.  When used with | ||||
| \fI-L/--location\fP you can append ";auto" to the referer URL to make curl | ||||
| \fI-L/--location\fP you can append ";auto" to the --referer URL to make curl | ||||
| automatically set the previous URL when it follows a Location: header. The | ||||
| \&";auto" string can be used alone, even if you don't set an initial referer. | ||||
| \&";auto" string can be used alone, even if you don't set an initial --referer. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--engine <name>" | ||||
| @@ -330,9 +355,9 @@ If this option is used several times, the last one will be used. | ||||
| .IP "-f/--fail" | ||||
| (HTTP) Fail silently (no output at all) on server errors. This is mostly done | ||||
| like this to better enable scripts etc to better deal with failed attempts. In | ||||
| normal cases when a HTTP server fails to deliver a document, it returns a HTML | ||||
| document stating so (which often also describes why and more). This flag will | ||||
| prevent curl from outputting that and fail silently instead. | ||||
| normal cases when a HTTP server fails to deliver a document, it returns an | ||||
| HTML document stating so (which often also describes why and more). This flag | ||||
| will prevent curl from outputting that and return error 22. | ||||
|  | ||||
| If this option is used twice, the second will again disable silent failure. | ||||
| .IP "--ftp-account [data]" | ||||
| @@ -344,15 +369,33 @@ If this option is used twice, the second will override the previous use. | ||||
| .IP "--ftp-create-dirs" | ||||
| (FTP) When an FTP URL/operation uses a path that doesn't currently exist on | ||||
| the server, the standard behavior of curl is to fail. Using this option, curl | ||||
| will instead attempt to create missing directories. (Added in 7.10.7) | ||||
| will instead attempt to create missing directories. | ||||
|  | ||||
| If this option is used twice, the second will again disable silent failure. | ||||
| If this option is used twice, the second will again disable directory creation. | ||||
| .IP "--ftp-method [method]" | ||||
| (FTP) Control what method curl should use to reach a file on a FTP(S) | ||||
| server. The method argument should be one of the following alternatives: | ||||
| .RS | ||||
| .IP multicwd | ||||
| curl does a single CWD operation for each path part in the given URL. For deep | ||||
| hierarchies this means very many commands. This is how RFC1738 says it should | ||||
| be done. This is the default but the slowest behavior. | ||||
| .IP nocwd | ||||
| curl does no CWD at all. curl will do SIZE, RETR, STOR etc and give a full | ||||
| path to the server for all these commands. This is the fastest behavior. | ||||
| .IP singlecwd | ||||
| curl does one CWD with the full target directory and then operates on the file | ||||
| \&"normally" (like in the multicwd case). This is somewhat more standards | ||||
| compliant than 'nocwd' but without the full penalty of 'multicwd'. | ||||
| .RE | ||||
| .IP "--ftp-pasv" | ||||
| (FTP) Use PASV when transferring. PASV is the internal default behavior, but | ||||
| using this option can be used to override a previous --ftp-port option. (Added | ||||
| in 7.11.0) | ||||
|  | ||||
| If this option is used twice, the second will again disable silent failure. | ||||
| If this option is used several times, the following occurrences make no | ||||
| difference. | ||||
|  | ||||
| .IP "--ftp-skip-pasv-ip" | ||||
| (FTP) Tell curl to not use the IP address the server suggests in its response | ||||
| to curl's PASV command when curl connects the data connection. Instead curl | ||||
| @@ -361,7 +404,8 @@ connection. (Added in 7.14.2) | ||||
|  | ||||
| This option has no effect if PORT, EPRT or EPSV is used instead of PASV. | ||||
|  | ||||
| If this option is used twice, the second will again disable silent failure. | ||||
| If this option is used twice, the second will again use the server's suggested | ||||
| address. | ||||
| .IP "--ftp-ssl" | ||||
| (FTP) Make the FTP connection switch to use SSL/TLS. (Added in 7.11.0) | ||||
|  | ||||
| @@ -422,7 +466,8 @@ with a '?'  separator. | ||||
| If used in combination with -I, the POST data will instead be appended to the | ||||
| URL with a HEAD request. | ||||
|  | ||||
| If used multiple times, nothing special happens. | ||||
| If this option is used several times, the following occurrences make no | ||||
| difference. | ||||
| .IP "-h/--help" | ||||
| Usage help. | ||||
| .IP "-H/--header <header>" | ||||
| @@ -473,15 +518,14 @@ If this option is used twice, the second will again disable header only. | ||||
| (HTTP) When curl is told to read cookies from a given file, this option will | ||||
| make it discard all "session cookies". This will basically have the same effect | ||||
| as if a new session is started. Typical browsers always discard session | ||||
| cookies when they're closed down. (Added in 7.9.7) | ||||
| cookies when they're closed down. | ||||
|  | ||||
| If this option is used several times, each occurrence will toggle this on/off. | ||||
| .IP "-k/--insecure" | ||||
| (SSL) This option explicitly allows curl to perform "insecure" SSL connections | ||||
| and transfers. Starting with curl 7.10, all SSL connections will be attempted | ||||
| to be made secure by using the CA certificate bundle installed by | ||||
| default. This makes all connections considered "insecure" to fail unless | ||||
| \fI-k/--insecure\fP is used. | ||||
| and transfers. All SSL connections are attempted to be made secure by using | ||||
| the CA certificate bundle installed by default. This makes all connections | ||||
| considered "insecure" to fail unless \fI-k/--insecure\fP is used. | ||||
|  | ||||
| If this option is used twice, the second time will again disable it. | ||||
| .IP "--key <key>" | ||||
| @@ -508,7 +552,7 @@ Specify which config file to read curl arguments from. The config file is a | ||||
| text file in which command line arguments can be written which then will be | ||||
| used as if they were written on the actual command line. Options and their | ||||
| parameters must be specified on the same config file line. If the parameter is | ||||
| to contain white spaces, the parameter must be inclosed within quotes.  If the | ||||
| to contain white spaces, the parameter must be enclosed within quotes.  If the | ||||
| first column of a config line is a '#' character, the rest of the line will be | ||||
| treated as a comment. | ||||
|  | ||||
| @@ -548,8 +592,6 @@ If you are also using the \fI-Y/--speed-limit\fP option, that option will take | ||||
| precedence and might cripple the rate-limiting slightly, to help keeping the | ||||
| speed-limit logic working. | ||||
|  | ||||
| This option was introduced in curl 7.10. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-l/--list-only" | ||||
| (FTP) | ||||
| @@ -563,15 +605,21 @@ list only files in their response to NLST; they do not include | ||||
| subdirectories and symbolic links. | ||||
|  | ||||
| If this option is used twice, the second will again disable list only. | ||||
| .IP "--local-port <num>[-num]" | ||||
| Set a prefered number or range of local port numbers to use for the | ||||
| connection(s).  Note that port numbers by nature is a scarce resource that | ||||
| will be busy at times so setting this range to something too narrow might | ||||
| cause unnecessary connection setup failures. (Added in 7.15.2) | ||||
| .IP "-L/--location" | ||||
| (HTTP/HTTPS) If the server reports that the requested page has a different | ||||
| location (indicated with the header line Location:) this flag will let curl | ||||
| attempt to reattempt the get on the new place. If used together with | ||||
| \fI-i/--include\fP or \fI-I/--head\fP, headers from all requested pages will | ||||
| be shown. If authentication is used, curl will only send its credentials to | ||||
| the initial host, so if a redirect takes curl to a different host, it won't | ||||
| intercept the user+password. See also \fI--location-trusted\fP on how to | ||||
| change this. | ||||
| (HTTP/HTTPS) If the server reports that the requested page has moved to a | ||||
| different location (indicated with a Location: header and a 3XX response code) | ||||
| this option will make curl redo the request on the new place. If used together | ||||
| with \fI-i/--include\fP or \fI-I/--head\fP, headers from all requested pages | ||||
| will be shown. When authentication is used, curl only sends its credentials to | ||||
| the initial host. If a redirect takes curl to a different host, it won't be | ||||
| able to intercept the user+password. See also \fI--location-trusted\fP on how | ||||
| to change this. You can limit the amount of redirects to follow by using the | ||||
| \fI--max-redirs\fP option. | ||||
|  | ||||
| If this option is used twice, the second will again disable location following. | ||||
| .IP "--location-trusted" | ||||
| @@ -625,12 +673,16 @@ Very similar to \fI--netrc\fP, but this option makes the .netrc usage | ||||
| designed by Microsoft and is used in their web applications. It is primarily | ||||
| 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. (Added in 7.10.6) | ||||
| draft-brezak-spnego-http-04.txt. | ||||
|  | ||||
| This option requires that the library was built with GSSAPI support. This is | ||||
| not very common. Use \fI-V/--version\fP to see if your version supports | ||||
| GSS-Negotiate. | ||||
|  | ||||
| When using this option, you must also provide a fake -u/--user option to | ||||
| activate the authentication code properly. Sending a '-u :' is enough as the | ||||
| user name and password from the -u option aren't actually used. | ||||
|  | ||||
| If this option is used several times, the following occurrences make no | ||||
| difference. | ||||
| .IP "-N/--no-buffer" | ||||
| @@ -646,7 +698,7 @@ designed by Microsoft and is used by IIS web servers. It is a proprietary | ||||
| protocol, reversed engineered by clever people and implemented in curl based | ||||
| on their efforts. This kind of behavior should not be endorsed, you should | ||||
| encourage everyone who uses NTLM to switch to a public and documented | ||||
| authentication method instead. Such as Digest. (Added in 7.10.6) | ||||
| authentication method instead. Such as Digest. | ||||
|  | ||||
| If you want to enable NTLM for your proxy authentication, then use | ||||
| \fI--proxy-ntlm\fP. | ||||
| @@ -676,8 +728,8 @@ dynamically. | ||||
| Write output to a local file named like the remote file we get. (Only the file | ||||
| part of the remote file is used, the path is cut off.) | ||||
|  | ||||
| The remote file name to use for saving is extracted from the given URL. | ||||
| Nothing else | ||||
| The remote file name to use for saving is extracted from the given URL, | ||||
| nothing else. | ||||
|  | ||||
| You may use this option as many times as you have number of URLs. | ||||
| .IP "--pass <phrase>" | ||||
| @@ -686,8 +738,8 @@ You may use this option as many times as you have number of URLs. | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--proxy-anyauth" | ||||
| Tells curl to pick a suitable authentication method when communicating with | ||||
| the given proxy. This will cause an extra request/response round-trip. Added | ||||
| in curl 7.13.2. | ||||
| the given proxy. This will cause an extra request/response round-trip. (Added | ||||
| in 7.13.2) | ||||
|  | ||||
| If this option is used twice, the second will again disable the proxy use-any | ||||
| authentication. | ||||
| @@ -730,7 +782,8 @@ i.e "192.168.10.1" to specify exact IP number | ||||
| .IP "host name" | ||||
| i.e "my.host.domain" to specify machine | ||||
| .IP "-" | ||||
| (any single-letter string) to make it pick the machine's default | ||||
| make curl pick the same IP address that is already used for the control | ||||
| connection | ||||
| .RE | ||||
|  | ||||
| If this option is used several times, the last one will be used. Disable the | ||||
| @@ -770,7 +823,7 @@ specifies the second 500 bytes | ||||
| .B -500 | ||||
| specifies the last 500 bytes | ||||
| .TP | ||||
| .B 9500 | ||||
| .B 9500- | ||||
| specifies the bytes from offset 9500 and forward | ||||
| .TP | ||||
| .B 0-0,-1 | ||||
| @@ -811,7 +864,7 @@ for all forthcoming retries it will double the waiting time until it reaches | ||||
| 10 minutes which then will be the delay between the rest of the retries.  By | ||||
| using \fI--retry-delay\fP you disable this exponential backoff algorithm. See | ||||
| also \fI--retry-max-time\fP to limit the total time allowed for | ||||
| retries. (Option added in 7.12.3) | ||||
| retries. (Added in 7.12.3) | ||||
|  | ||||
| If this option is used multiple times, the last occurrence decide the amount. | ||||
| .IP "--retry-delay <seconds>" | ||||
| @@ -819,7 +872,7 @@ Make curl sleep this amount of time between each retry when a transfer has | ||||
| failed with a transient error (it changes the default backoff time algorithm | ||||
| between retries). This option is only interesting if \fI--retry\fP is also | ||||
| used. Setting this delay to zero will make curl use the default backoff time. | ||||
| (Option added in 7.12.3) | ||||
| (Added in 7.12.3) | ||||
|  | ||||
| If this option is used multiple times, the last occurrence decide the amount. | ||||
| .IP "--retry-max-time <seconds>" | ||||
| @@ -828,26 +881,36 @@ done as usual (see \fI--retry\fP) as long as the timer hasn't reached this | ||||
| given limit. Notice that if the timer hasn't reached the limit, the request | ||||
| will be made and while performing, it may take longer than this given time | ||||
| period. To limit a single request\'s maximum time, use \fI-m/--max-time\fP. | ||||
| Set this option to zero to not timeout retries. (Option added in 7.12.3) | ||||
| Set this option to zero to not timeout retries. (Added in 7.12.3) | ||||
|  | ||||
| If this option is used multiple times, the last occurrence decide the amount. | ||||
| .IP "-s/--silent" | ||||
| Silent mode. Don't show progress meter or error messages.  Makes | ||||
| Curl mute. | ||||
|  | ||||
| If this option is used twice, the second will again disable mute. | ||||
| If this option is used twice, the second will again disable silent mode. | ||||
| .IP "-S/--show-error" | ||||
| When used with -s it makes curl show error message if it fails. | ||||
|  | ||||
| If this option is used twice, the second will again disable show error. | ||||
| .IP "--socks <host[:port]>" | ||||
| Use the specified SOCKS5 proxy. If the port number is not specified, it is | ||||
| assumed at port 1080. (Option added in 7.11.1) | ||||
| .IP "--socks4 <host[:port]>" | ||||
| Use the specified SOCKS4 proxy. If the port number is not specified, it is | ||||
| assumed at port 1080. (Added in 7.15.2) | ||||
|  | ||||
| This option overrides any previous use of \fI-x/--proxy\fP, as they are | ||||
| mutually exclusive. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--socks5 <host[:port]>" | ||||
| Use the specified SOCKS5 proxy. If the port number is not specified, it is | ||||
| assumed at port 1080. (Added in 7.11.1) | ||||
|  | ||||
| This option overrides any previous use of \fI-x/--proxy\fP, as they are | ||||
| mutually exclusive. | ||||
|  | ||||
| If this option is used several times, the last one will be used. (This option | ||||
| was previously wrongly documented and used as --socks without the number | ||||
| appended.) | ||||
| .IP "--stderr <file>" | ||||
| Redirect all writes to stderr to the specified file instead. If the file name | ||||
| is a plain '-', it is instead written to stdout. This option has no point when | ||||
| @@ -877,13 +940,10 @@ this is used on a http(s) server, the PUT command will be used. | ||||
|  | ||||
| Use the file name "-" (a single dash) to use stdin instead of a given file. | ||||
|  | ||||
| Before 7.10.8, when this option was used several times, the last one was used. | ||||
|  | ||||
| In curl 7.10.8 and later, you can specify one -T for each URL on the command | ||||
| line. Each -T + URL pair specifies what to upload and to where. curl also | ||||
| supports "globbing" of the -T argument, meaning that you can upload multiple | ||||
| files to a single URL by using the same URL globbing style supported in the | ||||
| URL, like this: | ||||
| You can specify one -T for each URL on the command line. Each -T + URL pair | ||||
| specifies what to upload and to where. curl also supports "globbing" of the -T | ||||
| argument, meaning that you can upload multiple files to a single URL by using | ||||
| the same URL globbing style supported in the URL, like this: | ||||
|  | ||||
| curl -T "{file1,file2}" http://www.uploadtothissite.com | ||||
|  | ||||
| @@ -895,8 +955,7 @@ Enables a full trace dump of all incoming and outgoing data, including | ||||
| descriptive information, to the given output file. Use "-" as filename to have | ||||
| the output sent to stdout. | ||||
|  | ||||
| If this option is used several times, the last one will be used. (Added in | ||||
| 7.9.7) | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--trace-ascii <file>" | ||||
| Enables a full trace dump of all incoming and outgoing data, including | ||||
| descriptive information, to the given output file. Use "-" as filename to have | ||||
| @@ -906,21 +965,28 @@ This is very similar to \fI--trace\fP, but leaves out the hex part and only | ||||
| shows the ASCII part of the dump. It makes smaller output that might be easier | ||||
| to read for untrained humans. | ||||
|  | ||||
| If this option is used several times, the last one will be used. (Added in | ||||
| 7.9.7) | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--trace-time" | ||||
| Prepends a time stamp to each trace or verbose line that curl displays. | ||||
| (Added in 7.14.0) | ||||
|  | ||||
| If this option is used several times, each occurrence will toggle it on/off. | ||||
| (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. | ||||
|  | ||||
| If you use an SSPI-enabled curl binary and do NTLM autentication, you can | ||||
| force curl to pick up the user name and password from your environment by | ||||
| simply specifying a single colon with this option: "-u :". | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-U/--proxy-user <user:password>" | ||||
| Specify user and password to use for proxy authentication. | ||||
|  | ||||
| If you use an SSPI-enabled curl binary and do NTLM autentication, you can | ||||
| force curl to pick up the user name and password from your environment by | ||||
| simply specifying a single colon with this option: "-U :". | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--url <URL>" | ||||
| Specify a URL to fetch. This option is mostly handy when you want to specify | ||||
| @@ -1058,7 +1124,7 @@ The average download speed that curl measured for the complete download. | ||||
| The average upload speed that curl measured for the complete upload. | ||||
| .TP | ||||
| .B content_type | ||||
| The Content-Type of the requested document, if there was any. (Added in 7.9.5) | ||||
| The Content-Type of the requested document, if there was any. | ||||
| .TP | ||||
| .B num_connects | ||||
| Number of new connects made in the recent transfer. (Added in 7.12.3) | ||||
| @@ -1127,7 +1193,8 @@ If this option is used several times, the last one will be used. | ||||
| .IP "--max-redirs <num>" | ||||
| Set maximum number of redirection-followings allowed. If \fI-L/--location\fP | ||||
| is used, this option can be used to prevent curl from following redirections | ||||
| \&"in absurdum". | ||||
| \&"in absurdum". By default, the limit is set to 50 redirections. Set this | ||||
| option to -1 to make it limitless. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-0/--http1.0" | ||||
| @@ -1156,11 +1223,11 @@ Note that not all FTP server allow 3rd party transfers. (Added in 7.13.0) | ||||
| .IP "-4/--ipv4" | ||||
| If libcurl is capable of resolving an address to multiple IP versions (which | ||||
| it is if it is ipv6-capable), this option tells libcurl to resolve names to | ||||
| IPv4 addresses only. (Added in 7.10.8) | ||||
| IPv4 addresses only. | ||||
| .IP "-6/--ipv6" | ||||
| If libcurl is capable of resolving an address to multiple IP versions (which | ||||
| it is if it is ipv6-capable), this option tells libcurl to resolve names to | ||||
| IPv6 addresses only. (Added in 7.10.8) | ||||
| IPv6 addresses only. | ||||
| .IP "-#/--progress-bar" | ||||
| Make curl display progress information as a progress bar instead of the | ||||
| default statistics. | ||||
| @@ -1178,8 +1245,6 @@ Sets proxy server to use for HTTP. | ||||
| Sets proxy server to use for HTTPS. | ||||
| .IP "FTP_PROXY [protocol://]<host>[:port]" | ||||
| Sets proxy server to use for FTP. | ||||
| .IP "GOPHER_PROXY [protocol://]<host>[:port]" | ||||
| Sets proxy server to use for GOPHER. | ||||
| .IP "ALL_PROXY [protocol://]<host>[:port]" | ||||
| Sets proxy server to use if no protocol-specific proxy is set. | ||||
| .IP "NO_PROXY <comma-separated list of hosts>" | ||||
| @@ -1206,7 +1271,9 @@ Failed to connect to host. | ||||
| .IP 8 | ||||
| FTP weird server reply. The server sent data curl couldn't parse. | ||||
| .IP 9 | ||||
| FTP access denied. The server denied login. | ||||
| FTP access denied. The server denied login or denied access to the particular | ||||
| resource or directory you wanted to reach. Most often you tried to change to a | ||||
| directory that doesn't exist on the server. | ||||
| .IP 10 | ||||
| FTP user/password incorrect. Either one or both were not accepted by the | ||||
| server. | ||||
|   | ||||
| @@ -11,7 +11,7 @@ EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.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 opensslthreadlock.c		\ | ||||
|  cookie_interface.c cacertinmem.c | ||||
|  cookie_interface.c cacertinmem.c synctime.c | ||||
|  | ||||
| all: | ||||
| 	@echo "done" | ||||
|   | ||||
| @@ -33,6 +33,8 @@ we expect you to actually torture our web site with your tests! Thanks. | ||||
| EXAMPLES | ||||
|  | ||||
| anyauthput.c   - HTTP PUT using "any" authentication method | ||||
| cacertinmem.c  - Use a built-in PEM certificate to retrieve a https page | ||||
| cookie_interface.c - shows usage of simple cookie interface | ||||
| curlgtk.c      - download using a GTK progress bar | ||||
| curlx.c        - getting file info from the remote cert data | ||||
| debug.c        - showing how to use the debug callback | ||||
| @@ -55,6 +57,7 @@ multi-double.c - a multi-interface app doing two simultaneous transfers | ||||
| multi-post.c   - a multi-interface app doing a multipart formpost | ||||
| multi-single.c - a multi-interface app getting a single file | ||||
| multithread.c  - an example using multi-treading transfering multiple files | ||||
| opensslthreadlock.c - show how to do locking when using OpenSSL multi-threaded | ||||
| persistant.c   - request two URLs with a persistant connection | ||||
| post-callback.c - send a HTTP POST using a callback | ||||
| postit2.c      - send a HTTP multipart formpost | ||||
| @@ -62,3 +65,4 @@ sepheaders.c   - download headers to a separate file | ||||
| simple.c       - the most simple download a URL source | ||||
| simplepost.c   - HTTP POST | ||||
| simplessl.c    - HTTPS example with certificates many options set | ||||
| synctime.c     - Sync local time by extracing date from remote HTTP servers | ||||
|   | ||||
| @@ -78,7 +78,7 @@ int main(void) | ||||
|       curl_slist *chunk = NULL; | ||||
|  | ||||
|       chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked"); | ||||
|       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER); | ||||
|       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); | ||||
|       /* use curl_slist_free_all() after the *perform() call to free this | ||||
|          list again */ | ||||
|     } | ||||
| @@ -101,7 +101,7 @@ int main(void) | ||||
|       curl_slist *chunk = NULL; | ||||
|  | ||||
|       chunk = curl_slist_append(chunk, "Expect:"); | ||||
|       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER); | ||||
|       res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); | ||||
|       /* use curl_slist_free_all() after the *perform() call to free this | ||||
|          list again */ | ||||
|     } | ||||
|   | ||||
							
								
								
									
										339
									
								
								docs/examples/synctime.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										339
									
								
								docs/examples/synctime.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,339 @@ | ||||
| /***************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * $Id$ | ||||
|  * | ||||
|  * This example code only builds as-is on Windows. | ||||
|  * | ||||
|  * Synchronising your computer clock via Internet time server usually relies | ||||
|  * on DAYTIME, TIME, or NTP protocols. These protocols provide good accurate | ||||
|  * time synchronisation but it does not work very well through a | ||||
|  * firewall/proxy. Some adjustment has to be made to the firewall/proxy for | ||||
|  * these protocols to work properly. | ||||
|  * | ||||
|  * There is an indirect method. Since most webserver provide server time in | ||||
|  * their HTTP header, therefore you could synchronise your computer clock | ||||
|  * using HTTP protocol which has no problem with firewall/proxy. | ||||
|  * | ||||
|  * For this software to work, you should take note of these items. | ||||
|  * 1. Your firewall/proxy must allow your computer to surf internet. | ||||
|  * 2. Webserver system time must in sync with the NTP time server, | ||||
|  *    or at least provide an accurate time keeping. | ||||
|  * 3. Webserver HTTP header does not provide the milliseconds units, | ||||
|  *    so there is no way to get very accurate time. | ||||
|  * 4. This software could only provide an accuracy of +- a few seconds, | ||||
|  *    as Round-Trip delay time is not taken into consideration. | ||||
|  *    Compensation of network, firewall/proxy delay cannot be simply divide | ||||
|  *    the Round-Trip delay time by half. | ||||
|  * 5. Win32 SetSystemTime() API will set your computer clock according to | ||||
|  *    GMT/UTC time. Therefore your computer timezone must be properly set. | ||||
|  * 6. Webserver data should not be cached by the proxy server. Some | ||||
|  *    webserver provide Cache-Control to prevent caching. | ||||
|  * | ||||
|  * References: | ||||
|  * http://tf.nist.gov/timefreq/service/its.htm | ||||
|  * http://tf.nist.gov/timefreq/service/firewall.htm | ||||
|  * | ||||
|  * Usage: | ||||
|  * This software will synchronise your computer clock only when you issue | ||||
|  * it with --synctime. By default, it only display the webserver's clock. | ||||
|  * | ||||
|  * Written by: Frank (contributed to libcurl) | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, | ||||
|  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY | ||||
|  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. | ||||
|  * | ||||
|  * IN NO EVENT SHALL THE AUTHOR OF THIS SOFTWARE BE LIABLE FOR | ||||
|  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, | ||||
|  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||||
|  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF | ||||
|  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | ||||
|  * OF THIS SOFTWARE. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <time.h> | ||||
| #include <windows.h> | ||||
| #include <curl/curl.h> | ||||
|  | ||||
|  | ||||
| #define MAX_STRING              256 | ||||
| #define MAX_STRING1             MAX_STRING+1 | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   char http_proxy[MAX_STRING1]; | ||||
|   char proxy_user[MAX_STRING1]; | ||||
|   char timeserver[MAX_STRING1]; | ||||
| } conf_t; | ||||
|  | ||||
| char DefaultTimeServer[4][MAX_STRING1] = | ||||
| { | ||||
|   "http://nist.time.gov/timezone.cgi?UTC/s/0", | ||||
|   "http://www.google.com/", | ||||
|   "http://www.worldtimeserver.com/current_time_in_UTC.aspx", | ||||
|   "http://www.worldtime.com/cgi-bin/wt.cgi" | ||||
| }; | ||||
|  | ||||
| char *DayStr[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; | ||||
| char *MthStr[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", | ||||
|                   "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; | ||||
|  | ||||
| int  ShowAllHeader; | ||||
| int  AutoSyncTime; | ||||
| SYSTEMTIME SYSTime; | ||||
| SYSTEMTIME LOCALTime; | ||||
|  | ||||
| #define HTTP_COMMAND_HEAD       0 | ||||
| #define HTTP_COMMAND_GET        1 | ||||
|  | ||||
|  | ||||
| size_t SyncTime_CURL_WriteOutput(void *ptr, size_t size, size_t nmemb, | ||||
|                                  void *stream) | ||||
| { | ||||
|   fwrite(ptr, size, nmemb, stream); | ||||
|   return(nmemb*size); | ||||
| } | ||||
|  | ||||
| size_t SyncTime_CURL_WriteHeader(void *ptr, size_t size, size_t nmemb, | ||||
|                                  void *stream) | ||||
| { | ||||
|   int   i, RetVal; | ||||
|   char  TmpStr1[26], TmpStr2[26]; | ||||
|  | ||||
|   if (ShowAllHeader == 1) | ||||
|     fprintf(stderr, "%s", (char *)(ptr)); | ||||
|  | ||||
|   if (strncmp((char *)(ptr), "Date:", 5) == 0) { | ||||
|     if (ShowAllHeader == 0) | ||||
|       fprintf(stderr, "HTTP Server. %s", (char *)(ptr)); | ||||
|  | ||||
|     if (AutoSyncTime == 1) { | ||||
|       *TmpStr1 = 0; | ||||
|       *TmpStr2 = 0; | ||||
|       if (strlen((char *)(ptr)) > 50) /* Can prevent buffer overflow to | ||||
|                                          TmpStr1 & 2? */ | ||||
|         AutoSyncTime = 0; | ||||
|       else { | ||||
|         RetVal = sscanf ((char *)(ptr), "Date: %s %d %s %d %d:%d:%d", | ||||
|                          TmpStr1, &SYSTime.wDay, TmpStr2, &SYSTime.wYear, | ||||
|                          &SYSTime.wHour, &SYSTime.wMinute, &SYSTime.wSecond); | ||||
|  | ||||
|         if (RetVal == 7) { | ||||
|  | ||||
|           SYSTime.wMilliseconds = 500;    /* adjust to midpoint, 0.5 sec */ | ||||
|           for (i=0; i<12; i++) { | ||||
|             if (strcmp(MthStr[i], TmpStr2) == 0) { | ||||
|               SYSTime.wMonth = i+1; | ||||
|               break; | ||||
|             } | ||||
|           } | ||||
|           AutoSyncTime = 3;       /* Computer clock will be adjusted */ | ||||
|         } | ||||
|         else { | ||||
|           AutoSyncTime = 0;       /* Error in sscanf() fields conversion */ | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if (strncmp((char *)(ptr), "X-Cache: HIT", 12) == 0) { | ||||
|     fprintf(stderr, "ERROR: HTTP Server data is cached." | ||||
|             " Server Date is no longer valid.\n"); | ||||
|     AutoSyncTime = 0; | ||||
|   } | ||||
|   return(nmemb*size); | ||||
| } | ||||
|  | ||||
| void SyncTime_CURL_Init(CURL *curl, char *proxy_port, | ||||
|                         char *proxy_user_password) | ||||
| { | ||||
|   if (strlen(proxy_port) > 0) | ||||
|     curl_easy_setopt(curl, CURLOPT_PROXY, proxy_port); | ||||
|  | ||||
|   if (strlen(proxy_user_password) > 0) | ||||
|     curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, proxy_user_password); | ||||
|  | ||||
|   /* Trick Webserver by claiming that you are using Microsoft WinXP SP2, IE6 */ | ||||
|   curl_easy_setopt(curl, CURLOPT_USERAGENT, | ||||
|                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); | ||||
|   curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, *SyncTime_CURL_WriteOutput); | ||||
|   curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, *SyncTime_CURL_WriteHeader); | ||||
| } | ||||
|  | ||||
| int SyncTime_CURL_Fetch(CURL *curl, char *URL_Str, char *OutFileName, | ||||
|                         int HttpGetBody) | ||||
| { | ||||
|   FILE *outfile; | ||||
|   CURLcode res; | ||||
|  | ||||
|   outfile = NULL; | ||||
|   if (HttpGetBody == HTTP_COMMAND_HEAD) | ||||
|     curl_easy_setopt(curl, CURLOPT_NOBODY, 1); | ||||
|   else { | ||||
|     outfile = fopen(OutFileName, "wb"); | ||||
|     curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile); | ||||
|   } | ||||
|  | ||||
|   curl_easy_setopt(curl, CURLOPT_URL, URL_Str); | ||||
|   res = curl_easy_perform(curl); | ||||
|   if (outfile != NULL) | ||||
|     fclose(outfile); | ||||
|   return res;  /* (CURLE_OK) */ | ||||
| } | ||||
|  | ||||
| void showUsage(void) | ||||
| { | ||||
|   fprintf(stderr, "SYNCTIME: Synchronising computer clock with time server" | ||||
|           " using HTTP protocol.\n"); | ||||
|   fprintf(stderr, "Usage   : SYNCTIME [Option]\n"); | ||||
|   fprintf(stderr, "Options :\n"); | ||||
|   fprintf(stderr, " --server=WEBSERVER        Use this time server instead" | ||||
|           " of default.\n"); | ||||
|   fprintf(stderr, " --showall                 Show all HTTP header.\n"); | ||||
|   fprintf(stderr, " --synctime                Synchronising computer clock" | ||||
|           " with time server.\n"); | ||||
|   fprintf(stderr, " --proxy-user=USER[:PASS]  Set proxy username and" | ||||
|           " password.\n"); | ||||
|   fprintf(stderr, " --proxy=HOST[:PORT]       Use HTTP proxy on given" | ||||
|           " port.\n"); | ||||
|   fprintf(stderr, " --help                    Print this help.\n"); | ||||
|   fprintf(stderr, "\n"); | ||||
|   return; | ||||
| } | ||||
|  | ||||
| int conf_init(conf_t *conf) | ||||
| { | ||||
|   int i; | ||||
|  | ||||
|   *conf->http_proxy       = 0; | ||||
|   for (i=0; i<MAX_STRING1; i++) | ||||
|     conf->proxy_user[i]     = 0;    /* Clean up password from memory */ | ||||
|   *conf->timeserver       = 0; | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|   CURL    *curl; | ||||
|   conf_t  conf[1]; | ||||
|   int     OptionIndex; | ||||
|   struct  tm *lt; | ||||
|   struct  tm *gmt; | ||||
|   time_t  tt; | ||||
|   time_t  tt_local; | ||||
|   time_t  tt_gmt; | ||||
|   double  tzonediffFloat; | ||||
|   int     tzonediffWord; | ||||
|   char    timeBuf[61]; | ||||
|   char    tzoneBuf[16]; | ||||
|   int     RetValue; | ||||
|  | ||||
|   OptionIndex     = 0; | ||||
|   ShowAllHeader   = 0;    /* Do not show HTTP Header */ | ||||
|   AutoSyncTime    = 0;    /* Do not synchronise computer clock */ | ||||
|   RetValue        = 0;    /* Successful Exit */ | ||||
|   conf_init(conf); | ||||
|  | ||||
|   if (argc > 1) { | ||||
|     while (OptionIndex < argc) { | ||||
|       if (strncmp(argv[OptionIndex], "--server=", 9) == 0) | ||||
|         snprintf(conf->timeserver, MAX_STRING, "%s", &argv[OptionIndex][9]); | ||||
|  | ||||
|       if (strcmp(argv[OptionIndex], "--showall") == 0) | ||||
|         ShowAllHeader = 1; | ||||
|  | ||||
|       if (strcmp(argv[OptionIndex], "--synctime") == 0) | ||||
|         AutoSyncTime = 1; | ||||
|  | ||||
|       if (strncmp(argv[OptionIndex], "--proxy-user=", 13) == 0) | ||||
|         snprintf(conf->proxy_user, MAX_STRING, "%s", &argv[OptionIndex][13]); | ||||
|  | ||||
|       if (strncmp(argv[OptionIndex], "--proxy=", 8) == 0) | ||||
|         snprintf(conf->http_proxy, MAX_STRING, "%s", &argv[OptionIndex][8]); | ||||
|  | ||||
|       if ((strcmp(argv[OptionIndex], "--help") == 0) || | ||||
|           (strcmp(argv[OptionIndex], "/?") == 0)) { | ||||
|         showUsage(); | ||||
|         return 0; | ||||
|       } | ||||
|       OptionIndex++; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if (*conf->timeserver == 0)     /* Use default server for time information */ | ||||
|     snprintf(conf->timeserver, MAX_STRING, "%s", DefaultTimeServer[0]); | ||||
|  | ||||
|   /* Init CURL before usage */ | ||||
|   curl_global_init(CURL_GLOBAL_ALL); | ||||
|   curl = curl_easy_init(); | ||||
|   if (curl) { | ||||
|     SyncTime_CURL_Init(curl, conf->http_proxy, conf->proxy_user); | ||||
|  | ||||
|     /* Calculating time diff between GMT and localtime */ | ||||
|     tt       = time(0); | ||||
|     lt       = localtime(&tt); | ||||
|     tt_local = mktime(lt); | ||||
|     gmt      = gmtime(&tt); | ||||
|     tt_gmt   = mktime(gmt); | ||||
|     tzonediffFloat = difftime(tt_local, tt_gmt); | ||||
|     tzonediffWord  = (int)(tzonediffFloat/3600.0); | ||||
|  | ||||
|     if ((double)(tzonediffWord * 3600) == tzonediffFloat) | ||||
|       snprintf(tzoneBuf, 15, "%+03d'00'", tzonediffWord); | ||||
|     else | ||||
|       snprintf(tzoneBuf, 15, "%+03d'30'", tzonediffWord); | ||||
|  | ||||
|     /* Get current system time and local time */ | ||||
|     GetSystemTime(&SYSTime); | ||||
|     GetLocalTime(&LOCALTime); | ||||
|     snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ", | ||||
|              DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay, | ||||
|              MthStr[LOCALTime.wMonth-1], LOCALTime.wYear, | ||||
|              LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond, | ||||
|              LOCALTime.wMilliseconds); | ||||
|     fprintf(stderr, "\nBefore HTTP. Date: %s%s\n\n", timeBuf, tzoneBuf); | ||||
|  | ||||
|     /* HTTP HEAD command to the Webserver */ | ||||
|     fprintf(stderr, "Fetch: %s\n", conf->timeserver); | ||||
|     SyncTime_CURL_Fetch(curl, conf->timeserver, "index.htm", | ||||
|                         HTTP_COMMAND_HEAD); | ||||
|  | ||||
|     GetLocalTime(&LOCALTime); | ||||
|     snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ", | ||||
|              DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay, | ||||
|              MthStr[LOCALTime.wMonth-1], LOCALTime.wYear, | ||||
|              LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond, | ||||
|              LOCALTime.wMilliseconds); | ||||
|     fprintf(stderr, "\nAfter  HTTP. Date: %s%s\n", timeBuf, tzoneBuf); | ||||
|  | ||||
|     if (AutoSyncTime == 3) { | ||||
|       /* Synchronising computer clock */ | ||||
|       if (!SetSystemTime(&SYSTime)) {  /* Set system time */ | ||||
|         fprintf(stderr, "ERROR: Unable to set system time.\n"); | ||||
|         RetValue = 1; | ||||
|       } | ||||
|       else { | ||||
|         /* Successfully re-adjusted computer clock */ | ||||
|         GetLocalTime(&LOCALTime); | ||||
|         snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ", | ||||
|                  DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay, | ||||
|                  MthStr[LOCALTime.wMonth-1], LOCALTime.wYear, | ||||
|                  LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond, | ||||
|                  LOCALTime.wMilliseconds); | ||||
|         fprintf(stderr, "\nNew System's Date: %s%s\n", timeBuf, tzoneBuf); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /* Cleanup before exit */ | ||||
|     conf_init(conf); | ||||
|     curl_easy_cleanup(curl); | ||||
|   } | ||||
|   return RetValue; | ||||
| } | ||||
| @@ -141,11 +141,18 @@ cookies cURL knows (expired ones, too). Don't forget to | ||||
| cookies (cookies for the handle have not been enabled or simply none have been | ||||
| received) 'struct curl_slist *' will be set to point to NULL. (Added in | ||||
| 7.14.1) | ||||
| .IP CURLINFO_LASTSOCKET | ||||
| Pass a pointer to a long to receive the last socket used by this curl | ||||
| session. If the socket is no longer valid, -1 is returned. When you finish | ||||
| working with the socket, you must call curl_easy_cleanup() as usual and let | ||||
| libcurl close the socket and cleanup other resources associated with the | ||||
| handle. This is typically used in combination with \fICURLOPT_CONNECT_ONLY\fP. | ||||
| (Added in 7.15.2) | ||||
| .SH TIMES | ||||
| .NF | ||||
| An overview of the six time values available from curl_easy_getinfo() | ||||
|  | ||||
| curk_easy_perform() | ||||
| curl_easy_perform() | ||||
|     | | ||||
|     |--NT | ||||
|     |--|--CT | ||||
|   | ||||
| @@ -14,6 +14,17 @@ handle that you must use as input to other easy-functions. curl_easy_init | ||||
| initializes curl and this call \fBMUST\fP have a corresponding call to | ||||
| \fIcurl_easy_cleanup(3)\fP when the operation is complete. | ||||
|  | ||||
| If you did not already call \fIcurl_global_init(3)\fP,  | ||||
| \fIcurl_easy_init(3)\fP does it automatically. | ||||
| This may be lethal in multi-threaded cases, since \fIcurl_global_init(3)\fP is | ||||
| not thread-safe, and it may result in resource problems because there is | ||||
| no corresponding cleanup. | ||||
|  | ||||
| You are strongly advised to not allow this automatic behaviour, by | ||||
| calling \fIcurl_global_init(3)\fP yourself properly. | ||||
| See the description in \fBlibcurl\fP(3) of global environment | ||||
| requirements for details of how to use this function. | ||||
|  | ||||
| .SH RETURN VALUE | ||||
| If this function returns NULL, something went wrong and you cannot use the | ||||
| other curl functions. | ||||
|   | ||||
| @@ -15,8 +15,8 @@ it was just created with \fIcurl_easy_init(3)\fP. | ||||
|  | ||||
| It does not change the following information kept in the handle: live | ||||
| connections, the Session ID cache, the DNS cache, the cookies and shares. | ||||
|  | ||||
| This function was added in libcurl 7.12.1. | ||||
| .SH AVAILABILITY | ||||
| This function was added in libcurl 7.12.1 | ||||
| .SH RETURN VALUE | ||||
| Nothing | ||||
| .SH "SEE ALSO" | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * | ||||
| .\" * This software is licensed as described in the file COPYING, which | ||||
| .\" * you should have received as part of this distribution. The terms | ||||
| @@ -21,9 +21,9 @@ | ||||
| .\" * $Id$ | ||||
| .\" ************************************************************************** | ||||
| .\" | ||||
| .TH curl_easy_setopt 3 "22 Sep 2005" "libcurl 7.14.2" "libcurl Manual" | ||||
| .TH curl_easy_setopt 3 "21 Feb 2006" "libcurl 7.15.2" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_easy_setopt - set options for a curl easy handle | ||||
| curl_easy_setopt \- set options for a curl easy handle | ||||
| .SH SYNOPSIS | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| @@ -169,11 +169,16 @@ added in 7.12.3) | ||||
| .IP CURLOPT_PROGRESSFUNCTION | ||||
| Function pointer that should match the \fIcurl_progress_callback\fP prototype | ||||
| found in \fI<curl/curl.h>\fP. This function gets called by libcurl instead of | ||||
| its internal equivalent with a frequent interval during data transfer. | ||||
| Unknown/unused argument values will be set to zero (like if you only download | ||||
| data, the upload size will remain 0). Returning a non-zero value from this | ||||
| callback will cause libcurl to abort the transfer and return | ||||
| \fICURLE_ABORTED_BY_CALLBACK\fP. | ||||
| its internal equivalent with a frequent interval during data transfer (roughly | ||||
| once per second).  Unknown/unused argument values pass to the callback will be | ||||
| set to zero (like if you only download data, the upload size will remain | ||||
| 0). Returning a non-zero value from this callback will cause libcurl to abort | ||||
| the transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP. | ||||
|  | ||||
| If you transfer data with the multi interface, this function will not be | ||||
| called during periods of idleness unless you call the appropriate libcurl | ||||
| function that performs transfers. Usage of the \fBCURLOPT_PROGRESSFUNCTION\fP | ||||
| callback is not recommended when using the multi interface. | ||||
|  | ||||
| \fICURLOPT_NOPROGRESS\fP must be set to FALSE to make this function actually | ||||
| get called. | ||||
| @@ -270,18 +275,12 @@ debug/trace why errors happen. | ||||
| If the library does not return an error, the buffer may not have been | ||||
| touched. Do not rely on the contents in those cases. | ||||
|  | ||||
| In a few rare cases, there is no text string associated with the error in | ||||
| libcurl and then you may not get a string in the buffer even though it returns | ||||
| an error. This is considered a bug and we appreciate your reports about these | ||||
| cases. Anyway, you can avoid problems with these cases in your program by | ||||
| making sure to clear the first byte of the error buffer before you call | ||||
| curl_easy_perform(). | ||||
| .IP CURLOPT_STDERR | ||||
| Pass a FILE * as parameter. Tell libcurl to use this stream instead of stderr | ||||
| when showing the progress meter and displaying \fICURLOPT_VERBOSE\fP data. | ||||
| .IP CURLOPT_FAILONERROR | ||||
| A non-zero parameter tells the library to fail silently if the HTTP code | ||||
| returned is equal to or larger than 300. The default action would be to return | ||||
| returned is equal to or larger than 400. The default action would be to return | ||||
| the page normally, ignoring that code. | ||||
| .SH NETWORK OPTIONS | ||||
| .IP CURLOPT_URL | ||||
| @@ -325,8 +324,8 @@ 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. | ||||
| .IP CURLOPT_PROXYTYPE | ||||
| Pass a long with this option to set type of the proxy. Available options for | ||||
| this are \fICURLPROXY_HTTP\fP and \fICURLPROXY_SOCKS5\fP, with the HTTP one | ||||
| being default. (Added in 7.10) | ||||
| this are \fICURLPROXY_HTTP\fP, \fICURLPROXY_SOCKS4\fP (added in 7.15.2) | ||||
| \fICURLPROXY_SOCKS5\fP. The HTTP type is default. (Added in 7.10) | ||||
| .IP CURLOPT_HTTPPROXYTUNNEL | ||||
| Set the parameter to non-zero to get the library to tunnel all operations | ||||
| through a given HTTP proxy. There is a big difference between using a proxy | ||||
| @@ -336,6 +335,19 @@ don't want this tunneling option. | ||||
| Pass a char * as parameter. This set the interface name to use as outgoing | ||||
| network interface. The name can be an interface name, an IP address or a host | ||||
| name. | ||||
| .IP CURLOPT_LOCALPORT | ||||
| Pass a long. This sets the local port number of the socket used for | ||||
| connection. This can be used in combination with \fICURLOPT_INTERFACE\fP and | ||||
| you are recommended to use \fICURLOPT_LOCALPORTRANGE\fP as well when this is | ||||
| set. Note that port numbers are only valid 1 - 65535. (Added in 7.15.2) | ||||
| .IP CURLOPT_LOCALPORTRANGE | ||||
| Pass a long. This is the number of attempts libcurl should do to find a | ||||
| working local port number. It starts with the given \fICURLOPT_LOCALPORT\fP | ||||
| and adds one to the number for each retry. Setting this value to 1 or below | ||||
| will make libcurl do only one try for exact port number. Note that port | ||||
| numbers by nature is a scarce resource that will be busy at times so setting | ||||
| this value to something too low might cause unnecessary connection setup | ||||
| failures. (Added in 7.15.2) | ||||
| .IP CURLOPT_DNS_CACHE_TIMEOUT | ||||
| Pass a long, this sets the timeout in seconds. Name resolves will be kept in | ||||
| memory for this number of seconds. Set to zero (0) to completely disable | ||||
| @@ -420,6 +432,11 @@ find the a .netrc file in the current user's home directory. (Added in 7.10.9) | ||||
| Pass a char * as parameter, which should be [user name]:[password] to use for | ||||
| the connection. Use \fICURLOPT_HTTPAUTH\fP to decide authentication method. | ||||
|  | ||||
| When using NTLM, you can set domain by prepending it to the user name and | ||||
| separating the domain and name with a forward (/) or backward slash (\\). Like | ||||
| this: "domain/user:password" or "domain\\user:password". Some HTTP servers (on | ||||
| Windows) support this style even for Basic authentication. | ||||
|  | ||||
| When using HTTP and \fICURLOPT_FOLLOWLOCATION\fP, libcurl might perform | ||||
| several requests to possibly different hosts. libcurl will only send this user | ||||
| and password information to hosts using the initial host name (unless | ||||
| @@ -516,7 +533,9 @@ option is meaningful only when setting \fICURLOPT_FOLLOWLOCATION\fP. | ||||
| Pass a long. The set number will be the redirection limit. If that many | ||||
| redirections have been followed, the next redirect will cause an error | ||||
| (\fICURLE_TOO_MANY_REDIRECTS\fP). This option only makes sense if the | ||||
| \fICURLOPT_FOLLOWLOCATION\fP is used at the same time. | ||||
| \fICURLOPT_FOLLOWLOCATION\fP is used at the same time. Added in 7.15.1: | ||||
| Setting the limit to 0 will make libcurl refuse any redirect. Set it to -1 for | ||||
| an infinite number of redirects (which is the default) | ||||
| .IP CURLOPT_PUT | ||||
| A non-zero parameter tells the library to use HTTP PUT to transfer data. The | ||||
| data should be set with \fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP. | ||||
| @@ -614,15 +633,17 @@ list. If you add a header that is otherwise generated and used by libcurl | ||||
| internally, your added one will be used instead. If you add a header with no | ||||
| contents as in 'Accept:' (no data on the right side of the colon), the | ||||
| internally used header will get disabled. Thus, using this option you can add | ||||
| new headers, replace internal headers and remove internal headers. The | ||||
| headers included in the linked list must not be CRLF-terminated, because | ||||
| curl adds CRLF after each header item. Failure to comply with this will | ||||
| result in strange bugs because the server will most likely ignore part | ||||
| of the headers you specified. | ||||
| new headers, replace internal headers and remove internal headers. To add a | ||||
| header with no contents, make the contents be two quotes: \&"". The headers | ||||
| included in the linked list must not be CRLF-terminated, because curl adds | ||||
| CRLF after each header item. Failure to comply with this will result in | ||||
| strange bugs because the server will most likely ignore part of the headers | ||||
| you specified. | ||||
|  | ||||
| The first line in a request (usually containing a GET or POST) is not a header | ||||
| and cannot be replaced using this option. Only the lines following the | ||||
| request-line are headers. | ||||
| The first line in a request (containing the method, usually a GET or POST) is | ||||
| not a header and cannot be replaced using this option. Only the lines | ||||
| following the request-line are headers. Adding this method line in this list | ||||
| of headers will only cause your request to send an invalid header. | ||||
|  | ||||
| Pass a NULL to this to reset back to no custom headers. | ||||
|  | ||||
| @@ -837,6 +858,23 @@ Exactly like \fICURLOPT_POSTQUOTE\fP, but for the source host. | ||||
| Pass a pointer to a zero-terminated string (or NULL to disable). When an FTP | ||||
| server asks for "account data" after user name and password has been provided, | ||||
| this data is sent off using the ACCT command. (Added in 7.13.0) | ||||
| .IP CURLOPT_FTP_FILEMETHOD | ||||
| Pass a long that should have one of the following values. This option controls | ||||
| what method libcurl should use to reach a file on a FTP(S) server. The | ||||
| argument should be one of the following alternatives: | ||||
| .RS | ||||
| .IP CURLFTPMETHOD_MULTICWD | ||||
| libcurl does a single CWD operation for each path part in the given URL. For | ||||
| deep hierarchies this means very many commands. This is how RFC1738 says it | ||||
| should be done. This is the default but the slowest behavior. | ||||
| .IP CURLFTPMETHOD_NOCWD | ||||
| libcurl does no CWD at all. libcurl will do SIZE, RETR, STOR etc and give a | ||||
| full path to the server for all these commands. This is the fastest behavior. | ||||
| .IP CURLFTPMETHOD_SINGLECWD | ||||
| libcurl does one CWD with the full target directory and then operates on the | ||||
| file \&"normally" (like in the multicwd case). This is somewhat more standards | ||||
| compliant than 'nocwd' but without the full penalty of 'multicwd'. | ||||
| .RE | ||||
| .SH PROTOCOL OPTIONS | ||||
| .IP CURLOPT_TRANSFERTEXT | ||||
| A non-zero parameter tells the library to use ASCII mode for ftp transfers, | ||||
| @@ -1023,6 +1061,14 @@ Resolve to ipv4 addresses. | ||||
| .IP CURL_IPRESOLVE_V6 | ||||
| Resolve to ipv6 addresses. | ||||
| .RE | ||||
| .SH CURLOPT_CONNECT_ONLY | ||||
| Pass a long. A non-zero parameter tells the library to perform any required | ||||
| proxy authentication and connection setup, but no data transfer. | ||||
|  | ||||
| This option is useful with the \fICURLINFO_LASTSOCKET\fP option to | ||||
| \fIcurl_easy_getinfo(3)\fP. The library can set up the connection and then the | ||||
| application can obtain the most recently used socket for special data | ||||
| transfers. (Added in 7.15.2) | ||||
| .SH SSL and SECURITY OPTIONS | ||||
| .IP CURLOPT_SSLCERT | ||||
| Pass a pointer to a zero terminated string as parameter. The string should be | ||||
| @@ -1113,6 +1159,9 @@ 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. | ||||
|  | ||||
| Note that option is by default set to the system path where libcurl's cacert | ||||
| bundle is assumed to be stored, as established at build time. | ||||
| .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 | ||||
| @@ -1132,26 +1181,25 @@ socket. It will be used to seed the random engine for SSL. | ||||
| .IP CURLOPT_SSL_VERIFYHOST | ||||
| Pass a long as parameter. | ||||
|  | ||||
| This option determines whether curl verifies that the server claims to be | ||||
| who you want it to be. | ||||
| This option determines whether libcurl verifies that the server cert is for | ||||
| the server it is known as. | ||||
|  | ||||
| When negotiating an SSL connection, the server sends a certificate | ||||
| indicating its identity. | ||||
| 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. | ||||
| 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. | ||||
| 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 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. | ||||
| When the value is 0, the connection succeeds regardless of the names in the | ||||
| certificate. | ||||
|  | ||||
| The default, since 7.10, is 2. | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,7 @@ curl_easy_strerror - return string describing error code | ||||
| .SH DESCRIPTION | ||||
| The curl_easy_strerror() function returns a string describing the CURLcode | ||||
| error code passed in the argument \fIerrornum\fP. | ||||
|  | ||||
| .SH AVAILABILITY | ||||
| This function was added in libcurl 7.12.0 | ||||
| .SH RETURN VALUE | ||||
| A pointer to a zero terminated string. | ||||
|   | ||||
| @@ -18,10 +18,9 @@ will instead be made "available" by source code access only, and then as | ||||
| curlx_getenv(). | ||||
| .SH RETURN VALUE | ||||
| If successful, curl_getenv() returns a pointer to the value of the specified | ||||
| environment. The memory it refers to is malloc()ed why the application must | ||||
| free() this when the data has completed to serve its purpose. When | ||||
| .I curl_getenv(3) | ||||
| fails to find the specified name, it returns a null pointer. | ||||
| environment. The memory it refers to is malloc()ed so the application must | ||||
| free() this when the data is no longer needed. When \fIcurl_getenv(3)\fP fails | ||||
| to find the specified name, it returns a null pointer. | ||||
| .SH NOTE | ||||
| Under unix operating systems, there isn't any point in returning an allocated | ||||
| memory, although other systems won't work properly if this isn't done. The | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| .\" nroff -man [file] | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .TH curl_global_cleanup 3 "28 May 2001" "libcurl 7.8" "libcurl Manual" | ||||
| .TH curl_global_cleanup 3 "17 Feb 2006" "libcurl 7.8" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_global_cleanup - global libcurl cleanup | ||||
| .SH SYNOPSIS | ||||
| @@ -11,13 +11,22 @@ curl_global_cleanup - global libcurl cleanup | ||||
| .BI "void curl_global_cleanup(void);" | ||||
| .ad | ||||
| .SH DESCRIPTION | ||||
| curl_global_cleanup must be called once (no matter how many threads or libcurl | ||||
| sessions that'll be used) by every application that uses libcurl, after all | ||||
| uses of libcurl is complete. | ||||
| This function releases resources acquired by \fBcurl_global_init(3)\fP. | ||||
|  | ||||
| This is the opposite of \fIcurl_global_init(3)\fP. | ||||
| You should call \fIcurl_global_cleanup(3)\fP once for each call you make to | ||||
| \fIcurl_global_init(3)\fP, after you are done using libcurl. | ||||
|  | ||||
| \fBThis function is not thread safe.\fP You must not call it when any other | ||||
| thread in the program (i.e. a thread sharing the same memory) is running. | ||||
| This doesn't just mean no other thread that is using libcurl.  Because | ||||
| \fBcurl_global_cleanup(3)\fP calls functions of other libraries that are | ||||
| similarly thread unsafe, it could conflict with any other thread that uses | ||||
| these other libraries. | ||||
|  | ||||
| See the description in \fBlibcurl(3)\fP of global environment requirements for | ||||
| details of how to use this function. | ||||
|  | ||||
| Not calling this function may result in memory leaks. | ||||
| .SH "SEE ALSO" | ||||
| .BR curl_global_init "(3), " | ||||
| .BR libcurl "(3), " | ||||
|  | ||||
|   | ||||
| @@ -11,19 +11,30 @@ curl_global_init - Global libcurl initialisation | ||||
| .BI "CURLcode curl_global_init(long " flags ");" | ||||
| .ad | ||||
| .SH DESCRIPTION | ||||
| This function should only be called once (no matter how many threads or | ||||
| libcurl sessions that'll be used) by every application that uses libcurl. | ||||
| This function sets up the program environment that libcurl needs.  Think | ||||
| of it as an extension of the library loader. | ||||
|  | ||||
| If this function hasn't been invoked when \fIcurl_easy_init(3)\fP is called, | ||||
| it will be done automatically by libcurl. | ||||
| This function must be called at least once within a program (a program is | ||||
| all the code that shares a memory space) before the program calls any other | ||||
| function in libcurl.  The environment it sets up is constant for the life | ||||
| of the program and is the same for every program, so multiple calls have | ||||
| the same effect as one call. | ||||
|  | ||||
| The flags option is a bit pattern that tells libcurl exact what features to | ||||
| The flags option is a bit pattern that tells libcurl exactly what features to | ||||
| init, as described below. Set the desired bits by ORing the values together. | ||||
| In normal operation, you must specify CURL_GLOBAL_ALL.  Don't use any other | ||||
| value unless you are familiar with and mean to control internal operations | ||||
| of libcurl. | ||||
|  | ||||
| You must however \fBalways\fP use the \fIcurl_global_cleanup(3)\fP function, | ||||
| as that cannot be called automatically for you by libcurl. | ||||
| \fBThis function is not thread safe.\fP  You must not call it when any | ||||
| other thread in the program (i.e. a thread sharing the same memory) is | ||||
| running.  This doesn't just mean no other thread that is using | ||||
| libcurl.  Because \fIcurl_global_init()\fP calls functions of other | ||||
| libraries that are similarly thread unsafe, it could conflict with any | ||||
| other thread that uses these other libraries. | ||||
|  | ||||
| Calling this function more than once will cause unpredictable results. | ||||
| See the description in \fBlibcurl\fP(3) of global environment | ||||
| requirements for details of how to use this function. | ||||
|  | ||||
| .SH FLAGS | ||||
| .TP 5 | ||||
| @@ -44,3 +55,5 @@ other curl functions. | ||||
| .SH "SEE ALSO" | ||||
| .BR curl_global_init_mem "(3), " | ||||
| .BR curl_global_cleanup "(3), " | ||||
| .BR curl_easy_init "(3) " | ||||
| .BR libcurl "(3) " | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .TH curl_multi_fdset 3 "25 Apr 2005" "libcurl 7.9.5" "libcurl Manual" | ||||
| .TH curl_multi_fdset 3 "2 Jan 2006" "libcurl 7.16.0" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_multi_fdset - extracts file descriptor information from a multi handle | ||||
| .SH SYNOPSIS | ||||
| @@ -30,8 +30,12 @@ rather small (single-digit number of seconds) timeout and call | ||||
| \fIcurl_multi_perform\fP regularly - even if no activity has been seen on the | ||||
| fd_sets - as otherwise libcurl-internal retries and timeouts may not work as | ||||
| you'd think and want. | ||||
|  | ||||
| Starting with libcurl 7.16.0, you should use \fBcurl_multi_timeout\fP to | ||||
| figure out how long to wait for action. | ||||
| .SH RETURN VALUE | ||||
| CURLMcode type, general libcurl multi interface error code. See | ||||
| \fIlibcurl-errors(3)\fP | ||||
| .SH "SEE ALSO" | ||||
| .BR curl_multi_cleanup "(3)," curl_multi_init "(3)" | ||||
| .BR curl_multi_cleanup "(3)," curl_multi_init "(3), " | ||||
| .BR curl_multi_timeout "(3) " | ||||
|   | ||||
| @@ -36,9 +36,9 @@ NOTE that this only returns errors etc regarding the whole multi stack. There | ||||
| might still have occurred problems on individual transfers even when this | ||||
| function returns OK. | ||||
| .SH "TYPICAL USAGE" | ||||
| Most application will use \fIcurl_multi_fdset(3)\fP to get the multi_handle's | ||||
| file descriptors, then it'll wait for action on them using select() and as | ||||
| soon as one or more of them are ready, \fIcurl_multi_perform(3)\fP gets | ||||
| Most applications will use \fIcurl_multi_fdset(3)\fP to get the multi_handle's | ||||
| file descriptors, then it'll wait for action on them using \fBselect(3)\fP and | ||||
| as soon as one or more of them are ready, \fIcurl_multi_perform(3)\fP gets | ||||
| called. | ||||
| .SH "SEE ALSO" | ||||
| .BR curl_multi_cleanup "(3), " curl_multi_init "(3), " | ||||
|   | ||||
							
								
								
									
										42
									
								
								docs/libcurl/curl_multi_setopt.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								docs/libcurl/curl_multi_setopt.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .TH curl_multi_setopt 3 "8 Jan 2006" "libcurl 7.16.0" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_multi_setopt \- set options for a curl multi handle | ||||
| .SH SYNOPSIS | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| CURLMcode curl_multi_setopt(CURLM * multi_handle, CURLMoption option, param); | ||||
| .SH DESCRIPTION | ||||
| curl_multi_setopt() is used to tell a libcurl multi handle how to behave. By | ||||
| using the appropriate options to \fIcurl_multi_setopt\fP, you can change | ||||
| libcurl's behaviour when using that multi handle.  All options are set with | ||||
| the \fIoption\fP followed by the parameter \fIparam\fP. That parameter can be | ||||
| a \fBlong\fP, a \fBfunction pointer\fP, an \fBobject pointer\fP or a | ||||
| \fBcurl_off_t\fP type, depending on what the specific option expects. Read | ||||
| this manual carefully as bad input values may cause libcurl to behave badly! | ||||
| You can only set one option in each function call. | ||||
|  | ||||
| .SH OPTIONS | ||||
| .IP CURLMOPT_SOCKETFUNCTION | ||||
| Pass a pointer to a function matching the curl_socket_callback prototype. The | ||||
| \fIcurl_multi_socket(3)\fP functions inform the application about updates in | ||||
| the socket (file descriptor) status by doing none, one or multiple calls to | ||||
| the curl_socket_callback given in the \fBparam\fP argument. They update the | ||||
| status with changes since the previous time a \fIcurl_multi_socket(3)\fP | ||||
| function was called. If the given callback pointer is NULL, no callback will | ||||
| be called. Set the callback's fourth argument with \fICURLMOPT_SOCKETDATA\fP. | ||||
| See \fIcurl_multi_socket(3)\fP for more callback details. | ||||
| .IP CURLMOPT_SOCKETDATA | ||||
| Pass a pointer to whatever you want passed to the curl_socket_callback's forth | ||||
| argument, the userp pointer. This is not used by libcurl but only passed-thru | ||||
| as-is. Set the callback pointer with \fICURLMOPT_SOCKETFUNCTION\fP. | ||||
| .SH RETURNS | ||||
| The standard CURLMcode for multi interface error codes. Note that it returns a | ||||
| CURLM_UNKNOWN_OPTION if you try setting an option that this version of libcurl | ||||
| doesn't know of. | ||||
| .SH AVAILABILITY | ||||
| This function was added in libcurl 7.16.0 | ||||
| .SH "SEE ALSO" | ||||
| .BR curl_multi_cleanup "(3), " curl_multi_init "(3), " | ||||
| .BR curl_multi_socket "(3), " curl_multi_info_read "(3)" | ||||
							
								
								
									
										96
									
								
								docs/libcurl/curl_multi_socket.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								docs/libcurl/curl_multi_socket.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .TH curl_multi_socket 3 "21 Dec 2005" "libcurl 7.16.0" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_multi_socket \- reads/writes available data | ||||
| .SH SYNOPSIS | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| CURLMcode curl_multi_socket(CURLM * multi_handle, curl_socket_t sockfd); | ||||
|  | ||||
| CURLMcode curl_multi_socket_all(CURLM *multi_handle); | ||||
| .SH DESCRIPTION | ||||
| Alternative versions of \fIcurl_multi_perform()\fP that allows the application | ||||
| to pass in one of the file descriptors/sockets 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 action. When the | ||||
| application has detected action on a socket handled by libcurl, it should call | ||||
| \fIcurl_multi_perform()\fP with the \fBsockfd\fP argument set to the socket | ||||
| with the action. | ||||
|  | ||||
| These functions inform the application about updates in the socket (file | ||||
| descriptor) status by doing none, one or multiple calls to the | ||||
| curl_socket_callback given with the CURLMOPT_SOCKETFUNCTION option to | ||||
| \fIcurl_multi_setopt(3)\fP. They update the status with changes since the | ||||
| previous time this function was called. | ||||
|  | ||||
| If you want to force libcurl to (re-)check all its internal sockets and | ||||
| transfers instead of just a single one, you call | ||||
| \fBcurl_multi_socket_all(3)\fP instead. | ||||
|  | ||||
| An application should call \fBcurl_multi_timeout(3)\fP to figure out how long | ||||
| it should wait for socket actions \- at most \- before doing the timeout | ||||
| action: call the \fBcurl_multi_socket(3)\fP function with the \fBsockfd\fP | ||||
| argument set to CURL_SOCKET_TIMEOUT. | ||||
|  | ||||
| The socket \fBcallback\fP function uses a prototype like this | ||||
| .nf | ||||
|  | ||||
|      int curl_socket_callback(CURL *easy,      /* easy handle */ | ||||
|                               curl_socket_t s, /* socket */ | ||||
|                               int action,      /* see values below */ | ||||
|                               void *userp);    /* "private" pointer */ | ||||
|  | ||||
| .fi | ||||
| The callback MUST return 0. | ||||
|  | ||||
| The \fIaction\fP (third) argument to the callback has one of five values: | ||||
| .RS | ||||
| .IP "CURL_POLL_NONE (0)" | ||||
| register, not interested in readiness (yet) | ||||
| .IP "CURL_POLL_IN (1)" | ||||
| register, interested in read readiness | ||||
| .IP "CURL_POLL_OUT (2)" | ||||
| register, interested in write readiness | ||||
| .IP "CURL_POLL_INOUT (3)" | ||||
| register, interested in both read and write readiness | ||||
| .IP "CURL_POLL_REMOVE (4)" | ||||
| deregister | ||||
| .RE | ||||
| .SH "RETURN VALUE" | ||||
| CURLMcode type, general libcurl multi interface error code. | ||||
|  | ||||
| If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this basically means that you | ||||
| should call \fIcurl_multi_perform\fP again, before you wait for more actions | ||||
| on libcurl's sockets. You don't have to do it immediately, but the return code | ||||
| means that libcurl may have more data available to return or that there may be | ||||
| more data to send off before it is "satisfied". | ||||
|  | ||||
| NOTE that this only returns errors etc regarding the whole multi stack. There | ||||
| might still have occurred problems on individual transfers even when this | ||||
| function returns OK. | ||||
| .SH "TYPICAL USAGE" | ||||
| 1. Create a multi handle | ||||
|  | ||||
| 2. Set the socket callback with CURLMOPT_SOCKETFUNCTION | ||||
|  | ||||
| 3. Add easy handles | ||||
|  | ||||
| 4. Call curl_multi_socket_all() first once | ||||
|  | ||||
| 5. Setup a "collection" of sockets to supervise when your socket | ||||
| callback is called. | ||||
|  | ||||
| 6. Use curl_multi_timeout() to figure out how long to wait for action | ||||
|  | ||||
| 7. Wait for action on any of libcurl's sockets | ||||
|  | ||||
| 8, When action happens, call curl_multi_socket() for the socket(s) that got | ||||
| action. | ||||
|  | ||||
| 9. Go back to step 6. | ||||
| .SH AVAILABILITY | ||||
| This function was added in libcurl 7.16.0 | ||||
| .SH "SEE ALSO" | ||||
| .BR curl_multi_cleanup "(3), " curl_multi_init "(3), " | ||||
| .BR curl_multi_fdset "(3), " curl_multi_info_read "(3)" | ||||
							
								
								
									
										1
									
								
								docs/libcurl/curl_multi_socket_all.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								docs/libcurl/curl_multi_socket_all.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| .so man3/curl_multi_socket.3 | ||||
| @@ -12,7 +12,7 @@ curl_multi_strerror - return string describing error code | ||||
| .SH DESCRIPTION | ||||
| The curl_multi_strerror() function returns a string describing the CURLMcode | ||||
| error code passed in the argument \fIerrornum\fP. | ||||
|  | ||||
| .SH AVAILABILITY | ||||
| This function was added in libcurl 7.12.0 | ||||
| .SH RETURN VALUE | ||||
| A pointer to a zero terminated string. | ||||
|   | ||||
							
								
								
									
										38
									
								
								docs/libcurl/curl_multi_timeout.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								docs/libcurl/curl_multi_timeout.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .TH curl_multi_timeout 3 "2 Jan 2006" "libcurl 7.16.0" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_multi_timeout \- how long to wait for action before proceeding | ||||
| .SH SYNOPSIS | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| CURLMcode curl_multi_timeout(CURLM *multi_handle, long *timeout); | ||||
| .SH DESCRIPTION | ||||
|  | ||||
| An application using the libcurl multi interface should call | ||||
| \fBcurl_multi_timeout(3)\fP to figure out how long it should wait for socket | ||||
| actions \- at most \- before proceeding. | ||||
|  | ||||
| Proceeding means either doing the socket-style timeout action: call the | ||||
| \fBcurl_multi_socket(3)\fP function with the \fBsockfd\fP argument set to | ||||
| CURL_SOCKET_TIMEOUT and the \fBeasy\fP argument set to CURL_EASY_TIMEOUT, or | ||||
| simply calling \fBcurl_multi_perform(3)\fP if you're using the simpler and | ||||
| older multi interface approach. | ||||
|  | ||||
| The timeout value returned in the long \fBtimeout\fP points to, is in number | ||||
| of milliseconds at this very moment. If 0, it means you should proceed | ||||
| immediately without waiting for anything. If it returns -1, there's no timeout | ||||
| at all set. | ||||
| .SH "RETURN VALUE" | ||||
| The standard CURLMcode for multi interface error codes. | ||||
| .SH "TYPICAL USAGE" | ||||
| Call \fBcurl_multi_timeout(3)\fP, then wait for action on the sockets. You | ||||
| figure out which sockets to wait for by calling \fBcurl_multi_fdset(3)\fP or | ||||
| by a previous call to \fBcurl_multi_socket(3)\fP. | ||||
| .SH AVAILABILITY | ||||
| This function was added in libcurl 7.16.0 | ||||
| .SH "SEE ALSO" | ||||
| .BR curl_multi_cleanup "(3), " curl_multi_init "(3), " | ||||
| .BR curl_multi_fdset "(3), " curl_multi_info_read "(3), " | ||||
| .BR curl_multi_socket "(3) " | ||||
|  | ||||
| @@ -12,7 +12,7 @@ curl_share_strerror - return string describing error code | ||||
| .SH DESCRIPTION | ||||
| The curl_share_strerror() function returns a string describing the CURLSHcode | ||||
| error code passed in the argument \fIerrornum\fP. | ||||
|  | ||||
| .SH AVAILABILITY | ||||
| This function was added in libcurl 7.12.0 | ||||
| .SH RETURN VALUE | ||||
| A pointer to a zero terminated string. | ||||
|   | ||||
| @@ -38,9 +38,9 @@ Couldn't resolve host. The given remote host was not resolved. | ||||
| .IP "CURLE_COULDNT_CONNECT (7)" | ||||
| Failed to connect() to host or proxy. | ||||
| .IP "CURLE_FTP_WEIRD_SERVER_REPLY (8)" | ||||
| After connecting to an FTP server, libcurl expects to get a certain reply back. | ||||
| This error code implies that it god a strange or bad reply. The given remote | ||||
| server is probably not an OK FTP server. | ||||
| After connecting to an FTP server, libcurl expects to get a certain reply | ||||
| back. This error code implies that it got a strange or bad reply. The given | ||||
| remote server is probably not an OK FTP server. | ||||
| .IP "CURLE_FTP_ACCESS_DENIED (9)" | ||||
| We were denied access when trying to login to an FTP server or when trying to | ||||
| change working directory to the one given in the URL. | ||||
| @@ -210,6 +210,9 @@ An easy handle was not good/valid. | ||||
| You are doomed. | ||||
| .IP "CURLM_INTERNAL_ERROR (4)" | ||||
| This can only be returned if libcurl bugs. Please report it to us! | ||||
| .IP "CURLM_BAD_SOCKET (5)" | ||||
| The passed-in socket is not a valid one that libcurl already knows about. | ||||
| (Added in 7.16.0) | ||||
| .SH "CURLSHcode" | ||||
| The "share" interface will return a CURLSHcode to indicate when an error has | ||||
| occurred.  Also consider \fIcurl_share_strerror(3)\fP. | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * | ||||
| .\" * This software is licensed as described in the file COPYING, which | ||||
| .\" * you should have received as part of this distribution. The terms | ||||
| @@ -133,10 +133,11 @@ Repeated calls to \fIcurl_global_init(3)\fP and \fIcurl_global_cleanup(3)\fP | ||||
| should be avoided. They should only be called once each. | ||||
|  | ||||
| .SH "Features libcurl Provides" | ||||
| It is considered best-practice to determine libcurl features run-time rather | ||||
| than build-time (if possible of course). By calling curl_version_info() and | ||||
| checking tout he details of the returned struct, your program can figure out | ||||
| exactly what the currently running libcurl supports. | ||||
| It is considered best-practice to determine libcurl features at run-time | ||||
| rather than at build-time (if possible of course). By calling | ||||
| \fIcurl_version_info(3)\fP and checking out the details of the returned | ||||
| struct, your program can figure out exactly what the currently running libcurl | ||||
| supports. | ||||
|  | ||||
| .SH "Handle the Easy libcurl" | ||||
| libcurl first introduced the so called easy interface. All operations in the | ||||
| @@ -267,11 +268,13 @@ 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 | ||||
| with c-ares support. c-ares is a library that provides asynchronous name | ||||
| resolves. Unfortunately, c-ares does not yet support IPv6. | ||||
| When using multiple threads you should set the CURLOPT_NOSIGNAL option to TRUE | ||||
| for all handles. Everything will or might work fine except that timeouts are | ||||
| not honored during the DNS lookup - which you can work around by building | ||||
| libcurl with c-ares support. c-ares is a library that provides asynchronous | ||||
| name resolves. Unfortunately, c-ares does not yet fully support IPv6. On some | ||||
| platforms, libcurl simply will not function properly multi-threaded unless | ||||
| this option is set. | ||||
|  | ||||
| Also, note that CURLOPT_DNS_USE_GLOBAL_CACHE is not thread-safe. | ||||
|  | ||||
| @@ -887,12 +890,12 @@ data size is unknown. | ||||
|  | ||||
| There's only one aspect left in the HTTP requests that we haven't yet | ||||
| mentioned how to modify: the version field. All HTTP requests includes the | ||||
| version number to tell the server which version we support. libcurl speak | ||||
| HTTP 1.1 by default. Some very old servers don't like getting 1.1-requests | ||||
| and when dealing with stubborn old things like that, you can tell libcurl | ||||
| to use 1.0 instead by doing something like this: | ||||
| version number to tell the server which version we support. libcurl speak HTTP | ||||
| 1.1 by default. Some very old servers don't like getting 1.1-requests and when | ||||
| dealing with stubborn old things like that, you can tell libcurl to use 1.0 | ||||
| instead by doing something like this: | ||||
|  | ||||
|  curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION, CURLHTTP_VERSION_1_0); | ||||
|  curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); | ||||
|  | ||||
| .IP "FTP Custom Commands" | ||||
|  | ||||
|   | ||||
| @@ -13,10 +13,11 @@ in-depth understanding on how to program with libcurl. | ||||
| There are more than a twenty custom bindings available that bring libcurl | ||||
| access to your favourite language. Look elsewhere for documentation on those. | ||||
|  | ||||
| All applications that use libcurl should call \fIcurl_global_init(3)\fP | ||||
| exactly once before any libcurl function can be used. After all usage of | ||||
| libcurl is complete, it \fBmust\fP call \fIcurl_global_cleanup(3)\fP. In | ||||
| between those two calls, you can use libcurl as described below. | ||||
| libcurl has a global constant environment that you must set up and | ||||
| maintain while using libcurl.  This essentially means you call | ||||
| \fIcurl_global_init(3)\fP at the start of your program and | ||||
| \fIcurl_global_cleanup(3)\fP at the end.  See GLOBAL CONSTANTS below | ||||
| for details. | ||||
|  | ||||
| To transfer files, you always set up an "easy handle" using | ||||
| \fIcurl_easy_init(3)\fP, but when you want the file(s) transferred you have | ||||
| @@ -86,6 +87,10 @@ Never ever call curl-functions simultaneously using the same handle from | ||||
| several threads. libcurl is thread-safe and can be used in any number of | ||||
| threads, but you must use separate curl handles if you want to use libcurl in | ||||
| more than one thread simultaneously. | ||||
|  | ||||
| The global environment functions are not thread-safe.  See GLOBAL CONSTANTS | ||||
| below for details. | ||||
|  | ||||
| .SH "PERSISTENT CONNECTIONS" | ||||
| Persistent connections means that libcurl can re-use the same connection for | ||||
| several transfers, if the conditions are right. | ||||
| @@ -103,3 +108,96 @@ libcurl will be closed and forgotten. | ||||
|  | ||||
| Note that the options set with \fIcurl_easy_setopt(3)\fP will be used in on | ||||
| every repeated \fIcurl_easy_perform(3)\fP call. | ||||
|  | ||||
| .SH "GLOBAL CONSTANTS" | ||||
| There are a variety of constants that libcurl uses, mainly through its | ||||
| internal use of other libraries, which are too complicated for the | ||||
| library loader to set up.  Therefore, a program must call a library | ||||
| function after the program is loaded and running to finish setting up | ||||
| the library code.  For example, when libcurl is built for SSL | ||||
| capability via the GNU TLS library, there is an elaborate tree inside | ||||
| that library that describes the SSL protocol. | ||||
|  | ||||
| \fIcurl_global_init()\fP is the function that you must call.  This may | ||||
| allocate resources (e.g. the memory for the GNU TLS tree mentioned | ||||
| above), so the companion function \fIcurl_global_cleanup()\fP releases | ||||
| them. | ||||
|  | ||||
| The basic rule for constructing a program that uses libcurl is this: | ||||
| Call \fIcurl_global_init()\fP, with a \fICURL_GLOBAL_ALL\fP argument, | ||||
| immediately after the program starts, while it is still only one | ||||
| thread and before it uses libcurl at all.  Call | ||||
| \fIcurl_global_cleanup()\fP immediately before the program exits, when | ||||
| the program is again only one thread and after its last use of | ||||
| libcurl. | ||||
|  | ||||
| You can call both of these multiple times, as long as all calls meet | ||||
| these requirements and the number of calls to each is the same. | ||||
|  | ||||
| It isn't actually required that the functions be called at the beginning | ||||
| and end of the program -- that's just usually the easiest way to do it. | ||||
| It \fIis\fP required that the functions be called when no other thread | ||||
| in the program is running. | ||||
|  | ||||
| These global constant functions are \fInot thread safe\fP, so you must | ||||
| not call them when any other thread in the program is running.  It | ||||
| isn't good enough that no other thread is using libcurl at the time, | ||||
| because these functions internally call similar functions of other | ||||
| libraries, and those functions are similarly thread-unsafe.  You can't | ||||
| generally know what these libraries are, or whether other threads are | ||||
| using them. | ||||
|  | ||||
| The global constant situation merits special consideration when the | ||||
| code you are writing to use libcurl is not the main program, but rather | ||||
| a modular piece of a program, e.g. another library.  As a module, | ||||
| your code doesn't know about other parts of the program -- it doesn't | ||||
| know whether they use libcurl or not.  And its code doesn't necessarily | ||||
| run at the start and end of the whole program. | ||||
|  | ||||
| A module like this must have global constant functions of its own, | ||||
| just like \fIcurl_global_init()\fP and \fIcurl_global_cleanup()\fP. | ||||
| The module thus has control at the beginning and end of the program | ||||
| and has a place to call the libcurl functions.  Note that if multiple | ||||
| modules in the program use libcurl, they all will separately call the | ||||
| libcurl functions, and that's OK because only the first | ||||
| \fIcurl_global_init()\fP and the last \fIcurl_global_cleanup()\fP in a | ||||
| program changes anything.  (libcurl uses a reference count in static | ||||
| memory). | ||||
|  | ||||
| In a C++ module, it is common to deal with the global constant | ||||
| situation by defining a special class that represents the global | ||||
| constant environment of the module.  A program always has exactly one | ||||
| object of the class, in static storage.  That way, the program | ||||
| automatically calls the constructor of the object as the program | ||||
| starts up and the destructor as it terminates.  As the author of this | ||||
| libcurl-using module, you can make the constructor call | ||||
| \fIcurl_global_init()\fP and the destructor call | ||||
| \fIcurl_global_cleanup()\fP and satisfy libcurl's requirements without | ||||
| your user having to think about it. | ||||
|  | ||||
| \fIcurl_global_init()\fP has an argument that tells what particular | ||||
| parts of the global constant environment to set up.  In order to | ||||
| successfully use any value except \fICURL_GLOBAL_ALL\fP (which says to | ||||
| set up the whole thing), you must have specific knowledge of internal | ||||
| workings of libcurl and all other parts of the program of which it is | ||||
| part. | ||||
|  | ||||
| A special part of the global constant environment is the identity of | ||||
| the memory allocator.  \fIcurl_global_init()\fP selects the system | ||||
| default memory allocator, but you can use \fIcurl_global_init_mem()\fP | ||||
| to supply one of your own.  However, there is no way to use | ||||
| \fIcurl_global_init_mem()\fP in a modular program -- all modules in | ||||
| the program that might use libcurl would have to agree on one | ||||
| allocator. | ||||
|  | ||||
| There is a failsafe in libcurl that makes it usable in simple | ||||
| situations without you having to worry about the global constant | ||||
| environment at all: \fIcurl_easy_init()\fP sets up the environment | ||||
| itself if it hasn't been done yet.  The resources it acquires to do so | ||||
| get released by the operating system automatically when the program | ||||
| exits. | ||||
|  | ||||
| This failsafe feature exists mainly for backward compatibility because | ||||
| there was a time when the global functions didn't exist.  Because it | ||||
| is sufficient only in the simplest of programs, it is not recommended | ||||
| for any program to rely on it. | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| # LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION], | ||||
| #                       [ACTION-IF-YES], [ACTION-IF-NO]) | ||||
| # ---------------------------------------------------------- | ||||
| #      David Shaw <dshaw@jabberwocky.com>   Jun-21-2005 | ||||
| #      David Shaw <dshaw@jabberwocky.com>   Jan-17-2006 | ||||
| # | ||||
| # Checks for libcurl.  DEFAULT-ACTION is the string yes or no to | ||||
| # specify whether to default to --with-libcurl or --without-libcurl. | ||||
| @@ -13,10 +13,10 @@ | ||||
| # ACTION-IF-NO is a list of shell commands that are run otherwise. | ||||
| # Note that using --without-libcurl does run ACTION-IF-NO. | ||||
| # | ||||
| # This macro defines HAVE_LIBCURL if a working libcurl setup is found, | ||||
| # and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary values. | ||||
| # Other useful defines are LIBCURL_FEATURE_xxx where xxx are the | ||||
| # various features supported by libcurl, and LIBCURL_PROTOCOL_yyy | ||||
| # This macro #defines HAVE_LIBCURL if a working libcurl setup is | ||||
| # found, and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary | ||||
| # values.  Other useful defines are LIBCURL_FEATURE_xxx where xxx are | ||||
| # the various features supported by libcurl, and LIBCURL_PROTOCOL_yyy | ||||
| # where yyy are the various protocols supported by libcurl.  Both xxx | ||||
| # and yyy are capitalized.  See the list of AH_TEMPLATEs at the top of | ||||
| # the macro for the complete list of possible defines.  Shell | ||||
| @@ -32,7 +32,8 @@ | ||||
| # 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 guess what protocols are available. | ||||
| # Without curl-config, we can only guess what protocols are available, | ||||
| # or use curl_version_info to figure it out at runtime. | ||||
|  | ||||
| AC_DEFUN([LIBCURL_CHECK_CONFIG], | ||||
| [ | ||||
| @@ -41,16 +42,19 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG], | ||||
|   AH_TEMPLATE([LIBCURL_FEATURE_IPV6],[Defined if libcurl supports IPv6]) | ||||
|   AH_TEMPLATE([LIBCURL_FEATURE_LIBZ],[Defined if libcurl supports libz]) | ||||
|   AH_TEMPLATE([LIBCURL_FEATURE_ASYNCHDNS],[Defined if libcurl supports AsynchDNS]) | ||||
|   AH_TEMPLATE([LIBCURL_FEATURE_IDN],[Defined if libcurl supports IDN]) | ||||
|   AH_TEMPLATE([LIBCURL_FEATURE_SSPI],[Defined if libcurl supports SSPI]) | ||||
|   AH_TEMPLATE([LIBCURL_FEATURE_NTLM],[Defined if libcurl supports NTLM]) | ||||
|  | ||||
|   AH_TEMPLATE([LIBCURL_PROTOCOL_HTTP],[Defined if libcurl supports HTTP]) | ||||
|   AH_TEMPLATE([LIBCURL_PROTOCOL_HTTPS],[Defined if libcurl supports HTTPS]) | ||||
|   AH_TEMPLATE([LIBCURL_PROTOCOL_FTP],[Defined if libcurl supports FTP]) | ||||
|   AH_TEMPLATE([LIBCURL_PROTOCOL_FTPS],[Defined if libcurl supports FTPS]) | ||||
|   AH_TEMPLATE([LIBCURL_PROTOCOL_GOPHER],[Defined if libcurl supports GOPHER]) | ||||
|   AH_TEMPLATE([LIBCURL_PROTOCOL_FILE],[Defined if libcurl supports FILE]) | ||||
|   AH_TEMPLATE([LIBCURL_PROTOCOL_TELNET],[Defined if libcurl supports TELNET]) | ||||
|   AH_TEMPLATE([LIBCURL_PROTOCOL_LDAP],[Defined if libcurl supports LDAP]) | ||||
|   AH_TEMPLATE([LIBCURL_PROTOCOL_DICT],[Defined if libcurl supports DICT]) | ||||
|   AH_TEMPLATE([LIBCURL_PROTOCOL_TFTP],[Defined if libcurl supports TFTP]) | ||||
|  | ||||
|   AC_ARG_WITH(libcurl, | ||||
|      AC_HELP_STRING([--with-libcurl=DIR],[look for the curl library in DIR]), | ||||
| @@ -65,11 +69,12 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG], | ||||
|      _libcurl_try_link=yes | ||||
|  | ||||
|      if test -d "$_libcurl_with" ; then | ||||
|         CPPFLAGS="${CPPFLAGS} -I$withval/include" | ||||
|         LDFLAGS="${LDFLAGS} -L$withval/lib" | ||||
|      fi | ||||
|  | ||||
|         LIBCURL_CPPFLAGS="-I$withval/include" | ||||
|         _libcurl_ldflags="-L$withval/lib" | ||||
|         AC_PATH_PROG([_libcurl_config],["$withval/bin/curl-config"]) | ||||
|      else | ||||
| 	AC_PATH_PROG([_libcurl_config],[curl-config]) | ||||
|      fi | ||||
|  | ||||
|      if test x$_libcurl_config != "x" ; then | ||||
|         AC_CACHE_CHECK([for the version of libcurl], | ||||
| @@ -126,15 +131,15 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG], | ||||
|  | ||||
|         # we didn't find curl-config, so let's see if the user-supplied | ||||
|         # link line (or failing that, "-lcurl") is enough. | ||||
|         LIBCURL=${LIBCURL-"-lcurl"} | ||||
|         LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"} | ||||
|  | ||||
|         AC_CACHE_CHECK([whether libcurl is usable], | ||||
|            [libcurl_cv_lib_curl_usable], | ||||
|            [ | ||||
|            _libcurl_save_cppflags=$CPPFLAGS | ||||
|            CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" | ||||
|            CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS" | ||||
|            _libcurl_save_libs=$LIBS | ||||
|            LIBS="$LIBS $LIBCURL" | ||||
|            LIBS="$LIBCURL $LIBS" | ||||
|  | ||||
|            AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[ | ||||
| /* Try and use a few common options to force a failure if we are | ||||
| @@ -188,7 +193,7 @@ x=CURLOPT_VERBOSE; | ||||
|  | ||||
| 	      # We don't have --protocols, so just assume that all | ||||
| 	      # protocols are available | ||||
| 	      _libcurl_protocols="HTTP FTP GOPHER FILE TELNET LDAP DICT" | ||||
| 	      _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT" | ||||
|  | ||||
| 	      if test x$libcurl_feature_SSL = xyes ; then | ||||
| 	         _libcurl_protocols="$_libcurl_protocols HTTPS" | ||||
| @@ -216,6 +221,7 @@ x=CURLOPT_VERBOSE; | ||||
|      unset _libcurl_protocol | ||||
|      unset _libcurl_protocols | ||||
|      unset _libcurl_version | ||||
|      unset _libcurl_ldflags | ||||
|   fi | ||||
|  | ||||
|   if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then | ||||
|   | ||||
							
								
								
									
										31
									
								
								hiper/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								hiper/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| # | ||||
| # Build a little app for the Hiper project | ||||
| # During dev at least, we use a static libcurl. | ||||
| # | ||||
|  | ||||
| LDFLAGS = -lcrypt -lidn -lssl -lcrypto -ldl -lz -lresolv -L../ares/.libs -lcares | ||||
| LIBCURL = -L../lib/.libs/ -lcurl | ||||
| CFLAGS = -I../include -g -DHAVE_CURL_MULTI_SOCKET | ||||
|  | ||||
| all: shiper hiper ulimiter | ||||
|  | ||||
| hiper: hiper.o $(LIBCURL) | ||||
| 	$(CC) -o $@ $< $(LIBCURL) $(LDFLAGS) | ||||
|  | ||||
| hiper.o: hiper.c | ||||
| 	$(CC) $(CFLAGS) -c $< | ||||
|  | ||||
| shiper: shiper.o $(LIBCURL) | ||||
| 	$(CC) -o $@ $< $(LIBCURL) $(LDFLAGS) | ||||
|  | ||||
| shiper.o: shiper.c | ||||
| 	$(CC) $(CFLAGS) -c $< | ||||
|  | ||||
| ulimiter: ulimiter.c | ||||
| 	$(CC) -o $@ $< | ||||
|  | ||||
| clean: | ||||
| 	rm -f hiper.o hiper shiper shiper.o *~ ulimiter | ||||
|  | ||||
| $(LIBCURL): | ||||
| 	(cd ../lib && make) | ||||
							
								
								
									
										240
									
								
								hiper/STATUS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										240
									
								
								hiper/STATUS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,240 @@ | ||||
| Date:   January 5, 2006 | ||||
| Author: Daniel Stenberg | ||||
|  | ||||
|        Status of project Hiper - high performance libcurl modifications | ||||
|        ================================================================ | ||||
|  | ||||
| What is Hiper | ||||
|  | ||||
|   You won't find such a description in this document. See | ||||
|   http://curl.haxx.se/libcurl/hiper/ for further details. | ||||
|  | ||||
| Live Progress Info | ||||
|  | ||||
|   During my work, I've posted occational updates on the curl-library mailing | ||||
|   list but more importantly done frequent updates of | ||||
|   http://curl.haxx.se/libcurl/hiper/schedule.html | ||||
|  | ||||
| Schedule | ||||
|  | ||||
|   I took time off my regular job during Decemember 2005 and the first week of | ||||
|   January 2006 to work on hiper full-time. | ||||
|  | ||||
| Step 1 - Measure the Existing Solution | ||||
|  | ||||
|   I started full-time work on project Hiper on December 1st 2005. I began by | ||||
|   putting together a test application that used the existing API to allow me | ||||
|   to properly and with accuracy measure execution and transfer speeds when | ||||
|   doing a large amount of transfers. | ||||
|  | ||||
|   I soon discovered that it was impossible to do any sensible measurements by | ||||
|   using live and actual URLs since the transfers were too unrelialble and | ||||
|   uncontrolled. I then enhanced the current HTTP server in the curl test suite | ||||
|   and made that support a large amount of transfers and some extra magic | ||||
|   "commands" that would make the server either just sit "idle" or "stream" | ||||
|   (continuously sending data in a never-ending stream). I then wrote up two | ||||
|   files using the curl test suite file format and by acessing the properly | ||||
|   formatted URLs on my localhost the HTTP server would either run "idle" or | ||||
|   run "stream". | ||||
|  | ||||
|   Having this working, I patched libcurl to always only recv() a single byte | ||||
|   off the network each time, just to make sure that the time spent on reading | ||||
|   data is constant and never very long. | ||||
|  | ||||
|   I adjusted the test application (actually called 'hiper') to create Y idle | ||||
|   transfers and Z stream transfers, had it run for N seconds and then quit and | ||||
|   produce a summary on stdout. Now I got very solid and repeatable results. I | ||||
|   started to run repeated tests and save the results when I ran into the | ||||
|   dreaded 1024 socket maximum limit. | ||||
|  | ||||
|   One side of the problem is that the fd_set type only allows 1024 file | ||||
|   descriptors (on my Linux), which I had to solve by simply making my own type | ||||
|   with room for more connections and do ugly typecasts in the code. The other | ||||
|   side of the problem is that user applications have a limit imposed by the | ||||
|   system on the maximum amount of file descriptors it can have open and I had | ||||
|   to work around that by writing a special tool that runs setuid root that | ||||
|   increases the limit, downgrades to a normal user again and then run the | ||||
|   command line of your choice. This second approach has to be used for both | ||||
|   'hiper' and the test HTTP server. (You need to build the HTTP server with | ||||
|   CURL_SWS_FORK_ENABLED defined to have it do forks since it isn't desirable | ||||
|   to do so when running the normal curl tests.) | ||||
|  | ||||
|   Now I could run my test program without problems. I decided to run the tests | ||||
|   with 1 stream connection and a varying amount of idle ones. I did 1001, | ||||
|   2001, 3001, 5001 and 9001 connections and measured how long select() and | ||||
|   curl_multi_perform() (including the curl_multi_fdset() call) would take in | ||||
|   average, over a period of 20 seconds. I ran each test 5-6 times and I used | ||||
|   the average time of all the runs. | ||||
|  | ||||
|   The times in number of microseconds: | ||||
|  | ||||
|     Connections  multi_perform  select | ||||
|     1001         3504           951 | ||||
|     2001         7606           1988 | ||||
|     3001         11045          2715 | ||||
|     5001         16406          4024 | ||||
|     9001         32147          8030 | ||||
|  | ||||
|   Test system | ||||
|     CPU:     Athlon XP 2800  | ||||
|     RAM:     1 GB | ||||
|     Linux:   2.6 | ||||
|     glibc:   2.3.5 | ||||
|     libcurl: 7.15.1 | ||||
|  | ||||
|   The only reason I stopped at 9001 connections is that my test machine ran | ||||
|   out of avaiable memory by then as I ran the test server on the same machine, | ||||
|   and I didn't want to risk the test result accuracy by having it start using | ||||
|   the swap during the tests. | ||||
|  | ||||
|   It means that at 9000 connections we spend 40ms for each socket action, even | ||||
|   when only one socket ever have action. | ||||
|  | ||||
|   With these 32000 microseconds curl_multi_perform() takes for 9000 | ||||
|   connections, it loops 18000 laps which makes less than 2 microseconds per | ||||
|   lap. (Of course counting time/laps is an oversimplification, but anyway.) | ||||
|   Hopefully we should achieve less than 10 microseconds for each call to | ||||
|   curl_multi_socket() for an active connection. | ||||
|  | ||||
|   The timing graph displayed on the libevent site (duplicated on the hiper | ||||
|   project page) suggests that libevent is pretty much fixed at 50 microseconds | ||||
|   (although I don't know what test box was used in their testing, we can | ||||
|   compare the select()-times from my tests and see that they are at least | ||||
|   resonably close). | ||||
|  | ||||
|   Summing up, the current ~40 ms spent at 9000 connections could then possibly | ||||
|   be lowered to something around 60 us! | ||||
|  | ||||
| Step 2 - Implement curl_multi_socket API | ||||
|  | ||||
|   Most of the design decisions and debates about this new API have already | ||||
|   been held on the curl-library mailing list a long time ago so I had a basic | ||||
|   idea on what approach to use. The main ideas of the new API are simply: | ||||
|  | ||||
|    1 - The application can use whatever event system it likes as it gets info | ||||
|        from libcurl about what file descriptors libcurl waits for what action | ||||
|        on. (The previous API returns fd_sets which is very select()-centric). | ||||
|  | ||||
|    2 - When the application discovers action on a single socket, it calls | ||||
|        libcurl and informs that there was action on this particular socket and | ||||
|        libcurl can then act on that socket/transfer only and not care about | ||||
|        any other transfers. (The previous API always had to scan through all | ||||
|        the existing transfers.) | ||||
|  | ||||
|   The idea is that curl_multi_socket() calls a given callback with information | ||||
|   about what socket to wait for what action on, and the callback only gets | ||||
|   called if the status of that socket has changed. | ||||
|  | ||||
|   In the API draft from before, we have a timeout argument on a per socket | ||||
|   basis and we also allowed curl_multi_socket() to pass in an 'easy handle' | ||||
|   instead of socket to allow libcurl to shortcut a lookup and work on the | ||||
|   affected easy handle right away. Both these turned out to be bad ideas. | ||||
|  | ||||
|   The timeout argument was removed from the socket callback since after much | ||||
|   thinking I came to the conclusion that we really don't want to handle | ||||
|   timeouts on a per socket basis. We need it on a per transfer (easy handle) | ||||
|   basis and thus we can't provide it in the callbacks in a nice way. Instead, | ||||
|   we have to offer a curl_multi_timeout() that returns the largest amount of | ||||
|   time we should wait before we call the "timeout action" of libcurl, to | ||||
|   trigger the proper internal timeout action on the affected transfer. To get | ||||
|   this to work, I added a struct to each easy handle in which we store an | ||||
|   "expire time" (if any). The structs are then "splay sorted" so that we can | ||||
|   add and remove times from the linked list and yet somewhat swiftly figure | ||||
|   out 1 - how long time there is until the next timer expires and 2 - which | ||||
|   timer (handle) should we take care of now. Of course, the upside of all this | ||||
|   is that we get a curl_multi_timeout() that should also work with old-style | ||||
|   applications that use curl_multi_perform(). | ||||
|  | ||||
|   The easy handle argument was removed fom the curl_multi_socket() function | ||||
|   because having it there would require the application to do a socket to easy | ||||
|   handle conversion on its own. I find it very unlikely that applications | ||||
|   would want to do that and since libcurl would need such a lookup on its own | ||||
|   anyway since we didn't want to force applications to do that translation | ||||
|   code (it would be optional), it seemed like an unnecessary option. I also | ||||
|   realized that when we use underlying libraries such as c-ares (for DNS | ||||
|   asynch resolving) there might in fact be more than one transfer waiting for | ||||
|   action on the same socket and thus it makes the lookup even tricker and even | ||||
|   less likely to ever get done by applications. Instead I created an internal | ||||
|   "socket to easy handles" hash table that given a socket (file descriptor) | ||||
|   returns a list of easy handles that waits for some action on that socket. | ||||
|  | ||||
|   To make libcurl be able to report plain sockets in the socket callback, I | ||||
|   had to re-organize the internals of the curl_multi_fdset() etc so that the | ||||
|   conversion from sockets to fd_sets for that function is only done in the | ||||
|   last step before the data is returned. I also had to extend c-ares to get a | ||||
|   function that can return plain sockets, as that library too returned only | ||||
|   fd_sets and that is no longer good enough. The changes done to c-ares have | ||||
|   been committed and are available in the c-ares CVS repository destined to be | ||||
|   included in the upcoming c-ares 1.3.1 release. | ||||
|  | ||||
|   The 'shiper' tool is the test application I wrote that uses the new | ||||
|   curl_multi_socket() in its current state. It seems to be working and it uses | ||||
|   the API as it is documented and supposed to work. It is still using | ||||
|   select(), because I needed that during development (like until I had the | ||||
|   socket hash implemented etc) and because I haven't yet learned how to use | ||||
|   libevent or similar. | ||||
|  | ||||
|   The hiper/shiper tools are very simple and initiates lots of connections and | ||||
|   have them running for the test period and then kills them all. | ||||
|  | ||||
|   Since I wasn't done with the implementation until early January I haven't | ||||
|   had time to run very many measurements and checks, but I have done a few | ||||
|   runs with up to a few hundred connections (with a single active one). The | ||||
|   curl_multi_socket() invoke then takes 3-6 microseconds in average (using the | ||||
|   read-only-1-byte-at-a-time hack). If this number does increase a lot when we | ||||
|   add connections, it certainly matches my in my opinion very ambitious goal. | ||||
|   We are now below the 60 microseconds "per socket action" goal. It is | ||||
|   destined to be somewhat higher the more connections we have since the hash | ||||
|   table gets more populated and the splay tree will grow etc. | ||||
|  | ||||
|   Some tests at 7000 and 9000 connections showed that the socket hash lookup | ||||
|   is somewhat of a bottle neck. Its current implementation may be a bit too | ||||
|   limiting. It simply has a fixed-size array, and on each entry in the array | ||||
|   it has a linked list with entries. So the hash only checks which list to | ||||
|   scan through. The code I had used so for used a list with merely 7 slots (as | ||||
|   that is what the DNS hash uses) but with 7000 connections that would make an | ||||
|   average of 1000 nodes in each list to run through. I upped that to 97 slots | ||||
|   (I believe a prime is suitable) and noticed a significant speed increase.  I | ||||
|   need to reconsider the hash implementation or use a rather large default | ||||
|   value like this. At 9000 connections I was still below 10us per call. | ||||
|  | ||||
| Status Right Now | ||||
|  | ||||
|   The curl_multi_socket() API is implemented according to how it is | ||||
|   documented. The man pages for curl_multi_socket and curl_multi_timeout are | ||||
|   both committed to CVS and are available online for easy browsing: | ||||
|  | ||||
|     http://curl.haxx.se/libcurl/c/curl_multi_socket.html | ||||
|     http://curl.haxx.se/libcurl/c/curl_multi_timeout.html | ||||
|  | ||||
|   The hiper-5.patch I made available early morning January 5th, 2006 should | ||||
|   apply fine on a recent CVS checkout (at the time of this writing curl 7.15.1 | ||||
|   is the latest public curl release but the hiper patch does not apply fine on | ||||
|   that). | ||||
|  | ||||
| What is Left for the curl_multi_socket API | ||||
|  | ||||
|   1 - More measuring with more extreme number of connections | ||||
|  | ||||
|   2 - More testing with actual URLs and complete from start to end transfers. | ||||
|  | ||||
|   I'm quite sure we don't set expire times all over in the code properly, so | ||||
|   there is bound to be some timeout bugs left. | ||||
|  | ||||
|   What it really takes is for me to commit the code and to make an official | ||||
|   release with it so that we get people "out there" to help out testing it. | ||||
|  | ||||
| What is Left for project Hiper | ||||
|  | ||||
|   1 - Add HTTP pipelining support | ||||
|  | ||||
|   2 - Add a zero (or at least close to zero) copy interface | ||||
|  | ||||
|   Neither of these points have been planned or detailed exactly how they will | ||||
|   be implemented. | ||||
|  | ||||
| Roadmap Ahead | ||||
|  | ||||
|   I plan and hope to return to full-time hiper work later on this spring or | ||||
|   possibly summer to continue where I pause now. Of course some spare time | ||||
|   might also be spent until then to get us moving forward. | ||||
							
								
								
									
										34
									
								
								hiper/collecturls.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								hiper/collecturls.pl
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| #!/usr/bin/perl | ||||
|  | ||||
| # 1) http://randomurl.com/body.php | ||||
| # 2) http://random.yahoo.com/fast/ryl | ||||
| # 3) http://www.uroulette.com/visit | ||||
|  | ||||
| # 1) very slow, responds with URL in body meta style: | ||||
| # <meta http-equiv="refresh" content="0; url=http://www.webmasterworld.com/forum85/735.htm"> | ||||
|  | ||||
| # 2) Responds with non-HTTP headers like: | ||||
| # Status: 301 | ||||
| # Location: http://www.adaptive.net/ | ||||
|  | ||||
| # 3) ordinary 30X code and Location: | ||||
|  | ||||
| my $url; | ||||
| map { $url .= " http://www.uroulette.com/visit"; } (1 .. 12); | ||||
|  | ||||
| print $url."\n"; | ||||
|  | ||||
| my $count=0; | ||||
|  | ||||
| open(DUMP, ">>dump"); | ||||
|  | ||||
| while(1) { | ||||
|     my @getit = `curl -si $url`; | ||||
|     for my $l (@getit) { | ||||
|         if($l =~ /^Location: (.*)/) { | ||||
|             print DUMP "$1\n"; | ||||
|             print STDERR "$count\r"; | ||||
|             $count++; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										416
									
								
								hiper/hiper.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										416
									
								
								hiper/hiper.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,416 @@ | ||||
| /***************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * $Id$ | ||||
|  * | ||||
|  * Connect N connections. Z are idle, and X are active. Transfer as fast as | ||||
|  * possible. | ||||
|  * | ||||
|  * Run for a specific amount of time (10 secs for now). Output detailed timing | ||||
|  * information. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* The maximum number of simultanoues connections/transfers we support */ | ||||
| #define NCONNECTIONS 50000 | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include <sys/time.h> | ||||
| #include <time.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/poll.h> | ||||
|  | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| #define MICROSEC 1000000 /* number of microseconds in one second */ | ||||
|  | ||||
| /* The maximum time (in microseconds) we run the test */ | ||||
| #define RUN_FOR_THIS_LONG (20*MICROSEC) | ||||
|  | ||||
| /* Number of loops (seconds) we allow the total download amount and alive | ||||
|    connections to remain the same until we bail out. Set this slightly higher | ||||
|    when using asynch supported libcurl. */ | ||||
| #define IDLE_TIME 10 | ||||
|  | ||||
| struct globalinfo { | ||||
|   size_t dlcounter; | ||||
| }; | ||||
|  | ||||
| struct connection { | ||||
|   CURL *e; | ||||
|   int id; /* just a counter for easy browsing */ | ||||
|   char *url; | ||||
|   size_t dlcounter; | ||||
|   struct globalinfo *global; | ||||
|   char error[CURL_ERROR_SIZE]; | ||||
| }; | ||||
|  | ||||
| /* on port 8999 we run a modified (fork-) sws that supports pure idle and full | ||||
|    stream mode */ | ||||
| #define PORT "8999" | ||||
|  | ||||
| #define HOST "192.168.1.13" | ||||
|  | ||||
| #define URL_IDLE   "http://" HOST ":" PORT "/1000" | ||||
| #define URL_ACTIVE "http://" HOST ":" PORT "/1001" | ||||
|  | ||||
| static size_t | ||||
| writecallback(void *ptr, size_t size, size_t nmemb, void *data) | ||||
| { | ||||
|   size_t realsize = size * nmemb; | ||||
|   struct connection *c = (struct connection *)data; | ||||
|  | ||||
|   c->dlcounter += realsize; | ||||
|   c->global->dlcounter += realsize; | ||||
|  | ||||
| #if 0 | ||||
|   printf("%02d: %d, total %d\n", | ||||
|          c->id, c->dlcounter, c->global->dlcounter); | ||||
| #endif | ||||
|   return realsize; | ||||
| } | ||||
|  | ||||
| /* return the diff between two timevals, in us */ | ||||
| static long tvdiff(struct timeval *newer, struct timeval *older) | ||||
| { | ||||
|   return (newer->tv_sec-older->tv_sec)*1000000+ | ||||
|     (newer->tv_usec-older->tv_usec); | ||||
| } | ||||
|  | ||||
|  | ||||
| /* store the start time of the program in this variable */ | ||||
| static struct timeval timer; | ||||
|  | ||||
| static void timer_start(void) | ||||
| { | ||||
|   /* capture the time of the start moment */ | ||||
|   gettimeofday(&timer, NULL); | ||||
| } | ||||
|  | ||||
| static struct timeval cont; /* at this moment we continued */ | ||||
|  | ||||
| int still_running; /* keep number of running handles */ | ||||
|  | ||||
| struct conncount { | ||||
|   long time_us; | ||||
|   long laps; | ||||
|   long maxtime; | ||||
| }; | ||||
|  | ||||
| static struct timeval timerpause; | ||||
| static void timer_pause(void) | ||||
| { | ||||
|   /* capture the time of the pause moment */ | ||||
|   gettimeofday(&timerpause, NULL); | ||||
|  | ||||
|   /* If we have a previous continue (all times except the first), we can now | ||||
|      store the time for a whole "lap" */ | ||||
|   if(cont.tv_sec) { | ||||
|     long lap; | ||||
|  | ||||
|     lap = tvdiff(&timerpause, &cont); | ||||
|   } | ||||
| } | ||||
|  | ||||
| static long paused; /* amount of us we have been pausing */ | ||||
|  | ||||
| static void timer_continue(void) | ||||
| { | ||||
|   /* Capture the time of the restored operation moment, now calculate how long | ||||
|      time we were paused and added that to the 'paused' variable. | ||||
|    */ | ||||
|   gettimeofday(&cont, NULL); | ||||
|  | ||||
|   paused += tvdiff(&cont, &timerpause); | ||||
| } | ||||
|  | ||||
| static long total; /* amount of us from start to stop */ | ||||
| static void timer_total(void) | ||||
| { | ||||
|   struct timeval stop; | ||||
|   /* Capture the time of the operation stopped moment, now calculate how long | ||||
|      time we were running and how much of that pausing. | ||||
|    */ | ||||
|   gettimeofday(&stop, NULL); | ||||
|  | ||||
|   total = tvdiff(&stop, &timer); | ||||
| } | ||||
|  | ||||
| struct globalinfo info; | ||||
| struct connection *conns; | ||||
|  | ||||
| long selects; | ||||
| long selectsalive; | ||||
| long timeouts; | ||||
|  | ||||
| long perform; | ||||
| long performalive; | ||||
| long performselect; | ||||
| long topselect; | ||||
|  | ||||
| int num_total; | ||||
| int num_idle; | ||||
| int num_active; | ||||
|  | ||||
| static void report(void) | ||||
| { | ||||
|   int i; | ||||
|   long active = total - paused; | ||||
|   long numdl = 0; | ||||
|  | ||||
|   for(i=0; i < num_total; i++) { | ||||
|     if(conns[i].dlcounter) | ||||
|       numdl++; | ||||
|   } | ||||
|  | ||||
|   printf("Summary from %d simultanoues transfers (%d active)\n", | ||||
|          num_total, num_active); | ||||
|   printf("%d out of %d connections provided data\n", numdl, num_total); | ||||
|  | ||||
|   printf("Total time: %ldus select(): %ldus curl_multi_perform(): %ldus\n", | ||||
|          total, paused, active); | ||||
|  | ||||
|   printf("%d calls to curl_multi_perform() average %d alive " | ||||
|          "Average time: %dus\n", | ||||
|          perform, performalive/perform, active/perform); | ||||
|  | ||||
|   printf("%d calls to select(), average %d alive " | ||||
|          "Average time: %dus\n", | ||||
|          selects, selectsalive/selects, | ||||
|          paused/selects); | ||||
|   printf(" Average number of readable connections per select() return: %d\n", | ||||
|          performselect/selects); | ||||
|   printf(" Max number of readable connections for a single select() " | ||||
|          "return: %d\n", | ||||
|          topselect); | ||||
|  | ||||
|   printf("%ld select() timeouts\n", timeouts); | ||||
|  | ||||
|   printf("Downloaded %ld bytes in %ld bytes/sec, %ld usec/byte\n", | ||||
|          info.dlcounter, | ||||
|          info.dlcounter/(total/1000000), | ||||
|          total/info.dlcounter); | ||||
|  | ||||
| #if 0 | ||||
|   for(i=1; i< num_total; i++) { | ||||
|     if(timecount[i].laps) { | ||||
|       printf("Time %d connections, average %ld max %ld (%ld laps) " | ||||
|              "average/conn: %ld\n", | ||||
|              i, | ||||
|              timecount[i].time_us/timecount[i].laps, | ||||
|              timecount[i].maxtime, | ||||
|              timecount[i].laps, | ||||
|              (timecount[i].time_us/timecount[i].laps)/i ); | ||||
|     } | ||||
|   } | ||||
| #endif | ||||
| } | ||||
|  | ||||
| struct ourfdset { | ||||
|   char fdbuffer[NCONNECTIONS/8]; | ||||
| }; | ||||
| #define FD2_ZERO(x) FD_ZERO((fd_set *)x) | ||||
|  | ||||
| typedef struct ourfdset fd2_set; | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|   CURLM *multi_handle; | ||||
|   CURLMsg *msg; | ||||
|   CURLcode code = CURLE_OK; | ||||
|   CURLMcode mcode = CURLM_OK; | ||||
|   int rc; | ||||
|   int i; | ||||
|  | ||||
|   int prevalive=-1; | ||||
|   int prevsamecounter=0; | ||||
|   int prevtotal = -1; | ||||
|   fd2_set fdsizecheck; | ||||
|   int selectmaxamount; | ||||
|  | ||||
|   memset(&info, 0, sizeof(struct globalinfo)); | ||||
|  | ||||
|   selectmaxamount = sizeof(fdsizecheck) * 8; | ||||
|   printf("select() supports max %d connections\n", selectmaxamount); | ||||
|  | ||||
|   if(argc < 3) { | ||||
|     printf("Usage: hiper [num idle] [num active]\n"); | ||||
|     return 1; | ||||
|   } | ||||
|  | ||||
|   num_idle = atoi(argv[1]); | ||||
|   num_active = atoi(argv[2]); | ||||
|  | ||||
|   num_total = num_idle + num_active; | ||||
|  | ||||
|   if(num_total > selectmaxamount) { | ||||
|     printf("Requested more connections than supported!\n"); | ||||
|     return 4; | ||||
|   } | ||||
|  | ||||
|   conns = calloc(num_total, sizeof(struct connection)); | ||||
|   if(!conns) { | ||||
|     printf("Out of memory\n"); | ||||
|     return 3; | ||||
|   } | ||||
|  | ||||
|   if(num_total >= NCONNECTIONS) { | ||||
|     printf("Increase NCONNECTIONS!\n"); | ||||
|     return 2; | ||||
|   } | ||||
|  | ||||
|   /* init the multi stack */ | ||||
|   multi_handle = curl_multi_init(); | ||||
|  | ||||
|   for(i=0; i< num_total; i++) { | ||||
|     CURL *e; | ||||
|     char *nl; | ||||
|  | ||||
|     memset(&conns[i], 0, sizeof(struct connection)); | ||||
|  | ||||
|     if(i < num_idle) | ||||
|       conns[i].url = URL_IDLE; | ||||
|     else | ||||
|       conns[i].url = URL_ACTIVE; | ||||
|  | ||||
| #if 0 | ||||
|     printf("%d: Add URL %s\n", i, conns[i].url); | ||||
| #endif | ||||
|     e  = curl_easy_init(); | ||||
|  | ||||
|     if(!e) { | ||||
|       printf("curl_easy_init() for handle %d failed, exiting!\n", i); | ||||
|       return 2; | ||||
|     } | ||||
|  | ||||
|     conns[i].e = e; | ||||
|     conns[i].id = i; | ||||
|     conns[i].global = &info; | ||||
|  | ||||
|     curl_easy_setopt(e, CURLOPT_URL, conns[i].url); | ||||
|     curl_easy_setopt(e, CURLOPT_WRITEFUNCTION, writecallback); | ||||
|     curl_easy_setopt(e, CURLOPT_WRITEDATA, &conns[i]); | ||||
| #if 1 | ||||
|     curl_easy_setopt(e, CURLOPT_VERBOSE, 1); | ||||
| #endif | ||||
|     curl_easy_setopt(e, CURLOPT_ERRORBUFFER, conns[i].error); | ||||
|     curl_easy_setopt(e, CURLOPT_PRIVATE, &conns[i]); | ||||
|  | ||||
|     /* add the easy to the multi */ | ||||
|     if(CURLM_OK != curl_multi_add_handle(multi_handle, e)) { | ||||
|       printf("curl_multi_add_handle() returned error for %d\n", i); | ||||
|       return 3; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|     /* we start some action by calling perform right away */ | ||||
|   while(CURLM_CALL_MULTI_PERFORM == | ||||
|         curl_multi_perform(multi_handle, &still_running)); | ||||
|  | ||||
|   printf("Starting timer, expects to run for %ldus\n", RUN_FOR_THIS_LONG); | ||||
|   timer_start(); | ||||
|  | ||||
|   while(still_running == num_total) { | ||||
|     struct timeval timeout; | ||||
|     int rc; /* select() return code */ | ||||
|     long timeout_ms; | ||||
|  | ||||
|     fd2_set fdread; | ||||
|     fd2_set fdwrite; | ||||
|     fd2_set fdexcep; | ||||
|     int maxfd; | ||||
|  | ||||
|     FD2_ZERO(&fdread); | ||||
|     FD2_ZERO(&fdwrite); | ||||
|     FD2_ZERO(&fdexcep); | ||||
|  | ||||
|     curl_multi_timeout(multi_handle, &timeout_ms); | ||||
|  | ||||
|     /* set timeout to wait */ | ||||
|     timeout.tv_sec = timeout_ms/1000; | ||||
|     timeout.tv_usec = (timeout_ms%1000)*1000; | ||||
|  | ||||
|     /* get file descriptors from the transfers */ | ||||
|     curl_multi_fdset(multi_handle, | ||||
|                      (fd_set *)&fdread, | ||||
|                      (fd_set *)&fdwrite, | ||||
|                      (fd_set *)&fdexcep, &maxfd); | ||||
|  | ||||
|     timer_pause(); | ||||
|     selects++; | ||||
|     selectsalive += still_running; | ||||
|     rc = select(maxfd+1, | ||||
|                 (fd_set *)&fdread, | ||||
|                 (fd_set *)&fdwrite, | ||||
|                 (fd_set *)&fdexcep, &timeout); | ||||
|  | ||||
| #if 0 | ||||
|     /* Output this here to make it outside the timer */ | ||||
|     printf("Running: %d (%d bytes)\n", still_running, info.dlcounter); | ||||
| #endif | ||||
|     timer_continue(); | ||||
|  | ||||
|     switch(rc) { | ||||
|     case -1: | ||||
|       /* select error */ | ||||
|       break; | ||||
|     case 0: | ||||
|       timeouts++; | ||||
|     default: | ||||
|       /* timeout or readable/writable sockets */ | ||||
|       do { | ||||
|         perform++; | ||||
|         performalive += still_running; | ||||
|       } | ||||
|       while(CURLM_CALL_MULTI_PERFORM == | ||||
|             curl_multi_perform(multi_handle, &still_running)); | ||||
|  | ||||
|       performselect += rc; | ||||
|       if(rc > topselect) | ||||
|         topselect = rc; | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|     if(total > RUN_FOR_THIS_LONG) { | ||||
|       printf("Stopped after %ldus\n", total); | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|     if(prevalive != still_running) { | ||||
|       printf("%d connections alive\n", still_running); | ||||
|     } | ||||
|     prevalive = still_running; | ||||
|  | ||||
|     timer_total(); /* calculate the total time spent so far */ | ||||
|   } | ||||
|  | ||||
|   if(still_running != num_total) { | ||||
|     /* something made connections fail, extract the reason and tell */ | ||||
|     int msgs_left; | ||||
|     struct connection *cptr; | ||||
|     while ((msg = curl_multi_info_read(multi_handle, &msgs_left))) { | ||||
|       if (msg->msg == CURLMSG_DONE) { | ||||
|         curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &cptr); | ||||
|  | ||||
|         printf("%d => (%d) %s", cptr->id, msg->data.result, cptr->error); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|   } | ||||
|  | ||||
|   curl_multi_cleanup(multi_handle); | ||||
|  | ||||
|   /* cleanup all the easy handles */ | ||||
|   for(i=0; i< num_total; i++) | ||||
|     curl_easy_cleanup(conns[i].e); | ||||
|  | ||||
|   report(); | ||||
|  | ||||
|   return code; | ||||
| } | ||||
							
								
								
									
										557
									
								
								hiper/shiper.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										557
									
								
								hiper/shiper.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,557 @@ | ||||
| /***************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * $Id$ | ||||
|  * | ||||
|  * Connect N connections. Z are idle, and X are active. Transfer as fast as | ||||
|  * possible. | ||||
|  * | ||||
|  * Run for a specific amount of time (10 secs for now). Output detailed timing | ||||
|  * information. | ||||
|  * | ||||
|  * The same is hiper.c but instead using the new *socket() API instead of the | ||||
|  * "old" *perform() call. | ||||
|  * | ||||
|  * Uses libevent. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* The maximum number of simultanoues connections/transfers we support */ | ||||
| #define NCONNECTIONS 50000 | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include <sys/time.h> | ||||
| #include <time.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/poll.h> | ||||
|  | ||||
| #include <curl/curl.h> | ||||
|  | ||||
| #include <event.h> /* for libevent */ | ||||
|  | ||||
| #ifndef FALSE | ||||
| #define FALSE 0 | ||||
| #endif | ||||
|  | ||||
| #ifndef TRUE | ||||
| #define TRUE 1 | ||||
| #endif | ||||
|  | ||||
| #define MICROSEC 1000000 /* number of microseconds in one second */ | ||||
|  | ||||
| /* The maximum time (in microseconds) we run the test */ | ||||
| #define RUN_FOR_THIS_LONG (5*MICROSEC) | ||||
|  | ||||
| /* Number of loops (seconds) we allow the total download amount and alive | ||||
|    connections to remain the same until we bail out. Set this slightly higher | ||||
|    when using asynch supported libcurl. */ | ||||
| #define IDLE_TIME 10 | ||||
|  | ||||
| struct ourfdset { | ||||
|   /* __fds_bits is what the Linux glibc headers use when they declare the | ||||
|      fd_set struct so by using this we can actually avoid the typecase for the | ||||
|      FD_SET() macro usage but it would hardly be portable */ | ||||
|   char __fds_bits[NCONNECTIONS/8]; | ||||
| }; | ||||
| #define FD2_ZERO(x) memset(x, 0, sizeof(struct ourfdset)) | ||||
|  | ||||
| typedef struct ourfdset fd2_set; | ||||
|  | ||||
| struct globalinfo { | ||||
|   size_t dlcounter; | ||||
| }; | ||||
|  | ||||
| struct connection { | ||||
|   CURL *e; | ||||
|   int id; /* just a counter for easy browsing */ | ||||
|   char *url; | ||||
|   size_t dlcounter; | ||||
|   struct globalinfo *global; | ||||
|   char error[CURL_ERROR_SIZE]; | ||||
| }; | ||||
|  | ||||
| struct fdinfo { | ||||
|   /* create a link list of fdinfo structs */ | ||||
|   struct fdinfo *next; | ||||
|   struct fdinfo *prev; | ||||
|   curl_socket_t sockfd; | ||||
|   CURL *easy; | ||||
|   int action; /* as set by libcurl */ | ||||
|   long timeout; /* as set by libcurl */ | ||||
|   struct event ev; | ||||
| }; | ||||
|  | ||||
| static struct fdinfo *allsocks; | ||||
|  | ||||
| static struct fdinfo *findsock(curl_socket_t s) | ||||
| { | ||||
|   /* return the struct for the given socket */ | ||||
|   struct fdinfo *fdp = allsocks; | ||||
|  | ||||
|   while(fdp) { | ||||
|     if(fdp->sockfd == s) | ||||
|       break; | ||||
|     fdp = fdp->next; | ||||
|   } | ||||
|   return fdp; /* a struct pointer or NULL */ | ||||
| } | ||||
|  | ||||
| static void remsock(curl_socket_t s) | ||||
| { | ||||
|   struct fdinfo *fdp = allsocks; | ||||
|  | ||||
|   while(fdp) { | ||||
|     if(fdp->sockfd == s) | ||||
|       break; | ||||
|     fdp = fdp->next; | ||||
|   } | ||||
|   if(!fdp) | ||||
|     /* did not find socket to remove! */ | ||||
|     return; | ||||
|  | ||||
|   if(fdp->prev) | ||||
|     fdp->prev->next = fdp->next; | ||||
|   if(fdp->next) | ||||
|     fdp->next->prev = fdp->prev; | ||||
|   else | ||||
|     /* this was the last entry */ | ||||
|     allsocks = NULL; | ||||
| } | ||||
|  | ||||
| static void setsock(struct fdinfo *fdp, curl_socket_t s, CURL *easy, | ||||
|                     int action) | ||||
| { | ||||
|   fdp->sockfd = s; | ||||
|   fdp->action = action; | ||||
|   fdp->easy = easy; | ||||
| } | ||||
|  | ||||
| static void addsock(curl_socket_t s, CURL *easy, int action) | ||||
| { | ||||
|   struct fdinfo *fdp = calloc(sizeof(struct fdinfo), 1); | ||||
|  | ||||
|   setsock(fdp, s, easy, action); | ||||
|  | ||||
|   if(allsocks) { | ||||
|     fdp->next = allsocks; | ||||
|     allsocks->prev = fdp; | ||||
|  | ||||
|     /* now set allsocks to point to the new struct */ | ||||
|     allsocks = fdp; | ||||
|   } | ||||
|   else | ||||
|     allsocks = fdp; | ||||
| } | ||||
|  | ||||
| static void fdinfo2fdset(fd2_set *fdread, fd2_set *fdwrite, int *maxfd) | ||||
| { | ||||
|   struct fdinfo *fdp = allsocks; | ||||
|   int writable=0; | ||||
|  | ||||
|   FD2_ZERO(fdread); | ||||
|   FD2_ZERO(fdwrite); | ||||
|  | ||||
|   *maxfd = 0; | ||||
|  | ||||
| #if 0 | ||||
|   printf("Wait for: "); | ||||
| #endif | ||||
|  | ||||
|   while(fdp) { | ||||
|     if(fdp->action & CURL_POLL_IN) { | ||||
|       FD_SET(fdp->sockfd, (fd_set *)fdread); | ||||
|     } | ||||
|     if(fdp->action & CURL_POLL_OUT) { | ||||
|       FD_SET(fdp->sockfd, (fd_set *)fdwrite); | ||||
|       writable++; | ||||
|     } | ||||
|  | ||||
| #if 0 | ||||
|     printf("%d (%s%s) ", | ||||
|            fdp->sockfd, | ||||
|            (fdp->action & CURL_POLL_IN)?"r":"", | ||||
|            (fdp->action & CURL_POLL_OUT)?"w":""); | ||||
| #endif | ||||
|  | ||||
|     if(fdp->sockfd > *maxfd) | ||||
|       *maxfd = fdp->sockfd; | ||||
|  | ||||
|     fdp = fdp->next; | ||||
|   } | ||||
| #if 0 | ||||
|   if(writable) | ||||
|     printf("Check for %d writable sockets\n", writable); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /* on port 8999 we run a fork enabled sws that supports 'idle' and 'stream' */ | ||||
| #define PORT "8999" | ||||
|  | ||||
| #define HOST "192.168.1.13" | ||||
|  | ||||
| #define URL_IDLE   "http://" HOST ":" PORT "/1000" | ||||
| #define URL_ACTIVE "http://" HOST ":" PORT "/1001" | ||||
|  | ||||
|  | ||||
| static int socket_callback(CURL *easy,      /* easy handle */ | ||||
|                            curl_socket_t s, /* socket */ | ||||
|                            int what,        /* see above */ | ||||
|                            void *userp)     /* "private" pointer */ | ||||
| { | ||||
|   struct fdinfo *fdp; | ||||
|   printf("socket %d easy %p what %d\n", s, easy, what); | ||||
|  | ||||
|   if(what == CURL_POLL_REMOVE) | ||||
|     remsock(s); | ||||
|   else { | ||||
|     fdp = findsock(s); | ||||
|  | ||||
|     if(!fdp) { | ||||
|       addsock(s, easy, what); | ||||
|     } | ||||
|     else { | ||||
|       /* we already know about it, just change action/timeout */ | ||||
|       printf("Changing info for socket %d from %d to %d\n", | ||||
|              s, fdp->action, what); | ||||
|       setsock(fdp, s, easy, what); | ||||
|     } | ||||
|   } | ||||
|   return 0; /* return code meaning? */ | ||||
| } | ||||
|  | ||||
|  | ||||
| static size_t | ||||
| writecallback(void *ptr, size_t size, size_t nmemb, void *data) | ||||
| { | ||||
|   size_t realsize = size * nmemb; | ||||
|   struct connection *c = (struct connection *)data; | ||||
|  | ||||
|   c->dlcounter += realsize; | ||||
|   c->global->dlcounter += realsize; | ||||
|  | ||||
| #if 0 | ||||
|   printf("%02d: %d, total %d\n", | ||||
|          c->id, c->dlcounter, c->global->dlcounter); | ||||
| #endif | ||||
|   return realsize; | ||||
| } | ||||
|  | ||||
| /* return the diff between two timevals, in us */ | ||||
| static long tvdiff(struct timeval *newer, struct timeval *older) | ||||
| { | ||||
|   return (newer->tv_sec-older->tv_sec)*1000000+ | ||||
|     (newer->tv_usec-older->tv_usec); | ||||
| } | ||||
|  | ||||
|  | ||||
| /* store the start time of the program in this variable */ | ||||
| static struct timeval timer; | ||||
|  | ||||
| static void timer_start(void) | ||||
| { | ||||
|   /* capture the time of the start moment */ | ||||
|   gettimeofday(&timer, NULL); | ||||
| } | ||||
|  | ||||
| static struct timeval cont; /* at this moment we continued */ | ||||
|  | ||||
| int still_running; /* keep number of running handles */ | ||||
|  | ||||
| struct conncount { | ||||
|   long time_us; | ||||
|   long laps; | ||||
|   long maxtime; | ||||
| }; | ||||
|  | ||||
| static struct timeval timerpause; | ||||
| static void timer_pause(void) | ||||
| { | ||||
|   /* capture the time of the pause moment */ | ||||
|   gettimeofday(&timerpause, NULL); | ||||
|  | ||||
|   /* If we have a previous continue (all times except the first), we can now | ||||
|      store the time for a whole "lap" */ | ||||
|   if(cont.tv_sec) { | ||||
|     long lap; | ||||
|  | ||||
|     lap = tvdiff(&timerpause, &cont); | ||||
|   } | ||||
| } | ||||
|  | ||||
| static long paused; /* amount of us we have been pausing */ | ||||
|  | ||||
| static void timer_continue(void) | ||||
| { | ||||
|   /* Capture the time of the restored operation moment, now calculate how long | ||||
|      time we were paused and added that to the 'paused' variable. | ||||
|    */ | ||||
|   gettimeofday(&cont, NULL); | ||||
|  | ||||
|   paused += tvdiff(&cont, &timerpause); | ||||
| } | ||||
|  | ||||
| static long total; /* amount of us from start to stop */ | ||||
| static void timer_total(void) | ||||
| { | ||||
|   struct timeval stop; | ||||
|   /* Capture the time of the operation stopped moment, now calculate how long | ||||
|      time we were running and how much of that pausing. | ||||
|    */ | ||||
|   gettimeofday(&stop, NULL); | ||||
|  | ||||
|   total = tvdiff(&stop, &timer); | ||||
| } | ||||
|  | ||||
| struct globalinfo info; | ||||
| struct connection *conns; | ||||
|  | ||||
| long selects; | ||||
| long timeouts; | ||||
|  | ||||
| long multi_socket; | ||||
| long performalive; | ||||
| long performselect; | ||||
| long topselect; | ||||
|  | ||||
| int num_total; | ||||
| int num_idle; | ||||
| int num_active; | ||||
|  | ||||
| static void report(void) | ||||
| { | ||||
|   int i; | ||||
|   long active = total - paused; | ||||
|   long numdl = 0; | ||||
|  | ||||
|   for(i=0; i < num_total; i++) { | ||||
|     if(conns[i].dlcounter) | ||||
|       numdl++; | ||||
|   } | ||||
|  | ||||
|   printf("Summary from %d simultanoues transfers (%d active)\n", | ||||
|          num_total, num_active); | ||||
|   printf("%d out of %d connections provided data\n", numdl, num_total); | ||||
|  | ||||
|   printf("Total time: %ldus paused: %ldus curl_multi_socket(): %ldus\n", | ||||
|          total, paused, active); | ||||
|  | ||||
|   printf("%d calls to select() " | ||||
|          "Average time: %dus\n", | ||||
|          selects, paused/selects); | ||||
|   printf(" Average number of readable connections per select() return: %d\n", | ||||
|          performselect/selects); | ||||
|  | ||||
|   printf(" Max number of readable connections for a single select() " | ||||
|          "return: %d\n", | ||||
|          topselect); | ||||
|  | ||||
|   printf("%ld calls to multi_socket(), " | ||||
|          "Average time: %ldus\n", | ||||
|          multi_socket, active/multi_socket); | ||||
|  | ||||
|   printf("%ld select() timeouts\n", timeouts); | ||||
|  | ||||
|   printf("Downloaded %ld bytes in %ld bytes/sec, %ld usec/byte\n", | ||||
|          info.dlcounter, | ||||
|          info.dlcounter/(total/1000000), | ||||
|          total/info.dlcounter); | ||||
|  | ||||
| } | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|   CURLM *multi_handle; | ||||
|   CURLMsg *msg; | ||||
|   CURLcode code = CURLE_OK; | ||||
|   CURLMcode mcode = CURLM_OK; | ||||
|   int rc; | ||||
|   int i; | ||||
|   fd2_set fdsizecheck; | ||||
|   int selectmaxamount; | ||||
|   struct fdinfo *fdp; | ||||
|   char act; | ||||
|  | ||||
|   memset(&info, 0, sizeof(struct globalinfo)); | ||||
|  | ||||
|   selectmaxamount = sizeof(fdsizecheck) * 8; | ||||
|   printf("select() supports max %d connections\n", selectmaxamount); | ||||
|  | ||||
|   if(argc < 3) { | ||||
|     printf("Usage: hiper [num idle] [num active]\n"); | ||||
|     return 1; | ||||
|   } | ||||
|  | ||||
|   num_idle = atoi(argv[1]); | ||||
|   num_active = atoi(argv[2]); | ||||
|  | ||||
|   num_total = num_idle + num_active; | ||||
|  | ||||
|   if(num_total > selectmaxamount) { | ||||
|     printf("Requested more connections than supported!\n"); | ||||
|     return 4; | ||||
|   } | ||||
|  | ||||
|   conns = calloc(num_total, sizeof(struct connection)); | ||||
|   if(!conns) { | ||||
|     printf("Out of memory\n"); | ||||
|     return 3; | ||||
|   } | ||||
|  | ||||
|   if(num_total >= NCONNECTIONS) { | ||||
|     printf("Too many connections requested, increase NCONNECTIONS!\n"); | ||||
|     return 2; | ||||
|   } | ||||
|  | ||||
|   printf("About to do %d connections\n", num_total); | ||||
|  | ||||
|   /* init the multi stack */ | ||||
|   multi_handle = curl_multi_init(); | ||||
|  | ||||
|   for(i=0; i< num_total; i++) { | ||||
|     CURL *e; | ||||
|     char *nl; | ||||
|  | ||||
|     memset(&conns[i], 0, sizeof(struct connection)); | ||||
|  | ||||
|     if(i < num_idle) | ||||
|       conns[i].url = URL_IDLE; | ||||
|     else | ||||
|       conns[i].url = URL_ACTIVE; | ||||
|  | ||||
|     e  = curl_easy_init(); | ||||
|  | ||||
|     if(!e) { | ||||
|       printf("curl_easy_init() for handle %d failed, exiting!\n", i); | ||||
|       return 2; | ||||
|     } | ||||
|  | ||||
|     conns[i].e = e; | ||||
|     conns[i].id = i; | ||||
|     conns[i].global = &info; | ||||
|  | ||||
|     curl_easy_setopt(e, CURLOPT_URL, conns[i].url); | ||||
|     curl_easy_setopt(e, CURLOPT_WRITEFUNCTION, writecallback); | ||||
|     curl_easy_setopt(e, CURLOPT_WRITEDATA, &conns[i]); | ||||
|     curl_easy_setopt(e, CURLOPT_VERBOSE, 0); | ||||
|     curl_easy_setopt(e, CURLOPT_ERRORBUFFER, conns[i].error); | ||||
|     curl_easy_setopt(e, CURLOPT_PRIVATE, &conns[i]); | ||||
|  | ||||
|     /* add the easy to the multi */ | ||||
|     if(CURLM_OK != curl_multi_add_handle(multi_handle, e)) { | ||||
|       printf("curl_multi_add_handle() returned error for %d\n", i); | ||||
|       return 3; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   curl_multi_setopt(multi_handle, CURLMOPT_SOCKETFUNCTION, socket_callback); | ||||
|   curl_multi_setopt(multi_handle, CURLMOPT_SOCKETDATA, NULL); | ||||
|  | ||||
|   /* we start the action by calling *socket() right away */ | ||||
|   while(CURLM_CALL_MULTI_PERFORM == curl_multi_socket_all(multi_handle)); | ||||
|  | ||||
|   printf("Starting timer, expects to run for %ldus\n", RUN_FOR_THIS_LONG); | ||||
|   timer_start(); | ||||
|   timer_pause(); | ||||
|  | ||||
|   while(1) { | ||||
|     struct timeval timeout; | ||||
|     int rc; /* select() return code */ | ||||
|     long timeout_ms; | ||||
|  | ||||
|     fd2_set fdread; | ||||
|     fd2_set fdwrite; | ||||
|     int maxfd; | ||||
|  | ||||
|     curl_multi_timeout(multi_handle, &timeout_ms); | ||||
|  | ||||
|     /* set timeout to wait */ | ||||
|     timeout.tv_sec = timeout_ms/1000; | ||||
|     timeout.tv_usec = (timeout_ms%1000)*1000; | ||||
|  | ||||
|     /* convert file descriptors from the transfers to fd_sets */ | ||||
|     fdinfo2fdset(&fdread, &fdwrite, &maxfd); | ||||
|  | ||||
|     selects++; | ||||
|     rc = select(maxfd+1, | ||||
|                 (fd_set *)&fdread, | ||||
|                 (fd_set *)&fdwrite, | ||||
|                 NULL, &timeout); | ||||
|     switch(rc) { | ||||
|     case -1: | ||||
|       /* select error */ | ||||
|       break; | ||||
|     case 0: | ||||
|       timeouts++; | ||||
|       curl_multi_socket(multi_handle, CURL_SOCKET_TIMEOUT); | ||||
|       break; | ||||
|  | ||||
|     default: | ||||
|       /* timeout or readable/writable sockets */ | ||||
|  | ||||
|       for(i=0, fdp = allsocks; fdp; fdp = fdp->next) { | ||||
|         act = 0; | ||||
|         if((fdp->action & CURL_POLL_IN) && | ||||
|            FD_ISSET(fdp->sockfd, &fdread)) { | ||||
|           act |= CURL_POLL_IN; | ||||
|           i++; | ||||
|         } | ||||
|         if((fdp->action & CURL_POLL_OUT) && | ||||
|            FD_ISSET(fdp->sockfd, &fdwrite)) { | ||||
|           act |= CURL_POLL_OUT; | ||||
|           i++; | ||||
|         } | ||||
|  | ||||
|         if(act) { | ||||
|           multi_socket++; | ||||
|           timer_continue(); | ||||
|           if(act & CURL_POLL_OUT) | ||||
|             act--; | ||||
|           curl_multi_socket(multi_handle, fdp->sockfd); | ||||
|           timer_pause(); | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       performselect += rc; | ||||
|       if(rc > topselect) | ||||
|         topselect = rc; | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|     timer_total(); /* calculate the total time spent so far */ | ||||
|  | ||||
|     if(total > RUN_FOR_THIS_LONG) { | ||||
|       printf("Stopped after %ldus\n", total); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if(still_running != num_total) { | ||||
|     /* something made connections fail, extract the reason and tell */ | ||||
|     int msgs_left; | ||||
|     struct connection *cptr; | ||||
|     while ((msg = curl_multi_info_read(multi_handle, &msgs_left))) { | ||||
|       if (msg->msg == CURLMSG_DONE) { | ||||
|         curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &cptr); | ||||
|  | ||||
|         printf("%d => (%d) %s", cptr->id, msg->data.result, cptr->error); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|   } | ||||
|  | ||||
|   curl_multi_cleanup(multi_handle); | ||||
|  | ||||
|   /* cleanup all the easy handles */ | ||||
|   for(i=0; i< num_total; i++) | ||||
|     curl_easy_cleanup(conns[i].e); | ||||
|  | ||||
|   report(); | ||||
|  | ||||
|   return code; | ||||
| } | ||||
							
								
								
									
										101
									
								
								hiper/ulimiter.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								hiper/ulimiter.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| /***************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * $Id$ | ||||
|  * | ||||
|  * Little tool to raise the amount of maximum file descriptor and then run the | ||||
|  * given command line (using the hard-coded uid/gid). | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/resource.h> | ||||
| #include <unistd.h> | ||||
| #include <errno.h> | ||||
| #include <string.h> /* for errno translation */ | ||||
|  | ||||
| /* ulimiter | ||||
|  * | ||||
|  * Source code inspiration from: | ||||
|  *  http://www.cs.wisc.edu/condor/condorg/linux_scalability.html | ||||
|  */ | ||||
|  | ||||
| #define UID 1000 /* the user who must run this */ | ||||
|  | ||||
| #define GID 1000 /* group id to run the program as */ | ||||
|  | ||||
| /* Number of open files to increase to */ | ||||
| #define NEW_MAX 10000 | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|   int ret; | ||||
|   struct rlimit rl; | ||||
|   char *brgv[20]; | ||||
|   int brgc=argc-1; | ||||
|   int i; | ||||
|  | ||||
|   for(i=1; i< argc; i++) | ||||
|     brgv[i-1]=argv[i]; | ||||
|   brgv[i-1]=NULL; /* terminate the list */ | ||||
|  | ||||
|   if(getuid() != UID) { | ||||
|     fprintf(stderr, "Only uid %d is allowed to run this\n", UID); | ||||
|     return 1; | ||||
|   } | ||||
|  | ||||
|   ret = getrlimit(RLIMIT_NOFILE, &rl); | ||||
|   if(ret != 0) { | ||||
|     fprintf(stderr, "Unable to read open file limit.\n" | ||||
|             "(getrlimit(RLIMIT_NOFILE, &rl) failed)\n" | ||||
|             "(%d, %s)", errno, strerror(errno)); | ||||
|     return 1; | ||||
|   } | ||||
|  | ||||
|   fprintf(stderr, "Limit was %d (max %d), setting to %d\n", | ||||
|           rl.rlim_cur, rl.rlim_max, NEW_MAX); | ||||
|  | ||||
|   rl.rlim_cur = rl.rlim_max = NEW_MAX; | ||||
|   ret = setrlimit(RLIMIT_NOFILE, &rl); | ||||
|   if(ret != 0) { | ||||
|     fprintf(stderr, "Unable to set open file limit.\n" | ||||
|             "(setrlimit(RLIMIT_NOFILE, &rl) failed)\n" | ||||
|             "(%d, %s)", errno, strerror(errno)); | ||||
|     return 1; | ||||
|   } | ||||
|  | ||||
|   ret = getrlimit(RLIMIT_NOFILE, &rl); | ||||
|   if(ret != 0) { | ||||
|     fprintf(stderr, "Unable to read new open file limit.\n" | ||||
|             "(getrlimit(RLIMIT_NOFILE, &rl) failed)\n" | ||||
|             "(%d, %s)", errno, strerror(errno)); | ||||
|     return 1; | ||||
|   } | ||||
|   if(rl.rlim_cur < NEW_MAX) { | ||||
|     fprintf(stderr, "Failed to set new open file limit.\n" | ||||
|             "Limit is %d, expected %d\n", | ||||
|             rl.rlim_cur, NEW_MAX); | ||||
|     return 1; | ||||
|   } | ||||
|  | ||||
|   if(setgid(GID) != 0) { | ||||
|     fprintf(stderr, "setgid failed (%d, %s)\n", errno, strerror(errno)); | ||||
|     return 1; | ||||
|   } | ||||
|   if(setuid(UID) != 0) { | ||||
|     fprintf(stderr, "setuid failed (%d, %s)\n", errno, strerror(errno)); | ||||
|     return 1; | ||||
|   } | ||||
|  | ||||
|   ret = execv(brgv[0], brgv); | ||||
|  | ||||
|   fprintf(stderr, "execl returned, failure\n" | ||||
|           "returned %d, errno is %d (%s)\n", | ||||
|           ret, errno, strerror(errno)); | ||||
|   return 1; | ||||
| } | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -65,9 +65,11 @@ extern "C" { | ||||
|  * We want the typedef curl_off_t setup for large file support on all | ||||
|  * platforms. We also provide a CURL_FORMAT_OFF_T define to use in *printf | ||||
|  * format strings when outputting a variable of type curl_off_t. | ||||
|  * | ||||
|  * Note: "pocc -Ze" is MSVC compatibily mode and this sets _MSC_VER! | ||||
|  */ | ||||
|  | ||||
| #if defined(_MSC_VER) || defined(__LCC__) | ||||
| #if (defined(_MSC_VER) && !defined(__POCC__)) || (defined(__LCC__) && defined(WIN32)) | ||||
| /* MSVC */ | ||||
| #ifdef _WIN32_WCE | ||||
|   typedef long curl_off_t; | ||||
| @@ -76,7 +78,7 @@ extern "C" { | ||||
|   typedef signed __int64 curl_off_t; | ||||
| #define CURL_FORMAT_OFF_T "%I64d" | ||||
| #endif | ||||
| #else /* _MSC_VER || __LCC__ */ | ||||
| #else /* (_MSC_VER && !__POCC__) || (__LCC__ && WIN32) */ | ||||
| #if (defined(__GNUC__) && defined(WIN32)) || defined(__WATCOMC__) | ||||
| /* gcc on windows or Watcom */ | ||||
|   typedef long long curl_off_t; | ||||
| @@ -108,7 +110,7 @@ extern "C" { | ||||
| #define CURL_FORMAT_OFF_T "%ld" | ||||
| #endif | ||||
| #endif /* GCC or Watcom on Windows */ | ||||
| #endif /* _MSC_VER || __LCC__ */ | ||||
| #endif /* (_MSC_VER && !__POCC__) || (__LCC__ && WIN32) */ | ||||
|  | ||||
| #ifdef UNDEF_FILE_OFFSET_BITS | ||||
| /* this was defined above for our checks, undefine it again */ | ||||
| @@ -379,6 +381,15 @@ typedef enum { | ||||
|   CURLFTPAUTH_LAST /* not an option, never use */ | ||||
| } curl_ftpauth; | ||||
|  | ||||
| /* parameter for the CURLOPT_FTP_FILEMETHOD option */ | ||||
| typedef enum { | ||||
|   CURLFTPMETHOD_DEFAULT,   /* let libcurl pick */ | ||||
|   CURLFTPMETHOD_MULTICWD,  /* single CWD operation for each path part */ | ||||
|   CURLFTPMETHOD_NOCWD,     /* no CWD at all */ | ||||
|   CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ | ||||
|   CURLFTPMETHOD_LAST       /* not an option, never use */ | ||||
| } curl_ftpmethod; | ||||
|  | ||||
| /* long may be 32 or 64 bits, but we should never depend on anything else | ||||
|    but 32 */ | ||||
| #define CURLOPTTYPE_LONG          0 | ||||
| @@ -400,7 +411,8 @@ typedef enum { | ||||
|  * platforms. | ||||
|  */ | ||||
| #if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ | ||||
|   defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) | ||||
|   defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ | ||||
|   defined(__POCC__) | ||||
|   /* This compiler is believed to have an ISO compatible preprocessor */ | ||||
| #define CURL_ISOCPP | ||||
| #else | ||||
| @@ -909,6 +921,22 @@ typedef enum { | ||||
|      control connection. */ | ||||
|   CINIT(FTP_SKIP_PASV_IP, LONG, 137), | ||||
|  | ||||
|   /* Select "file method" to use when doing FTP, see the curl_ftpmethod | ||||
|      above. */ | ||||
|   CINIT(FTP_FILEMETHOD, LONG, 138), | ||||
|  | ||||
|   /* Local port number to bind the socket to */ | ||||
|   CINIT(LOCALPORT, LONG, 139), | ||||
|  | ||||
|   /* Number of ports to try, including the first one set with LOCALPORT. | ||||
|      Thus, setting it to 1 will make no additional attempts but the first. | ||||
|   */ | ||||
|   CINIT(LOCALPORTRANGE, LONG, 140), | ||||
|  | ||||
|   /* no transfer, set up connection and let application use the socket by | ||||
|      extracting it with CURLINFO_LASTSOCKET */ | ||||
|   CINIT(CONNECT_ONLY, LONG, 141), | ||||
|  | ||||
|   CURLOPT_LASTENTRY /* the last unused */ | ||||
| } CURLoption; | ||||
|  | ||||
| @@ -1263,9 +1291,10 @@ typedef enum { | ||||
|   CURLINFO_NUM_CONNECTS     = CURLINFO_LONG   + 26, | ||||
|   CURLINFO_SSL_ENGINES      = CURLINFO_SLIST  + 27, | ||||
|   CURLINFO_COOKIELIST       = CURLINFO_SLIST  + 28, | ||||
|   CURLINFO_LASTSOCKET       = CURLINFO_LONG   + 29, | ||||
|   /* Fill in new entries below here! */ | ||||
|  | ||||
|   CURLINFO_LASTONE          = 28 | ||||
|   CURLINFO_LASTONE          = 29 | ||||
| } CURLINFO; | ||||
|  | ||||
| /* CURLINFO_RESPONSE_CODE is the new name for the option previously known as | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -28,13 +28,13 @@ | ||||
|  | ||||
| /* This is the version number of the libcurl package from which this header | ||||
|    file origins: */ | ||||
| #define LIBCURL_VERSION "7.15.0-CVS" | ||||
| #define LIBCURL_VERSION "7.15.3-CVS" | ||||
|  | ||||
| /* The numeric version number is also available "in parts" by using these | ||||
|    defines: */ | ||||
| #define LIBCURL_VERSION_MAJOR 7 | ||||
| #define LIBCURL_VERSION_MINOR 15 | ||||
| #define LIBCURL_VERSION_PATCH 0 | ||||
| #define LIBCURL_VERSION_PATCH 3 | ||||
|  | ||||
| /* This is the numeric version of the libcurl version number, meant for easier | ||||
|    parsing and comparions by programs. The LIBCURL_VERSION_NUM define will | ||||
| @@ -51,8 +51,6 @@ | ||||
|    and it is always a greater number in a more recent release. It makes | ||||
|    comparisons with greater than and less than work. | ||||
| */ | ||||
| #define LIBCURL_VERSION_NUM ((LIBCURL_VERSION_MAJOR << 16) | \ | ||||
|                              (LIBCURL_VERSION_MINOR << 8) | \ | ||||
|                              LIBCURL_VERSION_PATCH) | ||||
| #define LIBCURL_VERSION_NUM 0x070f03 | ||||
|  | ||||
| #endif /* __CURL_CURLVER_H */ | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| #ifndef __CURL_MPRINTF_H | ||||
| #define __CURL_MPRINTF_H | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
| @@ -5,7 +7,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 | ||||
| @@ -21,9 +23,6 @@ | ||||
|  * $Id$ | ||||
|  ***************************************************************************/ | ||||
|  | ||||
| #ifndef H_MPRINTF | ||||
| #define H_MPRINTF | ||||
|  | ||||
| #include <stdarg.h> | ||||
| #include <stdio.h> /* needed for FILE */ | ||||
|  | ||||
| @@ -53,4 +52,4 @@ CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); | ||||
| # define vaprintf curl_mvaprintf | ||||
| #endif | ||||
|  | ||||
| #endif /* H_MPRINTF */ | ||||
| #endif /* __CURL_MPRINTF_H */ | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -55,7 +55,7 @@ | ||||
| /* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish | ||||
|    libc5-based Linux systems. Only include it on system that are known to | ||||
|    require it! */ | ||||
| #if defined(_AIX) || defined(NETWARE) | ||||
| #if defined(_AIX) || defined(NETWARE) || defined(__NetBSD__) | ||||
| #include <sys/select.h> | ||||
| #endif | ||||
|  | ||||
| @@ -66,6 +66,15 @@ | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * This header file should not really need to include "curl.h" since curl.h | ||||
|  * itself includes this file and we expect user applications to do #include | ||||
|  * <curl/curl.h> without the need for especially including multi.h. | ||||
|  * | ||||
|  * For some reason we added this include here at one point, and rather than to | ||||
|  * break existing (wrongly written) libcurl applications, we leave it as-is | ||||
|  * but with this warning attached. | ||||
|  */ | ||||
| #include "curl.h" | ||||
|  | ||||
| #ifdef  __cplusplus | ||||
| @@ -241,50 +250,8 @@ CURL_EXTERN const char *curl_multi_strerror(CURLMcode); | ||||
|  * | ||||
|  * 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 | ||||
|  *          detected to have "action" on them and let libcurl perform. | ||||
|  *          See man page for details. | ||||
|  */ | ||||
| #define CURL_POLL_NONE   0 | ||||
| #define CURL_POLL_IN     1 | ||||
| @@ -299,7 +266,6 @@ CURL_EXTERN const char *curl_multi_strerror(CURLMcode); | ||||
| 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, | ||||
|   | ||||
| @@ -8,10 +8,11 @@ TARGETS = libcurl_wc.lib libcurl_wc.dll libcurl_wc_imp.lib | ||||
|  | ||||
| CC = wcc386 | ||||
|  | ||||
| CFLAGS = -3r -mf -d3 -hc -zff -zgf -zq -zm -s -fr=con -w2 -fpi -oilrtfm -bt=nt -bd & | ||||
| CFLAGS = -3r -mf -d3 -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm -bt=nt -bd & | ||||
|          -d+ -dWIN32 -dHAVE_LONGLONG -dCURL_CA_BUNDLE=getenv("CURL_CA_BUNDLE")     & | ||||
|          -dBUILDING_LIBCURL -dWITHOUT_MM_LIB -dHAVE_SPNEGO=1 -dENABLE_IPV6         & | ||||
|          -dDEBUG_THREADING_GETADDRINFO -dDEBUG=1 -dCURLDEBUG -I. -I..\include | ||||
|          -dDEBUG_THREADING_GETADDRINFO -dDEBUG=1 -dCURLDEBUG -d_WIN32_WINNT=0x0501 & | ||||
|          -I. -I..\include | ||||
|  | ||||
| OBJ_DIR  = Watcom_obj | ||||
| LIB_ARG  = $(OBJ_DIR)\wlib.arg | ||||
|   | ||||
| @@ -18,5 +18,6 @@ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h	\ | ||||
|   share.h md5.h http_digest.h http_negotiate.h http_ntlm.h ca-bundle.h	\ | ||||
|   inet_pton.h strtoofft.h strerror.h inet_ntop.h curlx.h memory.h	\ | ||||
|   setup.h transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h   \ | ||||
|   gtls.h tftp.h | ||||
|   gtls.h tftp.h sockaddr.h | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -19,7 +19,6 @@ | ||||
| # files in the "cfg" directory, but then the make file | ||||
| # in \src would need to be changed. | ||||
| # | ||||
| # $Id: Makefile.vc6,v 1.17 2004/01/13 08:57:01 bagder Exp $ | ||||
| ############################################################## | ||||
|  | ||||
| # | ||||
| @@ -67,8 +66,8 @@ USEMM_LIBS = YES | ||||
| ############################################################# | ||||
| ## Nothing more to do below this line! | ||||
|  | ||||
| CCNODBG    = cl.exe /MD /O2 /DNDEBUG | ||||
| CCDEBUG    = cl.exe /MDd /Od /Gm /Zi /D_DEBUG /GZ | ||||
| CCNODBG    = cl.exe /O2 /DNDEBUG | ||||
| CCDEBUG    = cl.exe /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 | ||||
| @@ -90,9 +89,20 @@ CFGSET     = FALSE | ||||
|  | ||||
| !IFDEF WINDOWS_SSPI | ||||
| CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include | ||||
| LFLAGS = $(LFLAGS) $(WINDOWS_SDK_PATH)\lib\secur32.lib | ||||
| !ENDIF | ||||
|  | ||||
| ############################################################## | ||||
| # Runtime library configuration | ||||
|  | ||||
| RTLIB   = /MD | ||||
| RTLIBD  = /MDd | ||||
|  | ||||
| !IF "$(RTLIBCFG)" == "static" | ||||
| RTLIB  = /MT | ||||
| RTLIBD = /MTd | ||||
| !ENDIF | ||||
|  | ||||
|  | ||||
| ###################### | ||||
| # release | ||||
|  | ||||
| @@ -100,7 +110,7 @@ LFLAGS = $(LFLAGS) $(WINDOWS_SDK_PATH)\lib\secur32.lib | ||||
| TARGET = $(LIB_NAME).lib | ||||
| DIROBJ = $(CFG) | ||||
| LNK    = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC     = $(CCNODBG) $(CFLAGSLIB) | ||||
| CC     = $(CCNODBG) $(RTLIB) $(CFLAGSLIB) | ||||
| CFGSET = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -112,7 +122,7 @@ TARGET   = $(LIB_NAME).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CC       = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -122,7 +132,7 @@ CFGSET   = TRUE | ||||
| !IF "$(CFG)" == "release-dll" | ||||
| TARGET = $(LIB_NAME).dll | ||||
| DIROBJ = $(CFG) | ||||
| LNK    = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||
| LNK    = $(LNKDLL) $(RTLIB) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||
| CC     = $(CCNODBG) | ||||
| CFGSET = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| @@ -136,7 +146,7 @@ TARGET   = $(LIB_NAME).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||
| LNK      = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSLIB) | ||||
| CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -144,11 +154,11 @@ CFGSET   = TRUE | ||||
| # release-ssl-dll | ||||
|  | ||||
| !IF "$(CFG)" == "release-ssl-dll" | ||||
| TARGET   = $(LIB_NAME).dll | ||||
| TARGET   = $(LIB_NAME).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||
| LNK      = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) $(SSLLIBS) $(LFLAGSSSL) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) | ||||
| LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -161,7 +171,7 @@ DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -173,7 +183,7 @@ TARGET   = $(LIB_NAME).dll | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) | ||||
| CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) | ||||
| CFGSET   = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| !ENDIF | ||||
| @@ -186,7 +196,7 @@ TARGET   = $(LIB_NAME).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCNODBG) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CC       = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -199,7 +209,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) $(CFLAGSLIB) | ||||
| CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -211,7 +221,7 @@ TARGET   = $(LIB_NAME).dll | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||
| CC       = $(CCNODBG) $(CFLAGSZLIB) | ||||
| CC       = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) | ||||
| CFGSET   = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| !ENDIF | ||||
| @@ -225,7 +235,7 @@ DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB) | ||||
| CC       = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) | ||||
| CFGSET   = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| !ENDIF | ||||
| @@ -237,7 +247,7 @@ RESOURCE = $(DIROBJ)\libcurl.res | ||||
| TARGET = $(LIB_NAME_DEBUG).lib | ||||
| DIROBJ = $(CFG) | ||||
| LNK    = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC     = $(CCDEBUG) $(CFLAGSLIB) | ||||
| CC     = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB) | ||||
| CFGSET = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -248,8 +258,8 @@ CFGSET = TRUE | ||||
| TARGET   = $(LIB_NAME_DEBUG).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||
| LNK      = $(LNKLIB) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSLIB) | ||||
| LNK      = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -261,7 +271,7 @@ TARGET   = $(LIB_NAME_DEBUG).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -273,7 +283,7 @@ TARGET   = $(LIB_NAME_DEBUG).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll | ||||
| LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSLIB) | ||||
| CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -285,8 +295,8 @@ TARGET   = $(LIB_NAME_DEBUG).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" | ||||
| LNK      = $(LNKLIB) $(SSLLIBS) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| LNK      = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -298,7 +308,7 @@ TARGET   = $(LIB_NAME_DEBUG).lib | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) | ||||
| CC       = $(CCDEBUG) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -311,7 +321,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) $(CFLAGSLIB) | ||||
| CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
|  | ||||
| @@ -322,7 +332,7 @@ CFGSET   = TRUE | ||||
| TARGET = $(LIB_NAME_DEBUG).dll | ||||
| DIROBJ = $(CFG) | ||||
| LNK    = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| CC     = $(CCDEBUG) | ||||
| CC     = $(CCDEBUG) $(RTLIBD)  | ||||
| CFGSET = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| !ENDIF | ||||
| @@ -335,7 +345,7 @@ TARGET   = $(LIB_NAME_DEBUG).dll | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) | ||||
| CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) | ||||
| CFGSET   = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| !ENDIF | ||||
| @@ -348,7 +358,7 @@ TARGET   = $(LIB_NAME_DEBUG).dll | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| CC       = $(CCDEBUG) $(CFLAGSZLIB) | ||||
| CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) | ||||
| CFGSET   = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| !ENDIF | ||||
| @@ -362,7 +372,7 @@ DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB) | ||||
| CC       = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) | ||||
| CFGSET   = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| !ENDIF | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user