Compare commits
	
		
			1101 Commits
		
	
	
		
			curl-7_15_
			...
			curl-7_16_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | b122959c8b | ||
|   | 84c5e846b3 | ||
|   | 47f044265e | ||
|   | d46d995766 | ||
|   | 1a0cc60741 | ||
|   | 7cbbd1b56b | ||
|   | 5daa6b9367 | ||
|   | a7aca2e8af | ||
|   | d8d3dc9302 | ||
|   | 5be7b543d8 | ||
|   | 910ee13b20 | ||
|   | 35935d71d2 | ||
|   | de17f4436e | ||
|   | be5ade5c7a | ||
|   | 0e05a6329a | ||
|   | c518c52aba | ||
|   | e4c28abdc1 | ||
|   | a11374d994 | ||
|   | d9e89e170f | ||
|   | 47594be5c0 | ||
|   | 0d635a1119 | ||
|   | e9ffa9a3b8 | ||
|   | 248a5381d4 | ||
|   | c1ab3e2d59 | ||
|   | c895dc8a19 | ||
|   | a0a79ce853 | ||
|   | 70f9a13ecb | ||
|   | c321b9f704 | ||
|   | 7e74349b86 | ||
|   | fd016fb3ee | ||
|   | 09dd2d3856 | ||
|   | 5625e5d5b8 | ||
|   | 8a529bd987 | ||
|   | 8fe9376d54 | ||
|   | a1f72943e9 | ||
|   | 0969a96732 | ||
|   | ec8019b2a8 | ||
|   | 27d2d78059 | ||
|   | 7d48d851a2 | ||
|   | 6a2cecf153 | ||
|   | 990b15e402 | ||
|   | 584f3639e3 | ||
|   | 2886ce96b0 | ||
|   | 3344142b87 | ||
|   | f1b4f5e2ae | ||
|   | bcf0af9ddb | ||
|   | 70550a0572 | ||
|   | d7088d1032 | ||
|   | d07a874899 | ||
|   | c420113795 | ||
|   | 5c850b825b | ||
|   | 7bbad0b534 | ||
|   | 305e03905f | ||
|   | 161be66c89 | ||
|   | 4095c9de37 | ||
|   | 20d33ad7e5 | ||
|   | b8c12fe658 | ||
|   | e4d4ee8db5 | ||
|   | 8a7d58378b | ||
|   | bdbaedc452 | ||
|   | 0839621f47 | ||
|   | bf2c1e099c | ||
|   | 6c6e4710b5 | ||
|   | 5e7164f87a | ||
|   | ef10eaeb29 | ||
|   | fce4dcccd8 | ||
|   | f2beee209b | ||
|   | 9d8b22d3de | ||
|   | 5796c7b132 | ||
|   | dc2ea33e32 | ||
|   | c1f117700a | ||
|   | 7ea90c46eb | ||
|   | 4d9e24d1e4 | ||
|   | 1f236ba108 | ||
|   | d27813c2dd | ||
|   | 453e9b0dce | ||
|   | b8626c3df8 | ||
|   | f8d78d57a7 | ||
|   | 371a25eee9 | ||
|   | e535a71c71 | ||
|   | b9e5fecf5f | ||
|   | 3af08472ad | ||
|   | fdc1b61507 | ||
|   | 7fd154f094 | ||
|   | a209c32bf3 | ||
|   | 75db459f0a | ||
|   | 74e54c5a49 | ||
|   | 6fc151577e | ||
|   | 3dcc7202d5 | ||
|   | 40981286ea | ||
|   | f55a1c3a6c | ||
|   | c5586a65c2 | ||
|   | ffb11ad5c6 | ||
|   | fbb1e49215 | ||
|   | c26320d94f | ||
|   | f6e892b1b6 | ||
|   | 59302d4ba0 | ||
|   | c563a53c16 | ||
|   | 7763bb9172 | ||
|   | e37a49086e | ||
|   | a1e5c621c0 | ||
|   | f776c1d2eb | ||
|   | 3d5a8515a6 | ||
|   | 42a7905205 | ||
|   | bfa0f8c6c2 | ||
|   | 869d192ffc | ||
|   | 60bc103a78 | ||
|   | 8a0a7ce3a8 | ||
|   | 31b1e988f4 | ||
|   | 25c064c888 | ||
|   | 884171aecf | ||
|   | 45b2577974 | ||
|   | d58c7a8bdd | ||
|   | eed47311f8 | ||
|   | 59eaae42b8 | ||
|   | 59c620bfa5 | ||
|   | 4294cac701 | ||
|   | 282127fbff | ||
|   | d49e9fad19 | ||
|   | fba4cd0e62 | ||
|   | 2166645ce4 | ||
|   | 844f5b6b45 | ||
|   | 424063235b | ||
|   | 8272abef28 | ||
|   | 5fbc93c3eb | ||
|   | 8851df41c5 | ||
|   | a6f4612154 | ||
|   | 52e5e869e6 | ||
|   | 12ef1035bb | ||
|   | 6c56b5301f | ||
|   | 07b6625573 | ||
|   | fa0780bb91 | ||
|   | f08ac86834 | ||
|   | d6eca89229 | ||
|   | 2bd1d7e996 | ||
|   | 3b355421ec | ||
|   | 0dd1219668 | ||
|   | b7131009fb | ||
|   | 3d528e1b15 | ||
|   | f9a339a225 | ||
|   | 0043e87014 | ||
|   | 0f634a0c89 | ||
|   | 047cd1a533 | ||
|   | f9eb61e90a | ||
|   | 34afb0b257 | ||
|   | 6bb9bd8b69 | ||
|   | 72175c738f | ||
|   | 2288094b26 | ||
|   | 273b2b230b | ||
|   | 3229a80c9f | ||
|   | 5eba84eed3 | ||
|   | 4fb483012c | ||
|   | f1a8fd843f | ||
|   | 8920606b8b | ||
|   | 90ce18019c | ||
|   | fe10cb2ef5 | ||
|   | 842be6c52f | ||
|   | e4b754f64e | ||
|   | 34ed4642ec | ||
|   | 248f057137 | ||
|   | 2b6a0c0a7c | ||
|   | 072a8b2955 | ||
|   | 0c817b6614 | ||
|   | e9cbd0c366 | ||
|   | ff314d7600 | ||
|   | d052e545af | ||
|   | da2b75a026 | ||
|   | 0e2d3b7b6c | ||
|   | 46a50aa001 | ||
|   | 605a391178 | ||
|   | de6f82d094 | ||
|   | c1f3edbdd1 | ||
|   | a20a6f67c5 | ||
|   | 75931492c3 | ||
|   | 800b55c702 | ||
|   | a53411c0dd | ||
|   | b169aa2992 | ||
|   | 9189ac1141 | ||
|   | 5c7c79bd08 | ||
|   | 8605321d06 | ||
|   | d314453037 | ||
|   | 9cb69f77f1 | ||
|   | ee332e0c8e | ||
|   | 0188493d54 | ||
|   | ae07fd2ba8 | ||
|   | d76a734043 | ||
|   | b66def2b4c | ||
|   | 20b9ab49a7 | ||
|   | c8cd13337e | ||
|   | 40e9e40cb4 | ||
|   | 09c70dec08 | ||
|   | 0dc570862a | ||
|   | dbaf4f9361 | ||
|   | 433575068c | ||
|   | 40087ce7c0 | ||
|   | e12d46ac50 | ||
|   | 1e55ed5c7d | ||
|   | 6dd4fe0740 | ||
|   | 3789e2e6ce | ||
|   | 1962ebf8e7 | ||
|   | 7c144d5a7e | ||
|   | 0f0540d00b | ||
|   | 3f29ed6d44 | ||
|   | 1bfa7dfe39 | ||
|   | 85daec253c | ||
|   | 389a15a867 | ||
|   | 74befdfbe0 | ||
|   | d31feb8ff9 | ||
|   | 4c3568bfd6 | ||
|   | b4ef5e22e0 | ||
|   | 23786eae32 | ||
|   | c84f84c70d | ||
|   | e5f8e5e57a | ||
|   | 53a3abc76b | ||
|   | bfd6474f6b | ||
|   | d3b89e114a | ||
|   | aeddea2b71 | ||
|   | cef5b14baa | ||
|   | 82d310d0d9 | ||
|   | 4fdb42377b | ||
|   | be8a5d0aef | ||
|   | dd433679e6 | ||
|   | 99dcd33f04 | ||
|   | e817eb6cec | ||
|   | 060f7ca2d2 | ||
|   | 638c715a51 | ||
|   | af9a63287e | ||
|   | 00f36c5f45 | ||
|   | e69d82a5fb | ||
|   | d165da07fe | ||
|   | 15363cd6dc | ||
|   | b3272fd799 | ||
|   | fa31335926 | ||
|   | acc4cf87cd | ||
|   | 7444342675 | ||
|   | ee1235a7cd | ||
|   | c514a2a89a | ||
|   | e2f0580dfe | ||
|   | d165bed2d6 | ||
|   | 802a5b618e | ||
|   | 1ca763d1d1 | ||
|   | 8b26c93a59 | ||
|   | b819c72700 | ||
|   | d2cfb7fd13 | ||
|   | e37973913d | ||
|   | 8b5295d003 | ||
|   | fe0afb211e | ||
|   | 141b3d0c2f | ||
|   | 2a6a22a3b0 | ||
|   | 4937281ddc | ||
|   | 8e27ed2fdd | ||
|   | 9bf9617ad6 | ||
|   | 69565afab0 | ||
|   | 39aac63521 | ||
|   | f19d333ef6 | ||
|   | 3a634a273a | ||
|   | 06d1b029f6 | ||
|   | 45bf417301 | ||
|   | 48029d7e74 | ||
|   | 83e078256c | ||
|   | 2f5e99ca02 | ||
|   | 6014c21bc9 | ||
|   | 8c0b1dc3c5 | ||
|   | be3c5f0b94 | ||
|   | e268e8559e | ||
|   | 29bb6f65f1 | ||
|   | 37f07a54bd | ||
|   | da8c666e4f | ||
|   | c11681becd | ||
|   | 78a1e5d1a6 | ||
|   | 116f60e063 | ||
|   | 7725853446 | ||
|   | 9993e2121d | ||
|   | 9a70ce4245 | ||
|   | 7ba53a4f41 | ||
|   | 1297c54b26 | ||
|   | 1045b8d382 | ||
|   | d2bdad5945 | ||
|   | 17e8d60c01 | ||
|   | ec1b351317 | ||
|   | 75fca27f8e | ||
|   | f2cd2882a0 | ||
|   | 07d8a14ec0 | ||
|   | 31e598d2f3 | ||
|   | cbf58d88d0 | ||
|   | 300cbc2e21 | ||
|   | ec9e399668 | ||
|   | 2691f1efc8 | ||
|   | d9bf55570b | ||
|   | b54a8531a9 | ||
|   | 789fd0b74a | ||
|   | 8103915797 | ||
|   | c461254dea | ||
|   | 3f140a6008 | ||
|   | a0a47f2767 | ||
|   | 213017e9cf | ||
|   | 69f2f5cb6f | ||
|   | d46cab4a94 | ||
|   | 4dc453c087 | ||
|   | a1d5983991 | ||
|   | 4894ce16fc | ||
|   | aa4435c23b | ||
|   | dca8f962e0 | ||
|   | 059b57677c | ||
|   | 9896421586 | ||
|   | 6663608d15 | ||
|   | d21e4eb8ae | ||
|   | d381dd68cf | ||
|   | 7a97e66fb3 | ||
|   | d86e6d3ed2 | ||
|   | f99ca90540 | ||
|   | e24cb6cb90 | ||
|   | b05f408348 | ||
|   | c5e7d839d5 | ||
|   | e3ade3ccb5 | ||
|   | 71afe05b9f | ||
|   | 5a267c4312 | ||
|   | fbcf86b83e | ||
|   | 5c3f36b4b4 | ||
|   | 9de4e5ebe4 | ||
|   | 7033a1c072 | ||
|   | 4efa0d9f68 | ||
|   | e021fe9444 | ||
|   | 23d1041bd8 | ||
|   | be71ccbce3 | ||
|   | 0db485a448 | ||
|   | 6d05a33ed9 | ||
|   | 569c169559 | ||
|   | ecbc7f89c0 | ||
|   | 5649b738be | ||
|   | 0f9f6cf180 | ||
|   | 7f70dbcad5 | ||
|   | 28b932fb4e | ||
|   | a631741141 | ||
|   | c7d0966201 | ||
|   | cf491357b6 | ||
|   | 02c17651bf | ||
|   | 890b34d22e | ||
|   | e89fb10736 | ||
|   | 48e8b52fbb | ||
|   | 61f19c6ca3 | ||
|   | 8c9233f6b2 | ||
|   | 6fcf98f617 | ||
|   | 2f4fe0175b | ||
|   | 9f62ff5df6 | ||
|   | 4e3f3e751e | ||
|   | 04e6568a7e | ||
|   | 7a39b98471 | ||
|   | 4ab91a93e8 | ||
|   | 6647ca6ec5 | ||
|   | 529e01736c | ||
|   | 078fc4186b | ||
|   | fabbb3fc34 | ||
|   | 1db063e705 | ||
|   | 1fa9ef246a | ||
|   | e12220cc4c | ||
|   | 77fcad041f | ||
|   | e213555c98 | ||
|   | 3a813b3c3b | ||
|   | 028a9d6785 | ||
|   | d0aca8017f | ||
|   | 91386937ff | ||
|   | 0fc51ac5a6 | ||
|   | bc2183b440 | ||
|   | 01c4fba15c | ||
|   | 9b6474378a | ||
|   | 5446ed4733 | ||
|   | a50414f594 | ||
|   | fe7fa8e794 | ||
|   | 6a175b42db | ||
|   | a7748c2024 | ||
|   | 8f87c15bda | ||
|   | 82f52e5a6f | ||
|   | 67d2dd62f9 | ||
|   | 138b4f27b4 | ||
|   | c26ec47e90 | ||
|   | 8337a375dd | ||
|   | 8260243be1 | ||
|   | ef6f24a7ce | ||
|   | abe90019d3 | ||
|   | c185cdf2b4 | ||
|   | f71c8c7d84 | ||
|   | d32f1390b3 | ||
|   | 68f3c2adca | ||
|   | 2a8e2edf83 | ||
|   | 401598c2fe | ||
|   | d60848d04b | ||
|   | d2dd3d7e16 | ||
|   | 1c63ceb317 | ||
|   | c25283185a | ||
|   | 54db98c220 | ||
|   | 5565f45f5e | ||
|   | 49c4d9c9cd | ||
|   | c2639e0738 | ||
|   | e485a23a3e | ||
|   | d7d5baa0e2 | ||
|   | e1e55e4d04 | ||
|   | 1eb530d8dc | ||
|   | bad67830b3 | ||
|   | db22c83031 | ||
|   | a4b39c6ab8 | ||
|   | d10e174fd1 | ||
|   | e994c6af75 | ||
|   | ef442d5803 | ||
|   | 8680e010c2 | ||
|   | 4d8dcf7b77 | ||
|   | abdbd3100f | ||
|   | ddace02efe | ||
|   | 1f4c8c4f09 | ||
|   | 8162b32bad | ||
|   | daf527b276 | ||
|   | ee51c07be6 | ||
|   | 856ba4c6c6 | ||
|   | b3e23373bd | ||
|   | e5adab39b1 | ||
|   | d31153584e | ||
|   | 823d296e12 | ||
|   | e09450103b | ||
|   | fbc4407583 | ||
|   | a79e5d7925 | ||
|   | 82491d5c06 | ||
|   | b6f889085d | ||
|   | cdbbb7d900 | ||
|   | 2bf4d9a22c | ||
|   | f1918aa343 | ||
|   | 56580fc6f8 | ||
|   | 2e6600425e | ||
|   | cc021fc200 | ||
|   | e6aed92742 | ||
|   | 02fb4d96d1 | ||
|   | 43e3c5e5fa | ||
|   | 4f496f2f70 | ||
|   | d681bc7520 | ||
|   | f21a2b3270 | ||
|   | 5f5a28d20e | ||
|   | 89f9cb4041 | ||
|   | 2b280bcc69 | ||
|   | 1c0224be42 | ||
|   | dbdb7fa55a | ||
|   | 83a43bea8a | ||
|   | abb4cdafe9 | ||
|   | 2b7bcf2505 | ||
|   | 5aefdd93cb | ||
|   | 4b27fae069 | ||
|   | 10a13eba72 | ||
|   | 44ac2776ae | ||
|   | 36e3e6ed16 | ||
|   | 5f9cbc4209 | ||
|   | 3239f059b8 | ||
|   | 45bac25d90 | ||
|   | 354c8dcd82 | ||
|   | b1e4cc370d | ||
|   | 2293474b90 | ||
|   | 9e1aef7183 | ||
|   | f68323da7d | ||
|   | a61aafa325 | ||
|   | 33bea767eb | ||
|   | 9ab7cda010 | ||
|   | 6da70628c6 | ||
|   | 3bae748256 | ||
|   | 521c4b303d | ||
|   | a2effd123a | ||
|   | 7b704e173c | ||
|   | 6045d051d7 | ||
|   | cfe00ed4ad | ||
|   | 0b4bdcf18f | ||
|   | 8cade952bf | ||
|   | 385e612fa5 | ||
|   | 1886388791 | ||
|   | 32fe5b14ec | ||
|   | bbdc483671 | ||
|   | f11d3c329c | ||
|   | b0d13fa4cb | ||
|   | 0fb5a65a58 | ||
|   | c8afb02b4c | ||
|   | 869d65337e | ||
|   | 277df1c6b1 | ||
|   | 5ec5b95f54 | ||
|   | 9e61c904ac | ||
|   | 7efb955fd0 | ||
|   | 75899741b9 | ||
|   | d465199411 | ||
|   | 55123424c8 | ||
|   | f5e4a78b59 | ||
|   | 7515a75206 | ||
|   | 4750e6f3c5 | ||
|   | b7aaa4d907 | ||
|   | e61e09f658 | ||
|   | 058e993acb | ||
|   | 359d500908 | ||
|   | cb42855445 | ||
|   | d8ff0336a5 | ||
|   | 0682d25da5 | ||
|   | d86d14074d | ||
|   | 8500397cf1 | ||
|   | bd600fbebe | ||
|   | 064bbb999f | ||
|   | bedc61ac45 | ||
|   | 61a6992559 | ||
|   | ebee2e323d | ||
|   | b2f8de571f | ||
|   | cb4a5f5a2b | ||
|   | 1beb7de7e0 | ||
|   | 89ab5f4380 | ||
|   | 439b84c782 | ||
|   | 0e899d7728 | ||
|   | 1a85fb2bd0 | ||
|   | 8d11767048 | ||
|   | fcccf9aa0d | ||
|   | 72bd027537 | ||
|   | 1d44c9ccc1 | ||
|   | 33831759b5 | ||
|   | 6fe932b255 | ||
|   | 8da02df8e0 | ||
|   | 587c99351d | ||
|   | 88c8d72a21 | ||
|   | cf99fed17a | ||
|   | ca48b6bf35 | ||
|   | 4dcd606b47 | ||
|   | 393ddd6e1f | ||
|   | 840e796aa9 | ||
|   | 5fd096da8d | ||
|   | eb29c5c285 | ||
|   | 1eb286e43e | ||
|   | ae76ebe2d1 | ||
|   | e4505aefd9 | ||
|   | d6b0612882 | ||
|   | 4c65eb0af8 | ||
|   | 318a8258fd | ||
|   | 17ae28e0fe | ||
|   | 3c4f622479 | ||
|   | 3ce43764be | ||
|   | b555c60e49 | ||
|   | 2336d010ef | ||
|   | b9af0d89d5 | ||
|   | 6f2afe0c30 | ||
|   | d8c61d459e | ||
|   | 7ae5ebbeb2 | ||
|   | 7335b71dfb | ||
|   | 9583b03074 | ||
|   | 3c81d5f125 | ||
|   | 688699a046 | ||
|   | 090f5a9a45 | ||
|   | da58d03ff7 | ||
|   | 9ea3831c08 | ||
|   | a46f55b9de | ||
|   | a634f64400 | ||
|   | bcd8a3b240 | ||
|   | 04d5d1895c | ||
|   | abd2775a70 | ||
|   | 73226415fc | ||
|   | ab160ef445 | ||
|   | 268fe09322 | ||
|   | 7a557e984a | ||
|   | f1a55cbe6d | ||
|   | 1e35d95df8 | ||
|   | d8387b418d | ||
|   | adea16a294 | ||
|   | 7f2d5cab2d | ||
|   | c6ff612f6e | ||
|   | 8db353e1d7 | ||
|   | e6978117a7 | ||
|   | 5dcb055077 | ||
|   | 0b5e1a9b2f | ||
|   | 2e17a97474 | ||
|   | 74ddbd8a3b | ||
|   | b8039a821b | ||
|   | 438312f00e | ||
|   | 381ccaa391 | ||
|   | 3204494883 | ||
|   | e264f699d4 | ||
|   | 68d4b77d44 | ||
|   | e1ac99af1f | ||
|   | be0d17e812 | ||
|   | 4eb35406f4 | ||
|   | 624745ab20 | ||
|   | 9354822e09 | ||
|   | 17d4f9513e | ||
|   | f830d77307 | ||
|   | a03c76b228 | ||
|   | 35ad61429d | ||
|   | b5b3d9e5c7 | ||
|   | 6e682c2b01 | ||
|   | 7e2ea2ece0 | ||
|   | 01926d66d7 | ||
|   | 69f7d0a0ce | ||
|   | d1c84705ec | ||
|   | 3274908551 | ||
|   | c730934498 | ||
|   | 471a8b223b | ||
|   | 47ee9202c3 | ||
|   | 1bcbe89802 | ||
|   | bf57e9bb12 | ||
|   | 318a7584f3 | ||
|   | 961ec228d4 | ||
|   | a777eb3d81 | ||
|   | 7f79b52dae | ||
|   | db680edc26 | ||
|   | e6ce80458f | ||
|   | cdcb123aa8 | ||
|   | 78081a1652 | ||
|   | 7408976b15 | ||
|   | 763bb73cc3 | ||
|   | 1dee2cd55e | ||
|   | 426ecfd136 | ||
|   | 4913baed16 | ||
|   | 675f6a8901 | ||
|   | 2147284cad | ||
|   | 7f1870da5f | ||
|   | 2149a095f7 | ||
|   | e8d21adbaa | ||
|   | fa28531322 | ||
|   | deef85ca9a | ||
|   | 4f4427ff41 | ||
|   | 0ed285e84d | ||
|   | 905ca77c9e | ||
|   | 61043c7e74 | ||
|   | 4545c9f22f | ||
|   | ad772d7b48 | ||
|   | a56ef92729 | ||
|   | 561d01c450 | ||
|   | c6c8a30da1 | ||
|   | 914dbeb12c | ||
|   | 56dc90eaab | ||
|   | f51c567de3 | ||
|   | 9b2acca63e | ||
|   | afcd9f1b1c | ||
|   | 755ccbc468 | ||
|   | 0af7aec211 | ||
|   | ee085ad6bd | ||
|   | 719bec2606 | ||
|   | b1db9dbb16 | ||
|   | 609044aea2 | ||
|   | ba481718a4 | ||
|   | 1be60dde7f | ||
|   | e92e811a61 | ||
|   | 5aa0db8681 | ||
|   | d5691211dd | ||
|   | a93695a70e | ||
|   | ce935a2697 | ||
|   | 812ce0d93f | ||
|   | bbae5b49f9 | ||
|   | 772a985dc3 | ||
|   | 8a7514de8a | ||
|   | 32ad212ac9 | ||
|   | 8a8d5c784c | ||
|   | 125830ab4b | ||
|   | 5b75b423e6 | ||
|   | 012d7e2878 | ||
|   | cd3029f36f | ||
|   | 6adaac7e18 | ||
|   | cde5e35d9b | ||
|   | ee17fba72e | ||
|   | 6296b89319 | ||
|   | 5450db9151 | ||
|   | b4700f026b | ||
|   | d771fa7c48 | ||
|   | b2c378267b | ||
|   | 384c8f3560 | ||
|   | f44ef427a2 | ||
|   | c54a4301ee | ||
|   | 36a3514225 | ||
|   | e1edd41e1b | ||
|   | 13e60c55a1 | ||
|   | 9b8b1a68f0 | ||
|   | 4ec9316155 | ||
|   | ef769500d4 | ||
|   | 23692574a2 | ||
|   | 5f6fd682a5 | ||
|   | db24518a30 | ||
|   | 90933ac660 | ||
|   | 087579a6f4 | ||
|   | de59cde155 | ||
|   | 3cd95eacdf | ||
|   | deb81b2ad4 | ||
|   | 4e717cdb30 | ||
|   | 33acd6f041 | ||
|   | 7575e6afc4 | ||
|   | 316a9f6480 | ||
|   | c6de584cad | ||
|   | d997ff6aa8 | ||
|   | b9ccecf86e | ||
|   | bd5d21aaf2 | ||
|   | 19e07771d1 | ||
|   | ef267ab449 | ||
|   | 4f6ed683e8 | ||
|   | c818e7064f | ||
|   | ead6ab2ef7 | ||
|   | 5c3dc49f44 | ||
|   | 83884180ac | ||
|   | 4cac96c33a | ||
|   | 5df4be1165 | ||
|   | 96445f1b7d | ||
|   | 4bdd7596d3 | ||
|   | 18aae32015 | ||
|   | a8996b9e52 | ||
|   | 94095c61d8 | ||
|   | 1cddd744ad | ||
|   | 786738dd00 | ||
|   | 5b8d5fdf2f | ||
|   | 694f31ca37 | ||
|   | 9c1ad0f9f7 | ||
|   | 71c6335293 | ||
|   | 8c38ea4ebc | ||
|   | 44d84ac164 | ||
|   | 930f9bd534 | ||
|   | b61fbbde46 | ||
|   | ec956b0334 | ||
|   | 44ffe0dc79 | ||
|   | e3a61fba52 | ||
|   | 65794f60ec | ||
|   | 7a710b4970 | ||
|   | 0bb20cc611 | ||
|   | 433c0c895e | ||
|   | 67e8d22958 | ||
|   | 10d1fc0e73 | ||
|   | 2260c8aa11 | ||
|   | 97eb62aff8 | ||
|   | 1855fc35f2 | ||
|   | dc3ed35313 | ||
|   | 6b868df554 | ||
|   | 5ccbbe40c2 | ||
|   | 86f93a53d6 | ||
|   | f53347631e | ||
|   | efe3cb6e1a | ||
|   | 32ac4edeed | ||
|   | 4c04c09138 | ||
|   | 47ea80baee | ||
|   | 95c3fa836b | ||
|   | ab60a12465 | ||
|   | 2d38e51867 | ||
|   | a5dda669e3 | ||
|   | 3c4f3a680a | ||
|   | b61c06384a | ||
|   | e7742bfb7c | ||
|   | 22307ae0ee | ||
|   | e150150d9f | ||
|   | 943f0733bb | ||
|   | 8274447dd9 | ||
|   | 083a84e5d0 | ||
|   | d5eb386d00 | ||
|   | 1ce7b48057 | ||
|   | cbcdd337aa | ||
|   | c144adf77c | ||
|   | d390039873 | ||
|   | 7d0c58a285 | ||
|   | 9263001b21 | ||
|   | 66ee6d07f8 | ||
|   | a40dcca794 | ||
|   | 15e3dfe1d3 | ||
|   | a1de9367ec | ||
|   | eceb37bde2 | ||
|   | 56fcf85ab6 | ||
|   | 77db81d661 | ||
|   | 2ad7fcbc2f | ||
|   | 2c62dfd124 | ||
|   | ef66497a0d | ||
|   | 1128029599 | ||
|   | befc30bc55 | ||
|   | ca5846cde9 | ||
|   | 8547ab1663 | ||
|   | 9c0e6ac365 | ||
|   | 552b963e6d | ||
|   | e2b48366d3 | ||
|   | 5e0d9aea32 | ||
|   | ae13c93b7d | ||
|   | b9f8a4a477 | ||
|   | 68e9f75708 | ||
|   | d569693f24 | ||
|   | 15d8bb2105 | ||
|   | b2ca777a08 | ||
|   | ba01198e6c | ||
|   | 6ebd5e1761 | ||
|   | 2723eda1e4 | ||
|   | 1fa3a5cce9 | ||
|   | fe8aee6b08 | ||
|   | 0639e2a6e2 | ||
|   | f1d707705e | ||
|   | 296a7db960 | ||
|   | 4c0936e72f | ||
|   | 0992e391ba | ||
|   | b22aaeef6a | ||
|   | 8090ee0e5d | ||
|   | f7d31bb3e3 | ||
|   | 9cd928674f | ||
|   | 3ea8a4d220 | ||
|   | b0d3ba76a0 | ||
|   | ab798fe5ba | ||
|   | e7d90e08b9 | ||
|   | c2404f77e9 | ||
|   | ec4a16f2e0 | ||
|   | ca5de26f50 | ||
|   | 71920d61e6 | ||
|   | 5de75eee56 | ||
|   | 2d5fc39d35 | ||
|   | c001ed53fa | ||
|   | 39e01e9349 | ||
|   | 9e54d4c7d2 | ||
|   | 56bf97ffc9 | ||
|   | 7d3e719a2c | ||
|   | e55d4fd5c1 | ||
|   | 5ee231415f | ||
|   | c866771cd2 | ||
|   | 4a24219a1a | ||
|   | 733a184ce0 | ||
|   | eee09e79e8 | ||
|   | 6df85adf3e | ||
|   | 3ee6036551 | ||
|   | fb65080548 | ||
|   | 3a5f21b0d1 | ||
|   | 13a5598dc3 | ||
|   | 5a6c89661a | ||
|   | 7c5745720a | ||
|   | 00ae13f966 | ||
|   | 29dc39fce1 | ||
|   | 5c184cfc0d | ||
|   | 055022a55f | ||
|   | c30e908034 | ||
|   | 8d24c0212e | ||
|   | 8240cea628 | ||
|   | f2a33eb372 | ||
|   | e134a40208 | ||
|   | 690888cfc1 | ||
|   | fb8d9b6645 | ||
|   | f7ddb39ee1 | ||
|   | 145084b699 | ||
|   | f1ba12607a | ||
|   | bb87b65f08 | ||
|   | b0f6e7cee4 | ||
|   | ed72d4e104 | ||
|   | 8ec1bfe897 | ||
|   | 1dec17562f | ||
|   | 9cc3795f1a | ||
|   | be1306a6c2 | ||
|   | e9160a31e0 | ||
|   | 0a670c578f | ||
|   | e3c15fc4b9 | ||
|   | dc7c915553 | ||
|   | b7eeb6e67f | ||
|   | 7e4193b538 | ||
|   | a932803eac | ||
|   | 52560142bf | ||
|   | 874a4ef8c7 | ||
|   | 0bb3ac7c31 | ||
|   | 1e9f5845ab | ||
|   | c41dfc2501 | ||
|   | 30ac7eced1 | ||
|   | 466d093a92 | ||
|   | 1e9be353c2 | ||
|   | 4f4277d9c7 | ||
|   | 6728bda5c5 | ||
|   | dc9f154823 | ||
|   | d7168a82e2 | ||
|   | c9c8ee3796 | ||
|   | c7aae10300 | ||
|   | 909941405f | ||
|   | 4031eb1d91 | ||
|   | 59cf6fd4f0 | ||
|   | 6de9732a88 | ||
|   | 1f7f500922 | ||
|   | 4b1462ec65 | ||
|   | 6ed47f0aad | ||
|   | 2d8c7ba9fc | ||
|   | 3b342d18bc | ||
|   | f24ad3800c | ||
|   | e2ff369eba | ||
|   | 9691a78f6b | ||
|   | 7ff6b6fafd | ||
|   | 7c621cfbdf | ||
|   | 5acadc9cd7 | ||
|   | 2ff609dd43 | ||
|   | da48a6ba87 | ||
|   | cd6c58216a | ||
|   | bdbd0cf27a | ||
|   | d792937686 | ||
|   | bac66ec26b | ||
|   | 77516822f6 | ||
|   | 37d8c67530 | ||
|   | cfdcae4bc7 | ||
|   | 74a6921bc4 | ||
|   | 490cccba3c | ||
|   | 839441e236 | ||
|   | ba9ea943e2 | ||
|   | 455087faae | ||
|   | 31def9e217 | ||
|   | ee3514ccdc | ||
|   | cf606d7da0 | ||
|   | eb26a581f9 | ||
|   | b04cbebf86 | ||
|   | 4272af801f | ||
|   | 0b633027cb | ||
|   | 93943ef949 | ||
|   | b184b87714 | ||
|   | a11473f85d | ||
|   | 1eedad27a2 | ||
|   | ac02d379ba | ||
|   | a4ebf5b507 | ||
|   | c410769588 | ||
|   | 997a987943 | ||
|   | 6201dc083a | ||
|   | b33f47804d | ||
|   | 7ba5e098a3 | ||
|   | 824b78021c | ||
|   | 31657c85e5 | ||
|   | 7010e5ea84 | ||
|   | 2cba6b246d | ||
|   | 52cc2a7a0c | ||
|   | c012e2b408 | ||
|   | 646a6b604f | ||
|   | cca00a6378 | ||
|   | 10b7fc7e51 | ||
|   | 43e4544d51 | ||
|   | 21aa8f0b45 | ||
|   | b708fa51ad | ||
|   | 8709f6c4b3 | ||
|   | 2ac560e58b | ||
|   | 8f8ba9486d | ||
|   | f55924b3e0 | ||
|   | 7240acdebc | ||
|   | b9b06b00bf | ||
|   | 51f258d103 | ||
|   | 4c75f1c7b7 | ||
|   | ed7bff1fec | ||
|   | 01a79be2c9 | ||
|   | d211fcd34f | ||
|   | 159834171e | ||
|   | 8a38c72c48 | ||
|   | fbcdc192d5 | ||
|   | ee642859ef | ||
|   | 9f579f12fc | ||
|   | 825a526789 | ||
|   | ae8a01ead6 | ||
|   | 9dde0b54a3 | ||
|   | f1343b2f55 | ||
|   | 962b7985e6 | ||
|   | 5a1c64d316 | ||
|   | 01b2cf82ec | ||
|   | c033c4c71c | ||
|   | aa791ee5cf | ||
|   | 305671e2ab | ||
|   | d654736834 | ||
|   | 2c81bfead5 | ||
|   | 77b3bc239d | ||
|   | c10d15aa0f | ||
|   | a88deadd6f | ||
|   | e6ea8f1199 | ||
|   | 4d4151f6c1 | ||
|   | 518becfe2e | ||
|   | 6f6b93da02 | ||
|   | 45b1843dc9 | ||
|   | cb86a302d8 | ||
|   | d15ed439ae | ||
|   | b765e1f3b7 | ||
|   | 2527b53019 | ||
|   | 78a47826b2 | ||
|   | ecfaa4f869 | ||
|   | f36adcdb73 | ||
|   | 13616f8f96 | ||
|   | ab486d1e27 | ||
|   | 9111909c1d | ||
|   | 4a1a1a75fb | ||
|   | e4d6ade4b3 | ||
|   | c82e880f5b | ||
|   | f2aa3b21e0 | ||
|   | 385db0e97d | ||
|   | 4e58da5222 | ||
|   | 1c6ebb0782 | ||
|   | 7e8b84c3e7 | ||
|   | 132067b081 | ||
|   | 8c36fc8f31 | ||
|   | 93858efe73 | ||
|   | ba7f27a3f6 | ||
|   | 2f70fb7015 | ||
|   | 655ec6bf8e | ||
|   | c4ad533300 | ||
|   | 5cdbd0cf4a | ||
|   | a55c70d4ae | ||
|   | 02938a010d | ||
|   | e40641bf7c | ||
|   | 27c0b43897 | ||
|   | d46de5ab8b | ||
|   | 73ebb0edde | ||
|   | 684245d6ce | ||
|   | d157c29269 | ||
|   | 4d2e81661b | ||
|   | 483a586d55 | ||
|   | 4ac54f8c2c | ||
|   | 840aacf7dd | ||
|   | ab4256d53a | ||
|   | 46c5e562bf | ||
|   | 42f5a90d09 | ||
|   | ef82da93fb | ||
|   | 06d05b18b2 | ||
|   | 431c4bd6e3 | ||
|   | f72c4e82fd | ||
|   | 9c83a20a27 | ||
|   | 773bec5ae5 | ||
|   | f3c508f6e8 | ||
|   | 2aa4710745 | ||
|   | 3b0a920fad | ||
|   | daef1cf34d | ||
|   | bd8d4637a3 | ||
|   | d2cefc140a | ||
|   | ccfce89423 | ||
|   | 700cd5805c | ||
|   | 498aad8587 | ||
|   | 73f407b7ae | ||
|   | 4be7dcba48 | ||
|   | f0694c582e | ||
|   | f90f0c98d9 | ||
|   | 95aecc5dbb | ||
|   | f975fd03a1 | ||
|   | 8272874704 | ||
|   | 86f4cead16 | ||
|   | 88a1a10e6f | ||
|   | 624e657210 | ||
|   | 2278e8f1ba | ||
|   | 58176d1484 | ||
|   | 10489879f7 | ||
|   | fe22872d14 | ||
|   | 4d95d23d99 | ||
|   | c6fc5a1a26 | ||
|   | 012d75442a | ||
|   | dcc7900e7c | ||
|   | 34f5e8ad0e | ||
|   | c2fee9894a | ||
|   | abd983e851 | ||
|   | 28611704d9 | ||
|   | 305dddeab0 | ||
|   | ee8112b42f | ||
|   | ca319f63ad | ||
|   | a09a8164db | ||
|   | e5cf6a20a7 | ||
|   | af5e6e7e6d | ||
|   | 70f2b5e877 | ||
|   | 8ef454dcbe | ||
|   | 551a041283 | ||
|   | 03288943af | ||
|   | 725f734bae | ||
|   | 0f32460656 | ||
|   | 25180cc850 | ||
|   | 2a0e41cab9 | ||
|   | 05edd48ad0 | ||
|   | 266ab95557 | ||
|   | 0a4bba565c | ||
|   | 2ddb9d57aa | ||
|   | 4f012ad703 | ||
|   | a1cd180082 | ||
|   | bc2f0c7dcb | ||
|   | c6ae0ebcbf | ||
|   | c6ec576cbb | ||
|   | 55329b56cb | ||
|   | 7e43d06b60 | ||
|   | 89f54f3739 | ||
|   | 01fa02d0b5 | ||
|   | 8bed45340a | ||
|   | 55138753c6 | ||
|   | 43369b8096 | ||
|   | bec1977137 | ||
|   | 4c08eb4b11 | ||
|   | 0163730437 | ||
|   | 39745ac38e | ||
|   | cacf8bbb58 | ||
|   | a1c6d5861a | ||
|   | 589c4596d8 | ||
|   | 7a6d7fca42 | ||
|   | 5305c9f1e8 | ||
|   | b1022ea4c1 | ||
|   | 380a74a4ed | ||
|   | ff709848a6 | ||
|   | 279dd6d878 | ||
|   | 2e0ad842d0 | ||
|   | a3949c7786 | ||
|   | 2320606262 | ||
|   | b01286d280 | ||
|   | 64f72c22b9 | ||
|   | 856114d05c | ||
|   | 98b8c4b0c9 | ||
|   | 01f5f0be5a | ||
|   | eb6d404753 | ||
|   | c508ab1aef | ||
|   | 0793dc922c | ||
|   | 00a41ab296 | ||
|   | 37f4877e56 | ||
|   | a6fc45c02f | ||
|   | 25411e01db | ||
|   | a8ac6f1dc1 | ||
|   | dfe1884c25 | ||
|   | 3e5dcc8bcd | ||
|   | ff81900784 | ||
|   | 4cb30a3057 | ||
|   | 72f80b88f7 | ||
|   | 3008d8133c | ||
|   | 4524618bf2 | ||
|   | 55d22ba10c | ||
|   | 76cf020750 | ||
|   | f13ac35edf | ||
|   | 59582a9d9d | ||
|   | 6246bbc656 | ||
|   | 1b028b419b | ||
|   | 4c6c768422 | 
| @@ -1,3 +1,4 @@ | ||||
| compile | ||||
| config.log | ||||
| Makefile | ||||
| libtool | ||||
|   | ||||
							
								
								
									
										988
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										988
									
								
								CHANGES
									
									
									
									
									
								
							| @@ -6,6 +6,994 @@ | ||||
|  | ||||
|                                   Changelog | ||||
|  | ||||
| Version 7.16.2 (11 April 2007) | ||||
|  | ||||
| Yang Tse (10 April 2007) | ||||
| - Ravi Pratap provided some fixes for HTTP pipelining | ||||
|  | ||||
| - configure script will ignore --enable-sspi option for non-native Windows. | ||||
|  | ||||
| Daniel S (9 April 2007) | ||||
| - Nick Zitzmann did ssh.c cleanups | ||||
|  | ||||
| Daniel S (3 April 2007) | ||||
| - Rob Jones fixed better #ifdef'ing for a bunch of #include lines. | ||||
|  | ||||
| Daniel S (2 April 2007) | ||||
| - Nick Zitzmann made the CURLOPT_POSTQUOTE option work for SFTP as well. The | ||||
|   accepted commands are as follows: | ||||
|  | ||||
|   chgrp (gid) (path) | ||||
|     Changes the group ID of the file or directory at (path) to (gid). (gid) | ||||
|     must be a number. | ||||
|  | ||||
|   chmod (perms) (path) | ||||
|     Changes the permissions of the file or directory at (path) to | ||||
|     (perms). (perms) must be a number in the format used by the chmod Unix | ||||
|     command. | ||||
|  | ||||
|   chown (uid) (path) | ||||
|     Changes the user ID of the file or directory at (path) to (uid). (uid) | ||||
|     must be a number. | ||||
|  | ||||
|   ln (source) (dest) | ||||
|     Creates a symbolic link at (dest) that points to the file located at | ||||
|     (source). | ||||
|  | ||||
|   mkdir (path) | ||||
|     Creates a new directory at (path). | ||||
|  | ||||
|   rename (source) (dest) | ||||
|     Moves the file or directory at (source) to (dest). | ||||
|  | ||||
|   rm (path) | ||||
|     Deletes the file located at (path). | ||||
|  | ||||
|   rmdir (path) | ||||
|     Deletes the directory located at (path). This command will raise an error | ||||
|     if the directory is not empty. | ||||
|  | ||||
|   symlink (source) (dest) | ||||
|     Same as ln. | ||||
|  | ||||
| Daniel S (1 April 2007) | ||||
| - Robert Iakobashvili made curl_multi_remove_handle() a lot faster when many | ||||
|   easy handles are added to a multi handle, by avoiding the looping over all | ||||
|   the handles to find which one to remove. | ||||
|  | ||||
| - Matt Kraai provided a patch that makes curl build on QNX 6 fine again. | ||||
|  | ||||
| Daniel S (31 March 2007) | ||||
| - Fixed several minor issues detected by the coverity.com scanner. | ||||
|  | ||||
| - "Pixel" fixed a problem that appeared when you used -f with user+password | ||||
|   embedded in the URL. | ||||
|  | ||||
| Dan F (29 March 2007) | ||||
| - Don't tear down the ftp connection if the maximum filesize was exceeded | ||||
|   and added tests 290 and 291 to check. | ||||
|  | ||||
| - Added ftps upload and SSL required tests 401 and 402. | ||||
|  | ||||
| - Send an EOF message before closing an SCP channel, as recommended by | ||||
|   RFC4254. Enable libssh2 tracing when ssh debugging is turned on. | ||||
|  | ||||
| Yang Tse (27 March 2007) | ||||
| - Internal function Curl_select() renamed to Curl_socket_ready() | ||||
|  | ||||
|   New Internal wrapper function Curl_select() around select (2), it | ||||
|   uses poll() when a fine poll() is available, so now libcurl can be | ||||
|   built without select() support at all if a fine poll() is available. | ||||
|  | ||||
| Daniel S (25 March 2007) | ||||
| - Daniel Johnson fixed multi code to traverse the easy handle list properly. | ||||
|   A left-over bug from the February 21 fix. | ||||
|  | ||||
| Dan F (23 March 2007) | ||||
| - Added --pubkey option to curl and made --key also work for SCP/SFTP, | ||||
|   plus made --pass work on an SSH private key as well. | ||||
|  | ||||
| - Changed the test harness to attempt to gracefully shut down servers | ||||
|   before resorting to the kill -9 hammer. | ||||
|  | ||||
| - Added test harness infrastructure to support scp/sftp tests, using | ||||
|   OpenSSH as the server. | ||||
|  | ||||
| - Fixed a memory leak when specifying a proxy with a file: URL. | ||||
|  | ||||
| Yang Tse (20 March 2007) | ||||
| - Fixed: When a signal was caught awaiting for an event using Curl_select() | ||||
|   or Curl_poll() with a non-zero timeout both functions would restart the | ||||
|   specified timeout. This could even lead to the extreme case that if a | ||||
|   signal arrived with a frecuency lower to the specified timeout neither | ||||
|   function would ever exit. | ||||
|  | ||||
|   Added experimental symbol definition check CURL_ACKNOWLEDGE_EINTR in | ||||
|   Curl_select() and Curl_poll(). When compiled with CURL_ACKNOWLEDGE_EINTR | ||||
|   defined both functions will return as soon as a signal is caught. Use it | ||||
|   at your own risk, all calls to these functions in the library should be | ||||
|   revisited and checked before fully supporting this feature. | ||||
|  | ||||
| Yang Tse (19 March 2007) | ||||
| - Bryan Henderson fixed the progress function so that it can get called more | ||||
|   frequently allowing same calling frecuency for the client progress callback. | ||||
|    | ||||
| Dan F (15 March 2007) | ||||
| - Various memory leaks plugged and NULL pointer fixes made in the ssh code. | ||||
|  | ||||
| Daniel (15 March 2007) | ||||
| - Nick made the curl tool accept globbing ranges that only is one number, i.e | ||||
|   you can now use [1-1] without curl complaining. | ||||
|  | ||||
| Daniel (10 March 2007) | ||||
| - Eygene Ryabinkin: | ||||
|  | ||||
|   The problem is the following: when we're calling Curl_done and it decides to | ||||
|   keep the connection opened ('left intact'), then the caller is not notified | ||||
|   that the connection was done via the NULLifying of the pointer, so some easy | ||||
|   handle is keeping the pointer to this connection. | ||||
|  | ||||
|   Later ConnectionExists can select such connection for reuse even if we're | ||||
|   not pipelining: pipeLen is zero, so the (pipeLen > 0 && !canPipeline) is | ||||
|   false and we can reuse this connection for another easy handle. But thus the | ||||
|   connection will be shared between two easy handles if the handle that wants | ||||
|   to take the ownership is not the same as was not notified of the connection | ||||
|   was done in Curl_done. And when some of these easy handles will get their | ||||
|   connection really freed the another one will still keep the pointer. | ||||
|  | ||||
|   My fix was rather trivial: I just added the NULLification to the 'else' | ||||
|   branch in the Curl_done. My tests with Git and ElectricFence showed no | ||||
|   problems both for HTTP pulling and cloning. Repository size is about 250 Mb, | ||||
|   so it was a considerable amount of Curl's work. | ||||
|  | ||||
| Dan F (9 March 2007) | ||||
| - Updated the test harness to add a new "crypto" feature check and updated the | ||||
|   appropriate test case to use it.  For now, this is treated the same as the | ||||
|   "SSL" feature because curl doesn't list it separately. | ||||
|  | ||||
| Daniel (9 March 2007) | ||||
| - Robert Iakobashvili fixed CURLOPT_INTERFACE for IPv6. | ||||
|  | ||||
| - Robert A. Monat improved the maketgz and VC6/8 generating to set the correct | ||||
|   machine type too. | ||||
|  | ||||
| - Justin Fletcher fixed a file descriptor leak in the curl tool when trying to | ||||
|   upload a file it couldn't open. Bug #1676581 | ||||
|   (http://curl.haxx.se/bug/view.cgi?id=1676581) | ||||
|  | ||||
| Dan F (9 March 2007) | ||||
| - Updated the test harness to check for protocol support before running each | ||||
|   test, fixing KNOWN_BUGS #11. | ||||
|  | ||||
| Dan F (7 March 2007) | ||||
| - Reintroduced (after a 3 year hiatus) an FTPS test case (400) into the test | ||||
|   harness.  It is very limited as it supports only ftps:// URLs with | ||||
|   --ftp-ssl-control specified, which implicitly encrypts the control | ||||
|   channel but not the data channels.  That allows stunnel to be used with | ||||
|   an unmodified ftp server in exactly the same way that the test https | ||||
|   server is set up. | ||||
|  | ||||
| Dan F (7 March 2007) | ||||
| - Honour --ftp-ssl-control on ftps:// URLs to allow encrypted control and | ||||
|   unencrypted data connections. | ||||
|  | ||||
| Dan F (6 March 2007) | ||||
| - Fixed a couple of improper pointer uses detected by valgrind in test | ||||
|   cases 181 & 216. | ||||
|  | ||||
| Daniel (2 March 2007) | ||||
| - Robert A. Monat and Shmulik Regev helped out to fix the new */Makefile.vc8 | ||||
|   makefiles that are included in the source release archives, generated from | ||||
|   the Makefile.vc6 files by the maketgz script. I also modified the root | ||||
|   Makefile to have a VC variable that defaults to vc6 but can be overridden to | ||||
|   allow it to be used for vc8 as well. Like this: | ||||
|  | ||||
|     nmake VC=vc8 vc | ||||
|  | ||||
| Daniel (27 February 2007) | ||||
| - Hang Kin Lau found and fixed: When I use libcurl to connect to an https | ||||
|   server through a proxy and have the remote https server port set using the | ||||
|   CURLOPT_PORT option, protocol gets reset to http from https after the first | ||||
|   request. | ||||
|   | ||||
|   User defined URL was modified internally by libcurl and subsequent reuse of | ||||
|   the easy handle may lead to connection using a different protocol (if not | ||||
|   originally http). | ||||
|   | ||||
|   I found that libcurl hardcoded the protocol to "http" when it tries to | ||||
|   regenerate the URL if CURLOPT_PORT is set. I tried to fix the problem as | ||||
|   follows and it's working fine so far | ||||
|  | ||||
| Daniel (25 February 2007) | ||||
| - Adam D. Moss made the HTTP CONNECT procedure less blocking when used from | ||||
|   the multi interface. Note that it still does a part of the connection in a | ||||
|   blocking manner. | ||||
|  | ||||
| Daniel (23 February 2007) | ||||
| - Added warning outputs if the command line uses more than one of the options | ||||
|   -v, --trace and --trace-ascii, since it could really confuse the user. | ||||
|   Clarified this fact in the man page. | ||||
|  | ||||
| Daniel (21 February 2007) | ||||
| - Ravi Pratap provided work on libcurl making pipelining more robust and | ||||
|   fixing some bugs: | ||||
|   o Don't mix GET and POST requests in a pipeline | ||||
|   o Fix the order in which requests are dispatched from the pipeline | ||||
|   o Fixed several curl bugs with pipelining when the server is returning | ||||
|     chunked encoding: | ||||
|     * Added states to chunked parsing for final CRLF | ||||
|     * Rewind buffer after parsing chunk with data remaining | ||||
|     * Moved chunked header initializing to a spot just before receiving | ||||
|       headers | ||||
|  | ||||
| Daniel (20 February 2007) | ||||
| - Linus Nielsen Feltzing changed the CURLOPT_FTP_SSL_CCC option to handle | ||||
|   active and passive CCC shutdown and added the --ftp-ssl-ccc-mode command | ||||
|   line option. | ||||
|  | ||||
| Daniel (19 February 2007) | ||||
| - Ian Turner fixed the libcurl.m4 macro's support for --with-libcurl. | ||||
|  | ||||
| - Shmulik Regev found a memory leak in re-used HTTPS connections, at least | ||||
|   when the multi interface was used. | ||||
|  | ||||
| - Robson Braga Araujo made passive FTP transfers work with SOCKS (both 4 and | ||||
|   5). | ||||
|  | ||||
| Daniel (18 February 2007) | ||||
| - Jeff Pohlmeyer identified two problems: first a rather obscure problem with | ||||
|   the multi interface and connection re-use that could make a | ||||
|   curl_multi_remove_handle() ruin a pointer in another handle. | ||||
|  | ||||
|   The second problem was less of an actual problem but more of minor quirk: | ||||
|   the re-using of connections wasn't properly checking if the connection was | ||||
|   marked for closure. | ||||
|  | ||||
| Daniel (16 February 2007) | ||||
| - Duncan Mac-Vicar Prett and Michal Marek reported problems with resetting | ||||
|   CURLOPT_RANGE back to no range on an easy handle when using FTP. | ||||
|  | ||||
| Dan F (14 February 2007) | ||||
| - Fixed curl-config --libs so it doesn't list unnecessary libraries (and | ||||
|   therefore introduce unnecessary dependencies) when it's not needed. | ||||
|   Also, don't bother adding a library path of /usr/lib | ||||
|  | ||||
| Daniel (13 February 2007) | ||||
| - The default password for anonymous FTP connections is now changed to be | ||||
|   "ftp@example.com". | ||||
|  | ||||
| - Robert A. Monat made libcurl build fine with VC2005 - it doesn't have | ||||
|   gmtime_r() like the older VC versions. He also made use of some machine- | ||||
|   specific defines to differentiate the "OS" define. | ||||
|  | ||||
| Daniel (12 February 2007) | ||||
| - Rob Crittenden added support for NSS (Network Security Service) for the | ||||
|   SSL/TLS layer. http://www.mozilla.org/projects/security/pki/nss/ | ||||
|  | ||||
|   This is the fourth supported library for TLS/SSL that libcurl supports! | ||||
|  | ||||
| - Shmulik Regev fixed so that the final CRLF of HTTP response headers are sent | ||||
|   to the debug callback. | ||||
|  | ||||
| - Shmulik Regev added CURLOPT_HTTP_CONTENT_DECODING and | ||||
|   CURLOPT_HTTP_TRANSFER_DECODING that if set to zero will disable libcurl's | ||||
|   internal decoding of content or transfer encoded content. This may be | ||||
|   preferable in cases where you use libcurl for proxy purposes or similar. The | ||||
|   command line tool got a --raw option to disable both at once. | ||||
|  | ||||
| - release tarballs made with maketgz will from now on have a LIBCURL_TIMESTAMP | ||||
|   define set to hold the exact date and time of when the tarball was built, as | ||||
|   a human readable string using the UTC time zone. | ||||
|    | ||||
| - Jeff Pohlmeyer fixed a flaw in curl_multi_add_handle() when adding a handle | ||||
|   that has an easy handle present in the "closure" list pending closure. | ||||
|  | ||||
| Daniel (6 February 2007) | ||||
| - Regular file downloads wiht SFTP and SCP are now done using the non-blocking | ||||
|   API of libssh2, if the libssh2 headers seem to support them. This will make | ||||
|   SCP and SFTP much more responsive and better libcurl citizens when used with | ||||
|   the multi interface etc. | ||||
|  | ||||
| Daniel (5 February 2007) | ||||
| - Michael Wallner added support for CURLOPT_TIMEOUT_MS and | ||||
|   CURLOPT_CONNECTTIMEOUT_MS that, as their names suggest, do the timeouts with | ||||
|   millisecond resolution. The only restriction to that is the alarm() | ||||
|   (sometimes) used to abort name resolves as that uses full seconds. I fixed | ||||
|   the FTP response timeout part of the patch. | ||||
|  | ||||
|   Internally we now count and keep the timeouts in milliseconds but it also | ||||
|   means we multiply set timeouts with 1000. The effect of this is that no | ||||
|   timeout can be set to more than 2^31 milliseconds (on 32 bit systems), which | ||||
|   equals 24.86 days.  We probably couldn't before either since the code did | ||||
|   *1000 on the timeout values on several places already. | ||||
|  | ||||
| Daniel (3 February 2007) | ||||
| - Yang Tse fixed the cookie expiry date in several test cases that started to | ||||
|   fail since they used "1 feb 2007"... | ||||
|  | ||||
| - Manfred Schwarb reported that socks5 support was broken and help us pinpoint | ||||
|   the problem. The code now tries harder to use httproxy and proxy where | ||||
|   apppropriate, as not all proxies are HTTP... | ||||
|  | ||||
| Version 7.16.1 (29 January 2007) | ||||
|  | ||||
| Daniel (29 January 2007) | ||||
| - Michael Wallner reported that when doing a CONNECT with a custom User-Agent | ||||
|   header, you got _two_ User-Agent headers in the CONNECT request...! Added | ||||
|   test case 287 to verify the fix. | ||||
|  | ||||
| Daniel (28 January 2007) | ||||
| - curl_easy_reset() now resets the CA bundle path correctly. | ||||
|  | ||||
| - David McCreedy fixed the Curl command line tool for HTTP on non-ASCII | ||||
|   platforms. | ||||
|  | ||||
| Daniel (25 January 2007) | ||||
| - Added the --libcurl [file] option to curl. Append this option to any | ||||
|   ordinary curl command line, and you will get a libcurl-using source code | ||||
|   written to the file that does the equivalent operation of what your command | ||||
|   line operation does! | ||||
|  | ||||
| Dan F (24 January 2007) | ||||
| - Fixed a dangling pointer problem that prevented the http_proxy environment | ||||
|   variable from being properly used in many cases (and caused test case 63 | ||||
|   to fail). | ||||
|  | ||||
| Daniel (23 January 2007) | ||||
| - David McCreedy did NTLM changes mainly for non-ASCII platforms: | ||||
|  | ||||
|   #1 | ||||
|   There's a compilation error in http_ntlm.c if USE_NTLM2SESSION is NOT | ||||
|   defined.  I noticed this while testing various configurations.  Line 867 of | ||||
|   the current http_ntlm.c is a closing bracket for an if/else pair that only | ||||
|   gets compiled in if USE_NTLM2SESSION is defined.  But this closing bracket | ||||
|   wasn't in an #ifdef so the code fails to compile unless USE_NTLM2SESSION was | ||||
|   defined.  Lines 198 and 140 of my patch wraps that closing bracket in an | ||||
|   #ifdef USE_NTLM2SESSION. | ||||
|  | ||||
|   #2 | ||||
|   I noticed several picky compiler warnings when DEBUG_ME is defined.  I've | ||||
|   fixed them with casting.  By the way, DEBUG_ME was a huge help in | ||||
|   understanding this code. | ||||
|  | ||||
|   #3 | ||||
|   Hopefully the last non-ASCII conversion patch for libcurl in a while.  I | ||||
|   changed the "NTLMSSP" literal to hex since this signature must always be in | ||||
|   ASCII. | ||||
|  | ||||
|   Conversion code was strategically added where necessary.  And the | ||||
|   Curl_base64_encode calls were changed so the binary "blobs" http_ntlm.c | ||||
|   creates are NOT translated on non-ASCII platforms. | ||||
|  | ||||
| Dan F (22 January 2007) | ||||
| - Converted (most of) the test data files into genuine XML.  A handful still | ||||
|   are not, due mainly to the lack of support for XML character entities | ||||
|   (e.g. & => & ).  This will make it easier to validate test files using | ||||
|   tools like xmllint, as well as to edit and view them using XML tools. | ||||
|  | ||||
| Daniel (16 January 2007) | ||||
| - Armel Asselin improved libcurl to behave a lot better when an easy handle | ||||
|   doing an FTP transfer is removed from a multi handle before completion. The | ||||
|   fix also fixed the "alive counter" to be correct on "premature removal" for | ||||
|   all protocols. | ||||
|  | ||||
| Dan F (16 January 2007) | ||||
| - Fixed a small memory leak in tftp uploads discovered by curl's memory leak | ||||
|   detector.  Also changed tftp downloads to URL-unescape the downloaded | ||||
|   file name. | ||||
|  | ||||
| Daniel (14 January 2007) | ||||
| - David McCreedy provided libcurl changes for doing HTTP communication on | ||||
|   non-ASCII platforms. It does add some complexity, most notably with more | ||||
|   #ifdefs, but I want to see this supported added and I can't see how we can | ||||
|   add it without the extra stuff added. | ||||
|  | ||||
| - Setting CURLOPT_COOKIELIST to "ALL" when no cookies at all was present, | ||||
|   libcurl would crash when trying to read a NULL pointer. | ||||
|  | ||||
| Daniel (12 January 2007) | ||||
| - Toby Peterson found a nasty bug that prevented (lib)curl from properly | ||||
|   downloading (most) things that were larger than 4GB on 32 bit systems.  Matt | ||||
|   Witherspoon helped as narrow down the problem. | ||||
|  | ||||
| Daniel (5 January 2007) | ||||
| - Linus Nielsen Feltzing introduced the --ftp-ssl-ccc command line option to | ||||
|   curl that uses the new CURLOPT_FTP_SSL_CCC option in libcurl. If enabled, it | ||||
|   will make libcurl shutdown SSL/TLS after the authentication is done on a | ||||
|   FTP-SSL operation. | ||||
|  | ||||
| Daniel (4 January 2007) | ||||
| - David McCreedy made changes to allow base64 encoding/decoding to work on | ||||
|   non-ASCII platforms. | ||||
|  | ||||
| Daniel (3 January 2007) | ||||
| - Matt Witherspoon fixed the flaw which made libcurl 7.16.0 always store | ||||
|   downloaded data in two buffers, just to be able to deal with a special HTTP | ||||
|   pipelining case. That is now only activated for pipelined transfers. In | ||||
|   Matt's case, it showed as a considerable performance difference, | ||||
|  | ||||
| Daniel (2 January 2007) | ||||
| - Victor Snezhko helped us fix bug report #1603712 | ||||
|   (http://curl.haxx.se/bug/view.cgi?id=1603712) (known bug #36) --limit-rate | ||||
|   (CURLOPT_MAX_SEND_SPEED_LARGE and CURLOPT_MAX_RECV_SPEED_LARGE) are broken | ||||
|   on Windows (since 7.16.0, but that's when they were introduced as previous | ||||
|   to that the limiting logic was made in the application only and not in the | ||||
|   library). It was actually also broken on select()-based systems (as apposed | ||||
|   to poll()) but we haven't had any such reports. We now use select(), Sleep() | ||||
|   or delay() properly to sleep a while without waiting for anything input or | ||||
|   output when the rate limiting is activated with the easy interface. | ||||
|  | ||||
| - Modified libcurl.pc.in to use Libs.private for the libs libcurl itself needs | ||||
|   to get built static. It has been mentioned before and was again brought to | ||||
|   our attention by Nathanael Nerode who filed debian bug report #405226 | ||||
|   (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=405226). | ||||
|  | ||||
| Daniel (29 December 2006) | ||||
| - Make curl_easy_duphandle() set the magic number in the new handle. | ||||
|  | ||||
| Daniel (22 December 2006) | ||||
| - Robert Foreman provided a prime example snippet showing how libcurl would | ||||
|   get confused and not acknowledge the 'no_proxy' variable properly once it | ||||
|   had used the proxy and you re-used the same easy handle. I made sure the | ||||
|   proxy name is properly stored in the connect struct rather than the | ||||
|   sessionhandle/easy struct. | ||||
|  | ||||
| - David McCreedy fixed a bad call to getsockname() that wrongly used a size_t | ||||
|   variable to point to when it should be a socklen_t. | ||||
|  | ||||
| - When setting a proxy with environment variables and (for example) running | ||||
|   'curl [URL]' with a URL without a protocol prefix, curl would not send a | ||||
|   correct request as it failed to add the protocol prefix. | ||||
|  | ||||
| Daniel (21 December 2006) | ||||
| - Robson Braga Araujo reported bug #1618359 | ||||
|   (http://curl.haxx.se/bug/view.cgi?id=1618359) and subsequently provided a | ||||
|   patch for it: when downloading 2 zero byte files in a row, curl 7.16.0 | ||||
|   enters an infinite loop, while curl 7.16.1-20061218 does one additional | ||||
|   unnecessary request. | ||||
|  | ||||
|   Fix: During the "Major overhaul introducing http pipelining support and | ||||
|   shared connection cache within the multi handle." change, headerbytecount | ||||
|   was moved to live in the Curl_transfer_keeper structure. But that structure | ||||
|   is reset in the Transfer method, losing the information that we had about | ||||
|   the header size. This patch moves it back to the connectdata struct. | ||||
|  | ||||
| Daniel (16 December 2006) | ||||
| - Brendan Jurd provided a fix that now prevents libcurl from getting a SIGPIPE | ||||
|   during certain conditions when GnuTLS is used. | ||||
|  | ||||
| Daniel (11 December 2006) | ||||
| - Alexey Simak found out that when doing FTP with the multi interface and | ||||
|   something went wrong like it got a bad response code back from the server, | ||||
|   libcurl would leak memory. Added test case 538 to verify the fix. | ||||
|  | ||||
|   I also noted that the connection would get cached in that case, which | ||||
|   doesn't make sense since it cannot be re-use when the authentication has | ||||
|   failed. I fixed that issue too at the same time, and also that the path | ||||
|   would be "remembered" in vain for cases where the connection was about to | ||||
|   get closed. | ||||
|  | ||||
| Daniel (6 December 2006) | ||||
| - Sebastien Willemijns reported bug #1603712 | ||||
|   (http://curl.haxx.se/bug/view.cgi?id=1603712) which is about connections | ||||
|   getting cut off prematurely when --limit-rate is used. While I found no such | ||||
|   problems in my tests nor in my reading of the code, I found that the | ||||
|   --limit-rate code was severly flawed (since it was moved into the lib, since | ||||
|   7.15.5) when used with the easy interface and it didn't work as documented | ||||
|   so I reworked it somewhat and now it works for my tests. | ||||
|  | ||||
| Daniel (5 December 2006) | ||||
| - Stefan Krause pointed out a compiler warning with a picky MSCV compiler when | ||||
|   passing a curl_off_t argument to the Curl_read_rewind() function which takes | ||||
|   an size_t argument. Curl_read_rewind() also had debug code left in it and it | ||||
|   was put in a different source file with no good reason when only used from | ||||
|   one single spot. | ||||
|  | ||||
| - Sh Diao reported that CURLOPT_CLOSEPOLICY doesn't work, and indeed, there is | ||||
|   no code present in the library that receives the option. Since it was not | ||||
|   possible to use, we know that no current users exist and thus we simply | ||||
|   removed it from the docs and made the code always use the default path of | ||||
|   the code. | ||||
|  | ||||
| - Jared Lundell filed bug report #1604956 | ||||
|   (http://curl.haxx.se/bug/view.cgi?id=1604956) which identified setting | ||||
|   CURLOPT_MAXCONNECTS to zero caused libcurl to SIGSEGV. Starting now, libcurl | ||||
|   will always internally use no less than 1 entry in the connection cache. | ||||
|  | ||||
| - Sh Diao reported that CURLOPT_FORBID_REUSE no works, and indeed it broke in | ||||
|   the 7.16.0 release. | ||||
|  | ||||
| - Martin Skinner brought back bug report #1230118 to haunt us once again. | ||||
|   (http://curl.haxx.se/bug/view.cgi?id=1230118) curl_getdate() did not work | ||||
|   properly for all input dates on Windows. It was mostly seen on some TZ time | ||||
|   zones using DST. Luckily, Martin also provided a fix. | ||||
|  | ||||
| - Alexey Simak filed bug report #1600447 | ||||
|   (http://curl.haxx.se/bug/view.cgi?id=1600447) in which he noted that active | ||||
|   FTP connections don't work with the multi interface. The problem is here | ||||
|   that the multi interface state machine has a state during which it can wait | ||||
|   for the data connection to connect, but the active connection is not done in | ||||
|   the same step in the sequence as the passive one is so it doesn't quite work | ||||
|   for active. The active FTP code still use a blocking function to allow the | ||||
|   remote server to connect. | ||||
|  | ||||
|   The fix (work-around is a better word) for this problem is to set the | ||||
|   boolean prematurely that the data connection is completed, so that the "wait | ||||
|   for connect" phase ends at once. | ||||
|  | ||||
|   The proper fix, left for the future, is of course to make the active FTP | ||||
|   case to act in a non-blocking way too. | ||||
|  | ||||
| - Matt Witherspoon fixed a problem case when the CPU load went to 100% when a | ||||
|   HTTP upload was disconnected: | ||||
|  | ||||
|   "What appears to be happening is that my system (Linux 2.6.17 and 2.6.13) is | ||||
|   setting *only* POLLHUP on poll() when the conditions in my previous mail | ||||
|   occur. As you can see, select.c:Curl_select() does not check for POLLHUP. So | ||||
|   basically what was happening, is poll() was returning immediately (with | ||||
|   POLLHUP set), but when Curl_select() looked at the bits, neither POLLERR or | ||||
|   POLLOUT was set. This still caused Curl_readwrite() to be called, which | ||||
|   quickly returned. Then the transfer() loop kept continuing at full speed | ||||
|   forever." | ||||
|  | ||||
| Daniel (1 December 2006) | ||||
| - Toon Verwaest reported that there are servers that send the Content-Range: | ||||
|   header in a third, not suppported by libcurl, format and we agreed that we | ||||
|   could make the parser more forgiving to accept all the three found | ||||
|   variations. | ||||
|  | ||||
| Daniel (25 November 2006) | ||||
| - Venkat Akella found out that libcurl did not like HTTP responses that simply | ||||
|   responded with a single status line and no headers nor body. Starting now, a | ||||
|   HTTP response on a persistent connection (i.e not set to be closed after the | ||||
|   response has been taken care of) must have Content-Length or chunked | ||||
|   encoding set, or libcurl will simply assume that there is no body. | ||||
|  | ||||
|   To my horror I learned that we had no less than 57(!) test cases that did bad | ||||
|   HTTP responses like this, and even the test http server (sws) responded badly | ||||
|   when queried by the test system if it is the test system. So although the | ||||
|   actual fix for the problem was tiny, going through all the newly failing test | ||||
|   cases got really painful and boring. | ||||
|  | ||||
| Daniel (24 November 2006) | ||||
| - James Housley did lots of work and introduced SFTP downloads. | ||||
|  | ||||
| Daniel (13 November 2006) | ||||
| - Ron in bug #1595348 (http://curl.haxx.se/bug/view.cgi?id=1595348) pointed | ||||
|   out a stack overwrite (and the corresponding fix) on 64bit Windows when | ||||
|   dealing with HTTP chunked encoding. | ||||
|  | ||||
| Daniel (9 November 2006) | ||||
| - Nir Soffer updated libcurl.framework.make: | ||||
|   o fix symlinks, should link to Versions, not to ./Versions | ||||
|   o indentation improvments | ||||
|  | ||||
| - Dmitriy Sergeyev found a SIGSEGV with his test04.c example posted on 7 Nov | ||||
|   2006. It turned out we wrongly assumed that the connection cache was present | ||||
|   when tearing down a connection. | ||||
|  | ||||
| - Ciprian Badescu found a SIGSEGV when doing multiple TFTP transfers using the | ||||
|   multi interface, but I could also repeat it doing multiple sequential ones | ||||
|   with the easy interface. Using Ciprian's test case, I could fix it. | ||||
|  | ||||
| Daniel (8 November 2006) | ||||
| - Bradford Bruce reported that when setting CURLOPT_DEBUGFUNCTION without | ||||
|   CURLOPT_VERBOSE set to non-zero, you still got a few debug messages from the | ||||
|   SSL handshake. This is now stopped. | ||||
|  | ||||
| Daniel (7 November 2006) | ||||
| - Olaf fixed a leftover problem with the CONNECT fix of his that would leave a | ||||
|   wrong error message in the error message buffer. | ||||
|  | ||||
| Daniel (3 November 2006) | ||||
| - Olaf Stueben provided a patch that I edited slightly. It fixes the notorious | ||||
|   KNOWN_BUGS #25, which happens when a proxy closes the connection when | ||||
|   libcurl has sent CONNECT, as part of an authentication negotiation. Starting | ||||
|   now, libcurl will re-connect accordingly and continue the authentication as | ||||
|   it should. | ||||
|  | ||||
| Daniel (2 November 2006) | ||||
| - James Housley brought support for SCP transfers, based on the libssh2 library | ||||
|   for the actual network protocol stuff. | ||||
|  | ||||
|   Added these new curl_easy_setopt() options: | ||||
|  | ||||
|     CURLOPT_SSH_AUTH_TYPES | ||||
|     CURLOPT_SSH_PUBLIC_KEYFILE | ||||
|     CURLOPT_SSH_PRIVATE_KEYFILE | ||||
|  | ||||
| Version 7.16.0 (30 October 2006) | ||||
|  | ||||
| Daniel (25 October 2006) | ||||
| - Fixed CURLOPT_FAILONERROR to return CURLE_HTTP_RETURNED_ERROR even for the | ||||
|   case when 401 or 407 are returned, *IF* no auth credentials have been given. | ||||
|   The CURLOPT_FAILONERROR option is not possible to make fool-proof for 401 | ||||
|   and 407 cases when auth credentials is given, but we've now covered this | ||||
|   somewhat more. | ||||
|  | ||||
|   You might get some amounts of headers transferred before this situation is | ||||
|   detected, like for when a "100-continue" is received as a response to a | ||||
|   POST/PUT and a 401 or 407 is received immediately afterwards. | ||||
|  | ||||
|   Added test 281 to verify this change. | ||||
|  | ||||
| Daniel (23 October 2006) | ||||
| - Ravi Pratap provided a major update with pipelining fixes. We also no longer | ||||
|   re-use connections (for pipelining) before the name resolving is done. | ||||
|  | ||||
| Daniel (21 October 2006) | ||||
| - Nir Soffer made the tests/libtest/Makefile.am use a proper variable for all | ||||
|   the single test applications' link and dependences, so that you easier can | ||||
|   override those from the command line when using make. | ||||
|  | ||||
| - Armel Asselin separated CA cert verification problems from problems with | ||||
|   reading the (local) CA cert file to let users easier pinpoint the actual | ||||
|   problem. CURLE_SSL_CACERT_BADFILE (77) is the new libcurl error code. | ||||
|  | ||||
| Daniel (18 October 2006) | ||||
| - Removed the "protocol-guessing" for URLs with host names starting with FTPS | ||||
|   or TELNET since they are practically non-existant. This leaves us with only | ||||
|   three different prefixes that would assume the protocol is anything but | ||||
|   HTTP, and they are host names starting with "ftp.", "dict." or "ldap.". | ||||
|  | ||||
| Daniel (17 October 2006) | ||||
| - Bug report #1579171 pointed out code flaws detected with "prefast", and they | ||||
|   were 1 - a too small memory clear with memset() in the threaded resolver and | ||||
|   2 - a range of potentially bad uses of the ctype family of is*() functions | ||||
|   such as isdigit(), isalnum(), isprint() and more. The latter made me switch | ||||
|   to using our own set of these functions/macros using uppercase letters, and | ||||
|   with some extra set of crazy typecasts to avoid mistakingly passing in | ||||
|   negative numbers to the underlying is*() functions. | ||||
|  | ||||
| - With Jeff Pohlmeyer's help, I fixed the expire timer when using | ||||
|   curl_multi_socket() during name resolves with c-ares and the LOW_SPEED | ||||
|   options now work fine with curl_multi_socket() as well. | ||||
|  | ||||
| Daniel (16 October 2006) | ||||
| - Added a check in configure that simply tries to run a program (not when | ||||
|   cross-compiling) in order to detect problems with run-time libraries that | ||||
|   otherwise would occur when the sizeof tests for curl_off_t would run and | ||||
|   thus be much more confusing to users. The check of course should run after | ||||
|   all lib-checks are done and before any other test is used that would run an | ||||
|   executable built for testing-purposes. | ||||
|  | ||||
| Dan F (13 October 2006) | ||||
| - The tagging of application/x-www-form-urlencoded POST body data sent | ||||
|   to the CURLOPT_DEBUGFUNCTION callback has been fixed (it was erroneously | ||||
|   included as part of the header).  A message was also added to the | ||||
|   command line tool to show when data is being sent, enabled when | ||||
|   --verbose is used. | ||||
|  | ||||
| Daniel (12 October 2006) | ||||
| - Starting now, adding an easy handle to a multi stack that was already added | ||||
|   to a multi stack will cause CURLM_BAD_EASY_HANDLE to get returned. | ||||
|  | ||||
| - Jeff Pohlmeyer has been working with the hiperfifo.c example source code, | ||||
|   and while doing so it became apparent that the current timeout system for | ||||
|   the socket API really was a bit awkward since it become quite some work to | ||||
|   be sure we have the correct timeout set. | ||||
|  | ||||
|   Jeff then provided the new CURLMOPT_TIMERFUNCTION that is yet another | ||||
|   callback the app can set to get to know when the general timeout time | ||||
|   changes and thus for an application like hiperfifo.c it makes everything a | ||||
|   lot easier and nicer. There's a CURLMOPT_TIMERDATA option too of course in | ||||
|   good old libcurl tradition. | ||||
|  | ||||
|   Jeff has also updated the hiperfifo.c example code to use this news. | ||||
|  | ||||
| Daniel (9 October 2006) | ||||
| - Bogdan Nicula's second test case (posted Sun, 08 Oct 2006) converted to test | ||||
|   case 535 and it now runs fine. Again a problem with the pipelining code not | ||||
|   taking all possible (error) conditions into account. | ||||
|  | ||||
| Daniel (6 October 2006) | ||||
| - Bogdan Nicula's hanging test case (posted Wed, 04 Oct 2006) was converted to | ||||
|   test case 533 and the test now runs fine. | ||||
|  | ||||
| Daniel (4 October 2006) | ||||
| - Dmitriy Sergeyev provided an example source code that crashed CVS libcurl | ||||
|   but that worked nicely in 7.15.5. I converted it into test case 532 and | ||||
|   fixed the problem. | ||||
|  | ||||
| Daniel (29 September 2006) | ||||
| - Removed a few other no-longer present options from the header file. | ||||
|  | ||||
| - Support for FTP third party transfers was removed. Here's why: | ||||
|  | ||||
|   o The recent multi interface changes broke it and the design of the 3rd party | ||||
|     transfers made it very hard to fix the problems | ||||
|   o It was still blocking and thus nasty for the multi interface | ||||
|   o It was a lot of extra code for a very rarely used feature | ||||
|   o It didn't use the same code as for "plain" FTP transfers, so it didn't work | ||||
|     fine for IPv6 and it didn't properly re-use connections and more | ||||
|   o There's nobody around who's willing to work on and improve the existing | ||||
|     code | ||||
|  | ||||
|   This does not mean that third party transfers are banned forever, only that | ||||
|   they need to be done better if they are to be re-added in the future. | ||||
|  | ||||
|   The CURLOPT_SOURCE_* options are removed from the lib and so are the --3p* | ||||
|   options from the command line tool. For this reason, I also bumped the | ||||
|   version info for the lib. | ||||
|  | ||||
| Daniel (28 September 2006) | ||||
| - Reported in #1561470 (http://curl.haxx.se/bug/view.cgi?id=1561470), libcurl | ||||
|   would crash if a bad function sequence was used when shutting down after | ||||
|   using the multi interface (i.e using easy_cleanup after multi_cleanup) so | ||||
|   precautions have been added to make sure it doesn't any more - test case 529 | ||||
|   was added to verify. | ||||
|  | ||||
| Daniel (27 September 2006) | ||||
| - The URL in the cookie jar file is now changed since it was giving a 404. | ||||
|   Reported by Timothy Stone. The new URL will take the visitor to a curl web | ||||
|   site mirror with the document. | ||||
|  | ||||
| Daniel (24 September 2006) | ||||
| - Bernard Leak fixed configure --with-gssapi-libs. | ||||
|  | ||||
| - Cory Nelson made libcurl use the WSAPoll() function if built for Windows | ||||
|   Vista (_WIN32_WINNT >= 0x0600) | ||||
|  | ||||
| Daniel (23 September 2006) | ||||
| - Mike Protts added --ftp-ssl-control to make curl use FTP-SSL, but only | ||||
|   encrypt the control connection and use the data connection "plain". | ||||
|  | ||||
| - Dmitriy Sergeyev provided a patch that made the SOCKS[45] code work better | ||||
|   as it now will read the full data sent from servers. The SOCKS-related code | ||||
|   was also moved to the new lib/socks.c source file. | ||||
|  | ||||
| Daniel (21 September 2006) | ||||
| - Added test case 531 in an attempt to repeat bug report #1561470 | ||||
|   (http://curl.haxx.se/bug/view.cgi?id=1561470) that is said to crash when an | ||||
|   FTP upload fails with the multi interface. It did not, but I made a failed | ||||
|   upload still assume the control connection to be fine. | ||||
|  | ||||
| Daniel (20 September 2006) | ||||
| - Armel Asselin fixed problems when you gave a proxy URL with user name and | ||||
|   empty password or no password at all. Test case 278 and 279 were added to | ||||
|   verify. | ||||
|  | ||||
| Daniel (12 September 2006) | ||||
| - Added docs/examples/10-at-a-time.c by Michael Wallner | ||||
|  | ||||
| - Added docs/examples/hiperfifo.c by Jeff Pohlmeyer | ||||
|  | ||||
| Daniel (11 September 2006) | ||||
| - Fixed my breakage from earlier today so that doing curl_easy_cleanup() on a | ||||
|   handle that is part of a multi handle first removes the handle from the | ||||
|   stack. | ||||
|  | ||||
| - Added CURLOPT_SSL_SESSIONID_CACHE and --no-sessionid to disable SSL | ||||
|   session-ID re-use on demand since there obviously are broken servers out | ||||
|   there that misbehave with session-IDs used. | ||||
|  | ||||
| - Jeff Pohlmeyer presented a *multi_socket()-using program that exposed a | ||||
|   problem with it (SIGSEGV-style). It clearly showed that the existing | ||||
|   socket-state and state-difference function wasn't good enough so I rewrote | ||||
|   it and could then re-run Jeff's program without any crash. The previous | ||||
|   version clearly could miss to tell the application when a handle changed | ||||
|   from using one socket to using another. | ||||
|  | ||||
|   While I was at it (as I could use this as a means to track this problem | ||||
|   down), I've now added a 'magic' number to the easy handle struct that is | ||||
|   inited at curl_easy_init() time and cleared at curl_easy_cleanup() time that | ||||
|   we can use internally to detect that an easy handle seems to be fine, or at | ||||
|   least not closed or freed (freeing in debug builds fill the area with 0x13 | ||||
|   bytes but in normal builds we can of course not assume any particular data | ||||
|   in the freed areas). | ||||
|  | ||||
| Daniel (9 September 2006) | ||||
| - Michele Bini fixed how the hostname is put in NTLM packages. As servers | ||||
|   don't expect fully qualified names we need to cut them off at the first dot. | ||||
|  | ||||
| - Peter Sylvester cleaned up and fixed the getsockname() uses in ftp.c. Some | ||||
|   of them can be completetly removed though... | ||||
|  | ||||
| Daniel (6 September 2006) | ||||
| - Ravi Pratap and I have implemented HTTP Pipelining support. Enable it for a | ||||
|   multi handle using CURLMOPT_PIPELINING and all HTTP connections done on that | ||||
|   handle will be attempted to get pipelined instead of done in parallell as | ||||
|   they are performed otherwise. | ||||
|  | ||||
|   As a side-effect from this work, connections are now shared between all easy | ||||
|   handles within a multi handle, so if you use N easy handles for transfers, | ||||
|   each of them can pick up and re-use a connection that was previously used by | ||||
|   any of the handles, be it the same or one of the others. | ||||
|  | ||||
|   This separation of the tight relationship between connections and easy | ||||
|   handles is most noticable when you close easy handles that have been used in | ||||
|   a multi handle and check amount of used memory or watch the debug output, as | ||||
|   there are times when libcurl will keep the easy handle around for a while | ||||
|   longer to be able to close it properly. Like for sending QUIT to close down | ||||
|   an FTP connection. | ||||
|  | ||||
|   This is a major change. | ||||
|    | ||||
| Daniel (4 September 2006) | ||||
| - Dmitry Rechkin (http://curl.haxx.se/bug/view.cgi?id=1551412) provided a | ||||
|   patch that while not fixing things very nicely, it does make the SOCKS5 | ||||
|   proxy connection slightly better as it now acknowledges the timeout for | ||||
|   connection and it no longer segfaults in the case when SOCKS requires | ||||
|   authentication and you did not specify username:password. | ||||
|  | ||||
| Daniel (31 August 2006) | ||||
| - Dmitriy Sergeyev found and fixed a multi interface flaw when using asynch | ||||
|   name resolves. It could get stuck in the wrong state. | ||||
|  | ||||
| Gisle (29 August 2006) | ||||
| - Added support for other MS-DOS compilers (desides djgpp). All MS-DOS | ||||
|   compiler now uses the same config.dos file (renamed to config.h by | ||||
|   make). libcurl now builds fine using Watcom and Metaware's High-C | ||||
|   using the Watt-32 tcp/ip-stack. | ||||
|  | ||||
| Daniel (29 August 2006) | ||||
| - David McCreedy added CURLOPT_SOCKOPTFUNCTION and CURLOPT_SOCKOPTDATA to | ||||
|   allow applications to set their own socket options. | ||||
|  | ||||
| Daniel (25 August 2006) | ||||
| - Armel Asselin reported that the 'running_handles' counter wasn't updated | ||||
|   properly if you removed a "live" handle from a multi handle with | ||||
|   curl_multi_remove_handle(). | ||||
|  | ||||
| Daniel (22 August 2006) | ||||
| - David McCreedy fixed a remaining mistake from the August 19 TYPE change. | ||||
|  | ||||
| - Peter Sylvester pointed out a flaw in the AllowServerConnect() in the FTP | ||||
|   code when doing pure ipv6 EPRT connections. | ||||
|  | ||||
| Daniel (19 August 2006) | ||||
| - Based on a patch by Armel Asselin, the FTP code no longer re-issues the TYPE | ||||
|   command on subsequent requests on a re-used connection unless it has to. | ||||
|  | ||||
| - Armel Asselin fixed a crash in the FTP code when using SINGLECWD mode and | ||||
|   files in the root directory. | ||||
|  | ||||
| - Andrew Biggs pointed out a "Expect: 100-continue" flaw where libcurl didn't | ||||
|   send the whole request at once, even though the Expect: header was disabled | ||||
|   by the application. An effect of this change is also that small (< 1024 | ||||
|   bytes) POSTs are now always sent without Expect: header since we deem it | ||||
|   more costly to bother about that than the risk that we send the data in | ||||
|   vain. | ||||
|  | ||||
| Daniel (9 August 2006) | ||||
| - Armel Asselin made the CURLOPT_PREQUOTE option work fine even when | ||||
|   CURLOPT_NOBODY is set true. PREQUOTE is then run roughly at the same place | ||||
|   in the command sequence as it would have run if there would've been a | ||||
|   transfer. | ||||
|  | ||||
| Daniel (8 August 2006) | ||||
| - Fixed a flaw in the "Expect: 100-continue" treatment. If you did two POSTs | ||||
|   on a persistent connection and allowed the first to use that header, you | ||||
|   could not disable it for the second request. | ||||
|  | ||||
| Daniel (7 August 2006) | ||||
| - Domenico Andreolfound a quick build error which happened because | ||||
|   src/config.h.in was not a proper duplcate of lib/config.h.in which it | ||||
|   should've been and this was due to the maketgz script not doing the cp | ||||
|   properly. | ||||
|  | ||||
| Version 7.15.5 (7 August 2006) | ||||
|  | ||||
| Daniel (2 August 2006) | ||||
| - Mark Lentczner fixed how libcurl was not properly doing chunked encoding | ||||
|   if the header "Transfer-Encoding: chunked" was set by the application. | ||||
|   http://curl.haxx.se/bug/view.cgi?id=1531838 | ||||
|  | ||||
| Daniel (1 August 2006) | ||||
| - Maciej Karpiuk fixed a crash that would occur if we passed Curl_strerror() | ||||
|   an unknown error number on glibc systems. | ||||
|   http://curl.haxx.se/bug/view.cgi?id=1532289 | ||||
|  | ||||
| Daniel (31 July 2006) | ||||
| - *ALERT* curl_multi_socket() and curl_multi_socket_all() got modified | ||||
|   prototypes: they both now provide the number of running handles back to the | ||||
|   calling function. It makes the functions resemble the good old | ||||
|   curl_multi_perform() more and provides a nice way to know when the multi | ||||
|   handle goes empty. | ||||
|  | ||||
|   ALERT2: don't use the curl_multi_socket*() functionality in anything | ||||
|   production-like until I say it's somewhat settled, as I suspect there might | ||||
|   be some further API changes before I'm done... | ||||
|  | ||||
| Daniel (28 July 2006) | ||||
| - Yves Lejeune fixed so that replacing Content-Type: when doing multipart | ||||
|   formposts work exactly the way you want it (and the way you'd assume it | ||||
|   works). | ||||
|  | ||||
| Daniel (27 July 2006) | ||||
| - David McCreedy added --ftp-ssl-reqd which makes curl *require* SSL for both | ||||
|   control and data connection, as the existing --ftp-ssl option only requests | ||||
|   it. | ||||
|  | ||||
| - [Hiper-related work] Added a function called curl_multi_assign() that will | ||||
|   set a private pointer added to the internal libcurl hash table for the | ||||
|   particular socket passed in to this function: | ||||
|  | ||||
|   CURLMcode curl_multi_assign(CURLM *multi_handle, | ||||
|                               curl_socket_t sockfd, | ||||
|                               void *sockp); | ||||
|  | ||||
|   'sockp' being a custom pointer set by the application to be associated with | ||||
|   this socket. The socket has to be already existing and in-use by libcurl, | ||||
|   like having already called the callback telling about its existance. | ||||
|  | ||||
|   The set hashp pointer will then be passed on to the callback in upcoming | ||||
|   calls when this same socket is used (in the brand new 'socketp' argument). | ||||
|  | ||||
| Daniel (26 July 2006) | ||||
| - Dan Nelson added the CURLOPT_FTP_ALTERNATIVE_TO_USER libcurl option and curl | ||||
|   tool option named --ftp-alternative-to-user. It provides a mean to send a | ||||
|   particular command if the normal USER/PASS approach fails. | ||||
|  | ||||
| - Michael Jerris added magic that builds lib/curllib.vcproj automatically for | ||||
|   newer MSVC. | ||||
|  | ||||
| Daniel (25 July 2006) | ||||
| - Georg Horn made the transfer timeout error message include more details. | ||||
|  | ||||
| Daniel (20 July 2006) | ||||
| - David McCreedy fixed a build error when building libcurl with HTTP disabled, | ||||
|   problem added with the curl_formget() patch. | ||||
|  | ||||
| Daniel (17 July 2006) | ||||
| - Jari Sundell did some excellent research and bug tracking, figured out that | ||||
|   we did wrong and patched it: When nodes were removed from the splay tree, | ||||
|   and we didn't properly remove it from the splay tree when an easy handle was | ||||
|   removed from a multi stack and thus we could wrongly leave a node in the | ||||
|   splay tree pointing to (bad) memory. | ||||
|  | ||||
| Daniel (14 July 2006) | ||||
| - David McCreedy fixed a flaw where the CRLF counter wasn't properly cleared | ||||
|   for FTP ASCII transfers. | ||||
|  | ||||
| Daniel (8 July 2006) | ||||
| - Ates Goral pointed out that libcurl's cookie parser did case insensitive | ||||
|   string comparisons on the path which is incorrect and provided a patch that | ||||
|   fixes this. I edited test case 8 to include details that test for this. | ||||
|  | ||||
| - Ingmar Runge provided a source snippet that caused a crash. The reason for | ||||
|   the crash was that libcurl internally was a bit confused about who owned the | ||||
|   DNS cache at all times so if you created an easy handle that uses a shared | ||||
|   DNS cache and added that to a multi handle it would crash. Now we keep more | ||||
|   careful internal track of exactly what kind of DNS cache each easy handle | ||||
|   uses: None, Private (allocated for and used only by this single handle), | ||||
|   Shared (points to a cache held by a shared object), Global (points to the | ||||
|   global cache) or Multi (points to the cache within the multi handle that is | ||||
|   automatically shared between all easy handles that are added with private | ||||
|   caches). | ||||
|  | ||||
| Daniel (4 July 2006) | ||||
| - Toshiyuki Maezawa fixed a problem where you couldn't override the | ||||
|   Proxy-Connection: header when using a proxy and not doing CONNECT. | ||||
|  | ||||
| Daniel (24 June 2006) | ||||
| - Michael Wallner added curl_formget(), which allows an application to extract | ||||
|   (serialise) a previously built formpost (as with curl_formadd()). | ||||
|  | ||||
| Daniel (23 June 2006) | ||||
| - Arve Knudsen found a flaw in curl_multi_fdset() for systems where | ||||
|   curl_socket_t is unsigned (like Windows) that could cause it to wrongly | ||||
|   return a max fd of -1. | ||||
|  | ||||
| Daniel (20 June 2006) | ||||
| - Peter Silva introduced CURLOPT_MAX_SEND_SPEED_LARGE and | ||||
|   CURLOPT_MAX_RECV_SPEED_LARGE that limit tha maximum rate libcurl is allowed | ||||
|   to send or receive data. This kind of adds the the command line tool's | ||||
|   option --limit-rate to the library. | ||||
|  | ||||
|   The rate limiting logic in the curl app is now removed and is instead | ||||
|   provided by libcurl itself. Transfer rate limiting will now also work for -d | ||||
|   and -F, which it didn't before. | ||||
|  | ||||
| Daniel (19 June 2006) | ||||
| - Made -K on a file that couldn't be read cause a warning to be displayed. | ||||
|  | ||||
| Daniel (13 June 2006) | ||||
| - Dan Fandrich implemented --enable-hidden-symbols configure option to enable | ||||
|   -fvisibility=hidden on gcc >= 4.0.  This reduces the size of the libcurl | ||||
|   binary and speeds up dynamic linking by hiding all the internal symbols from | ||||
|   the symbol table. | ||||
|  | ||||
| Version 7.15.4 (12 June 2006) | ||||
|  | ||||
| Daniel (8 June 2006) | ||||
|   | ||||
							
								
								
									
										2
									
								
								COPYING
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								COPYING
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| COPYRIGHT AND PERMISSION NOTICE | ||||
|  | ||||
| Copyright (c) 1996 - 2006, Daniel Stenberg, <daniel@haxx.se>. | ||||
| Copyright (c) 1996 - 2007, Daniel Stenberg, <daniel@haxx.se>. | ||||
|  | ||||
| All rights reserved. | ||||
|  | ||||
|   | ||||
							
								
								
									
										112
									
								
								Makefile.dist
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								Makefile.dist
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # Copyright (C) 1998 - 2007, 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,6 +21,8 @@ | ||||
| # $Id$ | ||||
| ########################################################################### | ||||
|  | ||||
| VC=vc6 | ||||
|  | ||||
| all: | ||||
| 	./configure | ||||
| 	make | ||||
| @@ -73,112 +75,120 @@ mingw32-ssl: | ||||
| 	$(MAKE) -C lib -f Makefile.m32 SSL=1 ZLIB=1 | ||||
| 	$(MAKE) -C src -f Makefile.m32 SSL=1 ZLIB=1 | ||||
|  | ||||
| mingw32-ssh2-ssl: | ||||
| 	$(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 ZLIB=1 | ||||
| 	$(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 ZLIB=1 | ||||
|  | ||||
| mingw32-ssh2-ssl-sspi: | ||||
| 	$(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1 | ||||
| 	$(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1 | ||||
|  | ||||
| mingw32-clean: | ||||
| 	$(MAKE) -C lib -f Makefile.m32 clean | ||||
| 	$(MAKE) -C src -f Makefile.m32 clean | ||||
|  | ||||
| vc-clean: | ||||
| 	cd lib | ||||
| 	nmake -f Makefile.vc6 clean | ||||
| 	nmake -f Makefile.$(VC) clean | ||||
| 	cd ..\src | ||||
| 	nmake -f Makefile.vc6 clean | ||||
| 	nmake -f Makefile.$(VC) clean | ||||
|  | ||||
| vc-all: | ||||
| 	cd lib | ||||
| 	nmake -f Makefile.vc6 cfg=release | ||||
| 	nmake -f Makefile.vc6 cfg=release-ssl | ||||
| 	nmake -f Makefile.vc6 cfg=release-zlib | ||||
| 	nmake -f Makefile.vc6 cfg=release-ssl-zlib | ||||
| 	nmake -f Makefile.vc6 cfg=release-ssl-dll | ||||
| 	nmake -f Makefile.vc6 cfg=release-zlib-dll | ||||
| 	nmake -f Makefile.vc6 cfg=release-ssl-dll-zlib-dll | ||||
| 	nmake -f Makefile.vc6 cfg=release-dll | ||||
| 	nmake -f Makefile.vc6 cfg=release-dll-ssl-dll | ||||
| 	nmake -f Makefile.vc6 cfg=release-dll-zlib-dll | ||||
| 	nmake -f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll | ||||
| 	nmake -f Makefile.vc6 cfg=debug | ||||
| 	nmake -f Makefile.vc6 cfg=debug-ssl | ||||
| 	nmake -f Makefile.vc6 cfg=debug-zlib | ||||
| 	nmake -f Makefile.vc6 cfg=debug-ssl-zlib | ||||
| 	nmake -f Makefile.vc6 cfg=debug-ssl-dll | ||||
| 	nmake -f Makefile.vc6 cfg=debug-zlib-dll | ||||
| 	nmake -f Makefile.vc6 cfg=debug-ssl-dll-zlib-dll | ||||
| 	nmake -f Makefile.vc6 cfg=debug-dll | ||||
| 	nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll | ||||
| 	nmake -f Makefile.vc6 cfg=debug-dll-zlib-dll | ||||
| 	nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll-zlib-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=release | ||||
| 	nmake -f Makefile.$(VC) cfg=release-ssl | ||||
| 	nmake -f Makefile.$(VC) cfg=release-zlib | ||||
| 	nmake -f Makefile.$(VC) cfg=release-ssl-zlib | ||||
| 	nmake -f Makefile.$(VC) cfg=release-ssl-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=release-zlib-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=release-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=release-dll-zlib-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=debug | ||||
| 	nmake -f Makefile.$(VC) cfg=debug-ssl | ||||
| 	nmake -f Makefile.$(VC) cfg=debug-zlib | ||||
| 	nmake -f Makefile.$(VC) cfg=debug-ssl-zlib | ||||
| 	nmake -f Makefile.$(VC) cfg=debug-ssl-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=debug-zlib-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=debug-ssl-dll-zlib-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=debug-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=debug-dll-zlib-dll | ||||
| 	nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll-zlib-dll | ||||
|  | ||||
| vc: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release | ||||
| 	nmake /f Makefile.$(VC) cfg=release | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 | ||||
| 	nmake /f Makefile.$(VC) | ||||
|  | ||||
| vc-zlib: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release-zlib | ||||
| 	nmake /f Makefile.$(VC) cfg=release-zlib | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release-zlib | ||||
| 	nmake /f Makefile.$(VC) cfg=release-zlib | ||||
|  | ||||
| vc-ssl: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release-ssl | ||||
| 	nmake /f Makefile.$(VC) cfg=release-ssl | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release-ssl | ||||
| 	nmake /f Makefile.$(VC) cfg=release-ssl | ||||
|  | ||||
| vc-ssl-zlib: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release-ssl-zlib | ||||
| 	nmake /f Makefile.$(VC) cfg=release-ssl-zlib | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release-ssl-zlib | ||||
| 	nmake /f Makefile.$(VC) cfg=release-ssl-zlib | ||||
|  | ||||
| vc-ssl-dll: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release-ssl-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-ssl-dll | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release-ssl-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-ssl-dll | ||||
|  | ||||
| vc-dll-ssl-dll: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release-dll-ssl-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release-dll-ssl-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll | ||||
|  | ||||
| vc-dll: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-dll | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-dll | ||||
|  | ||||
| vc-dll-zlib-dll: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release-dll-zlib-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release-dll-zlib-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll | ||||
|  | ||||
| vc-dll-ssl-dll-zlib-dll: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll | ||||
|  | ||||
| vc-ssl-dll-zlib-dll: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll | ||||
|  | ||||
| vc-zlib-dll: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release-zlib-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-zlib-dll | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release-zlib-dll | ||||
| 	nmake /f Makefile.$(VC) cfg=release-zlib-dll | ||||
|  | ||||
| vc-sspi: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1 | ||||
| 	nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1 | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1 | ||||
| 	nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1 | ||||
|  | ||||
| djgpp: | ||||
| 	$(MAKE) -C lib -f Makefile.dj | ||||
| @@ -212,6 +222,10 @@ netware-ssl-zlib: | ||||
| 	$(MAKE) -C lib -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1 | ||||
| 	$(MAKE) -C src -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1 | ||||
|  | ||||
| netware-ssh2-ssl-zlib: | ||||
| 	$(MAKE) -C lib -f Makefile.netware WITH_SSH2=1 WITH_SSL=1 WITH_ZLIB=1 | ||||
| 	$(MAKE) -C src -f Makefile.netware WITH_SSH2=1 WITH_SSL=1 WITH_ZLIB=1 | ||||
|  | ||||
| netware-zlib: | ||||
| 	$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1 | ||||
| 	$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1 | ||||
|   | ||||
							
								
								
									
										2
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								README
									
									
									
									
									
								
							| @@ -7,7 +7,7 @@ | ||||
| README | ||||
|  | ||||
|   Curl is a command line tool for transferring data specified with URL | ||||
|   syntax. Find out how to use Curl by reading the curl.1 man page or the | ||||
|   syntax. Find out how to use curl by reading the curl.1 man page or the | ||||
|   MANUAL document. Find out how to install Curl by reading the INSTALL | ||||
|   document. | ||||
|  | ||||
|   | ||||
							
								
								
									
										112
									
								
								RELEASE-NOTES
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								RELEASE-NOTES
									
									
									
									
									
								
							| @@ -1,72 +1,78 @@ | ||||
| Curl and libcurl 7.15.4 | ||||
| Curl and libcurl 7.16.2 | ||||
|  | ||||
|  Public curl release number:               94 | ||||
|  Releases counted from the very beginning: 121 | ||||
|  Available command line options:           112 | ||||
|  Available curl_easy_setopt() options:     132 | ||||
|  Number of public functions in libcurl:    49 | ||||
|  Amount of public web site mirrors:        33 | ||||
|  Number of known libcurl bindings:         32 | ||||
|  Number of contributors:                   492 | ||||
|  Public curl release number:               98 | ||||
|  Releases counted from the very beginning: 125 | ||||
|  Available command line options:           118 | ||||
|  Available curl_easy_setopt() options:     141 | ||||
|  Number of public functions in libcurl:    54 | ||||
|  Amount of public web site mirrors:        38 | ||||
|  Number of known libcurl bindings:         35 | ||||
|  Number of contributors:                   539 | ||||
|  | ||||
| This release includes the following changes: | ||||
|   | ||||
|  o NTLM2 session response support | ||||
|  o CURLOPT_COOKIELIST set to "SESS" clears all session cookies | ||||
|  o CURLINFO_LASTSOCKET returned sockets are now checked more before returned | ||||
|  o curl-config got a --checkfor option to compare version numbers | ||||
|  o line end conversions for FTP ASCII transfers | ||||
|  o curl_multi_socket() API added (still mostly untested) | ||||
|  o conversion callback options for EBCDIC <=> ASCII conversions | ||||
|  o added CURLINFO_FTP_ENTRY_PATH | ||||
|  o less blocking for the multi interface during (Open)SSL connect negotiation | ||||
|  o added CURLOPT_TIMEOUT_MS and CURLOPT_CONNECTTIMEOUT_MS | ||||
|  o added CURLOPT_HTTP_CONTENT_DECODING, CURLOPT_HTTP_TRANSFER_DECODING and | ||||
|    --raw | ||||
|  o added support for using the NSS library for TLS/SSL | ||||
|  o changed default anonymous FTP password | ||||
|  o changed the CURLOPT_FTP_SSL_CCC option to handle active and passive | ||||
|    CCC shutdown | ||||
|  o added the --ftp-ssl-ccc-mode command line option | ||||
|  o includes VC8 Makefiles in the release archive | ||||
|  o --ftp-ssl-control is now honoured on ftps:// URLs | ||||
|  o added experimental CURL_ACKNOWLEDGE_EINTR symbol definition check | ||||
|  o --key and new --pubkey options for SSH public key file logins | ||||
|  o --pass now works for a SSH public key file, too | ||||
|  o select (2) support no longer needed to build the library if poll() used | ||||
|  o CURLOPT_POSTQUOTE works for SFTP | ||||
|  | ||||
| This release includes the following bugfixes: | ||||
|  | ||||
|  o builds fine on cygwin | ||||
|  o md5-sess with Digest authentication | ||||
|  o dict with letters such as space in a word | ||||
|  o dict with url-encoded words in the URL | ||||
|  o libcurl.m4 when default=yes but no libcurl was found | ||||
|  o numerous bugs fixed in the TFTP code | ||||
|  o possible memory leak when adding easy handles to multi stack | ||||
|  o TFTP works in a more portable fashion (== on more platforms) | ||||
|  o WSAGetLastError() is now used (better) on Windows | ||||
|  o GnuTLS non-block case that could cause data trashing | ||||
|  o deflate code survives lack of zlib header | ||||
|  o CURLOPT_INTERFACE works with hostname | ||||
|  o configure runs fine with ICC | ||||
|  o closed control connection with FTP when easy handle was removed from multi | ||||
|  o curl --trace crash when built with VS2005 | ||||
|  o SSL connect time-out | ||||
|  o improved NTLM functionality | ||||
|  o following redirects with more than one question mark in source URL | ||||
|  o fixed debug build crash with -d | ||||
|  o generates a fine AIX Toolbox RPM spec | ||||
|  o treat FTP AUTH failures properly | ||||
|  o TFTP transfers could trash data | ||||
|  o -d + -G combo crash | ||||
|  o in testsuite, update test cookies expiration from 2007-Feb-1 to year 2035  | ||||
|  o socks5 works | ||||
|  o builds fine with VC2005 | ||||
|  o CURLOPT_RANGE set to NULL resets the range for FTP | ||||
|  o curl_multi_remove_handle() rare crash | ||||
|  o passive FTP transfers work with SOCKS | ||||
|  o multi interface HTTPS connection re-use memory leak | ||||
|  o libcurl.m4's --with-libcurl is improved | ||||
|  o curl-config --libs and libcurl.pc no longer list unnecessary dependencies | ||||
|  o fixed an issue with CCC not working on some servers | ||||
|  o several HTTP pipelining problems | ||||
|  o HTTP CONNECT thru a proxy is now less blocking when the multi interface is | ||||
|    used | ||||
|  o HTTP Digest header parsing fix for unquoted last word ending with CRLF | ||||
|  o CURLOPT_PORT, HTTP proxy, re-using connections and non-HTTP protocols | ||||
|  o CURLOPT_INTERFACE for ipv6 | ||||
|  o use-after-free issue with HTTP transfers with the multi interface | ||||
|  o the progress callback can get called more frequently | ||||
|  o timeout would restart when signal caught while awaiting socket events | ||||
|  o curl -f with user+password embedded in the URL | ||||
|  o 26 flaws identified by coverity.com | ||||
|  o builds on QNX 6 again | ||||
|  | ||||
| This release includes the following known bugs: | ||||
|  | ||||
|  o see docs/KNOWN_BUGS (http://curl.haxx.se/docs/knownbugs.html) | ||||
|  | ||||
| Other curl-related news: | ||||
|  | ||||
|  o tclcurl 0.15.3 was released: | ||||
|    http://personal1.iddeo.es/andresgarci/tclcurl/english/ | ||||
|  o pycurl 7.16.1 was released: http://pycurl.sf.net/ | ||||
|  | ||||
| New curl mirrors: | ||||
|  | ||||
|  o http://curl.webdesign-zdg.de/ in Frankfurt, Germany | ||||
|  o http://curl.de-mirror.de/ in Aachen, Germany | ||||
|  o http://curl.osmirror.nl/ in Amsterdam, the Netherlands | ||||
|  o http://curl.usphp.com/ in Florida, US | ||||
|  o http://curl.oslevel.de/ in Karlsruhe, Germany | ||||
|  o http://curl.basemirror.de is a new mirror in Germany | ||||
|  o http://curl.xxtracker.org is a new mirror in The Netherlands | ||||
|  | ||||
| This release would not have looked like this without help, code, reports and | ||||
| advice from friends like these: | ||||
|  | ||||
|  Dan Fandrich, Ilja van Sprundel, David McCreedy, Tor Arntsen, Xavier Bouchoux, | ||||
|  David Byron, Michele Bini, Ates Goral, Katie Wang, Robson Braga Araujo, | ||||
|  Ale Vesely, Paul Querna, Gisle Vanem, Mark Eichin, Roland Blom, Andreas | ||||
|  Ntaflos, David Shaw, Michael Wallner, Olaf St<53>ben, Mikael Sennerholm, | ||||
|  Brian Dessent | ||||
|  Yang Tse, Manfred Schwarb, Michael Wallner, Jeff Pohlmeyer, Shmulik Regev, | ||||
|  Rob Crittenden, Robert A. Monat, Dan Fandrich, Duncan Mac-Vicar Prett, | ||||
|  Michal Marek, Robson Braga Araujo, Ian Turner, Linus Nielsen Feltzing, | ||||
|  Ravi Pratap, Adam D. Moss, Jose Kahan, Hang Kin Lau, Justin Fletcher, | ||||
|  Robert Iakobashvili, Bryan Henderson, Eygene Ryabinkin, Daniel Johnson, | ||||
|  Matt Kraai, Nick Zitzmann, Rob Jones | ||||
|  | ||||
|         Thanks! (and sorry if I forgot to mention someone) | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| To get fixed in 7.15.4 (planned release: June 2006) | ||||
| ====================== | ||||
| To be addressed before 7.16.3 (planned release: June 2007) | ||||
| ============================= | ||||
|  | ||||
| 66 -  | ||||
| 93 -  | ||||
|  | ||||
|   | ||||
							
								
								
									
										979
									
								
								acinclude.m4
									
									
									
									
									
								
							
							
						
						
									
										979
									
								
								acinclude.m4
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -14,3 +14,9 @@ Henrik Stoerner | ||||
| Yang Tse | ||||
| Nick Mathewson | ||||
| Alexander Lazic | ||||
| Andreas Rieke | ||||
| Guilherme Balena Versiani | ||||
| Brad Spencer | ||||
| Ravi Pratap | ||||
| William Ahern | ||||
| Bram Matthys | ||||
|   | ||||
							
								
								
									
										80
									
								
								ares/CHANGES
									
									
									
									
									
								
							
							
						
						
									
										80
									
								
								ares/CHANGES
									
									
									
									
									
								
							| @@ -1,5 +1,83 @@ | ||||
|   Changelog for the c-ares project | ||||
|  | ||||
| * February 19 | ||||
|  | ||||
| - Vlad Dinulescu added ares_parse_ns_reply(). | ||||
|  | ||||
| * February 13 | ||||
|  | ||||
| - Yang Tse: Fix failure to get the search sequence of /etc/hosts and | ||||
|   DNS from /etc/nsswitch.conf, /etc/host.conf or /etc/svc.conf when | ||||
|   /etc/resolv.conf did not exist or was unable to read it. | ||||
|  | ||||
| * November 22 | ||||
|  | ||||
| - Install ares_dns.h too | ||||
|  | ||||
| - Michael Wallner fixed this problem: When I set domains in the options | ||||
|   struct, and there are domain/search entries in /etc/resolv.conf, the domains | ||||
|   of the options struct will be overridden. | ||||
|  | ||||
| * November 6 | ||||
|  | ||||
| - Yang Tse removed a couple of potential zero size memory allocations. | ||||
|  | ||||
| - Andreas Rieke fixed the line endings in the areslib.dsp file that I (Daniel) | ||||
|   broke in the 1.3.2 release. We should switch to a system where that file is | ||||
|   auto-generated. We could rip some code for that from curl... | ||||
|  | ||||
| Version 1.3.2 (November 3, 2006) | ||||
|  | ||||
| * October 12 2006 | ||||
|  | ||||
| - Prevent ares_getsock() to overflow if more than 16 sockets are used. | ||||
|  | ||||
| * September 11 2006 | ||||
|  | ||||
| - Guilherme Balena Versiani: I noted a strange BUG in Win32 port | ||||
|   (ares_init.c/get_iphlpapi_dns_info() function): when I disable the network | ||||
|   by hand or disconnect the network cable in Windows 2000 or Windows XP, my | ||||
|   application gets 127.0.0.1 as the only name server. The problem comes from | ||||
|   'GetNetworkParams' function, that returns the empty string "" as the only | ||||
|   name server in that case. Moreover, the Windows implementation of | ||||
|   inet_addr() returns INADDR_LOOPBACK instead of INADDR_NONE. | ||||
|  | ||||
| * August 29 2006 | ||||
|  | ||||
| - Brad Spencer did | ||||
|  | ||||
|   o made ares_version.h use extern "C" for c++ compilers | ||||
|   o fixed compiler warnings in ares_getnameinfo.c | ||||
|   o fixed a buffer position init for TCP reads | ||||
|  | ||||
| * August 3 2006 | ||||
|  | ||||
| - Ravi Pratap fixed ares_getsock() to actually return the proper bitmap and | ||||
|   not always zero! | ||||
|  | ||||
| Version 1.3.1 (June 24, 2006) | ||||
|  | ||||
| * July 23, 2006 | ||||
|  | ||||
| - Gisle Vanem added getopt() to the ahost program. Currently accepts | ||||
|   only [-t {a|aaaa}] to specify address family in ares_gethostbyname(). | ||||
|  | ||||
| * June 19, 2006 | ||||
|  | ||||
| - (wahern) Removed "big endian" DNS section and RR data integer parser | ||||
|   macros from ares_dns.h, which break c-ares on my Sparc64. Bit-wise | ||||
|   operations in C operate on logical values. And in any event the octets are | ||||
|   already in big-endian (aka network) byte order so they're being reversed | ||||
|   (thus the source of the breakage). | ||||
|  | ||||
| * June 18, 2006 | ||||
|  | ||||
| - William Ahern handles EAGAIN/EWOULDBLOCK errors in most of the I/O calls | ||||
|   from area_process.c. | ||||
|  | ||||
|   TODO: Handle one last EAGAIN for a UDP socket send(2) in | ||||
|   ares__send_query(). | ||||
|  | ||||
| * May 10, 2006 | ||||
|  | ||||
| - Bram Matthys brought my attention to a libtool peculiarity where detecting | ||||
| @@ -49,7 +127,7 @@ | ||||
| - configure fix for detecting a member in the sockaddr_in6 struct which failed | ||||
|   on ipv6-enabled HP-UX 11.00 | ||||
|  | ||||
| Version 1.3.0 (August 29, 2004) | ||||
| Version 1.3.0 (August 29, 2005) | ||||
|  | ||||
| * August 21 | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/vc.dsw vc/ahost/ahost.dep \ | ||||
| # adig and ahost are just sample programs and thus not mentioned with the | ||||
| # regular sources and headers | ||||
| EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \ | ||||
|  $(MSVCFILES) AUTHORS | ||||
|  $(MSVCFILES) AUTHORS config-win32.h | ||||
|  | ||||
|  | ||||
| VER=-version-info 1:0:0 | ||||
| @@ -59,7 +59,7 @@ libcares_la_SOURCES = $(CSOURCES) $(HHEADERS) | ||||
| # where to install the c-ares headers | ||||
| libcares_ladir = $(includedir) | ||||
| # what headers to install on 'make install': | ||||
| libcares_la_HEADERS = ares.h ares_version.h | ||||
| libcares_la_HEADERS = ares.h ares_version.h ares_dns.h | ||||
|  | ||||
| # Make files named *.dist replace the file without .dist extension | ||||
| dist-hook: | ||||
|   | ||||
| @@ -2,39 +2,63 @@ | ||||
| # c-ares Makefile for djgpp/gcc/Watt-32. | ||||
| #   By Gisle Vanem <giva@bgnett.no> 2004. | ||||
| # | ||||
| .SUFFIXES: .exe | ||||
| # $Id$ | ||||
|  | ||||
| TOPDIR = .. | ||||
|  | ||||
| include ../packages/DOS/common.dj | ||||
|  | ||||
| include Makefile.inc | ||||
|  | ||||
| WATT32_ROOT = $(subst \,/,$(WATT_ROOT)) | ||||
|  | ||||
| CC      = gcc | ||||
| 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 | ||||
| CFLAGS += -DWATT32 -DHAVE_AF_INET6 -DHAVE_PF_INET6 -DHAVE_FIONBIO \ | ||||
|           -DHAVE_STRUCT_IN6_ADDR -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID \ | ||||
|           -DHAVE_SYS_TIME_H -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \ | ||||
|           -DHAVE_SIGNAL_H -DHAVE_SIG_ATOMIC_T -DRETSIGTYPE='void' -DHAVE_PROCESS_H \ | ||||
|           -DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 -DHAVE_RECV -DHAVE_SEND \ | ||||
|           -DSEND_TYPE_ARG1='int'   -DSEND_QUAL_ARG2='const' \ | ||||
|           -DSEND_TYPE_ARG2='void*' -DSEND_TYPE_ARG3='int' \ | ||||
|           -DSEND_TYPE_ARG4='int'   -DSEND_TYPE_RETV='int' \ | ||||
|           -DRECV_TYPE_ARG1='int'   -DRECV_TYPE_ARG2='void*' \ | ||||
|           -DRECV_TYPE_ARG3='int'   -DRECV_TYPE_ARG4='int' \ | ||||
|           -DRECV_TYPE_RETV='int'   -DHAVE_STRUCT_TIMEVAL \ | ||||
|           -UHAVE_CONFIG_H | ||||
|  | ||||
| LDFLAGS = -s | ||||
| EX_LIBS = $(WATT32_ROOT)/lib/libwatt.a | ||||
|  | ||||
| OBJ_DIR = djgpp | ||||
| ifeq ($(USE_DEBUG),1) | ||||
|   EX_LIBS  = ../lib/libcurl.a | ||||
|   OBJ_HACK = $(OBJECTS) | ||||
| else | ||||
|   OBJ_HACK = libcares.a | ||||
| endif | ||||
|  | ||||
| ifeq ($(USE_SSL),1) | ||||
|   EX_LIBS += $(OPENSSL_ROOT)/lib/libssl.a $(OPENSSL_ROOT)/lib/libcrypt.a | ||||
| endif | ||||
|  | ||||
| ifeq ($(USE_ZLIB),1) | ||||
|   EX_LIBS += $(ZLIB_ROOT)/libz.a | ||||
|   CFLAGS  += -DUSE_MANUAL | ||||
| endif | ||||
|  | ||||
| ifeq ($(USE_IDNA),1) | ||||
|   EX_LIBS += $(LIBIDN_ROOT)/lib/dj_obj/libidn.a -liconv | ||||
| endif | ||||
|  | ||||
| EX_LIBS += $(WATT32_ROOT)/lib/libwatt.a | ||||
|  | ||||
| OBJECTS = $(addprefix $(OBJ_DIR)/, $(CSOURCES:.c=.o)) | ||||
|  | ||||
| all: $(OBJ_DIR) libcares.a ahost.exe adig.exe | ||||
| 	@echo Welcome to c-ares. | ||||
|  | ||||
| $(OBJ_DIR): | ||||
| 	- mkdir $(OBJ_DIR) | ||||
|  | ||||
| libcares.a: $(OBJECTS) | ||||
| 	ar rs $@ $? | ||||
|  | ||||
| ahost.exe: ahost.c libcares.a | ||||
| ahost.exe: ahost.c $(OBJ_HACK) | ||||
| 	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS) | ||||
|  | ||||
| adig.exe: adig.c libcares.a | ||||
| adig.exe: adig.c $(OBJ_HACK) | ||||
| 	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS) | ||||
|  | ||||
| clean: | ||||
| @@ -44,12 +68,5 @@ vclean realclean: clean | ||||
| 	rm -f ahost.exe adig.exe depend.dj | ||||
| 	- rmdir $(OBJ_DIR) | ||||
|  | ||||
| $(OBJ_DIR)/%.o: %.c | ||||
| 	$(CC) $(CFLAGS) -o $@ -c $< | ||||
| 	@echo | ||||
|  | ||||
| depend: | ||||
| 	$(CC) -MM $(CFLAGS) $(CSOURCES) | \ | ||||
| 	sed -e 's/^\([a-zA-Z0-9_-]*\.o:\)/$$(OBJ_DIR)\/\1/' > depend.dj | ||||
|  | ||||
| -include depend.dj | ||||
|  | ||||
|   | ||||
| @@ -5,14 +5,18 @@ 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 | ||||
| ares_getnameinfo.c inet_net_pton.c bitncmp.c inet_ntop.c		\ | ||||
| ares_parse_ns_reply.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 | ||||
|            nameser.h inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h      \ | ||||
|            setup_once.h  | ||||
|  | ||||
| MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \ | ||||
|  ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3		    \ | ||||
|  ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3	    \ | ||||
|  ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3		    \ | ||||
|  ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3	    \ | ||||
|  ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.3 | ||||
|  ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.3    \ | ||||
|  ares_getsock.3 ares_parse_ns_reply.3 | ||||
|  | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| ################################################################# | ||||
| # $Id$ | ||||
| # | ||||
| ## Makefile for building libares.lib (NetWare version - gnu make) | ||||
| ## Makefile for building libares (NetWare version - gnu make) | ||||
| ## Use: make -f Makefile.netware | ||||
| ## | ||||
| ## Comments to: Guenter Knauf <eflash@gmx.net> | ||||
| ## Comments to: Guenter Knauf http://www.gknw.de/phpbb | ||||
| # | ||||
| ################################################################# | ||||
|  | ||||
| @@ -18,9 +19,9 @@ endif | ||||
|  | ||||
| # Edit the vars below to change NLM target settings. | ||||
| TARGETS = adig.nlm ahost.nlm | ||||
| LTARGET = libcares.lib | ||||
| LTARGET = libcares.$(LIBEXT) | ||||
| VERSION	= $(LIBCARES_VERSION) | ||||
| COPYR	= Copyright (C) 1996 - 2006, Daniel Stenberg, <daniel@haxx.se> | ||||
| COPYR	= Copyright (C) 1996 - 2007, Daniel Stenberg, <daniel@haxx.se> | ||||
| DESCR	= cURL $(subst .def,,$(notdir $@)) $(LIBCARES_VERSION_STR) - http://curl.haxx.se | ||||
| MTSAFE	= YES | ||||
| STACK	= 64000 | ||||
| @@ -72,6 +73,7 @@ LD	= mwldnlm | ||||
| LDFLAGS	= -nostdlib $(PRELUDE) $(OBJS) $(<:.def=.o) -o $@ -commandfile | ||||
| AR	= mwldnlm | ||||
| ARFLAGS	= -type library -w nocmdline $(OBJDIR)/*.o -o | ||||
| LIBEXT	= lib | ||||
| CFLAGS	+= -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586 | ||||
| CFLAGS	+= -relax_pointers | ||||
| #CFLAGS	+= -w on | ||||
| @@ -88,6 +90,7 @@ LD	= nlmconv | ||||
| LDFLAGS	= -T | ||||
| AR	= ar | ||||
| ARFLAGS	= -cq | ||||
| LIBEXT	= a | ||||
| CFLAGS	+= -fno-builtin -fpcc-struct-return -fno-strict-aliasing | ||||
| CFLAGS	+= -Wall -Wno-format -Wno-uninitialized # -pedantic | ||||
| ifeq ($(LIBARCH),LIBC) | ||||
| @@ -155,7 +158,7 @@ clean: | ||||
| 	-$(RM) -r $(OBJDIR) | ||||
| 	-$(RM) -r arpa | ||||
|  | ||||
| %.lib: $(OBJS) | ||||
| %.$(LIBEXT): $(OBJS) | ||||
| 	@echo Creating $@ | ||||
| 	@-$(RM) $@ | ||||
| 	@$(AR) $(ARFLAGS) $@ $^ | ||||
| @@ -255,6 +258,9 @@ config.h: Makefile.netware | ||||
| 	@echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@ | ||||
| 	@echo $(DL)** All your changes will be lost!!$(DL) >> $@ | ||||
| 	@echo $(DL)*/$(DL) >> $@ | ||||
| 	@echo $(DL)#ifndef NETWARE$(DL) >> $@ | ||||
| 	@echo $(DL)#error This $(notdir $@) is created for NetWare platform!$(DL) >> $@ | ||||
| 	@echo $(DL)#endif$(DL) >> $@ | ||||
| 	@echo $(DL)#define OS "i586-pc-NetWare"$(DL) >> $@ | ||||
| 	@echo $(DL)#define VERSION "$(LIBCARES_VERSION_STR)"$(DL) >> $@ | ||||
| 	@echo $(DL)#define PACKAGE_BUGREPORT "a suitable curl mailing list => http://curl.haxx.se/mail/"$(DL) >> $@ | ||||
| @@ -276,9 +282,13 @@ config.h: Makefile.netware | ||||
| 	@echo $(DL)#define HAVE_LONGLONG 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_NETINET_IN_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_RECV 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_SELECT 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_SEND 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_SETJMP_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_SIGNAL 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_SIGNAL_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_SIG_ATOMIC_T 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_SOCKET 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STDLIB_H 1$(DL) >> $@ | ||||
| @@ -297,15 +307,27 @@ config.h: Makefile.netware | ||||
| 	@echo $(DL)#define HAVE_TIME_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_UNAME 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_UNISTD_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define RECV_TYPE_ARG1 int$(DL) >> $@ | ||||
| 	@echo $(DL)#define RECV_TYPE_ARG2 char *$(DL) >> $@ | ||||
| 	@echo $(DL)#define RECV_TYPE_ARG3 int$(DL) >> $@ | ||||
| 	@echo $(DL)#define RECV_TYPE_ARG4 int$(DL) >> $@ | ||||
| 	@echo $(DL)#define RECV_TYPE_RETV int$(DL) >> $@ | ||||
| 	@echo $(DL)#define RETSIGTYPE void$(DL) >> $@ | ||||
| 	@echo $(DL)#define SEND_QUAL_ARG2$(DL) >> $@ | ||||
| 	@echo $(DL)#define SEND_TYPE_ARG1 int$(DL) >> $@ | ||||
| 	@echo $(DL)#define SEND_TYPE_ARG2 char *$(DL) >> $@ | ||||
| 	@echo $(DL)#define SEND_TYPE_ARG3 int$(DL) >> $@ | ||||
| 	@echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@ | ||||
| 	@echo $(DL)#define SEND_TYPE_RETV int$(DL) >> $@ | ||||
| 	@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@ | ||||
| 	@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_TIMEVAL 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@ | ||||
| 	@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@ | ||||
| ifdef NW_WINSOCK | ||||
| @@ -316,6 +338,11 @@ else | ||||
| 	@echo $(DL)#define HAVE_SYS_SOCKIO_H 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@ | ||||
| endif | ||||
| 	@echo $(DL)#ifdef __GNUC__$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_VARIADIC_MACROS_GCC 1$(DL) >> $@ | ||||
| 	@echo $(DL)#else$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_VARIADIC_MACROS_C99 1$(DL) >> $@ | ||||
| 	@echo $(DL)#endif$(DL) >> $@ | ||||
| ifdef OLD_NOVELLSDK | ||||
| 	@echo $(DL)#define socklen_t int$(DL) >> $@ | ||||
| endif | ||||
|   | ||||
| @@ -67,6 +67,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj              \ | ||||
|           $(OBJ_DIR)\ares_expand_name.obj      \ | ||||
|           $(OBJ_DIR)\ares_parse_a_reply.obj    \ | ||||
|           $(OBJ_DIR)\ares_parse_aaaa_reply.obj \ | ||||
|           $(OBJ_DIR)\ares_parse_ns_reply.obj   \ | ||||
|           $(OBJ_DIR)\windows_port.obj          \ | ||||
|           $(OBJ_DIR)\ares_expand_string.obj    \ | ||||
|           $(OBJ_DIR)\ares_parse_ptr_reply.obj  \ | ||||
| @@ -75,6 +76,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj              \ | ||||
|           $(OBJ_DIR)\inet_ntop.obj | ||||
|  | ||||
| all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe | ||||
|        @echo Welcome to c-ares library and examples | ||||
|  | ||||
| $(OBJ_DIR): | ||||
|        mkdir $(OBJ_DIR) | ||||
| @@ -105,6 +107,7 @@ $(DEF_FILE): $(OBJECTS) Makefile.VC6 | ||||
|        @echo   ares_mkquery           >> $@ | ||||
|        @echo   ares_parse_a_reply     >> $@ | ||||
|        @echo   ares_parse_ptr_reply   >> $@ | ||||
|        @echo   ares_parse_ns_reply    >> $@ | ||||
|        @echo   ares_process           >> $@ | ||||
|        @echo   ares_query             >> $@ | ||||
|        @echo   ares_search            >> $@ | ||||
| @@ -121,8 +124,8 @@ $(DEF_FILE): $(OBJECTS) Makefile.VC6 | ||||
|        @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) | ||||
| ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj $(OBJ_DIR)\getopt.obj cares_imp.lib | ||||
|        link $(LDFLAGS) -out:$@ $(OBJ_DIR)\ahost.obj $(OBJ_DIR)\getopt.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) | ||||
| @@ -140,51 +143,89 @@ vclean realclean: clean | ||||
| # | ||||
| # 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 \ | ||||
| $(OBJ_DIR)\ares_fds.obj: ares_fds.c setup.h setup_once.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 \ | ||||
|  | ||||
| $(OBJ_DIR)\ares_process.obj: ares_process.c setup.h setup_once.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 setup_once.h     \ | ||||
|   ares.h ares_private.h ares_ipv6.h | ||||
|  | ||||
| $(OBJ_DIR)\ares_query.obj: ares_query.c setup.h setup_once.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 setup_once.h \ | ||||
|   ares.h ares_private.h ares_ipv6.h | ||||
|  | ||||
| $(OBJ_DIR)\ares_free_string.obj: ares_free_string.c setup.h setup_once.h ares.h | ||||
|  | ||||
| $(OBJ_DIR)\ares_search.obj: ares_search.c setup.h setup_once.h nameser.h       \ | ||||
|   ares.h ares_private.h ares_ipv6.h | ||||
|  | ||||
| $(OBJ_DIR)\ares__get_hostent.obj: ares__get_hostent.c setup.h setup_once.h     \ | ||||
|   ares.h ares_private.h ares_ipv6.h inet_net_pton.h | ||||
|  | ||||
| $(OBJ_DIR)\ares_gethostbyaddr.obj: ares_gethostbyaddr.c setup.h setup_once.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 setup_once.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 setup_once.h ares.h  \ | ||||
|   ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares__close_sockets.obj: ares__close_sockets.c setup.h ares.h \ | ||||
|  | ||||
| $(OBJ_DIR)\ares_gethostbyname.obj: ares_gethostbyname.c setup.h setup_once.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 setup_once.h ares.h | ||||
|  | ||||
| $(OBJ_DIR)\ares_cancel.obj: ares_cancel.c setup.h setup_once.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 \ | ||||
|  | ||||
| $(OBJ_DIR)\ares_init.obj: ares_init.c setup.h setup_once.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 \ | ||||
|  | ||||
| $(OBJ_DIR)\ares_timeout.obj: ares_timeout.c setup.h setup_once.h ares.h        \ | ||||
|   ares_private.h ares_ipv6.h | ||||
| $(OBJ_DIR)\ares__read_line.obj: ares__read_line.c setup.h ares.h ares_private.h \ | ||||
|  | ||||
| $(OBJ_DIR)\ares_destroy.obj: ares_destroy.c setup.h setup_once.h ares.h        \ | ||||
|   ares_private.h ares_ipv6.h | ||||
|  | ||||
| $(OBJ_DIR)\ares_mkquery.obj: ares_mkquery.c setup.h setup_once.h nameser.h     \ | ||||
|   ares.h ares_dns.h | ||||
|  | ||||
| $(OBJ_DIR)\ares_version.obj: ares_version.c setup.h setup_once.h ares_version.h | ||||
|  | ||||
| $(OBJ_DIR)\ares_expand_name.obj: ares_expand_name.c setup.h setup_once.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 setup_once.h   \ | ||||
|   nameser.h ares.h ares_dns.h ares_private.h ares_ipv6.h | ||||
|  | ||||
| $(OBJ_DIR)\windows_port.obj: windows_port.c setup.h setup_once.h nameser.h     \ | ||||
|   ares.h ares_private.h ares_ipv6.h | ||||
|  | ||||
| $(OBJ_DIR)\ares_expand_string.obj: ares_expand_string.c setup.h setup_once.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            \ | ||||
|   setup_once.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          \ | ||||
|   setup_once.h nameser.h ares.h ares_dns.h inet_net_pton.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 \ | ||||
|  | ||||
| $(OBJ_DIR)\ares_parse_ns_reply.obj: ares_parse_ns_reply.c setup.h            \ | ||||
|   setup_once.h nameser.h ares.h ares_dns.h ares_private.h ares_ipv6.h | ||||
|  | ||||
| $(OBJ_DIR)\ares_getnameinfo.obj: ares_getnameinfo.c setup.h setup_once.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 setup_once.h nameser.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 | ||||
|  | ||||
| $(OBJ_DIR)\inet_ntop.obj: inet_ntop.c setup.h setup_once.h nameser.h           \ | ||||
|   ares_ipv6.h inet_ntop.h | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										65
									
								
								ares/adig.c
									
									
									
									
									
								
							
							
						
						
									
										65
									
								
								ares/adig.c
									
									
									
									
									
								
							| @@ -1,4 +1,6 @@ | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * $Id$ | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
|  * software and its documentation for any purpose and without | ||||
| @@ -14,17 +16,20 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #ifdef HAVE_SYS_TIME_H | ||||
| #include <sys/time.h> | ||||
| #endif | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_UNISTD_H | ||||
| #include <unistd.h> | ||||
| #endif | ||||
| #include <netdb.h> | ||||
| #endif | ||||
| #ifdef HAVE_GETOPT_H | ||||
| @@ -45,10 +50,6 @@ | ||||
| #undef WIN32  /* Redefined in MingW headers */ | ||||
| #endif | ||||
|  | ||||
| #ifndef INADDR_NONE | ||||
| #define INADDR_NONE 0xffffffff | ||||
| #endif | ||||
|  | ||||
| /* Mac OS X portability check */ | ||||
| #ifndef T_SRV | ||||
| #define T_SRV 33 /* server selection */ | ||||
| @@ -153,8 +154,8 @@ int main(int argc, char **argv) | ||||
|   fd_set read_fds, write_fds; | ||||
|   struct timeval *tvp, tv; | ||||
|  | ||||
| #ifdef WIN32 | ||||
|   WORD wVersionRequested = MAKEWORD(1,1); | ||||
| #ifdef USE_WINSOCK | ||||
|   WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); | ||||
|   WSADATA wsaData; | ||||
|   WSAStartup(wVersionRequested, &wsaData); | ||||
| #endif | ||||
| @@ -162,10 +163,16 @@ int main(int argc, char **argv) | ||||
|   options.flags = ARES_FLAG_NOCHECKRESP; | ||||
|   options.servers = NULL; | ||||
|   options.nservers = 0; | ||||
|   while ((c = getopt(argc, argv, "f:s:c:t:T:U:")) != -1) | ||||
|   while ((c = getopt(argc, argv, "df:s:c:t:T:U:")) != -1) | ||||
|     { | ||||
|       switch (c) | ||||
|         { | ||||
|         case 'd': | ||||
| #ifdef WATT32 | ||||
|           dbug_init(); | ||||
| #endif | ||||
|           break; | ||||
|  | ||||
|         case 'f': | ||||
|           /* Add a flag. */ | ||||
|           for (i = 0; i < nflags; i++) | ||||
| @@ -225,7 +232,7 @@ int main(int argc, char **argv) | ||||
|  | ||||
|         case 'T': | ||||
|           /* Set the TCP port number. */ | ||||
|           if (!isdigit((unsigned char)*optarg)) | ||||
|           if (!ISDIGIT(*optarg)) | ||||
|             usage(); | ||||
|           options.tcp_port = (unsigned short)strtol(optarg, NULL, 0); | ||||
|           optmask |= ARES_OPT_TCP_PORT; | ||||
| @@ -233,7 +240,7 @@ int main(int argc, char **argv) | ||||
|  | ||||
|         case 'U': | ||||
|           /* Set the UDP port number. */ | ||||
|           if (!isdigit((unsigned char)*optarg)) | ||||
|           if (!ISDIGIT(*optarg)) | ||||
|             usage(); | ||||
|           options.udp_port = (unsigned short)strtol(optarg, NULL, 0); | ||||
|           optmask |= ARES_OPT_UDP_PORT; | ||||
| @@ -277,7 +284,7 @@ int main(int argc, char **argv) | ||||
|         break; | ||||
|       tvp = ares_timeout(channel, NULL, &tv); | ||||
|       count = select(nfds, &read_fds, &write_fds, NULL, tvp); | ||||
|       if (count < 0 && errno != EINVAL) | ||||
|       if (count < 0 && SOCKERRNO != EINVAL) | ||||
|         { | ||||
|           perror("select"); | ||||
|           return 1; | ||||
| @@ -286,6 +293,11 @@ int main(int argc, char **argv) | ||||
|     } | ||||
|  | ||||
|   ares_destroy(channel); | ||||
|  | ||||
| #ifdef USE_WINSOCK | ||||
|   WSACleanup(); | ||||
| #endif | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| @@ -396,7 +408,7 @@ static const unsigned char *display_question(const unsigned char *aptr, | ||||
|    */ | ||||
|   if (aptr + QFIXEDSZ > abuf + alen) | ||||
|     { | ||||
|       free(name); | ||||
|       ares_free_string(name); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
| @@ -412,7 +424,7 @@ static const unsigned char *display_question(const unsigned char *aptr, | ||||
|   if (dnsclass != C_IN) | ||||
|     printf("\t%s", class_name(dnsclass)); | ||||
|   printf("\t%s\n", type_name(type)); | ||||
|   free(name); | ||||
|   ares_free_string(name); | ||||
|   return aptr; | ||||
| } | ||||
|  | ||||
| @@ -436,7 +448,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|    */ | ||||
|   if (aptr + RRFIXEDSZ > abuf + alen) | ||||
|     { | ||||
|       free(name); | ||||
|       ares_free_string(name); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
| @@ -449,7 +461,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|   aptr += RRFIXEDSZ; | ||||
|   if (aptr + dlen > abuf + alen) | ||||
|     { | ||||
|       free(name); | ||||
|       ares_free_string(name); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
| @@ -458,7 +470,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|   if (dnsclass != C_IN) | ||||
|     printf("\t%s", class_name(dnsclass)); | ||||
|   printf("\t%s", type_name(type)); | ||||
|   free(name); | ||||
|   ares_free_string(name); | ||||
|  | ||||
|   /* Display the RR data.  Don't touch aptr. */ | ||||
|   switch (type) | ||||
| @@ -476,7 +488,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|       if (status != ARES_SUCCESS) | ||||
|         return NULL; | ||||
|       printf("\t%s.", name); | ||||
|       free(name); | ||||
|       ares_free_string(name); | ||||
|       break; | ||||
|  | ||||
|     case T_HINFO: | ||||
| @@ -500,13 +512,13 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|       if (status != ARES_SUCCESS) | ||||
|         return NULL; | ||||
|       printf("\t%s.", name); | ||||
|       free(name); | ||||
|       ares_free_string(name); | ||||
|       p += len; | ||||
|       status = ares_expand_name(p, abuf, alen, &name, &len); | ||||
|       if (status != ARES_SUCCESS) | ||||
|         return NULL; | ||||
|       printf("\t%s.", name); | ||||
|       free(name); | ||||
|       ares_free_string(name); | ||||
|       break; | ||||
|  | ||||
|     case T_MX: | ||||
| @@ -520,7 +532,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|       if (status != ARES_SUCCESS) | ||||
|         return NULL; | ||||
|       printf("\t%s.", name); | ||||
|       free(name); | ||||
|       ares_free_string(name); | ||||
|       break; | ||||
|  | ||||
|     case T_SOA: | ||||
| @@ -532,19 +544,20 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|       if (status != ARES_SUCCESS) | ||||
|         return NULL; | ||||
|       printf("\t%s.\n", name); | ||||
|       free(name); | ||||
|       ares_free_string(name); | ||||
|       p += len; | ||||
|       status = ares_expand_name(p, abuf, alen, &name, &len); | ||||
|       if (status != ARES_SUCCESS) | ||||
|         return NULL; | ||||
|       printf("\t\t\t\t\t\t%s.\n", name); | ||||
|       free(name); | ||||
|       ares_free_string(name); | ||||
|       p += len; | ||||
|       if (p + 20 > aptr + dlen) | ||||
|         return NULL; | ||||
|       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)); | ||||
|              (unsigned long)DNS__32BIT(p), (unsigned long)DNS__32BIT(p+4), | ||||
|              (unsigned long)DNS__32BIT(p+8), (unsigned long)DNS__32BIT(p+12), | ||||
|              (unsigned long)DNS__32BIT(p+16)); | ||||
|       break; | ||||
|  | ||||
|     case T_TXT: | ||||
| @@ -592,7 +605,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | ||||
|       if (status != ARES_SUCCESS) | ||||
|         return NULL; | ||||
|       printf("\t%s.", name); | ||||
|       free(name); | ||||
|       ares_free_string(name); | ||||
|       break; | ||||
|  | ||||
|     default: | ||||
|   | ||||
							
								
								
									
										65
									
								
								ares/ahost.c
									
									
									
									
									
								
							
							
						
						
									
										65
									
								
								ares/ahost.c
									
									
									
									
									
								
							| @@ -1,4 +1,6 @@ | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * $Id$ | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
|  * software and its documentation for any purpose and without | ||||
| @@ -14,29 +16,36 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #else | ||||
| #if !defined(WIN32) || defined(WATT32) | ||||
| #ifdef HAVE_SYS_TIME_H | ||||
| #include <sys/time.h> | ||||
| #endif | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #ifdef HAVE_UNISTD_H | ||||
| #include <unistd.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #ifdef HAVE_GETOPT_H | ||||
| #include <getopt.h> | ||||
| #endif | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
| #include "inet_ntop.h" | ||||
| #include "inet_net_pton.h" | ||||
|  | ||||
| #ifndef INADDR_NONE | ||||
| #define INADDR_NONE 0xffffffff | ||||
| #ifndef optind | ||||
| extern int   optind; | ||||
| extern char *optarg; | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_STRUCT_IN6_ADDR | ||||
| @@ -52,19 +61,45 @@ static void usage(void); | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|   ares_channel channel; | ||||
|   int status, nfds; | ||||
|   int status, nfds, c, addr_family = AF_INET; | ||||
|   fd_set read_fds, write_fds; | ||||
|   struct timeval *tvp, tv; | ||||
|   struct in_addr addr4; | ||||
|   struct in6_addr addr6; | ||||
|  | ||||
| #ifdef WIN32 | ||||
|   WORD wVersionRequested = MAKEWORD(1,1); | ||||
| #ifdef USE_WINSOCK | ||||
|   WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); | ||||
|   WSADATA wsaData; | ||||
|   WSAStartup(wVersionRequested, &wsaData); | ||||
| #endif | ||||
|  | ||||
|   if (argc <= 1) | ||||
|   while ((c = getopt(argc,argv,"dt:h")) != -1) | ||||
|     { | ||||
|       switch (c) | ||||
|         { | ||||
|         case 'd': | ||||
| #ifdef WATT32 | ||||
|           dbug_init(); | ||||
| #endif | ||||
|           break; | ||||
|         case 't': | ||||
|           if (!strcasecmp(optarg,"a")) | ||||
|             addr_family = AF_INET; | ||||
|           else if (!strcasecmp(optarg,"aaaa")) | ||||
|             addr_family = AF_INET6; | ||||
|           else | ||||
|             usage(); | ||||
|           break; | ||||
|         case 'h': | ||||
|         default: | ||||
|           usage(); | ||||
|           break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   argc -= optind; | ||||
|   argv += optind; | ||||
|   if (argc < 1) | ||||
|     usage(); | ||||
|  | ||||
|   status = ares_init(&channel); | ||||
| @@ -75,7 +110,7 @@ int main(int argc, char **argv) | ||||
|     } | ||||
|  | ||||
|   /* Initiate the queries, one per command-line argument. */ | ||||
|   for (argv++; *argv; argv++) | ||||
|   for ( ; *argv; argv++) | ||||
|     { | ||||
|       if (ares_inet_pton(AF_INET, *argv, &addr4) == 1) | ||||
|         { | ||||
| @@ -89,8 +124,7 @@ int main(int argc, char **argv) | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           /* assume user wants A-records */ | ||||
|           ares_gethostbyname(channel, *argv, AF_INET, callback, *argv); | ||||
|           ares_gethostbyname(channel, *argv, addr_family, callback, *argv); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -108,6 +142,11 @@ int main(int argc, char **argv) | ||||
|     } | ||||
|  | ||||
|   ares_destroy(channel); | ||||
|  | ||||
| #ifdef USE_WINSOCK | ||||
|   WSACleanup(); | ||||
| #endif | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| @@ -143,6 +182,6 @@ static void callback(void *arg, int status, struct hostent *host) | ||||
|  | ||||
| static void usage(void) | ||||
| { | ||||
|   fprintf(stderr, "usage: ahost {host|addr} ...\n"); | ||||
|   fprintf(stderr, "usage: ahost [-t {a|aaaa}] {host|addr} ...\n"); | ||||
|   exit(1); | ||||
| } | ||||
|   | ||||
| @@ -213,6 +213,8 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, | ||||
|                        struct hostent **host); | ||||
| int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, | ||||
|                          int addrlen, int family, struct hostent **host); | ||||
| int ares_parse_ns_reply(const unsigned char *abuf, int alen, | ||||
|                        struct hostent **host); | ||||
| void ares_free_string(void *str); | ||||
| void ares_free_hostent(struct hostent *host); | ||||
| const char *ares_strerror(int code); | ||||
|   | ||||
| @@ -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 | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if !defined(WIN32) || defined(WATT32) | ||||
| #include <sys/socket.h> | ||||
| @@ -52,7 +53,7 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host) | ||||
|  | ||||
|       /* Get the address part. */ | ||||
|       p = line; | ||||
|       while (*p && !isspace((unsigned char)*p)) | ||||
|       while (*p && !ISSPACE(*p)) | ||||
|         p++; | ||||
|       if (!*p) | ||||
|         continue; | ||||
| @@ -74,12 +75,12 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host) | ||||
|  | ||||
|       /* Get the canonical hostname. */ | ||||
|       p++; | ||||
|       while (isspace((unsigned char)*p)) | ||||
|       while (ISSPACE(*p)) | ||||
|         p++; | ||||
|       if (!*p) | ||||
|         continue; | ||||
|       q = p; | ||||
|       while (*q && !isspace((unsigned char)*q)) | ||||
|       while (*q && !ISSPACE(*q)) | ||||
|         q++; | ||||
|       end_at_hostname = (*q == 0); | ||||
|       *q = 0; | ||||
| @@ -90,13 +91,13 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host) | ||||
|         { | ||||
|           /* Count the aliases. */ | ||||
|           p = q + 1; | ||||
|           while (isspace((unsigned char)*p)) | ||||
|           while (ISSPACE(*p)) | ||||
|             p++; | ||||
|           while (*p) | ||||
|             { | ||||
|               while (*p && !isspace((unsigned char)*p)) | ||||
|               while (*p && !ISSPACE(*p)) | ||||
|                 p++; | ||||
|               while (isspace((unsigned char)*p)) | ||||
|               while (ISSPACE(*p)) | ||||
|                 p++; | ||||
|               naliases++; | ||||
|             } | ||||
| @@ -126,12 +127,12 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host) | ||||
|       if (!end_at_hostname) | ||||
|         { | ||||
|           p = canonical + strlen(canonical) + 1; | ||||
|           while (isspace((unsigned char)*p)) | ||||
|           while (ISSPACE(*p)) | ||||
|             p++; | ||||
|           while (*p) | ||||
|             { | ||||
|               q = p; | ||||
|               while (*q && !isspace((unsigned char)*q)) | ||||
|               while (*q && !ISSPACE(*q)) | ||||
|                 q++; | ||||
|               hostent->h_aliases[naliases] = malloc(q - p + 1); | ||||
|               if (hostent->h_aliases[naliases] == NULL) | ||||
| @@ -139,7 +140,7 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host) | ||||
|               memcpy(hostent->h_aliases[naliases], p, q - p); | ||||
|               hostent->h_aliases[naliases][q - p] = 0; | ||||
|               p = q; | ||||
|               while (isspace((unsigned char)*p)) | ||||
|               while (ISSPACE(*p)) | ||||
|                 p++; | ||||
|               naliases++; | ||||
|             } | ||||
|   | ||||
| @@ -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 (C) 2004 by Daniel Stenberg et al | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software and its | ||||
| @@ -36,8 +38,11 @@ void ares_cancel(ares_channel channel) | ||||
|   } | ||||
|   channel->queries = NULL; | ||||
|   if (!(channel->flags & ARES_FLAG_STAYOPEN)) | ||||
|   { | ||||
|     if (channel->servers) | ||||
|     { | ||||
|       for (i = 0; i < channel->nservers; i++) | ||||
|         ares__close_sockets(channel, &channel->servers[i]); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -23,23 +25,37 @@ void ares_destroy(ares_channel channel) | ||||
|   int i; | ||||
|   struct query *query; | ||||
|  | ||||
|   if (!channel) | ||||
|     return; | ||||
|  | ||||
|   if (channel->servers) { | ||||
|     for (i = 0; i < channel->nservers; i++) | ||||
|       ares__close_sockets(channel, &channel->servers[i]); | ||||
|     free(channel->servers); | ||||
|   } | ||||
|  | ||||
|   if (channel->domains) { | ||||
|     for (i = 0; i < channel->ndomains; i++) | ||||
|       free(channel->domains[i]); | ||||
|     free(channel->domains); | ||||
|   } | ||||
|  | ||||
|   if(channel->sortlist) | ||||
|     free(channel->sortlist); | ||||
|  | ||||
|   if (channel->lookups) | ||||
|     free(channel->lookups); | ||||
|   while (channel->queries) | ||||
|     { | ||||
|  | ||||
|   while (channel->queries) { | ||||
|     query = channel->queries; | ||||
|     channel->queries = query->next; | ||||
|     query->callback(query->arg, ARES_EDESTRUCTION, NULL, 0); | ||||
|     if (query->tcpbuf) | ||||
|       free(query->tcpbuf); | ||||
|     if (query->skip_server) | ||||
|       free(query->skip_server); | ||||
|     free(query); | ||||
|   } | ||||
|  | ||||
|   free(channel); | ||||
| } | ||||
|   | ||||
| @@ -18,28 +18,16 @@ | ||||
| #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]) | ||||
| #define DNS__SET16BIT(p, v)             (((p)[0] = ((v) >> 8) & 0xff), \ | ||||
|                                          ((p)[1] = (v) & 0xff)) | ||||
| #define DNS__SET32BIT(p, v)             (((p)[0] = ((v) >> 24) & 0xff), \ | ||||
|                                          ((p)[1] = ((v) >> 16) & 0xff), \ | ||||
|                                          ((p)[2] = ((v) >> 8) & 0xff), \ | ||||
|                                          ((p)[3] = (v) & 0xff)) | ||||
| #endif | ||||
|  | ||||
| #define DNS__SET16BIT(p, v)  (((p)[0] = (unsigned char)(((v) >> 8) & 0xff)), \ | ||||
|                               ((p)[1] = (unsigned char)((v) & 0xff))) | ||||
| #define DNS__SET32BIT(p, v)  (((p)[0] = (unsigned char)(((v) >> 24) & 0xff)), \ | ||||
|                               ((p)[1] = (unsigned char)(((v) >> 16) & 0xff)), \ | ||||
|                               ((p)[2] = (unsigned char)(((v) >> 8) & 0xff)), \ | ||||
|                               ((p)[3] = (unsigned char)((v) & 0xff))) | ||||
|  | ||||
| #if 0 | ||||
| /* we cannot use this approach on systems where we can't access 16/32 bit | ||||
| @@ -67,14 +55,14 @@ | ||||
|  | ||||
| /* Macros for constructing a DNS header */ | ||||
| #define DNS_HEADER_SET_QID(h, v)      DNS__SET16BIT(h, v) | ||||
| #define DNS_HEADER_SET_QR(h, v)         ((h)[2] |= (((v) & 0x1) << 7)) | ||||
| #define DNS_HEADER_SET_OPCODE(h, v)     ((h)[2] |= (((v) & 0xf) << 3)) | ||||
| #define DNS_HEADER_SET_AA(h, v)         ((h)[2] |= (((v) & 0x1) << 2)) | ||||
| #define DNS_HEADER_SET_TC(h, v)         ((h)[2] |= (((v) & 0x1) << 1)) | ||||
| #define DNS_HEADER_SET_RD(h, v)         ((h)[2] |= (((v) & 0x1))) | ||||
| #define DNS_HEADER_SET_RA(h, v)         ((h)[3] |= (((v) & 0x1) << 7)) | ||||
| #define DNS_HEADER_SET_Z(h, v)          ((h)[3] |= (((v) & 0x7) << 4)) | ||||
| #define DNS_HEADER_SET_RCODE(h, v)      ((h)[3] |= (((v) & 0xf))) | ||||
| #define DNS_HEADER_SET_QR(h, v)       ((h)[2] |= (unsigned char)(((v) & 0x1) << 7)) | ||||
| #define DNS_HEADER_SET_OPCODE(h, v)   ((h)[2] |= (unsigned char)(((v) & 0xf) << 3)) | ||||
| #define DNS_HEADER_SET_AA(h, v)       ((h)[2] |= (unsigned char)(((v) & 0x1) << 2)) | ||||
| #define DNS_HEADER_SET_TC(h, v)       ((h)[2] |= (unsigned char)(((v) & 0x1) << 1)) | ||||
| #define DNS_HEADER_SET_RD(h, v)       ((h)[2] |= (unsigned char)((v) & 0x1)) | ||||
| #define DNS_HEADER_SET_RA(h, v)       ((h)[3] |= (unsigned char)(((v) & 0x1) << 7)) | ||||
| #define DNS_HEADER_SET_Z(h, v)        ((h)[3] |= (unsigned char)(((v) & 0x7) << 4)) | ||||
| #define DNS_HEADER_SET_RCODE(h, v)    ((h)[3] |= (unsigned char)((v) & 0xf)) | ||||
| #define DNS_HEADER_SET_QDCOUNT(h, v)  DNS__SET16BIT((h) + 4, v) | ||||
| #define DNS_HEADER_SET_ANCOUNT(h, v)  DNS__SET16BIT((h) + 6, v) | ||||
| #define DNS_HEADER_SET_NSCOUNT(h, v)  DNS__SET16BIT((h) + 8, v) | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
|   | ||||
| @@ -16,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #ifdef HAVE_SYS_TIME_H | ||||
| #include <sys/time.h> | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -27,7 +29,7 @@ void ares_free_hostent(struct hostent *host) | ||||
| { | ||||
|   char **p; | ||||
|  | ||||
|   free(host->h_name); | ||||
|   free((char *)(host->h_name)); | ||||
|   for (p = host->h_aliases; *p; p++) | ||||
|     free(*p); | ||||
|   free(host->h_aliases); | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 2000 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -16,6 +18,7 @@ | ||||
| #include "setup.h" | ||||
| #include <stdlib.h> | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| void ares_free_string(void *str) | ||||
| { | ||||
|   | ||||
| @@ -15,7 +15,6 @@ | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| @@ -186,6 +185,7 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host) | ||||
| { | ||||
|   FILE *fp; | ||||
|   int status; | ||||
|   int error; | ||||
|  | ||||
| #ifdef WIN32 | ||||
|   char PATH_HOSTS[MAX_PATH]; | ||||
| @@ -218,7 +218,22 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host) | ||||
|  | ||||
|   fp = fopen(PATH_HOSTS, "r"); | ||||
|   if (!fp) | ||||
|     { | ||||
|       error = ERRNO; | ||||
|       switch(error) | ||||
|         { | ||||
|         case ENOENT: | ||||
|         case ESRCH: | ||||
|           return ARES_ENOTFOUND; | ||||
|         default: | ||||
|           DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", | ||||
|                          error, strerror(error))); | ||||
|           DEBUGF(fprintf(stderr, "Error opening file: %s\n", | ||||
|                          PATH_HOSTS)); | ||||
|           *host = NULL; | ||||
|           return ARES_EFILE; | ||||
|         } | ||||
|     } | ||||
|   while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS) | ||||
|     { | ||||
|       if (family != (*host)->h_addrtype) | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| @@ -170,7 +171,7 @@ static void host_callback(void *arg, int status, unsigned char *abuf, int alen) | ||||
|     } | ||||
|   else if (status == ARES_ENODATA && hquery->family == AF_INET6) | ||||
|     { | ||||
|       /* There was no AAAA now lookup an A */ | ||||
|       /* There was no AAAA. Now lookup an A */ | ||||
|       hquery->family = AF_INET; | ||||
|       ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, | ||||
|                   hquery); | ||||
| @@ -237,7 +238,7 @@ static int fake_hostent(const char *name, int family, ares_host_callback callbac | ||||
|   hostent.h_addr_list = addrs; | ||||
|   callback(arg, ARES_SUCCESS, &hostent); | ||||
|  | ||||
|   free(hostent.h_name); | ||||
|   free((char *)(hostent.h_name)); | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| @@ -246,6 +247,7 @@ static int file_lookup(const char *name, int family, struct hostent **host) | ||||
|   FILE *fp; | ||||
|   char **alias; | ||||
|   int status; | ||||
|   int error; | ||||
|  | ||||
| #ifdef WIN32 | ||||
|   char PATH_HOSTS[MAX_PATH]; | ||||
| @@ -278,8 +280,22 @@ static int file_lookup(const char *name, int family, struct hostent **host) | ||||
|  | ||||
|   fp = fopen(PATH_HOSTS, "r"); | ||||
|   if (!fp) | ||||
|     { | ||||
|       error = ERRNO; | ||||
|       switch(error) | ||||
|         { | ||||
|         case ENOENT: | ||||
|         case ESRCH: | ||||
|           return ARES_ENOTFOUND; | ||||
|  | ||||
|         default: | ||||
|           DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", | ||||
|                          error, strerror(error))); | ||||
|           DEBUGF(fprintf(stderr, "Error opening file: %s\n", | ||||
|                          PATH_HOSTS)); | ||||
|           *host = NULL; | ||||
|           return ARES_EFILE; | ||||
|         } | ||||
|     } | ||||
|   while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS) | ||||
|     { | ||||
|       if (strcasecmp((*host)->h_name, name) == 0) | ||||
|   | ||||
| @@ -15,8 +15,6 @@ | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
| #include <ctype.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| @@ -110,7 +108,8 @@ 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, sizeof(buf)); | ||||
|       service = lookup_service((unsigned short)(port & 0xffff), | ||||
|                                flags, buf, sizeof(buf)); | ||||
|       callback(arg, ARES_SUCCESS, NULL, service); | ||||
|       return; | ||||
|     } | ||||
| @@ -151,7 +150,8 @@ 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, sizeof(srvbuf)); | ||||
|           service = lookup_service((unsigned short)(port & 0xffff), | ||||
|                                    flags, srvbuf, sizeof(srvbuf)); | ||||
|         callback(arg, ARES_SUCCESS, ipbuf, service); | ||||
|         return; | ||||
|       } | ||||
| @@ -220,7 +220,8 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host) | ||||
|                  *end = 0; | ||||
|              } | ||||
|         } | ||||
|       niquery->callback(niquery->arg, ARES_SUCCESS, host->h_name, service); | ||||
|       niquery->callback(niquery->arg, ARES_SUCCESS, (char *)(host->h_name), | ||||
|                         service); | ||||
|       return; | ||||
|     } | ||||
|   /* We couldn't find the host, but it's OK, we can use the IP */ | ||||
| @@ -302,7 +303,7 @@ static char *lookup_service(unsigned short port, int flags, | ||||
|         strcpy(tmpbuf, sep->s_name); | ||||
|       else | ||||
|         /* get port as a string */ | ||||
|         sprintf(tmpbuf, "%u", ntohs(port)); | ||||
|         sprintf(tmpbuf, "%u", (unsigned int)ntohs(port)); | ||||
|       if (strlen(tmpbuf) < buflen) | ||||
|         /* return it if buffer big enough */ | ||||
|         strcpy(buf, tmpbuf); | ||||
| @@ -319,6 +320,9 @@ static char *lookup_service(unsigned short port, int flags, | ||||
| static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, | ||||
|                            char *buf, size_t buflen) | ||||
| { | ||||
| #ifdef HAVE_IF_INDEXTONAME | ||||
|   int is_ll, is_mcll; | ||||
| #endif | ||||
|   char fmt_u[] = "%u"; | ||||
|   char fmt_lu[] = "%lu"; | ||||
|   char tmpbuf[IF_NAMESIZE + 2]; | ||||
| @@ -328,9 +332,10 @@ static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, | ||||
|   tmpbuf[0] = '%'; | ||||
|  | ||||
| #ifdef HAVE_IF_INDEXTONAME | ||||
|   is_ll = IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr); | ||||
|   is_mcll = IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr); | ||||
|   if ((flags & ARES_NI_NUMERICSCOPE) || | ||||
|       (!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr) | ||||
|        && !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr))) | ||||
|       (!is_ll && !is_mcll)) | ||||
|     { | ||||
|        sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id); | ||||
|     } | ||||
| @@ -356,6 +361,7 @@ static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, | ||||
| static char *ares_striendstr(const char *s1, const char *s2) | ||||
| { | ||||
|   const char *c1, *c2, *c1_begin; | ||||
|   int lo1, lo2; | ||||
|   size_t s1_len = strlen(s1), s2_len = strlen(s2); | ||||
|  | ||||
|   /* If the substr is longer than the full str, it can't match */ | ||||
| @@ -368,7 +374,9 @@ static char *ares_striendstr(const char *s1, const char *s2) | ||||
|   c2 = s2; | ||||
|   while (c2 < s2+s2_len) | ||||
|     { | ||||
|       if (tolower(*c1) != tolower(*c2)) | ||||
|       lo1 = tolower(*c1); | ||||
|       lo2 = tolower(*c2); | ||||
|       if (lo1 != lo2) | ||||
|         return NULL; | ||||
|       else | ||||
|         { | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 2005 by Daniel Stenberg. | ||||
| /* Copyright (C) 2005 - 2007, Daniel Stenberg | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software and its | ||||
|  * documentation for any purpose and without fee is hereby granted, provided | ||||
| @@ -14,7 +14,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #ifdef HAVE_SYS_TIME_H | ||||
| #include <sys/time.h> | ||||
| @@ -28,7 +27,6 @@ int ares_getsock(ares_channel channel, | ||||
|                  int numsocks) /* size of the 'socks' array */ | ||||
| { | ||||
|   struct server_state *server; | ||||
|   ares_socket_t nfds; | ||||
|   int i; | ||||
|   int sockindex=0; | ||||
|   int bitmap = 0; | ||||
| @@ -40,8 +38,9 @@ int ares_getsock(ares_channel channel, | ||||
|   if (!channel->queries) | ||||
|     return 0; | ||||
|  | ||||
|   nfds = 0; | ||||
|   for (i = 0; i < channel->nservers; i++) | ||||
|   for (i = 0; | ||||
|        (i < channel->nservers) && (sockindex < ARES_GETSOCK_MAXNUM); | ||||
|        i++) | ||||
|     { | ||||
|       server = &channel->servers[i]; | ||||
|       if (server->udp_socket != ARES_SOCKET_BAD) | ||||
| @@ -58,14 +57,13 @@ int ares_getsock(ares_channel channel, | ||||
|            break; | ||||
|          socks[sockindex] = server->tcp_socket; | ||||
|          bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); | ||||
|          sockindex++; | ||||
|  | ||||
|          if (server->qhead) { | ||||
|          if (server->qhead) | ||||
|            /* then the tcp socket is also writable! */ | ||||
|            bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex-1); | ||||
|          } | ||||
|            bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex); | ||||
|  | ||||
|          sockindex++; | ||||
|        } | ||||
|     } | ||||
|   return (int)nfds; | ||||
|   return bitmap; | ||||
| } | ||||
|   | ||||
							
								
								
									
										201
									
								
								ares/ares_init.c
									
									
									
									
									
								
							
							
						
						
									
										201
									
								
								ares/ares_init.c
									
									
									
									
									
								
							| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| @@ -41,6 +42,9 @@ | ||||
| #ifdef HAVE_UNISTD_H | ||||
| #include <unistd.h> | ||||
| #endif | ||||
| #ifdef HAVE_PROCESS_H | ||||
| #include <process.h>  /* Some have getpid() here */ | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| @@ -89,13 +93,26 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options, | ||||
|                       int optmask) | ||||
| { | ||||
|   ares_channel channel; | ||||
|   int i, status; | ||||
|   int i; | ||||
|   int status = ARES_SUCCESS; | ||||
|   struct server_state *server; | ||||
|   struct timeval tv; | ||||
|  | ||||
| #ifdef CURLDEBUG | ||||
|   const char *env = getenv("CARES_MEMDEBUG"); | ||||
|  | ||||
|   if (env) | ||||
|     curl_memdebug(env); | ||||
|   env = getenv("CARES_MEMLIMIT"); | ||||
|   if (env) | ||||
|     curl_memlimit(atoi(env)); | ||||
| #endif | ||||
|  | ||||
|   channel = malloc(sizeof(struct ares_channeldata)); | ||||
|   if (!channel) | ||||
|   if (!channel) { | ||||
|     *channelptr = NULL; | ||||
|     return ARES_ENOMEM; | ||||
|   } | ||||
|  | ||||
|   /* Set everything to distinguished values so we know they haven't | ||||
|    * been set yet. | ||||
| @@ -113,22 +130,42 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options, | ||||
|   channel->queries = NULL; | ||||
|   channel->domains = NULL; | ||||
|   channel->sortlist = NULL; | ||||
|   channel->servers = NULL; | ||||
|   channel->sock_state_cb = NULL; | ||||
|   channel->sock_state_cb_data = NULL; | ||||
|  | ||||
|   /* Initialize configuration by each of the four sources, from highest | ||||
|    * precedence to lowest. | ||||
|    */ | ||||
|  | ||||
|   if (status == ARES_SUCCESS) { | ||||
|   status = init_by_options(channel, options, optmask); | ||||
|   if (status == ARES_SUCCESS) | ||||
|     if (status != ARES_SUCCESS) | ||||
|       DEBUGF(fprintf(stderr, "Error: init_by_options failed: %s\n", | ||||
|                      ares_strerror(status))); | ||||
|   } | ||||
|   if (status == ARES_SUCCESS) { | ||||
|     status = init_by_environment(channel); | ||||
|   if (status == ARES_SUCCESS) | ||||
|     if (status != ARES_SUCCESS) | ||||
|       DEBUGF(fprintf(stderr, "Error: init_by_environment failed: %s\n", | ||||
|                      ares_strerror(status))); | ||||
|   } | ||||
|   if (status == ARES_SUCCESS) { | ||||
|     status = init_by_resolv_conf(channel); | ||||
|   if (status == ARES_SUCCESS) | ||||
|     if (status != ARES_SUCCESS) | ||||
|       DEBUGF(fprintf(stderr, "Error: init_by_resolv_conf failed: %s\n", | ||||
|                      ares_strerror(status))); | ||||
|   } | ||||
|   if (status == ARES_SUCCESS) { | ||||
|     status = init_by_defaults(channel); | ||||
|     if (status != ARES_SUCCESS) | ||||
|       DEBUGF(fprintf(stderr, "Error: init_by_defaults failed: %s\n", | ||||
|                      ares_strerror(status))); | ||||
|   } | ||||
|   if (status != ARES_SUCCESS) | ||||
|     { | ||||
|       /* Something failed; clean up memory we may have allocated. */ | ||||
|       if (channel->nservers != -1) | ||||
|       if (channel->servers) | ||||
|         free(channel->servers); | ||||
|       if (channel->domains) | ||||
|         { | ||||
| @@ -167,7 +204,7 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options, | ||||
|    */ | ||||
|   gettimeofday(&tv, NULL); | ||||
|   channel->next_id = (unsigned short) | ||||
|     (tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff; | ||||
|     ((tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff); | ||||
|  | ||||
|   channel->queries = NULL; | ||||
|  | ||||
| @@ -201,13 +238,17 @@ static int init_by_options(ares_channel channel, struct ares_options *options, | ||||
|  | ||||
|   /* Copy the servers, if given. */ | ||||
|   if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1) | ||||
|     { | ||||
|       /* Avoid zero size allocations at any cost */ | ||||
|       if (options->nservers > 0) | ||||
|         { | ||||
|           channel->servers = | ||||
|             malloc(options->nservers * sizeof(struct server_state)); | ||||
|       if (!channel->servers && options->nservers != 0) | ||||
|           if (!channel->servers) | ||||
|             return ARES_ENOMEM; | ||||
|           for (i = 0; i < options->nservers; i++) | ||||
|             channel->servers[i].addr = options->servers[i]; | ||||
|         } | ||||
|       channel->nservers = options->nservers; | ||||
|     } | ||||
|  | ||||
| @@ -215,9 +256,12 @@ static int init_by_options(ares_channel channel, struct ares_options *options, | ||||
|    * we can clean up in case of error. | ||||
|    */ | ||||
|   if ((optmask & ARES_OPT_DOMAINS) && channel->ndomains == -1) | ||||
|     { | ||||
|       /* Avoid zero size allocations at any cost */ | ||||
|       if (options->ndomains > 0) | ||||
|       { | ||||
|         channel->domains = malloc(options->ndomains * sizeof(char *)); | ||||
|       if (!channel->domains && options->ndomains != 0) | ||||
|         if (!channel->domains) | ||||
|           return ARES_ENOMEM; | ||||
|         for (i = 0; i < options->ndomains; i++) | ||||
|           { | ||||
| @@ -226,6 +270,7 @@ static int init_by_options(ares_channel channel, struct ares_options *options, | ||||
|             if (!channel->domains[i]) | ||||
|               return ARES_ENOMEM; | ||||
|           } | ||||
|       } | ||||
|       channel->ndomains = options->ndomains; | ||||
|     } | ||||
|  | ||||
| @@ -361,7 +406,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size) | ||||
|     printf ("DNS Servers:\n" | ||||
|             "    %s (primary)\n", fi->DnsServerList.IpAddress.String); | ||||
|   } | ||||
|   if (inet_addr(fi->DnsServerList.IpAddress.String) != INADDR_NONE && | ||||
|   if (strlen(fi->DnsServerList.IpAddress.String) > 0 && | ||||
|       inet_addr(fi->DnsServerList.IpAddress.String) != INADDR_NONE && | ||||
|       left > ip_size) | ||||
|   { | ||||
|     ret += sprintf (ret, "%s,", fi->DnsServerList.IpAddress.String); | ||||
| @@ -527,7 +573,7 @@ DhcpNameServer | ||||
|     do { | ||||
|       space = strchr(pos, ' '); | ||||
|       if (space) | ||||
|         *space = 0; | ||||
|         *space = '\0'; | ||||
|       status = config_nameserver(&servers, &nservers, pos); | ||||
|       if (status != ARES_SUCCESS) | ||||
|         break; | ||||
| @@ -563,17 +609,17 @@ DhcpNameServer | ||||
|     char *p; | ||||
|     FILE *fp; | ||||
|     int linesize; | ||||
|     int error; | ||||
|  | ||||
|     fp = fopen(PATH_RESOLV_CONF, "r"); | ||||
|     if (!fp) | ||||
|       return (errno == ENOENT) ? ARES_SUCCESS : ARES_EFILE; | ||||
|     if (fp) { | ||||
|       while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) | ||||
|       { | ||||
|       if ((p = try_config(line, "domain"))) | ||||
|         if ((p = try_config(line, "domain")) && channel->ndomains == -1) | ||||
|           status = config_domain(channel, p); | ||||
|         else if ((p = try_config(line, "lookup")) && !channel->lookups) | ||||
|           status = config_lookup(channel, p, "bind", "file"); | ||||
|       else if ((p = try_config(line, "search"))) | ||||
|         else if ((p = try_config(line, "search")) && channel->ndomains == -1) | ||||
|           status = set_search(channel, p); | ||||
|         else if ((p = try_config(line, "nameserver")) && channel->nservers == -1) | ||||
|           status = config_nameserver(&servers, &nservers, p); | ||||
| @@ -587,8 +633,23 @@ DhcpNameServer | ||||
|           break; | ||||
|       } | ||||
|       fclose(fp); | ||||
|     } | ||||
|     else { | ||||
|       error = ERRNO; | ||||
|       switch(error) { | ||||
|       case ENOENT: | ||||
|       case ESRCH: | ||||
|         status = ARES_EOF; | ||||
|         break; | ||||
|       default: | ||||
|         DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", | ||||
|                        error, strerror(error))); | ||||
|         DEBUGF(fprintf(stderr, "Error opening file: %s\n", PATH_RESOLV_CONF)); | ||||
|         status = ARES_EFILE; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (!channel->lookups) { | ||||
|     if ((status == ARES_EOF) && (!channel->lookups)) { | ||||
|       /* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */ | ||||
|       fp = fopen("/etc/nsswitch.conf", "r"); | ||||
|       if (fp) { | ||||
| @@ -599,9 +660,23 @@ DhcpNameServer | ||||
|         } | ||||
|         fclose(fp); | ||||
|       } | ||||
|       else { | ||||
|         error = ERRNO; | ||||
|         switch(error) { | ||||
|         case ENOENT: | ||||
|         case ESRCH: | ||||
|           status = ARES_EOF; | ||||
|           break; | ||||
|         default: | ||||
|           DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", | ||||
|                          error, strerror(error))); | ||||
|           DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/nsswitch.conf")); | ||||
|           status = ARES_EFILE; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (!channel->lookups) { | ||||
|     if ((status == ARES_EOF) && (!channel->lookups)) { | ||||
|       /* Linux / GNU libc 2.x and possibly others have host.conf */ | ||||
|       fp = fopen("/etc/host.conf", "r"); | ||||
|       if (fp) { | ||||
| @@ -612,9 +687,23 @@ DhcpNameServer | ||||
|         } | ||||
|         fclose(fp); | ||||
|       } | ||||
|       else { | ||||
|         error = ERRNO; | ||||
|         switch(error) { | ||||
|         case ENOENT: | ||||
|         case ESRCH: | ||||
|           status = ARES_EOF; | ||||
|           break; | ||||
|         default: | ||||
|           DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", | ||||
|                          error, strerror(error))); | ||||
|           DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/host.conf")); | ||||
|           status = ARES_EFILE; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (!channel->lookups) { | ||||
|     if ((status == ARES_EOF) && (!channel->lookups)) { | ||||
|       /* Tru64 uses /etc/svc.conf */ | ||||
|       fp = fopen("/etc/svc.conf", "r"); | ||||
|       if (fp) { | ||||
| @@ -625,6 +714,20 @@ DhcpNameServer | ||||
|         } | ||||
|         fclose(fp); | ||||
|       } | ||||
|       else { | ||||
|         error = ERRNO; | ||||
|         switch(error) { | ||||
|         case ENOENT: | ||||
|         case ESRCH: | ||||
|           status = ARES_EOF; | ||||
|           break; | ||||
|         default: | ||||
|           DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", | ||||
|                          error, strerror(error))); | ||||
|           DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/svc.conf")); | ||||
|           status = ARES_EFILE; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if(line) | ||||
| @@ -698,7 +801,6 @@ static int init_by_defaults(ares_channel channel) | ||||
|       if (gethostname(hostname, sizeof(hostname)) == -1 | ||||
|           || !strchr(hostname, '.')) | ||||
|         { | ||||
|           channel->domains = malloc(0); | ||||
|           channel->ndomains = 0; | ||||
|         } | ||||
|       else | ||||
| @@ -737,9 +839,9 @@ static int config_domain(ares_channel channel, char *str) | ||||
|  | ||||
|   /* Set a single search domain. */ | ||||
|   q = str; | ||||
|   while (*q && !isspace((unsigned char)*q)) | ||||
|   while (*q && !ISSPACE(*q)) | ||||
|     q++; | ||||
|   *q = 0; | ||||
|   *q = '\0'; | ||||
|   return set_search(channel, str); | ||||
| } | ||||
|  | ||||
| @@ -761,12 +863,12 @@ static int config_lookup(ares_channel channel, const char *str, | ||||
|         if (*p == *bindch) *l++ = 'b'; | ||||
|         else *l++ = 'f'; | ||||
|       } | ||||
|       while (*p && !isspace((unsigned char)*p) && (*p != ',')) | ||||
|       while (*p && !ISSPACE(*p) && (*p != ',')) | ||||
|         p++; | ||||
|       while (*p && (isspace((unsigned char)*p) || (*p == ','))) | ||||
|       while (*p && (ISSPACE(*p) || (*p == ','))) | ||||
|         p++; | ||||
|     } | ||||
|   *l = 0; | ||||
|   *l = '\0'; | ||||
|   channel->lookups = strdup(lookups); | ||||
|   return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM; | ||||
| } | ||||
| @@ -788,12 +890,12 @@ static int config_nameserver(struct server_state **servers, int *nservers, | ||||
|   while (more) | ||||
|   { | ||||
|     more = 0; | ||||
|     while (*p && !isspace(*p) && *p != ',') | ||||
|     while (*p && !ISSPACE(*p) && *p != ',') | ||||
|       p++; | ||||
|  | ||||
|     if (*p) | ||||
|     { | ||||
|       *p = 0; | ||||
|       *p = '\0'; | ||||
|       more = 1; | ||||
|     } | ||||
|  | ||||
| @@ -848,22 +950,22 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||
|       char ipbuf[16], ipbufpfx[32]; | ||||
|       /* Find just the IP */ | ||||
|       q = str; | ||||
|       while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q)) | ||||
|       while (*q && *q != '/' && *q != ';' && !ISSPACE(*q)) | ||||
|         q++; | ||||
|       memcpy(ipbuf, str, (int)(q-str)); | ||||
|       ipbuf[(int)(q-str)] = 0; | ||||
|       ipbuf[(int)(q-str)] = '\0'; | ||||
|       /* Find the prefix */ | ||||
|       if (*q == '/') | ||||
|         { | ||||
|           const char *str2 = q+1; | ||||
|           while (*q && *q != ';' && !isspace((unsigned char)*q)) | ||||
|           while (*q && *q != ';' && !ISSPACE(*q)) | ||||
|             q++; | ||||
|           memcpy(ipbufpfx, str, (int)(q-str)); | ||||
|           ipbufpfx[(int)(q-str)] = 0; | ||||
|           ipbufpfx[(int)(q-str)] = '\0'; | ||||
|           str = str2; | ||||
|         } | ||||
|       else | ||||
|         ipbufpfx[0] = 0; | ||||
|         ipbufpfx[0] = '\0'; | ||||
|       /* Lets see if it is CIDR */ | ||||
|       /* First we'll try IPv6 */ | ||||
|       if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf, | ||||
| @@ -871,7 +973,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||
|                                      sizeof(pat.addr.addr6))) > 0) | ||||
|         { | ||||
|           pat.type = PATTERN_CIDR; | ||||
|           pat.mask.bits = bits; | ||||
|           pat.mask.bits = (unsigned short)bits; | ||||
|           pat.family = AF_INET6; | ||||
|           if (!sortlist_alloc(sortlist, nsort, &pat)) | ||||
|             return ARES_ENOMEM; | ||||
| @@ -881,7 +983,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||
|                                      sizeof(pat.addr.addr4))) > 0) | ||||
|         { | ||||
|           pat.type = PATTERN_CIDR; | ||||
|           pat.mask.bits = bits; | ||||
|           pat.mask.bits = (unsigned short)bits; | ||||
|           pat.family = AF_INET; | ||||
|           if (!sortlist_alloc(sortlist, nsort, &pat)) | ||||
|             return ARES_ENOMEM; | ||||
| @@ -892,7 +994,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||
|           if (ipbufpfx) | ||||
|             { | ||||
|               memcpy(ipbuf, str, (int)(q-str)); | ||||
|               ipbuf[(int)(q-str)] = 0; | ||||
|               ipbuf[(int)(q-str)] = '\0'; | ||||
|               if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr.addr4) != 0) | ||||
|                 natural_mask(&pat); | ||||
|             } | ||||
| @@ -905,11 +1007,11 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           while (*q && *q != ';' && !isspace((unsigned char)*q)) | ||||
|           while (*q && *q != ';' && !ISSPACE(*q)) | ||||
|             q++; | ||||
|         } | ||||
|       str = q; | ||||
|       while (isspace((unsigned char)*str)) | ||||
|       while (ISSPACE(*str)) | ||||
|         str++; | ||||
|     } | ||||
|  | ||||
| @@ -927,6 +1029,7 @@ static int set_search(ares_channel channel, const char *str) | ||||
|     for(n=0; n < channel->ndomains; n++) | ||||
|       free(channel->domains[n]); | ||||
|     free(channel->domains); | ||||
|     channel->domains = NULL; | ||||
|     channel->ndomains = -1; | ||||
|   } | ||||
|  | ||||
| @@ -935,15 +1038,21 @@ static int set_search(ares_channel channel, const char *str) | ||||
|   p = str; | ||||
|   while (*p) | ||||
|     { | ||||
|       while (*p && !isspace((unsigned char)*p)) | ||||
|       while (*p && !ISSPACE(*p)) | ||||
|         p++; | ||||
|       while (isspace((unsigned char)*p)) | ||||
|       while (ISSPACE(*p)) | ||||
|         p++; | ||||
|       n++; | ||||
|     } | ||||
|  | ||||
|   if (!n) | ||||
|     { | ||||
|       channel->ndomains = 0; | ||||
|       return ARES_SUCCESS; | ||||
|     } | ||||
|  | ||||
|   channel->domains = malloc(n * sizeof(char *)); | ||||
|   if (!channel->domains && n) | ||||
|   if (!channel->domains) | ||||
|     return ARES_ENOMEM; | ||||
|  | ||||
|   /* Now copy the domains. */ | ||||
| @@ -953,7 +1062,7 @@ static int set_search(ares_channel channel, const char *str) | ||||
|     { | ||||
|       channel->ndomains = n; | ||||
|       q = p; | ||||
|       while (*q && !isspace((unsigned char)*q)) | ||||
|       while (*q && !ISSPACE(*q)) | ||||
|         q++; | ||||
|       channel->domains[n] = malloc(q - p + 1); | ||||
|       if (!channel->domains[n]) | ||||
| @@ -961,7 +1070,7 @@ static int set_search(ares_channel channel, const char *str) | ||||
|       memcpy(channel->domains[n], p, q - p); | ||||
|       channel->domains[n][q - p] = 0; | ||||
|       p = q; | ||||
|       while (isspace((unsigned char)*p)) | ||||
|       while (ISSPACE(*p)) | ||||
|         p++; | ||||
|       n++; | ||||
|     } | ||||
| @@ -978,7 +1087,7 @@ static int set_options(ares_channel channel, const char *str) | ||||
|   while (*p) | ||||
|     { | ||||
|       q = p; | ||||
|       while (*q && !isspace((unsigned char)*q)) | ||||
|       while (*q && !ISSPACE(*q)) | ||||
|         q++; | ||||
|       val = try_option(p, q, "ndots:"); | ||||
|       if (val && channel->ndots == -1) | ||||
| @@ -990,7 +1099,7 @@ static int set_options(ares_channel channel, const char *str) | ||||
|       if (val && channel->tries == -1) | ||||
|         channel->tries = atoi(val); | ||||
|       p = q; | ||||
|       while (isspace((unsigned char)*p)) | ||||
|       while (ISSPACE(*p)) | ||||
|         p++; | ||||
|     } | ||||
|  | ||||
| @@ -1003,10 +1112,10 @@ static char *try_config(char *s, const char *opt) | ||||
|   size_t len; | ||||
|  | ||||
|   len = strlen(opt); | ||||
|   if (strncmp(s, opt, len) != 0 || !isspace((unsigned char)s[len])) | ||||
|   if (strncmp(s, opt, len) != 0 || !ISSPACE(s[len])) | ||||
|     return NULL; | ||||
|   s += len; | ||||
|   while (isspace((unsigned char)*s)) | ||||
|   while (ISSPACE(*s)) | ||||
|     s++; | ||||
|   return s; | ||||
| } | ||||
|   | ||||
| @@ -46,8 +46,8 @@ struct addrinfo | ||||
|   int              ai_family; | ||||
|   int              ai_socktype; | ||||
|   int              ai_protocol; | ||||
|   size_t ai_addrlen; | ||||
|   char *ai_cannonname; | ||||
|   socklen_t        ai_addrlen;   /* Follow rfc3493 struct addrinfo */ | ||||
|   char            *ai_canonname; | ||||
|   struct sockaddr *ai_addr; | ||||
|   struct addrinfo *ai_next; | ||||
| }; | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| @@ -30,6 +31,7 @@ | ||||
| #include <string.h> | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| /* Header format, from RFC 1035: | ||||
|  *                                  1  1  1  1  1  1 | ||||
| @@ -112,7 +114,12 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id, | ||||
|   memset(q, 0, HFIXEDSZ); | ||||
|   DNS_HEADER_SET_QID(q, id); | ||||
|   DNS_HEADER_SET_OPCODE(q, QUERY); | ||||
|   DNS_HEADER_SET_RD(q, (rd) ? 1 : 0); | ||||
|   if (rd) { | ||||
|     DNS_HEADER_SET_RD(q, 1); | ||||
|   } | ||||
|   else { | ||||
|     DNS_HEADER_SET_RD(q, 0); | ||||
|   } | ||||
|   DNS_HEADER_SET_QDCOUNT(q, 1); | ||||
|  | ||||
|   /* A name of "." is a screw case for the loop below, so adjust it. */ | ||||
| @@ -138,7 +145,7 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id, | ||||
|         return ARES_EBADNAME; | ||||
|  | ||||
|       /* Encode the length and copy the data. */ | ||||
|       *q++ = len; | ||||
|       *q++ = (unsigned char)len; | ||||
|       for (p = name; *p && *p != '.'; p++) | ||||
|         { | ||||
|           if (*p == '\\' && *(p + 1) != 0) | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 2005 Dominick Meglio | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
|   | ||||
							
								
								
									
										66
									
								
								ares/ares_parse_ns_reply.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								ares/ares_parse_ns_reply.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| .\" | ||||
| .\" Copyright 1998 by the Massachusetts Institute of Technology. | ||||
| .\" | ||||
| .\" Permission to use, copy, modify, and distribute this | ||||
| .\" software and its documentation for any purpose and without | ||||
| .\" fee is hereby granted, provided that the above copyright | ||||
| .\" notice appear in all copies and that both that copyright | ||||
| .\" notice and this permission notice appear in supporting | ||||
| .\" documentation, and that the name of M.I.T. not be used in | ||||
| .\" advertising or publicity pertaining to distribution of the | ||||
| .\" software without specific, written prior permission. | ||||
| .\" M.I.T. makes no representations about the suitability of | ||||
| .\" this software for any purpose.  It is provided "as is" | ||||
| .\" without express or implied warranty. | ||||
| .\" | ||||
| .TH ARES_PARSE_NS_REPLY 3 "10 February 2007" | ||||
| .SH NAME | ||||
| ares_parse_ns_reply \- Parse a reply to a DNS query of type NS into a hostent | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B int ares_parse_ns_reply(const unsigned char *\fIabuf\fP, int \fIalen\fP, | ||||
| .B 	struct hostent **\fIhost\fP); | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_parse_ns_reply | ||||
| function parses the response to a query of type NS into a | ||||
| .BR "struct hostent" . | ||||
| The parameters | ||||
| .I abuf | ||||
| and | ||||
| .I alen | ||||
| give the contents of the response.  The result is stored in allocated | ||||
| memory and a pointer to it stored into the variable pointed to by | ||||
| .IR host .  | ||||
| The nameservers are stored into the  | ||||
| .BR aliases  | ||||
| field of the  | ||||
| .IR host  | ||||
| structure.  | ||||
| It is the caller's responsibility to free the resulting host structure | ||||
| using | ||||
| .BR ares_free_hostent (3) | ||||
| when it is no longer needed. | ||||
| .SH RETURN VALUES | ||||
| .B ares_parse_ns_reply | ||||
| can return any of the following values: | ||||
| .TP 15 | ||||
| .B ARES_SUCCESS | ||||
| The response was successfully parsed. | ||||
| .TP 15 | ||||
| .B ARES_EBADRESP | ||||
| The response was malformatted. | ||||
| .TP 15 | ||||
| .B ARES_ENODATA | ||||
| The response did not contain an answer to the query. | ||||
| .TP 15 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .SH SEE ALSO | ||||
| .BR ares_query (3), | ||||
| .BR ares_free_hostent (3) | ||||
| .SH AUTHOR | ||||
| Written by Vlad Dinulescu <vlad.dinulescu@avira.com>, on behalf of AVIRA Gmbh http://www.avira.com | ||||
							
								
								
									
										171
									
								
								ares/ares_parse_ns_reply.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								ares/ares_parse_ns_reply.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,171 @@ | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
| * Permission to use, copy, modify, and distribute this | ||||
|  * software and its documentation for any purpose and without | ||||
| * fee is hereby granted, provided that the above copyright | ||||
|  * notice appear in all copies and that both that copyright | ||||
|  * notice and this permission notice appear in supporting | ||||
| * documentation, and that the name of M.I.T. not be used in | ||||
|  * advertising or publicity pertaining to distribution of the | ||||
| * software without specific, written prior permission. | ||||
|  * M.I.T. makes no representations about the suitability of | ||||
|  * this software for any purpose.  It is provided "as is" | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * ares_parse_ns_reply created by Vlad Dinulescu <vlad.dinulescu@avira.com> | ||||
|  *      on behalf of AVIRA Gmbh - http://www.avira.com | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| int ares_parse_ns_reply( const unsigned char* abuf, int alen, | ||||
|                          struct hostent** host ) | ||||
| { | ||||
|   unsigned int qdcount, ancount; | ||||
|   int status, i, rr_type, rr_class, rr_len; | ||||
|   int nameservers_num; | ||||
|   long len; | ||||
|   const unsigned char *aptr; | ||||
|   char* hostname, *rr_name, *rr_data, **nameservers; | ||||
|   struct hostent *hostent; | ||||
|  | ||||
|   /* Set *host to NULL for all failure cases. */ | ||||
|   *host = NULL; | ||||
|  | ||||
|   /* Give up if abuf doesn't have room for a header. */ | ||||
|   if ( alen < HFIXEDSZ ) | ||||
|     return ARES_EBADRESP; | ||||
|  | ||||
|   /* Fetch the question and answer count from the header. */ | ||||
|   qdcount = DNS_HEADER_QDCOUNT( abuf ); | ||||
|   ancount = DNS_HEADER_ANCOUNT( abuf ); | ||||
|   if ( qdcount != 1 ) | ||||
|     return ARES_EBADRESP; | ||||
|  | ||||
|   /* Expand the name from the question, and skip past the question. */ | ||||
|   aptr = abuf + HFIXEDSZ; | ||||
|   status = ares_expand_name( aptr, abuf, alen, &hostname, &len ); | ||||
|   if ( status != ARES_SUCCESS ) | ||||
|     return status; | ||||
|   if ( aptr + len + QFIXEDSZ > abuf + alen ) | ||||
|   { | ||||
|     free( hostname ); | ||||
|     return ARES_EBADRESP; | ||||
|   } | ||||
|   aptr += len + QFIXEDSZ; | ||||
|  | ||||
|   /* Allocate nameservers array; ancount gives an upper bound */ | ||||
|   nameservers = malloc( ( ancount + 1 ) * sizeof( char * ) ); | ||||
|   if ( !nameservers ) | ||||
|   { | ||||
|     free( hostname ); | ||||
|     return ARES_ENOMEM; | ||||
|   } | ||||
|   nameservers_num = 0; | ||||
|  | ||||
|   /* Examine each answer resource record (RR) in turn. */ | ||||
|   for ( i = 0; i < ( int ) ancount; i++ ) | ||||
|   { | ||||
|     /* Decode the RR up to the data field. */ | ||||
|     status = ares_expand_name( aptr, abuf, alen, &rr_name, &len ); | ||||
|     if ( status != ARES_SUCCESS ) | ||||
|       break; | ||||
|     aptr += len; | ||||
|     if ( aptr + RRFIXEDSZ > abuf + alen ) | ||||
|     { | ||||
|       status = ARES_EBADRESP; | ||||
|       break; | ||||
|     } | ||||
|     rr_type = DNS_RR_TYPE( aptr ); | ||||
|     rr_class = DNS_RR_CLASS( aptr ); | ||||
|     rr_len = DNS_RR_LEN( aptr ); | ||||
|     aptr += RRFIXEDSZ; | ||||
|  | ||||
|     if ( rr_class == C_IN && rr_type == T_NS ) | ||||
|     { | ||||
|       /* Decode the RR data and add it to the nameservers list */ | ||||
|       status = ares_expand_name( aptr, abuf, alen, &rr_data, &len ); | ||||
|       if ( status != ARES_SUCCESS ) | ||||
|       { | ||||
|         break; | ||||
|       } | ||||
|  | ||||
|       nameservers[nameservers_num] = malloc(strlen(rr_data)+1); | ||||
|  | ||||
|       if (nameservers[nameservers_num]==NULL) | ||||
|       { | ||||
|         free(rr_name); | ||||
|         free(rr_data); | ||||
|         status=ARES_ENOMEM; | ||||
|         break; | ||||
|       } | ||||
|       strcpy(nameservers[nameservers_num],rr_data); | ||||
|       free(rr_data); | ||||
|  | ||||
|       nameservers_num++; | ||||
|     } | ||||
|  | ||||
|     free( rr_name ); | ||||
|  | ||||
|     aptr += rr_len; | ||||
|     if ( aptr > abuf + alen ) | ||||
|     { | ||||
|       status = ARES_EBADRESP; | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if ( status == ARES_SUCCESS && nameservers_num == 0 ) | ||||
|   { | ||||
|     status = ARES_ENODATA; | ||||
|   } | ||||
|   if ( status == ARES_SUCCESS ) | ||||
|   { | ||||
|     /* We got our answer.  Allocate memory to build the host entry. */ | ||||
|     nameservers[nameservers_num] = NULL; | ||||
|     hostent = malloc( sizeof( struct hostent ) ); | ||||
|     if ( hostent ) | ||||
|     { | ||||
|       hostent->h_addr_list = malloc( 1 * sizeof( char * ) ); | ||||
|       if ( hostent->h_addr_list ) | ||||
|       { | ||||
|         /* Fill in the hostent and return successfully. */ | ||||
|         hostent->h_name = hostname; | ||||
|         hostent->h_aliases = nameservers; | ||||
|         hostent->h_addrtype = AF_INET; | ||||
|         hostent->h_length = sizeof( struct in_addr ); | ||||
|         hostent->h_addr_list[0] = NULL; | ||||
|         *host = hostent; | ||||
|         return ARES_SUCCESS; | ||||
|       } | ||||
|       free( hostent ); | ||||
|     } | ||||
|     status = ARES_ENOMEM; | ||||
|   } | ||||
|   for ( i = 0; i < nameservers_num; i++ ) | ||||
|     free( nameservers[i] ); | ||||
|   free( nameservers ); | ||||
|   free( hostname ); | ||||
|   return status; | ||||
| } | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
|   | ||||
| @@ -1,3 +1,6 @@ | ||||
| #ifndef __ARES_PRIVATE_H | ||||
| #define __ARES_PRIVATE_H | ||||
|  | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
| @@ -199,3 +202,6 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize); | ||||
|    this anyway for convenience. */ | ||||
| #include "../lib/memdebug.h" | ||||
| #endif | ||||
|  | ||||
| #endif /* __ARES_PRIVATE_H */ | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| @@ -52,17 +53,8 @@ | ||||
| #include "ares_dns.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| #ifndef TRUE | ||||
| /* at least Solaris 7 does not have TRUE at this point */ | ||||
| #define TRUE 1 | ||||
| #endif | ||||
|  | ||||
| #if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) | ||||
| #define GET_ERRNO()  WSAGetLastError() | ||||
| #else | ||||
| #define GET_ERRNO()  errno | ||||
| #endif | ||||
|  | ||||
| static int try_again(int errnum); | ||||
| static void write_tcp_data(ares_channel channel, fd_set *write_fds, | ||||
|                            time_t now); | ||||
| static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now); | ||||
| @@ -94,6 +86,31 @@ void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds) | ||||
|   process_timeouts(channel, now); | ||||
| } | ||||
|  | ||||
| /* Return 1 if the specified error number describes a readiness error, or 0 | ||||
|  * otherwise. This is mostly for HP-UX, which could return EAGAIN or | ||||
|  * EWOULDBLOCK. See this man page | ||||
|  * | ||||
|  * 	http://devrsrc1.external.hp.com/STKS/cgi-bin/man2html?manpage=/usr/share/man/man2.Z/send.2 | ||||
|  */ | ||||
| static int try_again(int errnum) | ||||
| { | ||||
| #if !defined EWOULDBLOCK && !defined EAGAIN | ||||
| #error "Neither EWOULDBLOCK nor EAGAIN defined" | ||||
| #endif | ||||
|   switch (errnum) | ||||
|     { | ||||
| #ifdef EWOULDBLOCK | ||||
|     case EWOULDBLOCK: | ||||
|       return 1; | ||||
| #endif | ||||
| #if defined EAGAIN && EAGAIN != EWOULDBLOCK | ||||
|     case EAGAIN: | ||||
|       return 1; | ||||
| #endif | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| /* If any TCP sockets select true for writing, write out queued data | ||||
|  * we have for them. | ||||
|  */ | ||||
| @@ -132,10 +149,11 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now) | ||||
|               vec[n].iov_len = sendreq->len; | ||||
|               n++; | ||||
|             } | ||||
|           wcount = writev(server->tcp_socket, vec, n); | ||||
|           wcount = (ssize_t)writev(server->tcp_socket, vec, (int)n); | ||||
|           free(vec); | ||||
|           if (wcount < 0) | ||||
|             { | ||||
|               if (!try_again(SOCKERRNO)) | ||||
|                   handle_error(channel, i, now); | ||||
|               continue; | ||||
|             } | ||||
| @@ -168,11 +186,10 @@ 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, (void *)sendreq->data, | ||||
|                         sendreq->len, 0); | ||||
|  | ||||
|           scount = swrite(server->tcp_socket, sendreq->data, sendreq->len); | ||||
|           if (scount < 0) | ||||
|             { | ||||
|               if (!try_again(SOCKERRNO)) | ||||
|                   handle_error(channel, i, now); | ||||
|               continue; | ||||
|             } | ||||
| @@ -204,7 +221,8 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now) | ||||
| static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now) | ||||
| { | ||||
|   struct server_state *server; | ||||
|   int i, count; | ||||
|   int i; | ||||
|   ssize_t count; | ||||
|  | ||||
|   for (i = 0; i < channel->nservers; i++) | ||||
|     { | ||||
| @@ -219,16 +237,17 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now) | ||||
|           /* We haven't yet read a length word, so read that (or | ||||
|            * what's left to read of it). | ||||
|            */ | ||||
|           count = recv(server->tcp_socket, | ||||
|                        (void *)(server->tcp_lenbuf + server->tcp_lenbuf_pos), | ||||
|                        2 - server->tcp_lenbuf_pos, 0); | ||||
|           count = sread(server->tcp_socket, | ||||
|                         server->tcp_lenbuf + server->tcp_lenbuf_pos, | ||||
|                         2 - server->tcp_lenbuf_pos); | ||||
|           if (count <= 0) | ||||
|             { | ||||
|               if (!(count == -1 && try_again(SOCKERRNO))) | ||||
|                   handle_error(channel, i, now); | ||||
|               continue; | ||||
|             } | ||||
|  | ||||
|           server->tcp_lenbuf_pos += count; | ||||
|           server->tcp_lenbuf_pos += (int)count; | ||||
|           if (server->tcp_lenbuf_pos == 2) | ||||
|             { | ||||
|               /* We finished reading the length word.  Decode the | ||||
| @@ -245,16 +264,17 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now) | ||||
|       else | ||||
|         { | ||||
|           /* Read data into the allocated buffer. */ | ||||
|           count = recv(server->tcp_socket, | ||||
|                        (void *)(server->tcp_buffer + server->tcp_buffer_pos), | ||||
|                        server->tcp_length - server->tcp_buffer_pos, 0); | ||||
|           count = sread(server->tcp_socket, | ||||
|                         server->tcp_buffer + server->tcp_buffer_pos, | ||||
|                         server->tcp_length - server->tcp_buffer_pos); | ||||
|           if (count <= 0) | ||||
|             { | ||||
|               if (!(count == -1 && try_again(SOCKERRNO))) | ||||
|                   handle_error(channel, i, now); | ||||
|               continue; | ||||
|             } | ||||
|  | ||||
|           server->tcp_buffer_pos += count; | ||||
|           server->tcp_buffer_pos += (int)count; | ||||
|           if (server->tcp_buffer_pos == server->tcp_length) | ||||
|             { | ||||
|               /* We finished reading this answer; process it and | ||||
| @@ -266,6 +286,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now) | ||||
|                         free(server->tcp_buffer); | ||||
|               server->tcp_buffer = NULL; | ||||
|               server->tcp_lenbuf_pos = 0; | ||||
|               server->tcp_buffer_pos = 0; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -276,7 +297,8 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds, | ||||
|                              time_t now) | ||||
| { | ||||
|   struct server_state *server; | ||||
|   int i, count; | ||||
|   int i; | ||||
|   ssize_t count; | ||||
|   unsigned char buf[PACKETSZ + 1]; | ||||
|  | ||||
|   for (i = 0; i < channel->nservers; i++) | ||||
| @@ -288,11 +310,13 @@ 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, (void *)buf, sizeof(buf), 0); | ||||
|       if (count <= 0) | ||||
|       count = sread(server->udp_socket, buf, sizeof(buf)); | ||||
|       if (count == -1 && try_again(SOCKERRNO)) | ||||
|         continue; | ||||
|       else if (count <= 0) | ||||
|         handle_error(channel, i, now); | ||||
|  | ||||
|       process_answer(channel, buf, count, i, 0, now); | ||||
|       process_answer(channel, buf, (int)count, i, 0, now); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -476,9 +500,9 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now) | ||||
|               return; | ||||
|             } | ||||
|         } | ||||
|       if (send(server->udp_socket, (void *)query->qbuf, | ||||
|                query->qlen, 0) == -1) | ||||
|       if (swrite(server->udp_socket, query->qbuf, query->qlen) == -1) | ||||
|         { | ||||
|           /* FIXME: Handle EAGAIN here since it likely can happen. */ | ||||
|           query->skip_server[query->server] = 1; | ||||
|           next_server(channel, query, now); | ||||
|           return; | ||||
| @@ -503,7 +527,7 @@ static int nonblock(ares_socket_t sockfd,    /* operate on this */ | ||||
|   int flags; | ||||
|  | ||||
|   flags = fcntl(sockfd, F_GETFL, 0); | ||||
|   if (TRUE == nonblock) | ||||
|   if (FALSE != nonblock) | ||||
|     return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); | ||||
|   else | ||||
|     return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); | ||||
| @@ -522,8 +546,12 @@ static int nonblock(ares_socket_t sockfd,    /* operate on this */ | ||||
| #endif | ||||
|  | ||||
| #if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0) | ||||
| #ifdef WATT32 | ||||
|   char flags; | ||||
| #else | ||||
|   /* Windows? */ | ||||
|   unsigned long flags; | ||||
| #endif | ||||
|   flags = nonblock; | ||||
|  | ||||
|   return ioctlsocket(sockfd, FIONBIO, &flags); | ||||
| @@ -574,9 +602,9 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server) | ||||
|   memset(&sockin, 0, sizeof(sockin)); | ||||
|   sockin.sin_family = AF_INET; | ||||
|   sockin.sin_addr = server->addr; | ||||
|   sockin.sin_port = channel->tcp_port; | ||||
|   sockin.sin_port = (unsigned short)(channel->tcp_port & 0xffff); | ||||
|   if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1) { | ||||
|     int err = GET_ERRNO(); | ||||
|     int err = SOCKERRNO; | ||||
|  | ||||
|     if (err != EINPROGRESS && err != EWOULDBLOCK) { | ||||
|       closesocket(s); | ||||
| @@ -607,7 +635,7 @@ static int open_udp_socket(ares_channel channel, struct server_state *server) | ||||
|   memset(&sockin, 0, sizeof(sockin)); | ||||
|   sockin.sin_family = AF_INET; | ||||
|   sockin.sin_addr = server->addr; | ||||
|   sockin.sin_port = channel->udp_port; | ||||
|   sockin.sin_port = (unsigned short)(channel->udp_port & 0xffff); | ||||
|   if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1) | ||||
|     { | ||||
|       closesocket(s); | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -18,6 +20,7 @@ | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <ctype.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| @@ -214,6 +217,7 @@ static int single_domain(ares_channel channel, const char *name, char **s) | ||||
|   char *line = NULL; | ||||
|   int linesize, status; | ||||
|   const char *p, *q; | ||||
|   int error; | ||||
|  | ||||
|   /* If the name contains a trailing dot, then the single query is the name | ||||
|    * sans the trailing dot. | ||||
| @@ -237,15 +241,15 @@ static int single_domain(ares_channel channel, const char *name, char **s) | ||||
|                      == ARES_SUCCESS) | ||||
|                 { | ||||
|                   if (strncasecmp(line, name, len) != 0 || | ||||
|                       !isspace((unsigned char)line[len])) | ||||
|                       !ISSPACE(line[len])) | ||||
|                     continue; | ||||
|                   p = line + len; | ||||
|                   while (isspace((unsigned char)*p)) | ||||
|                   while (ISSPACE(*p)) | ||||
|                     p++; | ||||
|                   if (*p) | ||||
|                     { | ||||
|                       q = p + 1; | ||||
|                       while (*q && !isspace((unsigned char)*q)) | ||||
|                       while (*q && !ISSPACE(*q)) | ||||
|                         q++; | ||||
|                       *s = malloc(q - p + 1); | ||||
|                       if (*s) | ||||
| @@ -263,6 +267,23 @@ static int single_domain(ares_channel channel, const char *name, char **s) | ||||
|               if (status != ARES_SUCCESS) | ||||
|                 return status; | ||||
|             } | ||||
|           else  | ||||
|             { | ||||
|               error = ERRNO; | ||||
|               switch(error)  | ||||
|                 { | ||||
|                 case ENOENT: | ||||
|                 case ESRCH: | ||||
|                   break; | ||||
|                 default: | ||||
|                   DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", | ||||
|                                  error, strerror(error))); | ||||
|                   DEBUGF(fprintf(stderr, "Error opening file: %s\n",  | ||||
|                                  hostaliases)); | ||||
|                   *s = NULL; | ||||
|                   return ARES_EFILE; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| @@ -71,14 +72,14 @@ void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen, | ||||
|     } | ||||
|  | ||||
|   /* Compute the query ID.  Start with no timeout. */ | ||||
|   query->qid = DNS_HEADER_QID(qbuf); | ||||
|   query->qid = (unsigned short)DNS_HEADER_QID(qbuf); | ||||
|   query->timeout = 0; | ||||
|  | ||||
|   /* Form the TCP query buffer by prepending qlen (as two | ||||
|    * network-order bytes) to qbuf. | ||||
|    */ | ||||
|   query->tcpbuf[0] = (qlen >> 8) & 0xff; | ||||
|   query->tcpbuf[1] = qlen & 0xff; | ||||
|   query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff); | ||||
|   query->tcpbuf[1] = (unsigned char)(qlen & 0xff); | ||||
|   memcpy(query->tcpbuf + 2, qbuf, qlen); | ||||
|   query->tcplen = qlen + 2; | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -39,9 +41,11 @@ const char *ares_strerror(int code) | ||||
|     "Out of memory", | ||||
|     "Channel is being destroyed", | ||||
|     "Misformatted string", | ||||
|     "Illegal flags specified" | ||||
|     "Illegal flags specified", | ||||
|     "Given hostname is not numeric", | ||||
|     "Illegal hints flags specified" | ||||
|   }; | ||||
|  | ||||
|   assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext))); | ||||
|   DEBUGASSERT(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext))); | ||||
|   return errtext[code]; | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
| @@ -14,7 +16,6 @@ | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #ifdef HAVE_SYS_TIME_H | ||||
| #include <sys/time.h> | ||||
|   | ||||
| @@ -5,13 +5,21 @@ | ||||
|  | ||||
| #define ARES_VERSION_MAJOR 1 | ||||
| #define ARES_VERSION_MINOR 3 | ||||
| #define ARES_VERSION_PATCH 1 | ||||
| #define ARES_VERSION_PATCH 3 | ||||
| #define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ | ||||
|                        (ARES_VERSION_MINOR<<8)|\ | ||||
|                        (ARES_VERSION_PATCH)) | ||||
| #define ARES_VERSION_STR "1.3.1" | ||||
| #define ARES_VERSION_STR "1.3.3-CVS" | ||||
|  | ||||
| #ifdef  __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| const char *ares_version(int *version); | ||||
|  | ||||
| #ifdef  __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") | ||||
|  * Copyright (c) 1996,1999 by Internet Software Consortium. | ||||
| @@ -17,9 +19,7 @@ | ||||
|  | ||||
| #ifndef HAVE_BITNCMP | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include "setup.h" | ||||
| #include "bitncmp.h" | ||||
|  | ||||
| /* | ||||
|   | ||||
| @@ -1,3 +1,6 @@ | ||||
| #ifndef __ARES_BITNCMP_H | ||||
| #define __ARES_BITNCMP_H | ||||
|  | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* | ||||
| @@ -14,13 +17,10 @@ | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| #ifndef BITNCMP_H | ||||
| #define BITNCMP_H | ||||
|  | ||||
| #ifndef HAVE_BITNCMP | ||||
| int ares_bitncmp(const void *l, const void *r, int n); | ||||
| #else | ||||
| #define ares_bitncmp(x,y,z) bitncmp(x,y,z) | ||||
| #endif | ||||
|  | ||||
| #endif /* BITNCMP_H */ | ||||
| #endif /* __ARES_BITNCMP_H */ | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|  | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright (C) 2004 - 2005 by Daniel Stenberg et al | ||||
| /* Copyright (C) 2004 - 2006 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 | ||||
| @@ -17,7 +17,7 @@ | ||||
|  */ | ||||
|  | ||||
| /* ================================================================ */ | ||||
| /*    ares/config-win32.h - Hand crafted config file for windows    */ | ||||
| /*    ares/config-win32.h - Hand crafted config file for Windows    */ | ||||
| /* ================================================================ */ | ||||
|  | ||||
| /* ---------------------------------------------------------------- */ | ||||
| @@ -29,6 +29,18 @@ | ||||
| #define HAVE_GETOPT_H 1 | ||||
| #endif | ||||
|  | ||||
| /* Define if you have the <signal.h> header file. */ | ||||
| #define HAVE_SIGNAL_H 1 | ||||
|  | ||||
| /* Define if you have the <sys/time.h> header file */ | ||||
| /* #define HAVE_SYS_TIME_H 1 */ | ||||
|  | ||||
| /* Define if you have the <time.h> header file.  */ | ||||
| #define HAVE_TIME_H 1 | ||||
|  | ||||
| /* Define if you have the <process.h> header file.  */ | ||||
| #define HAVE_PROCESS_H 1 | ||||
|  | ||||
| /* Define if you have the <unistd.h> header file.  */ | ||||
| #if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \ | ||||
|     defined(__POCC__) | ||||
| @@ -47,6 +59,19 @@ | ||||
| /* Define if you have the <ws2tcpip.h> header file.  */ | ||||
| #define HAVE_WS2TCPIP_H 1 | ||||
|  | ||||
| /* ---------------------------------------------------------------- */ | ||||
| /*                        OTHER HEADER INFO                         */ | ||||
| /* ---------------------------------------------------------------- */ | ||||
|  | ||||
| /* Define if sig_atomic_t is an available typedef. */ | ||||
| #define HAVE_SIG_ATOMIC_T 1 | ||||
|  | ||||
| /* Define if you have the ANSI C header files.  */ | ||||
| #define STDC_HEADERS 1 | ||||
|  | ||||
| /* Define if you can safely include both <sys/time.h> and <time.h>.  */ | ||||
| /* #define TIME_WITH_SYS_TIME 1 */ | ||||
|  | ||||
| /* ---------------------------------------------------------------- */ | ||||
| /*                             FUNCTIONS                            */ | ||||
| /* ---------------------------------------------------------------- */ | ||||
| @@ -54,6 +79,78 @@ | ||||
| /* Define if you have the ioctlsocket function.  */ | ||||
| #define HAVE_IOCTLSOCKET 1 | ||||
|  | ||||
| /* Define if you have the recv function. */ | ||||
| #define HAVE_RECV 1 | ||||
|  | ||||
| /* Define to the type of arg 1 for recv. */ | ||||
| #define RECV_TYPE_ARG1 SOCKET | ||||
|  | ||||
| /* Define to the type of arg 2 for recv. */ | ||||
| #define RECV_TYPE_ARG2 char * | ||||
|  | ||||
| /* Define to the type of arg 3 for recv. */ | ||||
| #define RECV_TYPE_ARG3 int | ||||
|  | ||||
| /* Define to the type of arg 4 for recv. */ | ||||
| #define RECV_TYPE_ARG4 int | ||||
|  | ||||
| /* Define to the function return type for recv. */ | ||||
| #define RECV_TYPE_RETV int | ||||
|  | ||||
| /* Define if you have the send function. */ | ||||
| #define HAVE_SEND 1 | ||||
|  | ||||
| /* Define to the type of arg 1 for send. */ | ||||
| #define SEND_TYPE_ARG1 SOCKET | ||||
|  | ||||
| /* Define to the type qualifier of arg 2 for send. */ | ||||
| #define SEND_QUAL_ARG2 const | ||||
|  | ||||
| /* Define to the type of arg 2 for send. */ | ||||
| #define SEND_TYPE_ARG2 char * | ||||
|  | ||||
| /* Define to the type of arg 3 for send. */ | ||||
| #define SEND_TYPE_ARG3 int | ||||
|  | ||||
| /* Define to the type of arg 4 for send. */ | ||||
| #define SEND_TYPE_ARG4 int | ||||
|  | ||||
| /* Define to the function return type for send. */ | ||||
| #define SEND_TYPE_RETV int | ||||
|  | ||||
| /* Specifics for the Watt-32 tcp/ip stack */ | ||||
| #ifdef WATT32 | ||||
|   #define SOCKET              int | ||||
|   #define NS_INADDRSZ         4 | ||||
|   #define HAVE_ARPA_NAMESER_H 1 | ||||
|   #undef HAVE_WINSOCK_H | ||||
|   #undef HAVE_WINSOCK2_H | ||||
|   #undef HAVE_WS2TCPIP_H | ||||
| #endif | ||||
|  | ||||
| /* ---------------------------------------------------------------- */ | ||||
| /*                       TYPEDEF REPLACEMENTS                       */ | ||||
| /* ---------------------------------------------------------------- */ | ||||
|  | ||||
| /* Define this if in_addr_t is not an available 'typedefed' type */ | ||||
| #define in_addr_t unsigned long | ||||
|  | ||||
| /* Define as the return type of signal handlers (int or void).  */ | ||||
| #define RETSIGTYPE void | ||||
|  | ||||
| /* Define ssize_t if it is not an available 'typedefed' type */ | ||||
| #if (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || defined(__POCC__) | ||||
| #elif defined(_WIN64) | ||||
| #define ssize_t __int64 | ||||
| #else | ||||
| #define ssize_t int | ||||
| #endif | ||||
|  | ||||
| /* Define to 'int' if socklen_t is not an available 'typedefed' type */ | ||||
| #ifndef HAVE_WS2TCPIP_H | ||||
| #define socklen_t int | ||||
| #endif | ||||
|  | ||||
| /* ---------------------------------------------------------------- */ | ||||
| /*                          STRUCT RELATED                          */ | ||||
| /* ---------------------------------------------------------------- */ | ||||
| @@ -64,6 +161,9 @@ | ||||
| /* Define this if you have struct sockaddr_storage */ | ||||
| #define HAVE_STRUCT_SOCKADDR_STORAGE 1 | ||||
|  | ||||
| /* Define this if you have struct timeval */ | ||||
| #define HAVE_STRUCT_TIMEVAL 1 | ||||
|  | ||||
| /* ---------------------------------------------------------------- */ | ||||
| /*                         IPV6 COMPATIBILITY                       */ | ||||
| /* ---------------------------------------------------------------- */ | ||||
|   | ||||
| @@ -7,6 +7,15 @@ AM_CONFIG_HEADER(config.h) | ||||
| AM_MAINTAINER_MODE | ||||
| AM_INIT_AUTOMAKE(c-ares, CVS) | ||||
|  | ||||
| dnl | ||||
| dnl Detect the canonical host and target build environment | ||||
| dnl | ||||
|  | ||||
| AC_CANONICAL_HOST | ||||
| dnl Get system canonical name | ||||
| AC_DEFINE_UNQUOTED(OS, "${host}", [cpu-machine-OS]) | ||||
|  | ||||
| AC_AIX | ||||
| AC_PROG_CC | ||||
| AC_PROG_INSTALL | ||||
|  | ||||
| @@ -16,10 +25,7 @@ solaris*) | ||||
| 	;; | ||||
| esac | ||||
|  | ||||
| AC_SEARCH_LIBS(gethostbyname, nsl) | ||||
| AC_SEARCH_LIBS(socket, socket) | ||||
|  | ||||
| dnl check for cygwin stuff | ||||
| dnl support building of Windows DLLs | ||||
| AC_LIBTOOL_WIN32_DLL | ||||
|  | ||||
| dnl ************************************************************ | ||||
| @@ -65,8 +71,31 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]), | ||||
|        AC_MSG_RESULT(no) | ||||
| ) | ||||
|  | ||||
| dnl skip libtool C++ and Fortran compiler checks | ||||
| m4_ifdef([AC_PROG_CXX], [m4_undefine([AC_PROG_CXX])]) | ||||
| m4_defun([AC_PROG_CXX],[]) | ||||
| m4_ifdef([AC_PROG_F77], [m4_undefine([AC_PROG_F77])]) | ||||
| m4_defun([AC_PROG_F77],[]) | ||||
|  | ||||
| dnl skip libtool C++ and Fortran linker checks | ||||
| m4_ifdef([AC_LIBTOOL_CXX], [m4_undefine([AC_LIBTOOL_CXX])]) | ||||
| m4_defun([AC_LIBTOOL_CXX],[]) | ||||
| m4_ifdef([AC_LIBTOOL_F77], [m4_undefine([AC_LIBTOOL_F77])]) | ||||
| m4_defun([AC_LIBTOOL_F77],[]) | ||||
|  | ||||
| dnl force libtool to build static libraries with PIC on AMD64-linux | ||||
| AC_MSG_CHECKING([if arch-OS host is AMD64-linux (to build static libraries with PIC)]) | ||||
| case $host in | ||||
|   x86_64*linux*) | ||||
|     AC_MSG_RESULT([yes]) | ||||
|     with_pic=yes | ||||
|     ;; | ||||
|   *) | ||||
|     AC_MSG_RESULT([no]) | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| dnl libtool setup | ||||
| CARES_CLEAR_LIBTOOL_TAGS | ||||
| AC_PROG_LIBTOOL | ||||
|  | ||||
| AC_MSG_CHECKING([if we need -no-undefined]) | ||||
| @@ -81,6 +110,209 @@ esac | ||||
| AC_MSG_RESULT($need_no_undefined) | ||||
| AM_CONDITIONAL(NO_UNDEFINED, test x$need_no_undefined = xyes) | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl check if this is the Intel ICC compiler, and if so make it stricter | ||||
| dnl (convert warning 147 into an error) so that it properly can detect the | ||||
| dnl gethostbyname_r() version | ||||
| dnl ********************************************************************** | ||||
| CURL_DETECT_ICC([CFLAGS="$CFLAGS -we 147"]) | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Checks for libraries. | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| dnl gethostbyname without lib or in the nsl lib? | ||||
| AC_CHECK_FUNC(gethostbyname, | ||||
|               [HAVE_GETHOSTBYNAME="1" | ||||
|               ], | ||||
|               [ AC_CHECK_LIB(nsl, gethostbyname, | ||||
|                              [HAVE_GETHOSTBYNAME="1" | ||||
|                              LIBS="$LIBS -lnsl" | ||||
|                              ]) | ||||
|               ]) | ||||
|  | ||||
| if test "$HAVE_GETHOSTBYNAME" != "1" | ||||
| then | ||||
|   dnl gethostbyname in the socket lib? | ||||
|   AC_CHECK_LIB(socket, gethostbyname, | ||||
|                [HAVE_GETHOSTBYNAME="1" | ||||
|                LIBS="$LIBS -lsocket" | ||||
|                ]) | ||||
| fi | ||||
|  | ||||
| dnl At least one system has been identified to require BOTH nsl and socket | ||||
| dnl libs at the same time to link properly. | ||||
| if test "$HAVE_GETHOSTBYNAME" != "1" | ||||
| then | ||||
|   AC_MSG_CHECKING([for gethostbyname with both nsl and socket libs]) | ||||
|   my_ac_save_LIBS=$LIBS | ||||
|   LIBS="-lnsl -lsocket $LIBS" | ||||
|   AC_TRY_LINK( , | ||||
|              [gethostbyname();], | ||||
|              [ dnl found it! | ||||
|              HAVE_GETHOSTBYNAME="1" | ||||
|              AC_MSG_RESULT([yes])], | ||||
|              [ dnl failed! | ||||
|              AC_MSG_RESULT([no]) | ||||
|              dnl restore LIBS | ||||
|              LIBS=$my_ac_save_LIBS] | ||||
|              ) | ||||
| fi | ||||
|  | ||||
| if test "$HAVE_GETHOSTBYNAME" != "1" | ||||
| then | ||||
|   dnl This is for Msys/Mingw | ||||
|   AC_MSG_CHECKING([for gethostbyname in ws2_32]) | ||||
|   my_ac_save_LIBS=$LIBS | ||||
|   LIBS="-lws2_32 $LIBS" | ||||
|   AC_TRY_LINK([#include <winsock2.h>], | ||||
|                [gethostbyname("www.dummysite.com");], | ||||
|                [ dnl worked! | ||||
|                ws2="yes" | ||||
|                AC_MSG_RESULT([yes]) | ||||
|                HAVE_GETHOSTBYNAME="1"], | ||||
|                [ dnl failed, restore LIBS | ||||
|                LIBS=$my_ac_save_LIBS | ||||
|                AC_MSG_RESULT(no)] | ||||
|              ) | ||||
| fi | ||||
|  | ||||
| if test "$HAVE_GETHOSTBYNAME" != "1" | ||||
| then | ||||
|   dnl This is for eCos with a stubbed DNS implementation | ||||
|   AC_MSG_CHECKING([for gethostbyname for eCos]) | ||||
|   AC_TRY_LINK([ | ||||
| #include <stdio.h> | ||||
| #include <netdb.h>], | ||||
|                [gethostbyname("www.dummysite.com");], | ||||
|                [ dnl worked! | ||||
|                AC_MSG_RESULT([yes]) | ||||
|                HAVE_GETHOSTBYNAME="1"], | ||||
|                AC_MSG_RESULT(no) | ||||
|              ) | ||||
| fi | ||||
|  | ||||
| if test "$HAVE_GETHOSTBYNAME" != "1" | ||||
| then | ||||
|   dnl gethostbyname in the net lib - for BeOS | ||||
|   AC_CHECK_LIB(net, gethostbyname, | ||||
|                [HAVE_GETHOSTBYNAME="1" | ||||
|                LIBS="$LIBS -lnet" | ||||
|                ]) | ||||
| fi | ||||
|  | ||||
|  | ||||
| if test "$HAVE_GETHOSTBYNAME" = "1"; then | ||||
|   AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [If you have gethostbyname]) | ||||
| else | ||||
|   AC_MSG_ERROR([couldn't find libraries for gethostbyname()]) | ||||
| fi | ||||
|  | ||||
| dnl resolve lib? | ||||
| AC_CHECK_FUNC(strcasecmp, , [ AC_CHECK_LIB(resolve, strcasecmp) ]) | ||||
|  | ||||
| if test "$ac_cv_lib_resolve_strcasecmp" = "$ac_cv_func_strcasecmp"; then | ||||
|   AC_CHECK_LIB(resolve, strcasecmp, | ||||
|               [LIBS="-lresolve $LIBS"], | ||||
|                , | ||||
|                -lnsl) | ||||
| fi | ||||
|  | ||||
| dnl socket lib? | ||||
| AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ]) | ||||
|  | ||||
| dnl dl lib? | ||||
| AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ]) | ||||
|  | ||||
| AC_MSG_CHECKING([whether to use libgcc]) | ||||
| AC_ARG_ENABLE(libgcc, | ||||
| AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]), | ||||
| [ case "$enableval" in | ||||
|   yes) | ||||
|         LIBS="$LIBS -lgcc" | ||||
|        AC_MSG_RESULT(yes) | ||||
|        ;; | ||||
|   *)   AC_MSG_RESULT(no) | ||||
|        ;; | ||||
|   esac ], | ||||
|        AC_MSG_RESULT(no) | ||||
| ) | ||||
|  | ||||
|  | ||||
| dnl Default is to try the thread-safe versions of a few functions | ||||
| OPT_THREAD=on | ||||
|  | ||||
| dnl detect AIX 4.3 or later | ||||
| AC_MSG_CHECKING([AIX 4.3 or later]) | ||||
| AC_PREPROC_IFELSE([ | ||||
| #if defined(_AIX) && defined(_AIX43) | ||||
| printf("just fine"); | ||||
| #else | ||||
| #error "this is not AIX 4.3 or later" | ||||
| #endif | ||||
| ], | ||||
|  [ AC_MSG_RESULT([yes]) | ||||
|    RECENTAIX=yes | ||||
|    OPT_THREAD=off ], | ||||
|  [ AC_MSG_RESULT([no]) ] | ||||
| ) | ||||
|  | ||||
| AC_ARG_ENABLE(thread,dnl | ||||
| AC_HELP_STRING([--disable-thread],[don't look for thread-safe functions]) | ||||
| AC_HELP_STRING([--enable-thread],[look for thread-safe functions]), | ||||
| [ case "$enableval" in | ||||
|   no) | ||||
|     OPT_THREAD=off | ||||
|     AC_MSG_WARN(c-ares will not get built using thread-safe functions) | ||||
|     ;; | ||||
|   *) | ||||
|     ;; | ||||
|   esac | ||||
| ] | ||||
| ) | ||||
|  | ||||
| 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]) | ||||
| fi | ||||
|  | ||||
| dnl for recent AIX versions, we skip all the thread-safe checks above since | ||||
| dnl they claim a thread-safe libc using the standard API. But there are | ||||
| dnl some functions still not thread-safe. Check for these! | ||||
|  | ||||
| dnl Let's hope this split URL remains working: | ||||
| dnl http://publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/aixprggd/ \ | ||||
| dnl genprogc/thread_quick_ref.htm | ||||
|  | ||||
| if test "x$RECENTAIX" = "xyes"; then | ||||
|  | ||||
|   AC_DEFINE(_THREAD_SAFE, 1, [define this if you need it to compile thread-safe code]) | ||||
|  | ||||
|   dnl check if this is the IBM xlc compiler | ||||
|   dnl Details thanks to => http://predef.sourceforge.net/ | ||||
|   AC_MSG_CHECKING([if this is the xlc compiler]) | ||||
|   AC_EGREP_CPP([^__xlC__], [__xlC__], | ||||
|          dnl action if the text is found, this it has not been replaced by the | ||||
|          dnl cpp | ||||
|          XLC="no" | ||||
|          AC_MSG_RESULT([no]), | ||||
|          dnl the text was not found, it was replaced by the cpp | ||||
|          XLC="yes" | ||||
|          AC_MSG_RESULT([yes]) | ||||
|          CFLAGS="$CFLAGS -qthreaded" | ||||
|          dnl AIX xlc has to have strict aliasing turned off. If not, | ||||
|          dnl the optimizer assumes that pointers can only point to | ||||
|          dnl an object of the same type. | ||||
|          CFLAGS="$CFLAGS -qnoansialias" | ||||
|        ) | ||||
| fi | ||||
|  | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Back to "normal" configuring | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| dnl Checks for header files. | ||||
| AC_HEADER_STDC | ||||
|  | ||||
| @@ -96,6 +328,8 @@ CURL_CHECK_HEADER_WINSOCK | ||||
| CURL_CHECK_HEADER_WINSOCK2 | ||||
| CURL_CHECK_HEADER_WS2TCPIP | ||||
|  | ||||
| CURL_CHECK_HEADER_MALLOC | ||||
|  | ||||
| dnl check for a few basic system headers we need | ||||
| AC_CHECK_HEADERS( | ||||
|        sys/types.h \ | ||||
| @@ -106,6 +340,8 @@ AC_CHECK_HEADERS( | ||||
|        netdb.h \ | ||||
|        netinet/in.h \ | ||||
|        net/if.h \ | ||||
|        errno.h \ | ||||
|        stdbool.h \ | ||||
|        arpa/nameser.h \ | ||||
|        arpa/nameser_compat.h \ | ||||
|        arpa/inet.h, | ||||
| @@ -142,6 +378,7 @@ dnl Checks for typedefs, structures, and compiler characteristics. | ||||
| AC_C_CONST | ||||
| AC_TYPE_SIZE_T | ||||
| AC_HEADER_TIME | ||||
| CURL_CHECK_STRUCT_TIMEVAL | ||||
|  | ||||
| AC_CHECK_SIZEOF(size_t) | ||||
| AC_CHECK_SIZEOF(long) | ||||
| @@ -166,6 +403,19 @@ fi | ||||
| AC_CHECK_TYPE(ssize_t, , | ||||
|    AC_DEFINE(ssize_t, int, [the signed version of size_t])) | ||||
|  | ||||
| # check for bool type | ||||
| AC_CHECK_TYPE([bool],[ | ||||
|   AC_DEFINE(HAVE_BOOL_T, 1, | ||||
|     [Define to 1 if bool is an available type.]) | ||||
| ], ,[ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_STDBOOL_H | ||||
| #include <stdbool.h> | ||||
| #endif | ||||
| ]) | ||||
|  | ||||
| # Check for socklen_t or equivalent | ||||
| CURL_CHECK_TYPE_SOCKLEN_T | ||||
|  | ||||
| @@ -173,6 +423,15 @@ TYPE_IN_ADDR_T | ||||
|  | ||||
| TYPE_SOCKADDR_STORAGE | ||||
|  | ||||
| TYPE_SIG_ATOMIC_T | ||||
|  | ||||
| AC_TYPE_SIGNAL | ||||
|  | ||||
| CURL_CHECK_FUNC_RECV | ||||
|  | ||||
| CURL_CHECK_FUNC_SEND | ||||
|  | ||||
| CURL_CHECK_MSG_NOSIGNAL | ||||
|  | ||||
| dnl check for AF_INET6 | ||||
| CARES_CHECK_CONSTANT( | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") | ||||
|  * Copyright (c) 1996,1999 by Internet Software Consortium. | ||||
| @@ -17,9 +19,6 @@ | ||||
|  | ||||
| #include "setup.h" | ||||
|  | ||||
|  | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| #else | ||||
| @@ -64,6 +63,11 @@ | ||||
|  * note: | ||||
|  *      network byte order assumed.  this means 192.5.5.240/28 has | ||||
|  *      0b11110000 in its fourth octet. | ||||
|  * note: | ||||
|  *      On Windows we store the error in the thread errno, not | ||||
|  *      in the winsock error code. This is to avoid loosing the | ||||
|  *      actual last winsock error. So use macro ERRNO to fetch the | ||||
|  *      errno this funtion sets when returning (-1), not SOCKERRNO. | ||||
|  * author: | ||||
|  *      Paul Vixie (ISC), June 1996 | ||||
|  */ | ||||
| @@ -77,15 +81,14 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | ||||
|  | ||||
|   ch = *src++; | ||||
|   if (ch == '0' && (src[0] == 'x' || src[0] == 'X') | ||||
|       && isascii((unsigned char)(src[1])) | ||||
|       && isxdigit((unsigned char)(src[1]))) { | ||||
|       && ISXDIGIT(src[1])) { | ||||
|     /* Hexadecimal: Eat nybble string. */ | ||||
|     if (size <= 0U) | ||||
|       goto emsgsize; | ||||
|     dirty = 0; | ||||
|     src++;  /* skip x or X. */ | ||||
|     while ((ch = *src++) != '\0' && isascii(ch) && isxdigit(ch)) { | ||||
|       if (isupper(ch)) | ||||
|     while ((ch = *src++) != '\0' && ISXDIGIT(ch)) { | ||||
|       if (ISUPPER(ch)) | ||||
|         ch = tolower(ch); | ||||
|       n = (int)(strchr(xdigits, ch) - xdigits); | ||||
|       if (dirty == 0) | ||||
| @@ -104,7 +107,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | ||||
|         goto emsgsize; | ||||
|       *dst++ = (unsigned char) (tmp << 4); | ||||
|     } | ||||
|   } else if (isascii(ch) && isdigit(ch)) { | ||||
|   } else if (ISDIGIT(ch)) { | ||||
|     /* Decimal: eat dotted digit string. */ | ||||
|     for (;;) { | ||||
|       tmp = 0; | ||||
| @@ -115,7 +118,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | ||||
|         if (tmp > 255) | ||||
|           goto enoent; | ||||
|       } while ((ch = *src++) != '\0' && | ||||
|                isascii(ch) && isdigit(ch)); | ||||
|                ISDIGIT(ch)); | ||||
|       if (size-- <= 0U) | ||||
|         goto emsgsize; | ||||
|       *dst++ = (unsigned char) tmp; | ||||
| @@ -124,15 +127,15 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | ||||
|       if (ch != '.') | ||||
|         goto enoent; | ||||
|       ch = *src++; | ||||
|       if (!isascii(ch) || !isdigit(ch)) | ||||
|       if (!ISDIGIT(ch)) | ||||
|         goto enoent; | ||||
|     } | ||||
|   } else | ||||
|     goto enoent; | ||||
|  | ||||
|   bits = -1; | ||||
|   if (ch == '/' && isascii((unsigned char)(src[0])) && | ||||
|       isdigit((unsigned char)(src[0])) && dst > odst) { | ||||
|   if (ch == '/' && | ||||
|       ISDIGIT(src[0]) && dst > odst) { | ||||
|     /* CIDR width specifier.  Nothing can follow it. */ | ||||
|     ch = *src++;    /* Skip over the /. */ | ||||
|     bits = 0; | ||||
| @@ -140,7 +143,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | ||||
|       n = (int)(strchr(digits, ch) - digits); | ||||
|       bits *= 10; | ||||
|       bits += n; | ||||
|     } while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch)); | ||||
|     } while ((ch = *src++) != '\0' && ISDIGIT(ch)); | ||||
|     if (ch != '\0') | ||||
|       goto enoent; | ||||
|     if (bits > 32) | ||||
| @@ -185,11 +188,11 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | ||||
|   return (bits); | ||||
|  | ||||
|   enoent: | ||||
|   errno = ENOENT; | ||||
|   SET_ERRNO(ENOENT); | ||||
|   return (-1); | ||||
|  | ||||
|   emsgsize: | ||||
|   errno = EMSGSIZE; | ||||
|   SET_ERRNO(EMSGSIZE); | ||||
|   return (-1); | ||||
| } | ||||
|  | ||||
| @@ -251,7 +254,7 @@ getv4(const char *src, unsigned char *dst, int *bitsp) | ||||
|     if (ch == '.' || ch == '/') { | ||||
|       if (dst - odst > 3)             /* too many octets? */ | ||||
|         return (0); | ||||
|       *dst++ = val; | ||||
|       *dst++ = (unsigned char)val; | ||||
|       if (ch == '/') | ||||
|         return (getbits(src, bitsp)); | ||||
|       val = 0; | ||||
| @@ -264,7 +267,7 @@ getv4(const char *src, unsigned char *dst, int *bitsp) | ||||
|     return (0); | ||||
|   if (dst - odst > 3)             /* too many octets? */ | ||||
|     return (0); | ||||
|   *dst++ = val; | ||||
|   *dst++ = (unsigned char)val; | ||||
|   return (1); | ||||
| } | ||||
|  | ||||
| @@ -320,8 +323,8 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) | ||||
|         goto enoent; | ||||
|       if (tp + NS_INT16SZ > endp) | ||||
|         return (0); | ||||
|       *tp++ = (unsigned char) (val >> 8) & 0xff; | ||||
|       *tp++ = (unsigned char) val & 0xff; | ||||
|       *tp++ = (unsigned char)((val >> 8) & 0xff); | ||||
|       *tp++ = (unsigned char)(val & 0xff); | ||||
|       saw_xdigit = 0; | ||||
|       digits = 0; | ||||
|       val = 0; | ||||
| @@ -341,8 +344,8 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) | ||||
|   if (saw_xdigit) { | ||||
|     if (tp + NS_INT16SZ > endp) | ||||
|       goto enoent; | ||||
|     *tp++ = (unsigned char) (val >> 8) & 0xff; | ||||
|     *tp++ = (unsigned char) val & 0xff; | ||||
|     *tp++ = (unsigned char)((val >> 8) & 0xff); | ||||
|     *tp++ = (unsigned char)(val & 0xff); | ||||
|   } | ||||
|   if (bits == -1) | ||||
|     bits = 128; | ||||
| @@ -380,11 +383,11 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) | ||||
|   return (bits); | ||||
|  | ||||
|   enoent: | ||||
|   errno = ENOENT; | ||||
|   SET_ERRNO(ENOENT); | ||||
|   return (-1); | ||||
|  | ||||
|   emsgsize: | ||||
|   errno = EMSGSIZE; | ||||
|   SET_ERRNO(EMSGSIZE); | ||||
|   return (-1); | ||||
| } | ||||
|  | ||||
| @@ -398,6 +401,11 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) | ||||
|  *      number of bits, either imputed classfully or specified with /CIDR, | ||||
|  *      or -1 if some failure occurred (check errno).  ENOENT means it was | ||||
|  *      not a valid network specification. | ||||
|  * note: | ||||
|  *      On Windows we store the error in the thread errno, not | ||||
|  *      in the winsock error code. This is to avoid loosing the | ||||
|  *      actual last winsock error. So use macro ERRNO to fetch the | ||||
|  *      errno this funtion sets when returning (-1), not SOCKERRNO. | ||||
|  * author: | ||||
|  *      Paul Vixie (ISC), June 1996 | ||||
|  */ | ||||
| @@ -410,7 +418,7 @@ ares_inet_net_pton(int af, const char *src, void *dst, size_t size) | ||||
|   case AF_INET6: | ||||
|     return (inet_net_pton_ipv6(src, dst, size)); | ||||
|   default: | ||||
|     errno = EAFNOSUPPORT; | ||||
|     SET_ERRNO(EAFNOSUPPORT); | ||||
|     return (-1); | ||||
|   } | ||||
| } | ||||
| @@ -428,11 +436,11 @@ int ares_inet_pton(int af, const char *src, void *dst) | ||||
|     size = sizeof(struct in6_addr); | ||||
|   else | ||||
|   { | ||||
|     errno = EAFNOSUPPORT; | ||||
|     SET_ERRNO(EAFNOSUPPORT); | ||||
|     return -1; | ||||
|   } | ||||
|   result = ares_inet_net_pton(af, src, dst, size); | ||||
|   if (result == -1 && errno == ENOENT) | ||||
|   if (result == -1 && ERRNO == ENOENT) | ||||
|     return 0; | ||||
|   return (result > -1 ? 1 : -1); | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,6 @@ | ||||
| #ifndef __ARES_INET_NET_PTON_H | ||||
| #define __ARES_INET_NET_PTON_H | ||||
|  | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* | ||||
| @@ -14,9 +17,6 @@ | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| #ifndef INET_NET_PTON_H | ||||
| #define INET_NET_PTON_H | ||||
|  | ||||
| #if defined(HAVE_INET_PTON) && defined(HAVE_INET_PTON_IPV6) | ||||
| #define ares_inet_pton(x,y,z) inet_pton(x,y,z) | ||||
| #else | ||||
| @@ -28,4 +28,4 @@ int ares_inet_pton(int af, const char *src, void *dst); | ||||
| int ares_inet_net_pton(int af, const char *src, void *dst, size_t size); | ||||
| #endif | ||||
|  | ||||
| #endif /* INET_NET_PTON_H */ | ||||
| #endif /* __ARES_INET_NET_PTON_H */ | ||||
|   | ||||
| @@ -18,8 +18,6 @@ | ||||
|  | ||||
| #include "setup.h" | ||||
|  | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| #else | ||||
| @@ -68,6 +66,11 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size); | ||||
|  *     convert a network format address to presentation format. | ||||
|  * return: | ||||
|  *     pointer to presentation format address (`dst'), or NULL (see errno). | ||||
|  * note: | ||||
|  *      On Windows we store the error in the thread errno, not | ||||
|  *      in the winsock error code. This is to avoid loosing the | ||||
|  *      actual last winsock error. So use macro ERRNO to fetch the | ||||
|  *      errno this funtion sets when returning NULL, not SOCKERRNO. | ||||
|  * author: | ||||
|  *     Paul Vixie, 1996. | ||||
|  */ | ||||
| @@ -81,7 +84,7 @@ ares_inet_ntop(int af, const void *src, char *dst, size_t size) | ||||
|     case AF_INET6: | ||||
|       return (inet_ntop6(src, dst, size)); | ||||
|     default: | ||||
|       errno = EAFNOSUPPORT; | ||||
|       SET_ERRNO(EAFNOSUPPORT); | ||||
|       return (NULL); | ||||
|     } | ||||
|   /* NOTREACHED */ | ||||
| @@ -106,7 +109,7 @@ inet_ntop4(const unsigned char *src, char *dst, size_t size) | ||||
|  | ||||
|   if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) | ||||
|     { | ||||
|       errno = ENOSPC; | ||||
|       SET_ERRNO(ENOSPC); | ||||
|       return (NULL); | ||||
|     } | ||||
|     strcpy(dst, tmp); | ||||
| @@ -129,9 +132,13 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||
|    * Keep this in mind if you think this function should have been coded | ||||
|    * to use pointer overlays.  All the world's not a VAX. | ||||
|    */ | ||||
|   char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; | ||||
|   struct { int base, len; } best = { 0,0 }, cur = { 0,0 }; | ||||
|   unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; | ||||
|   char tmp[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")]; | ||||
|   char *tp; | ||||
|   struct { | ||||
|     long base; | ||||
|     long len; | ||||
|   } best, cur; | ||||
|   unsigned long words[NS_IN6ADDRSZ / NS_INT16SZ]; | ||||
|   int i; | ||||
|  | ||||
|   /* | ||||
| @@ -139,11 +146,15 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||
|    *  Copy the input (bytewise) array into a wordwise array. | ||||
|    *  Find the longest run of 0x00's in src[] for :: shorthanding. | ||||
|    */ | ||||
|   memset(words, '\0', sizeof words); | ||||
|   memset(words, '\0', sizeof(words)); | ||||
|   for (i = 0; i < NS_IN6ADDRSZ; i++) | ||||
|       words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); | ||||
|  | ||||
|   best.base = -1; | ||||
|   cur.base = -1; | ||||
|   best.len = 0; | ||||
|   cur.len = 0; | ||||
|  | ||||
|   for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) | ||||
|     { | ||||
|       if (words[i] == 0) | ||||
| @@ -192,12 +203,12 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||
|       if (i == 6 && best.base == 0 && | ||||
|           (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) | ||||
|         { | ||||
|           if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) | ||||
|           if (!inet_ntop4(src+12, tp, sizeof(tmp) - (tp - tmp))) | ||||
|             return (NULL); | ||||
|           tp += strlen(tp); | ||||
|           break; | ||||
|         } | ||||
|         tp += SPRINTF((tp, "%x", words[i])); | ||||
|         tp += SPRINTF((tp, "%lx", words[i])); | ||||
|     } | ||||
|  | ||||
|   /* Was it a trailing run of 0x00's? */ | ||||
| @@ -210,7 +221,7 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size) | ||||
|    */ | ||||
|   if ((size_t)(tp - tmp) > size) | ||||
|     { | ||||
|       errno = ENOSPC; | ||||
|       SET_ERRNO(ENOSPC); | ||||
|       return (NULL); | ||||
|     } | ||||
|   strcpy(dst, tmp); | ||||
|   | ||||
| @@ -1,3 +1,6 @@ | ||||
| #ifndef __ARES_INET_NTOP_H | ||||
| #define __ARES_INET_NTOP_H | ||||
|  | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* | ||||
| @@ -14,13 +17,10 @@ | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| #ifndef INET_NTOP_H | ||||
| #define INET_NTOP_H | ||||
|  | ||||
| #ifdef HAVE_INET_NTOP | ||||
| #if defined(HAVE_INET_NTOP) && defined(HAVE_INET_NTOP_IPV6) | ||||
| #define ares_inet_ntop(w,x,y,z) inet_ntop(w,x,y,z) | ||||
| #else | ||||
| const char *ares_inet_ntop(int af, const void *src, char *dst, size_t size); | ||||
| #endif | ||||
|  | ||||
| #endif /* INET_NET_NTOP_H */ | ||||
| #endif /* __ARES_INET_NTOP_H */ | ||||
|   | ||||
| @@ -7,7 +7,9 @@ | ||||
|    port build */ | ||||
|  | ||||
| #ifndef NETWARE | ||||
| #ifndef __CYGWIN__ | ||||
| #include <windows.h> | ||||
| #endif | ||||
| #include <process.h> /* for the _getpid() proto */ | ||||
| #endif  /* !NETWARE */ | ||||
| #include <sys/types.h> | ||||
| @@ -16,11 +18,6 @@ | ||||
|  | ||||
| #define MAXHOSTNAMELEN 256 | ||||
|  | ||||
| #define EINPROGRESS WSAEINPROGRESS | ||||
| #define EWOULDBLOCK WSAEWOULDBLOCK | ||||
| #define EMSGSIZE     WSAEMSGSIZE | ||||
| #define EAFNOSUPPORT WSAEAFNOSUPPORT | ||||
|  | ||||
| /* Structure for scatter/gather I/O.  */ | ||||
| struct iovec | ||||
| { | ||||
| @@ -28,7 +25,9 @@ struct iovec | ||||
|     size_t iov_len;     /* Length of data.  */ | ||||
| }; | ||||
|  | ||||
| #ifndef __WATCOMC__ | ||||
| #define getpid() _getpid() | ||||
| #endif | ||||
|  | ||||
| int ares_writev (SOCKET s, const struct iovec *vector, size_t count); | ||||
| #define writev(s,vect,count)  ares_writev(s,vect,count) | ||||
|   | ||||
							
								
								
									
										36
									
								
								ares/setup.h
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								ares/setup.h
									
									
									
									
									
								
							| @@ -1,6 +1,8 @@ | ||||
| #ifndef __ARES_SETUP_H | ||||
| #define __ARES_SETUP_H | ||||
|  | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright (C) 2004 - 2005 by Daniel Stenberg et al | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software and its | ||||
| @@ -43,7 +45,11 @@ | ||||
|  * 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. | ||||
|  * to any other further and independant block.  Under Cygwin things work | ||||
|  * just as under linux (e.g. <sys/socket.h>) and the winsock headers should | ||||
|  * never be included when __CYGWIN__ is defined.  configure script takes | ||||
|  * care of this, not defining HAVE_WINDOWS_H, HAVE_WINSOCK_H, HAVE_WINSOCK2_H, | ||||
|  * neither HAVE_WS2TCPIP_H when __CYGWIN__ is defined. | ||||
|  */ | ||||
|  | ||||
| #ifdef HAVE_WINDOWS_H | ||||
| @@ -63,6 +69,22 @@ | ||||
| #  endif | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Define USE_WINSOCK to 2 if we have and use WINSOCK2 API, else | ||||
|  * define USE_WINSOCK to 1 if we have and use WINSOCK  API, else | ||||
|  * undefine USE_WINSOCK. | ||||
|  */ | ||||
|  | ||||
| #undef USE_WINSOCK | ||||
|  | ||||
| #ifdef HAVE_WINSOCK2_H | ||||
| #  define USE_WINSOCK 2 | ||||
| #else | ||||
| #  ifdef HAVE_WINSOCK_H | ||||
| #    define USE_WINSOCK 1 | ||||
| #  endif | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Work-arounds for systems without configure support | ||||
|  */ | ||||
| @@ -99,7 +121,7 @@ | ||||
|  * Typedef our socket type | ||||
|  */ | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #ifdef USE_WINSOCK | ||||
| typedef SOCKET ares_socket_t; | ||||
| #define ARES_SOCKET_BAD INVALID_SOCKET | ||||
| #else | ||||
| @@ -111,7 +133,7 @@ typedef int ares_socket_t; | ||||
|  * Assume a few thing unless they're set by configure | ||||
|  */ | ||||
|  | ||||
| #if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) | ||||
| #if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__) | ||||
| #define HAVE_SYS_TIME_H | ||||
| #endif | ||||
|  | ||||
| @@ -145,4 +167,12 @@ int ares_strcasecmp(const char *s1, const char *s2); | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Include macros and defines that should only be processed once. | ||||
|  */ | ||||
|  | ||||
| #ifndef __SETUP_ONCE_H | ||||
| #include "setup_once.h" | ||||
| #endif | ||||
|  | ||||
| #endif /* __ARES_SETUP_H */ | ||||
|   | ||||
							
								
								
									
										341
									
								
								ares/setup_once.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										341
									
								
								ares/setup_once.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,341 @@ | ||||
| #ifndef __SETUP_ONCE_H | ||||
| #define __SETUP_ONCE_H | ||||
|  | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* Copyright (C) 2004 - 2007 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. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| /******************************************************************** | ||||
|  *                              NOTICE                              * | ||||
|  *                             ========                             * | ||||
|  *                                                                  * | ||||
|  *  Content of header files lib/setup_once.h and ares/setup_once.h  * | ||||
|  *  must be kept in sync. Modify the other one if you change this.  * | ||||
|  *                                                                  * | ||||
|  ********************************************************************/ | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Inclusion of common header files. | ||||
|  */ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <stdarg.h> | ||||
| #include <ctype.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_SYS_STAT_H | ||||
| #include <sys/stat.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_SYS_TIME_H | ||||
| #include <sys/time.h> | ||||
| #ifdef TIME_WITH_SYS_TIME | ||||
| #include <time.h> | ||||
| #endif | ||||
| #else | ||||
| #ifdef HAVE_TIME_H | ||||
| #include <time.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #include <io.h> | ||||
| #include <fcntl.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_STDBOOL_H | ||||
| #include <stdbool.h> | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Definition of timeval struct for platforms that don't have it. | ||||
|  */ | ||||
|  | ||||
| #ifndef HAVE_STRUCT_TIMEVAL | ||||
| struct timeval { | ||||
|  long tv_sec; | ||||
|  long tv_usec; | ||||
| }; | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * If we have the MSG_NOSIGNAL define, make sure we use | ||||
|  * it as the fourth argument of function send() | ||||
|  */ | ||||
|  | ||||
| #ifdef HAVE_MSG_NOSIGNAL | ||||
| #define SEND_4TH_ARG MSG_NOSIGNAL | ||||
| #else | ||||
| #define SEND_4TH_ARG 0 | ||||
| #endif  | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * The definitions for the return type and arguments types | ||||
|  * of functions recv() and send() belong and come from the | ||||
|  * configuration file. Do not define them in any other place. | ||||
|  * | ||||
|  * HAVE_RECV is defined if you have a function named recv() | ||||
|  * which is used to read incoming data from sockets. If your | ||||
|  * function has another name then don't define HAVE_RECV. | ||||
|  * | ||||
|  * If HAVE_RECV is defined then RECV_TYPE_ARG1, RECV_TYPE_ARG2, | ||||
|  * RECV_TYPE_ARG3, RECV_TYPE_ARG4 and RECV_TYPE_RETV must also | ||||
|  * be defined. | ||||
|  * | ||||
|  * HAVE_SEND is defined if you have a function named send() | ||||
|  * which is used to write outgoing data on a connected socket. | ||||
|  * If yours has another name then don't define HAVE_SEND. | ||||
|  * | ||||
|  * If HAVE_SEND is defined then SEND_TYPE_ARG1, SEND_QUAL_ARG2, | ||||
|  * SEND_TYPE_ARG2, SEND_TYPE_ARG3, SEND_TYPE_ARG4 and | ||||
|  * SEND_TYPE_RETV must also be defined. | ||||
|  */ | ||||
|  | ||||
| #ifdef HAVE_RECV | ||||
| #if !defined(RECV_TYPE_ARG1) || \ | ||||
|     !defined(RECV_TYPE_ARG2) || \ | ||||
|     !defined(RECV_TYPE_ARG3) || \ | ||||
|     !defined(RECV_TYPE_ARG4) || \ | ||||
|     !defined(RECV_TYPE_RETV) | ||||
|   /* */ | ||||
|   Error Missing_definition_of_return_and_arguments_types_of_recv | ||||
|   /* */ | ||||
| #else | ||||
| #define sread(x,y,z) (ssize_t)recv((RECV_TYPE_ARG1)(x), \ | ||||
|                                    (RECV_TYPE_ARG2)(y), \ | ||||
|                                    (RECV_TYPE_ARG3)(z), \ | ||||
|                                    (RECV_TYPE_ARG4)(0)) | ||||
| #endif | ||||
| #else /* HAVE_RECV */ | ||||
| #ifndef sread | ||||
|   /* */ | ||||
|   Error Missing_definition_of_macro_sread | ||||
|   /* */ | ||||
| #endif | ||||
| #endif /* HAVE_RECV */ | ||||
|  | ||||
| #ifdef HAVE_SEND | ||||
| #if !defined(SEND_TYPE_ARG1) || \ | ||||
|     !defined(SEND_QUAL_ARG2) || \ | ||||
|     !defined(SEND_TYPE_ARG2) || \ | ||||
|     !defined(SEND_TYPE_ARG3) || \ | ||||
|     !defined(SEND_TYPE_ARG4) || \ | ||||
|     !defined(SEND_TYPE_RETV) | ||||
|   /* */ | ||||
|   Error Missing_definition_of_return_and_arguments_types_of_send | ||||
|   /* */ | ||||
| #else | ||||
| #define swrite(x,y,z) (ssize_t)send((SEND_TYPE_ARG1)(x), \ | ||||
|                                     (SEND_TYPE_ARG2)(y), \ | ||||
|                                     (SEND_TYPE_ARG3)(z), \ | ||||
|                                     (SEND_TYPE_ARG4)(SEND_4TH_ARG)) | ||||
| #endif | ||||
| #else /* HAVE_SEND */ | ||||
| #ifndef swrite | ||||
|   /* */ | ||||
|   Error Missing_definition_of_macro_swrite | ||||
|   /* */ | ||||
| #endif | ||||
| #endif /* HAVE_SEND */ | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Uppercase macro versions of ANSI/ISO is*() functions/macros which  | ||||
|  * avoid negative number inputs with argument byte codes > 127. | ||||
|  */ | ||||
|  | ||||
| #define ISSPACE(x)  (isspace((int)  ((unsigned char)x))) | ||||
| #define ISDIGIT(x)  (isdigit((int)  ((unsigned char)x))) | ||||
| #define ISALNUM(x)  (isalnum((int)  ((unsigned char)x))) | ||||
| #define ISXDIGIT(x) (isxdigit((int) ((unsigned char)x))) | ||||
| #define ISGRAPH(x)  (isgraph((int)  ((unsigned char)x))) | ||||
| #define ISALPHA(x)  (isalpha((int)  ((unsigned char)x))) | ||||
| #define ISPRINT(x)  (isprint((int)  ((unsigned char)x))) | ||||
| #define ISUPPER(x)  (isupper((int)  ((unsigned char)x))) | ||||
| #define ISLOWER(x)  (islower((int)  ((unsigned char)x))) | ||||
|  | ||||
| #define ISBLANK(x)  (int)((((unsigned char)x) == ' ') || \ | ||||
|                           (((unsigned char)x) == '\t')) | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Typedef to 'unsigned char' if bool is not an available 'typedefed' type. | ||||
|  */ | ||||
|  | ||||
| #ifndef HAVE_BOOL_T | ||||
| typedef unsigned char bool; | ||||
| #define HAVE_BOOL_T | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Default definition of uppercase TRUE and FALSE. | ||||
|  */ | ||||
|  | ||||
| #ifndef TRUE | ||||
| #define TRUE 1 | ||||
| #endif | ||||
| #ifndef FALSE | ||||
| #define FALSE 0 | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Typedef to 'int' if sig_atomic_t is not an available 'typedefed' type. | ||||
|  */ | ||||
|  | ||||
| #ifndef HAVE_SIG_ATOMIC_T | ||||
| typedef int sig_atomic_t; | ||||
| #define HAVE_SIG_ATOMIC_T | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Convenience SIG_ATOMIC_T definition | ||||
|  */ | ||||
|  | ||||
| #ifdef HAVE_SIG_ATOMIC_T_VOLATILE | ||||
| #define SIG_ATOMIC_T static sig_atomic_t | ||||
| #else | ||||
| #define SIG_ATOMIC_T static volatile sig_atomic_t | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Default return type for signal handlers. | ||||
|  */ | ||||
|  | ||||
| #ifndef RETSIGTYPE | ||||
| #define RETSIGTYPE void | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Macro used to include code only in debug builds. | ||||
|  */ | ||||
|  | ||||
| #ifdef CURLDEBUG | ||||
| #define DEBUGF(x) x | ||||
| #else | ||||
| #define DEBUGF(x) do { } while (0) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Macro used to include assertion code only in debug builds. | ||||
|  */ | ||||
|  | ||||
| #if defined(CURLDEBUG) && defined(HAVE_ASSERT_H) | ||||
| #define DEBUGASSERT(x) assert(x) | ||||
| #else | ||||
| #define DEBUGASSERT(x) do { } while (0) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Macro SOCKERRNO / SET_SOCKERRNO() returns / sets the *socket-related* errno | ||||
|  * (or equivalent) on this platform to hide platform details to code using it. | ||||
|  */ | ||||
|  | ||||
| #ifdef USE_WINSOCK | ||||
| #define SOCKERRNO         ((int)WSAGetLastError()) | ||||
| #define SET_SOCKERRNO(x)  (WSASetLastError((int)(x))) | ||||
| #else | ||||
| #define SOCKERRNO         (errno) | ||||
| #define SET_SOCKERRNO(x)  (errno = (x)) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Macro ERRNO / SET_ERRNO() returns / sets the NOT *socket-related* errno | ||||
|  * (or equivalent) on this platform to hide platform details to code using it. | ||||
|  */ | ||||
|  | ||||
| #ifdef WIN32 | ||||
| #define ERRNO         ((int)GetLastError()) | ||||
| #define SET_ERRNO(x)  (SetLastError((DWORD)(x))) | ||||
| #else | ||||
| #define ERRNO         (errno) | ||||
| #define SET_ERRNO(x)  (errno = (x)) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Portable error number symbolic names defined to Winsock error codes. | ||||
|  */ | ||||
|  | ||||
| #ifdef USE_WINSOCK | ||||
| #undef  EBADF            /* override definition in errno.h */ | ||||
| #define EBADF            WSAEBADF | ||||
| #undef  EINTR            /* override definition in errno.h */ | ||||
| #define EINTR            WSAEINTR | ||||
| #undef  EINVAL           /* override definition in errno.h */ | ||||
| #define EINVAL           WSAEINVAL | ||||
| #define EWOULDBLOCK      WSAEWOULDBLOCK | ||||
| #define EINPROGRESS      WSAEINPROGRESS | ||||
| #define EALREADY         WSAEALREADY | ||||
| #define ENOTSOCK         WSAENOTSOCK | ||||
| #define EDESTADDRREQ     WSAEDESTADDRREQ | ||||
| #define EMSGSIZE         WSAEMSGSIZE | ||||
| #define EPROTOTYPE       WSAEPROTOTYPE | ||||
| #define ENOPROTOOPT      WSAENOPROTOOPT | ||||
| #define EPROTONOSUPPORT  WSAEPROTONOSUPPORT | ||||
| #define ESOCKTNOSUPPORT  WSAESOCKTNOSUPPORT | ||||
| #define EOPNOTSUPP       WSAEOPNOTSUPP | ||||
| #define EPFNOSUPPORT     WSAEPFNOSUPPORT | ||||
| #define EAFNOSUPPORT     WSAEAFNOSUPPORT | ||||
| #define EADDRINUSE       WSAEADDRINUSE | ||||
| #define EADDRNOTAVAIL    WSAEADDRNOTAVAIL | ||||
| #define ENETDOWN         WSAENETDOWN | ||||
| #define ENETUNREACH      WSAENETUNREACH | ||||
| #define ENETRESET        WSAENETRESET | ||||
| #define ECONNABORTED     WSAECONNABORTED | ||||
| #define ECONNRESET       WSAECONNRESET | ||||
| #define ENOBUFS          WSAENOBUFS | ||||
| #define EISCONN          WSAEISCONN | ||||
| #define ENOTCONN         WSAENOTCONN | ||||
| #define ESHUTDOWN        WSAESHUTDOWN | ||||
| #define ETOOMANYREFS     WSAETOOMANYREFS | ||||
| #define ETIMEDOUT        WSAETIMEDOUT | ||||
| #define ECONNREFUSED     WSAECONNREFUSED | ||||
| #define ELOOP            WSAELOOP | ||||
| #ifndef ENAMETOOLONG     /* possible previous definition in errno.h */ | ||||
| #define ENAMETOOLONG     WSAENAMETOOLONG | ||||
| #endif | ||||
| #define EHOSTDOWN        WSAEHOSTDOWN | ||||
| #define EHOSTUNREACH     WSAEHOSTUNREACH | ||||
| #ifndef ENOTEMPTY        /* possible previous definition in errno.h */ | ||||
| #define ENOTEMPTY        WSAENOTEMPTY | ||||
| #endif | ||||
| #define EPROCLIM         WSAEPROCLIM | ||||
| #define EUSERS           WSAEUSERS | ||||
| #define EDQUOT           WSAEDQUOT | ||||
| #define ESTALE           WSAESTALE | ||||
| #define EREMOTE          WSAEREMOTE | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif /* __SETUP_ONCE_H */ | ||||
|  | ||||
| @@ -129,6 +129,10 @@ SOURCE=..\..\ares_gethostbyname.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_getsock.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|  | ||||
| SOURCE=..\..\ares_init.c | ||||
| # End Source File | ||||
| # Begin Source File | ||||
|   | ||||
| @@ -1,5 +1,7 @@ | ||||
| #include "setup.h" | ||||
|  | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* only do the following on windows | ||||
|  */ | ||||
| #if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) | ||||
| @@ -18,6 +20,20 @@ | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| #ifdef __WATCOMC__ | ||||
| /* | ||||
|  * Watcom needs a DllMain() in order to initialise the clib startup code. | ||||
|  */ | ||||
| BOOL | ||||
| WINAPI DllMain (HINSTANCE hnd, DWORD reason, LPVOID reserved) | ||||
| { | ||||
|   (void) hnd; | ||||
|   (void) reason; | ||||
|   (void) reserved; | ||||
|   return (TRUE); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #ifndef __MINGW32__ | ||||
| int | ||||
| ares_strncasecmp(const char *a, const char *b, int n) | ||||
| @@ -25,8 +41,8 @@ ares_strncasecmp(const char *a, const char *b, int n) | ||||
|     int i; | ||||
|  | ||||
|     for (i = 0; i < n; i++) { | ||||
|         int c1 = isupper(a[i]) ? tolower(a[i]) : a[i]; | ||||
|         int c2 = isupper(b[i]) ? tolower(b[i]) : b[i]; | ||||
|         int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i]; | ||||
|         int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i]; | ||||
|         if (c1 != c2) return c1-c2; | ||||
|     } | ||||
|     return 0; | ||||
| @@ -89,7 +105,7 @@ ares_writev (ares_socket_t s, const struct iovec *vector, size_t count) | ||||
|   buffer = bp = (char*) alloca (bytes); | ||||
|   if (!buffer) | ||||
|   { | ||||
|     errno = ENOMEM; | ||||
|     SET_ERRNO(ENOMEM); | ||||
|     return (-1); | ||||
|   } | ||||
|  | ||||
| @@ -100,6 +116,6 @@ ares_writev (ares_socket_t s, const struct iovec *vector, size_t count) | ||||
|     memcpy (bp, vector[i].iov_base, vector[i].iov_len); | ||||
|     bp += vector[i].iov_len; | ||||
|   } | ||||
|   return send (s, (const void*)buffer, bytes, 0); | ||||
|   return (int)swrite(s, buffer, bytes); | ||||
| } | ||||
| #endif /* WIN32 builds only */ | ||||
|   | ||||
| @@ -6,7 +6,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 | ||||
| @@ -140,7 +140,7 @@ else | ||||
|   libtoolize=`findtool $LIBTOOLIZE` | ||||
| fi | ||||
|  | ||||
| lt_pversion=`$libtool --version 2>/dev/null|head -n 1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'` | ||||
| lt_pversion=`$libtool --version 2>/dev/null|head -n 2|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'` | ||||
| if test -z "$lt_pversion"; then | ||||
|   echo "buildconf: libtool not found." | ||||
|   echo "            You need libtool version $LIBTOOL_WANTED_VERSION or newer installed" | ||||
|   | ||||
| @@ -5,7 +5,6 @@ REM $Date$ | ||||
|  | ||||
| REM create ca-bundle.h | ||||
| echo /* This file is generated automatically */ >lib\ca-bundle.h | ||||
| echo #define CURL_CA_BUNDLE getenv("CURL_CA_BUNDLE") >>lib\ca-bundle.h | ||||
|  | ||||
| REM create hugehelp.c | ||||
| copy src\hugehelp.c.cvs src\hugehelp.c | ||||
|   | ||||
							
								
								
									
										532
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										532
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # Copyright (C) 1998 - 2007, 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,7 +28,7 @@ dnl We don't know the version number "staticly" so we use a dash here | ||||
| AC_INIT(curl, [-], [a suitable curl mailing list => http://curl.haxx.se/mail/]) | ||||
|  | ||||
| dnl configure script copyright | ||||
| AC_COPYRIGHT([Copyright (c) 1998 - 2005 Daniel Stenberg, <daniel@haxx.se> | ||||
| AC_COPYRIGHT([Copyright (c) 1998 - 2006 Daniel Stenberg, <daniel@haxx.se> | ||||
| This configure script may be copied, distributed and modified under the  | ||||
| terms of the curl license; see COPYING for more details]) | ||||
|  | ||||
| @@ -78,6 +78,7 @@ AC_SUBST(PKGADD_VENDOR) | ||||
| dnl | ||||
| dnl initialize all the info variables | ||||
|     curl_ssl_msg="no      (--with-ssl / --with-gnutls)" | ||||
|     curl_ssh_msg="no      (--with-libssh2)" | ||||
|    curl_zlib_msg="no      (--with-zlib)" | ||||
|    curl_krb4_msg="no      (--with-krb4*)" | ||||
|     curl_gss_msg="no      (--with-gssapi)" | ||||
| @@ -89,6 +90,11 @@ dnl initialize all the info variables | ||||
| curl_verbose_msg="enabled (--disable-verbose)" | ||||
|    curl_sspi_msg="no      (--enable-sspi)" | ||||
|  | ||||
| dnl | ||||
| dnl Save anything in $LIBS for later | ||||
| dnl | ||||
| ALL_LIBS=$LIBS | ||||
|  | ||||
| dnl | ||||
| dnl Detect the canonical host and target build environment | ||||
| dnl | ||||
| @@ -106,9 +112,33 @@ AC_PROG_CC | ||||
| dnl check for how to do large files | ||||
| AC_SYS_LARGEFILE | ||||
|  | ||||
| dnl check for cygwin stuff | ||||
| dnl support building of Windows DLLs | ||||
| AC_LIBTOOL_WIN32_DLL | ||||
|  | ||||
| dnl skip libtool C++ and Fortran compiler checks | ||||
| m4_ifdef([AC_PROG_CXX], [m4_undefine([AC_PROG_CXX])]) | ||||
| m4_defun([AC_PROG_CXX],[]) | ||||
| m4_ifdef([AC_PROG_F77], [m4_undefine([AC_PROG_F77])]) | ||||
| m4_defun([AC_PROG_F77],[]) | ||||
|  | ||||
| dnl skip libtool C++ and Fortran linker checks | ||||
| m4_ifdef([AC_LIBTOOL_CXX], [m4_undefine([AC_LIBTOOL_CXX])]) | ||||
| m4_defun([AC_LIBTOOL_CXX],[]) | ||||
| m4_ifdef([AC_LIBTOOL_F77], [m4_undefine([AC_LIBTOOL_F77])]) | ||||
| m4_defun([AC_LIBTOOL_F77],[]) | ||||
|  | ||||
| dnl force libtool to build static libraries with PIC on AMD64-linux | ||||
| AC_MSG_CHECKING([if arch-OS host is AMD64-linux (to build static libraries with PIC)]) | ||||
| case $host in | ||||
|   x86_64*linux*) | ||||
|     AC_MSG_RESULT([yes]) | ||||
|     with_pic=yes | ||||
|     ;; | ||||
|   *) | ||||
|     AC_MSG_RESULT([no]) | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| dnl libtool setup | ||||
| AC_PROG_LIBTOOL | ||||
|  | ||||
| @@ -157,6 +187,15 @@ case $host in | ||||
|     ;; | ||||
| esac | ||||
|  | ||||
| # Determine whether all dependent libraries must be specified when linking | ||||
| if test "X$enable_shared" = "Xyes" -a "X$link_all_deplibs" = "Xno" | ||||
| then | ||||
|     REQUIRE_LIB_DEPS=no | ||||
| else | ||||
|     REQUIRE_LIB_DEPS=yes | ||||
| fi | ||||
| AC_SUBST(REQUIRE_LIB_DEPS) | ||||
|  | ||||
| dnl The install stuff has already been taken care of by the automake stuff | ||||
| dnl AC_PROG_INSTALL | ||||
| AC_PROG_MAKE_SET | ||||
| @@ -373,6 +412,21 @@ then | ||||
|              ) | ||||
| fi | ||||
|  | ||||
| if test "$HAVE_GETHOSTBYNAME" != "1" | ||||
| then | ||||
|   dnl This is for eCos with a stubbed DNS implementation | ||||
|   AC_MSG_CHECKING([for gethostbyname for eCos]) | ||||
|   AC_TRY_LINK([ | ||||
| #include <stdio.h> | ||||
| #include <netdb.h>], | ||||
|                [gethostbyname("www.dummysite.com");], | ||||
|                [ dnl worked! | ||||
|                AC_MSG_RESULT([yes]) | ||||
|                HAVE_GETHOSTBYNAME="1"], | ||||
|                AC_MSG_RESULT(no) | ||||
|              ) | ||||
| fi | ||||
|  | ||||
| if test "$HAVE_GETHOSTBYNAME" != "1" | ||||
| then | ||||
|   dnl gethostbyname in the net lib - for BeOS | ||||
| @@ -402,15 +456,20 @@ fi | ||||
| dnl socket lib? | ||||
| AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ]) | ||||
|  | ||||
| dnl dl lib? | ||||
| AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ]) | ||||
| dnl ********************************************************************** | ||||
| dnl The preceding library checks are all potentially useful for test | ||||
| dnl servers (for providing networking support).  Save the list of required | ||||
| dnl libraries at this point for use while linking those test servers. | ||||
| dnl ********************************************************************** | ||||
| TEST_SERVER_LIBS=$LIBS | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| AC_MSG_CHECKING([whether to use libgcc]) | ||||
| AC_ARG_ENABLE(libgcc, | ||||
| AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]), | ||||
| [ case "$enableval" in | ||||
|   yes) | ||||
|         LIBS="$LIBS -lgcc" | ||||
|         ALL_LIBS="$ALL_LIBS -lgcc" | ||||
|        AC_MSG_RESULT(yes) | ||||
|        ;; | ||||
|   *)   AC_MSG_RESULT(no) | ||||
| @@ -419,6 +478,9 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]), | ||||
|        AC_MSG_RESULT(no) | ||||
| ) | ||||
|  | ||||
| dnl dl lib? | ||||
| AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ]) | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the name of dynamic OpenLDAP libraries | ||||
| dnl ********************************************************************** | ||||
| @@ -537,10 +599,6 @@ main() | ||||
|  | ||||
| if test "$ipv6" = "yes"; then | ||||
|   curl_ipv6_msg="enabled" | ||||
|  | ||||
|   CURL_CHECK_WORKING_GETADDRINFO | ||||
|  | ||||
|   CURL_CHECK_NI_WITHSCOPEID | ||||
| fi | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| @@ -736,7 +794,7 @@ AC_ARG_WITH(gssapi-includes, | ||||
| AC_ARG_WITH(gssapi-libs, | ||||
|   AC_HELP_STRING([--with-gssapi-libs=DIR], | ||||
|   		 [Specify location of GSSAPI libs]), | ||||
|   [ GSSAPI_LIBS="-L$withval" | ||||
|   [ GSSAPI_LIB_DIR="-L$withval" | ||||
|     want_gss="yes" ] | ||||
| ) | ||||
|  | ||||
| @@ -1010,12 +1068,35 @@ if test X"$OPT_SSL" != Xno; then | ||||
|               ]) | ||||
|  | ||||
|     dnl these can only exist if openssl exists | ||||
|     dnl yassl doesn't have SSL_get_shutdown | ||||
|  | ||||
|     AC_CHECK_FUNCS( RAND_status \ | ||||
|                     RAND_screen \ | ||||
|                     RAND_egd \ | ||||
|                     CRYPTO_cleanup_all_ex_data ) | ||||
|                     CRYPTO_cleanup_all_ex_data \ | ||||
|                     SSL_get_shutdown ) | ||||
|  | ||||
|     dnl Make an attempt to detect if this is actually yassl's headers and | ||||
|     dnl OpenSSL emulation layer. We still leave everything else believing | ||||
|     dnl and acting like OpenSSL. | ||||
|  | ||||
|     AC_MSG_CHECKING([for yaSSL using OpenSSL compatibility mode]) | ||||
|     AC_TRY_COMPILE([ | ||||
| #include <openssl/ssl.h> | ||||
|       ],[ | ||||
| #if defined(YASSL_VERSION) && defined(OPENSSL_VERSION_NUMBER) | ||||
|         int dummy = SSL_ERROR_NONE; | ||||
| #else | ||||
|         Not the yaSSL OpenSSL compatibility header. | ||||
| #endif | ||||
|       ],[  | ||||
|         AC_MSG_RESULT([yes]) | ||||
|         AC_DEFINE_UNQUOTED(USE_YASSLEMUL, 1, | ||||
|           [Define to 1 if using yaSSL in OpenSSL compatibility mode.]) | ||||
|         curl_ssl_msg="enabled (OpenSSL emulation by yaSSL)" | ||||
|       ],[ | ||||
|         AC_MSG_RESULT([no]) | ||||
|     ]) | ||||
|   fi | ||||
|  | ||||
|   if test "$OPENSSL_ENABLED" = "1"; then | ||||
| @@ -1032,6 +1113,152 @@ if test X"$OPT_SSL" != Xno; then | ||||
|  | ||||
| fi | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the presence of ZLIB libraries and headers | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| dnl Check for & handle argument to --with-zlib. | ||||
|  | ||||
| _cppflags=$CPPFLAGS | ||||
| _ldflags=$LDFLAGS | ||||
| AC_ARG_WITH(zlib, | ||||
| AC_HELP_STRING([--with-zlib=PATH],[search for zlib in PATH]) | ||||
| AC_HELP_STRING([--without-zlib],[disable use of zlib]), | ||||
|                [OPT_ZLIB="$withval"]) | ||||
|  | ||||
| if test "$OPT_ZLIB" = "no" ; then | ||||
|     AC_MSG_WARN([zlib disabled]) | ||||
| else | ||||
|   if test "$OPT_ZLIB" = "yes" ; then | ||||
|      OPT_ZLIB="" | ||||
|   fi | ||||
|  | ||||
|   if test -z "$OPT_ZLIB" ; then | ||||
|     dnl check for the lib first without setting any new path, since many | ||||
|     dnl people have it in the default path | ||||
|  | ||||
|     AC_CHECK_LIB(z, inflateEnd, | ||||
|                    dnl libz found, set the variable | ||||
|                    [HAVE_LIBZ="1"], | ||||
|                    dnl if no lib found, try /usr/local | ||||
|                    [OPT_ZLIB="/usr/local"]) | ||||
|  | ||||
|   fi | ||||
|  | ||||
|   dnl Add a nonempty path to the compiler flags | ||||
|   if test -n "$OPT_ZLIB"; then | ||||
|      CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include" | ||||
|      LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib$libsuff" | ||||
|   fi | ||||
|  | ||||
|   AC_CHECK_HEADER(zlib.h, | ||||
|     [ | ||||
|     dnl zlib.h was found | ||||
|     HAVE_ZLIB_H="1" | ||||
|     dnl if the lib wasn't found already, try again with the new paths | ||||
|     if test "$HAVE_LIBZ" != "1"; then | ||||
|       AC_CHECK_LIB(z, gzread, | ||||
|                    [ | ||||
|                    dnl the lib was found! | ||||
|                    HAVE_LIBZ="1" | ||||
|                    ], | ||||
|                    [ CPPFLAGS=$_cppflags | ||||
|                    LDFLAGS=$_ldflags]) | ||||
|     fi | ||||
|     ], | ||||
|     [ | ||||
|       dnl zlib.h was not found, restore the flags | ||||
|       CPPFLAGS=$_cppflags | ||||
|       LDFLAGS=$_ldflags] | ||||
|     ) | ||||
|  | ||||
|   if test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" != "1" | ||||
|   then | ||||
|     AC_MSG_WARN([configure found only the libz lib, not the header file!]) | ||||
|   elif test "$HAVE_LIBZ" != "1" && test "$HAVE_ZLIB_H" = "1" | ||||
|   then | ||||
|     AC_MSG_WARN([configure found only the libz header file, not the lib!]) | ||||
|   elif test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" = "1" | ||||
|   then | ||||
|     dnl both header and lib were found! | ||||
|     AC_SUBST(HAVE_LIBZ) | ||||
|     AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file]) | ||||
|     AC_DEFINE(HAVE_LIBZ, 1, [if zlib is available]) | ||||
|  | ||||
|     CURL_LIBS="$CURL_LIBS -lz" | ||||
|     LIBS="$LIBS -lz" | ||||
|  | ||||
|     dnl replace 'HAVE_LIBZ' in the automake makefile.ams | ||||
|     AMFIXLIB="1" | ||||
|     AC_MSG_NOTICE([found both libz and libz.h header]) | ||||
|     curl_zlib_msg="enabled" | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| dnl set variable for use in automakefile(s) | ||||
| AM_CONDITIONAL(HAVE_LIBZ, test x"$AMFIXLIB" = x1) | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the presence of LIBSSH2 libraries and headers | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| dnl Default to compiler & linker defaults for LIBSSH2 files & libraries. | ||||
| OPT_LIBSSH2=off | ||||
| AC_ARG_WITH(libssh2,dnl | ||||
| AC_HELP_STRING([--with-libssh2=PATH],[Where to look for libssh2, PATH points to the LIBSSH2 installation (default: /usr/local/lib); when possible, set the PKG_CONFIG_PATH environment variable instead of using this option]) | ||||
| AC_HELP_STRING([--without-libssh2], [disable LIBSSH2]), | ||||
|   OPT_LIBSSH2=$withval) | ||||
|  | ||||
| if test X"$OPT_LIBSSH2" != Xno; then | ||||
|   dnl backup the pre-libssh2 variables | ||||
|   CLEANLDFLAGS="$LDFLAGS" | ||||
|   CLEANCPPFLAGS="$CPPFLAGS" | ||||
|   CLEANLIBS="$LIBS" | ||||
|  | ||||
|   case "$OPT_LIBSSH2" in | ||||
|   yes) | ||||
|     dnl --with-libssh2 (without path) used | ||||
|     PREFIX_LIBSSH2=/usr/local/lib | ||||
|     LIB_LIBSSH2="$PREFIX_LIBSSH2/lib$libsuff" | ||||
|     ;; | ||||
|   off) | ||||
|     dnl no --with-libssh2 option given, just check default places | ||||
|     PREFIX_LIBSSH2= | ||||
|     ;; | ||||
|   *) | ||||
|     dnl use the given --with-libssh2 spot | ||||
|     PREFIX_LIBSSH2=$OPT_LIBSSH2 | ||||
|     LIB_LIBSSH2="$PREFIX_LIBSSH2/lib$libsuff" | ||||
|     LDFLAGS="$LDFLAGS -L$LIB_LIBSSH2" | ||||
|     CPPFLAGS="$CPPFLAGS -I$PREFIX_LIBSSH2/include" | ||||
|     ;; | ||||
|   esac | ||||
|  | ||||
|   AC_CHECK_LIB(ssh2, libssh2_channel_open_ex) | ||||
|    | ||||
|   AC_CHECK_HEADERS(libssh2.h, | ||||
|     curl_ssh_msg="enabled (libSSH2)" | ||||
|     LIBSSH2_ENABLED=1 | ||||
|     AC_DEFINE(USE_LIBSSH2, 1, [if libSSH2 is in use])) | ||||
|  | ||||
|   if test X"$OPT_LIBSSH2" != Xoff && | ||||
|      test "$LIBSSH2_ENABLED" != "1"; then | ||||
|     AC_MSG_ERROR([libSSH2 libs and/or directories were not found where specified!]) | ||||
|   fi | ||||
|  | ||||
|   if test "$LIBSSH2_ENABLED" = "1"; then | ||||
|     if test -n "$LIB_LIBSSH2"; then | ||||
|        dnl when the libssh2 shared libs were found in a path that the run-time | ||||
|        dnl linker doesn't search through, we need to add it to LD_LIBRARY_PATH | ||||
|        dnl to prevent further configure tests to fail due to this | ||||
|  | ||||
|        LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_LIBSSH2" | ||||
|        export LD_LIBRARY_PATH | ||||
|        AC_MSG_NOTICE([Added $LIB_LIBSSH2 to LD_LIBRARY_PATH]) | ||||
|     fi | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the random seed preferences  | ||||
| dnl ********************************************************************** | ||||
| @@ -1110,6 +1337,7 @@ if test "$OPENSSL_ENABLED" != "1"; then | ||||
|        [ | ||||
|        AC_DEFINE(USE_GNUTLS, 1, [if GnuTLS is enabled]) | ||||
|        AC_SUBST(USE_GNUTLS, [1]) | ||||
|        GNUTLS_ENABLED = 1 | ||||
|        USE_GNUTLS="yes" | ||||
|        curl_ssl_msg="enabled (GnuTLS)" | ||||
|        ], | ||||
| @@ -1135,12 +1363,84 @@ if test "$OPENSSL_ENABLED" != "1"; then | ||||
|  | ||||
|   fi dnl GNUTLS not disabled | ||||
|  | ||||
|   if test X"$USE_GNUTLS" != "Xyes"; then | ||||
|     AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.]) | ||||
|     AC_MSG_WARN([Use --with-ssl or --with-gnutls to address this.]) | ||||
| fi dnl OPENSSL != 1 | ||||
|  | ||||
| dnl ---------------------------------------------------- | ||||
| dnl NSS. Only check if GnuTLS and OpenSSL are not enabled | ||||
| dnl ---------------------------------------------------- | ||||
|  | ||||
| dnl Default to compiler & linker defaults for NSS files & libraries. | ||||
| OPT_NSS=no | ||||
|  | ||||
| AC_ARG_WITH(nss,dnl | ||||
| AC_HELP_STRING([--with-nss=PATH],[where to look for NSS, PATH points to the installation root (default: /usr/local/)]) | ||||
| AC_HELP_STRING([--without-nss], [disable NSS detection]), | ||||
|   OPT_NSS=$withval) | ||||
|  | ||||
| if test "$OPENSSL_ENABLED" != "1" -a "$GNUTLS_ENABLED" != "1"; then | ||||
|  | ||||
|   if test X"$OPT_NSS" != Xno; then | ||||
|     if test "x$OPT_NSS" = "xyes"; then | ||||
|      check=`pkg-config --version 2>/dev/null` | ||||
|      if test -n "$check"; then | ||||
|        addlib=`pkg-config --libs nss` | ||||
|        addcflags=`pkg-config --cflags nss` | ||||
|        version=`pkg-config --modversion nss` | ||||
|        nssprefix=`pkg-config --variable=prefix nss` | ||||
|      fi | ||||
|     else | ||||
|       # Without pkg-config, we'll kludge in some defaults | ||||
|       addlib="-lssl3 -lsmime3 -lnss3 -lplds4 -lplc4 -lnspr4 -lpthread -ldl" | ||||
|       addcflags="-I$OPT_NSS/include"  | ||||
|       version="unknown" | ||||
|       gtlsprefix=$OPT_GNUTLS | ||||
|     fi | ||||
|     if test -n "$addlib"; then | ||||
|  | ||||
|       CLEANLIBS="$LIBS" | ||||
|       CLEANCPPFLAGS="$CPPFLAGS" | ||||
|    | ||||
|       LIBS="$LIBS $addlib" | ||||
|       if test "$addcflags" != "-I/usr/include"; then | ||||
|          CPPFLAGS="$CPPFLAGS $addcflags" | ||||
|       fi | ||||
|    | ||||
| fi dnl OPENSSL != 1 | ||||
|       AC_CHECK_LIB(nss3, NSS_Initialize, | ||||
|        [ | ||||
|        AC_DEFINE(USE_NSS, 1, [if NSS is enabled]) | ||||
|        AC_SUBST(USE_NSS, [1]) | ||||
|        USE_NSS="yes" | ||||
|        NSS_ENABLED=1 | ||||
|        curl_ssl_msg="enabled (NSS)" | ||||
|        ], | ||||
|        [ | ||||
|          LIBS="$CLEANLIBS" | ||||
|          CPPFLAGS="$CLEANCPPFLAGS" | ||||
|        ]) | ||||
|    | ||||
|       if test "x$USE_NSS" = "xyes"; then | ||||
|         AC_MSG_NOTICE([detected NSS version $version]) | ||||
|  | ||||
|         dnl when shared libs were found in a path that the run-time | ||||
|         dnl linker doesn't search through, we need to add it to | ||||
|         dnl LD_LIBRARY_PATH to prevent further configure tests to fail | ||||
|         dnl due to this | ||||
|  | ||||
|         LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$nssprefix/lib$libsuff" | ||||
|         export LD_LIBRARY_PATH | ||||
|         AC_MSG_NOTICE([Added $nssprefix/lib$libsuff to LD_LIBRARY_PATH]) | ||||
|       fi | ||||
|  | ||||
|     fi | ||||
|  | ||||
|   fi dnl NSS not disabled | ||||
|  | ||||
| fi dnl OPENSSL != 1 -a GNUTLS_ENABLED != 1 | ||||
|  | ||||
| if test "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED" = "x"; then | ||||
|   AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.]) | ||||
|   AC_MSG_WARN([Use --with-ssl, --with-gnutls or --with-nss to address this.]) | ||||
| fi | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the CA bundle | ||||
| @@ -1171,93 +1471,10 @@ fi dnl only done if some kind of SSL was enabled | ||||
|  | ||||
| AM_CONDITIONAL(CABUNDLE, test x$ca != xno) | ||||
|  | ||||
|  | ||||
|  | ||||
|    | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the presence of ZLIB libraries and headers | ||||
| dnl Check for the presence of IDN libraries and headers | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| dnl Check for & handle argument to --with-zlib. | ||||
|  | ||||
| _cppflags=$CPPFLAGS | ||||
| _ldflags=$LDFLAGS | ||||
| AC_ARG_WITH(zlib, | ||||
| AC_HELP_STRING([--with-zlib=PATH],[search for zlib in PATH]) | ||||
| AC_HELP_STRING([--without-zlib],[disable use of zlib]), | ||||
|                [OPT_ZLIB="$withval"]) | ||||
|  | ||||
| if test "$OPT_ZLIB" = "no" ; then | ||||
|     AC_MSG_WARN([zlib disabled]) | ||||
| else | ||||
|   if test "$OPT_ZLIB" = "yes" ; then | ||||
|      OPT_ZLIB="" | ||||
|   fi | ||||
|  | ||||
|   if test -z "$OPT_ZLIB" ; then | ||||
|     dnl check for the lib first without setting any new path, since many | ||||
|     dnl people have it in the default path | ||||
|  | ||||
|     AC_CHECK_LIB(z, inflateEnd, | ||||
|                    dnl libz found, set the variable | ||||
|                    [HAVE_LIBZ="1"], | ||||
|                    dnl if no lib found, try /usr/local | ||||
|                    [OPT_ZLIB="/usr/local"]) | ||||
|  | ||||
|   fi | ||||
|  | ||||
|   dnl Add a nonempty path to the compiler flags | ||||
|   if test -n "$OPT_ZLIB"; then | ||||
|      CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include" | ||||
|      LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib$libsuff" | ||||
|   fi | ||||
|  | ||||
|   AC_CHECK_HEADER(zlib.h, | ||||
|     [ | ||||
|     dnl zlib.h was found | ||||
|     HAVE_ZLIB_H="1" | ||||
|     dnl if the lib wasn't found already, try again with the new paths | ||||
|     if test "$HAVE_LIBZ" != "1"; then | ||||
|       AC_CHECK_LIB(z, gzread, | ||||
|                    [ | ||||
|                    dnl the lib was found! | ||||
|                    HAVE_LIBZ="1" | ||||
|                    ], | ||||
|                    [ CPPFLAGS=$_cppflags | ||||
|                    LDFLAGS=$_ldflags]) | ||||
|     fi | ||||
|     ], | ||||
|     [ | ||||
|       dnl zlib.h was not found, restore the flags | ||||
|       CPPFLAGS=$_cppflags | ||||
|       LDFLAGS=$_ldflags] | ||||
|     ) | ||||
|  | ||||
|   if test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" != "1" | ||||
|   then | ||||
|     AC_MSG_WARN([configure found only the libz lib, not the header file!]) | ||||
|   elif test "$HAVE_LIBZ" != "1" && test "$HAVE_ZLIB_H" = "1" | ||||
|   then | ||||
|     AC_MSG_WARN([configure found only the libz header file, not the lib!]) | ||||
|   elif test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" = "1" | ||||
|   then | ||||
|     dnl both header and lib were found! | ||||
|     AC_SUBST(HAVE_LIBZ) | ||||
|     AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file]) | ||||
|     AC_DEFINE(HAVE_LIBZ, 1, [if zlib is available]) | ||||
|  | ||||
|     LIBS="$LIBS -lz" | ||||
|  | ||||
|     dnl replace 'HAVE_LIBZ' in the automake makefile.ams | ||||
|     AMFIXLIB="1" | ||||
|     AC_MSG_NOTICE([found both libz and libz.h header]) | ||||
|     curl_zlib_msg="enabled" | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| dnl set variable for use in automakefile(s) | ||||
| AM_CONDITIONAL(HAVE_LIBZ, test x"$AMFIXLIB" = x1) | ||||
|  | ||||
| AC_MSG_CHECKING([whether to build with libidn]) | ||||
| AC_ARG_WITH(libidn, | ||||
| AC_HELP_STRING([--with-libidn=PATH],[Enable libidn usage]) | ||||
| @@ -1386,6 +1603,10 @@ if test "x$RECENTAIX" = "xyes"; then | ||||
|          XLC="yes" | ||||
|          AC_MSG_RESULT([yes]) | ||||
|          CFLAGS="$CFLAGS -qthreaded" | ||||
|          dnl AIX xlc has to have strict aliasing turned off. If not, | ||||
|          dnl the optimizer assumes that pointers can only point to | ||||
|          dnl an object of the same type. | ||||
|          CFLAGS="$CFLAGS -qnoansialias" | ||||
|        ) | ||||
|  | ||||
|  | ||||
| @@ -1402,7 +1623,7 @@ if test x$cross_compiling != xyes; then | ||||
|  | ||||
|   if test x$checkfor_gmtime_r = xyes; then | ||||
|  | ||||
|     dnl if gmtime_r was found, verify that it actuall works, as (at least) HPUX | ||||
|     dnl if gmtime_r was found, verify that it actually works, as (at least) HPUX | ||||
|     dnl 10.20 is known to have a buggy one. If it doesn't work, disable use of | ||||
|     dnl it. | ||||
|  | ||||
| @@ -1447,6 +1668,7 @@ dnl ********************************************************************** | ||||
| dnl Checks for header files. | ||||
| AC_HEADER_STDC | ||||
|  | ||||
| CURL_CHECK_HEADER_MALLOC | ||||
|  | ||||
| dnl Now check for the very most basic headers. Then we can use these | ||||
| dnl ones as default-headers when checking for the rest! | ||||
| @@ -1458,7 +1680,6 @@ AC_CHECK_HEADERS( | ||||
|         sys/ioctl.h \ | ||||
|         assert.h \ | ||||
|         unistd.h \ | ||||
|         malloc.h \ | ||||
|         stdlib.h \ | ||||
|         limits.h \ | ||||
|         arpa/inet.h \ | ||||
| @@ -1485,6 +1706,7 @@ AC_CHECK_HEADERS( | ||||
|         libgen.h \ | ||||
|         locale.h \ | ||||
|         errno.h \ | ||||
|         stdbool.h \ | ||||
|         arpa/tftp.h \ | ||||
|         sys/filio.h \ | ||||
|         setjmp.h, | ||||
| @@ -1514,8 +1736,11 @@ dnl default includes | ||||
|  | ||||
| dnl Checks for typedefs, structures, and compiler characteristics. | ||||
| AC_C_CONST | ||||
| CURL_CHECK_VARIADIC_MACROS | ||||
| AC_TYPE_SIZE_T | ||||
| AC_HEADER_TIME | ||||
| CURL_CHECK_STRUCT_TIMEVAL | ||||
| CURL_VERIFY_RUNTIMELIBS | ||||
|  | ||||
| AC_CHECK_SIZEOF(curl_off_t, ,[ | ||||
| #include <stdio.h> | ||||
| @@ -1544,6 +1769,19 @@ fi | ||||
| AC_CHECK_TYPE(ssize_t, , | ||||
|    AC_DEFINE(ssize_t, int, [the signed version of size_t])) | ||||
|  | ||||
| # check for bool type | ||||
| AC_CHECK_TYPE([bool],[ | ||||
|   AC_DEFINE(HAVE_BOOL_T, 1, | ||||
|     [Define to 1 if bool is an available type.]) | ||||
| ], ,[ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_STDBOOL_H | ||||
| #include <stdbool.h> | ||||
| #endif | ||||
| ]) | ||||
|  | ||||
| # Check for socklen_t or equivalent | ||||
| CURL_CHECK_TYPE_SOCKLEN_T | ||||
|  | ||||
| @@ -1551,11 +1789,21 @@ TYPE_IN_ADDR_T | ||||
|  | ||||
| TYPE_SOCKADDR_STORAGE | ||||
|  | ||||
| TYPE_SIG_ATOMIC_T | ||||
|  | ||||
| AC_TYPE_SIGNAL | ||||
|  | ||||
| AC_FUNC_SELECT_ARGTYPES | ||||
|  | ||||
| CURL_CHECK_FUNC_RECV | ||||
|  | ||||
| CURL_CHECK_FUNC_SEND | ||||
|  | ||||
| CURL_CHECK_MSG_NOSIGNAL | ||||
|  | ||||
| dnl Checks for library functions. | ||||
| dnl AC_PROG_GCC_TRADITIONAL | ||||
| AC_TYPE_SIGNAL | ||||
|  | ||||
| dnl AC_FUNC_VPRINTF | ||||
| case $host in | ||||
|   *msdosdjgpp) | ||||
| @@ -1599,7 +1847,8 @@ AC_CHECK_FUNCS( strtoll \ | ||||
|                 getprotobyname \ | ||||
|                 getrlimit \ | ||||
|                 setrlimit \ | ||||
|                 fork, | ||||
|                 fork \ | ||||
|                 setmode, | ||||
| dnl if found | ||||
| [], | ||||
| dnl if not found, $ac_func is the name we check for | ||||
| @@ -1689,6 +1938,11 @@ dnl Check if the getnameinfo function is available | ||||
| dnl and get the types of five of its arguments. | ||||
| CURL_CHECK_FUNC_GETNAMEINFO | ||||
|  | ||||
| if test "$ipv6" = "yes"; then | ||||
|   CURL_CHECK_WORKING_GETADDRINFO | ||||
|   CURL_CHECK_NI_WITHSCOPEID | ||||
| fi | ||||
|  | ||||
| AC_MSG_CHECKING([if we are Mac OS X (to disable poll)]) | ||||
| disable_poll=no | ||||
| case $host in | ||||
| @@ -1870,19 +2124,26 @@ AC_HELP_STRING([--disable-verbose],[Disable verbose strings]), | ||||
|        AC_MSG_RESULT(yes) | ||||
| ) | ||||
|  | ||||
| CURL_CHECK_NATIVE_WINDOWS | ||||
|  | ||||
| dnl ************************************************************ | ||||
| dnl enable SSPI support | ||||
| dnl | ||||
| AC_MSG_CHECKING([whether to enable SSPI support (win32 builds only)]) | ||||
| AC_MSG_CHECKING([whether to enable SSPI support (Windows native builds only)]) | ||||
| AC_ARG_ENABLE(sspi, | ||||
| AC_HELP_STRING([--enable-sspi],[Enable SSPI]) | ||||
| AC_HELP_STRING([--disable-sspi],[Disable SSPI]), | ||||
| [ case "$enableval" in | ||||
|   yes) | ||||
|        if test "$ac_cv_native_windows" = "yes"; then | ||||
|          AC_MSG_RESULT(yes) | ||||
|          AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support]) | ||||
|          AC_SUBST(USE_WINDOWS_SSPI) | ||||
|          curl_sspi_msg="yes" | ||||
|        else | ||||
|          AC_MSG_RESULT(no) | ||||
|          AC_MSG_WARN([--enable-sspi Ignored. Only supported on native Windows builds.]) | ||||
|        fi | ||||
|        ;; | ||||
|   *) | ||||
|        AC_MSG_RESULT(no) | ||||
| @@ -1954,6 +2215,52 @@ AC_HELP_STRING([--disable-cookies],[Disable cookies support]), | ||||
|        AC_MSG_RESULT(yes) | ||||
| ) | ||||
|  | ||||
| dnl ************************************************************ | ||||
| dnl Enable hiding of internal symbols in library to reduce its size and | ||||
| dnl speed dynamic linking of applications.  This currently is only supported | ||||
| dnl on gcc >= 4.0 and SunPro C. | ||||
| dnl | ||||
| AC_MSG_CHECKING([whether to enable hidden symbols in the library]) | ||||
| AC_ARG_ENABLE(hidden-symbols, | ||||
| AC_HELP_STRING([--enable-hidden-symbols],[Hide internal symbols in library]) | ||||
| AC_HELP_STRING([--disable-hidden-symbols],[Leave all symbols with default visibility in library]), | ||||
| [ case "$enableval" in | ||||
|   no) | ||||
|        AC_MSG_RESULT(no) | ||||
|        ;; | ||||
|   *)    | ||||
|        AC_MSG_CHECKING([whether $CC supports it]) | ||||
|        if test "$GCC" = yes ; then | ||||
|          if $CC --help --verbose 2>&1 | grep fvisibility= > /dev/null ; then | ||||
| 	   AC_MSG_RESULT(yes) | ||||
| 	   AC_DEFINE(CURL_HIDDEN_SYMBOLS, 1, [to enable hidden symbols]) | ||||
| 	   AC_SUBST(CURL_HIDDEN_SYMBOLS) | ||||
| 	   AC_DEFINE(CURL_EXTERN_SYMBOL, [__attribute__ ((visibility ("default")))], [to make a symbol visible]) | ||||
| 	   AC_SUBST(CURL_EXTERN_SYMBOL) | ||||
| 	   CFLAGS="$CFLAGS -fvisibility=hidden" | ||||
|          else | ||||
|             AC_MSG_RESULT(no) | ||||
|           fi | ||||
|  | ||||
|        else | ||||
|        	 dnl Test for SunPro cc | ||||
|        	 if $CC 2>&1 | grep flags >/dev/null && $CC -flags | grep xldscope= >/dev/null ; then | ||||
|            AC_MSG_RESULT(yes) | ||||
| 	   AC_DEFINE(CURL_HIDDEN_SYMBOLS, 1, [to enable hidden symbols]) | ||||
| 	   AC_SUBST(CURL_HIDDEN_SYMBOLS) | ||||
| 	   AC_DEFINE(CURL_EXTERN_SYMBOL, [__global], [to make a symbol visible]) | ||||
| 	   AC_SUBST(CURL_EXTERN_SYMBOL) | ||||
| 	   CFLAGS="$CFLAGS -xldscope=hidden" | ||||
|          else | ||||
|            AC_MSG_RESULT(no) | ||||
|          fi | ||||
|        fi | ||||
|        ;; | ||||
|   esac ], | ||||
|        AC_MSG_RESULT(no) | ||||
| ) | ||||
|  | ||||
| dnl ************************************************************ | ||||
| if test "x$ws2" = "xyes"; then | ||||
|  | ||||
|   dnl If ws2_32 is wanted, make sure it is the _last_ lib in LIBS (makes | ||||
| @@ -1962,9 +2269,23 @@ if test "x$ws2" = "xyes"; then | ||||
|   dnl end. | ||||
|  | ||||
|   LIBS="$LIBS -lws2_32" | ||||
|   TEST_SERVER_LIBS="$TEST_SERVER_LIBS -lws2_32" | ||||
|  | ||||
| fi | ||||
|  | ||||
| dnl | ||||
| dnl All the library dependencies put into $LIB apply to libcurl only. | ||||
| dnl Those in $CURL_LIBS apply to the curl command-line client only. | ||||
| dnl Those in $TEST_SERVER_LIBS apply to test servers only. | ||||
| dnl Those in $ALL_LIBS apply to all targets, including test targets. | ||||
| dnl | ||||
| LIBCURL_LIBS=$LIBS | ||||
|  | ||||
| AC_SUBST(LIBCURL_LIBS) | ||||
| AC_SUBST(CURL_LIBS) | ||||
| AC_SUBST(TEST_SERVER_LIBS) | ||||
| LIBS=$ALL_LIBS  dnl LIBS is a magic variable that's used for every link | ||||
|  | ||||
| AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes) | ||||
|  | ||||
| AC_CONFIG_FILES([Makefile \ | ||||
| @@ -2006,6 +2327,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl: | ||||
|   Install prefix:  ${prefix} | ||||
|   Compiler:        ${CC} | ||||
|   SSL support:     ${curl_ssl_msg} | ||||
|   SSH support:     ${curl_ssh_msg} | ||||
|   zlib support:    ${curl_zlib_msg} | ||||
|   krb4 support:    ${curl_krb4_msg} | ||||
|   GSSAPI support:  ${curl_gss_msg} | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 2001 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # Copyright (C) 2001 - 2007, 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 | ||||
| @@ -181,7 +181,16 @@ while test $# -gt 0; do | ||||
|        	;; | ||||
|  | ||||
|     --libs) | ||||
|        	echo -L@libdir@ -lcurl @LDFLAGS@ @LIBS@ | ||||
| 	if test "X@libdir@" != "X/usr/lib"; then | ||||
| 	   CURLLIBDIR="-L@libdir@ " | ||||
| 	else | ||||
| 	   CURLLIBDIR="" | ||||
| 	fi | ||||
| 	if test "X@REQUIRE_LIB_DEPS@" = "Xyes"; then | ||||
| 	  echo ${CURLLIBDIR}-lcurl @LDFLAGS@ @LIBCURL_LIBS@ @LIBS@ | ||||
| 	else | ||||
| 	  echo ${CURLLIBDIR}-lcurl @LDFLAGS@ @LIBS@ | ||||
| 	fi | ||||
| 	;; | ||||
|  | ||||
|     *) | ||||
|   | ||||
| @@ -46,8 +46,8 @@ Cocoa | ||||
|  | ||||
| D | ||||
|  | ||||
|   Written by Charles Sanders and James Wavro | ||||
|   http://www.atari-soldiers.com/libcurl.html | ||||
|   Written by Kenneth Bogert | ||||
|   http://curl.haxx.se/libcurl/d/ | ||||
|  | ||||
| Dylan | ||||
|  | ||||
| @@ -142,8 +142,8 @@ Rexx | ||||
|  | ||||
| Ruby | ||||
|  | ||||
|   Written by Hirotaka Matsuyuki | ||||
|   http://www.d1.dion.ne.jp/~matuyuki/ruby.html | ||||
|   Written by Ross Bamford | ||||
|   http://curb.rubyforge.org/ | ||||
|  | ||||
| Scheme | ||||
|  | ||||
| @@ -155,6 +155,11 @@ S-Lang | ||||
|   S-Lang binding written by John E Davis | ||||
|   http://www.jedsoft.org/slang/modules/curl.html | ||||
|  | ||||
| Smalltalk | ||||
|  | ||||
|   Smalltalk binding written by Danil Osipchuk | ||||
|   http://www.squeaksource.com/CurlPlugin/ | ||||
|  | ||||
| SPL | ||||
|  | ||||
|   SPL binding written by Clifford Wolf | ||||
| @@ -177,7 +182,7 @@ Q | ||||
| wxWidgets | ||||
|  | ||||
|   Written by Casey O'Donnell | ||||
|   http://homepage.mac.com/codonnell/wxcurldav/ | ||||
|   http://wxcode.sourceforge.net/components/wxcurl/ | ||||
|  | ||||
| XBLite | ||||
|  | ||||
|   | ||||
| @@ -17,7 +17,9 @@ Join the Community | ||||
|  you start sending patches! We prefer patches and discussions being held on | ||||
|  the mailing list(s), not sent to individuals. | ||||
|  | ||||
| The License Issue | ||||
|  We also hang out on IRC in #curl on irc.freenode.net | ||||
|  | ||||
| License | ||||
|  | ||||
|  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 and agreed | ||||
| @@ -43,9 +45,10 @@ The License Issue | ||||
|  | ||||
| What To Read | ||||
|  | ||||
|  Source code, the man pages, the INTERNALS document, the TODO, the most recent | ||||
|  CHANGES. Just lurking on the libcurl mailing list is gonna give you a lot of | ||||
|  insights on what's going on right now. Asking there is a good idea too. | ||||
|  Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS, the | ||||
|  most recent CHANGES. Just lurking on the libcurl mailing list is gonna give | ||||
|  you a lot of insights on what's going on right now. Asking there is a good | ||||
|  idea too. | ||||
|  | ||||
| Naming | ||||
|  | ||||
| @@ -170,3 +173,21 @@ How To Make a Patch | ||||
|  | ||||
|         http://gnuwin32.sourceforge.net/packages/patch.htm | ||||
|         http://gnuwin32.sourceforge.net/packages/diffutils.htm | ||||
|  | ||||
| How to get your patches into the libcurl sources | ||||
|  | ||||
|  1. Submit your patch to the curl-library mailing list | ||||
|  | ||||
|  2. Make the patch against as recent sources as possible. | ||||
|  | ||||
|  3. Make sure your patch adheres to the source indent and coding style of | ||||
|     already existing source code. Failing to do so just adds more work for me. | ||||
|  | ||||
|  4. Respond to replies on the list about the patch and answer questions and/or | ||||
|     fix nits/flaws. This is very important. I will take lack of replies as a | ||||
|     sign that you're not very anxious to get your patch accepted and I tend to | ||||
|     simply drop such patches from my TODO list. | ||||
|  | ||||
|  5. If you've followed the above mentioned paragraphs and your patch still | ||||
|     hasn't been incorporated after some weeks, consider resubmitting them to | ||||
|     the list. | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
|   Date: May 15, 2006 | ||||
|   Date: February 11, 2007 | ||||
|   Author: Daniel Stenberg <daniel@haxx.se> | ||||
|   URL: http://curl.haxx.se/legal/distro-dilemma.html | ||||
|  | ||||
| Condition | ||||
|  | ||||
|  This document is written to describe the situation as it is right | ||||
|  now. libcurl 7.15.3 is currently the latest version available. Things may of | ||||
|  This document is written to describe the situation as it is right now. | ||||
|  libcurl 7.16.1 is currently the latest version available. Things may of | ||||
|  course change in the future. | ||||
|  | ||||
|  This document reflects my view and understanding of these things. Please tell | ||||
| @@ -48,24 +48,34 @@ Part of the Operating System | ||||
|  Debian does however not take this stance and has officially(?) claimed that | ||||
|  OpenSSL is not a required part of the Debian operating system | ||||
|  | ||||
|  Some people claim that this paragraph cannot be exploited this way by a Linux | ||||
|  distro, but I am not a lawyer and that is a discussion left outside of this | ||||
|  document. | ||||
|  | ||||
| GnuTLS | ||||
|  | ||||
|  With the release of libcurl 7.14.0 (May 2005), libcurl can now get built to | ||||
|  use GnuTLS instead of OpenSSL. GnuTLS is an LGPL[7] licensed library that | ||||
|  offers a matching set of features as OpenSSL does. Now, you can build and | ||||
|  distribute an TLS/SSL capable libcurl without including any Original BSD | ||||
|  licensed code. | ||||
|  Since May 2005 libcurl can get built to use GnuTLS instead of OpenSSL. GnuTLS | ||||
|  is an LGPL[7] licensed library that offers a matching set of features as | ||||
|  OpenSSL does. Now, you can build and distribute an TLS/SSL capable libcurl | ||||
|  without including any Original BSD licensed code. | ||||
|  | ||||
|  I believe Debian is the first distro to provide libcurl/GnutTLS packages. | ||||
|  I believe Debian is the first (only?) distro that provides libcurl/GnutTLS | ||||
|  packages. | ||||
|  | ||||
| GnuTLS vs OpenSSL | ||||
| yassl | ||||
|  | ||||
|  While these two libraries offer similar features, they are not equal. Both | ||||
|  libraries have features the other one lacks. libcurl does not (yet) offer a | ||||
|  standardized stable ABI if you decide to switch from using libcurl-openssl to | ||||
|  libcurl-gnutls or vice versa. The GnuTLS support is very recent in libcurl | ||||
|  and it has not been tested nor used very extensively, while the OpenSSL | ||||
|  equivalent code has been used and thus matured for more than seven (7) years. | ||||
|  libcurl can get also get built to use yassl for the TLS/SSL layer. yassl is a | ||||
|  GPL[3] licensed library. | ||||
|  | ||||
|  | ||||
| GnuTLS vs OpenSSL vs yassl | ||||
|  | ||||
|  While these three libraries offer similar features, they are not equal. | ||||
|  libcurl does not (yet) offer a standardized stable ABI if you decide to | ||||
|  switch from using libcurl-openssl to libcurl-gnutls or vice versa. The GnuTLS | ||||
|  and yassl support is very recent in libcurl and it has not been tested nor | ||||
|  used very extensively, while the OpenSSL equivalent code has been used and | ||||
|  thus matured since 1999. | ||||
|  | ||||
|  GnuTLS | ||||
|    - LGPL licensened | ||||
| @@ -82,7 +92,12 @@ GnuTLS vs OpenSSL | ||||
|    - provides crypto functions libcurl uses for NTLM | ||||
|    - libcurl can do non-blocking connects with it in 7.15.4 and later | ||||
|  | ||||
| The Better License, Original BSD or LGPL? | ||||
|  yassl | ||||
|    - GPL licensed | ||||
|    - much untested and unproven in the real work by (lib)curl users so we don't | ||||
|      know a lot about restrictions or benefits from using this | ||||
|  | ||||
| The Better License, Original BSD, GPL or LGPL? | ||||
|  | ||||
|  It isn't obvious or without debate to any objective interested party that | ||||
|  either of these licenses are the "better" or even the "preferred" one in a | ||||
| @@ -91,8 +106,8 @@ The Better License, Original BSD or LGPL? | ||||
|  Instead, I think we should accept the fact that the SSL/TLS libraries and | ||||
|  their different licenses will fit different applications and their authors | ||||
|  differently depending on the applications' licenses and their general usage | ||||
|  pattern (considering how LGPL libraries for example can be burdensome for | ||||
|  embedded systems usage). | ||||
|  pattern (considering how GPL and LGPL libraries for example can be burdensome | ||||
|  for embedded systems usage). | ||||
|  | ||||
|  In Debian land, there seems to be a common opinion that LGPL is "maximally | ||||
|  compatible" with apps while Original BSD is not. Like this: | ||||
| @@ -101,8 +116,8 @@ The Better License, Original BSD or LGPL? | ||||
|  | ||||
| More SSL Libraries | ||||
|  | ||||
|  In libcurl, there's no stopping us here. There are at least a few more Open | ||||
|  Source/Free SSL/TLS libraries and we would very much like to support them as | ||||
|  In libcurl, there's no stopping us here. There are more Open Source/Free | ||||
|  SSL/TLS libraries out there and we would very much like to support them as | ||||
|  well, to offer application authors an even wider scope of choice. | ||||
|  | ||||
| Application Angle of this Problem | ||||
| @@ -137,7 +152,7 @@ Project cURL Angle of this Problem | ||||
| Distro Angle of this Problem | ||||
|  | ||||
|  To my knowledge there is only one distro that ships libcurl built with either | ||||
|  one of the SSL libs supported. | ||||
|  OpenSSL or GnuTLS. | ||||
|  | ||||
|  Debian Linux is now (since mid September 2005) providing two different | ||||
|  libcurl packages, one for libcurl built with OpenSSL and one built with | ||||
| @@ -145,56 +160,6 @@ Distro Angle of this Problem | ||||
|  single system simultaneously. This has been said to be a transitional system | ||||
|  not desired to keep in the long run. | ||||
|  | ||||
| Fixing the Only Problem | ||||
|  | ||||
|  The only problem is thus for distributions that want to offer libcurl | ||||
|  versions built with more than one SSL/TLS library. | ||||
|  | ||||
|  Since multiple libcurl binaries using different names are ruled out, we need | ||||
|  to come up with a way to have one single libcurl that someone uses different | ||||
|  underlying libraries. The best(?) approach currently suggested involves this: | ||||
|  | ||||
|  A new intermediate library (named lib2 so far in the discussions) with the | ||||
|  single purpose of providing libcurl with SSL/TLS capabilities. It would have | ||||
|  a unified API and ABI no matter what underlying library it would use. | ||||
|  | ||||
|  There would be one lib2 binary provided for each supported SSL/TLS library. | ||||
|  For example: lib2-openssl, lib2-gnutls, lib2-yassl, lib2-matrixssl and | ||||
|  lib2-nossl. Yes, take note of the last one that provides the lib2 ABI but | ||||
|  that lacks the actual powers. | ||||
|  | ||||
|  When libcurl is built and linked, it will be linked against a lib2 with the | ||||
|  set ABI. | ||||
|  | ||||
|  When you link an app against libcurl, it would also need to provide one of | ||||
|  the (many) lib2 libs to decide what approach that fits the app. An app that | ||||
|  doesn't want SSL at all would still need to link with the lib2-nossl lib. | ||||
|  | ||||
|  GPL apps can pick the lib2-gnutls, others may pick the lib2-openssl. | ||||
|  | ||||
|  This concept works equally well both for shared and static libraries. | ||||
|  | ||||
|  A positive side effect of this approach could be a more generic "de facto" | ||||
|  standard API for SSL/TLS libraries. | ||||
|  | ||||
| When Will This Happen | ||||
|  | ||||
|  This is not a problem in curl, it doesn't solve any actual technical problems | ||||
|  in our project. Don't hold your breath for this to happen very soon (if at | ||||
|  all) unless you step forward and contribute. | ||||
|  | ||||
|  The suggestion that is outlined above is still only a suggestion. Feel free | ||||
|  to bring a better idea! | ||||
|  | ||||
|  Also, to keep in mind: I don't want this new concept to have too much of an | ||||
|  impact on the existing code. Preferably it should be possible to build the | ||||
|  code like today (without the use of lib2), should you decide to ignore the | ||||
|  problems outlined in this document. | ||||
|  | ||||
|  Work on this was suggested by Richard Atterer: | ||||
|  | ||||
|         http://curl.haxx.se/mail/lib-2005-09/0066.html | ||||
|  | ||||
| Footnotes | ||||
|  | ||||
|  [1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6 | ||||
|   | ||||
							
								
								
									
										59
									
								
								docs/FAQ
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								docs/FAQ
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| Updated: November 2, 2005 (http://curl.haxx.se/docs/faq.html) | ||||
| Updated: February 11, 2007 (http://curl.haxx.se/docs/faq.html) | ||||
|                                   _   _ ____  _ | ||||
|                               ___| | | |  _ \| | | ||||
|                              / __| | | | |_) | | | ||||
| @@ -114,10 +114,10 @@ FAQ | ||||
|   libcurl | ||||
|  | ||||
|     A free and easy-to-use client-side URL transfer library, supporting FTP, | ||||
|     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! | ||||
|     FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, 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! | ||||
|  | ||||
|     libcurl is highly portable, it builds and works identically on numerous | ||||
|     platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, | ||||
| @@ -132,7 +132,8 @@ 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, LDAP, DICT, TELNET and FILE. | ||||
|     currently including HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, DICT, | ||||
|     TELNET and FILE. | ||||
|  | ||||
|   We pronounce curl and cURL with an initial k sound: [kurl]. | ||||
|  | ||||
| @@ -156,7 +157,7 @@ FAQ | ||||
|  | ||||
|   1.3 What is curl not? | ||||
|  | ||||
|   Curl is *not* a wget clone. That is a common misconception.  Never, during | ||||
|   Curl is not a wget clone. That is a common misconception.  Never, during | ||||
|   curl's development, have we intended curl to replace wget or compete on its | ||||
|   market. Curl is targeted at single-shot file transfers. | ||||
|  | ||||
| @@ -171,9 +172,10 @@ FAQ | ||||
|   Curl is not a PHP tool, even though it works perfectly well when used from | ||||
|   or with PHP (when using the PHP/CURL module). | ||||
|  | ||||
|   Curl is not a single-OS program. Curl exists, compiles, builds and runs | ||||
|   under a wide range of operating systems, including all modern Unixes (and a | ||||
|   bunch of older ones too), Windows, Amiga, BeOS, OS/2, OS X, QNX etc. | ||||
|   Curl is not a program for a single operating system. Curl exists, compiles, | ||||
|   builds and runs under a wide range of operating systems, including all | ||||
|   modern Unixes (and a bunch of older ones too), Windows, Amiga, BeOS, OS/2, | ||||
|   OS X, QNX etc. | ||||
|  | ||||
|   1.4 When will you make curl do XXXX ? | ||||
|  | ||||
| @@ -211,7 +213,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 450 contributors is found in the docs/THANKS | ||||
|   The full list of the more than 530 contributors is found in the docs/THANKS | ||||
|   file. | ||||
|  | ||||
|   curl is developed by a community, with Daniel at the wheel. | ||||
| @@ -287,13 +289,13 @@ FAQ | ||||
|  | ||||
|   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 | ||||
|   curl packages are downloaded from the curl.haxx.se and mirrors almost one | ||||
|   million times per year. 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 | ||||
|   More than 60 known named companies use curl in commercial environments and | ||||
|   products. More than 100 known named open source projects depend on | ||||
|   (lib)curl. | ||||
|  | ||||
| @@ -305,6 +307,9 @@ FAQ | ||||
|   based web servers. A guess is that a fair amount of these Linux | ||||
|   installations have curl installed. | ||||
|  | ||||
|   All this taken together, there is no doubt that there are millions of | ||||
|   (lib)curl users. | ||||
|  | ||||
|   http://curl.haxx.se/docs/companies.html | ||||
|   http://curl.haxx.se/docs/programs.html | ||||
|   http://curl.haxx.se/libcurl/using/apps.html | ||||
| @@ -338,8 +343,6 @@ FAQ | ||||
|     ./configure places the -L/usr/local/ssl/lib early enough in the command | ||||
|     line to make things work | ||||
|  | ||||
|     Solution submitted by: Bob Allison <allisonb@users.sourceforge.net> | ||||
|  | ||||
|     2.1.2 only the libssl lib is missing | ||||
|  | ||||
|     If all include files and the libcrypto lib is present, with only the | ||||
| @@ -355,10 +358,10 @@ FAQ | ||||
|  | ||||
|   2.2 Does curl work/build with other SSL libraries? | ||||
|  | ||||
|   Curl has been written to use OpenSSL or GnuTLS, although there should not be | ||||
|   many problems using a different library. If anyone does "port" curl to use a | ||||
|   different SSL library, we are of course very interested in getting the | ||||
|   patch! | ||||
|   Curl has been written to use OpenSSL, GnuTLS, yassl or NSS, although there | ||||
|   should not be many problems using a different library. If anyone does "port" | ||||
|   curl to use a different SSL library, we are of course very interested in | ||||
|   getting the patch! | ||||
|  | ||||
|   2.3 Where can I find a copy of LIBEAY32.DLL? | ||||
|  | ||||
| @@ -464,10 +467,12 @@ FAQ | ||||
|   install and use them, in the libcurl section of the curl web site: | ||||
|   http://curl.haxx.se/libcurl/ | ||||
|  | ||||
|   In February 2003, there are interfaces available for the following | ||||
|   languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal, | ||||
|   Pascal, Perl, PHP, PostgreSQL, Python, Rexx, Ruby, Scheme and Tcl. By the | ||||
|   time you read this, additional ones may have appeared! | ||||
|   In February 2007, there are interfaces available for the following | ||||
|   languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Dylan, Euphoria, Ferite, | ||||
|   Gambas, glib/GTK+, Java, Lisp, Lua, Mono, .NET, Object-Pascal, O'Caml, | ||||
|   Pascal, Perl, PHP, PostgreSQL, Python, R, Rexx, Ruby, Scheme, S-Lang, | ||||
|   Smalltalk, SPL, Tcl, Visual Basic, Q, wxwidgets and XBLite. By the time you | ||||
|   read this, additional ones may have appeared! | ||||
|  | ||||
|   3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP? | ||||
|  | ||||
| @@ -839,6 +844,8 @@ FAQ | ||||
|  | ||||
|     http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html | ||||
|  | ||||
|   No special locking is needed with a NSS-powered libcurl. NSS is thread-safe. | ||||
|  | ||||
|   5.2 How can I receive all data into a large memory chunk? | ||||
|  | ||||
|   [ See also the examples/getinmemory.c source ] | ||||
| @@ -896,8 +903,6 @@ FAQ | ||||
|   Similarly, if you use CURLOPT_READDATA you must also specify | ||||
|   CURLOPT_READFUNCTION. | ||||
|  | ||||
|   (Provided by Joel DeYoung and Bob Schader) | ||||
|  | ||||
|   5.6 What about Keep-Alive or persistent connections? | ||||
|  | ||||
|   curl and libcurl have excellent support for persistent connections when | ||||
| @@ -916,8 +921,6 @@ FAQ | ||||
|   options to the command line compiler. /MD (linking against MSVCRT dll) seems | ||||
|   to be the most commonly used option. | ||||
|  | ||||
|   (Provided by Andrew Francis) | ||||
|  | ||||
|   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. If you get linker error like "unknown symbol | ||||
|   | ||||
| @@ -87,7 +87,6 @@ FTP | ||||
|  - via http-proxy | ||||
|  - all operations can be tunneled through a http-proxy | ||||
|  - customizable to retrieve file modification date | ||||
|  - third party transfers | ||||
|  - no dir depth limit | ||||
|  | ||||
| FTPS (*1) | ||||
| @@ -117,10 +116,10 @@ FILE | ||||
| FOOTNOTES | ||||
| ========= | ||||
|  | ||||
|   *1 = requires OpenSSL or GnuTLS | ||||
|   *1 = requires OpenSSL, GnuTLS or NSS | ||||
|   *2 = requires OpenLDAP | ||||
|   *3 = requires a GSSAPI-compliant library, such as Heimdal or similar. | ||||
|   *4 = requires FBopenssl | ||||
|   *5 = requires a krb4 library, such as the MIT one or similar. | ||||
|   *6 = requires c-ares | ||||
|   *7 = requires OpenSSL specificly, as GnuTLS only supports SSLv3 and TLSv1 | ||||
|   *7 = requires OpenSSL or NSS, as GnuTLS only supports SSLv3 and TLSv1 | ||||
|   | ||||
							
								
								
									
										187
									
								
								docs/INSTALL
									
									
									
									
									
								
							
							
						
						
									
										187
									
								
								docs/INSTALL
									
									
									
									
									
								
							| @@ -16,7 +16,6 @@ Installing Binary Packages | ||||
|  | ||||
| UNIX | ||||
| ==== | ||||
|  | ||||
|    A normal unix installation is made in three or four steps (after you've | ||||
|    unpacked the source archive): | ||||
|  | ||||
| @@ -129,9 +128,48 @@ UNIX | ||||
|      If you're a curl developer and use gcc, you might want to enable more | ||||
|      debug options with the --enable-debug option. | ||||
|  | ||||
|      curl can be built to use a whole range of libraries to provide various | ||||
|      useful services, and configure will try to auto-detect a decent | ||||
|      default. But if you want to alter it, you can select how to deal with | ||||
|      each individual library. | ||||
|  | ||||
|      To build with GnuTLS support instead of OpenSSL for SSL/TLS, note that | ||||
|      you need to use both --without-ssl and --with-gnutls. | ||||
|  | ||||
|      To build with yassl support instead of OpenSSL or GunTLS, you must build | ||||
|      yassl with its OpenSSL emulation enabled and point to that directory root | ||||
|      with configure --with-ssl. | ||||
|  | ||||
|      To build with NSS support instead of OpenSSL for SSL/TLS, note that | ||||
|      you need to use both --without-ssl and --with-nss. | ||||
|  | ||||
|  | ||||
| Win32 | ||||
| ===== | ||||
|  | ||||
|    Building Windows DLLs and C run-time (CRT) linkage issues | ||||
|    --------------------------------------------------------- | ||||
|  | ||||
|    As a general rule, building a DLL with static CRT linkage is highly | ||||
|    discouraged, and intermixing CRTs in the same app is something to | ||||
|    avoid at any cost. | ||||
|  | ||||
|    Reading and comprehension of Microsoft Knowledge Base articles | ||||
|    KB94248 and KB140584 is a must for any Windows developer. Especially | ||||
|    important is full understanding if you are not going to follow the | ||||
|    advice given above. | ||||
|  | ||||
|    KB94248  - How To Use the C Run-Time | ||||
|               http://support.microsoft.com/kb/94248/en-us | ||||
|  | ||||
|    KB140584 - How to link with the correct C Run-Time (CRT) library | ||||
|               http://support.microsoft.com/kb/140584/en-us | ||||
|  | ||||
|    If your app is misbehaving in some strange way, or it is suffering | ||||
|    from memory corruption, before asking for further help, please try | ||||
|    first to rebuild every single library your app uses as well as your | ||||
|    app using the debug multithreaded dynamic C runtime. | ||||
|  | ||||
|    MingW32 | ||||
|    ------- | ||||
|  | ||||
| @@ -141,7 +179,16 @@ Win32 | ||||
|  | ||||
|    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. | ||||
|    adjust as necessary. It is also possible to override these paths with  | ||||
|    environment variables, for example: | ||||
|  | ||||
|      set ZLIB_PATH=c:\zlib-1.2.3 | ||||
|      set OPENSSL_PATH=c:\openssl-0.9.8d | ||||
|      set LIBSSH2_PATH=c:\libssh2-0.15 | ||||
|  | ||||
|    ATTENTION: if you want to build with libssh2 support you have to use latest | ||||
|    sources fetched from CVS - the current 0.14 release will NOT work! | ||||
|    Use 'make mingw32-ssh2-ssl' to build curl with SSH2 and SSL enabled. | ||||
|  | ||||
|    Cygwin | ||||
|    ------ | ||||
| @@ -172,7 +219,7 @@ Win32 | ||||
|    documentation on how to compile zlib. Define the ZLIB_PATH environment | ||||
|    variable to the location of zlib.h and zlib.lib, for example: | ||||
|  | ||||
|      set ZLIB_PATH=c:\zlib-1.2.1 | ||||
|      set ZLIB_PATH=c:\zlib-1.2.3 | ||||
|  | ||||
|    Then run 'nmake vc-zlib' in curl's root directory. | ||||
|  | ||||
| @@ -186,7 +233,7 @@ Win32 | ||||
|    Before running nmake define the OPENSSL_PATH environment variable with | ||||
|    the root/base directory of OpenSSL, for example: | ||||
|  | ||||
|      set OPENSSL_PATH=c:\openssl-0.9.7d | ||||
|      set OPENSSL_PATH=c:\openssl-0.9.8d | ||||
|  | ||||
|    Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root | ||||
|    directory.  'nmake vc-ssl' will create a libcurl static and dynamic | ||||
| @@ -280,7 +327,6 @@ Win32 | ||||
|  | ||||
| IBM OS/2 | ||||
| ======== | ||||
|  | ||||
|    Building under OS/2 is not much different from building under unix. | ||||
|    You need: | ||||
|  | ||||
| @@ -308,6 +354,7 @@ IBM OS/2 | ||||
|    If you're getting huge binaries, probably your makefiles have the -g in | ||||
|    CFLAGS. | ||||
|  | ||||
|  | ||||
| VMS | ||||
| === | ||||
|    (The VMS section is in whole contributed by the friendly Nico Baggus) | ||||
| @@ -378,6 +425,7 @@ VMS | ||||
|    13-jul-2001 | ||||
|    N. Baggus | ||||
|  | ||||
|  | ||||
| QNX | ||||
| === | ||||
|    (This section was graciously brought to us by David Bentham) | ||||
| @@ -429,17 +477,16 @@ AmigaOS | ||||
|  | ||||
| NetWare | ||||
| ======= | ||||
|  | ||||
|    To compile curl.nlm / libcurl.nlm you need: | ||||
|    - either any gcc / nlmconv, or CodeWarrior 7 PDK 4 or later. | ||||
|    - gnu make and awk running on the platform you compile on; | ||||
|      native Win32 versions can be downloaded from: | ||||
|      http://www.gknw.com/development/prgtools/ | ||||
|      http://www.gknw.net/development/prgtools/ | ||||
|    - recent Novell LibC SDK available from: | ||||
|      http://developer.novell.com/ndk/libc.htm | ||||
|    - optional zlib sources (at the moment only dynamic linking with zlib.imp); | ||||
|      sources with NetWare Makefile can be obtained from: | ||||
|      http://www.gknw.com/mirror/zlib/ | ||||
|      http://www.gknw.net/mirror/zlib/ | ||||
|    - optional OpenSSL sources (version 0.9.8 or later which builds with BSD); | ||||
|  | ||||
|    Set a search path to your compiler, linker and tools; on Linux make | ||||
| @@ -453,14 +500,101 @@ NetWare | ||||
|    with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked... | ||||
|    Any help in testing appreciated! | ||||
|    Builds automatically created 8 times a day from current CVS are here: | ||||
|    http://www.gknw.com/mirror/curl/autobuilds/ | ||||
|    http://www.gknw.net/mirror/curl/autobuilds/ | ||||
|    the status of these builds can be viewed at the autobuild table: | ||||
|    http://curl.haxx.se/auto/ | ||||
|  | ||||
|  | ||||
| eCos | ||||
| ==== | ||||
|    curl does not use the eCos build system, so you must first build eCos | ||||
|    separately, then link curl to the resulting eCos library.  Here's a sample | ||||
|    configure line to do so on an x86 Linux box targeting x86: | ||||
|  | ||||
|    GCCLIB=`gcc -print-libgcc-file-name` && \ | ||||
|    CFLAGS="-D__ECOS=1 -nostdinc -I$ECOS_INSTALL/include \ | ||||
|     -I`dirname $GCCLIB`/include" \ | ||||
|    LDFLAGS="-nostdlib -Wl,--gc-sections -Wl,-static \ | ||||
|     -L$ECOS_INSTALL/lib -Ttarget.ld -ltarget" \ | ||||
|    ./configure --host=i386 --disable-shared \ | ||||
|     --without-ssl --without-zlib --disable-manual --disable-ldap | ||||
|  | ||||
|    In most cases, eCos users will be using libcurl from within a custom | ||||
|    embedded application.  Using the standard 'curl' executable from | ||||
|    within eCos means facing the limitation of the standard eCos C | ||||
|    startup code which does not allow passing arguments in main().  To | ||||
|    run 'curl' from eCos and have it do something useful, you will need | ||||
|    to either modify the eCos startup code to pass in some arguments, or | ||||
|    modify the curl application itself to retrieve its arguments from | ||||
|    some location set by the bootloader or hard-code them. | ||||
|  | ||||
|    Something like the following patch could be used to hard-code some | ||||
|    arguments.  The MTAB_ENTRY line mounts a RAM disk as the root filesystem | ||||
|    (without mounting some kind of filesystem, eCos errors out all file | ||||
|    operations which curl does not take to well).  The next section synthesizes | ||||
|    some command-line arguments for curl to use, in this case to direct curl | ||||
|    to read further arguments from a file.  It then creates that file on the | ||||
|    RAM disk and places within it a URL to download: a file: URL that | ||||
|    just happens to point to the configuration file itself.  The results | ||||
|    of running curl in this way is the contents of the configuration file | ||||
|    printed to the console. | ||||
|  | ||||
| --- src/main.c	19 Jul 2006 19:09:56 -0000	1.363 | ||||
| +++ src/main.c	24 Jul 2006 21:37:23 -0000 | ||||
| @@ -4286,11 +4286,31 @@ | ||||
|  } | ||||
|   | ||||
|   | ||||
| +#ifdef __ECOS | ||||
| +#include <cyg/fileio/fileio.h> | ||||
| +MTAB_ENTRY( testfs_mte1, | ||||
| +                   "/", | ||||
| +                   "ramfs", | ||||
| +                   "", | ||||
| +                   0); | ||||
| +#endif | ||||
|   | ||||
|  int main(int argc, char *argv[]) | ||||
|  { | ||||
|    int res; | ||||
|    struct Configurable config; | ||||
| +#ifdef __ECOS | ||||
| +  char *args[] = {"ecos-curl", "-K", "curlconf.txt"}; | ||||
| +  FILE *f; | ||||
| +  argc = sizeof(args)/sizeof(args[0]); | ||||
| +  argv = args; | ||||
| + | ||||
| +  f = fopen("curlconf.txt", "w"); | ||||
| +  if (f) { | ||||
| +    fprintf(f, "--url file:curlconf.txt"); | ||||
| +    fclose(f); | ||||
| +  } | ||||
| +#endif | ||||
|    memset(&config, 0, sizeof(struct Configurable)); | ||||
|   | ||||
|    config.errors = stderr; /* default errors to stderr */ | ||||
|  | ||||
|  | ||||
| Minix | ||||
| ===== | ||||
|    curl can be compiled on Minix 3 using gcc (ACK has a few problems due | ||||
|    to mismatched headers and libraries as of ver. 3.1.2).  The gcc and bash | ||||
|    packages must be installed first.  The default heap size allocated to | ||||
|    bash is inadequate for running configure and will result in out of memory | ||||
|    errors.  Increase it with the command: | ||||
|  | ||||
|      chmem =2048000 /usr/local/bin/bash | ||||
|  | ||||
|    Make sure gcc and bash are in the PATH then configure curl with a | ||||
|    command like this: | ||||
|  | ||||
|      ./configure GREP=/usr/bin/grep AR=/usr/gnu/bin/gar --disable-ldap | ||||
|  | ||||
|    Then simply run 'make'. | ||||
|  | ||||
|  | ||||
| CROSS COMPILE | ||||
| ============= | ||||
|  | ||||
|    (This section was graciously brought to us by Jim Duey, with additions by | ||||
|    Dan Fandrich) | ||||
|  | ||||
| @@ -506,13 +640,17 @@ CROSS COMPILE | ||||
|  | ||||
|        ./configure --host=ARCH-OS | ||||
|  | ||||
|  | ||||
| REDUCING SIZE | ||||
| ============= | ||||
|    There are a number of configure options that can be used to reduce the | ||||
|    size of libcurl for embedded applications where binary size is an | ||||
|    important factor.  First, be sure to set the CFLAGS environment variable | ||||
|    when configuring with any compiler optimization flags to reduce the | ||||
|    size of the binary.  For gcc, this would mean at minimum: | ||||
|    important factor.  First, be sure to set the CFLAGS variable when | ||||
|    configuring with any relevant compiler optimization flags to reduce the | ||||
|    size of the binary.  For gcc, this would mean at minimum the -Os option | ||||
|    and probably the -march=X option as well, e.g.: | ||||
|  | ||||
|       env CFLAGS='-Os' ./configure ... | ||||
|       ./configure CFLAGS='-Os' ... | ||||
|  | ||||
|    Be sure to specify as many --disable- and --without- flags on the configure | ||||
|    command-line as you can to disable all the libcurl features that you | ||||
| @@ -526,10 +664,24 @@ CROSS COMPILE | ||||
|      --disable-crypto-auth (disables HTTP cryptographic authentication) | ||||
|      --disable-ipv6 (disables support for IPv6) | ||||
|      --disable-verbose (eliminates debugging strings and error code strings) | ||||
|      --enable-hidden-symbols (eliminates unneeded symbols in the shared library) | ||||
|      --without-libidn (disables support for the libidn DNS library) | ||||
|      --without-ssl (disables support for SSL/TLS) | ||||
|      --without-zlib (disables support for on-the-fly decompression) | ||||
|  | ||||
|    The GNU linker has a number of options to reduce the size of the libcurl | ||||
|    dynamic libraries on some platforms even further. Specify them by giving | ||||
|    the options -Wl,-Bsymbolic and -Wl,-s on the gcc command-line.   | ||||
|    Be sure also to strip debugging symbols from your binaries after | ||||
|    compiling using 'strip' (or the appropriate variant if cross-compiling). | ||||
|    If space is really tight, you may be able to remove some unneeded | ||||
|    sections of the shared library using the -R option to objcopy (e.g. the | ||||
|    .comment section). | ||||
|  | ||||
|    Using these techniques it is possible to create an HTTP-only shared | ||||
|    libcurl library for i386 Linux platforms that is less than 90 KB in | ||||
|    size (as of version 7.15.4). | ||||
|  | ||||
|    You may find that statically linking libcurl to your application will | ||||
|    result in a lower total size. | ||||
|  | ||||
| @@ -559,6 +711,7 @@ PORTS | ||||
|         - PowerPC Linux | ||||
|         - PowerPC Mac OS 9 | ||||
|         - PowerPC Mac OS X | ||||
|         - SuperH4 Linux 2.6.X | ||||
|         - SINIX-Z v5 | ||||
|         - Sparc Linux | ||||
|         - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10 | ||||
| @@ -567,12 +720,15 @@ PORTS | ||||
|         - StrongARM/ARM7/ARM9 Linux 2.4, 2.6 | ||||
|         - StrongARM NetBSD 1.4.1 | ||||
|         - Ultrix 4.3a | ||||
|         - UNICOS 9.0 | ||||
|         - i386 BeOS | ||||
|         - i386 DOS | ||||
|         - i386 eCos 1.3.1 | ||||
|         - i386 Esix 4.1 | ||||
|         - i386 FreeBSD | ||||
|         - i386 HURD | ||||
|         - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6 | ||||
|         - i386 MINIX 3.1.2 | ||||
|         - i386 NetBSD | ||||
|         - i386 Novell NetWare | ||||
|         - i386 OS/2 | ||||
| @@ -597,3 +753,6 @@ OpenSSL   http://www.openssl.org | ||||
| MingW     http://www.mingw.org | ||||
| OpenLDAP  http://www.openldap.org | ||||
| Zlib      http://www.gzip.org/zlib/ | ||||
| libssh2   http://www.libssh2.org | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,33 @@ join in and help us correct one or more of these! Also be sure to check the | ||||
| changelog of the current development status, as one or more of these problems | ||||
| may have been fixed since this was written! | ||||
|  | ||||
| 34. The SOCKS connection codes don't properly acknowledge (connect) timeouts. | ||||
| 41. When doing an operation over FTP that requires the ACCT command (but not | ||||
|   when logging in), the operation will fail since libcurl doesn't detect this | ||||
|   and thus fails to issue the correct command: | ||||
|   http://curl.haxx.se/bug/view.cgi?id=1693337 | ||||
|  | ||||
| 40. Mac OS X test failures (Daniel Johnson) | ||||
|   http://curl.haxx.se/mail/lib-2007-03/0095.html | ||||
|  | ||||
| 39. Steffen Rumler's Race Condition in Curl_proxyCONNECT: | ||||
|   http://curl.haxx.se/mail/lib-2007-01/0045.html | ||||
|  | ||||
| 38. Kumar Swamy Bhatt's problem in ftp/ssl "LIST" operation: | ||||
|   http://curl.haxx.se/mail/lib-2007-01/0103.html | ||||
|  | ||||
| 37. Having more than one connection to the same host when doing NTLM | ||||
|   authentication (with performs multiple "passes" and authenticates a | ||||
|   connection rather than a HTTP request), and particularly when using the | ||||
|   multi interface, there's a risk that libcurl will re-use a wrong connection | ||||
|   when doing the different passes in the NTLM negotiation and thus fail to | ||||
|   negotiate (in seemingly mysterious ways). | ||||
|  | ||||
| 35. Both SOCKS5 and SOCKS4 proxy connections are done blocking, which is very | ||||
|   bad when used with the multi interface. | ||||
|  | ||||
| 34. The SOCKS4 connection codes don't properly acknowledge (connect) timeouts. | ||||
|   Also see #12. According to bug #1556528, even the SOCKS5 connect code does | ||||
|   not do it right: http://curl.haxx.se/bug/view.cgi?id=1556528, | ||||
|  | ||||
| 33. Doing multi-pass HTTP authentication on a non-default port does not work. | ||||
|   This happens because the multi-pass code abuses the redirect following code | ||||
| @@ -39,17 +65,14 @@ may have been fixed since this was written! | ||||
|   "system context" will make it use wrong(?) user name - at least when compared | ||||
|   to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=1281867 | ||||
|  | ||||
| 25. When doing a CONNECT request with curl it doesn't properly handle if the | ||||
|   proxy closes the connection within the authentication "negotiation phase". | ||||
|   Like if you do HTTPS or similar over a proxy and you use perhaps | ||||
|   --proxy-anyauth. There's work in progress on this problem, and a recent | ||||
|   patch was posted here: http://curl.haxx.se/mail/lib-2005-08/0074.html | ||||
| 23. SOCKS-related problems: | ||||
|   A) libcurl doesn't support SOCKS for IPv6. | ||||
|   B) libcurl doesn't support FTPS over a SOCKS proxy. | ||||
|   C) We don't have any test cases for SOCKS proxy. | ||||
|   E) libcurl doesn't support active FTP over a SOCKS proxy | ||||
|  | ||||
| 23. We don't support SOCKS for IPv6. We don't support FTPS over a SOCKS proxy. | ||||
|   We don't have any test cases for SOCKS proxy. We probably have even more | ||||
|   bugs and lack of features when a SOCKS proxy is used. And there seem to be a | ||||
|   problem with SOCKS when doing FTP: See | ||||
|   http://curl.haxx.se/bug/view.cgi?id=1371540 | ||||
|   We probably have even more bugs and lack of features when a SOCKS proxy is | ||||
|   used. | ||||
|  | ||||
| 22. Sending files to a FTP server using curl on VMS, might lead to curl | ||||
|   complaining on "unaligned file size" on completion. The problem is related | ||||
| @@ -68,9 +91,6 @@ may have been fixed since this was written! | ||||
|  | ||||
|    Since 7.15.4 at least line endings are converted. | ||||
|  | ||||
| 19. FTP 3rd party transfers with the multi interface doesn't work. Test: | ||||
|   define CURL_MULTIEASY, rebuild curl, run test case 230 - 232. | ||||
|  | ||||
| 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 | ||||
| @@ -92,10 +112,7 @@ may have been fixed since this was written! | ||||
|  | ||||
| 12. When connecting to a SOCKS proxy, the (connect) timeout is not properly | ||||
|   acknowledged after the actual TCP connect (during the SOCKS "negotiate" | ||||
|   phase). Pointed out by Lucas. Fix: need to select() and timeout properly. | ||||
|  | ||||
| 11. Using configure --disable-[protocol] may cause 'make test' to fail for | ||||
|   tests using the disabled protocol(s). | ||||
|   phase). | ||||
|  | ||||
| 10. To get HTTP Negotiate authentication to work fine, you need to provide a | ||||
|   (fake) user name (this concerns both curl and the lib) because the code | ||||
| @@ -103,10 +120,6 @@ may have been fixed since this was written! | ||||
|   http://curl.haxx.se/bug/view.cgi?id=1004841. How? | ||||
|   http://curl.haxx.se/mail/lib-2004-08/0182.html | ||||
|  | ||||
| 9. --limit-rate using -d or -F does not work. This is because the limit logic | ||||
|   is provided by the curl app in its read/write callbacks, and when doing | ||||
|   -d/-F the callbacks aren't used! http://curl.haxx.se/bug/view.cgi?id=921395 | ||||
|  | ||||
| 8. Doing resumed upload over HTTP does not work with '-C -', because curl | ||||
|   doesn't do a HEAD first to get the initial size. This needs to be done | ||||
|   manually for HTTP PUT resume to work, and then '-C [index]'. | ||||
|   | ||||
| @@ -16,7 +16,7 @@ clause). You may still build your own copies that use them all, but | ||||
| distributing them as binaries would be to violate the GPL license - unless you | ||||
| accompany your license with an exception[2]. This particular problem was | ||||
| addressed when the Modified BSD license was created, which does not have the | ||||
| annoncement clause that collides with GPL. | ||||
| announcement clause that collides with GPL. | ||||
|  | ||||
| libcurl http://curl.haxx.se/docs/copyright.html | ||||
|  | ||||
| @@ -28,11 +28,12 @@ libcurl http://curl.haxx.se/docs/copyright.html | ||||
| OpenSSL http://www.openssl.org/source/license.html | ||||
|  | ||||
|         (May be used for SSL/TLS support) Uses an Original BSD-style license | ||||
|         with an announement clause that makes it "incompatible" with GPL. You | ||||
|         with an announcement clause that makes it "incompatible" with GPL. You | ||||
|         are not allowed to ship binaries that link with OpenSSL that includes | ||||
|         GPL code (unless that specific GPL code includes an exception for | ||||
|         OpenSSL - a habit that is growing more and more common). If OpenSSL's | ||||
|         licensing is a problem for you, consider using GnuTLS instead. | ||||
|         licensing is a problem for you, consider using GnuTLS or yassl | ||||
|         instead. | ||||
|  | ||||
| GnuTLS  http://www.gnutls.org/ | ||||
|  | ||||
| @@ -41,6 +42,19 @@ GnuTLS  http://www.gnutls.org/ | ||||
|         GnuTLS itself depends on and uses other libs (libgcrypt and | ||||
|         libgpg-error) and they too are LGPL- or GPL-licensed. | ||||
|  | ||||
| yassl   http://www.yassl.com/ | ||||
|  | ||||
|         (May be used for SSL/TLS support) Uses the GPL[1] license. If this is | ||||
|         a problem for you, consider using OpenSSL or GnuTLS instead. | ||||
|  | ||||
| NSS     http://www.mozilla.org/projects/security/pki/nss/ | ||||
|  | ||||
|         (May be used for SSL/TLS support) Is covered by the MPL[4] license, | ||||
|         the GPL[1] license and the LGPL[3] license. You may choose to license | ||||
|         the code under MPL terms, GPL terms, or LGPL terms. These licenses | ||||
|         grant you different permissions and impose different obligations. You | ||||
|         should select the license that best meets your needs. | ||||
|  | ||||
| c-ares  http://daniel.haxx.se/projects/c-ares/license.html | ||||
|  | ||||
|         (Used for asynchronous name resolves) Uses an MIT license that is very | ||||
| @@ -82,10 +96,10 @@ fbopenssl | ||||
|         that it uses the OpenSSL license and thus shares the same issues as | ||||
|         described for OpenSSL above. | ||||
|  | ||||
| libidn  http://www.gnu.org/licenses/lgpl.html | ||||
| libidn  http://josefsson.org/libidn/ | ||||
|  | ||||
|         (Used for IDNA support) Uses the GNU Lesser General Public | ||||
|         License. LGPL is a variation of GPL with slightly less aggressive | ||||
|         License [3]. LGPL is a variation of GPL with slightly less aggressive | ||||
|         "copyleft". This license requires more requirements to be met when | ||||
|         distributing binaries, see the license for details. Also note that if | ||||
|         you distribute a binary that includes this library, you must also | ||||
| @@ -98,9 +112,15 @@ OpenLDAP http://www.openldap.org/software/release/license.html | ||||
|         libcurl uses OpenLDAP as a shared library only, I have not heard of | ||||
|         anyone that ships OpenLDAP linked with libcurl in an app. | ||||
|  | ||||
| libssh2 http://www.libssh2.org/ | ||||
|  | ||||
|         (Used for scp and sftp support) libssh2 uses a Modified BSD-style | ||||
|         license. | ||||
|  | ||||
| [1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html | ||||
| [2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on | ||||
|       how to write such an exception to the GPL | ||||
| [3] = LGPL - GNU Lesser General Public License: | ||||
|       http://www.gnu.org/licenses/lgpl.html | ||||
| [4] = MPL - Mozilla Public License: | ||||
|       http://www.mozilla.org/MPL/ | ||||
|   | ||||
							
								
								
									
										51
									
								
								docs/MANUAL
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								docs/MANUAL
									
									
									
									
									
								
							| @@ -7,7 +7,7 @@ LATEST VERSION | ||||
|  | ||||
| SIMPLE USAGE | ||||
|  | ||||
|   Get the main page from netscape's web-server: | ||||
|   Get the main page from Netscape's web-server: | ||||
|  | ||||
|         curl http://www.netscape.com/ | ||||
|  | ||||
| @@ -31,6 +31,24 @@ SIMPLE USAGE | ||||
|  | ||||
|         curl ftp://cool.haxx.se/ http://www.weirdserver.com:8000/ | ||||
|  | ||||
|   Get a file off an FTPS server: | ||||
|  | ||||
|         curl ftps://files.are.secure.com/secrets.txt | ||||
|  | ||||
|   or use the more appropriate FTPS way to get the same file: | ||||
|  | ||||
|         curl --ftp-ssl ftp://files.are.secure.com/secrets.txt | ||||
|  | ||||
|   Get a file from an SSH server using SFTP: | ||||
|  | ||||
|         curl -u username sftp://shell.example.com/etc/issue | ||||
|  | ||||
|   Get a file from an SSH server using SCP using a private key to authenticate: | ||||
|  | ||||
|         curl -u username: --key ~/.ssh/id_dsa --pubkey ~/.ssh/id_dsa.pub \ | ||||
|         	scp://shell.example.com/~/personal.txt | ||||
|  | ||||
|  | ||||
| DOWNLOAD TO A FILE | ||||
|  | ||||
|   Get a web page and store in a local file: | ||||
| @@ -64,11 +82,14 @@ USING PASSWORDS | ||||
|    It is just like for FTP, but you may also want to specify and use | ||||
|    SSL-specific options for certificates etc. | ||||
|  | ||||
|    Note that using FTPS:// as prefix is the "implicit" way as described in the | ||||
|    standards while the recommended "explicit" way is done by using FTP:// and | ||||
|    the --ftp-ssl option. | ||||
|  | ||||
|  HTTP | ||||
|  | ||||
|    The HTTP URL doesn't support user and password in the URL string. Curl | ||||
|    does support that anyway to provide a ftp-style interface and thus you can | ||||
|    pick a file like: | ||||
|    Curl also supports user and password in HTTP URLs, thus you can pick a file | ||||
|    like: | ||||
|  | ||||
|         curl http://name:passwd@machine.domain/full/path/to/file | ||||
|  | ||||
| @@ -105,6 +126,8 @@ PROXY | ||||
|  | ||||
|         curl -U user:passwd -x my-proxy:888 http://www.get.this/ | ||||
|  | ||||
|  curl also supports SOCKS4 and SOCKS5 proxies with --socks4 and --socks5. | ||||
|  | ||||
|  See also the environment variables Curl support that offer further proxy | ||||
|  control. | ||||
|  | ||||
| @@ -685,9 +708,9 @@ TIME CONDITIONS | ||||
|         curl -z -local.html http://remote.server.com/remote.html | ||||
|  | ||||
|  You can specify a "free text" date as condition. Tell curl to only download | ||||
|  the file if it was updated since yesterday: | ||||
|  the file if it was updated since January 12, 2012: | ||||
|  | ||||
|         curl -z yesterday http://remote.server.com/remote.html | ||||
|         curl -z "Jan 12 2012" http://remote.server.com/remote.html | ||||
|  | ||||
|  Curl will then accept a wide range of date formats. You always make the date | ||||
|  check the other way around by prepending it with a dash '-'. | ||||
| @@ -846,6 +869,22 @@ PERSISTENT CONNECTIONS | ||||
|   transfers faster. If you use a http proxy for file transfers, practically | ||||
|   all transfers will be persistent. | ||||
|  | ||||
| MULTIPLE TRANSFERS WITH A SINGLE COMMAND LINE | ||||
|  | ||||
|   As is mentioned above, you can download multiple files with one command line | ||||
|   by simply adding more URLs. If you want those to get saved to a local file | ||||
|   instead of just printed to stdout, you need to add one save option for each | ||||
|   URL you specify. Note that this also goes for the -O option. | ||||
|  | ||||
|   For example: get two files and use -O for the first and a custom file | ||||
|   name for the second: | ||||
|  | ||||
|     curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg | ||||
|  | ||||
|   You can also upload multiple files in a similar fashion: | ||||
|  | ||||
|     curl -T local1 ftp://ftp.com/moo.exe -T local2 ftp://ftp.com/moo2.txt | ||||
|  | ||||
| MAILING LISTS | ||||
|  | ||||
|   For your convenience, we have several open mailing lists to discuss curl, | ||||
|   | ||||
							
								
								
									
										47
									
								
								docs/THANKS
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								docs/THANKS
									
									
									
									
									
								
							| @@ -8,6 +8,7 @@ Adrian Schuur | ||||
| Alan Pinstein | ||||
| Albert Chin-A-Young | ||||
| Albert Choy | ||||
| Ale Vesely | ||||
| Aleksandar Milivojevic | ||||
| Alex Neblett | ||||
| Alex Suykov | ||||
| @@ -16,14 +17,17 @@ Alexander Kourakos | ||||
| Alexander Krasnostavsky | ||||
| Alexander Lazic | ||||
| Alexander Zhuravlev | ||||
| Alexey Simak | ||||
| Alexis Carvalho | ||||
| Amol Pattekar | ||||
| Andi Jahja | ||||
| Andreas Damm | ||||
| Andreas Ntaflos | ||||
| Andreas Olsson | ||||
| Andreas Rieke | ||||
| Andres Garcia | ||||
| Andrew Benham | ||||
| Andrew Biggs | ||||
| Andrew Bushnell | ||||
| Andrew Francis | ||||
| Andrew Fuller | ||||
| @@ -34,19 +38,26 @@ Angus Mackay | ||||
| Antoine Calando | ||||
| Anton Kalmykov | ||||
| Arkadiusz Miskiewicz | ||||
| Armel Asselin | ||||
| Arve Knudsen | ||||
| Ates Goral | ||||
| Augustus Saunders | ||||
| Avery Fay | ||||
| Ben Greear | ||||
| Ben Madsen | ||||
| Benjamin Gerard | ||||
| Bernard Leak | ||||
| Bertrand Demiddelaer | ||||
| Bjorn Reese | ||||
| Bj<EFBFBD>rn Stenberg | ||||
| Bob Schader | ||||
| Bogdan Nicula | ||||
| Brad Burdick | ||||
| Bradford Bruce | ||||
| Brendan Jurd | ||||
| Brent Beardsley | ||||
| Brian Akins | ||||
| Brian Dessent | ||||
| Brian R Duffy | ||||
| Bruce Mitchener | ||||
| Bryan Henderson | ||||
| @@ -63,6 +74,7 @@ Christian Robottom Reis | ||||
| Christophe Demory | ||||
| Christophe Legry | ||||
| Christopher R. Palmer | ||||
| Ciprian Badescu | ||||
| Clarence Gardner | ||||
| Clifford Wolf | ||||
| Cody Jones | ||||
| @@ -77,6 +89,7 @@ Damien Adant | ||||
| Dan Becker | ||||
| Dan C | ||||
| Dan Fandrich | ||||
| Dan Nelson | ||||
| Dan Torop | ||||
| Dan Zitter | ||||
| Daniel Stenberg | ||||
| @@ -110,7 +123,9 @@ Dimitris Sarris | ||||
| Dinar | ||||
| Dirk Eddelbuettel | ||||
| Dirk Manske | ||||
| Dmitriy Sergeyev | ||||
| Dmitry Bartsevich | ||||
| Dmitry Rechkin | ||||
| Dolbneff A.V | ||||
| Domenico Andreoli | ||||
| Dominick Meglio | ||||
| @@ -189,6 +204,8 @@ Ian Wilkes | ||||
| Ignacio Vazquez-Abrams | ||||
| Igor Polyakov | ||||
| Ilguiz Latypov | ||||
| Ilja van Sprundel | ||||
| Ingmar Runge | ||||
| Ingo Ralf Blum | ||||
| Ingo Wilken | ||||
| Jacky Lam | ||||
| @@ -198,11 +215,14 @@ James Clancy | ||||
| James Cone | ||||
| James Gallagher | ||||
| James Griffiths | ||||
| James Housley | ||||
| James MacMillan | ||||
| Jamie Lokier | ||||
| Jamie Newton | ||||
| Jamie Wilkinson | ||||
| Jan Kunder | ||||
| Jared Lundell | ||||
| Jari Sundell | ||||
| Jason S. Priebe | ||||
| Jaz Fresh | ||||
| Jean Jacques Drouin | ||||
| @@ -249,6 +269,7 @@ Kai-Uwe Rommel | ||||
| Kang-Jin Lee | ||||
| Karl Moerder | ||||
| Karol Pietrzak | ||||
| Katie Wang | ||||
| Keith MacDonald | ||||
| Keith McGuigan | ||||
| Ken Hirsch | ||||
| @@ -286,6 +307,7 @@ Lucas Adamski | ||||
| Lukasz Czekierda | ||||
| Luke Call | ||||
| Luong Dinh Dung | ||||
| Maciej Karpiuk | ||||
| Maciej W. Rozycki | ||||
| Marc Boucher | ||||
| Marcelo Juchem  | ||||
| @@ -294,18 +316,22 @@ Marco G. Salvagno | ||||
| Marcus Webster | ||||
| Mario Schroeder | ||||
| Mark Butler | ||||
| Mark Eichin | ||||
| Mark Lentczner | ||||
| Markus Koetter | ||||
| Markus Moeller | ||||
| Markus Oberhumer | ||||
| Martijn Koster | ||||
| Martin C. Martin | ||||
| Martin Hedenfalk | ||||
| Martin Skinner | ||||
| Marty Kuhrt | ||||
| Maruko | ||||
| Massimiliano Ziccardi | ||||
| Mathias Axelsson | ||||
| Mats Lidell | ||||
| Matt Veenstra | ||||
| Matt Witherspoon | ||||
| Matthew Blain | ||||
| Matthew Clarke | ||||
| Maurice Barnum | ||||
| @@ -314,19 +340,24 @@ Mettgut Jamalla | ||||
| Michael Benedict | ||||
| Michael Curtis | ||||
| Michael Jahn | ||||
| Michael Jerris | ||||
| Michael Mealling | ||||
| Michael Wallner | ||||
| Michal Bonino | ||||
| Michal Marek | ||||
| Michele Bini | ||||
| Mihai Ionescu | ||||
| Mikael Sennerholm | ||||
| Mike Bytnar | ||||
| Mike Dobbs | ||||
| Mike Protts | ||||
| Miklos Nemeth | ||||
| Mitz Wark | ||||
| Mohamed Lrhazi | ||||
| Mohun Biswas | ||||
| Moonesamy | ||||
| Nathan O'Sullivan | ||||
| Nathanael Nerode | ||||
| Naveen Noel | ||||
| Neil Dunbar | ||||
| Neil Spring | ||||
| @@ -339,10 +370,13 @@ Nicolas Croiset | ||||
| Nicolas Fran<61>ois | ||||
| Niels van Tongeren | ||||
| Nikita Schmidt | ||||
| Nir Soffer | ||||
| Nis Jorgensen | ||||
| Nodak Sodak | ||||
| Norbert Novotny | ||||
| Ofer | ||||
| Olaf Stueben | ||||
| Olaf St<53>ben | ||||
| Oren Tirosh | ||||
| P R Schaffner | ||||
| Patrick Bihan-Faou | ||||
| @@ -351,6 +385,7 @@ Paul Harrington | ||||
| Paul Marquis | ||||
| Paul Moore | ||||
| Paul Nolan | ||||
| Paul Querna | ||||
| Pavel Cenek | ||||
| Pavel Orehov | ||||
| Pawel A. Gajda | ||||
| @@ -360,6 +395,7 @@ Peter Bray | ||||
| Peter Forret | ||||
| Peter Heuchert | ||||
| Peter Pentchev | ||||
| Peter Silva | ||||
| Peter Su | ||||
| Peter Sylvester | ||||
| Peter Todd | ||||
| @@ -379,6 +415,7 @@ Ralph Beckmann | ||||
| Ralph Mitchell | ||||
| Ramana Mokkapati | ||||
| Randy McMurchy | ||||
| Ravi Pratap | ||||
| Reinout van Schouwen | ||||
| Renaud Chaillat | ||||
| Renaud Duhaut | ||||
| @@ -397,10 +434,13 @@ Rick Jones | ||||
| Rick Richardson | ||||
| Rob Stanzel | ||||
| Robert D. Young | ||||
| Robert Foreman | ||||
| Robert Olson | ||||
| Robert Weaver | ||||
| Robin Kay | ||||
| Robson Braga Araujo | ||||
| Rodney Simmons | ||||
| Roland Blom | ||||
| Roland Krikava | ||||
| Roland Zimmermann | ||||
| Roman Koifman | ||||
| @@ -421,6 +461,7 @@ Scott Davis | ||||
| Sebastien Willemijns | ||||
| Sergio Ballestrero | ||||
| Seshubabu Pasam | ||||
| Sh Diao | ||||
| Shard | ||||
| Shawn Poulson | ||||
| Shmulik Regev | ||||
| @@ -431,6 +472,7 @@ Simon Liu | ||||
| Spiridonoff A.V | ||||
| Stadler Stephan | ||||
| Stefan Esser | ||||
| Stefan Krause | ||||
| Stefan Ulrich | ||||
| Stephan Bergmann | ||||
| Stephen Kick | ||||
| @@ -468,6 +510,7 @@ Tomas Szepe | ||||
| Tomasz Lacki | ||||
| Tommy Tam | ||||
| Ton Voon | ||||
| Toon Verwaest | ||||
| Tor Arntsen | ||||
| Torsten Foertsch | ||||
| Toshiyuki Maezawa | ||||
| @@ -477,6 +520,8 @@ Troy Engel | ||||
| Tupone Alfredo | ||||
| Ulf H<>rnhammar | ||||
| Ulrich Zadow | ||||
| Venkat Akella | ||||
| Victor Snezhko | ||||
| Vilmos Nebehaj | ||||
| Vincent Bronner | ||||
| Vincent Penquerc'h | ||||
| @@ -490,8 +535,10 @@ Wesley Laxton | ||||
| Wez Furlong | ||||
| Wilfredo Sanchez | ||||
| Wojciech Zwiefka | ||||
| Xavier Bouchoux | ||||
| Yang Tse | ||||
| Yarram Sunil | ||||
| Yves Lejeune | ||||
| Zvi Har'El  | ||||
| nk | ||||
| swalkaus at yahoo.com | ||||
|   | ||||
							
								
								
									
										34
									
								
								docs/TODO
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								docs/TODO
									
									
									
									
									
								
							| @@ -43,10 +43,6 @@ TODO | ||||
|    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 | ||||
| @@ -115,10 +111,6 @@ TODO | ||||
|  | ||||
|  HTTP | ||||
|  | ||||
|  * Pipelining. Sending multiple requests before the previous one(s) are done. | ||||
|    This could possibly be implemented using the multi interface to queue | ||||
|    requests and the response data. | ||||
|  | ||||
|  * When doing CONNECT to a HTTP proxy, libcurl always uses HTTP/1.0. This has | ||||
|    never been reported as causing trouble to anyone, but should be considered | ||||
|    to use the HTTP version the user has chosen. | ||||
| @@ -135,6 +127,10 @@ TODO | ||||
|  | ||||
|  SSL | ||||
|  | ||||
|  * Provide a libcurl API for setting mutex callbacks in the underlying SSL | ||||
|    library, so that the same application code can use mutex-locking | ||||
|    independently of OpenSSL or GnutTLS being used. | ||||
|  | ||||
|  * Anton Fedorov's "dumpcert" patch: | ||||
|    http://curl.haxx.se/mail/lib-2004-03/0088.html | ||||
|  | ||||
| @@ -161,18 +157,14 @@ TODO | ||||
|    Clark) | ||||
|  | ||||
|  * Make curl's SSL layer capable of using other free SSL libraries.  Such as | ||||
|    Mozilla Security Services | ||||
|    (http://www.mozilla.org/projects/security/pki/nss/), MatrixSSL | ||||
|    (http://www.matrixssl.org/) or yaSSL (http://yassl.com/). At least the | ||||
|    latter two could be alternatives for those looking to reduce the footprint | ||||
|    of libcurl built with OpenSSL or GnuTLS. | ||||
|    MatrixSSL (http://www.matrixssl.org/). | ||||
|  | ||||
|  * Peter Sylvester's patch for SRP on the TLS layer. | ||||
|    Awaits OpenSSL support for this, no need to support this in libcurl before | ||||
|    there's an OpenSSL release that does it. | ||||
|  | ||||
|  * make the configure --with-ssl option first check for OpenSSL and then for | ||||
|    GnuTLS if OpenSSL wasn't detected. | ||||
|  * make the configure --with-ssl option first check for OpenSSL, then GnuTLS, | ||||
|    then NSS... | ||||
|  | ||||
|  GnuTLS | ||||
|  | ||||
| @@ -188,8 +180,8 @@ TODO | ||||
|  | ||||
|  * Fix the connection phase to be non-blocking when multi interface is used | ||||
|  | ||||
|  * Add a way to check if the connection seems to be alive, to corrspond to the | ||||
|    SSL_peak() way we use with OpenSSL. | ||||
|  * Add a way to check if the connection seems to be alive, to correspond to | ||||
|    the SSL_peak() way we use with OpenSSL. | ||||
|  | ||||
|  LDAP | ||||
|  | ||||
| @@ -201,10 +193,6 @@ TODO | ||||
|  | ||||
|  * RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description) | ||||
|  | ||||
|  * SFTP/SCP/SSH (no RFCs for protocol nor URI/URL format). An implementation | ||||
|    should most probably use an existing ssh library, such as OpenSSH. or | ||||
|    libssh2.org | ||||
|  | ||||
|  * RSYNC (no RFCs for protocol nor URI/URL format).  An implementation should | ||||
|    most probably use an existing rsync library, such as librsync. | ||||
|  | ||||
| @@ -273,6 +261,10 @@ TODO | ||||
|  | ||||
|  TEST SUITE | ||||
|  | ||||
|  * Make our own version of stunnel for simple port forwarding to enable HTTPS | ||||
|    and FTP-SSL tests without the stunnel dependency, and it could allow us to | ||||
|    provide test tools built with either OpenSSL or GnuTLS | ||||
|  | ||||
|  * Make the test servers able to serve multiple running test suites. Like if | ||||
|    two users run 'make test' at once. | ||||
|  | ||||
|   | ||||
							
								
								
									
										194
									
								
								docs/curl.1
									
									
									
									
									
								
							
							
						
						
									
										194
									
								
								docs/curl.1
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2007, 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 "21 Mar 2006" "Curl 7.15.4" "Curl Manual" | ||||
| .TH curl 1 "28 Feb 2007" "Curl 7.16.2" "Curl Manual" | ||||
| .SH NAME | ||||
| curl \- transfer a URL | ||||
| .SH SYNOPSIS | ||||
| @@ -30,13 +30,13 @@ 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, DICT, TELNET, LDAP or FILE). | ||||
| The command is designed to work without user interaction. | ||||
| protocols (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, 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 | ||||
| transfer resume and more. As you will see below, the amount of features will | ||||
| make your head spin! | ||||
| authentication, ftp upload, HTTP post, SSL connections, cookies, file transfer | ||||
| resume and more. As you will see below, the amount of features will make your | ||||
| head spin! | ||||
|  | ||||
| curl is powered by libcurl for all transfer-related features. See | ||||
| .BR libcurl (3) | ||||
| @@ -167,6 +167,10 @@ difference. | ||||
| must be using valid ciphers. Read up on SSL cipher list details on this URL: | ||||
| \fIhttp://www.openssl.org/docs/apps/ciphers.html\fP | ||||
|  | ||||
| NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of | ||||
| NSS ciphers is in the NSSCipherSuite entry at this URL: | ||||
| \fIhttp://directory.fedora.redhat.com/docs/mod_nss.html#Directives\fP | ||||
|  | ||||
| If this option is used several times, the last one will override the others. | ||||
| .IP "--compressed" | ||||
| (HTTP) Request a compressed response using one of the algorithms libcurl | ||||
| @@ -312,25 +316,29 @@ run curl. | ||||
|  | ||||
| If this option is used several times, each occurrence will toggle this on/off. | ||||
| .IP "--egd-file <file>" | ||||
| (HTTPS) Specify the path name to the Entropy Gathering Daemon socket. The | ||||
| socket is used to seed the random engine for SSL connections. See also the | ||||
| (SSL) Specify the path name to the Entropy Gathering Daemon socket. The socket | ||||
| is used to seed the random engine for SSL connections. See also the | ||||
| \fI--random-file\fP option. | ||||
| .IP "-E/--cert <certificate[:password]>" | ||||
| (HTTPS) | ||||
| Tells curl to use the specified certificate file when getting a file | ||||
| with HTTPS. The certificate must be in PEM format. | ||||
| If the optional password isn't specified, it will be queried for on | ||||
| the terminal. Note that this certificate is the private key and the private | ||||
| certificate concatenated! | ||||
| (SSL) Tells curl to use the specified certificate file when getting a file | ||||
| with HTTPS or FTPS. The certificate must be in PEM format.  If the optional | ||||
| password isn't specified, it will be queried for on the terminal. Note that | ||||
| this option assumes a \&"certificate" file that is the private key and the | ||||
| private certificate concatenated! See \fI--cert\fP and \fI--key\fP to specify | ||||
| them independently. | ||||
|  | ||||
| If curl is built against the NSS SSL library then this option tells | ||||
| curl the nickname of the certificate to use within the NSS database defined | ||||
| by --cacert. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--cert-type <type>" | ||||
| (SSL) Tells curl what certificate type the provided certificate is in. PEM, | ||||
| DER and ENG are recognized types. | ||||
| DER and ENG are recognized types.  If not specified, PEM is assumed. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--cacert <CA certificate>" | ||||
| (HTTPS) Tells curl to use the specified certificate file to verify the | ||||
| (SSL) Tells curl to use the specified certificate file to verify the | ||||
| peer. The file may contain multiple CA certificates. The certificate(s) must | ||||
| be in PEM format. | ||||
|  | ||||
| @@ -342,12 +350,15 @@ The windows version of curl will automatically look for a CA certs file named | ||||
| \'curl-ca-bundle.crt\', either in the same directory as curl.exe, or in the | ||||
| Current Working Directory, or in any folder along your PATH. | ||||
|  | ||||
| If curl is built against the NSS SSL library then this option tells | ||||
| curl the directory that the NSS certificate database resides in. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--capath <CA certificate directory>" | ||||
| (HTTPS) Tells curl to use the specified certificate directory to verify the | ||||
| (SSL) Tells curl to use the specified certificate directory to verify the | ||||
| peer. The certificates must be in PEM format, and the directory must have been | ||||
| processed using the c_rehash utility supplied with openssl. Using | ||||
| \fI--capath\fP can allow curl to make https connections much more efficiently | ||||
| \fI--capath\fP can allow curl to make SSL-connections much more efficiently | ||||
| than using \fI--cacert\fP if the \fI--cacert\fP file contains many CA | ||||
| certificates. | ||||
|  | ||||
| @@ -359,6 +370,10 @@ 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. | ||||
|  | ||||
| This method is not fail-safe and there are occasions where non-succesful | ||||
| response codes will slip through, especially when authentication is involved | ||||
| (response codes 401 and 407). | ||||
|  | ||||
| If this option is used twice, the second will again disable silent failure. | ||||
| .IP "--ftp-account [data]" | ||||
| (FTP) When an FTP server asks for "account data" after user name and password | ||||
| @@ -395,7 +410,11 @@ in 7.11.0) | ||||
|  | ||||
| If this option is used several times, the following occurrences make no | ||||
| difference. | ||||
|  | ||||
| .IP "--ftp-alternative-to-user <command>" | ||||
| (FTP) If authenticating with the USER and PASS commands fails, send this | ||||
| command.  When connecting to Tumbleweed's Secure Transport server over FTPS | ||||
| using a client certificate, using "SITE AUTH" will tell the server to retrieve | ||||
| the username from the certificate. (Added in 7.15.5) | ||||
| .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 | ||||
| @@ -407,9 +426,40 @@ This option has no effect if PORT, EPRT or EPSV is used instead of PASV. | ||||
| If this option is used twice, the second will again use the server's suggested | ||||
| address. | ||||
| .IP "--ftp-ssl" | ||||
| (FTP) Make the FTP connection switch to use SSL/TLS. (Added in 7.11.0) | ||||
| (FTP) Try to use SSL/TLS for the FTP connection.  Reverts to a non-secure | ||||
| connection if the server doesn't support SSL/TLS.  See also | ||||
| \fI--ftp-ssl-control\fP and \fI--ftp-ssl-reqd\fP for different levels of | ||||
| encryption required. (Added in 7.11.0) | ||||
|  | ||||
| If this option is used twice, the second will again disable this. | ||||
| .IP "--ftp-ssl-control" | ||||
| (FTP) Require SSL/TLS for the ftp login, clear for transfer.  Allows secure | ||||
| authentication, but non-encrypted data transfers for efficiency.  Fails the | ||||
| transfer if the server doesn't support SSL/TLS.  (Added in 7.16.0) | ||||
|  | ||||
| If this option is used twice, the second will again disable this. | ||||
| .IP "--ftp-ssl-reqd" | ||||
| (FTP) Require SSL/TLS for the FTP connection. | ||||
| Terminates the connection if the server doesn't support SSL/TLS. | ||||
| (Added in 7.15.5) | ||||
|  | ||||
| If this option is used twice, the second will again disable this. | ||||
| .IP "--ftp-ssl-ccc" | ||||
| (FTP) Use CCC (Clear Command Channel) | ||||
| Shuts down the SSL/TLS layer after authenticating. The rest of the | ||||
| control channel communication will be unencrypted. This allows | ||||
| NAT routers to follow the FTP transaction. The default mode is | ||||
| passive. See --ftp-ssl-ccc-mode for other modes. | ||||
| (Added in 7.16.1) | ||||
|  | ||||
| If this option is used twice, the second will again disable this. | ||||
| .IP "--ftp-ssl-ccc-mode [active/passive]" | ||||
| (FTP) Use CCC (Clear Command Channel) | ||||
| Sets the CCC mode. The passive mode will not initiate the shutdown, but | ||||
| instead wait for the server to do it, and will not reply to the | ||||
| shutdown from the server. The active mode initiates the shutdown and | ||||
| waits for a reply from the server. | ||||
| (Added in 7.16.2) | ||||
| .IP "-F/--form <name=content>" | ||||
| (HTTP) This lets curl emulate a filled in form in which a user has pressed the | ||||
| submit button. This causes curl to POST data using the Content-Type | ||||
| @@ -476,9 +526,9 @@ of extra headers. Note that if you should add a custom header that has the | ||||
| same name as one of the internal ones curl would use, your externally set | ||||
| header will be used instead of the internal one. This allows you to make even | ||||
| trickier stuff than curl would normally do. You should not replace internally | ||||
| set headers without knowing perfectly well what you're doing. Replacing an | ||||
| internal header with one without content on the right side of the colon will | ||||
| prevent that header from appearing. | ||||
| set headers without knowing perfectly well what you're doing. Remove an | ||||
| internal header by giving a replacement without content on the right side of | ||||
| the colon, as in: -H \&"Host:". | ||||
|  | ||||
| curl will make sure that each header you add/replace get sent with the proper | ||||
| end of line marker, you should thus \fBnot\fP add that as a part of the header | ||||
| @@ -527,15 +577,19 @@ 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. | ||||
|  | ||||
| See this online resource for further details: | ||||
| \fBhttp://curl.haxx.se/docs/sslcerts.html\fP | ||||
|  | ||||
| If this option is used twice, the second time will again disable it. | ||||
| .IP "--key <key>" | ||||
| (SSL) Private key file name. Allows you to provide your private key in this | ||||
| (SSL/SSH) Private key file name. Allows you to provide your private key in this | ||||
| separate file. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--key-type <type>" | ||||
| (SSL) Private key file type. Specify which type your \fI--key\fP provided | ||||
| private key is. DER, PEM and ENG are supported. | ||||
| private key is. DER, PEM and ENG are supported. If not specified, PEM is | ||||
| assumed. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--krb4 <level>" | ||||
| @@ -554,9 +608,11 @@ 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 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. | ||||
| treated as a comment. Only write one option per physical line in the config | ||||
| file. | ||||
|  | ||||
| Specify the filename as '-' to make curl read the file from stdin. | ||||
| Specify the filename to -K/--config as '-' to make curl read the file from | ||||
| stdin. | ||||
|  | ||||
| Note that to be able to specify a URL in the config file, you need to specify | ||||
| it using the \fI--url\fP option, and not by simply writing the URL on its own | ||||
| @@ -564,7 +620,8 @@ line. So, it could look similar to this: | ||||
|  | ||||
| url = "http://curl.haxx.se/docs/" | ||||
|  | ||||
| This option can be used multiple times. | ||||
| Long option names can optionally be given in the config file without the | ||||
| initial double dashes. | ||||
|  | ||||
| When curl is invoked, it always (unless \fI-q\fP is used) checks for a default | ||||
| config file and uses it if found. The default config file is checked for in | ||||
| @@ -579,6 +636,28 @@ resort the '%USERPROFILE%\Application Data'. | ||||
| 2) On windows, if there is no _curlrc file in the home dir, it checks for one | ||||
| in the same dir the executable curl is placed. On unix-like systems, it will | ||||
| simply try to load .curlrc from the determined home dir. | ||||
|  | ||||
| .nf | ||||
| # --- Example file --- | ||||
| # this is a comment | ||||
| url = "curl.haxx.se" | ||||
| output = "curlhere.html" | ||||
| user-agent = "superagent/1.0" | ||||
|  | ||||
| # and fetch another URL too | ||||
| url = "curl.haxx.se/docs/manpage.html" | ||||
| -O | ||||
| referer = "http://nowhereatall.com/" | ||||
| # --- End of example file --- | ||||
| .fi | ||||
|  | ||||
| This option can be used multiple times to load multiple config files. | ||||
| .IP "--libcurl <file>" | ||||
| Append this option to any ordinary curl command line, and you will get a | ||||
| libcurl-using source code written to the file that does the equivalent | ||||
| operation of what your command line operation does! | ||||
|  | ||||
| If this option is used several times, the last given file name will be used. | ||||
| .IP "--limit-rate <speed>" | ||||
| Specify the maximum transfer rate you want curl to use. This feature is useful | ||||
| if you have a limited pipe and you'd like your transfer not use your entire | ||||
| @@ -588,6 +667,10 @@ The given speed is measured in bytes/second, unless a suffix is appended. | ||||
| Appending 'k' or 'K' will count the number as kilobytes, 'm' or M' makes it | ||||
| megabytes while 'g' or 'G' makes it gigabytes. Examples: 200K, 3m and 1G. | ||||
|  | ||||
| The given rate is the average speed, counted during the entire transfer. It | ||||
| means that curl might use higher transfer speeds in short bursts, but over | ||||
| time it uses no more than the given rate. | ||||
|  | ||||
| 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. | ||||
| @@ -692,6 +775,15 @@ will output the data in chunks, not necessarily exactly when the data arrives. | ||||
| Using this option will disable that buffering. | ||||
|  | ||||
| If this option is used twice, the second will again switch on buffering. | ||||
| .IP "--no-sessionid" | ||||
| (SSL) Disable curl's use of SSL session-ID caching.  By default all transfers | ||||
| are done using the cache. Note that while nothing ever should get hurt by | ||||
| attempting to reuse SSL session-IDs, there seem to be broken SSL | ||||
| implementations in the wild that may require you to disable this in order for | ||||
| you to succeed. (Added in 7.16.0) | ||||
|  | ||||
| If this option is used twice, the second will again switch on use of the | ||||
| session cache. | ||||
| .IP "--ntlm" | ||||
| (HTTP) Enables NTLM authentication. The NTLM authentication method was | ||||
| designed by Microsoft and is used by IIS web servers. It is a proprietary | ||||
| @@ -733,7 +825,7 @@ nothing else. | ||||
|  | ||||
| You may use this option as many times as you have number of URLs. | ||||
| .IP "--pass <phrase>" | ||||
| (SSL) Pass phrase for the private key | ||||
| (SSL/SSH) Pass phrase for the private key | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--proxy-anyauth" | ||||
| @@ -768,6 +860,11 @@ CONNECT request and requires that the proxy allows direct connect to the | ||||
| remote port number curl wants to tunnel through to. | ||||
|  | ||||
| If this option is used twice, the second will again disable proxy tunnel. | ||||
| .IP "--pubkey <key>" | ||||
| (SSH) Public key file name. Allows you to provide your public key in this | ||||
| separate file. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-P/--ftp-port <address>" | ||||
| (FTP) Reverses the initiator/listener roles when connecting with ftp. This | ||||
| switch makes Curl use the PORT command instead of PASV. In practice, PORT | ||||
| @@ -805,7 +902,7 @@ must send syntactically correct FTP commands as RFC959 defines. | ||||
|  | ||||
| This option can be used multiple times. | ||||
| .IP "--random-file <file>" | ||||
| (HTTPS) Specify the path name to file containing what will be considered as | ||||
| (SSL) Specify the path name to file containing what will be considered as | ||||
| random data. The data is used to seed the random engine for SSL connections. | ||||
| See also the \fI--egd-file\fP option. | ||||
| .IP "-r/--range <range>" | ||||
| @@ -847,6 +944,11 @@ FTP range downloads only support the simple syntax 'start-stop' (optionally | ||||
| with one of the numbers omitted). It depends on the non-RFC command SIZE. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--raw" | ||||
| When used, it disables all internal HTTP decoding of content or transfer | ||||
| encodings and instead makes them passed on unaltered, raw. (Added in 7.16.2) | ||||
|  | ||||
| If this option is used several times, each occurrence toggles this on/off. | ||||
| .IP "-R/--remote-time" | ||||
| When used, this will make libcurl attempt to figure out the timestamp of the | ||||
| remote file, and if that is available make the local file get that same | ||||
| @@ -955,6 +1057,9 @@ 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. | ||||
|  | ||||
| This option overrides previous uses of \fI-v/--verbose\fP or | ||||
| \fI--trace-ascii\fP. | ||||
|  | ||||
| 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 | ||||
| @@ -965,6 +1070,8 @@ 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. | ||||
|  | ||||
| This option overrides previous uses of \fI-v/--verbose\fP or \fI--trace\fP. | ||||
|  | ||||
| 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. | ||||
| @@ -1006,7 +1113,9 @@ might be option you're looking for. | ||||
| If you think this option still doesn't give you enough details, consider using | ||||
| \fI--trace\fP or \fI--trace-ascii\fP instead. | ||||
|  | ||||
| If this option is used twice, the second will again disable verbose. | ||||
| This option overrides previous uses of \fI--trace-ascii\fP or \fI--trace\fP. | ||||
|  | ||||
| If this option is used twice, the second will do nothing extra. | ||||
| .IP "-V/--version" | ||||
| Displays information about curl and the libcurl version it uses. | ||||
|  | ||||
| @@ -1183,7 +1292,7 @@ not set. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "-z/--time-cond <date expression>" | ||||
| (HTTP) Request a file that has been modified later than the given time and | ||||
| (HTTP/FTP) Request a file that has been modified later than the given time and | ||||
| date, or one that has been modified before that time. The date expression can | ||||
| be all sorts of date strings or if it doesn't match any internal ones, it | ||||
| tries to get the time from a given file name instead! See the | ||||
| @@ -1205,25 +1314,14 @@ If this option is used several times, the last one will be used. | ||||
| (HTTP) Forces curl to issue its requests using HTTP 1.0 instead of using its | ||||
| internally preferred: HTTP 1.1. | ||||
| .IP "-1/--tlsv1" | ||||
| (HTTPS) | ||||
| (SSL) | ||||
| Forces curl to use TSL version 1 when negotiating with a remote TLS server. | ||||
| .IP "-2/--sslv2" | ||||
| (HTTPS) | ||||
| (SSL) | ||||
| Forces curl to use SSL version 2 when negotiating with a remote SSL server. | ||||
| .IP "-3/--sslv3" | ||||
| (HTTPS) | ||||
| (SSL) | ||||
| Forces curl to use SSL version 3 when negotiating with a remote SSL server. | ||||
| .IP "--3p-quote" | ||||
| (FTP) Specify arbitrary commands to send to the source server. See the | ||||
| \fI-Q/--quote\fP option for details. (Added in 7.13.0) | ||||
| .IP "--3p-url" | ||||
| (FTP) Activates a FTP 3rd party transfer. Specifies the source URL to get a | ||||
| file from, while the "normal" URL will be used as target URL, the file that | ||||
| will be written/created. | ||||
|  | ||||
| Note that not all FTP server allow 3rd party transfers. (Added in 7.13.0) | ||||
| .IP "--3p-user" | ||||
| (FTP) Specify user:password for the source URL transfer. (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 | ||||
| @@ -1240,7 +1338,7 @@ If this option is used twice, the second will again disable the progress bar. | ||||
| .SH FILES | ||||
| .I ~/.curlrc | ||||
| .RS | ||||
| Default config file. | ||||
| Default config file, see \fI-K/--config\fP for details. | ||||
|  | ||||
| .SH ENVIRONMENT | ||||
| .IP "http_proxy [protocol://]<host>[:port]" | ||||
|   | ||||
							
								
								
									
										166
									
								
								docs/examples/10-at-a-time.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								docs/examples/10-at-a-time.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,166 @@ | ||||
| /***************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * $Id$ | ||||
|  * | ||||
|  * Example application source code using the multi interface to download many | ||||
|  * files, but with a capped maximum amount of simultaneous transfers. | ||||
|  * | ||||
|  * Written by Michael Wallner | ||||
|  */ | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <curl/multi.h> | ||||
|  | ||||
| static const char *urls[] = { | ||||
|   "http://www.microsoft.com", | ||||
|   "http://www.opensource.org", | ||||
|   "http://www.google.com", | ||||
|   "http://www.yahoo.com", | ||||
|   "http://www.ibm.com", | ||||
|   "http://www.mysql.com", | ||||
|   "http://www.oracle.com", | ||||
|   "http://www.ripe.net", | ||||
|   "http://www.iana.org", | ||||
|   "http://www.amazon.com", | ||||
|   "http://www.netcraft.com", | ||||
|   "http://www.heise.de", | ||||
|   "http://www.chip.de", | ||||
|   "http://www.ca.com", | ||||
|   "http://www.cnet.com", | ||||
|   "http://www.news.com", | ||||
|   "http://www.cnn.com", | ||||
|   "http://www.wikipedia.org", | ||||
|   "http://www.dell.com", | ||||
|   "http://www.hp.com", | ||||
|   "http://www.cert.org", | ||||
|   "http://www.mit.edu", | ||||
|   "http://www.nist.gov", | ||||
|   "http://www.ebay.com", | ||||
|   "http://www.playstation.com", | ||||
|   "http://www.uefa.com", | ||||
|   "http://www.ieee.org", | ||||
|   "http://www.apple.com", | ||||
|   "http://www.sony.com", | ||||
|   "http://www.symantec.com", | ||||
|   "http://www.zdnet.com", | ||||
|   "http://www.fujitsu.com", | ||||
|   "http://www.supermicro.com", | ||||
|   "http://www.hotmail.com", | ||||
|   "http://www.ecma.com", | ||||
|   "http://www.bbc.co.uk", | ||||
|   "http://news.google.com", | ||||
|   "http://www.foxnews.com", | ||||
|   "http://www.msn.com", | ||||
|   "http://www.wired.com", | ||||
|   "http://www.sky.com", | ||||
|   "http://www.usatoday.com", | ||||
|   "http://www.cbs.com", | ||||
|   "http://www.nbc.com", | ||||
|   "http://slashdot.org", | ||||
|   "http://www.bloglines.com", | ||||
|   "http://www.techweb.com", | ||||
|   "http://www.newslink.org", | ||||
|   "http://www.un.org", | ||||
| }; | ||||
|  | ||||
| #define MAX 10 /* number of simultaneous transfers */ | ||||
| #define CNT sizeof(urls)/sizeof(char*) /* total number of transfers to do */ | ||||
|  | ||||
| static int cb(char *d, size_t n, size_t l, void *p) | ||||
| { | ||||
|   /* take care of the data here, ignored in this example */ | ||||
|   (void)d; | ||||
|   (void)p; | ||||
|   return n*l; | ||||
| } | ||||
|  | ||||
| static void init(CURLM *cm, int i) | ||||
| { | ||||
|   CURL *eh = curl_easy_init(); | ||||
|  | ||||
|   curl_easy_setopt(eh, CURLOPT_WRITEFUNCTION, cb); | ||||
|   curl_easy_setopt(eh, CURLOPT_HEADER, 0); | ||||
|   curl_easy_setopt(eh, CURLOPT_URL, urls[i]); | ||||
|   curl_easy_setopt(eh, CURLOPT_PRIVATE, urls[i]); | ||||
|   curl_easy_setopt(eh, CURLOPT_VERBOSE, 0); | ||||
|  | ||||
|   curl_multi_add_handle(cm, eh); | ||||
| } | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   CURLM *cm; | ||||
|   CURLMsg *msg; | ||||
|   long L; | ||||
|   unsigned int C=0; | ||||
|   int M, Q, U = -1; | ||||
|   fd_set R, W, E; | ||||
|   struct timeval T; | ||||
|  | ||||
|   curl_global_init(CURL_GLOBAL_ALL); | ||||
|  | ||||
|   cm = curl_multi_init(); | ||||
|  | ||||
|   for (C = 0; C < MAX; ++C) { | ||||
|     init(cm, C); | ||||
|   } | ||||
|  | ||||
|   while (U) { | ||||
|     while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(cm, &U)); | ||||
|  | ||||
|     if (U) { | ||||
|       FD_ZERO(&R); | ||||
|       FD_ZERO(&W); | ||||
|       FD_ZERO(&E); | ||||
|  | ||||
|       if (curl_multi_fdset(cm, &R, &W, &E, &M)) { | ||||
|         fprintf(stderr, "E: curl_multi_fdset\n"); | ||||
|         return EXIT_FAILURE; | ||||
|       } | ||||
|  | ||||
|       /* In a real-world program you OF COURSE check the return that maxfd is | ||||
|          bigger than -1 so that the call to select() below makes sense! */ | ||||
|  | ||||
|       if (curl_multi_timeout(cm, &L)) { | ||||
|         fprintf(stderr, "E: curl_multi_timeout\n"); | ||||
|         return EXIT_FAILURE; | ||||
|       } | ||||
|  | ||||
|       T.tv_sec = L/1000; | ||||
|       T.tv_usec = (L%1000)*1000; | ||||
|  | ||||
|       if (0 > select(M+1, &R, &W, &E, &T)) { | ||||
|         fprintf(stderr, "E: select\n"); | ||||
|         return EXIT_FAILURE; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     while ((msg = curl_multi_info_read(cm, &Q))) { | ||||
|       if (msg->msg == CURLMSG_DONE) { | ||||
|         char *url; | ||||
|         CURL *e = msg->easy_handle; | ||||
|         curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &url); | ||||
|         fprintf(stderr, "R: %d - %s <%s>\n", | ||||
|                 msg->data.result, curl_easy_strerror(msg->data.result), url); | ||||
|         curl_multi_remove_handle(cm, e); | ||||
|         curl_easy_cleanup(e); | ||||
|       } | ||||
|       else { | ||||
|         fprintf(stderr, "E: CURLMsg (%d)\n", msg->msg); | ||||
|       } | ||||
|       if (C < CNT) { | ||||
|         init(cm, C++); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   curl_multi_cleanup(cm); | ||||
|   curl_global_cleanup(); | ||||
|  | ||||
|   return EXIT_SUCCESS; | ||||
| } | ||||
| @@ -11,7 +11,8 @@ 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 synctime.c sampleconv.c ftpuploadresume.c | ||||
|  cookie_interface.c cacertinmem.c synctime.c sampleconv.c ftpuploadresume.c \ | ||||
|  10-at-a-time.c hiperfifo.c ghiper.c | ||||
|  | ||||
| all: | ||||
| 	@echo "done" | ||||
|   | ||||
| @@ -26,9 +26,9 @@ want you do reorganize them like: | ||||
|   $ `curl-config --cc` -o example example.c `curl-config --cflags --libs` | ||||
|  | ||||
| *PLEASE* do not use the curl.haxx.se site as a test target for your libcurl | ||||
| applications/experiments. Even if the examples in this directory use that site | ||||
| as an example URL at some places, it doesn't mean that the URLs work or that | ||||
| we expect you to actually torture our web site with your tests! Thanks. | ||||
| applications/experiments. Even if some of the examples use that site as a URL | ||||
| at some places, it doesn't mean that the URLs work or that we expect you to | ||||
| actually torture our web site with your tests!  Thanks. | ||||
|  | ||||
| EXAMPLES | ||||
|  | ||||
| @@ -43,9 +43,13 @@ fopen.c        - fopen() layer that supports opening URLs and files | ||||
| ftp3rdparty.c  - FTP 3rd party transfer | ||||
| ftpget.c       - simple getting a file from FTP | ||||
| ftpgetresp.c   - get the response strings from the FTP server | ||||
| ftpupload.c    - upload a file to a FTP server | ||||
| ftpupload.c    - upload a file to an FTP server | ||||
| ftpuploadresume.c - resume an upload to an FTP server | ||||
| getinfo.c      - get the Content-Type from the recent transfer | ||||
| getinmemory.c  - download a file to memory only | ||||
| ghiper.c       - curl_multi_socket() using code with glib-2 | ||||
| hiperfifo.c    - downloads all URLs written to the fifo, using | ||||
|                  curl_multi_socket() and libevent | ||||
| htmltitle.cc   - download a HTML file and extract the <title> tag from a HTML | ||||
|                  page using libxml | ||||
| http-post.c    - HTTP POST | ||||
| @@ -61,8 +65,12 @@ 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 | ||||
| sampleconv.c   - showing how a program on a non-ASCII platform would invoke | ||||
|                  callbacks to do its own codeset conversions instead of using | ||||
|                  the built-in iconv functions in libcurl | ||||
| 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 | ||||
| 10-at-a-time.c - Download many files simultaneously, 10 at a time. | ||||
|   | ||||
| @@ -114,6 +114,13 @@ static char *curlx_usage[]={ | ||||
|  | ||||
| */ | ||||
|  | ||||
| /*  | ||||
|  * We use this ZERO_NULL to avoid picky compiler warnings, | ||||
|  * when assigning a NULL pointer to a function pointer var. | ||||
|  */ | ||||
|  | ||||
| #define ZERO_NULL 0 | ||||
|  | ||||
| /* This is a context that we pass to all callbacks */ | ||||
|  | ||||
| typedef struct sslctxparm_st { | ||||
| @@ -236,7 +243,7 @@ static CURLcode sslctxfun(CURL * curl, void * sslctx, void * parm) { | ||||
|  | ||||
|   SSL_CTX_set_verify_depth(ctx,2); | ||||
|  | ||||
|   SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL); | ||||
|   SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,ZERO_NULL); | ||||
|  | ||||
|   SSL_CTX_set_cert_verify_callback(ctx, ssl_app_verify_callback, parm); | ||||
|  | ||||
|   | ||||
| @@ -84,6 +84,9 @@ int my_trace(CURL *handle, curl_infotype type, | ||||
|   case CURLINFO_DATA_OUT: | ||||
|     text = "=> Send data"; | ||||
|     break; | ||||
|   case CURLINFO_SSL_DATA_OUT: | ||||
|     text = "=> Send SSL data"; | ||||
|     break; | ||||
|   case CURLINFO_HEADER_IN: | ||||
|     text = "<= Recv header"; | ||||
|     break; | ||||
| @@ -93,9 +96,6 @@ int my_trace(CURL *handle, curl_infotype type, | ||||
|   case CURLINFO_SSL_DATA_IN: | ||||
|     text = "<= Recv SSL data"; | ||||
|     break; | ||||
|   case CURLINFO_SSL_DATA_OUT: | ||||
|     text = "<= Send SSL data"; | ||||
|     break; | ||||
|   } | ||||
|  | ||||
|   dump(text, stderr, data, size, config->trace_ascii); | ||||
|   | ||||
| @@ -153,6 +153,10 @@ fill_buffer(URL_FILE *file,int want,int waittime) | ||||
|         /* get file descriptors from the transfers */ | ||||
|         curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); | ||||
|  | ||||
|         /* In a real-world program you OF COURSE check the return code of the | ||||
|            function calls, *and* you make sure that maxfd is bigger than -1 | ||||
|            so that the call to select() below makes sense! */ | ||||
|  | ||||
|         rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||
|  | ||||
|         switch(rc) { | ||||
|   | ||||
							
								
								
									
										461
									
								
								docs/examples/ghiper.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										461
									
								
								docs/examples/ghiper.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,461 @@ | ||||
| /***************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * $Id$ | ||||
|  * | ||||
|  * Example application source code using the multi socket interface to | ||||
|  * download many files at once. | ||||
|  * | ||||
|  * Written by Jeff Pohlmeyer | ||||
|  | ||||
| Requires glib-2.x and a (POSIX?) system that has mkfifo(). | ||||
|  | ||||
| This is an adaptation of libcurl's "hipev.c" and libevent's "event-test.c" | ||||
| sample programs, adapted to use glib's g_io_channel in place of libevent. | ||||
|  | ||||
| When running, the program creates the named pipe "hiper.fifo" | ||||
|  | ||||
| Whenever there is input into the fifo, the program reads the input as a list | ||||
| of URL's and creates some new easy handles to fetch each URL via the | ||||
| curl_multi "hiper" API. | ||||
|  | ||||
|  | ||||
| Thus, you can try a single URL: | ||||
|   % echo http://www.yahoo.com > hiper.fifo | ||||
|  | ||||
| Or a whole bunch of them: | ||||
|   % cat my-url-list > hiper.fifo | ||||
|  | ||||
| The fifo buffer is handled almost instantly, so you can even add more URL's | ||||
| while the previous requests are still being downloaded. | ||||
|  | ||||
| This is purely a demo app, all retrieved data is simply discarded by the write | ||||
| callback. | ||||
|  | ||||
| */ | ||||
|  | ||||
|  | ||||
| #include <glib.h> | ||||
| #include <sys/stat.h> | ||||
| #include <unistd.h> | ||||
| #include <fcntl.h> | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <errno.h> | ||||
| #include <curl/curl.h> | ||||
|  | ||||
|  | ||||
| #define MSG_OUT g_print   /* Change to "g_error" to write to stderr */ | ||||
| #define SHOW_VERBOSE 0    /* Set to non-zero for libcurl messages */ | ||||
| #define SHOW_PROGRESS 0   /* Set to non-zero to enable progress callback */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Global information, common to all connections */ | ||||
| typedef struct _GlobalInfo { | ||||
|   CURLM *multi; | ||||
|   guint timer_event; | ||||
|   int prev_running; | ||||
|   int still_running; | ||||
|   int requested; /* count: curl_easy_init() */ | ||||
|   int completed; /* count: curl_easy_cleanup() */ | ||||
| } GlobalInfo; | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Information associated with a specific easy handle */ | ||||
| typedef struct _ConnInfo { | ||||
|   CURL *easy; | ||||
|   char *url; | ||||
|   GlobalInfo *global; | ||||
|   char error[CURL_ERROR_SIZE]; | ||||
| } ConnInfo; | ||||
|  | ||||
|  | ||||
| /* Information associated with a specific socket */ | ||||
| typedef struct _SockInfo { | ||||
|   curl_socket_t sockfd; | ||||
|   CURL *easy; | ||||
|   int action; | ||||
|   long timeout; | ||||
|   GIOChannel *ch; | ||||
|   guint ev; | ||||
|   GlobalInfo *global; | ||||
| } SockInfo; | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Die if we get a bad CURLMcode somewhere */ | ||||
| static void mcode_or_die(char *where, CURLMcode code) { | ||||
|   if ( CURLM_OK != code ) { | ||||
|     char *s; | ||||
|     switch (code) { | ||||
|       case     CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break; | ||||
|       case     CURLM_OK:                 s="CURLM_OK";                 break; | ||||
|       case     CURLM_BAD_HANDLE:         s="CURLM_BAD_HANDLE";         break; | ||||
|       case     CURLM_BAD_EASY_HANDLE:    s="CURLM_BAD_EASY_HANDLE";    break; | ||||
|       case     CURLM_OUT_OF_MEMORY:      s="CURLM_OUT_OF_MEMORY";      break; | ||||
|       case     CURLM_INTERNAL_ERROR:     s="CURLM_INTERNAL_ERROR";     break; | ||||
|       case     CURLM_BAD_SOCKET:         s="CURLM_BAD_SOCKET";         break; | ||||
|       case     CURLM_UNKNOWN_OPTION:     s="CURLM_UNKNOWN_OPTION";     break; | ||||
|       case     CURLM_LAST:               s="CURLM_LAST";               break; | ||||
|       default: s="CURLM_unknown"; | ||||
|     } | ||||
|     MSG_OUT("ERROR: %s returns %s\n", where, s); | ||||
|     exit(code); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Check for completed transfers, and remove their easy handles */ | ||||
| static void check_run_count(GlobalInfo *g) | ||||
| { | ||||
|   if (g->prev_running > g->still_running) { | ||||
|     char *eff_url=NULL; | ||||
|     CURLMsg *msg; | ||||
|     int msgs_left; | ||||
|     ConnInfo *conn=NULL; | ||||
|     CURL*easy; | ||||
|     CURLcode res; | ||||
|  | ||||
|     MSG_OUT("REMAINING: %d\n", g->still_running); | ||||
|     /* | ||||
|       I am still uncertain whether it is safe to remove an easy handle | ||||
|       from inside the curl_multi_info_read loop, so here I will search | ||||
|       for completed transfers in the inner "while" loop, and then remove | ||||
|       them in the outer "do-while" loop... | ||||
|    */ | ||||
|     do { | ||||
|       easy=NULL; | ||||
|       while ((msg = curl_multi_info_read(g->multi, &msgs_left))) { | ||||
|         if (msg->msg == CURLMSG_DONE) { | ||||
|           easy=msg->easy_handle; | ||||
|           res=msg->data.result; | ||||
|           break; | ||||
|         } | ||||
|       } | ||||
|       if (easy) { | ||||
|           curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn); | ||||
|           curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url); | ||||
|           MSG_OUT("DONE: %s => (%d) %s\n", eff_url, res, conn->error); | ||||
|           curl_multi_remove_handle(g->multi, easy); | ||||
|           g_free(conn->url); | ||||
|           curl_easy_cleanup(easy); | ||||
|           g_free(conn); | ||||
|           g->completed++; | ||||
|       } | ||||
|     } while ( easy ); | ||||
|     MSG_OUT("Requested: %d Completed:%d\n", g->requested, g->completed); | ||||
|   } | ||||
|   g->prev_running = g->still_running; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Called by glib when our timeout expires */ | ||||
| static gboolean timer_cb(gpointer data) | ||||
| { | ||||
|   GlobalInfo *g = (GlobalInfo *)data; | ||||
|   CURLMcode rc; | ||||
|  | ||||
|   do { | ||||
|     rc = curl_multi_socket(g->multi, CURL_SOCKET_TIMEOUT, &g->still_running); | ||||
|   } while (rc == CURLM_CALL_MULTI_PERFORM); | ||||
|   mcode_or_die("timer_cb: curl_multi_socket", rc); | ||||
|   check_run_count(g); | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Update the event timer after curl_multi library calls */ | ||||
| static int update_timeout_cb(CURLM *multi, long timeout_ms, void *userp) | ||||
| { | ||||
|   struct timeval timeout; | ||||
|   GlobalInfo *g=(GlobalInfo *)userp; | ||||
|   timeout.tv_sec = timeout_ms/1000; | ||||
|   timeout.tv_usec = (timeout_ms%1000)*1000; | ||||
|  | ||||
|   MSG_OUT("*** update_timeout_cb %ld => %ld:%ld ***\n", | ||||
|               timeout_ms, timeout.tv_sec, timeout.tv_usec); | ||||
|  | ||||
|   g->timer_event = g_timeout_add(timeout_ms, timer_cb, g); | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Called by glib when we get action on a multi socket */ | ||||
| static gboolean event_cb(GIOChannel *ch, GIOCondition condition, gpointer data) | ||||
| { | ||||
|   GlobalInfo *g = (GlobalInfo*) data; | ||||
|   CURLMcode rc; | ||||
|   int fd=g_io_channel_unix_get_fd(ch); | ||||
|   do { | ||||
|     rc = curl_multi_socket(g->multi, fd, &g->still_running); | ||||
|   } while (rc == CURLM_CALL_MULTI_PERFORM); | ||||
|   mcode_or_die("event_cb: curl_multi_socket", rc); | ||||
|   check_run_count(g); | ||||
|   if(g->still_running) { | ||||
|     return TRUE; | ||||
|   } else { | ||||
|     MSG_OUT("last transfer done, kill timeout\n"); | ||||
|     if (g->timer_event) { g_source_remove(g->timer_event); } | ||||
|     return FALSE; | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Clean up the SockInfo structure */ | ||||
| static void remsock(SockInfo *f) | ||||
| { | ||||
|   if (!f) { return; } | ||||
|   if (f->ev) { g_source_remove(f->ev); } | ||||
|   g_free(f); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Assign information to a SockInfo structure */ | ||||
| static void setsock(SockInfo*f, curl_socket_t s, CURL*e, int act, GlobalInfo*g) | ||||
| { | ||||
|   GIOCondition kind = | ||||
|      (act&CURL_POLL_IN?G_IO_IN:0)|(act&CURL_POLL_OUT?G_IO_OUT:0); | ||||
|  | ||||
|   f->sockfd = s; | ||||
|   f->action = act; | ||||
|   f->easy = e; | ||||
|   if (f->ev) { g_source_remove(f->ev); } | ||||
|   f->ev=g_io_add_watch(f->ch, kind, event_cb,g); | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Initialize a new SockInfo structure */ | ||||
| static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g) | ||||
| { | ||||
|   SockInfo *fdp = g_malloc0(sizeof(SockInfo)); | ||||
|  | ||||
|   fdp->global = g; | ||||
|   fdp->ch=g_io_channel_unix_new(s); | ||||
|   setsock(fdp, s, easy, action, g); | ||||
|   curl_multi_assign(g->multi, s, fdp); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* CURLMOPT_SOCKETFUNCTION */ | ||||
| static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp) | ||||
| { | ||||
|   GlobalInfo *g = (GlobalInfo*) cbp; | ||||
|   SockInfo *fdp = (SockInfo*) sockp; | ||||
|   char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" }; | ||||
|  | ||||
|   MSG_OUT("socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]); | ||||
|   if (what == CURL_POLL_REMOVE) { | ||||
|     MSG_OUT("\n"); | ||||
|     remsock(fdp); | ||||
|   } else { | ||||
|     if (!fdp) { | ||||
|       MSG_OUT("Adding data: %s%s\n", | ||||
|              what&CURL_POLL_IN?"READ":"", | ||||
|              what&CURL_POLL_OUT?"WRITE":"" ); | ||||
|       addsock(s, e, what, g); | ||||
|     } | ||||
|     else { | ||||
|       MSG_OUT( | ||||
|         "Changing action from %d to %d\n", fdp->action, what); | ||||
|       setsock(fdp, s, e, what, g); | ||||
|     } | ||||
|   } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* CURLOPT_WRITEFUNCTION */ | ||||
| static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data) | ||||
| { | ||||
|   size_t realsize = size * nmemb; | ||||
|   ConnInfo *conn = (ConnInfo*) data; | ||||
|   (void)ptr; | ||||
|   (void)conn; | ||||
|   return realsize; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* CURLOPT_PROGRESSFUNCTION */ | ||||
| static int prog_cb (void *p, double dltotal, double dlnow, double ult, double uln) | ||||
| { | ||||
|   ConnInfo *conn = (ConnInfo *)p; | ||||
|   MSG_OUT("Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal); | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Create a new easy handle, and add it to the global curl_multi */ | ||||
| static void new_conn(char *url, GlobalInfo *g ) | ||||
| { | ||||
|   ConnInfo *conn; | ||||
|   CURLMcode rc; | ||||
|  | ||||
|   conn = g_malloc0(sizeof(ConnInfo)); | ||||
|  | ||||
|   conn->error[0]='\0'; | ||||
|  | ||||
|   conn->easy = curl_easy_init(); | ||||
|   if (!conn->easy) { | ||||
|     MSG_OUT("curl_easy_init() failed, exiting!\n"); | ||||
|     exit(2); | ||||
|   } | ||||
|   conn->global = g; | ||||
|   conn->url = g_strdup(url); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, &conn); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, SHOW_VERBOSE); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, SHOW_PROGRESS?0:1); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_FOLLOWLOCATION, 1); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_CONNECTTIMEOUT, 30); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 1); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 30); | ||||
|  | ||||
|   MSG_OUT("Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url); | ||||
|   rc =curl_multi_add_handle(g->multi, conn->easy); | ||||
|   mcode_or_die("new_conn: curl_multi_add_handle", rc); | ||||
|   g->requested++; | ||||
|   do { | ||||
|     rc = curl_multi_socket_all(g->multi, &g->still_running); | ||||
|   } while (CURLM_CALL_MULTI_PERFORM == rc); | ||||
|   mcode_or_die("new_conn: curl_multi_socket_all", rc); | ||||
|   check_run_count(g); | ||||
| } | ||||
|  | ||||
|  | ||||
| /* This gets called by glib whenever data is received from the fifo */ | ||||
| static gboolean fifo_cb (GIOChannel *ch, GIOCondition condition, gpointer data) | ||||
| { | ||||
|   #define BUF_SIZE 1024 | ||||
|   gsize len, tp; | ||||
|   gchar *buf, *tmp, *all=NULL; | ||||
|   GIOStatus rv; | ||||
|  | ||||
|   do { | ||||
|     GError *err=NULL; | ||||
|     rv = g_io_channel_read_line (ch,&buf,&len,&tp,&err); | ||||
|     if ( buf ) { | ||||
|       if (tp) { buf[tp]='\0'; } | ||||
|       new_conn(buf,(GlobalInfo*)data); | ||||
|       g_free(buf); | ||||
|     } else { | ||||
|       buf = g_malloc(BUF_SIZE+1); | ||||
|       while (TRUE) { | ||||
|         buf[BUF_SIZE]='\0'; | ||||
|         g_io_channel_read_chars(ch,buf,BUF_SIZE,&len,&err); | ||||
|         if (len) { | ||||
|           buf[len]='\0'; | ||||
|           if (all) { | ||||
|             tmp=all; | ||||
|             all=g_strdup_printf("%s%s", tmp, buf); | ||||
|             g_free(tmp); | ||||
|           } else { | ||||
|             all = g_strdup(buf); | ||||
|           } | ||||
|         } else { | ||||
|            break; | ||||
|         } | ||||
|       } | ||||
|       if (all) { | ||||
|         new_conn(all,(GlobalInfo*)data); | ||||
|         g_free(all); | ||||
|       } | ||||
|       g_free(buf); | ||||
|     } | ||||
|     if ( err ) { | ||||
|       g_error("fifo_cb: %s", err->message); | ||||
|       g_free(err); | ||||
|       break; | ||||
|     } | ||||
|   } while ( (len) && (rv == G_IO_STATUS_NORMAL) ); | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int init_fifo(void) | ||||
| { | ||||
|  struct stat st; | ||||
|  char *fifo = "hiper.fifo"; | ||||
|  int socket; | ||||
|  | ||||
|  if (lstat (fifo, &st) == 0) { | ||||
|   if ((st.st_mode & S_IFMT) == S_IFREG) { | ||||
|    errno = EEXIST; | ||||
|    perror("lstat"); | ||||
|    exit (1); | ||||
|   } | ||||
|  } | ||||
|  | ||||
|  unlink (fifo); | ||||
|  if (mkfifo (fifo, 0600) == -1) { | ||||
|   perror("mkfifo"); | ||||
|   exit (1); | ||||
|  } | ||||
|  | ||||
|  socket = open (fifo, O_RDWR | O_NONBLOCK, 0); | ||||
|  | ||||
|  if (socket == -1) { | ||||
|   perror("open"); | ||||
|   exit (1); | ||||
|  } | ||||
|  MSG_OUT("Now, pipe some URL's into > %s\n", fifo); | ||||
|  | ||||
|  return socket; | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|   GlobalInfo *g; | ||||
|   CURLMcode rc; | ||||
|   GMainLoop*gmain; | ||||
|   int fd; | ||||
|   GIOChannel* ch; | ||||
|   g=g_malloc0(sizeof(GlobalInfo)); | ||||
|  | ||||
|   fd=init_fifo(); | ||||
|   ch=g_io_channel_unix_new(fd); | ||||
|   g_io_add_watch(ch,G_IO_IN,fifo_cb,g); | ||||
|   gmain=g_main_loop_new(NULL,FALSE); | ||||
|   g->multi = curl_multi_init(); | ||||
|   curl_multi_setopt(g->multi, CURLMOPT_SOCKETFUNCTION, sock_cb); | ||||
|   curl_multi_setopt(g->multi, CURLMOPT_SOCKETDATA, g); | ||||
|   curl_multi_setopt(g->multi, CURLMOPT_TIMERFUNCTION, update_timeout_cb); | ||||
|   curl_multi_setopt(g->multi, CURLMOPT_TIMERDATA, g); | ||||
|   do { | ||||
|     rc = curl_multi_socket_all(g->multi, &g->still_running); | ||||
|   } while (CURLM_CALL_MULTI_PERFORM == rc); | ||||
|   g_main_loop_run(gmain); | ||||
|   curl_multi_cleanup(g->multi); | ||||
|   return 0; | ||||
| } | ||||
							
								
								
									
										416
									
								
								docs/examples/hiperfifo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										416
									
								
								docs/examples/hiperfifo.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,416 @@ | ||||
| /***************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * $Id$ | ||||
|  * | ||||
|  * Example application source code using the multi socket interface to | ||||
|  * download many files at once. | ||||
|  * | ||||
|  * Written by Jeff Pohlmeyer | ||||
|  | ||||
| Requires libevent and a (POSIX?) system that has mkfifo(). | ||||
|  | ||||
| This is an adaptation of libcurl's "hipev.c" and libevent's "event-test.c" | ||||
| sample programs. | ||||
|  | ||||
| When running, the program creates the named pipe "hiper.fifo" | ||||
|  | ||||
| Whenever there is input into the fifo, the program reads the input as a list | ||||
| of URL's and creates some new easy handles to fetch each URL via the | ||||
| curl_multi "hiper" API. | ||||
|  | ||||
|  | ||||
| Thus, you can try a single URL: | ||||
|   % echo http://www.yahoo.com > hiper.fifo | ||||
|  | ||||
| Or a whole bunch of them: | ||||
|   % cat my-url-list > hiper.fifo | ||||
|  | ||||
| The fifo buffer is handled almost instantly, so you can even add more URL's | ||||
| while the previous requests are still being downloaded. | ||||
|  | ||||
| Note: | ||||
|   For the sake of simplicity, URL length is limited to 1023 char's ! | ||||
|  | ||||
| This is purely a demo app, all retrieved data is simply discarded by the write | ||||
| callback. | ||||
|  | ||||
| */ | ||||
|  | ||||
| #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> | ||||
| #include <fcntl.h> | ||||
| #include <sys/stat.h> | ||||
| #include <errno.h> | ||||
|  | ||||
|  | ||||
| #define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */ | ||||
|  | ||||
|  | ||||
| /* Global information, common to all connections */ | ||||
| typedef struct _GlobalInfo { | ||||
|   struct event fifo_event; | ||||
|   struct event timer_event; | ||||
|   CURLM *multi; | ||||
|   int prev_running; | ||||
|   int still_running; | ||||
|   FILE* input; | ||||
| } GlobalInfo; | ||||
|  | ||||
|  | ||||
| /* Information associated with a specific easy handle */ | ||||
| typedef struct _ConnInfo { | ||||
|   CURL *easy; | ||||
|   char *url; | ||||
|   GlobalInfo *global; | ||||
|   char error[CURL_ERROR_SIZE]; | ||||
| } ConnInfo; | ||||
|  | ||||
|  | ||||
| /* Information associated with a specific socket */ | ||||
| typedef struct _SockInfo { | ||||
|   curl_socket_t sockfd; | ||||
|   CURL *easy; | ||||
|   int action; | ||||
|   long timeout; | ||||
|   struct event ev; | ||||
|   int evset; | ||||
|   GlobalInfo *global; | ||||
| } SockInfo; | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Update the event timer after curl_multi library calls */ | ||||
| static void update_timeout(GlobalInfo *g) | ||||
| { | ||||
|   long timeout_ms; | ||||
|   struct timeval timeout; | ||||
|  | ||||
|   curl_multi_timeout(g->multi, &timeout_ms); | ||||
|   if(timeout_ms < 0) | ||||
|     return; | ||||
|  | ||||
|   timeout.tv_sec = timeout_ms/1000; | ||||
|   timeout.tv_usec = (timeout_ms%1000)*1000; | ||||
|   evtimer_add(&g->timer_event, &timeout); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Die if we get a bad CURLMcode somewhere */ | ||||
| void mcode_or_die(char *where, CURLMcode code) { | ||||
|   if ( CURLM_OK != code ) { | ||||
|     char *s; | ||||
|     switch (code) { | ||||
|       case     CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break; | ||||
|       case     CURLM_OK:                 s="CURLM_OK";                 break; | ||||
|       case     CURLM_BAD_HANDLE:         s="CURLM_BAD_HANDLE";         break; | ||||
|       case     CURLM_BAD_EASY_HANDLE:    s="CURLM_BAD_EASY_HANDLE";    break; | ||||
|       case     CURLM_OUT_OF_MEMORY:      s="CURLM_OUT_OF_MEMORY";      break; | ||||
|       case     CURLM_INTERNAL_ERROR:     s="CURLM_INTERNAL_ERROR";     break; | ||||
|       case     CURLM_BAD_SOCKET:         s="CURLM_BAD_SOCKET";         break; | ||||
|       case     CURLM_UNKNOWN_OPTION:     s="CURLM_UNKNOWN_OPTION";     break; | ||||
|       case     CURLM_LAST:               s="CURLM_LAST";               break; | ||||
|       default: s="CURLM_unknown"; | ||||
|     } | ||||
|     fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s); | ||||
|     exit(code); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Check for completed transfers, and remove their easy handles */ | ||||
| static void check_run_count(GlobalInfo *g) | ||||
| { | ||||
|   if (g->prev_running > g->still_running) { | ||||
|     char *eff_url=NULL; | ||||
|     CURLMsg *msg; | ||||
|     int msgs_left; | ||||
|     ConnInfo *conn=NULL; | ||||
|     CURL*easy; | ||||
|     CURLcode res; | ||||
|  | ||||
|     fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running); | ||||
|     /* | ||||
|       I am still uncertain whether it is safe to remove an easy handle | ||||
|       from inside the curl_multi_info_read loop, so here I will search | ||||
|       for completed transfers in the inner "while" loop, and then remove | ||||
|       them in the outer "do-while" loop... | ||||
|    */ | ||||
|     do { | ||||
|       easy=NULL; | ||||
|       while ((msg = curl_multi_info_read(g->multi, &msgs_left))) { | ||||
|         if (msg->msg == CURLMSG_DONE) { | ||||
|           easy=msg->easy_handle; | ||||
|           res=msg->data.result; | ||||
|           break; | ||||
|         } | ||||
|       } | ||||
|       if (easy) { | ||||
|           curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn); | ||||
|           curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url); | ||||
|           fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error); | ||||
|           curl_multi_remove_handle(g->multi, easy); | ||||
|           free(conn->url); | ||||
|           curl_easy_cleanup(easy); | ||||
|           free(conn); | ||||
|       } | ||||
|     } while ( easy ); | ||||
|   } | ||||
|   g->prev_running = g->still_running; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Called by libevent when we get action on a multi socket */ | ||||
| static void event_cb(int fd, short kind, void *userp) | ||||
| { | ||||
|   GlobalInfo *g = (GlobalInfo*) userp; | ||||
|   CURLMcode rc; | ||||
|  | ||||
|   do { | ||||
|     rc = curl_multi_socket(g->multi, fd, &g->still_running); | ||||
|   } while (rc == CURLM_CALL_MULTI_PERFORM); | ||||
|   mcode_or_die("event_cb: curl_multi_socket", rc); | ||||
|   check_run_count(g); | ||||
|   if(g->still_running) { | ||||
|     update_timeout(g); | ||||
|   } else { | ||||
|     fprintf(MSG_OUT, "last transfer done, kill timeout\n"); | ||||
|     if (evtimer_pending(&g->timer_event, NULL)) { | ||||
|       evtimer_del(&g->timer_event); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Called by libevent when our timeout expires */ | ||||
| static void timer_cb(int fd, short kind, void *userp) | ||||
| { | ||||
|   (void)fd; | ||||
|   (void)kind; | ||||
|   GlobalInfo *g = (GlobalInfo *)userp; | ||||
|   CURLMcode rc; | ||||
|  | ||||
|   do { | ||||
|     rc = curl_multi_socket(g->multi, CURL_SOCKET_TIMEOUT, &g->still_running); | ||||
|   } while (rc == CURLM_CALL_MULTI_PERFORM); | ||||
|   mcode_or_die("timer_cb: curl_multi_socket", rc); | ||||
|   check_run_count(g); | ||||
|   if ( g->still_running ) { update_timeout(g); } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Clean up the SockInfo structure */ | ||||
| static void remsock(SockInfo *f) | ||||
| { | ||||
|   if (!f) { return; } | ||||
|   if (f->evset) { event_del(&f->ev); } | ||||
|   free(f); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Assign information to a SockInfo structure */ | ||||
| static void setsock(SockInfo*f, curl_socket_t s, CURL*e, int act, GlobalInfo*g) | ||||
| { | ||||
|   int kind = | ||||
|      (act&CURL_POLL_IN?EV_READ:0)|(act&CURL_POLL_OUT?EV_WRITE:0)|EV_PERSIST; | ||||
|  | ||||
|   f->sockfd = s; | ||||
|   f->action = act; | ||||
|   f->easy = e; | ||||
|   if (f->evset) { event_del(&f->ev); } | ||||
|   event_set( &f->ev, f->sockfd, kind, event_cb, g); | ||||
|   f->evset=1; | ||||
|   event_add(&f->ev, NULL); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Initialize a new SockInfo structure */ | ||||
| static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g) { | ||||
|   SockInfo *fdp = calloc(sizeof(SockInfo), 1); | ||||
|  | ||||
|   fdp->global = g; | ||||
|   setsock(fdp, s, easy, action, g); | ||||
|   curl_multi_assign(g->multi, s, fdp); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* CURLMOPT_SOCKETFUNCTION */ | ||||
| static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp) | ||||
| { | ||||
|   GlobalInfo *g = (GlobalInfo*) cbp; | ||||
|   SockInfo *fdp = (SockInfo*) sockp; | ||||
|   char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" }; | ||||
|  | ||||
|   fprintf(MSG_OUT, | ||||
|           "socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]); | ||||
|   if (what == CURL_POLL_REMOVE) { | ||||
|     fprintf(MSG_OUT, "\n"); | ||||
|     remsock(fdp); | ||||
|   } else { | ||||
|     if (!fdp) { | ||||
|       fprintf(MSG_OUT, "Adding data: %s%s\n", | ||||
|              what&CURL_POLL_IN?"READ":"", | ||||
|              what&CURL_POLL_OUT?"WRITE":"" ); | ||||
|       addsock(s, e, what, g); | ||||
|     } | ||||
|     else { | ||||
|       fprintf(MSG_OUT, | ||||
|         "Changing action from %d to %d\n", fdp->action, what); | ||||
|       setsock(fdp, s, e, what, g); | ||||
|     } | ||||
|   } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* CURLOPT_WRITEFUNCTION */ | ||||
| static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data) | ||||
| { | ||||
|   size_t realsize = size * nmemb; | ||||
|   ConnInfo *conn = (ConnInfo*) data; | ||||
|   (void)ptr; | ||||
|   (void)conn; | ||||
|   return realsize; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* CURLOPT_PROGRESSFUNCTION */ | ||||
| int prog_cb (void *p, double dltotal, double dlnow, double ult, double uln) | ||||
| { | ||||
|   ConnInfo *conn = (ConnInfo *)p; | ||||
|   fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal); | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* Create a new easy handle, and add it to the global curl_multi */ | ||||
| void new_conn(char *url, GlobalInfo *g ) { | ||||
|   ConnInfo *conn; | ||||
|   CURLMcode rc; | ||||
|  | ||||
|   conn = calloc(1, sizeof(ConnInfo)); | ||||
|   memset(conn, 0, sizeof(ConnInfo)); | ||||
|   conn->error[0]='\0'; | ||||
|  | ||||
|   conn->easy = curl_easy_init(); | ||||
|   if (!conn->easy) { | ||||
|     fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n"); | ||||
|     exit(2); | ||||
|   } | ||||
|   conn->global = g; | ||||
|   conn->url = strdup(url); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, &conn); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 0); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 0); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb); | ||||
|   curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn); | ||||
|   fprintf(MSG_OUT, | ||||
|           "Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url); | ||||
|   rc =curl_multi_add_handle(g->multi, conn->easy); | ||||
|   mcode_or_die("new_conn: curl_multi_add_handle", rc); | ||||
|   do { | ||||
|     rc = curl_multi_socket_all(g->multi, &g->still_running); | ||||
|   } while (CURLM_CALL_MULTI_PERFORM == rc); | ||||
|   mcode_or_die("new_conn: curl_multi_socket_all", rc); | ||||
|   check_run_count(g); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* This gets called whenever data is received from the fifo */ | ||||
| void fifo_cb(int fd, short event, void *arg) { | ||||
|   char s[1024]; | ||||
|   long int rv=0; | ||||
|   int n=0; | ||||
|   GlobalInfo *g = (GlobalInfo *)arg; | ||||
|  | ||||
|   do { | ||||
|     s[0]='\0'; | ||||
|     rv=fscanf(g->input, "%1023s%n", s, &n); | ||||
|     s[n]='\0'; | ||||
|     if ( n && s[0] ) { | ||||
|       new_conn(s,arg);  /* if we read a URL, go get it! */ | ||||
|     } else break; | ||||
|   } while ( rv != EOF); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Create a named pipe and tell libevent to monitor it */ | ||||
| int init_fifo (GlobalInfo *g) { | ||||
|   struct stat st; | ||||
|   char *fifo = "hiper.fifo"; | ||||
|   int socket; | ||||
|  | ||||
|   fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo); | ||||
|   if (lstat (fifo, &st) == 0) { | ||||
|     if ((st.st_mode & S_IFMT) == S_IFREG) { | ||||
|       errno = EEXIST; | ||||
|       perror("lstat"); | ||||
|       exit (1); | ||||
|     } | ||||
|   } | ||||
|   unlink(fifo); | ||||
|   if (mkfifo (fifo, 0600) == -1) { | ||||
|     perror("mkfifo"); | ||||
|     exit (1); | ||||
|   } | ||||
|   socket = open(fifo, O_RDWR | O_NONBLOCK, 0); | ||||
|   if (socket == -1) { | ||||
|      perror("open"); | ||||
|      exit (1); | ||||
|   } | ||||
|   g->input = fdopen(socket, "r"); | ||||
|  | ||||
|   fprintf(MSG_OUT, "Now, pipe some URL's into > %s\n", fifo); | ||||
|   event_set(&g->fifo_event, socket, EV_READ | EV_PERSIST, fifo_cb, g); | ||||
|   event_add(&g->fifo_event, NULL); | ||||
|   return (0); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|   GlobalInfo g; | ||||
|   CURLMcode rc; | ||||
|  | ||||
|   memset(&g, 0, sizeof(GlobalInfo)); | ||||
|   event_init(); | ||||
|   init_fifo(&g); | ||||
|   g.multi = curl_multi_init(); | ||||
|   evtimer_set(&g.timer_event, timer_cb, &g); | ||||
|   curl_multi_setopt(g.multi, CURLMOPT_SOCKETFUNCTION, sock_cb); | ||||
|   curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g); | ||||
|   do { | ||||
|     rc = curl_multi_socket_all(g.multi, &g.still_running); | ||||
|   } while (CURLM_CALL_MULTI_PERFORM == rc); | ||||
|   update_timeout(&g); | ||||
|   event_dispatch(); | ||||
|   curl_multi_cleanup(g.multi); | ||||
|   return 0; | ||||
| } | ||||
| @@ -87,8 +87,10 @@ int main(int argc, char **argv) | ||||
|     /* now specify which file to upload */ | ||||
|     curl_easy_setopt(curl, CURLOPT_READDATA, hd_src); | ||||
|  | ||||
|     /* and give the size of the upload */ | ||||
|     curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, file_info.st_size); | ||||
|     /* provide the size of the upload, we specicially typecast the value | ||||
|        to curl_off_t since we must be sure to use the correct data size */ | ||||
|     curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, | ||||
|                      (curl_off_t)file_info.st_size); | ||||
|  | ||||
|     /* Now run off and do what you've been told! */ | ||||
|     res = curl_easy_perform(curl); | ||||
|   | ||||
| @@ -1,13 +1,16 @@ | ||||
| #  $Id$ | ||||
| # | ||||
| #  Adapted for djgpp / Watt-32 / DOS by | ||||
| #  Gisle Vanem <giva@bgnett.no> | ||||
| # | ||||
|  | ||||
| include ../../packages/DOS/common.dj | ||||
| TOPDIR = ../.. | ||||
|  | ||||
| CFLAGS += -I../../include -DFALSE=0 -DTRUE=1 | ||||
| include $(TOPDIR)/packages/DOS/common.dj | ||||
|  | ||||
| LIBS = ../../lib/libcurl.a | ||||
| CFLAGS += -DFALSE=0 -DTRUE=1 | ||||
|  | ||||
| LIBS = $(TOPDIR)/lib/libcurl.a | ||||
|  | ||||
| ifeq ($(USE_SSL),1) | ||||
|   LIBS += $(OPENSSL_ROOT)/lib/libssl.a $(OPENSSL_ROOT)/lib/libcrypt.a | ||||
| @@ -15,20 +18,24 @@ endif | ||||
|  | ||||
| LIBS += $(WATT32_ROOT)/lib/libwatt.a $(ZLIB_ROOT)/libz.a | ||||
|  | ||||
| PROGRAMS  = fopen.exe ftpget.exe ftpgetresp.exe ftpupload.exe \ | ||||
|             getinmemory.exe http-post.exe httpput.exe multi-app.exe \ | ||||
|             multi-double.exe multi-post.exe multi-single.exe \ | ||||
|             persistant.exe post-callback.exe postit2.exe \ | ||||
|             sepheaders.exe simple.exe simplessl.exe https.exe \ | ||||
|             ftp3rdparty.exe getinfo.exe anyauthput.exe \ | ||||
|             cookie_interface.exe | ||||
| CSOURCES = fopen.c ftpget.c ftpgetresp.c ftpupload.c getinmemory.c  \ | ||||
|            http-post.c httpput.c https.c multi-app.c multi-double.c \ | ||||
|            multi-post.c multi-single.c persistant.c post-callback.c \ | ||||
|            postit2.c sepheaders.c simple.c simplepost.c simplessl.c \ | ||||
|            multi-debugcallback.c fileupload.c getinfo.c anyauthput.c \ | ||||
|            10-at-a-time.c # ftpuploadresume.c ftp3rdparty.c cookie_interface.c | ||||
|  | ||||
| PROGRAMS = $(CSOURCES:.c=.exe) | ||||
|  | ||||
| all: $(PROGRAMS) | ||||
| 	@echo Welcome to libcurl example program | ||||
|  | ||||
| %.exe: %.c | ||||
| 	$(CC) $(CFLAGS) -o $@ $^ $(LIBS) | ||||
| 	@echo | ||||
|  | ||||
| clean: | ||||
| 	rm -f $(PROGRAMS) | ||||
| clean vclean realclean: | ||||
| 	- rm -f $(PROGRAMS) depend.dj | ||||
|  | ||||
| -include depend.dj | ||||
|  | ||||
|   | ||||
| @@ -80,6 +80,10 @@ int main(int argc, char **argv) | ||||
|     /* get file descriptors from the transfers */ | ||||
|     curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); | ||||
|  | ||||
|     /* In a real-world program you OF COURSE check the return code of the | ||||
|        function calls, *and* you make sure that maxfd is bigger than -1 so | ||||
|        that the call to select() below makes sense! */ | ||||
|  | ||||
|     rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||
|  | ||||
|     switch(rc) { | ||||
|   | ||||
| @@ -153,6 +153,10 @@ int main(int argc, char **argv) | ||||
|     /* get file descriptors from the transfers */ | ||||
|     curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); | ||||
|  | ||||
|     /* In a real-world program you OF COURSE check the return code of the | ||||
|        function calls, *and* you make sure that maxfd is bigger than -1 | ||||
|        so that the call to select() below makes sense! */ | ||||
|  | ||||
|     rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||
|  | ||||
|     switch(rc) { | ||||
|   | ||||
| @@ -71,6 +71,10 @@ int main(int argc, char **argv) | ||||
|     /* get file descriptors from the transfers */ | ||||
|     curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); | ||||
|  | ||||
|     /* In a real-world program you OF COURSE check the return code of the | ||||
|        function calls, *and* you make sure that maxfd is bigger than -1 so | ||||
|        that the call to select() below makes sense! */ | ||||
|  | ||||
|     rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||
|  | ||||
|     switch(rc) { | ||||
|   | ||||
| @@ -93,6 +93,10 @@ int main(int argc, char *argv[]) | ||||
|       /* get file descriptors from the transfers */ | ||||
|       curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); | ||||
|  | ||||
|       /* In a real-world program you OF COURSE check the return code of the | ||||
|          function calls, *and* you make sure that maxfd is bigger than -1 | ||||
|          so that the call to select() below makes sense! */ | ||||
|  | ||||
|       rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||
|  | ||||
|       switch(rc) { | ||||
|   | ||||
| @@ -65,6 +65,10 @@ int main(int argc, char **argv) | ||||
|     /* get file descriptors from the transfers */ | ||||
|     curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); | ||||
|  | ||||
|     /* In a real-world program you OF COURSE check the return code of the | ||||
|        function calls, *and* you make sure that maxfd is bigger than -1 so | ||||
|        that the call to select() below makes sense! */ | ||||
|  | ||||
|     rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||
|  | ||||
|     switch(rc) { | ||||
|   | ||||
| @@ -41,9 +41,6 @@ int main(int argc, char **argv) | ||||
|   /* no progress meter please */ | ||||
|   curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1); | ||||
|  | ||||
|   /* shut up completely */ | ||||
|   curl_easy_setopt(curl_handle, CURLOPT_MUTE, 1); | ||||
|  | ||||
|   /* send all data to this function  */ | ||||
|   curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data); | ||||
|  | ||||
|   | ||||
| @@ -9,6 +9,18 @@ | ||||
|  * | ||||
|  * This example code only builds as-is on Windows. | ||||
|  * | ||||
|  * While Unix/Linux user, you do not need this software. | ||||
|  * You can achieve the same result as synctime using curl, awk and date. | ||||
|  * Set proxy as according to your network, but beware of proxy Cache-Control. | ||||
|  * | ||||
|  * To set your system clock, root access is required. | ||||
|  * # date -s "`curl -sI http://nist.time.gov/timezone.cgi?UTC/s/0 \ | ||||
|  *        | awk -F': ' '/Date: / {print $2}'`" | ||||
|  * | ||||
|  * To view remote webserver date and time. | ||||
|  * $ curl -sI http://nist.time.gov/timezone.cgi?UTC/s/0 \ | ||||
|  *        | awk -F': ' '/Date: / {print $2}' | ||||
|  * | ||||
|  * 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 | ||||
| @@ -59,7 +71,9 @@ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <time.h> | ||||
| #ifndef __CYGWIN__ | ||||
| #include <windows.h> | ||||
| #endif | ||||
| #include <curl/curl.h> | ||||
|  | ||||
|  | ||||
| @@ -298,10 +312,11 @@ int main(int argc, char *argv[]) | ||||
|              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); | ||||
|  | ||||
|     fprintf(stderr, "Fetch: %s\n\n", conf->timeserver); | ||||
|     fprintf(stderr, "Before 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); | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3	 \ | ||||
|  curl_multi_strerror.3 curl_share_strerror.3 curl_global_init_mem.3	 \ | ||||
|  libcurl-tutorial.3 curl_easy_reset.3 curl_easy_escape.3		 \ | ||||
|  curl_easy_unescape.3 curl_multi_setopt.3 curl_multi_socket.3		 \ | ||||
|  curl_multi_timeout.3 | ||||
|  curl_multi_timeout.3 curl_formget.3 curl_multi_assign.3 | ||||
|  | ||||
| HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html		  \ | ||||
|  curl_easy_init.html curl_easy_perform.html curl_easy_setopt.html	  \ | ||||
| @@ -35,7 +35,8 @@ HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html		  \ | ||||
|  libcurl-errors.html curl_easy_strerror.html curl_multi_strerror.html	  \ | ||||
|  curl_share_strerror.html curl_global_init_mem.html libcurl-tutorial.html \ | ||||
|  curl_easy_reset.html curl_easy_escape.html curl_easy_unescape.html	  \ | ||||
|  curl_multi_setopt.html curl_multi_socket.html curl_multi_timeout.html | ||||
|  curl_multi_setopt.html curl_multi_socket.html curl_multi_timeout.html	  \ | ||||
|  curl_formget.html curl_multi_assign.html | ||||
|  | ||||
| PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf curl_easy_init.pdf \ | ||||
|  curl_easy_perform.pdf curl_easy_setopt.pdf curl_easy_duphandle.pdf	  \ | ||||
| @@ -51,7 +52,8 @@ PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf curl_easy_init.pdf \ | ||||
|  libcurl-errors.pdf curl_easy_strerror.pdf curl_multi_strerror.pdf	  \ | ||||
|  curl_share_strerror.pdf curl_global_init_mem.pdf libcurl-tutorial.pdf	  \ | ||||
|  curl_easy_reset.pdf curl_easy_escape.pdf curl_easy_unescape.pdf	  \ | ||||
|  curl_multi_setopt.pdf curl_multi_socket.pdf curl_multi_timeout.pdf | ||||
|  curl_multi_setopt.pdf curl_multi_socket.pdf curl_multi_timeout.pdf	  \ | ||||
|  curl_formget.pdf curl_multi_assign.pdf | ||||
|  | ||||
| CLEANFILES = $(HTMLPAGES) $(PDFPAGES) | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| .\" nroff -man [file] | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .TH curl_easy_cleanup 3 "13 Nov 2002" "libcurl 7.7" "libcurl Manual" | ||||
| .TH curl_easy_cleanup 3 "12 Oct 2006" "libcurl 7.7" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_easy_cleanup - End a libcurl easy session | ||||
| .SH SYNOPSIS | ||||
| @@ -21,6 +21,9 @@ more files. | ||||
|  | ||||
| When you've called this, you can safely remove all the strings you've | ||||
| previously told libcurl to use, as it won't use them anymore now. | ||||
|  | ||||
| Any uses of the \fBhandle\fP after this function has been called are | ||||
| illegal. This kills the handle and all memory associated with it! | ||||
| .SH RETURN VALUE | ||||
| None | ||||
| .SH "SEE ALSO" | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2007, 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 | ||||
| @@ -98,13 +98,13 @@ downloaded. The amount is only for the latest transfer and will be reset again | ||||
| for each new transfer. | ||||
| .IP CURLINFO_SPEED_DOWNLOAD | ||||
| Pass a pointer to a double to receive the average download speed that curl | ||||
| measured for the complete download. | ||||
| measured for the complete download. Measured in bytes/second. | ||||
| .IP CURLINFO_SPEED_UPLOAD | ||||
| Pass a pointer to a double to receive the average upload speed that curl | ||||
| measured for the complete upload. | ||||
| measured for the complete upload. Measured in bytes/second. | ||||
| .IP CURLINFO_HEADER_SIZE | ||||
| Pass a pointer to a long to receive the total size of all the headers | ||||
| received. | ||||
| received. Measured in number of bytes. | ||||
| .IP CURLINFO_REQUEST_SIZE | ||||
| Pass a pointer to a long to receive the total size of the issued | ||||
| requests. This is so far only for HTTP requests. Note that this may be more | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| .\" *                            | (__| |_| |  _ <| |___ | ||||
| .\" *                             \___|\___/|_| \_\_____| | ||||
| .\" * | ||||
| .\" * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| .\" * Copyright (C) 1998 - 2007, 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_easy_setopt 3 "19 Apr 2006" "libcurl 7.15.4" "libcurl Manual" | ||||
| .TH curl_easy_setopt 3 "22 Feb 2007" "libcurl 7.16.2" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_easy_setopt \- set options for a curl easy handle | ||||
| .SH SYNOPSIS | ||||
| @@ -160,20 +160,37 @@ found in \fI<curl/curl.h>\fP. This function gets called by libcurl when | ||||
| something special I/O-related needs to be done that the library can't do by | ||||
| itself. For now, rewinding the read data stream is the only action it can | ||||
| request. The rewinding of the read data stream may be necessary when doing a | ||||
| HTTP PUT or POST with a multi-pass authentication method.  (Opion added in | ||||
| HTTP PUT or POST with a multi-pass authentication method.  (Option added in | ||||
| 7.12.3) | ||||
| .IP CURLOPT_IOCTLDATA | ||||
| Pass a pointer that will be untouched by libcurl and passed as the 3rd | ||||
| argument in the ioctl callback set with \fICURLOPT_IOCTLFUNCTION\fP.  (Option | ||||
| added in 7.12.3) | ||||
| .IP CURLOPT_SOCKOPTFUNCTION | ||||
| Function pointer that should match the \fIcurl_sockopt_callback\fP prototype | ||||
| found in \fI<curl/curl.h>\fP. This function gets called by libcurl after the | ||||
| socket() call but before the connect() call. The callback's \fIpurpose\fP | ||||
| argument identifies the exact purpose for this particular socket, and | ||||
| currently only one value is supported: \fICURLSOCKTYPE_IPCXN\fP for the | ||||
| primary connection (meaning the control connection in the FTP case). Future | ||||
| versions of libcurl may support more purposes. It passes the newly created | ||||
| socket descriptor so additional setsockopt() calls can be done at the user's | ||||
| discretion.  A non-zero return code from the callback function will signal an | ||||
| unrecoverable error to the library and it will close the socket and return | ||||
| \fICURLE_COULDNT_CONNECT\fP.  (Option added in 7.15.6.) | ||||
| .IP CURLOPT_SOCKOPTDATA | ||||
| Pass a pointer that will be untouched by libcurl and passed as the first | ||||
| argument in the sockopt callback set with \fICURLOPT_SOCKOPTFUNCTION\fP. | ||||
| (Option added in 7.15.6.) | ||||
| .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 (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. | ||||
| its internal equivalent with a frequent interval during operation (roughly | ||||
| once per second) no matter if data is being transfered or not.  Unknown/unused | ||||
| argument values passed 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 | ||||
| @@ -327,6 +344,14 @@ when showing the progress meter and displaying \fICURLOPT_VERBOSE\fP data. | ||||
| A non-zero parameter tells the library to fail silently if the HTTP code | ||||
| returned is equal to or larger than 400. The default action would be to return | ||||
| the page normally, ignoring that code. | ||||
|  | ||||
| This method is not fail-safe and there are occasions where non-succesful | ||||
| response codes will slip through, especially when authentication is involved | ||||
| (response codes 401 and 407). | ||||
|  | ||||
| You might get some amounts of headers transferred before this situation is | ||||
| detected, like for when a "100-continue" is received as a response to a | ||||
| POST/PUT and a 401 or 407 is received immediately afterwards. | ||||
| .SH NETWORK OPTIONS | ||||
| .IP CURLOPT_URL | ||||
| The actual URL to deal with. The parameter should be a char * to a zero | ||||
| @@ -364,9 +389,12 @@ libcurl respects the environment variables \fBhttp_proxy\fP, \fBftp_proxy\fP, | ||||
| \fBall_proxy\fP etc, if any of those is set. The \fICURLOPT_PROXY\fP option | ||||
| does however override any possibly set environment variables. | ||||
|  | ||||
| Starting with 7.14.1, the proxy host string can be specified the exact same | ||||
| way as the proxy environment variables, include protocol prefix (http://) and | ||||
| embedded user + password. | ||||
| Setting the proxy string to "" (an empty string) will explicitly disable the | ||||
| use of a proxy, even if there is an environment variable set for it. | ||||
|  | ||||
| Since 7.14.1, the proxy host string given in environment variables can be | ||||
| specified the exact same way as the proxy can be set with \fICURLOPT_PROXY\fP, | ||||
| include protocol prefix (http://) and embedded user + password. | ||||
| .IP CURLOPT_PROXYPORT | ||||
| Pass a long with this option to set the proxy port to connect to unless it is | ||||
| specified in the proxy string \fICURLOPT_PROXY\fP. | ||||
| @@ -789,6 +817,16 @@ servers) which will report incorrect content length for files over 2 | ||||
| gigabytes. If this option is used, curl will not be able to accurately report | ||||
| progress, and will simply stop the download when the server ends the | ||||
| connection. (added in 7.14.1) | ||||
| .IP CURLOPT_HTTP_CONTENT_DECODING | ||||
| Pass a long to tell libcurl how to act on content decoding. If set to zero, | ||||
| content decoding will be disabled. If set to 1 it is enabled. Note however | ||||
| that libcurl has no default content decoding but requires you to use | ||||
| \fICURLOPT_ENCODING\fP for that. (added in 7.16.2) | ||||
| .IP CURLOPT_HTTP_TRANSFER_DECODING | ||||
| Pass a long to tell libcurl how to act on transfer decoding. If set to zero, | ||||
| transfer decoding will be disabled, if set to 1 it is enabled | ||||
| (default). libcurl does chunked transfer decoding by default unless this | ||||
| option is set to zero. (added in 7.16.2) | ||||
| .RE | ||||
| .SH FTP OPTIONS | ||||
| .IP CURLOPT_FTPPORT | ||||
| @@ -820,7 +858,8 @@ Pass a pointer to a linked list of FTP commands to pass to the server after | ||||
| the transfer type is set. The linked list should be a fully valid list of | ||||
| struct curl_slist structs properly filled in as described for | ||||
| \fICURLOPT_QUOTE\fP. Disable this operation again by setting a NULL to this | ||||
| option. | ||||
| option. Before version 7.15.6, if you also set \fICURLOPT_NOBODY\fP non-zero, | ||||
| this option didn't work. | ||||
| .IP CURLOPT_FTPLISTONLY | ||||
| A non-zero parameter tells the library to just list the names of an ftp | ||||
| directory, instead of doing a full directory listing that would include file | ||||
| @@ -859,6 +898,12 @@ waiting for a response, this value overrides \fICURLOPT_TIMEOUT\fP. It is | ||||
| recommended that if used in conjunction with \fICURLOPT_TIMEOUT\fP, you set | ||||
| \fICURLOPT_FTP_RESPONSE_TIMEOUT\fP to a value smaller than | ||||
| \fICURLOPT_TIMEOUT\fP.  (Added in 7.10.8) | ||||
| .IP CURLOPT_FTP_ALTERNATIVE_TO_USER | ||||
| Pass a char * as parameter, pointing to a string which will be used to | ||||
| authenticate if the usual FTP "USER user" and "PASS password" negotiation | ||||
| fails. This is currently only known to be required when connecting to | ||||
| Tumbleweed's Secure Transport FTPS server using client certificates for | ||||
| authentication. (Added in 7.15.5) | ||||
| .IP CURLOPT_FTP_SKIP_PASV_IP | ||||
| Pass a long. If set to a non-zero value, it instructs libcurl to not use the | ||||
| IP address the server suggests in its 227-response to libcurl's PASV command | ||||
| @@ -892,18 +937,21 @@ Try "AUTH SSL" first, and only if that fails try "AUTH TLS" | ||||
| .IP CURLFTPAUTH_TLS | ||||
| Try "AUTH TLS" first, and only if that fails try "AUTH SSL" | ||||
| .RE | ||||
| .IP CURLOPT_SOURCE_URL | ||||
| When set, it enables a FTP third party transfer, using the set URL as source, | ||||
| while \fICURLOPT_URL\fP is the target. | ||||
| .IP CURLOPT_SOURCE_USERPWD | ||||
| Set "username:password" to use for the source connection when doing FTP third | ||||
| party transfers. | ||||
| .IP CURLOPT_SOURCE_QUOTE | ||||
| Exactly like \fICURLOPT_QUOTE\fP, but for the source host. | ||||
| .IP CURLOPT_SOURCE_PREQUOTE | ||||
| Exactly like \fICURLOPT_PREQUOTE\fP, but for the source host. | ||||
| .IP CURLOPT_SOURCE_POSTQUOTE | ||||
| Exactly like \fICURLOPT_POSTQUOTE\fP, but for the source host. | ||||
| .IP CURLOPT_FTP_SSL_CCC | ||||
| If enabled, this option makes libcurl use CCC (Clear Command Channel). It | ||||
| shuts down the SSL/TLS layer after authenticating. The rest of the | ||||
| control channel communication will be unencrypted. This allows NAT routers | ||||
| to follow the FTP transaction. Pass a long using one of the values below. | ||||
| (Added in 7.16.1) | ||||
| .RS | ||||
| .IP CURLFTPSSL_CCC_NONE | ||||
| Don't attempt to use CCC. | ||||
| .IP CURLFTPSSL_CCC_PASSIVE | ||||
| Do not initiate the shutdown, but wait for the server to do it. Do not send | ||||
| a reply. | ||||
| .IP CURLFTPSSL_CCC_ACTIVE | ||||
| Initiate the shutdown and wait for a reply. | ||||
| .RE | ||||
| .IP CURLOPT_FTP_ACCOUNT | ||||
| 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, | ||||
| @@ -948,7 +996,9 @@ techniques). Pass a NULL to this option to disable the use of ranges. | ||||
| .IP CURLOPT_RESUME_FROM | ||||
| Pass a long as parameter. It contains the offset in number of bytes that you | ||||
| want the transfer to start from. Set this option to 0 to make the transfer | ||||
| start from the beginning (effectively disabling resume). | ||||
| start from the beginning (effectively disabling resume). For FTP, set this | ||||
| option to -1 to make the transfer start from the end of the target file | ||||
| (useful to continue an interrupted upload). | ||||
| .IP CURLOPT_RESUME_FROM_LARGE | ||||
| Pass a curl_off_t as parameter. It contains the offset in number of bytes that | ||||
| you want the transfer to start from. (Added in 7.11.0) | ||||
| @@ -985,15 +1035,21 @@ to POST with \fICURLOPT_POST\fP etc. | ||||
| When uploading a file to a remote site, this option should be used to tell | ||||
| libcurl what the expected size of the infile is. This value should be passed | ||||
| as a long. See also \fICURLOPT_INFILESIZE_LARGE\fP. | ||||
|  | ||||
| Note that this option does not limit how much data libcurl will actually send, | ||||
| as that is controlled entirely by what the read callback returns. | ||||
| .IP CURLOPT_INFILESIZE_LARGE | ||||
| When uploading a file to a remote site, this option should be used to tell | ||||
| libcurl what the expected size of the infile is.  This value should be passed | ||||
| as a curl_off_t. (Added in 7.11.0) | ||||
|  | ||||
| Note that this option does not limit how much data libcurl will actually send, | ||||
| as that is controlled entirely by what the read callback returns. | ||||
| .IP CURLOPT_UPLOAD | ||||
| A non-zero parameter tells the library to prepare for an upload. The | ||||
| \fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZEE\fP or | ||||
| \fICURLOPT_INFILESIZE_LARGE\fP are also interesting for uploads. If the | ||||
| protocol is HTTP, uploading means using the PUT request unless you tell | ||||
| \fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP or | ||||
| \fICURLOPT_INFILESIZE_LARGE\fP options are also interesting for uploads. If | ||||
| the protocol is HTTP, uploading means using the PUT request unless you tell | ||||
| libcurl otherwise. | ||||
|  | ||||
| Using PUT with HTTP 1.1 implies the use of a "Expect: 100-continue" header. | ||||
| @@ -1043,6 +1099,10 @@ SIGALRM to enable time-outing system calls. | ||||
|  | ||||
| In unix-like systems, this might cause signals to be used unless | ||||
| \fICURLOPT_NOSIGNAL\fP is set. | ||||
| .IP CURLOPT_TIMEOUT_MS | ||||
| Like \fICURLOPT_TIMEOUT\fP but takes number of milliseconds instead. If | ||||
| libcurl is built to use the standard system name resolver, that part will | ||||
| still use full-second resolution for timeouts. (Added in 7.16.2) | ||||
| .IP CURLOPT_LOW_SPEED_LIMIT | ||||
| Pass a long as parameter. It contains the transfer speed in bytes per second | ||||
| that the transfer should be below during \fICURLOPT_LOW_SPEED_TIME\fP seconds | ||||
| @@ -1051,6 +1111,16 @@ for the library to consider it too slow and abort. | ||||
| Pass a long as parameter. It contains the time in seconds that the transfer | ||||
| should be below the \fICURLOPT_LOW_SPEED_LIMIT\fP for the library to consider | ||||
| it too slow and abort. | ||||
| .IP CURLOPT_MAX_SEND_SPEED_LARGE | ||||
| Pass a curl_off_t as parameter.  If an upload exceeds this speed on cumulative | ||||
| average during the transfer, the transfer will pause to keep the average rate | ||||
| less than or equal to the parameter value.  Defaults to unlimited | ||||
| speed. (Added in 7.15.5) | ||||
| .IP CURLOPT_MAX_RECV_SPEED_LARGE | ||||
| Pass a curl_off_t as parameter.  If a download exceeds this speed on | ||||
| cumulative average during the transfer, the transfer will pause to keep the | ||||
| average rate less than or equal to the parameter value. Defaults to unlimited | ||||
| speed. (Added in 7.15.5) | ||||
| .IP CURLOPT_MAXCONNECTS | ||||
| Pass a long. The set number will be the persistent connection cache size. The | ||||
| set amount will be the maximum amount of simultaneously open connections that | ||||
| @@ -1059,23 +1129,14 @@ value unless you are perfectly aware of how this work and changes libcurl's | ||||
| behaviour. This concerns connection using any of the protocols that support | ||||
| persistent connections. | ||||
|  | ||||
| When reaching the maximum limit, curl uses the \fICURLOPT_CLOSEPOLICY\fP to | ||||
| figure out which of the existing connections to close to prevent the number of | ||||
| open connections to increase. | ||||
| When reaching the maximum limit, curl closes the oldest one in the cache to | ||||
| prevent the number of open connections to increase. | ||||
|  | ||||
| If you already have performed transfers with this curl handle, setting a | ||||
| smaller MAXCONNECTS than before may cause open connections to get closed | ||||
| unnecessarily. | ||||
| .IP CURLOPT_CLOSEPOLICY | ||||
| Pass a long. This option sets what policy libcurl should use when the | ||||
| connection cache is filled and one of the open connections has to be closed to | ||||
| make room for a new connection. This must be one of the CURLCLOSEPOLICY_* | ||||
| defines. Use \fICURLCLOSEPOLICY_LEAST_RECENTLY_USED\fP to make libcurl close | ||||
| the connection that was least recently used, that connection is also least | ||||
| likely to be capable of re-use. Use \fICURLCLOSEPOLICY_OLDEST\fP to make | ||||
| libcurl close the oldest connection, the one that was created first among the | ||||
| ones in the connection cache. The other close policies are not support | ||||
| yet. | ||||
| (Obsolete) This option does nothing. | ||||
| .IP CURLOPT_FRESH_CONNECT | ||||
| Pass a long. Set to non-zero to make the next transfer use a new (fresh) | ||||
| connection by force. If the connection cache is full before this connection, | ||||
| @@ -1099,6 +1160,10 @@ timeouts). See also the \fICURLOPT_TIMEOUT\fP option. | ||||
|  | ||||
| In unix-like systems, this might cause signals to be used unless | ||||
| \fICURLOPT_NOSIGNAL\fP is set. | ||||
| .IP CURLOPT_CONNECTTIMEOUT_MS | ||||
| Like \fICURLOPT_CONNECTTIMEOUT\fP but takes number of milliseconds instead. If | ||||
| libcurl is built to use the standard system name resolver, that part will | ||||
| still use full-second resolution for timeouts. (Added in 7.16.2) | ||||
| .IP CURLOPT_IPRESOLVE | ||||
| Allows an application to select what kind of IP addresses to use when | ||||
| resolving host names. This is only interesting when using host names that | ||||
| @@ -1111,7 +1176,7 @@ Resolve to ipv4 addresses. | ||||
| .IP CURL_IPRESOLVE_V6 | ||||
| Resolve to ipv6 addresses. | ||||
| .RE | ||||
| .SH CURLOPT_CONNECT_ONLY | ||||
| .IP 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. | ||||
|  | ||||
| @@ -1124,6 +1189,9 @@ transfers. (Added in 7.15.2) | ||||
| Pass a pointer to a zero terminated string as parameter. The string should be | ||||
| the file name of your certificate. The default format is "PEM" and can be | ||||
| changed with \fICURLOPT_SSLCERTTYPE\fP. | ||||
|  | ||||
| With NSS this is the nickname of the certificate you wish to authenticate | ||||
| with. | ||||
| .IP CURLOPT_SSLCERTTYPE | ||||
| Pass a pointer to a zero terminated string as parameter. The string should be | ||||
| the format of your certificate. Supported formats are "PEM" and "DER".  (Added | ||||
| @@ -1149,7 +1217,8 @@ engine. You have to set the crypto engine with \fICURLOPT_SSLENGINE\fP. | ||||
| \&"DER" format key file currently does not work because of a bug in OpenSSL. | ||||
| .IP CURLOPT_SSLKEYPASSWD | ||||
| Pass a pointer to a zero terminated string as parameter. It will be used as | ||||
| the password required to use the \fICURLOPT_SSLKEY\fP private key. | ||||
| the password required to use the \fICURLOPT_SSLKEY\fP or | ||||
| \fICURLOPT_SSH_PRIVATE_KEYFILE\fP private key. | ||||
| .IP CURLOPT_SSLENGINE | ||||
| Pass a pointer to a zero terminated string as parameter. It will be used as | ||||
| the identifier for the crypto engine you want to use for your private | ||||
| @@ -1168,8 +1237,8 @@ Pass a long as parameter to control what version of SSL/TLS to attempt to use. | ||||
| The available options are: | ||||
| .RS | ||||
| .IP CURL_SSLVERSION_DEFAULT | ||||
| The default action. When libcurl built with OpenSSL, this will attempt to | ||||
| figure out the remote SSL protocol version. Unfortunately there are a lot of | ||||
| The default action. When libcurl built with OpenSSL or NSS, this will attempt | ||||
| to figure out the remote SSL protocol version. Unfortunately there are a lot of | ||||
| ancient and broken servers in use which cannot handle this technique and will | ||||
| fail to connect. When libcurl is built with GnuTLS, this will mean SSLv3. | ||||
| .IP CURL_SSLVERSION_TLSv1 | ||||
| @@ -1212,15 +1281,18 @@ 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. | ||||
|  | ||||
| When built against NSS this is the directory that the NSS certificate | ||||
| database resides in. | ||||
| .IP CURLOPT_CAPATH | ||||
| Pass a char * to a zero terminated string naming a directory holding | ||||
| multiple CA certificates to verify the peer with. The certificate | ||||
| directory must be prepared using the openssl c_rehash utility. This | ||||
| makes sense only when used in combination with the | ||||
| \fICURLOPT_SSL_VERIFYPEER\fP option.  If \fICURLOPT_SSL_VERIFYPEER\fP | ||||
| is zero, \fICURLOPT_CAPATH\fP need not even indicate an accessible | ||||
| path.  The \fICURLOPT_CAPATH\fP function apparently does not work in | ||||
| Windows due to some limitation in openssl. (Added in 7.9.8) | ||||
| Pass a char * to a zero terminated string naming a directory holding multiple | ||||
| CA certificates to verify the peer with. The certificate directory must be | ||||
| prepared using the openssl c_rehash utility. This makes sense only when used | ||||
| in combination with the \fICURLOPT_SSL_VERIFYPEER\fP option.  If | ||||
| \fICURLOPT_SSL_VERIFYPEER\fP is zero, \fICURLOPT_CAPATH\fP need not even | ||||
| indicate an accessible path.  The \fICURLOPT_CAPATH\fP function apparently | ||||
| does not work in Windows due to some limitation in openssl. This option is | ||||
| OpenSSL-specific and does nothing if libcurl is built to use GnuTLS. | ||||
| .IP CURLOPT_RANDOM_FILE | ||||
| Pass a char * to a zero terminated file name. The file will be used to read | ||||
| from to seed the random engine for SSL. The more random the specified file is, | ||||
| @@ -1261,18 +1333,47 @@ Pass a char *, pointing to a zero terminated string holding the list of | ||||
| ciphers to use for the SSL connection. The list must be syntactically correct, | ||||
| it consists of one or more cipher strings separated by colons. Commas or spaces | ||||
| are also acceptable separators but colons are normally used, \!, \- and \+ can | ||||
| be used as operators. Valid examples of cipher lists include 'RC4-SHA', | ||||
| be used as operators. | ||||
|  | ||||
| For OpenSSL and GnuTLS valid examples of cipher lists include 'RC4-SHA', | ||||
| \'SHA1+DES\', 'TLSv1' and 'DEFAULT'. The default list is normally set when you | ||||
| compile OpenSSL. | ||||
|  | ||||
| You'll find more details about cipher lists on this URL: | ||||
| \fIhttp://www.openssl.org/docs/apps/ciphers.html\fP | ||||
|  | ||||
| For NSS valid examples of cipher lists include 'rsa_rc4_128_md5', | ||||
| \'rsa_aes_128_sha\', etc. With NSS you don't add/remove ciphers. If one uses | ||||
| this option then all known ciphers are disabled and only those passed in | ||||
| are enabled. | ||||
|  | ||||
| You'll find more details about the NSS cipher lists on this URL: | ||||
| \fIhttp://directory.fedora.redhat.com/docs/mod_nss.html#Directives\fP | ||||
|  | ||||
| .IP CURLOPT_SSL_SESSIONID_CACHE | ||||
| Pass a long set to 0 to disable libcurl's use of SSL session-ID caching. Set | ||||
| this to 1 to enable it. By default all transfers are done using the | ||||
| cache. Note that while nothing ever should get hurt by attempting to reuse SSL | ||||
| session-IDs, there seem to be broken SSL implementations in the wild that may | ||||
| require you to disable this in order for you to succeed. (Added in 7.16.0) | ||||
| .IP CURLOPT_KRB4LEVEL | ||||
| Pass a char * as parameter. Set the krb4 security level, this also enables | ||||
| krb4 awareness.  This is a string, 'clear', 'safe', 'confidential' or | ||||
| \&'private'.  If the string is set but doesn't match one of these, 'private' | ||||
| will be used. Set the string to NULL to disable kerberos4. The kerberos | ||||
| support only works for FTP. | ||||
| .SH SSH OPTIONS | ||||
| .IP CURLOPT_SSH_AUTH_TYPES | ||||
| Pass a long set to a bitmask consisting of one or more of | ||||
| CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, | ||||
| CURLSSH_AUTH_KEYBOARD. Set CURLSSH_AUTH_ANY to let libcurl pick one. | ||||
| .IP CURLOPT_SSH_PUBLIC_KEYFILE | ||||
| Pass a char * pointing to a file name for your public key. If not used, | ||||
| libcurl defaults to using \fB~/.ssh/id_dsa.pub\fP. | ||||
| .IP CURLOPT_SSH_PRIVATE_KEYFILE | ||||
| Pass a char * pointing to a file name for your private key. If not used, | ||||
| libcurl defaults to using \fB~/.ssh/id_dsa\fP. | ||||
| If the file is password-protected, set the password with \fICURLOPT_SSLKEYPASSWD\fP. | ||||
| .SH OTHER OPTIONS | ||||
| .IP CURLOPT_PRIVATE | ||||
| Pass a char * as parameter, pointing to data that should be associated with | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user