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 | config.log | ||||||
| Makefile | Makefile | ||||||
| libtool | libtool | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								COPYING
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								COPYING
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| COPYRIGHT AND PERMISSION NOTICE | 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. | 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 | # This software is licensed as described in the file COPYING, which | ||||||
| # you should have received as part of this distribution. The terms | # you should have received as part of this distribution. The terms | ||||||
| @@ -21,6 +21,8 @@ | |||||||
| # $Id$ | # $Id$ | ||||||
| ########################################################################### | ########################################################################### | ||||||
|  |  | ||||||
|  | VC=vc6 | ||||||
|  |  | ||||||
| all: | all: | ||||||
| 	./configure | 	./configure | ||||||
| 	make | 	make | ||||||
| @@ -73,112 +75,120 @@ mingw32-ssl: | |||||||
| 	$(MAKE) -C lib -f Makefile.m32 SSL=1 ZLIB=1 | 	$(MAKE) -C lib -f Makefile.m32 SSL=1 ZLIB=1 | ||||||
| 	$(MAKE) -C src -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: | mingw32-clean: | ||||||
| 	$(MAKE) -C lib -f Makefile.m32 clean | 	$(MAKE) -C lib -f Makefile.m32 clean | ||||||
| 	$(MAKE) -C src -f Makefile.m32 clean | 	$(MAKE) -C src -f Makefile.m32 clean | ||||||
|  |  | ||||||
| vc-clean: | vc-clean: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake -f Makefile.vc6 clean | 	nmake -f Makefile.$(VC) clean | ||||||
| 	cd ..\src | 	cd ..\src | ||||||
| 	nmake -f Makefile.vc6 clean | 	nmake -f Makefile.$(VC) clean | ||||||
|  |  | ||||||
| vc-all: | vc-all: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake -f Makefile.vc6 cfg=release | 	nmake -f Makefile.$(VC) cfg=release | ||||||
| 	nmake -f Makefile.vc6 cfg=release-ssl | 	nmake -f Makefile.$(VC) cfg=release-ssl | ||||||
| 	nmake -f Makefile.vc6 cfg=release-zlib | 	nmake -f Makefile.$(VC) cfg=release-zlib | ||||||
| 	nmake -f Makefile.vc6 cfg=release-ssl-zlib | 	nmake -f Makefile.$(VC) cfg=release-ssl-zlib | ||||||
| 	nmake -f Makefile.vc6 cfg=release-ssl-dll | 	nmake -f Makefile.$(VC) cfg=release-ssl-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=release-zlib-dll | 	nmake -f Makefile.$(VC) cfg=release-zlib-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=release-ssl-dll-zlib-dll | 	nmake -f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=release-dll | 	nmake -f Makefile.$(VC) cfg=release-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=release-dll-ssl-dll | 	nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=release-dll-zlib-dll | 	nmake -f Makefile.$(VC) cfg=release-dll-zlib-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll | 	nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=debug | 	nmake -f Makefile.$(VC) cfg=debug | ||||||
| 	nmake -f Makefile.vc6 cfg=debug-ssl | 	nmake -f Makefile.$(VC) cfg=debug-ssl | ||||||
| 	nmake -f Makefile.vc6 cfg=debug-zlib | 	nmake -f Makefile.$(VC) cfg=debug-zlib | ||||||
| 	nmake -f Makefile.vc6 cfg=debug-ssl-zlib | 	nmake -f Makefile.$(VC) cfg=debug-ssl-zlib | ||||||
| 	nmake -f Makefile.vc6 cfg=debug-ssl-dll | 	nmake -f Makefile.$(VC) cfg=debug-ssl-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=debug-zlib-dll | 	nmake -f Makefile.$(VC) cfg=debug-zlib-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=debug-ssl-dll-zlib-dll | 	nmake -f Makefile.$(VC) cfg=debug-ssl-dll-zlib-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=debug-dll | 	nmake -f Makefile.$(VC) cfg=debug-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll | 	nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=debug-dll-zlib-dll | 	nmake -f Makefile.$(VC) cfg=debug-dll-zlib-dll | ||||||
| 	nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll-zlib-dll | 	nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll-zlib-dll | ||||||
|  |  | ||||||
| vc: | vc: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake /f Makefile.vc6 cfg=release | 	nmake /f Makefile.$(VC) cfg=release | ||||||
| 	cd ..\src | 	cd ..\src | ||||||
| 	nmake /f Makefile.vc6 | 	nmake /f Makefile.$(VC) | ||||||
|  |  | ||||||
| vc-zlib: | vc-zlib: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake /f Makefile.vc6 cfg=release-zlib | 	nmake /f Makefile.$(VC) cfg=release-zlib | ||||||
| 	cd ..\src | 	cd ..\src | ||||||
| 	nmake /f Makefile.vc6 cfg=release-zlib | 	nmake /f Makefile.$(VC) cfg=release-zlib | ||||||
|  |  | ||||||
| vc-ssl: | vc-ssl: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake /f Makefile.vc6 cfg=release-ssl | 	nmake /f Makefile.$(VC) cfg=release-ssl | ||||||
| 	cd ..\src | 	cd ..\src | ||||||
| 	nmake /f Makefile.vc6 cfg=release-ssl | 	nmake /f Makefile.$(VC) cfg=release-ssl | ||||||
|  |  | ||||||
| vc-ssl-zlib: | vc-ssl-zlib: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake /f Makefile.vc6 cfg=release-ssl-zlib | 	nmake /f Makefile.$(VC) cfg=release-ssl-zlib | ||||||
| 	cd ..\src | 	cd ..\src | ||||||
| 	nmake /f Makefile.vc6 cfg=release-ssl-zlib | 	nmake /f Makefile.$(VC) cfg=release-ssl-zlib | ||||||
|  |  | ||||||
| vc-ssl-dll: | vc-ssl-dll: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake /f Makefile.vc6 cfg=release-ssl-dll | 	nmake /f Makefile.$(VC) cfg=release-ssl-dll | ||||||
| 	cd ..\src | 	cd ..\src | ||||||
| 	nmake /f Makefile.vc6 cfg=release-ssl-dll | 	nmake /f Makefile.$(VC) cfg=release-ssl-dll | ||||||
|  |  | ||||||
| vc-dll-ssl-dll: | vc-dll-ssl-dll: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake /f Makefile.vc6 cfg=release-dll-ssl-dll | 	nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll | ||||||
| 	cd ..\src | 	cd ..\src | ||||||
| 	nmake /f Makefile.vc6 cfg=release-dll-ssl-dll | 	nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll | ||||||
|  |  | ||||||
| vc-dll: | vc-dll: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake /f Makefile.vc6 cfg=release-dll | 	nmake /f Makefile.$(VC) cfg=release-dll | ||||||
| 	cd ..\src | 	cd ..\src | ||||||
| 	nmake /f Makefile.vc6 cfg=release-dll | 	nmake /f Makefile.$(VC) cfg=release-dll | ||||||
|  |  | ||||||
| vc-dll-zlib-dll: | vc-dll-zlib-dll: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake /f Makefile.vc6 cfg=release-dll-zlib-dll | 	nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll | ||||||
| 	cd ..\src | 	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: | vc-dll-ssl-dll-zlib-dll: | ||||||
| 	cd lib | 	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 | 	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: | vc-ssl-dll-zlib-dll: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll | 	nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll | ||||||
| 	cd ..\src | 	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: | vc-zlib-dll: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake /f Makefile.vc6 cfg=release-zlib-dll | 	nmake /f Makefile.$(VC) cfg=release-zlib-dll | ||||||
| 	cd ..\src | 	cd ..\src | ||||||
| 	nmake /f Makefile.vc6 cfg=release-zlib-dll | 	nmake /f Makefile.$(VC) cfg=release-zlib-dll | ||||||
|  |  | ||||||
| vc-sspi: | vc-sspi: | ||||||
| 	cd lib | 	cd lib | ||||||
| 	nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1 | 	nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1 | ||||||
| 	cd ..\src | 	cd ..\src | ||||||
| 	nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1 | 	nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1 | ||||||
|  |  | ||||||
| djgpp: | djgpp: | ||||||
| 	$(MAKE) -C lib -f Makefile.dj | 	$(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 lib -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1 | ||||||
| 	$(MAKE) -C src -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: | netware-zlib: | ||||||
| 	$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1 | 	$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1 | ||||||
| 	$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1 | 	$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1 | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								README
									
									
									
									
									
								
							| @@ -7,7 +7,7 @@ | |||||||
| README | README | ||||||
|  |  | ||||||
|   Curl is a command line tool for transferring data specified with URL |   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 |   MANUAL document. Find out how to install Curl by reading the INSTALL | ||||||
|   document. |   document. | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										114
									
								
								RELEASE-NOTES
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								RELEASE-NOTES
									
									
									
									
									
								
							| @@ -1,72 +1,78 @@ | |||||||
| Curl and libcurl 7.15.4 | Curl and libcurl 7.16.2 | ||||||
|  |  | ||||||
|  Public curl release number:               94 |  Public curl release number:               98 | ||||||
|  Releases counted from the very beginning: 121 |  Releases counted from the very beginning: 125 | ||||||
|  Available command line options:           112 |  Available command line options:           118 | ||||||
|  Available curl_easy_setopt() options:     132 |  Available curl_easy_setopt() options:     141 | ||||||
|  Number of public functions in libcurl:    49 |  Number of public functions in libcurl:    54 | ||||||
|  Amount of public web site mirrors:        33 |  Amount of public web site mirrors:        38 | ||||||
|  Number of known libcurl bindings:         32 |  Number of known libcurl bindings:         35 | ||||||
|  Number of contributors:                   492 |  Number of contributors:                   539 | ||||||
|  |  | ||||||
| This release includes the following changes: | This release includes the following changes: | ||||||
|  |   | ||||||
|  o NTLM2 session response support |  o added CURLOPT_TIMEOUT_MS and CURLOPT_CONNECTTIMEOUT_MS | ||||||
|  o CURLOPT_COOKIELIST set to "SESS" clears all session cookies |  o added CURLOPT_HTTP_CONTENT_DECODING, CURLOPT_HTTP_TRANSFER_DECODING and | ||||||
|  o CURLINFO_LASTSOCKET returned sockets are now checked more before returned |    --raw | ||||||
|  o curl-config got a --checkfor option to compare version numbers |  o added support for using the NSS library for TLS/SSL | ||||||
|  o line end conversions for FTP ASCII transfers |  o changed default anonymous FTP password | ||||||
|  o curl_multi_socket() API added (still mostly untested) |  o changed the CURLOPT_FTP_SSL_CCC option to handle active and passive | ||||||
|  o conversion callback options for EBCDIC <=> ASCII conversions |    CCC shutdown | ||||||
|  o added CURLINFO_FTP_ENTRY_PATH |  o added the --ftp-ssl-ccc-mode command line option | ||||||
|  o less blocking for the multi interface during (Open)SSL connect negotiation |  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: | This release includes the following bugfixes: | ||||||
|  |  | ||||||
|  o builds fine on cygwin |  o in testsuite, update test cookies expiration from 2007-Feb-1 to year 2035  | ||||||
|  o md5-sess with Digest authentication |  o socks5 works | ||||||
|  o dict with letters such as space in a word |  o builds fine with VC2005 | ||||||
|  o dict with url-encoded words in the URL |  o CURLOPT_RANGE set to NULL resets the range for FTP | ||||||
|  o libcurl.m4 when default=yes but no libcurl was found |  o curl_multi_remove_handle() rare crash | ||||||
|  o numerous bugs fixed in the TFTP code |  o passive FTP transfers work with SOCKS | ||||||
|  o possible memory leak when adding easy handles to multi stack |  o multi interface HTTPS connection re-use memory leak | ||||||
|  o TFTP works in a more portable fashion (== on more platforms) |  o libcurl.m4's --with-libcurl is improved | ||||||
|  o WSAGetLastError() is now used (better) on Windows |  o curl-config --libs and libcurl.pc no longer list unnecessary dependencies | ||||||
|  o GnuTLS non-block case that could cause data trashing |  o fixed an issue with CCC not working on some servers | ||||||
|  o deflate code survives lack of zlib header |  o several HTTP pipelining problems | ||||||
|  o CURLOPT_INTERFACE works with hostname |  o HTTP CONNECT thru a proxy is now less blocking when the multi interface is | ||||||
|  o configure runs fine with ICC |    used | ||||||
|  o closed control connection with FTP when easy handle was removed from multi |  o HTTP Digest header parsing fix for unquoted last word ending with CRLF | ||||||
|  o curl --trace crash when built with VS2005 |  o CURLOPT_PORT, HTTP proxy, re-using connections and non-HTTP protocols | ||||||
|  o SSL connect time-out |  o CURLOPT_INTERFACE for ipv6 | ||||||
|  o improved NTLM functionality |  o use-after-free issue with HTTP transfers with the multi interface | ||||||
|  o following redirects with more than one question mark in source URL |  o the progress callback can get called more frequently | ||||||
|  o fixed debug build crash with -d |  o timeout would restart when signal caught while awaiting socket events | ||||||
|  o generates a fine AIX Toolbox RPM spec |  o curl -f with user+password embedded in the URL | ||||||
|  o treat FTP AUTH failures properly |  o 26 flaws identified by coverity.com | ||||||
|  o TFTP transfers could trash data |  o builds on QNX 6 again | ||||||
|  o -d + -G combo crash |  | ||||||
|  | This release includes the following known bugs: | ||||||
|  |  | ||||||
|  |  o see docs/KNOWN_BUGS (http://curl.haxx.se/docs/knownbugs.html) | ||||||
|  |  | ||||||
| Other curl-related news: | Other curl-related news: | ||||||
|  |  | ||||||
|  o tclcurl 0.15.3 was released: |  o pycurl 7.16.1 was released: http://pycurl.sf.net/ | ||||||
|    http://personal1.iddeo.es/andresgarci/tclcurl/english/ |  | ||||||
|  |  | ||||||
| New curl mirrors: | New curl mirrors: | ||||||
|  |  | ||||||
|  o http://curl.webdesign-zdg.de/ in Frankfurt, Germany |  o http://curl.basemirror.de is a new mirror in Germany | ||||||
|  o http://curl.de-mirror.de/ in Aachen, Germany |  o http://curl.xxtracker.org is a new mirror in The Netherlands | ||||||
|  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 |  | ||||||
|  |  | ||||||
| This release would not have looked like this without help, code, reports and | This release would not have looked like this without help, code, reports and | ||||||
| advice from friends like these: | advice from friends like these: | ||||||
|  |  | ||||||
|  Dan Fandrich, Ilja van Sprundel, David McCreedy, Tor Arntsen, Xavier Bouchoux, |  Yang Tse, Manfred Schwarb, Michael Wallner, Jeff Pohlmeyer, Shmulik Regev, | ||||||
|  David Byron, Michele Bini, Ates Goral, Katie Wang, Robson Braga Araujo, |  Rob Crittenden, Robert A. Monat, Dan Fandrich, Duncan Mac-Vicar Prett, | ||||||
|  Ale Vesely, Paul Querna, Gisle Vanem, Mark Eichin, Roland Blom, Andreas |  Michal Marek, Robson Braga Araujo, Ian Turner, Linus Nielsen Feltzing, | ||||||
|  Ntaflos, David Shaw, Michael Wallner, Olaf St<53>ben, Mikael Sennerholm, |  Ravi Pratap, Adam D. Moss, Jose Kahan, Hang Kin Lau, Justin Fletcher, | ||||||
|  Brian Dessent |  Robert Iakobashvili, Bryan Henderson, Eygene Ryabinkin, Daniel Johnson, | ||||||
|  |  Matt Kraai, Nick Zitzmann, Rob Jones | ||||||
|  |  | ||||||
|         Thanks! (and sorry if I forgot to mention someone) |         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 -  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										1005
									
								
								acinclude.m4
									
									
									
									
									
								
							
							
						
						
									
										1005
									
								
								acinclude.m4
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -14,3 +14,9 @@ Henrik Stoerner | |||||||
| Yang Tse | Yang Tse | ||||||
| Nick Mathewson | Nick Mathewson | ||||||
| Alexander Lazic | 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 |   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 | * May 10, 2006 | ||||||
|  |  | ||||||
| - Bram Matthys brought my attention to a libtool peculiarity where detecting | - 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 | - configure fix for detecting a member in the sockaddr_in6 struct which failed | ||||||
|   on ipv6-enabled HP-UX 11.00 |   on ipv6-enabled HP-UX 11.00 | ||||||
|  |  | ||||||
| Version 1.3.0 (August 29, 2004) | Version 1.3.0 (August 29, 2005) | ||||||
|  |  | ||||||
| * August 21 | * 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 | # adig and ahost are just sample programs and thus not mentioned with the | ||||||
| # regular sources and headers | # regular sources and headers | ||||||
| EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \ | EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \ | ||||||
|  $(MSVCFILES) AUTHORS |  $(MSVCFILES) AUTHORS config-win32.h | ||||||
|  |  | ||||||
|  |  | ||||||
| VER=-version-info 1:0:0 | VER=-version-info 1:0:0 | ||||||
| @@ -59,7 +59,7 @@ libcares_la_SOURCES = $(CSOURCES) $(HHEADERS) | |||||||
| # where to install the c-ares headers | # where to install the c-ares headers | ||||||
| libcares_ladir = $(includedir) | libcares_ladir = $(includedir) | ||||||
| # what headers to install on 'make install': | # 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 | # Make files named *.dist replace the file without .dist extension | ||||||
| dist-hook: | dist-hook: | ||||||
|   | |||||||
| @@ -2,39 +2,63 @@ | |||||||
| # c-ares Makefile for djgpp/gcc/Watt-32. | # c-ares Makefile for djgpp/gcc/Watt-32. | ||||||
| #   By Gisle Vanem <giva@bgnett.no> 2004. | #   By Gisle Vanem <giva@bgnett.no> 2004. | ||||||
| # | # | ||||||
| .SUFFIXES: .exe | # $Id$ | ||||||
|  |  | ||||||
|  | TOPDIR = .. | ||||||
|  |  | ||||||
|  | include ../packages/DOS/common.dj | ||||||
|  |  | ||||||
| include Makefile.inc | include Makefile.inc | ||||||
|  |  | ||||||
| WATT32_ROOT = $(subst \,/,$(WATT_ROOT)) | CFLAGS += -DWATT32 -DHAVE_AF_INET6 -DHAVE_PF_INET6 -DHAVE_FIONBIO \ | ||||||
|  |           -DHAVE_STRUCT_IN6_ADDR -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID \ | ||||||
| CC      = gcc |           -DHAVE_SYS_TIME_H -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \ | ||||||
| CFLAGS  = -O2 -Wall -DWATT32 -Dselect=select_s -DHAVE_AF_INET6 \ |           -DHAVE_SIGNAL_H -DHAVE_SIG_ATOMIC_T -DRETSIGTYPE='void' -DHAVE_PROCESS_H \ | ||||||
|           -DHAVE_PF_INET6 -DHAVE_IOCTLSOCKET -DHAVE_STRUCT_IN6_ADDR \ |           -DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 -DHAVE_RECV -DHAVE_SEND \ | ||||||
|           -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \ |           -DSEND_TYPE_ARG1='int'   -DSEND_QUAL_ARG2='const' \ | ||||||
|           -DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 \ |           -DSEND_TYPE_ARG2='void*' -DSEND_TYPE_ARG3='int' \ | ||||||
|           -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID -I$(WATT32_ROOT)/inc |           -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 | 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)) | OBJECTS = $(addprefix $(OBJ_DIR)/, $(CSOURCES:.c=.o)) | ||||||
|  |  | ||||||
| all: $(OBJ_DIR) libcares.a ahost.exe adig.exe | all: $(OBJ_DIR) libcares.a ahost.exe adig.exe | ||||||
| 	@echo Welcome to c-ares. | 	@echo Welcome to c-ares. | ||||||
|  |  | ||||||
| $(OBJ_DIR): |  | ||||||
| 	- mkdir $(OBJ_DIR) |  | ||||||
|  |  | ||||||
| libcares.a: $(OBJECTS) | libcares.a: $(OBJECTS) | ||||||
| 	ar rs $@ $? | 	ar rs $@ $? | ||||||
|  |  | ||||||
| ahost.exe: ahost.c libcares.a | ahost.exe: ahost.c $(OBJ_HACK) | ||||||
| 	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS) | 	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS) | ||||||
|  |  | ||||||
| adig.exe: adig.c libcares.a | adig.exe: adig.c $(OBJ_HACK) | ||||||
| 	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS) | 	$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS) | ||||||
|  |  | ||||||
| clean: | clean: | ||||||
| @@ -44,12 +68,5 @@ vclean realclean: clean | |||||||
| 	rm -f ahost.exe adig.exe depend.dj | 	rm -f ahost.exe adig.exe depend.dj | ||||||
| 	- rmdir $(OBJ_DIR) | 	- 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 | -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_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_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_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          \ | 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 \ | MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \ | ||||||
|  ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3                \ |  ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3		    \ | ||||||
|  ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3        \ |  ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3	    \ | ||||||
|  ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3                 \ |  ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3		    \ | ||||||
|  ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3      \ |  ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3	    \ | ||||||
|  ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_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 | ## 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. | # Edit the vars below to change NLM target settings. | ||||||
| TARGETS = adig.nlm ahost.nlm | TARGETS = adig.nlm ahost.nlm | ||||||
| LTARGET = libcares.lib | LTARGET = libcares.$(LIBEXT) | ||||||
| VERSION	= $(LIBCARES_VERSION) | 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 | DESCR	= cURL $(subst .def,,$(notdir $@)) $(LIBCARES_VERSION_STR) - http://curl.haxx.se | ||||||
| MTSAFE	= YES | MTSAFE	= YES | ||||||
| STACK	= 64000 | STACK	= 64000 | ||||||
| @@ -72,6 +73,7 @@ LD	= mwldnlm | |||||||
| LDFLAGS	= -nostdlib $(PRELUDE) $(OBJS) $(<:.def=.o) -o $@ -commandfile | LDFLAGS	= -nostdlib $(PRELUDE) $(OBJS) $(<:.def=.o) -o $@ -commandfile | ||||||
| AR	= mwldnlm | AR	= mwldnlm | ||||||
| ARFLAGS	= -type library -w nocmdline $(OBJDIR)/*.o -o | ARFLAGS	= -type library -w nocmdline $(OBJDIR)/*.o -o | ||||||
|  | LIBEXT	= lib | ||||||
| CFLAGS	+= -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586 | CFLAGS	+= -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586 | ||||||
| CFLAGS	+= -relax_pointers | CFLAGS	+= -relax_pointers | ||||||
| #CFLAGS	+= -w on | #CFLAGS	+= -w on | ||||||
| @@ -88,6 +90,7 @@ LD	= nlmconv | |||||||
| LDFLAGS	= -T | LDFLAGS	= -T | ||||||
| AR	= ar | AR	= ar | ||||||
| ARFLAGS	= -cq | ARFLAGS	= -cq | ||||||
|  | LIBEXT	= a | ||||||
| CFLAGS	+= -fno-builtin -fpcc-struct-return -fno-strict-aliasing | CFLAGS	+= -fno-builtin -fpcc-struct-return -fno-strict-aliasing | ||||||
| CFLAGS	+= -Wall -Wno-format -Wno-uninitialized # -pedantic | CFLAGS	+= -Wall -Wno-format -Wno-uninitialized # -pedantic | ||||||
| ifeq ($(LIBARCH),LIBC) | ifeq ($(LIBARCH),LIBC) | ||||||
| @@ -155,7 +158,7 @@ clean: | |||||||
| 	-$(RM) -r $(OBJDIR) | 	-$(RM) -r $(OBJDIR) | ||||||
| 	-$(RM) -r arpa | 	-$(RM) -r arpa | ||||||
|  |  | ||||||
| %.lib: $(OBJS) | %.$(LIBEXT): $(OBJS) | ||||||
| 	@echo Creating $@ | 	@echo Creating $@ | ||||||
| 	@-$(RM) $@ | 	@-$(RM) $@ | ||||||
| 	@$(AR) $(ARFLAGS) $@ $^ | 	@$(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)** Do not edit this file - it is created by make!$(DL) >> $@ | ||||||
| 	@echo $(DL)** All your changes will be lost!!$(DL) >> $@ | 	@echo $(DL)** All your changes will be lost!!$(DL) >> $@ | ||||||
| 	@echo $(DL)*/$(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 OS "i586-pc-NetWare"$(DL) >> $@ | ||||||
| 	@echo $(DL)#define VERSION "$(LIBCARES_VERSION_STR)"$(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) >> $@ | 	@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_LONGLONG 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_NETINET_IN_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_SELECT 1$(DL) >> $@ | ||||||
|  | 	@echo $(DL)#define HAVE_SEND 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_SETJMP_H 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_SETJMP_H 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_SIGNAL 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_SOCKET 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_STDLIB_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_TIME_H 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_UNAME 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_UNAME 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_UNISTD_H 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 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 SIZEOF_CURL_OFF_T 4$(DL) >> $@ | ||||||
| 	@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ | 	@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ | 	@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@ | ||||||
|  | 	@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_STRUCT_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_IN6_ADDR 16$(DL) >> $@ | ||||||
| 	@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@ | 	@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@ | ||||||
| ifdef NW_WINSOCK | ifdef NW_WINSOCK | ||||||
| @@ -316,6 +338,11 @@ else | |||||||
| 	@echo $(DL)#define HAVE_SYS_SOCKIO_H 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_SYS_SOCKIO_H 1$(DL) >> $@ | ||||||
| 	@echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@ | 	@echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@ | ||||||
| endif | 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 | ifdef OLD_NOVELLSDK | ||||||
| 	@echo $(DL)#define socklen_t int$(DL) >> $@ | 	@echo $(DL)#define socklen_t int$(DL) >> $@ | ||||||
| endif | endif | ||||||
|   | |||||||
| @@ -67,6 +67,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj              \ | |||||||
|           $(OBJ_DIR)\ares_expand_name.obj      \ |           $(OBJ_DIR)\ares_expand_name.obj      \ | ||||||
|           $(OBJ_DIR)\ares_parse_a_reply.obj    \ |           $(OBJ_DIR)\ares_parse_a_reply.obj    \ | ||||||
|           $(OBJ_DIR)\ares_parse_aaaa_reply.obj \ |           $(OBJ_DIR)\ares_parse_aaaa_reply.obj \ | ||||||
|  |           $(OBJ_DIR)\ares_parse_ns_reply.obj   \ | ||||||
|           $(OBJ_DIR)\windows_port.obj          \ |           $(OBJ_DIR)\windows_port.obj          \ | ||||||
|           $(OBJ_DIR)\ares_expand_string.obj    \ |           $(OBJ_DIR)\ares_expand_string.obj    \ | ||||||
|           $(OBJ_DIR)\ares_parse_ptr_reply.obj  \ |           $(OBJ_DIR)\ares_parse_ptr_reply.obj  \ | ||||||
| @@ -75,6 +76,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj              \ | |||||||
|           $(OBJ_DIR)\inet_ntop.obj |           $(OBJ_DIR)\inet_ntop.obj | ||||||
|  |  | ||||||
| all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe | all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe | ||||||
|  |        @echo Welcome to c-ares library and examples | ||||||
|  |  | ||||||
| $(OBJ_DIR): | $(OBJ_DIR): | ||||||
|        mkdir $(OBJ_DIR) |        mkdir $(OBJ_DIR) | ||||||
| @@ -105,6 +107,7 @@ $(DEF_FILE): $(OBJECTS) Makefile.VC6 | |||||||
|        @echo   ares_mkquery           >> $@ |        @echo   ares_mkquery           >> $@ | ||||||
|        @echo   ares_parse_a_reply     >> $@ |        @echo   ares_parse_a_reply     >> $@ | ||||||
|        @echo   ares_parse_ptr_reply   >> $@ |        @echo   ares_parse_ptr_reply   >> $@ | ||||||
|  |        @echo   ares_parse_ns_reply    >> $@ | ||||||
|        @echo   ares_process           >> $@ |        @echo   ares_process           >> $@ | ||||||
|        @echo   ares_query             >> $@ |        @echo   ares_query             >> $@ | ||||||
|        @echo   ares_search            >> $@ |        @echo   ares_search            >> $@ | ||||||
| @@ -121,8 +124,8 @@ $(DEF_FILE): $(OBJECTS) Makefile.VC6 | |||||||
|        @echo   ares_gettimeofday      >> $@ |        @echo   ares_gettimeofday      >> $@ | ||||||
|        @echo   ares_parse_aaaa_reply  >> $@ |        @echo   ares_parse_aaaa_reply  >> $@ | ||||||
|  |  | ||||||
| ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj cares_imp.lib | ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj $(OBJ_DIR)\getopt.obj cares_imp.lib | ||||||
|        link $(LDFLAGS) -out:$@ $(OBJ_DIR)\ahost.obj cares_imp.lib $(EX_LIBS) |        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 | 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) |        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 .." | # Copyright "gcc -MM .." | ||||||
| # | # | ||||||
| $(OBJ_DIR)\ares_fds.obj: ares_fds.c setup.h ares.h ares_private.h ares_ipv6.h | $(OBJ_DIR)\ares_fds.obj: ares_fds.c setup.h setup_once.h ares.h ares_private.h \ | ||||||
| $(OBJ_DIR)\ares_process.obj: ares_process.c setup.h nameser.h ares.h ares_dns.h \ |  | ||||||
|   ares_private.h ares_ipv6.h |  | ||||||
| $(OBJ_DIR)\ares_free_hostent.obj: ares_free_hostent.c setup.h ares.h ares_private.h \ |  | ||||||
|   ares_ipv6.h |   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 |   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 |   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 \ | $(OBJ_DIR)\ares_init.obj: ares_init.c setup.h setup_once.h nameser.h ares.h    \ | ||||||
|   ares_ipv6.h |  | ||||||
| $(OBJ_DIR)\ares__get_hostent.obj: ares__get_hostent.c setup.h ares.h ares_private.h \ |  | ||||||
|   ares_ipv6.h inet_net_pton.h |  | ||||||
| $(OBJ_DIR)\ares_gethostbyaddr.obj: ares_gethostbyaddr.c setup.h nameser.h ares.h \ |  | ||||||
|   ares_private.h ares_ipv6.h inet_net_pton.h |   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 |   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 |   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_parse_ns_reply.obj: ares_parse_ns_reply.c setup.h            \ | ||||||
| $(OBJ_DIR)\ares_strerror.obj: ares_strerror.c setup.h ares.h |   setup_once.h nameser.h ares.h ares_dns.h ares_private.h ares_ipv6.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_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 |   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)\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. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
|  * software and its documentation for any purpose and without |  * software and its documentation for any purpose and without | ||||||
| @@ -14,17 +16,20 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #ifdef WIN32 | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
| #else | #else | ||||||
|  | #ifdef HAVE_SYS_TIME_H | ||||||
| #include <sys/time.h> | #include <sys/time.h> | ||||||
|  | #endif | ||||||
| #include <sys/socket.h> | #include <sys/socket.h> | ||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <arpa/inet.h> | #include <arpa/inet.h> | ||||||
| #include <arpa/nameser.h> | #include <arpa/nameser.h> | ||||||
|  | #ifdef HAVE_UNISTD_H | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
|  | #endif | ||||||
| #include <netdb.h> | #include <netdb.h> | ||||||
| #endif | #endif | ||||||
| #ifdef HAVE_GETOPT_H | #ifdef HAVE_GETOPT_H | ||||||
| @@ -45,10 +50,6 @@ | |||||||
| #undef WIN32  /* Redefined in MingW headers */ | #undef WIN32  /* Redefined in MingW headers */ | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef INADDR_NONE |  | ||||||
| #define INADDR_NONE 0xffffffff |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /* Mac OS X portability check */ | /* Mac OS X portability check */ | ||||||
| #ifndef T_SRV | #ifndef T_SRV | ||||||
| #define T_SRV 33 /* server selection */ | #define T_SRV 33 /* server selection */ | ||||||
| @@ -153,8 +154,8 @@ int main(int argc, char **argv) | |||||||
|   fd_set read_fds, write_fds; |   fd_set read_fds, write_fds; | ||||||
|   struct timeval *tvp, tv; |   struct timeval *tvp, tv; | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef USE_WINSOCK | ||||||
|   WORD wVersionRequested = MAKEWORD(1,1); |   WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); | ||||||
|   WSADATA wsaData; |   WSADATA wsaData; | ||||||
|   WSAStartup(wVersionRequested, &wsaData); |   WSAStartup(wVersionRequested, &wsaData); | ||||||
| #endif | #endif | ||||||
| @@ -162,10 +163,16 @@ int main(int argc, char **argv) | |||||||
|   options.flags = ARES_FLAG_NOCHECKRESP; |   options.flags = ARES_FLAG_NOCHECKRESP; | ||||||
|   options.servers = NULL; |   options.servers = NULL; | ||||||
|   options.nservers = 0; |   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) |       switch (c) | ||||||
|         { |         { | ||||||
|  |         case 'd': | ||||||
|  | #ifdef WATT32 | ||||||
|  |           dbug_init(); | ||||||
|  | #endif | ||||||
|  |           break; | ||||||
|  |  | ||||||
|         case 'f': |         case 'f': | ||||||
|           /* Add a flag. */ |           /* Add a flag. */ | ||||||
|           for (i = 0; i < nflags; i++) |           for (i = 0; i < nflags; i++) | ||||||
| @@ -225,7 +232,7 @@ int main(int argc, char **argv) | |||||||
|  |  | ||||||
|         case 'T': |         case 'T': | ||||||
|           /* Set the TCP port number. */ |           /* Set the TCP port number. */ | ||||||
|           if (!isdigit((unsigned char)*optarg)) |           if (!ISDIGIT(*optarg)) | ||||||
|             usage(); |             usage(); | ||||||
|           options.tcp_port = (unsigned short)strtol(optarg, NULL, 0); |           options.tcp_port = (unsigned short)strtol(optarg, NULL, 0); | ||||||
|           optmask |= ARES_OPT_TCP_PORT; |           optmask |= ARES_OPT_TCP_PORT; | ||||||
| @@ -233,7 +240,7 @@ int main(int argc, char **argv) | |||||||
|  |  | ||||||
|         case 'U': |         case 'U': | ||||||
|           /* Set the UDP port number. */ |           /* Set the UDP port number. */ | ||||||
|           if (!isdigit((unsigned char)*optarg)) |           if (!ISDIGIT(*optarg)) | ||||||
|             usage(); |             usage(); | ||||||
|           options.udp_port = (unsigned short)strtol(optarg, NULL, 0); |           options.udp_port = (unsigned short)strtol(optarg, NULL, 0); | ||||||
|           optmask |= ARES_OPT_UDP_PORT; |           optmask |= ARES_OPT_UDP_PORT; | ||||||
| @@ -277,7 +284,7 @@ int main(int argc, char **argv) | |||||||
|         break; |         break; | ||||||
|       tvp = ares_timeout(channel, NULL, &tv); |       tvp = ares_timeout(channel, NULL, &tv); | ||||||
|       count = select(nfds, &read_fds, &write_fds, NULL, tvp); |       count = select(nfds, &read_fds, &write_fds, NULL, tvp); | ||||||
|       if (count < 0 && errno != EINVAL) |       if (count < 0 && SOCKERRNO != EINVAL) | ||||||
|         { |         { | ||||||
|           perror("select"); |           perror("select"); | ||||||
|           return 1; |           return 1; | ||||||
| @@ -286,6 +293,11 @@ int main(int argc, char **argv) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|   ares_destroy(channel); |   ares_destroy(channel); | ||||||
|  |  | ||||||
|  | #ifdef USE_WINSOCK | ||||||
|  |   WSACleanup(); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -396,7 +408,7 @@ static const unsigned char *display_question(const unsigned char *aptr, | |||||||
|    */ |    */ | ||||||
|   if (aptr + QFIXEDSZ > abuf + alen) |   if (aptr + QFIXEDSZ > abuf + alen) | ||||||
|     { |     { | ||||||
|       free(name); |       ares_free_string(name); | ||||||
|       return NULL; |       return NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -412,7 +424,7 @@ static const unsigned char *display_question(const unsigned char *aptr, | |||||||
|   if (dnsclass != C_IN) |   if (dnsclass != C_IN) | ||||||
|     printf("\t%s", class_name(dnsclass)); |     printf("\t%s", class_name(dnsclass)); | ||||||
|   printf("\t%s\n", type_name(type)); |   printf("\t%s\n", type_name(type)); | ||||||
|   free(name); |   ares_free_string(name); | ||||||
|   return aptr; |   return aptr; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -436,7 +448,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|    */ |    */ | ||||||
|   if (aptr + RRFIXEDSZ > abuf + alen) |   if (aptr + RRFIXEDSZ > abuf + alen) | ||||||
|     { |     { | ||||||
|       free(name); |       ares_free_string(name); | ||||||
|       return NULL; |       return NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -449,7 +461,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|   aptr += RRFIXEDSZ; |   aptr += RRFIXEDSZ; | ||||||
|   if (aptr + dlen > abuf + alen) |   if (aptr + dlen > abuf + alen) | ||||||
|     { |     { | ||||||
|       free(name); |       ares_free_string(name); | ||||||
|       return NULL; |       return NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -458,7 +470,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|   if (dnsclass != C_IN) |   if (dnsclass != C_IN) | ||||||
|     printf("\t%s", class_name(dnsclass)); |     printf("\t%s", class_name(dnsclass)); | ||||||
|   printf("\t%s", type_name(type)); |   printf("\t%s", type_name(type)); | ||||||
|   free(name); |   ares_free_string(name); | ||||||
|  |  | ||||||
|   /* Display the RR data.  Don't touch aptr. */ |   /* Display the RR data.  Don't touch aptr. */ | ||||||
|   switch (type) |   switch (type) | ||||||
| @@ -476,7 +488,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|       if (status != ARES_SUCCESS) |       if (status != ARES_SUCCESS) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t%s.", name); |       printf("\t%s.", name); | ||||||
|       free(name); |       ares_free_string(name); | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case T_HINFO: |     case T_HINFO: | ||||||
| @@ -500,13 +512,13 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|       if (status != ARES_SUCCESS) |       if (status != ARES_SUCCESS) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t%s.", name); |       printf("\t%s.", name); | ||||||
|       free(name); |       ares_free_string(name); | ||||||
|       p += len; |       p += len; | ||||||
|       status = ares_expand_name(p, abuf, alen, &name, &len); |       status = ares_expand_name(p, abuf, alen, &name, &len); | ||||||
|       if (status != ARES_SUCCESS) |       if (status != ARES_SUCCESS) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t%s.", name); |       printf("\t%s.", name); | ||||||
|       free(name); |       ares_free_string(name); | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case T_MX: |     case T_MX: | ||||||
| @@ -520,7 +532,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|       if (status != ARES_SUCCESS) |       if (status != ARES_SUCCESS) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t%s.", name); |       printf("\t%s.", name); | ||||||
|       free(name); |       ares_free_string(name); | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case T_SOA: |     case T_SOA: | ||||||
| @@ -532,19 +544,20 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|       if (status != ARES_SUCCESS) |       if (status != ARES_SUCCESS) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t%s.\n", name); |       printf("\t%s.\n", name); | ||||||
|       free(name); |       ares_free_string(name); | ||||||
|       p += len; |       p += len; | ||||||
|       status = ares_expand_name(p, abuf, alen, &name, &len); |       status = ares_expand_name(p, abuf, alen, &name, &len); | ||||||
|       if (status != ARES_SUCCESS) |       if (status != ARES_SUCCESS) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t\t\t\t\t\t%s.\n", name); |       printf("\t\t\t\t\t\t%s.\n", name); | ||||||
|       free(name); |       ares_free_string(name); | ||||||
|       p += len; |       p += len; | ||||||
|       if (p + 20 > aptr + dlen) |       if (p + 20 > aptr + dlen) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t\t\t\t\t\t( %lu %lu %lu %lu %lu )", |       printf("\t\t\t\t\t\t( %lu %lu %lu %lu %lu )", | ||||||
|              DNS__32BIT(p), DNS__32BIT(p+4), DNS__32BIT(p+8), |              (unsigned long)DNS__32BIT(p), (unsigned long)DNS__32BIT(p+4), | ||||||
|              DNS__32BIT(p+12), DNS__32BIT(p+16)); |              (unsigned long)DNS__32BIT(p+8), (unsigned long)DNS__32BIT(p+12), | ||||||
|  |              (unsigned long)DNS__32BIT(p+16)); | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     case T_TXT: |     case T_TXT: | ||||||
| @@ -592,7 +605,7 @@ static const unsigned char *display_rr(const unsigned char *aptr, | |||||||
|       if (status != ARES_SUCCESS) |       if (status != ARES_SUCCESS) | ||||||
|         return NULL; |         return NULL; | ||||||
|       printf("\t%s.", name); |       printf("\t%s.", name); | ||||||
|       free(name); |       ares_free_string(name); | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     default: |     default: | ||||||
|   | |||||||
							
								
								
									
										69
									
								
								ares/ahost.c
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								ares/ahost.c
									
									
									
									
									
								
							| @@ -1,4 +1,6 @@ | |||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
|  * software and its documentation for any purpose and without |  * software and its documentation for any purpose and without | ||||||
| @@ -14,29 +16,36 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #ifdef WIN32 | #if !defined(WIN32) || defined(WATT32) | ||||||
| #else | #ifdef HAVE_SYS_TIME_H | ||||||
| #include <sys/time.h> | #include <sys/time.h> | ||||||
|  | #endif | ||||||
| #include <sys/socket.h> | #include <sys/socket.h> | ||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <arpa/inet.h> | #include <arpa/inet.h> | ||||||
| #include <netdb.h> | #include <netdb.h> | ||||||
|  | #ifdef HAVE_UNISTD_H | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #endif | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  |  | ||||||
|  | #ifdef HAVE_GETOPT_H | ||||||
|  | #include <getopt.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #include "ares.h" | #include "ares.h" | ||||||
| #include "ares_dns.h" | #include "ares_dns.h" | ||||||
| #include "inet_ntop.h" | #include "inet_ntop.h" | ||||||
| #include "inet_net_pton.h" | #include "inet_net_pton.h" | ||||||
|  |  | ||||||
| #ifndef INADDR_NONE | #ifndef optind | ||||||
| #define INADDR_NONE 0xffffffff | extern int   optind; | ||||||
|  | extern char *optarg; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef HAVE_STRUCT_IN6_ADDR | #ifndef HAVE_STRUCT_IN6_ADDR | ||||||
| @@ -52,19 +61,45 @@ static void usage(void); | |||||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||||
| { | { | ||||||
|   ares_channel channel; |   ares_channel channel; | ||||||
|   int status, nfds; |   int status, nfds, c, addr_family = AF_INET; | ||||||
|   fd_set read_fds, write_fds; |   fd_set read_fds, write_fds; | ||||||
|   struct timeval *tvp, tv; |   struct timeval *tvp, tv; | ||||||
|   struct in_addr addr4; |   struct in_addr addr4; | ||||||
|   struct in6_addr addr6; |   struct in6_addr addr6; | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef USE_WINSOCK | ||||||
|   WORD wVersionRequested = MAKEWORD(1,1); |   WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK); | ||||||
|   WSADATA wsaData; |   WSADATA wsaData; | ||||||
|   WSAStartup(wVersionRequested, &wsaData); |   WSAStartup(wVersionRequested, &wsaData); | ||||||
| #endif | #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(); |     usage(); | ||||||
|  |  | ||||||
|   status = ares_init(&channel); |   status = ares_init(&channel); | ||||||
| @@ -75,7 +110,7 @@ int main(int argc, char **argv) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|   /* Initiate the queries, one per command-line argument. */ |   /* Initiate the queries, one per command-line argument. */ | ||||||
|   for (argv++; *argv; argv++) |   for ( ; *argv; argv++) | ||||||
|     { |     { | ||||||
|       if (ares_inet_pton(AF_INET, *argv, &addr4) == 1) |       if (ares_inet_pton(AF_INET, *argv, &addr4) == 1) | ||||||
|         { |         { | ||||||
| @@ -89,8 +124,7 @@ int main(int argc, char **argv) | |||||||
|         } |         } | ||||||
|       else |       else | ||||||
|         { |         { | ||||||
|           /* assume user wants A-records */ |           ares_gethostbyname(channel, *argv, addr_family, callback, *argv); | ||||||
|           ares_gethostbyname(channel, *argv, AF_INET, callback, *argv); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -108,6 +142,11 @@ int main(int argc, char **argv) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|   ares_destroy(channel); |   ares_destroy(channel); | ||||||
|  |  | ||||||
|  | #ifdef USE_WINSOCK | ||||||
|  |   WSACleanup(); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -132,8 +171,8 @@ static void callback(void *arg, int status, struct hostent *host) | |||||||
|         { |         { | ||||||
|            int i; |            int i; | ||||||
|  |  | ||||||
| 	   printf (", Aliases: "); |            printf (", Aliases: "); | ||||||
| 	   for (i = 0; host->h_aliases[i]; i++) |            for (i = 0; host->h_aliases[i]; i++) | ||||||
|                printf("%s ", host->h_aliases[i]); |                printf("%s ", host->h_aliases[i]); | ||||||
|         } |         } | ||||||
| #endif | #endif | ||||||
| @@ -143,6 +182,6 @@ static void callback(void *arg, int status, struct hostent *host) | |||||||
|  |  | ||||||
| static void usage(void) | static void usage(void) | ||||||
| { | { | ||||||
|   fprintf(stderr, "usage: ahost {host|addr} ...\n"); |   fprintf(stderr, "usage: ahost [-t {a|aaaa}] {host|addr} ...\n"); | ||||||
|   exit(1); |   exit(1); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -213,6 +213,8 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, | |||||||
|                        struct hostent **host); |                        struct hostent **host); | ||||||
| int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, | int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, | ||||||
|                          int addrlen, int family, struct hostent **host); |                          int addrlen, int family, struct hostent **host); | ||||||
|  | int ares_parse_ns_reply(const unsigned char *abuf, int alen, | ||||||
|  |                        struct hostent **host); | ||||||
| void ares_free_string(void *str); | void ares_free_string(void *str); | ||||||
| void ares_free_hostent(struct hostent *host); | void ares_free_hostent(struct hostent *host); | ||||||
| const char *ares_strerror(int code); | const char *ares_strerror(int code); | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if !defined(WIN32) || defined(WATT32) | #if !defined(WIN32) || defined(WATT32) | ||||||
| #include <sys/socket.h> | #include <sys/socket.h> | ||||||
| @@ -52,7 +53,7 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host) | |||||||
|  |  | ||||||
|       /* Get the address part. */ |       /* Get the address part. */ | ||||||
|       p = line; |       p = line; | ||||||
|       while (*p && !isspace((unsigned char)*p)) |       while (*p && !ISSPACE(*p)) | ||||||
|         p++; |         p++; | ||||||
|       if (!*p) |       if (!*p) | ||||||
|         continue; |         continue; | ||||||
| @@ -74,12 +75,12 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host) | |||||||
|  |  | ||||||
|       /* Get the canonical hostname. */ |       /* Get the canonical hostname. */ | ||||||
|       p++; |       p++; | ||||||
|       while (isspace((unsigned char)*p)) |       while (ISSPACE(*p)) | ||||||
|         p++; |         p++; | ||||||
|       if (!*p) |       if (!*p) | ||||||
|         continue; |         continue; | ||||||
|       q = p; |       q = p; | ||||||
|       while (*q && !isspace((unsigned char)*q)) |       while (*q && !ISSPACE(*q)) | ||||||
|         q++; |         q++; | ||||||
|       end_at_hostname = (*q == 0); |       end_at_hostname = (*q == 0); | ||||||
|       *q = 0; |       *q = 0; | ||||||
| @@ -90,13 +91,13 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host) | |||||||
|         { |         { | ||||||
|           /* Count the aliases. */ |           /* Count the aliases. */ | ||||||
|           p = q + 1; |           p = q + 1; | ||||||
|           while (isspace((unsigned char)*p)) |           while (ISSPACE(*p)) | ||||||
|             p++; |             p++; | ||||||
|           while (*p) |           while (*p) | ||||||
|             { |             { | ||||||
|               while (*p && !isspace((unsigned char)*p)) |               while (*p && !ISSPACE(*p)) | ||||||
|                 p++; |                 p++; | ||||||
|               while (isspace((unsigned char)*p)) |               while (ISSPACE(*p)) | ||||||
|                 p++; |                 p++; | ||||||
|               naliases++; |               naliases++; | ||||||
|             } |             } | ||||||
| @@ -126,12 +127,12 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host) | |||||||
|       if (!end_at_hostname) |       if (!end_at_hostname) | ||||||
|         { |         { | ||||||
|           p = canonical + strlen(canonical) + 1; |           p = canonical + strlen(canonical) + 1; | ||||||
|           while (isspace((unsigned char)*p)) |           while (ISSPACE(*p)) | ||||||
|             p++; |             p++; | ||||||
|           while (*p) |           while (*p) | ||||||
|             { |             { | ||||||
|               q = p; |               q = p; | ||||||
|               while (*q && !isspace((unsigned char)*q)) |               while (*q && !ISSPACE(*q)) | ||||||
|                 q++; |                 q++; | ||||||
|               hostent->h_aliases[naliases] = malloc(q - p + 1); |               hostent->h_aliases[naliases] = malloc(q - p + 1); | ||||||
|               if (hostent->h_aliases[naliases] == NULL) |               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); |               memcpy(hostent->h_aliases[naliases], p, q - p); | ||||||
|               hostent->h_aliases[naliases][q - p] = 0; |               hostent->h_aliases[naliases][q - p] = 0; | ||||||
|               p = q; |               p = q; | ||||||
|               while (isspace((unsigned char)*p)) |               while (ISSPACE(*p)) | ||||||
|                 p++; |                 p++; | ||||||
|               naliases++; |               naliases++; | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright (C) 2004 by Daniel Stenberg et al | /* Copyright (C) 2004 by Daniel Stenberg et al | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this software and its |  * Permission to use, copy, modify, and distribute this software and its | ||||||
| @@ -37,7 +39,10 @@ void ares_cancel(ares_channel channel) | |||||||
|   channel->queries = NULL; |   channel->queries = NULL; | ||||||
|   if (!(channel->flags & ARES_FLAG_STAYOPEN)) |   if (!(channel->flags & ARES_FLAG_STAYOPEN)) | ||||||
|   { |   { | ||||||
|     for (i = 0; i < channel->nservers; i++) |     if (channel->servers) | ||||||
|       ares__close_sockets(channel, &channel->servers[i]); |     { | ||||||
|  |       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. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -23,23 +25,37 @@ void ares_destroy(ares_channel channel) | |||||||
|   int i; |   int i; | ||||||
|   struct query *query; |   struct query *query; | ||||||
|  |  | ||||||
|   for (i = 0; i < channel->nservers; i++) |   if (!channel) | ||||||
|     ares__close_sockets(channel, &channel->servers[i]); |     return; | ||||||
|   free(channel->servers); |  | ||||||
|   for (i = 0; i < channel->ndomains; i++) |   if (channel->servers) { | ||||||
|     free(channel->domains[i]); |     for (i = 0; i < channel->nservers; i++) | ||||||
|   free(channel->domains); |       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) |   if(channel->sortlist) | ||||||
|     free(channel->sortlist); |     free(channel->sortlist); | ||||||
|   free(channel->lookups); |  | ||||||
|   while (channel->queries) |   if (channel->lookups) | ||||||
|     { |     free(channel->lookups); | ||||||
|       query = channel->queries; |  | ||||||
|       channel->queries = query->next; |   while (channel->queries) { | ||||||
|       query->callback(query->arg, ARES_EDESTRUCTION, NULL, 0); |     query = channel->queries; | ||||||
|  |     channel->queries = query->next; | ||||||
|  |     query->callback(query->arg, ARES_EDESTRUCTION, NULL, 0); | ||||||
|  |     if (query->tcpbuf) | ||||||
|       free(query->tcpbuf); |       free(query->tcpbuf); | ||||||
|  |     if (query->skip_server) | ||||||
|       free(query->skip_server); |       free(query->skip_server); | ||||||
|       free(query); |     free(query); | ||||||
|     } |   } | ||||||
|  |  | ||||||
|   free(channel); |   free(channel); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -18,28 +18,16 @@ | |||||||
| #ifndef ARES__DNS_H | #ifndef ARES__DNS_H | ||||||
| #define ARES__DNS_H | #define ARES__DNS_H | ||||||
|  |  | ||||||
| #ifdef ARES_BIG_ENDIAN |  | ||||||
| /* big-endian aware versions */ |  | ||||||
| #define DNS__16BIT(p)                   (((p)[1] << 8) | (p)[0]) |  | ||||||
| #define DNS__32BIT(p)                   (((p)[3] << 24) | ((p)[2] << 16) | \ |  | ||||||
|                                          ((p)[1] << 8) | (p)[0]) |  | ||||||
| #define DNS__SET16BIT(p, v)             (((p)[1] = ((v) >> 8) & 0xff), \ |  | ||||||
|                                          ((p)[0] = (v) & 0xff)) |  | ||||||
| #define DNS__SET32BIT(p, v)             (((p)[3] = ((v) >> 24) & 0xff), \ |  | ||||||
|                                          ((p)[2] = ((v) >> 16) & 0xff), \ |  | ||||||
|                                          ((p)[1] = ((v) >> 8) & 0xff), \ |  | ||||||
|                                          ((p)[0] = (v) & 0xff)) |  | ||||||
| #else |  | ||||||
| #define DNS__16BIT(p)                   (((p)[0] << 8) | (p)[1]) | #define DNS__16BIT(p)                   (((p)[0] << 8) | (p)[1]) | ||||||
| #define DNS__32BIT(p)                   (((p)[0] << 24) | ((p)[1] << 16) | \ | #define DNS__32BIT(p)                   (((p)[0] << 24) | ((p)[1] << 16) | \ | ||||||
|                                          ((p)[2] << 8) | (p)[3]) |                                          ((p)[2] << 8) | (p)[3]) | ||||||
| #define DNS__SET16BIT(p, v)             (((p)[0] = ((v) >> 8) & 0xff), \ |  | ||||||
|                                          ((p)[1] = (v) & 0xff)) | #define DNS__SET16BIT(p, v)  (((p)[0] = (unsigned char)(((v) >> 8) & 0xff)), \ | ||||||
| #define DNS__SET32BIT(p, v)             (((p)[0] = ((v) >> 24) & 0xff), \ |                               ((p)[1] = (unsigned char)((v) & 0xff))) | ||||||
|                                          ((p)[1] = ((v) >> 16) & 0xff), \ | #define DNS__SET32BIT(p, v)  (((p)[0] = (unsigned char)(((v) >> 24) & 0xff)), \ | ||||||
|                                          ((p)[2] = ((v) >> 8) & 0xff), \ |                               ((p)[1] = (unsigned char)(((v) >> 16) & 0xff)), \ | ||||||
|                                          ((p)[3] = (v) & 0xff)) |                               ((p)[2] = (unsigned char)(((v) >> 8) & 0xff)), \ | ||||||
| #endif |                               ((p)[3] = (unsigned char)((v) & 0xff))) | ||||||
|  |  | ||||||
| #if 0 | #if 0 | ||||||
| /* we cannot use this approach on systems where we can't access 16/32 bit | /* we cannot use this approach on systems where we can't access 16/32 bit | ||||||
| @@ -66,19 +54,19 @@ | |||||||
| #define DNS_HEADER_ARCOUNT(h)           DNS__16BIT((h) + 10) | #define DNS_HEADER_ARCOUNT(h)           DNS__16BIT((h) + 10) | ||||||
|  |  | ||||||
| /* Macros for constructing a DNS header */ | /* Macros for constructing a DNS header */ | ||||||
| #define DNS_HEADER_SET_QID(h, v)        DNS__SET16BIT(h, v) | #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_QR(h, v)       ((h)[2] |= (unsigned char)(((v) & 0x1) << 7)) | ||||||
| #define DNS_HEADER_SET_OPCODE(h, v)     ((h)[2] |= (((v) & 0xf) << 3)) | #define DNS_HEADER_SET_OPCODE(h, v)   ((h)[2] |= (unsigned char)(((v) & 0xf) << 3)) | ||||||
| #define DNS_HEADER_SET_AA(h, v)         ((h)[2] |= (((v) & 0x1) << 2)) | #define DNS_HEADER_SET_AA(h, v)       ((h)[2] |= (unsigned char)(((v) & 0x1) << 2)) | ||||||
| #define DNS_HEADER_SET_TC(h, v)         ((h)[2] |= (((v) & 0x1) << 1)) | #define DNS_HEADER_SET_TC(h, v)       ((h)[2] |= (unsigned char)(((v) & 0x1) << 1)) | ||||||
| #define DNS_HEADER_SET_RD(h, v)         ((h)[2] |= (((v) & 0x1))) | #define DNS_HEADER_SET_RD(h, v)       ((h)[2] |= (unsigned char)((v) & 0x1)) | ||||||
| #define DNS_HEADER_SET_RA(h, v)         ((h)[3] |= (((v) & 0x1) << 7)) | #define DNS_HEADER_SET_RA(h, v)       ((h)[3] |= (unsigned char)(((v) & 0x1) << 7)) | ||||||
| #define DNS_HEADER_SET_Z(h, v)          ((h)[3] |= (((v) & 0x7) << 4)) | #define DNS_HEADER_SET_Z(h, v)        ((h)[3] |= (unsigned char)(((v) & 0x7) << 4)) | ||||||
| #define DNS_HEADER_SET_RCODE(h, v)      ((h)[3] |= (((v) & 0xf))) | #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_QDCOUNT(h, v)  DNS__SET16BIT((h) + 4, v) | ||||||
| #define DNS_HEADER_SET_ANCOUNT(h, v)    DNS__SET16BIT((h) + 6, 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) | #define DNS_HEADER_SET_NSCOUNT(h, v)  DNS__SET16BIT((h) + 8, v) | ||||||
| #define DNS_HEADER_SET_ARCOUNT(h, v)    DNS__SET16BIT((h) + 10, v) | #define DNS_HEADER_SET_ARCOUNT(h, v)  DNS__SET16BIT((h) + 10, v) | ||||||
|  |  | ||||||
| /* Macros for parsing the fixed part of a DNS question */ | /* Macros for parsing the fixed part of a DNS question */ | ||||||
| #define DNS_QUESTION_TYPE(q)            DNS__16BIT(q) | #define DNS_QUESTION_TYPE(q)            DNS__16BIT(q) | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
| @@ -53,13 +54,13 @@ int ares_expand_string(const unsigned char *encoded, | |||||||
|   *s = malloc(len+1); |   *s = malloc(len+1); | ||||||
|   if (*s == NULL) |   if (*s == NULL) | ||||||
|     return ARES_ENOMEM; |     return ARES_ENOMEM; | ||||||
|   q = *s;  |   q = *s; | ||||||
|   strncpy((char *)q, (char *)encoded, len); |   strncpy((char *)q, (char *)encoded, len); | ||||||
|   q[len] = '\0'; |   q[len] = '\0'; | ||||||
|  |  | ||||||
|   *s = q; |   *s = q; | ||||||
|  |  | ||||||
|   *enclen = len+1;  |   *enclen = len+1; | ||||||
|  |  | ||||||
|   return ARES_SUCCESS; |   return ARES_SUCCESS; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #ifdef HAVE_SYS_TIME_H | #ifdef HAVE_SYS_TIME_H | ||||||
| #include <sys/time.h> | #include <sys/time.h> | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -27,7 +29,7 @@ void ares_free_hostent(struct hostent *host) | |||||||
| { | { | ||||||
|   char **p; |   char **p; | ||||||
|  |  | ||||||
|   free(host->h_name); |   free((char *)(host->h_name)); | ||||||
|   for (p = host->h_aliases; *p; p++) |   for (p = host->h_aliases; *p; p++) | ||||||
|     free(*p); |     free(*p); | ||||||
|   free(host->h_aliases); |   free(host->h_aliases); | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 2000 by the Massachusetts Institute of Technology. | /* Copyright 2000 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -16,6 +18,7 @@ | |||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include "ares.h" | #include "ares.h" | ||||||
|  | #include "ares_private.h" | ||||||
|  |  | ||||||
| void ares_free_string(void *str) | void ares_free_string(void *str) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -15,7 +15,6 @@ | |||||||
|  * without express or implied warranty. |  * without express or implied warranty. | ||||||
|  */ |  */ | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
| @@ -186,6 +185,7 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host) | |||||||
| { | { | ||||||
|   FILE *fp; |   FILE *fp; | ||||||
|   int status; |   int status; | ||||||
|  |   int error; | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|   char PATH_HOSTS[MAX_PATH]; |   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"); |   fp = fopen(PATH_HOSTS, "r"); | ||||||
|   if (!fp) |   if (!fp) | ||||||
|     return ARES_ENOTFOUND; |     { | ||||||
|  |       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) |   while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS) | ||||||
|     { |     { | ||||||
|       if (family != (*host)->h_addrtype) |       if (family != (*host)->h_addrtype) | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #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) |   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; |       hquery->family = AF_INET; | ||||||
|       ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, |       ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, | ||||||
|                   hquery); |                   hquery); | ||||||
| @@ -237,7 +238,7 @@ static int fake_hostent(const char *name, int family, ares_host_callback callbac | |||||||
|   hostent.h_addr_list = addrs; |   hostent.h_addr_list = addrs; | ||||||
|   callback(arg, ARES_SUCCESS, &hostent); |   callback(arg, ARES_SUCCESS, &hostent); | ||||||
|  |  | ||||||
|   free(hostent.h_name); |   free((char *)(hostent.h_name)); | ||||||
|   return 1; |   return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -246,6 +247,7 @@ static int file_lookup(const char *name, int family, struct hostent **host) | |||||||
|   FILE *fp; |   FILE *fp; | ||||||
|   char **alias; |   char **alias; | ||||||
|   int status; |   int status; | ||||||
|  |   int error; | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|   char PATH_HOSTS[MAX_PATH]; |   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"); |   fp = fopen(PATH_HOSTS, "r"); | ||||||
|   if (!fp) |   if (!fp) | ||||||
|     return ARES_ENOTFOUND; |     { | ||||||
|  |       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) |   while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS) | ||||||
|     { |     { | ||||||
|       if (strcasecmp((*host)->h_name, name) == 0) |       if (strcasecmp((*host)->h_name, name) == 0) | ||||||
|   | |||||||
| @@ -15,8 +15,6 @@ | |||||||
|  * without express or implied warranty. |  * without express or implied warranty. | ||||||
|  */ |  */ | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
| #include <ctype.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
| @@ -110,7 +108,8 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t | |||||||
|         port = addr->sin_port; |         port = addr->sin_port; | ||||||
|       else |       else | ||||||
|         port = addr6->sin6_port; |         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); |       callback(arg, ARES_SUCCESS, NULL, service); | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
| @@ -151,7 +150,8 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t | |||||||
|           } |           } | ||||||
|         /* They also want a service */ |         /* They also want a service */ | ||||||
|         if (flags & ARES_NI_LOOKUPSERVICE) |         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); |         callback(arg, ARES_SUCCESS, ipbuf, service); | ||||||
|         return; |         return; | ||||||
|       } |       } | ||||||
| @@ -220,7 +220,8 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host) | |||||||
|                  *end = 0; |                  *end = 0; | ||||||
|              } |              } | ||||||
|         } |         } | ||||||
|       niquery->callback(niquery->arg, ARES_SUCCESS, host->h_name, service); |       niquery->callback(niquery->arg, ARES_SUCCESS, (char *)(host->h_name), | ||||||
|  |                         service); | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|   /* We couldn't find the host, but it's OK, we can use the IP */ |   /* We couldn't find the host, but it's OK, we can use the IP */ | ||||||
| @@ -264,11 +265,11 @@ static char *lookup_service(unsigned short port, int flags, | |||||||
|   char tmpbuf[4096]; |   char tmpbuf[4096]; | ||||||
|  |  | ||||||
|   if (port) |   if (port) | ||||||
|     {  |     { | ||||||
|       if (flags & ARES_NI_NUMERICSERV) |       if (flags & ARES_NI_NUMERICSERV) | ||||||
|         sep = NULL; |         sep = NULL; | ||||||
|       else |       else | ||||||
|         {  |         { | ||||||
|           if (flags & ARES_NI_UDP) |           if (flags & ARES_NI_UDP) | ||||||
|             proto = "udp"; |             proto = "udp"; | ||||||
|           else if (flags & ARES_NI_SCTP) |           else if (flags & ARES_NI_SCTP) | ||||||
| @@ -288,21 +289,21 @@ static char *lookup_service(unsigned short port, int flags, | |||||||
| #elif GETSERVBYPORT_R_ARGS == 4 | #elif GETSERVBYPORT_R_ARGS == 4 | ||||||
|           if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0) |           if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0) | ||||||
|             sep = NULL; |             sep = NULL; | ||||||
| #else      | #else | ||||||
|           /* Lets just hope the OS uses TLS! */ |           /* Lets just hope the OS uses TLS! */ | ||||||
|           sep = getservbyport(port, proto); |           sep = getservbyport(port, proto); | ||||||
| #endif     | #endif | ||||||
| #else      | #else | ||||||
|           /* Lets just hope the OS uses TLS! */ |           /* Lets just hope the OS uses TLS! */ | ||||||
|           sep = getservbyport(port, proto); |           sep = getservbyport(port, proto); | ||||||
| #endif     | #endif | ||||||
|         }  |         } | ||||||
|       if (sep && sep->s_name) |       if (sep && sep->s_name) | ||||||
|         /* get service name */ |         /* get service name */ | ||||||
|         strcpy(tmpbuf, sep->s_name); |         strcpy(tmpbuf, sep->s_name); | ||||||
|       else |       else | ||||||
|         /* get port as a string */ |         /* get port as a string */ | ||||||
|         sprintf(tmpbuf, "%u", ntohs(port)); |         sprintf(tmpbuf, "%u", (unsigned int)ntohs(port)); | ||||||
|       if (strlen(tmpbuf) < buflen) |       if (strlen(tmpbuf) < buflen) | ||||||
|         /* return it if buffer big enough */ |         /* return it if buffer big enough */ | ||||||
|         strcpy(buf, tmpbuf); |         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, | static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, | ||||||
|                            char *buf, size_t buflen) |                            char *buf, size_t buflen) | ||||||
| { | { | ||||||
|  | #ifdef HAVE_IF_INDEXTONAME | ||||||
|  |   int is_ll, is_mcll; | ||||||
|  | #endif | ||||||
|   char fmt_u[] = "%u"; |   char fmt_u[] = "%u"; | ||||||
|   char fmt_lu[] = "%lu"; |   char fmt_lu[] = "%lu"; | ||||||
|   char tmpbuf[IF_NAMESIZE + 2]; |   char tmpbuf[IF_NAMESIZE + 2]; | ||||||
| @@ -328,9 +332,10 @@ static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, | |||||||
|   tmpbuf[0] = '%'; |   tmpbuf[0] = '%'; | ||||||
|  |  | ||||||
| #ifdef HAVE_IF_INDEXTONAME | #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) || |   if ((flags & ARES_NI_NUMERICSCOPE) || | ||||||
|       (!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr) |       (!is_ll && !is_mcll)) | ||||||
|        && !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr))) |  | ||||||
|     { |     { | ||||||
|        sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id); |        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) | static char *ares_striendstr(const char *s1, const char *s2) | ||||||
| { | { | ||||||
|   const char *c1, *c2, *c1_begin; |   const char *c1, *c2, *c1_begin; | ||||||
|  |   int lo1, lo2; | ||||||
|   size_t s1_len = strlen(s1), s2_len = strlen(s2); |   size_t s1_len = strlen(s1), s2_len = strlen(s2); | ||||||
|  |  | ||||||
|   /* If the substr is longer than the full str, it can't match */ |   /* 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; |   c2 = s2; | ||||||
|   while (c2 < s2+s2_len) |   while (c2 < s2+s2_len) | ||||||
|     { |     { | ||||||
|       if (tolower(*c1) != tolower(*c2)) |       lo1 = tolower(*c1); | ||||||
|  |       lo2 = tolower(*c2); | ||||||
|  |       if (lo1 != lo2) | ||||||
|         return NULL; |         return NULL; | ||||||
|       else |       else | ||||||
|         { |         { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| /* $Id$ */ | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 2005 by Daniel Stenberg. | /* Copyright (C) 2005 - 2007, Daniel Stenberg | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this software and its |  * Permission to use, copy, modify, and distribute this software and its | ||||||
|  * documentation for any purpose and without fee is hereby granted, provided |  * documentation for any purpose and without fee is hereby granted, provided | ||||||
| @@ -14,7 +14,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #ifdef HAVE_SYS_TIME_H | #ifdef HAVE_SYS_TIME_H | ||||||
| #include <sys/time.h> | #include <sys/time.h> | ||||||
| @@ -28,7 +27,6 @@ int ares_getsock(ares_channel channel, | |||||||
|                  int numsocks) /* size of the 'socks' array */ |                  int numsocks) /* size of the 'socks' array */ | ||||||
| { | { | ||||||
|   struct server_state *server; |   struct server_state *server; | ||||||
|   ares_socket_t nfds; |  | ||||||
|   int i; |   int i; | ||||||
|   int sockindex=0; |   int sockindex=0; | ||||||
|   int bitmap = 0; |   int bitmap = 0; | ||||||
| @@ -40,8 +38,9 @@ int ares_getsock(ares_channel channel, | |||||||
|   if (!channel->queries) |   if (!channel->queries) | ||||||
|     return 0; |     return 0; | ||||||
|  |  | ||||||
|   nfds = 0; |   for (i = 0; | ||||||
|   for (i = 0; i < channel->nservers; i++) |        (i < channel->nservers) && (sockindex < ARES_GETSOCK_MAXNUM); | ||||||
|  |        i++) | ||||||
|     { |     { | ||||||
|       server = &channel->servers[i]; |       server = &channel->servers[i]; | ||||||
|       if (server->udp_socket != ARES_SOCKET_BAD) |       if (server->udp_socket != ARES_SOCKET_BAD) | ||||||
| @@ -58,14 +57,13 @@ int ares_getsock(ares_channel channel, | |||||||
|            break; |            break; | ||||||
|          socks[sockindex] = server->tcp_socket; |          socks[sockindex] = server->tcp_socket; | ||||||
|          bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); |          bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); | ||||||
|          sockindex++; |  | ||||||
|  |  | ||||||
|          if (server->qhead) { |          if (server->qhead) | ||||||
|            /* then the tcp socket is also writable! */ |            /* 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; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										263
									
								
								ares/ares_init.c
									
									
									
									
									
								
							
							
						
						
									
										263
									
								
								ares/ares_init.c
									
									
									
									
									
								
							| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
| @@ -41,6 +42,9 @@ | |||||||
| #ifdef HAVE_UNISTD_H | #ifdef HAVE_UNISTD_H | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #endif | #endif | ||||||
|  | #ifdef HAVE_PROCESS_H | ||||||
|  | #include <process.h>  /* Some have getpid() here */ | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| @@ -89,13 +93,26 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options, | |||||||
|                       int optmask) |                       int optmask) | ||||||
| { | { | ||||||
|   ares_channel channel; |   ares_channel channel; | ||||||
|   int i, status; |   int i; | ||||||
|  |   int status = ARES_SUCCESS; | ||||||
|   struct server_state *server; |   struct server_state *server; | ||||||
|   struct timeval tv; |   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)); |   channel = malloc(sizeof(struct ares_channeldata)); | ||||||
|   if (!channel) |   if (!channel) { | ||||||
|  |     *channelptr = NULL; | ||||||
|     return ARES_ENOMEM; |     return ARES_ENOMEM; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* Set everything to distinguished values so we know they haven't |   /* Set everything to distinguished values so we know they haven't | ||||||
|    * been set yet. |    * been set yet. | ||||||
| @@ -113,22 +130,42 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options, | |||||||
|   channel->queries = NULL; |   channel->queries = NULL; | ||||||
|   channel->domains = NULL; |   channel->domains = NULL; | ||||||
|   channel->sortlist = NULL; |   channel->sortlist = NULL; | ||||||
|  |   channel->servers = NULL; | ||||||
|   channel->sock_state_cb = NULL; |   channel->sock_state_cb = NULL; | ||||||
|  |   channel->sock_state_cb_data = NULL; | ||||||
|  |  | ||||||
|   /* Initialize configuration by each of the four sources, from highest |   /* Initialize configuration by each of the four sources, from highest | ||||||
|    * precedence to lowest. |    * precedence to lowest. | ||||||
|    */ |    */ | ||||||
|  |  | ||||||
|  |   if (status == ARES_SUCCESS) { | ||||||
|   status = init_by_options(channel, options, optmask); |   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); |     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); |     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); |     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) |   if (status != ARES_SUCCESS) | ||||||
|     { |     { | ||||||
|       /* Something failed; clean up memory we may have allocated. */ |       /* Something failed; clean up memory we may have allocated. */ | ||||||
|       if (channel->nservers != -1) |       if (channel->servers) | ||||||
|         free(channel->servers); |         free(channel->servers); | ||||||
|       if (channel->domains) |       if (channel->domains) | ||||||
|         { |         { | ||||||
| @@ -167,7 +204,7 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options, | |||||||
|    */ |    */ | ||||||
|   gettimeofday(&tv, NULL); |   gettimeofday(&tv, NULL); | ||||||
|   channel->next_id = (unsigned short) |   channel->next_id = (unsigned short) | ||||||
|     (tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff; |     ((tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff); | ||||||
|  |  | ||||||
|   channel->queries = NULL; |   channel->queries = NULL; | ||||||
|  |  | ||||||
| @@ -202,12 +239,16 @@ static int init_by_options(ares_channel channel, struct ares_options *options, | |||||||
|   /* Copy the servers, if given. */ |   /* Copy the servers, if given. */ | ||||||
|   if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1) |   if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1) | ||||||
|     { |     { | ||||||
|       channel->servers = |       /* Avoid zero size allocations at any cost */ | ||||||
|         malloc(options->nservers * sizeof(struct server_state)); |       if (options->nservers > 0) | ||||||
|       if (!channel->servers && options->nservers != 0) |         { | ||||||
|         return ARES_ENOMEM; |           channel->servers = | ||||||
|       for (i = 0; i < options->nservers; i++) |             malloc(options->nservers * sizeof(struct server_state)); | ||||||
|         channel->servers[i].addr = options->servers[i]; |           if (!channel->servers) | ||||||
|  |             return ARES_ENOMEM; | ||||||
|  |           for (i = 0; i < options->nservers; i++) | ||||||
|  |             channel->servers[i].addr = options->servers[i]; | ||||||
|  |         } | ||||||
|       channel->nservers = options->nservers; |       channel->nservers = options->nservers; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -216,16 +257,20 @@ static int init_by_options(ares_channel channel, struct ares_options *options, | |||||||
|    */ |    */ | ||||||
|   if ((optmask & ARES_OPT_DOMAINS) && channel->ndomains == -1) |   if ((optmask & ARES_OPT_DOMAINS) && channel->ndomains == -1) | ||||||
|     { |     { | ||||||
|       channel->domains = malloc(options->ndomains * sizeof(char *)); |       /* Avoid zero size allocations at any cost */ | ||||||
|       if (!channel->domains && options->ndomains != 0) |       if (options->ndomains > 0) | ||||||
|         return ARES_ENOMEM; |       { | ||||||
|       for (i = 0; i < options->ndomains; i++) |         channel->domains = malloc(options->ndomains * sizeof(char *)); | ||||||
|         { |         if (!channel->domains) | ||||||
|           channel->ndomains = i; |           return ARES_ENOMEM; | ||||||
|           channel->domains[i] = strdup(options->domains[i]); |         for (i = 0; i < options->ndomains; i++) | ||||||
|           if (!channel->domains[i]) |           { | ||||||
|             return ARES_ENOMEM; |             channel->ndomains = i; | ||||||
|         } |             channel->domains[i] = strdup(options->domains[i]); | ||||||
|  |             if (!channel->domains[i]) | ||||||
|  |               return ARES_ENOMEM; | ||||||
|  |           } | ||||||
|  |       } | ||||||
|       channel->ndomains = options->ndomains; |       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" |     printf ("DNS Servers:\n" | ||||||
|             "    %s (primary)\n", fi->DnsServerList.IpAddress.String); |             "    %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) |       left > ip_size) | ||||||
|   { |   { | ||||||
|     ret += sprintf (ret, "%s,", fi->DnsServerList.IpAddress.String); |     ret += sprintf (ret, "%s,", fi->DnsServerList.IpAddress.String); | ||||||
| @@ -527,7 +573,7 @@ DhcpNameServer | |||||||
|     do { |     do { | ||||||
|       space = strchr(pos, ' '); |       space = strchr(pos, ' '); | ||||||
|       if (space) |       if (space) | ||||||
|         *space = 0; |         *space = '\0'; | ||||||
|       status = config_nameserver(&servers, &nservers, pos); |       status = config_nameserver(&servers, &nservers, pos); | ||||||
|       if (status != ARES_SUCCESS) |       if (status != ARES_SUCCESS) | ||||||
|         break; |         break; | ||||||
| @@ -563,32 +609,47 @@ DhcpNameServer | |||||||
|     char *p; |     char *p; | ||||||
|     FILE *fp; |     FILE *fp; | ||||||
|     int linesize; |     int linesize; | ||||||
|  |     int error; | ||||||
|  |  | ||||||
|     fp = fopen(PATH_RESOLV_CONF, "r"); |     fp = fopen(PATH_RESOLV_CONF, "r"); | ||||||
|     if (!fp) |     if (fp) { | ||||||
|       return (errno == ENOENT) ? ARES_SUCCESS : ARES_EFILE; |       while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) | ||||||
|     while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) |       { | ||||||
|     { |         if ((p = try_config(line, "domain")) && channel->ndomains == -1) | ||||||
|       if ((p = try_config(line, "domain"))) |           status = config_domain(channel, p); | ||||||
|         status = config_domain(channel, p); |         else if ((p = try_config(line, "lookup")) && !channel->lookups) | ||||||
|       else if ((p = try_config(line, "lookup")) && !channel->lookups) |           status = config_lookup(channel, p, "bind", "file"); | ||||||
|         status = config_lookup(channel, p, "bind", "file"); |         else if ((p = try_config(line, "search")) && channel->ndomains == -1) | ||||||
|       else if ((p = try_config(line, "search"))) |           status = set_search(channel, p); | ||||||
|         status = set_search(channel, p); |         else if ((p = try_config(line, "nameserver")) && channel->nservers == -1) | ||||||
|       else if ((p = try_config(line, "nameserver")) && channel->nservers == -1) |           status = config_nameserver(&servers, &nservers, p); | ||||||
|         status = config_nameserver(&servers, &nservers, p); |         else if ((p = try_config(line, "sortlist")) && channel->nsort == -1) | ||||||
|       else if ((p = try_config(line, "sortlist")) && channel->nsort == -1) |           status = config_sortlist(&sortlist, &nsort, p); | ||||||
|         status = config_sortlist(&sortlist, &nsort, p); |         else if ((p = try_config(line, "options"))) | ||||||
|       else if ((p = try_config(line, "options"))) |           status = set_options(channel, p); | ||||||
|         status = set_options(channel, p); |         else | ||||||
|       else |           status = ARES_SUCCESS; | ||||||
|         status = ARES_SUCCESS; |         if (status != ARES_SUCCESS) | ||||||
|       if (status != ARES_SUCCESS) |           break; | ||||||
|         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; | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|     fclose(fp); |  | ||||||
|  |  | ||||||
|     if (!channel->lookups) { |     if ((status == ARES_EOF) && (!channel->lookups)) { | ||||||
|       /* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */ |       /* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */ | ||||||
|       fp = fopen("/etc/nsswitch.conf", "r"); |       fp = fopen("/etc/nsswitch.conf", "r"); | ||||||
|       if (fp) { |       if (fp) { | ||||||
| @@ -599,9 +660,23 @@ DhcpNameServer | |||||||
|         } |         } | ||||||
|         fclose(fp); |         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 */ |       /* Linux / GNU libc 2.x and possibly others have host.conf */ | ||||||
|       fp = fopen("/etc/host.conf", "r"); |       fp = fopen("/etc/host.conf", "r"); | ||||||
|       if (fp) { |       if (fp) { | ||||||
| @@ -612,9 +687,23 @@ DhcpNameServer | |||||||
|         } |         } | ||||||
|         fclose(fp); |         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 */ |       /* Tru64 uses /etc/svc.conf */ | ||||||
|       fp = fopen("/etc/svc.conf", "r"); |       fp = fopen("/etc/svc.conf", "r"); | ||||||
|       if (fp) { |       if (fp) { | ||||||
| @@ -625,6 +714,20 @@ DhcpNameServer | |||||||
|         } |         } | ||||||
|         fclose(fp); |         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) |     if(line) | ||||||
| @@ -698,7 +801,6 @@ static int init_by_defaults(ares_channel channel) | |||||||
|       if (gethostname(hostname, sizeof(hostname)) == -1 |       if (gethostname(hostname, sizeof(hostname)) == -1 | ||||||
|           || !strchr(hostname, '.')) |           || !strchr(hostname, '.')) | ||||||
|         { |         { | ||||||
|           channel->domains = malloc(0); |  | ||||||
|           channel->ndomains = 0; |           channel->ndomains = 0; | ||||||
|         } |         } | ||||||
|       else |       else | ||||||
| @@ -737,9 +839,9 @@ static int config_domain(ares_channel channel, char *str) | |||||||
|  |  | ||||||
|   /* Set a single search domain. */ |   /* Set a single search domain. */ | ||||||
|   q = str; |   q = str; | ||||||
|   while (*q && !isspace((unsigned char)*q)) |   while (*q && !ISSPACE(*q)) | ||||||
|     q++; |     q++; | ||||||
|   *q = 0; |   *q = '\0'; | ||||||
|   return set_search(channel, str); |   return set_search(channel, str); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -761,12 +863,12 @@ static int config_lookup(ares_channel channel, const char *str, | |||||||
|         if (*p == *bindch) *l++ = 'b'; |         if (*p == *bindch) *l++ = 'b'; | ||||||
|         else *l++ = 'f'; |         else *l++ = 'f'; | ||||||
|       } |       } | ||||||
|       while (*p && !isspace((unsigned char)*p) && (*p != ',')) |       while (*p && !ISSPACE(*p) && (*p != ',')) | ||||||
|         p++; |         p++; | ||||||
|       while (*p && (isspace((unsigned char)*p) || (*p == ','))) |       while (*p && (ISSPACE(*p) || (*p == ','))) | ||||||
|         p++; |         p++; | ||||||
|     } |     } | ||||||
|   *l = 0; |   *l = '\0'; | ||||||
|   channel->lookups = strdup(lookups); |   channel->lookups = strdup(lookups); | ||||||
|   return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM; |   return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM; | ||||||
| } | } | ||||||
| @@ -788,12 +890,12 @@ static int config_nameserver(struct server_state **servers, int *nservers, | |||||||
|   while (more) |   while (more) | ||||||
|   { |   { | ||||||
|     more = 0; |     more = 0; | ||||||
|     while (*p && !isspace(*p) && *p != ',') |     while (*p && !ISSPACE(*p) && *p != ',') | ||||||
|       p++; |       p++; | ||||||
|  |  | ||||||
|     if (*p) |     if (*p) | ||||||
|     { |     { | ||||||
|       *p = 0; |       *p = '\0'; | ||||||
|       more = 1; |       more = 1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -848,22 +950,22 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | |||||||
|       char ipbuf[16], ipbufpfx[32]; |       char ipbuf[16], ipbufpfx[32]; | ||||||
|       /* Find just the IP */ |       /* Find just the IP */ | ||||||
|       q = str; |       q = str; | ||||||
|       while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q)) |       while (*q && *q != '/' && *q != ';' && !ISSPACE(*q)) | ||||||
|         q++; |         q++; | ||||||
|       memcpy(ipbuf, str, (int)(q-str)); |       memcpy(ipbuf, str, (int)(q-str)); | ||||||
|       ipbuf[(int)(q-str)] = 0; |       ipbuf[(int)(q-str)] = '\0'; | ||||||
|       /* Find the prefix */ |       /* Find the prefix */ | ||||||
|       if (*q == '/') |       if (*q == '/') | ||||||
|         { |         { | ||||||
|           const char *str2 = q+1; |           const char *str2 = q+1; | ||||||
|           while (*q && *q != ';' && !isspace((unsigned char)*q)) |           while (*q && *q != ';' && !ISSPACE(*q)) | ||||||
|             q++; |             q++; | ||||||
|           memcpy(ipbufpfx, str, (int)(q-str)); |           memcpy(ipbufpfx, str, (int)(q-str)); | ||||||
|           ipbufpfx[(int)(q-str)] = 0; |           ipbufpfx[(int)(q-str)] = '\0'; | ||||||
|           str = str2; |           str = str2; | ||||||
|         } |         } | ||||||
|       else |       else | ||||||
|         ipbufpfx[0] = 0; |         ipbufpfx[0] = '\0'; | ||||||
|       /* Lets see if it is CIDR */ |       /* Lets see if it is CIDR */ | ||||||
|       /* First we'll try IPv6 */ |       /* First we'll try IPv6 */ | ||||||
|       if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf, |       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) |                                      sizeof(pat.addr.addr6))) > 0) | ||||||
|         { |         { | ||||||
|           pat.type = PATTERN_CIDR; |           pat.type = PATTERN_CIDR; | ||||||
|           pat.mask.bits = bits; |           pat.mask.bits = (unsigned short)bits; | ||||||
|           pat.family = AF_INET6; |           pat.family = AF_INET6; | ||||||
|           if (!sortlist_alloc(sortlist, nsort, &pat)) |           if (!sortlist_alloc(sortlist, nsort, &pat)) | ||||||
|             return ARES_ENOMEM; |             return ARES_ENOMEM; | ||||||
| @@ -881,7 +983,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | |||||||
|                                      sizeof(pat.addr.addr4))) > 0) |                                      sizeof(pat.addr.addr4))) > 0) | ||||||
|         { |         { | ||||||
|           pat.type = PATTERN_CIDR; |           pat.type = PATTERN_CIDR; | ||||||
|           pat.mask.bits = bits; |           pat.mask.bits = (unsigned short)bits; | ||||||
|           pat.family = AF_INET; |           pat.family = AF_INET; | ||||||
|           if (!sortlist_alloc(sortlist, nsort, &pat)) |           if (!sortlist_alloc(sortlist, nsort, &pat)) | ||||||
|             return ARES_ENOMEM; |             return ARES_ENOMEM; | ||||||
| @@ -892,7 +994,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | |||||||
|           if (ipbufpfx) |           if (ipbufpfx) | ||||||
|             { |             { | ||||||
|               memcpy(ipbuf, str, (int)(q-str)); |               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) |               if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr.addr4) != 0) | ||||||
|                 natural_mask(&pat); |                 natural_mask(&pat); | ||||||
|             } |             } | ||||||
| @@ -905,11 +1007,11 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | |||||||
|         } |         } | ||||||
|       else |       else | ||||||
|         { |         { | ||||||
|           while (*q && *q != ';' && !isspace((unsigned char)*q)) |           while (*q && *q != ';' && !ISSPACE(*q)) | ||||||
|             q++; |             q++; | ||||||
|         } |         } | ||||||
|       str = q; |       str = q; | ||||||
|       while (isspace((unsigned char)*str)) |       while (ISSPACE(*str)) | ||||||
|         str++; |         str++; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -927,6 +1029,7 @@ static int set_search(ares_channel channel, const char *str) | |||||||
|     for(n=0; n < channel->ndomains; n++) |     for(n=0; n < channel->ndomains; n++) | ||||||
|       free(channel->domains[n]); |       free(channel->domains[n]); | ||||||
|     free(channel->domains); |     free(channel->domains); | ||||||
|  |     channel->domains = NULL; | ||||||
|     channel->ndomains = -1; |     channel->ndomains = -1; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -935,15 +1038,21 @@ static int set_search(ares_channel channel, const char *str) | |||||||
|   p = str; |   p = str; | ||||||
|   while (*p) |   while (*p) | ||||||
|     { |     { | ||||||
|       while (*p && !isspace((unsigned char)*p)) |       while (*p && !ISSPACE(*p)) | ||||||
|         p++; |         p++; | ||||||
|       while (isspace((unsigned char)*p)) |       while (ISSPACE(*p)) | ||||||
|         p++; |         p++; | ||||||
|       n++; |       n++; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |   if (!n) | ||||||
|  |     { | ||||||
|  |       channel->ndomains = 0; | ||||||
|  |       return ARES_SUCCESS; | ||||||
|  |     } | ||||||
|  |  | ||||||
|   channel->domains = malloc(n * sizeof(char *)); |   channel->domains = malloc(n * sizeof(char *)); | ||||||
|   if (!channel->domains && n) |   if (!channel->domains) | ||||||
|     return ARES_ENOMEM; |     return ARES_ENOMEM; | ||||||
|  |  | ||||||
|   /* Now copy the domains. */ |   /* Now copy the domains. */ | ||||||
| @@ -953,7 +1062,7 @@ static int set_search(ares_channel channel, const char *str) | |||||||
|     { |     { | ||||||
|       channel->ndomains = n; |       channel->ndomains = n; | ||||||
|       q = p; |       q = p; | ||||||
|       while (*q && !isspace((unsigned char)*q)) |       while (*q && !ISSPACE(*q)) | ||||||
|         q++; |         q++; | ||||||
|       channel->domains[n] = malloc(q - p + 1); |       channel->domains[n] = malloc(q - p + 1); | ||||||
|       if (!channel->domains[n]) |       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); |       memcpy(channel->domains[n], p, q - p); | ||||||
|       channel->domains[n][q - p] = 0; |       channel->domains[n][q - p] = 0; | ||||||
|       p = q; |       p = q; | ||||||
|       while (isspace((unsigned char)*p)) |       while (ISSPACE(*p)) | ||||||
|         p++; |         p++; | ||||||
|       n++; |       n++; | ||||||
|     } |     } | ||||||
| @@ -978,7 +1087,7 @@ static int set_options(ares_channel channel, const char *str) | |||||||
|   while (*p) |   while (*p) | ||||||
|     { |     { | ||||||
|       q = p; |       q = p; | ||||||
|       while (*q && !isspace((unsigned char)*q)) |       while (*q && !ISSPACE(*q)) | ||||||
|         q++; |         q++; | ||||||
|       val = try_option(p, q, "ndots:"); |       val = try_option(p, q, "ndots:"); | ||||||
|       if (val && channel->ndots == -1) |       if (val && channel->ndots == -1) | ||||||
| @@ -990,7 +1099,7 @@ static int set_options(ares_channel channel, const char *str) | |||||||
|       if (val && channel->tries == -1) |       if (val && channel->tries == -1) | ||||||
|         channel->tries = atoi(val); |         channel->tries = atoi(val); | ||||||
|       p = q; |       p = q; | ||||||
|       while (isspace((unsigned char)*p)) |       while (ISSPACE(*p)) | ||||||
|         p++; |         p++; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1003,10 +1112,10 @@ static char *try_config(char *s, const char *opt) | |||||||
|   size_t len; |   size_t len; | ||||||
|  |  | ||||||
|   len = strlen(opt); |   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; |     return NULL; | ||||||
|   s += len; |   s += len; | ||||||
|   while (isspace((unsigned char)*s)) |   while (ISSPACE(*s)) | ||||||
|     s++; |     s++; | ||||||
|   return s; |   return s; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -40,14 +40,14 @@ struct sockaddr_in6 | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef HAVE_STRUCT_ADDRINFO | #ifndef HAVE_STRUCT_ADDRINFO | ||||||
| struct addrinfo | struct addrinfo  | ||||||
| { | { | ||||||
|   int ai_flags; |   int              ai_flags; | ||||||
|   int ai_family; |   int              ai_family; | ||||||
|   int ai_socktype; |   int              ai_socktype; | ||||||
|   int ai_protocol; |   int              ai_protocol; | ||||||
|   size_t ai_addrlen; |   socklen_t        ai_addrlen;   /* Follow rfc3493 struct addrinfo */ | ||||||
|   char *ai_cannonname; |   char            *ai_canonname; | ||||||
|   struct sockaddr *ai_addr; |   struct sockaddr *ai_addr; | ||||||
|   struct addrinfo *ai_next; |   struct addrinfo *ai_next; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
| @@ -30,6 +31,7 @@ | |||||||
| #include <string.h> | #include <string.h> | ||||||
| #include "ares.h" | #include "ares.h" | ||||||
| #include "ares_dns.h" | #include "ares_dns.h" | ||||||
|  | #include "ares_private.h" | ||||||
|  |  | ||||||
| /* Header format, from RFC 1035: | /* Header format, from RFC 1035: | ||||||
|  *                                  1  1  1  1  1  1 |  *                                  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); |   memset(q, 0, HFIXEDSZ); | ||||||
|   DNS_HEADER_SET_QID(q, id); |   DNS_HEADER_SET_QID(q, id); | ||||||
|   DNS_HEADER_SET_OPCODE(q, QUERY); |   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); |   DNS_HEADER_SET_QDCOUNT(q, 1); | ||||||
|  |  | ||||||
|   /* A name of "." is a screw case for the loop below, so adjust it. */ |   /* 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; |         return ARES_EBADNAME; | ||||||
|  |  | ||||||
|       /* Encode the length and copy the data. */ |       /* Encode the length and copy the data. */ | ||||||
|       *q++ = len; |       *q++ = (unsigned char)len; | ||||||
|       for (p = name; *p && *p != '.'; p++) |       for (p = name; *p && *p != '.'; p++) | ||||||
|         { |         { | ||||||
|           if (*p == '\\' && *(p + 1) != 0) |           if (*p == '\\' && *(p + 1) != 0) | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 2005 Dominick Meglio | /* Copyright 2005 Dominick Meglio | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #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. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
|   | |||||||
| @@ -1,3 +1,6 @@ | |||||||
|  | #ifndef __ARES_PRIVATE_H | ||||||
|  | #define __ARES_PRIVATE_H | ||||||
|  |  | ||||||
| /* $Id$ */ | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* 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. */ |    this anyway for convenience. */ | ||||||
| #include "../lib/memdebug.h" | #include "../lib/memdebug.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #endif /* __ARES_PRIVATE_H */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
| @@ -52,17 +53,8 @@ | |||||||
| #include "ares_dns.h" | #include "ares_dns.h" | ||||||
| #include "ares_private.h" | #include "ares_private.h" | ||||||
|  |  | ||||||
| #ifndef TRUE |  | ||||||
| /* at least Solaris 7 does not have TRUE at this point */ |  | ||||||
| #define TRUE 1 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) |  | ||||||
| #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, | static void write_tcp_data(ares_channel channel, fd_set *write_fds, | ||||||
|                            time_t now); |                            time_t now); | ||||||
| static void read_tcp_data(ares_channel channel, fd_set *read_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); |   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 | /* If any TCP sockets select true for writing, write out queued data | ||||||
|  * we have for them. |  * we have for them. | ||||||
|  */ |  */ | ||||||
| @@ -132,11 +149,12 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now) | |||||||
|               vec[n].iov_len = sendreq->len; |               vec[n].iov_len = sendreq->len; | ||||||
|               n++; |               n++; | ||||||
|             } |             } | ||||||
|           wcount = writev(server->tcp_socket, vec, n); |           wcount = (ssize_t)writev(server->tcp_socket, vec, (int)n); | ||||||
|           free(vec); |           free(vec); | ||||||
|           if (wcount < 0) |           if (wcount < 0) | ||||||
|             { |             { | ||||||
|               handle_error(channel, i, now); |               if (!try_again(SOCKERRNO)) | ||||||
|  |                   handle_error(channel, i, now); | ||||||
|               continue; |               continue; | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -168,12 +186,11 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now) | |||||||
|           /* Can't allocate iovecs; just send the first request. */ |           /* Can't allocate iovecs; just send the first request. */ | ||||||
|           sendreq = server->qhead; |           sendreq = server->qhead; | ||||||
|  |  | ||||||
|           scount = send(server->tcp_socket, (void *)sendreq->data, |           scount = swrite(server->tcp_socket, sendreq->data, sendreq->len); | ||||||
|                         sendreq->len, 0); |  | ||||||
|  |  | ||||||
|           if (scount < 0) |           if (scount < 0) | ||||||
|             { |             { | ||||||
|               handle_error(channel, i, now); |               if (!try_again(SOCKERRNO)) | ||||||
|  |                   handle_error(channel, i, now); | ||||||
|               continue; |               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) | static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now) | ||||||
| { | { | ||||||
|   struct server_state *server; |   struct server_state *server; | ||||||
|   int i, count; |   int i; | ||||||
|  |   ssize_t count; | ||||||
|  |  | ||||||
|   for (i = 0; i < channel->nservers; i++) |   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 |           /* We haven't yet read a length word, so read that (or | ||||||
|            * what's left to read of it). |            * what's left to read of it). | ||||||
|            */ |            */ | ||||||
|           count = recv(server->tcp_socket, |           count = sread(server->tcp_socket, | ||||||
|                        (void *)(server->tcp_lenbuf + server->tcp_lenbuf_pos), |                         server->tcp_lenbuf + server->tcp_lenbuf_pos, | ||||||
|                        2 - server->tcp_lenbuf_pos, 0); |                         2 - server->tcp_lenbuf_pos); | ||||||
|           if (count <= 0) |           if (count <= 0) | ||||||
|             { |             { | ||||||
|               handle_error(channel, i, now); |               if (!(count == -1 && try_again(SOCKERRNO))) | ||||||
|  |                   handle_error(channel, i, now); | ||||||
|               continue; |               continue; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|           server->tcp_lenbuf_pos += count; |           server->tcp_lenbuf_pos += (int)count; | ||||||
|           if (server->tcp_lenbuf_pos == 2) |           if (server->tcp_lenbuf_pos == 2) | ||||||
|             { |             { | ||||||
|               /* We finished reading the length word.  Decode the |               /* 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 |       else | ||||||
|         { |         { | ||||||
|           /* Read data into the allocated buffer. */ |           /* Read data into the allocated buffer. */ | ||||||
|           count = recv(server->tcp_socket, |           count = sread(server->tcp_socket, | ||||||
|                        (void *)(server->tcp_buffer + server->tcp_buffer_pos), |                         server->tcp_buffer + server->tcp_buffer_pos, | ||||||
|                        server->tcp_length - server->tcp_buffer_pos, 0); |                         server->tcp_length - server->tcp_buffer_pos); | ||||||
|           if (count <= 0) |           if (count <= 0) | ||||||
|             { |             { | ||||||
|               handle_error(channel, i, now); |               if (!(count == -1 && try_again(SOCKERRNO))) | ||||||
|  |                   handle_error(channel, i, now); | ||||||
|               continue; |               continue; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|           server->tcp_buffer_pos += count; |           server->tcp_buffer_pos += (int)count; | ||||||
|           if (server->tcp_buffer_pos == server->tcp_length) |           if (server->tcp_buffer_pos == server->tcp_length) | ||||||
|             { |             { | ||||||
|               /* We finished reading this answer; process it and |               /* 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); |                         free(server->tcp_buffer); | ||||||
|               server->tcp_buffer = NULL; |               server->tcp_buffer = NULL; | ||||||
|               server->tcp_lenbuf_pos = 0; |               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) |                              time_t now) | ||||||
| { | { | ||||||
|   struct server_state *server; |   struct server_state *server; | ||||||
|   int i, count; |   int i; | ||||||
|  |   ssize_t count; | ||||||
|   unsigned char buf[PACKETSZ + 1]; |   unsigned char buf[PACKETSZ + 1]; | ||||||
|  |  | ||||||
|   for (i = 0; i < channel->nservers; i++) |   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)) |           !FD_ISSET(server->udp_socket, read_fds)) | ||||||
|         continue; |         continue; | ||||||
|  |  | ||||||
|       count = recv(server->udp_socket, (void *)buf, sizeof(buf), 0); |       count = sread(server->udp_socket, buf, sizeof(buf)); | ||||||
|       if (count <= 0) |       if (count == -1 && try_again(SOCKERRNO)) | ||||||
|  |         continue; | ||||||
|  |       else if (count <= 0) | ||||||
|         handle_error(channel, i, now); |         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; |               return; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|       if (send(server->udp_socket, (void *)query->qbuf, |       if (swrite(server->udp_socket, query->qbuf, query->qlen) == -1) | ||||||
|                query->qlen, 0) == -1) |  | ||||||
|         { |         { | ||||||
|  |           /* FIXME: Handle EAGAIN here since it likely can happen. */ | ||||||
|           query->skip_server[query->server] = 1; |           query->skip_server[query->server] = 1; | ||||||
|           next_server(channel, query, now); |           next_server(channel, query, now); | ||||||
|           return; |           return; | ||||||
| @@ -503,7 +527,7 @@ static int nonblock(ares_socket_t sockfd,    /* operate on this */ | |||||||
|   int flags; |   int flags; | ||||||
|  |  | ||||||
|   flags = fcntl(sockfd, F_GETFL, 0); |   flags = fcntl(sockfd, F_GETFL, 0); | ||||||
|   if (TRUE == nonblock) |   if (FALSE != nonblock) | ||||||
|     return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); |     return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); | ||||||
|   else |   else | ||||||
|     return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); |     return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); | ||||||
| @@ -522,8 +546,12 @@ static int nonblock(ares_socket_t sockfd,    /* operate on this */ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0) | #if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0) | ||||||
|  | #ifdef WATT32 | ||||||
|  |   char flags; | ||||||
|  | #else | ||||||
|   /* Windows? */ |   /* Windows? */ | ||||||
|   unsigned long flags; |   unsigned long flags; | ||||||
|  | #endif | ||||||
|   flags = nonblock; |   flags = nonblock; | ||||||
|  |  | ||||||
|   return ioctlsocket(sockfd, FIONBIO, &flags); |   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)); |   memset(&sockin, 0, sizeof(sockin)); | ||||||
|   sockin.sin_family = AF_INET; |   sockin.sin_family = AF_INET; | ||||||
|   sockin.sin_addr = server->addr; |   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) { |   if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1) { | ||||||
|     int err = GET_ERRNO(); |     int err = SOCKERRNO; | ||||||
|  |  | ||||||
|     if (err != EINPROGRESS && err != EWOULDBLOCK) { |     if (err != EINPROGRESS && err != EWOULDBLOCK) { | ||||||
|       closesocket(s); |       closesocket(s); | ||||||
| @@ -607,7 +635,7 @@ static int open_udp_socket(ares_channel channel, struct server_state *server) | |||||||
|   memset(&sockin, 0, sizeof(sockin)); |   memset(&sockin, 0, sizeof(sockin)); | ||||||
|   sockin.sin_family = AF_INET; |   sockin.sin_family = AF_INET; | ||||||
|   sockin.sin_addr = server->addr; |   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) |   if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1) | ||||||
|     { |     { | ||||||
|       closesocket(s); |       closesocket(s); | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -18,6 +20,7 @@ | |||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <ctype.h> | #include <ctype.h> | ||||||
|  | #include <errno.h> | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
| @@ -214,6 +217,7 @@ static int single_domain(ares_channel channel, const char *name, char **s) | |||||||
|   char *line = NULL; |   char *line = NULL; | ||||||
|   int linesize, status; |   int linesize, status; | ||||||
|   const char *p, *q; |   const char *p, *q; | ||||||
|  |   int error; | ||||||
|  |  | ||||||
|   /* If the name contains a trailing dot, then the single query is the name |   /* If the name contains a trailing dot, then the single query is the name | ||||||
|    * sans the trailing dot. |    * sans the trailing dot. | ||||||
| @@ -237,15 +241,15 @@ static int single_domain(ares_channel channel, const char *name, char **s) | |||||||
|                      == ARES_SUCCESS) |                      == ARES_SUCCESS) | ||||||
|                 { |                 { | ||||||
|                   if (strncasecmp(line, name, len) != 0 || |                   if (strncasecmp(line, name, len) != 0 || | ||||||
|                       !isspace((unsigned char)line[len])) |                       !ISSPACE(line[len])) | ||||||
|                     continue; |                     continue; | ||||||
|                   p = line + len; |                   p = line + len; | ||||||
|                   while (isspace((unsigned char)*p)) |                   while (ISSPACE(*p)) | ||||||
|                     p++; |                     p++; | ||||||
|                   if (*p) |                   if (*p) | ||||||
|                     { |                     { | ||||||
|                       q = p + 1; |                       q = p + 1; | ||||||
|                       while (*q && !isspace((unsigned char)*q)) |                       while (*q && !ISSPACE(*q)) | ||||||
|                         q++; |                         q++; | ||||||
|                       *s = malloc(q - p + 1); |                       *s = malloc(q - p + 1); | ||||||
|                       if (*s) |                       if (*s) | ||||||
| @@ -263,6 +267,23 @@ static int single_domain(ares_channel channel, const char *name, char **s) | |||||||
|               if (status != ARES_SUCCESS) |               if (status != ARES_SUCCESS) | ||||||
|                 return status; |                 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. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #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. */ |   /* 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; |   query->timeout = 0; | ||||||
|  |  | ||||||
|   /* Form the TCP query buffer by prepending qlen (as two |   /* Form the TCP query buffer by prepending qlen (as two | ||||||
|    * network-order bytes) to qbuf. |    * network-order bytes) to qbuf. | ||||||
|    */ |    */ | ||||||
|   query->tcpbuf[0] = (qlen >> 8) & 0xff; |   query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff); | ||||||
|   query->tcpbuf[1] = qlen & 0xff; |   query->tcpbuf[1] = (unsigned char)(qlen & 0xff); | ||||||
|   memcpy(query->tcpbuf + 2, qbuf, qlen); |   memcpy(query->tcpbuf + 2, qbuf, qlen); | ||||||
|   query->tcplen = qlen + 2; |   query->tcplen = qlen + 2; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -39,9 +41,11 @@ const char *ares_strerror(int code) | |||||||
|     "Out of memory", |     "Out of memory", | ||||||
|     "Channel is being destroyed", |     "Channel is being destroyed", | ||||||
|     "Misformatted string", |     "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]; |   return errtext[code]; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright 1998 by the Massachusetts Institute of Technology. | /* Copyright 1998 by the Massachusetts Institute of Technology. | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this |  * Permission to use, copy, modify, and distribute this | ||||||
| @@ -14,7 +16,6 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #ifdef HAVE_SYS_TIME_H | #ifdef HAVE_SYS_TIME_H | ||||||
| #include <sys/time.h> | #include <sys/time.h> | ||||||
|   | |||||||
| @@ -5,13 +5,21 @@ | |||||||
|  |  | ||||||
| #define ARES_VERSION_MAJOR 1 | #define ARES_VERSION_MAJOR 1 | ||||||
| #define ARES_VERSION_MINOR 3 | #define ARES_VERSION_MINOR 3 | ||||||
| #define ARES_VERSION_PATCH 1 | #define ARES_VERSION_PATCH 3 | ||||||
| #define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ | #define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ | ||||||
|                        (ARES_VERSION_MINOR<<8)|\ |                        (ARES_VERSION_MINOR<<8)|\ | ||||||
|                        (ARES_VERSION_PATCH)) |                        (ARES_VERSION_PATCH)) | ||||||
| #define ARES_VERSION_STR "1.3.1" | #define ARES_VERSION_STR "1.3.3-CVS" | ||||||
|  |  | ||||||
|  | #ifdef  __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  |  | ||||||
| const char *ares_version(int *version); | const char *ares_version(int *version); | ||||||
|  |  | ||||||
|  | #ifdef  __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") |  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") | ||||||
|  * Copyright (c) 1996,1999 by Internet Software Consortium. |  * Copyright (c) 1996,1999 by Internet Software Consortium. | ||||||
| @@ -17,9 +19,7 @@ | |||||||
|  |  | ||||||
| #ifndef HAVE_BITNCMP | #ifndef HAVE_BITNCMP | ||||||
|  |  | ||||||
| #include <sys/types.h> | #include "setup.h" | ||||||
| #include <string.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include "bitncmp.h" | #include "bitncmp.h" | ||||||
|  |  | ||||||
| /* | /* | ||||||
|   | |||||||
| @@ -1,3 +1,6 @@ | |||||||
|  | #ifndef __ARES_BITNCMP_H | ||||||
|  | #define __ARES_BITNCMP_H | ||||||
|  |  | ||||||
| /* $Id$ */ | /* $Id$ */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -14,13 +17,10 @@ | |||||||
|  * without express or implied warranty. |  * without express or implied warranty. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef BITNCMP_H |  | ||||||
| #define BITNCMP_H |  | ||||||
|  |  | ||||||
| #ifndef HAVE_BITNCMP | #ifndef HAVE_BITNCMP | ||||||
| int ares_bitncmp(const void *l, const void *r, int n); | int ares_bitncmp(const void *l, const void *r, int n); | ||||||
| #else | #else | ||||||
| #define ares_bitncmp(x,y,z) bitncmp(x,y,z) | #define ares_bitncmp(x,y,z) bitncmp(x,y,z) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* BITNCMP_H */ | #endif /* __ARES_BITNCMP_H */ | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
|  |  | ||||||
| /* $Id$ */ | /* $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 |  * Permission to use, copy, modify, and distribute this software and its | ||||||
|  * documentation for any purpose and without fee is hereby granted, provided |  * documentation for any purpose and without fee is hereby granted, provided | ||||||
| @@ -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 | #define HAVE_GETOPT_H 1 | ||||||
| #endif | #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.  */ | /* Define if you have the <unistd.h> header file.  */ | ||||||
| #if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \ | #if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \ | ||||||
|     defined(__POCC__) |     defined(__POCC__) | ||||||
| @@ -47,6 +59,19 @@ | |||||||
| /* Define if you have the <ws2tcpip.h> header file.  */ | /* Define if you have the <ws2tcpip.h> header file.  */ | ||||||
| #define HAVE_WS2TCPIP_H 1 | #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                            */ | /*                             FUNCTIONS                            */ | ||||||
| /* ---------------------------------------------------------------- */ | /* ---------------------------------------------------------------- */ | ||||||
| @@ -54,6 +79,78 @@ | |||||||
| /* Define if you have the ioctlsocket function.  */ | /* Define if you have the ioctlsocket function.  */ | ||||||
| #define HAVE_IOCTLSOCKET 1 | #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                          */ | /*                          STRUCT RELATED                          */ | ||||||
| /* ---------------------------------------------------------------- */ | /* ---------------------------------------------------------------- */ | ||||||
| @@ -64,6 +161,9 @@ | |||||||
| /* Define this if you have struct sockaddr_storage */ | /* Define this if you have struct sockaddr_storage */ | ||||||
| #define HAVE_STRUCT_SOCKADDR_STORAGE 1 | #define HAVE_STRUCT_SOCKADDR_STORAGE 1 | ||||||
|  |  | ||||||
|  | /* Define this if you have struct timeval */ | ||||||
|  | #define HAVE_STRUCT_TIMEVAL 1 | ||||||
|  |  | ||||||
| /* ---------------------------------------------------------------- */ | /* ---------------------------------------------------------------- */ | ||||||
| /*                         IPV6 COMPATIBILITY                       */ | /*                         IPV6 COMPATIBILITY                       */ | ||||||
| /* ---------------------------------------------------------------- */ | /* ---------------------------------------------------------------- */ | ||||||
|   | |||||||
| @@ -7,6 +7,15 @@ AM_CONFIG_HEADER(config.h) | |||||||
| AM_MAINTAINER_MODE | AM_MAINTAINER_MODE | ||||||
| AM_INIT_AUTOMAKE(c-ares, CVS) | 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_CC | ||||||
| AC_PROG_INSTALL | AC_PROG_INSTALL | ||||||
|  |  | ||||||
| @@ -16,10 +25,7 @@ solaris*) | |||||||
| 	;; | 	;; | ||||||
| esac | esac | ||||||
|  |  | ||||||
| AC_SEARCH_LIBS(gethostbyname, nsl) | dnl support building of Windows DLLs | ||||||
| AC_SEARCH_LIBS(socket, socket) |  | ||||||
|  |  | ||||||
| dnl check for cygwin stuff |  | ||||||
| AC_LIBTOOL_WIN32_DLL | AC_LIBTOOL_WIN32_DLL | ||||||
|  |  | ||||||
| dnl ************************************************************ | dnl ************************************************************ | ||||||
| @@ -65,8 +71,31 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]), | |||||||
|        AC_MSG_RESULT(no) |        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 | dnl libtool setup | ||||||
| CARES_CLEAR_LIBTOOL_TAGS |  | ||||||
| AC_PROG_LIBTOOL | AC_PROG_LIBTOOL | ||||||
|  |  | ||||||
| AC_MSG_CHECKING([if we need -no-undefined]) | AC_MSG_CHECKING([if we need -no-undefined]) | ||||||
| @@ -81,6 +110,209 @@ esac | |||||||
| AC_MSG_RESULT($need_no_undefined) | AC_MSG_RESULT($need_no_undefined) | ||||||
| AM_CONDITIONAL(NO_UNDEFINED, test x$need_no_undefined = xyes) | 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. | dnl Checks for header files. | ||||||
| AC_HEADER_STDC | AC_HEADER_STDC | ||||||
|  |  | ||||||
| @@ -96,6 +328,8 @@ CURL_CHECK_HEADER_WINSOCK | |||||||
| CURL_CHECK_HEADER_WINSOCK2 | CURL_CHECK_HEADER_WINSOCK2 | ||||||
| CURL_CHECK_HEADER_WS2TCPIP | CURL_CHECK_HEADER_WS2TCPIP | ||||||
|  |  | ||||||
|  | CURL_CHECK_HEADER_MALLOC | ||||||
|  |  | ||||||
| dnl check for a few basic system headers we need | dnl check for a few basic system headers we need | ||||||
| AC_CHECK_HEADERS( | AC_CHECK_HEADERS( | ||||||
|        sys/types.h \ |        sys/types.h \ | ||||||
| @@ -106,6 +340,8 @@ AC_CHECK_HEADERS( | |||||||
|        netdb.h \ |        netdb.h \ | ||||||
|        netinet/in.h \ |        netinet/in.h \ | ||||||
|        net/if.h \ |        net/if.h \ | ||||||
|  |        errno.h \ | ||||||
|  |        stdbool.h \ | ||||||
|        arpa/nameser.h \ |        arpa/nameser.h \ | ||||||
|        arpa/nameser_compat.h \ |        arpa/nameser_compat.h \ | ||||||
|        arpa/inet.h, |        arpa/inet.h, | ||||||
| @@ -142,6 +378,7 @@ dnl Checks for typedefs, structures, and compiler characteristics. | |||||||
| AC_C_CONST | AC_C_CONST | ||||||
| AC_TYPE_SIZE_T | AC_TYPE_SIZE_T | ||||||
| AC_HEADER_TIME | AC_HEADER_TIME | ||||||
|  | CURL_CHECK_STRUCT_TIMEVAL | ||||||
|  |  | ||||||
| AC_CHECK_SIZEOF(size_t) | AC_CHECK_SIZEOF(size_t) | ||||||
| AC_CHECK_SIZEOF(long) | AC_CHECK_SIZEOF(long) | ||||||
| @@ -166,6 +403,19 @@ fi | |||||||
| AC_CHECK_TYPE(ssize_t, , | AC_CHECK_TYPE(ssize_t, , | ||||||
|    AC_DEFINE(ssize_t, int, [the signed version of size_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 | # Check for socklen_t or equivalent | ||||||
| CURL_CHECK_TYPE_SOCKLEN_T | CURL_CHECK_TYPE_SOCKLEN_T | ||||||
|  |  | ||||||
| @@ -173,6 +423,15 @@ TYPE_IN_ADDR_T | |||||||
|  |  | ||||||
| TYPE_SOCKADDR_STORAGE | 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 | dnl check for AF_INET6 | ||||||
| CARES_CHECK_CONSTANT( | CARES_CHECK_CONSTANT( | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") |  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") | ||||||
|  * Copyright (c) 1996,1999 by Internet Software Consortium. |  * Copyright (c) 1996,1999 by Internet Software Consortium. | ||||||
| @@ -17,9 +19,6 @@ | |||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
| #else | #else | ||||||
| @@ -64,6 +63,11 @@ | |||||||
|  * note: |  * note: | ||||||
|  *      network byte order assumed.  this means 192.5.5.240/28 has |  *      network byte order assumed.  this means 192.5.5.240/28 has | ||||||
|  *      0b11110000 in its fourth octet. |  *      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: |  * author: | ||||||
|  *      Paul Vixie (ISC), June 1996 |  *      Paul Vixie (ISC), June 1996 | ||||||
|  */ |  */ | ||||||
| @@ -77,15 +81,14 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | |||||||
|  |  | ||||||
|   ch = *src++; |   ch = *src++; | ||||||
|   if (ch == '0' && (src[0] == 'x' || src[0] == 'X') |   if (ch == '0' && (src[0] == 'x' || src[0] == 'X') | ||||||
|       && isascii((unsigned char)(src[1])) |       && ISXDIGIT(src[1])) { | ||||||
|       && isxdigit((unsigned char)(src[1]))) { |  | ||||||
|     /* Hexadecimal: Eat nybble string. */ |     /* Hexadecimal: Eat nybble string. */ | ||||||
|     if (size <= 0U) |     if (size <= 0U) | ||||||
|       goto emsgsize; |       goto emsgsize; | ||||||
|     dirty = 0; |     dirty = 0; | ||||||
|     src++;  /* skip x or X. */ |     src++;  /* skip x or X. */ | ||||||
|     while ((ch = *src++) != '\0' && isascii(ch) && isxdigit(ch)) { |     while ((ch = *src++) != '\0' && ISXDIGIT(ch)) { | ||||||
|       if (isupper(ch)) |       if (ISUPPER(ch)) | ||||||
|         ch = tolower(ch); |         ch = tolower(ch); | ||||||
|       n = (int)(strchr(xdigits, ch) - xdigits); |       n = (int)(strchr(xdigits, ch) - xdigits); | ||||||
|       if (dirty == 0) |       if (dirty == 0) | ||||||
| @@ -104,7 +107,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | |||||||
|         goto emsgsize; |         goto emsgsize; | ||||||
|       *dst++ = (unsigned char) (tmp << 4); |       *dst++ = (unsigned char) (tmp << 4); | ||||||
|     } |     } | ||||||
|   } else if (isascii(ch) && isdigit(ch)) { |   } else if (ISDIGIT(ch)) { | ||||||
|     /* Decimal: eat dotted digit string. */ |     /* Decimal: eat dotted digit string. */ | ||||||
|     for (;;) { |     for (;;) { | ||||||
|       tmp = 0; |       tmp = 0; | ||||||
| @@ -115,7 +118,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | |||||||
|         if (tmp > 255) |         if (tmp > 255) | ||||||
|           goto enoent; |           goto enoent; | ||||||
|       } while ((ch = *src++) != '\0' && |       } while ((ch = *src++) != '\0' && | ||||||
|                isascii(ch) && isdigit(ch)); |                ISDIGIT(ch)); | ||||||
|       if (size-- <= 0U) |       if (size-- <= 0U) | ||||||
|         goto emsgsize; |         goto emsgsize; | ||||||
|       *dst++ = (unsigned char) tmp; |       *dst++ = (unsigned char) tmp; | ||||||
| @@ -124,15 +127,15 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | |||||||
|       if (ch != '.') |       if (ch != '.') | ||||||
|         goto enoent; |         goto enoent; | ||||||
|       ch = *src++; |       ch = *src++; | ||||||
|       if (!isascii(ch) || !isdigit(ch)) |       if (!ISDIGIT(ch)) | ||||||
|         goto enoent; |         goto enoent; | ||||||
|     } |     } | ||||||
|   } else |   } else | ||||||
|     goto enoent; |     goto enoent; | ||||||
|  |  | ||||||
|   bits = -1; |   bits = -1; | ||||||
|   if (ch == '/' && isascii((unsigned char)(src[0])) && |   if (ch == '/' && | ||||||
|       isdigit((unsigned char)(src[0])) && dst > odst) { |       ISDIGIT(src[0]) && dst > odst) { | ||||||
|     /* CIDR width specifier.  Nothing can follow it. */ |     /* CIDR width specifier.  Nothing can follow it. */ | ||||||
|     ch = *src++;    /* Skip over the /. */ |     ch = *src++;    /* Skip over the /. */ | ||||||
|     bits = 0; |     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); |       n = (int)(strchr(digits, ch) - digits); | ||||||
|       bits *= 10; |       bits *= 10; | ||||||
|       bits += n; |       bits += n; | ||||||
|     } while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch)); |     } while ((ch = *src++) != '\0' && ISDIGIT(ch)); | ||||||
|     if (ch != '\0') |     if (ch != '\0') | ||||||
|       goto enoent; |       goto enoent; | ||||||
|     if (bits > 32) |     if (bits > 32) | ||||||
| @@ -185,11 +188,11 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) | |||||||
|   return (bits); |   return (bits); | ||||||
|  |  | ||||||
|   enoent: |   enoent: | ||||||
|   errno = ENOENT; |   SET_ERRNO(ENOENT); | ||||||
|   return (-1); |   return (-1); | ||||||
|  |  | ||||||
|   emsgsize: |   emsgsize: | ||||||
|   errno = EMSGSIZE; |   SET_ERRNO(EMSGSIZE); | ||||||
|   return (-1); |   return (-1); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -251,7 +254,7 @@ getv4(const char *src, unsigned char *dst, int *bitsp) | |||||||
|     if (ch == '.' || ch == '/') { |     if (ch == '.' || ch == '/') { | ||||||
|       if (dst - odst > 3)             /* too many octets? */ |       if (dst - odst > 3)             /* too many octets? */ | ||||||
|         return (0); |         return (0); | ||||||
|       *dst++ = val; |       *dst++ = (unsigned char)val; | ||||||
|       if (ch == '/') |       if (ch == '/') | ||||||
|         return (getbits(src, bitsp)); |         return (getbits(src, bitsp)); | ||||||
|       val = 0; |       val = 0; | ||||||
| @@ -264,7 +267,7 @@ getv4(const char *src, unsigned char *dst, int *bitsp) | |||||||
|     return (0); |     return (0); | ||||||
|   if (dst - odst > 3)             /* too many octets? */ |   if (dst - odst > 3)             /* too many octets? */ | ||||||
|     return (0); |     return (0); | ||||||
|   *dst++ = val; |   *dst++ = (unsigned char)val; | ||||||
|   return (1); |   return (1); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -320,8 +323,8 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) | |||||||
|         goto enoent; |         goto enoent; | ||||||
|       if (tp + NS_INT16SZ > endp) |       if (tp + NS_INT16SZ > endp) | ||||||
|         return (0); |         return (0); | ||||||
|       *tp++ = (unsigned char) (val >> 8) & 0xff; |       *tp++ = (unsigned char)((val >> 8) & 0xff); | ||||||
|       *tp++ = (unsigned char) val & 0xff; |       *tp++ = (unsigned char)(val & 0xff); | ||||||
|       saw_xdigit = 0; |       saw_xdigit = 0; | ||||||
|       digits = 0; |       digits = 0; | ||||||
|       val = 0; |       val = 0; | ||||||
| @@ -341,8 +344,8 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) | |||||||
|   if (saw_xdigit) { |   if (saw_xdigit) { | ||||||
|     if (tp + NS_INT16SZ > endp) |     if (tp + NS_INT16SZ > endp) | ||||||
|       goto enoent; |       goto enoent; | ||||||
|     *tp++ = (unsigned char) (val >> 8) & 0xff; |     *tp++ = (unsigned char)((val >> 8) & 0xff); | ||||||
|     *tp++ = (unsigned char) val & 0xff; |     *tp++ = (unsigned char)(val & 0xff); | ||||||
|   } |   } | ||||||
|   if (bits == -1) |   if (bits == -1) | ||||||
|     bits = 128; |     bits = 128; | ||||||
| @@ -380,11 +383,11 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) | |||||||
|   return (bits); |   return (bits); | ||||||
|  |  | ||||||
|   enoent: |   enoent: | ||||||
|   errno = ENOENT; |   SET_ERRNO(ENOENT); | ||||||
|   return (-1); |   return (-1); | ||||||
|  |  | ||||||
|   emsgsize: |   emsgsize: | ||||||
|   errno = EMSGSIZE; |   SET_ERRNO(EMSGSIZE); | ||||||
|   return (-1); |   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, |  *      number of bits, either imputed classfully or specified with /CIDR, | ||||||
|  *      or -1 if some failure occurred (check errno).  ENOENT means it was |  *      or -1 if some failure occurred (check errno).  ENOENT means it was | ||||||
|  *      not a valid network specification. |  *      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: |  * author: | ||||||
|  *      Paul Vixie (ISC), June 1996 |  *      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: |   case AF_INET6: | ||||||
|     return (inet_net_pton_ipv6(src, dst, size)); |     return (inet_net_pton_ipv6(src, dst, size)); | ||||||
|   default: |   default: | ||||||
|     errno = EAFNOSUPPORT; |     SET_ERRNO(EAFNOSUPPORT); | ||||||
|     return (-1); |     return (-1); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -428,11 +436,11 @@ int ares_inet_pton(int af, const char *src, void *dst) | |||||||
|     size = sizeof(struct in6_addr); |     size = sizeof(struct in6_addr); | ||||||
|   else |   else | ||||||
|   { |   { | ||||||
|     errno = EAFNOSUPPORT; |     SET_ERRNO(EAFNOSUPPORT); | ||||||
|     return -1; |     return -1; | ||||||
|   } |   } | ||||||
|   result = ares_inet_net_pton(af, src, dst, size); |   result = ares_inet_net_pton(af, src, dst, size); | ||||||
|   if (result == -1 && errno == ENOENT) |   if (result == -1 && ERRNO == ENOENT) | ||||||
|     return 0; |     return 0; | ||||||
|   return (result > -1 ? 1 : -1); |   return (result > -1 ? 1 : -1); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,3 +1,6 @@ | |||||||
|  | #ifndef __ARES_INET_NET_PTON_H | ||||||
|  | #define __ARES_INET_NET_PTON_H | ||||||
|  |  | ||||||
| /* $Id$ */ | /* $Id$ */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -14,9 +17,6 @@ | |||||||
|  * without express or implied warranty. |  * 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) | #if defined(HAVE_INET_PTON) && defined(HAVE_INET_PTON_IPV6) | ||||||
| #define ares_inet_pton(x,y,z) inet_pton(x,y,z) | #define ares_inet_pton(x,y,z) inet_pton(x,y,z) | ||||||
| #else | #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); | int ares_inet_net_pton(int af, const char *src, void *dst, size_t size); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* INET_NET_PTON_H */ | #endif /* __ARES_INET_NET_PTON_H */ | ||||||
|   | |||||||
| @@ -18,8 +18,6 @@ | |||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
|  |  | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #if defined(WIN32) && !defined(WATT32) | ||||||
| #include "nameser.h" | #include "nameser.h" | ||||||
| #else | #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. |  *     convert a network format address to presentation format. | ||||||
|  * return: |  * return: | ||||||
|  *     pointer to presentation format address (`dst'), or NULL (see errno). |  *     pointer to presentation format address (`dst'), or NULL (see errno). | ||||||
|  |  * 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: |  * author: | ||||||
|  *     Paul Vixie, 1996. |  *     Paul Vixie, 1996. | ||||||
|  */ |  */ | ||||||
| @@ -81,7 +84,7 @@ ares_inet_ntop(int af, const void *src, char *dst, size_t size) | |||||||
|     case AF_INET6: |     case AF_INET6: | ||||||
|       return (inet_ntop6(src, dst, size)); |       return (inet_ntop6(src, dst, size)); | ||||||
|     default: |     default: | ||||||
|       errno = EAFNOSUPPORT; |       SET_ERRNO(EAFNOSUPPORT); | ||||||
|       return (NULL); |       return (NULL); | ||||||
|     } |     } | ||||||
|   /* NOTREACHED */ |   /* 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) |   if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) | ||||||
|     { |     { | ||||||
|       errno = ENOSPC; |       SET_ERRNO(ENOSPC); | ||||||
|       return (NULL); |       return (NULL); | ||||||
|     } |     } | ||||||
|     strcpy(dst, tmp); |     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 |    * Keep this in mind if you think this function should have been coded | ||||||
|    * to use pointer overlays.  All the world's not a VAX. |    * to use pointer overlays.  All the world's not a VAX. | ||||||
|    */ |    */ | ||||||
|   char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; |   char tmp[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")]; | ||||||
|   struct { int base, len; } best = { 0,0 }, cur = { 0,0 }; |   char *tp; | ||||||
|   unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; |   struct { | ||||||
|  |     long base; | ||||||
|  |     long len; | ||||||
|  |   } best, cur; | ||||||
|  |   unsigned long words[NS_IN6ADDRSZ / NS_INT16SZ]; | ||||||
|   int i; |   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. |    *  Copy the input (bytewise) array into a wordwise array. | ||||||
|    *  Find the longest run of 0x00's in src[] for :: shorthanding. |    *  Find the longest run of 0x00's in src[] for :: shorthanding. | ||||||
|    */ |    */ | ||||||
|   memset(words, '\0', sizeof words); |   memset(words, '\0', sizeof(words)); | ||||||
|   for (i = 0; i < NS_IN6ADDRSZ; i++) |   for (i = 0; i < NS_IN6ADDRSZ; i++) | ||||||
|       words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); |       words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); | ||||||
|  |  | ||||||
|   best.base = -1; |   best.base = -1; | ||||||
|   cur.base = -1; |   cur.base = -1; | ||||||
|  |   best.len = 0; | ||||||
|  |   cur.len = 0; | ||||||
|  |  | ||||||
|   for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) |   for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) | ||||||
|     { |     { | ||||||
|       if (words[i] == 0) |       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 && |       if (i == 6 && best.base == 0 && | ||||||
|           (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) |           (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) | ||||||
|         { |         { | ||||||
|           if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) |           if (!inet_ntop4(src+12, tp, sizeof(tmp) - (tp - tmp))) | ||||||
|             return (NULL); |             return (NULL); | ||||||
|           tp += strlen(tp); |           tp += strlen(tp); | ||||||
|           break; |           break; | ||||||
|         } |         } | ||||||
|         tp += SPRINTF((tp, "%x", words[i])); |         tp += SPRINTF((tp, "%lx", words[i])); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   /* Was it a trailing run of 0x00's? */ |   /* 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) |   if ((size_t)(tp - tmp) > size) | ||||||
|     { |     { | ||||||
|       errno = ENOSPC; |       SET_ERRNO(ENOSPC); | ||||||
|       return (NULL); |       return (NULL); | ||||||
|     } |     } | ||||||
|   strcpy(dst, tmp); |   strcpy(dst, tmp); | ||||||
|   | |||||||
| @@ -1,3 +1,6 @@ | |||||||
|  | #ifndef __ARES_INET_NTOP_H | ||||||
|  | #define __ARES_INET_NTOP_H | ||||||
|  |  | ||||||
| /* $Id$ */ | /* $Id$ */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -14,13 +17,10 @@ | |||||||
|  * without express or implied warranty. |  * without express or implied warranty. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef INET_NTOP_H | #if defined(HAVE_INET_NTOP) && defined(HAVE_INET_NTOP_IPV6) | ||||||
| #define INET_NTOP_H |  | ||||||
|  |  | ||||||
| #ifdef HAVE_INET_NTOP |  | ||||||
| #define ares_inet_ntop(w,x,y,z) inet_ntop(w,x,y,z) | #define ares_inet_ntop(w,x,y,z) inet_ntop(w,x,y,z) | ||||||
| #else | #else | ||||||
| const char *ares_inet_ntop(int af, const void *src, char *dst, size_t size); | const char *ares_inet_ntop(int af, const void *src, char *dst, size_t size); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* INET_NET_NTOP_H */ | #endif /* __ARES_INET_NTOP_H */ | ||||||
|   | |||||||
| @@ -7,7 +7,9 @@ | |||||||
|    port build */ |    port build */ | ||||||
|  |  | ||||||
| #ifndef NETWARE | #ifndef NETWARE | ||||||
|  | #ifndef __CYGWIN__ | ||||||
| #include <windows.h> | #include <windows.h> | ||||||
|  | #endif | ||||||
| #include <process.h> /* for the _getpid() proto */ | #include <process.h> /* for the _getpid() proto */ | ||||||
| #endif  /* !NETWARE */ | #endif  /* !NETWARE */ | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| @@ -16,11 +18,6 @@ | |||||||
|  |  | ||||||
| #define MAXHOSTNAMELEN 256 | #define MAXHOSTNAMELEN 256 | ||||||
|  |  | ||||||
| #define EINPROGRESS WSAEINPROGRESS |  | ||||||
| #define EWOULDBLOCK WSAEWOULDBLOCK |  | ||||||
| #define EMSGSIZE     WSAEMSGSIZE |  | ||||||
| #define EAFNOSUPPORT WSAEAFNOSUPPORT |  | ||||||
|  |  | ||||||
| /* Structure for scatter/gather I/O.  */ | /* Structure for scatter/gather I/O.  */ | ||||||
| struct iovec | struct iovec | ||||||
| { | { | ||||||
| @@ -28,7 +25,9 @@ struct iovec | |||||||
|     size_t iov_len;     /* Length of data.  */ |     size_t iov_len;     /* Length of data.  */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | #ifndef __WATCOMC__ | ||||||
| #define getpid() _getpid() | #define getpid() _getpid() | ||||||
|  | #endif | ||||||
|  |  | ||||||
| int ares_writev (SOCKET s, const struct iovec *vector, size_t count); | int ares_writev (SOCKET s, const struct iovec *vector, size_t count); | ||||||
| #define writev(s,vect,count)  ares_writev(s,vect,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 | #ifndef __ARES_SETUP_H | ||||||
| #define __ARES_SETUP_H | #define __ARES_SETUP_H | ||||||
|  |  | ||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* Copyright (C) 2004 - 2005 by Daniel Stenberg et al | /* Copyright (C) 2004 - 2005 by Daniel Stenberg et al | ||||||
|  * |  * | ||||||
|  * Permission to use, copy, modify, and distribute this software and its |  * Permission to use, copy, modify, and distribute this software and its | ||||||
| @@ -43,7 +45,11 @@ | |||||||
|  * Include header files for windows builds before redefining anything. |  * Include header files for windows builds before redefining anything. | ||||||
|  * Use this preproessor block only to include or exclude windows.h, |  * Use this preproessor block only to include or exclude windows.h, | ||||||
|  * winsock2.h, ws2tcpip.h or winsock.h. Any other windows thing belongs |  * 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 | #ifdef HAVE_WINDOWS_H | ||||||
| @@ -63,6 +69,22 @@ | |||||||
| #  endif | #  endif | ||||||
| #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 |  * Work-arounds for systems without configure support | ||||||
|  */ |  */ | ||||||
| @@ -99,7 +121,7 @@ | |||||||
|  * Typedef our socket type |  * Typedef our socket type | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(WATT32) | #ifdef USE_WINSOCK | ||||||
| typedef SOCKET ares_socket_t; | typedef SOCKET ares_socket_t; | ||||||
| #define ARES_SOCKET_BAD INVALID_SOCKET | #define ARES_SOCKET_BAD INVALID_SOCKET | ||||||
| #else | #else | ||||||
| @@ -111,7 +133,7 @@ typedef int ares_socket_t; | |||||||
|  * Assume a few thing unless they're set by configure |  * Assume a few thing unless they're set by configure | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) | #if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__) | ||||||
| #define HAVE_SYS_TIME_H | #define HAVE_SYS_TIME_H | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -145,4 +167,12 @@ int ares_strcasecmp(const char *s1, const char *s2); | |||||||
| #endif | #endif | ||||||
| #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 */ | #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 | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\ares_getsock.c | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
| SOURCE=..\..\ares_init.c | SOURCE=..\..\ares_init.c | ||||||
| # End Source File | # End Source File | ||||||
| # Begin Source File | # Begin Source File | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| #include "setup.h" | #include "setup.h" | ||||||
|  |  | ||||||
|  | /* $Id$ */ | ||||||
|  |  | ||||||
| /* only do the following on windows | /* only do the following on windows | ||||||
|  */ |  */ | ||||||
| #if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) | #if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) | ||||||
| @@ -18,6 +20,20 @@ | |||||||
| #include "ares.h" | #include "ares.h" | ||||||
| #include "ares_private.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__ | #ifndef __MINGW32__ | ||||||
| int | int | ||||||
| ares_strncasecmp(const char *a, const char *b, int n) | 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; |     int i; | ||||||
|  |  | ||||||
|     for (i = 0; i < n; i++) { |     for (i = 0; i < n; i++) { | ||||||
|         int c1 = isupper(a[i]) ? tolower(a[i]) : a[i]; |         int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i]; | ||||||
|         int c2 = isupper(b[i]) ? tolower(b[i]) : b[i]; |         int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i]; | ||||||
|         if (c1 != c2) return c1-c2; |         if (c1 != c2) return c1-c2; | ||||||
|     } |     } | ||||||
|     return 0; |     return 0; | ||||||
| @@ -89,7 +105,7 @@ ares_writev (ares_socket_t s, const struct iovec *vector, size_t count) | |||||||
|   buffer = bp = (char*) alloca (bytes); |   buffer = bp = (char*) alloca (bytes); | ||||||
|   if (!buffer) |   if (!buffer) | ||||||
|   { |   { | ||||||
|     errno = ENOMEM; |     SET_ERRNO(ENOMEM); | ||||||
|     return (-1); |     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); |     memcpy (bp, vector[i].iov_base, vector[i].iov_len); | ||||||
|     bp += 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 */ | #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 | # This software is licensed as described in the file COPYING, which | ||||||
| # you should have received as part of this distribution. The terms | # you should have received as part of this distribution. The terms | ||||||
| @@ -140,7 +140,7 @@ else | |||||||
|   libtoolize=`findtool $LIBTOOLIZE` |   libtoolize=`findtool $LIBTOOLIZE` | ||||||
| fi | 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 | if test -z "$lt_pversion"; then | ||||||
|   echo "buildconf: libtool not found." |   echo "buildconf: libtool not found." | ||||||
|   echo "            You need libtool version $LIBTOOL_WANTED_VERSION or newer installed" |   echo "            You need libtool version $LIBTOOL_WANTED_VERSION or newer installed" | ||||||
|   | |||||||
| @@ -5,7 +5,6 @@ REM $Date$ | |||||||
|  |  | ||||||
| REM create ca-bundle.h | REM create ca-bundle.h | ||||||
| echo /* This file is generated automatically */ >lib\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 | REM create hugehelp.c | ||||||
| copy src\hugehelp.c.cvs src\hugehelp.c | copy src\hugehelp.c.cvs src\hugehelp.c | ||||||
|   | |||||||
							
								
								
									
										542
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										542
									
								
								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 | # This software is licensed as described in the file COPYING, which | ||||||
| # you should have received as part of this distribution. The terms | # you should have received as part of this distribution. The terms | ||||||
| @@ -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/]) | AC_INIT(curl, [-], [a suitable curl mailing list => http://curl.haxx.se/mail/]) | ||||||
|  |  | ||||||
| dnl configure script copyright | 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  | This configure script may be copied, distributed and modified under the  | ||||||
| terms of the curl license; see COPYING for more details]) | terms of the curl license; see COPYING for more details]) | ||||||
|  |  | ||||||
| @@ -78,6 +78,7 @@ AC_SUBST(PKGADD_VENDOR) | |||||||
| dnl | dnl | ||||||
| dnl initialize all the info variables | dnl initialize all the info variables | ||||||
|     curl_ssl_msg="no      (--with-ssl / --with-gnutls)" |     curl_ssl_msg="no      (--with-ssl / --with-gnutls)" | ||||||
|  |     curl_ssh_msg="no      (--with-libssh2)" | ||||||
|    curl_zlib_msg="no      (--with-zlib)" |    curl_zlib_msg="no      (--with-zlib)" | ||||||
|    curl_krb4_msg="no      (--with-krb4*)" |    curl_krb4_msg="no      (--with-krb4*)" | ||||||
|     curl_gss_msg="no      (--with-gssapi)" |     curl_gss_msg="no      (--with-gssapi)" | ||||||
| @@ -89,6 +90,11 @@ dnl initialize all the info variables | |||||||
| curl_verbose_msg="enabled (--disable-verbose)" | curl_verbose_msg="enabled (--disable-verbose)" | ||||||
|    curl_sspi_msg="no      (--enable-sspi)" |    curl_sspi_msg="no      (--enable-sspi)" | ||||||
|  |  | ||||||
|  | dnl | ||||||
|  | dnl Save anything in $LIBS for later | ||||||
|  | dnl | ||||||
|  | ALL_LIBS=$LIBS | ||||||
|  |  | ||||||
| dnl | dnl | ||||||
| dnl Detect the canonical host and target build environment | dnl Detect the canonical host and target build environment | ||||||
| dnl | dnl | ||||||
| @@ -106,9 +112,33 @@ AC_PROG_CC | |||||||
| dnl check for how to do large files | dnl check for how to do large files | ||||||
| AC_SYS_LARGEFILE | AC_SYS_LARGEFILE | ||||||
|  |  | ||||||
| dnl check for cygwin stuff | dnl support building of Windows DLLs | ||||||
| AC_LIBTOOL_WIN32_DLL | 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 | dnl libtool setup | ||||||
| AC_PROG_LIBTOOL | AC_PROG_LIBTOOL | ||||||
|  |  | ||||||
| @@ -157,6 +187,15 @@ case $host in | |||||||
|     ;; |     ;; | ||||||
| esac | 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 The install stuff has already been taken care of by the automake stuff | ||||||
| dnl AC_PROG_INSTALL | dnl AC_PROG_INSTALL | ||||||
| AC_PROG_MAKE_SET | AC_PROG_MAKE_SET | ||||||
| @@ -373,6 +412,21 @@ then | |||||||
|              ) |              ) | ||||||
| fi | 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" | if test "$HAVE_GETHOSTBYNAME" != "1" | ||||||
| then | then | ||||||
|   dnl gethostbyname in the net lib - for BeOS |   dnl gethostbyname in the net lib - for BeOS | ||||||
| @@ -402,15 +456,20 @@ fi | |||||||
| dnl socket lib? | dnl socket lib? | ||||||
| AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ]) | AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ]) | ||||||
|  |  | ||||||
| dnl dl lib? | dnl ********************************************************************** | ||||||
| AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ]) | 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_MSG_CHECKING([whether to use libgcc]) | ||||||
| AC_ARG_ENABLE(libgcc, | AC_ARG_ENABLE(libgcc, | ||||||
| AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]), | AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]), | ||||||
| [ case "$enableval" in | [ case "$enableval" in | ||||||
|   yes) |   yes) | ||||||
|         LIBS="$LIBS -lgcc" |         ALL_LIBS="$ALL_LIBS -lgcc" | ||||||
|        AC_MSG_RESULT(yes) |        AC_MSG_RESULT(yes) | ||||||
|        ;; |        ;; | ||||||
|   *)   AC_MSG_RESULT(no) |   *)   AC_MSG_RESULT(no) | ||||||
| @@ -419,6 +478,9 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]), | |||||||
|        AC_MSG_RESULT(no) |        AC_MSG_RESULT(no) | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | dnl dl lib? | ||||||
|  | AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ]) | ||||||
|  |  | ||||||
| dnl ********************************************************************** | dnl ********************************************************************** | ||||||
| dnl Check for the name of dynamic OpenLDAP libraries | dnl Check for the name of dynamic OpenLDAP libraries | ||||||
| dnl ********************************************************************** | dnl ********************************************************************** | ||||||
| @@ -537,10 +599,6 @@ main() | |||||||
|  |  | ||||||
| if test "$ipv6" = "yes"; then | if test "$ipv6" = "yes"; then | ||||||
|   curl_ipv6_msg="enabled" |   curl_ipv6_msg="enabled" | ||||||
|  |  | ||||||
|   CURL_CHECK_WORKING_GETADDRINFO |  | ||||||
|  |  | ||||||
|   CURL_CHECK_NI_WITHSCOPEID |  | ||||||
| fi | fi | ||||||
|  |  | ||||||
| dnl ********************************************************************** | dnl ********************************************************************** | ||||||
| @@ -736,7 +794,7 @@ AC_ARG_WITH(gssapi-includes, | |||||||
| AC_ARG_WITH(gssapi-libs, | AC_ARG_WITH(gssapi-libs, | ||||||
|   AC_HELP_STRING([--with-gssapi-libs=DIR], |   AC_HELP_STRING([--with-gssapi-libs=DIR], | ||||||
|   		 [Specify location of GSSAPI libs]), |   		 [Specify location of GSSAPI libs]), | ||||||
|   [ GSSAPI_LIBS="-L$withval" |   [ GSSAPI_LIB_DIR="-L$withval" | ||||||
|     want_gss="yes" ] |     want_gss="yes" ] | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -1010,12 +1068,35 @@ if test X"$OPT_SSL" != Xno; then | |||||||
|               ]) |               ]) | ||||||
|  |  | ||||||
|     dnl these can only exist if openssl exists |     dnl these can only exist if openssl exists | ||||||
|  |     dnl yassl doesn't have SSL_get_shutdown | ||||||
|  |  | ||||||
|     AC_CHECK_FUNCS( RAND_status \ |     AC_CHECK_FUNCS( RAND_status \ | ||||||
|                     RAND_screen \ |                     RAND_screen \ | ||||||
|                     RAND_egd \ |                     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 |   fi | ||||||
|  |  | ||||||
|   if test "$OPENSSL_ENABLED" = "1"; then |   if test "$OPENSSL_ENABLED" = "1"; then | ||||||
| @@ -1032,6 +1113,152 @@ if test X"$OPT_SSL" != Xno; then | |||||||
|  |  | ||||||
| fi | 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 ********************************************************************** | ||||||
| dnl Check for the random seed preferences  | dnl Check for the random seed preferences  | ||||||
| dnl ********************************************************************** | dnl ********************************************************************** | ||||||
| @@ -1110,6 +1337,7 @@ if test "$OPENSSL_ENABLED" != "1"; then | |||||||
|        [ |        [ | ||||||
|        AC_DEFINE(USE_GNUTLS, 1, [if GnuTLS is enabled]) |        AC_DEFINE(USE_GNUTLS, 1, [if GnuTLS is enabled]) | ||||||
|        AC_SUBST(USE_GNUTLS, [1]) |        AC_SUBST(USE_GNUTLS, [1]) | ||||||
|  |        GNUTLS_ENABLED = 1 | ||||||
|        USE_GNUTLS="yes" |        USE_GNUTLS="yes" | ||||||
|        curl_ssl_msg="enabled (GnuTLS)" |        curl_ssl_msg="enabled (GnuTLS)" | ||||||
|        ], |        ], | ||||||
| @@ -1135,13 +1363,85 @@ if test "$OPENSSL_ENABLED" != "1"; then | |||||||
|  |  | ||||||
|   fi dnl GNUTLS not disabled |   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 |  | ||||||
|  |  | ||||||
| fi dnl OPENSSL != 1 | 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 | ||||||
|  |    | ||||||
|  |       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 ********************************************************************** | ||||||
| dnl Check for the CA bundle | dnl Check for the CA bundle | ||||||
| dnl ********************************************************************** | dnl ********************************************************************** | ||||||
| @@ -1171,93 +1471,10 @@ fi dnl only done if some kind of SSL was enabled | |||||||
|  |  | ||||||
| AM_CONDITIONAL(CABUNDLE, test x$ca != xno) | AM_CONDITIONAL(CABUNDLE, test x$ca != xno) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|    |  | ||||||
| dnl ********************************************************************** | dnl ********************************************************************** | ||||||
| dnl Check for the presence of ZLIB libraries and headers | dnl Check for the presence of IDN libraries and headers | ||||||
| dnl ********************************************************************** | 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_MSG_CHECKING([whether to build with libidn]) | ||||||
| AC_ARG_WITH(libidn, | AC_ARG_WITH(libidn, | ||||||
| AC_HELP_STRING([--with-libidn=PATH],[Enable libidn usage]) | AC_HELP_STRING([--with-libidn=PATH],[Enable libidn usage]) | ||||||
| @@ -1386,6 +1603,10 @@ if test "x$RECENTAIX" = "xyes"; then | |||||||
|          XLC="yes" |          XLC="yes" | ||||||
|          AC_MSG_RESULT([yes]) |          AC_MSG_RESULT([yes]) | ||||||
|          CFLAGS="$CFLAGS -qthreaded" |          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 |   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 10.20 is known to have a buggy one. If it doesn't work, disable use of | ||||||
|     dnl it. |     dnl it. | ||||||
|  |  | ||||||
| @@ -1447,6 +1668,7 @@ dnl ********************************************************************** | |||||||
| dnl Checks for header files. | dnl Checks for header files. | ||||||
| AC_HEADER_STDC | AC_HEADER_STDC | ||||||
|  |  | ||||||
|  | CURL_CHECK_HEADER_MALLOC | ||||||
|  |  | ||||||
| dnl Now check for the very most basic headers. Then we can use these | dnl Now check for the very most basic headers. Then we can use these | ||||||
| dnl ones as default-headers when checking for the rest! | dnl ones as default-headers when checking for the rest! | ||||||
| @@ -1458,7 +1680,6 @@ AC_CHECK_HEADERS( | |||||||
|         sys/ioctl.h \ |         sys/ioctl.h \ | ||||||
|         assert.h \ |         assert.h \ | ||||||
|         unistd.h \ |         unistd.h \ | ||||||
|         malloc.h \ |  | ||||||
|         stdlib.h \ |         stdlib.h \ | ||||||
|         limits.h \ |         limits.h \ | ||||||
|         arpa/inet.h \ |         arpa/inet.h \ | ||||||
| @@ -1485,6 +1706,7 @@ AC_CHECK_HEADERS( | |||||||
|         libgen.h \ |         libgen.h \ | ||||||
|         locale.h \ |         locale.h \ | ||||||
|         errno.h \ |         errno.h \ | ||||||
|  |         stdbool.h \ | ||||||
|         arpa/tftp.h \ |         arpa/tftp.h \ | ||||||
|         sys/filio.h \ |         sys/filio.h \ | ||||||
|         setjmp.h, |         setjmp.h, | ||||||
| @@ -1514,8 +1736,11 @@ dnl default includes | |||||||
|  |  | ||||||
| dnl Checks for typedefs, structures, and compiler characteristics. | dnl Checks for typedefs, structures, and compiler characteristics. | ||||||
| AC_C_CONST | AC_C_CONST | ||||||
|  | CURL_CHECK_VARIADIC_MACROS | ||||||
| AC_TYPE_SIZE_T | AC_TYPE_SIZE_T | ||||||
| AC_HEADER_TIME | AC_HEADER_TIME | ||||||
|  | CURL_CHECK_STRUCT_TIMEVAL | ||||||
|  | CURL_VERIFY_RUNTIMELIBS | ||||||
|  |  | ||||||
| AC_CHECK_SIZEOF(curl_off_t, ,[ | AC_CHECK_SIZEOF(curl_off_t, ,[ | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| @@ -1544,6 +1769,19 @@ fi | |||||||
| AC_CHECK_TYPE(ssize_t, , | AC_CHECK_TYPE(ssize_t, , | ||||||
|    AC_DEFINE(ssize_t, int, [the signed version of size_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 | # Check for socklen_t or equivalent | ||||||
| CURL_CHECK_TYPE_SOCKLEN_T | CURL_CHECK_TYPE_SOCKLEN_T | ||||||
|  |  | ||||||
| @@ -1551,11 +1789,21 @@ TYPE_IN_ADDR_T | |||||||
|  |  | ||||||
| TYPE_SOCKADDR_STORAGE | TYPE_SOCKADDR_STORAGE | ||||||
|  |  | ||||||
|  | TYPE_SIG_ATOMIC_T | ||||||
|  |  | ||||||
|  | AC_TYPE_SIGNAL | ||||||
|  |  | ||||||
| AC_FUNC_SELECT_ARGTYPES | AC_FUNC_SELECT_ARGTYPES | ||||||
|  |  | ||||||
|  | CURL_CHECK_FUNC_RECV | ||||||
|  |  | ||||||
|  | CURL_CHECK_FUNC_SEND | ||||||
|  |  | ||||||
|  | CURL_CHECK_MSG_NOSIGNAL | ||||||
|  |  | ||||||
| dnl Checks for library functions. | dnl Checks for library functions. | ||||||
| dnl AC_PROG_GCC_TRADITIONAL | dnl AC_PROG_GCC_TRADITIONAL | ||||||
| AC_TYPE_SIGNAL |  | ||||||
| dnl AC_FUNC_VPRINTF | dnl AC_FUNC_VPRINTF | ||||||
| case $host in | case $host in | ||||||
|   *msdosdjgpp) |   *msdosdjgpp) | ||||||
| @@ -1599,7 +1847,8 @@ AC_CHECK_FUNCS( strtoll \ | |||||||
|                 getprotobyname \ |                 getprotobyname \ | ||||||
|                 getrlimit \ |                 getrlimit \ | ||||||
|                 setrlimit \ |                 setrlimit \ | ||||||
|                 fork, |                 fork \ | ||||||
|  |                 setmode, | ||||||
| dnl if found | dnl if found | ||||||
| [], | [], | ||||||
| dnl if not found, $ac_func is the name we check for | dnl if not found, $ac_func is the name we check for | ||||||
| @@ -1689,6 +1938,11 @@ dnl Check if the getnameinfo function is available | |||||||
| dnl and get the types of five of its arguments. | dnl and get the types of five of its arguments. | ||||||
| CURL_CHECK_FUNC_GETNAMEINFO | 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)]) | AC_MSG_CHECKING([if we are Mac OS X (to disable poll)]) | ||||||
| disable_poll=no | disable_poll=no | ||||||
| case $host in | case $host in | ||||||
| @@ -1870,19 +2124,26 @@ AC_HELP_STRING([--disable-verbose],[Disable verbose strings]), | |||||||
|        AC_MSG_RESULT(yes) |        AC_MSG_RESULT(yes) | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | CURL_CHECK_NATIVE_WINDOWS | ||||||
|  |  | ||||||
| dnl ************************************************************ | dnl ************************************************************ | ||||||
| dnl enable SSPI support | dnl enable SSPI support | ||||||
| dnl | 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_ARG_ENABLE(sspi, | ||||||
| AC_HELP_STRING([--enable-sspi],[Enable SSPI]) | AC_HELP_STRING([--enable-sspi],[Enable SSPI]) | ||||||
| AC_HELP_STRING([--disable-sspi],[Disable SSPI]), | AC_HELP_STRING([--disable-sspi],[Disable SSPI]), | ||||||
| [ case "$enableval" in | [ case "$enableval" in | ||||||
|   yes) |   yes) | ||||||
|        AC_MSG_RESULT(yes) |        if test "$ac_cv_native_windows" = "yes"; then | ||||||
|        AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support]) |          AC_MSG_RESULT(yes) | ||||||
|        AC_SUBST(USE_WINDOWS_SSPI) |          AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support]) | ||||||
|        curl_sspi_msg="yes" |          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) |        AC_MSG_RESULT(no) | ||||||
| @@ -1954,6 +2215,52 @@ AC_HELP_STRING([--disable-cookies],[Disable cookies support]), | |||||||
|        AC_MSG_RESULT(yes) |        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 | if test "x$ws2" = "xyes"; then | ||||||
|  |  | ||||||
|   dnl If ws2_32 is wanted, make sure it is the _last_ lib in LIBS (makes |   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. |   dnl end. | ||||||
|  |  | ||||||
|   LIBS="$LIBS -lws2_32" |   LIBS="$LIBS -lws2_32" | ||||||
|  |   TEST_SERVER_LIBS="$TEST_SERVER_LIBS -lws2_32" | ||||||
|  |  | ||||||
| fi | 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) | AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes) | ||||||
|  |  | ||||||
| AC_CONFIG_FILES([Makefile \ | AC_CONFIG_FILES([Makefile \ | ||||||
| @@ -2006,6 +2327,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl: | |||||||
|   Install prefix:  ${prefix} |   Install prefix:  ${prefix} | ||||||
|   Compiler:        ${CC} |   Compiler:        ${CC} | ||||||
|   SSL support:     ${curl_ssl_msg} |   SSL support:     ${curl_ssl_msg} | ||||||
|  |   SSH support:     ${curl_ssh_msg} | ||||||
|   zlib support:    ${curl_zlib_msg} |   zlib support:    ${curl_zlib_msg} | ||||||
|   krb4 support:    ${curl_krb4_msg} |   krb4 support:    ${curl_krb4_msg} | ||||||
|   GSSAPI support:  ${curl_gss_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 | # This software is licensed as described in the file COPYING, which | ||||||
| # you should have received as part of this distribution. The terms | # you should have received as part of this distribution. The terms | ||||||
| @@ -181,8 +181,17 @@ while test $# -gt 0; do | |||||||
|        	;; |        	;; | ||||||
|  |  | ||||||
|     --libs) |     --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 | ||||||
|  | 	;; | ||||||
|  |  | ||||||
|     *) |     *) | ||||||
|         echo "unknown option: $1" |         echo "unknown option: $1" | ||||||
|   | |||||||
| @@ -46,8 +46,8 @@ Cocoa | |||||||
|  |  | ||||||
| D | D | ||||||
|  |  | ||||||
|   Written by Charles Sanders and James Wavro |   Written by Kenneth Bogert | ||||||
|   http://www.atari-soldiers.com/libcurl.html |   http://curl.haxx.se/libcurl/d/ | ||||||
|  |  | ||||||
| Dylan | Dylan | ||||||
|  |  | ||||||
| @@ -142,8 +142,8 @@ Rexx | |||||||
|  |  | ||||||
| Ruby | Ruby | ||||||
|  |  | ||||||
|   Written by Hirotaka Matsuyuki |   Written by Ross Bamford | ||||||
|   http://www.d1.dion.ne.jp/~matuyuki/ruby.html |   http://curb.rubyforge.org/ | ||||||
|  |  | ||||||
| Scheme | Scheme | ||||||
|  |  | ||||||
| @@ -155,6 +155,11 @@ S-Lang | |||||||
|   S-Lang binding written by John E Davis |   S-Lang binding written by John E Davis | ||||||
|   http://www.jedsoft.org/slang/modules/curl.html |   http://www.jedsoft.org/slang/modules/curl.html | ||||||
|  |  | ||||||
|  | Smalltalk | ||||||
|  |  | ||||||
|  |   Smalltalk binding written by Danil Osipchuk | ||||||
|  |   http://www.squeaksource.com/CurlPlugin/ | ||||||
|  |  | ||||||
| SPL | SPL | ||||||
|  |  | ||||||
|   SPL binding written by Clifford Wolf |   SPL binding written by Clifford Wolf | ||||||
| @@ -177,7 +182,7 @@ Q | |||||||
| wxWidgets | wxWidgets | ||||||
|  |  | ||||||
|   Written by Casey O'Donnell |   Written by Casey O'Donnell | ||||||
|   http://homepage.mac.com/codonnell/wxcurldav/ |   http://wxcode.sourceforge.net/components/wxcurl/ | ||||||
|  |  | ||||||
| XBLite | XBLite | ||||||
|  |  | ||||||
|   | |||||||
| @@ -17,7 +17,9 @@ Join the Community | |||||||
|  you start sending patches! We prefer patches and discussions being held on |  you start sending patches! We prefer patches and discussions being held on | ||||||
|  the mailing list(s), not sent to individuals. |  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 |  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 |  the same license curl and libcurl is already using unless stated and agreed | ||||||
| @@ -43,9 +45,10 @@ The License Issue | |||||||
|  |  | ||||||
| What To Read | What To Read | ||||||
|  |  | ||||||
|  Source code, the man pages, the INTERNALS document, the TODO, the most recent |  Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS, the | ||||||
|  CHANGES. Just lurking on the libcurl mailing list is gonna give you a lot of |  most recent CHANGES. Just lurking on the libcurl mailing list is gonna give | ||||||
|  insights on what's going on right now. Asking there is a good idea too. |  you a lot of insights on what's going on right now. Asking there is a good | ||||||
|  |  idea too. | ||||||
|  |  | ||||||
| Naming | Naming | ||||||
|  |  | ||||||
| @@ -170,3 +173,21 @@ How To Make a Patch | |||||||
|  |  | ||||||
|         http://gnuwin32.sourceforge.net/packages/patch.htm |         http://gnuwin32.sourceforge.net/packages/patch.htm | ||||||
|         http://gnuwin32.sourceforge.net/packages/diffutils.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> |   Author: Daniel Stenberg <daniel@haxx.se> | ||||||
|   URL: http://curl.haxx.se/legal/distro-dilemma.html |   URL: http://curl.haxx.se/legal/distro-dilemma.html | ||||||
|  |  | ||||||
| Condition | Condition | ||||||
|  |  | ||||||
|  This document is written to describe the situation as it is right |  This document is written to describe the situation as it is right now. | ||||||
|  now. libcurl 7.15.3 is currently the latest version available. Things may of |  libcurl 7.16.1 is currently the latest version available. Things may of | ||||||
|  course change in the future. |  course change in the future. | ||||||
|  |  | ||||||
|  This document reflects my view and understanding of these things. Please tell |  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 |  Debian does however not take this stance and has officially(?) claimed that | ||||||
|  OpenSSL is not a required part of the Debian operating system |  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 | GnuTLS | ||||||
|  |  | ||||||
|  With the release of libcurl 7.14.0 (May 2005), libcurl can now get built to |  Since May 2005 libcurl can get built to use GnuTLS instead of OpenSSL. GnuTLS | ||||||
|  use GnuTLS instead of OpenSSL. GnuTLS is an LGPL[7] licensed library that |  is an LGPL[7] licensed library that offers a matching set of features as | ||||||
|  offers a matching set of features as OpenSSL does. Now, you can build and |  OpenSSL does. Now, you can build and distribute an TLS/SSL capable libcurl | ||||||
|  distribute an TLS/SSL capable libcurl without including any Original BSD |  without including any Original BSD licensed code. | ||||||
|  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 |  libcurl can get also get built to use yassl for the TLS/SSL layer. yassl is a | ||||||
|  libraries have features the other one lacks. libcurl does not (yet) offer a |  GPL[3] licensed library. | ||||||
|  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 | GnuTLS vs OpenSSL vs yassl | ||||||
|  equivalent code has been used and thus matured for more than seven (7) years. |  | ||||||
|  |  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 |  GnuTLS | ||||||
|    - LGPL licensened |    - LGPL licensened | ||||||
| @@ -82,7 +92,12 @@ GnuTLS vs OpenSSL | |||||||
|    - provides crypto functions libcurl uses for NTLM |    - provides crypto functions libcurl uses for NTLM | ||||||
|    - libcurl can do non-blocking connects with it in 7.15.4 and later |    - 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 |  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 |  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 |  Instead, I think we should accept the fact that the SSL/TLS libraries and | ||||||
|  their different licenses will fit different applications and their authors |  their different licenses will fit different applications and their authors | ||||||
|  differently depending on the applications' licenses and their general usage |  differently depending on the applications' licenses and their general usage | ||||||
|  pattern (considering how LGPL libraries for example can be burdensome for |  pattern (considering how GPL and LGPL libraries for example can be burdensome | ||||||
|  embedded systems usage). |  for embedded systems usage). | ||||||
|  |  | ||||||
|  In Debian land, there seems to be a common opinion that LGPL is "maximally |  In Debian land, there seems to be a common opinion that LGPL is "maximally | ||||||
|  compatible" with apps while Original BSD is not. Like this: |  compatible" with apps while Original BSD is not. Like this: | ||||||
| @@ -101,8 +116,8 @@ The Better License, Original BSD or LGPL? | |||||||
|  |  | ||||||
| More SSL Libraries | More SSL Libraries | ||||||
|  |  | ||||||
|  In libcurl, there's no stopping us here. There are at least a few more Open |  In libcurl, there's no stopping us here. There are more Open Source/Free | ||||||
|  Source/Free SSL/TLS libraries and we would very much like to support them as |  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. |  well, to offer application authors an even wider scope of choice. | ||||||
|  |  | ||||||
| Application Angle of this Problem | Application Angle of this Problem | ||||||
| @@ -137,7 +152,7 @@ Project cURL Angle of this Problem | |||||||
| Distro Angle of this Problem | Distro Angle of this Problem | ||||||
|  |  | ||||||
|  To my knowledge there is only one distro that ships libcurl built with either |  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 |  Debian Linux is now (since mid September 2005) providing two different | ||||||
|  libcurl packages, one for libcurl built with OpenSSL and one built with |  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 |  single system simultaneously. This has been said to be a transitional system | ||||||
|  not desired to keep in the long run. |  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 | Footnotes | ||||||
|  |  | ||||||
|  [1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6 |  [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 |   libcurl | ||||||
|  |  | ||||||
|     A free and easy-to-use client-side URL transfer library, supporting FTP, |     A free and easy-to-use client-side URL transfer library, supporting FTP, | ||||||
|     FTPS, HTTP, HTTPS, TELNET, DICT, FILE and LDAP.  libcurl supports |     FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE and LDAP.  libcurl | ||||||
|     HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP |     supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, | ||||||
|     form based upload, proxies, cookies, user+password authentication, file |     HTTP form based upload, proxies, cookies, user+password authentication, | ||||||
|     transfer resume, http proxy tunneling and more! |     file transfer resume, http proxy tunneling and more! | ||||||
|  |  | ||||||
|     libcurl is highly portable, it builds and works identically on numerous |     libcurl is highly portable, it builds and works identically on numerous | ||||||
|     platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, |     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. |     A command line tool for getting or sending files using URL syntax. | ||||||
|  |  | ||||||
|     Since curl uses libcurl, it supports a range of common Internet protocols, |     Since curl uses libcurl, it supports a range of common Internet protocols, | ||||||
|     currently including HTTP, HTTPS, FTP, FTPS, 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]. |   We pronounce curl and cURL with an initial k sound: [kurl]. | ||||||
|  |  | ||||||
| @@ -156,7 +157,7 @@ FAQ | |||||||
|  |  | ||||||
|   1.3 What is curl not? |   1.3 What is curl not? | ||||||
|  |  | ||||||
|   Curl is *not* a wget clone. That is a common misconception.  Never, during |   Curl is not a wget clone. That is a common misconception.  Never, during | ||||||
|   curl's development, have we intended curl to replace wget or compete on its |   curl's development, have we intended curl to replace wget or compete on its | ||||||
|   market. Curl is targeted at single-shot file transfers. |   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 |   Curl is not a PHP tool, even though it works perfectly well when used from | ||||||
|   or with PHP (when using the PHP/CURL module). |   or with PHP (when using the PHP/CURL module). | ||||||
|  |  | ||||||
|   Curl is not a single-OS program. Curl exists, compiles, builds and runs |   Curl is not a program for a single operating system. Curl exists, compiles, | ||||||
|   under a wide range of operating systems, including all modern Unixes (and a |   builds and runs under a wide range of operating systems, including all | ||||||
|   bunch of older ones too), Windows, Amiga, BeOS, OS/2, OS X, QNX etc. |   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 ? |   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 |   improvements and have them inserted in the main sources (of course on the | ||||||
|   condition that developers agree on that the fixes are good). |   condition that developers agree on that the fixes are good). | ||||||
|  |  | ||||||
|   The 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. |   file. | ||||||
|  |  | ||||||
|   curl is developed by a community, with Daniel at the wheel. |   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: |   Some facts to use as input to the math: | ||||||
|  |  | ||||||
|   curl packages have been downloaded from the curl.haxx.se site well over a |   curl packages are downloaded from the curl.haxx.se and mirrors almost one | ||||||
|   million times. curl is installed by default with most Linux |   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 |   distributions. curl is installed by default with Mac OS X. curl and libcurl | ||||||
|   as used by numerous applications that include libcurl binaries in their |   as used by numerous applications that include libcurl binaries in their | ||||||
|   distribution packages (like Adobe Acrobat Reader and Google Earth). |   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 |   products. More than 100 known named open source projects depend on | ||||||
|   (lib)curl. |   (lib)curl. | ||||||
|  |  | ||||||
| @@ -305,6 +307,9 @@ FAQ | |||||||
|   based web servers. A guess is that a fair amount of these Linux |   based web servers. A guess is that a fair amount of these Linux | ||||||
|   installations have curl installed. |   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/companies.html | ||||||
|   http://curl.haxx.se/docs/programs.html |   http://curl.haxx.se/docs/programs.html | ||||||
|   http://curl.haxx.se/libcurl/using/apps.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 |     ./configure places the -L/usr/local/ssl/lib early enough in the command | ||||||
|     line to make things work |     line to make things work | ||||||
|  |  | ||||||
|     Solution submitted by: Bob Allison <allisonb@users.sourceforge.net> |  | ||||||
|  |  | ||||||
|     2.1.2 only the libssl lib is missing |     2.1.2 only the libssl lib is missing | ||||||
|  |  | ||||||
|     If all include files and the libcrypto lib is present, with only the |     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? |   2.2 Does curl work/build with other SSL libraries? | ||||||
|  |  | ||||||
|   Curl has been written to use OpenSSL or GnuTLS, although there should not be |   Curl has been written to use OpenSSL, GnuTLS, yassl or NSS, although there | ||||||
|   many problems using a different library. If anyone does "port" curl to use a |   should not be many problems using a different library. If anyone does "port" | ||||||
|   different SSL library, we are of course very interested in getting the |   curl to use a different SSL library, we are of course very interested in | ||||||
|   patch! |   getting the patch! | ||||||
|  |  | ||||||
|   2.3 Where can I find a copy of LIBEAY32.DLL? |   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: |   install and use them, in the libcurl section of the curl web site: | ||||||
|   http://curl.haxx.se/libcurl/ |   http://curl.haxx.se/libcurl/ | ||||||
|  |  | ||||||
|   In February 2003, there are interfaces available for the following |   In February 2007, there are interfaces available for the following | ||||||
|   languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal, |   languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Dylan, Euphoria, Ferite, | ||||||
|   Pascal, Perl, PHP, PostgreSQL, Python, Rexx, Ruby, Scheme and Tcl. By the |   Gambas, glib/GTK+, Java, Lisp, Lua, Mono, .NET, Object-Pascal, O'Caml, | ||||||
|   time you read this, additional ones may have appeared! |   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? |   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 |     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? |   5.2 How can I receive all data into a large memory chunk? | ||||||
|  |  | ||||||
|   [ See also the examples/getinmemory.c source ] |   [ See also the examples/getinmemory.c source ] | ||||||
| @@ -896,8 +903,6 @@ FAQ | |||||||
|   Similarly, if you use CURLOPT_READDATA you must also specify |   Similarly, if you use CURLOPT_READDATA you must also specify | ||||||
|   CURLOPT_READFUNCTION. |   CURLOPT_READFUNCTION. | ||||||
|  |  | ||||||
|   (Provided by Joel DeYoung and Bob Schader) |  | ||||||
|  |  | ||||||
|   5.6 What about Keep-Alive or persistent connections? |   5.6 What about Keep-Alive or persistent connections? | ||||||
|  |  | ||||||
|   curl and libcurl have excellent support for persistent connections when |   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 |   options to the command line compiler. /MD (linking against MSVCRT dll) seems | ||||||
|   to be the most commonly used option. |   to be the most commonly used option. | ||||||
|  |  | ||||||
|   (Provided by Andrew Francis) |  | ||||||
|  |  | ||||||
|   When building an application that uses the static libcurl library, you must |   When building an application that uses the static libcurl library, you must | ||||||
|   add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for |   add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for | ||||||
|   dynamic import symbols. If you get linker error like "unknown symbol |   dynamic import symbols. If you get linker error like "unknown symbol | ||||||
|   | |||||||
| @@ -87,7 +87,6 @@ FTP | |||||||
|  - via http-proxy |  - via http-proxy | ||||||
|  - all operations can be tunneled through a http-proxy |  - all operations can be tunneled through a http-proxy | ||||||
|  - customizable to retrieve file modification date |  - customizable to retrieve file modification date | ||||||
|  - third party transfers |  | ||||||
|  - no dir depth limit |  - no dir depth limit | ||||||
|  |  | ||||||
| FTPS (*1) | FTPS (*1) | ||||||
| @@ -117,10 +116,10 @@ FILE | |||||||
| FOOTNOTES | FOOTNOTES | ||||||
| ========= | ========= | ||||||
|  |  | ||||||
|   *1 = requires OpenSSL or GnuTLS |   *1 = requires OpenSSL, GnuTLS or NSS | ||||||
|   *2 = requires OpenLDAP |   *2 = requires OpenLDAP | ||||||
|   *3 = requires a GSSAPI-compliant library, such as Heimdal or similar. |   *3 = requires a GSSAPI-compliant library, such as Heimdal or similar. | ||||||
|   *4 = requires FBopenssl |   *4 = requires FBopenssl | ||||||
|   *5 = requires a krb4 library, such as the MIT one or similar. |   *5 = requires a krb4 library, such as the MIT one or similar. | ||||||
|   *6 = requires c-ares |   *6 = requires c-ares | ||||||
|   *7 = requires OpenSSL specificly, as GnuTLS only supports SSLv3 and TLSv1 |   *7 = requires OpenSSL or NSS, as GnuTLS only supports SSLv3 and TLSv1 | ||||||
|   | |||||||
							
								
								
									
										193
									
								
								docs/INSTALL
									
									
									
									
									
								
							
							
						
						
									
										193
									
								
								docs/INSTALL
									
									
									
									
									
								
							| @@ -16,7 +16,6 @@ Installing Binary Packages | |||||||
|  |  | ||||||
| UNIX | UNIX | ||||||
| ==== | ==== | ||||||
|  |  | ||||||
|    A normal unix installation is made in three or four steps (after you've |    A normal unix installation is made in three or four steps (after you've | ||||||
|    unpacked the source archive): |    unpacked the source archive): | ||||||
|  |  | ||||||
| @@ -52,12 +51,12 @@ UNIX | |||||||
|    path for your compiler/linker, you don't need to do anything special. If |    path for your compiler/linker, you don't need to do anything special. If | ||||||
|    you have OpenSSL installed in /usr/local/ssl, you can run configure like: |    you have OpenSSL installed in /usr/local/ssl, you can run configure like: | ||||||
|  |  | ||||||
| 	./configure --with-ssl |         ./configure --with-ssl | ||||||
|  |  | ||||||
|    If you have OpenSSL installed somewhere else (for example, /opt/OpenSSL,) |    If you have OpenSSL installed somewhere else (for example, /opt/OpenSSL,) | ||||||
|    you can run configure like this: |    you can run configure like this: | ||||||
|  |  | ||||||
| 	./configure --with-ssl=/opt/OpenSSL |         ./configure --with-ssl=/opt/OpenSSL | ||||||
|  |  | ||||||
|    If you insist on forcing a build without SSL support, even though you may |    If you insist on forcing a build without SSL support, even though you may | ||||||
|    have OpenSSL installed in your system, you can run configure like this: |    have OpenSSL installed in your system, you can run configure like this: | ||||||
| @@ -129,19 +128,67 @@ UNIX | |||||||
|      If you're a curl developer and use gcc, you might want to enable more |      If you're a curl developer and use gcc, you might want to enable more | ||||||
|      debug options with the --enable-debug option. |      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 | 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 |    MingW32 | ||||||
|    ------- |    ------- | ||||||
|  |  | ||||||
|    Run the 'mingw32.bat' file to get the proper environment variables set, |    Run the 'mingw32.bat' file to get the proper environment variables set, | ||||||
|    then run 'make mingw32' in the root dir. Use  'make mingw32-ssl' to build |    then run 'make mingw32' in the root dir. Use 'make mingw32-ssl' to build | ||||||
|    curl SSL enabled. |    curl SSL enabled. | ||||||
|  |  | ||||||
|    If you have any problems linking libraries or finding header files, be sure |    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 |    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 |    Cygwin | ||||||
|    ------ |    ------ | ||||||
| @@ -172,7 +219,7 @@ Win32 | |||||||
|    documentation on how to compile zlib. Define the ZLIB_PATH environment |    documentation on how to compile zlib. Define the ZLIB_PATH environment | ||||||
|    variable to the location of zlib.h and zlib.lib, for example: |    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. |    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 |    Before running nmake define the OPENSSL_PATH environment variable with | ||||||
|    the root/base directory of OpenSSL, for example: |    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 |    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 |    directory.  'nmake vc-ssl' will create a libcurl static and dynamic | ||||||
| @@ -280,7 +327,6 @@ Win32 | |||||||
|  |  | ||||||
| IBM OS/2 | IBM OS/2 | ||||||
| ======== | ======== | ||||||
|  |  | ||||||
|    Building under OS/2 is not much different from building under unix. |    Building under OS/2 is not much different from building under unix. | ||||||
|    You need: |    You need: | ||||||
|  |  | ||||||
| @@ -308,6 +354,7 @@ IBM OS/2 | |||||||
|    If you're getting huge binaries, probably your makefiles have the -g in |    If you're getting huge binaries, probably your makefiles have the -g in | ||||||
|    CFLAGS. |    CFLAGS. | ||||||
|  |  | ||||||
|  |  | ||||||
| VMS | VMS | ||||||
| === | === | ||||||
|    (The VMS section is in whole contributed by the friendly Nico Baggus) |    (The VMS section is in whole contributed by the friendly Nico Baggus) | ||||||
| @@ -378,6 +425,7 @@ VMS | |||||||
|    13-jul-2001 |    13-jul-2001 | ||||||
|    N. Baggus |    N. Baggus | ||||||
|  |  | ||||||
|  |  | ||||||
| QNX | QNX | ||||||
| === | === | ||||||
|    (This section was graciously brought to us by David Bentham) |    (This section was graciously brought to us by David Bentham) | ||||||
| @@ -429,17 +477,16 @@ AmigaOS | |||||||
|  |  | ||||||
| NetWare | NetWare | ||||||
| ======= | ======= | ||||||
|  |  | ||||||
|    To compile curl.nlm / libcurl.nlm you need: |    To compile curl.nlm / libcurl.nlm you need: | ||||||
|    - either any gcc / nlmconv, or CodeWarrior 7 PDK 4 or later. |    - either any gcc / nlmconv, or CodeWarrior 7 PDK 4 or later. | ||||||
|    - gnu make and awk running on the platform you compile on; |    - gnu make and awk running on the platform you compile on; | ||||||
|      native Win32 versions can be downloaded from: |      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: |    - recent Novell LibC SDK available from: | ||||||
|      http://developer.novell.com/ndk/libc.htm |      http://developer.novell.com/ndk/libc.htm | ||||||
|    - optional zlib sources (at the moment only dynamic linking with zlib.imp); |    - optional zlib sources (at the moment only dynamic linking with zlib.imp); | ||||||
|      sources with NetWare Makefile can be obtained from: |      sources with NetWare Makefile can be obtained from: | ||||||
|      http://www.gknw.com/mirror/zlib/ |      http://www.gknw.net/mirror/zlib/ | ||||||
|    - optional OpenSSL sources (version 0.9.8 or later which builds with BSD); |    - 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 |    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... |    with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked... | ||||||
|    Any help in testing appreciated! |    Any help in testing appreciated! | ||||||
|    Builds automatically created 8 times a day from current CVS are here: |    Builds automatically created 8 times a day from current CVS are here: | ||||||
|    http://www.gknw.com/mirror/curl/autobuilds/ |    http://www.gknw.net/mirror/curl/autobuilds/ | ||||||
|    the status of these builds can be viewed at the autobuild table: |    the status of these builds can be viewed at the autobuild table: | ||||||
|    http://curl.haxx.se/auto/ |    http://curl.haxx.se/auto/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 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 | CROSS COMPILE | ||||||
| ============= | ============= | ||||||
|  |  | ||||||
|    (This section was graciously brought to us by Jim Duey, with additions by |    (This section was graciously brought to us by Jim Duey, with additions by | ||||||
|    Dan Fandrich) |    Dan Fandrich) | ||||||
|  |  | ||||||
| @@ -506,13 +640,17 @@ CROSS COMPILE | |||||||
|  |  | ||||||
|        ./configure --host=ARCH-OS |        ./configure --host=ARCH-OS | ||||||
|  |  | ||||||
|  |  | ||||||
|  | REDUCING SIZE | ||||||
|  | ============= | ||||||
|    There are a number of configure options that can be used to reduce the |    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 |    size of libcurl for embedded applications where binary size is an | ||||||
|    important factor.  First, be sure to set the CFLAGS environment variable |    important factor.  First, be sure to set the CFLAGS variable when | ||||||
|    when configuring with any compiler optimization flags to reduce the |    configuring with any relevant compiler optimization flags to reduce the | ||||||
|    size of the binary.  For gcc, this would mean at minimum: |    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 |    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 |    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-crypto-auth (disables HTTP cryptographic authentication) | ||||||
|      --disable-ipv6 (disables support for IPv6) |      --disable-ipv6 (disables support for IPv6) | ||||||
|      --disable-verbose (eliminates debugging strings and error code strings) |      --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-libidn (disables support for the libidn DNS library) | ||||||
|      --without-ssl (disables support for SSL/TLS) |      --without-ssl (disables support for SSL/TLS) | ||||||
|      --without-zlib (disables support for on-the-fly decompression) |      --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 |    You may find that statically linking libcurl to your application will | ||||||
|    result in a lower total size. |    result in a lower total size. | ||||||
|  |  | ||||||
| @@ -559,6 +711,7 @@ PORTS | |||||||
|         - PowerPC Linux |         - PowerPC Linux | ||||||
|         - PowerPC Mac OS 9 |         - PowerPC Mac OS 9 | ||||||
|         - PowerPC Mac OS X |         - PowerPC Mac OS X | ||||||
|  |         - SuperH4 Linux 2.6.X | ||||||
|         - SINIX-Z v5 |         - SINIX-Z v5 | ||||||
|         - Sparc Linux |         - Sparc Linux | ||||||
|         - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10 |         - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10 | ||||||
| @@ -567,12 +720,15 @@ PORTS | |||||||
|         - StrongARM/ARM7/ARM9 Linux 2.4, 2.6 |         - StrongARM/ARM7/ARM9 Linux 2.4, 2.6 | ||||||
|         - StrongARM NetBSD 1.4.1 |         - StrongARM NetBSD 1.4.1 | ||||||
|         - Ultrix 4.3a |         - Ultrix 4.3a | ||||||
|  |         - UNICOS 9.0 | ||||||
|         - i386 BeOS |         - i386 BeOS | ||||||
|         - i386 DOS |         - i386 DOS | ||||||
|  |         - i386 eCos 1.3.1 | ||||||
|         - i386 Esix 4.1 |         - i386 Esix 4.1 | ||||||
|         - i386 FreeBSD |         - i386 FreeBSD | ||||||
|         - i386 HURD |         - i386 HURD | ||||||
|         - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6 |         - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6 | ||||||
|  |         - i386 MINIX 3.1.2 | ||||||
|         - i386 NetBSD |         - i386 NetBSD | ||||||
|         - i386 Novell NetWare |         - i386 Novell NetWare | ||||||
|         - i386 OS/2 |         - i386 OS/2 | ||||||
| @@ -597,3 +753,6 @@ OpenSSL   http://www.openssl.org | |||||||
| MingW     http://www.mingw.org | MingW     http://www.mingw.org | ||||||
| OpenLDAP  http://www.openldap.org | OpenLDAP  http://www.openldap.org | ||||||
| Zlib      http://www.gzip.org/zlib/ | 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 | changelog of the current development status, as one or more of these problems | ||||||
| may have been fixed since this was written! | may have been fixed since this was written! | ||||||
|  |  | ||||||
| 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. | 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 |   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 |   "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 |   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 | 23. SOCKS-related problems: | ||||||
|   proxy closes the connection within the authentication "negotiation phase". |   A) libcurl doesn't support SOCKS for IPv6. | ||||||
|   Like if you do HTTPS or similar over a proxy and you use perhaps |   B) libcurl doesn't support FTPS over a SOCKS proxy. | ||||||
|   --proxy-anyauth. There's work in progress on this problem, and a recent |   C) We don't have any test cases for SOCKS proxy. | ||||||
|   patch was posted here: http://curl.haxx.se/mail/lib-2005-08/0074.html |   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 probably have even more bugs and lack of features when a SOCKS proxy is | ||||||
|   We don't have any test cases for SOCKS proxy. We probably have even more |   used. | ||||||
|   bugs and lack of features when a SOCKS proxy is used. And there seem to be a |  | ||||||
|   problem with SOCKS when doing FTP: See |  | ||||||
|   http://curl.haxx.se/bug/view.cgi?id=1371540 |  | ||||||
|  |  | ||||||
| 22. Sending files to a FTP server using curl on VMS, might lead to curl | 22. Sending files to a FTP server using curl on VMS, might lead to curl | ||||||
|   complaining on "unaligned file size" on completion. The problem is related |   complaining on "unaligned file size" on completion. The problem is related | ||||||
| @@ -68,9 +91,6 @@ may have been fixed since this was written! | |||||||
|  |  | ||||||
|    Since 7.15.4 at least line endings are converted. |    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>, | 16. FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>, | ||||||
|   <password>, and <fpath> components, encoded as "%00".  The problem is that |   <password>, and <fpath> components, encoded as "%00".  The problem is that | ||||||
|   curl_unescape does not detect this, but instead returns a shortened C |   curl_unescape does not detect this, but instead returns a shortened C | ||||||
| @@ -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 | 12. When connecting to a SOCKS proxy, the (connect) timeout is not properly | ||||||
|   acknowledged after the actual TCP connect (during the SOCKS "negotiate" |   acknowledged after the actual TCP connect (during the SOCKS "negotiate" | ||||||
|   phase). Pointed out by Lucas. Fix: need to select() and timeout properly. |   phase). | ||||||
|  |  | ||||||
| 11. Using configure --disable-[protocol] may cause 'make test' to fail for |  | ||||||
|   tests using the disabled protocol(s). |  | ||||||
|  |  | ||||||
| 10. To get HTTP Negotiate authentication to work fine, you need to provide a | 10. To get HTTP Negotiate authentication to work fine, you need to provide a | ||||||
|   (fake) user name (this concerns both curl and the lib) because the code |   (fake) user name (this concerns both curl and the lib) because the code | ||||||
| @@ -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/bug/view.cgi?id=1004841. How? | ||||||
|   http://curl.haxx.se/mail/lib-2004-08/0182.html |   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 | 8. Doing resumed upload over HTTP does not work with '-C -', because curl | ||||||
|   doesn't do a HEAD first to get the initial size. This needs to be done |   doesn't do a HEAD first to get the initial size. This needs to be done | ||||||
|   manually for HTTP PUT resume to work, and then '-C [index]'. |   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 | distributing them as binaries would be to violate the GPL license - unless you | ||||||
| accompany your license with an exception[2]. This particular problem was | accompany your license with an exception[2]. This particular problem was | ||||||
| addressed when the Modified BSD license was created, which does not have the | 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 | 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 | OpenSSL http://www.openssl.org/source/license.html | ||||||
|  |  | ||||||
|         (May be used for SSL/TLS support) Uses an Original BSD-style license |         (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 |         are not allowed to ship binaries that link with OpenSSL that includes | ||||||
|         GPL code (unless that specific GPL code includes an exception for |         GPL code (unless that specific GPL code includes an exception for | ||||||
|         OpenSSL - a habit that is growing more and more common). If OpenSSL's |         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/ | GnuTLS  http://www.gnutls.org/ | ||||||
|  |  | ||||||
| @@ -41,6 +42,19 @@ GnuTLS  http://www.gnutls.org/ | |||||||
|         GnuTLS itself depends on and uses other libs (libgcrypt and |         GnuTLS itself depends on and uses other libs (libgcrypt and | ||||||
|         libgpg-error) and they too are LGPL- or GPL-licensed. |         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 | c-ares  http://daniel.haxx.se/projects/c-ares/license.html | ||||||
|  |  | ||||||
|         (Used for asynchronous name resolves) Uses an MIT license that is very |         (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 |         that it uses the OpenSSL license and thus shares the same issues as | ||||||
|         described for OpenSSL above. |         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 |         (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 |         "copyleft". This license requires more requirements to be met when | ||||||
|         distributing binaries, see the license for details. Also note that if |         distributing binaries, see the license for details. Also note that if | ||||||
|         you distribute a binary that includes this library, you must also |         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 |         libcurl uses OpenLDAP as a shared library only, I have not heard of | ||||||
|         anyone that ships OpenLDAP linked with libcurl in an app. |         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 | [1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html | ||||||
| [2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on | [2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on | ||||||
|       how to write such an exception to the GPL |       how to write such an exception to the GPL | ||||||
| [3] = LGPL - GNU Lesser General Public License: | [3] = LGPL - GNU Lesser General Public License: | ||||||
|       http://www.gnu.org/licenses/lgpl.html |       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 | 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/ |         curl http://www.netscape.com/ | ||||||
|  |  | ||||||
| @@ -31,6 +31,24 @@ SIMPLE USAGE | |||||||
|  |  | ||||||
|         curl ftp://cool.haxx.se/ http://www.weirdserver.com:8000/ |         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 | DOWNLOAD TO A FILE | ||||||
|  |  | ||||||
|   Get a web page and store in a local 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 |    It is just like for FTP, but you may also want to specify and use | ||||||
|    SSL-specific options for certificates etc. |    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 |  HTTP | ||||||
|  |  | ||||||
|    The HTTP URL doesn't support user and password in the URL string. Curl |    Curl also supports user and password in HTTP URLs, thus you can pick a file | ||||||
|    does support that anyway to provide a ftp-style interface and thus you can |    like: | ||||||
|    pick a file like: |  | ||||||
|  |  | ||||||
|         curl http://name:passwd@machine.domain/full/path/to/file |         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 -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 |  See also the environment variables Curl support that offer further proxy | ||||||
|  control. |  control. | ||||||
|  |  | ||||||
| @@ -685,9 +708,9 @@ TIME CONDITIONS | |||||||
|         curl -z -local.html http://remote.server.com/remote.html |         curl -z -local.html http://remote.server.com/remote.html | ||||||
|  |  | ||||||
|  You can specify a "free text" date as condition. Tell curl to only download |  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 |  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 '-'. |  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 |   transfers faster. If you use a http proxy for file transfers, practically | ||||||
|   all transfers will be persistent. |   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 | MAILING LISTS | ||||||
|  |  | ||||||
|   For your convenience, we have several open mailing lists to discuss curl, |   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 | Alan Pinstein | ||||||
| Albert Chin-A-Young | Albert Chin-A-Young | ||||||
| Albert Choy | Albert Choy | ||||||
|  | Ale Vesely | ||||||
| Aleksandar Milivojevic | Aleksandar Milivojevic | ||||||
| Alex Neblett | Alex Neblett | ||||||
| Alex Suykov | Alex Suykov | ||||||
| @@ -16,14 +17,17 @@ Alexander Kourakos | |||||||
| Alexander Krasnostavsky | Alexander Krasnostavsky | ||||||
| Alexander Lazic | Alexander Lazic | ||||||
| Alexander Zhuravlev | Alexander Zhuravlev | ||||||
|  | Alexey Simak | ||||||
| Alexis Carvalho | Alexis Carvalho | ||||||
| Amol Pattekar | Amol Pattekar | ||||||
| Andi Jahja | Andi Jahja | ||||||
| Andreas Damm | Andreas Damm | ||||||
|  | Andreas Ntaflos | ||||||
| Andreas Olsson | Andreas Olsson | ||||||
| Andreas Rieke | Andreas Rieke | ||||||
| Andres Garcia | Andres Garcia | ||||||
| Andrew Benham | Andrew Benham | ||||||
|  | Andrew Biggs | ||||||
| Andrew Bushnell | Andrew Bushnell | ||||||
| Andrew Francis | Andrew Francis | ||||||
| Andrew Fuller | Andrew Fuller | ||||||
| @@ -34,19 +38,26 @@ Angus Mackay | |||||||
| Antoine Calando | Antoine Calando | ||||||
| Anton Kalmykov | Anton Kalmykov | ||||||
| Arkadiusz Miskiewicz | Arkadiusz Miskiewicz | ||||||
|  | Armel Asselin | ||||||
|  | Arve Knudsen | ||||||
|  | Ates Goral | ||||||
| Augustus Saunders | Augustus Saunders | ||||||
| Avery Fay | Avery Fay | ||||||
| Ben Greear | Ben Greear | ||||||
| Ben Madsen | Ben Madsen | ||||||
| Benjamin Gerard | Benjamin Gerard | ||||||
|  | Bernard Leak | ||||||
| Bertrand Demiddelaer | Bertrand Demiddelaer | ||||||
| Bjorn Reese | Bjorn Reese | ||||||
| Bj<EFBFBD>rn Stenberg | Bj<EFBFBD>rn Stenberg | ||||||
| Bob Schader | Bob Schader | ||||||
|  | Bogdan Nicula | ||||||
| Brad Burdick | Brad Burdick | ||||||
| Bradford Bruce | Bradford Bruce | ||||||
|  | Brendan Jurd | ||||||
| Brent Beardsley | Brent Beardsley | ||||||
| Brian Akins | Brian Akins | ||||||
|  | Brian Dessent | ||||||
| Brian R Duffy | Brian R Duffy | ||||||
| Bruce Mitchener | Bruce Mitchener | ||||||
| Bryan Henderson | Bryan Henderson | ||||||
| @@ -63,6 +74,7 @@ Christian Robottom Reis | |||||||
| Christophe Demory | Christophe Demory | ||||||
| Christophe Legry | Christophe Legry | ||||||
| Christopher R. Palmer | Christopher R. Palmer | ||||||
|  | Ciprian Badescu | ||||||
| Clarence Gardner | Clarence Gardner | ||||||
| Clifford Wolf | Clifford Wolf | ||||||
| Cody Jones | Cody Jones | ||||||
| @@ -77,6 +89,7 @@ Damien Adant | |||||||
| Dan Becker | Dan Becker | ||||||
| Dan C | Dan C | ||||||
| Dan Fandrich | Dan Fandrich | ||||||
|  | Dan Nelson | ||||||
| Dan Torop | Dan Torop | ||||||
| Dan Zitter | Dan Zitter | ||||||
| Daniel Stenberg | Daniel Stenberg | ||||||
| @@ -110,7 +123,9 @@ Dimitris Sarris | |||||||
| Dinar | Dinar | ||||||
| Dirk Eddelbuettel | Dirk Eddelbuettel | ||||||
| Dirk Manske | Dirk Manske | ||||||
|  | Dmitriy Sergeyev | ||||||
| Dmitry Bartsevich | Dmitry Bartsevich | ||||||
|  | Dmitry Rechkin | ||||||
| Dolbneff A.V | Dolbneff A.V | ||||||
| Domenico Andreoli | Domenico Andreoli | ||||||
| Dominick Meglio | Dominick Meglio | ||||||
| @@ -189,6 +204,8 @@ Ian Wilkes | |||||||
| Ignacio Vazquez-Abrams | Ignacio Vazquez-Abrams | ||||||
| Igor Polyakov | Igor Polyakov | ||||||
| Ilguiz Latypov | Ilguiz Latypov | ||||||
|  | Ilja van Sprundel | ||||||
|  | Ingmar Runge | ||||||
| Ingo Ralf Blum | Ingo Ralf Blum | ||||||
| Ingo Wilken | Ingo Wilken | ||||||
| Jacky Lam | Jacky Lam | ||||||
| @@ -198,11 +215,14 @@ James Clancy | |||||||
| James Cone | James Cone | ||||||
| James Gallagher | James Gallagher | ||||||
| James Griffiths | James Griffiths | ||||||
|  | James Housley | ||||||
| James MacMillan | James MacMillan | ||||||
| Jamie Lokier | Jamie Lokier | ||||||
| Jamie Newton | Jamie Newton | ||||||
| Jamie Wilkinson | Jamie Wilkinson | ||||||
| Jan Kunder | Jan Kunder | ||||||
|  | Jared Lundell | ||||||
|  | Jari Sundell | ||||||
| Jason S. Priebe | Jason S. Priebe | ||||||
| Jaz Fresh | Jaz Fresh | ||||||
| Jean Jacques Drouin | Jean Jacques Drouin | ||||||
| @@ -249,6 +269,7 @@ Kai-Uwe Rommel | |||||||
| Kang-Jin Lee | Kang-Jin Lee | ||||||
| Karl Moerder | Karl Moerder | ||||||
| Karol Pietrzak | Karol Pietrzak | ||||||
|  | Katie Wang | ||||||
| Keith MacDonald | Keith MacDonald | ||||||
| Keith McGuigan | Keith McGuigan | ||||||
| Ken Hirsch | Ken Hirsch | ||||||
| @@ -286,6 +307,7 @@ Lucas Adamski | |||||||
| Lukasz Czekierda | Lukasz Czekierda | ||||||
| Luke Call | Luke Call | ||||||
| Luong Dinh Dung | Luong Dinh Dung | ||||||
|  | Maciej Karpiuk | ||||||
| Maciej W. Rozycki | Maciej W. Rozycki | ||||||
| Marc Boucher | Marc Boucher | ||||||
| Marcelo Juchem  | Marcelo Juchem  | ||||||
| @@ -294,18 +316,22 @@ Marco G. Salvagno | |||||||
| Marcus Webster | Marcus Webster | ||||||
| Mario Schroeder | Mario Schroeder | ||||||
| Mark Butler | Mark Butler | ||||||
|  | Mark Eichin | ||||||
|  | Mark Lentczner | ||||||
| Markus Koetter | Markus Koetter | ||||||
| Markus Moeller | Markus Moeller | ||||||
| Markus Oberhumer | Markus Oberhumer | ||||||
| Martijn Koster | Martijn Koster | ||||||
| Martin C. Martin | Martin C. Martin | ||||||
| Martin Hedenfalk | Martin Hedenfalk | ||||||
|  | Martin Skinner | ||||||
| Marty Kuhrt | Marty Kuhrt | ||||||
| Maruko | Maruko | ||||||
| Massimiliano Ziccardi | Massimiliano Ziccardi | ||||||
| Mathias Axelsson | Mathias Axelsson | ||||||
| Mats Lidell | Mats Lidell | ||||||
| Matt Veenstra | Matt Veenstra | ||||||
|  | Matt Witherspoon | ||||||
| Matthew Blain | Matthew Blain | ||||||
| Matthew Clarke | Matthew Clarke | ||||||
| Maurice Barnum | Maurice Barnum | ||||||
| @@ -314,19 +340,24 @@ Mettgut Jamalla | |||||||
| Michael Benedict | Michael Benedict | ||||||
| Michael Curtis | Michael Curtis | ||||||
| Michael Jahn | Michael Jahn | ||||||
|  | Michael Jerris | ||||||
| Michael Mealling | Michael Mealling | ||||||
| Michael Wallner | Michael Wallner | ||||||
| Michal Bonino | Michal Bonino | ||||||
| Michal Marek | Michal Marek | ||||||
|  | Michele Bini | ||||||
| Mihai Ionescu | Mihai Ionescu | ||||||
|  | Mikael Sennerholm | ||||||
| Mike Bytnar | Mike Bytnar | ||||||
| Mike Dobbs | Mike Dobbs | ||||||
|  | Mike Protts | ||||||
| Miklos Nemeth | Miklos Nemeth | ||||||
| Mitz Wark | Mitz Wark | ||||||
| Mohamed Lrhazi | Mohamed Lrhazi | ||||||
| Mohun Biswas | Mohun Biswas | ||||||
| Moonesamy | Moonesamy | ||||||
| Nathan O'Sullivan | Nathan O'Sullivan | ||||||
|  | Nathanael Nerode | ||||||
| Naveen Noel | Naveen Noel | ||||||
| Neil Dunbar | Neil Dunbar | ||||||
| Neil Spring | Neil Spring | ||||||
| @@ -339,10 +370,13 @@ Nicolas Croiset | |||||||
| Nicolas Fran<61>ois | Nicolas Fran<61>ois | ||||||
| Niels van Tongeren | Niels van Tongeren | ||||||
| Nikita Schmidt | Nikita Schmidt | ||||||
|  | Nir Soffer | ||||||
| Nis Jorgensen | Nis Jorgensen | ||||||
| Nodak Sodak | Nodak Sodak | ||||||
| Norbert Novotny | Norbert Novotny | ||||||
| Ofer | Ofer | ||||||
|  | Olaf Stueben | ||||||
|  | Olaf St<53>ben | ||||||
| Oren Tirosh | Oren Tirosh | ||||||
| P R Schaffner | P R Schaffner | ||||||
| Patrick Bihan-Faou | Patrick Bihan-Faou | ||||||
| @@ -351,6 +385,7 @@ Paul Harrington | |||||||
| Paul Marquis | Paul Marquis | ||||||
| Paul Moore | Paul Moore | ||||||
| Paul Nolan | Paul Nolan | ||||||
|  | Paul Querna | ||||||
| Pavel Cenek | Pavel Cenek | ||||||
| Pavel Orehov | Pavel Orehov | ||||||
| Pawel A. Gajda | Pawel A. Gajda | ||||||
| @@ -360,6 +395,7 @@ Peter Bray | |||||||
| Peter Forret | Peter Forret | ||||||
| Peter Heuchert | Peter Heuchert | ||||||
| Peter Pentchev | Peter Pentchev | ||||||
|  | Peter Silva | ||||||
| Peter Su | Peter Su | ||||||
| Peter Sylvester | Peter Sylvester | ||||||
| Peter Todd | Peter Todd | ||||||
| @@ -379,6 +415,7 @@ Ralph Beckmann | |||||||
| Ralph Mitchell | Ralph Mitchell | ||||||
| Ramana Mokkapati | Ramana Mokkapati | ||||||
| Randy McMurchy | Randy McMurchy | ||||||
|  | Ravi Pratap | ||||||
| Reinout van Schouwen | Reinout van Schouwen | ||||||
| Renaud Chaillat | Renaud Chaillat | ||||||
| Renaud Duhaut | Renaud Duhaut | ||||||
| @@ -397,10 +434,13 @@ Rick Jones | |||||||
| Rick Richardson | Rick Richardson | ||||||
| Rob Stanzel | Rob Stanzel | ||||||
| Robert D. Young | Robert D. Young | ||||||
|  | Robert Foreman | ||||||
| Robert Olson | Robert Olson | ||||||
| Robert Weaver | Robert Weaver | ||||||
| Robin Kay | Robin Kay | ||||||
|  | Robson Braga Araujo | ||||||
| Rodney Simmons | Rodney Simmons | ||||||
|  | Roland Blom | ||||||
| Roland Krikava | Roland Krikava | ||||||
| Roland Zimmermann | Roland Zimmermann | ||||||
| Roman Koifman | Roman Koifman | ||||||
| @@ -421,6 +461,7 @@ Scott Davis | |||||||
| Sebastien Willemijns | Sebastien Willemijns | ||||||
| Sergio Ballestrero | Sergio Ballestrero | ||||||
| Seshubabu Pasam | Seshubabu Pasam | ||||||
|  | Sh Diao | ||||||
| Shard | Shard | ||||||
| Shawn Poulson | Shawn Poulson | ||||||
| Shmulik Regev | Shmulik Regev | ||||||
| @@ -431,6 +472,7 @@ Simon Liu | |||||||
| Spiridonoff A.V | Spiridonoff A.V | ||||||
| Stadler Stephan | Stadler Stephan | ||||||
| Stefan Esser | Stefan Esser | ||||||
|  | Stefan Krause | ||||||
| Stefan Ulrich | Stefan Ulrich | ||||||
| Stephan Bergmann | Stephan Bergmann | ||||||
| Stephen Kick | Stephen Kick | ||||||
| @@ -468,6 +510,7 @@ Tomas Szepe | |||||||
| Tomasz Lacki | Tomasz Lacki | ||||||
| Tommy Tam | Tommy Tam | ||||||
| Ton Voon | Ton Voon | ||||||
|  | Toon Verwaest | ||||||
| Tor Arntsen | Tor Arntsen | ||||||
| Torsten Foertsch | Torsten Foertsch | ||||||
| Toshiyuki Maezawa | Toshiyuki Maezawa | ||||||
| @@ -477,6 +520,8 @@ Troy Engel | |||||||
| Tupone Alfredo | Tupone Alfredo | ||||||
| Ulf H<>rnhammar | Ulf H<>rnhammar | ||||||
| Ulrich Zadow | Ulrich Zadow | ||||||
|  | Venkat Akella | ||||||
|  | Victor Snezhko | ||||||
| Vilmos Nebehaj | Vilmos Nebehaj | ||||||
| Vincent Bronner | Vincent Bronner | ||||||
| Vincent Penquerc'h | Vincent Penquerc'h | ||||||
| @@ -490,8 +535,10 @@ Wesley Laxton | |||||||
| Wez Furlong | Wez Furlong | ||||||
| Wilfredo Sanchez | Wilfredo Sanchez | ||||||
| Wojciech Zwiefka | Wojciech Zwiefka | ||||||
|  | Xavier Bouchoux | ||||||
| Yang Tse | Yang Tse | ||||||
| Yarram Sunil | Yarram Sunil | ||||||
|  | Yves Lejeune | ||||||
| Zvi Har'El  | Zvi Har'El  | ||||||
| nk | nk | ||||||
| swalkaus at yahoo.com | 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 |    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). |    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 |  * 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 |    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 |    header is for example included by curl/multi.h only on specific platforms | ||||||
| @@ -115,10 +111,6 @@ TODO | |||||||
|  |  | ||||||
|  HTTP |  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 |  * 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 |    never been reported as causing trouble to anyone, but should be considered | ||||||
|    to use the HTTP version the user has chosen. |    to use the HTTP version the user has chosen. | ||||||
| @@ -135,6 +127,10 @@ TODO | |||||||
|  |  | ||||||
|  SSL |  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: |  * Anton Fedorov's "dumpcert" patch: | ||||||
|    http://curl.haxx.se/mail/lib-2004-03/0088.html |    http://curl.haxx.se/mail/lib-2004-03/0088.html | ||||||
|  |  | ||||||
| @@ -161,18 +157,14 @@ TODO | |||||||
|    Clark) |    Clark) | ||||||
|  |  | ||||||
|  * Make curl's SSL layer capable of using other free SSL libraries.  Such as |  * Make curl's SSL layer capable of using other free SSL libraries.  Such as | ||||||
|    Mozilla Security Services |    MatrixSSL (http://www.matrixssl.org/). | ||||||
|    (http://www.mozilla.org/projects/security/pki/nss/), MatrixSSL |  | ||||||
|    (http://www.matrixssl.org/) or yaSSL (http://yassl.com/). At least the |  | ||||||
|    latter two could be alternatives for those looking to reduce the footprint |  | ||||||
|    of libcurl built with OpenSSL or GnuTLS. |  | ||||||
|  |  | ||||||
|  * Peter Sylvester's patch for SRP on the TLS layer. |  * Peter Sylvester's patch for SRP on the TLS layer. | ||||||
|    Awaits OpenSSL support for this, no need to support this in libcurl before |    Awaits OpenSSL support for this, no need to support this in libcurl before | ||||||
|    there's an OpenSSL release that does it. |    there's an OpenSSL release that does it. | ||||||
|  |  | ||||||
|  * make the configure --with-ssl option first check for OpenSSL and then for |  * make the configure --with-ssl option first check for OpenSSL, then GnuTLS, | ||||||
|    GnuTLS if OpenSSL wasn't detected. |    then NSS... | ||||||
|  |  | ||||||
|  GnuTLS |  GnuTLS | ||||||
|  |  | ||||||
| @@ -188,8 +180,8 @@ TODO | |||||||
|  |  | ||||||
|  * Fix the connection phase to be non-blocking when multi interface is used |  * 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 |  * Add a way to check if the connection seems to be alive, to correspond to | ||||||
|    SSL_peak() way we use with OpenSSL. |    the SSL_peak() way we use with OpenSSL. | ||||||
|  |  | ||||||
|  LDAP |  LDAP | ||||||
|  |  | ||||||
| @@ -201,10 +193,6 @@ TODO | |||||||
|  |  | ||||||
|  * RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description) |  * RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description) | ||||||
|  |  | ||||||
|  * SFTP/SCP/SSH (no RFCs for protocol nor URI/URL format). An implementation |  | ||||||
|    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 |  * RSYNC (no RFCs for protocol nor URI/URL format).  An implementation should | ||||||
|    most probably use an existing rsync library, such as librsync. |    most probably use an existing rsync library, such as librsync. | ||||||
|  |  | ||||||
| @@ -273,6 +261,10 @@ TODO | |||||||
|  |  | ||||||
|  TEST SUITE |  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 |  * Make the test servers able to serve multiple running test suites. Like if | ||||||
|    two users run 'make test' at once. |    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 | .\" * This software is licensed as described in the file COPYING, which | ||||||
| .\" * you should have received as part of this distribution. The terms | .\" * you should have received as part of this distribution. The terms | ||||||
| @@ -21,7 +21,7 @@ | |||||||
| .\" * $Id$ | .\" * $Id$ | ||||||
| .\" ************************************************************************** | .\" ************************************************************************** | ||||||
| .\" | .\" | ||||||
| .TH curl 1 "21 Mar 2006" "Curl 7.15.4" "Curl Manual" | .TH curl 1 "28 Feb 2007" "Curl 7.16.2" "Curl Manual" | ||||||
| .SH NAME | .SH NAME | ||||||
| curl \- transfer a URL | curl \- transfer a URL | ||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| @@ -30,13 +30,13 @@ curl \- transfer a URL | |||||||
| .SH DESCRIPTION | .SH DESCRIPTION | ||||||
| .B curl | .B curl | ||||||
| is a tool to transfer data from or to a server, using one of the supported | is a tool to transfer data from or to a server, using one of the supported | ||||||
| protocols (HTTP, HTTPS, FTP, FTPS, TFTP, DICT, TELNET, LDAP or FILE). | protocols (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP or | ||||||
| The command is designed to work without user interaction. | FILE).  The command is designed to work without user interaction. | ||||||
|  |  | ||||||
| curl offers a busload of useful tricks like proxy support, user | curl offers a busload of useful tricks like proxy support, user | ||||||
| authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file | authentication, ftp upload, HTTP post, SSL connections, cookies, file transfer | ||||||
| transfer resume and more. As you will see below, the amount of features will | resume and more. As you will see below, the amount of features will make your | ||||||
| make your head spin! | head spin! | ||||||
|  |  | ||||||
| curl is powered by libcurl for all transfer-related features. See | curl is powered by libcurl for all transfer-related features. See | ||||||
| .BR libcurl (3) | .BR libcurl (3) | ||||||
| @@ -167,6 +167,10 @@ difference. | |||||||
| must be using valid ciphers. Read up on SSL cipher list details on this URL: | must be using valid ciphers. Read up on SSL cipher list details on this URL: | ||||||
| \fIhttp://www.openssl.org/docs/apps/ciphers.html\fP | \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. | If this option is used several times, the last one will override the others. | ||||||
| .IP "--compressed" | .IP "--compressed" | ||||||
| (HTTP) Request a compressed response using one of the algorithms libcurl | (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. | If this option is used several times, each occurrence will toggle this on/off. | ||||||
| .IP "--egd-file <file>" | .IP "--egd-file <file>" | ||||||
| (HTTPS) Specify the path name to the Entropy Gathering Daemon socket. The | (SSL) Specify the path name to the Entropy Gathering Daemon socket. The socket | ||||||
| socket is used to seed the random engine for SSL connections. See also the | is used to seed the random engine for SSL connections. See also the | ||||||
| \fI--random-file\fP option. | \fI--random-file\fP option. | ||||||
| .IP "-E/--cert <certificate[:password]>" | .IP "-E/--cert <certificate[:password]>" | ||||||
| (HTTPS) | (SSL) Tells curl to use the specified certificate file when getting a file | ||||||
| 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 | ||||||
| with HTTPS. The certificate must be in PEM format. | password isn't specified, it will be queried for on the terminal. Note that | ||||||
| If the optional password isn't specified, it will be queried for on | this option assumes a \&"certificate" file that is the private key and the | ||||||
| the terminal. Note that this certificate is the private key and the private | private certificate concatenated! See \fI--cert\fP and \fI--key\fP to specify | ||||||
| certificate concatenated! | 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. | If this option is used several times, the last one will be used. | ||||||
| .IP "--cert-type <type>" | .IP "--cert-type <type>" | ||||||
| (SSL) Tells curl what certificate type the provided certificate is in. PEM, | (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. | If this option is used several times, the last one will be used. | ||||||
| .IP "--cacert <CA certificate>" | .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 | peer. The file may contain multiple CA certificates. The certificate(s) must | ||||||
| be in PEM format. | 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 | \'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. | 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. | If this option is used several times, the last one will be used. | ||||||
| .IP "--capath <CA certificate directory>" | .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 | peer. The certificates must be in PEM format, and the directory must have been | ||||||
| processed using the c_rehash utility supplied with openssl. Using | 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 | than using \fI--cacert\fP if the \fI--cacert\fP file contains many CA | ||||||
| certificates. | 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 | HTML document stating so (which often also describes why and more). This flag | ||||||
| will prevent curl from outputting that and return error 22. | 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. | If this option is used twice, the second will again disable silent failure. | ||||||
| .IP "--ftp-account [data]" | .IP "--ftp-account [data]" | ||||||
| (FTP) When an FTP server asks for "account data" after user name and password | (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 | If this option is used several times, the following occurrences make no | ||||||
| difference. | 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" | .IP "--ftp-skip-pasv-ip" | ||||||
| (FTP) Tell curl to not use the IP address the server suggests in its response | (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 | 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 | If this option is used twice, the second will again use the server's suggested | ||||||
| address. | address. | ||||||
| .IP "--ftp-ssl" | .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. | 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>" | .IP "-F/--form <name=content>" | ||||||
| (HTTP) This lets curl emulate a filled in form in which a user has pressed the | (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 | 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 | 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 | 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 | trickier stuff than curl would normally do. You should not replace internally | ||||||
| set headers without knowing perfectly well what you're doing. Replacing an | set headers without knowing perfectly well what you're doing. Remove an | ||||||
| internal header with one without content on the right side of the colon will | internal header by giving a replacement without content on the right side of | ||||||
| prevent that header from appearing. | the colon, as in: -H \&"Host:". | ||||||
|  |  | ||||||
| curl will make sure that each header you add/replace get sent with the proper | 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 | 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 | the CA certificate bundle installed by default. This makes all connections | ||||||
| considered "insecure" to fail unless \fI-k/--insecure\fP is used. | 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. | If this option is used twice, the second time will again disable it. | ||||||
| .IP "--key <key>" | .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. | separate file. | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. | If this option is used several times, the last one will be used. | ||||||
| .IP "--key-type <type>" | .IP "--key-type <type>" | ||||||
| (SSL) Private key file type. Specify which type your \fI--key\fP provided | (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. | If this option is used several times, the last one will be used. | ||||||
| .IP "--krb4 <level>" | .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 | 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 | to contain white spaces, the parameter must be enclosed within quotes.  If the | ||||||
| first column of a config line is a '#' character, the rest of the line will be | first column of a config line is a '#' character, the rest of the line will be | ||||||
| treated as a comment. | treated as a comment. 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 | 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 | 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/" | 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 | 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 | 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 | 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 | 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. | 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>" | .IP "--limit-rate <speed>" | ||||||
| Specify the maximum transfer rate you want curl to use. This feature is useful | Specify the maximum transfer rate you want curl to use. This feature is useful | ||||||
| if you have a limited pipe and you'd like your transfer not use your entire | if you have a limited pipe and you'd like your transfer not use your entire | ||||||
| @@ -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 | 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. | 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 | If you are also using the \fI-Y/--speed-limit\fP option, that option will take | ||||||
| precedence and might cripple the rate-limiting slightly, to help keeping the | precedence and might cripple the rate-limiting slightly, to help keeping the | ||||||
| speed-limit logic working. | speed-limit logic working. | ||||||
| @@ -692,6 +775,15 @@ will output the data in chunks, not necessarily exactly when the data arrives. | |||||||
| Using this option will disable that buffering. | Using this option will disable that buffering. | ||||||
|  |  | ||||||
| If this option is used twice, the second will again switch on 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" | .IP "--ntlm" | ||||||
| (HTTP) Enables NTLM authentication. The NTLM authentication method was | (HTTP) Enables NTLM authentication. The NTLM authentication method was | ||||||
| designed by Microsoft and is used by IIS web servers. It is a proprietary | 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. | You may use this option as many times as you have number of URLs. | ||||||
| .IP "--pass <phrase>" | .IP "--pass <phrase>" | ||||||
| (SSL) Pass phrase for the private key | (SSL/SSH) Pass phrase for the private key | ||||||
|  |  | ||||||
| If this option is used several times, the last one will be used. | If this option is used several times, the last one will be used. | ||||||
| .IP "--proxy-anyauth" | .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. | remote port number curl wants to tunnel through to. | ||||||
|  |  | ||||||
| If this option is used twice, the second will again disable proxy tunnel. | 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>" | .IP "-P/--ftp-port <address>" | ||||||
| (FTP) Reverses the initiator/listener roles when connecting with ftp. This | (FTP) Reverses the initiator/listener roles when connecting with ftp. This | ||||||
| switch makes Curl use the PORT command instead of PASV. In practice, PORT | 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. | This option can be used multiple times. | ||||||
| .IP "--random-file <file>" | .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. | random data. The data is used to seed the random engine for SSL connections. | ||||||
| See also the \fI--egd-file\fP option. | See also the \fI--egd-file\fP option. | ||||||
| .IP "-r/--range <range>" | .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. | 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. | 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" | .IP "-R/--remote-time" | ||||||
| When used, this will make libcurl attempt to figure out the timestamp of the | 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 | 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 | descriptive information, to the given output file. Use "-" as filename to have | ||||||
| the output sent to stdout. | 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. | If this option is used several times, the last one will be used. | ||||||
| .IP "--trace-ascii <file>" | .IP "--trace-ascii <file>" | ||||||
| Enables a full trace dump of all incoming and outgoing data, including | Enables a full trace dump of all incoming and outgoing data, including | ||||||
| @@ -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 | shows the ASCII part of the dump. It makes smaller output that might be easier | ||||||
| to read for untrained humans. | to read for untrained humans. | ||||||
|  |  | ||||||
|  | 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. | If this option is used several times, the last one will be used. | ||||||
| .IP "--trace-time" | .IP "--trace-time" | ||||||
| Prepends a time stamp to each trace or verbose line that curl displays. | 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 | If you think this option still doesn't give you enough details, consider using | ||||||
| \fI--trace\fP or \fI--trace-ascii\fP instead. | \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" | .IP "-V/--version" | ||||||
| Displays information about curl and the libcurl version it uses. | 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. | If this option is used several times, the last one will be used. | ||||||
| .IP "-z/--time-cond <date expression>" | .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 | 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 | 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 | 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 | (HTTP) Forces curl to issue its requests using HTTP 1.0 instead of using its | ||||||
| internally preferred: HTTP 1.1. | internally preferred: HTTP 1.1. | ||||||
| .IP "-1/--tlsv1" | .IP "-1/--tlsv1" | ||||||
| (HTTPS) | (SSL) | ||||||
| Forces curl to use TSL version 1 when negotiating with a remote TLS server. | Forces curl to use TSL version 1 when negotiating with a remote TLS server. | ||||||
| .IP "-2/--sslv2" | .IP "-2/--sslv2" | ||||||
| (HTTPS) | (SSL) | ||||||
| Forces curl to use SSL version 2 when negotiating with a remote SSL server. | Forces curl to use SSL version 2 when negotiating with a remote SSL server. | ||||||
| .IP "-3/--sslv3" | .IP "-3/--sslv3" | ||||||
| (HTTPS) | (SSL) | ||||||
| Forces curl to use SSL version 3 when negotiating with a remote SSL server. | 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" | .IP "-4/--ipv4" | ||||||
| If libcurl is capable of resolving an address to multiple IP versions (which | If libcurl is capable of resolving an address to multiple IP versions (which | ||||||
| it is if it is ipv6-capable), this option tells libcurl to resolve names to | it is if it is ipv6-capable), this option tells libcurl to resolve names to | ||||||
| @@ -1240,7 +1338,7 @@ If this option is used twice, the second will again disable the progress bar. | |||||||
| .SH FILES | .SH FILES | ||||||
| .I ~/.curlrc | .I ~/.curlrc | ||||||
| .RS | .RS | ||||||
| Default config file. | Default config file, see \fI-K/--config\fP for details. | ||||||
|  |  | ||||||
| .SH ENVIRONMENT | .SH ENVIRONMENT | ||||||
| .IP "http_proxy [protocol://]<host>[:port]" | .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-post.c fopen.c simplepost.c makefile.dj curlx.c https.c		\ | ||||||
|  multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c	\ |  multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c	\ | ||||||
|  anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c		\ |  anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c		\ | ||||||
|  cookie_interface.c cacertinmem.c 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: | all: | ||||||
| 	@echo "done" | 	@echo "done" | ||||||
|   | |||||||
| @@ -26,9 +26,9 @@ want you do reorganize them like: | |||||||
|   $ `curl-config --cc` -o example example.c `curl-config --cflags --libs` |   $ `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 | *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 | applications/experiments. Even if some of the examples use that site as a URL | ||||||
| as an example URL at some places, it doesn't mean that the URLs work or that | at some places, it doesn't mean that the URLs work or that we expect you to | ||||||
| we expect you to actually torture our web site with your tests! Thanks. | actually torture our web site with your tests!  Thanks. | ||||||
|  |  | ||||||
| EXAMPLES | EXAMPLES | ||||||
|  |  | ||||||
| @@ -43,9 +43,13 @@ fopen.c        - fopen() layer that supports opening URLs and files | |||||||
| ftp3rdparty.c  - FTP 3rd party transfer | ftp3rdparty.c  - FTP 3rd party transfer | ||||||
| ftpget.c       - simple getting a file from FTP | ftpget.c       - simple getting a file from FTP | ||||||
| ftpgetresp.c   - get the response strings from the FTP server | 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 | getinfo.c      - get the Content-Type from the recent transfer | ||||||
| getinmemory.c  - download a file to memory only | 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 | htmltitle.cc   - download a HTML file and extract the <title> tag from a HTML | ||||||
|                  page using libxml |                  page using libxml | ||||||
| http-post.c    - HTTP POST | 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 | persistant.c   - request two URLs with a persistant connection | ||||||
| post-callback.c - send a HTTP POST using a callback | post-callback.c - send a HTTP POST using a callback | ||||||
| postit2.c      - send a HTTP multipart formpost | postit2.c      - send a HTTP multipart formpost | ||||||
|  | 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 | sepheaders.c   - download headers to a separate file | ||||||
| simple.c       - the most simple download a URL source | simple.c       - the most simple download a URL source | ||||||
| simplepost.c   - HTTP POST | simplepost.c   - HTTP POST | ||||||
| simplessl.c    - HTTPS example with certificates many options set | simplessl.c    - HTTPS example with certificates many options set | ||||||
| synctime.c     - Sync local time by extracing date from remote HTTP servers | 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 */ | /* This is a context that we pass to all callbacks */ | ||||||
|  |  | ||||||
| typedef struct sslctxparm_st { | 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_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); |   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: |   case CURLINFO_DATA_OUT: | ||||||
|     text = "=> Send data"; |     text = "=> Send data"; | ||||||
|     break; |     break; | ||||||
|  |   case CURLINFO_SSL_DATA_OUT: | ||||||
|  |     text = "=> Send SSL data"; | ||||||
|  |     break; | ||||||
|   case CURLINFO_HEADER_IN: |   case CURLINFO_HEADER_IN: | ||||||
|     text = "<= Recv header"; |     text = "<= Recv header"; | ||||||
|     break; |     break; | ||||||
| @@ -93,9 +96,6 @@ int my_trace(CURL *handle, curl_infotype type, | |||||||
|   case CURLINFO_SSL_DATA_IN: |   case CURLINFO_SSL_DATA_IN: | ||||||
|     text = "<= Recv SSL data"; |     text = "<= Recv SSL data"; | ||||||
|     break; |     break; | ||||||
|   case CURLINFO_SSL_DATA_OUT: |  | ||||||
|     text = "<= Send SSL data"; |  | ||||||
|     break; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   dump(text, stderr, data, size, config->trace_ascii); |   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 */ |         /* get file descriptors from the transfers */ | ||||||
|         curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); |         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); |         rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||||
|  |  | ||||||
|         switch(rc) { |         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 */ |     /* now specify which file to upload */ | ||||||
|     curl_easy_setopt(curl, CURLOPT_READDATA, hd_src); |     curl_easy_setopt(curl, CURLOPT_READDATA, hd_src); | ||||||
|  |  | ||||||
|     /* and give the size of the upload */ |     /* provide the size of the upload, we specicially typecast the value | ||||||
|     curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, file_info.st_size); |        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! */ |     /* Now run off and do what you've been told! */ | ||||||
|     res = curl_easy_perform(curl); |     res = curl_easy_perform(curl); | ||||||
|   | |||||||
| @@ -1,13 +1,16 @@ | |||||||
|  | #  $Id$ | ||||||
| # | # | ||||||
| #  Adapted for djgpp / Watt-32 / DOS by | #  Adapted for djgpp / Watt-32 / DOS by | ||||||
| #  Gisle Vanem <giva@bgnett.no> | #  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) | ifeq ($(USE_SSL),1) | ||||||
|   LIBS += $(OPENSSL_ROOT)/lib/libssl.a $(OPENSSL_ROOT)/lib/libcrypt.a |   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 | LIBS += $(WATT32_ROOT)/lib/libwatt.a $(ZLIB_ROOT)/libz.a | ||||||
|  |  | ||||||
| PROGRAMS  = fopen.exe ftpget.exe ftpgetresp.exe ftpupload.exe \ | CSOURCES = fopen.c ftpget.c ftpgetresp.c ftpupload.c getinmemory.c  \ | ||||||
|             getinmemory.exe http-post.exe httpput.exe multi-app.exe \ |            http-post.c httpput.c https.c multi-app.c multi-double.c \ | ||||||
|             multi-double.exe multi-post.exe multi-single.exe \ |            multi-post.c multi-single.c persistant.c post-callback.c \ | ||||||
|             persistant.exe post-callback.exe postit2.exe \ |            postit2.c sepheaders.c simple.c simplepost.c simplessl.c \ | ||||||
|             sepheaders.exe simple.exe simplessl.exe https.exe \ |            multi-debugcallback.c fileupload.c getinfo.c anyauthput.c \ | ||||||
|             ftp3rdparty.exe getinfo.exe anyauthput.exe \ |            10-at-a-time.c # ftpuploadresume.c ftp3rdparty.c cookie_interface.c | ||||||
|             cookie_interface.exe |  | ||||||
|  | PROGRAMS = $(CSOURCES:.c=.exe) | ||||||
|  |  | ||||||
| all: $(PROGRAMS) | all: $(PROGRAMS) | ||||||
|  | 	@echo Welcome to libcurl example program | ||||||
|  |  | ||||||
| %.exe: %.c | %.exe: %.c | ||||||
| 	$(CC) $(CFLAGS) -o $@ $^ $(LIBS) | 	$(CC) $(CFLAGS) -o $@ $^ $(LIBS) | ||||||
| 	@echo | 	@echo | ||||||
|  |  | ||||||
| clean: | clean vclean realclean: | ||||||
| 	rm -f $(PROGRAMS) | 	- rm -f $(PROGRAMS) depend.dj | ||||||
|  |  | ||||||
|  | -include depend.dj | ||||||
|  |  | ||||||
|   | |||||||
| @@ -80,6 +80,10 @@ int main(int argc, char **argv) | |||||||
|     /* get file descriptors from the transfers */ |     /* get file descriptors from the transfers */ | ||||||
|     curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); |     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); |     rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||||
|  |  | ||||||
|     switch(rc) { |     switch(rc) { | ||||||
|   | |||||||
| @@ -153,6 +153,10 @@ int main(int argc, char **argv) | |||||||
|     /* get file descriptors from the transfers */ |     /* get file descriptors from the transfers */ | ||||||
|     curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); |     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); |     rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||||
|  |  | ||||||
|     switch(rc) { |     switch(rc) { | ||||||
|   | |||||||
| @@ -71,6 +71,10 @@ int main(int argc, char **argv) | |||||||
|     /* get file descriptors from the transfers */ |     /* get file descriptors from the transfers */ | ||||||
|     curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); |     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); |     rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||||
|  |  | ||||||
|     switch(rc) { |     switch(rc) { | ||||||
|   | |||||||
| @@ -93,6 +93,10 @@ int main(int argc, char *argv[]) | |||||||
|       /* get file descriptors from the transfers */ |       /* get file descriptors from the transfers */ | ||||||
|       curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); |       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); |       rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||||
|  |  | ||||||
|       switch(rc) { |       switch(rc) { | ||||||
|   | |||||||
| @@ -65,6 +65,10 @@ int main(int argc, char **argv) | |||||||
|     /* get file descriptors from the transfers */ |     /* get file descriptors from the transfers */ | ||||||
|     curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); |     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); |     rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); | ||||||
|  |  | ||||||
|     switch(rc) { |     switch(rc) { | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| /***************************************************************************** | /***************************************************************************** | ||||||
|  *                                  _   _ ____  _      |  *                                  _   _ ____  _ | ||||||
|  *  Project                     ___| | | |  _ \| |     |  *  Project                     ___| | | |  _ \| | | ||||||
|  *                             / __| | | | |_) | |     |  *                             / __| | | | |_) | | | ||||||
|  *                            | (__| |_| |  _ <| |___  |  *                            | (__| |_| |  _ <| |___ | ||||||
|  *                             \___|\___/|_| \_\_____| |  *                             \___|\___/|_| \_\_____| | ||||||
|  * |  * | ||||||
|  * $Id$ |  * $Id$ | ||||||
| @@ -41,9 +41,6 @@ int main(int argc, char **argv) | |||||||
|   /* no progress meter please */ |   /* no progress meter please */ | ||||||
|   curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1); |   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  */ |   /* send all data to this function  */ | ||||||
|   curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data); |   curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,6 +9,18 @@ | |||||||
|  * |  * | ||||||
|  * This example code only builds as-is on Windows. |  * 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 |  * Synchronising your computer clock via Internet time server usually relies | ||||||
|  * on DAYTIME, TIME, or NTP protocols. These protocols provide good accurate |  * on DAYTIME, TIME, or NTP protocols. These protocols provide good accurate | ||||||
|  * time synchronisation but it does not work very well through a |  * time synchronisation but it does not work very well through a | ||||||
| @@ -59,7 +71,9 @@ | |||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <time.h> | #include <time.h> | ||||||
|  | #ifndef __CYGWIN__ | ||||||
| #include <windows.h> | #include <windows.h> | ||||||
|  | #endif | ||||||
| #include <curl/curl.h> | #include <curl/curl.h> | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -298,10 +312,11 @@ int main(int argc, char *argv[]) | |||||||
|              MthStr[LOCALTime.wMonth-1], LOCALTime.wYear, |              MthStr[LOCALTime.wMonth-1], LOCALTime.wYear, | ||||||
|              LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond, |              LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond, | ||||||
|              LOCALTime.wMilliseconds); |              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 */ |     /* HTTP HEAD command to the Webserver */ | ||||||
|     fprintf(stderr, "Fetch: %s\n", conf->timeserver); |  | ||||||
|     SyncTime_CURL_Fetch(curl, conf->timeserver, "index.htm", |     SyncTime_CURL_Fetch(curl, conf->timeserver, "index.htm", | ||||||
|                         HTTP_COMMAND_HEAD); |                         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	 \ |  curl_multi_strerror.3 curl_share_strerror.3 curl_global_init_mem.3	 \ | ||||||
|  libcurl-tutorial.3 curl_easy_reset.3 curl_easy_escape.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_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		  \ | HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html		  \ | ||||||
|  curl_easy_init.html curl_easy_perform.html curl_easy_setopt.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	  \ |  libcurl-errors.html curl_easy_strerror.html curl_multi_strerror.html	  \ | ||||||
|  curl_share_strerror.html curl_global_init_mem.html libcurl-tutorial.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_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 \ | 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	  \ |  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	  \ |  libcurl-errors.pdf curl_easy_strerror.pdf curl_multi_strerror.pdf	  \ | ||||||
|  curl_share_strerror.pdf curl_global_init_mem.pdf libcurl-tutorial.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_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) | CLEANFILES = $(HTMLPAGES) $(PDFPAGES) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| .\" nroff -man [file] | .\" nroff -man [file] | ||||||
| .\" $Id$ | .\" $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 | .SH NAME | ||||||
| curl_easy_cleanup - End a libcurl easy session | curl_easy_cleanup - End a libcurl easy session | ||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| @@ -21,6 +21,9 @@ more files. | |||||||
|  |  | ||||||
| When you've called this, you can safely remove all the strings you've | 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. | 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 | .SH RETURN VALUE | ||||||
| None | None | ||||||
| .SH "SEE ALSO" | .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 | .\" * This software is licensed as described in the file COPYING, which | ||||||
| .\" * you should have received as part of this distribution. The terms | .\" * you should have received as part of this distribution. The terms | ||||||
| @@ -98,13 +98,13 @@ downloaded. The amount is only for the latest transfer and will be reset again | |||||||
| for each new transfer. | for each new transfer. | ||||||
| .IP CURLINFO_SPEED_DOWNLOAD | .IP CURLINFO_SPEED_DOWNLOAD | ||||||
| Pass a pointer to a double to receive the average download speed that curl | 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 | .IP CURLINFO_SPEED_UPLOAD | ||||||
| Pass a pointer to a double to receive the average upload speed that curl | 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 | .IP CURLINFO_HEADER_SIZE | ||||||
| Pass a pointer to a long to receive the total size of all the headers | 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 | .IP CURLINFO_REQUEST_SIZE | ||||||
| Pass a pointer to a long to receive the total size of the issued | 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 | 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 | .\" * This software is licensed as described in the file COPYING, which | ||||||
| .\" * you should have received as part of this distribution. The terms | .\" * you should have received as part of this distribution. The terms | ||||||
| @@ -21,7 +21,7 @@ | |||||||
| .\" * $Id$ | .\" * $Id$ | ||||||
| .\" ************************************************************************** | .\" ************************************************************************** | ||||||
| .\" | .\" | ||||||
| .TH curl_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 | .SH NAME | ||||||
| curl_easy_setopt \- set options for a curl easy handle | curl_easy_setopt \- set options for a curl easy handle | ||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| @@ -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 | 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 | 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 | 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) | 7.12.3) | ||||||
| .IP CURLOPT_IOCTLDATA | .IP CURLOPT_IOCTLDATA | ||||||
| Pass a pointer that will be untouched by libcurl and passed as the 3rd | 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 | argument in the ioctl callback set with \fICURLOPT_IOCTLFUNCTION\fP.  (Option | ||||||
| added in 7.12.3) | 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 | .IP CURLOPT_PROGRESSFUNCTION | ||||||
| Function pointer that should match the \fIcurl_progress_callback\fP prototype | 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 | 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 | its internal equivalent with a frequent interval during operation (roughly | ||||||
| once per second).  Unknown/unused argument values pass to the callback will be | once per second) no matter if data is being transfered or not.  Unknown/unused | ||||||
| set to zero (like if you only download data, the upload size will remain | argument values passed to the callback will be set to zero (like if you only | ||||||
| 0). Returning a non-zero value from this callback will cause libcurl to abort | download data, the upload size will remain 0). Returning a non-zero value from | ||||||
| the transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP. | 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 | If you transfer data with the multi interface, this function will not be | ||||||
| called during periods of idleness unless you call the appropriate libcurl | 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 | 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 | returned is equal to or larger than 400. The default action would be to return | ||||||
| the page normally, ignoring that code. | 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 | .SH NETWORK OPTIONS | ||||||
| .IP CURLOPT_URL | .IP CURLOPT_URL | ||||||
| The actual URL to deal with. The parameter should be a char * to a zero | 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 | \fBall_proxy\fP etc, if any of those is set. The \fICURLOPT_PROXY\fP option | ||||||
| does however override any possibly set environment variables. | does however override any possibly set environment variables. | ||||||
|  |  | ||||||
| Starting with 7.14.1, the proxy host string can be specified the exact same | Setting the proxy string to "" (an empty string) will explicitly disable the | ||||||
| way as the proxy environment variables, include protocol prefix (http://) and | use of a proxy, even if there is an environment variable set for it. | ||||||
| embedded user + password. |  | ||||||
|  | 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 | .IP CURLOPT_PROXYPORT | ||||||
| Pass a long with this option to set the proxy port to connect to unless it is | Pass a long with this option to set the proxy port to connect to unless it is | ||||||
| specified in the proxy string \fICURLOPT_PROXY\fP. | specified in the proxy string \fICURLOPT_PROXY\fP. | ||||||
| @@ -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 | 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 | progress, and will simply stop the download when the server ends the | ||||||
| connection. (added in 7.14.1) | 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 | .RE | ||||||
| .SH FTP OPTIONS | .SH FTP OPTIONS | ||||||
| .IP CURLOPT_FTPPORT | .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 | 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 | struct curl_slist structs properly filled in as described for | ||||||
| \fICURLOPT_QUOTE\fP. Disable this operation again by setting a NULL to this | \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 | .IP CURLOPT_FTPLISTONLY | ||||||
| A non-zero parameter tells the library to just list the names of an ftp | 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 | 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 | recommended that if used in conjunction with \fICURLOPT_TIMEOUT\fP, you set | ||||||
| \fICURLOPT_FTP_RESPONSE_TIMEOUT\fP to a value smaller than | \fICURLOPT_FTP_RESPONSE_TIMEOUT\fP to a value smaller than | ||||||
| \fICURLOPT_TIMEOUT\fP.  (Added in 7.10.8) | \fICURLOPT_TIMEOUT\fP.  (Added in 7.10.8) | ||||||
|  | .IP CURLOPT_FTP_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 | .IP CURLOPT_FTP_SKIP_PASV_IP | ||||||
| Pass a long. If set to a non-zero value, it instructs libcurl to not use the | 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 | 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 | .IP CURLFTPAUTH_TLS | ||||||
| Try "AUTH TLS" first, and only if that fails try "AUTH SSL" | Try "AUTH TLS" first, and only if that fails try "AUTH SSL" | ||||||
| .RE | .RE | ||||||
| .IP CURLOPT_SOURCE_URL | .IP CURLOPT_FTP_SSL_CCC | ||||||
| When set, it enables a FTP third party transfer, using the set URL as source, | If enabled, this option makes libcurl use CCC (Clear Command Channel). It | ||||||
| while \fICURLOPT_URL\fP is the target. | shuts down the SSL/TLS layer after authenticating. The rest of the | ||||||
| .IP CURLOPT_SOURCE_USERPWD | control channel communication will be unencrypted. This allows NAT routers | ||||||
| Set "username:password" to use for the source connection when doing FTP third | to follow the FTP transaction. Pass a long using one of the values below. | ||||||
| party transfers. | (Added in 7.16.1) | ||||||
| .IP CURLOPT_SOURCE_QUOTE | .RS | ||||||
| Exactly like \fICURLOPT_QUOTE\fP, but for the source host. | .IP CURLFTPSSL_CCC_NONE | ||||||
| .IP CURLOPT_SOURCE_PREQUOTE | Don't attempt to use CCC. | ||||||
| Exactly like \fICURLOPT_PREQUOTE\fP, but for the source host. | .IP CURLFTPSSL_CCC_PASSIVE | ||||||
| .IP CURLOPT_SOURCE_POSTQUOTE | Do not initiate the shutdown, but wait for the server to do it. Do not send | ||||||
| Exactly like \fICURLOPT_POSTQUOTE\fP, but for the source host. | a reply. | ||||||
|  | .IP CURLFTPSSL_CCC_ACTIVE | ||||||
|  | Initiate the shutdown and wait for a reply. | ||||||
|  | .RE | ||||||
| .IP CURLOPT_FTP_ACCOUNT | .IP CURLOPT_FTP_ACCOUNT | ||||||
| Pass a pointer to a zero-terminated string (or NULL to disable). When an FTP | 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, | 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 | .IP CURLOPT_RESUME_FROM | ||||||
| Pass a long as parameter. It contains the offset in number of bytes that you | 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 | 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 | .IP CURLOPT_RESUME_FROM_LARGE | ||||||
| Pass a curl_off_t as parameter. It contains the offset in number of bytes that | 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) | 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 | When uploading a file to a remote site, this option should be used to tell | ||||||
| libcurl what the expected size of the infile is. This value should be passed | libcurl what the expected size of the infile is. This value should be passed | ||||||
| as a long. See also \fICURLOPT_INFILESIZE_LARGE\fP. | 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 | .IP CURLOPT_INFILESIZE_LARGE | ||||||
| When uploading a file to a remote site, this option should be used to tell | When uploading a file to a remote site, this option should be used to tell | ||||||
| libcurl what the expected size of the infile is.  This value should be passed | libcurl what the expected size of the infile is.  This value should be passed | ||||||
| as a curl_off_t. (Added in 7.11.0) | 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 | .IP CURLOPT_UPLOAD | ||||||
| A non-zero parameter tells the library to prepare for an upload. The | A non-zero parameter tells the library to prepare for an upload. The | ||||||
| \fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZEE\fP or | \fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP or | ||||||
| \fICURLOPT_INFILESIZE_LARGE\fP are also interesting for uploads. If the | \fICURLOPT_INFILESIZE_LARGE\fP options are also interesting for uploads. If | ||||||
| protocol is HTTP, uploading means using the PUT request unless you tell | the protocol is HTTP, uploading means using the PUT request unless you tell | ||||||
| libcurl otherwise. | libcurl otherwise. | ||||||
|  |  | ||||||
| Using PUT with HTTP 1.1 implies the use of a "Expect: 100-continue" header. | 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 | In unix-like systems, this might cause signals to be used unless | ||||||
| \fICURLOPT_NOSIGNAL\fP is set. | \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 | .IP CURLOPT_LOW_SPEED_LIMIT | ||||||
| Pass a long as parameter. It contains the transfer speed in bytes per second | Pass a long as parameter. It contains the transfer speed in bytes per second | ||||||
| that the transfer should be below during \fICURLOPT_LOW_SPEED_TIME\fP seconds | that the transfer should be below during \fICURLOPT_LOW_SPEED_TIME\fP seconds | ||||||
| @@ -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 | 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 | should be below the \fICURLOPT_LOW_SPEED_LIMIT\fP for the library to consider | ||||||
| it too slow and abort. | 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 | .IP CURLOPT_MAXCONNECTS | ||||||
| Pass a long. The set number will be the persistent connection cache size. The | 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 | 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 | behaviour. This concerns connection using any of the protocols that support | ||||||
| persistent connections. | persistent connections. | ||||||
|  |  | ||||||
| When reaching the maximum limit, curl uses the \fICURLOPT_CLOSEPOLICY\fP to | When reaching the maximum limit, curl closes the oldest one in the cache to | ||||||
| figure out which of the existing connections to close to prevent the number of | prevent the number of open connections to increase. | ||||||
| open connections to increase. |  | ||||||
|  |  | ||||||
| If you already have performed transfers with this curl handle, setting a | If you already have performed transfers with this curl handle, setting a | ||||||
| smaller MAXCONNECTS than before may cause open connections to get closed | smaller MAXCONNECTS than before may cause open connections to get closed | ||||||
| unnecessarily. | unnecessarily. | ||||||
| .IP CURLOPT_CLOSEPOLICY | .IP CURLOPT_CLOSEPOLICY | ||||||
| Pass a long. This option sets what policy libcurl should use when the | (Obsolete) This option does nothing. | ||||||
| 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. |  | ||||||
| .IP CURLOPT_FRESH_CONNECT | .IP CURLOPT_FRESH_CONNECT | ||||||
| Pass a long. Set to non-zero to make the next transfer use a new (fresh) | 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, | 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 | In unix-like systems, this might cause signals to be used unless | ||||||
| \fICURLOPT_NOSIGNAL\fP is set. | \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 | .IP CURLOPT_IPRESOLVE | ||||||
| Allows an application to select what kind of IP addresses to use when | Allows an application to select what kind of IP addresses to use when | ||||||
| resolving host names. This is only interesting when using host names that | resolving host names. This is only interesting when using host names that | ||||||
| @@ -1111,7 +1176,7 @@ Resolve to ipv4 addresses. | |||||||
| .IP CURL_IPRESOLVE_V6 | .IP CURL_IPRESOLVE_V6 | ||||||
| Resolve to ipv6 addresses. | Resolve to ipv6 addresses. | ||||||
| .RE | .RE | ||||||
| .SH CURLOPT_CONNECT_ONLY | .IP CURLOPT_CONNECT_ONLY | ||||||
| Pass a long. A non-zero parameter tells the library to perform any required | Pass a long. A non-zero parameter tells the library to perform any required | ||||||
| proxy authentication and connection setup, but no data transfer. | 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 | 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 | the file name of your certificate. The default format is "PEM" and can be | ||||||
| changed with \fICURLOPT_SSLCERTTYPE\fP. | changed with \fICURLOPT_SSLCERTTYPE\fP. | ||||||
|  |  | ||||||
|  | With NSS this is the nickname of the certificate you wish to authenticate | ||||||
|  | with. | ||||||
| .IP CURLOPT_SSLCERTTYPE | .IP CURLOPT_SSLCERTTYPE | ||||||
| Pass a pointer to a zero terminated string as parameter. The string should be | Pass a pointer to a zero terminated string as parameter. The string should be | ||||||
| the format of your certificate. Supported formats are "PEM" and "DER".  (Added | 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. | \&"DER" format key file currently does not work because of a bug in OpenSSL. | ||||||
| .IP CURLOPT_SSLKEYPASSWD | .IP CURLOPT_SSLKEYPASSWD | ||||||
| Pass a pointer to a zero terminated string as parameter. It will be used as | Pass a pointer to a zero terminated string as parameter. It will be used as | ||||||
| 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 | .IP CURLOPT_SSLENGINE | ||||||
| Pass a pointer to a zero terminated string as parameter. It will be used as | Pass a pointer to a zero terminated string as parameter. It will be used as | ||||||
| the identifier for the crypto engine you want to use for your private | the identifier for the crypto engine you want to use for your private | ||||||
| @@ -1168,8 +1237,8 @@ Pass a long as parameter to control what version of SSL/TLS to attempt to use. | |||||||
| The available options are: | The available options are: | ||||||
| .RS | .RS | ||||||
| .IP CURL_SSLVERSION_DEFAULT | .IP CURL_SSLVERSION_DEFAULT | ||||||
| The default action. When libcurl built with OpenSSL, this will attempt to | The default action. When libcurl built with OpenSSL or NSS, this will attempt | ||||||
| figure out the remote SSL protocol version. Unfortunately there are a lot of | 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 | 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. | fail to connect. When libcurl is built with GnuTLS, this will mean SSLv3. | ||||||
| .IP CURL_SSLVERSION_TLSv1 | .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 | 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. | 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 | .IP CURLOPT_CAPATH | ||||||
| Pass a char * to a zero terminated string naming a directory holding | Pass a char * to a zero terminated string naming a directory holding multiple | ||||||
| multiple CA certificates to verify the peer with. The certificate | CA certificates to verify the peer with. The certificate directory must be | ||||||
| directory must be prepared using the openssl c_rehash utility. This | prepared using the openssl c_rehash utility. This makes sense only when used | ||||||
| makes sense only when used in combination with the | in combination with the \fICURLOPT_SSL_VERIFYPEER\fP option.  If | ||||||
| \fICURLOPT_SSL_VERIFYPEER\fP option.  If \fICURLOPT_SSL_VERIFYPEER\fP | \fICURLOPT_SSL_VERIFYPEER\fP is zero, \fICURLOPT_CAPATH\fP need not even | ||||||
| is zero, \fICURLOPT_CAPATH\fP need not even indicate an accessible | indicate an accessible path.  The \fICURLOPT_CAPATH\fP function apparently | ||||||
| path.  The \fICURLOPT_CAPATH\fP function apparently does not work in | does not work in Windows due to some limitation in openssl. This option is | ||||||
| Windows due to some limitation in openssl. (Added in 7.9.8) | OpenSSL-specific and does nothing if libcurl is built to use GnuTLS. | ||||||
| .IP CURLOPT_RANDOM_FILE | .IP CURLOPT_RANDOM_FILE | ||||||
| Pass a char * to a zero terminated file name. The file will be used to read | 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, | 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, | 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 | 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 | 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 | \'SHA1+DES\', 'TLSv1' and 'DEFAULT'. The default list is normally set when you | ||||||
| compile OpenSSL. | compile OpenSSL. | ||||||
|  |  | ||||||
| You'll find more details about cipher lists on this URL: | You'll find more details about cipher lists on this URL: | ||||||
| \fIhttp://www.openssl.org/docs/apps/ciphers.html\fP | \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 | .IP CURLOPT_KRB4LEVEL | ||||||
| Pass a char * as parameter. Set the krb4 security level, this also enables | Pass a char * as parameter. Set the krb4 security level, this also enables | ||||||
| krb4 awareness.  This is a string, 'clear', 'safe', 'confidential' or | krb4 awareness.  This is a string, 'clear', 'safe', 'confidential' or | ||||||
| \&'private'.  If the string is set but doesn't match one of these, 'private' | \&'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 | will be used. Set the string to NULL to disable kerberos4. The kerberos | ||||||
| support only works for FTP. | 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 | .SH OTHER OPTIONS | ||||||
| .IP CURLOPT_PRIVATE | .IP CURLOPT_PRIVATE | ||||||
| Pass a char * as parameter, pointing to data that should be associated with | 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