git-annex 5.20151102.1 → 5.20151116
raw patch · 384 files changed
+23747/−635 lines, 384 filesdep +concurrent-outputdep −ascii-progressdep −terminal-sizebinary-added
Dependencies added: concurrent-output
Dependencies removed: ascii-progress, terminal-size
Files
- Annex.hs +2/−0
- Annex/Concurrent.hs +3/−1
- Annex/Content.hs +8/−16
- Annex/Init.hs +28/−1
- Annex/LockFile.hs +6/−6
- Annex/LockPool.hs +17/−0
- Annex/LockPool/PosixOrPid.hs +91/−0
- Annex/Queue.hs +13/−1
- Annex/ReplaceFile.hs +12/−20
- Annex/Ssh.hs +8/−7
- Annex/Transfer.hs +7/−5
- Assistant/Sync.hs +17/−6
- BuildFlags.hs +3/−0
- CHANGELOG +35/−0
- CmdLine/Action.hs +29/−3
- CmdLine/GitAnnex/Options.hs +10/−1
- Command/Add.hs +9/−10
- Command/AddUrl.hs +7/−6
- Command/Copy.hs +5/−4
- Command/Drop.hs +6/−5
- Command/Fsck.hs +9/−3
- Command/Get.hs +1/−1
- Command/Import.hs +16/−4
- Command/Mirror.hs +5/−4
- Command/Move.hs +5/−4
- Command/Sync.hs +1/−1
- Git/CheckIgnore.hs +3/−1
- Git/Filename.hs +2/−2
- Git/Queue.hs +22/−12
- Locations.hs +8/−3
- Logs/Remote.hs +3/−3
- Logs/Transfer.hs +19/−20
- Makefile +6/−1
- Messages.hs +25/−21
- Messages/Concurrent.hs +110/−0
- Messages/Internal.hs +21/−11
- Messages/Progress.hs +35/−71
- Remote/Git.hs +3/−3
- Remote/Helper/Hooks.hs +2/−2
- Test.hs +8/−8
- Types/GitConfig.hs +7/−1
- Types/Key.hs +6/−6
- Types/LockCache.hs +1/−1
- Types/Messages.hs +20/−2
- Utility/Daemon.hs +11/−9
- Utility/FileMode.hs +6/−4
- Utility/Format.hs +3/−3
- Utility/LockFile/LockStatus.hs +13/−0
- Utility/LockFile/PidLock.hs +239/−0
- Utility/LockFile/Posix.hs +3/−3
- Utility/LockPool/LockHandle.hs +25/−14
- Utility/LockPool/PidLock.hs +59/−0
- Utility/LockPool/Posix.hs +10/−7
- Utility/LockPool/Windows.hs +7/−2
- Utility/Quvi.hs +21/−8
- Utility/SafeCommand.hs +4/−4
- debian/changelog +35/−0
- debian/patches/standalone-build +0/−6
- debian/rules +3/−2
- doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment +16/−0
- doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment +15/−0
- doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment +10/−0
- doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment +8/−0
- doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment +8/−0
- doc/Android/oldcomments/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment +8/−0
- doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment +27/−0
- doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment +8/−0
- doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment +17/−0
- doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment +15/−0
- doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment +8/−0
- doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment +8/−0
- doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment +8/−0
- doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment +10/−0
- doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment +10/−0
- doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment +12/−0
- doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment +34/−0
- doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment +10/−0
- doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment +10/−0
- doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment +14/−0
- doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment +10/−0
- doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment +8/−0
- doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment +18/−0
- doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment +8/−0
- doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment +8/−0
- doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment +10/−0
- doc/bugs/.mdwn +0/−250
- doc/bugs/Assistant_drops_files_from_remote_repos_that_it_shouldn__39__t.mdwn +39/−0
- doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn +31/−0
- doc/bugs/Error_writing_log_message_when_filename_contains_Unicode_chars.mdwn +25/−0
- doc/bugs/Files_in___34__here__34___not_known_to_git_annex.mdwn +2/−0
- doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn +69/−0
- doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn +20/−0
- doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn +23/−0
- doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment +14/−0
- doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment +8/−0
- doc/bugs/S3_memory_leaks/comment_3_5e9cecb0e2ec7602963406779b6e3c1f._comment +12/−0
- doc/bugs/S3_memory_leaks/comment_4_37e41b518813bd7c349017abf4a0ca0f._comment +8/−0
- doc/bugs/S3_memory_leaks/comment_5_1b6d13852aeb37c5c29baf100bd62789._comment +8/−0
- doc/bugs/S3_memory_leaks/comment_6_71ffb88f548969fd4d45eac4656380c0._comment +11/−0
- doc/bugs/S3_memory_leaks/comment_7_1ac572b79caa23e3f791e4f8461fcddd._comment +10/−0
- doc/bugs/STANDARD__95__IA_for_S3_remote_not_working.mdwn +3/−0
- doc/bugs/Support_non-default_storage_classes_with_Google_Cloud_Storage.mdwn +94/−0
- doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn +31/−0
- doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn +30/−0
- doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn +95/−0
- doc/bugs/annex_add_doesn__39__t_any_longer_by_default_commit_git-annex.mdwn +43/−0
- doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment +27/−0
- doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment +32/−0
- doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment +16/−0
- doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment +14/−0
- doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn +29/−0
- doc/bugs/detox___34__destroys__34___annex.mdwn +34/−0
- doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn +14/−0
- doc/bugs/git-annex-shell/comment_1_3d2c3827de34509c0a5595eda07dd18f._comment +13/−0
- doc/bugs/git_annex_info_is_reporting_file_as_not_annexed_in_direct_mode.mdwn +38/−0
- doc/bugs/git_annex_sync_--content_may_copy_then_drop_a_file_to_a_remote.mdwn +35/−0
- doc/bugs/hPutChar_error_message_with_UTF-8_chars_above_7F_in_filenames.mdwn +80/−0
- doc/bugs/local_pair_fails_if_non-ascii_characters_present_on_annex_path.mdwn +18/−0
- doc/bugs/misuse_of_--git-dir_might_destroy_a_git_repository_completely.mdwn +34/−0
- doc/bugs/symlinks_to_absent_files_remain_upon_switching_to_direct_mode.mdwn +72/−0
- doc/bugs/symlinks_to_absent_files_remain_upon_switching_to_direct_mode2.mdwn +90/−0
- doc/bugs/webapp_fails_to_connect_to_ssh_repository___40__windows__41__.mdwn +40/−0
- doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment +14/−0
- doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn +34/−0
- doc/devblog/day_332__concurrent_output_at_long_last.mdwn +6/−0
- doc/devblog/day_333__cylons.mdwn +5/−0
- doc/devblog/day_334__too_easy.mdwn +6/−0
- doc/devblog/day_335__catching_up_with_the_bug_reports.mdwn +4/−0
- doc/devblog/day_336__pid_locks.mdwn +27/−0
- doc/devblog/day_337__who_needs_POSIX.mdwn +21/−0
- doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment +8/−0
- doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment +10/−0
- doc/forum/A_little_help_with_headless_server_configuration.mdwn +2/−0
- doc/forum/Desktop_as_transfer_repository.mdwn +33/−0
- doc/forum/Direct_Mode_-_Restore_file_from_Full_Backup_Repository__63__.mdwn +14/−0
- doc/forum/Git_annex_status_always_showing_annexed_files_as_modified.mdwn +33/−0
- doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn +9/−0
- doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment +21/−0
- doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment +17/−0
- doc/forum/Modus_operandi_for_local_full_backup.mdwn +20/−0
- doc/forum/Purge_a_remote/comment_1_78b3b77f457c65d31fd8a5abf714905d._comment +8/−0
- doc/forum/Purge_a_remote/comment_2_dc65719157dee63b3979563ed57ee0ce._comment +10/−0
- doc/forum/Purge_a_remote/comment_3_63e0280273b816fa4b837724e102f813._comment +8/−0
- doc/forum/Purge_a_remote/comment_4_7fad1c4798ca03a4095ac3241c279f6d._comment +11/−0
- doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn +11/−0
- doc/forum/Use_case_for_addurl.mdwn +8/−0
- doc/forum/Using_the_Git-Annex_Assistant_as_a_Backup_and_Syncing_Service.mdwn +5/−0
- doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment +10/−0
- doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key.mdwn +19/−0
- doc/forum/big_overhead/comment_10_d5f4e353e7f711d8c38cdcc222339bca._comment +14/−0
- doc/forum/big_overhead/comment_11_cbf25217e4149f2cfad4e2bf94f2b4ca._comment +8/−0
- doc/forum/big_overhead/comment_12_475d5af95adcfcd3a51e10f270205eb7._comment +71/−0
- doc/forum/big_overhead/comment_13_1c8cc992f04fc63179094c494bd25025._comment +10/−0
- doc/forum/big_overhead/comment_14_cbfb3d557915258e72c65a4e84df77a9._comment +8/−0
- doc/forum/big_overhead/comment_15_b973529bae549bcbaaae792f0403989b._comment +10/−0
- doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn +15/−0
- doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn +6/−0
- doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__.mdwn +5/−0
- doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn +3/−0
- doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn +2/−0
- doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up.mdwn +27/−0
- doc/git-annex-add.mdwn +5/−0
- doc/git-annex-addurl.mdwn +5/−0
- doc/git-annex-drop.mdwn +6/−0
- doc/git-annex-fsck.mdwn +4/−0
- doc/git-annex-import.mdwn +5/−0
- doc/git-annex.mdwn +26/−0
- doc/install/OSX/MacPorts/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment +17/−0
- doc/install/OSX/porting/comment_10_cd2120552ef894a37933b328136fa4cc._comment +8/−0
- doc/install/OSX/porting/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment +8/−0
- doc/install/OSX/porting/comment_12_a84028080578a8b60115b6c4ef823627._comment +8/−0
- doc/install/OSX/porting/comment_13_d6f1db401858ffea23c123db49f5b296._comment +8/−0
- doc/install/OSX/porting/comment_14_035f856923276b0edad879e196e94097._comment +9/−0
- doc/install/OSX/porting/comment_15_336e0acb00e84943715e69917643a69e._comment +35/−0
- doc/install/OSX/porting/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment +36/−0
- doc/install/OSX/porting/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment +10/−0
- doc/install/OSX/porting/comment_18_537fad5d8854e765499d47602d1ab398._comment +8/−0
- doc/install/OSX/porting/comment_19_18d4377f4ded5604d395d73783ba82c9._comment +8/−0
- doc/install/OSX/porting/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment +12/−0
- doc/install/OSX/porting/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment +30/−0
- doc/install/OSX/porting/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment +12/−0
- doc/install/OSX/porting/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment +14/−0
- doc/install/OSX/porting/comment_27_d453510b9bb62072a4c663206c12c8a4._comment +8/−0
- doc/install/OSX/porting/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment +18/−0
- doc/install/OSX/porting/comment_29_8622ed56c6a8034c20fb311418d94003._comment +8/−0
- doc/install/OSX/porting/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment +8/−0
- doc/install/OSX/porting/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment +10/−0
- doc/install/OSX/porting/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment +10/−0
- doc/install/OSX/porting/comment_33_203a36322b3c453c05c8906c64e62e06._comment +8/−0
- doc/install/OSX/porting/comment_34_874ff01f27911baf6ef0f559d5d5f5a0._comment +27/−0
- doc/install/OSX/porting/comment_8_38d9c2eea1090674de2361274eab5b0e._comment +29/−0
- doc/install/OSX/porting/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment +8/−0
- doc/install/fromsource/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment +8/−0
- doc/install/fromsource/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment +44/−0
- doc/install/fromsource/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment +12/−0
- doc/install/fromsource/comment_13_3dac019cda71bf99878c0a1d9382323b._comment +8/−0
- doc/install/fromsource/comment_14_14b46470593f84f8c3768a91cb77bdab._comment +9/−0
- doc/install/fromsource/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment +8/−0
- doc/install/fromsource/comment_16_4faf214f97f9516898d7c17d743ef825._comment +10/−0
- doc/install/fromsource/comment_17_2a9d6807a3a13815c824985521757167._comment +10/−0
- doc/install/fromsource/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment +10/−0
- doc/install/fromsource/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment +44/−0
- doc/install/fromsource/comment_20_0f553be2a4c666e3bed58b2bce549406._comment +8/−0
- doc/install/fromsource/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment +8/−0
- doc/install/fromsource/comment_22_2f27b78215f97ade1986ca806c634cb3._comment +16/−0
- doc/install/fromsource/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment +8/−0
- doc/install/fromsource/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment +8/−0
- doc/install/fromsource/comment_25_8a7664e6f9271718dc607a0782366c5b._comment +8/−0
- doc/install/fromsource/comment_26_bd455c732639728bce2bfc39e32871d2._comment +8/−0
- doc/install/fromsource/comment_27_c080e9239b6eec88d329c28da7bb4141._comment +17/−0
- doc/install/fromsource/comment_28_15951dd070a675300420eea137a28ef9._comment +10/−0
- doc/install/fromsource/comment_29_ac082dca67f4a29b06070c0283130f52._comment +39/−0
- doc/install/fromsource/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment +35/−0
- doc/install/fromsource/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment +22/−0
- doc/install/fromsource/comment_32_1d34c294486c85b1149675fa5861ae35._comment +10/−0
- doc/install/fromsource/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment +21/−0
- doc/install/fromsource/comment_34_38451e751add6daf479b559c4b6a7c61._comment +8/−0
- doc/install/fromsource/comment_35_4d44e4531e6686bd340f26836ad40026._comment +8/−0
- doc/install/fromsource/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment +16/−0
- doc/install/fromsource/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment +69/−0
- doc/install/fromsource/comment_38_5c1e96221154a4ae4ebd636232044ced._comment +16/−0
- doc/install/fromsource/comment_39_a86057d7e6d47113330f79e1812c3a5d._comment +10/−0
- doc/install/fromsource/comment_45_d9cccbb9620cc8218e72b5380fd89a05._comment +8/−0
- doc/install/fromsource/comment_46_954de34275d33bc4590927f911761563._comment +10/−0
- doc/install/fromsource/comment_47_6de25c1e450e1e3b1d18d2c76235ccb8._comment +7/−0
- doc/install/fromsource/comment_48_9c08300c5d172ba9223042a00c8acb2b._comment +18/−0
- doc/install/fromsource/comment_49_c8370525547b435d963a2c1192a21124._comment +93/−0
- doc/install/fromsource/comment_50_c1ce6084ba1e96afa30e18f0f6433aa4._comment +10/−0
- doc/install/fromsource/comment_51_514bac1020c4227a23380d1675184fc7._comment +18/−0
- doc/install/fromsource/comment_52_df7d36e4d169fbc4199026d7af1aa581._comment +8/−0
- doc/install/fromsource/comment_53_e4bb31024aa4a317be2f45667b6d6f9f._comment +8/−0
- doc/news/version_5.20151116.mdwn +32/−0
- doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment +10/−0
- doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment +12/−0
- doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment +8/−0
- doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment +33/−0
- doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment +12/−0
- doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment +8/−0
- doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment +8/−0
- doc/special_remotes/S3/comment_17_52d3510016c099d083553f9b3fa40db9._comment +10/−0
- doc/special_remotes/S3/comment_18_0dcb84048563fc9e45b66ca8f365f320._comment +7/−0
- doc/special_remotes/S3/comment_19_9d0d622b6202698f09eb06c097579fbb._comment +19/−0
- doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment +23/−0
- doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment +24/−0
- doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment +8/−0
- doc/special_remotes/bup/comment_12_fca579678edde073716f099c767767e1._comment +10/−0
- doc/special_remotes/bup/comment_13_ce960bc69b27dfc2a233c9baa5b2cd2b._comment +10/−0
- doc/special_remotes/bup/comment_14_940b778f97377e83dc16439c0c7e5b38._comment +21/−0
- doc/special_remotes/bup/comment_15_91e34a0087eaec6ad3c393179621a471._comment +7/−0
- doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment +43/−0
- doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment +12/−0
- doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment +17/−0
- doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment +10/−0
- doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment +10/−0
- doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment +10/−0
- doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment +12/−0
- doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment +10/−0
- doc/special_remotes/comment_27_b37c6ed2444bd7e8b4d7937abdfcbd1c._comment +13/−0
- doc/special_remotes/comment_28_c7ab32e1e63fc114b3b2f56bab62eafa._comment +8/−0
- doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment +32/−0
- doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment +17/−0
- doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment +17/−0
- doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment +18/−0
- doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment +10/−0
- doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment +12/−0
- doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment +10/−0
- doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment +30/−0
- doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment +10/−0
- doc/special_remotes/ipfs/comment_1_d1b2da148715476015716a2f866558b9._comment +7/−0
- doc/special_remotes/ipfs/comment_2_564271a8660d7bbade6e4ed396fcfb57._comment +18/−0
- doc/special_remotes/ipfs/comment_3_b8c7e402e0ee63d659ae33e3e2504ca2._comment +8/−0
- doc/special_remotes/ipfs/comment_4_06611859079239659ba7d73d655f517e._comment +23/−0
- doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment +8/−0
- doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment +8/−0
- doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment +11/−0
- doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment +10/−0
- doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment +28/−0
- doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment +14/−0
- doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment +73/−0
- doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment +8/−0
- doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment +10/−0
- doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment +8/−0
- doc/special_remotes/xmpp/comment_9_eda76b826491c96b1ce072aacf9d3adf._comment +23/−0
- doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment +10/−0
- doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment +13/−0
- doc/tips/recover_data_from_lost+found.mdwn +2/−3
- doc/tips/skydriveannex/comment_10_c3465b5587548dea56b80b32cd66d653._comment +16/−0
- doc/tips/skydriveannex/comment_11_13692d8cb9ccf10ced26d90739385a6a._comment +47/−0
- doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment +8/−0
- doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment +8/−0
- doc/tips/using_Amazon_S3/comment_3_32acba030c2ad252e2f7027075e4303e._comment +8/−0
- doc/tips/using_Amazon_S3/comment_4_92df5a9f923beafba55a1c455728112e._comment +13/−0
- doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment +8/−0
- doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment +10/−0
- doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment +33/−0
- doc/tips/using_Amazon_S3/comment_8_4f9c2f6627f8ed3423bcc8b7bf2f76cb._comment +10/−0
- doc/tips/using_Amazon_S3/comment_9_47e4ea77d0262d332d86a06d7aaeddd8._comment +11/−0
- doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn +9/−0
- doc/todo/S3_fsck_support/comment_1_9317598723ea38ae9432ad50e0de666d._comment +26/−0
- doc/todo/S3_fsck_support/comment_2_7a1ce64d362b8f75adf22709771a7787._comment +11/−0
- doc/todo/S3_fsck_support/comment_3_2b96f61188b2ada729a284e95fc89dab._comment +21/−0
- doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn +7/−0
- doc/todo/What_if_the_active_annex__39__ed_files_were_not_symlinks__63__.mdwn +26/−0
- doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment +11/−0
- doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment +8/−0
- doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment +8/−0
- doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment +8/−0
- doc/todo/git_annex_grep/comment_1_890b3ecb679b941f9c0075ed360b203e._comment +9/−0
- doc/todo/git_annex_open/comment_1_67d90a1cb104d98e816354d96e1b0306._comment +21/−0
- doc/todo/git_annex_push/comment_1_54c5494ec21621298b3111cd7c2325b1._comment +19/−0
- doc/todo/git_annex_push/comment_2_67938223c42c2a81dbfd32cd8a6a39c2._comment +7/−0
- doc/todo/git_annex_push/comment_3_ccb822eeb9b0d60f811568e4f27f970a._comment +19/−0
- doc/todo/make_addurl_respect_annex.largefiles_option.mdwn +1/−0
- doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment +12/−0
- doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment +9/−0
- doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment +8/−0
- doc/todo/openwrt_package/comment_4_132e67b34f9c616217e037e4ecac70a4._comment +8/−0
- doc/todo/parallel_get.mdwn +2/−0
- doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment +8/−0
- doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment +9/−0
- doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment +8/−0
- doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment +10/−0
- doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment +12/−0
- doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment +8/−0
- doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment +8/−0
- doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment +10/−0
- doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment +8/−0
- doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment +8/−0
- doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment +12/−0
- doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment +8/−0
- doc/users/yoh.mdwn +23/−0
- doc/walkthrough/backups/comment_1_d0244791d2abbf29553546a6a6568a0f._comment +10/−0
- git-annex.cabal +9/−10
- man/git-annex-add.1 +4/−0
- man/git-annex-addurl.1 +4/−0
- man/git-annex-drop.1 +5/−0
- man/git-annex-fsck.1 +3/−0
- man/git-annex-import.1 +4/−0
- man/git-annex.1 +24/−0
- stack.yaml +1/−1
- standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch +25/−0
- standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch +135/−0
- standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png binary
- standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png binary
- standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png binary
- standalone/android/tmp/network-2.4.1.2/LICENSE +29/−0
- standalone/android/tmp/network-2.4.1.2/Network.hs +473/−0
- standalone/android/tmp/network-2.4.1.2/Network/BSD.hsc +489/−0
- standalone/android/tmp/network-2.4.1.2/Network/Socket.hsc +1663/−0
- standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString.hsc +374/−0
- standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/IOVec.hsc +30/−0
- standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Internal.hs +54/−0
- standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Lazy.hsc +149/−0
- standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/MsgHdr.hsc +48/−0
- standalone/android/tmp/network-2.4.1.2/Network/Socket/Internal.hsc +257/−0
- standalone/android/tmp/network-2.4.1.2/Network/Socket/Types.hsc +962/−0
- standalone/android/tmp/network-2.4.1.2/Network/URI.hs +1349/−0
- standalone/android/tmp/network-2.4.1.2/README +4/−0
- standalone/android/tmp/network-2.4.1.2/Setup.hs +6/−0
- standalone/android/tmp/network-2.4.1.2/cabal.config +199/−0
- standalone/android/tmp/network-2.4.1.2/cbits/HsNet.c +22/−0
- standalone/android/tmp/network-2.4.1.2/cbits/ancilData.c +123/−0
- standalone/android/tmp/network-2.4.1.2/cbits/asyncAccept.c +72/−0
- standalone/android/tmp/network-2.4.1.2/cbits/initWinSock.c +52/−0
- standalone/android/tmp/network-2.4.1.2/cbits/winSockErr.c +76/−0
- standalone/android/tmp/network-2.4.1.2/config.guess +1420/−0
- standalone/android/tmp/network-2.4.1.2/config.sub +1799/−0
- standalone/android/tmp/network-2.4.1.2/configure +5327/−0
- standalone/android/tmp/network-2.4.1.2/configure.ac +184/−0
- standalone/android/tmp/network-2.4.1.2/examples/EchoClient.hs +18/−0
- standalone/android/tmp/network-2.4.1.2/examples/EchoServer.hs +27/−0
- standalone/android/tmp/network-2.4.1.2/include/HsNet.h +179/−0
- standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h +154/−0
- standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h.in +153/−0
- standalone/android/tmp/network-2.4.1.2/install-sh +295/−0
- standalone/android/tmp/network-2.4.1.2/network.buildinfo.in +5/−0
- standalone/android/tmp/network-2.4.1.2/network.cabal +103/−0
- standalone/android/tmp/network-2.4.1.2/tests/Regression.hs +31/−0
- standalone/android/tmp/network-2.4.1.2/tests/Simple.hs +244/−0
- standalone/android/tmp/network-2.4.1.2/tests/uri001.hs +1431/−0
- standalone/linux/skel/runshell +34/−26
- standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch +26/−0
- standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch +33/−0
- standalone/osx/git-annex.app/Contents/MacOS/runshell +8/−6
Annex.hs view
@@ -133,6 +133,7 @@ , existinghooks :: M.Map Git.Hook.Hook Bool , desktopnotify :: DesktopNotify , workers :: [Either AnnexState (Async AnnexState)]+ , concurrentjobs :: Maybe Int } newState :: GitConfig -> Git.Repo -> AnnexState@@ -177,6 +178,7 @@ , existinghooks = M.empty , desktopnotify = mempty , workers = []+ , concurrentjobs = Nothing } {- Makes an Annex state object for the specified git repo.
Annex/Concurrent.hs view
@@ -12,6 +12,7 @@ import Annex.CatFile import Annex.CheckAttr import Annex.CheckIgnore+import qualified Annex.Queue import qualified Data.Map as M @@ -51,12 +52,13 @@ } {- Merges the passed AnnexState into the current Annex state.- - Also shuts closes various handles in it. -}+ - Also closes various handles in it. -} mergeState :: AnnexState -> Annex () mergeState st = do st' <- liftIO $ snd <$> run st closehandles forM_ (M.toList $ Annex.cleanup st') $ uncurry addCleanup+ Annex.Queue.mergeFrom st' changeState $ \s -> s { errcounter = errcounter s + errcounter st' } where closehandles = do
Annex/Content.hs view
@@ -27,7 +27,6 @@ sendAnnex, prepSendAnnex, removeAnnex,- fromAnnex, moveBad, KeyLocation(..), getKeysPresent,@@ -63,7 +62,7 @@ import Annex.Link import Annex.Content.Direct import Annex.ReplaceFile-import Utility.LockPool+import Annex.LockPool import Messages.Progress import qualified Types.Remote import qualified Types.Backend@@ -114,12 +113,12 @@ =<< contentLockFile key #ifndef mingw32_HOST_OS- checkindirect contentfile = liftIO $ checkOr is_missing contentfile+ checkindirect contentfile = checkOr is_missing contentfile {- In direct mode, the content file must exist, but - the lock file generally won't exist unless a removal is in - process. -}- checkdirect contentfile lockfile = liftIO $- ifM (doesFileExist contentfile)+ checkdirect contentfile lockfile =+ ifM (liftIO $ doesFileExist contentfile) ( checkOr is_unlocked lockfile , return is_missing )@@ -187,7 +186,7 @@ withVerifiedCopy LockedCopy u (return True) a where #ifndef mingw32_HOST_OS- lock contentfile Nothing = liftIO $ tryLockShared Nothing contentfile+ lock contentfile Nothing = tryLockShared Nothing contentfile lock _ (Just lockfile) = posixLocker tryLockShared lockfile #else lock = winLocker lockShared@@ -206,7 +205,7 @@ lock contentfile Nothing = bracket_ (thawContent contentfile) (freezeContent contentfile)- (liftIO $ tryLockExclusive Nothing contentfile)+ (tryLockExclusive Nothing contentfile) lock _ (Just lockfile) = posixLocker tryLockExclusive lockfile #else lock = winLocker lockExclusive@@ -217,11 +216,11 @@ type ContentLocker = FilePath -> Maybe LockFile -> Annex (Maybe LockHandle) #ifndef mingw32_HOST_OS-posixLocker :: (Maybe FileMode -> LockFile -> IO (Maybe LockHandle)) -> LockFile -> Annex (Maybe LockHandle)+posixLocker :: (Maybe FileMode -> LockFile -> Annex (Maybe LockHandle)) -> LockFile -> Annex (Maybe LockHandle) posixLocker takelock lockfile = do mode <- annexFileMode modifyContent lockfile $- liftIO $ takelock (Just mode) lockfile+ takelock (Just mode) lockfile #else winLocker :: (LockFile -> IO (Maybe LockHandle)) -> ContentLocker@@ -572,13 +571,6 @@ go basecmd = void $ liftIO $ boolSystem "sh" [Param "-c", Param $ gencmd basecmd] gencmd = massReplace [ ("%file", shellEscape file) ]--{- Moves a key's file out of .git/annex/objects/ -}-fromAnnex :: Key -> FilePath -> Annex ()-fromAnnex key dest = cleanObjectLoc key $ do- file <- calcRepo $ gitAnnexLocation key- thawContent file- liftIO $ moveFile file dest {- Moves a key out of .git/annex/objects/ into .git/annex/bad, and - returns the file it was moved to. -}
Annex/Init.hs view
@@ -41,6 +41,7 @@ import Utility.FileMode import Annex.Perms import System.Posix.User+import qualified Utility.LockFile.Posix as Posix #endif genDescription :: Maybe String -> Annex String@@ -74,9 +75,11 @@ u <- getUUID describeUUID u =<< genDescription mdescription --- Everything except for uuid setup.+-- Everything except for uuid setup, shared clone setup, and initial+-- description. initialize' :: Annex () initialize' = do+ checkLockSupport checkFifoSupport checkCrippledFileSystem unlessM isBare $@@ -167,6 +170,24 @@ setConfig (ConfigKey "core.symlinks") (Git.Config.boolConfig False) +probeLockSupport :: Annex Bool+probeLockSupport = do+#ifdef mingw32_HOST_OS+ return True+#else+ tmp <- fromRepo gitAnnexTmpMiscDir+ let f = tmp </> "lockprobe"+ createAnnexDirectory tmp+ mode <- annexFileMode+ liftIO $ do+ nukeFile f+ ok <- catchBoolIO $ do+ Posix.dropLock =<< Posix.lockExclusive (Just mode) f+ return True+ nukeFile f+ return ok+#endif+ probeFifoSupport :: Annex Bool probeFifoSupport = do #ifdef mingw32_HOST_OS@@ -187,6 +208,12 @@ nukeFile f2 return $ either (const False) isNamedPipe ms #endif++checkLockSupport :: Annex ()+checkLockSupport = unlessM probeLockSupport $ do+ warning "Detected a filesystem without POSIX fcntl lock support."+ warning "Enabling annex.pidlock."+ setConfig (annexConfig "pidlock") (Git.Config.boolConfig True) checkFifoSupport :: Annex () checkFifoSupport = unlessM probeFifoSupport $ do
Annex/LockFile.hs view
@@ -20,7 +20,7 @@ import Types.LockCache import qualified Git import Annex.Perms-import Utility.LockPool+import Annex.LockPool import qualified Data.Map as M @@ -33,7 +33,7 @@ go Nothing = do #ifndef mingw32_HOST_OS mode <- annexFileMode- lockhandle <- liftIO $ noUmask mode $ lockShared (Just mode) file+ lockhandle <- noUmask mode $ lockShared (Just mode) file #else lockhandle <- liftIO $ waitToLock $ lockShared file #endif@@ -64,12 +64,12 @@ lockfile <- fromRepo getlockfile createAnnexDirectory $ takeDirectory lockfile mode <- annexFileMode- bracketIO (lock mode lockfile) dropLock (const a)+ bracket (lock mode lockfile) (liftIO . dropLock) (const a) where #ifndef mingw32_HOST_OS lock mode = noUmask mode . lockExclusive (Just mode) #else- lock _mode = waitToLock . lockExclusive+ lock _mode = liftIO . waitToLock . lockExclusive #endif {- Tries to take an exclusive lock and run an action. If the lock is@@ -79,12 +79,12 @@ lockfile <- fromRepo getlockfile createAnnexDirectory $ takeDirectory lockfile mode <- annexFileMode- bracketIO (lock mode lockfile) unlock go+ bracket (lock mode lockfile) (liftIO . unlock) go where #ifndef mingw32_HOST_OS lock mode = noUmask mode . tryLockExclusive (Just mode) #else- lock _mode = lockExclusive+ lock _mode = liftIO . lockExclusive #endif unlock = maybe noop dropLock go Nothing = return Nothing
+ Annex/LockPool.hs view
@@ -0,0 +1,17 @@+{- Wraps Utility.LockPool, making pid locks be used when git-annex is so+ - configured.+ -+ - Copyright 2015 Joey Hess <id@joeyh.name>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++{-# LANGUAGE CPP #-}++module Annex.LockPool (module X) where++#ifndef mingw32_HOST_OS+import Annex.LockPool.PosixOrPid as X+#else+import Utility.LockPool.Windows as X+#endif
+ Annex/LockPool/PosixOrPid.hs view
@@ -0,0 +1,91 @@+{- Wraps Utility.LockPool, making pid locks be used when git-annex is so+ - configured.+ -+ - Copyright 2015 Joey Hess <id@joeyh.name>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Annex.LockPool.PosixOrPid (+ LockFile,+ LockHandle,+ lockShared,+ lockExclusive,+ tryLockShared,+ tryLockExclusive,+ dropLock,+ checkLocked,+ LockStatus(..),+ getLockStatus,+ checkSaneLock,+) where++import Common.Annex+import qualified Annex+import qualified Utility.LockPool.Posix as Posix+import qualified Utility.LockPool.PidLock as Pid+import qualified Utility.LockPool.LockHandle as H+import Utility.LockPool.LockHandle (LockHandle, dropLock)+import Utility.LockFile.Posix (openLockFile)+import Utility.LockPool.STM (LockFile)+import Utility.LockFile.LockStatus++import System.Posix++lockShared :: Maybe FileMode -> LockFile -> Annex LockHandle+lockShared m f = pidLock m f $ Posix.lockShared m f++lockExclusive :: Maybe FileMode -> LockFile -> Annex LockHandle+lockExclusive m f = pidLock m f $ Posix.lockExclusive m f++tryLockShared :: Maybe FileMode -> LockFile -> Annex (Maybe LockHandle)+tryLockShared m f = tryPidLock m f $ Posix.tryLockShared m f++tryLockExclusive :: Maybe FileMode -> LockFile -> Annex (Maybe LockHandle)+tryLockExclusive m f = tryPidLock m f $ Posix.tryLockExclusive m f++checkLocked :: LockFile -> Annex (Maybe Bool)+checkLocked f = Posix.checkLocked f+ `pidLockCheck` Pid.checkLocked++getLockStatus :: LockFile -> Annex LockStatus+getLockStatus f = Posix.getLockStatus f+ `pidLockCheck` Pid.getLockStatus++checkSaneLock :: LockFile -> LockHandle -> Annex Bool+checkSaneLock f h = H.checkSaneLock f h+ `pidLockCheck` flip Pid.checkSaneLock h++pidLockFile :: Annex (Maybe FilePath)+pidLockFile = ifM (annexPidLock <$> Annex.getGitConfig)+ ( Just <$> fromRepo gitAnnexPidLockFile+ , pure Nothing+ )++pidLockCheck :: IO a -> (LockFile -> IO a) -> Annex a+pidLockCheck posixcheck pidcheck = + liftIO . maybe posixcheck pidcheck =<< pidLockFile++pidLock :: Maybe FileMode -> LockFile -> IO LockHandle -> Annex LockHandle+pidLock m f posixlock = go =<< pidLockFile+ where+ go Nothing = liftIO posixlock+ go (Just pidlock) = do+ timeout <- annexPidLockTimeout <$> Annex.getGitConfig+ liftIO $ do+ dummyPosixLock m f+ Pid.waitLock timeout pidlock++tryPidLock :: Maybe FileMode -> LockFile -> IO (Maybe LockHandle) -> Annex (Maybe LockHandle)+tryPidLock m f posixlock = liftIO . go =<< pidLockFile+ where+ go Nothing = posixlock+ go (Just pidlock) = do+ dummyPosixLock m f+ Pid.tryLock pidlock++-- The posix lock file is created even when using pid locks, in order to+-- avoid complicating any code that might expect to be able to see that+-- lock file.+dummyPosixLock :: Maybe FileMode -> LockFile -> IO ()+dummyPosixLock m f = closeFd =<< openLockFile ReadLock m f
Annex/Queue.hs view
@@ -5,12 +5,15 @@ - Licensed under the GNU GPL version 3 or higher. -} +{-# LANGUAGE BangPatterns #-}+ module Annex.Queue ( addCommand, addUpdateIndex, flush, flushWhenFull,- size+ size,+ mergeFrom, ) where import Common.Annex@@ -60,3 +63,12 @@ store :: Git.Queue.Queue -> Annex () store q = changeState $ \s -> s { repoqueue = Just q }++mergeFrom :: AnnexState -> Annex ()+mergeFrom st = case repoqueue st of+ Nothing -> noop+ Just newq -> do+ q <- get+ let !q' = Git.Queue.merge q newq+ store q'+ flushWhenFull
Annex/ReplaceFile.hs view
@@ -1,6 +1,6 @@ {- git-annex file replacing -- - Copyright 2013 Joey Hess <id@joeyh.name>+ - Copyright 2013-2015 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -}@@ -9,35 +9,27 @@ import Common.Annex import Annex.Perms+import Utility.Tmp {- Replaces a possibly already existing file with a new version, - atomically, by running an action. - - - The action is passed a temp file, which it can write to, and once- - done the temp file is moved into place.+ - The action is passed the name of temp file, in a temp directory, + - which it can write to, and once done the temp file is moved into place+ - and anything else in the temp directory is deleted. -- - The action can throw an IO exception, in which case the temp file+ - The action can throw an IO exception, in which case the temp directory - will be deleted, and the existing file will be preserved. - - Throws an IO exception when it was unable to replace the file. -} replaceFile :: FilePath -> (FilePath -> Annex ()) -> Annex ()-replaceFile file action = replaceFileOr file action (liftIO . nukeFile)--{- If unable to replace the file with the temp file, runs the- - rollback action, which is responsible for cleaning up the temp file. -}-replaceFileOr :: FilePath -> (FilePath -> Annex ()) -> (FilePath -> Annex ()) -> Annex ()-replaceFileOr file action rollback = do- tmpdir <- fromRepo gitAnnexTmpMiscDir- void $ createAnnexDirectory tmpdir- tmpfile <- liftIO $ setup tmpdir- go tmpfile `catchNonAsync` (const $ rollback tmpfile)- where- setup tmpdir = do- (tmpfile, h) <- openTempFileWithDefaultPermissions tmpdir "tmp"- hClose h- return tmpfile- go tmpfile = do+replaceFile file action = do+ misctmpdir <- fromRepo gitAnnexTmpMiscDir+ void $ createAnnexDirectory misctmpdir+ let basetmp = takeFileName file+ withTmpDirIn misctmpdir basetmp $ \tmpdir -> do+ let tmpfile = tmpdir <> basetmp action tmpfile liftIO $ replaceFileFrom tmpfile file
Annex/Ssh.hs view
@@ -37,7 +37,7 @@ import Annex.Index (addGitEnv) #ifndef mingw32_HOST_OS import Annex.Perms-import Utility.LockPool+import Annex.LockPool #endif {- Generates parameters to ssh to a given host (or user@host) on a given@@ -159,7 +159,7 @@ let lockfile = socket2lock socketfile unlockFile lockfile mode <- annexFileMode- v <- liftIO $ noUmask mode $ tryLockExclusive (Just mode) lockfile+ v <- noUmask mode $ tryLockExclusive (Just mode) lockfile case v of Nothing -> noop Just lck -> do@@ -263,9 +263,10 @@ {- To make any git commands be run with ssh caching enabled, - and configured ssh-options alters the local Git.Repo's gitEnv- - to set GIT_SSH=git-annex, and sets sshOptionsEnv. -}+ - to set GIT_SSH=git-annex, and set sshOptionsEnv when running git+ - commands. -} sshOptionsTo :: Git.Repo -> RemoteGitConfig -> Git.Repo -> Annex Git.Repo-sshOptionsTo remote gc g +sshOptionsTo remote gc localr | not (Git.repoIsUrl remote) || Git.repoIsHttp remote = unchanged | otherwise = case Git.Url.hostuser remote of Nothing -> unchanged@@ -277,7 +278,7 @@ prepSocket sockfile use (sshConnectionCachingParams sockfile) where- unchanged = return g+ unchanged = return localr use opts = do let sshopts = concat@@ -289,9 +290,9 @@ else do command <- liftIO programPath liftIO $ do- g' <- addGitEnv g sshOptionsEnv+ localr' <- addGitEnv localr sshOptionsEnv (toSshOptionsEnv sshopts)- addGitEnv g' "GIT_SSH" command+ addGitEnv localr' "GIT_SSH" command runSshOptions :: [String] -> String -> IO () runSshOptions args s = do
Annex/Transfer.hs view
@@ -23,7 +23,7 @@ import Annex.Notification as X import Annex.Perms import Utility.Metered-import Utility.LockPool+import Annex.LockPool import Types.Remote (Verification(..)) import Control.Concurrent@@ -79,7 +79,7 @@ info <- liftIO $ startTransferInfo file (meter, tfile, metervar) <- mkProgressUpdater t info mode <- annexFileMode- (lck, inprogress) <- liftIO $ prep tfile mode info+ (lck, inprogress) <- prep tfile mode info if inprogress && not ignorelock then do showNote "transfer already in progress, or unable to take transfer lock"@@ -98,19 +98,21 @@ Nothing -> return (Nothing, True) Just lockhandle -> ifM (checkSaneLock lck lockhandle) ( do- void $ tryIO $ writeTransferInfoFile info tfile+ void $ liftIO $ tryIO $+ writeTransferInfoFile info tfile return (Just lockhandle, False) , return (Nothing, True) ) #else- prep tfile _mode info = do+ prep tfile _mode info = liftIO $ do let lck = transferLockFile tfile v <- catchMaybeIO $ lockExclusive lck case v of Nothing -> return (Nothing, False) Just Nothing -> return (Nothing, True) Just (Just lockhandle) -> do- void $ tryIO $ writeTransferInfoFile info tfile+ void $ liftIO $ tryIO $+ writeTransferInfoFile info tfile return (Just lockhandle, False) #endif cleanup _ Nothing = noop
Assistant/Sync.hs view
@@ -28,6 +28,7 @@ import qualified Annex.Branch import Annex.UUID import Annex.TaggedPush+import Annex.Ssh import qualified Config import Git.Config import Assistant.NamedThread@@ -148,7 +149,7 @@ go _ _ _ _ [] = return [] -- no remotes, so nothing to do go shouldretry (Just branch) g u rs = do debug ["pushing to", show rs]- (succeeded, failed) <- liftIO $ inParallel (push g branch) rs+ (succeeded, failed) <- parallelPush g rs (push branch) updatemap succeeded [] if null failed then do@@ -172,16 +173,25 @@ fallback branch g u rs = do debug ["fallback pushing to", show rs]- (succeeded, failed) <- liftIO $- inParallel (\r -> taggedPush u Nothing branch r g) rs+ (succeeded, failed) <- parallelPush g rs (taggedPush u Nothing branch) updatemap succeeded failed when (notifypushes && (not $ null succeeded)) $ sendNetMessage $ NotifyPush $ map Remote.uuid succeeded return failed - push g branch remote = Command.Sync.pushBranch remote branch g+ push branch remote = Command.Sync.pushBranch remote branch +parallelPush :: Git.Repo -> [Remote] -> (Remote -> Git.Repo -> IO Bool)-> Assistant ([Remote], [Remote])+parallelPush g rs a = do+ rgs <- liftAnnex $ mapM topush rs+ (succeededrgs, failedrgs) <- liftIO $ inParallel (uncurry a) rgs+ return (map fst succeededrgs, map fst failedrgs)+ where+ topush r = (,)+ <$> pure r+ <*> sshOptionsTo (Remote.repo r) (Remote.gitconfig r) g+ {- Displays an alert while running an action that syncs with some remotes, - and returns any remotes that it failed to sync with. -@@ -221,8 +231,9 @@ manualPull currentbranch remotes = do g <- liftAnnex gitRepo let (xmppremotes, normalremotes) = partition Remote.isXMPPRemote remotes- failed <- liftIO $ forM normalremotes $ \r ->- ifM (Git.Command.runBool [Param "fetch", Param $ Remote.name r] g)+ failed <- forM normalremotes $ \r -> do+ g' <- liftAnnex $ sshOptionsTo (Remote.repo r) (Remote.gitconfig r) g+ ifM (liftIO $ Git.Command.runBool [Param "fetch", Param $ Remote.name r] g') ( return Nothing , return $ Just r )
BuildFlags.hs view
@@ -65,6 +65,9 @@ #else #warning Building without XMPP. #endif+#ifdef WITH_CONCURRENTOUTPUT+ , "ConcurrentOutput"+#endif #ifdef WITH_DNS , "DNS" #endif
CHANGELOG view
@@ -1,3 +1,38 @@+git-annex (5.20151116) unstable; urgency=medium++ * Use concurrent-output library when configured with -fConcurrentOutput.+ This allows nicely displayed messages when using the -J flag.+ * Additional commands now support the -J flag: + fsck, drop, add, addurl, import+ * import: Avoid very ugly error messages when the directory files+ are imported to is not a directort, but perhaps an annexed file.+ * Concurrent progress bars are now displayed when using -J with a command+ that moves file contents around.+ * Fix race that could result in an annexed file's symlink not being+ created, when eg, running concurrent git-annex adds.+ * add: Fix error recovery rollback to not move the injested file content+ out of the annex back to the file, because other files may point to+ that same content. Instead, copy the injected file content out to+ recover.+ * quvi may output utf-8 encoded data when the conifigured locale doesn't+ support that; avoid crashing on such invalid encoding.+ * runshell: Avoid failing when $HOME/.ssh does not exist and cannot be+ created.+ * Make the git-annex-standalone.deb prevent runshell from installing+ wrappers into $HOME/.ssh+ * Make git-annex-standalone.deb include the git-annex html documentation,+ desktop file, and base completion file, same as the regular git-annex.deb.+ * fsck: When fscking a dead repo, avoid incorrect "fixing location log"+ message, and display a warning about it being dead, since it's unusual+ to have access to a dead repo.+ * assistant: Pass ssh-options through 3 more git pull/push calls+ that were missed before.+ * Added annex.pidlock and annex.pidlocktimeout configuration to support+ filesystems where POSIX fcntl locks cannot be used.+ * init: Automatically enable annex.pidlock when necessary.++ -- Joey Hess <id@joeyh.name> Mon, 16 Nov 2015 14:17:40 -0400+ git-annex (5.20151102.1) unstable; urgency=medium * Avoid installing desktop file and program file if cabal install
CmdLine/Action.hs view
@@ -5,6 +5,8 @@ - Licensed under the GNU GPL version 3 or higher. -} +{-# LANGUAGE CPP #-}+ module CmdLine.Action where import Common.Annex@@ -12,6 +14,7 @@ import Annex.Concurrent import Types.Command import qualified Annex.Queue+import Messages.Concurrent import Messages.Internal import Types.Messages @@ -19,6 +22,10 @@ import Control.Exception (throwIO) import Data.Either +#ifdef WITH_CONCURRENTOUTPUT+import qualified System.Console.Regions as Regions+#endif+ {- Runs a command, starting with the check stage, and then - the seek stage. Finishes by running the continutation, and - then showing a count of any failures. -}@@ -47,7 +54,7 @@ commandAction :: CommandStart -> Annex () commandAction a = withOutputType go where- go (ParallelOutput n) = do+ go (ConcurrentOutput n) = do ws <- Annex.getState Annex.workers (st, ws') <- if null ws then do@@ -56,7 +63,8 @@ else do l <- liftIO $ drainTo (n-1) ws findFreeSlot l- w <- liftIO $ async $ snd <$> Annex.run st run+ w <- liftIO $ async+ $ snd <$> Annex.run st (inOwnConsoleRegion run) Annex.changeState $ \s -> s { Annex.workers = Right w:ws' } go _ = run run = void $ includeCommandAction a@@ -70,7 +78,9 @@ -} finishCommandActions :: Annex () finishCommandActions = do- l <- liftIO . drainTo 0 =<< Annex.getState Annex.workers+ ws <- Annex.getState Annex.workers+ Annex.changeState $ \s -> s { Annex.workers = [] }+ l <- liftIO $ drainTo 0 ws forM_ (lefts l) mergeState {- Wait for Asyncs from the list to finish, replacing them with their@@ -137,3 +147,19 @@ skip = return True failure = showEndFail >> return False status r = showEndResult r >> return r++{- Do concurrent output when that has been requested. -}+allowConcurrentOutput :: Annex a -> Annex a+#ifdef WITH_CONCURRENTOUTPUT+allowConcurrentOutput a = go =<< Annex.getState Annex.concurrentjobs+ where+ go Nothing = a+ go (Just n) = Regions.displayConsoleRegions $+ bracket_ (setup n) cleanup a+ setup = Annex.setOutput . ConcurrentOutput+ cleanup = do+ finishCommandActions+ Annex.setOutput NormalOutput+#else+allowConcurrentOutput = id+#endif
CmdLine/GitAnnex/Options.hs view
@@ -9,6 +9,7 @@ import Options.Applicative import Options.Applicative.Builder.Internal+import Control.Concurrent import Common.Annex import qualified Git.Config@@ -282,13 +283,21 @@ <> hidden ) +-- Note that a command that adds this option should wrap its seek+-- action in `allowConcurrentOutput`. jobsOption :: GlobalOption-jobsOption = globalSetter (Annex.setOutput . ParallelOutput) $ +jobsOption = globalSetter set $ option auto ( long "jobs" <> short 'J' <> metavar paramNumber <> help "enable concurrent jobs" <> hidden )+ where+ set n = do+ Annex.changeState $ \s -> s { Annex.concurrentjobs = Just n }+ c <- liftIO getNumCapabilities+ when (n > c) $+ liftIO $ setNumCapabilities n timeLimitOption :: GlobalOption timeLimitOption = globalSetter Limit.addTimeLimit $ strOption
Command/Add.hs view
@@ -31,11 +31,12 @@ import Annex.FileMatcher import Annex.ReplaceFile import Utility.Tmp+import Utility.CopyFile import Control.Exception (IOException) cmd :: Command-cmd = notBareRepo $ withGlobalOptions fileMatchingOptions $+cmd = notBareRepo $ withGlobalOptions (jobsOption : fileMatchingOptions) $ command "add" SectionCommon "add files to annex" paramPaths (seek <$$> optParser) @@ -56,7 +57,7 @@ - - In direct mode, it acts on any files that have changed. -} seek :: AddOptions -> CommandSeek-seek o = do+seek o = allowConcurrentOutput $ do matcher <- largeFilesMatcher let go a = flip a (addThese o) $ \file -> ifM (checkFileMatcher matcher file <||> Annex.getState Annex.force) ( start file@@ -244,15 +245,13 @@ undo file key e = do whenM (inAnnex key) $ do liftIO $ nukeFile file- catchNonAsync (fromAnnex key file) tryharder- logStatus key InfoMissing+ -- The key could be used by other files too, so leave the+ -- content in the annex, and make a copy back to the file.+ obj <- calcRepo $ gitAnnexLocation key+ unlessM (liftIO $ copyFileExternal CopyTimeStamps obj file) $+ warning $ "Unable to restore content of " ++ file ++ "; it should be located in " ++ obj+ thawContent file throwM e- where- -- fromAnnex could fail if the file ownership is weird- tryharder :: SomeException -> Annex ()- tryharder _ = do- src <- calcRepo $ gitAnnexLocation key- liftIO $ moveFile src file {- Creates the symlink to the annexed content, returns the link target. -} link :: FilePath -> Key -> Maybe InodeCache -> Annex String
Command/AddUrl.hs view
@@ -38,7 +38,7 @@ #endif cmd :: Command-cmd = notBareRepo $+cmd = notBareRepo $ withGlobalOptions [jobsOption] $ command "addurl" SectionCommon "add urls to annex" (paramRepeating paramUrl) (seek <$$> optParser) @@ -87,11 +87,12 @@ ) seek :: AddUrlOptions -> CommandSeek-seek o = forM_ (addUrls o) $ \u -> do- r <- Remote.claimingUrl u- if Remote.uuid r == webUUID || rawOption o- then void $ commandAction $ startWeb o u- else checkUrl r o u+seek o = allowConcurrentOutput $+ forM_ (addUrls o) $ \u -> do+ r <- Remote.claimingUrl u+ if Remote.uuid r == webUUID || rawOption o+ then void $ commandAction $ startWeb o u+ else checkUrl r o u checkUrl :: Remote -> AddUrlOptions -> URLString -> Annex () checkUrl r o u = do
Command/Copy.hs view
@@ -36,10 +36,11 @@ <*> pure (autoMode v) seek :: CopyOptions -> CommandSeek-seek o = withKeyOptions (Command.Move.keyOptions $ moveOptions o) (autoMode o)- (Command.Move.startKey (moveOptions o) False)- (withFilesInGit $ whenAnnexed $ start o)- (Command.Move.moveFiles $ moveOptions o)+seek o = allowConcurrentOutput $+ withKeyOptions (Command.Move.keyOptions $ moveOptions o) (autoMode o)+ (Command.Move.startKey (moveOptions o) False)+ (withFilesInGit $ whenAnnexed $ start o)+ (Command.Move.moveFiles $ moveOptions o) {- A copy is just a move that does not delete the source file. - However, auto mode avoids unnecessary copies, and avoids getting or
Command/Drop.hs view
@@ -24,7 +24,7 @@ import qualified Data.Set as S cmd :: Command-cmd = withGlobalOptions annexedMatchingOptions $+cmd = withGlobalOptions (jobsOption : annexedMatchingOptions) $ command "drop" SectionCommon "remove content of files from repository" paramPaths (seek <$$> optParser)@@ -51,10 +51,11 @@ ) seek :: DropOptions -> CommandSeek-seek o = withKeyOptions (keyOptions o) (autoMode o)- (startKeys o)- (withFilesInGit $ whenAnnexed $ start o)- (dropFiles o)+seek o = allowConcurrentOutput $+ withKeyOptions (keyOptions o) (autoMode o)+ (startKeys o)+ (withFilesInGit $ whenAnnexed $ start o)+ (dropFiles o) start :: DropOptions -> FilePath -> Key -> CommandStart start o file key = start' o key (Just file)
Command/Fsck.hs view
@@ -44,7 +44,7 @@ import System.Posix.Types (EpochTime) cmd :: Command-cmd = withGlobalOptions annexedMatchingOptions $+cmd = withGlobalOptions (jobsOption : annexedMatchingOptions) $ command "fsck" SectionMaintenance "find and fix problems" paramPaths (seek <$$> optParser)@@ -87,9 +87,10 @@ )) seek :: FsckOptions -> CommandSeek-seek o = do+seek o = allowConcurrentOutput $ do from <- maybe (pure Nothing) (Just <$$> getParsed) (fsckFromOption o) u <- maybe getUUID (pure . Remote.uuid) from+ checkDeadRepo u i <- prepIncremental u (incrementalOpt o) withKeyOptions (keyOptions o) False (\k -> startKey i k =<< getNumCopies)@@ -98,6 +99,11 @@ cleanupIncremental i void $ tryIO $ recordActivity Fsck u +checkDeadRepo :: UUID -> Annex ()+checkDeadRepo u =+ whenM ((==) DeadTrusted <$> lookupTrust u) $+ earlyWarning "Warning: Fscking a repository that is currently marked as dead."+ start :: Maybe Remote -> Incremental -> FilePath -> Key -> CommandStart start from inc file key = do v <- Backend.getBackend file key@@ -235,7 +241,7 @@ verifyLocationLog' :: Key -> String -> Bool -> UUID -> (LogStatus -> Annex ()) -> Annex Bool verifyLocationLog' key desc present u updatestatus = do- uuids <- Remote.keyLocations key+ uuids <- loggedLocations key case (present, u `elem` uuids) of (True, False) -> do fix InfoPresent
Command/Get.hs view
@@ -37,7 +37,7 @@ <*> optional (parseKeyOptions True) seek :: GetOptions -> CommandSeek-seek o = do+seek o = allowConcurrentOutput $ do from <- maybe (pure Nothing) (Just <$$> getParsed) (getFrom o) withKeyOptions (keyOptions o) (autoMode o) (startKeys from)
Command/Import.hs view
@@ -21,7 +21,7 @@ import Annex.NumCopies cmd :: Command-cmd = withGlobalOptions fileMatchingOptions $ notBareRepo $+cmd = withGlobalOptions (jobsOption : fileMatchingOptions) $ notBareRepo $ command "import" SectionCommon "move and add files from outside git working copy" paramPaths (seek <$$> optParser)@@ -59,7 +59,7 @@ ) seek :: ImportOptions -> CommandSeek-seek o = do+seek o = allowConcurrentOutput $ do repopath <- liftIO . absPath =<< fromRepo Git.repoPath inrepops <- liftIO $ filter (dirContains repopath) <$> mapM absPath (importFiles o) unless (null inrepops) $ do@@ -89,7 +89,7 @@ warning "Could not verify that the content is still present in the annex; not removing from the import location." stop )- importfile = do+ importfile = checkdestdir $ do ignored <- not <$> Annex.getState Annex.force <&&> checkIgnored destfile if ignored then do@@ -99,14 +99,26 @@ existing <- liftIO (catchMaybeIO $ getSymbolicLinkStatus destfile) case existing of Nothing -> importfilechecked- (Just s)+ Just s | isDirectory s -> notoverwriting "(is a directory)"+ | isSymbolicLink s -> notoverwriting "(is a symlink)" | otherwise -> ifM (Annex.getState Annex.force) ( do liftIO $ nukeFile destfile importfilechecked , notoverwriting "(use --force to override, or a duplication option such as --deduplicate to clean up)" )+ checkdestdir cont = do+ let destdir = parentDir destfile+ existing <- liftIO (catchMaybeIO $ getSymbolicLinkStatus destdir)+ case existing of+ Nothing -> cont+ Just s+ | isDirectory s -> cont+ | otherwise -> do+ warning $ "not importing " ++ destfile ++ " because " ++ destdir ++ " is not a directory"+ stop+ importfilechecked = do liftIO $ createDirectoryIfMissing True (parentDir destfile) liftIO $ if mode == Duplicate || mode == SkipDuplicates
Command/Mirror.hs view
@@ -41,10 +41,11 @@ <*> pure (keyOptions v) seek :: MirrorOptions -> CommandSeek-seek o = withKeyOptions (keyOptions o) False- (startKey o Nothing)- (withFilesInGit $ whenAnnexed $ start o)- (mirrorFiles o)+seek o = allowConcurrentOutput $ + withKeyOptions (keyOptions o) False+ (startKey o Nothing)+ (withFilesInGit $ whenAnnexed $ start o)+ (mirrorFiles o) start :: MirrorOptions -> FilePath -> Key -> CommandStart start o file = startKey o (Just file)
Command/Move.hs view
@@ -45,10 +45,11 @@ <*> pure (keyOptions v) seek :: MoveOptions -> CommandSeek-seek o = withKeyOptions (keyOptions o) False- (startKey o True)- (withFilesInGit $ whenAnnexed $ start o True)- (moveFiles o)+seek o = allowConcurrentOutput $ + withKeyOptions (keyOptions o) False+ (startKey o True)+ (withFilesInGit $ whenAnnexed $ start o True)+ (moveFiles o) start :: MoveOptions -> Bool -> FilePath -> Key -> CommandStart start o move = start' o move . Just
Command/Sync.hs view
@@ -93,7 +93,7 @@ <*> optional parseAllOption seek :: SyncOptions -> CommandSeek-seek o = do+seek o = allowConcurrentOutput $ do prepMerge -- There may not be a branch checked out until after the commit,
Git/CheckIgnore.hs view
@@ -57,8 +57,10 @@ v <- Git.Version.installed return $ v >= Git.Version.normalize "1.8.4" +{- For some reason, check-ignore --batch always exits nonzero, + - so ignore any error. -} checkIgnoreStop :: CheckIgnoreHandle -> IO ()-checkIgnoreStop = CoProcess.stop+checkIgnoreStop = void . tryIO . CoProcess.stop {- Returns True if a file is ignored. -} checkIgnored :: CheckIgnoreHandle -> FilePath -> IO Bool
Git/Filename.hs view
@@ -24,5 +24,5 @@ encode s = "\"" ++ encode_c s ++ "\"" {- for quickcheck -}-prop_idempotent_deencode :: String -> Bool-prop_idempotent_deencode s = s == decode (encode s)+prop_isomorphic_deencode :: String -> Bool+prop_isomorphic_deencode s = s == decode (encode s)
Git/Queue.hs view
@@ -15,6 +15,7 @@ size, full, flush,+ merge, ) where import Utility.SafeCommand@@ -25,14 +26,11 @@ import qualified Data.Map as M -{- Queable actions that can be performed in a git repository.- -}+{- Queable actions that can be performed in a git repository. -} data Action {- Updating the index file, using a list of streamers that can - be added to as the queue grows. -}- = UpdateIndexAction- { getStreamers :: [Git.UpdateIndex.Streamer] -- in reverse order- }+ = UpdateIndexAction [Git.UpdateIndex.Streamer] -- in reverse order {- A git command to run, on a list of files that can be added to - as the queue grows. -} | CommandAction @@ -84,13 +82,11 @@ addCommand subcommand params files q repo = updateQueue action different (length files) q repo where- key = actionKey action action = CommandAction { getSubcommand = subcommand , getParams = params- , getFiles = allfiles+ , getFiles = map File files }- allfiles = map File files ++ maybe [] getFiles (M.lookup key $ items q) different (CommandAction { getSubcommand = s }) = s /= subcommand different _ = True@@ -100,10 +96,8 @@ addUpdateIndex streamer q repo = updateQueue action different 1 q repo where- key = actionKey action -- the list is built in reverse order- action = UpdateIndexAction $ streamer : streamers- streamers = maybe [] getStreamers $ M.lookup key $ items q+ action = UpdateIndexAction [streamer] different (UpdateIndexAction _) = False different _ = True@@ -123,7 +117,23 @@ , items = newitems } !newsize = size q' + sizeincrease- !newitems = M.insertWith' const (actionKey action) action (items q')+ !newitems = M.insertWith' combineNewOld (actionKey action) action (items q')++combineNewOld :: Action -> Action -> Action+combineNewOld (CommandAction _sc1 _ps1 fs1) (CommandAction sc2 ps2 fs2) =+ CommandAction sc2 ps2 (fs1++fs2)+combineNewOld (UpdateIndexAction s1) (UpdateIndexAction s2) =+ UpdateIndexAction (s1++s2)+combineNewOld anew _aold = anew++{- Merges the contents of the second queue into the first.+ - This should only be used when the two queues are known to contain+ - non-conflicting actions. -}+merge :: Queue -> Queue -> Queue+merge origq newq = origq+ { size = size origq + size newq+ , items = M.unionWith combineNewOld (items newq) (items origq)+ } {- Is a queue large enough that it should be flushed? -} full :: Queue -> Bool
Locations.hs view
@@ -51,6 +51,7 @@ gitAnnexViewLog, gitAnnexIgnoredRefs, gitAnnexPidFile,+ gitAnnexPidLockFile, gitAnnexDaemonStatusFile, gitAnnexLogFile, gitAnnexFuzzTestLogFile,@@ -66,7 +67,7 @@ hashDirLower, preSanitizeKeyName, - prop_idempotent_fileKey+ prop_isomorphic_fileKey ) where import Data.Char@@ -334,6 +335,10 @@ gitAnnexPidFile :: Git.Repo -> FilePath gitAnnexPidFile r = gitAnnexDir r </> "daemon.pid" +{- Pid lock file for pidlock mode -}+gitAnnexPidLockFile :: Git.Repo -> FilePath+gitAnnexPidLockFile r = gitAnnexDir r </> "pidlock"+ {- Status file for daemon mode. -} gitAnnexDaemonStatusFile :: Git.Repo -> FilePath gitAnnexDaemonStatusFile r = gitAnnexDir r </> "daemon.status"@@ -432,8 +437,8 @@ replace "&c" ":" $ replace "%" "/" file {- for quickcheck -}-prop_idempotent_fileKey :: String -> Bool-prop_idempotent_fileKey s+prop_isomorphic_fileKey :: String -> Bool+prop_isomorphic_fileKey s | null s = True -- it's not legal for a key to have no keyName | otherwise= Just k == fileKey (keyFile k) where
Logs/Remote.hs view
@@ -14,7 +14,7 @@ showConfig, parseConfig, - prop_idempotent_configEscape,+ prop_isomorphic_configEscape, prop_parse_show_Config, ) where @@ -84,8 +84,8 @@ rest = drop 1 r {- for quickcheck -}-prop_idempotent_configEscape :: String -> Bool-prop_idempotent_configEscape s = s == (configUnEscape . configEscape) s+prop_isomorphic_configEscape :: String -> Bool+prop_isomorphic_configEscape s = s == (configUnEscape . configEscape) s prop_parse_show_Config :: RemoteConfig -> Bool prop_parse_show_Config c
Logs/Transfer.hs view
@@ -17,7 +17,7 @@ import Utility.Percentage import Utility.QuickCheck import Utility.PID-import Utility.LockPool+import Annex.LockPool import Logs.TimeStamp import Data.Time.Clock@@ -136,25 +136,24 @@ void $ tryIO $ removeFile tfile void $ tryIO $ removeFile $ transferLockFile tfile #ifndef mingw32_HOST_OS- liftIO $ do- let lck = transferLockFile tfile- v <- getLockStatus lck- case v of- StatusLockedBy pid -> catchDefaultIO Nothing $- readTransferInfoFile (Just pid) tfile- StatusNoLockFile -> return Nothing- StatusUnLocked -> do- -- Take a non-blocking lock while deleting- -- the stale lock file. Ignore failure- -- due to permissions problems, races, etc.- void $ tryIO $ do- r <- tryLockExclusive Nothing lck- case r of- Just lockhandle -> do- cleanstale- dropLock lockhandle- _ -> noop- return Nothing+ let lck = transferLockFile tfile+ v <- getLockStatus lck+ case v of+ StatusLockedBy pid -> liftIO $ catchDefaultIO Nothing $+ readTransferInfoFile (Just pid) tfile+ StatusNoLockFile -> return Nothing+ StatusUnLocked -> do+ -- Take a non-blocking lock while deleting+ -- the stale lock file. Ignore failure+ -- due to permissions problems, races, etc.+ void $ tryIO $ do+ r <- tryLockExclusive Nothing lck+ case r of+ Just lockhandle -> liftIO $ do+ cleanstale+ dropLock lockhandle+ _ -> noop+ return Nothing #else v <- liftIO $ lockShared $ transferLockFile tfile liftIO $ case v of
Makefile view
@@ -41,14 +41,18 @@ rsync -a --delete html/ $(DESTDIR)$(PREFIX)/$(SHAREDIR)/doc/git-annex/html/; \ fi -install: build install-docs Build/InstallDesktopFile+install-bins: build install -d $(DESTDIR)$(PREFIX)/bin install git-annex $(DESTDIR)$(PREFIX)/bin ln -sf git-annex $(DESTDIR)$(PREFIX)/bin/git-annex-shell++install-misc: Build/InstallDesktopFile ./Build/InstallDesktopFile $(PREFIX)/bin/git-annex || true install -d $(DESTDIR)$(PREFIX)/share/bash-completion/completions install -m 0644 bash-completion.bash $(DESTDIR)$(PREFIX)/share/bash-completion/completions/git-annex +install: install-bins install-docs install-misc+ test: git-annex ./git-annex test @@ -118,6 +122,7 @@ rm -rf "$(LINUXSTANDALONE_DEST)" mkdir -p tmp cp -R standalone/linux/skel "$(LINUXSTANDALONE_DEST)"+ sed -i -e 's/^GIT_ANNEX_PACKAGE_INSTALL=/GIT_ANNEX_PACKAGE_INSTALL=$(GIT_ANNEX_PACKAGE_INSTALL)/' "$(LINUXSTANDALONE_DEST)/runshell" install -d "$(LINUXSTANDALONE_DEST)/bin" cp dist/build/git-annex/git-annex "$(LINUXSTANDALONE_DEST)/bin/"
Messages.hs view
@@ -22,6 +22,7 @@ endResult, toplevelWarning, warning,+ earlyWarning, warningIO, indent, maybeShowJSON,@@ -52,16 +53,15 @@ import qualified Annex showStart :: String -> FilePath -> Annex ()-showStart command file = handleMessage (JSON.start command $ Just file) $- flushed $ putStr $ command ++ " " ++ file ++ " "+showStart command file = outputMessage (JSON.start command $ Just file) $+ command ++ " " ++ file ++ " " showStart' :: String -> Key -> Maybe FilePath -> Annex () showStart' command key afile = showStart command $ fromMaybe (key2file key) afile showNote :: String -> Annex ()-showNote s = handleMessage (JSON.note s) $- flushed $ putStr $ "(" ++ s ++ ") "+showNote s = outputMessage (JSON.note s) $ "(" ++ s ++ ") " showAction :: String -> Annex () showAction s = showNote $ s ++ "..."@@ -76,7 +76,7 @@ Annex.changeState $ \s -> s { Annex.output = st' } | sideActionBlock st == InBlock = return () | otherwise = p- p = handleMessage q $ putStrLn $ "(" ++ m ++ "...)"+ p = outputMessage q $ "(" ++ m ++ "...)\n" showStoringStateAction :: Annex () showStoringStateAction = showSideAction "recording state in git"@@ -101,11 +101,10 @@ {- Make way for subsequent output of a command. -} showOutput :: Annex () showOutput = unlessM commandProgressDisabled $- handleMessage q $ putStr "\n"+ outputMessage q "\n" showLongNote :: String -> Annex ()-showLongNote s = handleMessage (JSON.note s) $- putStrLn $ '\n' : indent s+showLongNote s = outputMessage (JSON.note s) ('\n' : indent s ++ "\n") showEndOk :: Annex () showEndOk = showEndResult True@@ -114,7 +113,7 @@ showEndFail = showEndResult False showEndResult :: Bool -> Annex ()-showEndResult ok = handleMessage (JSON.end ok) $ putStrLn $ endResult ok+showEndResult ok = outputMessage (JSON.end ok) $ endResult ok ++ "\n" endResult :: Bool -> String endResult True = "ok"@@ -126,14 +125,16 @@ warning :: String -> Annex () warning = warning' True . indent +earlyWarning :: String -> Annex ()+earlyWarning = warning' False+ warning' :: Bool -> String -> Annex () warning' makeway w = do when makeway $- handleMessage q $ putStr "\n"- liftIO $ do- hFlush stdout- hPutStrLn stderr w+ outputMessage q "\n"+ outputError (w ++ "\n") +{- Not concurrent output safe. -} warningIO :: String -> IO () warningIO w = do putStr "\n"@@ -145,7 +146,10 @@ {- Shows a JSON fragment only when in json mode. -} maybeShowJSON :: JSON a => [(String, a)] -> Annex ()-maybeShowJSON v = handleMessage (JSON.add v) q+maybeShowJSON v = withOutputType $ liftIO . go+ where+ go JSONOutput = JSON.add v+ go _ = return () {- Shows a complete JSON value, only when in json mode. -} showFullJSON :: JSON a => [(String, a)] -> Annex Bool@@ -157,19 +161,19 @@ {- Performs an action that outputs nonstandard/customized output, and - in JSON mode wraps its output in JSON.start and JSON.end, so it's - a complete JSON document.- - This is only needed when showStart and showEndOk is not used. -}+ - This is only needed when showStart and showEndOk is not used.+ -} showCustom :: String -> Annex Bool -> Annex () showCustom command a = do- handleMessage (JSON.start command Nothing) q+ outputMessage (JSON.start command Nothing) "" r <- a- handleMessage (JSON.end r) q+ outputMessage (JSON.end r) "" showHeader :: String -> Annex ()-showHeader h = handleMessage q $- flushed $ putStr $ h ++ ": "+showHeader h = outputMessage q $ (h ++ ": ") showRaw :: String -> Annex ()-showRaw s = handleMessage q $ putStrLn s+showRaw s = outputMessage q (s ++ "\n") setupConsole :: IO () setupConsole = do@@ -207,6 +211,6 @@ commandProgressDisabled :: Annex Bool commandProgressDisabled = withOutputType $ \t -> return $ case t of QuietOutput -> True- ParallelOutput _ -> True JSONOutput -> True NormalOutput -> False+ ConcurrentOutput _ -> True
+ Messages/Concurrent.hs view
@@ -0,0 +1,110 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}++{- git-annex output messages, including concurrent output to display regions+ -+ - Copyright 2010-2015 Joey Hess <id@joeyh.name>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++{-# LANGUAGE CPP #-}++module Messages.Concurrent where++import Annex++#ifdef WITH_CONCURRENTOUTPUT+import Common+import Types.Messages+import qualified System.Console.Concurrent as Console+import qualified System.Console.Regions as Regions+import Control.Concurrent.STM+import qualified Data.Text as T+#endif++{- Outputs a message in a concurrency safe way.+ -+ - The message may be an error message, in which case it goes to stderr.+ -+ - When built without concurrent-output support, the fallback action is run+ - instead.+ -}+concurrentMessage :: Bool -> String -> Annex () -> Annex ()+#ifdef WITH_CONCURRENTOUTPUT+concurrentMessage iserror msg _ = go =<< consoleRegion <$> Annex.getState Annex.output+ where+ go Nothing+ | iserror = liftIO $ Console.errorConcurrent msg+ | otherwise = liftIO $ Console.outputConcurrent msg+ go (Just r) = do+ -- Can't display the error to stdout while+ -- console regions are in use, so set the errflag+ -- to get it to display to stderr later.+ when iserror $ do+ Annex.changeState $ \s ->+ s { Annex.output = (Annex.output s) { consoleRegionErrFlag = True } }+ liftIO $ atomically $ do+ Regions.appendConsoleRegion r msg+ rl <- takeTMVar Regions.regionList+ putTMVar Regions.regionList+ (if r `elem` rl then rl else r:rl)++#else+concurrentMessage _ _ fallback = fallback+#endif++{- Runs an action in its own dedicated region of the console.+ -+ - The region is closed at the end or on exception, and at that point+ - the value of the region is displayed in the scrolling area above+ - any other active regions.+ -+ - When not at a console, a region is not displayed until the action is+ - complete.+ -}+inOwnConsoleRegion :: Annex a -> Annex a+#ifdef WITH_CONCURRENTOUTPUT+inOwnConsoleRegion a = do+ r <- mkregion+ setregion (Just r)+ eret <- tryNonAsync a `onException` rmregion r+ case eret of+ Left e -> do+ -- Add error message to region before it closes.+ concurrentMessage True (show e) noop+ rmregion r+ throwM e+ Right ret -> do+ rmregion r+ return ret+ where+ -- The region is allocated here, but not displayed until + -- a message is added to it. This avoids unnecessary screen+ -- updates when a region does not turn out to need to be used.+ mkregion = Regions.newConsoleRegion Regions.Linear ""+ setregion r = Annex.changeState $ \s -> s { Annex.output = (Annex.output s) { consoleRegion = r } }+ rmregion r = do+ errflag <- consoleRegionErrFlag <$> Annex.getState Annex.output+ let h = if errflag then Console.StdErr else Console.StdOut+ Annex.changeState $ \s ->+ s { Annex.output = (Annex.output s) { consoleRegionErrFlag = False } }+ setregion Nothing+ liftIO $ atomically $ do+ t <- Regions.getConsoleRegion r+ unless (T.null t) $+ Console.bufferOutputSTM h t+ Regions.closeConsoleRegion r+#else+inOwnConsoleRegion = id+#endif++{- The progress region is displayed inline with the current console region. -}+#ifdef WITH_CONCURRENTOUTPUT+withProgressRegion :: (Regions.ConsoleRegion -> Annex a) -> Annex a+withProgressRegion a = do+ parent <- consoleRegion <$> Annex.getState Annex.output+ Regions.withConsoleRegion (maybe Regions.Linear Regions.InLine parent) a++instance Regions.LiftRegion Annex where+ liftRegion = liftIO . atomically+#endif
Messages/Internal.hs view
@@ -1,6 +1,6 @@-{- git-annex output messages+{- git-annex output messages, including concurrent output to display regions -- - Copyright 2010-2014 Joey Hess <id@joeyh.name>+ - Copyright 2010-2015 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -}@@ -8,23 +8,33 @@ module Messages.Internal where import Common-import Types+import Annex import Types.Messages-import qualified Annex+import Messages.Concurrent -handleMessage :: IO () -> IO () -> Annex ()-handleMessage json normal = withOutputType go+withOutputType :: (OutputType -> Annex a) -> Annex a+withOutputType a = outputType <$> Annex.getState Annex.output >>= a++outputMessage :: IO () -> String -> Annex ()+outputMessage json s = withOutputType go where- go NormalOutput = liftIO normal+ go NormalOutput = liftIO $+ flushed $ putStr s go QuietOutput = q- go (ParallelOutput _) = q+ go (ConcurrentOutput _) = concurrentMessage False s q go JSONOutput = liftIO $ flushed json +outputError :: String -> Annex ()+outputError s = withOutputType go+ where+ go (ConcurrentOutput _) = concurrentMessage True s (go NormalOutput)+ go _ = liftIO $ do+ hFlush stdout+ hPutStr stderr s+ hFlush stderr+ q :: Monad m => m () q = noop flushed :: IO () -> IO () flushed a = a >> hFlush stdout--withOutputType :: (OutputType -> Annex a) -> Annex a-withOutputType a = outputType <$> Annex.getState Annex.output >>= a
Messages/Progress.hs view
@@ -17,102 +17,64 @@ import Types.Messages import Types.Key -#ifdef WITH_ASCIIPROGRESS-import System.Console.AsciiProgress-import qualified System.Console.Terminal.Size as Terminal-import Control.Concurrent-#else+#ifdef WITH_CONCURRENTOUTPUT+import Messages.Concurrent+import qualified System.Console.Regions as Regions+import qualified System.Console.Concurrent as Console+#endif+ import Data.Progress.Meter import Data.Progress.Tracker import Data.Quantity-#endif {- Shows a progress meter while performing a transfer of a key. - The action is passed a callback to use to update the meter. -} metered :: Maybe MeterUpdate -> Key -> AssociatedFile -> (MeterUpdate -> Annex a) -> Annex a-metered combinemeterupdate key af a = case keySize key of+metered combinemeterupdate key _af a = case keySize key of Nothing -> nometer Just size -> withOutputType (go $ fromInteger size) where go _ QuietOutput = nometer go _ JSONOutput = nometer-#ifdef WITH_ASCIIPROGRESS- go size _ = do- showOutput- liftIO $ putStrLn ""-- cols <- liftIO $ maybe 79 Terminal.width <$> Terminal.size- let desc = truncatepretty cols $ fromMaybe (key2file key) af-- result <- liftIO newEmptyMVar- pg <- liftIO $ newProgressBar def- { pgWidth = cols- , pgFormat = desc ++ " :percent :bar ETA :eta"- , pgTotal = size- , pgOnCompletion = do- ok <- takeMVar result- putStrLn $ desc ++ " " ++ endResult ok- }- r <- a $ liftIO . pupdate pg-- liftIO $ do- -- See if the progress bar is complete or not.- sofar <- stCompleted <$> getProgressStats pg- putMVar result (sofar >= size)- -- May not be actually complete if the action failed,- -- but this just clears the progress bar.- complete pg-- return r-#else- -- Old progress bar code, not suitable for parallel output.- go _ (ParallelOutput _) = do- r <- nometer- liftIO $ putStrLn $ fromMaybe (key2file key) af- return r go size NormalOutput = do showOutput- progress <- liftIO $ newProgress "" size- meter <- liftIO $ newMeter progress "B" 25 (renderNums binaryOpts 1)- r <- a $ liftIO . pupdate meter progress+ (progress, meter) <- mkmeter size+ r <- a $ \n -> liftIO $ do+ setP progress $ fromBytesProcessed n+ displayMeter stdout meter+ maybe noop (\m -> m n) combinemeterupdate liftIO $ clearMeter stdout meter return r-#endif--#ifdef WITH_ASCIIPROGRESS- pupdate pg n = do- let i = fromBytesProcessed n- sofar <- stCompleted <$> getProgressStats pg- when (i > sofar) $- tickN pg (i - sofar)- threadDelay 100+#if WITH_CONCURRENTOUTPUT+ go size (ConcurrentOutput _) = withProgressRegion $ \r -> do+ (progress, meter) <- mkmeter size+ a $ \n -> liftIO $ do+ setP progress $ fromBytesProcessed n+ s <- renderMeter meter+ Regions.setConsoleRegion r ("\n" ++ s)+ maybe noop (\m -> m n) combinemeterupdate #else- pupdate meter progress n = do- setP progress $ fromBytesProcessed n- displayMeter stdout meter+ go _ (ConcurrentOutput _) = nometer #endif- maybe noop (\m -> m n) combinemeterupdate - nometer = a (const noop)+ mkmeter size = do+ progress <- liftIO $ newProgress "" size+ meter <- liftIO $ newMeter progress "B" 25 (renderNums binaryOpts 1)+ return (progress, meter) -#ifdef WITH_ASCIIPROGRESS- truncatepretty n s- | length s > n = take (n-2) s ++ ".."- | otherwise = s-#endif+ nometer = a (const noop) -{- Use when the progress meter is only desired for parallel- - mode; as when a command's own progress output is preferred. -}-parallelMetered :: Maybe MeterUpdate -> Key -> AssociatedFile -> (MeterUpdate -> Annex a) -> Annex a-parallelMetered combinemeterupdate key af a = withOutputType go+{- Use when the progress meter is only desired for concurrent+ - output; as when a command's own progress output is preferred. -}+concurrentMetered :: Maybe MeterUpdate -> Key -> AssociatedFile -> (MeterUpdate -> Annex a) -> Annex a+concurrentMetered combinemeterupdate key af a = withOutputType go where- go (ParallelOutput _) = metered combinemeterupdate key af a+ go (ConcurrentOutput _) = metered combinemeterupdate key af a go _ = a (fromMaybe (const noop) combinemeterupdate) {- Progress dots. -} showProgressDots :: Annex ()-showProgressDots = handleMessage q $- flushed $ putStr "."+showProgressDots = outputMessage q "." {- Runs a command, that may output progress to either stdout or - stderr, as well as other messages.@@ -149,5 +111,7 @@ mkStderrEmitter :: Annex (String -> IO ()) mkStderrEmitter = withOutputType go where- go (ParallelOutput _) = return $ \s -> hPutStrLn stderr ("E: " ++ s)+#ifdef WITH_CONCURRENTOUTPUT+ go (ConcurrentOutput _) = return Console.errorConcurrent+#endif go _ = return (hPutStrLn stderr)
Remote/Git.hs view
@@ -421,7 +421,7 @@ {- Tries to copy a key's content from a remote's annex to a file. -} copyFromRemote :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex (Bool, Verification)-copyFromRemote r key file dest p = parallelMetered (Just p) key file $+copyFromRemote r key file dest p = concurrentMetered (Just p) key file $ copyFromRemote' r key file dest copyFromRemote' :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex (Bool, Verification)@@ -522,7 +522,7 @@ ) | Git.repoIsSsh (repo r) = ifM (Annex.Content.preseedTmp key file)- ( fst <$> parallelMetered Nothing key af+ ( fst <$> concurrentMetered Nothing key af (copyFromRemote' r key af file) , return False )@@ -533,7 +533,7 @@ {- Tries to copy a key's content to a remote's annex. -} copyToRemote :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool-copyToRemote r key file p = parallelMetered (Just p) key file $ copyToRemote' r key file+copyToRemote r key file p = concurrentMetered (Just p) key file $ copyToRemote' r key file copyToRemote' :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool copyToRemote' r key file p
Remote/Helper/Hooks.hs view
@@ -16,7 +16,7 @@ import Types.CleanupActions import qualified Annex import Annex.LockFile-import Utility.LockPool+import Annex.LockPool #ifndef mingw32_HOST_OS import Annex.Perms #endif@@ -83,7 +83,7 @@ unlockFile lck #ifndef mingw32_HOST_OS mode <- annexFileMode- v <- liftIO $ noUmask mode $ tryLockExclusive (Just mode) lck+ v <- noUmask mode $ tryLockExclusive (Just mode) lck #else v <- liftIO $ lockExclusive lck #endif
Test.hs view
@@ -131,14 +131,14 @@ properties :: TestTree properties = localOption (QuickCheckTests 1000) $ testGroup "QuickCheck"- [ testProperty "prop_idempotent_deencode_git" Git.Filename.prop_idempotent_deencode- , testProperty "prop_idempotent_deencode" Utility.Format.prop_idempotent_deencode- , testProperty "prop_idempotent_fileKey" Locations.prop_idempotent_fileKey- , testProperty "prop_idempotent_key_encode" Types.Key.prop_idempotent_key_encode- , testProperty "prop_idempotent_key_decode" Types.Key.prop_idempotent_key_decode- , testProperty "prop_idempotent_shellEscape" Utility.SafeCommand.prop_idempotent_shellEscape- , testProperty "prop_idempotent_shellEscape_multiword" Utility.SafeCommand.prop_idempotent_shellEscape_multiword- , testProperty "prop_idempotent_configEscape" Logs.Remote.prop_idempotent_configEscape+ [ testProperty "prop_isomorphic_deencode_git" Git.Filename.prop_isomorphic_deencode+ , testProperty "prop_isomorphic_deencode" Utility.Format.prop_isomorphic_deencode+ , testProperty "prop_isomorphic_fileKey" Locations.prop_isomorphic_fileKey+ , testProperty "prop_isomorphic_key_encode" Types.Key.prop_isomorphic_key_encode+ , testProperty "prop_isomorphic_key_decode" Types.Key.prop_isomorphic_key_decode+ , testProperty "prop_isomorphic_shellEscape" Utility.SafeCommand.prop_isomorphic_shellEscape+ , testProperty "prop_isomorphic_shellEscape_multiword" Utility.SafeCommand.prop_isomorphic_shellEscape_multiword+ , testProperty "prop_isomorphic_configEscape" Logs.Remote.prop_isomorphic_configEscape , testProperty "prop_parse_show_Config" Logs.Remote.prop_parse_show_Config , testProperty "prop_upFrom_basics" Utility.Path.prop_upFrom_basics , testProperty "prop_relPathDirToFile_basics" Utility.Path.prop_relPathDirToFile_basics
Types/GitConfig.hs view
@@ -1,6 +1,6 @@ {- git-annex configuration -- - Copyright 2012-2014 Joey Hess <id@joeyh.name>+ - Copyright 2012-2015 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -}@@ -26,6 +26,7 @@ import Types.RefSpec import Utility.HumanTime import Utility.Gpg (GpgCmd, mkGpgCmd)+import Utility.ThreadScheduler (Seconds(..)) {- Main git-annex settings. Each setting corresponds to a git-config key - such as annex.foo -}@@ -62,6 +63,8 @@ , annexDifferences :: Differences , annexUsedRefSpec :: Maybe RefSpec , annexVerify :: Bool+ , annexPidLock :: Bool+ , annexPidLockTimeout :: Seconds , coreSymlinks :: Bool , coreSharedRepository :: SharedRepository , gcryptId :: Maybe String@@ -105,6 +108,9 @@ , annexUsedRefSpec = either (const Nothing) Just . parseRefSpec =<< getmaybe (annex "used-refspec") , annexVerify = getbool (annex "verify") True+ , annexPidLock = getbool (annex "pidlock") False+ , annexPidLockTimeout = Seconds $ fromMaybe 300 $+ getmayberead (annex "pidlocktimeout") , coreSymlinks = getbool "core.symlinks" True , coreSharedRepository = getSharedRepository r , gcryptId = getmaybe "core.gcrypt-id"
Types/Key.hs view
@@ -18,8 +18,8 @@ isChunkKey, isKeyPrefix, - prop_idempotent_key_encode,- prop_idempotent_key_decode+ prop_isomorphic_key_encode,+ prop_isomorphic_key_decode ) where import System.Posix.Types@@ -135,11 +135,11 @@ hashIO32 = hashIO32 . key2file hashIO64 = hashIO64 . key2file -prop_idempotent_key_encode :: Key -> Bool-prop_idempotent_key_encode k = Just k == (file2key . key2file) k+prop_isomorphic_key_encode :: Key -> Bool+prop_isomorphic_key_encode k = Just k == (file2key . key2file) k -prop_idempotent_key_decode :: FilePath -> Bool-prop_idempotent_key_decode f+prop_isomorphic_key_decode :: FilePath -> Bool+prop_isomorphic_key_decode f | normalfieldorder = maybe True (\k -> key2file k == f) (file2key f) | otherwise = True where
Types/LockCache.hs view
@@ -11,6 +11,6 @@ ) where import qualified Data.Map as M-import Utility.LockPool+import Utility.LockPool (LockHandle) type LockCache = M.Map FilePath LockHandle
Types/Messages.hs view
@@ -5,20 +5,38 @@ - Licensed under the GNU GPL version 3 or higher. -} +{-# LANGUAGE CPP #-}+ module Types.Messages where import Data.Default -data OutputType = NormalOutput | QuietOutput | ParallelOutput Int | JSONOutput+#ifdef WITH_CONCURRENTOUTPUT+import System.Console.Regions (ConsoleRegion)+#endif +data OutputType = NormalOutput | QuietOutput | ConcurrentOutput Int | JSONOutput+ deriving (Show)+ data SideActionBlock = NoBlock | StartBlock | InBlock deriving (Eq) data MessageState = MessageState { outputType :: OutputType , sideActionBlock :: SideActionBlock+#ifdef WITH_CONCURRENTOUTPUT+ , consoleRegion :: Maybe ConsoleRegion+ , consoleRegionErrFlag :: Bool+#endif } instance Default MessageState where- def = MessageState NormalOutput NoBlock+ def = MessageState+ { outputType = NormalOutput+ , sideActionBlock = NoBlock+#ifdef WITH_CONCURRENTOUTPUT+ , consoleRegion = Nothing+ , consoleRegionErrFlag = False+#endif+ }
Utility/Daemon.hs view
@@ -119,16 +119,18 @@ - If it's running, returns its pid. -} checkDaemon :: FilePath -> IO (Maybe PID) #ifndef mingw32_HOST_OS-checkDaemon pidfile = do- v <- catchMaybeIO $- openFd pidfile ReadOnly (Just stdFileMode) defaultFileFlags- case v of- Just fd -> do- locked <- getLock fd (ReadLock, AbsoluteSeek, 0, 0)- p <- readish <$> readFile pidfile- closeFd fd `after` return (check locked p)- Nothing -> return Nothing+checkDaemon pidfile = bracket setup cleanup go where+ setup = catchMaybeIO $+ openFd pidfile ReadOnly (Just stdFileMode) defaultFileFlags+ cleanup (Just fd) = closeFd fd+ cleanup Nothing = return ()+ go (Just fd) = catchDefaultIO Nothing $ do+ locked <- getLock fd (ReadLock, AbsoluteSeek, 0, 0)+ p <- readish <$> readFile pidfile+ return (check locked p)+ go Nothing = return Nothing+ check Nothing _ = Nothing check _ Nothing = Nothing check (Just (pid, _)) (Just pid')
Utility/FileMode.hs view
@@ -20,6 +20,8 @@ import System.Posix.Files #endif import Foreign (complement)+import Control.Monad.IO.Class (liftIO, MonadIO)+import Control.Monad.Catch import Utility.Exception @@ -95,7 +97,7 @@ {- Runs an action without that pesky umask influencing it, unless the - passed FileMode is the standard one. -}-noUmask :: FileMode -> IO a -> IO a+noUmask :: (MonadIO m, MonadMask m) => FileMode -> m a -> m a #ifndef mingw32_HOST_OS noUmask mode a | mode == stdFileMode = a@@ -104,12 +106,12 @@ noUmask _ a = a #endif -withUmask :: FileMode -> IO a -> IO a+withUmask :: (MonadIO m, MonadMask m) => FileMode -> m a -> m a #ifndef mingw32_HOST_OS withUmask umask a = bracket setup cleanup go where- setup = setFileCreationMask umask- cleanup = setFileCreationMask+ setup = liftIO $ setFileCreationMask umask+ cleanup = liftIO . setFileCreationMask go _ = a #else withUmask _ a = a
Utility/Format.hs view
@@ -11,7 +11,7 @@ format, decode_c, encode_c,- prop_idempotent_deencode+ prop_isomorphic_deencode ) where import Text.Printf (printf)@@ -174,5 +174,5 @@ showoctal i = '\\' : printf "%03o" i {- for quickcheck -}-prop_idempotent_deencode :: String -> Bool-prop_idempotent_deencode s = s == decode_c (encode_c s)+prop_isomorphic_deencode :: String -> Bool+prop_isomorphic_deencode s = s == decode_c (encode_c s)
+ Utility/LockFile/LockStatus.hs view
@@ -0,0 +1,13 @@+{- LockStatus type+ -+ - Copyright 2014 Joey Hess <id@joeyh.name>+ -+ - License: BSD-2-clause+ -}++module Utility.LockFile.LockStatus where++import System.Posix++data LockStatus = StatusUnLocked | StatusLockedBy ProcessID | StatusNoLockFile+ deriving (Eq)
+ Utility/LockFile/PidLock.hs view
@@ -0,0 +1,239 @@+{- pid-based lock files+ -+ - Copyright 2015 Joey Hess <id@joeyh.name>+ -+ - License: BSD-2-clause+ -}++module Utility.LockFile.PidLock (+ LockHandle,+ tryLock,+ waitLock,+ dropLock,+ LockStatus(..),+ getLockStatus,+ checkLocked,+ checkSaneLock,+) where++import Utility.PartialPrelude+import Utility.Exception+import Utility.Applicative+import Utility.Directory+import Utility.Monad+import Utility.Path+import Utility.FileMode+import Utility.LockFile.LockStatus+import Utility.ThreadScheduler+import qualified Utility.LockFile.Posix as Posix++import System.IO+import System.Posix+import Data.Maybe+import Data.List+import Control.Applicative+import Network.BSD+import System.FilePath+import Data.Hash.MD5+import System.Directory++type LockFile = FilePath++data LockHandle = LockHandle LockFile FileStatus SideLockHandle++type SideLockHandle = Maybe (LockFile, Posix.LockHandle)++data PidLock = PidLock+ { lockingPid :: ProcessID+ , lockingHost :: HostName+ }+ deriving (Eq, Read, Show)++mkPidLock :: IO PidLock+mkPidLock = PidLock+ <$> getProcessID+ <*> getHostName++readPidLock :: LockFile -> IO (Maybe PidLock)+readPidLock lockfile = (readish =<<) <$> catchMaybeIO (readFile lockfile)++-- To avoid races when taking over a stale pid lock, a side lock is used.+-- This is a regular posix exclusive lock.+trySideLock :: LockFile -> (SideLockHandle -> IO a) -> IO a+trySideLock lockfile a = do+ sidelock <- sideLockFile lockfile+ mlck <- catchDefaultIO Nothing $ + withUmask nullFileMode $+ Posix.tryLockExclusive (Just mode) sidelock+ -- Check the lock we just took, in case we opened a side lock file+ -- belonging to another process that will have since deleted it.+ case mlck of+ Nothing -> a Nothing+ Just lck -> ifM (Posix.checkSaneLock sidelock lck)+ ( a (Just (sidelock, lck))+ , a Nothing+ )+ where+ -- Let all users write to the lock file in /dev/shm or /tmp,+ -- so that other users can reuse it to take the lock.+ -- Since /dev/shm and /tmp are sticky dirs, a user cannot+ -- delete another user's lock file there, so could not+ -- delete a stale lock.+ mode = combineModes (readModes ++ writeModes)++dropSideLock :: SideLockHandle -> IO ()+dropSideLock Nothing = return ()+dropSideLock (Just (f, h)) = do+ -- Delete the file first, to ensure that any process that is trying+ -- to take the side lock will only succeed once the file is+ -- deleted, and so will be able to immediately see that it's taken+ -- a stale lock.+ _ <- tryIO $ removeFile f + Posix.dropLock h++-- The side lock is put in /dev/shm. This will work on most any+-- Linux system, even if its whole root filesystem doesn't support posix+-- locks. /tmp is used as a fallback.+sideLockFile :: LockFile -> IO LockFile+sideLockFile lockfile = do+ f <- absPath lockfile+ let base = intercalate "_" (splitDirectories (makeRelative "/" f))+ let shortbase = reverse $ take 32 $ reverse base+ let md5sum = if base == shortbase then "" else md5s (Str base)+ dir <- ifM (doesDirectoryExist "/dev/shm")+ ( return "/dev/shm"+ , return "/tmp"+ )+ return $ dir </> md5sum ++ shortbase ++ ".lck"++-- | Tries to take a lock; does not block when the lock is already held.+--+-- Note that stale locks are automatically detected and broken.+-- However, if the lock file is on a networked file system, and was+-- created on a different host than the current host (determined by hostname),+-- this can't be done and stale locks may persist.+tryLock :: LockFile -> IO (Maybe LockHandle)+tryLock lockfile = trySideLock lockfile $ \sidelock -> do+ lockfile' <- absPath lockfile+ (tmp, h) <- openTempFile (takeDirectory lockfile') "locktmp"+ setFileMode tmp (combineModes readModes)+ hPutStr h . show =<< mkPidLock+ hClose h+ st <- getFileStatus tmp+ let failedlock = do+ dropLock $ LockHandle tmp st sidelock+ return Nothing+ let tooklock = return $ Just $ LockHandle lockfile' st sidelock+ ifM (linkToLock sidelock tmp lockfile')+ ( do+ nukeFile tmp+ tooklock+ , do+ v <- readPidLock lockfile'+ hn <- getHostName+ case v of+ Just pl | isJust sidelock && hn == lockingHost pl -> do+ -- Since we have the sidelock,+ -- and are on the same host that+ -- the pidlock was taken on,+ -- we know that the pidlock is+ -- stale, and can take it over.+ rename tmp lockfile'+ tooklock+ _ -> failedlock+ )++-- Linux's open(2) man page recommends linking a pid lock into place,+-- as the most portable atomic operation that will fail if+-- it already exists. +--+-- open(2) suggests that link can sometimes appear to fail+-- on NFS but have actually succeeded, and the way to find out is to stat+-- the file and check its link count etc.+linkToLock :: SideLockHandle -> FilePath -> FilePath -> IO Bool+linkToLock Nothing _ _ = return False+linkToLock (Just _) src dest = do+ _ <- tryIO $ createLink src dest+ ifM (catchBoolIO checklinked)+ ( catchBoolIO $ not <$> checkInsaneLustre dest+ , return False+ )+ where+ checklinked = do+ x <- getSymbolicLinkStatus src+ y <- getSymbolicLinkStatus dest+ return $ and+ [ deviceID x == deviceID y+ , fileID x == fileID y+ , fileMode x == fileMode y+ , fileOwner x == fileOwner y+ , fileGroup x == fileGroup y+ , fileSize x == fileSize y+ , modificationTime x == modificationTime y+ , isRegularFile x == isRegularFile y+ , linkCount x == linkCount y+ , linkCount x == 2+ ]++-- On a Lustre filesystem, link has been observed to incorrectly *succeed*,+-- despite the dest already existing. A subsequent stat of the dest+-- looked like it had been replaced with the src. The process proceeded to+-- run and then deleted the dest, and after the process was done, the+-- original file was observed to still be in place.+--+-- We can detect this insanity by getting the directory contents after+-- making the link, and checking to see if 2 copies of the dest file,+-- with the SAME FILENAME exist.+checkInsaneLustre :: FilePath -> IO Bool+checkInsaneLustre dest = do+ fs <- dirContents (takeDirectory dest)+ case length (filter (== dest) fs) of+ 1 -> return False -- whew!+ 0 -> return True -- wtf?+ _ -> do+ -- Try to clean up the extra copy we made+ -- that has the same name. Egads.+ _ <- tryIO $ removeFile dest+ return True++-- | Waits as necessary to take a lock.+--+-- Uses a 1 second wait-loop.+--+-- May wait untie timeout if the lock file is stale and is on a network file+-- system, or on a system where the side lock cannot be taken.+waitLock :: Seconds -> LockFile -> IO LockHandle+waitLock (Seconds timeout) lockfile = go timeout+ where+ go n+ | n > 0 = maybe (threadDelaySeconds (Seconds 1) >> go (pred n)) return+ =<< tryLock lockfile+ | otherwise = do+ hPutStrLn stderr $ show timeout ++ " second timeout exceeded while waiting for pid lock file " ++ lockfile+ error $ "Gave up waiting for possibly stale pid lock file " ++ lockfile++dropLock :: LockHandle -> IO ()+dropLock (LockHandle lockfile _ sidelock) = do+ -- Drop side lock first, at which point the pid lock will be+ -- considered stale.+ dropSideLock sidelock+ nukeFile lockfile++getLockStatus :: LockFile -> IO LockStatus+getLockStatus = maybe StatusUnLocked (StatusLockedBy . lockingPid) <$$> readPidLock++checkLocked :: LockFile -> IO (Maybe Bool)+checkLocked lockfile = conv <$> getLockStatus lockfile+ where+ conv (StatusLockedBy _) = Just True+ conv _ = Just False++-- Checks that the lock file still exists, and is the same file that was+-- locked to get the LockHandle.+checkSaneLock :: LockFile -> LockHandle -> IO Bool+checkSaneLock lockfile (LockHandle _ st _) = + go =<< catchMaybeIO (getFileStatus lockfile)+ where+ go Nothing = return False+ go (Just st') = return $+ deviceID st == deviceID st' && fileID st == fileID st'
Utility/LockFile/Posix.hs view
@@ -16,10 +16,13 @@ LockStatus(..), dropLock, checkSaneLock,+ LockRequest(..),+ openLockFile, ) where import Utility.Exception import Utility.Applicative+import Utility.LockFile.LockStatus import System.IO import System.Posix@@ -79,9 +82,6 @@ -- that is different from it not being locked. checkLocked :: LockFile -> IO (Maybe Bool) checkLocked = maybe Nothing (Just . isJust) <$$> getLockStatus'--data LockStatus = StatusUnLocked | StatusLockedBy ProcessID | StatusNoLockFile- deriving (Eq) getLockStatus :: LockFile -> IO LockStatus getLockStatus lockfile = do
Utility/LockPool/LockHandle.hs view
@@ -10,33 +10,44 @@ module Utility.LockPool.LockHandle where import qualified Utility.LockPool.STM as P-#ifndef mingw32_HOST_OS-import qualified Utility.LockFile.Posix as F-#else-import qualified Utility.LockFile.Windows as F-#endif+import Utility.LockPool.STM (LockFile) import Control.Concurrent.STM import Control.Exception -data LockHandle = LockHandle P.LockHandle F.LockHandle+data LockHandle = LockHandle+ { poolHandle :: P.LockHandle+ , fileLockOps :: FileLockOps+ } +data FileLockOps = FileLockOps+ { fDropLock :: IO ()+#ifndef mingw32_HOST_OS+ , fCheckSaneLock :: LockFile -> IO Bool+#endif+ }+ dropLock :: LockHandle -> IO ()-dropLock (LockHandle ph fh) = P.releaseLock ph (F.dropLock fh)+dropLock h = P.releaseLock (poolHandle h) (fDropLock (fileLockOps h)) +#ifndef mingw32_HOST_OS+checkSaneLock :: LockFile -> LockHandle -> IO Bool+checkSaneLock lockfile (LockHandle _ flo) = fCheckSaneLock flo lockfile+#endif+ -- Take a lock, by first updating the lock pool, and then taking the file -- lock. If taking the file lock fails for any reason, take care to -- release the lock in the lock pool.-makeLockHandle :: STM P.LockHandle -> IO F.LockHandle -> IO LockHandle+makeLockHandle :: STM P.LockHandle -> IO FileLockOps -> IO LockHandle makeLockHandle pa fa = bracketOnError setup cleanup go where setup = atomically pa cleanup ph = P.releaseLock ph (return ()) go ph = do- fh <- fa- return $ LockHandle ph fh+ fo <- fa+ return $ LockHandle ph fo -tryMakeLockHandle :: STM (Maybe P.LockHandle) -> IO (Maybe F.LockHandle) -> IO (Maybe LockHandle)+tryMakeLockHandle :: STM (Maybe P.LockHandle) -> IO (Maybe FileLockOps) -> IO (Maybe LockHandle) tryMakeLockHandle pa fa = bracketOnError setup cleanup go where setup = atomically pa@@ -44,9 +55,9 @@ cleanup (Just ph) = P.releaseLock ph (return ()) go Nothing = return Nothing go (Just ph) = do- mfh <- fa- case mfh of+ mfo <- fa+ case mfo of Nothing -> do cleanup (Just ph) return Nothing- Just fh -> return $ Just $ LockHandle ph fh+ Just fo -> return $ Just $ LockHandle ph fo
+ Utility/LockPool/PidLock.hs view
@@ -0,0 +1,59 @@+{- Pid locks, using lock pools.+ -+ - Copyright 2015 Joey Hess <id@joeyh.name>+ -+ - License: BSD-2-clause+ -}++module Utility.LockPool.PidLock (+ P.LockFile,+ LockHandle,+ waitLock,+ tryLock,+ checkLocked,+ getLockStatus,+ LockStatus(..),+ dropLock,+ checkSaneLock,+) where++import qualified Utility.LockFile.PidLock as F+import Utility.LockFile.LockStatus+import qualified Utility.LockPool.STM as P+import Utility.LockPool.STM (LockFile, LockMode(..))+import Utility.LockPool.LockHandle+import Utility.ThreadScheduler++import System.IO+import System.Posix+import Data.Maybe+import Control.Applicative+import Prelude++-- Takes a pid lock, blocking until the lock is available or the timeout.+waitLock :: Seconds -> LockFile -> IO LockHandle+waitLock timeout file = makeLockHandle+ (P.waitTakeLock P.lockPool file LockExclusive)+ (mk <$> F.waitLock timeout file)++-- Tries to take a pid lock, but does not block.+tryLock :: LockFile -> IO (Maybe LockHandle)+tryLock file = tryMakeLockHandle+ (P.tryTakeLock P.lockPool file LockShared)+ (fmap mk <$> F.tryLock file)++checkLocked :: LockFile -> IO (Maybe Bool)+checkLocked file = P.getLockStatus P.lockPool file+ (pure (Just True))+ (F.checkLocked file)++getLockStatus :: LockFile -> IO LockStatus+getLockStatus file = P.getLockStatus P.lockPool file+ (StatusLockedBy <$> getProcessID)+ (F.getLockStatus file)++mk :: F.LockHandle -> FileLockOps+mk h = FileLockOps+ { fDropLock = F.dropLock h+ , fCheckSaneLock = \f -> F.checkSaneLock f h+ }
Utility/LockPool/Posix.hs view
@@ -20,7 +20,7 @@ ) where import qualified Utility.LockFile.Posix as F-import Utility.LockFile.Posix (LockStatus(..))+import Utility.LockFile.LockStatus import qualified Utility.LockPool.STM as P import Utility.LockPool.STM (LockFile, LockMode(..)) import Utility.LockPool.LockHandle@@ -35,25 +35,25 @@ lockShared :: Maybe FileMode -> LockFile -> IO LockHandle lockShared mode file = makeLockHandle (P.waitTakeLock P.lockPool file LockShared)- (F.lockShared mode file)+ (mk <$> F.lockShared mode file) -- Takes an exclusive lock, blocking until the lock is available. lockExclusive :: Maybe FileMode -> LockFile -> IO LockHandle lockExclusive mode file = makeLockHandle (P.waitTakeLock P.lockPool file LockExclusive)- (F.lockExclusive mode file)+ (mk <$> F.lockExclusive mode file) -- Tries to take a shared lock, but does not block. tryLockShared :: Maybe FileMode -> LockFile -> IO (Maybe LockHandle) tryLockShared mode file = tryMakeLockHandle (P.tryTakeLock P.lockPool file LockShared)- (F.tryLockShared mode file)+ (fmap mk <$> F.tryLockShared mode file) -- Tries to take an exclusive lock, but does not block. tryLockExclusive :: Maybe FileMode -> LockFile -> IO (Maybe LockHandle) tryLockExclusive mode file = tryMakeLockHandle (P.tryTakeLock P.lockPool file LockExclusive)- (F.tryLockExclusive mode file)+ (fmap mk <$> F.tryLockExclusive mode file) -- Returns Nothing when the file doesn't exist, for cases where -- that is different from it not being locked.@@ -67,5 +67,8 @@ (StatusLockedBy <$> getProcessID) (F.getLockStatus file) -checkSaneLock :: LockFile -> LockHandle -> IO Bool-checkSaneLock lockfile (LockHandle _ fh) = F.checkSaneLock lockfile fh+mk :: F.LockHandle -> FileLockOps+mk h = FileLockOps+ { fDropLock = F.dropLock h+ , fCheckSaneLock = \f -> F.checkSaneLock f h+ }
Utility/LockPool/Windows.hs view
@@ -24,7 +24,7 @@ lockShared :: LockFile -> IO (Maybe LockHandle) lockShared file = tryMakeLockHandle (P.tryTakeLock P.lockPool file LockShared)- (F.lockShared file)+ (fmap mk <$> F.lockShared file) {- Tries to take an exclusive lock on a file. Fails if another process has - a shared or exclusive lock.@@ -35,9 +35,14 @@ lockExclusive :: LockFile -> IO (Maybe LockHandle) lockExclusive file = tryMakeLockHandle (P.tryTakeLock P.lockPool file LockExclusive)- (F.lockExclusive file)+ (fmap mk <$> F.lockExclusive file) {- If the initial lock fails, this is a BUSY wait, and does not - guarentee FIFO order of waiters. In other news, Windows is a POS. -} waitToLock :: IO (Maybe lockhandle) -> IO lockhandle waitToLock = F.waitToLock++mk :: F.LockHandle -> FileLockOps+mk h = FileLockOps+ { fDropLock = F.dropLock h+ }
Utility/Quvi.hs view
@@ -14,7 +14,8 @@ import Utility.Url import Data.Aeson-import Data.ByteString.Lazy.UTF8 (fromString)+import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as BL import qualified Data.Map as M import Network.URI (uriAuthority, uriRegName) import Data.Char@@ -77,8 +78,8 @@ forceQuery :: Query (Maybe Page) forceQuery v ps url = query' v ps url `catchNonAsync` onerr where- onerr _ = ifM (inPath "quvi")- ( error "quvi failed"+ onerr e = ifM (inPath "quvi")+ ( error ("quvi failed: " ++ show e) , error "quvi is not installed" ) @@ -89,9 +90,11 @@ query' :: Query (Maybe Page) query' Quvi09 ps url = parseEnum- <$> readProcess "quvi" (toCommand $ [Param "dump", Param "-p", Param "enum"] ++ ps ++ [Param url])-query' Quvi04 ps url = decode . fromString- <$> readProcess "quvi" (toCommand $ ps ++ [Param url])+ <$> readQuvi (toCommand $ [Param "dump", Param "-p", Param "enum"] ++ ps ++ [Param url])+query' Quvi04 ps url = do+ let p = proc "quvi" (toCommand $ ps ++ [Param url])+ decode . BL.fromStrict+ <$> withHandle StdoutHandle createProcessSuccess p B.hGetContents query' NoQuvi _ _ = return Nothing queryLinks :: Query [URLString]@@ -131,8 +134,7 @@ listdomains Quvi09 = concatMap (split ",") . concatMap (drop 1 . words) . filter ("domains: " `isPrefixOf`) . lines- <$> readProcess "quvi"- (toCommand [Param "info", Param "-p", Param "domains"])+ <$> readQuvi (toCommand [Param "info", Param "-p", Param "domains"]) listdomains _ = return [] type QuviParams = QuviVersion -> [CommandParam]@@ -150,3 +152,14 @@ -- No way to do it with 0.9? httponly Quvi04 = [Param "-c", Param "http"] httponly _ = [] -- No way to do it with 0.9?++{- Both versions of quvi will output utf-8 encoded data even when+ - the locale doesn't support it. -}+readQuvi :: [String] -> IO String+readQuvi ps = withHandle StdoutHandle createProcessSuccess p $ \h -> do+ fileEncoding h+ r <- hGetContentsStrict h+ hClose h+ return r+ where+ p = proc "quvi" ps
Utility/SafeCommand.hs view
@@ -105,10 +105,10 @@ | otherwise = inquote q (w++[c]) cs -- | For quickcheck.-prop_idempotent_shellEscape :: String -> Bool-prop_idempotent_shellEscape s = [s] == (shellUnEscape . shellEscape) s-prop_idempotent_shellEscape_multiword :: [String] -> Bool-prop_idempotent_shellEscape_multiword s = s == (shellUnEscape . unwords . map shellEscape) s+prop_isomorphic_shellEscape :: String -> Bool+prop_isomorphic_shellEscape s = [s] == (shellUnEscape . shellEscape) s+prop_isomorphic_shellEscape_multiword :: [String] -> Bool+prop_isomorphic_shellEscape_multiword s = s == (shellUnEscape . unwords . map shellEscape) s -- | Segments a list of filenames into groups that are all below the maximum -- command-line length limit.
debian/changelog view
@@ -1,3 +1,38 @@+git-annex (5.20151116) unstable; urgency=medium++ * Use concurrent-output library when configured with -fConcurrentOutput.+ This allows nicely displayed messages when using the -J flag.+ * Additional commands now support the -J flag: + fsck, drop, add, addurl, import+ * import: Avoid very ugly error messages when the directory files+ are imported to is not a directort, but perhaps an annexed file.+ * Concurrent progress bars are now displayed when using -J with a command+ that moves file contents around.+ * Fix race that could result in an annexed file's symlink not being+ created, when eg, running concurrent git-annex adds.+ * add: Fix error recovery rollback to not move the injested file content+ out of the annex back to the file, because other files may point to+ that same content. Instead, copy the injected file content out to+ recover.+ * quvi may output utf-8 encoded data when the conifigured locale doesn't+ support that; avoid crashing on such invalid encoding.+ * runshell: Avoid failing when $HOME/.ssh does not exist and cannot be+ created.+ * Make the git-annex-standalone.deb prevent runshell from installing+ wrappers into $HOME/.ssh+ * Make git-annex-standalone.deb include the git-annex html documentation,+ desktop file, and base completion file, same as the regular git-annex.deb.+ * fsck: When fscking a dead repo, avoid incorrect "fixing location log"+ message, and display a warning about it being dead, since it's unusual+ to have access to a dead repo.+ * assistant: Pass ssh-options through 3 more git pull/push calls+ that were missed before.+ * Added annex.pidlock and annex.pidlocktimeout configuration to support+ filesystems where POSIX fcntl locks cannot be used.+ * init: Automatically enable annex.pidlock when necessary.++ -- Joey Hess <id@joeyh.name> Mon, 16 Nov 2015 14:17:40 -0400+ git-annex (5.20151102.1) unstable; urgency=medium * Avoid installing desktop file and program file if cabal install
debian/patches/standalone-build view
@@ -60,9 +60,3 @@ @@ -0,0 +1,2 @@ +/usr/lib/git-annex.linux/git-annex /usr/bin/git-annex +/usr/lib/git-annex.linux/git-annex-shell /usr/bin/git-annex-shell-Index: git-annex/debian/manpages-===================================================================---- /dev/null-+++ git-annex/debian/manpages-@@ -0,0 +1 @@-+debian/git-annex-standalone/usr/lib/git-annex.linux/usr/share/man/man1/git-annex*
debian/rules view
@@ -16,10 +16,11 @@ ifeq ($(STANDALONE_BUILD),1) override_dh_auto_build:- make linuxstandalone+ make linuxstandalone GIT_ANNEX_PACKAGE_INSTALL=1 override_dh_auto_install:- : # nothing to do, we just need to copy the beast, as instructed in debian/install+ make install-misc install-docs DESTDIR=debian/git-annex-standalone+ # bins are linked into place, as instructed in debian/install and debian/links override_dh_fixperms: dh_fixperms -Xld-linux
+ doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="comment 10"+ date="2013-05-24T03:11:50Z"+ content="""+>you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused.++;-) Sorry for confusion, here are the details:++\"Read-only file system\" -- that error appeared when I started \"stock git annex\", i.e. from running /data/data/ga.androidterm/lib/lib.start.so .+Since you have suggested that it might be coming from hard linking command, I have ran that one manually, and that is when I got \"Cross-device link\" error, which suggests that hard linking is not the one at fault here.++I will try fresh build now+Cheers,+"""]]
+ doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment view
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="fresh build"+ date="2013-05-24T03:21:29Z"+ content="""+With fresh build got:++u0_a39@android:/ $ git annex webapp+/system/bin/sh: git: not found++the PATH is /sbin:/system/bin:/system/xbin++where should git (and ga) reside now ? (/data somehow is not accessible now to u0_a39)+"""]]
+ doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 12"+ date="2013-05-24T03:26:33Z"+ content="""+You should be able to run /data/data/ga.androidterm/runshell even if you cannot ls /data. This adds /data/data/ga.androidterm/bin to PATH++However, the shell that the app starts is started by runshell anyway, so I don't understand how this could happen.+"""]]
+ doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA"+ nickname="Franck"+ subject="Still problems with my old N1/CM7"+ date="2013-05-24T06:01:18Z"+ content="""+Hi, thank you for addressing this issue! I installed the new release but now it fails in another way: the message is just \"In mgmain NJI_OnLoad\" then the terminal says that the session is closed.+"""]]
+ doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="It starts after uninstall/install"+ date="2013-05-24T23:29:52Z"+ content="""+Hi Joey -- there is success here... previous installation was \"updated\" by installing the new package without uninstalling previous one, and that apparently didn't work correctly (I didn't even have bin/ directory you mentioned). So I have removed previous installation and reinstalled it again -- it starts now! Thanks ;)+"""]]
+ doc/Android/oldcomments/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="asking for ssh password in the terminal (not in web ui)"+ date="2013-05-24T23:49:40Z"+ content="""+not sure if that is a known issue: whenever \"remote server\" is added, password needs to be typed back in the original terminal... is a bit challenging to do on android and not straightforward user-wise +"""]]
+ doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment view
@@ -0,0 +1,27 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="Few other issues"+ date="2013-05-25T15:35:46Z"+ content="""+Hi again.++talking about 4.20130523-gcfe07a2 version:++- because working in the terminal to interact with git-annex probably should not be a common case on Android, may be it is worth making default type of new added repository to become a full backup? I have initiated a new one, attached a remote one, it said \"synced\" but all the files were just containing symlinks and were not usable. I had to switch to \"full backup\" (or whatever that name) to finally get directory synced++- log file might grow too large simply because of containing numerous entries for attempting connect remote repository while offline, e.g.++Please make sure you have the correct access rights+and the repository exists.+ssh: Could not resolve hostname onerussian.com: No address associated with hostname+fatal: Could not read from remote repository.++IMHO those should not be there at all, e.g. if it is known that ATM there is no network connectivity++- In addition to two existing repositories (1 local /sdcard/annex, which is also avail at/storage/sdcard0/annex + 1 remote) I have added one more local (and said to keep it in sync with original local). But it didn't work -- it \"Synced with onerussian.com_annex but not with Annex\" and claimed that the /external/extSdCard/Annex doesn't exist, although it is there (and with .git generated etc). When I restarted the deamon I got into a \"new\" Repository: /storage/extSdCard/Annex which also listed the 1st local but with \"Failed to sync with localhost\" message -- no remote one listed. Whenever I try to \"Switch repository\" to /sdcard/annex (the original local) -- it starts loading a new page but gets stuck right there. The only way to revive webui is to go back to Dashboard. Log there says (retyping from the screen so typos might be there):++error: cannot run git-receive-pack '/storage/sdcard0/annex': No such file or directory+fatal: unable to fork++"""]]
+ doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="comment 17"+ date="2013-05-29T02:43:29Z"+ content="""+joey -- any additional information could I provide to troubleshoot the issue? original repository seems to sync ok, but I can't \"administer\" it if I can't even switch to it...+"""]]
+ doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment view
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="http://aap.liquidid.net/"+ nickname="AAP"+ subject="comment 18"+ date="2013-05-30T11:23:58Z"+ content="""+I too get the 'link busybox: Read-only file system' message. Here is my phone info: ++Phone: Samsung Galaxy Y GT-S5360 (rooted) +Android: 2.3.6 Gingerbread +BusyBox path: /system/xbin/ +++Androids own terminal seems not to understand the d argument (-ld: No such file or directory) but over ssh 'ls -ld /data/data/ga.androidterm' returns+ + drwxr-x--x 1 app_97 app_97 0 May 30 12:57 /data/data/ga.androidterm/+"""]]
+ doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment view
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="Does it require the device to be rooted?"+ date="2013-05-16T20:55:45Z"+ content="""+Following your news on kickstarter downloaded the .apk, and installed it. Upn start I just got a terminal window with++ link busybox: Read-only file system++ [Terminal session finished]++That is on Galaxy Note++"""]]
+ doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://afoolishmanifesto.com/"+ nickname="frioux"+ subject="SSH Keys - 2"+ date="2013-07-17T22:56:37Z"+ content="""+@joey should I be using the nightlies to see that? Under \"Adding a remote server using ssh\" I only see Host name, user name, directory, and port. Will it only be an option after I type in a password?+"""]]
+ doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.6.48"+ subject="comment 22"+ date="2013-07-17T23:25:21Z"+ content="""+@frioux it will automatically generate a new ssh key and configure the server to use it, once you submit the form and enter the password to let it into the server.+"""]]
+ doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://afoolishmanifesto.com/"+ nickname="frioux"+ subject="comment 23"+ date="2013-07-18T02:01:28Z"+ content="""+@joey: ok, I got it to connect and it indeed sent over a key etc. For some reason now though git-annex (on android) \"crashes\" shortly after starting. To be clear, the web app says that the program crashed, the console is still there. I suspect that it may have something to do with my largish remote repo and the time required to sync just the metadata, but I can't tell. Any ideas what I should do next? (Note that I *did* change it to manual mode because my phone doesn't have 30G of storage :)+"""]]
+ doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://afoolishmanifesto.com/"+ nickname="frioux"+ subject="comment 24"+ date="2013-07-18T11:35:06Z"+ content="""+ok, it eventually got the details from the remote server, but now I'm getting some other oddities. here is some of my log that shows what I am running into++Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:22:46 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:23:19 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:24:28 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:24:31 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:25:44 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory)+"""]]
+ doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnRfQArYOmDd7r2DC7DkIJFOQgqXCVcAeU"+ nickname="Frew"+ subject="comment 25"+ date="2013-07-18T13:14:46Z"+ content="""+frioux here (something messed up with myopenid or something)++So I deleted the repo on my phone (via the CLI since the web app seemed hung) and recreated it; this time making sure that I set things to manual mode ASAP. It didn't have the problem it was having before, but now what seems to have happened is that it fetches from the remote, commits to the local repo, and then immediately fetches and commits again. It looks like it's about a 4s repeat loop. Any ideas what I should do next?+"""]]
+ doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.140"+ subject="comment 26"+ date="2013-07-18T17:07:27Z"+ content="""+@Frew, you should file bug reports when you have a bug.++One problem you mentioned had already had a bug report filed by someone+else:+<http://git-annex.branchable.com/bugs/Watcher_crashed:_addWatch:_does_not_exist/> So you can post your details there.+"""]]
+ doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment view
@@ -0,0 +1,34 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="Watcher crashed in Android on /storage/sdcard1 - bug?"+ date="2013-07-29T11:50:46Z"+ content="""+In webapp UI, added on first install, the location for repository: /storage/sdcard1++!warning++Watcher crashed: addWatch:++permission denied (Permission denied)++[Restart Thread]++:Performing startup scan+++In terminal Window 1:++nex webapp <++ Detected a crippled filesystem.++ Enabling direct mode.++ Detected a filesystem without fifo support.++ Disabling ssh connection caching.+++Android 4.1.1 Huawei Y300 Annex.apk v1.0.52 version 4.20130723+"""]]
+ doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="Jonathan"+ ip="63.131.117.194"+ subject="link busybox: Read-only file system"+ date="2013-07-29T20:08:12Z"+ content="""+Phone: HTC EVO 3d 4g+Model Number: pg86100+Android Version: 4.0.3+"""]]
+ doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 2"+ date="2013-05-17T22:28:34Z"+ content="""+The Android app works on many non-rooted Android systems.++The \"link busybox: Read-only file system\" means that `/data/data/ga.androidterm/lib/lib.busybox.so` cannot be hard linked to `/data/data/ga.androidterm/busybox`. That's not normal. I'd appreciate if you could provide more information on your Android device, like Android version and model number.+"""]]
+ doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="Follow-up information on my system"+ date="2013-05-18T01:23:28Z"+ content="""+Sorry for the delay: my android is stock Samsung-tuned Jelly beans.+Android 4.1.2+Baseband version N7000XXLSO++not sure if that would be of any use :-/ nothing in the logs (aLogcat) if I filter by annex -- should there any debug output? what should be a key to search by?+++"""]]
+ doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnu1NYw8UF-NoDbKu8YKVGxi8FoZLH7JPs"+ nickname="Chris"+ subject="Not starting browser on Nexus 7, Android 4.2.2"+ date="2013-05-19T14:04:28Z"+ content="""+I just tried to run this on my Nexus 7 which has Android 4.2.2, and I received the following: <http://hodapple.com/files/Screenshot_2013-05-19-09-49-53.png> <http://hodapple.com/files/git-annex-error.txt>++In spite of that, though, the URL provided still worked.+"""]]
+ doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 5"+ date="2013-05-19T19:46:14Z"+ content="""+@Chris, that is a known bug: [[bugs/Android_app_permission_denial_on_startup]]+"""]]
+ doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment view
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 6"+ date="2013-05-19T20:06:56Z"+ content="""+@yarikoptic, there is a process you can perform that will help me determine what's going on.++You should be able to get the git-annex app to let you into a shell. You can do this by starting the app, and then going into its configuration menu, to Preferences, selecting \"Command Line\", and changing it to run \"/system/bin/sh\"++Then when you open a new window in the git-annex app, you'll be at a shell prompt. From there, you can run:++ls -ld /data/data/ga.androidterm++I'm interested to know a) whether the directory exists and b) what permissions and owner it has. On my tablet, I get back \"drwxr-x--x app_39 app_39\" .. and if I run `id` in the shell, it tells me it's running as `app_39`.++My guess is the directory probably does exist, but cannot be written to by the app. If you're able to verify that, the next step will be to investigate if there is some other directory that the app can write to. It needs to be able to write to someplace that is not on the `/sdcard` to install itself.+"""]]
+ doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA"+ nickname="Franck"+ subject="Link issue"+ date="2013-05-22T12:01:38Z"+ content="""+Hi, I have exactly the same problem with the link that fails on my phone. However, I checked the permissions and they are as you describe on your tablet (except for the app number). At the same time, everything is fine on my tablet... The phone runs an old Cyanogenmod 7.2.0 (Android 2.3.7) while the tablet is a more recent Asus TF700T (Android 4.1.1). Let me know if you want me to run tests.+"""]]
+ doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="why ln failed"+ date="2013-05-23T13:27:39Z"+ content="""+Finally got to check it out: so indeed hardlinking fails but not because of permissions but \"link failed Cross-device link\" that lib is -> /mnt/asec/ga.androidterm-1/lib which resides on a different partition (vfat, /dev/block/dm-2, ro) from /data (ext4, /dev/block/mmcblk0p10)+"""]]
+ doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 9"+ date="2013-05-23T18:44:46Z"+ content="""+@yarikoptic you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused.++I've reworked the android app to not need any hard links. Try the current autobuild: <http://downloads.kitenet.net/git-annex/autobuild/android/git-annex.apk>+"""]]
− doc/bugs/.mdwn
@@ -1,250 +0,0 @@-### Please describe the problem.--For shared repositories git annex refuses to move file out of repository (git annex move --to) if user triggering the move is not the owner of the file.--### What steps will reproduce the problem?-- * Init two shared repositories and create a file- * Modify that file in repo1 as user u1- * Move the file to repo2 as "repository maintenance" user u2- - this gives permission denied error--Alternatively -- mabye better understandable usecase(repository maintainer moves unused files to backup):-- * Init two shared repositories and create a file- * Modify that file in repo1 as user u1- * Modify that file in repo1 a second time (regardless which user) -- this makes the version edited by u1 unused- * Display unused files as repository maintenance user u2 - - this gives permission denied error- * Move unused files to repo2 as "repository maintenance" user u2 - - this gives permission denied error--### What version of git-annex are you using? On what operating system?--[[!format sh """-stefan@atom-linux:/tmp/git-annex-test/a$ git --version-git version 2.6.2-stefan@atom-linux:/tmp/git-annex-test/a$ git annex version-git-annex version: 5.20150610+gitg608172f-1~ndall+1-build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA-key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E MD5E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 MD5 WORM URL-remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external-local repository version: 5-supported repository version: 5-upgrade supported from repository versions: 0 1 2 4-stefan@atom-linux:/tmp/git-annex-test/a$ uname -a-Linux atom-linux 3.13.0-66-generic #108-Ubuntu SMP Wed Oct 7 15:21:40 UTC 2015 i686 i686 i686 GNU/Linux-"""]]--### Please provide any additional information below.--[[!format sh """--# init two shared repositories and create a file "file.txt"--stefan@atom-linux:/tmp/git-annex-test$ mkdir a-stefan@atom-linux:/tmp/git-annex-test$ mkdir b-stefan@atom-linux:/tmp/git-annex-test$ sudo chown :fileadmin-data *-stefan@atom-linux:/tmp/git-annex-test$ sudo chmod g+s *-stefan@atom-linux:/tmp/git-annex-test$ cd a-stefan@atom-linux:/tmp/git-annex-test/a$ git init --shared .-Initialized empty shared Git repository in /tmp/git-annex-test/a/.git/-stefan@atom-linux:/tmp/git-annex-test/a$ git config core.sharedrepository group-stefan@atom-linux:/tmp/git-annex-test/a$ echo "test" >> file.txt-stefan@atom-linux:/tmp/git-annex-test/a$ ls -al-total 16-drwxrwsr-x 3 stefan fileadmin-data 4096 Nov 1 16:41 .-drwxrwxr-x 4 stefan stefan 4096 Nov 1 16:39 ..--rw-rw-r-- 1 stefan fileadmin-data 5 Nov 1 16:41 file.txt-drwxrwsr-x 7 stefan fileadmin-data 4096 Nov 1 16:40 .git-stefan@atom-linux:/tmp/git-annex-test/a$ git annex init-init ok-(recording state in git...)-stefan@atom-linux:/tmp/git-annex-test/a$ git annex add file.txt-add file.txt ok-(recording state in git...)-stefan@atom-linux:/tmp/git-annex-test/a$ git commit -m "new file"-[master (root-commit) 7aeaa5f] new file- 1 file changed, 1 insertion(+)- create mode 120000 file.txt-stefan@atom-linux:/tmp/git-annex-test/a$ cd ..-stefan@atom-linux:/tmp/git-annex-test$ cd b-stefan@atom-linux:/tmp/git-annex-test/b$ git clone -o a ssh://127.0.0.1/tmp/git-annex-test/a .-Cloning into '.'...-remote: Counting objects: 13, done.-remote: Compressing objects: 100% (9/9), done.-remote: Total 13 (delta 0), reused 0 (delta 0)-Receiving objects: 100% (13/13), done.-Checking connectivity... done.-stefan@atom-linux:/tmp/git-annex-test/b$ git config core.sharedrepository group-stefan@atom-linux:/tmp/git-annex-test/b$ git annex init "B"-init B (merging a/git-annex into git-annex...)-(recording state in git...)-ok-(recording state in git...)-stefan@atom-linux:/tmp/git-annex-test/b$ cd ..-stefan@atom-linux:/tmp/git-annex-test$ cd a-stefan@atom-linux:/tmp/git-annex-test/a$ git remote add b ssh://127.0.0.1/tmp/git-annex-test/b-stefan@atom-linux:/tmp/git-annex-test/a$ git annex sync-commit ok-pull b-remote: Counting objects: 6, done.-remote: Compressing objects: 100% (5/5), done.-remote: Total 6 (delta 0), reused 1 (delta 0)-Unpacking objects: 100% (6/6), done.-From ssh://127.0.0.1/tmp/git-annex-test/b- * [new branch] git-annex -> b/git-annex- * [new branch] master -> b/master-ok-(merging b/git-annex into git-annex...)-push b-Total 0 (delta 0), reused 0 (delta 0)-To ssh://127.0.0.1/tmp/git-annex-test/b- * [new branch] git-annex -> synced/git-annex- * [new branch] master -> synced/master-ok-stefan@atom-linux:/tmp/git-annex-test/a$ git annex move file.txt --to b-move file.txt (checking b...) (to b...)-SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2.txt- 5 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)-ok-(recording state in git...)--## ok, everything fine so far - we have a file "file.txt" which was created in a and moved to b successfully. -## Now we go to a different user account and modify "file.txt"-## -------------------------------------- userswitch--unison@atom-linux:/tmp/git-annex-test/a$ git annex get file.txt-get file.txt (from b...)-SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2.txt- 5 100% 4.88kB/s 0:00:00 (xfr#1, to-chk=0/1)-ok-(recording state in git...)-unison@atom-linux:/tmp/git-annex-test/a$ git annex unlock file.txt-unlock file.txt (copying...) ok-unison@atom-linux:/tmp/git-annex-test/a$ ls -al-total 16-drwxrwsr-x 3 stefan fileadmin-data 4096 Nov 1 16:48 .-drwxrwxr-x 4 stefan stefan 4096 Nov 1 16:39 ..--rw-rw-r-- 1 unison fileadmin-data 5 Nov 1 16:47 file.txt-drwxrwsr-x 9 stefan fileadmin-data 4096 Nov 1 16:44 .git-unison@atom-linux:/tmp/git-annex-test/a$ echo "a change by unison user" >> file.txt-unison@atom-linux:/tmp/git-annex-test/a$ git annex add .-add file.txt ok-(recording state in git...)-unison@atom-linux:/tmp/git-annex-test/a$ git commit -m "unison change"-[master 37bd55d] unison change- 1 file changed, 1 insertion(+), 1 deletion(-)--## now the original user / repository maintainer wants to move the file -## out to b which gives an permission denied error for setFileMode-## git annex does copy it to b, but not remove it from a-## -------------------------------------- userswitch--stefan@atom-linux:/tmp/git-annex-test/a$ ls -al-total 16-drwxrwsr-x 3 stefan fileadmin-data 4096 Nov 1 16:48 .-drwxrwxr-x 4 stefan stefan 4096 Nov 1 16:39 ..-lrwxrwxrwx 1 unison fileadmin-data 188 Nov 1 16:48 file.txt -> .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.tx-t/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt-drwxrwsr-x 9 stefan fileadmin-data 4096 Nov 1 16:48 .git-stefan@atom-linux:/tmp/git-annex-test/a$ git annex move file.txt --to b-move file.txt (checking b...) (to b...)-SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt- 29 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)-git-annex: failed to lock content: .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt/SHA256E-s29--6aec68aad4745c6-eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt: setFileMode: permission denied (Operation not permitted)--# which makes sense - the file is owned by other user:-stefan@atom-linux:/tmp/git-annex-test/a$ ls -al .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt/SHA256E-s29--6-aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt--r--r--r-- 1 unison fileadmin-data 29 Nov 1 16:48 .git/annex/objects/8x/7w/SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt/SHA256E-s29---6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt--## the last editor of the file can move it, though:-## -------------------------------------- userswitch-unison@atom-linux:/tmp/git-annex-test/a$ git annex move file.txt --to b-move file.txt (checking b...) ok-(recording state in git...)--## continued - for second usecase...-## edit file two more times as unison user:--unison@atom-linux:/tmp/git-annex-test/a$ git annex unlock file.txt-unlock file.txt (copying...) ok-unison@atom-linux:/tmp/git-annex-test/a$ echo "another unison modification" >> file.txt-unison@atom-linux:/tmp/git-annex-test/a$ ls-file.txt-unison@atom-linux:/tmp/git-annex-test/a$ git annex add-add file.txt ok-(recording state in git...)-unison@atom-linux:/tmp/git-annex-test/a$ git commit -m "another unison change"-[master df85491] another unison change- 1 file changed, 1 insertion(+), 1 deletion(-)-unison@atom-linux:/tmp/git-annex-test/a$ git annex unlock file.txt-unlock file.txt (copying...) ok-(recording state in git...)-unison@atom-linux:/tmp/git-annex-test/a$ echo "changes once more" >> file.txt-unison@atom-linux:/tmp/git-annex-test/a$ git annex add .-add file.txt ok-(recording state in git...)-unison@atom-linux:/tmp/git-annex-test/a$ git commit -m "1 more"-[master 099a2c7] 1 more- 1 file changed, 1 insertion(+), 1 deletion(-)- -unison@atom-linux:/tmp/git-annex-test/a$ git annex unused-unused . (checking for unused data...) (checking b/master...) (checking master...)- Some annexed data is no longer used by any files:- NUMBER KEY- 1 SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt- 2 SHA256E-s57--dc131ed3874c3b51a6801c43f5d5c0706a9aea58134459eeddf3436626adc89f.txt- (To see where data was previously used, try: git log --stat -S'KEY')-- To remove unwanted data: git-annex dropunused NUMBER--ok--## switch to repository maintenance user and list unused:-## -------------------------------------- userswitch--stefan@atom-linux:/tmp/git-annex-test/a$ git annex unused --debug-unused . (checking for unused data...) [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","ls-files","--cached","--others","-z","---","."]-[2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","symbolic-ref","-q","HEAD"]-[2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--hash","refs/heads/master"]-[2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref"]-(checking b/master...) [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"]-[2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"]-[2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","diff-index","-z","--raw","--no-renames","-l0","refs/remotes/b/master","--"]-[2015-11-01 17:35:09 CET] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch"]-(checking master...) [2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"]-[2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--head"]-[2015-11-01 17:35:09 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","diff-index","-z","--raw","--no-renames","-l0","refs/heads/master","--"]-- Some annexed data is no longer used by any files:- NUMBER KEY- 1 SHA256E-s29--6aec68aad4745c6eb7babaa5f66fb727e896ec47414edfd4fec8136a1db8484e.txt- 2 SHA256E-s57--dc131ed3874c3b51a6801c43f5d5c0706a9aea58134459eeddf3436626adc89f.txt- (To see where data was previously used, try: git log --stat -S'KEY')-- To remove unwanted data: git-annex dropunused NUMBER---git-annex: .git/annex/unused: openFile: permission denied (Permission denied)-failed-git-annex: unused: 1 failed---stefan@atom-linux:/tmp/git-annex-test/a$ git annex move --unused --to b-git-annex: .git/annex/unused: openFile: permission denied (Permission denied)-stefan@atom-linux:/tmp/git-annex-test/a$ git annex move --debug --unused --to b-[2015-11-01 17:38:48 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","git-annex"]-[2015-11-01 17:38:48 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--hash","refs/heads/git-annex"]-[2015-11-01 17:38:48 CET] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","log","refs/heads/git-annex..4cdcc1b4550b2737e018d382022f3ce3e1dcb029","-n1","---pretty=%H"]-[2015-11-01 17:38:48 CET] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch"]-git-annex: .git/annex/unused: openFile: permission denied (Permission denied)--# End of transcript or log.-"""]]-
+ doc/bugs/Assistant_drops_files_from_remote_repos_that_it_shouldn__39__t.mdwn view
@@ -0,0 +1,39 @@+### Please describe the problem.++git-annex assistant starts to drop files in remote repos, even when they are set to manual.++### What steps will reproduce the problem?+++Create 3 repos:++* A -- standard, archive+* m1 -- standard, manual+* m2 -- standard, manual++System has 3 files annexed: file1, file2, file3. Repo "A" has all three files, m1 has none, m2 has file3.++So, while in m1:++ m1 $ git annex find --want-drop --in m2+ file3++file3 shouln't be dropped from m2. There is no reason to do this. m2 is set as manual, and it shouldn't be touched in any case.++Now, let's get this file in m1:++ m1 $ git annex get file3+ get file3 (from m2...) ok+ (Recording state in git...)+ m1 $ git annex find --want-drop --in m2++So when 'file3' is present in local repo, it's not going to be dropped from m2.++I guess that rule 'present' works in local repo context while 'drop' acts on remote files.+++### What version of git-annex are you using? On what operating system?++I'm using latest version in Debian Jessie (5.20141024) on amd64 and armhf. I've also reproduced the bug with manually compiled 5.20141105-g8d8b248 on amd64.++[[!tag moreinfo]]
+ doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn view
@@ -0,0 +1,31 @@+The assistant from the standalone 64bit build crashes upon startup.++### Version information++ [0 zerodogg@firefly annexed]$ git annex version+ git-annex version: 5.20131230-g4aa88d8+ build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA+ key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+ remote types: git gcrypt S3 bup directory rsync web webdav glacier hook external+ local repository version: 5+ supported repository version: 5+ upgrade supported from repository versions: 0 1 2 4+ [0 zerodogg@firefly annexed]$ uname -a+ Linux firefly 3.12.5-302.fc20.x86_64 #1 SMP Tue Dec 17 20:42:32 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux+ [0 zerodogg@firefly annexed]$ cat /etc/fedora-release + Fedora release 20 (Heisenbug)+ [0 zerodogg@firefly annexed]$ ++### Error++ [0 zerodogg@firefly annexed]$ git annex webapp+ Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html+ + (process:6045): GLib-CRITICAL **: g_slice_set_config: assertion 'sys_page_size == 0' failed+ libgcc_s.so.1 must be installed for pthread_cancel to work+ error: git-annex died of signal 6+ [134 zerodogg@firefly annexed]$ ls -l /usr/lib64/libgcc_s.so.1+ lrwxrwxrwx. 1 root root 28 2013-12-18 10:54 /usr/lib64/libgcc_s.so.1 -> libgcc_s-4.8.2-20131212.so.1+ [0 zerodogg@firefly annexed]$ ++> [[fixed|done]] --[[Joey]]
+ doc/bugs/Error_writing_log_message_when_filename_contains_Unicode_chars.mdwn view
@@ -0,0 +1,25 @@+### Please describe the problem.+I’ve noticed that daemon.log will sometimes contain error messages arising from logging a file name during transfer. Additionally, I’ve occasionally noticed that certain files get «stuck» after being added to the objects store, i. e., they will never be committed by the assistant and have to be staged manually; it appears there is a correlation between files where the logger errors out and files getting stuck.++I can reproduce this using the en-dash (U+2013).++### What steps will reproduce the problem?+1. Create a file named «Behold – the majestic en-dash» in a repository where the assistant is running.+2. Observe file has not been added by the assistant and daemon.log contains no message pertaining to new file.+3. Restart assistant.+4. Observe in daemon.log that the logger has errored out with «hPutChar: invalid argument» and gives the Unicode replacement character thrice for each en-dash.+5. Observe that file is added to object store, but the symlink is not staged or committed by the assistant.++### What version of git-annex are you using? On what operating system?+git-annex 5.20150731+Linux 4.0.9++### Please provide any additional information below.+[[!format sh """+# After restarting the assistant.+[2015-07-28 14:24:58 CEST] Committer: Adding 978Error writing log message: <stderr>: hPutChar: invalid argument (invalid character) (original message: [2015-07-28 14:24:58 CEST] Committer: Adding 978\65533\65533\655330\65533\65533..1\65533\65533\655330.pdf)+[2015-07-28 14:24:59 CEST] Transferrer: Uploaded 978Error writing log message: <stderr>: hPutChar: invalid argument (invalid character) (original message: [2015-07-28 14:24:59 CEST] Transferrer: Uploaded 978\65533\65533\655330\65533\65533..1\65533\65533\655330.pdf)+"""]]++> Closing this because the main bug is fixed in hinotify git and will+> percolate to the git-annex builds eventually. [[done]] --[[Joey]]
doc/bugs/Files_in___34__here__34___not_known_to_git_annex.mdwn view
@@ -48,3 +48,5 @@ ### What version of git-annex are you using? On what operating system? git-annex version: 5.20151019-1, Debian unstable.++> improved fsck output [[done]] --[[Joey]]
+ doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn view
@@ -0,0 +1,69 @@+### Please describe the problem.++[[!tag moreinfo]]++I added a lot of files to my annex in direct mode. Now I want to switch to indirect mode. git-annex status and indirect create an out-of-memory error.++### What steps will reproduce the problem?++I am not really sure, I added a lot of files to the annex, almost 3TB.+Then either git-annex status or git-annex indirect cause a similar error (see below).+++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130501-g4a5bfb3+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++Ubuntu precise+3.2.0-26-generic+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/debug.log+git-annex status+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+supported remote types: git S3 bup directory rsync web webdav glacier hook+repository mode: direct+trusted repositories: 0+semitrusted repositories: 7+ 00000000-0000-0000-0000-000000000001 -- web+ 0b8e6666-80d5-11e2-adf3-6f4d3d6ef0aa -- marek@x4:~/tmp/annex+ 65c057c6-6027-11e2-84b0-b77d71696e49 -- here (.)+ 96b31c5e-6524-11e2-b136-fbd1a03b2799 -- BackupOnGlacier+ b509c388-629a-11e2-be5f-d376e201ad86 -- marek@x201:~/AllData+ c636e33c-6e31-11e2-a9c4-a3c5546d69d9 -- desktop+ fbaa1c3a-60d7-11e2-842f-9348368d2f4c -- .+untrusted repositories: 0+dead repositories: 0+transfers in progress: none+available local disk space: 81 gigabytes (+1 megabyte reserved)+temporary directory size: 9 megabytes (clean up with git-annex unused)+local annex keys: 61396+local annex size: 3 terabytes+known annex keys: git-annex: out of memory (requested 985661440 bytes)++OR++git-annex indirect+commit git-annex: out of memory (requested 985661440 bytes)++++++# End of transcript or log.+"""]]++> [[fixed|done]]. However, if you saw this behavior,+> you have large files checked directly into git. You may+> want to examine your repository and use git filter-branch to clean+> it up.+> --[[Joey]]
+ doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn view
@@ -0,0 +1,20 @@+What steps will reproduce the problem?++Adding files to a local annex set up to sync to a remote S3 one+++What is the expected output? What do you see instead?++It syncs, but maxes out the uplink+++What version of git-annex are you using? On what operating system?++3.20121112 on Debian testing+++Please provide any additional information below.++The man page lists how to configure rate limiting for rsync, not sure how to do it for this++[[!tag confirmed]]
+ doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn view
@@ -0,0 +1,23 @@+### Please describe the problem.++Creating a USB repo fails with a GPG error.++### What steps will reproduce the problem?++ * Build git-annex and git-annex assistant using the instructions at https://gist.github.com/calmyournerves/7144127+ * Run git-annex app to launch web interface+ * Create local repo using web interface+ * Try to create USB repo using web interface++### What version of git-annex are you using? On what operating system?++git-annex version 4.20131105-g136b030 on Mac OS 10.9 Mavericks.++### Please provide any additional information below.++[[!format sh """+07/Nov/2013:06:51:07 +1100 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"] exited 5) @(yesod-core-1.2.4.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5)+"""]]++> [[fixed|done]]; it seems that this was a local build issue ad does not+> affect the autobuild. --[[Joey]]
+ doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://schnouki.net/"+ nickname="Schnouki"+ subject="comment 1"+ date="2013-10-18T08:36:45Z"+ content="""+Hi Joey,++It looks like your patch hasn't been merged yet. And this bug is quite annoying for me (can't backup files bigger than 1.5 GB from my NAS).++Would it be possible to include this fix in your standalone builds and Debian packages?++Thanks!+"""]]
+ doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://schnouki.net/"+ nickname="Schnouki"+ subject="comment 2"+ date="2014-01-29T01:19:27Z"+ content="""+Any news about this?+"""]]
+ doc/bugs/S3_memory_leaks/comment_3_5e9cecb0e2ec7602963406779b6e3c1f._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.112"+ subject="comment 3"+ date="2014-08-02T23:08:44Z"+ content="""+hS3's author seems to have abandoned it and it has other problems. I should try to switch to a different S3 library.++There is now a workaround; S3 special remotes can be configured to use [[chunking]]. A max of one chunk will then be buffered in memory at a time. ++For example, to reconfigure an existing mys3 remote: `enableremote mys3 chunk=1MiB`+"""]]
+ doc/bugs/S3_memory_leaks/comment_4_37e41b518813bd7c349017abf4a0ca0f._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.112"+ subject="comment 4"+ date="2014-08-03T18:40:26Z"+ content="""+Beginning work on a `s3-aws` branch using the aws library instead of hS3.+"""]]
+ doc/bugs/S3_memory_leaks/comment_5_1b6d13852aeb37c5c29baf100bd62789._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c"+ nickname="Justin"+ subject="comment 5"+ date="2014-11-30T22:18:56Z"+ content="""+This is getting in my way, but I'm concerned about using a mostly-untested branch (and also, compiling for ARM sounds really unpleasant). Can you elaborate on the risks here? Can I perhaps donate developer time to get this merged into mainline?+"""]]
+ doc/bugs/S3_memory_leaks/comment_6_71ffb88f548969fd4d45eac4656380c0._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 6"""+ date="2014-12-02T17:10:42Z"+ content="""+The s3-aws branch is well tested now.++I am blocked from merging it by some dependency issues, in particular +<http://hackage.haskell.org/package/dbus> needs to have a small dependency+fix. I have emailed its author a second time now to try to get that done.+"""]]
+ doc/bugs/S3_memory_leaks/comment_7_1ac572b79caa23e3f791e4f8461fcddd._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c"+ nickname="Justin"+ subject="comment 7"+ date="2014-12-06T18:15:50Z"+ content="""+The new version works really great for me. I've been copying to S3 over the past few days with no issues on my raspberry pi.++Thanks a ton for getting this out.+"""]]
doc/bugs/STANDARD__95__IA_for_S3_remote_not_working.mdwn view
@@ -58,3 +58,6 @@ I've had great experiences using git annex normally, but the special remotes tend to get dicey, like here.++> The `STANDARD_IA` docuemntation now includes the necessary version of the+> aws library to support this feature. [[done]] --[[Joey]]
+ doc/bugs/Support_non-default_storage_classes_with_Google_Cloud_Storage.mdwn view
@@ -0,0 +1,94 @@+### Please describe the problem.++The S3 remote does not support Google Cloud Storage buckets with the+Durable Reduced Availability or Nearline storage classes. These are+less-expensive alternatives to the Standard storage class, which would+otherwise be a good fit for git-annex.++### What steps will reproduce the problem?++1. `git annex initremote cloud type=S3 encryption=none host=storage.googleapis.com bucket=storage-class-test storageclass=NEARLINE`+2. Observe that the bucket is created with Standard storage class.++or,++1. Use Cloud Storage web interface to create the `storage-class-test` bucket with Nearline storage class.+2. `git annex -d initremote cloud type=S3 encryption=none host=storage.googleapis.com bucket=storage-class-test storageclass=NEARLINE`+2. Observe failure shown below.++### What version of git-annex are you using? On what operating system?++5.20150528, Fedora 22++### Please provide any additional information below.++Google Cloud Storage applies the storage class per-bucket rather than per-object. As a result there are two separate problems:++1. If git-annex creates the bucket, there is no way to get it to pass the `StorageClass` XML element in the PUT Bucket operation (see e.g. [here](https://cloud.google.com/storage/docs/nearline#create), the "XML API" tab).+2. If the bucket is manually created by the user, subsequent PUT Object operations explicitly pass an `x-amz-storage-class` of `STANDARD` (or `REDUCED_REDUNDANCY`). Since this is incompatible with the storage class of the bucket, Google Cloud Storage returns `InvalidArgument`.++Example of the second problem:++[[!format sh """+$ git annex -d initremote cloud type=S3 encryption=none host=storage.googleapis.com bucket=storage-class-test storageclass=NEARLINE +[2015-05-31 17:38:21 EDT] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","git-annex"]+[2015-05-31 17:38:21 EDT] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--hash","refs/heads/git-annex"]+[2015-05-31 17:38:21 EDT] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","log","refs/heads/git-annex..417a5e8880eb22fa5288056f4f4e5d998e64a3e6","-n1","--pretty=%H"]+[2015-05-31 17:38:21 EDT] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch"]+initremote cloud (checking bucket...) [2015-05-31 17:38:21 EDT] String to sign: "GET\n\n\nSun, 31 May 2015 21:38:21 GMT\n/storage-class-test/annex-uuid"+[2015-05-31 17:38:21 EDT] Host: "storage-class-test.storage.googleapis.com"+[2015-05-31 17:38:21 EDT] Path: "/annex-uuid"+[2015-05-31 17:38:21 EDT] Query string: ""+[2015-05-31 17:38:21 EDT] Response status: Status {statusCode = 404, statusMessage = "Not Found"}+[2015-05-31 17:38:21 EDT] Response header 'Content-Type': 'application/xml; charset=UTF-8'+[2015-05-31 17:38:21 EDT] Response header 'Content-Length': '127'+[2015-05-31 17:38:21 EDT] Response header 'Date': 'Sun, 31 May 2015 21:38:21 GMT'+[2015-05-31 17:38:21 EDT] Response header 'Expires': 'Sun, 31 May 2015 21:38:21 GMT'+[2015-05-31 17:38:21 EDT] Response header 'Cache-Control': 'private, max-age=0'+[2015-05-31 17:38:21 EDT] Response header 'Server': 'UploadServer ("Built on May 21 2015 09:31:47 (1432225907)")'+[2015-05-31 17:38:21 EDT] Response header 'Alternate-Protocol': '80:quic,p=0'+[2015-05-31 17:38:21 EDT] Response metadata: S3: request ID=<none>, x-amz-id-2=<none>+[2015-05-31 17:38:21 EDT] String to sign: "GET\n\n\nSun, 31 May 2015 21:38:21 GMT\n/storage-class-test/"+[2015-05-31 17:38:21 EDT] Host: "storage-class-test.storage.googleapis.com"+[2015-05-31 17:38:21 EDT] Path: "/"+[2015-05-31 17:38:21 EDT] Query string: ""+[2015-05-31 17:38:22 EDT] Response status: Status {statusCode = 200, statusMessage = "OK"}+[2015-05-31 17:38:22 EDT] Response header 'x-goog-metageneration': '1'+[2015-05-31 17:38:22 EDT] Response header 'Content-Type': 'application/xml; charset=UTF-8'+[2015-05-31 17:38:22 EDT] Response header 'Content-Length': '219'+[2015-05-31 17:38:22 EDT] Response header 'Date': 'Sun, 31 May 2015 21:38:21 GMT'+[2015-05-31 17:38:22 EDT] Response header 'Expires': 'Sun, 31 May 2015 21:38:21 GMT'+[2015-05-31 17:38:22 EDT] Response header 'Cache-Control': 'private, max-age=0'+[2015-05-31 17:38:22 EDT] Response header 'Server': 'UploadServer ("Built on May 21 2015 09:31:47 (1432225907)")'+[2015-05-31 17:38:22 EDT] Response header 'Alternate-Protocol': '80:quic,p=0'+[2015-05-31 17:38:22 EDT] Response metadata: S3: request ID=<none>, x-amz-id-2=<none>+[2015-05-31 17:38:22 EDT] String to sign: "GET\n\n\nSun, 31 May 2015 21:38:22 GMT\n/storage-class-test/annex-uuid"+[2015-05-31 17:38:22 EDT] Host: "storage-class-test.storage.googleapis.com"+[2015-05-31 17:38:22 EDT] Path: "/annex-uuid"+[2015-05-31 17:38:22 EDT] Query string: ""+[2015-05-31 17:38:22 EDT] Response status: Status {statusCode = 404, statusMessage = "Not Found"}+[2015-05-31 17:38:22 EDT] Response header 'Content-Type': 'application/xml; charset=UTF-8'+[2015-05-31 17:38:22 EDT] Response header 'Content-Length': '127'+[2015-05-31 17:38:22 EDT] Response header 'Date': 'Sun, 31 May 2015 21:38:22 GMT'+[2015-05-31 17:38:22 EDT] Response header 'Expires': 'Sun, 31 May 2015 21:38:22 GMT'+[2015-05-31 17:38:22 EDT] Response header 'Cache-Control': 'private, max-age=0'+[2015-05-31 17:38:22 EDT] Response header 'Server': 'UploadServer ("Built on May 21 2015 09:31:47 (1432225907)")'+[2015-05-31 17:38:22 EDT] Response header 'Alternate-Protocol': '80:quic,p=0'+[2015-05-31 17:38:22 EDT] Response metadata: S3: request ID=<none>, x-amz-id-2=<none>+[2015-05-31 17:38:22 EDT] String to sign: "PUT\n\n\nSun, 31 May 2015 21:38:22 GMT\nx-amz-storage-class:STANDARD\n/storage-class-test/annex-uuid"+[2015-05-31 17:38:22 EDT] Host: "storage-class-test.storage.googleapis.com"+[2015-05-31 17:38:22 EDT] Path: "/annex-uuid"+[2015-05-31 17:38:22 EDT] Query string: ""+[2015-05-31 17:38:22 EDT] Body: "6eb85d96-8f9b-456a-819c-1724d12d2ffd"+[2015-05-31 17:38:22 EDT] Response status: Status {statusCode = 400, statusMessage = "Bad Request"}+[2015-05-31 17:38:22 EDT] Response header 'Content-Type': 'application/xml; charset=UTF-8'+[2015-05-31 17:38:22 EDT] Response header 'Content-Length': '117'+[2015-05-31 17:38:22 EDT] Response header 'Vary': 'Origin'+[2015-05-31 17:38:22 EDT] Response header 'Date': 'Sun, 31 May 2015 21:38:22 GMT'+[2015-05-31 17:38:22 EDT] Response header 'Server': 'UploadServer ("Built on May 21 2015 09:31:47 (1432225907)")'+[2015-05-31 17:38:22 EDT] Response header 'Alternate-Protocol': '80:quic,p=0'+[2015-05-31 17:38:22 EDT] Response metadata: S3: request ID=<none>, x-amz-id-2=<none>+git-annex: S3Error {s3StatusCode = Status {statusCode = 400, statusMessage = "Bad Request"}, s3ErrorCode = "InvalidArgument", s3ErrorMessage = "Invalid argument.", s3ErrorResource = Nothing, s3ErrorHostId = Nothing, s3ErrorAccessKeyId = Nothing, s3ErrorStringToSign = Nothing}+"""]]++> [[done]], see comments --[[Joey]]
+ doc/bugs/__34__old__34___and___34__new__34___hash_formats_are_mixed_up.mdwn view
@@ -0,0 +1,31 @@+~~~~+$ git annex version+git-annex version: 5.20140818-g10bf03a+~~~~++When repository was initially created, it used "old" hashing from http://git-annex.branchable.com/internals/hashing/ . After some operations, annex was upgraded to "new" format. However, symlinks are still in "old" format and dangling. "git annex fsck", "git annex repair", "git annex pre-commit" - none helps.++~~~~+$ ls -l pics+lrwxrwxrwx 1 pfalcon pfalcon 199 Jan 22 2012 IMG_3776.JPG -> ../.git/annex/objects/KM/j6/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG+lrwxrwxrwx 1 pfalcon pfalcon 199 Jan 22 2012 renamed2.jpg -> ../.git/annex/objects/7F/z3/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG+lrwxrwxrwx 1 pfalcon pfalcon 199 Jan 22 2012 renamed.jpg -> ../.git/annex/objects/W1/vK/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG++$ find .git/annex/objects/+.git/annex/objects/+.git/annex/objects/219+.git/annex/objects/219/741+.git/annex/objects/219/741/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG+.git/annex/objects/219/741/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG/SHA256E-s585398--005fe0534d6cc17a3536c1817b091d00249834c338f289ec6569e9f262889251.JPG+.git/annex/objects/7a6+.git/annex/objects/7a6/632+.git/annex/objects/7a6/632/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG+.git/annex/objects/7a6/632/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG/SHA256E-s688630--5bc2e8beb7a57f6fbcd7d9321cd5283f04448ea475099dac07ae38f002208040.JPG+.git/annex/objects/df3+.git/annex/objects/df3/9a8+.git/annex/objects/df3/9a8/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG+.git/annex/objects/df3/9a8/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG/SHA256E-s676047--3cd28892ee54aba13e074f230709b2c3b87915ff36efd9be3ddfc603e92ecdda.JPG+~~~~++> Unforunately, I cannot see through the attitude problem to a clear bug+> report. Lacking time/energy to try to coax one out. [[done]] --[[Joey]]
+ doc/bugs/__39__git_annex_get__39___returns_success_when_file_not_found.mdwn view
@@ -0,0 +1,30 @@+### Please describe the problem.+When attempting to 'git annex get' a file that does not exist in the git repository, git-annex correctly reports "not found". But it still returns exit code 0, incorrectly indicating success. This is problematic for scripting.++### What steps will reproduce the problem?+See transcript++### What version of git-annex are you using? On what operating system?+git-annex 5.20140517.4 as supplied by 'git-annex' aptitude package on Ubuntu 12.04.4 LTS (32-bit) ++### Please provide any additional information below.++[[!format sh """++henry@commsbox:~/work/tmp$ git init test+Initialized empty Git repository in /home/henry/work/tmp/test/.git/+henry@commsbox:~/work/tmp$ cd test+henry@commsbox:~/work/tmp/test$ git annex init+init ok+(Recording state in git...)+henry@commsbox:~/work/tmp/test$ git annex get nonexistent.file+git-annex: nonexistent.file not found+henry@commsbox:~/work/tmp/test$ echo $?+0+++"""]]++> Ok, I can find no reason why it was implemented as a warning in +> 5f3661238de9f31e6fed0be74fca9d5f1659278c in the bug report associated+> with that commit. So, promoted to error. [[done]] --[[Joey]]
+ doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn view
@@ -0,0 +1,95 @@+### Please describe the problem.++Building a recent git-annex with cabal with the `minimal build'+options given in the installation instructions fails. It is probably+just a matter of fixing the dependencies in the cabal file.++### What steps will reproduce the problem?+Compile with:++cabal install git-annex-5.20140108 --bindir=$HOME/bin -f"-assistant -webapp -webdav -pairing -xmpp -dns"++### What version of git-annex are you using? On what operating system?+Linux 2.6.32-5-686 i686 GNU/Linux+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+Resolving dependencies...+[ 1 of 27] Compiling Utility.PartialPrelude ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/PartialPrelude.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/PartialPrelude.o )+[ 2 of 27] Compiling Utility.FileSystemEncoding ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/FileSystemEncoding.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/FileSystemEncoding.o )+[ 3 of 27] Compiling Utility.Applicative ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Applicative.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Applicative.o )+[ 4 of 27] Compiling Utility.Data ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Data.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Data.o )+[ 5 of 27] Compiling Utility.Exception ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Exception.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Exception.o )+[ 6 of 27] Compiling Utility.Tmp ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Tmp.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Tmp.o )+[ 7 of 27] Compiling Utility.Env ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Env.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Env.o )+[ 8 of 27] Compiling Utility.UserInfo ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/UserInfo.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/UserInfo.o )+[ 9 of 27] Compiling Utility.OSX ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/OSX.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/OSX.o )+[10 of 27] Compiling Utility.Monad ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Monad.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Monad.o )+[11 of 27] Compiling Utility.Misc ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Misc.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Misc.o )+[12 of 27] Compiling Utility.Process ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Process.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Process.o )+[13 of 27] Compiling Utility.Path ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Path.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Path.o )+[14 of 27] Compiling Utility.FreeDesktop ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/FreeDesktop.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/FreeDesktop.o )+[15 of 27] Compiling Assistant.Install.AutoStart ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Assistant/Install/AutoStart.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Assistant/Install/AutoStart.o )+[16 of 27] Compiling Utility.SafeCommand ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/SafeCommand.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/SafeCommand.o )+[17 of 27] Compiling Utility.ExternalSHA ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/ExternalSHA.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/ExternalSHA.o )+[18 of 27] Compiling Utility.Directory ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Directory.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Directory.o )+[19 of 27] Compiling Common ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Common.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Common.o )+[20 of 27] Compiling Git.Version ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Git/Version.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Git/Version.o )+[21 of 27] Compiling Config.Files ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Config/Files.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Config/Files.o )+[22 of 27] Compiling Assistant.Install.Menu ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Assistant/Install/Menu.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Assistant/Install/Menu.o )+[23 of 27] Compiling Build.TestConfig ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/TestConfig.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/TestConfig.o )+[24 of 27] Compiling Build.Version ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/Version.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/Version.o )+[25 of 27] Compiling Build.Configure ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/Configure.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/Configure.o )+[26 of 27] Compiling Build.DesktopFile ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/DesktopFile.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/DesktopFile.o )+[27 of 27] Compiling Main ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Setup.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Main.o )+Linking /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/setup ...+ checking version...fatal: Not a git repository (or any of the parent directories): .git+ 5.20140107+ checking UPGRADE_LOCATION... not available+ checking git... yes+ checking git version... 1.7.2.5+ checking cp -a... yes+ checking cp -p... yes+ checking cp --reflink=auto... yes+ checking xargs -0... yes+ checking rsync... yes+ checking curl... no+ checking wget... yes+ checking bup... no+ checking quvi... no+ checking newquvi... no+ checking nice... yes+ checking ionice... yes+ checking nocache... no+ checking gpg... gpg+ checking lsof... lsof+ checking git-remote-gcrypt... not available+ checking ssh connection caching... no+ checking sha1... sha1sum+ checking sha256... sha256sum+ checking sha512... sha512sum+ checking sha224... sha224sum+ checking sha384... sha384sum+Configuring git-annex-5.20140108...+Building git-annex-5.20140108...+Preprocessing executable 'git-annex' for git-annex-5.20140108...++Remote/External.hs:29:8:+ Could not find module `Control.Concurrent.STM'+ It is a member of the hidden package `stm-2.4.2'.+ Perhaps you need to add `stm' to the build-depends in your .cabal file.+ Use -v to see a list of the files searched for.+Failed to install git-annex-5.20140108+cabal: Error: some packages failed to install:+git-annex-5.20140108 failed during the building phase. The exception was:+ExitFailure 1+++# End of transcript or log.+"""]]++> [[fixed|done]] --[[Joey]]
+ doc/bugs/annex_add_doesn__39__t_any_longer_by_default_commit_git-annex.mdwn view
@@ -0,0 +1,43 @@+### Please describe the problem.++I thought it was just my failing memory but then our tests started to fail (e.g. https://travis-ci.org/datalad/datalad/builds/69776125#L810): previously (e.g. with 5.20150409+git126-ga29f683-1~ndall+1) git annex add (without -c alwayscommit=False) would commit git-annex branch with information about that file right away, but currently (e.g. with 5.20150610+gitg608172f-1~ndall+1) it doesn't happen any longer. I glanced through the logs but didn't find explicit doc on change of behavior so decided to check if that is intended change?++### What version of git-annex are you using? On what operating system?++5.20150610+gitg608172f-1~ndall+1+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+hopa:/tmp/XX+$> git init+Initialized empty Git repository in /tmp/XX/.git/+2 14055.....................................:Mon 06 Jul 2015 06:12:41 PM EDT:.+(git)hopa:/tmp/XX[master]+$> git annex init+init ok+(recording state in git...)+2 14056.....................................:Mon 06 Jul 2015 06:12:43 PM EDT:.+(git)hopa:/tmp/XX[master]+$> echo 21234 > 2+2 14057.....................................:Mon 06 Jul 2015 06:12:45 PM EDT:.+(git)hopa:/tmp/XX[master]+$> git annex add 2+add 2 ok+(recording state in git...)+2 14058.....................................:Mon 06 Jul 2015 06:12:48 PM EDT:.+(git)hopa:/tmp/XX[master]+$> git annex log +fatal: unrecognized argument: -raw++++# End of transcript or log.+"""]]++> `git annex log`, was broken in the last release, and has since been+> fixed (in git). The git-annex branxh is still being committed, as you can+> see with `git log`. [[done]] --[[Joey]]
+ doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment view
@@ -0,0 +1,27 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY"+ nickname="Yaroslav"+ subject="git annex fix starts fixing but then spits bulk of errors"+ date="2014-01-18T05:42:15Z"+ content="""+probably related:++```+fix books/Мои первые книжки/PDF/Благинина Е.А. - Лодочки (Мои первые книжки) - 1962.pdf ok+fix books/Мои первые книжки/PDF/Благинина Е.А. - Не мешайте мне трудиться (Мои первые книжки) - 1975.pdf fatal: This operation must be run in a work tree+ok+(Recording state in git...)++git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/yoh/annex/.git\",\"add\",\"--force\",\"--\"] exited 123)+fatal: This operation must be run in a work tree+failed+(Recording state in git...)++git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/yoh/annex/.git\",\"add\",\"--force\",\"--\"] exited 123)+fatal: This operation must be run in a work tree+failed+(Recording state in git...)++....+```+"""]]
+ doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment view
@@ -0,0 +1,32 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY"+ nickname="Yaroslav"+ subject="repair seems to be also confused"+ date="2014-01-18T05:47:02Z"+ content="""+[[[+$> git annex repair +Running git fsck ...+No problems found.+fatal: '/home/yoh/annex/.git' is outside repository+Had to delete the .git/annex/index file as it was corrupt.+No data was lost.+ok++$> ls+2enjoy/ 2read/ 2watch/ books/ hardware/ videos/+2listen/ 2review/ abooks/ docs/ pics/++$> git annex repair+Running git fsck ...+No problems found.+fatal: '/home/yoh/annex/.git' is outside repository+Had to delete the .git/annex/index file as it was corrupt.+No data was lost.+ok++$> git annex get 2read/ISNN2010__Tang.pdf+git-annex: Cannot mix --all or --unused with file names.++]]]+"""]]
+ doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY"+ nickname="Yaroslav"+ subject="could it be part/reason of the problem"+ date="2014-01-18T06:05:50Z"+ content="""+not sure how that happened... definitely not me consciously! ;-) some commands are complaining that \"You cannot run this command in a bare repository\" which I thought is BS since it is not BARE! but then looked into .git/config and it does have core.bare = True ... yikes!.. ++This repository is also under assistant \"control\".++changing to bare=False seems to start 'get'ing things, git annex repair doesn't produce obscure errors.++git annex fix though now doesn't report any problems -- only 'ok', but none of those files mentioned 'ok' has a working symlink,,, but I guess that is a fluke after many upgrades -- just dropping everything locally and getting needed context after purging .git/annex/objects .++So I guess issue is resolved by discovering that repository was set to 'bare' mode somehow although it was not and seemed like working but not quite+"""]]
+ doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.43"+ subject="comment 4"+ date="2014-01-18T15:42:59Z"+ content="""+git-annex sets core.bare=true for direct mode, but it also then sets annex.direct=true and so does not treat it as a bare mode repository. If you had eg, manually tried to change annex.direct to false, and left it in bare mode, that would explain everything.++> git annex fix though now doesn't report any problems -- only 'ok', but none of those files mentioned 'ok' has a working symlink++That is completely normal behavior; git annex fix does not care if the content is locally present or not; it just checks that the symlinks would point to it if it were present.++(Fixed the partial function in dropunused.)+"""]]
+ doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn view
@@ -0,0 +1,29 @@+### Please describe the problem.++This is a one-off thing, not a reproducible bug. It was just so weird that I wanted to make a note of it in case somebody else had the same problem and it was reproducible.++I have a remote on the a USB drive which I mount once in a while on /Volumes/TOSHIBAEXT which has a remote on /Volumes/TOSHIBAEXT/annex. It's a remote which I created by hand using "git clone" a long time ago, not something the assistant set up for me.++Anyway, today the assistant kept reporting that it could not sync to it. I didn't know why, because I checked in my Finder sidebar and it showed a mounted drive called TOSHIBAEXT. It's only when I checked with the command line that I noticed something was up! There was now an ordinary directory at /Volumes/TOSHIBAEXT/annex. This had apparently been created at some point when the drive was unmounted, so when it re-mounted, because there was a directory in the way, it re-mounted at "/Volumes/TOSHIBAEXT 1". But it was displayed in the finder sidebar as just "TOSHIBAEXT" anyway because the finder hides this workaround from the user for whatever reason.++Presumably git-annex assistant at some point, for some reason, created an ordinary directory where it expected to find the annex.++I wonder if this may have to do with the fact that this is a non-bare, created-by-hand repo, from before I was using the assistant, not a normal bare remote that the assistant would have created for me if I'd been using the webapp.++### What steps will reproduce the problem?++I've only seen it once, and report the bug not as an outstanding issue but only as a heads-up that this has ever happened.++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130501-gb61740e++OS X lion (10.7)++### Please provide any additional information below.++I wasn't logging when this happened.++Again, just a heads-up; I'll keep my eye open for this happening again and post more info if it does.++[[!tag confirmed]]
+ doc/bugs/detox___34__destroys__34___annex.mdwn view
@@ -0,0 +1,34 @@+### Please describe the problem.++I accidentally (entirely my fault!) ran detox (batch file renamer to eliminate spaces etc.) on a git-annex dir.+Alas detox substitutes every "--" with "-", thus "destroying" the annex.+Of course the objects are still there, just renamed so that the symlinks become broken.++I solved it by copying the objects back from my backup (I have many rsynced backups) since I was too lazy to write a script to rename all the files...++A good solution would be to provide a general script (or there is one already?) to try to recover situations like this one, maybe using shatag to identify data objects.++### What steps will reproduce the problem?++Just run detox -vr (verbose, recursive) on an annex++### What version of git-annex are you using? On what operating system?++5.20150819+g++Linux++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)+++I currently have about a dozen annexes, local and remote (nfs, git), no other big problem apart from lack of speed when syncing
+ doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn view
@@ -0,0 +1,14 @@+Direct mode merge handles the case where there's a conflict between local and remote files, that are checked into git.++However, the the local file (or directory, or symlink, whatever)+is not checked into git, the merge will overwrite it with the remote file from git.++> That's fixed; now this is detected and the local variant+> is renamed with ".variant-local", and possibly a number to make it+> unique.++New problem: If the merge pulls in a directory, and a file exists with+the name of the directory, locally, not annexed, the file is left alone,+but the directory is thus not checked out, and will be deleted on commit.++> [[fixed|done]]; regression test in place. --[[Joey]]
+ doc/bugs/git-annex-shell/comment_1_3d2c3827de34509c0a5595eda07dd18f._comment view
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 1"""+ date="2015-04-09T17:48:20Z"+ content="""+GIT_SSH is set to the full path of the binary, unless+~/.config/git-annex/program overrides it.++Finding the full path to the binary is not a trivial or error-free+operation.++Could you please follow up to this bug or close it?+"""]]
+ doc/bugs/git_annex_info_is_reporting_file_as_not_annexed_in_direct_mode.mdwn view
@@ -0,0 +1,38 @@+### Please describe the problem.++I was thinking to answer Emanuele's question in forum (http://git-annex.branchable.com/forum/test_whether_a_file_is_already_annexed/) but realized that 'info' is not the way :-/ (whereis could be used I guess)++### What version of git-annex are you using? On what operating system?++5.20150826+gitg87972f5-1~ndall+1++### Please provide any additional information below.++[[!format sh """++$> git annex indirect +commit ok+indirect 1.dat ok+indirect ok+ok++$> git annex info 1.dat+file: 1.dat+size: 4 bytes+key: SHA256E-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b.dat++$> git annex direct +commit +On branch master+nothing to commit, working directory clean+ok+direct 1.dat ok+direct ok++$> git annex info 1.dat+git-annex: 1.dat is not a directory or an annexed file or a remote or a uuid+++"""]]++> [[fixed|done]] --[[Joey]]
+ doc/bugs/git_annex_sync_--content_may_copy_then_drop_a_file_to_a_remote.mdwn view
@@ -0,0 +1,35 @@+### Please describe the problem.++When using `git annex sync --content` with two archive with different cost, git annex will upload my file to the first archive, then to the second one, then it will drop it from the first one.++### What steps will reproduce the problem?++I've set both remote to "trusted", both in the "archive" group, both with "standard" preferred content, the remote named "hubic2" as an annex-cost of 200.0, and the remote named "hubic3" as an annex-cost of 175.0++### What version of git-annex are you using? On what operating system?+I'm using git-annex 5.20141125 on Debian Sid (upgraded today on November 7 2014).++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++$ git annex list | head+here+|hubic2+||hubic3+|||+X__ Avatars/archer.jpg+$ git annex sync --content+commit ok+copy Avatars/archer.jpg copy Avatars/archer.jpg (to hubic3...)+ok+copy Avatars/archer.jpg copy Avatars/archer.jpg (to hubic2...)+ok+drop hubic3 Avatars/archer.jpg ok++# End of transcript or log.+"""]]++> [[fixed|done]] --[[Joey]]
+ doc/bugs/hPutChar_error_message_with_UTF-8_chars_above_7F_in_filenames.mdwn view
@@ -0,0 +1,80 @@+### Please describe the problem.++When using `--incremental` together with `git annex fsck`, the error +message "hPutChar: invalid argument (invalid character)" appears in the +"Only X of Y trustworthy copies exist" message when the filename +contains an UTF-8 character above U+007F. The only locale in which this +doesn't happen is "C.UTF-8".++### What steps will reproduce the problem?++- Create and add a file with an UTF-8 character in the file name above U+007F to git-annex+- Set `numcopies` high enough so `git annex fsck` will produce a warning about missing copies+- Execute `git annex fsck --incremental`++I've created two test scripts on +<https://gist.github.com/sunny256/ebf4d055f5500b257ed8> that demonstrate +this error:++- `git clone https://gist.github.com/ebf4d055f5500b257ed8.git`+- `cd ebf4d055f5500b257ed8`+- `./runme`++You can specify a locale to `runme` as `$1` to experiment with different +locales.++There's also a `test-all-locales` script that executes `./runme` with +all defined locales on the computer. Both scripts return 1 if the error +message appears, if it's gone, 0 is returned.++### What version of git-annex are you using? On what operating system?++Newest git-annex amd64 (5.20150812) from `downloads.kitenet.net`.++### Please provide any additional information below.++The `runme` script contains more information about this issue.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++Here are two excerpts of the test output using the "C" and +"C.UTF-8" locale:++$ ./runme C+[snip]+================== git annex --incremental fsck ==================+fsck U00D8_Ø.txt (checksum...)++ Only 1 of 2 trustworthy copies exist of U00D8_+git-annex: <stderr>: hPutChar: invalid argument (invalid character)+failed+fsck ascii_only.txt (checksum...)++ Only 1 of 2 trustworthy copies exist of ascii_only.txt+ Back it up with git-annex copy.+failed+(recording state in git...)+git-annex: fsck: 2 failed++$ ./runme C.UTF-8+[snip]+================== git annex --incremental fsck ==================+fsck U00D8_Ø.txt (checksum...)++ Only 1 of 2 trustworthy copies exist of U00D8_Ø.txt+ Back it up with git-annex copy.+failed+fsck ascii_only.txt (checksum...)++ Only 1 of 2 trustworthy copies exist of ascii_only.txt+ Back it up with git-annex copy.+failed+(recording state in git...)+git-annex: fsck: 2 failed++# End of transcript or log.+"""]]++> [[fixed|done]] --[[Joey]]
+ doc/bugs/local_pair_fails_if_non-ascii_characters_present_on_annex_path.mdwn view
@@ -0,0 +1,18 @@+### Please describe the problem.++When the annex directory has a non-ascii character (like a tilde) on its path, local pairing fails and a couple of instances of the following message appear on the log++"illegal control characters in pairing message; ignoring"++### What steps will reproduce the problem?++* make a new annex repo named on /home/someone/Vídeos/blah/ (notice the i with a tilde) on two computers+* try to pair them++### What version of git-annex are you using? On what operating system?++git-annex version: 5.20141016-g26b38fd on Arch Linux++git-annex version: 5.20140717 on Ubuntu 14.10++> [[done]]; see comment
+ doc/bugs/misuse_of_--git-dir_might_destroy_a_git_repository_completely.mdwn view
@@ -0,0 +1,34 @@+### Please describe the problem.+Doing a git annex command while passing a bad --git-dir can result in the .git directory being deleted. I've never experienced it with plain git, so I assume that it comes for annex.++### What steps will reproduce the problem?++[[!format sh """+$ mkdir annex_destroyed_my_git_directory+$ cd annex_destroyed_my_git_directory+$ git init+$ git annex init+$ ls -a+. .. .git+$ git --git-dir=$PWD annex find+fatal: Not a git repository: '/home/doudou/tmp/annex_destroyed_my_git_directory'+$ ls -a+. .. config+"""]]++### What version of git-annex are you using? On what operating system?+dpkg -l git-annex reports 5.20141024++I am running Debian sid.++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> [[fixed|done]] --[[Joey]]
+ doc/bugs/symlinks_to_absent_files_remain_upon_switching_to_direct_mode.mdwn view
@@ -0,0 +1,72 @@+### Please describe the problem.++in direct mode files with absent content are promised to become regular files but empty... seems to be not a case for me. page describing direct mode has comments about past problems like that but they were told to be dealt with... so I decided to file a new issue++### What steps will reproduce the problem?++switch to direct mode++### What version of git-annex are you using? On what operating system?++5.20150519-geaf72fe++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++$> git clone ~exppsy/pymvpa2-tutorialdata /tmp/pymvpa2-tutorialdata-clone +Cloning into '/tmp/pymvpa2-tutorialdata-clone'...+done.++$> cd /tmp/pymvpa2-tutorialdata-clone+debian/ freesurfer/ haxby2001/ hyperalignment_tutorial_data.hdf5.gz@ results/ suma_surfaces/++$> ls -l haxby2001/bold_mc.par hyperalignment_tutorial_data.hdf5.gz+lrwxrwxrwx 1 yoh yoh 199 May 29 15:42 haxby2001/bold_mc.par -> ../.git/annex/objects/KM/Jq/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par+lrwxrwxrwx 1 yoh yoh 208 May 29 15:42 hyperalignment_tutorial_data.hdf5.gz -> .git/annex/objects/1g/M2/SHA256E-s15769613--d4b54133f873ff043df22c6250810c1cb9a177b5eb551ca97d98d664edf8ea3f.hdf5.gz/SHA256E-s15769613--d4b54133f873ff043df22c6250810c1cb9a177b5eb551ca97d98d664edf8ea3f.hdf5.gz++$> git annex enableremote data.pymvpa.org +(merging origin/git-annex into git-annex...)+(recording state in git...)+enableremote data.pymvpa.org ok+(recording state in git...)++$> git annex get hyperalignment_tutorial_data.hdf5.gz+/tmp/pymvpa2-tutorialdata-clone/.git/annex/tm 100%[==================================================================================================>] 15.04M 11.2MB/s in 1.3s +ok+(recording state in git...)++$> ls -l haxby2001/bold_mc.par hyperalignment_tutorial_data.hdf5.gz+lrwxrwxrwx 1 yoh yoh 199 May 29 15:42 haxby2001/bold_mc.par -> ../.git/annex/objects/KM/Jq/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par+lrwxrwxrwx 1 yoh yoh 208 May 29 15:42 hyperalignment_tutorial_data.hdf5.gz -> .git/annex/objects/1g/M2/SHA256E-s15769613--d4b54133f873ff043df22c6250810c1cb9a177b5eb551ca97d98d664edf8ea3f.hdf5.gz/SHA256E-s15769613--d4b54133f873ff043df22c6250810c1cb9a177b5eb551ca97d98d664edf8ea3f.hdf5.gz++$> git annex direct+commit +On branch master+Your branch is up-to-date with 'origin/master'.+nothing to commit, working directory clean+ok+direct hyperalignment_tutorial_data.hdf5.gz ok+direct ok++$> ls -l haxby2001/bold_mc.par hyperalignment_tutorial_data.hdf5.gz+lrwxrwxrwx 1 yoh yoh 199 May 29 15:42 haxby2001/bold_mc.par -> ../.git/annex/objects/KM/Jq/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par+-rw------- 1 yoh yoh 15769613 May 8 03:42 hyperalignment_tutorial_data.hdf5.gz+2 12569.....................................:Fri 29 May 2015 03:43:08 PM EDT:.++$> git annex version+git-annex version: 5.20150519-geaf72fe+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E MD5E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 MD5 WORM URL+remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external+local repository version: 5+supported repository version: 5+upgrade supported from repository versions: 0 1 2 4+++# End of transcript or log.+"""]]++> This is behaving as it's intended to. [[done]] --[[Joey]]
+ doc/bugs/symlinks_to_absent_files_remain_upon_switching_to_direct_mode2.mdwn view
@@ -0,0 +1,90 @@+### Please describe the problem.++subject + what was described in https://git-annex.branchable.com/forum/some_symlinks_left_in_direct_mode/ some time ago I guess++### What steps will reproduce the problem?++clone git annex repo, switch immediately to direct mode and observe files being left as dangling symlinks, get some content -- they get into normal files, drop them -- broken symlinks again. I thought (and I believe that it was like that) that in direct mode -- no symlinks to .git/annex regardless of the state (present/absent).++full example /transcript is below++### What version of git-annex are you using? On what operating system?++Debian sid 5.20150710-2++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++$> git clone git://github.com/datalad/testrepo--basic--r1+Cloning into 'testrepo--basic--r1'...+remote: Counting objects: 23, done.+remote: Total 23 (delta 0), reused 0 (delta 0), pack-reused 23+Receiving objects: 100% (23/23), done.+Resolving deltas: 100% (3/3), done.+Checking connectivity... done.+2 22606.....................................:Tue 28 Jul 2015 04:11:23 PM EDT:.+hopa:/tmp+$> cd testrepo--basic--r1+INFO.txt test-annex.dat@ test.dat+2 22607.....................................:Tue 28 Jul 2015 04:11:30 PM EDT:.+(git)hopa:/tmp/testrepo--basic--r1[master]+$> ls -l+total 12+-rw------- 1 yoh yoh 53 Jul 28 16:11 INFO.txt+lrwxrwxrwx 1 yoh yoh 186 Jul 28 16:11 test-annex.dat -> .git/annex/objects/zk/71/SHA256E-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b.dat/SHA256E-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b.dat+-rw------- 1 yoh yoh 4 Jul 28 16:11 test.dat+2 22608.....................................:Tue 28 Jul 2015 04:11:31 PM EDT:.+(git)hopa:/tmp/testrepo--basic--r1[master]+$> git annex direct+(merging origin/git-annex into git-annex...)+(recording state in git...)+commit +(recording state in git...)+On branch master+Your branch is up-to-date with 'origin/master'.+nothing to commit, working directory clean+ok+direct ok+2 22609.....................................:Tue 28 Jul 2015 04:11:36 PM EDT:.+(git)hopa:/tmp/testrepo--basic--r1[master]+$> ls -l +total 12+-rw------- 1 yoh yoh 53 Jul 28 16:11 INFO.txt+lrwxrwxrwx 1 yoh yoh 186 Jul 28 16:11 test-annex.dat -> .git/annex/objects/zk/71/SHA256E-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b.dat/SHA256E-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b.dat+-rw------- 1 yoh yoh 4 Jul 28 16:11 test.dat+2 22610.....................................:Tue 28 Jul 2015 04:11:38 PM EDT:.+(git)hopa:/tmp/testrepo--basic--r1[master]+$> git annex get test-annex.dat+get test-annex.dat (from web...) +/tmp/testrepo--basic--r1/.git/annex/tmp/SHA256E-s4--1 100%[===========================================================================================================================>] 4 --.-KB/s in 0s +ok+(recording state in git...)+2 22611.....................................:Tue 28 Jul 2015 04:11:45 PM EDT:.+(git)hopa:/tmp/testrepo--basic--r1[master]+$> ls -lta+total 12+drwxrwxrwt 126 root root 4020 Jul 28 16:11 ../+drwx------ 3 yoh yoh 120 Jul 28 16:11 ./+-rw------- 1 yoh yoh 4 Jul 28 16:11 test-annex.dat+drwx------ 9 yoh yoh 300 Jul 28 16:11 .git/+-rw------- 1 yoh yoh 53 Jul 28 16:11 INFO.txt+-rw------- 1 yoh yoh 4 Jul 28 16:11 test.dat+2 22612.....................................:Tue 28 Jul 2015 04:11:49 PM EDT:.+(git)hopa:/tmp/testrepo--basic--r1[master]+$> git annex drop test-annex.dat+drop test-annex.dat (checking https://raw.githubusercontent.com/datalad/testrepo--basic--r1/master/test.dat...) ok+(recording state in git...)+2 22613.....................................:Tue 28 Jul 2015 04:11:57 PM EDT:.+(git)hopa:/tmp/testrepo--basic--r1[master]+$> ls -l +total 12+-rw------- 1 yoh yoh 53 Jul 28 16:11 INFO.txt+lrwxrwxrwx 1 yoh yoh 186 Jul 28 16:11 test-annex.dat -> .git/annex/objects/zk/71/SHA256E-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b.dat/SHA256E-s4--181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b.dat+-rw------- 1 yoh yoh 4 Jul 28 16:11 test.dat+++# End of transcript or log.+"""]]
+ doc/bugs/webapp_fails_to_connect_to_ssh_repository___40__windows__41__.mdwn view
@@ -0,0 +1,40 @@+### Please describe the problem.++I added a remote repository, and it successfully tested the ssh connection to the server. Nothing happens, however, once it comes to actually creating the remote repository (or merging with an existing one). It'll just sit there forever, never actually connecting to the server.++A quick look in process explorer shows something of what's going on: git-annex has launched ssh, and ssh is spamming subprocesses. It's launching ssh.exe which is launching git-annex.exe (yes, on the local machine.) It exits right away, but the command line is "C:\Program Files (x86)\Git\cmd\git-annex.exe" "Please type 'yes' or 'no': ". I've no idea why it's doing that though.++If I kill that parent ssh process, I get this error message in the transcript:++ Could not create directory '/home/db48x/.ssh'.++This seems a bit dubious; both my local computer and the remote computer have a ~/.ssh directory.++In order to rule out a problem with my local computer (an ancient install of Git or cygwin/msys or something, we've tried this on fresh computers which have never had git installed; we get exactly the same problem there.++### What steps will reproduce the problem?++Create or connect to a repository via SSH.++### What version of git-annex are you using? On what operating system?++Windows 7++ Version: 5.20150420-gb0ebb23+ Build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA TorrentParser++### Please provide any additional information below.++While this is going on, the log has is showing that it's executing the following command:++[[!format sh """+[2015-04-28 22:34:16 Pacific Daylight Time] chat: ssh ["-oNumberOfPasswordPrompts=1","-p","22","db48x@eambar.db48x.net","sh -c 'mkdir -p '\"'\"'annex'\"'\"'&&cd '\"'\"'annex'\"'\"'&&if [ ! -d .git ]; then if [ -x ~/.ssh/git-annex-wrapper ]; then ~/.ssh/git-annex-wrapper git init --bare --shared; else git init --bare --shared; fi && if [ -x ~/.ssh/git-annex-wrapper ]; then ~/.ssh/git-annex-wrapper git config receive.denyNonFastforwards; else git config receive.denyNonFastforwards; fi ;fi&&mkdir -p ~/.ssh&&if [ ! -e ~/.ssh/git-annex-shell ]; then (echo '\"'\"'#!/bin/sh'\"'\"';echo '\"'\"'set -e'\"'\"';echo '\"'\"'if [ \"x$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then'\"'\"';echo '\"'\"'exec git-annex-shell -c \"$SSH_ORIGINAL_COMMAND\"'\"'\"';echo '\"'\"'else'\"'\"';echo '\"'\"'exec git-annex-shell -c \"$@\"'\"'\"';echo '\"'\"'fi'\"'\"') > ~/.ssh/git-annex-shell; fi&&chmod 700 ~/.ssh/git-annex-shell&&touch ~/.ssh/authorized_keys&&chmod 600 ~/.ssh/authorized_keys&&echo '\"'\"'command=\"env GIT_ANNEX_SHELL_DIRECTORY='\"'\"'\"'\"'\"'\"'\"'\"'annex'\"'\"'\"'\"'\"'\"'\"'\"' ~/.ssh/git-annex-shell\",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDiPFdIMyYCBmc14f9cUZaG36Zw+NziqX9Z+xGl5GAYq16nORxVc+70Bj+A9cHoHLzTMBJnw7G/f7xJNGbKNgKUPKZohT8AQfg8lnyK8qpyzI2dJB3R0vPBMPxZCBm4IOpdB6ad3B6dUiyNtyMn1hza7GVhIFOsHfGG+K3PGtFgwOz/Zj+2zmcZIL/BHObFsba/yhQxbsjLYPI7mmNV9CLb1+XcR0z2okWvxu28lOrcIXDAdEhp1cjjjpBhwTH1F8/gJcJ6ENBa4JiGt/oEKb1b/pXLaMX6dRjc/gYoy7z0Hw7RD73hH+UtPj5TAeKwoNdaVXdqSsVI+3ql+O5PFTxt db48x@caradhras\n'\"'\"' >>~/.ssh/authorized_keys'"]+"""]]++> This sounds like it's all down to the newer ssh from cygwin ignoring HOME+> and trying to use /home/user which doesn't work very well outside cygwin.+>+> Since git-annex has switched to not include that ssh any longer, and+> instead use the ssh that's bundled with msysgit, I think this bug is+> closed. [[done]] Upgrading to the latest daily build should fix your+> system's ssh. Please followup if I'm wrong. --[[Joey]]
+ doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlu-fdXIt_RF9ggvg4zP0yBbtjWQwHAMS4"+ nickname="Jörn"+ subject="Mount detection"+ date="2012-09-21T09:23:34Z"+ content="""+regarding the current mount polling on OSX: why not use the NSNotificationCenter for being notified on mount events on OSX?++Details see:++1. <http://stackoverflow.com/questions/12409458/detect-when-a-volume-is-mounted-on-os-x>+2. <http://stackoverflow.com/questions/6062299/how-to-add-an-observer-to-nsnotificationcenter-in-a-c-class-using-objective-c>+3. <https://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFNotificationCenterRef/Reference/reference.html#//apple_ref/doc/uid/20001438>+"""]]
+ doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn view
@@ -0,0 +1,34 @@+It's possible for one git annex repository to configure a special remote+that it makes sense for other repositories to also be able to use. Today I+added the UI to support that; in the list of repositories, such+repositories have a "enable" link.++To enable pre-existing rsync special remotes, the webapp has to do the same+probing and ssh key setup that it does when initially creating them.+Rsync.net is also handled as a special case in that code. There was one+ugly part to this.. When a rsync remote is configured in the webapp,+it uses a mangled hostname like "git-annex-example.com-user", to+make ssh use the key it sets up. That gets stored in the `remote.log`, and so+the enabling code has to unmangle it to get back to the real hostname.++---++Based on the still-running [[prioritizing_special_remotes]] poll, a lot+of people want special remote support for their phone or mp3 player.+(As opposed to running git-annex on an Android phone, which comes later..)+It'd be easy enough to make the webapp set up a directory special remote+on such a device, but that makes consuming some types of content on the+phone difficult (mp3 players seem to handle them ok based on what people tell+me). I need to think more about some of the ideas mentioned in [[android]]+for more suitable ways of storing files.++One thing's for sure: You won't want the assistant to sync all your files+to your phone! So I also need to start coming up with partial syncing+controls. One idea is for each remote to have a configurable matcher for files+it likes to receive. That could be only mp3 files, or all files inside a+given subdirectory, or all files *not* in a given subdirectory. That means+that when the assistant detects a file has been moved, it'll need to add+(or remove) a queued transfer. Lots of other things could be matched on,+like file size, number of copies, etc. Oh look, I have a+[beautiful library I wrote earlier](http://joeyh.name/blog/entry/happy_haskell_hacker)+that I can reuse!
+ doc/devblog/day_332__concurrent_output_at_long_last.mdwn view
@@ -0,0 +1,6 @@+Got git-annex using concurrent-output today. It works beautifully.+Since the library is new, git-annex has to be explicitly configured to use+it, so it'll be a while until this is available in regular builds.++There are no progress bars yet in concurrent output mode, but that will change+soon.. Probably tomorrow.
+ doc/devblog/day_333__cylons.mdwn view
@@ -0,0 +1,5 @@+Spent my time today porting concurrent-output to Windows, fixing a+tricky problem with error handling/thread joining with git-annex -J,+and improving the concurrent state handling to support the git command+queue. Got add/addurl working in concurrent mode.+No concurrent progress bars yet.. maybe tomorrow?
+ doc/devblog/day_334__too_easy.mdwn view
@@ -0,0 +1,6 @@+Finally concurrent progress bars are working! After all the groundwork,+it was really easy to add, under a dozen lines of code.++I've found several bugs while testing commands in -Jn mode, and the rest of+today was spent fixing them. Two of them affected concurrent `git annex+add`; the worst narrowly avoided being a data loss bug.
+ doc/devblog/day_335__catching_up_with_the_bug_reports.mdwn view
@@ -0,0 +1,4 @@+Some work today on improving the standalone linux builds and the+git-annex-standalone.deb. Also, improved fscks's behavior when asked to+fsck a dead repo, and fixed some places in the assistant where configured+ssh-options were not used. Backlog is back down to 95.
+ doc/devblog/day_336__pid_locks.mdwn view
@@ -0,0 +1,27 @@+Been working today on getting git-annex to fall back from nice posix fcntl+locks to pid locks when the former are not supported. There will be an+`annex.pidlock` to control this. Mostly useful, I think for networked file+systems like NFS and Lustre. While these *do* support posix locks, I+guess it can be hard sometimes to get some big server configured+appropriately, especially when you don't admin it and just want to use+git-annex there.++Of course, the fun part about pid locks is that it can be pretty hard to+tell if one is stale or not. Especialy when using a networked filesystem,+because then the pid in question can be running on a different computer.++Even if you do figure out that a pid lock is stale, how do you then+take over a stale pid lock, without racing with anther process that+also wants to take it over? This was the truely tricky question of the+day.++I have a possibly slightly novel approach to solve that: +Put a more modern lock file someplace else (eg, /dev/shm)+and use that lock file to lock the pid lock file. Then you can tell if +a local pid lock file is stale quickly locally, and take it over safely.+Of course, if the pid is not locked by a local process, this still+has to fall back to the inevitable retry-and-timeout-and-fail.++I hope the result will work pretty well, although git-annex will not+support as fine-grained concurrency when using pid locks. Will find out+tomorrow when I run today's code! ;)
+ doc/devblog/day_337__who_needs_POSIX.mdwn view
@@ -0,0 +1,21 @@+Got the pid locks working pretty easily, as expected.++But then... Detoured into some truely insane behavior of the Lustre+filesystem. It seems that Lustre is perfectly happy to let link()+succeed even when there's a file there that it would overwrite. Rather than+overwriting the file, Lustre picks an even more crazy way to violate+POSIX.. It lets there be 2 files in a directory with the **same name**, but+different contents. Has to be seen to be believed:++ hess$ ls pidlock+ -r--r--r-- 1 hess root 70 Nov 13 15:07 pidlock+ -r--r--r-- 1 hess root 70 Nov 13 15:07 pidlock+ hess$ rm pidlock; ls pidlock+ -r--r--r-- 1 hess root 74 Nov 13 14:35 pidlock ++git-annex's pid locking code now detects this and seems to work+even on Lustre. Eep.++I'm clutching my "NO WARRANTY" disclaimer pretty hard though, if anyone+wants to use git-annex on Lustre. When POSIX is being violated this badly,+it's hard to anticipate what other strangeness might result.
+ doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://pnijjar.livejournal.com/"+ ip="99.236.22.229"+ subject="comment 1"+ date="2013-08-31T00:05:16Z"+ content="""+Do we need to update our RSS feeds? I appear to be getting your devblog posts in my old feed, but I do not know whether that will continue working.+"""]]
+ doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8"+ nickname="develop"+ subject="comment 2"+ date="2013-08-31T10:03:04Z"+ content="""+The old RSS feed will continue working.++So sit back, relax, and enjoy the show.+"""]]
+ doc/forum/A_little_help_with_headless_server_configuration.mdwn view
@@ -0,0 +1,2 @@+Attempting to setup a multiple server file share. I am really not sure how to configure and setup the headless system for sharing? Seems easy enough with the webapp and have my windows system appear to be working not sure how to get my Linux headless systems to sync up as well any help would be greatly appreciated.+
+ doc/forum/Desktop_as_transfer_repository.mdwn view
@@ -0,0 +1,33 @@+Hi,++I try to achieve this with my podcast repository:++I have three repositories all in indirect mode:++1. desktop+2. backup on usb disk at desktop+3. raspberrypi++I want to use the desktop as transfer repository. ++If I add a new url on the raspberrypi I want to sync the content via the desktop repository to the backup repository which is no directly accessible from the raspberrypi.++If I add a new url on desktop the content should be moved to raspberrypi and backup. ++So I don't want to have the content of the files on the desktop. All content should be in backup. ++If content is not in raspberrypi I want to get it from backup via desktop.++What is the best workflow to achieve this?++Currently my problem is that if I do a "git annex sync --content" the content is also copied to desktop. Maybe because the desktop repo is origin? ++- backup is in group backup+- desktop is in group transfer+- raspberrypi is in no special group++To do further experiments I need a way to see in what group a repo is, but "git annex show" has no information about this.++TIA++juh
+ doc/forum/Direct_Mode_-_Restore_file_from_Full_Backup_Repository__63__.mdwn view
@@ -0,0 +1,14 @@+Hi, I'm using the webapp and created a repository on my local computer. Then I created another remote repository (encrypted remote with gcrypt), this remote repository is selected as type "full backup". ++I've added some files to the local repository, then changed some of them and watched the sync happen. Then I deleted some files, and these also get synced to the remote.++Now, how can I recover those files from the foreign repo, using the webapp or the command line? I could not find any solution.++I tried:+git log --diff-filter=D --summary+and then+git checkout 488408bfcd58eced685d9e3ca5daf55250850f5d -- .+to recover the file listed in this remote but got the following response:+fatal: This operation must be run in a work tree++What do I miss and how does the "Restore" part work when using "full backup" remote repository?
+ doc/forum/Git_annex_status_always_showing_annexed_files_as_modified.mdwn view
@@ -0,0 +1,33 @@+Hi,++Whenever I sync files with windows, it shows the every binary file as modified. I've just cloned "fresh" repo from a linux host and ```git annex get```ed the 15-11-03 folder.+Running git annex status 15-11-03 shows++```+M ..\15-11-03/ADL Update 11-03-15.pptx+M ..\15-11-03/Gaming-Rage-Face.jpg+M ..\15-11-03/eluted-absorption-spectra.png+M ..\15-11-03/elution.png+M ..\15-11-03/prep-diagram.png+M ..\15-11-03/rc-elution-01 (2015 Nov 03).csv+M ..\15-11-03/rc-elution-02 (2015 Nov 03).csv+M ..\15-11-03/rc-elution-03 (2015 Nov 03).csv+M ..\15-11-03/rc-prep-01.h5+M ..\15-11-03/rc-test-1 (2015 Nov 03).csv+M ..\15-11-03/rc-test-2 (2015 Nov 03).csv+M ..\15-11-03/wash-absorption.png+```++Edit: I should add that this repo is untrusted. Doing sync on it just ends up pulling from remotes, not pushing anywhere:++```+λ git annex sync+commit (recording state in git...)+ok+pull origin+ok+pull github+ok+```++How would I check if this is a problem with my installation or a bug in git annex?
+ doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn view
@@ -0,0 +1,9 @@+I have a repository on my laptop with a single remote on a USB drive. Both were created without the assistant.++The remote holds all the content. My understanding is that this would be a "backup" repository, using the group definitions.++The local repository generally holds no content. When I want a file, I make sure the remote is available, and then I `git annex get` it.++This works fine in git annex, but I'm now experimenting with the assistant. As soon as I fire up the assistant, it starts downloading all of the data from the remote. I don't ever want it to automatically get any content from the remote. If it sees new content in the repository, I would like it to push that out to the remote. But never get anything from the remote, and never drop anything that is in the repository.++How can I setup this behaviour in the assistant? I have set the remote's repository group to "backup". The local repository is not in any group, since none of the groups fit my model for this repo.
+ doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment view
@@ -0,0 +1,21 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkeJKC5Sy0stmcTWyePOLEVv0G-x1yaT_w"+ nickname="Josef"+ subject="wishlist"+ date="2013-09-26T11:11:19Z"+ content="""+Posted the above yesterday before realizing that it should probably go to wishlist requests. I am sorry about that.++Basically it is a request to extend import options and perhaps make the options easier to use/understand.++Suggested Import Options:++- source directory,+- destination directory,+- deduplicate in annex ( yes, no )+- delete source files ( yes, no )+- trial run ( screen output only )++Many thanks for a great product!++"""]]
+ doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment view
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkeJKC5Sy0stmcTWyePOLEVv0G-x1yaT_w"+ nickname="Josef"+ subject="Additional Comments"+ date="2013-09-30T21:33:31Z"+ content="""+Imported several thousand files to annex and would like to add the following comments:++- it would be great to have an option to exclude hidden dot files from import,++- empty directories should be deleted when files located in the directories are deleted,++- \"git annex add\" seems to process directories and files alphabetically, unfortunately import processes files in a different order, which makes it hard to predict which files are deleted when deduplicating,++Cheers,++"""]]
+ doc/forum/Modus_operandi_for_local_full_backup.mdwn view
@@ -0,0 +1,20 @@+Hello, +I've been for several hours soaking up on git annex and I don't see how to efficiently achieve the following. Your thoughts welcome.++Let's say I have a computer with a main disk and a backup disk. I currently use rsnapshot to rsync from main to backup and take periodic snapshots. Once the backup disk is filled up I archive it and I start with a fresh one.++This is neat but for the lack of intelligent history. I'm contemplating moving to a VCS solution so changes through time can be tracked more easily.++Let's say I want to move to git-annex as a way of keeping history, maybe even across backup disks. The common part would be to rsync from main to backup and then commit. I see the following showstoppers:++1) If I put the backup repo in direct mode, past versions of files are lost since they never enter either plain git nor annex control.++2) If I put the backup repo in indirect mode, rsync destroys all soft links resulting in unnecessary copying over. It also seems to cause further breakage when a regular file appears where there was a symlink. I know no rsync option to sync through links to the target files (rsync -K only works for folders).++3) I could put the repo in direct mode, rsync, commit, put in indirect to save versions, and repeat at every backup. Seems kinda inefficient, there are hundreds of gigas in files.++4) I can't have the main disk under annex and use the back disk as a remote because the main disk contains many git repos (whose history I don't mind losing with rsync -C, or I wouldn't consider git-annex for backup at all). Also I'm not partial to populate the main disk with something only related to backup.++If rsync -K worked with files there would be no problem. I'm missing the right flag here? Or something else that can be done on the git-annex side?++Thanks in advance.
+ doc/forum/Purge_a_remote/comment_1_78b3b77f457c65d31fd8a5abf714905d._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.47"+ subject="comment 1"+ date="2013-11-05T16:17:22Z"+ content="""+In the git-annex webapp, each repository has a settings menu with \"delete repository\".+"""]]
+ doc/forum/Purge_a_remote/comment_2_dc65719157dee63b3979563ed57ee0ce._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw"+ nickname="dxtrish"+ subject="comment 2"+ date="2013-11-05T17:46:02Z"+ content="""+When I use that Delete button it seems to still have records of it+because when I delete the repo on the other end and create a new bare+one it complains about some UUID mismatch.+"""]]
+ doc/forum/Purge_a_remote/comment_3_63e0280273b816fa4b837724e102f813._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.47"+ subject="comment 3"+ date="2013-11-05T18:03:26Z"+ content="""+Hmm well, it's true that deleting a repository does not clean out any git remotes that other repositories might have configured using it, and the uuid of the old remote is cached in there. This is only a problem if you put back another repository in the same location as the old one. `git remote remove` should clean that up for you.+"""]]
+ doc/forum/Purge_a_remote/comment_4_7fad1c4798ca03a4095ac3241c279f6d._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw"+ nickname="dxtrish"+ subject="comment 4"+ date="2013-11-06T14:24:21Z"+ content="""+That is exactly what I have wanted to do a couple of times now and 'git remote remove' does not seem to remove it all either.+When I try to create a new repository in the same place it still complains about that darn UUID :)++What is working is to manually add the new UUID to .git/config+"""]]
+ doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn view
@@ -0,0 +1,11 @@+Hello Joey,++I just want to know if file transfers between three inter-connected repositories somehow gets syncronized. I have a laptop, a local file server in my home and a virtual server on the internet.++Both my laptop and my file server are configured with a full git repository and connected through pairing and xmpp. The server on the internet is configured as a rsync special remote.++I want the local file server to hold a copy of everything in my annex, the rsync remote should get everything except the folder "media" (too large to upload and not that important) and the laptop whatever I manually decide (preferred content is set to "present").++I have added some files to the repository on the local file server and transferred their content to my laptop by using "git annex get". But when I started the web interface, I saw that those files who are present on both the file server and on the laptop get uploaded to the remote server from both computers, often the same file at the same time. Previously I though the two assistants would somehow talk to each other via xmpp so that doubled effort like that would be avoided. I'm also worried about data consistency because two apparently separate processes rsync to the same remote repository at the same time.++So my question would be: Is your xmpp protocol designed to deal with situations like this and I did not set it up correctly or is what I'm trying to accomplish simply not (yet) possible?
+ doc/forum/Use_case_for_addurl.mdwn view
@@ -0,0 +1,8 @@+Hi,+++question. What is exactly the use-case for addurl. To add unique files as if they where never changing resources?++There is a --relaxed flag to enable some leniency in redownloading the file it seems. But how would one go about updating a file from the web, drop it first?+Or do I have to add pseudo queries or hashes to the URLs to keep them unique and manage any versioning that way perhaps?+
+ doc/forum/Using_the_Git-Annex_Assistant_as_a_Backup_and_Syncing_Service.mdwn view
@@ -0,0 +1,5 @@+I'm looking to use the Git-Annex Assistant to backup a single repository that is present on and synced between two computers (a home and a working computer). Ideally, each computer uses rsync.net for both of these service, while at the same time treating the cloud storage service as untrusted (so anything stored or tranferred through there is encrypted). Is it possible to do this using solely rsync.net (without the addition of some XMPP service)? According to the software, using shared encryption allows anyone with a clone of the repository to decrypt files on a remote, but the simplest way to make this clone seems to be to first clone to a removable drive, and then from the drive to the second computer (and then deleting the records of the clone to the drive). I'm unsure if by then setting up the backup at rsync.net for the second computer, whether the software will create a second backup that acts independently of the first, neglecting any syncing, or if it will recognize the backup as one of the same repository. I'm also unsure as to whether the software will even sync if the backup is recognized, or whether a tranfer repository at rsync.net is also necessary to complete the setup. Could you perhaps give me some advice on how to achieve this setup, or point me to some information that may help me along?++(If the setup is unclear, I'm essentially trying to replicate something like SpiderOak with the Git-Annex Assistant, without using an XMPP service)++[Edit: It may be easier to just use Git-Annex (no assistant), so that works too]
+ doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.1.10"+ subject="comment 1"+ date="2013-07-22T19:13:38Z"+ content="""+To build the WebApp on arm, you need a ghc that supports template haskell on arm. While I have heard persistent rumors of such a thing existing, I have yet to see it.++It's possible to build the WebApp on arm without that, but it's a complicated process, involving first building on x86 with the same versions of the haskell libraries that you have on the arm system, and then using the EvilSplicer to generate a source tree with the template haskell expanded, which can then be built on arm. This build process is not really suitable for a Debian package.+"""]]
@@ -0,0 +1,19 @@++So much time gone by after the kickstarter and now I wanted to give it a kick finally.+I set up everything on my linux desktop with no problems at all.++I configured a ssh remote with shared encryption key.++Then I tried to use this to share files with a windows Desktop. This is where problems started.++1. Since there is no jabber sync I need to exchange keys manually. But although I read and googled for hours I just found that it would be there in the git repo somewhere in plain text. I didnt find a command to actually display it on the command line.+2. I need to setup the (existing) ssh remote on windows manually, because I could not make the webapp recognize the ssh-keys from pageant. Also, unfortunately, all examples refer to s3. I didnt even find out which type I had to specify. There seems to be no comprehensive list of repository types for the cmdline and their required arguments respectively at all. The man page says "type=..." for the three-line description of shared encryption setups which appeared like a mockery to me. Since the remote does not have git metadata I also can not use git clone.+3. The docs say initremote would only be used on fresh remotes, not existing ones. But enableremote only enables remotes that are already configured. So what am I to do here?++Could someone tell me please++1. How to find the shared key+2. How to add the ssh remote properly+3. Where 1 and 2 are documented++Thank you!
+ doc/forum/big_overhead/comment_10_d5f4e353e7f711d8c38cdcc222339bca._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 10"+ date="2014-09-18T17:27:36Z"+ content="""+In the meantime, I've been looking over the Annex.Branch code. ++`stageJournal` is only ever called in code paths that commit the updated index, so those code paths cannot result in dangling objects unless git-annex is interrupted before it can commit. (This may explain some of my own repos having a few dangling refs, that were not commits; I could have ctrl-c'd git-annex.)++It's possible for a forced update of the local git-annex branch, done by eg a push from another repo, to overwrite a commit made to it. In this case, the git-annex index is merged with the branch, resulting in a new commit, and the old commit that was overwritten will indeed be dangling. However, `git annex sync` doesn't overwrite the git-annex branch; it pushes to synced/git-annex, or does a `taggedPush` to a private ref. It is the case that both those pushes are forced pushes, so can overwrite a branch ref and leave the old commit it pointed to dangling. In the case of `taggedPush`, the old commit should be a parent of the new, so it won't dangle. In the case of synced/git-annex being overwritten, the old commit could dangle, but only until whatever repo pushed it syncs again, at which time it should get incorporated as one of the parents of the new synced/git-annex it pushes. So, I don't see how long-term dangling commits could happen this way, except for in the case where a repository stops syncing/goes missing/rebases its git-annex branch (ie, git-annex forget is used). (This may explain the 2 dangling commits I found on elephant; we did delete some clones of that repository recently.)++At this point I'm not convinced that the dangling objects I found in my own repos are due to some systematic problem, the above seems like it could explain them, and the above is not a problem on the class of the one Rasmus is having. Of course, it's hard to be sure you've spotted all possible ways that a resource leak can happen, and that's what these dangling objects basically are.+"""]]
+ doc/forum/big_overhead/comment_11_cbf25217e4149f2cfad4e2bf94f2b4ca._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 11"+ date="2014-09-18T17:32:09Z"+ content="""+I knew I *had* used \"Initial commit\" somewhere ... etckeeper uses that message. And commits as root. Could an etckeeper repo have somehow gotten merged into your git-annex repo? Seems strange, and the filenames and contents don't really look like /etc to me, but it otherwise somewhat fits.+"""]]
+ doc/forum/big_overhead/comment_12_475d5af95adcfcd3a51e10f270205eb7._comment view
@@ -0,0 +1,71 @@+[[!comment format=mdwn+ username="rasmus"+ ip="146.185.23.178"+ subject="comment 12"+ date="2014-09-19T00:43:56Z"+ content="""+Hi Joey,++Thanks for giving the thread a more appropriate title and thanks for the helpful messages. ++Let me start with the easy points:+++* Looking at my log file of installed packages I have never used `etckeeper` on my system. So unless it could have entered through `annex` then I think we can rule that one out. +* According to `git log` the repos are from January 2014 where I restarted my repos. +++ commit 029a8e76ab5f66aa4390987130985550a1ccd69c+ Author: Rasmus <w530@domain.eu>+ Date: Thu Jan 23 21:06:13 2014 +0100++ created repository+++* When I start git repos I typically just use \"init\" so I don't think I did the 2012 commits. +* I checked out one of the 74mb files. When I do `file test.blob` it shows `test.blob: GPG symmetrically encrypted data (CAST5 cipher)`. But none of my normal passwords worked. Could such a gpg'ed file be from local network connections where the assistant asks for a passphrase? I'm pretty sure that my transfer repo has only been using `gcrypt` and I believe I \"restarted\" my repos because I switched to `gcrypt` repos. Also, my transfer repo is 10Gb as well which sounds big for transfer repo. ++I performed a similar \"analysis\" on the `conf.annex` repo which should contain mostly no binary files (some 16x16 pngs etc). ++`conf.annex` has 727 unreachable objects and 3477 commits in total. Of these 338 are commits. Here's an example of a larger commit message of an unreachable commit.++ commit 601c10f9512e8d3502d9dd52ef409560ebb5b7e0+ Author: root <root@localhost>+ Date: Mon Dec 31 19:00:01 2012 -0400++ Initial commit++ diff --git a/6fbbea493cdec9d912d256374199cc4c012022d35524c8789a7aceeb953442a5 b/6fbbea493cdec9d912d256374199cc4c012022d35524c8789a7aceeb953442a5+ new file mode 100644+ index 0000000..ea5fcc3+ Binary files /dev/null and b/6fbbea493cdec9d912d256374199cc4c012022d35524c8789a7aceeb953442a5 differ+ diff --git a/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a b/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a+ new file mode 100644+ index 0000000..a86c1a9+ Binary files /dev/null and b/91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a differ+ diff --git a/9da3fcfc1635c674012c35d90c21adce3c35440e629d64fe117fe349a6b3e194 b/9da3fcfc1635c674012c35d90c21adce3c35440e629d64fe117fe349a6b3e194+ new file mode 100644+ index 0000000..ef1d71c+ Binary files /dev/null and b/9da3fcfc1635c674012c35d90c21adce3c35440e629d64fe117fe349a6b3e194 differ+ diff --git a/ad4ae79c29b3756f7e41257db7454f3c319112d06385a8bc12d28209a82f2594 b/ad4ae79c29b3756f7e41257db7454f3c319112d06385a8bc12d28209a82f2594+ new file mode 100644+ index 0000000..61d3e5b+ Binary files /dev/null and b/ad4ae79c29b3756f7e41257db7454f3c319112d06385a8bc12d28209a82f2594 differ+ diff --git a/bd0e9cb492077e0c090bc62892c8de438c51a956c8215b2c68de7caa7e2431cc b/bd0e9cb492077e0c090bc62892c8de438c51a956c8215b2c68de7caa7e2431cc+ new file mode 100644+ index 0000000..92e9bd7+ Binary files /dev/null and b/bd0e9cb492077e0c090bc62892c8de438c51a956c8215b2c68de7caa7e2431cc differ++Across all commits 6006 objects are mentioned, but only 371 are unique. ++I checked out one blob and again `file` reports `GPG symmetrically encrypted data (CAST5 cipher)`. Interesting for `conf.annex` I get this line when trying to decrypt++ gpg: DBG: cleared passphrase cached with ID: SBF83A0F822D0F664+++For `doc.annex` I get++ gpg: DBG: cleared passphrase cached with ID: S32DEAD1E8DD06A4D++And on my other computer I see a third ID. I'm not sure if this means anything when files are symmetrically encrypted, though. +"""]]
+ doc/forum/big_overhead/comment_13_1c8cc992f04fc63179094c494bd25025._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="I know what it is now"+ date="2014-09-19T02:43:22Z"+ content="""+These objects are the ones written by git-remote-gcrypt when pushing to a remote. That's why the weird dates, root pseudo-commit, crazy filenames, and big gpg encrypted blobs. All countermeasures that git-remote-gcrypt uses to keep your encrypted git remote safe and not leak information about what's in it.++So, this is a bug in git-remote-gcrypt. It needs to clean these objects up after pushing them! (Also after failed pushes.)+"""]]
+ doc/forum/big_overhead/comment_14_cbfb3d557915258e72c65a4e84df77a9._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 14"+ date="2014-09-19T02:59:36Z"+ content="""+<https://github.com/bluss/git-remote-gcrypt/issues/16>+"""]]
+ doc/forum/big_overhead/comment_15_b973529bae549bcbaaae792f0403989b._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="rasmus"+ ip="217.130.110.20"+ subject="comment 15"+ date="2014-09-19T06:29:58Z"+ content="""+Brilliant! Thanks for taking time to analyze the issue and taking the bug to `gcrypt`.++[I'm surprised that a different key than my git-annex key is used and that it's a symmetric key, but I will explore the technology on my own].+"""]]
+ doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn view
@@ -0,0 +1,15 @@+I keep a repo synced between machines over ssh. Assuming all the files are in sync, so no actual file transfer needs to takes place, when I do++```+git annex copy --fast --quiet --to blah+```++is quite slow, about 10 seconds, using 100% CPU on one core, just to decide nothing needs to be done. On the other hand, doing++```+ git annex copy --fast --quiet --from blah+```++takes about 1 second.++I'm confused, as it seems to me that, since I'm using --fast, both transactions should use only locally available data, and both should need about the same amount of computing. Am I missing something? Can this be fixed?
+ doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn view
@@ -0,0 +1,6 @@+I propose to add some functionality to git-annex, to automatically "throttle" the data retrieval from amazon glacier to stay within the daily free retrieval allowance. If someone would need to get his/her files faster, there should be an option to disable this throttling (or even better, specify the retrieval rate).++As far as I understand glacier, this could be implemented using range retrievals. In short range retrievals enable you, to only retrieve a part of an archive in glacier. This can be used to only retrieve / request so much data, that you stay within the free retrieval allowance. ( please see [Q: Why would I retrieve only a range of an archive?](http://aws.amazon.com/glacier/faqs/#Why_would_I_retrieve_only_a_range_of_an_archive) ).+++This would be somewhat similar to the [smart retrieval feature in cloudberry](http://blog.cloudberrylab.com/2012/12/introducing-smart-restore-for-amazon.html) .
+ doc/forum/how_to_prevent_accidentally_running___96__git_add__96____63__.mdwn view
@@ -0,0 +1,5 @@+I fear that while using git annex I will at some point accidentally `git add` some small files and not notice it until the only way to fix the problem is to rewrite history. What would be the best way to prevent myself from ever `git add`-ing a file into my annex repository instead of `git annex add`-ing it?++And secondly, how can I best search in my git annex repository whether I already did this mistake in the past or not? Currently I'm using this which returns everything that's not a symlink or a git submodule:++ git ls-files -s | awk ' $1 != 120000 && $1 != 160000 { print $4 }'
+ doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn view
@@ -0,0 +1,3 @@+A couple times working in an annex manually, I accidentally did "git add" instead of "git annex add" and ended up with files checked into my repo instead of symlinks. So now there is some file content in git, rather than in the annex. Is there any way to root that out, or is it there forever? (My limited knowledge of git says: it's there forever, unless maybe you go into the branches where it lives, do an interactive rebase to the time before it was added, remove that commit, replay history, and then garbage collect, but I have no idea if that would suddenly break git annex, and it sounds painful anyway.)++If say I were a neat freak and wanted to just start over with a clean annex, I imagine the thing to do would be to just start the hell over -- and if I wanted to do that, the way to go would be to get into a full repository, do a "git annex uninit" and then throw away the .git directory, then do "git init" and "git annex init" and then "git annex add ." ?
+ doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn view
@@ -0,0 +1,2 @@+Is that really unsafe? Because I did that and the switch to direct mode seemed to leave a lot of files still as links, and when I panicked and switched back to indirect mode, a whole lot of stuff seemed to have become unannexed and I reannexed it.+
+ doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up.mdwn view
@@ -0,0 +1,27 @@+I am running git-annex on Mac OS 10.9 and syncing to a Linux device that was attached to a Synology NAS. Both were running December versions of git-annex.++While working on an application in IntelliJ my workspace.xml file disappeared. It went from being a real file to being a symlink to a location that didn't exist.++The symlink looks like this: workspace.xml -> ../../../.git/annex/objects/M2/8W/SHA256E-s68106--90e9cc4f617c9034db1bf462d058b82c59ade0be58de1d3a3e2f8c02606631c2.xml/SHA256E-s68106--90e9cc4f617c9034db1bf462d058b82c59ade0be58de1d3a3e2f8c02606631c2.xml++I tried git-annex fsck and I get this message: ** No known copies exist of XXXXXXX/workspace.xml++"XXXXXXX" is a path I needed to obscure I can see it in the git-annex repo but it is a reference to a symlink that doesn't exist++It was mentioned in another thread ( http://git-annex.branchable.com/forum/git_annex_on_osx_only_creating_symlinks__63____63__/ ) that this could happen if I did a forced drop but I do not use git-annex on the command line. I'm using the assistant and having it manage all of my files for me.++I tried looking at the log for it and it shows this:++<pre>+timmattison$ /Applications/git-annex.app/Contents/MacOS/git-annex log XXXXXXX/.idea/workspace.xml +- 2014-01-03 19:49:58 XXXXXXX/.idea/workspace.xml | d6747880-b355-4d41-b4e5-d1ad3afcb4a5 -- timmattison@MacBook-Pro.local:~/Desktop/annex++ 2014-01-03 17:08:32 XXXXXXX/.idea/workspace.xml | d6747880-b355-4d41-b4e5-d1ad3afcb4a5 -- timmattison@MacBook-Pro.local:~/Desktop/annex+(Recording state in git...)+</pre>++So I can see that the git-annex thinks the file was deleted but what really happened is that IntelliJ just modified it. workspace.xml files are modified very often when working in IntelliJ.++Is this a known bug that has been fixed in the new version (2013-12-30 or later)?++Thanks,+Tim
doc/git-annex-add.mdwn view
@@ -43,6 +43,11 @@ For example: `--largerthan=1GB` +* `--jobs=N` `-JN`++ Adds multiple files in parallel. This may be faster.+ For example: `-J4` + # SEE ALSO [[git-annex]](1)
doc/git-annex-addurl.mdwn view
@@ -65,6 +65,11 @@ Use to adjust the filenames that are created by addurl. For example, `--suffix=.mp3` can be used to add an extension to the file. +* `--jobs=N` `-JN`++ Enables parallel downloads when multiple urls are being added.+ For example: `-J4` + # SEE ALSO [[git-annex]](1)
doc/git-annex-drop.mdwn view
@@ -55,6 +55,12 @@ The [[git-annex-matching-options]](1) can be used to specify files to drop. +* `--jobs=N` `-JN`++ Runs multiple drop jobs in parallel. This is particularly useful+ when git-annex has to contact remotes to check if it can drop files.+ For example: `-J4` + # SEE ALSO [[git-annex]](1)
doc/git-annex-fsck.mdwn view
@@ -85,6 +85,10 @@ The [[git-annex-matching-options]](1) can be used to specify files to fsck. +* `--jobs=N` `-JN`++ Runs multiple fsck jobs in parallel. For example: `-J4`+ # OPTIONS # SEE ALSO
doc/git-annex-import.mdwn view
@@ -66,6 +66,11 @@ git annex import /dir --include='*.png' +* `--jobs=N` `-JN`++ Imports multiple files in parallel. This may be faster.+ For example: `-J4` + # CAVEATS Note that using `--deduplicate` or `--clean-duplicates` with the WORM
doc/git-annex.mdwn view
@@ -965,6 +965,32 @@ which does not support symbolic links, or hard links, or unix permissions. This is automatically probed by "git annex init". +* `annex.pidlock`++ Normally, git-annex uses fine-grained lock files to allow multiple+ processes to run concurrently without getting in each others' way.+ That works great, unless you are using git-annex on a filesystem that+ does not support POSIX fcntl locks. This is sometimes the case when+ using NFS or Lustre filesystems. + + To support such situations, you can set annex.pidlock to true, and it+ will fall back to a single top-level pid file lock.++ Although, often, you'd really be better off fixing your networked+ filesystem configuration to support POSIX locks.. And, some networked+ filesystems are so inconsistent that one node can't reliably tell when+ the other node is holding a pid lock. Caveat emptor.++* `annex.pidlocktimeout`++ When using pid lock files, it's possible for a stale lock file to get+ left behind by previous run of git-annex that crashed or was interrupted.+ This is mostly avoided, but can occur especially when using a network+ file system.++ git-annex will wait up to this many seconds for the pid lock+ file to go away, and will then abort if it cannot continue. Default: 300+ * `remote.<name>.annex-cost` When determining which repository to
+ doc/install/OSX/MacPorts/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment view
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlDDW-g2WLLsLpcnCm4LykAquFY_nwbIrU"+ nickname="Daniel"+ subject="comment 3"+ date="2013-01-15T15:22:43Z"+ content="""+Installing via the MacPorts method. I ran into this error.++ \"_locale_charset\", referenced from: _localeEncoding in libHSbase-4.5.1.0.a(PrelIOUtils.o) + ld: symbol(s) not found for architecture x86_64++I was able to solve and get git-annex to build buy providing the --extra-lib-dirs parameter++ cabal install c2hs git-annex --bindir=$HOME/bin --extra-lib-dirs=/usr/lib++Cheers, [Daniel Wozniak](http://woz.io)+"""]]
+ doc/install/OSX/porting/comment_10_cd2120552ef894a37933b328136fa4cc._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0"+ nickname="Pere"+ subject="Segmentation Fault"+ date="2013-01-19T16:10:08Z"+ content="""+I guess my adventure ends here. :'(+"""]]
+ doc/install/OSX/porting/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmyFvkaewo432ELwtCoecUGou4v3jCP0Pc"+ nickname="Eric"+ subject="Updating to latest build"+ date="2013-01-25T06:05:35Z"+ content="""+What is the appropriate way to update to the latest build of git-annex using cabal?+"""]]
+ doc/install/OSX/porting/comment_12_a84028080578a8b60115b6c4ef823627._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0"+ nickname="Pere"+ subject="git annex on Snow Leopard"+ date="2013-01-25T14:36:52Z"+ content="""+Is there any way I can try to solve or by-pass the Segmentation Fault I commeted before? +"""]]
+ doc/install/OSX/porting/comment_13_d6f1db401858ffea23c123db49f5b296._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.3.125"+ subject="comment 13"+ date="2013-02-05T19:46:29Z"+ content="""+@eric `cabal update && cabal upgrade git-annex`+"""]]
+ doc/install/OSX/porting/comment_14_035f856923276b0edad879e196e94097._comment view
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmCmNS-oUgYfNg85-LPuxzTZJUp0sIgprM"+ nickname="Jonas"+ subject="more homebrew"+ date="2013-02-16T19:46:47Z"+ content="""+i had macports installed. then i installed brew, instaled haskell via brew. i needed to set + PATH=$HOME/bin:/usr/local/bin:$PATH+"""]]
+ doc/install/OSX/porting/comment_15_336e0acb00e84943715e69917643a69e._comment view
@@ -0,0 +1,35 @@+[[!comment format=mdwn+ username="https://launchpad.net/~wincus"+ nickname="Juan Moyano"+ subject="git annex on Snow Leopard"+ date="2013-03-26T16:02:54Z"+ content="""+I'm having the same issue as @Pere, with a newer version of DAV :(++cabal: Error: some packages failed to install:+DAV-0.3.1 failed during the building phase. The exception was:+ExitFailure 11+git-annex-4.20130323 depends on shakespeare-css-1.0.3 which failed to install.+persistent-1.1.5.1 failed during the building phase. The exception was:+ExitFailure 11+persistent-template-1.1.3.1 depends on persistent-1.1.5.1 which failed to+install.+shakespeare-css-1.0.3 failed during the building phase. The exception was:+ExitFailure 11+yesod-1.1.9.2 depends on shakespeare-css-1.0.3 which failed to install.+yesod-auth-1.1.5.3 depends on shakespeare-css-1.0.3 which failed to install.+yesod-core-1.1.8.2 depends on shakespeare-css-1.0.3 which failed to install.+yesod-default-1.1.3.2 depends on shakespeare-css-1.0.3 which failed to+install.+yesod-form-1.2.1.3 depends on shakespeare-css-1.0.3 which failed to install.+yesod-json-1.1.2.2 depends on shakespeare-css-1.0.3 which failed to install.+yesod-persistent-1.1.0.1 depends on shakespeare-css-1.0.3 which failed to+install.+yesod-static-1.1.2.2 depends on shakespeare-css-1.0.3 which failed to install.++++*Any ideas?*+++"""]]
+ doc/install/OSX/porting/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment view
@@ -0,0 +1,36 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc"+ nickname="Bret"+ subject="Snow Leopard Issues"+ date="2013-04-14T20:17:17Z"+ content="""+I was able to build snow leopard completely for the first time over last night (it took a very long time to build all the tools and dependancies). Woohoo!++The way I was able to fully build on a 32-bit 10.6 machine was this++1. Delete ~/.ghc and ~/.cabal. They were full of random things and were causing problems.+2. `brew uninstall ghc and haskell-platform`+3. `brew update`+4. `brew install git ossp-uuid md5sha1sum coreutils libgsasl gnutls libidn libgsasl pkg-config libxml2`+5. `brew upgrade git ossp-uuid md5sha1sum coreutils libgsasl gnutls libidn libgsasl pkg-config libxml2` (Some of these were already installed/up to date.+6. `brew link libxml2`+7. `brew install haskell-platform` (This takes a long, long time).+8. `cabal update` (assuming you have added `~/.cabal/bin` to your path+9. `cabal install cablal-install`+10. `cabal install c2hs`+11. `cabal install git-annex`+++It also appears to be running fairly smoothly than it had in the past on a 32-bit SL system. Thats also neat. ++The problem is that it seems to not really work as git annex though, probably due to the error relating you get when you start up the webapp:+Running+`git annex webapp` +The browser starts up, and I get 3 of these errors:+`Watcher crashed: Need at least OSX 10.7.0 for file-level FSEvents`++Pairing with a local computer appears to work to systems running 10.7, but when you complete the process, they never show up in the repository list.+++Also on a side note, when running `git annex webapp` it triggers the opening of an html file in whatever the default html file handler is. I edit a lot of html, so for me that is usually a text editor. I had to change the file handler to open html files with my web browser for the `git annex webapp` to actually work. Is there a way to change that so that `git annex webapp` uses the default web browser for the system rather than the default html file handler?+"""]]
+ doc/install/OSX/porting/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 17"+ date="2013-04-16T20:31:10Z"+ content="""+@Bret, the assistant relies on FSEvents pretty heavily. It seems to me your best bet is to upgrade OSX to a version that supports FSEvents.++You can certainly use the rest of git-annex on Snow Leopard without FSEvents.+"""]]
+ doc/install/OSX/porting/comment_18_537fad5d8854e765499d47602d1ab398._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc"+ nickname="Bret"+ subject="Can't update"+ date="2013-04-18T00:58:19Z"+ content="""+The laptop is one of the first macbook pro's with a 32 bit chip, which apple dropped support for in 10.7, so the furthest it can update to is 10.6.x. :(+"""]]
+ doc/install/OSX/porting/comment_19_18d4377f4ded5604d395d73783ba82c9._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://edheil.wordpress.com/"+ ip="99.54.57.201"+ subject="comment 19"+ date="2013-04-18T02:05:34Z"+ content="""+sounds like a prime candidate for a nice lightweight linux distro ;)+"""]]
+ doc/install/OSX/porting/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"+ nickname="Andrew"+ subject="comment 22"+ date="2013-07-25T02:19:53Z"+ content="""+Rather than specifying --bindir on the command line for cabal, I edited my ~/.cabal/config to add this line:++ symlink-bindir: /usr/local/bin++This installs the binaries to ~/.cabal/bin but symlinks them into /usr/local/bin alongside the links that homebrew installs. Additionally, I symlinked /usr/local/bin/git-annex-shell to /usr/local/bin/git-annex which made things work great from remote hosts via ssh.+"""]]
+ doc/install/OSX/porting/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment view
@@ -0,0 +1,30 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmL8pteP2jbYJUn1M3CbeLDvz2SWAA1wtg"+ nickname="Kristian"+ subject="Build failure using Haskel Platform"+ date="2013-09-15T18:49:01Z"+ content="""+I get this error when I try to build git-annex using \"cabal install git-annex\"++ [ 34 of 347] Compiling Utility.Misc ( Utility/Misc.hs, dist/build/git-annex/git-annex-tmp/Utility/Misc.o )+ [ 35 of 347] Compiling Utility.Process ( Utility/Process.hs, dist/build/git-annex/git-annex-tmp/Utility/Process.o )+ [ 36 of 347] Compiling Utility.Network ( Utility/Network.hs, dist/build/git-annex/git-annex-tmp/Utility/Network.o )+ [ 37 of 347] Compiling Utility.SRV ( Utility/SRV.hs, dist/build/git-annex/git-annex-tmp/Utility/SRV.o )+ + Utility/SRV.hs:70:54:+ Couldn't match expected type `Maybe+ [(Int, Int, Integer, B8.ByteString)]'+ with actual type `Either+ dns-1.0.0:Network.DNS.Internal.DNSError+ [(Int, Int, Int, dns-1.0.0:Network.DNS.Internal.Domain)]'+ In the third argument of `maybe', namely `r'+ In the second argument of `($)', namely+ `maybe [] (orderHosts . map tohosts) r'+ In a stmt of a 'do' block:+ return $ maybe [] (orderHosts . map tohosts) r+ Failed to install git-annex-4.20130909+ cabal: Error: some packages failed to install:+ git-annex-4.20130909 failed during the building phase. The exception was:+ ExitFailure 1++"""]]
+ doc/install/OSX/porting/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.108.128"+ subject="comment 24"+ date="2013-09-17T15:56:17Z"+ content="""+@Kristian, a new version of the DNS library has caused this. A workaround is to pass `-f-DNS` to the cabal command.++I am in the process of adding support for the new DNS library version in git now.++By the way, please [[file_a_bug|bugs]] if you have a big ugly looking build failure like that, so as to not clutter up this page.+"""]]
+ doc/install/OSX/porting/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U"+ nickname="Carlo"+ subject="comment 27"+ date="2013-10-16T09:40:23Z"+ content="""+The [FSevents framework itself has been around since leopard](http://arstechnica.com/apple/2007/10/mac-os-x-10-5/7/).++[This fsevents wrapper project](https://github.com/rastersize/CDEvents) supports snow leopard and even leopard, maybe it will provide some clues on how it was done.++I'm guessing it would be worth it, [snow leopard is still the most popular OSX as of April](http://www.patentlyapple.com/patently-apple/2013/04/snow-leopard-remains-the-most-popular-version-of-os-x.html). From my own experience, snow leopard is a huge life extender for 2+ year old hardware. Lion just makes them sluggishly painful to use.++Maybe someone could volunteer an SL machine for remote development? Sorry, mine are tied down :(+"""]]
+ doc/install/OSX/porting/comment_27_d453510b9bb62072a4c663206c12c8a4._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="64.134.31.139"+ subject="comment 27"+ date="2013-10-16T15:14:53Z"+ content="""+The git-annex assistant uses **file level** FSevents to detect which files have been changed. Would it be possible to make it work with older versions that don't provide file-level events? Probably. The code for BSD kqueue deals with similar limitations in needing to scan the directory to find the files that actually changed. If someone cares about old versions of OSX and wants to do that work I'll happily support you.+"""]]
+ doc/install/OSX/porting/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment view
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="http://alan.petitepomme.net/"+ nickname="Alan Schmitt"+ subject="dbus support?"+ date="2013-10-18T08:24:11Z"+ content="""+Hello,++I just compiled git-annex using cabal on OS X, and I see there is no dbus support:++ Assistant/Threads/NetWatcher.hs:26:0:+ warning: #warning Building without dbus support; will poll for network connection changes+ + Assistant/Threads/MountWatcher.hs:33:0:+ warning: #warning Building without dbus support; will use mtab polling++Is this problematic? I see I can install dbus using homebrew. If I do so, will I have dbus support (after recompiling git-annex)?+"""]]
+ doc/install/OSX/porting/comment_29_8622ed56c6a8034c20fb311418d94003._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U"+ nickname="Carlo"+ subject="comment 29"+ date="2013-10-18T15:58:59Z"+ content="""+I think I dragged you out of dev mode for commenting unnecessarily, sorry about that. Apparently, [Lion](http://www.redmondpie.com/os-x-lion-vs-os-x-snow-leopard-head-to-head-performance-showdown/) and [Mountain Lion are fine on older hardware](http://apple.stackexchange.com/questions/58453/will-mountain-lion-make-an-older-computer-run-faster-or-slower). For a while [a daemon cause Lion slowdowns for a day after upgrade](https://discussions.apple.com/message/15719036) for a while, which was enough to cause a reputation.+"""]]
+ doc/install/OSX/porting/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="64.134.31.139"+ subject="comment 30"+ date="2013-10-19T15:31:45Z"+ content="""+@Alan you don't need to install dbus on OSX. The polling code will work. On the other hand if you'd like to experiment with installing dbus and report back, perhaps it's worth a try. It's nice when the git-annex assistant can instantly detect when drives are plugged in, and then the network connection changes and react to it. On Linux, dbus gives it that capability.+"""]]
+ doc/install/OSX/porting/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://alan.petitepomme.net/"+ nickname="Alan Schmitt"+ subject="dbus and homebrew"+ date="2013-10-20T17:25:04Z"+ content="""+I'm trying to build git-annex with dbus support, and even though I installed dbus (through homebrew), at the end of compilation I get the warning about \"building without dbus\". Is there something special I need to do for git-annex to see I have installed dbus?++(Also, it tells me at the beginning that I don't have gcrypt, but libgcrypt is installed.)+"""]]
+ doc/install/OSX/porting/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="64.134.31.139"+ subject="comment 32"+ date="2013-10-21T22:47:14Z"+ content="""+You probably need to install libdbus dev stuff, and then the haskell dbus library. But it's certainly going to need code changes to make git-annex use dbus in any way on OSX, assuming there are even useful dbus events generated for network connections and drives being mounted on OSX.++It was saying \"gcrypt\" when it meant \"git-remote-gcrypt\".+"""]]
+ doc/install/OSX/porting/comment_33_203a36322b3c453c05c8906c64e62e06._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://alan.petitepomme.net/"+ nickname="Alan Schmitt"+ subject="comment 33"+ date="2013-10-23T11:39:51Z"+ content="""+I installed the haskell DBus library, but it's still not picking it up. Is there some additional option to pass to cabal, or is it supposed to find it automatically?+"""]]
+ doc/install/OSX/porting/comment_34_874ff01f27911baf6ef0f559d5d5f5a0._comment view
@@ -0,0 +1,27 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawn3rK4VDzxyhmrIc18z7F5OuXvEbUsgUac"+ nickname="Srinath"+ subject="build issue with brew technique on Darwin Kernel Version 13.0.0"+ date="2014-02-15T02:17:16Z"+ content="""+Following the Mac OS X brew instructions from the top of the board, I got the following error:++[5 of 5] Compiling Yesod ( Yesod.hs, dist/build/Yesod.o )+In-place registering yesod-1.2.5...+Installing library in /Users/srinathv/.cabal/lib/yesod-1.2.5/ghc-7.6.3+Registering yesod-1.2.5...+Installed yesod-1.2.5+cabal: Error: some packages failed to install:+git-annex-5.20140210 depends on libxml-sax-0.7.4 which failed to install.+libxml-sax-0.7.4 failed during the configure step. The exception was:+ExitFailure 1+network-protocol-xmpp-0.4.5 depends on libxml-sax-0.7.4 which failed to+install.+++Then I perused the comments and did:+$brew link libmxl2 --force+$cabal install git-annex --bindir=$HOME/bin++with success. +"""]]
+ doc/install/OSX/porting/comment_8_38d9c2eea1090674de2361274eab5b0e._comment view
@@ -0,0 +1,29 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaYy6kTuKAHmsa4BtGls2oqa42Jo2w2v0"+ nickname="Pere"+ subject="I couldn't install it on Snow Leopard"+ date="2013-01-19T15:04:27Z"+ content="""+Bad news, it looks like I'm not able to install git-annex to my machine: When I run++ sudo cabal install c2hs git-annex --bindir=$HOME/bin++I get the following error:++ cabal: Error: some packages failed to install:+ DAV-0.3 failed during the building phase. The exception was:+ ExitFailure 11+ git-annex-3.20130114 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-1.1.7.2 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-auth-1.1.3 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-core-1.1.7.1 failed during the building phase. The exception was:+ ExitFailure 11+ yesod-default-1.1.3 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-form-1.2.0.2 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-json-1.1.2 depends on yesod-core-1.1.7.1 which failed to install.+ yesod-persistent-1.1.0.1 depends on yesod-core-1.1.7.1 which failed to+ install.+ yesod-static-1.1.1.2 depends on yesod-core-1.1.7.1 which failed to install.++What does *ExitFailure 11* mean?+"""]]
+ doc/install/OSX/porting/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.3.194"+ subject="comment 9"+ date="2013-01-19T16:02:35Z"+ content="""+sig11 is a Segmentation Fault, probably from a C library used by DAV for HTTP in this case.+"""]]
+ doc/install/fromsource/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.246.110"+ subject="comment 10"+ date="2013-07-27T17:49:07Z"+ content="""+@Henning; see the [[OSX]] page for full installation instructions for OSX. Which include all the neccesary brew incantations.+"""]]
+ doc/install/fromsource/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment view
@@ -0,0 +1,44 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlXEIT2PEAuHuInLP4UYVzWE0lceMYd2lA"+ nickname="Gregor"+ subject="Installation on tonidoplug"+ date="2013-08-03T07:19:54Z"+ content="""+I tried various ways to install git-annex on my [TonidoPlug](http://www.tonidoplug.com/).++System Info:++ root@TonidoPlug2:~# uname -a+ Linux TonidoPlug2 2.6.31.8-topkick1281p2-001-004-20101214 #1 Thu Jun 16 10:06:20 CST 2011 armv5tel GNU/Linux++`apt-get` didn't work.++ root@TonidoPlug2:~# apt-get install git-annex+ Reading package lists... Done+ Building dependency tree + Reading state information... Done+ E: Unable to locate package git-annex++The Linux standalone installation results in an error message like this, when calling `git-annex` (or `git annex`)++ ~$ git-annex.linux/git-annex+ /home/gitolite/git-annex.linux/bin/git-annex: 1: Syntax error: \")\" unexpected++(git-annex.linux/bin/git-annex is a binary file and works fine on other distros)++When installing with cabal, I get the error message (tried as root and gitolite user)++ ~$ cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\"+ Resolving dependencies...+ cabal: cannot configure git-annex-4.20130802. It requires base >=4.5 && <4.8+ For the dependency on base >=4.5 && <4.8 there are these packages:+ base-4.5.0.0, base-4.5.1.0, base-4.6.0.0 and base-4.6.0.1. However none of+ them are available.+ base-4.5.0.0 was excluded because of the top level dependency base -any+ base-4.5.1.0 was excluded because of the top level dependency base -any+ base-4.6.0.0 was excluded because of the top level dependency base -any+ base-4.6.0.1 was excluded because of the top level dependency base -any++Any help is appreciated.+Thanks for providing git-annex. I started cleaning up my backups with it yesterday and really like it.+"""]]
+ doc/install/fromsource/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="2001:4978:f:21a::2"+ subject="comment 12"+ date="2013-08-07T16:31:30Z"+ content="""+The Linux standalone builds for i386 and amd64 will not work on Arm systems.++There are builds of git-annex for arm in eg, Debian. You should be able to use one of those if this system is running Debian. You may need to upgrade to eg, Debian stable, which includes git-annex.++It looks like you have an old and/or broken GHC compiler too. You could upgrade that to a newer version (eg from Debian stable) and build it that way, but it seems like the long way around if you have a Debian system there.+"""]]
+ doc/install/fromsource/comment_13_3dac019cda71bf99878c0a1d9382323b._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlXEIT2PEAuHuInLP4UYVzWE0lceMYd2lA"+ nickname="Gregor"+ subject="TonidoPlug"+ date="2013-08-09T17:46:28Z"+ content="""+@Joey Thanks for the answer. I didn't want to mess around too much with the TonidoPlug. I am currently setting up a raspberry pi, which works fine. +"""]]
+ doc/install/fromsource/comment_14_14b46470593f84f8c3768a91cb77bdab._comment view
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlfIVXjkzrYE9qJAO2A0H7K6tKGMaSgc3U"+ nickname="Daniel"+ subject="Problems with cryptocipher"+ date="2013-08-22T01:36:50Z"+ content="""+I had problems following these directions on recent releases of Fedora/Ubuntu. The install attempts failed on cryptocipher-0.3.1, which I think came as a dependency of Yesod.+I was able to work around this by installing yesod-platform with cabal first, then installing git-annex.+"""]]
+ doc/install/fromsource/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="77.247.181.162"+ subject="git-annex assistant on Arm"+ date="2013-08-23T03:07:11Z"+ content="""+I'd like to use the assistant's power on a Raspberry Pi to build an always-on file/sync server. Is there a way to get the assistant running on Arm? I know there's a Debian package, but it's Version 3.20120629 and comes without the assistant. Has anyone ever successfully built a recent git-annex version on Arm? What would I need in order to do it myself? +"""]]
+ doc/install/fromsource/comment_16_4faf214f97f9516898d7c17d743ef825._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.63"+ subject="comment 16"+ date="2013-08-23T17:37:52Z"+ content="""+The git-annex assistant can easily be built on arm. But not the webapp. It's entirely possible to use the assistant without the webapp though; you just have to make the git repository and configure the remotes by hand, and then the assistant will sync them the same way the webapp does.++It is possible but very involved to build the webapp for arm. I do not anticipate doing it in the Debian package until ghc gets proper template haskell support for arm. See [[forum/Webapp_on_ARM]]+"""]]
+ doc/install/fromsource/comment_17_2a9d6807a3a13815c824985521757167._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="77.247.181.162"+ subject="comment 17"+ date="2013-08-23T18:51:51Z"+ content="""+Thanks for the quick answer. I will try to build git-annex with just the assistant, as you suggest, and once it works set up the server by hand as you suggest. ++BTW: Awesome job you're doing with git-annex. I appreciate your enthusiasm.+"""]]
+ doc/install/fromsource/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="96.47.226.20"+ subject="git-annex assistant for the Raspberry Pi"+ date="2013-09-04T03:58:37Z"+ content="""+It took a while and a few tries, but I finally built the git-annex binary including the assistant on a Raspberry Pi. The build comes without the flags webapp, webdav, and dbus as these rely on a Template Haskell compiler that hasn't been ported to Arm architecture yet. ++I put the binary up on Github in case anyone's interested: <https://github.com/tradloff/git-annex-RPi>+"""]]
+ doc/install/fromsource/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment view
@@ -0,0 +1,44 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlu7K3h7Ry1uDAU_ERYGuqt0LoGNJqGuRo"+ nickname="Nathan"+ subject="Cabal installing git-annex on Ubuntu 12.04 Precise with GHC 7.6.3"+ date="2013-09-25T22:39:04Z"+ content="""+I now realize [there is a Ubuntu 12.04 Precise PPA with a current+version of+git-annex](http://git-annex.branchable.com/install/Ubuntu/), so that's+probably a better choice, but here's how I cabal isntalled git-annex.++1. Apt install non-cabal dependencies:++ sudo aptitude install c2hs libgsasl7-dev libxml2-dev++2. Manually cabal install yesod-platform to avoid the [cryptocipher problem + mentioned above](+ http://git-annex.branchable.com/install/cabal/#comment-1807da37dc144b572b76aaf4b574bb54):++ cabal install yesod-platform++3. Cabal install git-annex with DNS flag disabled:++ cabal install git-annex -f\"-dns\"++I was getting this error building git-annex before disabling the DNS flag:++ Utility/SRV.hs:70:54:+ Couldn't match expected type `Maybe+ [(Int, Int, Integer, B8.ByteString)]'+ with actual type `Either+ dns-1.0.0:Network.DNS.Internal.DNSError+ [(Int, Int, Int, dns-1.0.0:Network.DNS.Internal.Domain)]'+ In the third argument of `maybe', namely `r'+ In the second argument of `($)', namely+ `maybe [] (orderHosts . map tohosts) r'+ In a stmt of a 'do' block:+ return $ maybe [] (orderHosts . map tohosts) r++Looking at Utiltity/SRV.hs, it appears that disabling the DNS flag+just makes git annex use a different DNS library (ADNS), not+actually disable DNS lookups.++"""]]
+ doc/install/fromsource/comment_20_0f553be2a4c666e3bed58b2bce549406._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlkA6XinbeOdnEDxEGQUWyjqPGh0kdMXr4"+ nickname="Blake"+ subject="Updating git-annex via cabal"+ date="2013-10-09T21:21:22Z"+ content="""+What is the best way to update git-annex and the dependencies via cabal? Just the `$ cabal install *` commands again?+"""]]
+ doc/install/fromsource/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.4.22"+ subject="comment 21"+ date="2013-10-11T17:09:33Z"+ content="""+If you run the \"cabal update\" command followed by the \"cabal install\" command it'll upgrade git-annex.+"""]]
+ doc/install/fromsource/comment_22_2f27b78215f97ade1986ca806c634cb3._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="96.44.189.100"+ subject=""Could not find module Crypto.Hash" error when building git-annex "+ date="2013-10-21T19:55:12Z"+ content="""+Lately I get this error message when trying to build git-annex-v4.20131002:++ Utility/Hash.hs:7:8:+ Could not find module `Crypto.Hash'+ Perhaps you meant+ Crypto.HMAC (needs flag -package crypto-api-0.10.2)+ Use -v to see a list of the files searched for.++crypto-api-0.10.2 is installed as a debian dev package. All the dependencies are met. I have no idea what's going on. +"""]]
+ doc/install/fromsource/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="64.134.31.139"+ subject="comment 23"+ date="2013-10-21T22:09:05Z"+ content="""+git-annex needs cryptohash version 0.10.0 or greater. You appear to have an old version. You can cabal `configure -f-CryptoHash` if it's for some reason failing to disable the cryptohash support despite the declared dependency not being met.+"""]]
+ doc/install/fromsource/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="37.130.227.133"+ subject="comment 24"+ date="2013-10-22T17:55:32Z"+ content="""+I fixed the error by installing a newer version of cryptohash. Thanks for pointing out the culprit. +"""]]
+ doc/install/fromsource/comment_25_8a7664e6f9271718dc607a0782366c5b._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="141.138.141.208"+ subject="Bad version on Hackage"+ date="2013-10-30T18:56:25Z"+ content="""+Quick note: The latest version in the Hackage repository (git-annex-4.20131024) fails to build, due to a faulty version of Assistant/Threads/Cronner.hs. +"""]]
+ doc/install/fromsource/comment_26_bd455c732639728bce2bfc39e32871d2._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.47"+ subject="comment 26"+ date="2013-11-01T16:33:25Z"+ content="""+@RaspberryPie that only affected builds without the webapp, in any case it's fixed now.+"""]]
+ doc/install/fromsource/comment_27_c080e9239b6eec88d329c28da7bb4141._comment view
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="37.221.160.203"+ subject="comment 27"+ date="2013-11-02T12:52:18Z"+ content="""+Okay, the error doesn't show up anymore. I didn't even get to Cronner though, because this time I got a different error:++ Assistant/Alert.hs:195:20:+ Couldn't match expected type `Assistant ()' with actual type `()'+ Expected type: Maybe Remote -> Assistant ()+ Actual type: Maybe Remote -> ()+ In the expression: noop+ In an equation for `notFsckedNudge': notFsckedNudge _ = noop++This is from trying to compile 4.20131101 with `-f\"-webapp -webdav\"`+"""]]
+ doc/install/fromsource/comment_28_15951dd070a675300420eea137a28ef9._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.47"+ subject="comment 28"+ date="2013-11-02T17:40:18Z"+ content="""+Unfortunate about that. I've fixed it in git.++(It would be best to file bug reports about build failures to avoid cluttering up this page.)+"""]]
+ doc/install/fromsource/comment_29_ac082dca67f4a29b06070c0283130f52._comment view
@@ -0,0 +1,39 @@+[[!comment format=mdwn+ username="robohack"+ ip="24.67.98.78"+ subject="cabal install failing due to problems building pcre-light-0.4"+ date="2013-11-21T20:17:10Z"+ content="""+After a fresh install of Haskell, and following the instructions above, I end up with the following rather bizarre and unexpected problem:++ $ cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\"+ Resolving dependencies...+ Configuring pcre-light-0.4...+ Building pcre-light-0.4...+ Preprocessing library pcre-light-0.4...+ Base.hsc:103:18: error: pcre.h: No such file or directory+ Base.hsc: In function ‘main’:+ Base.hsc:402: error: ‘PCRE_ANCHORED’ undeclared (first use in this function)+ Base.hsc:402: error: (Each undeclared identifier is reported only once+ Base.hsc:402: error: for each function it appears in.)+ Base.hsc:405: error: ‘PCRE_AUTO_CALLOUT’ undeclared (first use in this function)++(followed by an error for every other macro that was expected to be defined in the header...)++ compiling dist/build/Text/Regex/PCRE/Light/Base_hsc_make.c failed (exit code 1)+ command was: /usr/bin/gcc -c dist/build/Text/Regex/PCRE/Light/Base_hsc_make.c -o dist/build/Text/Regex/PCRE/Light/Base_hsc_make.o -m64 -fno-stack-protector -m64 -fno-stack-protector -m64 -D__GLASGOW_HASKELL__=700 -Ddarwin_BUILD_OS -Ddarwin_HOST_OS -Dx86_64_BUILD_ARCH -Dx86_64_HOST_ARCH -I/sw/lib/ghc-7.0.4/bytestring-0.9.1.10/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/base-4.3.1.0/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/sw/lib/ghc-7.0.4/include/+ Failed to install pcre-light-0.4+ cabal: Error: some packages failed to install:+ git-annex-3.20120230 depends on pcre-light-0.4 which failed to install.+ pcre-light-0.4 failed during the building phase. The exception was:+ ExitFailure 1++This is a somewhat older Mac OS X 10.6.8 system.++I do have PCRE already installed via Fink, and pcre.h is in /sw/include. I see other -I/sw/... things in the compile command above, but obviously /sw/include is not one of them.++Any clues for me?++(Why the heck does git-annex need pcre in particular anyway??? I saw another regex library get installed earlier somewhere in this (massive) process.)++"""]]
+ doc/install/fromsource/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment view
@@ -0,0 +1,35 @@+[[!comment format=mdwn+ username="robohack"+ ip="24.67.98.78"+ subject="hmmm... ok, the PCRE problem was odd, but now this:"+ date="2013-11-21T20:30:54Z"+ content="""+The PCRE problem is solved trivially in my case with a couple more cabal install options, though the need for these seems oddly dissatisfying given the reams of other stuff that was successfully built and installed without these options.++Now however I seem to have encountered a deeper problem:++ $ cabal install git-annex --bindir=$HOME/bin --extra-include-dirs=/sw/include --extra-lib-dirs=/sw/lib + Resolving dependencies...+ [1 of 1] Compiling Main ( /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/Setup.hs, /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/dist/setup/Main.o )+ Linking /var/folders/7h/7hWHR5m8HPKOnUEvQU7HU++++TI/-Tmp-/git-annex-3.20120230-84797/git-annex-3.20120230/dist/setup/setup ...+ hsc2hs Utility/StatFS.hsc+ perl -i -pe 's/^{-# INCLUDE.*//' Utility/StatFS.hs+ ghc -O2 -Wall -ignore-package monads-fd --make configure+ + Utility/StatFS.hsc:54:8:+ Could not find module `GHC.Foreign':+ Use -v to see a list of the files searched for.+ make: *** [Build/SysConfig.hs] Error 1+ Configuring git-annex-3.20120230...+ Building git-annex-3.20120230...+ Preprocessing executable 'git-annex' for git-annex-3.20120230...+ + Git/Version.hs:11:18:+ Could not find module `Build.SysConfig':+ Use -v to see a list of the files searched for.+ Failed to install git-annex-3.20120230+ cabal: Error: some packages failed to install:+ git-annex-3.20120230 failed during the building phase. The exception was:+ ExitFailure 1++"""]]
+ doc/install/fromsource/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment view
@@ -0,0 +1,22 @@+[[!comment format=mdwn+ username="robohack"+ ip="24.67.98.78"+ subject="a different error trying to build from the git repo...."+ date="2013-11-21T21:14:54Z"+ content="""+I'm using the ghc7.0 branch because Fink's GHC is still at 7.0.4....++ $ cabal build + Building git-annex-3.20120523...+ Preprocessing executable 'git-annex' for git-annex-3.20120523...+ [ 78 of 163] Compiling Utility.Url ( Utility/Url.hs, dist/build/git-annex/git-annex-tmp/Utility/Url.o )+ + Utility/Url.hs:111:88:+ Couldn't match expected type `Maybe URI' with actual type `URI'+ In the second argument of `fromMaybe', namely+ `(newURI `relativeTo` u)'+ In the expression: fromMaybe newURI (newURI `relativeTo` u)+ In an equation for `newURI_abs':+ newURI_abs = fromMaybe newURI (newURI `relativeTo` u)++"""]]
+ doc/install/fromsource/comment_32_1d34c294486c85b1149675fa5861ae35._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.64"+ subject="comment 32"+ date="2013-11-22T16:27:36Z"+ content="""+@robohack, the ghc7.0 branch is not being maintained, and is so old I don't recommend it. To build it against current cabal you will probably need to version its dependency on network to an older version than 2.4.0. ++Also, git-annex has not depended on pcre for a long time. But you're building thoroughly old version so get to trip over every bug that's been reported for the past 2 years..+"""]]
+ doc/install/fromsource/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment view
@@ -0,0 +1,21 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc"+ nickname="Matthias"+ subject="Build failure"+ date="2014-03-20T09:10:44Z"+ content="""+I followed the instructions and the invocation of++ cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\"++resulted in the following error:++ Test.hs:107:41: Not in scope: `errMessage'+ Failed to install git-annex-5.20140306+ cabal: Error: some packages failed to install:+ git-annex-5.20140306 failed during the building phase. The exception was:+ ExitFailure 1++I used the Haskell Platform for Mac OS X (10.8)++"""]]
+ doc/install/fromsource/comment_34_38451e751add6daf479b559c4b6a7c61._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://openid.stackexchange.com/user/a05bb829-932b-49f2-85a9-00dcda8b5e20"+ nickname="Christian Pietsch"+ subject="Re: Build failure"+ date="2014-03-20T13:56:16Z"+ content="""+I get exactly the same error message as Matthias when attempting the minimal Cabal install on openSUSE 12.2 (x86_64) Linux.+"""]]
+ doc/install/fromsource/comment_35_4d44e4531e6686bd340f26836ad40026._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.102"+ subject="comment 35"+ date="2014-03-20T16:06:22Z"+ content="""+The `errMessage` build failure is due to a new version of optparse-applicative. I've added support for it in git master.+"""]]
+ doc/install/fromsource/comment_36_2a095a5af53a356bd29abd22a9cb1bea._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkNcHu5T1Pxzl-r2co9vf6SxXYWubv2P04"+ nickname="Matthew"+ subject="I did indeed get problems on Ubuntu 13.04"+ date="2014-06-25T01:01:43Z"+ content="""+The issues I had were version mismatches when resolving dependencies of git-annex.++It seems that when you install haskell-platform package with apt-get, it installs a bunch of haskell dependencies as apt packages, yet those aren't needed for any other system packages. So some people here who complain about version mismatches might not have intended to install any Haskell libraries with apt, they just come along for the ride by default.++I can't remember the exact ones, but I ended up uninstalling some of the stuff that gets auto-installed along with haskell-platform, and using cabal to build those. Then all the git-annex dependencies worked.++Why 13.04 in this day and age? Using Zentyal as a home server/gateway, and it currently runs on 13.04.++This method might not work if you installed other apt packages that _do_ need those apt-based Haskell libraries. But if git-annex is all you need that uses the Haskell platform, might work.+"""]]
+ doc/install/fromsource/comment_37_f33e1a4575dccc20b0d3d7c00e6db709._comment view
@@ -0,0 +1,69 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmveNWaFIL1zEehHr_0416bKBzsul5tGlE"+ nickname="Daniel"+ subject="Install fails horribly"+ date="2014-07-10T23:11:51Z"+ content="""+```+lyriondesktop:/home/zilti/tmp # cabal install c2hs+Resolving dependencies...+Configuring c2hs-0.17.2...+Building c2hs-0.17.2...+Preprocessing executable 'c2hs' for c2hs-0.17.2...+[ 1 of 26] Compiling Data.DLists ( src/Data/DLists.hs, dist/build/c2hs/c2hs-tmp/Data/DLists.o )+[ 2 of 26] Compiling Control.StateTrans ( src/Control/StateTrans.hs, dist/build/c2hs/c2hs-tmp/Control/StateTrans.o )++src/Control/StateTrans.hs:77:1: Warning:+ Module `Prelude' does not export `catch'+[ 3 of 26] Compiling Data.Errors ( src/Data/Errors.hs, dist/build/c2hs/c2hs-tmp/Data/Errors.o )+[ 4 of 26] Compiling Data.Attributes ( src/Data/Attributes.hs, dist/build/c2hs/c2hs-tmp/Data/Attributes.o )+[ 5 of 26] Compiling Text.Lexers ( src/Text/Lexers.hs, dist/build/c2hs/c2hs-tmp/Text/Lexers.o )+[ 6 of 26] Compiling Control.StateBase ( src/Control/StateBase.hs, dist/build/c2hs/c2hs-tmp/Control/StateBase.o )+[ 7 of 26] Compiling Data.NameSpaces ( src/Data/NameSpaces.hs, dist/build/c2hs/c2hs-tmp/Data/NameSpaces.o )+[ 8 of 26] Compiling C2HS.C.Attrs ( src/C2HS/C/Attrs.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Attrs.o )+[ 9 of 26] Compiling C2HS.C.Builtin ( src/C2HS/C/Builtin.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Builtin.o )+[10 of 26] Compiling Paths_c2hs ( dist/build/autogen/Paths_c2hs.hs, dist/build/c2hs/c2hs-tmp/Paths_c2hs.o )+[11 of 26] Compiling C2HS.Config ( src/C2HS/Config.hs, dist/build/c2hs/c2hs-tmp/C2HS/Config.o )+[12 of 26] Compiling C2HS.Switches ( src/C2HS/Switches.hs, dist/build/c2hs/c2hs-tmp/C2HS/Switches.o )+[13 of 26] Compiling C2HS.Version ( src/C2HS/Version.hs, dist/build/c2hs/c2hs-tmp/C2HS/Version.o )+[14 of 26] Compiling System.CIO ( src/System/CIO.hs, dist/build/c2hs/c2hs-tmp/System/CIO.o )+[15 of 26] Compiling Control.State ( src/Control/State.hs, dist/build/c2hs/c2hs-tmp/Control/State.o )+[16 of 26] Compiling C2HS.State ( src/C2HS/State.hs, dist/build/c2hs/c2hs-tmp/C2HS/State.o )+[17 of 26] Compiling C2HS.CHS.Lexer ( src/C2HS/CHS/Lexer.hs, dist/build/c2hs/c2hs-tmp/C2HS/CHS/Lexer.o )++src/C2HS/CHS/Lexer.hs:612:16: Warning:+ Defined but not used: `lexeme'+[18 of 26] Compiling C2HS.CHS ( src/C2HS/CHS.hs, dist/build/c2hs/c2hs-tmp/C2HS/CHS.o )+[19 of 26] Compiling C2HS.Gen.Header ( src/C2HS/Gen/Header.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Header.o )+[20 of 26] Compiling C2HS.C.Trav ( src/C2HS/C/Trav.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Trav.o )+[21 of 26] Compiling C2HS.C.Names ( src/C2HS/C/Names.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Names.o )+[22 of 26] Compiling C2HS.C ( src/C2HS/C.hs, dist/build/c2hs/c2hs-tmp/C2HS/C.o )+[23 of 26] Compiling C2HS.Gen.Monad ( src/C2HS/Gen/Monad.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Monad.o )++src/C2HS/Gen/Monad.hs:227:10: Warning:+ Orphan instance: instance Read Ident+[24 of 26] Compiling C2HS.C.Info ( src/C2HS/C/Info.hs, dist/build/c2hs/c2hs-tmp/C2HS/C/Info.o )+[25 of 26] Compiling C2HS.Gen.Bind ( src/C2HS/Gen/Bind.hs, dist/build/c2hs/c2hs-tmp/C2HS/Gen/Bind.o )++src/C2HS/Gen/Bind.hs:971:43: Warning:+ In the use of `posColumn' (imported from Language.C.Data.Position):+ Deprecated: \"column number information is inaccurate in presence of macros - do not rely on it.\"++src/C2HS/Gen/Bind.hs:789:10: Warning:+ Orphan instance: instance Num CInteger+[26 of 26] Compiling Main ( src/Main.hs, dist/build/c2hs/c2hs-tmp/Main.o )+Linking dist/build/c2hs/c2hs ...+Installing executable(s) in /root/.cabal/bin+Installed c2hs-0.17.2+lyriondesktop:/home/zilti/tmp # cabal install git-annex+Resolving dependencies...+Configuring gnuidn-0.2.1...+cabal: The program c2hs is required but it could not be found.+Failed to install gnuidn-0.2.1+cabal: Error: some packages failed to install:+git-annex-5.20140709 depends on gnuidn-0.2.1 which failed to install.+gnuidn-0.2.1 failed during the configure step. The exception was:+ExitFailure 1+network-protocol-xmpp-0.4.6 depends on gnuidn-0.2.1 which failed to install.+```+"""]]
+ doc/install/fromsource/comment_38_5c1e96221154a4ae4ebd636232044ced._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.2"+ subject="comment 38"+ date="2014-07-11T18:30:55Z"+ content="""+@Daniel, I suggest you either follow the instuctions above, or if you don't want to follow the instructions, follow the error messages. :P In this case, the instructions say to do:++> PATH=$HOME/bin:$PATH+> cabal install c2hs --bindir=$HOME/bin++Which is exactly to work around the problem that we can see in your transcript: `Installing executable(s) in /root/.cabal/bin` ++Also, to reiterate the top of the page: If you are not comfortable tracking down and dealing with library build problems, installing git-annex with cabal is probably not the right choice for you!++"""]]
+ doc/install/fromsource/comment_39_a86057d7e6d47113330f79e1812c3a5d._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkftzaCvV7EDKVDfJhsQZ3E1Vn-0db516w"+ nickname="Edward"+ subject="GHC 7.8 Issue"+ date="2014-08-20T20:06:01Z"+ content="""+Just an FYI: I tried to \"cabal install --only-dependencies\" with GHC 7.8 and it fails because DAV-1.0.1 is pulling in lens-3.10.3 which is not compatible with GHC 7.8 due to changes in Typeable. ++I don't have enough experience with cabal to figure out why it's not trying to use a newer version of lens.+"""]]
+ doc/install/fromsource/comment_45_d9cccbb9620cc8218e72b5380fd89a05._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.22"+ subject="no need for c2hs"+ date="2014-09-16T19:28:09Z"+ content="""+The c2hs mentioned in some of the above comments is not needed any longer; ghc 7.6.3 and newer come with a hsc2hs command that is used.+"""]]
+ doc/install/fromsource/comment_46_954de34275d33bc4590927f911761563._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.22"+ subject="comment 46"+ date="2014-09-16T19:33:11Z"+ content="""+Britt's comment is spot on, but git-annex tries pretty hard to work with lots of older versions of haskell libraries, as well as the latest and greatest. So it should be ok to install haskell libraries with apt-get and use them to build git-annex, as the (revised) instructions above show.++What tends not to work so well is use apt-get to install older versions of haskell libraries and then cabal install on top to add newer stuff. Gets complicated and I'd recommend not going there. The instructions above show using either apt-get or cabal to install the haskell libraries, but not both.+"""]]
+ doc/install/fromsource/comment_47_6de25c1e450e1e3b1d18d2c76235ccb8._comment view
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="thnetos"+ subject="Where to start reading the source code?"+ date="2014-12-15T22:04:06Z"+ content="""+Do you have any recommendations for the overall haskell architecture of the project? Where to start looking if I want to read through the source code?+"""]]
+ doc/install/fromsource/comment_48_9c08300c5d172ba9223042a00c8acb2b._comment view
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="joey"+ subject="""where to start reading the source code"""+ date="2015-01-05T20:58:50Z"+ content="""+@thnetos, great question!++Annex.hs is a key starting place, as it defines git-annex's main monad.+If you like learning code bases bottom-up, Types/* has files for+the main data types used in git-annex, such as Key and UUID and Remote and+GitConfig.++Command/* gets you the implementation of any particular git-annex command+you are interested in. Or Remote/* for any particular special remote.++I recommend running "make tags" and then your editor should be able to use+the tags file to bounce around in the source code.+"""]]
+ doc/install/fromsource/comment_49_c8370525547b435d963a2c1192a21124._comment view
@@ -0,0 +1,93 @@+[[!comment format=mdwn+ username="dave@2ab82f485adf7e2ce787066e35f5f9789bff430b"+ nickname="dave"+ subject="apt-get build-dep fails"+ date="2015-07-09T00:07:32Z"+ content="""+ hobbes@namagiri:~/src$ sudo apt-get build-dep git-annex+ Reading package lists... Done+ Building dependency tree + Reading state information... Done+ E: Build-Depends dependency for git-annex cannot be satisfied because the package libghc-hamlet-dev cannot be found++Hmm, deprecated in favor of libghc-shakespear-dev, according to http://hackage.haskell.org/package/hamlet ...++ hobbes@namagiri:~/src/apt-get-source-git-annex$ grep -iR build-depends.*hamlet|tr , \\n+ git-annex_5.20141125.dsc:Build-Depends: debhelper (>= 9)+ ghc (>= 7.4)+ cabal-install+ libghc-mtl-dev (>= 2.1.1)+ libghc-missingh-dev+ libghc-data-default-dev+ libghc-hslogger-dev+ libghc-pcre-light-dev+ libghc-sha-dev+ libghc-cryptohash-dev+ libghc-dataenc-dev+ libghc-utf8-string-dev+ libghc-hs3-dev (>= 0.5.6)+ libghc-dav-dev (>= 1.0) [amd64 i386 kfreebsd-amd64 kfreebsd-i386 powerpc]+ libghc-quickcheck2-dev+ libghc-monad-control-dev (>= 0.3)+ libghc-exceptions-dev (>= 0.6)+ libghc-transformers-dev+ libghc-unix-compat-dev+ libghc-dlist-dev+ libghc-uuid-dev+ libghc-json-dev+ libghc-aeson-dev+ libghc-ifelse-dev+ libghc-bloomfilter-dev+ libghc-edit-distance-dev+ libghc-hinotify-dev [linux-any]+ libghc-stm-dev (>= 2.3)+ libghc-dbus-dev (>= 0.10.3) [linux-any]+ libghc-fdo-notify-dev (>= 0.3) [linux-any]+ libghc-yesod-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc]+ libghc-yesod-static-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc]+ libghc-yesod-default-dev [i386 amd64 kfreebsd-amd64 powerpc]+ libghc-hamlet-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc]+ libghc-shakespeare-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc]+ libghc-clientsession-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc]+ libghc-warp-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc]+ libghc-warp-tls-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc]+ libghc-wai-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc]+ libghc-wai-extra-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc]+ libghc-securemem-dev+ libghc-byteable-dev+ libghc-dns-dev+ libghc-case-insensitive-dev+ libghc-http-types-dev+ libghc-http-conduit-dev+ libghc-blaze-builder-dev+ libghc-crypto-api-dev+ libghc-network-multicast-dev+ libghc-network-info-dev [linux-any kfreebsd-any]+ libghc-safesemaphore-dev+ libghc-network-protocol-xmpp-dev (>= 0.4.3-1+b1)+ libghc-gnutls-dev (>= 0.1.4)+ libghc-xml-types-dev+ libghc-async-dev+ libghc-feed-dev (>= 0.3.9.2)+ libghc-regex-tdfa-dev [!mipsel !s390]+ libghc-regex-compat-dev [mipsel s390]+ libghc-tasty-dev (>= 0.7) [!sparc]+ libghc-tasty-hunit-dev [!sparc]+ libghc-tasty-quickcheck-dev [!sparc]+ libghc-tasty-rerun-dev [!sparc]+ libghc-optparse-applicative-dev [!sparc]+ lsof [!kfreebsd-i386 !kfreebsd-amd64 !hurd-any]+ ikiwiki+ perlmagick+ git (>= 1:2.0)+ rsync+ wget+ curl+ openssh-client+ git-remote-gcrypt (>= 0.20130908-6)+ llvm-3.4 [armel armhf]+ +I think that's the bug, right there: *git-annex_5.20141125.dsc*.++I hope this helps.+"""]]
+ doc/install/fromsource/comment_50_c1ce6084ba1e96afa30e18f0f6433aa4._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 50"""+ date="2015-07-15T15:54:15Z"+ content="""+Yes, Debian has a by now very outdated version of git-annex.++You can clone git-annex's git repo and build a debian package from there;+it's been updated for these changes.+"""]]
+ doc/install/fromsource/comment_51_514bac1020c4227a23380d1675184fc7._comment view
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="reyman64@f52a9d695f5dc1d5b0788fbb9877e9401fae7421"+ nickname="reyman64"+ subject="Error with Url.hs"+ date="2015-11-06T13:37:41Z"+ content="""+Hi,+With minimal compilation for git-annex-5.20151102.1+and+Cabal version is : 1.22.4.0+Ghc version is : 7.10.2 ++I have an error on url.hs:45+binary operator not found before lexical element \" ( \"++any idea ?++"""]]
+ doc/install/fromsource/comment_52_df7d36e4d169fbc4199026d7af1aa581._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 52"""+ date="2015-11-06T16:48:16Z"+ content="""+@reyman64 missing dependency on http-client in that configuration.+I've fixed this in git.+"""]]
+ doc/install/fromsource/comment_53_e4bb31024aa4a317be2f45667b6d6f9f._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="reyman64@f52a9d695f5dc1d5b0788fbb9877e9401fae7421"+ nickname="reyman64"+ subject="comment 53"+ date="2015-11-06T17:07:21Z"+ content="""+Great that works now, thanks :)+"""]]
+ doc/news/version_5.20151116.mdwn view
@@ -0,0 +1,32 @@+git-annex 5.20151116 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * Use concurrent-output library when configured with -fConcurrentOutput.+ This allows nicely displayed messages when using the -J flag.+ * Additional commands now support the -J flag:+ fsck, drop, add, addurl, import+ * import: Avoid very ugly error messages when the directory files+ are imported to is not a directort, but perhaps an annexed file.+ * Concurrent progress bars are now displayed when using -J with a command+ that moves file contents around.+ * Fix race that could result in an annexed file's symlink not being+ created, when eg, running concurrent git-annex adds.+ * add: Fix error recovery rollback to not move the injested file content+ out of the annex back to the file, because other files may point to+ that same content. Instead, copy the injected file content out to+ recover.+ * quvi may output utf-8 encoded data when the conifigured locale doesn't+ support that; avoid crashing on such invalid encoding.+ * runshell: Avoid failing when $HOME/.ssh does not exist and cannot be+ created.+ * Make the git-annex-standalone.deb prevent runshell from installing+ wrappers into $HOME/.ssh+ * Make git-annex-standalone.deb include the git-annex html documentation,+ desktop file, and base completion file, same as the regular git-annex.deb.+ * fsck: When fscking a dead repo, avoid incorrect "fixing location log"+ message, and display a warning about it being dead, since it's unusual+ to have access to a dead repo.+ * assistant: Pass ssh-options through 3 more git pull/push calls+ that were missed before.+ * Added annex.pidlock and annex.pidlocktimeout configuration to support+ filesystems where POSIX fcntl locks cannot be used.+ * init: Automatically enable annex.pidlock when necessary."""]]
+ doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 10"+ date="2013-05-23T20:04:03Z"+ content="""+You can enable a special remote on a clone by running `git annex enableremote $name`, where $name is the name you used to originally create the special remote. (Older versions of git-annex used `git annex initremote` to enable the special remote on the clone.)++(Just in case, I have verified that embedcreds does cause the cipher= to be stored in the remote.log. It does.)+"""]]
+ doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="basak"+ ip="2001:8b0:1c8::2"+ subject="comment 11"+ date="2013-05-24T09:38:40Z"+ content="""+Thanks Joey - initremote on my slightly older version appears to work. I'll use `enableremote` when I can.++> (Just in case, I have verified that embedcreds does cause the cipher= to be stored in the remote.log. It does.)++This doesn't do what I expect. The documentation suggests that my S3 _login_ credentials would be stored. I understand that the cipher would be stored; but isn't this a separate concept? Instead, I'm being asked to set `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`; my understanding was that git-annex will keep them in the repository for me, so that I don't have to set them after running `initremote` before cloning. This works, apart from surviving the cloning. I'm using `encryption=shared`; does this affect anything? Or am I using a version of git-annex (3.20121112ubuntu3) that's too old?+"""]]
+ doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 12"+ date="2013-05-24T15:33:12Z"+ content="""+Ah -- No, your AWS creds are not stored. While some other special remotes, like webdav, can store all necessary credentials, it's not done for AWS. I didn't want git-annex to be responsible for someone accidentially publishing their AWS creds to their friends, since that could cost them a lot of money.+"""]]
+ doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment view
@@ -0,0 +1,33 @@+[[!comment format=mdwn+ username="basak"+ ip="2001:8b0:1c8::2"+ subject="comment 13"+ date="2013-05-24T15:47:14Z"+ content="""+That's not what the documentation here says! It even warns me: \"Think carefully about who can access your repository before using embedcreds without gpg encryption.\"++My use case:++Occasional use of EC2, and a desire to store some persistent stuff in S3, since the dataset is large and I have limited bandwidth. I want to destroy the EC2 instance when I'm not using it, leaving the data in S3 for later.++If I use git-annex to manage the S3 store, then I get the ability to clone the repository and destroy the instance. Later, I can start a new instance, push the repo back up, and would like to be able to then pull the data back out of S3 again.++I'd really like the login credentials to persist in the repository (as the documentation here says it should). Even if I have to add a --yes-i-know-my-s3-credentials-will-end-up-available-to-anyone-who-can-see-my-git-repo flag. This is because I use some of my git repos to store private data, too.++If I use an Amazon IAM policy as follows, I can generate a set of credentials that are limited to access to a particular prefix of a specific S3 bucket only - effectively creating a sandboxed area just for git-annex:++ { + \"Statement\": [{\"Sid\": \"Stmt1368780615583\",+ \"Action\": [\"s3:GetObject\", \"s3:PutObject\", \"s3:DeleteObject\"],+ \"Effect\": \"Allow\",+ \"Resource\": [\"arn:aws:s3:::bucketname/prefix/*\"]}+ ],+ \"Statement\": [{\"Sid\": \"Stmt1368781573129\",+ \"Action\": [\"s3:GetBucketLocation\"],+ \"Effect\": \"Allow\",+ \"Resource\": [\"arn:aws:s3:::bucketname\"]}+ ]+ }++Doing this means that I have a different set of credentials for every annex, so it would be really useful to be able have these stored and managed within the repository itself. Each set is limited to what the annex stores, so there is no bigger compromise I have to worry about apart from the compromise of the data that the annex itself manages.+"""]]
+ doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 14"+ date="2013-05-24T16:45:25Z"+ content="""+I apologise for incorrect information. I was thinking about defaults when using the webapp.++I have verified that embedcreds=yes stores the AWS creds, always.+++"""]]
+ doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawne_amN4fko4p5cRY_9EYwaYuJKNn7LRio"+ nickname="Tobias"+ subject="different s3 storage URLs"+ date="2013-08-23T08:59:32Z"+ content="""+Is it possible to change the S3 endpoint hosts? I'm running a radosgw with S3 support which I'd like to define as S3 remote for git-annex+"""]]
+ doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.63"+ subject="comment 16"+ date="2013-08-23T17:39:56Z"+ content="""+Yes, you can specify the host to use when setting up the remote. It's actually documented earlier on this very page, if ou search for \"host\". Any S3 compatabile host will probably work -- the Internet Archive's S3 does, for example.+"""]]
+ doc/special_remotes/S3/comment_17_52d3510016c099d083553f9b3fa40db9._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlc-3pdibcizrdz4WmZooECL0k6AvM1cWc"+ nickname="Joe"+ subject="S3 file/folder names"+ date="2015-02-19T22:22:26Z"+ content="""+Is there a way to tell the S3 backend to store the files as they are named locally, instead of by hashed content name? i.e., I've annexed foo/bar.txt and annex puts it in s3 as mybucket.name/foo/bar.txt instead of mybucket.name/GPGHMACSHA1-random.txt++Or should I just write a script to s3cmd sync my annex, and add the S3/cloudfront distribution URL as a web remote?+"""]]
+ doc/special_remotes/S3/comment_18_0dcb84048563fc9e45b66ca8f365f320._comment view
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="darkfeline"+ subject="Sharing S3 bucket between repos"+ date="2015-10-09T01:16:25Z"+ content="""+What are the implications of sharing an S3 remote/bucket between two repositories with using fileprefix? Can this be used to \"deduplicate\" files shared between repositories?+"""]]
+ doc/special_remotes/S3/comment_19_9d0d622b6202698f09eb06c097579fbb._comment view
@@ -0,0 +1,19 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 19"""+ date="2015-10-12T17:10:21Z"+ content="""+@darkfeline I suppose you're talking about two completely disjoint git+repositories, and not two clones of the same parent repo.++If you don't use fileprefix, and have the same file in two disjoint+repositories, git-annex will pick the same key for it in both cases, and+so you'll get deduplication, but only if you don't use different+fileprefixes.++And this will mostly work pretty well. The danger is, if you drop the file+from the S3 repo, because say, it's not used anymore in one repository,+then you're also removing it from the S3 repo as used by the other+repository. If that was the last copy of the file, that may not be what you+want.+"""]]
+ doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment view
@@ -0,0 +1,23 @@+[[!comment format=mdwn+ username="http://sekenre.wordpress.com/"+ nickname="sekenre"+ subject="Synchronizing Bup repositories"+ date="2013-05-07T16:46:34Z"+ content="""+Hi All,++I managed to answer my questions above about copying changes between local bup repositories efficiently.++You run the following commands ++ git annex copy . --to bup_repo_1 # Uses bup split in the background (slow)+ rsync -av /mnt/repodisk1/repo/ /mnt/repodisk2/repo/ \+ --exclude=config --exclude=*.bloom --exclude=*.midx # rsync without bup-specific indices (speed depends on delta between repositories)+ BUP_DIR=/mnt/repodisk2/repo/ bup midx -a && bup bloom # rebuild bup-specific indices on the target (this is extremely fast)+ git annex copy . --to bup_repo_2 # Records file is now available in repo2 (also extremely fast)++Now `git annex whereis` will show the correct location and `git annex get <file> --from bup_repo_2` will work.++So far in my testing I haven't found any problems...++"""]]
+ doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment view
@@ -0,0 +1,24 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnAvbXOnK57sqgvZvxkbG74NUKBDwKDcuk"+ nickname="Tim"+ subject="bup location data not synced through annex assistant"+ date="2013-05-15T15:08:54Z"+ content="""+I set up 2 servers running git annex assistant, both with a ~/annex dir and an additional ~/annex-bup bup repo. There is no additional cloud repository.+For test, I added my /etc dir which uploaded correctly from server1, but which never arrived on server2++ bup@bup1:~/annex/etc$ git annex whereis updatedb.conf+ whereis updatedb.conf (3 copies) + 687d3a7f-4798-4dbe-8774-1785b8ab6b7d -- here (bup@bup1:~/annex)+ adfc1307-771f-40e9-b794-bae2e1f21b8b -- bup2-annex-bup+ e4e0ac0b-992a-4312-a4ac-fc8d3d9f7c0f -- bup1-annex-bup+ ok++ bup@bup2:~/annex/etc$ git annex whereis updatedb.conf+ whereis updatedb.conf (1 copy) + 687d3a7f-4798-4dbe-8774-1785b8ab6b7d -- bup1 (bup@bup1:~/annex)+ ok++As you can see, server 2 just doesn't know the data is already on it's own disk in it's local bup repo.+Is there a reason this data does not get synced? Should I set up a transfer repo?+"""]]
+ doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnAvbXOnK57sqgvZvxkbG74NUKBDwKDcuk"+ nickname="Tim"+ subject="my bad"+ date="2013-05-15T15:39:31Z"+ content="""+Sorry, looks like I did initremote twice on the same folder, instead of enableremote the second time...+"""]]
+ doc/special_remotes/bup/comment_12_fca579678edde073716f099c767767e1._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkEYZEqLf3Aj_FGV7S0FvsMplmGqqb555M"+ nickname="Sergiusz"+ subject="bup-join local-arch/2014-12-03-235617 "+ date="2014-12-04T19:38:07Z"+ content="""+How can I restore the previous commit from bup archives created with bup-split? Yes, I know I can use bup-join local-arch~1 git notation, but I would like to use bup-join local-arch/2014-12-03-235617 (bup-ls local-arch results) ...but this method does not work ...++s.+"""]]
+ doc/special_remotes/bup/comment_13_ce960bc69b27dfc2a233c9baa5b2cd2b._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="darkfeline@e6d098788a13ce41f3141a2dfc1bd31b401e83f0"+ nickname="darkfeline"+ subject="buprepo doesn't work properly"+ date="2015-08-17T12:59:25Z"+ content="""+The buprepo parameter doesn't seem to work properly, at least for local repos. For example, I added a bup remote with buprepo=/media/hdd/bup, yet when I try to move files onto it, it still tries to use /home/foo/.bup (the default path). I suppose git-annex should be setting the envvar BUP_DIR before calling bup?++I can do it manually like BUP_DIR=/media/hdd/bup git annex move --to hdd foo, but that almost seems to defeat the purpose...+"""]]
+ doc/special_remotes/bup/comment_14_940b778f97377e83dc16439c0c7e5b38._comment view
@@ -0,0 +1,21 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 14"""+ date="2015-08-19T18:30:16Z"+ content="""+@darkfeline, setting buprepo= causes git-annex to run bup with -r. +You can verify this by using the --debug switch.++IIRC, bup still creates ~/.bup when used this way, but doesn't store the+contents of annexed files there. It uses it only to store some small index+files, which are also stored in the repo specified with -r. This seems+weird, but I don't think this is a bug on bup's part; it seems to+intentionally do that, using path names in ~/.bup that are constructed to+not conflict when -r is used with different repositories.+I suppose bup has a good reason to do this, though I don't know what the+reason is.++I can blow ~/.bup away, run "bup init" to make a fresh clean ~/.bup,+and then git-annex can still get the content of files from the buprepo=+repository. So, it seems that buprepo= is working ok.+"""]]
+ doc/special_remotes/bup/comment_15_91e34a0087eaec6ad3c393179621a471._comment view
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="https://woid.cryptobitch.de/foobar"+ subject="obnam"+ date="2015-11-12T11:50:52Z"+ content="""+Will obnam work as well with git-annex for backups?+"""]]
+ doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment view
@@ -0,0 +1,43 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkgbXwQtPQSG8igdS7U8l031N8sqDmuyvk"+ nickname="Albert"+ subject="Error with bup and gnupg"+ date="2012-10-22T20:56:56Z"+ content="""+Hello,++I get this error when trying to use git-annex with bup and gnupg:++<pre>+move importable_pilot_surveys.tar (gpg) (checking localaseebup...) (to localaseebup...) +Traceback (most recent call last):+ File \"/usr/lib/bup/cmd/bup-split\", line 133, in <module>+ progress=prog)+ File \"/usr/lib/bup/bup/hashsplit.py\", line 167, in split_to_shalist+ for (sha,size,bits) in sl:+ File \"/usr/lib/bup/bup/hashsplit.py\", line 118, in _split_to_blobs+ for (blob, bits) in hashsplit_iter(files, keep_boundaries, progress):+ File \"/usr/lib/bup/bup/hashsplit.py\", line 86, in _hashsplit_iter+ bnew = next(fi)+ File \"/usr/lib/bup/bup/helpers.py\", line 86, in next+ return it.next()+ File \"/usr/lib/bup/bup/hashsplit.py\", line 49, in blobiter+ for filenum,f in enumerate(files):+ File \"/usr/lib/bup/cmd/bup-split\", line 128, in <genexpr>+ files = extra and (open(fn) for fn in extra) or [sys.stdin]+IOError: [Errno 2] No such file or directory: '-'+</pre>+++I was able to work-around this issue by altering /usr/lib/bup/cmd/bup-split (though I don't think its a bup bug) to just pull from stdin:++files = [sys.stdin]++on ~ line 128.++Any ideas? Also, do you think that bup's data-deduplication does anything when gnupg is enabled, i.e. is it just as well to use a directory remote with gnupg?++Thanks! Git annex rules!++Albert+"""]]
+ doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.23"+ subject="comment 2"+ date="2012-10-23T20:01:43Z"+ content="""+@Albert, thanks for reporting this bug (but put them in [[bugs]] in future please).++This is specific to using the bup special remote with encryption. Without encryption it works. And no, it won't manage to deduplicate anything that's encrypted, as far as I know. ++I think bup-split must have used - for stdin in the past, but now, it just reads from stdin when no file is specified, so I've updated git-annex.+"""]]
+ doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment view
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="http://sekenre.wordpress.com/"+ nickname="sekenre"+ subject="Bup remotes in git-annex assistant"+ date="2013-03-13T12:54:56Z"+ content="""+Hi,++Is the bup remote available via the Assistant user interface?++Unrelated question;++If you are syncing files between two bup repos on local usb drives, does it use git to sync the changes or does it use \"bup split\" to re-add the file? (Basically, is the syncing as efficient as possible using git-annex or would I have to go to a lower level)++Many Thanks,+Sek+"""]]
+ doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 4"+ date="2013-03-13T16:05:50Z"+ content="""+I don't plan to support creating bup spefial remotes in the assistant, currently. Of course the assistant can use bup special remotes you set up.++Your two bup repos would be synced using bup-split.+"""]]
+ doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnZWCbRYPVnwscdkdEDwgQHZJLwW6H_AHo"+ nickname="Tobias"+ subject="bup fail?"+ date="2013-03-31T21:05:32Z"+ content="""+I've run into problems storing a huge number of files in the bup repo. It seems that thousands of branches are a problem. I don't know if it's a problem of git-annex, bup, or the filesystem.++How about adding an option to store tree/commit ids in git-annex instead of using branches in bup?+"""]]
+ doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 7"+ date="2013-04-02T21:24:06Z"+ content="""+`bup-split` uses a git branch to name the objects stored in the bup repository. So it will be limited by any scalability issues affecting large numbers of git branches. I don't know what those are.++Yes, it would be possible to make git-annex store this in the git-annex branch instead.+"""]]
+ doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlsXhOlsW6RaGR83VNSMxPh159l5dFau70"+ nickname="Yung-Chin"+ subject="re scaling issue"+ date="2013-05-03T14:57:51Z"+ content="""+Tobias/joey,++I think there are at least two scaling issues that may be causing you trouble. One is that bup writes pack+idx files rather than bare objects, and if you send 1 file per call to bup-split, you end up with a pair of pack and idx files for each such call. When you later try to retrieve a blob, bup currently just calls git, and git will have to traverse all these tiny idx files looking for the right hash (bare objects you could at least find by name). You can probably ameliorate the pain by calling git repack (look at the -a and --max-pack-size switches) on your bup repository. The other is the \"thousands of branches\" issue, and I think \"git pack-refs --all\" (that's again on your bup repository) might help a little bit. ++It would certainly help performance if you could store blob/tree ids in git-annex instead of branch names. For small files, all bup would need to store is a blob, but currently you end up storing a blob, a tree, and a commit (and looking-up all of those, plus the ref too, on calling bup-join). (you might want to patch bup-split, so it would allow you to ask it for \"--blob-or-tree\", because currently if you say you pass it -b for blob-ids, then for bigger files you get a series of IDs, whereas you'd be much better off with a tree-id there)+"""]]
+ doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlsXhOlsW6RaGR83VNSMxPh159l5dFau70"+ nickname="Yung-Chin"+ subject="comment 9"+ date="2013-05-03T16:34:05Z"+ content="""+Thinking about this some more, a very elegant way to make a bup remote could actually be to just pass the whole .git/annex tree into bup-index/save (you could avoid sending some files by only bup-indexing select subtrees, or by using --exclude-*'s, but you'd run bup-save over the whole .git/annex tree). You could then use bup-restore to retrieve files or whole subtrees, and you'd refer to the files you're retrieving by their actual pathname under which they live in .git/annex (if that doesn't make sense it's because I've misunderstood how git-annex is organised!), so something like \"bup restore branch_name/latest/.git/annex/aa/bb/sha-of-some-sort\" would work - that's cute, right? And you'd only have 1 branch.++However... somebody who is good with lazy-evaluation would need to rework bup.vfs: currently, if you'd call bup-restore on a path like that, it would instantiate a _lot_ of vfs-nodes you don't need - to begin with, it would make a node for every commit you ever made (on any branch!) - on a big repository you'd wait ages for it to just find the commit objects...+"""]]
+ doc/special_remotes/comment_27_b37c6ed2444bd7e8b4d7937abdfcbd1c._comment view
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="alex@7ca398785b94de08e4386b708f32ff9f1af381c7"+ nickname="alex"+ subject="backblaze support"+ date="2015-11-04T19:58:34Z"+ content="""+Backblaze B2 with unlimited storage at $.005/GB/mo seems to be a great option for a special remote.+Is it feasible to add support for it?+I'd love to contribute financially.++https://www.backblaze.com/b2++"""]]
+ doc/special_remotes/comment_28_c7ab32e1e63fc114b3b2f56bab62eafa._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="craig@6ddb6e2c94325e18a0d631a06e63fdc111ab1f12"+ nickname="craig"+ subject="Thanks"+ date="2015-11-16T05:34:35Z"+ content="""+Sorry, didn't post a follow up, but git annex enableremote did exactly what I expected. Thanks.+"""]]
+ doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment view
@@ -0,0 +1,32 @@+[[!comment format=mdwn+ username="helmut"+ ip="89.0.176.236"+ subject="Asynchronous hooks?"+ date="2012-10-13T09:46:14Z"+ content="""+Is there a way to use asynchronous remotes? Interaction with git annex would have to+split the part of initiating some action from completing it.++I imagine I could `git annex copy` a file to an asynchronous remote and the command+would almost immediately complete. Later I would learn that the transfer is+completed, so the hook must be able to record that information in the `git-annex`+branch. An additional plumbing command seems required here as well as a way to+indicate that even though the store-hook completed, the file is not transferred.++Similarly `git annex get` would immediately return without actually fetching the+file. This should already be possible by returning non-zero from the retrieve-hook.+Later the hook could use plumbing level commands to actually stick the received file+into the repository.++The remove-hook should need no changes, but the checkpresent-hook would be more like+a trigger without any actual result. The extension of the plumbing required for the+extension to the receive-hook could update the location log. A downside here is that+you never know when a fsck has completed.++My proposal does not include a way to track the completion of actions, but relies on+the hook to always complete them reliably. It is not clear that this is the best road+for asynchronous hooks.++One use case for this would be a remote that is only accessible via uucp. Are there+other use cases? Is the drafted interface useful?+"""]]
+ doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment view
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"+ nickname="Bence"+ subject="More environment variables"+ date="2013-07-09T10:28:58Z"+ content="""+Could you please include the original filename+path in the environment variables (_next to ANNEX_KEY & ANNEX_FILE_)? Like ANNEX_FILENAME and ANNEX_PATH.++Having these infos in a hook would help eg. a flickr backend to be more usefull. [Tags](http://www.flickr.com/help/tags/) would contain the ANNEX_KEY and the image title could be the original filename (ANNEX_FILENAME). Also, having directory path (ANNEX_PATH) for the given file, the uploading process could put images into the proper sets/collections. Voila, you have a \"filesystem based\" flickr image gallery (almost like flickrfs).++Other backends, like AmazonS3 having [meta data](http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html) also could benefit from this. ++To build the Death Star further, an _annex.$hooktype-**sync**-hook_ would instruct the backend to sync data, eg. place or move images/files in the proper image-sets/directories after they are moved/repositioned in git-annex, but that would be the backend's job, not git-annex's. Maybe the sync-hook would be called when _git annex sync_ is called. This is just an idea.++While writing this, a new hook for sharing came into my mind: _annex.$hooktype-**share**-hook_.+Calling this on a file/directory (_git annex share my_image_to_share.jpg_) would return a publicly shareable (short)url pointing to the file/directory. This would work for web-backends like AmazonS3, flickr, DropBox, Google Drive, ...+"""]]
+ doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment view
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA"+ nickname="Tobias"+ subject="comment 3"+ date="2013-07-09T10:54:58Z"+ content="""+I have requested this before. But it doesn't seem to be entirely doable because some items may have multiple equally correct filenames/paths. And some items may have zero filenames/paths.++That said I hope a solution can be found because I really want this feature too. And would implement it in all my hooks.++And for some of the cases i don't really see it as an issue. If you have a public flickr repo with clean(unencrypted) files. It is because you want to access existing files. If an object has no filename/path the hook could/would/should just ignore the file, sure this means no backup of old versions of files, but you can have other backends for those versions.++The bigger issue is with the same file existing multiple places in the annex, which filename/path should be used? And the filename/path can change between sync(if it is deleted from one of the positions). I personally still see this as being entirely doable. The key for downloading would always be the same, so worst case scenario is the image may be duplicated on flickr. Or that the picture only one of the multiple folders it should be in on flickr. Still, i see these issues as being minor, and that usability would increase if this was implemented, even with these caveats.++And there probably is some issues I haven't realized/know about.++"""]]
+ doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment view
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"+ nickname="Bence"+ subject="checkpresent success and failure"+ date="2013-07-31T13:06:21Z"+ content="""+What value should be returned in the \"checkpresent-hook\" to signal that the given file does not exist in the given backend? ++Should the called hook process return an exit code less or greater then zero? In this case the following is displayed: +>(user error (sh [\"-c\",\"name_of_the_process\"] exited 1)) failed++This tells that the process failed (no internet connection or something that prevents the process from doing its job) and not that result is false, which would mean the file/entry does not exist in the given backend.+If the return code is zero the file is treated as existing file/entry (no matter what I write to stderr).++Also I think, the \"checkpresent\" block misses the ending ;; in the example.++Here is my work-in-progress hook: https://gist.github.com/parhuzamos/31bf4516eea434e0d248+"""]]
+ doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.21"+ subject="comment 5"+ date="2013-07-31T16:25:55Z"+ content="""+The checkpresent hook should always exit 0 unless there was an exceptional condition (eg, perhaps it cannot check if the file exists one way or the other). Like the documentation for it says, the important thing is what it outputs to stdout, which should contain the key name if it's present, and should not contain the key name if it's not present.++I hope you post to this website about your special remote when you get it fully working!+"""]]
+ doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"+ nickname="Bence"+ subject="comment 6"+ date="2013-07-31T17:34:50Z"+ content="""+Roger that.++If this is acceptable: [terminal output screenshot](http://i.imgur.com/lsJJYwF.png), than I'm almost done and will publish soon.+(Of course a REST API using client would much be better, but this is just the start.)++"""]]
+ doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.21"+ subject="comment 7"+ date="2013-07-31T17:42:22Z"+ content="""+If I were you I'd suppress that \"File not found\" error.++Hook special remotes *can* output messages to stderr, and it's also fine to output eg, progress bars to stdout when seding/receving files. But unnecessary cluttery output should be avoided.+"""]]
+ doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment view
@@ -0,0 +1,30 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnWvnTWY6LrcPB4BzYEBn5mRTpNhg5EtEg"+ nickname="Bence"+ subject="checkpresent again"+ date="2013-08-01T23:18:38Z"+ content="""+In the current [HEAD](https://github.com/joeyh/git-annex/commit/bb74db6ef094324062adcf26a677113ee6fd0e58) the \"checkpresent\" method in [Hook.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Hook.hs#L145) is missing a \"return\" while other hooks have a return value eg. [Directory.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Directory.hs#L241), [Rsync.hs](https://github.com/joeyh/git-annex/blob/master/Remote/Rsync.hs#L272), ...+++I noticed that if my *checkpresent* hook does not output anything (to be exact: I commented out all the lines in the block) it behaves strangely. I copied the test file to \"copyrepo\", removed it by hand (so git-annex does not know about the change) and executed a fsck.++ ~/annex5/test1/123 $ git annex fsck --from copyrepo --fast+ fsck somefile.1 (checking copyrepo...) (fixing location log) + ** Based on the location log, somefile.1+ ** was expected to be present, but its content is missing.+ failed++running the check again++ ~/annex5/test1/123 $ ga fsck --from copyrepo --fast+ fsck somefile.1 (checking copyrepo...) ok++and running the check again without --fast++ ~/annex5/test1/123 $ ga fsck --from copyrepo+ fsck somefile.1 (checking copyrepo...) ok++It thinks, the file is in the repo but it is not.++"""]]
+ doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.108.145"+ subject="comment 9"+ date="2013-08-01T23:51:48Z"+ content="""+The behavior you show with `fsck --from` is that the first time it's run against the damaged remote it notices the file is not present using the checkpresent hook. It then updates the location log. The subsequent times it's run, it sees that the location log says the file is not present in the remote. It verifies this is the case by calling the checkpresent hook. Since the two data sources agree, and numcopies is still satisfied, it prints \"ok\". There does not seem to be a bug here.++(`return` in Haskell does not do what you would expect to happen in a traditional imperative language. It does not alter control flow, and any function using `return` can be mechanically converted to one that does not use `return`.)+"""]]
+ doc/special_remotes/ipfs/comment_1_d1b2da148715476015716a2f866558b9._comment view
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="https://id.koumbit.net/anarcat"+ subject="about copying to the local store"+ date="2015-03-07T13:16:02Z"+ content="""+there's a [discussion](https://github.com/jbenet/go-ipfs/issues/875) happening upstream about how copying to the local datastore could be avoided.+"""]]
+ doc/special_remotes/ipfs/comment_2_564271a8660d7bbade6e4ed396fcfb57._comment view
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="rob.syme@92895c98b16fd7a88bed5f10913c522ebfd76c31"+ nickname="rob.syme"+ subject="Finding IPFS hash"+ date="2015-05-26T04:55:32Z"+ content="""+I'm using git-annex version: 5.20150522-gb199d65++The example above gives the ipfs hash for the file, but when I run whereis, the hash is not reported:++ $ git annex whereis test.txt+ whereis test.txt (2 copies) + 1bd0f840-2247-4888-9237-596515788671 -- rob@rob-G60JX:/tmp/gitannextest [here]+ adf361b3-7b1a-43e1-8360-937f7e436e90 -- [ipfs]+ ok++Is there a way for git-annex to report the file's ipfs hash ID?+"""]]
+ doc/special_remotes/ipfs/comment_3_b8c7e402e0ee63d659ae33e3e2504ca2._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="rob.syme@92895c98b16fd7a88bed5f10913c522ebfd76c31"+ nickname="rob.syme"+ subject="Finding IPFS hash"+ date="2015-05-26T05:08:38Z"+ content="""+I see now that git-annex only reports the ipfs hash when the remote is unencrypted. It the ipfs hash not reported for encrypted ipfs remotes for security reasons?+"""]]
+ doc/special_remotes/ipfs/comment_4_06611859079239659ba7d73d655f517e._comment view
@@ -0,0 +1,23 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 4"""+ date="2015-05-27T19:02:30Z"+ content="""+@rob.syme, the reason that does not work when using encryption+is that git-annex internally generates an encrypted key, and stores+that on IPFS. The ipfs special remote records the IPFS address+that can be used for a key, but it's recorded on the encrypted+key, which is not the one you're querying with whereis.++This is a general problem with git-annex; ipfs is probably the+first special remote that exposes the problem.++Anyway, I'm not sure what benefit knowing the IPFS address of a file+encrypted by git-annex is. You need to use git-annex to decrypt it, in+general. You might be able to use your gpg key to decrypt it, if the+special remote was set up using pubkey encryption, but that's not going to+help anyone else you give the IPFS address to access the encrypted data..++Does your use case involve pinning the IPFS address, or something like+that?+"""]]
+ doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://olivier.berger.myopenid.com/"+ nickname="obergix"+ subject="Which URL prefix are supported ?"+ date="2013-08-17T08:44:05Z"+ content="""+It is not clear whether only http:// URLs are supported. Can you list others ?+"""]]
+ doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="2001:4978:f:21a::2"+ subject="comment 2"+ date="2013-08-17T08:59:11Z"+ content="""+When it says \"arbitrary urls\", it means it. The only requirement is that the url be well formed and that wget or whatever command you have it configured to use via annex.web-download-command knows how to download it.+"""]]
+ doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA"+ nickname="Tobias"+ subject="User defined server"+ date="2013-04-17T09:45:59Z"+ content="""+It would be nice if you could expand the XMPP setup in the assistant to support an \"advanced\" settings view where a custom server could be defined.++Example: I have a google Apps domain called mytest.com, with the users bla1@mytest.com and bla2@mytest.com. When trying to add either of those accounts to the assistant XMPP will try to use mytest.com as the jabber server, and not googles server.++"""]]
+ doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"+ nickname="Andrew"+ subject="comment 2"+ date="2013-04-17T22:28:39Z"+ content="""+Yeah, I agree, this would be nice. ++For your own domain, you can configure DNS like this: [[http://support.google.com/a/bin/answer.py?hl=en&answer=34143]] to make XMPP find the right server. But for some that's not an option and the \"advanced\" mode would be useful in that case.+"""]]
+ doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment view
@@ -0,0 +1,28 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="46.19.143.203"+ subject="Missing prerequisites for XMPP syncing?"+ date="2013-09-17T06:53:59Z"+ content="""+I set up two fresh annexes that can talk via XMPP and no other way. After I fire up the assistants I expect them to sync their metadata, but nothing happens. One log gives me an 'XMPPClient: received: [\"Unknown message\"]' message every two minutes. The other one doesn't contain the string XMPP at all, not once. So my suspicion is that this particular version of git-annex doesn't support XMPP, which is weird because:++ $ git annex version+ git-annex version: 4.20130909+ build flags: Assistant Pairing Testsuite S3 Inotify XMPP DNS Feeds+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2++This is the version output from the other machine: ++ $ git annex version+ git-annex version: 4.20130827+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 4+ upgrade supported from repository versions: 0 1 2++What am I missing? Are there more build flags for XMPP than the one called XMPP? (Also, no, I can't just copy versions between machines b/c the architectures are different. And yep, the one giving me trouble is ARM.)+"""]]
+ doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.14.105"+ subject="comment 4"+ date="2013-09-19T21:07:35Z"+ content="""+If you have the XMPP flag in your git-annex build, it will support XMPP. Are you sure you set up the xmpp creds file and the xmpp special remote correctly on the ARM machine? (I assume it has no webapp, so you had to set that up manually..)++Here's how you can do that manually:++1. Run git-annex on a machine with the webapp, set up XMPP, and copy the .git/annex/creds/xmpp to the machine without the webapp.+2. On the machine without the webapp, add a git remote that has its \"url = xmpp::loginname@xmppserver.com\" and its annex-uuid set to the annex.uuid of the repository on the first machine.+3. Run git-annex assistant on the machine without the webapp.+"""]]
+ doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment view
@@ -0,0 +1,73 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="37.221.161.234"+ subject="Nope"+ date="2013-09-24T22:05:55Z"+ content="""+Your guess is right, Joey, I'm configuring by hand as the ARM machine has no webapp. And yes, I'm mostly sure I set up everything correctly. The XMPP account is working, and my configuration of git-annex is all but identical to your example.++Here's what I do. First on the machine with the webapp:++ mkdir ~/test+ cd ~/test+ git init+ git annex init+ git annex webapp++I set up XMPP from within the webapp. The file ~/test/.git/annex/creds/xmpp is created with the correct credentials. (BTW: The file's default permissions are 620 instead of 600 - is that a bug?)++I add a file or two to the annex for good measure. Then, on the ARM machine:++ mkdir ~/test+ cd ~/test+ git init+ git annex init+ mkdir .git/annex/creds+ scp -2 webappmachine:~/test/.git/annex/creds/xmpp .git/annex/creds + chmod 600 .git/annex/creds/xmpp+ git remote add webappmachine xmpp::login@server++The final step is to edit .git/config on the ARM machine. The [remote] section now looks like this:++ [remote \"webappmachine\"]+ url = xmpp::login@server+ fetch = +refs/heads/*:refs/remotes/webappmachine/*+ annex-uuid = aaaaaaaa-bbbb-cccc-dddddddddddd++where aaaaaaaa-bbbb-cccc-dddddddddddd is the return value of `git config --get annex.uuid` on the webapp machine.++I then run `git annex assistant` on the ARM machine and expect the two machines to synchronize their metadata, e.g. the number of knownn annex keys in the repo. But it doesn't happen.++So I set `debug = true`, restart the assistants and check the log. This is what I get on the webapp machine:++ [2013-09-24 17:45:41 EDT] XMPPClient: connected a5/25577ac4-3248-4c83-8391-bd93708bcf2b+ [2013-09-24 17:45:41 EDT] XMPPClient: received: [\"Presence from a5/dc9bcde8-fe18-47de-807c-c620019279f2 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \\"query\\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \\"\\"])], elementNodes = []})\",\"QueryPresence\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Presence from a5/900e3b6e-a7f4-4a6a-8d12-ed94de429258 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \\"push\\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \\"43357474-abbb-4667-a334-e4615ea6d4a2\\"])], elementNodes = []})\",\"NotifyPush [UUID \\"43357474-abbb-4667-a334-e4615ea6d4a2\\"]\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: push notification for+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"symbolic-ref\",\"HEAD\"]+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"refs/heads/master\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Pushing \\"a59\\" (CanPush (UUID \\"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\\") [34f875cc7fa1198414f93990af9ab78e6cee893e,6fad42234060361435d6cf2ab4bd40e438c2d05c])\"]+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"git-annex\"]+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"log\",\"refs/heads/git-annex..6fad42234060361435d6cf2ab4bd40e438c2d05c\",\"--oneline\",\"-n1\"]+ [2013-09-24 17:45:42 EDT] chat: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"cat-file\",\"--batch\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Ignorable Presence from a5/25577ac4-3248-4c83-8391-bd93708bcf2b Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Unknown message\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Pushing \\"a59\\" (PushRequest (UUID \\"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\\"))\"]+ [2013-09-24 17:45:42 EDT] XMPPSendPack: started running push Pushing \"a59\" (PushRequest (UUID \"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\"))+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"symbolic-ref\",\"HEAD\"]+ [2013-09-24 17:45:42 EDT] XMPPClient: received: [\"Ignorable Presence from a5/25577ac4-3248-4c83-8391-bd93708bcf2b Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"]+ [2013-09-24 17:45:42 EDT] read: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"show-ref\",\"refs/heads/master\"]+ [2013-09-24 17:45:42 EDT] call: git [\"--git-dir=/home/pi/test/.git\",\"--work-tree=/home/pi/test\",\"branch\",\"-f\",\"synced/master\"]+ [2013-09-24 17:45:42 EDT] XMPPSendPack: finished running push Pushing \"a59\" (PushRequest (UUID \"d50c4cc9-e7c0-4ef0-84c6-f11012051eb9\")) False++And from then on, in two-minute intervals:++ [2013-09-24 17:47:42 EDT] XMPPClient: received: [\"Unknown message\"]+ [2013-09-24 17:49:42 EDT] XMPPClient: received: [\"Unknown message\"]+ [2013-09-24 17:51:42 EDT] XMPPClient: received: [\"Unknown message\"]+ +The log on the ARM machine is rather unhelpful. Actually it doesn't even contain the string \"XMPP\". This looks to me like the webapp machine tries to communicate via Jabber but doesn't get any intelligible answer. And this is the reason I wondered whether the problem lies with my self-compiled ARM git-annex binary. I actually spent a while compiling 4.20130909 with all flags but webapp and webdav, but the result is still the same. ++Any other ideas what I'm doing wrong here?+"""]]
+ doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.152.108.220"+ subject="comment 6"+ date="2013-09-25T18:13:24Z"+ content="""+If you're not getting an \"XMPPClient: connected\", then my guess would be that your git-annex build's XMPP is screwed up somehow. For example, if it hung forever when connecting to the XMPP server, it would never get as far as printing that message. (If it tried and failed to connect, you'd get a message about the connection having failed.)+"""]]
+ doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="RaspberryPie"+ ip="46.165.221.166"+ subject="comment 7"+ date="2013-09-26T03:46:18Z"+ content="""+I see. Is there a way to check whether the build is corrupt? The build logs gave me nothing. ++Anyway, XMPP is not the most important feature to me. It still bugs me though that it doesn't work when it should. +"""]]
+ doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U"+ nickname="Carlo"+ subject="comment 8"+ date="2013-10-22T14:30:58Z"+ content="""+Same setup, same problem... no log output on raspberry pi.+"""]]
+ doc/special_remotes/xmpp/comment_9_eda76b826491c96b1ce072aacf9d3adf._comment view
@@ -0,0 +1,23 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlu-fdXIt_RF9ggvg4zP0yBbtjWQwHAMS4"+ nickname="Jörn"+ subject="Same problem, no XMPP showing up in daemon.log"+ date="2013-11-21T21:13:16Z"+ content="""+I have the same setup like @RaspberryPie, except that my server is not running on the Pi but on Debian7-amd64. On my client (OSX, self-compiled using cabal) I can see XMPP log entries like @RaspberryPi, however, on the Debian7 machine (also self-compiled) I do not see any XMPP entry in the daemon.log. Setup regarding .git/annex/creds/xmpp and the special xmpp remote is correct (checked a thousand times).++Do you have any idea what could be wrong, Joey? Thanks a lot.++Output of git annex version:++ git-annex version: 5.20131120+ build flags: Assistant Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+ remote types: git gcrypt S3 bup directory rsync web webdav glacier hook+ local repository version: 4+ default repository version: 3+ supported repository versions: 3 5+ upgrade supported from repository versions: 0 1 2 4++Jörn+"""]]
+ doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://me.yahoo.com/a/2djv2EYwk43rfJIAQXjYt_vfuOU-#a11a6"+ nickname="Olivier R"+ subject="It doesn't work 100%"+ date="2012-05-03T21:42:54Z"+ content="""+When you remove tracked files... it doesn't show the new status. it's like if the file was ignored.+++"""]]
+ doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment view
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnxlx1UrzVhdy6_gFjzmF42x6QXxBUxg00"+ nickname="Jakukyo"+ subject="comment 2"+ date="2013-09-05T12:14:42Z"+ content="""+> There are two gotchas...++So just always run `git annex add` after editing a file+and `git update-index --really-refresh` after migrating+backend?++"""]]
doc/tips/recover_data_from_lost+found.mdwn view
@@ -14,6 +14,5 @@ The way that works is that when git-annex adds the same content that was in the repository before, all the old links to that content start working-again. This works particularly well if the SHA* backends are used, but even-with the default backend it will work pretty well, as long as fsck-preserved the modification time of the files.+again. So, this works as long as you're using one of the SHA* or other+checksumming backends, which is the default.
+ doc/tips/skydriveannex/comment_10_c3465b5587548dea56b80b32cd66d653._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4"+ nickname="Ovidiu"+ subject="Syncing not working :-/"+ date="2014-05-17T19:52:33Z"+ content="""+Error log says:++ git-annex-remote-skydrive is not installed in PATH (/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/Applications/git-annex.app/Contents/MacOS/bundle:/usr/bin:/bin:/usr/sbin:/sbin)++BUT I did a symlink, I even did 2 to 2 different locations that are in my path:++ cd /Users/ovi/skydriveannex/+ ln -sf `pwd`/git-annex-remote-skydrive /usr/bin/git-annex-remote-skydrive+ ln -sf `pwd`/git-annex-remote-skydrive /opt/local/bin/git-annex-remote-skydrive+"""]]
+ doc/tips/skydriveannex/comment_11_13692d8cb9ccf10ced26d90739385a6a._comment view
@@ -0,0 +1,47 @@+[[!comment format=mdwn+ username="ovidiu@66ace8a8d99ce938b0538ffa0f26d30db02a9626"+ nickname="ovidiu"+ subject="comment 11"+ date="2015-10-03T19:18:24Z"+ content="""+shiny:skydriveannex ovi$ git annex initremote skydrive type=external externaltype=skydrive encryption=shared folder=gitannex+initremote skydrive (encryption setup) (shared cipher) 21:14:20 [skydriveannex-0.2.1] <module> : 'Starting'+ 21:14:20 [skydriveannex-0.2.1] login : 'EXCEPTION api.auth_get_token:AuthenticationError(u\"Insufficient authentication data provided (missing keys: [u'code'])\",)'+osascript: OpenScripting.framework - scripting addition \"/Library/ScriptingAdditions/AeroFSFinderExtension.osax\" cannot be used with the current OS because it has no OSAXHandlers entry in its Info.plist.+git-annex: You need to set OAUTH environment variables and folder and encryption parameters when running initremote.++the folder gitannex was created on my onedrive but that is all.++Log files:+[2015-10-03 21:12:43.322605] main: Syncing with onedrive + 21:12:50 [skydriveannex-0.2.1] <module> : 'Starting'+ 21:12:5++9 [ sYkoyud rnieveeda ntnoe xs-e0t. 2O.A1U]T Hl oegnivni r:o n'mEeXnCtE PvTaIrOiNa balpeis. aauntdh _fgoeltd_etro kaennd: PernoctroycpotliEornr opra(r4a0m0e,t e'r4s0 0f oCrl itehnet rEermrootre:. +Bad Request')'+[2015-10-03 21:13:07.435901] main: Syncing with onedrive +++ You need to set OAUTH environment variables and folder and encryption parameters for the remote.+[2015-10-03 21:15:14.60821] main: Syncing with onedrive +++ You need to set OAUTH environment variables and folder and encryption parameters for the remote.+[2015-10-03 21:15:57.926083] main: starting assistant version 5.20150929-g7010007+(scanning...) [2015-10-03 21:15:58.506776] Watcher: Performing startup scan+(started...) gpg: Signature made Wed Sep 30 20:45:53 2015 CEST using DSA key ID 89C809CB+gpg: /var/folders/m6/zkd11n111m38ff37zbtgq0lr0000gp/T/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from \"git-annex distribution signing key (for Joey Hess) <id@joeyh.name>\"+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+ 21:16:01 [skydriveannex-0.2.1] <module> : 'Starting'+ 21:16:++01 [Ysokuy dnreievde atnon esxe-t0 .O2A.U1T]H leongviinr o:n m'eEnXtC EvPaTrIiOaNb laepsi .aanudt hf_ogledte_rt oaknedn :ePnrcortyopctoiloEnr rpoarr(a4m0e0t,e r's4 0f0o rC ltiheen tr eEmrortoer.:+ Bad Request')'+[2015-10-03 21:16:34.655604] main: Syncing with onedrive +++ You need to set OAUTH environment variables and folder and encryption parameters for the remote.+"""]]
+ doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnoUOqs_lbuWyZBqyU6unHgUduJwDDgiKY"+ nickname="Matt"+ subject="ANNEX_S3 vs AWS for keys"+ date="2012-05-29T12:24:25Z"+ content="""+The instructions state ANNEX_S3_ACCESS_KEY_ID and ANNEX_SECRET_ACCESS_KEY but git-annex cannot connect with those constants. git-annex tells me to set both \"AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY\" instead, which works. This is with Xubuntu 12.04.+"""]]
+ doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.81.112"+ subject="comment 2"+ date="2012-05-29T19:10:42Z"+ content="""+Thanks, I've fixed that. (You could have too.. this is a wiki ;)+"""]]
+ doc/tips/using_Amazon_S3/comment_3_32acba030c2ad252e2f7027075e4303e._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="annexuser"+ ip="64.71.7.82"+ subject="Altering AWS credentials"+ date="2014-04-15T21:59:43Z"+ content="""+If I revoke old AWS credentials and create new ones, how would I inform git-annex of the change to `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`?+"""]]
+ doc/tips/using_Amazon_S3/comment_4_92df5a9f923beafba55a1c455728112e._comment view
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.191"+ subject="comment 4"+ date="2014-04-17T19:44:55Z"+ content="""+You can use `git annex enableremote` to change an existing remote's configuration. So this should work:++ # export AWS_ACCESS_KEY_ID=\"newRANDOMGOBBLDEYGOOK\"+ # export AWS_SECRET_ACCESS_KEY=\"news3kr1t\"+ # git annex enableremote cloud++"""]]
+ doc/tips/using_Amazon_S3/comment_5_6b288e06010bedbb71e0afed6b427704._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkmN2ZZIdYNiFKmEH7rz4jMb6sYsx_dptA"+ nickname="Jack William"+ subject="What if you do not want to encrypt?"+ date="2014-09-07T18:35:19Z"+ content="""+Once use case for GIT with Amazon S3 is to maintain a web site on S3 you can easily update from a local machine. In that case you would not want to encrypt. Is encryption optional? This isn't clear from the instructions.+"""]]
+ doc/tips/using_Amazon_S3/comment_6_3b6c74b40ea666389ac04b52ab0819a0._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://schnouki.net/"+ nickname="Schnouki"+ subject="comment 6"+ date="2014-09-09T12:48:59Z"+ content="""+Jack, if you don't want to use encryption you can use `encryption=none` as documented [here](http://git-annex.branchable.com/special_remotes/S3/).++I'm not sure exactly what you're trying to do, but please note that you files won't be easily available on S3: they will be named as git-annex keys, with long and unreadable names such as \"SHA256E-s6311--c7533fdd259d872793b7298cbb56a1912e80c52a845661b0b9ff391c65ee2abc.html\" instead of \"index.html\".+"""]]
+ doc/tips/using_Amazon_S3/comment_7_cf6755d88463878f2ea6e4c300899027._comment view
@@ -0,0 +1,33 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmH7o6q2l99M-PQolOfbR3_i5B_jtTIcAE"+ nickname="Giovanni"+ subject="How to publish your files to the public"+ date="2014-09-13T15:29:18Z"+ content="""+I don't know if this is what Jack wanted, but you can upload your files to S3 and let them be accessible through a public URL.++First, go to (or create) the bucket you will use at [S3](https://console.aws.amazon.com/s3/) and add a public get policy to it:++```+ {+ \"Version\": \"2008-10-17\",+ \"Statement\": [+ {+ \"Sid\": \"AllowPublicRead\",+ \"Effect\": \"Allow\",+ \"Principal\": {+ \"AWS\": \"*\"+ },+ \"Action\": \"s3:GetObject\",+ \"Resource\": \"arn:aws:s3:::BUCKETNAME/*\"+ }+ ]+ }+```++Then set up your special remote with the options `encryption=none`, `bucket='BUCKETNAME'` `chunk=0` (and any others you want).++Your files will be accessible through `http://BUCKETNAME.s3-website-LOCATION.amazonaws.com/KEY` where location is the one specified through the options `datacenter` and KEY is the SHA-SOMETHING hash of the file, created by git annex and accessible if you run `git annex lookupkey FILEPATH`.++This way you can share a link to each file you have at your S3 remote.+"""]]
+ doc/tips/using_Amazon_S3/comment_8_4f9c2f6627f8ed3423bcc8b7bf2f76cb._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkPIqJZ88VZEVqLhLOd1LMdYXcy6bAW9qE"+ nickname="Lemao"+ subject="comment 8"+ date="2015-01-07T13:54:23Z"+ content="""+I use github as my central git repository and I would like to use S3 to store large files with annex. Since the s3 remote in .git/config is not stored in github, how do I make sure I reconnect to the same s3 bucket in case I delete my local clone? Reinitializing the remote will create a completely new bucket.++I would also be a good idea to centralize git-annex folders inside a single bucket so I keep the global namespace under control and can narrow down the permissioning.+"""]]
+ doc/tips/using_Amazon_S3/comment_9_47e4ea77d0262d332d86a06d7aaeddd8._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ subject="comment 9"+ date="2015-01-07T17:25:43Z"+ content="""+Lemao, make sure you have pushed your git-annex branch to your central git repository.++When you clone that repo elsewhere, you can add the S3 remote by running `git annex enableremote cloud` (replace \"cloud\" with whatever name you originally picked when you used `git annex initremote` to set up the S3 remote in the first place.++git-annex stores the necessary configuration of the S3 remote on the git-annex branch.+"""]]
+ doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn view
@@ -0,0 +1,9 @@+### Please describe the problem.+Instead of storing config for each remote in ~/.ssh/config, which mixes the user own config with that of git-annex-assistant, which is irritating if (like me) you store your ssh config in a vcs. Since the option -F allows the choice of the config file, it should be possible to move the config into ~/.ssh/git-annex/config. The only issue I see is according to the ssh man page on my system states that the system-wide config is ignored if a config file is specified on the command line.++### What version of git-annex are you using? On what operating system?+I'm using git-annex 4.20130601 on a Debian Testing/Unstable/Experimental mix.++[[!tag design/assistant]]++[[wontfix]]
+ doc/todo/S3_fsck_support/comment_1_9317598723ea38ae9432ad50e0de666d._comment view
@@ -0,0 +1,26 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 1"""+ date="2015-06-16T17:50:56Z"+ content="""+You're incorrect; `git-annex fsck --from remote` works to fsck *any*+remote. For remotes like S3, it has to download the content to check it+locally, which is why `remoteFsck` is not provided.++Since you passed -f (--fast) to fsck, it avoids checksuming the content,+so avoids downloading it, and only verifies that S3 still says it has+the content. As documented on the git-annex fsck man page.++AFAICS, the Content-MD5 is only used by S3 to check that the data uploaded+to S3 didn't get corrupted over the wire. I assume that S3 implements its+own checksums to detect when data already stored on it gets corrupted, so+it seems redundant and complicating for git-annex to query it for md5sums.+It would work just as well for git-annex to verify a key after downloading+it, using the key's own hash, per [[todo/ checksum verification on transfer]].++It **might** be worth filling in the `poContentMD5` field with the md5 of+the file when uploading it to S3. Of course, this requires hashing the file+locally. And when storing an encrypted object on S3, it would require+buffering the whole encrypted object to disk first, in order to hash it+(but that's currently done anyway).+"""]]
+ doc/todo/S3_fsck_support/comment_2_7a1ce64d362b8f75adf22709771a7787._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="anarcat"+ subject="comment 2"+ date="2015-06-16T20:10:50Z"+ content="""+understood: i thought `-f` was `--from`... hence my confusion.++as for `remoteFsck`, i guess what i am saying is exactly that: there *does* seem to be a way to do a remote checksum of the file *without* downloading it. it seems to be a critical advantage over having to download the whole repository to check it... maybe `--fast` could use that technique and `non--fast` would download?++as for the on-wire MD5 stuff, that does seem to be overkill...+"""]]
+ doc/todo/S3_fsck_support/comment_3_2b96f61188b2ada729a284e95fc89dab._comment view
@@ -0,0 +1,21 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 3"""+ date="2015-07-02T16:43:03Z"+ content="""+Not knowing how S3's backend is implemented, I have to assume that, in+order to get the advertised number of 9's of reliability, it involves some+replication of data, as well as some method to detect if a bit has flipped+or a drive has died, and recover.++This is requesting that git-annex ask S3 for a md5sum, and compare it+against a md5sum that it, presumably, keeps track of locally. If the two+are different, git-annex could tell that S3 has lost data. But, git-annex is+in a much worse position to tell if S3 has lost data then S3 itself is.+It seems very unlikely that this extra checking would ever detect a problem+that S3 didn't itself detect and fix (or in the 0.00001% case, +fail to fix and delete the lost file?)++Bit flips during transfer seem more likely than that. `poContentMD5` could+help guard against those.+"""]]
+ doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn view
@@ -0,0 +1,7 @@+There are times when it is handy to be able to upload a file to a web host somewhere and share a link for that file to a select few people.++It seems to be that the assistant could handle this scenario. It could generate a directory with a random name on the remote, and transfer the file there (using the existing filename) and the appropriate URL could be displayed in the assistant webapp to allow the user to copy the URL to send it to the appropriate people.++Note: Joey and I had a quick chat about this use case at LCA2013.++[[!tag design/assistant]]
+ doc/todo/What_if_the_active_annex__39__ed_files_were_not_symlinks__63__.mdwn view
@@ -0,0 +1,26 @@+So annex is super cool and all. But there is one really annoying thing about it. The symlinks disrupt workflow really horribly! For example if I have a .psd file that is annex'd and I open that file in photoshop, edit it, then try to save it again. It doesn't allow me, because the actual file is the one deep in the annex sub structure that is read only. There a bunch of other annoyances like this. But you basically can't work with annex'd files without some additional struggle.++But there is a solution to this. Just don't symlink the files that are active. I think potentially the simplest way to do this is to have a 'annex' and 'unannex' command. Or rather, a 'create symlink' and 'uncreate symlink' command. ++So then you can be going along, doing your work, nothing in your directory symlinked.++You then type you 'annex symlink' command all priorly annexed filed will be deleted and replaced with their symlinks.++Then you can add your new files to annex. Adding new files will just automatically symlink them unless you put like a -ns or something to signify to not symlink them.++With all priorly annexed filed symlinked and all your new files symlinked, you then git commit and push.++Then you do a git annex unsymlink command. And then all your symlinks are deleted and the actual file placed there.++Then you just type git annex symlink again to re-symlink them all.++> I think you are looking for the `unlock` and `add` (or `lock`) commands. Basically, to edit the file in photoshop, you want:+>+> <pre>+> git annex unlock file.psd+> photoshop file.psd # ...+> git annex add file.psd # if you are happy with your changes or...+> git annex lock file.psd # if you want to discard your changes+> </pre>+>+> So basically what you are asking for is already [[done]], in my mind. I still think there are significant [[usability issues|forum/usability:_what_are_those_arrow_things__63__/]] with symlinks, but that's another story. --[[anarcat]]
+ doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"+ nickname="Richard"+ subject="comment 1"+ date="2011-05-17T07:27:02Z"+ content="""+Sounds like a good idea.++* git annex fsck (or similar) should check/rebuild the caches+* I would simply require a clean tree with a verbose error. 80/20 rule and defaulting to save actions.+"""]]
+ doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.172"+ subject="comment 1"+ date="2014-02-21T21:36:14Z"+ content="""+This really depends on the remote, some can resume where they were interrupted, such as rsync, and some cannot, such as glacier (and, er, encrypted rsync).+"""]]
+ doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://grossmeier.net/"+ nickname="greg"+ subject="very remote specific"+ date="2014-02-21T22:11:16Z"+ content="""+Yeah, this is very remote specific and probably means adding the functionality there as well (eg: in the glacier.py code, not only in git-annex haskell). Maybe I should file bugs there accordingly :)+"""]]
+ doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.172"+ subject="comment 3"+ date="2014-02-21T22:34:14Z"+ content="""+Hmm, I forget if it's possible for git-annex to mask SIGINT when it runs glacier or rsync, so that the child process does not receive it, but the parent git-annex does.+"""]]
+ doc/todo/git_annex_grep/comment_1_890b3ecb679b941f9c0075ed360b203e._comment view
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="CandyAngel"+ subject="comment 1"+ date="2015-06-04T12:31:32Z"+ content="""+You can do this:++ git annex find --in here | grep+"""]]
+ doc/todo/git_annex_open/comment_1_67d90a1cb104d98e816354d96e1b0306._comment view
@@ -0,0 +1,21 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 1"""+ date="2014-11-10T17:11:52Z"+ content="""+Hmm, well, there have been requests for access to files as they're being+get-ed before. This does have the advantage of providing that,+but I don't know if I like trying in xdg-open, which might not always+be the way a user wants to open a file.++git-annex does have progress info available while a file is being+transferred. (If nothing else, it tends to know the key size, and can+see the file size.) However I don't know how it could tell if "enough"+of the file was available to stream it.++I guess what I'd be most comfortable with is putting in plumbing.+Like making `examinekey` be able to report the temporary file+that is used when a key is being downloaded. It might also make sense to+have a bit of plumbing that waits for a file being downloaded to get+to X% complete, or something.+"""]]
+ doc/todo/git_annex_push/comment_1_54c5494ec21621298b3111cd7c2325b1._comment view
@@ -0,0 +1,19 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 1"""+ date="2015-08-04T20:19:22Z"+ content="""+`git annex sync --content` does what you want, only it also does a pull and+a merge from remotes.++I don't know that wanting to only push, w/o pull and merge, is common+enough to make a separate command for it.++There's also the problem that to push the git-annex branch, it really+makes sense to first pull/merge from the remote. Otherwise, the push+is not likely to work as well. And too, it makes sense to update the+git-annex branch from remotes in order to know what files that have, so+that info can be better used to decide which files to send to them --+especially when preferred content might make some file not be sent to all+remotes, depending on which other remotes contain the file.+"""]]
+ doc/todo/git_annex_push/comment_2_67938223c42c2a81dbfd32cd8a6a39c2._comment view
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="https://me.yahoo.com/a/EbvxpTI_xP9Aod7Mg4cwGhgjrCrdM5s-#7c0f4"+ subject="comment 2"+ date="2015-08-09T03:04:31Z"+ content="""+ indeed pull/merge ( ie sync) would often be needed. but the same in regular git workflow - we can't push if remote has new changes. so we know that we need to \" git pull\" ( or alternative merge dance). my whining here is pretty much about dichotomy between regular git command and accompanying annex commands for simple typical workflows - i need to educate people much more beyond \" in your typical use case, when you all collaborate on this repo, just use git annex add to place big files under annex control, and then git annex push to push all your changes\". then if annex push checked first that push of annex branch can't happen and that annex merge is due, and let user know to run it first - they will do, and things will remain clear. now there is a lot of annex uniquely named commands which do not \" correlate\" with git ones even for simple use cases, which makes adoption harder imho.+"""]]
+ doc/todo/git_annex_push/comment_3_ccb822eeb9b0d60f811568e4f27f970a._comment view
@@ -0,0 +1,19 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 3"""+ date="2015-08-11T17:37:05Z"+ content="""+I tend to be uncomfortable with wrapping many git commands into git-annex+commands with the same name. All the regular git commands can be used+in a git-annex repository, and I don't want to get users thinking they need+to look for git-annex commands instead when the git commands work perfectly+well.++`git annex copy` is fundamentally different than `git push`, so the user+needs to learn about the complication of needing to copy the contents+around separately. Perhaps even copying content to different (special)+remotes than where git pushes to. `git annex sync --content` is there for+users who want to keep two repos in sync and don't want to be concerned with the details.+`git annex push` would seem to be for users who want to know about the details,+but not all of them. Seems like a losing and/or confusing choice.+"""]]
doc/todo/make_addurl_respect_annex.largefiles_option.mdwn view
@@ -1,3 +1,4 @@ ATM git annex addurl ignores annex.largefiles option so to automate annexification or direct add to git for a list of files I need manually to download each one of them into a FILE and then "git annex add -c annex.largefiles='exclude=*.txt' FILE". But it would have been convenient if I could "addurl" some files directly from urls directly into git, as per largefiles settings. N.B. I do understand that use-case might be somewhat vague, let me know if I should expand reasoning+[[!meta author=yoh]]
+ doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="206.74.132.139"+ subject="comment 1"+ date="2014-02-06T17:26:58Z"+ content="""+I would be quite happy if someone took care of adding git-annex to openwrt.++I don't have time to personally handle packaging for different linux distributions myself. What I could do is add mips builds of git-annex to the existing standalone linux builds. These would need to be built the same way the arm builds are done, using a Debian chroot and qemu to run tools from it. This is rather a lot of work for me to set up, and I don't know if I'd have to do it for both little and big endian mips.++Also, it seems that Debian does not currently have a working haskell toolchain for mips. Which may well mean that ghc is not in a working state on mips at all.+"""]]
+ doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment view
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkNE-H4vEcbcGndxq5daT8qUb7yIf7r1OE"+ nickname="Łukasz"+ subject="comment 2"+ date="2014-02-11T21:05:00Z"+ content="""+if debian does not have working toolchain for mips then there is no way to port it into mips machines.+am i correct ?+"""]]
+ doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="209.250.56.172"+ subject="comment 3"+ date="2014-02-11T21:39:34Z"+ content="""+Actually, debian stable does still have ghc building for mips/mipsel. It's just newer versions that have failed to build and nobody has fixed it yet.+"""]]
+ doc/todo/openwrt_package/comment_4_132e67b34f9c616217e037e4ecac70a4._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 4"""+ date="2015-01-13T20:39:53Z"+ content="""+I checked, and the current status is that mips and mipsel in Debian have+up-to-date builds of ghc and git-annex.+"""]]
doc/todo/parallel_get.mdwn view
@@ -79,3 +79,5 @@ >> `git annex get -JN` works now, but lacks any progress display. >> Waiting on some updates to ascii-progress. --[[Joey]]++>>> Wrote concurrent-output; [[done]] --[[Joey]]
+ doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog"+ nickname="Michael"+ subject="comment 1"+ date="2013-03-01T01:26:36Z"+ content="""+This would indeed be very helpful when remotely mounting a photo/video collection over samba.+"""]]
+ doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment view
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="http://edheil.wordpress.com/"+ ip="173.162.44.162"+ subject="comment 2"+ date="2013-03-01T04:50:28Z"+ content="""++1 this would be sweet as hell++"""]]
+ doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://ypid.wordpress.com/"+ nickname="ypid"+ subject="Please add this ;)"+ date="2014-03-13T19:10:17Z"+ content="""++1 This would be so great. For me the only thing which is missing in this awesome project.+"""]]
+ doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkRITTYYsN0TFKN7G5sZ6BWGZOTQ88Pz4s"+ nickname="Zoltán"+ subject="cygwin"+ date="2012-05-15T00:14:08Z"+ content="""+What about [Cygwin](http://cygwin.com/)? It emulates POSIX fairly well under Windows (including signals, forking, fs (also things like /dev/null, /proc), unix file permissions), has all standard gnu utilities. It also emulates symlinks, but they are unfortunately incompatible with NTFS symlinks introduced in Vista [due to some stupid restrictions on Windows](http://cygwin.com/ml/cygwin/2009-10/msg00756.html).++If git-annex could be modified to not require symlinks to work, the it would be a pretty neat solution (and you get a real shell, not some command.com on drugs (aka cmd.exe))+"""]]
+ doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawk5cj-itfFHq_yhJHdzk3QOPp-PNW_MjPU"+ nickname="Michael"+ subject="+1 Cygwin"+ date="2012-05-23T19:30:21Z"+ content="""+Windows support is a must. In my experience, binary file means proprietary editor, which means Windows.++Unfortunately, there's not much overlap between people who use graphical editors in Windows all day vs. people who are willing to tolerate Cygwin's setup.exe, compile a Haskell program, learn git and git-annex's 90-odd subcommands, and use a mintty terminal to manage their repository, especially now that there's a sexy GitHub app for Windows.++That aside, I think Windows-based content producers are still *the* audience for git-annex. First Windows support, then a GUI, then the world.+"""]]
+ doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://xolus.net/openid/max"+ nickname="B0FH"+ subject="What about NTFS support ?"+ date="2012-08-02T17:45:10Z"+ content="""+Has git-annex been tested with an NTFS-formatted disk under Linux ? NTFS is supposed to be case-sensitive and to allow symlinks, and these are supposed to work with ntfs3g.+"""]]
+ doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlc1og3PqIGudOMkFNrCCNg66vB7s-jLpc"+ nickname="Paul"+ subject="Re: What about NTFS support?"+ date="2012-08-16T19:30:38Z"+ content="""+I successfully use git-annex on an NTFS formatted external USB drive, so yes, it is possible and works well.+"""]]
+ doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://me.yahoo.com/a/dASECLNzvckz4VwqUGYsvthiplY.#d2c27"+ nickname="A. D. Sicks"+ subject="comment 5"+ date="2012-09-09T23:48:21Z"+ content="""+Haskell has C++ binding, so it should be possible to port it to .net/Mono with a VB GUI for Windows users. Windows has a primitive form of symlinks called shortcuts. Perhaps shortcut support in Windows could replace the use of symlinks. I've used shortcuts since XP to put my home Windows directory on another partition and never had a hitch...++If anyone is interested in working on this, hit me up. I would like to use this in my XP vbox to have access to files on my host OS...I have a student edition of Visual Studio 2005 to do an open source port...+"""]]
+ doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnlwEMhiNYv__mEUABW4scn83yMraC3hqE"+ nickname="Sean"+ subject="NTFS symlinks"+ date="2013-01-11T21:44:21Z"+ content="""+It seems that NTFS (from Vista forward) has full POSIX support for symlinks. At least, Wikipedia [seems to think so.](http://en.wikipedia.org/wiki/NTFS_symbolic_link). What about doing like GitHub and using MinGW for compatibility? Cygwin absolutely blows in terms of installation size and compatability with the rest of Windows.+"""]]
+ doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlpSOjMH7Iaz56v6Pr9KCFSpbvMXvg-y9o"+ nickname="Dominik"+ subject="So close :-)"+ date="2013-06-30T12:46:40Z"+ content="""+I was fighting my way forward until I read here that special remote with ssh+rsync and encryption doesn't work. Interestingly I got everything working so far, ssh login is keybased, gpg -k works and the remote setup also correctly cooperated with gpg... but it just didn't sync. Any ideas how complex it is to get this last missing piece moving?+"""]]
+ doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.4.193"+ subject="comment 8"+ date="2013-06-30T17:58:08Z"+ content="""+It should be easy to fix whatever's wrong the the rsync special remote. Just a matter of debugging that.++Adding encryption support on Windows is stuck at a roadblock I don't know the way around. To drive gpg, git-annex uses the `--passphrase-fd` option, and sends the \"passphrase\" (really a big block of binary foo!) over a file descriptor of a pipe that it set up.++Windows, AFAIK, doesn't have file descriptors, or at least there is no equivilant to them that I have access to in the Haskell POSIX compatability layer for Windows. I am reluctant to fall back to using `--passphrase-file` on Windows, since that would be a massive security hole (as would passing the passphrase as a parameter via `--passphrase=`).+"""]]
+ doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlpSOjMH7Iaz56v6Pr9KCFSpbvMXvg-y9o"+ nickname="Dominik"+ subject="comment 9"+ date="2013-07-31T10:29:51Z"+ content="""+The tradeoff for me is a \"local\" security hole (where I can secure my own laptop) vs. a remotely exploitable thing... If it needs to go through a file, so be it -- it would however be good if that file would be overwritten with garbage before being deleted :-)+"""]]
+ doc/users/yoh.mdwn view
@@ -0,0 +1,23 @@+My todos+========++[[!inline pages="todo/* and !todo/done and !link(todo/done) and+author(yoh)" sort=mtime feeds=no actions=yes archive=yes show=0]]++Done+----++[[!inline pages="todo/* and !todo/done and link(todo/done) and+author(yoh)" feeds=no actions=yes archive=yes show=0]]++My bugs+=======++[[!inline pages="bugs/* and !bugs/done and !link(bugs/done) and+author(yoh)" sort=mtime feeds=no actions=yes archive=yes show=0 template=buglist]]++Fixed+-----++[[!inline pages="bugs/* and !bugs/done and link(bugs/done) and+author(yoh)" feeds=no actions=yes archive=yes show=0 template=buglist]]
+ doc/walkthrough/backups/comment_1_d0244791d2abbf29553546a6a6568a0f._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="madduck"+ ip="2001:a60:f0fb:0:224:d7ff:fe04:c82c"+ subject="Warn while inconsistent"+ date="2014-04-06T20:44:17Z"+ content="""+Sure, git-annex prevents me from dropping files unless there are numcopies around elsewhere, but shouldn't it also ensure that numcopies cannot be set unless that requirement is already met?++Furthermore, shouldn't it ensure that when new files are added, they are automatically distributed to fulfill the requirement?+"""]]
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 5.20151102.1+Version: 5.20151116 Cabal-Version: >= 1.8 License: GPL-3 Maintainer: Joey Hess <id@joeyh.name>@@ -93,9 +93,8 @@ Flag TorrentParser Description: Use haskell torrent library to parse torrent files -Flag AsciiProgress- Description: Use ascii-progress library (experimental)- Default: False+Flag ConcurrentOutput+ Description: Use concurrent-output library Flag EKG Description: Enable use of EKG to monitor git-annex as it runs (at http://localhost:4242/)@@ -128,7 +127,7 @@ utf8-string, bytestring, text, sandi, json, monad-control, transformers, bloomfilter, edit-distance,- resourcet, http-conduit, http-types,+ resourcet, http-conduit, http-client, http-types, time, old-locale CC-Options: -Wall GHC-Options: -Wall -fno-warn-tabs@@ -179,11 +178,11 @@ Build-Depends: regex-compat if flag(S3)- Build-Depends: conduit, conduit-extra, aws (>= 0.9.2), http-client+ Build-Depends: conduit, conduit-extra, aws (>= 0.9.2) CPP-Options: -DWITH_S3 if flag(WebDAV)- Build-Depends: DAV (>= 1.0), http-client+ Build-Depends: DAV (>= 1.0) CPP-Options: -DWITH_WEBDAV if flag(Assistant) && ! os(solaris)@@ -278,9 +277,9 @@ Build-Depends: esqueleto, persistent-sqlite, persistent, persistent-template CPP-Options: -DWITH_DATABASE - if flag(AsciiProgress)- Build-Depends: ascii-progress (<= 0.2.1.2), terminal-size- CPP-Options: -DWITH_ASCIIPROGRESS+ if flag(ConcurrentOutput)+ Build-Depends: concurrent-output (>= 1.6)+ CPP-Options: -DWITH_CONCURRENTOUTPUT if flag(EKG) Build-Depends: ekg
man/git-annex-add.1 view
@@ -37,6 +37,10 @@ .IP For example: \fB\-\-largerthan=1GB\fP .IP+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"+Adds multiple files in parallel. This may be faster.+For example: \fB\-J4\fP +.IP .SH SEE ALSO git-annex(1) .PP
man/git-annex-addurl.1 view
@@ -57,6 +57,10 @@ Use to adjust the filenames that are created by addurl. For example, \fB\-\-suffix=.mp3\fP can be used to add an extension to the file. .IP+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"+Enables parallel downloads when multiple urls are being added.+For example: \fB\-J4\fP +.IP .SH SEE ALSO git-annex(1) .PP
man/git-annex-drop.1 view
@@ -46,6 +46,11 @@ The git-annex\-matching\-options(1) can be used to specify files to drop. .IP+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"+Runs multiple drop jobs in parallel. This is particularly useful+when git-annex has to contact remotes to check if it can drop files.+For example: \fB\-J4\fP +.IP .SH SEE ALSO git-annex(1) .PP
man/git-annex-fsck.1 view
@@ -73,6 +73,9 @@ The git-annex\-matching\-options(1) can be used to specify files to fsck. .IP+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"+Runs multiple fsck jobs in parallel. For example: \fB\-J4\fP+.IP .SH OPTIONS .SH SEE ALSO git-annex(1)
man/git-annex-import.1 view
@@ -58,6 +58,10 @@ .IP git annex import /dir \-\-include='*.png' .IP+.IP "\fB\-\-jobs=N\fP \fB\-JN\fP"+Imports multiple files in parallel. This may be faster.+For example: \fB\-J4\fP +.IP .SH CAVEATS Note that using \fB\-\-deduplicate\fP or \fB\-\-clean\-duplicates\fP with the WORM backend does not look at file content, but filename and mtime.
man/git-annex.1 view
@@ -830,6 +830,30 @@ which does not support symbolic links, or hard links, or unix permissions. This is automatically probed by "git annex init". .IP+.IP "\fBannex.pidlock\fP"+Normally, git-annex uses fine\-grained lock files to allow multiple+processes to run concurrently without getting in each others' way.+That works great, unless you are using git-annex on a filesystem that+does not support POSIX fcntl locks. This is sometimes the case when+using NFS or Lustre filesystems. +.IP+To support such situations, you can set annex.pidlock to true, and it+will fall back to a single top\-level pid file lock.+.IP+Although, often, you'd really be better off fixing your networked+filesystem configuration to support POSIX locks.. And, some networked+filesystems are so inconsistent that one node can't reliably tell when+the other node is holding a pid lock. Caveat emptor.+.IP+.IP "\fBannex.pidlocktimeout\fP"+When using pid lock files, it's possible for a stale lock file to get+left behind by previous run of git-annex that crashed or was interrupted.+This is mostly avoided, but can occur especially when using a network+file system.+.IP+git-annex will wait up to this many seconds for the pid lock+file to go away, and will then abort if it cannot continue. Default: 300+.IP .IP "\fBremote.<name>.annex\-cost\fP" When determining which repository to transfer annexed files from or to, ones with lower costs are preferred.
stack.yaml view
@@ -1,6 +1,6 @@ flags: git-annex:- asciiprogress: false+ concurrentoutput: true tahoe: true tdfa: true inotify: true
+ standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch view
@@ -0,0 +1,25 @@+From df0f41f92d003f7d59ef927737ffec3a9bd61827 Mon Sep 17 00:00:00 2001+From: Joey Hess <joey@kitenet.net>+Date: Tue, 7 May 2013 18:41:01 -0400+Subject: [PATCH] avoid cabal hell++---+ gsasl.cabal | 2 +-+ 1 file changed, 1 insertion(+), 1 deletion(-)++diff --git a/gsasl.cabal b/gsasl.cabal+index d991873..c5c2b19 100644+--- a/gsasl.cabal++++ b/gsasl.cabal+@@ -31,7 +31,7 @@ library+ build-depends:+ base >= 4.0 && < 5.0+ , transformers >= 0.2+- , bytestring >= 0.9++ , bytestring >= 0.10.3.0+ + pkgconfig-depends: libgsasl >= 1.1+ +-- +1.7.10.4+
+ standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch view
@@ -0,0 +1,135 @@+From e1a2f80f6bec25921ab645a0aaf1c6422a8917ab Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Mon, 11 Nov 2013 01:06:58 +0000+Subject: [PATCH] fix++---+ Network/Socks5/Command.hs | 8 +-------+ Network/Socks5/Conf.hs | 1 -+ Network/Socks5/Lowlevel.hs | 1 -+ Network/Socks5/Types.hs | 18 +-----------------+ Network/Socks5/Wire.hs | 2 --+ 5 files changed, 2 insertions(+), 28 deletions(-)++diff --git a/Network/Socks5/Command.hs b/Network/Socks5/Command.hs+index db95fbd..fdba5ec 100644+--- a/Network/Socks5/Command.hs++++ b/Network/Socks5/Command.hs+@@ -13,7 +13,6 @@ module Network.Socks5.Command+ , Connect(..)+ , Command(..)+ , connectIPV4+- , connectIPV6+ , connectDomainName+ -- * lowlevel interface+ , rpc+@@ -29,7 +28,7 @@ import qualified Data.ByteString as B+ import qualified Data.ByteString.Char8 as BC+ import Data.Serialize+ +-import Network.Socket (Socket, PortNumber, HostAddress, HostAddress6)++import Network.Socket (Socket, PortNumber, HostAddress)+ import Network.Socket.ByteString+ + import Network.Socks5.Types+@@ -65,11 +64,6 @@ connectIPV4 socket hostaddr port = onReply <$> rpc_ socket (Connect $ SocksAddre+ where onReply (SocksAddrIPV4 h, p) = (h, p)+ onReply _ = error "ipv4 requested, got something different"+ +-connectIPV6 :: Socket -> HostAddress6 -> PortNumber -> IO (HostAddress6, PortNumber)+-connectIPV6 socket hostaddr6 port = onReply <$> rpc_ socket (Connect $ SocksAddress (SocksAddrIPV6 hostaddr6) port)+- where onReply (SocksAddrIPV6 h, p) = (h, p)+- onReply _ = error "ipv6 requested, got something different"+-+ -- TODO: FQDN should only be ascii, maybe putting a "fqdn" data type+ -- in front to make sure and make the BC.pack safe.+ connectDomainName :: Socket -> String -> PortNumber -> IO (SocksHostAddress, PortNumber)+diff --git a/Network/Socks5/Conf.hs b/Network/Socks5/Conf.hs+index c29ff7b..007d382 100644+--- a/Network/Socks5/Conf.hs++++ b/Network/Socks5/Conf.hs+@@ -47,5 +47,4 @@ defaultSocksConfFromSockAddr sockaddr = SocksConf server SocksVer5+ where server = SocksAddress haddr port+ (haddr,port) = case sockaddr of+ SockAddrInet p h -> (SocksAddrIPV4 h, p)+- SockAddrInet6 p _ h _ -> (SocksAddrIPV6 h, p)+ _ -> error "unsupported unix sockaddr type"+diff --git a/Network/Socks5/Lowlevel.hs b/Network/Socks5/Lowlevel.hs+index c10d9b9..2c3d59c 100644+--- a/Network/Socks5/Lowlevel.hs++++ b/Network/Socks5/Lowlevel.hs+@@ -17,7 +17,6 @@ resolveToSockAddr :: SocksAddress -> IO SockAddr+ resolveToSockAddr (SocksAddress sockHostAddr port) =+ case sockHostAddr of+ SocksAddrIPV4 ha -> return $ SockAddrInet port ha+- SocksAddrIPV6 ha6 -> return $ SockAddrInet6 port 0 ha6 0+ SocksAddrDomainName bs -> do he <- getHostByName (BC.unpack bs)+ return $ SockAddrInet port (hostAddress he)+ +diff --git a/Network/Socks5/Types.hs b/Network/Socks5/Types.hs+index 7fbec25..17c7c83 100644+--- a/Network/Socks5/Types.hs++++ b/Network/Socks5/Types.hs+@@ -19,7 +19,7 @@ module Network.Socks5.Types+ import Data.ByteString (ByteString)+ import Data.Word+ import Data.Data+-import Network.Socket (HostAddress, HostAddress6, PortNumber)++import Network.Socket (HostAddress, PortNumber)+ import Control.Exception+ import qualified Data.ByteString.Char8 as BC+ import Numeric (showHex)+@@ -53,12 +53,10 @@ data SocksMethod =+ data SocksHostAddress =+ SocksAddrIPV4 !HostAddress+ | SocksAddrDomainName !ByteString+- | SocksAddrIPV6 !HostAddress6+ deriving (Eq,Ord)+ + instance Show SocksHostAddress where+ show (SocksAddrIPV4 ha) = "SocksAddrIPV4(" ++ showHostAddress ha ++ ")"+- show (SocksAddrIPV6 ha6) = "SocksAddrIPV6(" ++ showHostAddress6 ha6 ++ ")"+ show (SocksAddrDomainName dn) = "SocksAddrDomainName(" ++ BC.unpack dn ++ ")"+ + -- | Converts a HostAddress to a String in dot-decimal notation+@@ -69,20 +67,6 @@ showHostAddress num = concat [show q1, ".", show q2, ".", show q3, ".", show q4]+ (num''',q3) = num'' `quotRem` 256+ (_,q4) = num''' `quotRem` 256+ +--- | Converts a IPv6 HostAddress6 to standard hex notation+-showHostAddress6 :: HostAddress6 -> String+-showHostAddress6 (a,b,c,d) =+- (concat . intersperse ":" . map (flip showHex ""))+- [p1,p2,p3,p4,p5,p6,p7,p8]+- where (a',p2) = a `quotRem` 65536+- (_,p1) = a' `quotRem` 65536+- (b',p4) = b `quotRem` 65536+- (_,p3) = b' `quotRem` 65536+- (c',p6) = c `quotRem` 65536+- (_,p5) = c' `quotRem` 65536+- (d',p8) = d `quotRem` 65536+- (_,p7) = d' `quotRem` 65536+-+ -- | Describe a Socket address on the SOCKS protocol+ data SocksAddress = SocksAddress !SocksHostAddress !PortNumber+ deriving (Show,Eq,Ord)+diff --git a/Network/Socks5/Wire.hs b/Network/Socks5/Wire.hs+index 10bd262..a30f32e 100644+--- a/Network/Socks5/Wire.hs++++ b/Network/Socks5/Wire.hs+@@ -46,12 +46,10 @@ data SocksResponse = SocksResponse+ + getAddr 1 = SocksAddrIPV4 <$> getWord32host+ getAddr 3 = SocksAddrDomainName <$> (getWord8 >>= getByteString . fromIntegral)+-getAddr 4 = SocksAddrIPV6 <$> (liftM4 (,,,) getWord32host getWord32host getWord32host getWord32host)+ getAddr n = error ("cannot get unknown socket address type: " ++ show n)+ + putAddr (SocksAddrIPV4 h) = putWord8 1 >> putWord32host h+ putAddr (SocksAddrDomainName b) = putWord8 3 >> putWord8 (fromIntegral $ B.length b) >> putByteString b+-putAddr (SocksAddrIPV6 (a,b,c,d)) = putWord8 4 >> mapM_ putWord32host [a,b,c,d]+ + getSocksRequest 5 = do+ cmd <- toEnum . fromIntegral <$> getWord8+-- +1.7.10.4+
+ standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png view
binary file changed (absent → 1310 bytes)
+ standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png view
binary file changed (absent → 682 bytes)
+ standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png view
binary file changed (absent → 946 bytes)
+ standalone/android/tmp/network-2.4.1.2/LICENSE view
@@ -0,0 +1,29 @@+Copyright (c) 2002-2010, The University Court of the University of Glasgow.+Copyright (c) 2007-2010, Johan Tibell++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++- Redistributions of source code must retain the above copyright notice,+this list of conditions and the following disclaimer.++- Redistributions in binary form must reproduce the above copyright notice,+this list of conditions and the following disclaimer in the documentation+and/or other materials provided with the distribution.++- Neither name of the University nor the names of its contributors may be+used to endorse or promote products derived from this software without+specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY COURT OF THE UNIVERSITY OF+GLASGOW AND THE CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE+UNIVERSITY COURT OF THE UNIVERSITY OF GLASGOW OR THE CONTRIBUTORS BE LIABLE+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH+DAMAGE.
+ standalone/android/tmp/network-2.4.1.2/Network.hs view
@@ -0,0 +1,473 @@+{-# LANGUAGE CPP #-}+-----------------------------------------------------------------------------+-- |+-- Module : Network+-- Copyright : (c) The University of Glasgow 2001+-- License : BSD-style (see the file libraries/network/LICENSE)+-- +-- Maintainer : libraries@haskell.org+-- Stability : provisional+-- Portability : portable+--+-- The "Network" interface is a \"higher-level\" interface to+-- networking facilities, and it is recommended unless you need the+-- lower-level interface in "Network.Socket".+--+-----------------------------------------------------------------------------++#include "HsNetworkConfig.h"++#ifdef HAVE_GETADDRINFO+-- Use IPv6-capable function definitions if the OS supports it.+#define IPV6_SOCKET_SUPPORT 1+#endif++module Network+ (+ -- * Basic data types+ Socket+ , PortID(..)+ , HostName+ , PortNumber++ -- * Initialisation+ , withSocketsDo+ + -- * Server-side connections+ , listenOn+ , accept+ , sClose++ -- * Client-side connections+ , connectTo++ -- * Simple sending and receiving+ {-$sendrecv-}+ , sendTo+ , recvFrom++ -- * Miscellaneous+ , socketPort++ -- * Networking Issues+ -- ** Buffering+ {-$buffering-}++ -- ** Improving I\/O Performance over sockets+ {-$performance-}++ -- ** @SIGPIPE@+ {-$sigpipe-}+ ) where++import Control.Monad (liftM)+import Data.Maybe (fromJust)+import Network.BSD+import Network.Socket hiding (accept, socketPort, recvFrom, sendTo, PortNumber)+import qualified Network.Socket as Socket (accept)+import System.IO+import Prelude+import qualified Control.Exception as Exception++-- ---------------------------------------------------------------------------+-- High Level ``Setup'' functions++-- If the @PortID@ specifies a unix family socket and the @Hostname@+-- differs from that returned by @getHostname@ then an error is+-- raised. Alternatively an empty string may be given to @connectTo@+-- signalling that the current hostname applies.++data PortID = + Service String -- Service Name eg "ftp"+ | PortNumber PortNumber -- User defined Port Number+#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)+ | UnixSocket String -- Unix family socket in file system+#endif+ deriving (Show, Eq)++-- | Calling 'connectTo' creates a client side socket which is+-- connected to the given host and port. The Protocol and socket type is+-- derived from the given port identifier. If a port number is given+-- then the result is always an internet family 'Stream' socket. ++connectTo :: HostName -- Hostname+ -> PortID -- Port Identifier+ -> IO Handle -- Connected Socket++#if defined(IPV6_SOCKET_SUPPORT)+-- IPv6 and IPv4.++connectTo hostname (Service serv) = connect' hostname serv++connectTo hostname (PortNumber port) = connect' hostname (show port)+#else+-- IPv4 only.++connectTo hostname (Service serv) = do+ proto <- getProtocolNumber "tcp"+ bracketOnError+ (socket AF_INET Stream proto)+ (sClose) -- only done if there's an error+ (\sock -> do+ port <- getServicePortNumber serv+ he <- getHostByName hostname+ connect sock (SockAddrInet port (hostAddress he))+ socketToHandle sock ReadWriteMode+ )++connectTo hostname (PortNumber port) = do+ proto <- getProtocolNumber "tcp"+ bracketOnError+ (socket AF_INET Stream proto)+ (sClose) -- only done if there's an error+ (\sock -> do+ he <- getHostByName hostname+ connect sock (SockAddrInet port (hostAddress he))+ socketToHandle sock ReadWriteMode+ )+#endif++#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)+connectTo _ (UnixSocket path) = do+ bracketOnError+ (socket AF_UNIX Stream 0)+ (sClose)+ (\sock -> do+ connect sock (SockAddrUnix path)+ socketToHandle sock ReadWriteMode+ )+#endif++#if defined(IPV6_SOCKET_SUPPORT)+connect' :: HostName -> ServiceName -> IO Handle++connect' host serv = do+ proto <- getProtocolNumber "tcp"+ let hints = defaultHints { addrFlags = [AI_ADDRCONFIG]+ , addrProtocol = proto+ , addrSocketType = Stream }+ addrs <- getAddrInfo (Just hints) (Just host) (Just serv)+ firstSuccessful $ map tryToConnect addrs+ where+ tryToConnect addr =+ bracketOnError+ (socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr))+ (sClose) -- only done if there's an error+ (\sock -> do+ connect sock (addrAddress addr)+ socketToHandle sock ReadWriteMode+ )+#endif++-- | Creates the server side socket which has been bound to the+-- specified port.+--+-- 'maxListenQueue' (typically 128) is specified to the listen queue.+-- This is good enough for normal network servers but is too small+-- for high performance servers.+--+-- To avoid the \"Address already in use\" problems,+-- the 'ReuseAddr' socket option is set on the listening socket.+--+-- If available, the 'IPv6Only' socket option is set to 0+-- so that both IPv4 and IPv6 can be accepted with this socket.+--+-- If you don't like the behavior above, please use the lower level+-- 'Network.Socket.listen' instead.++listenOn :: PortID -- ^ Port Identifier+ -> IO Socket -- ^ Listening Socket++#if defined(IPV6_SOCKET_SUPPORT)+-- IPv6 and IPv4.++listenOn (Service serv) = listen' serv++listenOn (PortNumber port) = listen' (show port)+#else+-- IPv4 only.++listenOn (Service serv) = do+ proto <- getProtocolNumber "tcp"+ bracketOnError+ (socket AF_INET Stream proto)+ (sClose)+ (\sock -> do+ port <- getServicePortNumber serv+ setSocketOption sock ReuseAddr 1+ bindSocket sock (SockAddrInet port iNADDR_ANY)+ listen sock maxListenQueue+ return sock+ )++listenOn (PortNumber port) = do+ proto <- getProtocolNumber "tcp"+ bracketOnError+ (socket AF_INET Stream proto)+ (sClose)+ (\sock -> do+ setSocketOption sock ReuseAddr 1+ bindSocket sock (SockAddrInet port iNADDR_ANY)+ listen sock maxListenQueue+ return sock+ )+#endif++#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)+listenOn (UnixSocket path) =+ bracketOnError+ (socket AF_UNIX Stream 0)+ (sClose)+ (\sock -> do+ setSocketOption sock ReuseAddr 1+ bindSocket sock (SockAddrUnix path)+ listen sock maxListenQueue+ return sock+ )+#endif++#if defined(IPV6_SOCKET_SUPPORT)+listen' :: ServiceName -> IO Socket++listen' serv = do+ proto <- getProtocolNumber "tcp"+ -- We should probably specify addrFamily = AF_INET6 and the filter+ -- code below should be removed. AI_ADDRCONFIG is probably not+ -- necessary. But this code is well-tested. So, let's keep it.+ let hints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_PASSIVE]+ , addrSocketType = Stream+ , addrProtocol = proto }+ addrs <- getAddrInfo (Just hints) Nothing (Just serv)+ -- Choose an IPv6 socket if exists. This ensures the socket can+ -- handle both IPv4 and IPv6 if v6only is false.+ let addrs' = filter (\x -> addrFamily x == AF_INET6) addrs+ addr = if null addrs' then head addrs else head addrs'+ bracketOnError+ (socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr))+ (sClose)+ (\sock -> do+ setSocketOption sock ReuseAddr 1+ bindSocket sock (addrAddress addr)+ listen sock maxListenQueue+ return sock+ )+#endif++-- -----------------------------------------------------------------------------+-- accept++-- | Accept a connection on a socket created by 'listenOn'. Normal+-- I\/O operations (see "System.IO") can be used on the 'Handle'+-- returned to communicate with the client.+-- Notice that although you can pass any Socket to Network.accept,+-- only sockets of either AF_UNIX, AF_INET, or AF_INET6 will work+-- (this shouldn't be a problem, though). When using AF_UNIX, HostName+-- will be set to the path of the socket and PortNumber to -1.+--+accept :: Socket -- ^ Listening Socket+ -> IO (Handle,+ HostName,+ PortNumber) -- ^ Triple of: read\/write 'Handle' for + -- communicating with the client,+ -- the 'HostName' of the peer socket, and+ -- the 'PortNumber' of the remote connection.+accept sock@(MkSocket _ AF_INET _ _ _) = do+ ~(sock', (SockAddrInet port haddr)) <- Socket.accept sock+ peer <- catchIO+ (do + (HostEntry peer _ _ _) <- getHostByAddr AF_INET haddr+ return peer+ )+ (\_e -> inet_ntoa haddr)+ -- if getHostByName fails, we fall back to the IP address+ handle <- socketToHandle sock' ReadWriteMode+ return (handle, peer, port)+#if defined(IPV6_SOCKET_SUPPORT)+accept sock@(MkSocket _ AF_INET6 _ _ _) = do+ (sock', addr) <- Socket.accept sock+ peer <- catchIO ((fromJust . fst) `liftM` getNameInfo [] True False addr) $+ \_ -> case addr of+ SockAddrInet _ a -> inet_ntoa a+ SockAddrInet6 _ _ a _ -> return (show a)+# if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)+ SockAddrUnix a -> return a+# endif+ handle <- socketToHandle sock' ReadWriteMode+ let port = case addr of+ SockAddrInet p _ -> p+ SockAddrInet6 p _ _ _ -> p+ _ -> -1+ return (handle, peer, port)+#endif+#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)+accept sock@(MkSocket _ AF_UNIX _ _ _) = do+ ~(sock', (SockAddrUnix path)) <- Socket.accept sock+ handle <- socketToHandle sock' ReadWriteMode+ return (handle, path, -1)+#endif+accept (MkSocket _ family _ _ _) =+ error $ "Sorry, address family " ++ (show family) ++ " is not supported!"++-- -----------------------------------------------------------------------------+-- sendTo/recvFrom++{-$sendrecv+Send and receive data from\/to the given host and port number. These+should normally only be used where the socket will not be required for+further calls. Also, note that due to the use of 'hGetContents' in 'recvFrom'+the socket will remain open (i.e. not available) even if the function already+returned. Their use is strongly discouraged except for small test-applications+or invocations from the command line.+-}++sendTo :: HostName -- Hostname+ -> PortID -- Port Number+ -> String -- Message to send+ -> IO ()+sendTo h p msg = do+ s <- connectTo h p+ hPutStr s msg+ hClose s++recvFrom :: HostName -- Hostname+ -> PortID -- Port Number+ -> IO String -- Received Data++#if defined(IPV6_SOCKET_SUPPORT)+recvFrom host port = do+ proto <- getProtocolNumber "tcp"+ let hints = defaultHints { addrFlags = [AI_ADDRCONFIG]+ , addrProtocol = proto+ , addrSocketType = Stream }+ allowed <- map addrAddress `liftM` getAddrInfo (Just hints) (Just host)+ Nothing+ s <- listenOn port+ let waiting = do+ (s', addr) <- Socket.accept s+ if not (addr `oneOf` allowed)+ then sClose s' >> waiting+ else socketToHandle s' ReadMode >>= hGetContents+ waiting+ where+ a@(SockAddrInet _ ha) `oneOf` ((SockAddrInet _ hb):bs)+ | ha == hb = True+ | otherwise = a `oneOf` bs+ a@(SockAddrInet6 _ _ ha _) `oneOf` ((SockAddrInet6 _ _ hb _):bs)+ | ha == hb = True+ | otherwise = a `oneOf` bs+ _ `oneOf` _ = False+#else+recvFrom host port = do+ ip <- getHostByName host+ let ipHs = hostAddresses ip+ s <- listenOn port+ let + waiting = do+ ~(s', SockAddrInet _ haddr) <- Socket.accept s+ he <- getHostByAddr AF_INET haddr+ if not (any (`elem` ipHs) (hostAddresses he))+ then do+ sClose s'+ waiting+ else do+ h <- socketToHandle s' ReadMode+ msg <- hGetContents h+ return msg++ message <- waiting+ return message+#endif++-- ---------------------------------------------------------------------------+-- Access function returning the port type/id of socket.++-- | Returns the 'PortID' associated with a given socket.+socketPort :: Socket -> IO PortID+socketPort s = do+ sockaddr <- getSocketName s+ return (portID sockaddr)+ where+ portID sa =+ case sa of+ SockAddrInet port _ -> PortNumber port+#if defined(IPV6_SOCKET_SUPPORT)+ SockAddrInet6 port _ _ _ -> PortNumber port+#endif+#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)+ SockAddrUnix path -> UnixSocket path+#endif++-- ---------------------------------------------------------------------------+-- Utils++-- Like bracket, but only performs the final action if there was an +-- exception raised by the middle bit.+bracketOnError+ :: IO a -- ^ computation to run first (\"acquire resource\")+ -> (a -> IO b) -- ^ computation to run last (\"release resource\")+ -> (a -> IO c) -- ^ computation to run in-between+ -> IO c -- returns the value from the in-between computation+#if __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ < 606+bracketOnError before after thing =+ Exception.block (do+ a <- before+ r <- Exception.catch+ (Exception.unblock (thing a))+ (\e -> do { after a; Exception.throw e })+ return r+ )+#else+bracketOnError = Exception.bracketOnError+#endif++-----------------------------------------------------------------------------+-- Extra documentation++{-$buffering++The 'Handle' returned by 'connectTo' and 'accept' is block-buffered by+default. For an interactive application you may want to set the+buffering mode on the 'Handle' to+'LineBuffering' or 'NoBuffering', like so:++> h <- connectTo host port+> hSetBuffering h LineBuffering+-}++{-$performance++For really fast I\/O, it might be worth looking at the 'hGetBuf' and+'hPutBuf' family of functions in "System.IO".+-}++{-$sigpipe++On Unix, when writing to a socket and the reading end is+closed by the remote client, the program is normally sent a+@SIGPIPE@ signal by the operating system. The+default behaviour when a @SIGPIPE@ is received is+to terminate the program silently, which can be somewhat confusing+if you haven't encountered this before. The solution is to+specify that @SIGPIPE@ is to be ignored, using+the POSIX library:++> import Posix+> main = do installHandler sigPIPE Ignore Nothing; ...+-}++catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a+#if MIN_VERSION_base(4,0,0)+catchIO = Exception.catch+#else+catchIO = Exception.catchJust Exception.ioErrors+#endif++-- Returns the first action from a list which does not throw an exception.+-- If all the actions throw exceptions (and the list of actions is not empty),+-- the last exception is thrown.+firstSuccessful :: [IO a] -> IO a+firstSuccessful [] = error "firstSuccessful: empty list"+firstSuccessful (p:ps) = catchIO p $ \e ->+ case ps of+ [] -> Exception.throwIO e+ _ -> firstSuccessful ps
+ standalone/android/tmp/network-2.4.1.2/Network/BSD.hsc view
@@ -0,0 +1,489 @@+{-# LANGUAGE CPP, ForeignFunctionInterface #-}+-----------------------------------------------------------------------------+-- |+-- Module : Network.BSD+-- Copyright : (c) The University of Glasgow 2001+-- License : BSD-style (see the file libraries/network/LICENSE)+-- +-- Maintainer : libraries@haskell.org+-- Stability : experimental+-- Portability : non-portable+--+-- The "Network.BSD" module defines Haskell bindings to network+-- programming functionality provided by BSD Unix derivatives.+--+-----------------------------------------------------------------------------++#include "HsNet.h"++-- NOTE: ##, we want this interpreted when compiling the .hs, not by hsc2hs.+##include "Typeable.h"++module Network.BSD+ (+ -- * Host names+ HostName+ , getHostName++ , HostEntry(..)+ , getHostByName+ , getHostByAddr+ , hostAddress++ -- * Service names+ , ServiceEntry(..)+ , ServiceName+ , getServiceByName+ , getServiceByPort+ , getServicePortNumber++#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)+ , getServiceEntries++ -- ** Low level functionality+ , getServiceEntry+ , setServiceEntry+ , endServiceEntry+#endif++ -- * Protocol names+ , ProtocolName+ , ProtocolNumber+ , ProtocolEntry(..)+ , getProtocolByName+ , getProtocolByNumber+ , getProtocolNumber+ , defaultProtocol++ -- * Port numbers+ , PortNumber++ -- * Network names+ , NetworkName+ , NetworkAddr+ , NetworkEntry(..)++#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)+ , getNetworkByName+ , getNetworkByAddr+ -- ** Low level functionality+#endif+ ) where++import Network.Socket++import Control.Concurrent (MVar, newMVar, withMVar)+import qualified Control.Exception as E+import Foreign.C.String (CString, peekCString, withCString)+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)+import Foreign.C.Types ( CShort )+#endif+#if __GLASGOW_HASKELL__ >= 703+import Foreign.C.Types ( CInt(..), CULong(..), CSize(..) )+#else+import Foreign.C.Types ( CInt, CULong, CSize )+#endif+import Foreign.Ptr (Ptr, nullPtr)+import Foreign.Storable (Storable(..))+import Foreign.Marshal.Array (allocaArray0, peekArray0)+import Foreign.Marshal.Utils (with, fromBool)+import Data.Typeable+import System.IO.Error (ioeSetErrorString, mkIOError)+import System.IO.Unsafe (unsafePerformIO)++#if __GLASGOW_HASKELL__ >= 611+import GHC.IO.Exception+#else+import GHC.IOBase+#endif++import Control.Monad (liftM)++import Network.Socket.Internal (throwSocketErrorIfMinus1_)++-- ---------------------------------------------------------------------------+-- Basic Types++type ProtocolName = String++-- ---------------------------------------------------------------------------+-- Service Database Access++-- Calling getServiceByName for a given service and protocol returns+-- the systems service entry. This should be used to find the port+-- numbers for standard protocols such as SMTP and FTP. The remaining+-- three functions should be used for browsing the service database+-- sequentially.++-- Calling setServiceEntry with True indicates that the service+-- database should be left open between calls to getServiceEntry. To+-- close the database a call to endServiceEntry is required. This+-- database file is usually stored in the file /etc/services.++data ServiceEntry = + ServiceEntry {+ serviceName :: ServiceName, -- Official Name+ serviceAliases :: [ServiceName], -- aliases+ servicePort :: PortNumber, -- Port Number ( network byte order )+ serviceProtocol :: ProtocolName -- Protocol+ } deriving (Show, Typeable)++instance Storable ServiceEntry where+ sizeOf _ = #const sizeof(struct servent)+ alignment _ = alignment (undefined :: CInt) -- ???++ peek p = do+ s_name <- (#peek struct servent, s_name) p >>= peekCString+ s_aliases <- (#peek struct servent, s_aliases) p+ >>= peekArray0 nullPtr+ >>= mapM peekCString+ s_port <- (#peek struct servent, s_port) p+ s_proto <- (#peek struct servent, s_proto) p >>= peekCString+ return (ServiceEntry {+ serviceName = s_name,+ serviceAliases = s_aliases,+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)+ servicePort = PortNum (fromIntegral (s_port :: CShort)),+#else+ -- s_port is already in network byte order, but it+ -- might be the wrong size.+ servicePort = PortNum (fromIntegral (s_port :: CInt)),+#endif+ serviceProtocol = s_proto+ })++ poke _p = error "Storable.poke(BSD.ServiceEntry) not implemented"+++-- | Get service by name.+getServiceByName :: ServiceName -- Service Name+ -> ProtocolName -- Protocol Name+ -> IO ServiceEntry -- Service Entry+getServiceByName name proto = withLock $ do+ withCString name $ \ cstr_name -> do+ withCString proto $ \ cstr_proto -> do+ throwNoSuchThingIfNull "getServiceByName" "no such service entry"+ $ (trySysCall (c_getservbyname cstr_name cstr_proto))+ >>= peek++foreign import CALLCONV unsafe "getservbyname" + c_getservbyname :: CString -> CString -> IO (Ptr ServiceEntry)++-- | Get the service given a 'PortNumber' and 'ProtocolName'.+getServiceByPort :: PortNumber -> ProtocolName -> IO ServiceEntry+getServiceByPort (PortNum port) proto = withLock $ do+ withCString proto $ \ cstr_proto -> do+ throwNoSuchThingIfNull "getServiceByPort" "no such service entry"+ $ (trySysCall (c_getservbyport (fromIntegral port) cstr_proto))+ >>= peek++foreign import CALLCONV unsafe "getservbyport" + c_getservbyport :: CInt -> CString -> IO (Ptr ServiceEntry)++-- | Get the 'PortNumber' corresponding to the 'ServiceName'.+getServicePortNumber :: ServiceName -> IO PortNumber+getServicePortNumber name = do+ (ServiceEntry _ _ port _) <- getServiceByName name "tcp"+ return port++#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)+getServiceEntry :: IO ServiceEntry+getServiceEntry = withLock $ do+ throwNoSuchThingIfNull "getServiceEntry" "no such service entry"+ $ trySysCall c_getservent+ >>= peek++foreign import ccall unsafe "getservent" c_getservent :: IO (Ptr ServiceEntry)++setServiceEntry :: Bool -> IO ()+setServiceEntry flg = withLock $ trySysCall $ c_setservent (fromBool flg)++foreign import ccall unsafe "setservent" c_setservent :: CInt -> IO ()++endServiceEntry :: IO ()+endServiceEntry = withLock $ trySysCall $ c_endservent++foreign import ccall unsafe "endservent" c_endservent :: IO ()++getServiceEntries :: Bool -> IO [ServiceEntry]+getServiceEntries stayOpen = do+ setServiceEntry stayOpen+ getEntries (getServiceEntry) (endServiceEntry)+#endif++-- ---------------------------------------------------------------------------+-- Protocol Entries++-- The following relate directly to the corresponding UNIX C+-- calls for returning the protocol entries. The protocol entry is+-- represented by the Haskell type ProtocolEntry.++-- As for setServiceEntry above, calling setProtocolEntry.+-- determines whether or not the protocol database file, usually+-- @/etc/protocols@, is to be kept open between calls of+-- getProtocolEntry. Similarly, ++data ProtocolEntry = + ProtocolEntry {+ protoName :: ProtocolName, -- Official Name+ protoAliases :: [ProtocolName], -- aliases+ protoNumber :: ProtocolNumber -- Protocol Number+ } deriving (Read, Show, Typeable)++instance Storable ProtocolEntry where+ sizeOf _ = #const sizeof(struct protoent)+ alignment _ = alignment (undefined :: CInt) -- ???++ peek p = do+ p_name <- (#peek struct protoent, p_name) p >>= peekCString+ p_aliases <- (#peek struct protoent, p_aliases) p+ >>= peekArray0 nullPtr+ >>= mapM peekCString+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)+ -- With WinSock, the protocol number is only a short;+ -- hoist it in as such, but represent it on the Haskell side+ -- as a CInt.+ p_proto_short <- (#peek struct protoent, p_proto) p + let p_proto = fromIntegral (p_proto_short :: CShort)+#else+ p_proto <- (#peek struct protoent, p_proto) p +#endif+ return (ProtocolEntry { + protoName = p_name,+ protoAliases = p_aliases,+ protoNumber = p_proto+ })++ poke _p = error "Storable.poke(BSD.ProtocolEntry) not implemented"++getProtocolByName :: ProtocolName -> IO ProtocolEntry+getProtocolByName "tcp" = return $+ ProtocolEntry {protoName = "tcp", protoAliases = ["TCP"], protoNumber = 6}+getProtocolByName "udp" = return $+ ProtocolEntry {protoName = "udp", protoAliases = ["UDP"], protoNumber = 17}+getProtocolByName name = withLock $ do+ withCString name $ \ name_cstr -> do+ throwNoSuchThingIfNull "getProtocolByName" ("no such protocol name: " ++ name)+ $ (trySysCall.c_getprotobyname) name_cstr+ >>= peek++foreign import CALLCONV unsafe "getprotobyname" + c_getprotobyname :: CString -> IO (Ptr ProtocolEntry)+++getProtocolByNumber :: ProtocolNumber -> IO ProtocolEntry+getProtocolByNumber num = withLock $ do+ throwNoSuchThingIfNull "getProtocolByNumber" ("no such protocol number: " ++ show num)+ $ (trySysCall.c_getprotobynumber) (fromIntegral num)+ >>= peek++foreign import CALLCONV unsafe "getprotobynumber"+ c_getprotobynumber :: CInt -> IO (Ptr ProtocolEntry)+++getProtocolNumber :: ProtocolName -> IO ProtocolNumber+getProtocolNumber proto = do+ (ProtocolEntry _ _ num) <- getProtocolByName proto+ return num++-- ---------------------------------------------------------------------------+-- Host lookups++data HostEntry = + HostEntry {+ hostName :: HostName, -- Official Name+ hostAliases :: [HostName], -- aliases+ hostFamily :: Family, -- Host Type (currently AF_INET)+ hostAddresses :: [HostAddress] -- Set of Network Addresses (in network byte order)+ } deriving (Read, Show, Typeable)++instance Storable HostEntry where+ sizeOf _ = #const sizeof(struct hostent)+ alignment _ = alignment (undefined :: CInt) -- ???++ peek p = do+ h_name <- (#peek struct hostent, h_name) p >>= peekCString+ h_aliases <- (#peek struct hostent, h_aliases) p+ >>= peekArray0 nullPtr+ >>= mapM peekCString+ h_addrtype <- (#peek struct hostent, h_addrtype) p+ -- h_length <- (#peek struct hostent, h_length) p+ h_addr_list <- (#peek struct hostent, h_addr_list) p+ >>= peekArray0 nullPtr+ >>= mapM peek+ return (HostEntry {+ hostName = h_name,+ hostAliases = h_aliases,+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)+ hostFamily = unpackFamily (fromIntegral (h_addrtype :: CShort)),+#else+ hostFamily = unpackFamily h_addrtype,+#endif+ hostAddresses = h_addr_list+ })++ poke _p = error "Storable.poke(BSD.ServiceEntry) not implemented"+++-- convenience function:+hostAddress :: HostEntry -> HostAddress+hostAddress (HostEntry nm _ _ ls) =+ case ls of+ [] -> error ("BSD.hostAddress: empty network address list for " ++ nm)+ (x:_) -> x++-- getHostByName must use the same lock as the *hostent functions+-- may cause problems if called concurrently.++-- | Resolve a 'HostName' to IPv4 address.+getHostByName :: HostName -> IO HostEntry+getHostByName name = withLock $ do+ withCString name $ \ name_cstr -> do+ ent <- throwNoSuchThingIfNull "getHostByName" "no such host entry"+ $ trySysCall $ c_gethostbyname name_cstr+ peek ent++foreign import CALLCONV safe "gethostbyname" + c_gethostbyname :: CString -> IO (Ptr HostEntry)+++-- The locking of gethostbyaddr is similar to gethostbyname.+-- | Get a 'HostEntry' corresponding to the given address and family.+-- Note that only IPv4 is currently supported.+getHostByAddr :: Family -> HostAddress -> IO HostEntry+getHostByAddr family addr = do+ with addr $ \ ptr_addr -> withLock $ do+ throwNoSuchThingIfNull "getHostByAddr" "no such host entry"+ $ trySysCall $ c_gethostbyaddr ptr_addr (fromIntegral (sizeOf addr)) (packFamily family)+ >>= peek++foreign import CALLCONV safe "gethostbyaddr"+ c_gethostbyaddr :: Ptr HostAddress -> CInt -> CInt -> IO (Ptr HostEntry)++-- ---------------------------------------------------------------------------+-- Accessing network information++-- Same set of access functions as for accessing host,protocol and+-- service system info, this time for the types of networks supported.++-- network addresses are represented in host byte order.+type NetworkAddr = CULong++type NetworkName = String++data NetworkEntry =+ NetworkEntry {+ networkName :: NetworkName, -- official name+ networkAliases :: [NetworkName], -- aliases+ networkFamily :: Family, -- type+ networkAddress :: NetworkAddr+ } deriving (Read, Show, Typeable)++instance Storable NetworkEntry where+ sizeOf _ = #const sizeof(struct hostent)+ alignment _ = alignment (undefined :: CInt) -- ???++ peek p = do+ n_name <- (#peek struct netent, n_name) p >>= peekCString+ n_aliases <- (#peek struct netent, n_aliases) p+ >>= peekArray0 nullPtr+ >>= mapM peekCString+ n_addrtype <- (#peek struct netent, n_addrtype) p+ n_net <- (#peek struct netent, n_net) p+ return (NetworkEntry {+ networkName = n_name,+ networkAliases = n_aliases,+ networkFamily = unpackFamily (fromIntegral + (n_addrtype :: CInt)),+ networkAddress = n_net+ })++ poke _p = error "Storable.poke(BSD.NetEntry) not implemented"+++#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)+getNetworkByName :: NetworkName -> IO NetworkEntry+getNetworkByName name = withLock $ do+ withCString name $ \ name_cstr -> do+ throwNoSuchThingIfNull "getNetworkByName" "no such network entry"+ $ trySysCall $ c_getnetbyname name_cstr+ >>= peek++foreign import ccall unsafe "getnetbyname" + c_getnetbyname :: CString -> IO (Ptr NetworkEntry)++getNetworkByAddr :: NetworkAddr -> Family -> IO NetworkEntry+getNetworkByAddr addr family = withLock $ do+ throwNoSuchThingIfNull "getNetworkByAddr" "no such network entry"+ $ trySysCall $ c_getnetbyaddr addr (packFamily family)+ >>= peek++foreign import ccall unsafe "getnetbyaddr" + c_getnetbyaddr :: NetworkAddr -> CInt -> IO (Ptr NetworkEntry)++#endif++-- Mutex for name service lockdown++{-# NOINLINE lock #-}+lock :: MVar ()+lock = unsafePerformIO $ newMVar ()++withLock :: IO a -> IO a+withLock act = withMVar lock (\_ -> act)++-- ---------------------------------------------------------------------------+-- Miscellaneous Functions++-- | Calling getHostName returns the standard host name for the current+-- processor, as set at boot time.++getHostName :: IO HostName+getHostName = do+ let size = 256+ allocaArray0 size $ \ cstr -> do+ throwSocketErrorIfMinus1_ "getHostName" $ c_gethostname cstr (fromIntegral size)+ peekCString cstr++foreign import CALLCONV unsafe "gethostname" + c_gethostname :: CString -> CSize -> IO CInt++-- Helper function used by the exported functions that provides a+-- Haskellised view of the enumerator functions:++getEntries :: IO a -- read+ -> IO () -- at end+ -> IO [a]+getEntries getOne atEnd = loop+ where+ loop = do+ vv <- E.catch (liftM Just getOne)+ (\ e -> let _types = e :: IOException in return Nothing)+ case vv of+ Nothing -> return []+ Just v -> loop >>= \ vs -> atEnd >> return (v:vs)+++-- ---------------------------------------------------------------------------+-- Winsock only:+-- The BSD API networking calls made locally return NULL upon failure.+-- That failure may very well be due to WinSock not being initialised,+-- so if NULL is seen try init'ing and repeat the call.+#if !defined(mingw32_HOST_OS) && !defined(_WIN32)+trySysCall :: IO a -> IO a+trySysCall act = act+#else+trySysCall :: IO (Ptr a) -> IO (Ptr a)+trySysCall act = do+ ptr <- act+ if (ptr == nullPtr)+ then withSocketsDo act+ else return ptr+#endif++throwNoSuchThingIfNull :: String -> String -> IO (Ptr a) -> IO (Ptr a)+throwNoSuchThingIfNull loc desc act = do+ ptr <- act+ if (ptr == nullPtr)+ then ioError (ioeSetErrorString (mkIOError NoSuchThing loc Nothing Nothing) desc)+ else return ptr
+ standalone/android/tmp/network-2.4.1.2/Network/Socket.hsc view
@@ -0,0 +1,1663 @@+{-# LANGUAGE CPP, ScopedTypeVariables #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+-----------------------------------------------------------------------------+-- |+-- Module : Network.Socket+-- Copyright : (c) The University of Glasgow 2001+-- License : BSD-style (see the file libraries/network/LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : provisional+-- Portability : portable+--+-- The "Network.Socket" module is for when you want full control over+-- sockets. Essentially the entire C socket API is exposed through+-- this module; in general the operations follow the behaviour of the C+-- functions of the same name (consult your favourite Unix networking book).+--+-- A higher level interface to networking operations is provided+-- through the module "Network".+--+-----------------------------------------------------------------------------++#include "HsNet.h"++-- NOTE: ##, we want this interpreted when compiling the .hs, not by hsc2hs.+##include "Typeable.h"++-- In order to process this file, you need to have CALLCONV defined.++module Network.Socket+ (+ -- * Types+ Socket(..)+ , Family(..)+ , isSupportedFamily+ , SocketType(..)+ , isSupportedSocketType+ , SockAddr(..)+ , SocketStatus(..)+ , HostAddress+#if defined(IPV6_SOCKET_SUPPORTNO)+ , HostAddress6+ , FlowInfo+ , ScopeID+#endif+ , ShutdownCmd(..)+ , ProtocolNumber+ , defaultProtocol+ , PortNumber(..)+ -- PortNumber is used non-abstractly in Network.BSD. ToDo: remove+ -- this use and make the type abstract.++ -- * Address operations++ , HostName+ , ServiceName++#if defined(IPV6_SOCKET_SUPPORT) || 1+ , AddrInfo(..)++ , AddrInfoFlag(..)+ , addrInfoFlagImplemented++ , defaultHints++ , getAddrInfo++ , NameInfoFlag(..)++ , getNameInfo+#endif++ -- * Socket operations+ , socket+#if defined(DOMAIN_SOCKET_SUPPORT)+ , socketPair+#endif+ , connect+ , bind+ , listen+ , accept+ , getPeerName+ , getSocketName++#ifdef HAVE_STRUCT_UCRED+ -- get the credentials of our domain socket peer.+ , getPeerCred+#endif++ , socketPort++ , socketToHandle++ -- ** Sending and receiving data+ -- $sendrecv+ , sendTo+ , sendBufTo++ , recvFrom+ , recvBufFrom++ , send+ , recv+ , recvLen+ , sendBuf+ , recvBuf++ , inet_addr+ , inet_ntoa++ , shutdown+ , close++ -- ** Predicates on sockets+ , isConnected+ , isBound+ , isListening+ , isReadable+ , isWritable++ -- * Socket options+ , SocketOption(..)+ , isSupportedSocketOption+ , getSocketOption+ , setSocketOption++ -- * File descriptor transmission+#ifdef DOMAIN_SOCKET_SUPPORT+ , sendFd+ , recvFd++#endif++ -- * Special constants+ , aNY_PORT+ , iNADDR_ANY+#if defined(IPV6_SOCKET_SUPPORTNO)+ , iN6ADDR_ANY+#endif+ , sOMAXCONN+ , sOL_SOCKET+#ifdef SCM_RIGHTS+ , sCM_RIGHTS+#endif+ , maxListenQueue++ -- * Initialisation+ , withSocketsDo++ -- * Very low level operations+ -- in case you ever want to get at the underlying file descriptor..+ , fdSocket+ , mkSocket++ -- * Deprecated aliases+ -- $deprecated-aliases+ , bindSocket+ , sClose+ , sIsConnected+ , sIsBound+ , sIsListening+ , sIsReadable+ , sIsWritable++ -- * Internal++ -- | The following are exported ONLY for use in the BSD module and+ -- should not be used anywhere else.++ , packFamily+ , unpackFamily+ , packSocketType+ ) where++import Data.Bits+import Data.List (delete, foldl')+import Data.Maybe (fromMaybe, isJust)+import Data.Word (Word8, Word16, Word32)+import Foreign.Ptr (Ptr, castPtr, nullPtr)+import Foreign.Storable (Storable(..))+import Foreign.C.Error+import Foreign.C.String (CString, withCString, peekCString, peekCStringLen)+import Foreign.C.Types (CUInt, CChar)+#if __GLASGOW_HASKELL__ >= 703+import Foreign.C.Types (CInt(..), CSize(..))+#else+import Foreign.C.Types (CInt, CSize)+#endif+import Foreign.Marshal.Alloc ( alloca, allocaBytes )+import Foreign.Marshal.Array ( peekArray )+import Foreign.Marshal.Utils ( maybeWith, with )++import System.IO+import Control.Monad (liftM, when)+import Data.Ratio ((%))++import qualified Control.Exception as E+import Control.Concurrent.MVar+import Data.Typeable+import System.IO.Error++import GHC.Conc (threadWaitRead, threadWaitWrite)+##if MIN_VERSION_base(4,3,1)+import GHC.Conc (closeFdWith)+##endif+# if defined(mingw32_HOST_OS)+import GHC.Conc (asyncDoProc)+import Foreign (FunPtr)+# endif+# if __GLASGOW_HASKELL__ >= 611+import qualified GHC.IO.Device+import GHC.IO.Handle.FD+import GHC.IO.Exception+import GHC.IO+# else+import GHC.IOBase+import GHC.Handle+# endif+import qualified System.Posix.Internals++# if __GLASGOW_HASKELL__ >= 611+import GHC.IO.FD+#endif++import Network.Socket.Internal+import Network.Socket.Types++-- | Either a host name e.g., @\"haskell.org\"@ or a numeric host+-- address string consisting of a dotted decimal IPv4 address or an+-- IPv6 address e.g., @\"192.168.0.1\"@.+type HostName = String+type ServiceName = String++-- ----------------------------------------------------------------------------+-- On Windows, our sockets are not put in non-blocking mode (non-blocking+-- is not supported for regular file descriptors on Windows, and it would+-- be a pain to support it only for sockets). So there are two cases:+--+-- - the threaded RTS uses safe calls for socket operations to get+-- non-blocking I/O, just like the rest of the I/O library+--+-- - with the non-threaded RTS, only some operations on sockets will be+-- non-blocking. Reads and writes go through the normal async I/O+-- system. accept() uses asyncDoProc so is non-blocking. A handful+-- of others (recvFrom, sendFd, recvFd) will block all threads - if this+-- is a problem, -threaded is the workaround.+--+##if defined(mingw32_HOST_OS)+##define SAFE_ON_WIN safe+##else+##define SAFE_ON_WIN unsafe+##endif++-----------------------------------------------------------------------------+-- Socket types++#if __GLASGOW_HASKELL__ >= 611 && defined(mingw32_HOST_OS)+socket2FD (MkSocket fd _ _ _ _) =+ -- HACK, 1 means True+ FD{fdFD = fd,fdIsSocket_ = 1}+#endif++mkSocket :: CInt+ -> Family+ -> SocketType+ -> ProtocolNumber+ -> SocketStatus+ -> IO Socket+mkSocket fd fam sType pNum stat = do+ mStat <- newMVar stat+ return (MkSocket fd fam sType pNum mStat)+++fdSocket :: Socket -> CInt+fdSocket (MkSocket fd _ _ _ _) = fd++-- | This is the default protocol for a given service.+defaultProtocol :: ProtocolNumber+defaultProtocol = 0++-----------------------------------------------------------------------------+-- SockAddr++instance Show SockAddr where+#if defined(DOMAIN_SOCKET_SUPPORT)+ showsPrec _ (SockAddrUnix str) = showString str+#endif+ showsPrec _ (SockAddrInet port ha)+ = showString (unsafePerformIO (inet_ntoa ha))+ . showString ":"+ . shows port+#if defined(IPV6_SOCKET_SUPPORT)+ showsPrec _ addr@(SockAddrInet6 port _ _ _)+ = showChar '['+ . showString (unsafePerformIO $+ fst `liftM` getNameInfo [NI_NUMERICHOST] True False addr >>=+ maybe (fail "showsPrec: impossible internal error") return)+ . showString "]:"+ . shows port+#endif++-----------------------------------------------------------------------------+-- Connection Functions++-- In the following connection and binding primitives. The names of+-- the equivalent C functions have been preserved where possible. It+-- should be noted that some of these names used in the C library,+-- \tr{bind} in particular, have a different meaning to many Haskell+-- programmers and have thus been renamed by appending the prefix+-- Socket.++-- | Create a new socket using the given address family, socket type+-- and protocol number. The address family is usually 'AF_INET',+-- 'AF_INET6', or 'AF_UNIX'. The socket type is usually 'Stream' or+-- 'Datagram'. The protocol number is usually 'defaultProtocol'.+-- If 'AF_INET6' is used, the 'IPv6Only' socket option is set to 0+-- so that both IPv4 and IPv6 can be handled with one socket.+socket :: Family -- Family Name (usually AF_INET)+ -> SocketType -- Socket Type (usually Stream)+ -> ProtocolNumber -- Protocol Number (getProtocolByName to find value)+ -> IO Socket -- Unconnected Socket+socket family stype protocol = do+ c_stype <- packSocketTypeOrThrow "socket" stype+ fd <- throwSocketErrorIfMinus1Retry "socket" $+ c_socket (packFamily family) c_stype protocol+ setNonBlockIfNeeded fd+ socket_status <- newMVar NotConnected+ let sock = MkSocket fd family stype protocol socket_status+ return sock++-- | Build a pair of connected socket objects using the given address+-- family, socket type, and protocol number. Address family, socket+-- type, and protocol number are as for the 'socket' function above.+-- Availability: Unix.+#if defined(DOMAIN_SOCKET_SUPPORT)+socketPair :: Family -- Family Name (usually AF_INET or AF_INET6)+ -> SocketType -- Socket Type (usually Stream)+ -> ProtocolNumber -- Protocol Number+ -> IO (Socket, Socket) -- unnamed and connected.+socketPair family stype protocol = do+ allocaBytes (2 * sizeOf (1 :: CInt)) $ \ fdArr -> do+ c_stype <- packSocketTypeOrThrow "socketPair" stype+ _rc <- throwSocketErrorIfMinus1Retry "socketpair" $+ c_socketpair (packFamily family) c_stype protocol fdArr+ [fd1,fd2] <- peekArray 2 fdArr+ s1 <- mkNonBlockingSocket fd1+ s2 <- mkNonBlockingSocket fd2+ return (s1,s2)+ where+ mkNonBlockingSocket fd = do+ setNonBlockIfNeeded fd+ stat <- newMVar Connected+ return (MkSocket fd family stype protocol stat)++foreign import ccall unsafe "socketpair"+ c_socketpair :: CInt -> CInt -> CInt -> Ptr CInt -> IO CInt+#endif++-- | Set the socket to nonblocking, if applicable to this platform.+setNonBlockIfNeeded :: CInt -> IO ()+setNonBlockIfNeeded fd =+#if __GLASGOW_HASKELL__ < 611+ System.Posix.Internals.setNonBlockingFD fd+#else+ System.Posix.Internals.setNonBlockingFD fd True+#endif++-----------------------------------------------------------------------------+-- Binding a socket++-- | Bind the socket to an address. The socket must not already be+-- bound. The 'Family' passed to @bind@ must be the+-- same as that passed to 'socket'. If the special port number+-- 'aNY_PORT' is passed then the system assigns the next available+-- use port.+bind :: Socket -- Unconnected Socket+ -> SockAddr -- Address to Bind to+ -> IO ()+bind (MkSocket s _family _stype _protocol socketStatus) addr = do+ modifyMVar_ socketStatus $ \ status -> do+ if status /= NotConnected+ then+ ioError (userError ("bind: can't peform bind on socket in status " +++ show status))+ else do+ withSockAddr addr $ \p_addr sz -> do+ _status <- throwSocketErrorIfMinus1Retry "bind" $ c_bind s p_addr (fromIntegral sz)+ return Bound++-----------------------------------------------------------------------------+-- Connecting a socket++-- | Connect to a remote socket at address.+connect :: Socket -- Unconnected Socket+ -> SockAddr -- Socket address stuff+ -> IO ()+connect sock@(MkSocket s _family _stype _protocol socketStatus) addr = do+ modifyMVar_ socketStatus $ \currentStatus -> do+ if currentStatus /= NotConnected && currentStatus /= Bound+ then+ ioError (userError ("connect: can't peform connect on socket in status " +++ show currentStatus))+ else do+ withSockAddr addr $ \p_addr sz -> do++ let connectLoop = do+ r <- c_connect s p_addr (fromIntegral sz)+ if r == -1+ then do+#if !(defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS))+ err <- getErrno+ case () of+ _ | err == eINTR -> connectLoop+ _ | err == eINPROGRESS -> connectBlocked+-- _ | err == eAGAIN -> connectBlocked+ _otherwise -> throwSocketError "connect"+#else+ rc <- c_getLastError+ case rc of+ #{const WSANOTINITIALISED} -> do+ withSocketsDo (return ())+ r <- c_connect s p_addr (fromIntegral sz)+ if r == -1+ then throwSocketError "connect"+ else return r+ _ -> throwSocketError "connect"+#endif+ else return r++ connectBlocked = do+ threadWaitWrite (fromIntegral s)+ err <- getSocketOption sock SoError+ if (err == 0)+ then return 0+ else throwSocketErrorCode "connect" (fromIntegral err)++ connectLoop+ return Connected++-----------------------------------------------------------------------------+-- Listen++-- | Listen for connections made to the socket. The second argument+-- specifies the maximum number of queued connections and should be at+-- least 1; the maximum value is system-dependent (usually 5).+listen :: Socket -- Connected & Bound Socket+ -> Int -- Queue Length+ -> IO ()+listen (MkSocket s _family _stype _protocol socketStatus) backlog = do+ modifyMVar_ socketStatus $ \ status -> do+ if status /= Bound+ then+ ioError (userError ("listen: can't peform listen on socket in status " +++ show status))+ else do+ throwSocketErrorIfMinus1Retry "listen" (c_listen s (fromIntegral backlog))+ return Listening++-----------------------------------------------------------------------------+-- Accept+--+-- A call to `accept' only returns when data is available on the given+-- socket, unless the socket has been set to non-blocking. It will+-- return a new socket which should be used to read the incoming data and+-- should then be closed. Using the socket returned by `accept' allows+-- incoming requests to be queued on the original socket.++-- | Accept a connection. The socket must be bound to an address and+-- listening for connections. The return value is a pair @(conn,+-- address)@ where @conn@ is a new socket object usable to send and+-- receive data on the connection, and @address@ is the address bound+-- to the socket on the other end of the connection.+accept :: Socket -- Queue Socket+ -> IO (Socket, -- Readable Socket+ SockAddr) -- Peer details++accept sock@(MkSocket s family stype protocol status) = do+ currentStatus <- readMVar status+ okay <- isAcceptable sock+ if not okay+ then+ ioError (userError ("accept: can't perform accept on socket (" ++ (show (family,stype,protocol)) ++") in status " +++ show currentStatus))+ else do+ let sz = sizeOfSockAddrByFamily family+ allocaBytes sz $ \ sockaddr -> do+#if defined(mingw32_HOST_OS)+ new_sock <-+ if threaded+ then with (fromIntegral sz) $ \ ptr_len ->+ throwSocketErrorIfMinus1Retry "Network.Socket.accept" $+ c_accept_safe s sockaddr ptr_len+ else do+ paramData <- c_newAcceptParams s (fromIntegral sz) sockaddr+ rc <- asyncDoProc c_acceptDoProc paramData+ new_sock <- c_acceptNewSock paramData+ c_free paramData+ when (rc /= 0) $+ throwSocketErrorCode "Network.Socket.accept" (fromIntegral rc)+ return new_sock+#else+ with (fromIntegral sz) $ \ ptr_len -> do+ new_sock <-+#if 0+ throwSocketErrorIfMinus1RetryMayBlock "accept"+ (threadWaitRead (fromIntegral s))+ (c_accept4 s sockaddr ptr_len (#const SOCK_NONBLOCK))+# else+ throwSocketErrorWaitRead sock "accept"+ (c_accept s sockaddr ptr_len)+# endif /* HAVE_ACCEPT4 */+#endif+ setNonBlockIfNeeded new_sock+ addr <- peekSockAddr sockaddr+ new_status <- newMVar Connected+ return ((MkSocket new_sock family stype protocol new_status), addr)++#if defined(mingw32_HOST_OS)+foreign import ccall unsafe "HsNet.h acceptNewSock"+ c_acceptNewSock :: Ptr () -> IO CInt+foreign import ccall unsafe "HsNet.h newAcceptParams"+ c_newAcceptParams :: CInt -> CInt -> Ptr a -> IO (Ptr ())+foreign import ccall unsafe "HsNet.h &acceptDoProc"+ c_acceptDoProc :: FunPtr (Ptr () -> IO Int)+foreign import ccall unsafe "free"+ c_free:: Ptr a -> IO ()+#endif++-----------------------------------------------------------------------------+-- ** Sending and reciving data++-- $sendrecv+--+-- Do not use the @send@ and @recv@ functions defined in this module+-- in new code, as they incorrectly represent binary data as a Unicode+-- string. As a result, these functions are inefficient and may lead+-- to bugs in the program. Instead use the @send@ and @recv@+-- functions defined in the 'Network.Socket.ByteString' module.++-----------------------------------------------------------------------------+-- sendTo & recvFrom++-- | Send data to the socket. The recipient can be specified+-- explicitly, so the socket need not be in a connected state.+-- Returns the number of bytes sent. Applications are responsible for+-- ensuring that all data has been sent.+--+-- NOTE: blocking on Windows unless you compile with -threaded (see+-- GHC ticket #1129)+sendTo :: Socket -- (possibly) bound/connected Socket+ -> String -- Data to send+ -> SockAddr+ -> IO Int -- Number of Bytes sent+sendTo sock xs addr = do+ withCString xs $ \str -> do+ sendBufTo sock str (length xs) addr++-- | Send data to the socket. The recipient can be specified+-- explicitly, so the socket need not be in a connected state.+-- Returns the number of bytes sent. Applications are responsible for+-- ensuring that all data has been sent.+sendBufTo :: Socket -- (possibly) bound/connected Socket+ -> Ptr a -> Int -- Data to send+ -> SockAddr+ -> IO Int -- Number of Bytes sent+sendBufTo sock@(MkSocket s _family _stype _protocol _status) ptr nbytes addr = do+ withSockAddr addr $ \p_addr sz -> do+ liftM fromIntegral $+ throwSocketErrorWaitWrite sock "sendTo" $+ c_sendto s ptr (fromIntegral $ nbytes) 0{-flags-}+ p_addr (fromIntegral sz)++-- | Receive data from the socket. The socket need not be in a+-- connected state. Returns @(bytes, nbytes, address)@ where @bytes@+-- is a @String@ of length @nbytes@ representing the data received and+-- @address@ is a 'SockAddr' representing the address of the sending+-- socket.+--+-- NOTE: blocking on Windows unless you compile with -threaded (see+-- GHC ticket #1129)+recvFrom :: Socket -> Int -> IO (String, Int, SockAddr)+recvFrom sock nbytes =+ allocaBytes nbytes $ \ptr -> do+ (len, sockaddr) <- recvBufFrom sock ptr nbytes+ str <- peekCStringLen (ptr, len)+ return (str, len, sockaddr)++-- | Receive data from the socket, writing it into buffer instead of+-- creating a new string. The socket need not be in a connected+-- state. Returns @(nbytes, address)@ where @nbytes@ is the number of+-- bytes received and @address@ is a 'SockAddr' representing the+-- address of the sending socket.+--+-- NOTE: blocking on Windows unless you compile with -threaded (see+-- GHC ticket #1129)+recvBufFrom :: Socket -> Ptr a -> Int -> IO (Int, SockAddr)+recvBufFrom sock@(MkSocket s family _stype _protocol _status) ptr nbytes+ | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recvFrom")+ | otherwise =+ withNewSockAddr family $ \ptr_addr sz -> do+ alloca $ \ptr_len -> do+ poke ptr_len (fromIntegral sz)+ len <- throwSocketErrorWaitRead sock "recvFrom" $+ c_recvfrom s ptr (fromIntegral nbytes) 0{-flags-}+ ptr_addr ptr_len+ let len' = fromIntegral len+ if len' == 0+ then ioError (mkEOFError "Network.Socket.recvFrom")+ else do+ flg <- isConnected sock+ -- For at least one implementation (WinSock 2), recvfrom() ignores+ -- filling in the sockaddr for connected TCP sockets. Cope with+ -- this by using getPeerName instead.+ sockaddr <-+ if flg then+ getPeerName sock+ else+ peekSockAddr ptr_addr+ return (len', sockaddr)++-----------------------------------------------------------------------------+-- send & recv++-- | Send data to the socket. The socket must be connected to a remote+-- socket. Returns the number of bytes sent. Applications are+-- responsible for ensuring that all data has been sent.+send :: Socket -- Bound/Connected Socket+ -> String -- Data to send+ -> IO Int -- Number of Bytes sent+send sock@(MkSocket s _family _stype _protocol _status) xs = do+ let len = length xs+ withCString xs $ \str -> do+ liftM fromIntegral $+#if defined(mingw32_HOST_OS)+# if __GLASGOW_HASKELL__ >= 611+ writeRawBufferPtr+ "Network.Socket.send"+ (socket2FD sock)+ (castPtr str)+ 0+ (fromIntegral len)+#else+ writeRawBufferPtr+ "Network.Socket.send"+ (fromIntegral s)+ True+ str+ 0+ (fromIntegral len)+#endif++#else+ throwSocketErrorWaitWrite sock "send" $+ c_send s str (fromIntegral len) 0{-flags-}+#endif++-- | Send data to the socket. The socket must be connected to a remote+-- socket. Returns the number of bytes sent. Applications are+-- responsible for ensuring that all data has been sent.+sendBuf :: Socket -- Bound/Connected Socket+ -> Ptr Word8 -- Pointer to the data to send+ -> Int -- Length of the buffer+ -> IO Int -- Number of Bytes sent+sendBuf sock@(MkSocket s _family _stype _protocol _status) str len = do+ liftM fromIntegral $+#if defined(mingw32_HOST_OS)+# if __GLASGOW_HASKELL__ >= 611+ writeRawBufferPtr+ "Network.Socket.sendBuf"+ (socket2FD sock)+ (castPtr str)+ 0+ (fromIntegral len)+# else+ writeRawBufferPtr+ "Network.Socket.sendBuf"+ (fromIntegral s)+ True+ str+ 0+ (fromIntegral len)+# endif+#else+ throwSocketErrorWaitWrite sock "sendBuf" $+ c_send s str (fromIntegral len) 0{-flags-}+#endif+++-- | Receive data from the socket. The socket must be in a connected+-- state. This function may return fewer bytes than specified. If the+-- message is longer than the specified length, it may be discarded+-- depending on the type of socket. This function may block until a+-- message arrives.+--+-- Considering hardware and network realities, the maximum number of+-- bytes to receive should be a small power of 2, e.g., 4096.+--+-- For TCP sockets, a zero length return value means the peer has+-- closed its half side of the connection.+recv :: Socket -> Int -> IO String+recv sock l = recvLen sock l >>= \ (s,_) -> return s++recvLen :: Socket -> Int -> IO (String, Int)+recvLen sock@(MkSocket s _family _stype _protocol _status) nbytes+ | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recv")+ | otherwise = do+ allocaBytes nbytes $ \ptr -> do+ len <-+#if defined(mingw32_HOST_OS)+# if __GLASGOW_HASKELL__ >= 611+ readRawBufferPtr "Network.Socket.recvLen" (socket2FD sock) ptr 0+ (fromIntegral nbytes)+#else+ readRawBufferPtr "Network.Socket.recvLen" (fromIntegral s) True ptr 0+ (fromIntegral nbytes)+#endif+#else+ throwSocketErrorWaitRead sock "recv" $+ c_recv s ptr (fromIntegral nbytes) 0{-flags-}+#endif+ let len' = fromIntegral len+ if len' == 0+ then ioError (mkEOFError "Network.Socket.recv")+ else do+ s' <- peekCStringLen (castPtr ptr,len')+ return (s', len')++-- | Receive data from the socket. The socket must be in a connected+-- state. This function may return fewer bytes than specified. If the+-- message is longer than the specified length, it may be discarded+-- depending on the type of socket. This function may block until a+-- message arrives.+--+-- Considering hardware and network realities, the maximum number of+-- bytes to receive should be a small power of 2, e.g., 4096.+--+-- For TCP sockets, a zero length return value means the peer has+-- closed its half side of the connection.+recvBuf :: Socket -> Ptr Word8 -> Int -> IO Int+recvBuf sock p l = recvLenBuf sock p l++recvLenBuf :: Socket -> Ptr Word8 -> Int -> IO Int+recvLenBuf sock@(MkSocket s _family _stype _protocol _status) ptr nbytes+ | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recvBuf")+ | otherwise = do+ len <-+#if defined(mingw32_HOST_OS)+# if __GLASGOW_HASKELL__ >= 611+ readRawBufferPtr "Network.Socket.recvLenBuf" (socket2FD sock) ptr 0+ (fromIntegral nbytes)+#else+ readRawBufferPtr "Network.Socket.recvLenBuf" (fromIntegral s) True ptr 0+ (fromIntegral nbytes)+#endif+#else+ throwSocketErrorWaitRead sock "recvBuf" $+ c_recv s (castPtr ptr) (fromIntegral nbytes) 0{-flags-}+#endif+ let len' = fromIntegral len+ if len' == 0+ then ioError (mkEOFError "Network.Socket.recvBuf")+ else return len'+++-- ---------------------------------------------------------------------------+-- socketPort+--+-- The port number the given socket is currently connected to can be+-- determined by calling $port$, is generally only useful when bind+-- was given $aNY\_PORT$.++socketPort :: Socket -- Connected & Bound Socket+ -> IO PortNumber -- Port Number of Socket+socketPort sock@(MkSocket _ AF_INET _ _ _) = do+ (SockAddrInet port _) <- getSocketName sock+ return port+#if defined(IPV6_SOCKET_SUPPORT)+socketPort sock@(MkSocket _ AF_INET6 _ _ _) = do+ (SockAddrInet6 port _ _ _) <- getSocketName sock+ return port+#endif+socketPort (MkSocket _ family _ _ _) =+ ioError (userError ("socketPort: not supported for Family " ++ show family))+++-- ---------------------------------------------------------------------------+-- getPeerName++-- Calling $getPeerName$ returns the address details of the machine,+-- other than the local one, which is connected to the socket. This is+-- used in programs such as FTP to determine where to send the+-- returning data. The corresponding call to get the details of the+-- local machine is $getSocketName$.++getPeerName :: Socket -> IO SockAddr+getPeerName (MkSocket s family _ _ _) = do+ withNewSockAddr family $ \ptr sz -> do+ with (fromIntegral sz) $ \int_star -> do+ throwSocketErrorIfMinus1Retry "getPeerName" $ c_getpeername s ptr int_star+ _sz <- peek int_star+ peekSockAddr ptr++getSocketName :: Socket -> IO SockAddr+getSocketName (MkSocket s family _ _ _) = do+ withNewSockAddr family $ \ptr sz -> do+ with (fromIntegral sz) $ \int_star -> do+ throwSocketErrorIfMinus1Retry "getSocketName" $ c_getsockname s ptr int_star+ peekSockAddr ptr++-----------------------------------------------------------------------------+-- Socket Properties++-- | Socket options for use with 'setSocketOption' and 'getSocketOption'.+--+-- The existence of a constructor does not imply that the relevant option+-- is supported on your system: see 'isSupportedSocketOption'+data SocketOption+ = Debug -- ^ SO_DEBUG+ | ReuseAddr -- ^ SO_REUSEADDR+ | Type -- ^ SO_TYPE+ | SoError -- ^ SO_ERROR+ | DontRoute -- ^ SO_DONTROUTE+ | Broadcast -- ^ SO_BROADCAST+ | SendBuffer -- ^ SO_SNDBUF+ | RecvBuffer -- ^ SO_RCVBUF+ | KeepAlive -- ^ SO_KEEPALIVE+ | OOBInline -- ^ SO_OOBINLINE+ | TimeToLive -- ^ IP_TTL+ | MaxSegment -- ^ TCP_MAXSEG+ | NoDelay -- ^ TCP_NODELAY+ | Cork -- ^ TCP_CORK+ | Linger -- ^ SO_LINGER+ | ReusePort -- ^ SO_REUSEPORT+ | RecvLowWater -- ^ SO_RCVLOWAT+ | SendLowWater -- ^ SO_SNDLOWAT+ | RecvTimeOut -- ^ SO_RCVTIMEO+ | SendTimeOut -- ^ SO_SNDTIMEO+ | UseLoopBack -- ^ SO_USELOOPBACK+ | IPv6Only -- ^ IPV6_V6ONLY+ deriving (Show, Typeable)++-- | Does the 'SocketOption' exist on this system?+isSupportedSocketOption :: SocketOption -> Bool+isSupportedSocketOption = isJust . packSocketOption++-- | For a socket option, return Just (level, value) where level is the+-- corresponding C option level constant (e.g. SOL_SOCKET) and value is+-- the option constant itself (e.g. SO_DEBUG)+-- If either constant does not exist, return Nothing.+packSocketOption :: SocketOption -> Maybe (CInt, CInt)+packSocketOption so =+ -- The Just here is a hack to disable GHC's overlapping pattern detection:+ -- the problem is if all constants are present, the fallback pattern is+ -- redundant, but if they aren't then it isn't. Hence we introduce an+ -- extra pattern (Nothing) that can't possibly happen, so that the+ -- fallback is always (in principle) necessary.+ -- I feel a little bad for including this, but such are the sacrifices we+ -- make while working with CPP - excluding the fallback pattern correctly+ -- would be a serious nuisance.+ -- (NB: comments elsewhere in this file refer to this one)+ case Just so of+#ifdef SOL_SOCKET+#ifdef SO_DEBUG+ Just Debug -> Just ((#const SOL_SOCKET), (#const SO_DEBUG))+#endif+#ifdef SO_REUSEADDR+ Just ReuseAddr -> Just ((#const SOL_SOCKET), (#const SO_REUSEADDR))+#endif+#ifdef SO_TYPE+ Just Type -> Just ((#const SOL_SOCKET), (#const SO_TYPE))+#endif+#ifdef SO_ERROR+ Just SoError -> Just ((#const SOL_SOCKET), (#const SO_ERROR))+#endif+#ifdef SO_DONTROUTE+ Just DontRoute -> Just ((#const SOL_SOCKET), (#const SO_DONTROUTE))+#endif+#ifdef SO_BROADCAST+ Just Broadcast -> Just ((#const SOL_SOCKET), (#const SO_BROADCAST))+#endif+#ifdef SO_SNDBUF+ Just SendBuffer -> Just ((#const SOL_SOCKET), (#const SO_SNDBUF))+#endif+#ifdef SO_RCVBUF+ Just RecvBuffer -> Just ((#const SOL_SOCKET), (#const SO_RCVBUF))+#endif+#ifdef SO_KEEPALIVE+ Just KeepAlive -> Just ((#const SOL_SOCKET), (#const SO_KEEPALIVE))+#endif+#ifdef SO_OOBINLINE+ Just OOBInline -> Just ((#const SOL_SOCKET), (#const SO_OOBINLINE))+#endif+#ifdef SO_LINGER+ Just Linger -> Just ((#const SOL_SOCKET), (#const SO_LINGER))+#endif+#ifdef SO_REUSEPORT+ Just ReusePort -> Just ((#const SOL_SOCKET), (#const SO_REUSEPORT))+#endif+#ifdef SO_RCVLOWAT+ Just RecvLowWater -> Just ((#const SOL_SOCKET), (#const SO_RCVLOWAT))+#endif+#ifdef SO_SNDLOWAT+ Just SendLowWater -> Just ((#const SOL_SOCKET), (#const SO_SNDLOWAT))+#endif+#ifdef SO_RCVTIMEO+ Just RecvTimeOut -> Just ((#const SOL_SOCKET), (#const SO_RCVTIMEO))+#endif+#ifdef SO_SNDTIMEO+ Just SendTimeOut -> Just ((#const SOL_SOCKET), (#const SO_SNDTIMEO))+#endif+#ifdef SO_USELOOPBACK+ Just UseLoopBack -> Just ((#const SOL_SOCKET), (#const SO_USELOOPBACK))+#endif+#endif // SOL_SOCKET+#ifdef IPPROTO_IP+#ifdef IP_TTL+ Just TimeToLive -> Just ((#const IPPROTO_IP), (#const IP_TTL))+#endif+#endif // IPPROTO_IP+#ifdef IPPROTO_TCP+#ifdef TCP_MAXSEG+ Just MaxSegment -> Just ((#const IPPROTO_TCP), (#const TCP_MAXSEG))+#endif+#ifdef TCP_NODELAY+ Just NoDelay -> Nothing -- Just ((#const IPPROTO_TCP), (#const TCP_NODELAY))+#endif+#ifdef TCP_CORK+ Just Cork -> Just ((#const IPPROTO_TCP), (#const TCP_CORK))+#endif+#endif // IPPROTO_TCP+#ifdef IPPROTO_IPV6+#if HAVE_DECL_IPV6_V6ONLY+ Just IPv6Only -> Just ((#const IPPROTO_IPV6), (#const IPV6_V6ONLY))+#endif+#endif // IPPROTO_IPV6+ _ -> Nothing++-- | Return the option level and option value if they exist,+-- otherwise throw an error that begins "Network.Socket." ++ the String+-- parameter+packSocketOption' :: String -> SocketOption -> IO (CInt, CInt)+packSocketOption' caller so = maybe err return (packSocketOption so)+ where+ err = ioError . userError . concat $ ["Network.Socket.", caller,+ ": socket option ", show so, " unsupported on this system"]++-- | Set a socket option that expects an Int value.+-- There is currently no API to set e.g. the timeval socket options+setSocketOption :: Socket+ -> SocketOption -- Option Name+ -> Int -- Option Value+ -> IO ()+setSocketOption (MkSocket s _ _ _ _) so v = do+ (level, opt) <- packSocketOption' "setSocketOption" so+ with (fromIntegral v) $ \ptr_v -> do+ throwSocketErrorIfMinus1_ "setSocketOption" $+ c_setsockopt s level opt ptr_v+ (fromIntegral (sizeOf (undefined :: CInt)))+ return ()+++-- | Get a socket option that gives an Int value.+-- There is currently no API to get e.g. the timeval socket options+getSocketOption :: Socket+ -> SocketOption -- Option Name+ -> IO Int -- Option Value+getSocketOption (MkSocket s _ _ _ _) so = do+ (level, opt) <- packSocketOption' "getSocketOption" so+ alloca $ \ptr_v ->+ with (fromIntegral (sizeOf (undefined :: CInt))) $ \ptr_sz -> do+ throwSocketErrorIfMinus1Retry "getSocketOption" $+ c_getsockopt s level opt ptr_v ptr_sz+ fromIntegral `liftM` peek ptr_v+++#ifdef HAVE_STRUCT_UCRED+-- | Returns the processID, userID and groupID of the socket's peer.+--+-- Only available on platforms that support SO_PEERCRED on domain sockets.+getPeerCred :: Socket -> IO (CUInt, CUInt, CUInt)+getPeerCred sock = do+ let fd = fdSocket sock+ let sz = (fromIntegral (#const sizeof(struct ucred)))+ with sz $ \ ptr_cr ->+ alloca $ \ ptr_sz -> do+ poke ptr_sz sz+ throwSocketErrorIfMinus1Retry "getPeerCred" $+ c_getsockopt fd (#const SOL_SOCKET) (#const SO_PEERCRED) ptr_cr ptr_sz+ pid <- (#peek struct ucred, pid) ptr_cr+ uid <- (#peek struct ucred, uid) ptr_cr+ gid <- (#peek struct ucred, gid) ptr_cr+ return (pid, uid, gid)+#endif++##if !(MIN_VERSION_base(4,3,1))+closeFdWith closer fd = closer fd+##endif++#if defined(DOMAIN_SOCKET_SUPPORT)+-- sending/receiving ancillary socket data; low-level mechanism+-- for transmitting file descriptors, mainly.+sendFd :: Socket -> CInt -> IO ()+sendFd sock outfd = do+ throwSocketErrorWaitWrite sock "sendFd" $+ c_sendFd (fdSocket sock) outfd+ -- Note: If Winsock supported FD-passing, thi would have been+ -- incorrect (since socket FDs need to be closed via closesocket().)+ closeFd outfd++recvFd :: Socket -> IO CInt+recvFd sock = do+ theFd <- throwSocketErrorWaitRead sock "recvFd" $+ c_recvFd (fdSocket sock)+ return theFd++foreign import ccall SAFE_ON_WIN "sendFd" c_sendFd :: CInt -> CInt -> IO CInt+foreign import ccall SAFE_ON_WIN "recvFd" c_recvFd :: CInt -> IO CInt++#endif++-- ---------------------------------------------------------------------------+-- Utility Functions++aNY_PORT :: PortNumber+aNY_PORT = 0++-- | The IPv4 wild card address.++iNADDR_ANY :: HostAddress+iNADDR_ANY = htonl (#const INADDR_ANY)++foreign import CALLCONV unsafe "my_htonl" htonl :: Word32 -> Word32++#if defined(IPV6_SOCKET_SUPPORTNO)+-- | The IPv6 wild card address.++iN6ADDR_ANY :: HostAddress6+iN6ADDR_ANY = (0, 0, 0, 0)+#endif++sOMAXCONN :: Int+sOMAXCONN = #const SOMAXCONN++sOL_SOCKET :: Int+sOL_SOCKET = #const SOL_SOCKET++#ifdef SCM_RIGHTS+sCM_RIGHTS :: Int+sCM_RIGHTS = #const SCM_RIGHTS+#endif++-- | This is the value of SOMAXCONN, typically 128.+-- 128 is good enough for normal network servers but+-- is too small for high performance servers.+maxListenQueue :: Int+maxListenQueue = sOMAXCONN++-- -----------------------------------------------------------------------------++data ShutdownCmd+ = ShutdownReceive+ | ShutdownSend+ | ShutdownBoth+ deriving Typeable++sdownCmdToInt :: ShutdownCmd -> CInt+sdownCmdToInt ShutdownReceive = 0+sdownCmdToInt ShutdownSend = 1+sdownCmdToInt ShutdownBoth = 2++-- | Shut down one or both halves of the connection, depending on the+-- second argument to the function. If the second argument is+-- 'ShutdownReceive', further receives are disallowed. If it is+-- 'ShutdownSend', further sends are disallowed. If it is+-- 'ShutdownBoth', further sends and receives are disallowed.+shutdown :: Socket -> ShutdownCmd -> IO ()+shutdown (MkSocket s _ _ _ _) stype = do+ throwSocketErrorIfMinus1Retry "shutdown" (c_shutdown s (sdownCmdToInt stype))+ return ()++-- -----------------------------------------------------------------------------++-- | Close the socket. All future operations on the socket object+-- will fail. The remote end will receive no more data (after queued+-- data is flushed).+close :: Socket -> IO ()+close (MkSocket s _ _ _ socketStatus) = do+ modifyMVar_ socketStatus $ \ status ->+ case status of+ ConvertedToHandle ->+ ioError (userError ("close: converted to a Handle, use hClose instead"))+ Closed ->+ return status+ _ -> closeFdWith (closeFd . fromIntegral) (fromIntegral s) >> return Closed++-- -----------------------------------------------------------------------------++isConnected :: Socket -> IO Bool+isConnected (MkSocket _ _ _ _ status) = do+ value <- readMVar status+ return (value == Connected)++-- -----------------------------------------------------------------------------+-- Socket Predicates++isBound :: Socket -> IO Bool+isBound (MkSocket _ _ _ _ status) = do+ value <- readMVar status+ return (value == Bound)++isListening :: Socket -> IO Bool+isListening (MkSocket _ _ _ _ status) = do+ value <- readMVar status+ return (value == Listening)++isReadable :: Socket -> IO Bool+isReadable (MkSocket _ _ _ _ status) = do+ value <- readMVar status+ return (value == Listening || value == Connected)++isWritable :: Socket -> IO Bool+isWritable = isReadable -- sort of.++isAcceptable :: Socket -> IO Bool+#if defined(DOMAIN_SOCKET_SUPPORT)+isAcceptable (MkSocket _ AF_UNIX x _ status)+ | x == Stream || x == SeqPacket = do+ value <- readMVar status+ return (value == Connected || value == Bound || value == Listening)+isAcceptable (MkSocket _ AF_UNIX _ _ _) = return False+#endif+isAcceptable (MkSocket _ _ _ _ status) = do+ value <- readMVar status+ return (value == Connected || value == Listening)++-- -----------------------------------------------------------------------------+-- Internet address manipulation routines:++inet_addr :: String -> IO HostAddress+inet_addr ipstr = do+ withCString ipstr $ \str -> do+ had <- c_inet_addr str+ if had == -1+ then ioError (userError ("inet_addr: Malformed address: " ++ ipstr))+ else return had -- network byte order++inet_ntoa :: HostAddress -> IO String+inet_ntoa haddr = do+ pstr <- c_inet_ntoa haddr+ peekCString pstr++-- | Turns a Socket into an 'Handle'. By default, the new handle is+-- unbuffered. Use 'System.IO.hSetBuffering' to change the buffering.+--+-- Note that since a 'Handle' is automatically closed by a finalizer+-- when it is no longer referenced, you should avoid doing any more+-- operations on the 'Socket' after calling 'socketToHandle'. To+-- close the 'Socket' after 'socketToHandle', call 'System.IO.hClose'+-- on the 'Handle'.++#ifndef __PARALLEL_HASKELL__+socketToHandle :: Socket -> IOMode -> IO Handle+socketToHandle s@(MkSocket fd _ _ _ socketStatus) mode = do+ modifyMVar socketStatus $ \ status ->+ if status == ConvertedToHandle+ then ioError (userError ("socketToHandle: already a Handle"))+ else do+# if __GLASGOW_HASKELL__ >= 611+ h <- fdToHandle' (fromIntegral fd) (Just GHC.IO.Device.Stream) True (show s) mode True{-bin-}+# elif __GLASGOW_HASKELL__ >= 608+ h <- fdToHandle' (fromIntegral fd) (Just System.Posix.Internals.Stream) True (show s) mode True{-bin-}+# elif __GLASGOW_HASKELL__ < 608+ h <- openFd (fromIntegral fd) (Just System.Posix.Internals.Stream) True (show s) mode True{-bin-}+# endif+ hSetBuffering h NoBuffering+ return (ConvertedToHandle, h)+#else+socketToHandle (MkSocket s family stype protocol status) m =+ error "socketToHandle not implemented in a parallel setup"+#endif++-- | Pack a list of values into a bitmask. The possible mappings from+-- value to bit-to-set are given as the first argument. We assume+-- that each value can cause exactly one bit to be set; unpackBits will+-- break if this property is not true.++packBits :: (Eq a, Num b, Bits b) => [(a, b)] -> [a] -> b++packBits mapping xs = foldl' pack 0 mapping+ where pack acc (k, v) | k `elem` xs = acc .|. v+ | otherwise = acc++-- | Unpack a bitmask into a list of values.++unpackBits :: (Num b, Bits b) => [(a, b)] -> b -> [a]++-- Be permissive and ignore unknown bit values. At least on OS X,+-- getaddrinfo returns an ai_flags field with bits set that have no+-- entry in <netdb.h>.+unpackBits [] _ = []+unpackBits ((k,v):xs) r+ | r .&. v /= 0 = k : unpackBits xs (r .&. complement v)+ | otherwise = unpackBits xs r++-----------------------------------------------------------------------------+-- Address and service lookups++#if defined(IPV6_SOCKET_SUPPORT) || 1++-- | Flags that control the querying behaviour of 'getAddrInfo'.+data AddrInfoFlag+ = AI_ADDRCONFIG+ | AI_ALL+ | AI_CANONNAME+ | AI_NUMERICHOST+ | AI_NUMERICSERV+ | AI_PASSIVE+ | AI_V4MAPPED+ deriving (Eq, Read, Show, Typeable)++aiFlagMapping :: [(AddrInfoFlag, CInt)]++aiFlagMapping =+ [+#if HAVE_DECL_AI_ADDRCONFIG+ (AI_ADDRCONFIG, #const AI_ADDRCONFIG),+#else+ (AI_ADDRCONFIG, 0),+#endif+#if HAVE_DECL_AI_ALL+ (AI_ALL, #const AI_ALL),+#else+ (AI_ALL, 0),+#endif+ (AI_CANONNAME, #const AI_CANONNAME),+ (AI_NUMERICHOST, #const AI_NUMERICHOST),+#if HAVE_DECL_AI_NUMERICSERV+ (AI_NUMERICSERV, #const AI_NUMERICSERV),+#else+ (AI_NUMERICSERV, 0),+#endif+ (AI_PASSIVE, #const AI_PASSIVE),+#if HAVE_DECL_AI_V4MAPPED+ (AI_V4MAPPED, #const AI_V4MAPPED)+#else+ (AI_V4MAPPED, 0)+#endif+ ]++-- | Indicate whether the given 'AddrInfoFlag' will have any effect on+-- this system.+addrInfoFlagImplemented :: AddrInfoFlag -> Bool+addrInfoFlagImplemented f = packBits aiFlagMapping [f] /= 0++data AddrInfo =+ AddrInfo {+ addrFlags :: [AddrInfoFlag],+ addrFamily :: Family,+ addrSocketType :: SocketType,+ addrProtocol :: ProtocolNumber,+ addrAddress :: SockAddr,+ addrCanonName :: Maybe String+ }+ deriving (Eq, Show, Typeable)++instance Storable AddrInfo where+ sizeOf _ = #const sizeof(struct addrinfo)+ alignment _ = alignment (undefined :: CInt)++ peek p = do+ ai_flags <- (#peek struct addrinfo, ai_flags) p+ ai_family <- (#peek struct addrinfo, ai_family) p+ ai_socktype <- (#peek struct addrinfo, ai_socktype) p+ ai_protocol <- (#peek struct addrinfo, ai_protocol) p+ ai_addr <- (#peek struct addrinfo, ai_addr) p >>= peekSockAddr+ ai_canonname_ptr <- (#peek struct addrinfo, ai_canonname) p++ ai_canonname <- if ai_canonname_ptr == nullPtr+ then return Nothing+ else liftM Just $ peekCString ai_canonname_ptr++ socktype <- unpackSocketType' "AddrInfo.peek" ai_socktype+ return (AddrInfo+ {+ addrFlags = unpackBits aiFlagMapping ai_flags,+ addrFamily = unpackFamily ai_family,+ addrSocketType = socktype,+ addrProtocol = ai_protocol,+ addrAddress = ai_addr,+ addrCanonName = ai_canonname+ })++ poke p (AddrInfo flags family socketType protocol _ _) = do+ c_stype <- packSocketTypeOrThrow "AddrInfo.poke" socketType++ (#poke struct addrinfo, ai_flags) p (packBits aiFlagMapping flags)+ (#poke struct addrinfo, ai_family) p (packFamily family)+ (#poke struct addrinfo, ai_socktype) p c_stype+ (#poke struct addrinfo, ai_protocol) p protocol++ -- stuff below is probably not needed, but let's zero it for safety++ (#poke struct addrinfo, ai_addrlen) p (0::CSize)+ (#poke struct addrinfo, ai_addr) p nullPtr+ (#poke struct addrinfo, ai_canonname) p nullPtr+ (#poke struct addrinfo, ai_next) p nullPtr++data NameInfoFlag+ = NI_DGRAM+ | NI_NAMEREQD+ | NI_NOFQDN+ | NI_NUMERICHOST+ | NI_NUMERICSERV+ deriving (Eq, Read, Show, Typeable)++niFlagMapping :: [(NameInfoFlag, CInt)]++niFlagMapping = [(NI_DGRAM, #const NI_DGRAM),+ (NI_NAMEREQD, #const NI_NAMEREQD),+ (NI_NOFQDN, #const NI_NOFQDN),+ (NI_NUMERICHOST, #const NI_NUMERICHOST),+ (NI_NUMERICSERV, #const NI_NUMERICSERV)]++-- | Default hints for address lookup with 'getAddrInfo'. The values+-- of the 'addrAddress' and 'addrCanonName' fields are 'undefined',+-- and are never inspected by 'getAddrInfo'.++defaultHints :: AddrInfo++defaultHints = AddrInfo {+ addrFlags = [],+ addrFamily = AF_UNSPEC,+ addrSocketType = NoSocketType,+ addrProtocol = defaultProtocol,+ addrAddress = undefined,+ addrCanonName = undefined+ }++-- | Resolve a host or service name to one or more addresses.+-- The 'AddrInfo' values that this function returns contain 'SockAddr'+-- values that you can pass directly to 'connect' or+-- 'bind'.+--+-- This function is protocol independent. It can return both IPv4 and+-- IPv6 address information.+--+-- The 'AddrInfo' argument specifies the preferred query behaviour,+-- socket options, or protocol. You can override these conveniently+-- using Haskell's record update syntax on 'defaultHints', for example+-- as follows:+--+-- @+-- myHints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_CANONNAME] }+-- @+--+-- Values for 'addrFlags' control query behaviour. The supported+-- flags are as follows:+--+-- [@AI_PASSIVE@] If no 'HostName' value is provided, the network+-- address in each 'SockAddr'+-- will be left as a "wild card", i.e. as either 'iNADDR_ANY'+-- or 'iN6ADDR_ANY'. This is useful for server applications that+-- will accept connections from any client.+--+-- [@AI_CANONNAME@] The 'addrCanonName' field of the first returned+-- 'AddrInfo' will contain the "canonical name" of the host.+--+-- [@AI_NUMERICHOST@] The 'HostName' argument /must/ be a numeric+-- address in string form, and network name lookups will not be+-- attempted.+--+-- /Note/: Although the following flags are required by RFC 3493, they+-- may not have an effect on all platforms, because the underlying+-- network stack may not support them. To see whether a flag from the+-- list below will have any effect, call 'addrInfoFlagImplemented'.+--+-- [@AI_NUMERICSERV@] The 'ServiceName' argument /must/ be a port+-- number in string form, and service name lookups will not be+-- attempted.+--+-- [@AI_ADDRCONFIG@] The list of returned 'AddrInfo' values will+-- only contain IPv4 addresses if the local system has at least+-- one IPv4 interface configured, and likewise for IPv6.+--+-- [@AI_V4MAPPED@] If an IPv6 lookup is performed, and no IPv6+-- addresses are found, IPv6-mapped IPv4 addresses will be+-- returned.+--+-- [@AI_ALL@] If 'AI_ALL' is specified, return all matching IPv6 and+-- IPv4 addresses. Otherwise, this flag has no effect.+--+-- You must provide a 'Just' value for at least one of the 'HostName'+-- or 'ServiceName' arguments. 'HostName' can be either a numeric+-- network address (dotted quad for IPv4, colon-separated hex for+-- IPv6) or a hostname. In the latter case, its addresses will be+-- looked up unless 'AI_NUMERICHOST' is specified as a hint. If you+-- do not provide a 'HostName' value /and/ do not set 'AI_PASSIVE' as+-- a hint, network addresses in the result will contain the address of+-- the loopback interface.+--+-- If the query fails, this function throws an IO exception instead of+-- returning an empty list. Otherwise, it returns a non-empty list+-- of 'AddrInfo' values.+--+-- There are several reasons why a query might result in several+-- values. For example, the queried-for host could be multihomed, or+-- the service might be available via several protocols.+--+-- Note: the order of arguments is slightly different to that defined+-- for @getaddrinfo@ in RFC 2553. The 'AddrInfo' parameter comes first+-- to make partial application easier.+--+-- Example:+-- @+-- let hints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_CANONNAME] }+-- addrs <- getAddrInfo (Just hints) (Just "www.haskell.org") (Just "http")+-- let addr = head addrs+-- sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+-- connect sock (addrAddress addr)+-- @++getAddrInfo :: Maybe AddrInfo -- ^ preferred socket type or protocol+ -> Maybe HostName -- ^ host name to look up+ -> Maybe ServiceName -- ^ service name to look up+ -> IO [AddrInfo] -- ^ resolved addresses, with "best" first++getAddrInfo hints node service =+ maybeWith withCString node $ \c_node ->+ maybeWith withCString service $ \c_service ->+ maybeWith with filteredHints $ \c_hints ->+ alloca $ \ptr_ptr_addrs -> do+ ret <- c_getaddrinfo c_node c_service c_hints ptr_ptr_addrs+ case ret of+ 0 -> do ptr_addrs <- peek ptr_ptr_addrs+ ais <- followAddrInfo ptr_addrs+ c_freeaddrinfo ptr_addrs+ return ais+ _ -> do err <- gai_strerror ret+ ioError (ioeSetErrorString+ (mkIOError NoSuchThing "getAddrInfo" Nothing+ Nothing) err)+ -- Leaving out the service and using AI_NUMERICSERV causes a+ -- segfault on OS X 10.8.2. This code removes AI_NUMERICSERV+ -- (which has no effect) in that case.+ where+#if defined(darwin_HOST_OS)+ filteredHints = case service of+ Nothing -> fmap (\ h -> h { addrFlags = delete AI_NUMERICSERV (addrFlags h) }) hints+ _ -> hints+#else+ filteredHints = hints+#endif++followAddrInfo :: Ptr AddrInfo -> IO [AddrInfo]++followAddrInfo ptr_ai | ptr_ai == nullPtr = return []+ | otherwise = do+ a <- peek ptr_ai+ as <- (#peek struct addrinfo, ai_next) ptr_ai >>= followAddrInfo+ return (a:as)++foreign import ccall safe "hsnet_getaddrinfo"+ c_getaddrinfo :: CString -> CString -> Ptr AddrInfo -> Ptr (Ptr AddrInfo)+ -> IO CInt++foreign import ccall safe "hsnet_freeaddrinfo"+ c_freeaddrinfo :: Ptr AddrInfo -> IO ()++gai_strerror :: CInt -> IO String++#ifdef HAVE_GAI_STRERROR+gai_strerror n = c_gai_strerror n >>= peekCString++foreign import ccall safe "gai_strerror"+ c_gai_strerror :: CInt -> IO CString+#else+gai_strerror n = return ("error " ++ show n)+#endif++withCStringIf :: Bool -> Int -> (CSize -> CString -> IO a) -> IO a+withCStringIf False _ f = f 0 nullPtr+withCStringIf True n f = allocaBytes n (f (fromIntegral n))++-- | Resolve an address to a host or service name.+-- This function is protocol independent.+--+-- The list of 'NameInfoFlag' values controls query behaviour. The+-- supported flags are as follows:+--+-- [@NI_NOFQDN@] If a host is local, return only the+-- hostname part of the FQDN.+--+-- [@NI_NUMERICHOST@] The name of the host is not+-- looked up. Instead, a numeric representation of the host's+-- address is returned. For an IPv4 address, this will be a+-- dotted-quad string. For IPv6, it will be colon-separated+-- hexadecimal.+--+-- [@NI_NUMERICSERV@] The name of the service is not+-- looked up. Instead, a numeric representation of the+-- service is returned.+--+-- [@NI_NAMEREQD@] If the hostname cannot be looked up, an IO error+-- is thrown.+--+-- [@NI_DGRAM@] Resolve a datagram-based service name. This is+-- required only for the few protocols that have different port+-- numbers for their datagram-based versions than for their+-- stream-based versions.+--+-- Hostname and service name lookups can be expensive. You can+-- specify which lookups to perform via the two 'Bool' arguments. If+-- one of these is 'False', the corresponding value in the returned+-- tuple will be 'Nothing', and no lookup will be performed.+--+-- If a host or service's name cannot be looked up, then the numeric+-- form of the address or service will be returned.+--+-- If the query fails, this function throws an IO exception.+--+-- Example:+-- @+-- (hostName, _) <- getNameInfo [] True False myAddress+-- @++getNameInfo :: [NameInfoFlag] -- ^ flags to control lookup behaviour+ -> Bool -- ^ whether to look up a hostname+ -> Bool -- ^ whether to look up a service name+ -> SockAddr -- ^ the address to look up+ -> IO (Maybe HostName, Maybe ServiceName)++getNameInfo flags doHost doService addr =+ withCStringIf doHost (#const NI_MAXHOST) $ \c_hostlen c_host ->+ withCStringIf doService (#const NI_MAXSERV) $ \c_servlen c_serv -> do+ withSockAddr addr $ \ptr_addr sz -> do+ ret <- c_getnameinfo ptr_addr (fromIntegral sz) c_host c_hostlen+ c_serv c_servlen (packBits niFlagMapping flags)+ case ret of+ 0 -> do+ let peekIf doIf c_val = if doIf+ then liftM Just $ peekCString c_val+ else return Nothing+ host <- peekIf doHost c_host+ serv <- peekIf doService c_serv+ return (host, serv)+ _ -> do err <- gai_strerror ret+ ioError (ioeSetErrorString+ (mkIOError NoSuchThing "getNameInfo" Nothing+ Nothing) err)++foreign import ccall safe "hsnet_getnameinfo"+ c_getnameinfo :: Ptr SockAddr -> CInt{-CSockLen???-} -> CString -> CSize -> CString+ -> CSize -> CInt -> IO CInt+#endif++mkInvalidRecvArgError :: String -> IOError+mkInvalidRecvArgError loc = ioeSetErrorString (mkIOError+ InvalidArgument+ loc Nothing Nothing) "non-positive length"++mkEOFError :: String -> IOError+mkEOFError loc = ioeSetErrorString (mkIOError EOF loc Nothing Nothing) "end of file"++-- ---------------------------------------------------------------------------+-- foreign imports from the C library++foreign import ccall unsafe "my_inet_ntoa"+ c_inet_ntoa :: HostAddress -> IO (Ptr CChar)++foreign import CALLCONV unsafe "inet_addr"+ c_inet_addr :: Ptr CChar -> IO HostAddress++foreign import CALLCONV unsafe "shutdown"+ c_shutdown :: CInt -> CInt -> IO CInt++closeFd :: CInt -> IO ()+closeFd fd = throwSocketErrorIfMinus1_ "Network.Socket.close" $ c_close fd++#if !defined(WITH_WINSOCK)+foreign import ccall unsafe "close"+ c_close :: CInt -> IO CInt+#else+foreign import stdcall unsafe "closesocket"+ c_close :: CInt -> IO CInt+#endif++foreign import CALLCONV unsafe "socket"+ c_socket :: CInt -> CInt -> CInt -> IO CInt+foreign import CALLCONV unsafe "bind"+ c_bind :: CInt -> Ptr SockAddr -> CInt{-CSockLen???-} -> IO CInt+foreign import CALLCONV SAFE_ON_WIN "connect"+ c_connect :: CInt -> Ptr SockAddr -> CInt{-CSockLen???-} -> IO CInt+foreign import CALLCONV unsafe "accept"+ c_accept :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> IO CInt+#if 0+foreign import CALLCONV unsafe "accept4"+ c_accept4 :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> CInt -> IO CInt+#endif+foreign import CALLCONV unsafe "listen"+ c_listen :: CInt -> CInt -> IO CInt++#if defined(mingw32_HOST_OS)+foreign import CALLCONV safe "accept"+ c_accept_safe :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> IO CInt++foreign import ccall unsafe "rtsSupportsBoundThreads" threaded :: Bool+#endif++foreign import CALLCONV unsafe "send"+ c_send :: CInt -> Ptr a -> CSize -> CInt -> IO CInt+foreign import CALLCONV SAFE_ON_WIN "sendto"+ c_sendto :: CInt -> Ptr a -> CSize -> CInt -> Ptr SockAddr -> CInt -> IO CInt+foreign import CALLCONV unsafe "recv"+ c_recv :: CInt -> Ptr CChar -> CSize -> CInt -> IO CInt+foreign import CALLCONV SAFE_ON_WIN "recvfrom"+ c_recvfrom :: CInt -> Ptr a -> CSize -> CInt -> Ptr SockAddr -> Ptr CInt -> IO CInt+foreign import CALLCONV unsafe "getpeername"+ c_getpeername :: CInt -> Ptr SockAddr -> Ptr CInt -> IO CInt+foreign import CALLCONV unsafe "getsockname"+ c_getsockname :: CInt -> Ptr SockAddr -> Ptr CInt -> IO CInt++foreign import CALLCONV unsafe "getsockopt"+ c_getsockopt :: CInt -> CInt -> CInt -> Ptr CInt -> Ptr CInt -> IO CInt+foreign import CALLCONV unsafe "setsockopt"+ c_setsockopt :: CInt -> CInt -> CInt -> Ptr CInt -> CInt -> IO CInt++-- ---------------------------------------------------------------------------+-- * Deprecated aliases++-- $deprecated-aliases+--+-- These aliases are deprecated and should not be used in new code.+-- They will be removed in some future version of the package.++-- | Deprecated alias for 'bind'.+bindSocket :: Socket -- Unconnected Socket+ -> SockAddr -- Address to Bind to+ -> IO ()+bindSocket = bind++-- | Deprecated alias for 'close'.+sClose :: Socket -> IO ()+sClose = close++-- | Deprecated alias for 'isConnected'.+sIsConnected :: Socket -> IO Bool+sIsConnected = isConnected++-- | Deprecated alias for 'isBound'.+sIsBound :: Socket -> IO Bool+sIsBound = isBound++-- | Deprecated alias for 'isListening'.+sIsListening :: Socket -> IO Bool+sIsListening = isListening++-- | Deprecated alias for 'isReadable'.+sIsReadable :: Socket -> IO Bool+sIsReadable = isReadable++-- | Deprecated alias for 'isWritable'.+sIsWritable :: Socket -> IO Bool+sIsWritable = isWritable
+ standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString.hsc view
@@ -0,0 +1,374 @@+{-# LANGUAGE CPP, ForeignFunctionInterface #-}++#include "HsNet.h"++-- |+-- Module : Network.Socket.ByteString+-- Copyright : (c) Johan Tibell 2007-2010+-- License : BSD-style+--+-- Maintainer : johan.tibell@gmail.com+-- Stability : stable+-- Portability : portable+--+-- This module provides access to the BSD /socket/ interface. This+-- module is generally more efficient than the 'String' based network+-- functions in 'Network.Socket'. For detailed documentation, consult+-- your favorite POSIX socket reference. All functions communicate+-- failures by converting the error number to 'System.IO.IOError'.+--+-- This module is made to be imported with 'Network.Socket' like so:+--+-- > import Network.Socket hiding (send, sendTo, recv, recvFrom)+-- > import Network.Socket.ByteString+--+module Network.Socket.ByteString+ ( + -- * Send data to a socket+ send+ , sendAll+ , sendTo+ , sendAllTo++ -- ** Vectored I/O+ -- $vectored+ , sendMany+ , sendManyTo++ -- * Receive data from a socket+ , recv+ , recvFrom++ -- * Example+ -- $example+ ) where++import Control.Monad (liftM, when)+import Data.ByteString (ByteString)+import Data.ByteString.Internal (createAndTrim)+import Data.ByteString.Unsafe (unsafeUseAsCStringLen)+import Data.Word (Word8)+#if __GLASGOW_HASKELL__ >= 703+import Foreign.C.Types (CInt(..))+#else+import Foreign.C.Types (CInt)+#endif+import Foreign.Marshal.Alloc (allocaBytes)+import Foreign.Ptr (Ptr, castPtr)+import Network.Socket (SockAddr, Socket(..), sendBufTo, recvBufFrom)++import qualified Data.ByteString as B++import Network.Socket.ByteString.Internal+import Network.Socket.Internal+import Network.Socket.Types++#if !defined(mingw32_HOST_OS)+import Control.Monad (zipWithM_)+import Foreign.C.Types (CChar)+# if __GLASGOW_HASKELL__ >= 703+import Foreign.C.Types (CSize(..))+# else+import Foreign.C.Types (CSize)+# endif+import Foreign.Marshal.Array (allocaArray)+import Foreign.Marshal.Utils (with)+import Foreign.Ptr (plusPtr)+import Foreign.Storable (Storable(..))++import Network.Socket.ByteString.IOVec (IOVec(..))+import Network.Socket.ByteString.MsgHdr (MsgHdr(..))++import GHC.Conc (threadWaitRead, threadWaitWrite)+#else+# if __GLASGOW_HASKELL__ >= 611+import GHC.IO.FD+# else+import GHC.Handle (readRawBufferPtr, writeRawBufferPtr)+# endif+#endif++#if !defined(mingw32_HOST_OS)+foreign import CALLCONV unsafe "send"+ c_send :: CInt -> Ptr a -> CSize -> CInt -> IO CInt+foreign import CALLCONV unsafe "recv"+ c_recv :: CInt -> Ptr CChar -> CSize -> CInt -> IO CInt+#endif++-- ----------------------------------------------------------------------------+-- Sending++-- | Send data to the socket. The socket must be connected to a+-- remote socket. Returns the number of bytes sent. Applications are+-- responsible for ensuring that all data has been sent.+send :: Socket -- ^ Connected socket+ -> ByteString -- ^ Data to send+ -> IO Int -- ^ Number of bytes sent+send sock@(MkSocket s _ _ _ _) xs =+ unsafeUseAsCStringLen xs $ \(str, len) ->+ liftM fromIntegral $+#if defined(mingw32_HOST_OS)+# if __GLASGOW_HASKELL__ >= 611+ writeRawBufferPtr "Network.Socket.ByteString.send"+ (FD s 1) (castPtr str) 0 (fromIntegral len)+# else+ writeRawBufferPtr "Network.Socket.ByteString.send"+ (fromIntegral s) True str 0 (fromIntegral len)+# endif+#else+ throwSocketErrorWaitWrite sock "send" $+ c_send s str (fromIntegral len) 0+#endif++-- | Send data to the socket. The socket must be connected to a+-- remote socket. Unlike 'send', this function continues to send data+-- until either all data has been sent or an error occurs. On error,+-- an exception is raised, and there is no way to determine how much+-- data, if any, was successfully sent.+sendAll :: Socket -- ^ Connected socket+ -> ByteString -- ^ Data to send+ -> IO ()+sendAll sock bs = do+ sent <- send sock bs+ when (sent < B.length bs) $ sendAll sock (B.drop sent bs)++-- | Send data to the socket. The recipient can be specified+-- explicitly, so the socket need not be in a connected state.+-- Returns the number of bytes sent. Applications are responsible for+-- ensuring that all data has been sent.+sendTo :: Socket -- ^ Socket+ -> ByteString -- ^ Data to send+ -> SockAddr -- ^ Recipient address+ -> IO Int -- ^ Number of bytes sent+sendTo sock xs addr =+ unsafeUseAsCStringLen xs $ \(str, len) -> sendBufTo sock str len addr++-- | Send data to the socket. The recipient can be specified+-- explicitly, so the socket need not be in a connected state. Unlike+-- 'sendTo', this function continues to send data until either all+-- data has been sent or an error occurs. On error, an exception is+-- raised, and there is no way to determine how much data, if any, was+-- successfully sent.+sendAllTo :: Socket -- ^ Socket+ -> ByteString -- ^ Data to send+ -> SockAddr -- ^ Recipient address+ -> IO ()+sendAllTo sock xs addr = do+ sent <- sendTo sock xs addr+ when (sent < B.length xs) $ sendAllTo sock (B.drop sent xs) addr++-- ----------------------------------------------------------------------------+-- ** Vectored I/O++-- $vectored+--+-- Vectored I\/O, also known as scatter\/gather I\/O, allows multiple+-- data segments to be sent using a single system call, without first+-- concatenating the segments. For example, given a list of+-- @ByteString@s, @xs@,+--+-- > sendMany sock xs+--+-- is equivalent to+--+-- > sendAll sock (concat xs)+--+-- but potentially more efficient.+--+-- Vectored I\/O are often useful when implementing network protocols+-- that, for example, group data into segments consisting of one or+-- more fixed-length headers followed by a variable-length body.++-- | Send data to the socket. The socket must be in a connected+-- state. The data is sent as if the parts have been concatenated.+-- This function continues to send data until either all data has been+-- sent or an error occurs. On error, an exception is raised, and+-- there is no way to determine how much data, if any, was+-- successfully sent.+sendMany :: Socket -- ^ Connected socket+ -> [ByteString] -- ^ Data to send+ -> IO ()+#if !defined(mingw32_HOST_OS)+sendMany sock@(MkSocket fd _ _ _ _) cs = do+ sent <- sendManyInner+ when (sent < totalLength cs) $ sendMany sock (remainingChunks sent cs)+ where+ sendManyInner =+ liftM fromIntegral . withIOVec cs $ \(iovsPtr, iovsLen) ->+ throwSocketErrorWaitWrite sock "writev" $+ c_writev (fromIntegral fd) iovsPtr+ (fromIntegral (min iovsLen (0x0026)))+#else+sendMany sock = sendAll sock . B.concat+#endif++-- | Send data to the socket. The recipient can be specified+-- explicitly, so the socket need not be in a connected state. The+-- data is sent as if the parts have been concatenated. This function+-- continues to send data until either all data has been sent or an+-- error occurs. On error, an exception is raised, and there is no+-- way to determine how much data, if any, was successfully sent.+sendManyTo :: Socket -- ^ Socket+ -> [ByteString] -- ^ Data to send+ -> SockAddr -- ^ Recipient address+ -> IO ()+#if !defined(mingw32_HOST_OS)+sendManyTo sock@(MkSocket fd _ _ _ _) cs addr = do+ sent <- liftM fromIntegral sendManyToInner+ when (sent < totalLength cs) $ sendManyTo sock (remainingChunks sent cs) addr+ where+ sendManyToInner =+ withSockAddr addr $ \addrPtr addrSize ->+ withIOVec cs $ \(iovsPtr, iovsLen) -> do+ let msgHdr = MsgHdr+ addrPtr (fromIntegral addrSize)+ iovsPtr (fromIntegral iovsLen)+ with msgHdr $ \msgHdrPtr ->+ throwSocketErrorWaitWrite sock "sendmsg" $+ c_sendmsg (fromIntegral fd) msgHdrPtr 0+#else+sendManyTo sock cs = sendAllTo sock (B.concat cs)+#endif++-- ----------------------------------------------------------------------------+-- Receiving++-- | Receive data from the socket. The socket must be in a connected+-- state. This function may return fewer bytes than specified. If+-- the message is longer than the specified length, it may be+-- discarded depending on the type of socket. This function may block+-- until a message arrives.+--+-- Considering hardware and network realities, the maximum number of bytes to+-- receive should be a small power of 2, e.g., 4096.+--+-- For TCP sockets, a zero length return value means the peer has+-- closed its half side of the connection.+recv :: Socket -- ^ Connected socket+ -> Int -- ^ Maximum number of bytes to receive+ -> IO ByteString -- ^ Data received+recv sock nbytes+ | nbytes < 0 = ioError (mkInvalidRecvArgError "Network.Socket.ByteString.recv")+ | otherwise = createAndTrim nbytes $ recvInner sock nbytes++recvInner :: Socket -> Int -> Ptr Word8 -> IO Int+recvInner sock nbytes ptr =+ fmap fromIntegral $+#if defined(mingw32_HOST_OS)+# if __GLASGOW_HASKELL__ >= 611+ readRawBufferPtr "Network.Socket.ByteString.recv" (FD s 1) ptr 0 (fromIntegral nbytes)+# else+ readRawBufferPtr "Network.Socket.ByteString.recv" (fromIntegral s)+ True (castPtr ptr) 0 (fromIntegral nbytes)+# endif+#else+ throwSocketErrorWaitRead sock "recv" $+ c_recv s (castPtr ptr) (fromIntegral nbytes) 0+#endif+ where+ s = sockFd sock++-- | Receive data from the socket. The socket need not be in a+-- connected state. Returns @(bytes, address)@ where @bytes@ is a+-- 'ByteString' representing the data received and @address@ is a+-- 'SockAddr' representing the address of the sending socket.+recvFrom :: Socket -- ^ Socket+ -> Int -- ^ Maximum number of bytes to receive+ -> IO (ByteString, SockAddr) -- ^ Data received and sender address+recvFrom sock nbytes =+ allocaBytes nbytes $ \ptr -> do+ (len, sockaddr) <- recvBufFrom sock ptr nbytes+ str <- B.packCStringLen (ptr, len)+ return (str, sockaddr)++-- ----------------------------------------------------------------------------+-- Not exported++#if !defined(mingw32_HOST_OS)+-- | Suppose we try to transmit a list of chunks @cs@ via a gathering write+-- operation and find that @n@ bytes were sent. Then @remainingChunks n cs@ is+-- list of chunks remaining to be sent.+remainingChunks :: Int -> [ByteString] -> [ByteString]+remainingChunks _ [] = []+remainingChunks i (x:xs)+ | i < len = B.drop i x : xs+ | otherwise = let i' = i - len in i' `seq` remainingChunks i' xs+ where+ len = B.length x++-- | @totalLength cs@ is the sum of the lengths of the chunks in the list @cs@.+totalLength :: [ByteString] -> Int+totalLength = sum . map B.length++-- | @withIOVec cs f@ executes the computation @f@, passing as argument a pair+-- consisting of a pointer to a temporarily allocated array of pointers to+-- 'IOVec' made from @cs@ and the number of pointers (@length cs@).+-- /Unix only/.+withIOVec :: [ByteString] -> ((Ptr IOVec, Int) -> IO a) -> IO a+withIOVec cs f =+ allocaArray csLen $ \aPtr -> do+ zipWithM_ pokeIov (ptrs aPtr) cs+ f (aPtr, csLen)+ where+ csLen = length cs+ ptrs = iterate (`plusPtr` sizeOf (undefined :: IOVec))+ pokeIov ptr s =+ unsafeUseAsCStringLen s $ \(sPtr, sLen) ->+ poke ptr $ IOVec sPtr (fromIntegral sLen)+#endif++-- ---------------------------------------------------------------------+-- Example++-- $example+--+-- Here are two minimal example programs using the TCP/IP protocol: a+-- server that echoes all data that it receives back (servicing only+-- one client) and a client using it.+--+-- > -- Echo server program+-- > module Main where+-- >+-- > import Control.Monad (unless)+-- > import Network.Socket hiding (recv)+-- > import qualified Data.ByteString as S+-- > import Network.Socket.ByteString (recv, sendAll)+-- >+-- > main :: IO ()+-- > main = withSocketsDo $+-- > do addrinfos <- getAddrInfo+-- > (Just (defaultHints {addrFlags = [AI_PASSIVE]}))+-- > Nothing (Just "3000")+-- > let serveraddr = head addrinfos+-- > sock <- socket (addrFamily serveraddr) Stream defaultProtocol+-- > bindSocket sock (addrAddress serveraddr)+-- > listen sock 1+-- > (conn, _) <- accept sock+-- > talk conn+-- > sClose conn+-- > sClose sock+-- >+-- > where+-- > talk :: Socket -> IO ()+-- > talk conn =+-- > do msg <- recv conn 1024+-- > unless (S.null msg) $ sendAll conn msg >> talk conn+--+-- > -- Echo client program+-- > module Main where+-- >+-- > import Network.Socket hiding (recv)+-- > import Network.Socket.ByteString (recv, sendAll)+-- > import qualified Data.ByteString.Char8 as C+-- >+-- > main :: IO ()+-- > main = withSocketsDo $+-- > do addrinfos <- getAddrInfo Nothing (Just "") (Just "3000")+-- > let serveraddr = head addrinfos+-- > sock <- socket (addrFamily serveraddr) Stream defaultProtocol+-- > connect sock (addrAddress serveraddr)+-- > sendAll sock $ C.pack "Hello, world!"+-- > msg <- recv sock 1024+-- > sClose sock+-- > putStr "Received "+-- > C.putStrLn msg
+ standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/IOVec.hsc view
@@ -0,0 +1,30 @@+{-# OPTIONS_GHC -funbox-strict-fields #-}++-- | Support module for the POSIX writev system call.+module Network.Socket.ByteString.IOVec+ ( IOVec(..)+ ) where++import Foreign.C.Types (CChar, CInt, CSize)+import Foreign.Ptr (Ptr)+import Foreign.Storable (Storable(..))++#include <sys/uio.h>++data IOVec = IOVec+ { iovBase :: !(Ptr CChar)+ , iovLen :: !CSize+ }++instance Storable IOVec where+ sizeOf _ = (#const sizeof(struct iovec))+ alignment _ = alignment (undefined :: CInt)++ peek p = do+ base <- (#peek struct iovec, iov_base) p+ len <- (#peek struct iovec, iov_len) p+ return $ IOVec base len++ poke p iov = do+ (#poke struct iovec, iov_base) p (iovBase iov)+ (#poke struct iovec, iov_len) p (iovLen iov)
+ standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Internal.hs view
@@ -0,0 +1,54 @@+{-# LANGUAGE CPP, ForeignFunctionInterface #-}++-- |+-- Module : Network.Socket.ByteString.Internal+-- Copyright : (c) Johan Tibell 2007-2010+-- License : BSD-style+--+-- Maintainer : johan.tibell@gmail.com+-- Stability : stable+-- Portability : portable+--+module Network.Socket.ByteString.Internal+ (+ mkInvalidRecvArgError+#if !defined(mingw32_HOST_OS)+ , c_writev+ , c_sendmsg+#endif+ ) where++import System.IO.Error (ioeSetErrorString, mkIOError)++#if !defined(mingw32_HOST_OS)+# if __GLASGOW_HASKELL__ >= 703+import Foreign.C.Types (CInt(..))+import System.Posix.Types (CSsize(..))+# else+import Foreign.C.Types (CInt)+import System.Posix.Types (CSsize)+# endif+import Foreign.Ptr (Ptr)++import Network.Socket.ByteString.IOVec (IOVec)+import Network.Socket.ByteString.MsgHdr (MsgHdr)+#endif++#if __GLASGOW_HASKELL__ < 611+import GHC.IOBase (IOErrorType(..))+#else+import GHC.IO.Exception (IOErrorType(..))+#endif++mkInvalidRecvArgError :: String -> IOError+mkInvalidRecvArgError loc = ioeSetErrorString (mkIOError+ InvalidArgument+ loc Nothing Nothing) "non-positive length"++#if !defined(mingw32_HOST_OS)+foreign import ccall unsafe "writev"+ c_writev :: CInt -> Ptr IOVec -> CInt -> IO CSsize++foreign import ccall unsafe "sendmsg"+ c_sendmsg :: CInt -> Ptr MsgHdr -> CInt -> IO CSsize+#endif
+ standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/Lazy.hsc view
@@ -0,0 +1,149 @@+{-# LANGUAGE BangPatterns, CPP, ForeignFunctionInterface #-}++-- |+-- Module : Network.Socket.ByteString.Lazy+-- Copyright : (c) Bryan O'Sullivan 2009+-- License : BSD-style+--+-- Maintainer : bos@serpentine.com+-- Stability : experimental+-- Portability : POSIX, GHC+--+-- This module provides access to the BSD /socket/ interface. This+-- module is generally more efficient than the 'String' based network+-- functions in 'Network.Socket'. For detailed documentation, consult+-- your favorite POSIX socket reference. All functions communicate+-- failures by converting the error number to 'System.IO.IOError'.+--+-- This module is made to be imported with 'Network.Socket' like so:+--+-- > import Network.Socket hiding (send, sendTo, recv, recvFrom)+-- > import Network.Socket.ByteString.Lazy+-- > import Prelude hiding (getContents)+--+module Network.Socket.ByteString.Lazy+ (+#if !defined(mingw32_HOST_OS)+ -- * Send data to a socket+ send+ , sendAll+ ,+#endif++ -- * Receive data from a socket+ getContents+ , recv+ ) where++import Control.Monad (liftM)+import Data.ByteString.Lazy.Internal (ByteString(..), defaultChunkSize)+import Data.Int (Int64)+import Network.Socket (Socket(..), ShutdownCmd(..), shutdown)+import Prelude hiding (getContents)+import System.IO.Unsafe (unsafeInterleaveIO)++import qualified Data.ByteString as S+import qualified Network.Socket.ByteString as N++#if !defined(mingw32_HOST_OS)+import Control.Monad (unless)+import Data.ByteString.Unsafe (unsafeUseAsCStringLen)+import Foreign.Marshal.Array (allocaArray)+import Foreign.Ptr (plusPtr)+import Foreign.Storable (Storable(..))+import Network.Socket.ByteString.IOVec (IOVec(IOVec))+import Network.Socket.ByteString.Internal (c_writev)+import Network.Socket.Internal++import qualified Data.ByteString.Lazy as L++import GHC.Conc (threadWaitWrite)+#endif++#if !defined(mingw32_HOST_OS)+-- -----------------------------------------------------------------------------+-- Sending++-- | Send data to the socket. The socket must be in a connected state.+-- Returns the number of bytes sent. Applications are responsible for+-- ensuring that all data has been sent.+--+-- Because a lazily generated 'ByteString' may be arbitrarily long,+-- this function caps the amount it will attempt to send at 4MB. This+-- number is large (so it should not penalize performance on fast+-- networks), but not outrageously so (to avoid demanding lazily+-- computed data unnecessarily early). Before being sent, the lazy+-- 'ByteString' will be converted to a list of strict 'ByteString's+-- with 'L.toChunks'; at most 1024 chunks will be sent. /Unix only/.+send :: Socket -- ^ Connected socket+ -> ByteString -- ^ Data to send+ -> IO Int64 -- ^ Number of bytes sent+send sock@(MkSocket fd _ _ _ _) s = do+ let cs = take maxNumChunks (L.toChunks s)+ len = length cs+ liftM fromIntegral . allocaArray len $ \ptr ->+ withPokes cs ptr $ \niovs ->+ throwSocketErrorWaitWrite sock "writev" $+ c_writev (fromIntegral fd) ptr niovs+ where+ withPokes ss p f = loop ss p 0 0+ where loop (c:cs) q k !niovs+ | k < maxNumBytes =+ unsafeUseAsCStringLen c $ \(ptr,len) -> do+ poke q $ IOVec ptr (fromIntegral len)+ loop cs (q `plusPtr` sizeOf (undefined :: IOVec))+ (k + fromIntegral len) (niovs + 1)+ | otherwise = f niovs+ loop _ _ _ niovs = f niovs+ maxNumBytes = 4194304 :: Int -- maximum number of bytes to transmit in one system call+ maxNumChunks = 1024 :: Int -- maximum number of chunks to transmit in one system call++-- | Send data to the socket. The socket must be in a connected+-- state. This function continues to send data until either all data+-- has been sent or an error occurs. If there is an error, an+-- exception is raised, and there is no way to determine how much data+-- was sent. /Unix only/.+sendAll :: Socket -- ^ Connected socket+ -> ByteString -- ^ Data to send+ -> IO ()+sendAll sock bs = do+ sent <- send sock bs+ let bs' = L.drop sent bs+ unless (L.null bs') $ sendAll sock bs'+#endif++-- -----------------------------------------------------------------------------+-- Receiving++-- | Receive data from the socket. The socket must be in a connected+-- state. Data is received on demand, in chunks; each chunk will be+-- sized to reflect the amount of data received by individual 'recv'+-- calls.+--+-- All remaining data from the socket is consumed. When there is no+-- more data to be received, the receiving side of the socket is shut+-- down. If there is an error and an exception is thrown, the socket+-- is not shut down.+getContents :: Socket -- ^ Connected socket+ -> IO ByteString -- ^ Data received+getContents sock = loop where+ loop = unsafeInterleaveIO $ do+ s <- N.recv sock defaultChunkSize+ if S.null s+ then shutdown sock ShutdownReceive >> return Empty+ else Chunk s `liftM` loop++-- | Receive data from the socket. The socket must be in a connected+-- state. This function may return fewer bytes than specified. If+-- the received data is longer than the specified length, it may be+-- discarded depending on the type of socket. This function may block+-- until a message arrives.+--+-- If there is no more data to be received, returns an empty 'ByteString'.+recv :: Socket -- ^ Connected socket+ -> Int64 -- ^ Maximum number of bytes to receive+ -> IO ByteString -- ^ Data received+recv sock nbytes = chunk `liftM` N.recv sock (fromIntegral nbytes) where+ chunk k+ | S.null k = Empty+ | otherwise = Chunk k Empty
+ standalone/android/tmp/network-2.4.1.2/Network/Socket/ByteString/MsgHdr.hsc view
@@ -0,0 +1,48 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -funbox-strict-fields #-}++-- | Support module for the POSIX 'sendmsg' system call.+module Network.Socket.ByteString.MsgHdr+ ( MsgHdr(..)+ ) where++#include <sys/types.h>+#include <sys/socket.h>++import Foreign.C.Types (CInt, CSize, CUInt)+import Foreign.Ptr (Ptr)+import Foreign.Storable (Storable(..))+import Network.Socket (SockAddr)+import Network.Socket.Internal (zeroMemory)++import Network.Socket.ByteString.IOVec (IOVec)++-- We don't use msg_control, msg_controllen, and msg_flags as these+-- don't exist on OpenSolaris.+data MsgHdr = MsgHdr+ { msgName :: !(Ptr SockAddr)+ , msgNameLen :: !CUInt+ , msgIov :: !(Ptr IOVec)+ , msgIovLen :: !CSize+ }++instance Storable MsgHdr where+ sizeOf _ = (#const sizeof(struct msghdr))+ alignment _ = alignment (undefined :: CInt)++ peek p = do+ name <- (#peek struct msghdr, msg_name) p+ nameLen <- (#peek struct msghdr, msg_namelen) p+ iov <- (#peek struct msghdr, msg_iov) p+ iovLen <- (#peek struct msghdr, msg_iovlen) p+ return $ MsgHdr name nameLen iov iovLen++ poke p mh = do+ -- We need to zero the msg_control, msg_controllen, and msg_flags+ -- fields, but they only exist on some platforms (e.g. not on+ -- Solaris). Instead of using CPP, we zero the entire struct.+ zeroMemory p (#const sizeof(struct msghdr))+ (#poke struct msghdr, msg_name) p (msgName mh)+ (#poke struct msghdr, msg_namelen) p (msgNameLen mh)+ (#poke struct msghdr, msg_iov) p (msgIov mh)+ (#poke struct msghdr, msg_iovlen) p (msgIovLen mh)
+ standalone/android/tmp/network-2.4.1.2/Network/Socket/Internal.hsc view
@@ -0,0 +1,257 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE ForeignFunctionInterface #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+-----------------------------------------------------------------------------+-- |+-- Module : Network.Socket.Internal+-- Copyright : (c) The University of Glasgow 2001+-- License : BSD-style (see the file libraries/network/LICENSE)+--+-- Maintainer : libraries@haskell.org+-- Stability : provisional+-- Portability : portable+--+-- A module containing semi-public 'Network.Socket' internals.+-- Modules which extend the 'Network.Socket' module will need to use+-- this module while ideally most users will be able to make do with+-- the public interface.+--+-----------------------------------------------------------------------------++#include "HsNet.h"++module Network.Socket.Internal+ (+ -- * Socket addresses+ HostAddress+#if defined(IPV6_SOCKET_SUPPORTNO)+ , HostAddress6+ , FlowInfo+ , ScopeID+#endif+ , PortNumber(..)+ , SockAddr(..)++ , peekSockAddr+ , pokeSockAddr+ , sizeOfSockAddr+ , sizeOfSockAddrByFamily+ , withSockAddr+ , withNewSockAddr++ -- * Protocol families+ , Family(..)++ -- * Socket error functions+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)+ , c_getLastError+#endif+ , throwSocketError+ , throwSocketErrorCode++ -- * Guards for socket operations that may fail+ , throwSocketErrorIfMinus1_+ , throwSocketErrorIfMinus1Retry+ , throwSocketErrorIfMinus1RetryMayBlock++ -- ** Guards that wait and retry if the operation would block+ -- | These guards are based on 'throwSocketErrorIfMinus1RetryMayBlock'.+ -- They wait for socket readiness if the action fails with @EWOULDBLOCK@+ -- or similar.+ , throwSocketErrorWaitRead+ , throwSocketErrorWaitWrite++ -- * Initialization+ , withSocketsDo++ -- * Low-level helpers+ , zeroMemory+ ) where++import Data.Bits ( (.|.), shiftL, shiftR )+import Data.Word ( Word8, Word16, Word32 )+import Data.Typeable (Typeable)+import Foreign.C.Error (throwErrno, throwErrnoIfMinus1Retry,+ throwErrnoIfMinus1RetryMayBlock, throwErrnoIfMinus1_,+ Errno(..), errnoToIOError)+import Foreign.C.String ( castCharToCChar, peekCString )+#if __GLASGOW_HASKELL__ >= 703+import Foreign.C.Types ( CInt(..), CSize(..) )+#else+import Foreign.C.Types ( CInt, CSize )+#endif+import Foreign.Marshal.Alloc ( allocaBytes )+import Foreign.Marshal.Array ( pokeArray, pokeArray0 )+import Foreign.Ptr ( Ptr, castPtr, plusPtr )+import Foreign.Storable ( Storable(..) )+import GHC.Conc (threadWaitRead, threadWaitWrite)++#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)+import Control.Exception ( finally )+# if __GLASGOW_HASKELL__ >= 707+import GHC.IO.Exception ( IOErrorType(..) )+# else+import GHC.IOBase ( IOErrorType(..) )+# endif+import Foreign.C.Types ( CChar )+import System.IO.Error ( ioeSetErrorString, mkIOError )+#endif++import Network.Socket.Types++-- ---------------------------------------------------------------------+-- Guards for socket operations that may fail++-- | Throw an 'IOError' corresponding to the current socket error.+throwSocketError :: String -- ^ textual description of the error location+ -> IO a++-- | Like 'throwSocketError', but the error code is supplied as an argument.+--+-- On Windows, do not use errno. Use a system error code instead.+throwSocketErrorCode :: String -> CInt -> IO a++-- | Throw an 'IOError' corresponding to the current socket error if+-- the IO action returns a result of @-1@. Discards the result of the+-- IO action after error handling.+throwSocketErrorIfMinus1_+ :: (Eq a, Num a)+ => String -- ^ textual description of the location+ -> IO a -- ^ the 'IO' operation to be executed+ -> IO ()++{-# SPECIALIZE throwSocketErrorIfMinus1_ :: String -> IO CInt -> IO () #-}++-- | Throw an 'IOError' corresponding to the current socket error if+-- the IO action returns a result of @-1@, but retries in case of an+-- interrupted operation.+throwSocketErrorIfMinus1Retry+ :: (Eq a, Num a)+ => String -- ^ textual description of the location+ -> IO a -- ^ the 'IO' operation to be executed+ -> IO a++{-# SPECIALIZE throwSocketErrorIfMinus1Retry :: String -> IO CInt -> IO CInt #-}++-- | Throw an 'IOError' corresponding to the current socket error if+-- the IO action returns a result of @-1@, but retries in case of an+-- interrupted operation. Checks for operations that would block and+-- executes an alternative action before retrying in that case.+throwSocketErrorIfMinus1RetryMayBlock+ :: (Eq a, Num a)+ => String -- ^ textual description of the location+ -> IO b -- ^ action to execute before retrying if an+ -- immediate retry would block+ -> IO a -- ^ the 'IO' operation to be executed+ -> IO a++{-# SPECIALIZE throwSocketErrorIfMinus1RetryMayBlock+ :: String -> IO b -> IO CInt -> IO CInt #-}++#if (!defined(HAVE_WINSOCK2_H) || defined(cygwin32_HOST_OS))++throwSocketErrorIfMinus1RetryMayBlock name on_block act =+ throwErrnoIfMinus1RetryMayBlock name act on_block++throwSocketErrorIfMinus1Retry = throwErrnoIfMinus1Retry++throwSocketErrorIfMinus1_ = throwErrnoIfMinus1_++throwSocketError = throwErrno++throwSocketErrorCode loc errno =+ ioError (errnoToIOError loc (Errno errno) Nothing Nothing)++#else++throwSocketErrorIfMinus1RetryMayBlock name _ act+ = throwSocketErrorIfMinus1Retry name act++throwSocketErrorIfMinus1_ name act = do+ throwSocketErrorIfMinus1Retry name act+ return ()++# if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)+throwSocketErrorIfMinus1Retry name act = do+ r <- act+ if (r == -1)+ then do+ rc <- c_getLastError+ case rc of+ #{const WSANOTINITIALISED} -> do+ withSocketsDo (return ())+ r <- act+ if (r == -1)+ then throwSocketError name+ else return r+ _ -> throwSocketError name+ else return r++throwSocketErrorCode name rc = do+ pstr <- c_getWSError rc+ str <- peekCString pstr+ ioError (ioeSetErrorString (mkIOError OtherError name Nothing Nothing) str)++throwSocketError name =+ c_getLastError >>= throwSocketErrorCode name++foreign import CALLCONV unsafe "WSAGetLastError"+ c_getLastError :: IO CInt++foreign import ccall unsafe "getWSErrorDescr"+ c_getWSError :: CInt -> IO (Ptr CChar)+++# else+throwSocketErrorIfMinus1Retry = throwErrnoIfMinus1Retry+throwSocketError = throwErrno+throwSocketErrorCode loc errno =+ ioError (errnoToIOError loc (Errno errno) Nothing Nothing)+# endif+#endif++-- | Like 'throwSocketErrorIfMinus1Retry', but if the action fails with+-- @EWOULDBLOCK@ or similar, wait for the socket to be read-ready,+-- and try again.+throwSocketErrorWaitRead :: (Eq a, Num a) => Socket -> String -> IO a -> IO a+throwSocketErrorWaitRead sock name io =+ throwSocketErrorIfMinus1RetryMayBlock name+ (threadWaitRead $ fromIntegral $ sockFd sock)+ io++-- | Like 'throwSocketErrorIfMinus1Retry', but if the action fails with+-- @EWOULDBLOCK@ or similar, wait for the socket to be write-ready,+-- and try again.+throwSocketErrorWaitWrite :: (Eq a, Num a) => Socket -> String -> IO a -> IO a+throwSocketErrorWaitWrite sock name io =+ throwSocketErrorIfMinus1RetryMayBlock name+ (threadWaitWrite $ fromIntegral $ sockFd sock)+ io++-- ---------------------------------------------------------------------------+-- WinSock support++{-| On Windows operating systems, the networking subsystem has to be+initialised using 'withSocketsDo' before any networking operations can+be used. eg.++> main = withSocketsDo $ do {...}++Although this is only strictly necessary on Windows platforms, it is+harmless on other platforms, so for portability it is good practice to+use it all the time.+-}+withSocketsDo :: IO a -> IO a+#if !defined(WITH_WINSOCK)+withSocketsDo x = x+#else+withSocketsDo act = do+ x <- initWinSock+ if x /= 0+ then ioError (userError "Failed to initialise WinSock")+ else act `finally` shutdownWinSock++foreign import ccall unsafe "initWinSock" initWinSock :: IO Int+foreign import ccall unsafe "shutdownWinSock" shutdownWinSock :: IO ()++#endif
+ standalone/android/tmp/network-2.4.1.2/Network/Socket/Types.hsc view
@@ -0,0 +1,962 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ForeignFunctionInterface #-}+module Network.Socket.Types+ (+ -- * Socket+ Socket(..)+ , sockFd+ , sockFamily+ , sockType+ , sockProtocol+ , sockStatus+ , SocketStatus(..)++ -- * Socket types+ , SocketType(..)+ , isSupportedSocketType+ , packSocketType+ , packSocketType'+ , packSocketTypeOrThrow+ , unpackSocketType+ , unpackSocketType'++ -- * Family+ , Family(..)+ , isSupportedFamily+ , packFamily+ , unpackFamily++ -- * Socket addresses+ , SockAddr(..)+ , HostAddress+#if defined(IPV6_SOCKET_SUPPORT)+ , HostAddress6+ , FlowInfo+ , ScopeID+#endif+ , peekSockAddr+ , pokeSockAddr+ , sizeOfSockAddr+ , sizeOfSockAddrByFamily+ , withSockAddr+ , withNewSockAddr++ -- * Unsorted+ , ProtocolNumber+ , PortNumber(..)++ -- * Low-level helpers+ , zeroMemory+ ) where++#include "HsNet.h"++import Control.Concurrent.MVar+import Control.Monad+import Data.Bits+import Data.Maybe+import Data.Ratio+import Data.Typeable+import Data.Word+import Foreign.C+import Foreign.Marshal.Alloc+import Foreign.Marshal.Array+import Foreign.Ptr+import Foreign.Storable++data Socket+ = MkSocket+ CInt -- File Descriptor+ Family+ SocketType+ ProtocolNumber -- Protocol Number+ (MVar SocketStatus) -- Status Flag+ deriving Typeable++sockFd (MkSocket n _ _ _ _) = n+sockFamily (MkSocket _ f _ _ _) = f+sockType (MkSocket _ _ t _ _) = t+sockProtocol (MkSocket _ _ _ p _) = p+sockStatus (MkSocket _ _ _ _ s) = s++instance Eq Socket where+ (MkSocket _ _ _ _ m1) == (MkSocket _ _ _ _ m2) = m1 == m2++instance Show Socket where+ showsPrec _n (MkSocket fd _ _ _ _) =+ showString "<socket: " . shows fd . showString ">"++type ProtocolNumber = CInt++data SocketStatus+ -- Returned Status Function called+ = NotConnected -- socket+ | Bound -- bind+ | Listening -- listen+ | Connected -- connect/accept+ | ConvertedToHandle -- is now a Handle, don't touch+ | Closed -- close+ deriving (Eq, Show, Typeable)++-----------------------------------------------------------------------------+-- Socket types++-- There are a few possible ways to do this. The first is convert the+-- structs used in the C library into an equivalent Haskell type. An+-- other possible implementation is to keep all the internals in the C+-- code and use an Int## and a status flag. The second method is used+-- here since a lot of the C structures are not required to be+-- manipulated.++-- Originally the status was non-mutable so we had to return a new+-- socket each time we changed the status. This version now uses+-- mutable variables to avoid the need to do this. The result is a+-- cleaner interface and better security since the application+-- programmer now can't circumvent the status information to perform+-- invalid operations on sockets.++-- | Socket Types.+--+-- The existence of a constructor does not necessarily imply that that+-- socket type is supported on your system: see 'isSupportedSocketType'.+data SocketType+ = NoSocketType -- ^ 0, used in getAddrInfo hints, for example+ | Stream -- ^ SOCK_STREAM+ | Datagram -- ^ SOCK_DGRAM+ | Raw -- ^ SOCK_RAW+ | RDM -- ^ SOCK_RDM+ | SeqPacket -- ^ SOCK_SEQPACKET+ deriving (Eq, Ord, Read, Show, Typeable)++-- | Does the SOCK_ constant corresponding to the given SocketType exist on+-- this system?+isSupportedSocketType :: SocketType -> Bool+isSupportedSocketType = isJust . packSocketType'++-- | Find the SOCK_ constant corresponding to the SocketType value.+packSocketType' :: SocketType -> Maybe CInt+packSocketType' stype = case Just stype of+ -- the Just above is to disable GHC's overlapping pattern+ -- detection: see comments for packSocketOption+ Just NoSocketType -> Just 0+#ifdef SOCK_STREAM+ Just Stream -> Just #const SOCK_STREAM+#endif+#ifdef SOCK_DGRAM+ Just Datagram -> Just #const SOCK_DGRAM+#endif+#ifdef SOCK_RAW+ Just Raw -> Just #const SOCK_RAW+#endif+#ifdef SOCK_RDM+ Just RDM -> Just #const SOCK_RDM+#endif+#ifdef SOCK_SEQPACKET+ Just SeqPacket -> Just #const SOCK_SEQPACKET+#endif+ _ -> Nothing++packSocketType :: SocketType -> CInt+packSocketType stype = fromMaybe (error errMsg) (packSocketType' stype)+ where+ errMsg = concat ["Network.Socket.packSocketType: ",+ "socket type ", show stype, " unsupported on this system"]++-- | Try packSocketType' on the SocketType, if it fails throw an error with+-- message starting "Network.Socket." ++ the String parameter+packSocketTypeOrThrow :: String -> SocketType -> IO CInt+packSocketTypeOrThrow caller stype = maybe err return (packSocketType' stype)+ where+ err = ioError . userError . concat $ ["Network.Socket.", caller, ": ",+ "socket type ", show stype, " unsupported on this system"]+++unpackSocketType:: CInt -> Maybe SocketType+unpackSocketType t = case t of+ 0 -> Just NoSocketType+#ifdef SOCK_STREAM+ (#const SOCK_STREAM) -> Just Stream+#endif+#ifdef SOCK_DGRAM+ (#const SOCK_DGRAM) -> Just Datagram+#endif+#ifdef SOCK_RAW+ (#const SOCK_RAW) -> Just Raw+#endif+#ifdef SOCK_RDM+ (#const SOCK_RDM) -> Just RDM+#endif+#ifdef SOCK_SEQPACKET+ (#const SOCK_SEQPACKET) -> Just SeqPacket+#endif+ _ -> Nothing++-- | Try unpackSocketType on the CInt, if it fails throw an error with+-- message starting "Network.Socket." ++ the String parameter+unpackSocketType' :: String -> CInt -> IO SocketType+unpackSocketType' caller ty = maybe err return (unpackSocketType ty)+ where+ err = ioError . userError . concat $ ["Network.Socket.", caller, ": ",+ "socket type ", show ty, " unsupported on this system"]++------------------------------------------------------------------------+-- Protocol Families.++-- | Address families.+--+-- A constructor being present here does not mean it is supported by the+-- operating system: see 'isSupportedFamily'.+data Family+ = AF_UNSPEC -- unspecified+ | AF_UNIX -- local to host (pipes, portals+ | AF_INET -- internetwork: UDP, TCP, etc+ | AF_INET6 -- Internet Protocol version 6+ | AF_IMPLINK -- arpanet imp addresses+ | AF_PUP -- pup protocols: e.g. BSP+ | AF_CHAOS -- mit CHAOS protocols+ | AF_NS -- XEROX NS protocols+ | AF_NBS -- nbs protocols+ | AF_ECMA -- european computer manufacturers+ | AF_DATAKIT -- datakit protocols+ | AF_CCITT -- CCITT protocols, X.25 etc+ | AF_SNA -- IBM SNA+ | AF_DECnet -- DECnet+ | AF_DLI -- Direct data link interface+ | AF_LAT -- LAT+ | AF_HYLINK -- NSC Hyperchannel+ | AF_APPLETALK -- Apple Talk+ | AF_ROUTE -- Internal Routing Protocol+ | AF_NETBIOS -- NetBios-style addresses+ | AF_NIT -- Network Interface Tap+ | AF_802 -- IEEE 802.2, also ISO 8802+ | AF_ISO -- ISO protocols+ | AF_OSI -- umbrella of all families used by OSI+ | AF_NETMAN -- DNA Network Management+ | AF_X25 -- CCITT X.25+ | AF_AX25+ | AF_OSINET -- AFI+ | AF_GOSSIP -- US Government OSI+ | AF_IPX -- Novell Internet Protocol+ | Pseudo_AF_XTP -- eXpress Transfer Protocol (no AF)+ | AF_CTF -- Common Trace Facility+ | AF_WAN -- Wide Area Network protocols+ | AF_SDL -- SGI Data Link for DLPI+ | AF_NETWARE+ | AF_NDD+ | AF_INTF -- Debugging use only+ | AF_COIP -- connection-oriented IP, aka ST II+ | AF_CNT -- Computer Network Technology+ | Pseudo_AF_RTIP -- Help Identify RTIP packets+ | Pseudo_AF_PIP -- Help Identify PIP packets+ | AF_SIP -- Simple Internet Protocol+ | AF_ISDN -- Integrated Services Digital Network+ | Pseudo_AF_KEY -- Internal key-management function+ | AF_NATM -- native ATM access+ | AF_ARP -- (rev.) addr. res. prot. (RFC 826)+ | Pseudo_AF_HDRCMPLT -- Used by BPF to not rewrite hdrs in iface output+ | AF_ENCAP+ | AF_LINK -- Link layer interface+ | AF_RAW -- Link layer interface+ | AF_RIF -- raw interface+ | AF_NETROM -- Amateur radio NetROM+ | AF_BRIDGE -- multiprotocol bridge+ | AF_ATMPVC -- ATM PVCs+ | AF_ROSE -- Amateur Radio X.25 PLP+ | AF_NETBEUI -- 802.2LLC+ | AF_SECURITY -- Security callback pseudo AF+ | AF_PACKET -- Packet family+ | AF_ASH -- Ash+ | AF_ECONET -- Acorn Econet+ | AF_ATMSVC -- ATM SVCs+ | AF_IRDA -- IRDA sockets+ | AF_PPPOX -- PPPoX sockets+ | AF_WANPIPE -- Wanpipe API sockets+ | AF_BLUETOOTH -- bluetooth sockets+ deriving (Eq, Ord, Read, Show)++packFamily :: Family -> CInt+packFamily f = case packFamily' f of+ Just fam -> fam+ Nothing -> error $+ "Network.Socket.packFamily: unsupported address family: " +++ show f++-- | Does the AF_ constant corresponding to the given family exist on this+-- system?+isSupportedFamily :: Family -> Bool+isSupportedFamily = isJust . packFamily'++packFamily' :: Family -> Maybe CInt+packFamily' f = case Just f of+ -- the Just above is to disable GHC's overlapping pattern+ -- detection: see comments for packSocketOption+ Just AF_UNSPEC -> Just #const AF_UNSPEC+#ifdef AF_UNIX+ Just AF_UNIX -> Just #const AF_UNIX+#endif+#ifdef AF_INET+ Just AF_INET -> Just #const AF_INET+#endif+#ifdef AF_INET6+ Just AF_INET6 -> Just #const AF_INET6+#endif+#ifdef AF_IMPLINK+ Just AF_IMPLINK -> Just #const AF_IMPLINK+#endif+#ifdef AF_PUP+ Just AF_PUP -> Just #const AF_PUP+#endif+#ifdef AF_CHAOS+ Just AF_CHAOS -> Just #const AF_CHAOS+#endif+#ifdef AF_NS+ Just AF_NS -> Just #const AF_NS+#endif+#ifdef AF_NBS+ Just AF_NBS -> Just #const AF_NBS+#endif+#ifdef AF_ECMA+ Just AF_ECMA -> Just #const AF_ECMA+#endif+#ifdef AF_DATAKIT+ Just AF_DATAKIT -> Just #const AF_DATAKIT+#endif+#ifdef AF_CCITT+ Just AF_CCITT -> Just #const AF_CCITT+#endif+#ifdef AF_SNA+ Just AF_SNA -> Just #const AF_SNA+#endif+#ifdef AF_DECnet+ Just AF_DECnet -> Just #const AF_DECnet+#endif+#ifdef AF_DLI+ Just AF_DLI -> Just #const AF_DLI+#endif+#ifdef AF_LAT+ Just AF_LAT -> Just #const AF_LAT+#endif+#ifdef AF_HYLINK+ Just AF_HYLINK -> Just #const AF_HYLINK+#endif+#ifdef AF_APPLETALK+ Just AF_APPLETALK -> Just #const AF_APPLETALK+#endif+#ifdef AF_ROUTE+ Just AF_ROUTE -> Just #const AF_ROUTE+#endif+#ifdef AF_NETBIOS+ Just AF_NETBIOS -> Just #const AF_NETBIOS+#endif+#ifdef AF_NIT+ Just AF_NIT -> Just #const AF_NIT+#endif+#ifdef AF_802+ Just AF_802 -> Just #const AF_802+#endif+#ifdef AF_ISO+ Just AF_ISO -> Just #const AF_ISO+#endif+#ifdef AF_OSI+ Just AF_OSI -> Just #const AF_OSI+#endif+#ifdef AF_NETMAN+ Just AF_NETMAN -> Just #const AF_NETMAN+#endif+#ifdef AF_X25+ Just AF_X25 -> Just #const AF_X25+#endif+#ifdef AF_AX25+ Just AF_AX25 -> Just #const AF_AX25+#endif+#ifdef AF_OSINET+ Just AF_OSINET -> Just #const AF_OSINET+#endif+#ifdef AF_GOSSIP+ Just AF_GOSSIP -> Just #const AF_GOSSIP+#endif+#ifdef AF_IPX+ Just AF_IPX -> Just #const AF_IPX+#endif+#ifdef Pseudo_AF_XTP+ Just Pseudo_AF_XTP -> Just #const Pseudo_AF_XTP+#endif+#ifdef AF_CTF+ Just AF_CTF -> Just #const AF_CTF+#endif+#ifdef AF_WAN+ Just AF_WAN -> Just #const AF_WAN+#endif+#ifdef AF_SDL+ Just AF_SDL -> Just #const AF_SDL+#endif+#ifdef AF_NETWARE+ Just AF_NETWARE -> Just #const AF_NETWARE+#endif+#ifdef AF_NDD+ Just AF_NDD -> Just #const AF_NDD+#endif+#ifdef AF_INTF+ Just AF_INTF -> Just #const AF_INTF+#endif+#ifdef AF_COIP+ Just AF_COIP -> Just #const AF_COIP+#endif+#ifdef AF_CNT+ Just AF_CNT -> Just #const AF_CNT+#endif+#ifdef Pseudo_AF_RTIP+ Just Pseudo_AF_RTIP -> Just #const Pseudo_AF_RTIP+#endif+#ifdef Pseudo_AF_PIP+ Just Pseudo_AF_PIP -> Just #const Pseudo_AF_PIP+#endif+#ifdef AF_SIP+ Just AF_SIP -> Just #const AF_SIP+#endif+#ifdef AF_ISDN+ Just AF_ISDN -> Just #const AF_ISDN+#endif+#ifdef Pseudo_AF_KEY+ Just Pseudo_AF_KEY -> Just #const Pseudo_AF_KEY+#endif+#ifdef AF_NATM+ Just AF_NATM -> Just #const AF_NATM+#endif+#ifdef AF_ARP+ Just AF_ARP -> Just #const AF_ARP+#endif+#ifdef Pseudo_AF_HDRCMPLT+ Just Pseudo_AF_HDRCMPLT -> Just #const Pseudo_AF_HDRCMPLT+#endif+#ifdef AF_ENCAP+ Just AF_ENCAP -> Just #const AF_ENCAP+#endif+#ifdef AF_LINK+ Just AF_LINK -> Just #const AF_LINK+#endif+#ifdef AF_RAW+ Just AF_RAW -> Just #const AF_RAW+#endif+#ifdef AF_RIF+ Just AF_RIF -> Just #const AF_RIF+#endif+#ifdef AF_NETROM+ Just AF_NETROM -> Just #const AF_NETROM+#endif+#ifdef AF_BRIDGE+ Just AF_BRIDGE -> Just #const AF_BRIDGE+#endif+#ifdef AF_ATMPVC+ Just AF_ATMPVC -> Just #const AF_ATMPVC+#endif+#ifdef AF_ROSE+ Just AF_ROSE -> Just #const AF_ROSE+#endif+#ifdef AF_NETBEUI+ Just AF_NETBEUI -> Just #const AF_NETBEUI+#endif+#ifdef AF_SECURITY+ Just AF_SECURITY -> Just #const AF_SECURITY+#endif+#ifdef AF_PACKET+ Just AF_PACKET -> Just #const AF_PACKET+#endif+#ifdef AF_ASH+ Just AF_ASH -> Just #const AF_ASH+#endif+#ifdef AF_ECONET+ Just AF_ECONET -> Just #const AF_ECONET+#endif+#ifdef AF_ATMSVC+ Just AF_ATMSVC -> Just #const AF_ATMSVC+#endif+#ifdef AF_IRDA+ Just AF_IRDA -> Just #const AF_IRDA+#endif+#ifdef AF_PPPOX+ Just AF_PPPOX -> Just #const AF_PPPOX+#endif+#ifdef AF_WANPIPE+ Just AF_WANPIPE -> Just #const AF_WANPIPE+#endif+#ifdef AF_BLUETOOTH+ Just AF_BLUETOOTH -> Just #const AF_BLUETOOTH+#endif+ _ -> Nothing++--------- ----------++unpackFamily :: CInt -> Family+unpackFamily f = case f of+ (#const AF_UNSPEC) -> AF_UNSPEC+#ifdef AF_UNIX+ (#const AF_UNIX) -> AF_UNIX+#endif+#ifdef AF_INET+ (#const AF_INET) -> AF_INET+#endif+#ifdef AF_INET6+ (#const AF_INET6) -> AF_INET6+#endif+#ifdef AF_IMPLINK+ (#const AF_IMPLINK) -> AF_IMPLINK+#endif+#ifdef AF_PUP+ (#const AF_PUP) -> AF_PUP+#endif+#ifdef AF_CHAOS+ (#const AF_CHAOS) -> AF_CHAOS+#endif+#ifdef AF_NS+ (#const AF_NS) -> AF_NS+#endif+#ifdef AF_NBS+ (#const AF_NBS) -> AF_NBS+#endif+#ifdef AF_ECMA+ (#const AF_ECMA) -> AF_ECMA+#endif+#ifdef AF_DATAKIT+ (#const AF_DATAKIT) -> AF_DATAKIT+#endif+#ifdef AF_CCITT+ (#const AF_CCITT) -> AF_CCITT+#endif+#ifdef AF_SNA+ (#const AF_SNA) -> AF_SNA+#endif+#ifdef AF_DECnet+ (#const AF_DECnet) -> AF_DECnet+#endif+#ifdef AF_DLI+ (#const AF_DLI) -> AF_DLI+#endif+#ifdef AF_LAT+ (#const AF_LAT) -> AF_LAT+#endif+#ifdef AF_HYLINK+ (#const AF_HYLINK) -> AF_HYLINK+#endif+#ifdef AF_APPLETALK+ (#const AF_APPLETALK) -> AF_APPLETALK+#endif+#ifdef AF_ROUTE+ (#const AF_ROUTE) -> AF_ROUTE+#endif+#ifdef AF_NETBIOS+ (#const AF_NETBIOS) -> AF_NETBIOS+#endif+#ifdef AF_NIT+ (#const AF_NIT) -> AF_NIT+#endif+#ifdef AF_802+ (#const AF_802) -> AF_802+#endif+#ifdef AF_ISO+ (#const AF_ISO) -> AF_ISO+#endif+#ifdef AF_OSI+# if (!defined(AF_ISO)) || (defined(AF_ISO) && (AF_ISO != AF_OSI))+ (#const AF_OSI) -> AF_OSI+# endif+#endif+#ifdef AF_NETMAN+ (#const AF_NETMAN) -> AF_NETMAN+#endif+#ifdef AF_X25+ (#const AF_X25) -> AF_X25+#endif+#ifdef AF_AX25+ (#const AF_AX25) -> AF_AX25+#endif+#ifdef AF_OSINET+ (#const AF_OSINET) -> AF_OSINET+#endif+#ifdef AF_GOSSIP+ (#const AF_GOSSIP) -> AF_GOSSIP+#endif+#if defined(AF_IPX) && (!defined(AF_NS) || AF_NS != AF_IPX)+ (#const AF_IPX) -> AF_IPX+#endif+#ifdef Pseudo_AF_XTP+ (#const Pseudo_AF_XTP) -> Pseudo_AF_XTP+#endif+#ifdef AF_CTF+ (#const AF_CTF) -> AF_CTF+#endif+#ifdef AF_WAN+ (#const AF_WAN) -> AF_WAN+#endif+#ifdef AF_SDL+ (#const AF_SDL) -> AF_SDL+#endif+#ifdef AF_NETWARE+ (#const AF_NETWARE) -> AF_NETWARE+#endif+#ifdef AF_NDD+ (#const AF_NDD) -> AF_NDD+#endif+#ifdef AF_INTF+ (#const AF_INTF) -> AF_INTF+#endif+#ifdef AF_COIP+ (#const AF_COIP) -> AF_COIP+#endif+#ifdef AF_CNT+ (#const AF_CNT) -> AF_CNT+#endif+#ifdef Pseudo_AF_RTIP+ (#const Pseudo_AF_RTIP) -> Pseudo_AF_RTIP+#endif+#ifdef Pseudo_AF_PIP+ (#const Pseudo_AF_PIP) -> Pseudo_AF_PIP+#endif+#ifdef AF_SIP+ (#const AF_SIP) -> AF_SIP+#endif+#ifdef AF_ISDN+ (#const AF_ISDN) -> AF_ISDN+#endif+#ifdef Pseudo_AF_KEY+ (#const Pseudo_AF_KEY) -> Pseudo_AF_KEY+#endif+#ifdef AF_NATM+ (#const AF_NATM) -> AF_NATM+#endif+#ifdef AF_ARP+ (#const AF_ARP) -> AF_ARP+#endif+#ifdef Pseudo_AF_HDRCMPLT+ (#const Pseudo_AF_HDRCMPLT) -> Pseudo_AF_HDRCMPLT+#endif+#ifdef AF_ENCAP+ (#const AF_ENCAP) -> AF_ENCAP+#endif+#ifdef AF_LINK+ (#const AF_LINK) -> AF_LINK+#endif+#ifdef AF_RAW+ (#const AF_RAW) -> AF_RAW+#endif+#ifdef AF_RIF+ (#const AF_RIF) -> AF_RIF+#endif+#ifdef AF_NETROM+ (#const AF_NETROM) -> AF_NETROM+#endif+#ifdef AF_BRIDGE+ (#const AF_BRIDGE) -> AF_BRIDGE+#endif+#ifdef AF_ATMPVC+ (#const AF_ATMPVC) -> AF_ATMPVC+#endif+#ifdef AF_ROSE+ (#const AF_ROSE) -> AF_ROSE+#endif+#ifdef AF_NETBEUI+ (#const AF_NETBEUI) -> AF_NETBEUI+#endif+#ifdef AF_SECURITY+ (#const AF_SECURITY) -> AF_SECURITY+#endif+#ifdef AF_PACKET+ (#const AF_PACKET) -> AF_PACKET+#endif+#ifdef AF_ASH+ (#const AF_ASH) -> AF_ASH+#endif+#ifdef AF_ECONET+ (#const AF_ECONET) -> AF_ECONET+#endif+#ifdef AF_ATMSVC+ (#const AF_ATMSVC) -> AF_ATMSVC+#endif+#ifdef AF_IRDA+ (#const AF_IRDA) -> AF_IRDA+#endif+#ifdef AF_PPPOX+ (#const AF_PPPOX) -> AF_PPPOX+#endif+#ifdef AF_WANPIPE+ (#const AF_WANPIPE) -> AF_WANPIPE+#endif+#ifdef AF_BLUETOOTH+ (#const AF_BLUETOOTH) -> AF_BLUETOOTH+#endif+ unknown -> error ("Network.Socket.unpackFamily: unknown address " +++ "family " ++ show unknown)++------------------------------------------------------------------------+-- Port Numbers++newtype PortNumber = PortNum Word16 deriving (Eq, Ord, Typeable)+-- newtyped to prevent accidental use of sane-looking+-- port numbers that haven't actually been converted to+-- network-byte-order first.++instance Show PortNumber where+ showsPrec p pn = showsPrec p (portNumberToInt pn)++intToPortNumber :: Int -> PortNumber+intToPortNumber v = PortNum (htons (fromIntegral v))++portNumberToInt :: PortNumber -> Int+portNumberToInt (PortNum po) = fromIntegral (ntohs po)++foreign import CALLCONV unsafe "my_ntohs" ntohs :: Word16 -> Word16+foreign import CALLCONV unsafe "my_htons" htons :: Word16 -> Word16+--foreign import CALLCONV unsafe "ntohl" ntohl :: Word32 -> Word32++instance Enum PortNumber where+ toEnum = intToPortNumber+ fromEnum = portNumberToInt++instance Num PortNumber where+ fromInteger i = intToPortNumber (fromInteger i)+ -- for completeness.+ (+) x y = intToPortNumber (portNumberToInt x + portNumberToInt y)+ (-) x y = intToPortNumber (portNumberToInt x - portNumberToInt y)+ negate x = intToPortNumber (-portNumberToInt x)+ (*) x y = intToPortNumber (portNumberToInt x * portNumberToInt y)+ abs n = intToPortNumber (abs (portNumberToInt n))+ signum n = intToPortNumber (signum (portNumberToInt n))++instance Real PortNumber where+ toRational x = toInteger x % 1++instance Integral PortNumber where+ quotRem a b = let (c,d) = quotRem (portNumberToInt a) (portNumberToInt b) in+ (intToPortNumber c, intToPortNumber d)+ toInteger a = toInteger (portNumberToInt a)++instance Storable PortNumber where+ sizeOf _ = sizeOf (undefined :: Word16)+ alignment _ = alignment (undefined :: Word16)+ poke p (PortNum po) = poke (castPtr p) po+ peek p = PortNum `liftM` peek (castPtr p)++------------------------------------------------------------------------+-- Socket addresses++-- The scheme used for addressing sockets is somewhat quirky. The+-- calls in the BSD socket API that need to know the socket address+-- all operate in terms of struct sockaddr, a `virtual' type of+-- socket address.++-- The Internet family of sockets are addressed as struct sockaddr_in,+-- so when calling functions that operate on struct sockaddr, we have+-- to type cast the Internet socket address into a struct sockaddr.+-- Instances of the structure for different families might *not* be+-- the same size. Same casting is required of other families of+-- sockets such as Xerox NS. Similarly for Unix domain sockets.++-- To represent these socket addresses in Haskell-land, we do what BSD+-- didn't do, and use a union/algebraic type for the different+-- families. Currently only Unix domain sockets and the Internet+-- families are supported.++#if defined(IPV6_SOCKET_SUPPORT)+type FlowInfo = Word32+type ScopeID = Word32+#endif++data SockAddr -- C Names+ = SockAddrInet+ PortNumber -- sin_port (network byte order)+ HostAddress -- sin_addr (ditto)+#if defined(IPV6_SOCKET_SUPPORT)+ | SockAddrInet6+ PortNumber -- sin6_port (network byte order)+ FlowInfo -- sin6_flowinfo (ditto)+ HostAddress6 -- sin6_addr (ditto)+ ScopeID -- sin6_scope_id (ditto)+#endif+#if defined(DOMAIN_SOCKET_SUPPORT)+ | SockAddrUnix+ String -- sun_path+#endif+ deriving (Eq, Ord, Typeable)++#if defined(WITH_WINSOCK) || defined(cygwin32_HOST_OS)+type CSaFamily = (#type unsigned short)+#elif defined(darwin_HOST_OS)+type CSaFamily = (#type u_char)+#else+type CSaFamily = (#type sa_family_t)+#endif++-- | Computes the storage requirements (in bytes) of the given+-- 'SockAddr'. This function differs from 'Foreign.Storable.sizeOf'+-- in that the value of the argument /is/ used.+sizeOfSockAddr :: SockAddr -> Int+#if defined(DOMAIN_SOCKET_SUPPORT)+sizeOfSockAddr (SockAddrUnix path) =+ case path of+ '\0':_ -> (#const sizeof(sa_family_t)) + length path+ _ -> #const sizeof(struct sockaddr_un)+#endif+sizeOfSockAddr (SockAddrInet _ _) = #const sizeof(struct sockaddr_in)+#if defined(IPV6_SOCKET_SUPPORT)+sizeOfSockAddr (SockAddrInet6 _ _ _ _) = #const sizeof(struct sockaddr_in6)+#endif++-- | Computes the storage requirements (in bytes) required for a+-- 'SockAddr' with the given 'Family'.+sizeOfSockAddrByFamily :: Family -> Int+#if defined(DOMAIN_SOCKET_SUPPORT)+sizeOfSockAddrByFamily AF_UNIX = #const sizeof(struct sockaddr_un)+#endif+#if defined(IPV6_SOCKET_SUPPORT)+sizeOfSockAddrByFamily AF_INET6 = #const sizeof(struct sockaddr_in6)+#endif+sizeOfSockAddrByFamily AF_INET = #const sizeof(struct sockaddr_in)++-- | Use a 'SockAddr' with a function requiring a pointer to a+-- 'SockAddr' and the length of that 'SockAddr'.+withSockAddr :: SockAddr -> (Ptr SockAddr -> Int -> IO a) -> IO a+withSockAddr addr f = do+ let sz = sizeOfSockAddr addr+ allocaBytes sz $ \p -> pokeSockAddr p addr >> f (castPtr p) sz++-- | Create a new 'SockAddr' for use with a function requiring a+-- pointer to a 'SockAddr' and the length of that 'SockAddr'.+withNewSockAddr :: Family -> (Ptr SockAddr -> Int -> IO a) -> IO a+withNewSockAddr family f = do+ let sz = sizeOfSockAddrByFamily family+ allocaBytes sz $ \ptr -> f ptr sz++-- We can't write an instance of 'Storable' for 'SockAddr' because+-- @sockaddr@ is a sum type of variable size but+-- 'Foreign.Storable.sizeOf' is required to be constant.++-- Note that on Darwin, the sockaddr structure must be zeroed before+-- use.++-- | Write the given 'SockAddr' to the given memory location.+pokeSockAddr :: Ptr a -> SockAddr -> IO ()+#if defined(DOMAIN_SOCKET_SUPPORT)+pokeSockAddr p (SockAddrUnix path) = do+#if defined(darwin_HOST_OS)+ zeroMemory p (#const sizeof(struct sockaddr_un))+#endif+#if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)+ (#poke struct sockaddr_un, sun_len) p ((#const sizeof(struct sockaddr_un)) :: Word8)+#endif+ (#poke struct sockaddr_un, sun_family) p ((#const AF_UNIX) :: CSaFamily)+ let pathC = map castCharToCChar path+ poker = case path of ('\0':_) -> pokeArray; _ -> pokeArray0 0+ poker ((#ptr struct sockaddr_un, sun_path) p) pathC+#endif+pokeSockAddr p (SockAddrInet (PortNum port) addr) = do+#if defined(darwin_HOST_OS)+ zeroMemory p (#const sizeof(struct sockaddr_in))+#endif+#if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)+ (#poke struct sockaddr_in, sin_len) p ((#const sizeof(struct sockaddr_in)) :: Word8)+#endif+ (#poke struct sockaddr_in, sin_family) p ((#const AF_INET) :: CSaFamily)+ (#poke struct sockaddr_in, sin_port) p port+ (#poke struct sockaddr_in, sin_addr) p addr+#if defined(IPV6_SOCKET_SUPPORT)+pokeSockAddr p (SockAddrInet6 (PortNum port) flow addr scope) = do+#if defined(darwin_HOST_OS)+ zeroMemory p (#const sizeof(struct sockaddr_in6))+#endif+#if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)+ (#poke struct sockaddr_in6, sin6_len) p ((#const sizeof(struct sockaddr_in6)) :: Word8)+#endif+ (#poke struct sockaddr_in6, sin6_family) p ((#const AF_INET6) :: CSaFamily)+ (#poke struct sockaddr_in6, sin6_port) p port+ (#poke struct sockaddr_in6, sin6_flowinfo) p flow+ (#poke struct sockaddr_in6, sin6_addr) p addr+ (#poke struct sockaddr_in6, sin6_scope_id) p scope+#endif++-- | Read a 'SockAddr' from the given memory location.+peekSockAddr :: Ptr SockAddr -> IO SockAddr+peekSockAddr p = do+ family <- (#peek struct sockaddr, sa_family) p+ case family :: CSaFamily of+#if defined(DOMAIN_SOCKET_SUPPORT)+ (#const AF_UNIX) -> do+ str <- peekCString ((#ptr struct sockaddr_un, sun_path) p)+ return (SockAddrUnix str)+#endif+ (#const AF_INET) -> do+ addr <- (#peek struct sockaddr_in, sin_addr) p+ port <- (#peek struct sockaddr_in, sin_port) p+ return (SockAddrInet (PortNum port) addr)+#if defined(IPV6_SOCKET_SUPPORT)+ (#const AF_INET6) -> do+ port <- (#peek struct sockaddr_in6, sin6_port) p+ flow <- (#peek struct sockaddr_in6, sin6_flowinfo) p+ addr <- (#peek struct sockaddr_in6, sin6_addr) p+ scope <- (#peek struct sockaddr_in6, sin6_scope_id) p+ return (SockAddrInet6 (PortNum port) flow addr scope)+#endif++------------------------------------------------------------------------++-- | Network byte order.+type HostAddress = Word32++#if defined(IPV6_SOCKET_SUPPORT)+-- | Host byte order.+type HostAddress6 = (Word32, Word32, Word32, Word32)++-- The peek32 and poke32 functions work around the fact that the RFCs+-- don't require 32-bit-wide address fields to be present. We can+-- only portably rely on an 8-bit field, s6_addr.++s6_addr_offset :: Int+s6_addr_offset = (#offset struct in6_addr, s6_addr)++peek32 :: Ptr a -> Int -> IO Word32+peek32 p i0 = do+ let i' = i0 * 4+ peekByte n = peekByteOff p (s6_addr_offset + i' + n) :: IO Word8+ a `sl` i = fromIntegral a `shiftL` i+ a0 <- peekByte 0+ a1 <- peekByte 1+ a2 <- peekByte 2+ a3 <- peekByte 3+ return ((a0 `sl` 24) .|. (a1 `sl` 16) .|. (a2 `sl` 8) .|. (a3 `sl` 0))++poke32 :: Ptr a -> Int -> Word32 -> IO ()+poke32 p i0 a = do+ let i' = i0 * 4+ pokeByte n = pokeByteOff p (s6_addr_offset + i' + n)+ x `sr` i = fromIntegral (x `shiftR` i) :: Word8+ pokeByte 0 (a `sr` 24)+ pokeByte 1 (a `sr` 16)+ pokeByte 2 (a `sr` 8)+ pokeByte 3 (a `sr` 0)++instance Storable HostAddress6 where+ sizeOf _ = (#const sizeof(struct in6_addr))+ alignment _ = alignment (undefined :: CInt)++ peek p = do+ a <- peek32 p 0+ b <- peek32 p 1+ c <- peek32 p 2+ d <- peek32 p 3+ return (a, b, c, d)++ poke p (a, b, c, d) = do+ poke32 p 0 a+ poke32 p 1 b+ poke32 p 2 c+ poke32 p 3 d+#endif++------------------------------------------------------------------------+-- Helper functions++foreign import ccall unsafe "string.h" memset :: Ptr a -> CInt -> CSize -> IO ()++-- | Zero a structure.+zeroMemory :: Ptr a -> CSize -> IO ()+zeroMemory dest nbytes = memset dest 0 (fromIntegral nbytes)
+ standalone/android/tmp/network-2.4.1.2/Network/URI.hs view
@@ -0,0 +1,1349 @@+{-# LANGUAGE CPP #-}+--------------------------------------------------------------------------------+-- |+-- Module : Network.URI+-- Copyright : (c) 2004, Graham Klyne+-- License : BSD-style (see end of this file)+--+-- Maintainer : Graham Klyne <gk@ninebynine.org>+-- Stability : provisional+-- Portability : portable+--+-- This module defines functions for handling URIs. It presents substantially the+-- same interface as the older GHC Network.URI module, but is implemented using+-- Parsec rather than a Regex library that is not available with Hugs. The internal+-- representation of URI has been changed so that URI strings are more+-- completely preserved when round-tripping to a URI value and back.+--+-- In addition, four methods are provided for parsing different+-- kinds of URI string (as noted in RFC3986):+-- 'parseURI',+-- 'parseURIReference',+-- 'parseRelativeReference' and+-- 'parseAbsoluteURI'.+--+-- Further, four methods are provided for classifying different+-- kinds of URI string (as noted in RFC3986):+-- 'isURI',+-- 'isURIReference',+-- 'isRelativeReference' and+-- 'isAbsoluteURI'.+--+-- The long-standing official reference for URI handling was RFC2396 [1],+-- as updated by RFC 2732 [2], but this was replaced by a new specification,+-- RFC3986 [3] in January 2005. This latter specification has been used+-- as the primary reference for constructing the URI parser implemented+-- here, and it is intended that there is a direct relationship between+-- the syntax definition in that document and this parser implementation.+--+-- RFC 1808 [4] contains a number of test cases for relative URI handling.+-- Dan Connolly's Python module @uripath.py@ [5] also contains useful details+-- and test cases.+--+-- Some of the code has been copied from the previous GHC implementation,+-- but the parser is replaced with one that performs more complete+-- syntax checking of the URI itself, according to RFC3986 [3].+--+-- References+--+-- (1) <http://www.ietf.org/rfc/rfc2396.txt>+--+-- (2) <http://www.ietf.org/rfc/rfc2732.txt>+--+-- (3) <http://www.ietf.org/rfc/rfc3986.txt>+--+-- (4) <http://www.ietf.org/rfc/rfc1808.txt>+--+-- (5) <http://www.w3.org/2000/10/swap/uripath.py>+--+--------------------------------------------------------------------------------++module Network.URI+ (+ -- * The URI type+ URI(..)+ , URIAuth(..)+ , nullURI+ + -- * Parsing+ , parseURI+ , parseURIReference+ , parseRelativeReference+ , parseAbsoluteURI+ + -- * Test for strings containing various kinds of URI+ , isURI+ , isURIReference+ , isRelativeReference+ , isAbsoluteURI+ , isIPv6address+ , isIPv4address+ + -- * Predicates+ , uriIsAbsolute+ , uriIsRelative+ + -- * Relative URIs+ , relativeTo+ , nonStrictRelativeTo+ , relativeFrom+ + -- * Operations on URI strings+ -- | Support for putting strings into URI-friendly+ -- escaped format and getting them back again.+ -- This can't be done transparently in all cases, because certain+ -- characters have different meanings in different kinds of URI.+ -- The URI spec [3], section 2.4, indicates that all URI components+ -- should be escaped before they are assembled as a URI:+ -- \"Once produced, a URI is always in its percent-encoded form\"+ , uriToString+ , isReserved, isUnreserved+ , isAllowedInURI, isUnescapedInURI+ , isUnescapedInURIComponent+ , escapeURIChar+ , escapeURIString+ , unEscapeString+ + -- * URI Normalization functions+ , normalizeCase+ , normalizeEscape+ , normalizePathSegments+ + -- * Deprecated functions+ , parseabsoluteURI+ , escapeString+ , reserved, unreserved+ , scheme, authority, path, query, fragment+ ) where++import Text.ParserCombinators.Parsec+ ( GenParser, ParseError+ , parse, (<|>), (<?>), try+ , option, many, many1, count, notFollowedBy+ , char, satisfy, oneOf, string, eof+ , unexpected+ )++import Control.Monad (MonadPlus(..))+import Data.Char (ord, chr, isHexDigit, toLower, toUpper, digitToInt)+import Data.Bits ((.|.),(.&.),shiftL,shiftR)+import Debug.Trace (trace)+import Numeric (showIntAtBase)++import Data.Typeable (Typeable)+#if MIN_VERSION_base(4,0,0)+import Data.Data (Data)+#else+import Data.Generics (Data)+#endif++------------------------------------------------------------+-- The URI datatype+------------------------------------------------------------++-- |Represents a general universal resource identifier using+-- its component parts.+--+-- For example, for the URI+--+-- > foo://anonymous@www.haskell.org:42/ghc?query#frag+--+-- the components are:+--+data URI = URI+ { uriScheme :: String -- ^ @foo:@+ , uriAuthority :: Maybe URIAuth -- ^ @\/\/anonymous\@www.haskell.org:42@+ , uriPath :: String -- ^ @\/ghc@+ , uriQuery :: String -- ^ @?query@+ , uriFragment :: String -- ^ @#frag@+ } deriving (Eq, Ord, Typeable, Data)++-- |Type for authority value within a URI+data URIAuth = URIAuth+ { uriUserInfo :: String -- ^ @anonymous\@@+ , uriRegName :: String -- ^ @www.haskell.org@+ , uriPort :: String -- ^ @:42@+ } deriving (Eq, Ord, Show, Typeable, Data)++-- |Blank URI+nullURI :: URI+nullURI = URI+ { uriScheme = ""+ , uriAuthority = Nothing+ , uriPath = ""+ , uriQuery = ""+ , uriFragment = ""+ }++-- URI as instance of Show. Note that for security reasons, the default+-- behaviour is to suppress any userinfo field (see RFC3986, section 7.5).+-- This can be overridden by using uriToString directly with first+-- argument @id@ (noting that this returns a ShowS value rather than a string).+--+-- [[[Another design would be to embed the userinfo mapping function in+-- the URIAuth value, with the default value suppressing userinfo formatting,+-- but providing a function to return a new URI value with userinfo+-- data exposed by show.]]]+--+instance Show URI where+ showsPrec _ = uriToString defaultUserInfoMap++defaultUserInfoMap :: String -> String+defaultUserInfoMap uinf = user++newpass+ where+ (user,pass) = break (==':') uinf+ newpass = if null pass || (pass == "@")+ || (pass == ":@")+ then pass+ else ":...@"++testDefaultUserInfoMap :: [Bool]+testDefaultUserInfoMap =+ [ defaultUserInfoMap "" == ""+ , defaultUserInfoMap "@" == "@"+ , defaultUserInfoMap "user@" == "user@"+ , defaultUserInfoMap "user:@" == "user:@"+ , defaultUserInfoMap "user:anonymous@" == "user:...@"+ , defaultUserInfoMap "user:pass@" == "user:...@"+ , defaultUserInfoMap "user:pass" == "user:...@"+ , defaultUserInfoMap "user:anonymous" == "user:...@"+ ]++------------------------------------------------------------+-- Parse a URI+------------------------------------------------------------++-- |Turn a string containing a URI into a 'URI'.+-- Returns 'Nothing' if the string is not a valid URI;+-- (an absolute URI with optional fragment identifier).+--+-- NOTE: this is different from the previous network.URI,+-- whose @parseURI@ function works like 'parseURIReference'+-- in this module.+--+parseURI :: String -> Maybe URI+parseURI = parseURIAny uri++-- |Parse a URI reference to a 'URI' value.+-- Returns 'Nothing' if the string is not a valid URI reference.+-- (an absolute or relative URI with optional fragment identifier).+--+parseURIReference :: String -> Maybe URI+parseURIReference = parseURIAny uriReference++-- |Parse a relative URI to a 'URI' value.+-- Returns 'Nothing' if the string is not a valid relative URI.+-- (a relative URI with optional fragment identifier).+--+parseRelativeReference :: String -> Maybe URI+parseRelativeReference = parseURIAny relativeRef++-- |Parse an absolute URI to a 'URI' value.+-- Returns 'Nothing' if the string is not a valid absolute URI.+-- (an absolute URI without a fragment identifier).+--+parseAbsoluteURI :: String -> Maybe URI+parseAbsoluteURI = parseURIAny absoluteURI++-- |Test if string contains a valid URI+-- (an absolute URI with optional fragment identifier).+--+isURI :: String -> Bool+isURI = isValidParse uri++-- |Test if string contains a valid URI reference+-- (an absolute or relative URI with optional fragment identifier).+--+isURIReference :: String -> Bool+isURIReference = isValidParse uriReference++-- |Test if string contains a valid relative URI+-- (a relative URI with optional fragment identifier).+--+isRelativeReference :: String -> Bool+isRelativeReference = isValidParse relativeRef++-- |Test if string contains a valid absolute URI+-- (an absolute URI without a fragment identifier).+--+isAbsoluteURI :: String -> Bool+isAbsoluteURI = isValidParse absoluteURI++-- |Test if string contains a valid IPv6 address+--+isIPv6address :: String -> Bool+isIPv6address = isValidParse ipv6address++-- |Test if string contains a valid IPv4 address+--+isIPv4address :: String -> Bool+isIPv4address = isValidParse ipv4address++-- |Test function: parse and reconstruct a URI reference+--+testURIReference :: String -> String+testURIReference uristr = show (parseAll uriReference "" uristr)++-- Helper function for turning a string into a URI+--+parseURIAny :: URIParser URI -> String -> Maybe URI+parseURIAny parser uristr = case parseAll parser "" uristr of+ Left _ -> Nothing+ Right u -> Just u++-- Helper function to test a string match to a parser+--+isValidParse :: URIParser a -> String -> Bool+isValidParse parser uristr = case parseAll parser "" uristr of+ -- Left e -> error (show e)+ Left _ -> False+ Right _ -> True++parseAll :: URIParser a -> String -> String -> Either ParseError a+parseAll parser filename uristr = parse newparser filename uristr+ where+ newparser =+ do { res <- parser+ ; eof+ ; return res+ }++------------------------------------------------------------+-- Predicates+------------------------------------------------------------++uriIsAbsolute :: URI -> Bool+uriIsAbsolute (URI {uriScheme = scheme}) = scheme /= ""++uriIsRelative :: URI -> Bool+uriIsRelative = not . uriIsAbsolute++------------------------------------------------------------+-- URI parser body based on Parsec elements and combinators+------------------------------------------------------------++-- Parser parser type.+-- Currently+type URIParser a = GenParser Char () a++-- RFC3986, section 2.1+--+-- Parse and return a 'pct-encoded' sequence+--+escaped :: URIParser String+escaped =+ do { char '%'+ ; h1 <- hexDigitChar+ ; h2 <- hexDigitChar+ ; return $ ['%',h1,h2]+ }++-- RFC3986, section 2.2+--+-- |Returns 'True' if the character is a \"reserved\" character in a+-- URI. To include a literal instance of one of these characters in a+-- component of a URI, it must be escaped.+--+isReserved :: Char -> Bool+isReserved c = isGenDelims c || isSubDelims c++isGenDelims :: Char -> Bool+isGenDelims c = c `elem` ":/?#[]@"++isSubDelims :: Char -> Bool+isSubDelims c = c `elem` "!$&'()*+,;="++genDelims :: URIParser String+genDelims = do { c <- satisfy isGenDelims ; return [c] }++subDelims :: URIParser String+subDelims = do { c <- satisfy isSubDelims ; return [c] }++-- RFC3986, section 2.3+--+-- |Returns 'True' if the character is an \"unreserved\" character in+-- a URI. These characters do not need to be escaped in a URI. The+-- only characters allowed in a URI are either \"reserved\",+-- \"unreserved\", or an escape sequence (@%@ followed by two hex digits).+--+isUnreserved :: Char -> Bool+isUnreserved c = isAlphaNumChar c || (c `elem` "-_.~")++unreservedChar :: URIParser String+unreservedChar = do { c <- satisfy isUnreserved ; return [c] }++-- RFC3986, section 3+--+-- URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]+--+-- hier-part = "//" authority path-abempty+-- / path-abs+-- / path-rootless+-- / path-empty++uri :: URIParser URI+uri =+ do { us <- try uscheme+ -- ; ua <- option Nothing ( do { try (string "//") ; uauthority } )+ -- ; up <- upath+ ; (ua,up) <- hierPart+ ; uq <- option "" ( do { char '?' ; uquery } )+ ; uf <- option "" ( do { char '#' ; ufragment } )+ ; return $ URI+ { uriScheme = us+ , uriAuthority = ua+ , uriPath = up+ , uriQuery = uq+ , uriFragment = uf+ }+ }++hierPart :: URIParser ((Maybe URIAuth),String)+hierPart =+ do { try (string "//")+ ; ua <- uauthority+ ; up <- pathAbEmpty+ ; return (ua,up)+ }+ <|> do { up <- pathAbs+ ; return (Nothing,up)+ }+ <|> do { up <- pathRootLess+ ; return (Nothing,up)+ }+ <|> do { return (Nothing,"")+ }++-- RFC3986, section 3.1++uscheme :: URIParser String+uscheme =+ do { s <- oneThenMany alphaChar (satisfy isSchemeChar)+ ; char ':'+ ; return $ s++":"+ }++-- RFC3986, section 3.2++uauthority :: URIParser (Maybe URIAuth)+uauthority =+ do { uu <- option "" (try userinfo)+ ; uh <- host+ ; up <- option "" port+ ; return $ Just $ URIAuth+ { uriUserInfo = uu+ , uriRegName = uh+ , uriPort = up+ }+ }++-- RFC3986, section 3.2.1++userinfo :: URIParser String+userinfo =+ do { uu <- many (uchar ";:&=+$,")+ ; char '@'+ ; return (concat uu ++"@")+ }++-- RFC3986, section 3.2.2++host :: URIParser String+host = ipLiteral <|> try ipv4address <|> regName++ipLiteral :: URIParser String+ipLiteral =+ do { char '['+ ; ua <- ( ipv6address <|> ipvFuture )+ ; char ']'+ ; return $ "[" ++ ua ++ "]"+ }+ <?> "IP address literal"++ipvFuture :: URIParser String+ipvFuture =+ do { char 'v'+ ; h <- hexDigitChar+ ; char '.'+ ; a <- many1 (satisfy isIpvFutureChar)+ ; return $ 'v':h:'.':a+ }++isIpvFutureChar :: Char -> Bool+isIpvFutureChar c = isUnreserved c || isSubDelims c || (c==';')++ipv6address :: URIParser String+ipv6address =+ try ( do+ { a2 <- count 6 h4c+ ; a3 <- ls32+ ; return $ concat a2 ++ a3+ } )+ <|> try ( do+ { string "::"+ ; a2 <- count 5 h4c+ ; a3 <- ls32+ ; return $ "::" ++ concat a2 ++ a3+ } )+ <|> try ( do+ { a1 <- opt_n_h4c_h4 0+ ; string "::"+ ; a2 <- count 4 h4c+ ; a3 <- ls32+ ; return $ a1 ++ "::" ++ concat a2 ++ a3+ } )+ <|> try ( do+ { a1 <- opt_n_h4c_h4 1+ ; string "::"+ ; a2 <- count 3 h4c+ ; a3 <- ls32+ ; return $ a1 ++ "::" ++ concat a2 ++ a3+ } )+ <|> try ( do+ { a1 <- opt_n_h4c_h4 2+ ; string "::"+ ; a2 <- count 2 h4c+ ; a3 <- ls32+ ; return $ a1 ++ "::" ++ concat a2 ++ a3+ } )+ <|> try ( do+ { a1 <- opt_n_h4c_h4 3+ ; string "::"+ ; a2 <- h4c+ ; a3 <- ls32+ ; return $ a1 ++ "::" ++ a2 ++ a3+ } )+ <|> try ( do+ { a1 <- opt_n_h4c_h4 4+ ; string "::"+ ; a3 <- ls32+ ; return $ a1 ++ "::" ++ a3+ } )+ <|> try ( do+ { a1 <- opt_n_h4c_h4 5+ ; string "::"+ ; a3 <- h4+ ; return $ a1 ++ "::" ++ a3+ } )+ <|> try ( do+ { a1 <- opt_n_h4c_h4 6+ ; string "::"+ ; return $ a1 ++ "::"+ } )+ <?> "IPv6 address"++opt_n_h4c_h4 :: Int -> URIParser String+opt_n_h4c_h4 n = option "" $+ do { a1 <- countMinMax 0 n h4c+ ; a2 <- h4+ ; return $ concat a1 ++ a2+ }++ls32 :: URIParser String+ls32 = try ( do+ { a1 <- h4c+ ; a2 <- h4+ ; return (a1++a2)+ } )+ <|> ipv4address++h4c :: URIParser String+h4c = try $+ do { a1 <- h4+ ; char ':'+ ; notFollowedBy (char ':')+ ; return $ a1 ++ ":"+ }++h4 :: URIParser String+h4 = countMinMax 1 4 hexDigitChar++ipv4address :: URIParser String+ipv4address =+ do { a1 <- decOctet ; char '.'+ ; a2 <- decOctet ; char '.'+ ; a3 <- decOctet ; char '.'+ ; a4 <- decOctet+ ; notFollowedBy regName+ ; return $ a1++"."++a2++"."++a3++"."++a4+ }+ <?> "IPv4 Address"++decOctet :: URIParser String+decOctet =+ do { a1 <- countMinMax 1 3 digitChar+ ; if (read a1 :: Integer) > 255 then+ fail "Decimal octet value too large"+ else+ return a1+ }++regName :: URIParser String+regName =+ do { ss <- countMinMax 0 255 ( unreservedChar <|> escaped <|> subDelims )+ ; return $ concat ss+ }+ <?> "Registered name"++-- RFC3986, section 3.2.3++port :: URIParser String+port =+ do { char ':'+ ; p <- many digitChar+ ; return (':':p)+ }++--+-- RFC3986, section 3.3+--+-- path = path-abempty ; begins with "/" or is empty+-- / path-abs ; begins with "/" but not "//"+-- / path-noscheme ; begins with a non-colon segment+-- / path-rootless ; begins with a segment+-- / path-empty ; zero characters+--+-- path-abempty = *( "/" segment )+-- path-abs = "/" [ segment-nz *( "/" segment ) ]+-- path-noscheme = segment-nzc *( "/" segment )+-- path-rootless = segment-nz *( "/" segment )+-- path-empty = 0<pchar>+--+-- segment = *pchar+-- segment-nz = 1*pchar+-- segment-nzc = 1*( unreserved / pct-encoded / sub-delims / "@" )+--+-- pchar = unreserved / pct-encoded / sub-delims / ":" / "@"++{-+upath :: URIParser String+upath = pathAbEmpty+ <|> pathAbs+ <|> pathNoScheme+ <|> pathRootLess+ <|> pathEmpty+-}++pathAbEmpty :: URIParser String+pathAbEmpty =+ do { ss <- many slashSegment+ ; return $ concat ss+ }++pathAbs :: URIParser String+pathAbs =+ do { char '/'+ ; ss <- option "" pathRootLess+ ; return $ '/':ss+ }++pathNoScheme :: URIParser String+pathNoScheme =+ do { s1 <- segmentNzc+ ; ss <- many slashSegment+ ; return $ concat (s1:ss)+ }++pathRootLess :: URIParser String+pathRootLess =+ do { s1 <- segmentNz+ ; ss <- many slashSegment+ ; return $ concat (s1:ss)+ }++slashSegment :: URIParser String+slashSegment =+ do { char '/'+ ; s <- segment+ ; return ('/':s)+ }++segment :: URIParser String+segment =+ do { ps <- many pchar+ ; return $ concat ps+ }++segmentNz :: URIParser String+segmentNz =+ do { ps <- many1 pchar+ ; return $ concat ps+ }++segmentNzc :: URIParser String+segmentNzc =+ do { ps <- many1 (uchar "@")+ ; return $ concat ps+ }++pchar :: URIParser String+pchar = uchar ":@"++-- helper function for pchar and friends+uchar :: String -> URIParser String+uchar extras =+ unreservedChar+ <|> escaped+ <|> subDelims+ <|> do { c <- oneOf extras ; return [c] }++-- RFC3986, section 3.4++uquery :: URIParser String+uquery =+ do { ss <- many $ uchar (":@"++"/?")+ ; return $ '?':concat ss+ }++-- RFC3986, section 3.5++ufragment :: URIParser String+ufragment =+ do { ss <- many $ uchar (":@"++"/?")+ ; return $ '#':concat ss+ }++-- Reference, Relative and Absolute URI forms+--+-- RFC3986, section 4.1++uriReference :: URIParser URI+uriReference = uri <|> relativeRef++-- RFC3986, section 4.2+--+-- relative-URI = relative-part [ "?" query ] [ "#" fragment ]+--+-- relative-part = "//" authority path-abempty+-- / path-abs+-- / path-noscheme+-- / path-empty++relativeRef :: URIParser URI+relativeRef =+ do { notMatching uscheme+ -- ; ua <- option Nothing ( do { try (string "//") ; uauthority } )+ -- ; up <- upath+ ; (ua,up) <- relativePart+ ; uq <- option "" ( do { char '?' ; uquery } )+ ; uf <- option "" ( do { char '#' ; ufragment } )+ ; return $ URI+ { uriScheme = ""+ , uriAuthority = ua+ , uriPath = up+ , uriQuery = uq+ , uriFragment = uf+ }+ }++relativePart :: URIParser ((Maybe URIAuth),String)+relativePart =+ do { try (string "//")+ ; ua <- uauthority+ ; up <- pathAbEmpty+ ; return (ua,up)+ }+ <|> do { up <- pathAbs+ ; return (Nothing,up)+ }+ <|> do { up <- pathNoScheme+ ; return (Nothing,up)+ }+ <|> do { return (Nothing,"")+ }++-- RFC3986, section 4.3++absoluteURI :: URIParser URI+absoluteURI =+ do { us <- uscheme+ -- ; ua <- option Nothing ( do { try (string "//") ; uauthority } )+ -- ; up <- upath+ ; (ua,up) <- hierPart+ ; uq <- option "" ( do { char '?' ; uquery } )+ ; return $ URI+ { uriScheme = us+ , uriAuthority = ua+ , uriPath = up+ , uriQuery = uq+ , uriFragment = ""+ }+ }++-- Imports from RFC 2234++ -- NOTE: can't use isAlphaNum etc. because these deal with ISO 8859+ -- (and possibly Unicode!) chars.+ -- [[[Above was a comment originally in GHC Network/URI.hs:+ -- when IRIs are introduced then most codepoints above 128(?) should+ -- be treated as unreserved, and higher codepoints for letters should+ -- certainly be allowed.+ -- ]]]++isAlphaChar :: Char -> Bool+isAlphaChar c = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')++isDigitChar :: Char -> Bool+isDigitChar c = (c >= '0' && c <= '9')++isAlphaNumChar :: Char -> Bool+isAlphaNumChar c = isAlphaChar c || isDigitChar c++isHexDigitChar :: Char -> Bool+isHexDigitChar c = isHexDigit c++isSchemeChar :: Char -> Bool+isSchemeChar c = (isAlphaNumChar c) || (c `elem` "+-.")++alphaChar :: URIParser Char+alphaChar = satisfy isAlphaChar -- or: Parsec.letter ?++digitChar :: URIParser Char+digitChar = satisfy isDigitChar -- or: Parsec.digit ?++alphaNumChar :: URIParser Char+alphaNumChar = satisfy isAlphaNumChar++hexDigitChar :: URIParser Char+hexDigitChar = satisfy isHexDigitChar -- or: Parsec.hexDigit ?++-- Additional parser combinators for common patterns++oneThenMany :: GenParser t s a -> GenParser t s a -> GenParser t s [a]+oneThenMany p1 pr =+ do { a1 <- p1+ ; ar <- many pr+ ; return (a1:ar)+ }++countMinMax :: Int -> Int -> GenParser t s a -> GenParser t s [a]+countMinMax m n p | m > 0 =+ do { a1 <- p+ ; ar <- countMinMax (m-1) (n-1) p+ ; return (a1:ar)+ }+countMinMax _ n _ | n <= 0 = return []+countMinMax _ n p = option [] $+ do { a1 <- p+ ; ar <- countMinMax 0 (n-1) p+ ; return (a1:ar)+ }++notMatching :: Show a => GenParser tok st a -> GenParser tok st ()+notMatching p = do { a <- try p ; unexpected (show a) } <|> return ()++------------------------------------------------------------+-- Reconstruct a URI string+------------------------------------------------------------+--+-- |Turn a 'URI' into a string.+--+-- Uses a supplied function to map the userinfo part of the URI.+--+-- The Show instance for URI uses a mapping that hides any password+-- that may be present in the URI. Use this function with argument @id@+-- to preserve the password in the formatted output.+--+uriToString :: (String->String) -> URI -> ShowS+uriToString userinfomap URI { uriScheme=myscheme+ , uriAuthority=myauthority+ , uriPath=mypath+ , uriQuery=myquery+ , uriFragment=myfragment+ } =+ (myscheme++) . (uriAuthToString userinfomap myauthority)+ . (mypath++) . (myquery++) . (myfragment++)++uriAuthToString :: (String->String) -> (Maybe URIAuth) -> ShowS+uriAuthToString _ Nothing = id -- shows ""+uriAuthToString userinfomap+ (Just URIAuth { uriUserInfo = myuinfo+ , uriRegName = myregname+ , uriPort = myport+ } ) =+ ("//"++) . (if null myuinfo then id else ((userinfomap myuinfo)++))+ . (myregname++)+ . (myport++)++------------------------------------------------------------+-- Character classes+------------------------------------------------------------++-- | Returns 'True' if the character is allowed in a URI.+--+isAllowedInURI :: Char -> Bool+isAllowedInURI c = isReserved c || isUnreserved c || c == '%' -- escape char++-- | Returns 'True' if the character is allowed unescaped in a URI.+--+isUnescapedInURI :: Char -> Bool+isUnescapedInURI c = isReserved c || isUnreserved c++-- | Returns 'True' if the character is allowed unescaped in a URI component.+--+isUnescapedInURIComponent :: Char -> Bool+isUnescapedInURIComponent c = not (isReserved c || not (isUnescapedInURI c))++------------------------------------------------------------+-- Escape sequence handling+------------------------------------------------------------++-- |Escape character if supplied predicate is not satisfied,+-- otherwise return character as singleton string.+--+escapeURIChar :: (Char->Bool) -> Char -> String+escapeURIChar p c+ | p c = [c]+ | otherwise = concatMap (\i -> '%' : myShowHex i "") (utf8EncodeChar c)+ where+ myShowHex :: Int -> ShowS+ myShowHex n r = case showIntAtBase 16 (toChrHex) n r of+ [] -> "00"+ [x] -> ['0',x]+ cs -> cs+ toChrHex d+ | d < 10 = chr (ord '0' + fromIntegral d)+ | otherwise = chr (ord 'A' + fromIntegral (d - 10))++-- From http://hackage.haskell.org/package/utf8-string+-- by Eric Mertens, BSD3+-- Returns [Int] for use with showIntAtBase+utf8EncodeChar :: Char -> [Int]+utf8EncodeChar = map fromIntegral . go . ord+ where+ go oc+ | oc <= 0x7f = [oc]++ | oc <= 0x7ff = [ 0xc0 + (oc `shiftR` 6)+ , 0x80 + oc .&. 0x3f+ ]++ | oc <= 0xffff = [ 0xe0 + (oc `shiftR` 12)+ , 0x80 + ((oc `shiftR` 6) .&. 0x3f)+ , 0x80 + oc .&. 0x3f+ ]+ | otherwise = [ 0xf0 + (oc `shiftR` 18)+ , 0x80 + ((oc `shiftR` 12) .&. 0x3f)+ , 0x80 + ((oc `shiftR` 6) .&. 0x3f)+ , 0x80 + oc .&. 0x3f+ ]++-- |Can be used to make a string valid for use in a URI.+--+escapeURIString+ :: (Char->Bool) -- ^ a predicate which returns 'False'+ -- if the character should be escaped+ -> String -- ^ the string to process+ -> String -- ^ the resulting URI string+escapeURIString p s = concatMap (escapeURIChar p) s++-- |Turns all instances of escaped characters in the string back+-- into literal characters.+--+unEscapeString :: String -> String+unEscapeString [] = ""+unEscapeString s@(c:cs) = case unEscapeByte s of+ Just (byte, rest) -> unEscapeUtf8 byte rest+ Nothing -> c : unEscapeString cs++unEscapeByte :: String -> Maybe (Int, String)+unEscapeByte ('%':x1:x2:s) | isHexDigit x1 && isHexDigit x2 =+ Just (digitToInt x1 * 16 + digitToInt x2, s)+unEscapeByte _ = Nothing++-- Adapted from http://hackage.haskell.org/package/utf8-string+-- by Eric Mertens, BSD3+unEscapeUtf8 :: Int -> String -> String+unEscapeUtf8 c rest+ | c < 0x80 = chr c : unEscapeString rest+ | c < 0xc0 = replacement_character : unEscapeString rest+ | c < 0xe0 = multi1+ | c < 0xf0 = multi_byte 2 0xf 0x800+ | c < 0xf8 = multi_byte 3 0x7 0x10000+ | c < 0xfc = multi_byte 4 0x3 0x200000+ | c < 0xfe = multi_byte 5 0x1 0x4000000+ | otherwise = replacement_character : unEscapeString rest+ where+ replacement_character = '\xfffd'+ multi1 = case unEscapeByte rest of+ Just (c1, ds) | c1 .&. 0xc0 == 0x80 ->+ let d = ((fromEnum c .&. 0x1f) `shiftL` 6) .|. fromEnum (c1 .&. 0x3f)+ in if d >= 0x000080 then toEnum d : unEscapeString ds+ else replacement_character : unEscapeString ds+ _ -> replacement_character : unEscapeString rest++ multi_byte i mask overlong =+ aux i rest (unEscapeByte rest) (c .&. mask)+ where+ aux 0 rs _ acc+ | overlong <= acc && acc <= 0x10ffff &&+ (acc < 0xd800 || 0xdfff < acc) &&+ (acc < 0xfffe || 0xffff < acc) = chr acc : unEscapeString rs+ | otherwise = replacement_character : unEscapeString rs++ aux n _ (Just (r, rs)) acc+ | r .&. 0xc0 == 0x80 = aux (n-1) rs (unEscapeByte rs)+ $! shiftL acc 6 .|. (r .&. 0x3f)++ aux _ rs _ _ = replacement_character : unEscapeString rs++------------------------------------------------------------+-- Resolving a relative URI relative to a base URI+------------------------------------------------------------++-- |Returns a new 'URI' which represents the value of the+-- first 'URI' interpreted as relative to the second 'URI'.+-- For example:+--+-- > "foo" `relativeTo` "http://bar.org/" = "http://bar.org/foo"+-- > "http:foo" `nonStrictRelativeTo` "http://bar.org/" = "http://bar.org/foo"+--+-- Algorithm from RFC3986 [3], section 5.2.2+--++nonStrictRelativeTo :: URI -> URI -> URI+nonStrictRelativeTo ref base = relativeTo ref' base+ where+ ref' = if uriScheme ref == uriScheme base+ then ref { uriScheme="" }+ else ref++isDefined :: ( MonadPlus m, Eq (m a) ) => m a -> Bool+isDefined a = a /= mzero++-- | Returns a new 'URI' which represents the value of the first 'URI'+-- interpreted as relative to the second 'URI'.+--+-- Algorithm from RFC3986 [3], section 5.2+relativeTo :: URI -> URI -> URI+relativeTo ref base+ | isDefined ( uriScheme ref ) =+ just_segments ref+ | isDefined ( uriAuthority ref ) =+ just_segments ref { uriScheme = uriScheme base }+ | isDefined ( uriPath ref ) =+ if (head (uriPath ref) == '/') then+ just_segments ref+ { uriScheme = uriScheme base+ , uriAuthority = uriAuthority base+ }+ else+ just_segments ref+ { uriScheme = uriScheme base+ , uriAuthority = uriAuthority base+ , uriPath = mergePaths base ref+ }+ | isDefined ( uriQuery ref ) =+ just_segments ref+ { uriScheme = uriScheme base+ , uriAuthority = uriAuthority base+ , uriPath = uriPath base+ }+ | otherwise =+ just_segments ref+ { uriScheme = uriScheme base+ , uriAuthority = uriAuthority base+ , uriPath = uriPath base+ , uriQuery = uriQuery base+ }+ where+ just_segments u =+ u { uriPath = removeDotSegments (uriPath u) }+ mergePaths b r+ | isDefined (uriAuthority b) && null pb = '/':pr+ | otherwise = dropLast pb ++ pr+ where+ pb = uriPath b+ pr = uriPath r+ dropLast = fst . splitLast -- reverse . dropWhile (/='/') . reverse++-- Remove dot segments, but protect leading '/' character+removeDotSegments :: String -> String+removeDotSegments ('/':ps) = '/':elimDots ps []+removeDotSegments ps = elimDots ps []++-- Second arg accumulates segments processed so far in reverse order+elimDots :: String -> [String] -> String+-- elimDots ps rs | traceVal "\nps " ps $ traceVal "rs " rs $ False = error ""+elimDots [] [] = ""+elimDots [] rs = concat (reverse rs)+elimDots ( '.':'/':ps) rs = elimDots ps rs+elimDots ( '.':[] ) rs = elimDots [] rs+elimDots ( '.':'.':'/':ps) rs = elimDots ps (drop 1 rs)+elimDots ( '.':'.':[] ) rs = elimDots [] (drop 1 rs)+elimDots ps rs = elimDots ps1 (r:rs)+ where+ (r,ps1) = nextSegment ps++-- Returns the next segment and the rest of the path from a path string.+-- Each segment ends with the next '/' or the end of string.+--+nextSegment :: String -> (String,String)+nextSegment ps =+ case break (=='/') ps of+ (r,'/':ps1) -> (r++"/",ps1)+ (r,_) -> (r,[])++-- Split last (name) segment from path, returning (path,name)+splitLast :: String -> (String,String)+splitLast p = (reverse revpath,reverse revname)+ where+ (revname,revpath) = break (=='/') $ reverse p++------------------------------------------------------------+-- Finding a URI relative to a base URI+------------------------------------------------------------++-- |Returns a new 'URI' which represents the relative location of+-- the first 'URI' with respect to the second 'URI'. Thus, the+-- values supplied are expected to be absolute URIs, and the result+-- returned may be a relative URI.+--+-- Example:+--+-- > "http://example.com/Root/sub1/name2#frag"+-- > `relativeFrom` "http://example.com/Root/sub2/name2#frag"+-- > == "../sub1/name2#frag"+--+-- There is no single correct implementation of this function,+-- but any acceptable implementation must satisfy the following:+--+-- > (uabs `relativeFrom` ubase) `relativeTo` ubase == uabs+--+-- For any valid absolute URI.+-- (cf. <http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html>+-- <http://lists.w3.org/Archives/Public/uri/2003Jan/0005.html>)+--+relativeFrom :: URI -> URI -> URI+relativeFrom uabs base+ | diff uriScheme uabs base = uabs+ | diff uriAuthority uabs base = uabs { uriScheme = "" }+ | diff uriPath uabs base = uabs+ { uriScheme = ""+ , uriAuthority = Nothing+ , uriPath = relPathFrom (removeBodyDotSegments $ uriPath uabs)+ (removeBodyDotSegments $ uriPath base)+ }+ | diff uriQuery uabs base = uabs+ { uriScheme = ""+ , uriAuthority = Nothing+ , uriPath = ""+ }+ | otherwise = uabs -- Always carry fragment from uabs+ { uriScheme = ""+ , uriAuthority = Nothing+ , uriPath = ""+ , uriQuery = ""+ }+ where+ diff :: Eq b => (a -> b) -> a -> a -> Bool+ diff sel u1 u2 = sel u1 /= sel u2+ -- Remove dot segments except the final segment+ removeBodyDotSegments p = removeDotSegments p1 ++ p2+ where+ (p1,p2) = splitLast p++relPathFrom :: String -> String -> String+relPathFrom [] _ = "/"+relPathFrom pabs [] = pabs+relPathFrom pabs base = -- Construct a relative path segments+ if sa1 == sb1 -- if the paths share a leading segment+ then if (sa1 == "/") -- other than a leading '/'+ then if (sa2 == sb2)+ then relPathFrom1 ra2 rb2+ else pabs+ else relPathFrom1 ra1 rb1+ else pabs+ where+ (sa1,ra1) = nextSegment pabs+ (sb1,rb1) = nextSegment base+ (sa2,ra2) = nextSegment ra1+ (sb2,rb2) = nextSegment rb1++-- relPathFrom1 strips off trailing names from the supplied paths,+-- and calls difPathFrom to find the relative path from base to+-- target+relPathFrom1 :: String -> String -> String+relPathFrom1 pabs base = relName+ where+ (sa,na) = splitLast pabs+ (sb,nb) = splitLast base+ rp = relSegsFrom sa sb+ relName = if null rp then+ if (na == nb) then ""+ else if protect na then "./"++na+ else na+ else+ rp++na+ -- Precede name with some path if it is null or contains a ':'+ protect s = null s || ':' `elem` s++-- relSegsFrom discards any common leading segments from both paths,+-- then invokes difSegsFrom to calculate a relative path from the end+-- of the base path to the end of the target path.+-- The final name is handled separately, so this deals only with+-- "directory" segtments.+--+relSegsFrom :: String -> String -> String+{-+relSegsFrom sabs base+ | traceVal "\nrelSegsFrom\nsabs " sabs $ traceVal "base " base $+ False = error ""+-}+relSegsFrom [] [] = "" -- paths are identical+relSegsFrom sabs base =+ if sa1 == sb1+ then relSegsFrom ra1 rb1+ else difSegsFrom sabs base+ where+ (sa1,ra1) = nextSegment sabs+ (sb1,rb1) = nextSegment base++-- difSegsFrom calculates a path difference from base to target,+-- not including the final name at the end of the path+-- (i.e. results always ends with '/')+--+-- This function operates under the invariant that the supplied+-- value of sabs is the desired path relative to the beginning of+-- base. Thus, when base is empty, the desired path has been found.+--+difSegsFrom :: String -> String -> String+{-+difSegsFrom sabs base+ | traceVal "\ndifSegsFrom\nsabs " sabs $ traceVal "base " base $+ False = error ""+-}+difSegsFrom sabs "" = sabs+difSegsFrom sabs base = difSegsFrom ("../"++sabs) (snd $ nextSegment base)++------------------------------------------------------------+-- Other normalization functions+------------------------------------------------------------++-- |Case normalization; cf. RFC3986 section 6.2.2.1+-- NOTE: authority case normalization is not performed+--+normalizeCase :: String -> String+normalizeCase uristr = ncScheme uristr+ where+ ncScheme (':':cs) = ':':ncEscape cs+ ncScheme (c:cs) | isSchemeChar c = toLower c:ncScheme cs+ ncScheme _ = ncEscape uristr -- no scheme present+ ncEscape ('%':h1:h2:cs) = '%':toUpper h1:toUpper h2:ncEscape cs+ ncEscape (c:cs) = c:ncEscape cs+ ncEscape [] = []++-- |Encoding normalization; cf. RFC3986 section 6.2.2.2+--+normalizeEscape :: String -> String+normalizeEscape ('%':h1:h2:cs)+ | isHexDigit h1 && isHexDigit h2 && isUnreserved escval =+ escval:normalizeEscape cs+ where+ escval = chr (digitToInt h1*16+digitToInt h2)+normalizeEscape (c:cs) = c:normalizeEscape cs+normalizeEscape [] = []++-- |Path segment normalization; cf. RFC3986 section 6.2.2.4+--+normalizePathSegments :: String -> String+normalizePathSegments uristr = normstr juri+ where+ juri = parseURI uristr+ normstr Nothing = uristr+ normstr (Just u) = show (normuri u)+ normuri u = u { uriPath = removeDotSegments (uriPath u) }++------------------------------------------------------------+-- Local trace helper functions+------------------------------------------------------------++traceShow :: Show a => String -> a -> a+traceShow msg x = trace (msg ++ show x) x++traceVal :: Show a => String -> a -> b -> b+traceVal msg x y = trace (msg ++ show x) y++------------------------------------------------------------+-- Deprecated functions+------------------------------------------------------------++{-# DEPRECATED parseabsoluteURI "use parseAbsoluteURI" #-}+parseabsoluteURI :: String -> Maybe URI+parseabsoluteURI = parseAbsoluteURI++{-# DEPRECATED escapeString "use escapeURIString, and note the flipped arguments" #-}+escapeString :: String -> (Char->Bool) -> String+escapeString = flip escapeURIString++{-# DEPRECATED reserved "use isReserved" #-}+reserved :: Char -> Bool+reserved = isReserved++{-# DEPRECATED unreserved "use isUnreserved" #-}+unreserved :: Char -> Bool+unreserved = isUnreserved++-- Additional component access functions for backward compatibility++{-# DEPRECATED scheme "use uriScheme" #-}+scheme :: URI -> String+scheme = orNull init . uriScheme++{-# DEPRECATED authority "use uriAuthority, and note changed functionality" #-}+authority :: URI -> String+authority = dropss . ($"") . uriAuthToString id . uriAuthority+ where+ -- Old-style authority component does not include leading '//'+ dropss ('/':'/':s) = s+ dropss s = s++{-# DEPRECATED path "use uriPath" #-}+path :: URI -> String+path = uriPath++{-# DEPRECATED query "use uriQuery, and note changed functionality" #-}+query :: URI -> String+query = orNull tail . uriQuery++{-# DEPRECATED fragment "use uriFragment, and note changed functionality" #-}+fragment :: URI -> String+fragment = orNull tail . uriFragment++orNull :: ([a]->[a]) -> [a] -> [a]+orNull _ [] = []+orNull f as = f as++--------------------------------------------------------------------------------+--+-- Copyright (c) 2004, G. KLYNE. All rights reserved.+-- Distributed as free software under the following license.+--+-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions+-- are met:+--+-- - Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+--+-- - Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+--+-- - Neither name of the copyright holders nor the names of its+-- contributors may be used to endorse or promote products derived from+-- this software without specific prior written permission.+--+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND THE CONTRIBUTORS+-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+-- HOLDERS OR THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,+-- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,+-- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS+-- OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND+-- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR+-- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE+-- USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+--+--------------------------------------------------------------------------------
+ standalone/android/tmp/network-2.4.1.2/README view
@@ -0,0 +1,4 @@+To build this package using Cabal directly from git, you must run+"autoreconf" before the usual Cabal build steps (configure/build/install).+autoreconf is included in the GNU autoconf tools. There is no need to run+the "configure" script: the "setup configure" step will do this for you.
+ standalone/android/tmp/network-2.4.1.2/Setup.hs view
@@ -0,0 +1,6 @@+module Main (main) where++import Distribution.Simple++main :: IO ()+main = defaultMainWithHooks autoconfUserHooks
+ standalone/android/tmp/network-2.4.1.2/cabal.config view
@@ -0,0 +1,199 @@+constraints: Crypto ==4.2.5.1,+ binary ==0.7.6.1,+ DAV ==1.0.3,+ HTTP ==4000.2.17,+ HUnit ==1.2.5.2,+ IfElse ==0.85,+ MissingH ==1.2.1.0,+ MonadRandom ==0.1.13,+ QuickCheck ==2.7.6,+ SafeSemaphore ==0.10.1,+ aeson ==0.7.0.6,+ ansi-wl-pprint ==0.6.7.1,+ appar ==0.1.4,+ asn1-encoding ==0.8.1.3,+ asn1-parse ==0.8.1,+ asn1-types ==0.2.3,+ async ==2.0.1.5,+ attoparsec ==0.11.3.4,+ attoparsec-conduit ==1.1.0,+ authenticate ==1.3.2.10,+ base-unicode-symbols ==0.2.2.4,+ base16-bytestring ==0.1.1.6,+ base64-bytestring ==1.0.0.1,+ bifunctors ==4.1.1.1,+ bloomfilter ==2.0.0.0,+ byteable ==0.1.1,+ byteorder ==1.0.4,+ case-insensitive ==1.2.0.1,+ cereal ==0.4.0.1,+ cipher-aes ==0.2.8,+ cipher-des ==0.0.6,+ cipher-rc4 ==0.1.4,+ clientsession ==0.9.0.3,+ comonad ==4.2,+ conduit ==1.1.6,+ conduit-extra ==1.1.3,+ connection ==0.2.3,+ contravariant ==0.6.1.1,+ cookie ==0.4.1.2,+ cprng-aes ==0.5.2,+ crypto-api ==0.13.2,+ crypto-cipher-types ==0.0.9,+ crypto-numbers ==0.2.3,+ crypto-pubkey ==0.2.4,+ crypto-pubkey-types ==0.4.2.2,+ crypto-random ==0.0.7,+ cryptohash ==0.11.6,+ cryptohash-conduit ==0.1.1,+ css-text ==0.1.2.1,+ data-default ==0.5.3,+ data-default-class ==0.0.1,+ data-default-instances-base ==0.0.1,+ data-default-instances-containers ==0.0.1,+ data-default-instances-dlist ==0.0.1,+ data-default-instances-old-locale ==0.0.1,+ sandi ==0.3.0.1,+ dbus ==0.10.8,+ distributive ==0.4.4,+ dlist ==0.7.0.1,+ dns ==1.3.0,+ edit-distance ==0.2.1.2,+ either ==4.3,+ email-validate ==1.0.0,+ entropy ==0.2.1,+ errors ==1.4.7,+ exceptions ==0.6.1,+ failure ==0.2.0.3,+ fast-logger ==2.1.5,+ fdo-notify ==0.3.1,+ feed ==0.3.9.2,+ file-embed ==0.0.6,+ fingertree ==0.1.0.0,+ free ==4.9,+ gnuidn ==0.2,+ gnutls ==0.1.4,+ gsasl ==0.3.5,+ hS3 ==0.5.7,+ hashable ==1.2.1.0,+ hinotify ==0.3.5,+ hjsmin ==0.1.4.7,+ hslogger ==1.2.1,+ http-client ==0.4.11.1,+ http-client-tls ==0.2.2,+ http-conduit ==2.1.5,+ http-date ==0.0.2,+ http-types ==0.8.5,+ hxt ==9.3.1.4,+ hxt-charproperties ==9.1.1.1,+ hxt-regex-xmlschema ==9.0.4,+ hxt-unicode ==9.0.2.2,+ idna ==0.2,+ iproute ==1.2.11,+ json ==0.5,+ keys ==3.10.1,+ language-javascript ==0.5.13,+ lens ==4.4.0.2,+ libxml-sax ==0.7.5,+ mime-mail ==0.4.1.2,+ mime-types ==0.1.0.4,+ mmorph ==1.0.3,+ monad-control ==0.3.2.2,+ monad-logger ==0.3.6.1,+ monad-loops ==0.4.2.1,+ monads-tf ==0.1.0.2,+ mtl ==2.1.2,+ nats ==0.1.2,+ network ==2.4.1.2,+ network-conduit ==1.1.0,+ network-info ==0.2.0.5,+ network-multicast ==0.0.10,+ network-protocol-xmpp ==0.4.6,+ network-uri ==2.6.0.1,+ optparse-applicative ==0.11.0.2,+ parallel ==3.2.0.4,+ path-pieces ==0.1.4,+ pem ==0.2.2,+ persistent ==1.3.3,+ persistent-template ==1.3.2.2,+ pointed ==4.0,+ prelude-extras ==0.4,+ profunctors ==4.0.4,+ publicsuffixlist ==0.1,+ punycode ==2.0,+ random ==1.0.1.1,+ ranges ==0.2.4,+ reducers ==3.10.2.1,+ reflection ==1.2.0.1,+ regex-base ==0.93.2,+ regex-compat ==0.95.1,+ regex-posix ==0.95.2,+ regex-tdfa ==1.2.0,+ resource-pool ==0.2.1.1,+ resourcet ==1.1.2.3,+ safe ==0.3.8,+ securemem ==0.1.3,+ semigroupoids ==4.2,+ semigroups ==0.15.3,+ shakespeare ==2.0.5,+ silently ==1.2.4.1,+ simple-sendfile ==0.2.14,+ skein ==1.0.9,+ socks ==0.5.4,+ split ==0.2.2,+ stm ==2.4.2,+ stm-chans ==3.0.0.2,+ streaming-commons ==0.1.4.1,+ stringprep ==0.1.5,+ stringsearch ==0.3.6.5,+ syb ==0.4.0,+ system-fileio ==0.3.14,+ system-filepath ==0.4.12,+ tagged ==0.7.2,+ tagsoup ==0.13.1,+ tagstream-conduit ==0.5.5.1,+ text ==1.1.1.0,+ text-icu ==0.6.3.7,+ tf-random ==0.5,+ tls ==1.2.9,+ transformers ==0.3.0.0,+ transformers-base ==0.4.1,+ transformers-compat ==0.3.3.3,+ unbounded-delays ==0.1.0.8,+ unix-compat ==0.4.1.3,+ unix-time ==0.2.2,+ unordered-containers ==0.2.5.0,+ utf8-string ==0.3.7,+ uuid ==1.3.3,+ vault ==0.3.0.3,+ vector ==0.10.0.1,+ void ==0.6.1,+ wai ==3.0.1.1,+ wai-app-static ==3.0.0.1,+ wai-extra ==3.0.1.2,+ wai-logger ==2.1.1,+ warp ==3.0.0.5,+ warp-tls ==3.0.0,+ word8 ==0.1.1,+ x509 ==1.4.11,+ x509-store ==1.4.4,+ x509-system ==1.4.5,+ x509-validation ==1.5.0,+ xml ==1.3.13,+ xml-conduit ==1.2.1,+ xml-hamlet ==0.4.0.9,+ xml-types ==0.3.4,+ xss-sanitize ==0.3.5.2,+ yaml ==0.8.9.3,+ yesod ==1.2.6.1,+ yesod-auth ==1.3.4.6,+ yesod-core ==1.2.20.1,+ yesod-default ==1.2.0,+ yesod-form ==1.3.16,+ yesod-persistent ==1.2.3.1,+ yesod-routes ==1.2.0.7,+ yesod-static ==1.2.4,+ zlib ==0.5.4.1,+ bytestring ==0.10.4.0,+ scientific ==0.3.3.1,+ clock ==0.4.6.0
+ standalone/android/tmp/network-2.4.1.2/cbits/HsNet.c view
@@ -0,0 +1,22 @@+/* -----------------------------------------------------------------------------+ * (c) The University of Glasgow 2002+ *+ * static versions of the inline functions from HsNet.h+ * -------------------------------------------------------------------------- */++#define INLINE+#include "HsNet.h"++#include <sys/endian.h>+uint16_t my_htons(uint16_t v)+{+ htons(v);+}+uint32_t my_htonl(uint32_t v)+{+ htonl(v);+}+uint16_t my_ntohs(uint16_t v)+{+ ntohs(v);+}
+ standalone/android/tmp/network-2.4.1.2/cbits/ancilData.c view
@@ -0,0 +1,123 @@+/*+ * Copyright(c), 2002 The GHC Team.+ */++#ifdef aix_HOST_OS+#define _LINUX_SOURCE_COMPAT +// Required to get CMSG_SPACE/CMSG_LEN macros. See #265.+// Alternative is to #define COMPAT_43 and use the +// HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS code instead, but that means+// fiddling with the configure script too.+#endif++#include "HsNet.h"+#include <string.h>++#if HAVE_STRUCT_MSGHDR_MSG_CONTROL || HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS /* until end */++/* + * Support for transmitting file descriptors.+ *+ * + */+ ++/*+ * sendmsg() and recvmsg() wrappers for transmitting+ * ancillary socket data.+ *+ * Doesn't provide the full generality of either, specifically:+ *+ * - no support for scattered read/writes.+ * - only possible to send one ancillary chunk of data at a time.+ */++int+sendFd(int sock,+ int outfd)+{+ struct msghdr msg = {0};+ struct iovec iov[1];+ char buf[2];+#if HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS+ msg.msg_accrights = (void*)&outfd;+ msg.msg_accrightslen = sizeof(int);+#else+ struct cmsghdr *cmsg;+ char ancBuffer[CMSG_SPACE(sizeof(int))];+ char* dPtr;+ + msg.msg_control = ancBuffer;+ msg.msg_controllen = sizeof(ancBuffer);++ cmsg = CMSG_FIRSTHDR(&msg);+ cmsg->cmsg_level = SOL_SOCKET;+ cmsg->cmsg_type = SCM_RIGHTS;+ cmsg->cmsg_len = CMSG_LEN(sizeof(int));+ dPtr = (char*)CMSG_DATA(cmsg);+ + *(int*)dPtr = outfd;+ msg.msg_controllen = cmsg->cmsg_len;+#endif++ buf[0] = 0; buf[1] = '\0';+ iov[0].iov_base = buf;+ iov[0].iov_len = 2;++ msg.msg_iov = iov;+ msg.msg_iovlen = 1;+ + return sendmsg(sock,&msg,0);+}++int+recvFd(int sock)+{+ struct msghdr msg = {0};+ char duffBuf[10];+ int rc;+ int len = sizeof(int);+ struct iovec iov[1];+#if HAVE_STRUCT_MSGHDR_MSG_CONTROL+ struct cmsghdr *cmsg = NULL;+ struct cmsghdr *cptr;+#else+ int* fdBuffer;+#endif++ iov[0].iov_base = duffBuf;+ iov[0].iov_len = sizeof(duffBuf);+ msg.msg_iov = iov;+ msg.msg_iovlen = 1;++#if HAVE_STRUCT_MSGHDR_MSG_CONTROL+ cmsg = (struct cmsghdr*)malloc(CMSG_SPACE(len));+ if (cmsg==NULL) {+ return -1;+ }+ + msg.msg_control = (void *)cmsg;+ msg.msg_controllen = CMSG_LEN(len);+#else+ fdBuffer = (int*)malloc(len);+ if (fdBuffer) {+ msg.msg_accrights = (void *)fdBuffer;+ } else {+ return -1;+ }+ msg.msg_accrightslen = len;+#endif++ if ((rc = recvmsg(sock,&msg,0)) < 0) {+ return rc;+ }+ +#if HAVE_STRUCT_MSGHDR_MSG_CONTROL+ cptr = (struct cmsghdr*)CMSG_FIRSTHDR(&msg);+ return *(int*)CMSG_DATA(cptr);+#else+ return *(int*)fdBuffer;+#endif+}++#endif
+ standalone/android/tmp/network-2.4.1.2/cbits/asyncAccept.c view
@@ -0,0 +1,72 @@+/*+ * (c) sof, 2003.+ */++#include "HsNet.h"+#include "HsFFI.h"++#if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)++/* all the way to the end */++/*+ * To support non-blocking accept()s with WinSock, we use the asyncDoProc#+ * primop, which lets a Haskell thread call an external routine without+ * blocking the progress of other threads. + *+ * As can readily be seen, this is a low-level mechanism.+ *+ */++typedef struct AcceptData {+ int fdSock;+ int newSock;+ void* sockAddr;+ int size;+} AcceptData;++/*+ * Fill in parameter block that's passed along when the RTS invokes the + * accept()-calling proc below (acceptDoProc())+ */+void*+newAcceptParams(int sock,+ int sz,+ void* sockaddr)+{+ AcceptData* data = (AcceptData*)malloc(sizeof(AcceptData));+ if (!data) return NULL;+ data->fdSock = sock;+ data->newSock = 0;+ data->sockAddr = sockaddr;+ data->size = sz;+ + return data;+}++/* Accessors for return code and accept()'s socket result. */++int+acceptNewSock(void* d)+{+ return (((AcceptData*)d)->newSock);+}++/* Routine invoked by an RTS worker thread */+int+acceptDoProc(void* param)+{+ SOCKET s;++ AcceptData* data = (AcceptData*)param;+ s = accept( data->fdSock,+ data->sockAddr,+ &data->size);+ data->newSock = s;+ if ( s == INVALID_SOCKET ) {+ return GetLastError();+ } else {+ return 0;+ }+}+#endif
+ standalone/android/tmp/network-2.4.1.2/cbits/initWinSock.c view
@@ -0,0 +1,52 @@+#include "HsNet.h"+#include "HsFFI.h"++#if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)++static int winsock_inited = 0;+static int winsock_uninited = 0;++/* Initialising WinSock... */+int+initWinSock ()+{+ WORD wVersionRequested;+ WSADATA wsaData; + int err;++ if (!winsock_inited) {+ wVersionRequested = MAKEWORD( 2, 2 );++ err = WSAStartup ( wVersionRequested, &wsaData );+ + if ( err != 0 ) {+ return err;+ }++ if ( LOBYTE( wsaData.wVersion ) != 2 ||+ HIBYTE( wsaData.wVersion ) != 2 ) {+ WSACleanup();+ return (-1);+ }++ winsock_inited = 1;+ }+ return 0;+}++static void+shutdownHandler(void)+{+ WSACleanup();+}++void+shutdownWinSock()+{+ if (!winsock_uninited) {+ atexit(shutdownHandler);+ winsock_uninited = 1;+ }+}++#endif
+ standalone/android/tmp/network-2.4.1.2/cbits/winSockErr.c view
@@ -0,0 +1,76 @@+#include "HsNet.h"+#include "HsFFI.h"++#if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)+#include <stdio.h>++/* to the end */++const char*+getWSErrorDescr(int err)+{+ static char otherErrMsg[256];++ switch (err) {+ case WSAEINTR: return "Interrupted function call (WSAEINTR)";+ case WSAEBADF: return "bad socket descriptor (WSAEBADF)";+ case WSAEACCES: return "Permission denied (WSAEACCESS)";+ case WSAEFAULT: return "Bad address (WSAEFAULT)";+ case WSAEINVAL: return "Invalid argument (WSAEINVAL)";+ case WSAEMFILE: return "Too many open files (WSAEMFILE)";+ case WSAEWOULDBLOCK: return "Resource temporarily unavailable (WSAEWOULDBLOCK)";+ case WSAEINPROGRESS: return "Operation now in progress (WSAEINPROGRESS)";+ case WSAEALREADY: return "Operation already in progress (WSAEALREADY)";+ case WSAENOTSOCK: return "Socket operation on non-socket (WSAENOTSOCK)";+ case WSAEDESTADDRREQ: return "Destination address required (WSAEDESTADDRREQ)";+ case WSAEMSGSIZE: return "Message too long (WSAEMSGSIZE)";+ case WSAEPROTOTYPE: return "Protocol wrong type for socket (WSAEPROTOTYPE)";+ case WSAENOPROTOOPT: return "Bad protocol option (WSAENOPROTOOPT)";+ case WSAEPROTONOSUPPORT: return "Protocol not supported (WSAEPROTONOSUPPORT)";+ case WSAESOCKTNOSUPPORT: return "Socket type not supported (WSAESOCKTNOSUPPORT)";+ case WSAEOPNOTSUPP: return "Operation not supported (WSAEOPNOTSUPP)";+ case WSAEPFNOSUPPORT: return "Protocol family not supported (WSAEPFNOSUPPORT)";+ case WSAEAFNOSUPPORT: return "Address family not supported by protocol family (WSAEAFNOSUPPORT)";+ case WSAEADDRINUSE: return "Address already in use (WSAEADDRINUSE)";+ case WSAEADDRNOTAVAIL: return "Cannot assign requested address (WSAEADDRNOTAVAIL)";+ case WSAENETDOWN: return "Network is down (WSAENETDOWN)";+ case WSAENETUNREACH: return "Network is unreachable (WSAENETUNREACH)";+ case WSAENETRESET: return "Network dropped connection on reset (WSAENETRESET)";+ case WSAECONNABORTED: return "Software caused connection abort (WSAECONNABORTED)";+ case WSAECONNRESET: return "Connection reset by peer (WSAECONNRESET)";+ case WSAENOBUFS: return "No buffer space available (WSAENOBUFS)";+ case WSAEISCONN: return "Socket is already connected (WSAEISCONN)";+ case WSAENOTCONN: return "Socket is not connected (WSAENOTCONN)";+ case WSAESHUTDOWN: return "Cannot send after socket shutdown (WSAESHUTDOWN)";+ case WSAETOOMANYREFS: return "Too many references (WSAETOOMANYREFS)";+ case WSAETIMEDOUT: return "Connection timed out (WSAETIMEDOUT)";+ case WSAECONNREFUSED: return "Connection refused (WSAECONNREFUSED)";+ case WSAELOOP: return "Too many levels of symbolic links (WSAELOOP)";+ case WSAENAMETOOLONG: return "Filename too long (WSAENAMETOOLONG)";+ case WSAEHOSTDOWN: return "Host is down (WSAEHOSTDOWN)";+ case WSAEHOSTUNREACH: return "Host is unreachable (WSAEHOSTUNREACH)";+ case WSAENOTEMPTY: return "Resource not empty (WSAENOTEMPTY)";+ case WSAEPROCLIM: return "Too many processes (WSAEPROCLIM)";+ case WSAEUSERS: return "Too many users (WSAEUSERS)";+ case WSAEDQUOT: return "Disk quota exceeded (WSAEDQUOT)";+ case WSAESTALE: return "Stale NFS file handle (WSAESTALE)";+ case WSAEREMOTE: return "Too many levels of remote in path (WSAEREMOTE)";+ case WSAEDISCON: return "Graceful shutdown in progress (WSAEDISCON)";+ case WSASYSNOTREADY: return "Network subsystem is unavailable (WSASYSNOTREADY)";+ case WSAVERNOTSUPPORTED: return "Winsock.dll version out of range (WSAVERNOTSUPPORTED)";+ case WSANOTINITIALISED: return "Successful WSAStartup not yet performed (WSANOTINITIALISED)";+#ifdef WSATYPE_NOT_FOUND+ case WSATYPE_NOT_FOUND: return "Class type not found (WSATYPE_NOT_FOUND)";+#endif+ case WSAHOST_NOT_FOUND: return "Host not found (WSAHOST_NOT_FOUND)";+ case WSATRY_AGAIN: return "Nonauthoritative host not found (WSATRY_AGAIN)";+ case WSANO_RECOVERY: return "This is a nonrecoverable error (WSANO_RECOVERY)";+ case WSANO_DATA: return "Valid name, no data record of requested type (WSANO_DATA)";+ default:+ sprintf(otherErrMsg, "Unknown WinSock error: %u", err);+ return otherErrMsg;+ }+}++#endif+
+ standalone/android/tmp/network-2.4.1.2/config.guess view
@@ -0,0 +1,1420 @@+#! /bin/sh+# Attempt to guess a canonical system name.+# Copyright 1992-2014 Free Software Foundation, Inc.++timestamp='2014-03-23'++# This file is free software; you can redistribute it and/or modify it+# under the terms of the GNU General Public License as published by+# the Free Software Foundation; either version 3 of the License, or+# (at your option) any later version.+#+# This program is distributed in the hope that it will be useful, but+# WITHOUT ANY WARRANTY; without even the implied warranty of+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU+# General Public License for more details.+#+# You should have received a copy of the GNU General Public License+# along with this program; if not, see <http://www.gnu.org/licenses/>.+#+# As a special exception to the GNU General Public License, if you+# distribute this file as part of a program that contains a+# configuration script generated by Autoconf, you may include it under+# the same distribution terms that you use for the rest of that+# program. This Exception is an additional permission under section 7+# of the GNU General Public License, version 3 ("GPLv3").+#+# Originally written by Per Bothner.+#+# You can get the latest version of this script from:+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD+#+# Please send patches with a ChangeLog entry to config-patches@gnu.org.+++me=`echo "$0" | sed -e 's,.*/,,'`++usage="\+Usage: $0 [OPTION]++Output the configuration name of the system \`$me' is run on.++Operation modes:+ -h, --help print this help, then exit+ -t, --time-stamp print date of last modification, then exit+ -v, --version print version number, then exit++Report bugs and patches to <config-patches@gnu.org>."++version="\+GNU config.guess ($timestamp)++Originally written by Per Bothner.+Copyright 1992-2014 Free Software Foundation, Inc.++This is free software; see the source for copying conditions. There is NO+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."++help="+Try \`$me --help' for more information."++# Parse command line+while test $# -gt 0 ; do+ case $1 in+ --time-stamp | --time* | -t )+ echo "$timestamp" ; exit ;;+ --version | -v )+ echo "$version" ; exit ;;+ --help | --h* | -h )+ echo "$usage"; exit ;;+ -- ) # Stop option processing+ shift; break ;;+ - ) # Use stdin as input.+ break ;;+ -* )+ echo "$me: invalid option $1$help" >&2+ exit 1 ;;+ * )+ break ;;+ esac+done++if test $# != 0; then+ echo "$me: too many arguments$help" >&2+ exit 1+fi++trap 'exit 1' 1 2 15++# CC_FOR_BUILD -- compiler used by this script. Note that the use of a+# compiler to aid in system detection is discouraged as it requires+# temporary files to be created and, as you can see below, it is a+# headache to deal with in a portable fashion.++# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still+# use `HOST_CC' if defined, but it is deprecated.++# Portable tmp directory creation inspired by the Autoconf team.++set_cc_for_build='+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;+: ${TMPDIR=/tmp} ;+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;+dummy=$tmp/dummy ;+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;+case $CC_FOR_BUILD,$HOST_CC,$CC in+ ,,) echo "int x;" > $dummy.c ;+ for c in cc gcc c89 c99 ; do+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then+ CC_FOR_BUILD="$c"; break ;+ fi ;+ done ;+ if test x"$CC_FOR_BUILD" = x ; then+ CC_FOR_BUILD=no_compiler_found ;+ fi+ ;;+ ,,*) CC_FOR_BUILD=$CC ;;+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;+esac ; set_cc_for_build= ;'++# This is needed to find uname on a Pyramid OSx when run in the BSD universe.+# (ghazi@noc.rutgers.edu 1994-08-24)+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then+ PATH=$PATH:/.attbin ; export PATH+fi++UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown++case "${UNAME_SYSTEM}" in+Linux|GNU|GNU/*)+ # If the system lacks a compiler, then just pick glibc.+ # We could probably try harder.+ LIBC=gnu++ eval $set_cc_for_build+ cat <<-EOF > $dummy.c+ #include <features.h>+ #if defined(__UCLIBC__)+ LIBC=uclibc+ #elif defined(__dietlibc__)+ LIBC=dietlibc+ #else+ LIBC=gnu+ #endif+ EOF+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`+ ;;+esac++# Note: order is significant - the case branches are not exclusive.++case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in+ *:NetBSD:*:*)+ # NetBSD (nbsd) targets should (where applicable) match one or+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently+ # switched to ELF, *-*-netbsd* would select the old+ # object file format. This provides both forward+ # compatibility and a consistent mechanism for selecting the+ # object file format.+ #+ # Note: NetBSD doesn't particularly care about the vendor+ # portion of the name. We always set it to "unknown".+ sysctl="sysctl -n hw.machine_arch"+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`+ case "${UNAME_MACHINE_ARCH}" in+ armeb) machine=armeb-unknown ;;+ arm*) machine=arm-unknown ;;+ sh3el) machine=shl-unknown ;;+ sh3eb) machine=sh-unknown ;;+ sh5el) machine=sh5le-unknown ;;+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;+ esac+ # The Operating System including object format, if it has switched+ # to ELF recently, or will in the future.+ case "${UNAME_MACHINE_ARCH}" in+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)+ eval $set_cc_for_build+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \+ | grep -q __ELF__+ then+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).+ # Return netbsd for either. FIX?+ os=netbsd+ else+ os=netbsdelf+ fi+ ;;+ *)+ os=netbsd+ ;;+ esac+ # The OS release+ # Debian GNU/NetBSD machines have a different userland, and+ # thus, need a distinct triplet. However, they do not need+ # kernel version information, so it can be replaced with a+ # suitable tag, in the style of linux-gnu.+ case "${UNAME_VERSION}" in+ Debian*)+ release='-gnu'+ ;;+ *)+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`+ ;;+ esac+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:+ # contains redundant information, the shorter form:+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.+ echo "${machine}-${os}${release}"+ exit ;;+ *:Bitrig:*:*)+ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`+ echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}+ exit ;;+ *:OpenBSD:*:*)+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}+ exit ;;+ *:ekkoBSD:*:*)+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}+ exit ;;+ *:SolidBSD:*:*)+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}+ exit ;;+ macppc:MirBSD:*:*)+ echo powerpc-unknown-mirbsd${UNAME_RELEASE}+ exit ;;+ *:MirBSD:*:*)+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}+ exit ;;+ alpha:OSF1:*:*)+ case $UNAME_RELEASE in+ *4.0)+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`+ ;;+ *5.*)+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`+ ;;+ esac+ # According to Compaq, /usr/sbin/psrinfo has been available on+ # OSF/1 and Tru64 systems produced since 1995. I hope that+ # covers most systems running today. This code pipes the CPU+ # types through head -n 1, so we only detect the type of CPU 0.+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`+ case "$ALPHA_CPU_TYPE" in+ "EV4 (21064)")+ UNAME_MACHINE="alpha" ;;+ "EV4.5 (21064)")+ UNAME_MACHINE="alpha" ;;+ "LCA4 (21066/21068)")+ UNAME_MACHINE="alpha" ;;+ "EV5 (21164)")+ UNAME_MACHINE="alphaev5" ;;+ "EV5.6 (21164A)")+ UNAME_MACHINE="alphaev56" ;;+ "EV5.6 (21164PC)")+ UNAME_MACHINE="alphapca56" ;;+ "EV5.7 (21164PC)")+ UNAME_MACHINE="alphapca57" ;;+ "EV6 (21264)")+ UNAME_MACHINE="alphaev6" ;;+ "EV6.7 (21264A)")+ UNAME_MACHINE="alphaev67" ;;+ "EV6.8CB (21264C)")+ UNAME_MACHINE="alphaev68" ;;+ "EV6.8AL (21264B)")+ UNAME_MACHINE="alphaev68" ;;+ "EV6.8CX (21264D)")+ UNAME_MACHINE="alphaev68" ;;+ "EV6.9A (21264/EV69A)")+ UNAME_MACHINE="alphaev69" ;;+ "EV7 (21364)")+ UNAME_MACHINE="alphaev7" ;;+ "EV7.9 (21364A)")+ UNAME_MACHINE="alphaev79" ;;+ esac+ # A Pn.n version is a patched version.+ # A Vn.n version is a released version.+ # A Tn.n version is a released field test version.+ # A Xn.n version is an unreleased experimental baselevel.+ # 1.2 uses "1.2" for uname -r.+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.+ exitcode=$?+ trap '' 0+ exit $exitcode ;;+ Alpha\ *:Windows_NT*:*)+ # How do we know it's Interix rather than the generic POSIX subsystem?+ # Should we change UNAME_MACHINE based on the output of uname instead+ # of the specific Alpha model?+ echo alpha-pc-interix+ exit ;;+ 21064:Windows_NT:50:3)+ echo alpha-dec-winnt3.5+ exit ;;+ Amiga*:UNIX_System_V:4.0:*)+ echo m68k-unknown-sysv4+ exit ;;+ *:[Aa]miga[Oo][Ss]:*:*)+ echo ${UNAME_MACHINE}-unknown-amigaos+ exit ;;+ *:[Mm]orph[Oo][Ss]:*:*)+ echo ${UNAME_MACHINE}-unknown-morphos+ exit ;;+ *:OS/390:*:*)+ echo i370-ibm-openedition+ exit ;;+ *:z/VM:*:*)+ echo s390-ibm-zvmoe+ exit ;;+ *:OS400:*:*)+ echo powerpc-ibm-os400+ exit ;;+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)+ echo arm-acorn-riscix${UNAME_RELEASE}+ exit ;;+ arm*:riscos:*:*|arm*:RISCOS:*:*)+ echo arm-unknown-riscos+ exit ;;+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)+ echo hppa1.1-hitachi-hiuxmpp+ exit ;;+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.+ if test "`(/bin/universe) 2>/dev/null`" = att ; then+ echo pyramid-pyramid-sysv3+ else+ echo pyramid-pyramid-bsd+ fi+ exit ;;+ NILE*:*:*:dcosx)+ echo pyramid-pyramid-svr4+ exit ;;+ DRS?6000:unix:4.0:6*)+ echo sparc-icl-nx6+ exit ;;+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)+ case `/usr/bin/uname -p` in+ sparc) echo sparc-icl-nx7; exit ;;+ esac ;;+ s390x:SunOS:*:*)+ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`+ exit ;;+ sun4H:SunOS:5.*:*)+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`+ exit ;;+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`+ exit ;;+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)+ echo i386-pc-auroraux${UNAME_RELEASE}+ exit ;;+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)+ eval $set_cc_for_build+ SUN_ARCH="i386"+ # If there is a compiler, see if it is configured for 64-bit objects.+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.+ # This test works for both compilers.+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \+ grep IS_64BIT_ARCH >/dev/null+ then+ SUN_ARCH="x86_64"+ fi+ fi+ echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`+ exit ;;+ sun4*:SunOS:6*:*)+ # According to config.sub, this is the proper way to canonicalize+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but+ # it's likely to be more like Solaris than SunOS4.+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`+ exit ;;+ sun4*:SunOS:*:*)+ case "`/usr/bin/arch -k`" in+ Series*|S4*)+ UNAME_RELEASE=`uname -v`+ ;;+ esac+ # Japanese Language versions have a version number like `4.1.3-JL'.+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`+ exit ;;+ sun3*:SunOS:*:*)+ echo m68k-sun-sunos${UNAME_RELEASE}+ exit ;;+ sun*:*:4.2BSD:*)+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3+ case "`/bin/arch`" in+ sun3)+ echo m68k-sun-sunos${UNAME_RELEASE}+ ;;+ sun4)+ echo sparc-sun-sunos${UNAME_RELEASE}+ ;;+ esac+ exit ;;+ aushp:SunOS:*:*)+ echo sparc-auspex-sunos${UNAME_RELEASE}+ exit ;;+ # The situation for MiNT is a little confusing. The machine name+ # can be virtually everything (everything which is not+ # "atarist" or "atariste" at least should have a processor+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"+ # to the lowercase version "mint" (or "freemint"). Finally+ # the system name "TOS" denotes a system which is actually not+ # MiNT. But MiNT is downward compatible to TOS, so this should+ # be no problem.+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)+ echo m68k-atari-mint${UNAME_RELEASE}+ exit ;;+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)+ echo m68k-atari-mint${UNAME_RELEASE}+ exit ;;+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)+ echo m68k-atari-mint${UNAME_RELEASE}+ exit ;;+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)+ echo m68k-milan-mint${UNAME_RELEASE}+ exit ;;+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)+ echo m68k-hades-mint${UNAME_RELEASE}+ exit ;;+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)+ echo m68k-unknown-mint${UNAME_RELEASE}+ exit ;;+ m68k:machten:*:*)+ echo m68k-apple-machten${UNAME_RELEASE}+ exit ;;+ powerpc:machten:*:*)+ echo powerpc-apple-machten${UNAME_RELEASE}+ exit ;;+ RISC*:Mach:*:*)+ echo mips-dec-mach_bsd4.3+ exit ;;+ RISC*:ULTRIX:*:*)+ echo mips-dec-ultrix${UNAME_RELEASE}+ exit ;;+ VAX*:ULTRIX*:*:*)+ echo vax-dec-ultrix${UNAME_RELEASE}+ exit ;;+ 2020:CLIX:*:* | 2430:CLIX:*:*)+ echo clipper-intergraph-clix${UNAME_RELEASE}+ exit ;;+ mips:*:*:UMIPS | mips:*:*:RISCos)+ eval $set_cc_for_build+ sed 's/^ //' << EOF >$dummy.c+#ifdef __cplusplus+#include <stdio.h> /* for printf() prototype */+ int main (int argc, char *argv[]) {+#else+ int main (argc, argv) int argc; char *argv[]; {+#endif+ #if defined (host_mips) && defined (MIPSEB)+ #if defined (SYSTYPE_SYSV)+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);+ #endif+ #if defined (SYSTYPE_SVR4)+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);+ #endif+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);+ #endif+ #endif+ exit (-1);+ }+EOF+ $CC_FOR_BUILD -o $dummy $dummy.c &&+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&+ SYSTEM_NAME=`$dummy $dummyarg` &&+ { echo "$SYSTEM_NAME"; exit; }+ echo mips-mips-riscos${UNAME_RELEASE}+ exit ;;+ Motorola:PowerMAX_OS:*:*)+ echo powerpc-motorola-powermax+ exit ;;+ Motorola:*:4.3:PL8-*)+ echo powerpc-harris-powermax+ exit ;;+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)+ echo powerpc-harris-powermax+ exit ;;+ Night_Hawk:Power_UNIX:*:*)+ echo powerpc-harris-powerunix+ exit ;;+ m88k:CX/UX:7*:*)+ echo m88k-harris-cxux7+ exit ;;+ m88k:*:4*:R4*)+ echo m88k-motorola-sysv4+ exit ;;+ m88k:*:3*:R3*)+ echo m88k-motorola-sysv3+ exit ;;+ AViiON:dgux:*:*)+ # DG/UX returns AViiON for all architectures+ UNAME_PROCESSOR=`/usr/bin/uname -p`+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]+ then+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \+ [ ${TARGET_BINARY_INTERFACE}x = x ]+ then+ echo m88k-dg-dgux${UNAME_RELEASE}+ else+ echo m88k-dg-dguxbcs${UNAME_RELEASE}+ fi+ else+ echo i586-dg-dgux${UNAME_RELEASE}+ fi+ exit ;;+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)+ echo m88k-dolphin-sysv3+ exit ;;+ M88*:*:R3*:*)+ # Delta 88k system running SVR3+ echo m88k-motorola-sysv3+ exit ;;+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)+ echo m88k-tektronix-sysv3+ exit ;;+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)+ echo m68k-tektronix-bsd+ exit ;;+ *:IRIX*:*:*)+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`+ exit ;;+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '+ i*86:AIX:*:*)+ echo i386-ibm-aix+ exit ;;+ ia64:AIX:*:*)+ if [ -x /usr/bin/oslevel ] ; then+ IBM_REV=`/usr/bin/oslevel`+ else+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}+ fi+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}+ exit ;;+ *:AIX:2:3)+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then+ eval $set_cc_for_build+ sed 's/^ //' << EOF >$dummy.c+ #include <sys/systemcfg.h>++ main()+ {+ if (!__power_pc())+ exit(1);+ puts("powerpc-ibm-aix3.2.5");+ exit(0);+ }+EOF+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`+ then+ echo "$SYSTEM_NAME"+ else+ echo rs6000-ibm-aix3.2.5+ fi+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then+ echo rs6000-ibm-aix3.2.4+ else+ echo rs6000-ibm-aix3.2+ fi+ exit ;;+ *:AIX:*:[4567])+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then+ IBM_ARCH=rs6000+ else+ IBM_ARCH=powerpc+ fi+ if [ -x /usr/bin/oslevel ] ; then+ IBM_REV=`/usr/bin/oslevel`+ else+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}+ fi+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}+ exit ;;+ *:AIX:*:*)+ echo rs6000-ibm-aix+ exit ;;+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)+ echo romp-ibm-bsd4.4+ exit ;;+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to+ exit ;; # report: romp-ibm BSD 4.3+ *:BOSX:*:*)+ echo rs6000-bull-bosx+ exit ;;+ DPX/2?00:B.O.S.:*:*)+ echo m68k-bull-sysv3+ exit ;;+ 9000/[34]??:4.3bsd:1.*:*)+ echo m68k-hp-bsd+ exit ;;+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)+ echo m68k-hp-bsd4.4+ exit ;;+ 9000/[34678]??:HP-UX:*:*)+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`+ case "${UNAME_MACHINE}" in+ 9000/31? ) HP_ARCH=m68000 ;;+ 9000/[34]?? ) HP_ARCH=m68k ;;+ 9000/[678][0-9][0-9])+ if [ -x /usr/bin/getconf ]; then+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`+ case "${sc_cpu_version}" in+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1+ 532) # CPU_PA_RISC2_0+ case "${sc_kernel_bits}" in+ 32) HP_ARCH="hppa2.0n" ;;+ 64) HP_ARCH="hppa2.0w" ;;+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20+ esac ;;+ esac+ fi+ if [ "${HP_ARCH}" = "" ]; then+ eval $set_cc_for_build+ sed 's/^ //' << EOF >$dummy.c++ #define _HPUX_SOURCE+ #include <stdlib.h>+ #include <unistd.h>++ int main ()+ {+ #if defined(_SC_KERNEL_BITS)+ long bits = sysconf(_SC_KERNEL_BITS);+ #endif+ long cpu = sysconf (_SC_CPU_VERSION);++ switch (cpu)+ {+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;+ case CPU_PA_RISC2_0:+ #if defined(_SC_KERNEL_BITS)+ switch (bits)+ {+ case 64: puts ("hppa2.0w"); break;+ case 32: puts ("hppa2.0n"); break;+ default: puts ("hppa2.0"); break;+ } break;+ #else /* !defined(_SC_KERNEL_BITS) */+ puts ("hppa2.0"); break;+ #endif+ default: puts ("hppa1.0"); break;+ }+ exit (0);+ }+EOF+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`+ test -z "$HP_ARCH" && HP_ARCH=hppa+ fi ;;+ esac+ if [ ${HP_ARCH} = "hppa2.0w" ]+ then+ eval $set_cc_for_build++ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler+ # generating 64-bit code. GNU and HP use different nomenclature:+ #+ # $ CC_FOR_BUILD=cc ./config.guess+ # => hppa2.0w-hp-hpux11.23+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess+ # => hppa64-hp-hpux11.23++ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |+ grep -q __LP64__+ then+ HP_ARCH="hppa2.0w"+ else+ HP_ARCH="hppa64"+ fi+ fi+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}+ exit ;;+ ia64:HP-UX:*:*)+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`+ echo ia64-hp-hpux${HPUX_REV}+ exit ;;+ 3050*:HI-UX:*:*)+ eval $set_cc_for_build+ sed 's/^ //' << EOF >$dummy.c+ #include <unistd.h>+ int+ main ()+ {+ long cpu = sysconf (_SC_CPU_VERSION);+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct+ results, however. */+ if (CPU_IS_PA_RISC (cpu))+ {+ switch (cpu)+ {+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;+ default: puts ("hppa-hitachi-hiuxwe2"); break;+ }+ }+ else if (CPU_IS_HP_MC68K (cpu))+ puts ("m68k-hitachi-hiuxwe2");+ else puts ("unknown-hitachi-hiuxwe2");+ exit (0);+ }+EOF+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&+ { echo "$SYSTEM_NAME"; exit; }+ echo unknown-hitachi-hiuxwe2+ exit ;;+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )+ echo hppa1.1-hp-bsd+ exit ;;+ 9000/8??:4.3bsd:*:*)+ echo hppa1.0-hp-bsd+ exit ;;+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)+ echo hppa1.0-hp-mpeix+ exit ;;+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )+ echo hppa1.1-hp-osf+ exit ;;+ hp8??:OSF1:*:*)+ echo hppa1.0-hp-osf+ exit ;;+ i*86:OSF1:*:*)+ if [ -x /usr/sbin/sysversion ] ; then+ echo ${UNAME_MACHINE}-unknown-osf1mk+ else+ echo ${UNAME_MACHINE}-unknown-osf1+ fi+ exit ;;+ parisc*:Lites*:*:*)+ echo hppa1.1-hp-lites+ exit ;;+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)+ echo c1-convex-bsd+ exit ;;+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)+ if getsysinfo -f scalar_acc+ then echo c32-convex-bsd+ else echo c2-convex-bsd+ fi+ exit ;;+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)+ echo c34-convex-bsd+ exit ;;+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)+ echo c38-convex-bsd+ exit ;;+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)+ echo c4-convex-bsd+ exit ;;+ CRAY*Y-MP:*:*:*)+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'+ exit ;;+ CRAY*[A-Z]90:*:*:*)+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \+ -e 's/\.[^.]*$/.X/'+ exit ;;+ CRAY*TS:*:*:*)+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'+ exit ;;+ CRAY*T3E:*:*:*)+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'+ exit ;;+ CRAY*SV1:*:*:*)+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'+ exit ;;+ *:UNICOS/mp:*:*)+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'+ exit ;;+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"+ exit ;;+ 5000:UNIX_System_V:4.*:*)+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"+ exit ;;+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}+ exit ;;+ sparc*:BSD/OS:*:*)+ echo sparc-unknown-bsdi${UNAME_RELEASE}+ exit ;;+ *:BSD/OS:*:*)+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}+ exit ;;+ *:FreeBSD:*:*)+ UNAME_PROCESSOR=`/usr/bin/uname -p`+ case ${UNAME_PROCESSOR} in+ amd64)+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;+ *)+ echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;+ esac+ exit ;;+ i*:CYGWIN*:*)+ echo ${UNAME_MACHINE}-pc-cygwin+ exit ;;+ *:MINGW64*:*)+ echo ${UNAME_MACHINE}-pc-mingw64+ exit ;;+ *:MINGW*:*)+ echo ${UNAME_MACHINE}-pc-mingw32+ exit ;;+ *:MSYS*:*)+ echo ${UNAME_MACHINE}-pc-msys+ exit ;;+ i*:windows32*:*)+ # uname -m includes "-pc" on this system.+ echo ${UNAME_MACHINE}-mingw32+ exit ;;+ i*:PW*:*)+ echo ${UNAME_MACHINE}-pc-pw32+ exit ;;+ *:Interix*:*)+ case ${UNAME_MACHINE} in+ x86)+ echo i586-pc-interix${UNAME_RELEASE}+ exit ;;+ authenticamd | genuineintel | EM64T)+ echo x86_64-unknown-interix${UNAME_RELEASE}+ exit ;;+ IA64)+ echo ia64-unknown-interix${UNAME_RELEASE}+ exit ;;+ esac ;;+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)+ echo i${UNAME_MACHINE}-pc-mks+ exit ;;+ 8664:Windows_NT:*)+ echo x86_64-pc-mks+ exit ;;+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)+ # How do we know it's Interix rather than the generic POSIX subsystem?+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we+ # UNAME_MACHINE based on the output of uname instead of i386?+ echo i586-pc-interix+ exit ;;+ i*:UWIN*:*)+ echo ${UNAME_MACHINE}-pc-uwin+ exit ;;+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)+ echo x86_64-unknown-cygwin+ exit ;;+ p*:CYGWIN*:*)+ echo powerpcle-unknown-cygwin+ exit ;;+ prep*:SunOS:5.*:*)+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`+ exit ;;+ *:GNU:*:*)+ # the GNU system+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`+ exit ;;+ *:GNU/*:*:*)+ # other systems with GNU libc and userland+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}+ exit ;;+ i*86:Minix:*:*)+ echo ${UNAME_MACHINE}-pc-minix+ exit ;;+ aarch64:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ aarch64_be:Linux:*:*)+ UNAME_MACHINE=aarch64_be+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ alpha:Linux:*:*)+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in+ EV5) UNAME_MACHINE=alphaev5 ;;+ EV56) UNAME_MACHINE=alphaev56 ;;+ PCA56) UNAME_MACHINE=alphapca56 ;;+ PCA57) UNAME_MACHINE=alphapca56 ;;+ EV6) UNAME_MACHINE=alphaev6 ;;+ EV67) UNAME_MACHINE=alphaev67 ;;+ EV68*) UNAME_MACHINE=alphaev68 ;;+ esac+ objdump --private-headers /bin/sh | grep -q ld.so.1+ if test "$?" = 0 ; then LIBC="gnulibc1" ; fi+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ arc:Linux:*:* | arceb:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ arm*:Linux:*:*)+ eval $set_cc_for_build+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \+ | grep -q __ARM_EABI__+ then+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ else+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \+ | grep -q __ARM_PCS_VFP+ then+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi+ else+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf+ fi+ fi+ exit ;;+ avr32*:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ cris:Linux:*:*)+ echo ${UNAME_MACHINE}-axis-linux-${LIBC}+ exit ;;+ crisv32:Linux:*:*)+ echo ${UNAME_MACHINE}-axis-linux-${LIBC}+ exit ;;+ frv:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ hexagon:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ i*86:Linux:*:*)+ echo ${UNAME_MACHINE}-pc-linux-${LIBC}+ exit ;;+ ia64:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ m32r*:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ m68*:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ mips:Linux:*:* | mips64:Linux:*:*)+ eval $set_cc_for_build+ sed 's/^ //' << EOF >$dummy.c+ #undef CPU+ #undef ${UNAME_MACHINE}+ #undef ${UNAME_MACHINE}el+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)+ CPU=${UNAME_MACHINE}el+ #else+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)+ CPU=${UNAME_MACHINE}+ #else+ CPU=+ #endif+ #endif+EOF+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }+ ;;+ openrisc*:Linux:*:*)+ echo or1k-unknown-linux-${LIBC}+ exit ;;+ or32:Linux:*:* | or1k*:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ padre:Linux:*:*)+ echo sparc-unknown-linux-${LIBC}+ exit ;;+ parisc64:Linux:*:* | hppa64:Linux:*:*)+ echo hppa64-unknown-linux-${LIBC}+ exit ;;+ parisc:Linux:*:* | hppa:Linux:*:*)+ # Look for CPU level+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in+ PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;+ PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;+ *) echo hppa-unknown-linux-${LIBC} ;;+ esac+ exit ;;+ ppc64:Linux:*:*)+ echo powerpc64-unknown-linux-${LIBC}+ exit ;;+ ppc:Linux:*:*)+ echo powerpc-unknown-linux-${LIBC}+ exit ;;+ ppc64le:Linux:*:*)+ echo powerpc64le-unknown-linux-${LIBC}+ exit ;;+ ppcle:Linux:*:*)+ echo powerpcle-unknown-linux-${LIBC}+ exit ;;+ s390:Linux:*:* | s390x:Linux:*:*)+ echo ${UNAME_MACHINE}-ibm-linux-${LIBC}+ exit ;;+ sh64*:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ sh*:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ sparc:Linux:*:* | sparc64:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ tile*:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ vax:Linux:*:*)+ echo ${UNAME_MACHINE}-dec-linux-${LIBC}+ exit ;;+ x86_64:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ xtensa*:Linux:*:*)+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}+ exit ;;+ i*86:DYNIX/ptx:4*:*)+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.+ # earlier versions are messed up and put the nodename in both+ # sysname and nodename.+ echo i386-sequent-sysv4+ exit ;;+ i*86:UNIX_SV:4.2MP:2.*)+ # Unixware is an offshoot of SVR4, but it has its own version+ # number series starting with 2...+ # I am not positive that other SVR4 systems won't match this,+ # I just have to hope. -- rms.+ # Use sysv4.2uw... so that sysv4* matches it.+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}+ exit ;;+ i*86:OS/2:*:*)+ # If we were able to find `uname', then EMX Unix compatibility+ # is probably installed.+ echo ${UNAME_MACHINE}-pc-os2-emx+ exit ;;+ i*86:XTS-300:*:STOP)+ echo ${UNAME_MACHINE}-unknown-stop+ exit ;;+ i*86:atheos:*:*)+ echo ${UNAME_MACHINE}-unknown-atheos+ exit ;;+ i*86:syllable:*:*)+ echo ${UNAME_MACHINE}-pc-syllable+ exit ;;+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)+ echo i386-unknown-lynxos${UNAME_RELEASE}+ exit ;;+ i*86:*DOS:*:*)+ echo ${UNAME_MACHINE}-pc-msdosdjgpp+ exit ;;+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}+ else+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}+ fi+ exit ;;+ i*86:*:5:[678]*)+ # UnixWare 7.x, OpenUNIX and OpenServer 6.+ case `/bin/uname -X | grep "^Machine"` in+ *486*) UNAME_MACHINE=i486 ;;+ *Pentium) UNAME_MACHINE=i586 ;;+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;+ esac+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}+ exit ;;+ i*86:*:3.2:*)+ if test -f /usr/options/cb.name; then+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL+ elif /bin/uname -X 2>/dev/null >/dev/null ; then+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \+ && UNAME_MACHINE=i586+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \+ && UNAME_MACHINE=i686+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \+ && UNAME_MACHINE=i686+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL+ else+ echo ${UNAME_MACHINE}-pc-sysv32+ fi+ exit ;;+ pc:*:*:*)+ # Left here for compatibility:+ # uname -m prints for DJGPP always 'pc', but it prints nothing about+ # the processor, so we play safe by assuming i586.+ # Note: whatever this is, it MUST be the same as what config.sub+ # prints for the "djgpp" host, or else GDB configury will decide that+ # this is a cross-build.+ echo i586-pc-msdosdjgpp+ exit ;;+ Intel:Mach:3*:*)+ echo i386-pc-mach3+ exit ;;+ paragon:*:*:*)+ echo i860-intel-osf1+ exit ;;+ i860:*:4.*:*) # i860-SVR4+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4+ else # Add other i860-SVR4 vendors below as they are discovered.+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4+ fi+ exit ;;+ mini*:CTIX:SYS*5:*)+ # "miniframe"+ echo m68010-convergent-sysv+ exit ;;+ mc68k:UNIX:SYSTEM5:3.51m)+ echo m68k-convergent-sysv+ exit ;;+ M680?0:D-NIX:5.3:*)+ echo m68k-diab-dnix+ exit ;;+ M68*:*:R3V[5678]*:*)+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)+ OS_REL=''+ test -r /etc/.relid \+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \+ && { echo i486-ncr-sysv4; exit; } ;;+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)+ OS_REL='.3'+ test -r /etc/.relid \+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; }+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)+ echo m68k-unknown-lynxos${UNAME_RELEASE}+ exit ;;+ mc68030:UNIX_System_V:4.*:*)+ echo m68k-atari-sysv4+ exit ;;+ TSUNAMI:LynxOS:2.*:*)+ echo sparc-unknown-lynxos${UNAME_RELEASE}+ exit ;;+ rs6000:LynxOS:2.*:*)+ echo rs6000-unknown-lynxos${UNAME_RELEASE}+ exit ;;+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)+ echo powerpc-unknown-lynxos${UNAME_RELEASE}+ exit ;;+ SM[BE]S:UNIX_SV:*:*)+ echo mips-dde-sysv${UNAME_RELEASE}+ exit ;;+ RM*:ReliantUNIX-*:*:*)+ echo mips-sni-sysv4+ exit ;;+ RM*:SINIX-*:*:*)+ echo mips-sni-sysv4+ exit ;;+ *:SINIX-*:*:*)+ if uname -p 2>/dev/null >/dev/null ; then+ UNAME_MACHINE=`(uname -p) 2>/dev/null`+ echo ${UNAME_MACHINE}-sni-sysv4+ else+ echo ns32k-sni-sysv+ fi+ exit ;;+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort+ # says <Richard.M.Bartel@ccMail.Census.GOV>+ echo i586-unisys-sysv4+ exit ;;+ *:UNIX_System_V:4*:FTX*)+ # From Gerald Hewes <hewes@openmarket.com>.+ # How about differentiating between stratus architectures? -djm+ echo hppa1.1-stratus-sysv4+ exit ;;+ *:*:*:FTX*)+ # From seanf@swdc.stratus.com.+ echo i860-stratus-sysv4+ exit ;;+ i*86:VOS:*:*)+ # From Paul.Green@stratus.com.+ echo ${UNAME_MACHINE}-stratus-vos+ exit ;;+ *:VOS:*:*)+ # From Paul.Green@stratus.com.+ echo hppa1.1-stratus-vos+ exit ;;+ mc68*:A/UX:*:*)+ echo m68k-apple-aux${UNAME_RELEASE}+ exit ;;+ news*:NEWS-OS:6*:*)+ echo mips-sony-newsos6+ exit ;;+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)+ if [ -d /usr/nec ]; then+ echo mips-nec-sysv${UNAME_RELEASE}+ else+ echo mips-unknown-sysv${UNAME_RELEASE}+ fi+ exit ;;+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.+ echo powerpc-be-beos+ exit ;;+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.+ echo powerpc-apple-beos+ exit ;;+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.+ echo i586-pc-beos+ exit ;;+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.+ echo i586-pc-haiku+ exit ;;+ x86_64:Haiku:*:*)+ echo x86_64-unknown-haiku+ exit ;;+ SX-4:SUPER-UX:*:*)+ echo sx4-nec-superux${UNAME_RELEASE}+ exit ;;+ SX-5:SUPER-UX:*:*)+ echo sx5-nec-superux${UNAME_RELEASE}+ exit ;;+ SX-6:SUPER-UX:*:*)+ echo sx6-nec-superux${UNAME_RELEASE}+ exit ;;+ SX-7:SUPER-UX:*:*)+ echo sx7-nec-superux${UNAME_RELEASE}+ exit ;;+ SX-8:SUPER-UX:*:*)+ echo sx8-nec-superux${UNAME_RELEASE}+ exit ;;+ SX-8R:SUPER-UX:*:*)+ echo sx8r-nec-superux${UNAME_RELEASE}+ exit ;;+ Power*:Rhapsody:*:*)+ echo powerpc-apple-rhapsody${UNAME_RELEASE}+ exit ;;+ *:Rhapsody:*:*)+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}+ exit ;;+ *:Darwin:*:*)+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown+ eval $set_cc_for_build+ if test "$UNAME_PROCESSOR" = unknown ; then+ UNAME_PROCESSOR=powerpc+ fi+ if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \+ grep IS_64BIT_ARCH >/dev/null+ then+ case $UNAME_PROCESSOR in+ i386) UNAME_PROCESSOR=x86_64 ;;+ powerpc) UNAME_PROCESSOR=powerpc64 ;;+ esac+ fi+ fi+ elif test "$UNAME_PROCESSOR" = i386 ; then+ # Avoid executing cc on OS X 10.9, as it ships with a stub+ # that puts up a graphical alert prompting to install+ # developer tools. Any system running Mac OS X 10.7 or+ # later (Darwin 11 and later) is required to have a 64-bit+ # processor. This is not true of the ARM version of Darwin+ # that Apple uses in portable devices.+ UNAME_PROCESSOR=x86_64+ fi+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}+ exit ;;+ *:procnto*:*:* | *:QNX:[0123456789]*:*)+ UNAME_PROCESSOR=`uname -p`+ if test "$UNAME_PROCESSOR" = "x86"; then+ UNAME_PROCESSOR=i386+ UNAME_MACHINE=pc+ fi+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}+ exit ;;+ *:QNX:*:4*)+ echo i386-pc-qnx+ exit ;;+ NEO-?:NONSTOP_KERNEL:*:*)+ echo neo-tandem-nsk${UNAME_RELEASE}+ exit ;;+ NSE-*:NONSTOP_KERNEL:*:*)+ echo nse-tandem-nsk${UNAME_RELEASE}+ exit ;;+ NSR-?:NONSTOP_KERNEL:*:*)+ echo nsr-tandem-nsk${UNAME_RELEASE}+ exit ;;+ *:NonStop-UX:*:*)+ echo mips-compaq-nonstopux+ exit ;;+ BS2000:POSIX*:*:*)+ echo bs2000-siemens-sysv+ exit ;;+ DS/*:UNIX_System_V:*:*)+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}+ exit ;;+ *:Plan9:*:*)+ # "uname -m" is not consistent, so use $cputype instead. 386+ # is converted to i386 for consistency with other x86+ # operating systems.+ if test "$cputype" = "386"; then+ UNAME_MACHINE=i386+ else+ UNAME_MACHINE="$cputype"+ fi+ echo ${UNAME_MACHINE}-unknown-plan9+ exit ;;+ *:TOPS-10:*:*)+ echo pdp10-unknown-tops10+ exit ;;+ *:TENEX:*:*)+ echo pdp10-unknown-tenex+ exit ;;+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)+ echo pdp10-dec-tops20+ exit ;;+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)+ echo pdp10-xkl-tops20+ exit ;;+ *:TOPS-20:*:*)+ echo pdp10-unknown-tops20+ exit ;;+ *:ITS:*:*)+ echo pdp10-unknown-its+ exit ;;+ SEI:*:*:SEIUX)+ echo mips-sei-seiux${UNAME_RELEASE}+ exit ;;+ *:DragonFly:*:*)+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`+ exit ;;+ *:*VMS:*:*)+ UNAME_MACHINE=`(uname -p) 2>/dev/null`+ case "${UNAME_MACHINE}" in+ A*) echo alpha-dec-vms ; exit ;;+ I*) echo ia64-dec-vms ; exit ;;+ V*) echo vax-dec-vms ; exit ;;+ esac ;;+ *:XENIX:*:SysV)+ echo i386-pc-xenix+ exit ;;+ i*86:skyos:*:*)+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'+ exit ;;+ i*86:rdos:*:*)+ echo ${UNAME_MACHINE}-pc-rdos+ exit ;;+ i*86:AROS:*:*)+ echo ${UNAME_MACHINE}-pc-aros+ exit ;;+ x86_64:VMkernel:*:*)+ echo ${UNAME_MACHINE}-unknown-esx+ exit ;;+esac++cat >&2 <<EOF+$0: unable to guess system type++This script, last modified $timestamp, has failed to recognize+the operating system you are using. It is advised that you+download the most up to date version of the config scripts from++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD+and+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD++If the version you run ($0) is already up to date, please+send the following data and any information you think might be+pertinent to <config-patches@gnu.org> in order to provide the needed+information to handle your system.++config.guess timestamp = $timestamp++uname -m = `(uname -m) 2>/dev/null || echo unknown`+uname -r = `(uname -r) 2>/dev/null || echo unknown`+uname -s = `(uname -s) 2>/dev/null || echo unknown`+uname -v = `(uname -v) 2>/dev/null || echo unknown`++/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`++hostinfo = `(hostinfo) 2>/dev/null`+/bin/universe = `(/bin/universe) 2>/dev/null`+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`+/bin/arch = `(/bin/arch) 2>/dev/null`+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`++UNAME_MACHINE = ${UNAME_MACHINE}+UNAME_RELEASE = ${UNAME_RELEASE}+UNAME_SYSTEM = ${UNAME_SYSTEM}+UNAME_VERSION = ${UNAME_VERSION}+EOF++exit 1++# Local variables:+# eval: (add-hook 'write-file-hooks 'time-stamp)+# time-stamp-start: "timestamp='"+# time-stamp-format: "%:y-%02m-%02d"+# time-stamp-end: "'"+# End:
+ standalone/android/tmp/network-2.4.1.2/config.sub view
@@ -0,0 +1,1799 @@+#! /bin/sh+# Configuration validation subroutine script.+# Copyright 1992-2014 Free Software Foundation, Inc.++timestamp='2014-09-11'++# This file is free software; you can redistribute it and/or modify it+# under the terms of the GNU General Public License as published by+# the Free Software Foundation; either version 3 of the License, or+# (at your option) any later version.+#+# This program is distributed in the hope that it will be useful, but+# WITHOUT ANY WARRANTY; without even the implied warranty of+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU+# General Public License for more details.+#+# You should have received a copy of the GNU General Public License+# along with this program; if not, see <http://www.gnu.org/licenses/>.+#+# As a special exception to the GNU General Public License, if you+# distribute this file as part of a program that contains a+# configuration script generated by Autoconf, you may include it under+# the same distribution terms that you use for the rest of that+# program. This Exception is an additional permission under section 7+# of the GNU General Public License, version 3 ("GPLv3").+++# Please send patches with a ChangeLog entry to config-patches@gnu.org.+#+# Configuration subroutine to validate and canonicalize a configuration type.+# Supply the specified configuration type as an argument.+# If it is invalid, we print an error message on stderr and exit with code 1.+# Otherwise, we print the canonical config type on stdout and succeed.++# You can get the latest version of this script from:+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD++# This file is supposed to be the same for all GNU packages+# and recognize all the CPU types, system types and aliases+# that are meaningful with *any* GNU software.+# Each package is responsible for reporting which valid configurations+# it does not support. The user should be able to distinguish+# a failure to support a valid configuration from a meaningless+# configuration.++# The goal of this file is to map all the various variations of a given+# machine specification into a single specification in the form:+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM+# or in some cases, the newer four-part form:+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM+# It is wrong to echo any other type of specification.++me=`echo "$0" | sed -e 's,.*/,,'`++usage="\+Usage: $0 [OPTION] CPU-MFR-OPSYS+ $0 [OPTION] ALIAS++Canonicalize a configuration name.++Operation modes:+ -h, --help print this help, then exit+ -t, --time-stamp print date of last modification, then exit+ -v, --version print version number, then exit++Report bugs and patches to <config-patches@gnu.org>."++version="\+GNU config.sub ($timestamp)++Copyright 1992-2014 Free Software Foundation, Inc.++This is free software; see the source for copying conditions. There is NO+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."++help="+Try \`$me --help' for more information."++# Parse command line+while test $# -gt 0 ; do+ case $1 in+ --time-stamp | --time* | -t )+ echo "$timestamp" ; exit ;;+ --version | -v )+ echo "$version" ; exit ;;+ --help | --h* | -h )+ echo "$usage"; exit ;;+ -- ) # Stop option processing+ shift; break ;;+ - ) # Use stdin as input.+ break ;;+ -* )+ echo "$me: invalid option $1$help"+ exit 1 ;;++ *local*)+ # First pass through any local machine types.+ echo $1+ exit ;;++ * )+ break ;;+ esac+done++case $# in+ 0) echo "$me: missing argument$help" >&2+ exit 1;;+ 1) ;;+ *) echo "$me: too many arguments$help" >&2+ exit 1;;+esac++# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).+# Here we must recognize all the valid KERNEL-OS combinations.+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`+case $maybe_os in+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \+ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \+ knetbsd*-gnu* | netbsd*-gnu* | \+ kopensolaris*-gnu* | \+ storm-chaos* | os2-emx* | rtmk-nova*)+ os=-$maybe_os+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`+ ;;+ android-linux)+ os=-linux-android+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown+ ;;+ *)+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`+ if [ $basic_machine != $1 ]+ then os=`echo $1 | sed 's/.*-/-/'`+ else os=; fi+ ;;+esac++### Let's recognize common machines as not being operating systems so+### that things like config.sub decstation-3100 work. We also+### recognize some manufacturers as not being operating systems, so we+### can provide default operating systems below.+case $os in+ -sun*os*)+ # Prevent following clause from handling this invalid input.+ ;;+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \+ -apple | -axis | -knuth | -cray | -microblaze*)+ os=+ basic_machine=$1+ ;;+ -bluegene*)+ os=-cnk+ ;;+ -sim | -cisco | -oki | -wec | -winbond)+ os=+ basic_machine=$1+ ;;+ -scout)+ ;;+ -wrs)+ os=-vxworks+ basic_machine=$1+ ;;+ -chorusos*)+ os=-chorusos+ basic_machine=$1+ ;;+ -chorusrdb)+ os=-chorusrdb+ basic_machine=$1+ ;;+ -hiux*)+ os=-hiuxwe2+ ;;+ -sco6)+ os=-sco5v6+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`+ ;;+ -sco5)+ os=-sco3.2v5+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`+ ;;+ -sco4)+ os=-sco3.2v4+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`+ ;;+ -sco3.2.[4-9]*)+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`+ ;;+ -sco3.2v[4-9]*)+ # Don't forget version if it is 3.2v4 or newer.+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`+ ;;+ -sco5v6*)+ # Don't forget version if it is 3.2v4 or newer.+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`+ ;;+ -sco*)+ os=-sco3.2v2+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`+ ;;+ -udk*)+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`+ ;;+ -isc)+ os=-isc2.2+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`+ ;;+ -clix*)+ basic_machine=clipper-intergraph+ ;;+ -isc*)+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`+ ;;+ -lynx*178)+ os=-lynxos178+ ;;+ -lynx*5)+ os=-lynxos5+ ;;+ -lynx*)+ os=-lynxos+ ;;+ -ptx*)+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`+ ;;+ -windowsnt*)+ os=`echo $os | sed -e 's/windowsnt/winnt/'`+ ;;+ -psos*)+ os=-psos+ ;;+ -mint | -mint[0-9]*)+ basic_machine=m68k-atari+ os=-mint+ ;;+esac++# Decode aliases for certain CPU-COMPANY combinations.+case $basic_machine in+ # Recognize the basic CPU types without company name.+ # Some are omitted here because they have special meanings below.+ 1750a | 580 \+ | a29k \+ | aarch64 | aarch64_be \+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \+ | am33_2.0 \+ | arc | arceb \+ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \+ | avr | avr32 \+ | be32 | be64 \+ | bfin \+ | c4x | c8051 | clipper \+ | d10v | d30v | dlx | dsp16xx \+ | epiphany \+ | fido | fr30 | frv \+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \+ | hexagon \+ | i370 | i860 | i960 | ia64 \+ | ip2k | iq2000 \+ | k1om \+ | le32 | le64 \+ | lm32 \+ | m32c | m32r | m32rle | m68000 | m68k | m88k \+ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \+ | mips | mipsbe | mipseb | mipsel | mipsle \+ | mips16 \+ | mips64 | mips64el \+ | mips64octeon | mips64octeonel \+ | mips64orion | mips64orionel \+ | mips64r5900 | mips64r5900el \+ | mips64vr | mips64vrel \+ | mips64vr4100 | mips64vr4100el \+ | mips64vr4300 | mips64vr4300el \+ | mips64vr5000 | mips64vr5000el \+ | mips64vr5900 | mips64vr5900el \+ | mipsisa32 | mipsisa32el \+ | mipsisa32r2 | mipsisa32r2el \+ | mipsisa32r6 | mipsisa32r6el \+ | mipsisa64 | mipsisa64el \+ | mipsisa64r2 | mipsisa64r2el \+ | mipsisa64r6 | mipsisa64r6el \+ | mipsisa64sb1 | mipsisa64sb1el \+ | mipsisa64sr71k | mipsisa64sr71kel \+ | mipsr5900 | mipsr5900el \+ | mipstx39 | mipstx39el \+ | mn10200 | mn10300 \+ | moxie \+ | mt \+ | msp430 \+ | nds32 | nds32le | nds32be \+ | nios | nios2 | nios2eb | nios2el \+ | ns16k | ns32k \+ | open8 | or1k | or1knd | or32 \+ | pdp10 | pdp11 | pj | pjl \+ | powerpc | powerpc64 | powerpc64le | powerpcle \+ | pyramid \+ | riscv32 | riscv64 \+ | rl78 | rx \+ | score \+ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \+ | sh64 | sh64le \+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \+ | spu \+ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \+ | ubicom32 \+ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \+ | we32k \+ | x86 | xc16x | xstormy16 | xtensa \+ | z8k | z80)+ basic_machine=$basic_machine-unknown+ ;;+ c54x)+ basic_machine=tic54x-unknown+ ;;+ c55x)+ basic_machine=tic55x-unknown+ ;;+ c6x)+ basic_machine=tic6x-unknown+ ;;+ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)+ basic_machine=$basic_machine-unknown+ os=-none+ ;;+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)+ ;;+ ms1)+ basic_machine=mt-unknown+ ;;++ strongarm | thumb | xscale)+ basic_machine=arm-unknown+ ;;+ xgate)+ basic_machine=$basic_machine-unknown+ os=-none+ ;;+ xscaleeb)+ basic_machine=armeb-unknown+ ;;++ xscaleel)+ basic_machine=armel-unknown+ ;;++ # We use `pc' rather than `unknown'+ # because (1) that's what they normally are, and+ # (2) the word "unknown" tends to confuse beginning users.+ i*86 | x86_64)+ basic_machine=$basic_machine-pc+ ;;+ # Object if more than one company name word.+ *-*-*)+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2+ exit 1+ ;;+ # Recognize the basic CPU types with company name.+ 580-* \+ | a29k-* \+ | aarch64-* | aarch64_be-* \+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \+ | avr-* | avr32-* \+ | be32-* | be64-* \+ | bfin-* | bs2000-* \+ | c[123]* | c30-* | [cjt]90-* | c4x-* \+ | c8051-* | clipper-* | craynv-* | cydra-* \+ | d10v-* | d30v-* | dlx-* \+ | elxsi-* \+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \+ | h8300-* | h8500-* \+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \+ | hexagon-* \+ | i*86-* | i860-* | i960-* | ia64-* \+ | ip2k-* | iq2000-* \+ | k1om-* \+ | le32-* | le64-* \+ | lm32-* \+ | m32c-* | m32r-* | m32rle-* \+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \+ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \+ | microblaze-* | microblazeel-* \+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \+ | mips16-* \+ | mips64-* | mips64el-* \+ | mips64octeon-* | mips64octeonel-* \+ | mips64orion-* | mips64orionel-* \+ | mips64r5900-* | mips64r5900el-* \+ | mips64vr-* | mips64vrel-* \+ | mips64vr4100-* | mips64vr4100el-* \+ | mips64vr4300-* | mips64vr4300el-* \+ | mips64vr5000-* | mips64vr5000el-* \+ | mips64vr5900-* | mips64vr5900el-* \+ | mipsisa32-* | mipsisa32el-* \+ | mipsisa32r2-* | mipsisa32r2el-* \+ | mipsisa32r6-* | mipsisa32r6el-* \+ | mipsisa64-* | mipsisa64el-* \+ | mipsisa64r2-* | mipsisa64r2el-* \+ | mipsisa64r6-* | mipsisa64r6el-* \+ | mipsisa64sb1-* | mipsisa64sb1el-* \+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \+ | mipsr5900-* | mipsr5900el-* \+ | mipstx39-* | mipstx39el-* \+ | mmix-* \+ | mt-* \+ | msp430-* \+ | nds32-* | nds32le-* | nds32be-* \+ | nios-* | nios2-* | nios2eb-* | nios2el-* \+ | none-* | np1-* | ns16k-* | ns32k-* \+ | open8-* \+ | or1k*-* \+ | orion-* \+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \+ | pyramid-* \+ | rl78-* | romp-* | rs6000-* | rx-* \+ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \+ | sparclite-* \+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \+ | tahoe-* \+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \+ | tile*-* \+ | tron-* \+ | ubicom32-* \+ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \+ | vax-* \+ | we32k-* \+ | x86-* | x86_64-* | xc16x-* | xps100-* \+ | xstormy16-* | xtensa*-* \+ | ymp-* \+ | z8k-* | z80-*)+ ;;+ # Recognize the basic CPU types without company name, with glob match.+ xtensa*)+ basic_machine=$basic_machine-unknown+ ;;+ # Recognize the various machine names and aliases which stand+ # for a CPU type and a company and sometimes even an OS.+ 386bsd)+ basic_machine=i386-unknown+ os=-bsd+ ;;+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)+ basic_machine=m68000-att+ ;;+ 3b*)+ basic_machine=we32k-att+ ;;+ a29khif)+ basic_machine=a29k-amd+ os=-udi+ ;;+ abacus)+ basic_machine=abacus-unknown+ ;;+ adobe68k)+ basic_machine=m68010-adobe+ os=-scout+ ;;+ alliant | fx80)+ basic_machine=fx80-alliant+ ;;+ altos | altos3068)+ basic_machine=m68k-altos+ ;;+ am29k)+ basic_machine=a29k-none+ os=-bsd+ ;;+ amd64)+ basic_machine=x86_64-pc+ ;;+ amd64-*)+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ amdahl)+ basic_machine=580-amdahl+ os=-sysv+ ;;+ amiga | amiga-*)+ basic_machine=m68k-unknown+ ;;+ amigaos | amigados)+ basic_machine=m68k-unknown+ os=-amigaos+ ;;+ amigaunix | amix)+ basic_machine=m68k-unknown+ os=-sysv4+ ;;+ apollo68)+ basic_machine=m68k-apollo+ os=-sysv+ ;;+ apollo68bsd)+ basic_machine=m68k-apollo+ os=-bsd+ ;;+ aros)+ basic_machine=i386-pc+ os=-aros+ ;;+ aux)+ basic_machine=m68k-apple+ os=-aux+ ;;+ balance)+ basic_machine=ns32k-sequent+ os=-dynix+ ;;+ blackfin)+ basic_machine=bfin-unknown+ os=-linux+ ;;+ blackfin-*)+ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`+ os=-linux+ ;;+ bluegene*)+ basic_machine=powerpc-ibm+ os=-cnk+ ;;+ c54x-*)+ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ c55x-*)+ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ c6x-*)+ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ c90)+ basic_machine=c90-cray+ os=-unicos+ ;;+ cegcc)+ basic_machine=arm-unknown+ os=-cegcc+ ;;+ convex-c1)+ basic_machine=c1-convex+ os=-bsd+ ;;+ convex-c2)+ basic_machine=c2-convex+ os=-bsd+ ;;+ convex-c32)+ basic_machine=c32-convex+ os=-bsd+ ;;+ convex-c34)+ basic_machine=c34-convex+ os=-bsd+ ;;+ convex-c38)+ basic_machine=c38-convex+ os=-bsd+ ;;+ cray | j90)+ basic_machine=j90-cray+ os=-unicos+ ;;+ craynv)+ basic_machine=craynv-cray+ os=-unicosmp+ ;;+ cr16 | cr16-*)+ basic_machine=cr16-unknown+ os=-elf+ ;;+ crds | unos)+ basic_machine=m68k-crds+ ;;+ crisv32 | crisv32-* | etraxfs*)+ basic_machine=crisv32-axis+ ;;+ cris | cris-* | etrax*)+ basic_machine=cris-axis+ ;;+ crx)+ basic_machine=crx-unknown+ os=-elf+ ;;+ da30 | da30-*)+ basic_machine=m68k-da30+ ;;+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)+ basic_machine=mips-dec+ ;;+ decsystem10* | dec10*)+ basic_machine=pdp10-dec+ os=-tops10+ ;;+ decsystem20* | dec20*)+ basic_machine=pdp10-dec+ os=-tops20+ ;;+ delta | 3300 | motorola-3300 | motorola-delta \+ | 3300-motorola | delta-motorola)+ basic_machine=m68k-motorola+ ;;+ delta88)+ basic_machine=m88k-motorola+ os=-sysv3+ ;;+ dicos)+ basic_machine=i686-pc+ os=-dicos+ ;;+ djgpp)+ basic_machine=i586-pc+ os=-msdosdjgpp+ ;;+ dpx20 | dpx20-*)+ basic_machine=rs6000-bull+ os=-bosx+ ;;+ dpx2* | dpx2*-bull)+ basic_machine=m68k-bull+ os=-sysv3+ ;;+ ebmon29k)+ basic_machine=a29k-amd+ os=-ebmon+ ;;+ elxsi)+ basic_machine=elxsi-elxsi+ os=-bsd+ ;;+ encore | umax | mmax)+ basic_machine=ns32k-encore+ ;;+ es1800 | OSE68k | ose68k | ose | OSE)+ basic_machine=m68k-ericsson+ os=-ose+ ;;+ fx2800)+ basic_machine=i860-alliant+ ;;+ genix)+ basic_machine=ns32k-ns+ ;;+ gmicro)+ basic_machine=tron-gmicro+ os=-sysv+ ;;+ go32)+ basic_machine=i386-pc+ os=-go32+ ;;+ h3050r* | hiux*)+ basic_machine=hppa1.1-hitachi+ os=-hiuxwe2+ ;;+ h8300hms)+ basic_machine=h8300-hitachi+ os=-hms+ ;;+ h8300xray)+ basic_machine=h8300-hitachi+ os=-xray+ ;;+ h8500hms)+ basic_machine=h8500-hitachi+ os=-hms+ ;;+ harris)+ basic_machine=m88k-harris+ os=-sysv3+ ;;+ hp300-*)+ basic_machine=m68k-hp+ ;;+ hp300bsd)+ basic_machine=m68k-hp+ os=-bsd+ ;;+ hp300hpux)+ basic_machine=m68k-hp+ os=-hpux+ ;;+ hp3k9[0-9][0-9] | hp9[0-9][0-9])+ basic_machine=hppa1.0-hp+ ;;+ hp9k2[0-9][0-9] | hp9k31[0-9])+ basic_machine=m68000-hp+ ;;+ hp9k3[2-9][0-9])+ basic_machine=m68k-hp+ ;;+ hp9k6[0-9][0-9] | hp6[0-9][0-9])+ basic_machine=hppa1.0-hp+ ;;+ hp9k7[0-79][0-9] | hp7[0-79][0-9])+ basic_machine=hppa1.1-hp+ ;;+ hp9k78[0-9] | hp78[0-9])+ # FIXME: really hppa2.0-hp+ basic_machine=hppa1.1-hp+ ;;+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)+ # FIXME: really hppa2.0-hp+ basic_machine=hppa1.1-hp+ ;;+ hp9k8[0-9][13679] | hp8[0-9][13679])+ basic_machine=hppa1.1-hp+ ;;+ hp9k8[0-9][0-9] | hp8[0-9][0-9])+ basic_machine=hppa1.0-hp+ ;;+ hppa-next)+ os=-nextstep3+ ;;+ hppaosf)+ basic_machine=hppa1.1-hp+ os=-osf+ ;;+ hppro)+ basic_machine=hppa1.1-hp+ os=-proelf+ ;;+ i370-ibm* | ibm*)+ basic_machine=i370-ibm+ ;;+ i*86v32)+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`+ os=-sysv32+ ;;+ i*86v4*)+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`+ os=-sysv4+ ;;+ i*86v)+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`+ os=-sysv+ ;;+ i*86sol2)+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`+ os=-solaris2+ ;;+ i386mach)+ basic_machine=i386-mach+ os=-mach+ ;;+ i386-vsta | vsta)+ basic_machine=i386-unknown+ os=-vsta+ ;;+ iris | iris4d)+ basic_machine=mips-sgi+ case $os in+ -irix*)+ ;;+ *)+ os=-irix4+ ;;+ esac+ ;;+ isi68 | isi)+ basic_machine=m68k-isi+ os=-sysv+ ;;+ m68knommu)+ basic_machine=m68k-unknown+ os=-linux+ ;;+ m68knommu-*)+ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`+ os=-linux+ ;;+ m88k-omron*)+ basic_machine=m88k-omron+ ;;+ magnum | m3230)+ basic_machine=mips-mips+ os=-sysv+ ;;+ merlin)+ basic_machine=ns32k-utek+ os=-sysv+ ;;+ microblaze*)+ basic_machine=microblaze-xilinx+ ;;+ mingw64)+ basic_machine=x86_64-pc+ os=-mingw64+ ;;+ mingw32)+ basic_machine=i686-pc+ os=-mingw32+ ;;+ mingw32ce)+ basic_machine=arm-unknown+ os=-mingw32ce+ ;;+ miniframe)+ basic_machine=m68000-convergent+ ;;+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)+ basic_machine=m68k-atari+ os=-mint+ ;;+ mips3*-*)+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`+ ;;+ mips3*)+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown+ ;;+ monitor)+ basic_machine=m68k-rom68k+ os=-coff+ ;;+ morphos)+ basic_machine=powerpc-unknown+ os=-morphos+ ;;+ moxiebox)+ basic_machine=moxie-unknown+ os=-moxiebox+ ;;+ msdos)+ basic_machine=i386-pc+ os=-msdos+ ;;+ ms1-*)+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`+ ;;+ msys)+ basic_machine=i686-pc+ os=-msys+ ;;+ mvs)+ basic_machine=i370-ibm+ os=-mvs+ ;;+ nacl)+ basic_machine=le32-unknown+ os=-nacl+ ;;+ ncr3000)+ basic_machine=i486-ncr+ os=-sysv4+ ;;+ netbsd386)+ basic_machine=i386-unknown+ os=-netbsd+ ;;+ netwinder)+ basic_machine=armv4l-rebel+ os=-linux+ ;;+ news | news700 | news800 | news900)+ basic_machine=m68k-sony+ os=-newsos+ ;;+ news1000)+ basic_machine=m68030-sony+ os=-newsos+ ;;+ news-3600 | risc-news)+ basic_machine=mips-sony+ os=-newsos+ ;;+ necv70)+ basic_machine=v70-nec+ os=-sysv+ ;;+ next | m*-next )+ basic_machine=m68k-next+ case $os in+ -nextstep* )+ ;;+ -ns2*)+ os=-nextstep2+ ;;+ *)+ os=-nextstep3+ ;;+ esac+ ;;+ nh3000)+ basic_machine=m68k-harris+ os=-cxux+ ;;+ nh[45]000)+ basic_machine=m88k-harris+ os=-cxux+ ;;+ nindy960)+ basic_machine=i960-intel+ os=-nindy+ ;;+ mon960)+ basic_machine=i960-intel+ os=-mon960+ ;;+ nonstopux)+ basic_machine=mips-compaq+ os=-nonstopux+ ;;+ np1)+ basic_machine=np1-gould+ ;;+ neo-tandem)+ basic_machine=neo-tandem+ ;;+ nse-tandem)+ basic_machine=nse-tandem+ ;;+ nsr-tandem)+ basic_machine=nsr-tandem+ ;;+ op50n-* | op60c-*)+ basic_machine=hppa1.1-oki+ os=-proelf+ ;;+ openrisc | openrisc-*)+ basic_machine=or32-unknown+ ;;+ os400)+ basic_machine=powerpc-ibm+ os=-os400+ ;;+ OSE68000 | ose68000)+ basic_machine=m68000-ericsson+ os=-ose+ ;;+ os68k)+ basic_machine=m68k-none+ os=-os68k+ ;;+ pa-hitachi)+ basic_machine=hppa1.1-hitachi+ os=-hiuxwe2+ ;;+ paragon)+ basic_machine=i860-intel+ os=-osf+ ;;+ parisc)+ basic_machine=hppa-unknown+ os=-linux+ ;;+ parisc-*)+ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`+ os=-linux+ ;;+ pbd)+ basic_machine=sparc-tti+ ;;+ pbb)+ basic_machine=m68k-tti+ ;;+ pc532 | pc532-*)+ basic_machine=ns32k-pc532+ ;;+ pc98)+ basic_machine=i386-pc+ ;;+ pc98-*)+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ pentium | p5 | k5 | k6 | nexgen | viac3)+ basic_machine=i586-pc+ ;;+ pentiumpro | p6 | 6x86 | athlon | athlon_*)+ basic_machine=i686-pc+ ;;+ pentiumii | pentium2 | pentiumiii | pentium3)+ basic_machine=i686-pc+ ;;+ pentium4)+ basic_machine=i786-pc+ ;;+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ pentiumpro-* | p6-* | 6x86-* | athlon-*)+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ pentium4-*)+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ pn)+ basic_machine=pn-gould+ ;;+ power) basic_machine=power-ibm+ ;;+ ppc | ppcbe) basic_machine=powerpc-unknown+ ;;+ ppc-* | ppcbe-*)+ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ ppcle | powerpclittle | ppc-le | powerpc-little)+ basic_machine=powerpcle-unknown+ ;;+ ppcle-* | powerpclittle-*)+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ ppc64) basic_machine=powerpc64-unknown+ ;;+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)+ basic_machine=powerpc64le-unknown+ ;;+ ppc64le-* | powerpc64little-*)+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ ps2)+ basic_machine=i386-ibm+ ;;+ pw32)+ basic_machine=i586-unknown+ os=-pw32+ ;;+ rdos | rdos64)+ basic_machine=x86_64-pc+ os=-rdos+ ;;+ rdos32)+ basic_machine=i386-pc+ os=-rdos+ ;;+ rom68k)+ basic_machine=m68k-rom68k+ os=-coff+ ;;+ rm[46]00)+ basic_machine=mips-siemens+ ;;+ rtpc | rtpc-*)+ basic_machine=romp-ibm+ ;;+ s390 | s390-*)+ basic_machine=s390-ibm+ ;;+ s390x | s390x-*)+ basic_machine=s390x-ibm+ ;;+ sa29200)+ basic_machine=a29k-amd+ os=-udi+ ;;+ sb1)+ basic_machine=mipsisa64sb1-unknown+ ;;+ sb1el)+ basic_machine=mipsisa64sb1el-unknown+ ;;+ sde)+ basic_machine=mipsisa32-sde+ os=-elf+ ;;+ sei)+ basic_machine=mips-sei+ os=-seiux+ ;;+ sequent)+ basic_machine=i386-sequent+ ;;+ sh)+ basic_machine=sh-hitachi+ os=-hms+ ;;+ sh5el)+ basic_machine=sh5le-unknown+ ;;+ sh64)+ basic_machine=sh64-unknown+ ;;+ sparclite-wrs | simso-wrs)+ basic_machine=sparclite-wrs+ os=-vxworks+ ;;+ sps7)+ basic_machine=m68k-bull+ os=-sysv2+ ;;+ spur)+ basic_machine=spur-unknown+ ;;+ st2000)+ basic_machine=m68k-tandem+ ;;+ stratus)+ basic_machine=i860-stratus+ os=-sysv4+ ;;+ strongarm-* | thumb-*)+ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`+ ;;+ sun2)+ basic_machine=m68000-sun+ ;;+ sun2os3)+ basic_machine=m68000-sun+ os=-sunos3+ ;;+ sun2os4)+ basic_machine=m68000-sun+ os=-sunos4+ ;;+ sun3os3)+ basic_machine=m68k-sun+ os=-sunos3+ ;;+ sun3os4)+ basic_machine=m68k-sun+ os=-sunos4+ ;;+ sun4os3)+ basic_machine=sparc-sun+ os=-sunos3+ ;;+ sun4os4)+ basic_machine=sparc-sun+ os=-sunos4+ ;;+ sun4sol2)+ basic_machine=sparc-sun+ os=-solaris2+ ;;+ sun3 | sun3-*)+ basic_machine=m68k-sun+ ;;+ sun4)+ basic_machine=sparc-sun+ ;;+ sun386 | sun386i | roadrunner)+ basic_machine=i386-sun+ ;;+ sv1)+ basic_machine=sv1-cray+ os=-unicos+ ;;+ symmetry)+ basic_machine=i386-sequent+ os=-dynix+ ;;+ t3e)+ basic_machine=alphaev5-cray+ os=-unicos+ ;;+ t90)+ basic_machine=t90-cray+ os=-unicos+ ;;+ tile*)+ basic_machine=$basic_machine-unknown+ os=-linux-gnu+ ;;+ tx39)+ basic_machine=mipstx39-unknown+ ;;+ tx39el)+ basic_machine=mipstx39el-unknown+ ;;+ toad1)+ basic_machine=pdp10-xkl+ os=-tops20+ ;;+ tower | tower-32)+ basic_machine=m68k-ncr+ ;;+ tpf)+ basic_machine=s390x-ibm+ os=-tpf+ ;;+ udi29k)+ basic_machine=a29k-amd+ os=-udi+ ;;+ ultra3)+ basic_machine=a29k-nyu+ os=-sym1+ ;;+ v810 | necv810)+ basic_machine=v810-nec+ os=-none+ ;;+ vaxv)+ basic_machine=vax-dec+ os=-sysv+ ;;+ vms)+ basic_machine=vax-dec+ os=-vms+ ;;+ vpp*|vx|vx-*)+ basic_machine=f301-fujitsu+ ;;+ vxworks960)+ basic_machine=i960-wrs+ os=-vxworks+ ;;+ vxworks68)+ basic_machine=m68k-wrs+ os=-vxworks+ ;;+ vxworks29k)+ basic_machine=a29k-wrs+ os=-vxworks+ ;;+ w65*)+ basic_machine=w65-wdc+ os=-none+ ;;+ w89k-*)+ basic_machine=hppa1.1-winbond+ os=-proelf+ ;;+ xbox)+ basic_machine=i686-pc+ os=-mingw32+ ;;+ xps | xps100)+ basic_machine=xps100-honeywell+ ;;+ xscale-* | xscalee[bl]-*)+ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`+ ;;+ ymp)+ basic_machine=ymp-cray+ os=-unicos+ ;;+ z8k-*-coff)+ basic_machine=z8k-unknown+ os=-sim+ ;;+ z80-*-coff)+ basic_machine=z80-unknown+ os=-sim+ ;;+ none)+ basic_machine=none-none+ os=-none+ ;;++# Here we handle the default manufacturer of certain CPU types. It is in+# some cases the only manufacturer, in others, it is the most popular.+ w89k)+ basic_machine=hppa1.1-winbond+ ;;+ op50n)+ basic_machine=hppa1.1-oki+ ;;+ op60c)+ basic_machine=hppa1.1-oki+ ;;+ romp)+ basic_machine=romp-ibm+ ;;+ mmix)+ basic_machine=mmix-knuth+ ;;+ rs6000)+ basic_machine=rs6000-ibm+ ;;+ vax)+ basic_machine=vax-dec+ ;;+ pdp10)+ # there are many clones, so DEC is not a safe bet+ basic_machine=pdp10-unknown+ ;;+ pdp11)+ basic_machine=pdp11-dec+ ;;+ we32k)+ basic_machine=we32k-att+ ;;+ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)+ basic_machine=sh-unknown+ ;;+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)+ basic_machine=sparc-sun+ ;;+ cydra)+ basic_machine=cydra-cydrome+ ;;+ orion)+ basic_machine=orion-highlevel+ ;;+ orion105)+ basic_machine=clipper-highlevel+ ;;+ mac | mpw | mac-mpw)+ basic_machine=m68k-apple+ ;;+ pmac | pmac-mpw)+ basic_machine=powerpc-apple+ ;;+ *-unknown)+ # Make sure to match an already-canonicalized machine name.+ ;;+ *)+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2+ exit 1+ ;;+esac++# Here we canonicalize certain aliases for manufacturers.+case $basic_machine in+ *-digital*)+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`+ ;;+ *-commodore*)+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`+ ;;+ *)+ ;;+esac++# Decode manufacturer-specific aliases for certain operating systems.++if [ x"$os" != x"" ]+then+case $os in+ # First match some system type aliases+ # that might get confused with valid system types.+ # -solaris* is a basic system type, with this one exception.+ -auroraux)+ os=-auroraux+ ;;+ -solaris1 | -solaris1.*)+ os=`echo $os | sed -e 's|solaris1|sunos4|'`+ ;;+ -solaris)+ os=-solaris2+ ;;+ -svr4*)+ os=-sysv4+ ;;+ -unixware*)+ os=-sysv4.2uw+ ;;+ -gnu/linux*)+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`+ ;;+ # First accept the basic system types.+ # The portable systems comes first.+ # Each alternative MUST END IN A *, to match a version number.+ # -sysv* is not here because it comes later, after sysvr4.+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \+ | -sym* | -kopensolaris* | -plan9* \+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \+ | -aos* | -aros* \+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \+ | -bitrig* | -openbsd* | -solidbsd* \+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \+ | -chorusos* | -chorusrdb* | -cegcc* \+ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \+ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \+ | -linux-newlib* | -linux-musl* | -linux-uclibc* \+ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)+ # Remember, each alternative MUST END IN *, to match a version number.+ ;;+ -qnx*)+ case $basic_machine in+ x86-* | i*86-*)+ ;;+ *)+ os=-nto$os+ ;;+ esac+ ;;+ -nto-qnx*)+ ;;+ -nto*)+ os=`echo $os | sed -e 's|nto|nto-qnx|'`+ ;;+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)+ ;;+ -mac*)+ os=`echo $os | sed -e 's|mac|macos|'`+ ;;+ -linux-dietlibc)+ os=-linux-dietlibc+ ;;+ -linux*)+ os=`echo $os | sed -e 's|linux|linux-gnu|'`+ ;;+ -sunos5*)+ os=`echo $os | sed -e 's|sunos5|solaris2|'`+ ;;+ -sunos6*)+ os=`echo $os | sed -e 's|sunos6|solaris3|'`+ ;;+ -opened*)+ os=-openedition+ ;;+ -os400*)+ os=-os400+ ;;+ -wince*)+ os=-wince+ ;;+ -osfrose*)+ os=-osfrose+ ;;+ -osf*)+ os=-osf+ ;;+ -utek*)+ os=-bsd+ ;;+ -dynix*)+ os=-bsd+ ;;+ -acis*)+ os=-aos+ ;;+ -atheos*)+ os=-atheos+ ;;+ -syllable*)+ os=-syllable+ ;;+ -386bsd)+ os=-bsd+ ;;+ -ctix* | -uts*)+ os=-sysv+ ;;+ -nova*)+ os=-rtmk-nova+ ;;+ -ns2 )+ os=-nextstep2+ ;;+ -nsk*)+ os=-nsk+ ;;+ # Preserve the version number of sinix5.+ -sinix5.*)+ os=`echo $os | sed -e 's|sinix|sysv|'`+ ;;+ -sinix*)+ os=-sysv4+ ;;+ -tpf*)+ os=-tpf+ ;;+ -triton*)+ os=-sysv3+ ;;+ -oss*)+ os=-sysv3+ ;;+ -svr4)+ os=-sysv4+ ;;+ -svr3)+ os=-sysv3+ ;;+ -sysvr4)+ os=-sysv4+ ;;+ # This must come after -sysvr4.+ -sysv*)+ ;;+ -ose*)+ os=-ose+ ;;+ -es1800*)+ os=-ose+ ;;+ -xenix)+ os=-xenix+ ;;+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)+ os=-mint+ ;;+ -aros*)+ os=-aros+ ;;+ -zvmoe)+ os=-zvmoe+ ;;+ -dicos*)+ os=-dicos+ ;;+ -nacl*)+ ;;+ -none)+ ;;+ *)+ # Get rid of the `-' at the beginning of $os.+ os=`echo $os | sed 's/[^-]*-//'`+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2+ exit 1+ ;;+esac+else++# Here we handle the default operating systems that come with various machines.+# The value should be what the vendor currently ships out the door with their+# machine or put another way, the most popular os provided with the machine.++# Note that if you're going to try to match "-MANUFACTURER" here (say,+# "-sun"), then you have to tell the case statement up towards the top+# that MANUFACTURER isn't an operating system. Otherwise, code above+# will signal an error saying that MANUFACTURER isn't an operating+# system, and we'll never get to this point.++case $basic_machine in+ score-*)+ os=-elf+ ;;+ spu-*)+ os=-elf+ ;;+ *-acorn)+ os=-riscix1.2+ ;;+ arm*-rebel)+ os=-linux+ ;;+ arm*-semi)+ os=-aout+ ;;+ c4x-* | tic4x-*)+ os=-coff+ ;;+ c8051-*)+ os=-elf+ ;;+ hexagon-*)+ os=-elf+ ;;+ tic54x-*)+ os=-coff+ ;;+ tic55x-*)+ os=-coff+ ;;+ tic6x-*)+ os=-coff+ ;;+ # This must come before the *-dec entry.+ pdp10-*)+ os=-tops20+ ;;+ pdp11-*)+ os=-none+ ;;+ *-dec | vax-*)+ os=-ultrix4.2+ ;;+ m68*-apollo)+ os=-domain+ ;;+ i386-sun)+ os=-sunos4.0.2+ ;;+ m68000-sun)+ os=-sunos3+ ;;+ m68*-cisco)+ os=-aout+ ;;+ mep-*)+ os=-elf+ ;;+ mips*-cisco)+ os=-elf+ ;;+ mips*-*)+ os=-elf+ ;;+ or32-*)+ os=-coff+ ;;+ *-tti) # must be before sparc entry or we get the wrong os.+ os=-sysv3+ ;;+ sparc-* | *-sun)+ os=-sunos4.1.1+ ;;+ *-be)+ os=-beos+ ;;+ *-haiku)+ os=-haiku+ ;;+ *-ibm)+ os=-aix+ ;;+ *-knuth)+ os=-mmixware+ ;;+ *-wec)+ os=-proelf+ ;;+ *-winbond)+ os=-proelf+ ;;+ *-oki)+ os=-proelf+ ;;+ *-hp)+ os=-hpux+ ;;+ *-hitachi)+ os=-hiux+ ;;+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)+ os=-sysv+ ;;+ *-cbm)+ os=-amigaos+ ;;+ *-dg)+ os=-dgux+ ;;+ *-dolphin)+ os=-sysv3+ ;;+ m68k-ccur)+ os=-rtu+ ;;+ m88k-omron*)+ os=-luna+ ;;+ *-next )+ os=-nextstep+ ;;+ *-sequent)+ os=-ptx+ ;;+ *-crds)+ os=-unos+ ;;+ *-ns)+ os=-genix+ ;;+ i370-*)+ os=-mvs+ ;;+ *-next)+ os=-nextstep3+ ;;+ *-gould)+ os=-sysv+ ;;+ *-highlevel)+ os=-bsd+ ;;+ *-encore)+ os=-bsd+ ;;+ *-sgi)+ os=-irix+ ;;+ *-siemens)+ os=-sysv4+ ;;+ *-masscomp)+ os=-rtu+ ;;+ f30[01]-fujitsu | f700-fujitsu)+ os=-uxpv+ ;;+ *-rom68k)+ os=-coff+ ;;+ *-*bug)+ os=-coff+ ;;+ *-apple)+ os=-macos+ ;;+ *-atari*)+ os=-mint+ ;;+ *)+ os=-none+ ;;+esac+fi++# Here we handle the case where we know the os, and the CPU type, but not the+# manufacturer. We pick the logical manufacturer.+vendor=unknown+case $basic_machine in+ *-unknown)+ case $os in+ -riscix*)+ vendor=acorn+ ;;+ -sunos*)+ vendor=sun+ ;;+ -cnk*|-aix*)+ vendor=ibm+ ;;+ -beos*)+ vendor=be+ ;;+ -hpux*)+ vendor=hp+ ;;+ -mpeix*)+ vendor=hp+ ;;+ -hiux*)+ vendor=hitachi+ ;;+ -unos*)+ vendor=crds+ ;;+ -dgux*)+ vendor=dg+ ;;+ -luna*)+ vendor=omron+ ;;+ -genix*)+ vendor=ns+ ;;+ -mvs* | -opened*)+ vendor=ibm+ ;;+ -os400*)+ vendor=ibm+ ;;+ -ptx*)+ vendor=sequent+ ;;+ -tpf*)+ vendor=ibm+ ;;+ -vxsim* | -vxworks* | -windiss*)+ vendor=wrs+ ;;+ -aux*)+ vendor=apple+ ;;+ -hms*)+ vendor=hitachi+ ;;+ -mpw* | -macos*)+ vendor=apple+ ;;+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)+ vendor=atari+ ;;+ -vos*)+ vendor=stratus+ ;;+ esac+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`+ ;;+esac++echo $basic_machine$os+exit++# Local variables:+# eval: (add-hook 'write-file-hooks 'time-stamp)+# time-stamp-start: "timestamp='"+# time-stamp-format: "%:y-%02m-%02d"+# time-stamp-end: "'"+# End:
+ standalone/android/tmp/network-2.4.1.2/configure view
@@ -0,0 +1,5327 @@+#! /bin/sh+set -- --host=arm-linux-androideabi+# Guess values for system-dependent variables and create Makefiles.+# Generated by GNU Autoconf 2.69 for Haskell network package 2.3.0.14.+#+# Report bugs to <libraries@haskell.org>.+#+#+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.+#+#+# This configure script is free software; the Free Software Foundation+# gives unlimited permission to copy, distribute and modify it.+## -------------------- ##+## M4sh Initialization. ##+## -------------------- ##++# Be more Bourne compatible+DUALCASE=1; export DUALCASE # for MKS sh+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :+ emulate sh+ NULLCMD=:+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which+ # is contrary to our usage. Disable this feature.+ alias -g '${1+"$@"}'='"$@"'+ setopt NO_GLOB_SUBST+else+ case `(set -o) 2>/dev/null` in #(+ *posix*) :+ set -o posix ;; #(+ *) :+ ;;+esac+fi+++as_nl='+'+export as_nl+# Printing a long string crashes Solaris 7 /usr/bin/printf.+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo+# Prefer a ksh shell builtin over an external printf program on Solaris,+# but without wasting forks for bash or zsh.+if test -z "$BASH_VERSION$ZSH_VERSION" \+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then+ as_echo='print -r --'+ as_echo_n='print -rn --'+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then+ as_echo='printf %s\n'+ as_echo_n='printf %s'+else+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'+ as_echo_n='/usr/ucb/echo -n'+ else+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'+ as_echo_n_body='eval+ arg=$1;+ case $arg in #(+ *"$as_nl"*)+ expr "X$arg" : "X\\(.*\\)$as_nl";+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;+ esac;+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"+ '+ export as_echo_n_body+ as_echo_n='sh -c $as_echo_n_body as_echo'+ fi+ export as_echo_body+ as_echo='sh -c $as_echo_body as_echo'+fi++# The user is always right.+if test "${PATH_SEPARATOR+set}" != set; then+ PATH_SEPARATOR=:+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||+ PATH_SEPARATOR=';'+ }+fi+++# IFS+# We need space, tab and new line, in precisely that order. Quoting is+# there to prevent editors from complaining about space-tab.+# (If _AS_PATH_WALK were called with IFS unset, it would disable word+# splitting by setting IFS to empty value.)+IFS=" "" $as_nl"++# Find who we are. Look in the path if we contain no directory separator.+as_myself=+case $0 in #((+ *[\\/]* ) as_myself=$0 ;;+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break+ done+IFS=$as_save_IFS++ ;;+esac+# We did not find ourselves, most probably we were run as `sh COMMAND'+# in which case we are not to be found in the path.+if test "x$as_myself" = x; then+ as_myself=$0+fi+if test ! -f "$as_myself"; then+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2+ exit 1+fi++# Unset variables that we do not need and which cause bugs (e.g. in+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"+# suppresses any "Segmentation fault" message there. '((' could+# trigger a bug in pdksh 5.2.14.+for as_var in BASH_ENV ENV MAIL MAILPATH+do eval test x\${$as_var+set} = xset \+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :+done+PS1='$ '+PS2='> '+PS4='+ '++# NLS nuisances.+LC_ALL=C+export LC_ALL+LANGUAGE=C+export LANGUAGE++# CDPATH.+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH++# Use a proper internal environment variable to ensure we don't fall+ # into an infinite loop, continuously re-executing ourselves.+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then+ _as_can_reexec=no; export _as_can_reexec;+ # We cannot yet assume a decent shell, so we have to provide a+# neutralization value for shells without unset; and this also+# works around shells that cannot unset nonexistent variables.+# Preserve -v and -x to the replacement shell.+BASH_ENV=/dev/null+ENV=/dev/null+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV+case $- in # ((((+ *v*x* | *x*v* ) as_opts=-vx ;;+ *v* ) as_opts=-v ;;+ *x* ) as_opts=-x ;;+ * ) as_opts= ;;+esac+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}+# Admittedly, this is quite paranoid, since all the known shells bail+# out after a failed `exec'.+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2+as_fn_exit 255+ fi+ # We don't want this to propagate to other subprocesses.+ { _as_can_reexec=; unset _as_can_reexec;}+if test "x$CONFIG_SHELL" = x; then+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :+ emulate sh+ NULLCMD=:+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which+ # is contrary to our usage. Disable this feature.+ alias -g '\${1+\"\$@\"}'='\"\$@\"'+ setopt NO_GLOB_SUBST+else+ case \`(set -o) 2>/dev/null\` in #(+ *posix*) :+ set -o posix ;; #(+ *) :+ ;;+esac+fi+"+ as_required="as_fn_return () { (exit \$1); }+as_fn_success () { as_fn_return 0; }+as_fn_failure () { as_fn_return 1; }+as_fn_ret_success () { return 0; }+as_fn_ret_failure () { return 1; }++exitcode=0+as_fn_success || { exitcode=1; echo as_fn_success failed.; }+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :++else+ exitcode=1; echo positional parameters were not saved.+fi+test x\$exitcode = x0 || exit 1+test -x / || exit 1"+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1+test \$(( 1 + 1 )) = 2 || exit 1"+ if (eval "$as_required") 2>/dev/null; then :+ as_have_required=yes+else+ as_have_required=no+fi+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :++else+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+as_found=false+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ as_found=:+ case $as_dir in #(+ /*)+ for as_base in sh bash ksh sh5; do+ # Try only shells that exist, to save several forks.+ as_shell=$as_dir/$as_base+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :+ CONFIG_SHELL=$as_shell as_have_required=yes+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :+ break 2+fi+fi+ done;;+ esac+ as_found=false+done+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :+ CONFIG_SHELL=$SHELL as_have_required=yes+fi; }+IFS=$as_save_IFS+++ if test "x$CONFIG_SHELL" != x; then :+ export CONFIG_SHELL+ # We cannot yet assume a decent shell, so we have to provide a+# neutralization value for shells without unset; and this also+# works around shells that cannot unset nonexistent variables.+# Preserve -v and -x to the replacement shell.+BASH_ENV=/dev/null+ENV=/dev/null+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV+case $- in # ((((+ *v*x* | *x*v* ) as_opts=-vx ;;+ *v* ) as_opts=-v ;;+ *x* ) as_opts=-x ;;+ * ) as_opts= ;;+esac+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}+# Admittedly, this is quite paranoid, since all the known shells bail+# out after a failed `exec'.+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2+exit 255+fi++ if test x$as_have_required = xno; then :+ $as_echo "$0: This script requires a shell more modern than all"+ $as_echo "$0: the shells that I found on your system."+ if test x${ZSH_VERSION+set} = xset ; then+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."+ else+ $as_echo "$0: Please tell bug-autoconf@gnu.org and+$0: libraries@haskell.org about your system, including any+$0: error possibly output before this message. Then install+$0: a modern shell, or manually run the script under such a+$0: shell if you do have one."+ fi+ exit 1+fi+fi+fi+SHELL=${CONFIG_SHELL-/bin/sh}+export SHELL+# Unset more variables known to interfere with behavior of common tools.+CLICOLOR_FORCE= GREP_OPTIONS=+unset CLICOLOR_FORCE GREP_OPTIONS++## --------------------- ##+## M4sh Shell Functions. ##+## --------------------- ##+# as_fn_unset VAR+# ---------------+# Portably unset VAR.+as_fn_unset ()+{+ { eval $1=; unset $1;}+}+as_unset=as_fn_unset++# as_fn_set_status STATUS+# -----------------------+# Set $? to STATUS, without forking.+as_fn_set_status ()+{+ return $1+} # as_fn_set_status++# as_fn_exit STATUS+# -----------------+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.+as_fn_exit ()+{+ set +e+ as_fn_set_status $1+ exit $1+} # as_fn_exit++# as_fn_mkdir_p+# -------------+# Create "$as_dir" as a directory, including parents if necessary.+as_fn_mkdir_p ()+{++ case $as_dir in #(+ -*) as_dir=./$as_dir;;+ esac+ test -d "$as_dir" || eval $as_mkdir_p || {+ as_dirs=+ while :; do+ case $as_dir in #(+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(+ *) as_qdir=$as_dir;;+ esac+ as_dirs="'$as_qdir' $as_dirs"+ as_dir=`$as_dirname -- "$as_dir" ||+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \+ X"$as_dir" : 'X\(//\)[^/]' \| \+ X"$as_dir" : 'X\(//\)$' \| \+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||+$as_echo X"$as_dir" |+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{+ s//\1/+ q+ }+ /^X\(\/\/\)[^/].*/{+ s//\1/+ q+ }+ /^X\(\/\/\)$/{+ s//\1/+ q+ }+ /^X\(\/\).*/{+ s//\1/+ q+ }+ s/.*/./; q'`+ test -d "$as_dir" && break+ done+ test -z "$as_dirs" || eval "mkdir $as_dirs"+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"+++} # as_fn_mkdir_p++# as_fn_executable_p FILE+# -----------------------+# Test if FILE is an executable regular file.+as_fn_executable_p ()+{+ test -f "$1" && test -x "$1"+} # as_fn_executable_p+# as_fn_append VAR VALUE+# ----------------------+# Append the text in VALUE to the end of the definition contained in VAR. Take+# advantage of any shell optimizations that allow amortized linear growth over+# repeated appends, instead of the typical quadratic growth present in naive+# implementations.+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :+ eval 'as_fn_append ()+ {+ eval $1+=\$2+ }'+else+ as_fn_append ()+ {+ eval $1=\$$1\$2+ }+fi # as_fn_append++# as_fn_arith ARG...+# ------------------+# Perform arithmetic evaluation on the ARGs, and store the result in the+# global $as_val. Take advantage of shells that can avoid forks. The arguments+# must be portable across $(()) and expr.+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :+ eval 'as_fn_arith ()+ {+ as_val=$(( $* ))+ }'+else+ as_fn_arith ()+ {+ as_val=`expr "$@" || test $? -eq 1`+ }+fi # as_fn_arith+++# as_fn_error STATUS ERROR [LINENO LOG_FD]+# ----------------------------------------+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the+# script with STATUS, using 1 if that was 0.+as_fn_error ()+{+ as_status=$1; test $as_status -eq 0 && as_status=1+ if test "$4"; then+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4+ fi+ $as_echo "$as_me: error: $2" >&2+ as_fn_exit $as_status+} # as_fn_error++if expr a : '\(a\)' >/dev/null 2>&1 &&+ test "X`expr 00001 : '.*\(...\)'`" = X001; then+ as_expr=expr+else+ as_expr=false+fi++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then+ as_basename=basename+else+ as_basename=false+fi++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then+ as_dirname=dirname+else+ as_dirname=false+fi++as_me=`$as_basename -- "$0" ||+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \+ X"$0" : 'X\(//\)$' \| \+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||+$as_echo X/"$0" |+ sed '/^.*\/\([^/][^/]*\)\/*$/{+ s//\1/+ q+ }+ /^X\/\(\/\/\)$/{+ s//\1/+ q+ }+ /^X\/\(\/\).*/{+ s//\1/+ q+ }+ s/.*/./; q'`++# Avoid depending upon Character Ranges.+as_cr_letters='abcdefghijklmnopqrstuvwxyz'+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'+as_cr_Letters=$as_cr_letters$as_cr_LETTERS+as_cr_digits='0123456789'+as_cr_alnum=$as_cr_Letters$as_cr_digits+++ as_lineno_1=$LINENO as_lineno_1a=$LINENO+ as_lineno_2=$LINENO as_lineno_2a=$LINENO+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)+ sed -n '+ p+ /[$]LINENO/=+ ' <$as_myself |+ sed '+ s/[$]LINENO.*/&-/+ t lineno+ b+ :lineno+ N+ :loop+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/+ t loop+ s/-\n.*//+ ' >$as_me.lineno &&+ chmod +x "$as_me.lineno" ||+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }++ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have+ # already done that, so ensure we don't try to do so again and fall+ # in an infinite loop. This has already happened in practice.+ _as_can_reexec=no; export _as_can_reexec+ # Don't try to exec as it changes $[0], causing all sort of problems+ # (the dirname of $[0] is not the place where we might find the+ # original and so on. Autoconf is especially sensitive to this).+ . "./$as_me.lineno"+ # Exit status is that of the last command.+ exit+}++ECHO_C= ECHO_N= ECHO_T=+case `echo -n x` in #(((((+-n*)+ case `echo 'xy\c'` in+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.+ xy) ECHO_C='\c';;+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null+ ECHO_T=' ';;+ esac;;+*)+ ECHO_N='-n';;+esac++rm -f conf$$ conf$$.exe conf$$.file+if test -d conf$$.dir; then+ rm -f conf$$.dir/conf$$.file+else+ rm -f conf$$.dir+ mkdir conf$$.dir 2>/dev/null+fi+if (echo >conf$$.file) 2>/dev/null; then+ if ln -s conf$$.file conf$$ 2>/dev/null; then+ as_ln_s='ln -s'+ # ... but there are two gotchas:+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.+ # In both cases, we have to default to `cp -pR'.+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||+ as_ln_s='cp -pR'+ elif ln conf$$.file conf$$ 2>/dev/null; then+ as_ln_s=ln+ else+ as_ln_s='cp -pR'+ fi+else+ as_ln_s='cp -pR'+fi+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file+rmdir conf$$.dir 2>/dev/null++if mkdir -p . 2>/dev/null; then+ as_mkdir_p='mkdir -p "$as_dir"'+else+ test -d ./-p && rmdir ./-p+ as_mkdir_p=false+fi++as_test_x='test -x'+as_executable_p=as_fn_executable_p++# Sed expression to map a string onto a valid CPP name.+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"++# Sed expression to map a string onto a valid variable name.+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"+++test -n "$DJDIR" || exec 7<&0 </dev/null+exec 6>&1++# Name of the host.+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,+# so uname gets run too.+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`++#+# Initializations.+#+ac_default_prefix=/usr/local+ac_clean_files=+ac_config_libobj_dir=.+LIBOBJS=+cross_compiling=no+subdirs=+MFLAGS=+MAKEFLAGS=++# Identity of this package.+PACKAGE_NAME='Haskell network package'+PACKAGE_TARNAME='network'+PACKAGE_VERSION='2.3.0.14'+PACKAGE_STRING='Haskell network package 2.3.0.14'+PACKAGE_BUGREPORT='libraries@haskell.org'+PACKAGE_URL=''++ac_unique_file="include/HsNet.h"+# Factoring default headers for most tests.+ac_includes_default="\+#include <stdio.h>+#ifdef HAVE_SYS_TYPES_H+# include <sys/types.h>+#endif+#ifdef HAVE_SYS_STAT_H+# include <sys/stat.h>+#endif+#ifdef STDC_HEADERS+# include <stdlib.h>+# include <stddef.h>+#else+# ifdef HAVE_STDLIB_H+# include <stdlib.h>+# endif+#endif+#ifdef HAVE_STRING_H+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H+# include <memory.h>+# endif+# include <string.h>+#endif+#ifdef HAVE_STRINGS_H+# include <strings.h>+#endif+#ifdef HAVE_INTTYPES_H+# include <inttypes.h>+#endif+#ifdef HAVE_STDINT_H+# include <stdint.h>+#endif+#ifdef HAVE_UNISTD_H+# include <unistd.h>+#endif"++ac_subst_vars='LTLIBOBJS+LIBOBJS+EXTRA_SRCS+EXTRA_LIBS+EXTRA_CPPFLAGS+CALLCONV+EGREP+GREP+CPP+OBJEXT+EXEEXT+ac_ct_CC+CPPFLAGS+LDFLAGS+CFLAGS+CC+host_os+host_vendor+host_cpu+host+build_os+build_vendor+build_cpu+build+target_alias+host_alias+build_alias+LIBS+ECHO_T+ECHO_N+ECHO_C+DEFS+mandir+localedir+libdir+psdir+pdfdir+dvidir+htmldir+infodir+docdir+oldincludedir+includedir+localstatedir+sharedstatedir+sysconfdir+datadir+datarootdir+libexecdir+sbindir+bindir+program_transform_name+prefix+exec_prefix+PACKAGE_URL+PACKAGE_BUGREPORT+PACKAGE_STRING+PACKAGE_VERSION+PACKAGE_TARNAME+PACKAGE_NAME+PATH_SEPARATOR+SHELL'+ac_subst_files=''+ac_user_opts='+enable_option_checking+with_cc+'+ ac_precious_vars='build_alias+host_alias+target_alias+CC+CFLAGS+LDFLAGS+LIBS+CPPFLAGS+CPP'+++# Initialize some variables set by options.+ac_init_help=+ac_init_version=false+ac_unrecognized_opts=+ac_unrecognized_sep=+# The variables have the same names as the options, with+# dashes changed to underlines.+cache_file=/dev/null+exec_prefix=NONE+no_create=+no_recursion=+prefix=NONE+program_prefix=NONE+program_suffix=NONE+program_transform_name=s,x,x,+silent=+site=+srcdir=+verbose=+x_includes=NONE+x_libraries=NONE++# Installation directory options.+# These are left unexpanded so users can "make install exec_prefix=/foo"+# and all the variables that are supposed to be based on exec_prefix+# by default will actually change.+# Use braces instead of parens because sh, perl, etc. also accept them.+# (The list follows the same order as the GNU Coding Standards.)+bindir='${exec_prefix}/bin'+sbindir='${exec_prefix}/sbin'+libexecdir='${exec_prefix}/libexec'+datarootdir='${prefix}/share'+datadir='${datarootdir}'+sysconfdir='${prefix}/etc'+sharedstatedir='${prefix}/com'+localstatedir='${prefix}/var'+includedir='${prefix}/include'+oldincludedir='/usr/include'+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'+infodir='${datarootdir}/info'+htmldir='${docdir}'+dvidir='${docdir}'+pdfdir='${docdir}'+psdir='${docdir}'+libdir='${exec_prefix}/lib'+localedir='${datarootdir}/locale'+mandir='${datarootdir}/man'++ac_prev=+ac_dashdash=+for ac_option+do+ # If the previous option needs an argument, assign it.+ if test -n "$ac_prev"; then+ eval $ac_prev=\$ac_option+ ac_prev=+ continue+ fi++ case $ac_option in+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;+ *=) ac_optarg= ;;+ *) ac_optarg=yes ;;+ esac++ # Accept the important Cygnus configure options, so we can diagnose typos.++ case $ac_dashdash$ac_option in+ --)+ ac_dashdash=yes ;;++ -bindir | --bindir | --bindi | --bind | --bin | --bi)+ ac_prev=bindir ;;+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)+ bindir=$ac_optarg ;;++ -build | --build | --buil | --bui | --bu)+ ac_prev=build_alias ;;+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)+ build_alias=$ac_optarg ;;++ -cache-file | --cache-file | --cache-fil | --cache-fi \+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)+ ac_prev=cache_file ;;+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)+ cache_file=$ac_optarg ;;++ --config-cache | -C)+ cache_file=config.cache ;;++ -datadir | --datadir | --datadi | --datad)+ ac_prev=datadir ;;+ -datadir=* | --datadir=* | --datadi=* | --datad=*)+ datadir=$ac_optarg ;;++ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \+ | --dataroo | --dataro | --datar)+ ac_prev=datarootdir ;;+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)+ datarootdir=$ac_optarg ;;++ -disable-* | --disable-*)+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`+ # Reject names that are not valid shell variable names.+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&+ as_fn_error $? "invalid feature name: $ac_useropt"+ ac_useropt_orig=$ac_useropt+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`+ case $ac_user_opts in+ *"+"enable_$ac_useropt"+"*) ;;+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"+ ac_unrecognized_sep=', ';;+ esac+ eval enable_$ac_useropt=no ;;++ -docdir | --docdir | --docdi | --doc | --do)+ ac_prev=docdir ;;+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)+ docdir=$ac_optarg ;;++ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)+ ac_prev=dvidir ;;+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)+ dvidir=$ac_optarg ;;++ -enable-* | --enable-*)+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`+ # Reject names that are not valid shell variable names.+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&+ as_fn_error $? "invalid feature name: $ac_useropt"+ ac_useropt_orig=$ac_useropt+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`+ case $ac_user_opts in+ *"+"enable_$ac_useropt"+"*) ;;+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"+ ac_unrecognized_sep=', ';;+ esac+ eval enable_$ac_useropt=\$ac_optarg ;;++ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \+ | --exec | --exe | --ex)+ ac_prev=exec_prefix ;;+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \+ | --exec=* | --exe=* | --ex=*)+ exec_prefix=$ac_optarg ;;++ -gas | --gas | --ga | --g)+ # Obsolete; use --with-gas.+ with_gas=yes ;;++ -help | --help | --hel | --he | -h)+ ac_init_help=long ;;+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)+ ac_init_help=recursive ;;+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)+ ac_init_help=short ;;++ -host | --host | --hos | --ho)+ ac_prev=host_alias ;;+ -host=* | --host=* | --hos=* | --ho=*)+ host_alias=$ac_optarg ;;++ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)+ ac_prev=htmldir ;;+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \+ | --ht=*)+ htmldir=$ac_optarg ;;++ -includedir | --includedir | --includedi | --included | --include \+ | --includ | --inclu | --incl | --inc)+ ac_prev=includedir ;;+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \+ | --includ=* | --inclu=* | --incl=* | --inc=*)+ includedir=$ac_optarg ;;++ -infodir | --infodir | --infodi | --infod | --info | --inf)+ ac_prev=infodir ;;+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)+ infodir=$ac_optarg ;;++ -libdir | --libdir | --libdi | --libd)+ ac_prev=libdir ;;+ -libdir=* | --libdir=* | --libdi=* | --libd=*)+ libdir=$ac_optarg ;;++ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \+ | --libexe | --libex | --libe)+ ac_prev=libexecdir ;;+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \+ | --libexe=* | --libex=* | --libe=*)+ libexecdir=$ac_optarg ;;++ -localedir | --localedir | --localedi | --localed | --locale)+ ac_prev=localedir ;;+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)+ localedir=$ac_optarg ;;++ -localstatedir | --localstatedir | --localstatedi | --localstated \+ | --localstate | --localstat | --localsta | --localst | --locals)+ ac_prev=localstatedir ;;+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)+ localstatedir=$ac_optarg ;;++ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)+ ac_prev=mandir ;;+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)+ mandir=$ac_optarg ;;++ -nfp | --nfp | --nf)+ # Obsolete; use --without-fp.+ with_fp=no ;;++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \+ | --no-cr | --no-c | -n)+ no_create=yes ;;++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)+ no_recursion=yes ;;++ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \+ | --oldin | --oldi | --old | --ol | --o)+ ac_prev=oldincludedir ;;+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)+ oldincludedir=$ac_optarg ;;++ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)+ ac_prev=prefix ;;+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)+ prefix=$ac_optarg ;;++ -program-prefix | --program-prefix | --program-prefi | --program-pref \+ | --program-pre | --program-pr | --program-p)+ ac_prev=program_prefix ;;+ -program-prefix=* | --program-prefix=* | --program-prefi=* \+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)+ program_prefix=$ac_optarg ;;++ -program-suffix | --program-suffix | --program-suffi | --program-suff \+ | --program-suf | --program-su | --program-s)+ ac_prev=program_suffix ;;+ -program-suffix=* | --program-suffix=* | --program-suffi=* \+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)+ program_suffix=$ac_optarg ;;++ -program-transform-name | --program-transform-name \+ | --program-transform-nam | --program-transform-na \+ | --program-transform-n | --program-transform- \+ | --program-transform | --program-transfor \+ | --program-transfo | --program-transf \+ | --program-trans | --program-tran \+ | --progr-tra | --program-tr | --program-t)+ ac_prev=program_transform_name ;;+ -program-transform-name=* | --program-transform-name=* \+ | --program-transform-nam=* | --program-transform-na=* \+ | --program-transform-n=* | --program-transform-=* \+ | --program-transform=* | --program-transfor=* \+ | --program-transfo=* | --program-transf=* \+ | --program-trans=* | --program-tran=* \+ | --progr-tra=* | --program-tr=* | --program-t=*)+ program_transform_name=$ac_optarg ;;++ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)+ ac_prev=pdfdir ;;+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)+ pdfdir=$ac_optarg ;;++ -psdir | --psdir | --psdi | --psd | --ps)+ ac_prev=psdir ;;+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)+ psdir=$ac_optarg ;;++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \+ | -silent | --silent | --silen | --sile | --sil)+ silent=yes ;;++ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)+ ac_prev=sbindir ;;+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \+ | --sbi=* | --sb=*)+ sbindir=$ac_optarg ;;++ -sharedstatedir | --sharedstatedir | --sharedstatedi \+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \+ | --sharedst | --shareds | --shared | --share | --shar \+ | --sha | --sh)+ ac_prev=sharedstatedir ;;+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \+ | --sha=* | --sh=*)+ sharedstatedir=$ac_optarg ;;++ -site | --site | --sit)+ ac_prev=site ;;+ -site=* | --site=* | --sit=*)+ site=$ac_optarg ;;++ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)+ ac_prev=srcdir ;;+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)+ srcdir=$ac_optarg ;;++ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \+ | --syscon | --sysco | --sysc | --sys | --sy)+ ac_prev=sysconfdir ;;+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)+ sysconfdir=$ac_optarg ;;++ -target | --target | --targe | --targ | --tar | --ta | --t)+ ac_prev=target_alias ;;+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)+ target_alias=$ac_optarg ;;++ -v | -verbose | --verbose | --verbos | --verbo | --verb)+ verbose=yes ;;++ -version | --version | --versio | --versi | --vers | -V)+ ac_init_version=: ;;++ -with-* | --with-*)+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`+ # Reject names that are not valid shell variable names.+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&+ as_fn_error $? "invalid package name: $ac_useropt"+ ac_useropt_orig=$ac_useropt+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`+ case $ac_user_opts in+ *"+"with_$ac_useropt"+"*) ;;+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"+ ac_unrecognized_sep=', ';;+ esac+ eval with_$ac_useropt=\$ac_optarg ;;++ -without-* | --without-*)+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`+ # Reject names that are not valid shell variable names.+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&+ as_fn_error $? "invalid package name: $ac_useropt"+ ac_useropt_orig=$ac_useropt+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`+ case $ac_user_opts in+ *"+"with_$ac_useropt"+"*) ;;+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"+ ac_unrecognized_sep=', ';;+ esac+ eval with_$ac_useropt=no ;;++ --x)+ # Obsolete; use --with-x.+ with_x=yes ;;++ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \+ | --x-incl | --x-inc | --x-in | --x-i)+ ac_prev=x_includes ;;+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)+ x_includes=$ac_optarg ;;++ -x-libraries | --x-libraries | --x-librarie | --x-librari \+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)+ ac_prev=x_libraries ;;+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)+ x_libraries=$ac_optarg ;;++ -*) as_fn_error $? "unrecognized option: \`$ac_option'+Try \`$0 --help' for more information"+ ;;++ *=*)+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`+ # Reject names that are not valid shell variable names.+ case $ac_envvar in #(+ '' | [0-9]* | *[!_$as_cr_alnum]* )+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;+ esac+ eval $ac_envvar=\$ac_optarg+ export $ac_envvar ;;++ *)+ # FIXME: should be removed in autoconf 3.0.+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"+ ;;++ esac+done++if test -n "$ac_prev"; then+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`+ as_fn_error $? "missing argument to $ac_option"+fi++if test -n "$ac_unrecognized_opts"; then+ case $enable_option_checking in+ no) ;;+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;+ esac+fi++# Check all directory arguments for consistency.+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \+ datadir sysconfdir sharedstatedir localstatedir includedir \+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \+ libdir localedir mandir+do+ eval ac_val=\$$ac_var+ # Remove trailing slashes.+ case $ac_val in+ */ )+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`+ eval $ac_var=\$ac_val;;+ esac+ # Be sure to have absolute directory names.+ case $ac_val in+ [\\/$]* | ?:[\\/]* ) continue;;+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;+ esac+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"+done++# There might be people who depend on the old broken behavior: `$host'+# used to hold the argument of --host etc.+# FIXME: To remove some day.+build=$build_alias+host=$host_alias+target=$target_alias++# FIXME: To remove some day.+if test "x$host_alias" != x; then+ if test "x$build_alias" = x; then+ cross_compiling=maybe+ elif test "x$build_alias" != "x$host_alias"; then+ cross_compiling=yes+ fi+fi++ac_tool_prefix=+test -n "$host_alias" && ac_tool_prefix=$host_alias-++test "$silent" = yes && exec 6>/dev/null+++ac_pwd=`pwd` && test -n "$ac_pwd" &&+ac_ls_di=`ls -di .` &&+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||+ as_fn_error $? "working directory cannot be determined"+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||+ as_fn_error $? "pwd does not report name of working directory"+++# Find the source files, if location was not specified.+if test -z "$srcdir"; then+ ac_srcdir_defaulted=yes+ # Try the directory containing this script, then the parent directory.+ ac_confdir=`$as_dirname -- "$as_myself" ||+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \+ X"$as_myself" : 'X\(//\)[^/]' \| \+ X"$as_myself" : 'X\(//\)$' \| \+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||+$as_echo X"$as_myself" |+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{+ s//\1/+ q+ }+ /^X\(\/\/\)[^/].*/{+ s//\1/+ q+ }+ /^X\(\/\/\)$/{+ s//\1/+ q+ }+ /^X\(\/\).*/{+ s//\1/+ q+ }+ s/.*/./; q'`+ srcdir=$ac_confdir+ if test ! -r "$srcdir/$ac_unique_file"; then+ srcdir=..+ fi+else+ ac_srcdir_defaulted=no+fi+if test ! -r "$srcdir/$ac_unique_file"; then+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"+fi+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"+ac_abs_confdir=`(+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"+ pwd)`+# When building in place, set srcdir=.+if test "$ac_abs_confdir" = "$ac_pwd"; then+ srcdir=.+fi+# Remove unnecessary trailing slashes from srcdir.+# Double slashes in file names in object file debugging info+# mess up M-x gdb in Emacs.+case $srcdir in+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;+esac+for ac_var in $ac_precious_vars; do+ eval ac_env_${ac_var}_set=\${${ac_var}+set}+ eval ac_env_${ac_var}_value=\$${ac_var}+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}+ eval ac_cv_env_${ac_var}_value=\$${ac_var}+done++#+# Report the --help message.+#+if test "$ac_init_help" = "long"; then+ # Omit some internal or obsolete options to make the list less imposing.+ # This message is too long to be a string in the A/UX 3.1 sh.+ cat <<_ACEOF+\`configure' configures Haskell network package 2.3.0.14 to adapt to many kinds of systems.++Usage: $0 [OPTION]... [VAR=VALUE]...++To assign environment variables (e.g., CC, CFLAGS...), specify them as+VAR=VALUE. See below for descriptions of some of the useful variables.++Defaults for the options are specified in brackets.++Configuration:+ -h, --help display this help and exit+ --help=short display options specific to this package+ --help=recursive display the short help of all the included packages+ -V, --version display version information and exit+ -q, --quiet, --silent do not print \`checking ...' messages+ --cache-file=FILE cache test results in FILE [disabled]+ -C, --config-cache alias for \`--cache-file=config.cache'+ -n, --no-create do not create output files+ --srcdir=DIR find the sources in DIR [configure dir or \`..']++Installation directories:+ --prefix=PREFIX install architecture-independent files in PREFIX+ [$ac_default_prefix]+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX+ [PREFIX]++By default, \`make install' will install all the files in+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify+an installation prefix other than \`$ac_default_prefix' using \`--prefix',+for instance \`--prefix=\$HOME'.++For better control, use the options below.++Fine tuning of the installation directories:+ --bindir=DIR user executables [EPREFIX/bin]+ --sbindir=DIR system admin executables [EPREFIX/sbin]+ --libexecdir=DIR program executables [EPREFIX/libexec]+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]+ --libdir=DIR object code libraries [EPREFIX/lib]+ --includedir=DIR C header files [PREFIX/include]+ --oldincludedir=DIR C header files for non-gcc [/usr/include]+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]+ --infodir=DIR info documentation [DATAROOTDIR/info]+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]+ --mandir=DIR man documentation [DATAROOTDIR/man]+ --docdir=DIR documentation root [DATAROOTDIR/doc/network]+ --htmldir=DIR html documentation [DOCDIR]+ --dvidir=DIR dvi documentation [DOCDIR]+ --pdfdir=DIR pdf documentation [DOCDIR]+ --psdir=DIR ps documentation [DOCDIR]+_ACEOF++ cat <<\_ACEOF++System types:+ --build=BUILD configure for building on BUILD [guessed]+ --host=HOST cross-compile to build programs to run on HOST [BUILD]+_ACEOF+fi++if test -n "$ac_init_help"; then+ case $ac_init_help in+ short | recursive ) echo "Configuration of Haskell network package 2.3.0.14:";;+ esac+ cat <<\_ACEOF++Optional Packages:+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)+C compiler++Some influential environment variables:+ CC C compiler command+ CFLAGS C compiler flags+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a+ nonstandard directory <lib dir>+ LIBS libraries to pass to the linker, e.g. -l<library>+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if+ you have headers in a nonstandard directory <include dir>+ CPP C preprocessor++Use these variables to override the choices made by `configure' or to help+it to find libraries and programs with nonstandard names/locations.++Report bugs to <libraries@haskell.org>.+_ACEOF+ac_status=$?+fi++if test "$ac_init_help" = "recursive"; then+ # If there are subdirs, report their specific --help.+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue+ test -d "$ac_dir" ||+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||+ continue+ ac_builddir=.++case "$ac_dir" in+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;+*)+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`+ # A ".." for each directory in $ac_dir_suffix.+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`+ case $ac_top_builddir_sub in+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;+ esac ;;+esac+ac_abs_top_builddir=$ac_pwd+ac_abs_builddir=$ac_pwd$ac_dir_suffix+# for backward compatibility:+ac_top_builddir=$ac_top_build_prefix++case $srcdir in+ .) # We are building in place.+ ac_srcdir=.+ ac_top_srcdir=$ac_top_builddir_sub+ ac_abs_top_srcdir=$ac_pwd ;;+ [\\/]* | ?:[\\/]* ) # Absolute name.+ ac_srcdir=$srcdir$ac_dir_suffix;+ ac_top_srcdir=$srcdir+ ac_abs_top_srcdir=$srcdir ;;+ *) # Relative name.+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix+ ac_top_srcdir=$ac_top_build_prefix$srcdir+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;+esac+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix++ cd "$ac_dir" || { ac_status=$?; continue; }+ # Check for guested configure.+ if test -f "$ac_srcdir/configure.gnu"; then+ echo &&+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive+ elif test -f "$ac_srcdir/configure"; then+ echo &&+ $SHELL "$ac_srcdir/configure" --help=recursive+ else+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2+ fi || ac_status=$?+ cd "$ac_pwd" || { ac_status=$?; break; }+ done+fi++test -n "$ac_init_help" && exit $ac_status+if $ac_init_version; then+ cat <<\_ACEOF+Haskell network package configure 2.3.0.14+generated by GNU Autoconf 2.69++Copyright (C) 2012 Free Software Foundation, Inc.+This configure script is free software; the Free Software Foundation+gives unlimited permission to copy, distribute and modify it.+_ACEOF+ exit+fi++## ------------------------ ##+## Autoconf initialization. ##+## ------------------------ ##++# ac_fn_c_try_compile LINENO+# --------------------------+# Try to compile conftest.$ac_ext, and return whether this succeeded.+ac_fn_c_try_compile ()+{+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ rm -f conftest.$ac_objext+ if { { ac_try="$ac_compile"+case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_compile") 2>conftest.err+ ac_status=$?+ if test -s conftest.err; then+ grep -v '^ *+' conftest.err >conftest.er1+ cat conftest.er1 >&5+ mv -f conftest.er1 conftest.err+ fi+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; } && {+ test -z "$ac_c_werror_flag" ||+ test ! -s conftest.err+ } && test -s conftest.$ac_objext; then :+ ac_retval=0+else+ $as_echo "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++ ac_retval=1+fi+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno+ as_fn_set_status $ac_retval++} # ac_fn_c_try_compile++# ac_fn_c_try_cpp LINENO+# ----------------------+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.+ac_fn_c_try_cpp ()+{+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ if { { ac_try="$ac_cpp conftest.$ac_ext"+case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err+ ac_status=$?+ if test -s conftest.err; then+ grep -v '^ *+' conftest.err >conftest.er1+ cat conftest.er1 >&5+ mv -f conftest.er1 conftest.err+ fi+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; } > conftest.i && {+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||+ test ! -s conftest.err+ }; then :+ ac_retval=0+else+ $as_echo "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++ ac_retval=1+fi+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno+ as_fn_set_status $ac_retval++} # ac_fn_c_try_cpp++# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES+# -------------------------------------------------------+# Tests whether HEADER exists, giving a warning if it cannot be compiled using+# the include files in INCLUDES and setting the cache variable VAR+# accordingly.+ac_fn_c_check_header_mongrel ()+{+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ if eval \${$3+:} false; then :+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5+$as_echo_n "checking for $2... " >&6; }+if eval \${$3+:} false; then :+ $as_echo_n "(cached) " >&6+fi+eval ac_res=\$$3+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+$as_echo "$ac_res" >&6; }+else+ # Is the header compilable?+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5+$as_echo_n "checking $2 usability... " >&6; }+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+$4+#include <$2>+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ ac_header_compiler=yes+else+ ac_header_compiler=no+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5+$as_echo "$ac_header_compiler" >&6; }++# Is the header present?+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5+$as_echo_n "checking $2 presence... " >&6; }+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <$2>+_ACEOF+if ac_fn_c_try_cpp "$LINENO"; then :+ ac_header_preproc=yes+else+ ac_header_preproc=no+fi+rm -f conftest.err conftest.i conftest.$ac_ext+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5+$as_echo "$ac_header_preproc" >&6; }++# So? What about this header?+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((+ yes:no: )+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}+ ;;+ no:yes:* )+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}+( $as_echo "## ------------------------------------ ##+## Report this to libraries@haskell.org ##+## ------------------------------------ ##"+ ) | sed "s/^/$as_me: WARNING: /" >&2+ ;;+esac+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5+$as_echo_n "checking for $2... " >&6; }+if eval \${$3+:} false; then :+ $as_echo_n "(cached) " >&6+else+ eval "$3=\$ac_header_compiler"+fi+eval ac_res=\$$3+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+$as_echo "$ac_res" >&6; }+fi+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno++} # ac_fn_c_check_header_mongrel++# ac_fn_c_try_run LINENO+# ----------------------+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes+# that executables *can* be run.+ac_fn_c_try_run ()+{+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ if { { ac_try="$ac_link"+case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_link") 2>&5+ ac_status=$?+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'+ { { case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_try") 2>&5+ ac_status=$?+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; }; }; then :+ ac_retval=0+else+ $as_echo "$as_me: program exited with status $ac_status" >&5+ $as_echo "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++ ac_retval=$ac_status+fi+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno+ as_fn_set_status $ac_retval++} # ac_fn_c_try_run++# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES+# -------------------------------------------------------+# Tests whether HEADER exists and can be compiled using the include files in+# INCLUDES, setting the cache variable VAR accordingly.+ac_fn_c_check_header_compile ()+{+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5+$as_echo_n "checking for $2... " >&6; }+if eval \${$3+:} false; then :+ $as_echo_n "(cached) " >&6+else+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+$4+#include <$2>+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ eval "$3=yes"+else+ eval "$3=no"+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+fi+eval ac_res=\$$3+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+$as_echo "$ac_res" >&6; }+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno++} # ac_fn_c_check_header_compile++# ac_fn_c_try_link LINENO+# -----------------------+# Try to link conftest.$ac_ext, and return whether this succeeded.+ac_fn_c_try_link ()+{+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ rm -f conftest.$ac_objext conftest$ac_exeext+ if { { ac_try="$ac_link"+case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_link") 2>conftest.err+ ac_status=$?+ if test -s conftest.err; then+ grep -v '^ *+' conftest.err >conftest.er1+ cat conftest.er1 >&5+ mv -f conftest.er1 conftest.err+ fi+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; } && {+ test -z "$ac_c_werror_flag" ||+ test ! -s conftest.err+ } && test -s conftest$ac_exeext && {+ test "$cross_compiling" = yes ||+ test -x conftest$ac_exeext+ }; then :+ ac_retval=0+else+ $as_echo "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++ ac_retval=1+fi+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would+ # interfere with the next link command; also delete a directory that is+ # left behind by Apple's compiler. We do this before executing the actions.+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno+ as_fn_set_status $ac_retval++} # ac_fn_c_try_link++# ac_fn_c_check_func LINENO FUNC VAR+# ----------------------------------+# Tests whether FUNC exists, setting the cache variable VAR accordingly+ac_fn_c_check_func ()+{+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5+$as_echo_n "checking for $2... " >&6; }+if eval \${$3+:} false; then :+ $as_echo_n "(cached) " >&6+else+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.+ For example, HP-UX 11i <limits.h> declares gettimeofday. */+#define $2 innocuous_$2++/* System header to define __stub macros and hopefully few prototypes,+ which can conflict with char $2 (); below.+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since+ <limits.h> exists even on freestanding compilers. */++#ifdef __STDC__+# include <limits.h>+#else+# include <assert.h>+#endif++#undef $2++/* Override any GCC internal prototype to avoid an error.+ Use char because int might match the return type of a GCC+ builtin and then its argument prototype would still apply. */+#ifdef __cplusplus+extern "C"+#endif+char $2 ();+/* The GNU C library defines this for functions which it implements+ to always fail with ENOSYS. Some functions are actually named+ something starting with __ and the normal name is an alias. */+#if defined __stub_$2 || defined __stub___$2+choke me+#endif++int+main ()+{+return $2 ();+ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_link "$LINENO"; then :+ eval "$3=yes"+else+ eval "$3=no"+fi+rm -f core conftest.err conftest.$ac_objext \+ conftest$ac_exeext conftest.$ac_ext+fi+eval ac_res=\$$3+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+$as_echo "$ac_res" >&6; }+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno++} # ac_fn_c_check_func++# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES+# ----------------------------------------------------+# Tries to find if the field MEMBER exists in type AGGR, after including+# INCLUDES, setting cache variable VAR accordingly.+ac_fn_c_check_member ()+{+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5+$as_echo_n "checking for $2.$3... " >&6; }+if eval \${$4+:} false; then :+ $as_echo_n "(cached) " >&6+else+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+$5+int+main ()+{+static $2 ac_aggr;+if (ac_aggr.$3)+return 0;+ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ eval "$4=yes"+else+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+$5+int+main ()+{+static $2 ac_aggr;+if (sizeof ac_aggr.$3)+return 0;+ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ eval "$4=yes"+else+ eval "$4=no"+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+fi+eval ac_res=\$$4+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+$as_echo "$ac_res" >&6; }+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno++} # ac_fn_c_check_member++# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES+# ---------------------------------------------+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR+# accordingly.+ac_fn_c_check_decl ()+{+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ as_decl_name=`echo $2|sed 's/ *(.*//'`+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }+if eval \${$3+:} false; then :+ $as_echo_n "(cached) " >&6+else+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+$4+int+main ()+{+#ifndef $as_decl_name+#ifdef __cplusplus+ (void) $as_decl_use;+#else+ (void) $as_decl_name;+#endif+#endif++ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ eval "$3=yes"+else+ eval "$3=no"+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+fi+eval ac_res=\$$3+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+$as_echo "$ac_res" >&6; }+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno++} # ac_fn_c_check_decl+cat >config.log <<_ACEOF+This file contains any messages produced by compilers while+running configure, to aid debugging if configure makes a mistake.++It was created by Haskell network package $as_me 2.3.0.14, which was+generated by GNU Autoconf 2.69. Invocation command line was++ $ $0 $@++_ACEOF+exec 5>>config.log+{+cat <<_ASUNAME+## --------- ##+## Platform. ##+## --------- ##++hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`+uname -m = `(uname -m) 2>/dev/null || echo unknown`+uname -r = `(uname -r) 2>/dev/null || echo unknown`+uname -s = `(uname -s) 2>/dev/null || echo unknown`+uname -v = `(uname -v) 2>/dev/null || echo unknown`++/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`++/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`++_ASUNAME++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ $as_echo "PATH: $as_dir"+ done+IFS=$as_save_IFS++} >&5++cat >&5 <<_ACEOF+++## ----------- ##+## Core tests. ##+## ----------- ##++_ACEOF+++# Keep a trace of the command line.+# Strip out --no-create and --no-recursion so they do not pile up.+# Strip out --silent because we don't want to record it for future runs.+# Also quote any args containing shell meta-characters.+# Make two passes to allow for proper duplicate-argument suppression.+ac_configure_args=+ac_configure_args0=+ac_configure_args1=+ac_must_keep_next=false+for ac_pass in 1 2+do+ for ac_arg+ do+ case $ac_arg in+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \+ | -silent | --silent | --silen | --sile | --sil)+ continue ;;+ *\'*)+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;+ esac+ case $ac_pass in+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;+ 2)+ as_fn_append ac_configure_args1 " '$ac_arg'"+ if test $ac_must_keep_next = true; then+ ac_must_keep_next=false # Got value, back to normal.+ else+ case $ac_arg in+ *=* | --config-cache | -C | -disable-* | --disable-* \+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \+ | -with-* | --with-* | -without-* | --without-* | --x)+ case "$ac_configure_args0 " in+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;+ esac+ ;;+ -* ) ac_must_keep_next=true ;;+ esac+ fi+ as_fn_append ac_configure_args " '$ac_arg'"+ ;;+ esac+ done+done+{ ac_configure_args0=; unset ac_configure_args0;}+{ ac_configure_args1=; unset ac_configure_args1;}++# When interrupted or exit'd, cleanup temporary files, and complete+# config.log. We remove comments because anyway the quotes in there+# would cause problems or look ugly.+# WARNING: Use '\'' to represent an apostrophe within the trap.+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.+trap 'exit_status=$?+ # Save into config.log some information that might help in debugging.+ {+ echo++ $as_echo "## ---------------- ##+## Cache variables. ##+## ---------------- ##"+ echo+ # The following way of writing the cache mishandles newlines in values,+(+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do+ eval ac_val=\$$ac_var+ case $ac_val in #(+ *${as_nl}*)+ case $ac_var in #(+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;+ esac+ case $ac_var in #(+ _ | IFS | as_nl) ;; #(+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(+ *) { eval $ac_var=; unset $ac_var;} ;;+ esac ;;+ esac+ done+ (set) 2>&1 |+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(+ *${as_nl}ac_space=\ *)+ sed -n \+ "s/'\''/'\''\\\\'\'''\''/g;+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"+ ;; #(+ *)+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"+ ;;+ esac |+ sort+)+ echo++ $as_echo "## ----------------- ##+## Output variables. ##+## ----------------- ##"+ echo+ for ac_var in $ac_subst_vars+ do+ eval ac_val=\$$ac_var+ case $ac_val in+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;+ esac+ $as_echo "$ac_var='\''$ac_val'\''"+ done | sort+ echo++ if test -n "$ac_subst_files"; then+ $as_echo "## ------------------- ##+## File substitutions. ##+## ------------------- ##"+ echo+ for ac_var in $ac_subst_files+ do+ eval ac_val=\$$ac_var+ case $ac_val in+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;+ esac+ $as_echo "$ac_var='\''$ac_val'\''"+ done | sort+ echo+ fi++ if test -s confdefs.h; then+ $as_echo "## ----------- ##+## confdefs.h. ##+## ----------- ##"+ echo+ cat confdefs.h+ echo+ fi+ test "$ac_signal" != 0 &&+ $as_echo "$as_me: caught signal $ac_signal"+ $as_echo "$as_me: exit $exit_status"+ } >&5+ rm -f core *.core core.conftest.* &&+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&+ exit $exit_status+' 0+for ac_signal in 1 2 13 15; do+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal+done+ac_signal=0++# confdefs.h avoids OS command line length limits that DEFS can exceed.+rm -f -r conftest* confdefs.h++$as_echo "/* confdefs.h */" > confdefs.h++# Predefined preprocessor variables.++cat >>confdefs.h <<_ACEOF+#define PACKAGE_NAME "$PACKAGE_NAME"+_ACEOF++cat >>confdefs.h <<_ACEOF+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"+_ACEOF++cat >>confdefs.h <<_ACEOF+#define PACKAGE_VERSION "$PACKAGE_VERSION"+_ACEOF++cat >>confdefs.h <<_ACEOF+#define PACKAGE_STRING "$PACKAGE_STRING"+_ACEOF++cat >>confdefs.h <<_ACEOF+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"+_ACEOF++cat >>confdefs.h <<_ACEOF+#define PACKAGE_URL "$PACKAGE_URL"+_ACEOF+++# Let the site file select an alternate cache file if it wants to.+# Prefer an explicitly selected file to automatically selected ones.+ac_site_file1=NONE+ac_site_file2=NONE+if test -n "$CONFIG_SITE"; then+ # We do not want a PATH search for config.site.+ case $CONFIG_SITE in #((+ -*) ac_site_file1=./$CONFIG_SITE;;+ */*) ac_site_file1=$CONFIG_SITE;;+ *) ac_site_file1=./$CONFIG_SITE;;+ esac+elif test "x$prefix" != xNONE; then+ ac_site_file1=$prefix/share/config.site+ ac_site_file2=$prefix/etc/config.site+else+ ac_site_file1=$ac_default_prefix/share/config.site+ ac_site_file2=$ac_default_prefix/etc/config.site+fi+for ac_site_file in "$ac_site_file1" "$ac_site_file2"+do+ test "x$ac_site_file" = xNONE && continue+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5+$as_echo "$as_me: loading site script $ac_site_file" >&6;}+ sed 's/^/| /' "$ac_site_file" >&5+ . "$ac_site_file" \+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}+as_fn_error $? "failed to load site script $ac_site_file+See \`config.log' for more details" "$LINENO" 5; }+ fi+done++if test -r "$cache_file"; then+ # Some versions of bash will fail to source /dev/null (special files+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5+$as_echo "$as_me: loading cache $cache_file" >&6;}+ case $cache_file in+ [\\/]* | ?:[\\/]* ) . "$cache_file";;+ *) . "./$cache_file";;+ esac+ fi+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5+$as_echo "$as_me: creating cache $cache_file" >&6;}+ >$cache_file+fi++# Check that the precious variables saved in the cache have kept the same+# value.+ac_cache_corrupted=false+for ac_var in $ac_precious_vars; do+ eval ac_old_set=\$ac_cv_env_${ac_var}_set+ eval ac_new_set=\$ac_env_${ac_var}_set+ eval ac_old_val=\$ac_cv_env_${ac_var}_value+ eval ac_new_val=\$ac_env_${ac_var}_value+ case $ac_old_set,$ac_new_set in+ set,)+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}+ ac_cache_corrupted=: ;;+ ,set)+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}+ ac_cache_corrupted=: ;;+ ,);;+ *)+ if test "x$ac_old_val" != "x$ac_new_val"; then+ # differences in whitespace do not lead to failure.+ ac_old_val_w=`echo x $ac_old_val`+ ac_new_val_w=`echo x $ac_new_val`+ if test "$ac_old_val_w" != "$ac_new_val_w"; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}+ ac_cache_corrupted=:+ else+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}+ eval $ac_var=\$ac_old_val+ fi+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}+ fi;;+ esac+ # Pass precious variables to config.status.+ if test "$ac_new_set" = set; then+ case $ac_new_val in+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;+ *) ac_arg=$ac_var=$ac_new_val ;;+ esac+ case " $ac_configure_args " in+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;+ esac+ fi+done+if $ac_cache_corrupted; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5+fi+## -------------------- ##+## Main body of script. ##+## -------------------- ##++ac_ext=c+ac_cpp='$CPP $CPPFLAGS'+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'+ac_compiler_gnu=$ac_cv_c_compiler_gnu++++ac_includes_default="$ac_includes_default+#ifdef HAVE_SYS_SOCKET_H+# include <sys/socket.h>+#endif+#ifdef HAVE_NETINET_IN_H+# include <netinet/in.h>+#endif+#ifdef HAVE_NETDB_H+# include <netdb.h>+#endif+#ifdef HAVE_WINSOCK2_H+# include <winsock2.h>+#endif+#ifdef HAVE_WS2TCPIP_H+# include <ws2tcpip.h>+// fix for MingW not defining IPV6_V6ONLY+# define IPV6_V6ONLY 27+#endif+#ifdef HAVE_WSPIAPI_H+# include <wspiapi.h>+#endif"++# Safety check: Ensure that we are in the correct source directory.+++ac_config_headers="$ac_config_headers include/HsNetworkConfig.h"+++ac_aux_dir=+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do+ if test -f "$ac_dir/install-sh"; then+ ac_aux_dir=$ac_dir+ ac_install_sh="$ac_aux_dir/install-sh -c"+ break+ elif test -f "$ac_dir/install.sh"; then+ ac_aux_dir=$ac_dir+ ac_install_sh="$ac_aux_dir/install.sh -c"+ break+ elif test -f "$ac_dir/shtool"; then+ ac_aux_dir=$ac_dir+ ac_install_sh="$ac_aux_dir/shtool install -c"+ break+ fi+done+if test -z "$ac_aux_dir"; then+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5+fi++# These three variables are undocumented and unsupported,+# and are intended to be withdrawn in a future Autoconf release.+# They can cause serious problems if a builder's source tree is in a directory+# whose full name contains unusual characters.+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.+++# Make sure we can run config.sub.+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5+$as_echo_n "checking build system type... " >&6; }+if ${ac_cv_build+:} false; then :+ $as_echo_n "(cached) " >&6+else+ ac_build_alias=$build_alias+test "x$ac_build_alias" = x &&+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`+test "x$ac_build_alias" = x &&+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5++fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5+$as_echo "$ac_cv_build" >&6; }+case $ac_cv_build in+*-*-*) ;;+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;+esac+build=$ac_cv_build+ac_save_IFS=$IFS; IFS='-'+set x $ac_cv_build+shift+build_cpu=$1+build_vendor=$2+shift; shift+# Remember, the first character of IFS is used to create $*,+# except with old shells:+build_os=$*+IFS=$ac_save_IFS+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac+++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5+$as_echo_n "checking host system type... " >&6; }+if ${ac_cv_host+:} false; then :+ $as_echo_n "(cached) " >&6+else+ if test "x$host_alias" = x; then+ ac_cv_host=$ac_cv_build+else+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5+fi++fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5+$as_echo "$ac_cv_host" >&6; }+case $ac_cv_host in+*-*-*) ;;+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;+esac+host=$ac_cv_host+ac_save_IFS=$IFS; IFS='-'+set x $ac_cv_host+shift+host_cpu=$1+host_vendor=$2+shift; shift+# Remember, the first character of IFS is used to create $*,+# except with old shells:+host_os=$*+IFS=$ac_save_IFS+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac+++++# Check whether --with-cc was given.+if test "${with_cc+set}" = set; then :+ withval=$with_cc; CC=$withval+fi++ac_ext=c+ac_cpp='$CPP $CPPFLAGS'+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'+ac_compiler_gnu=$ac_cv_c_compiler_gnu+if test -n "$ac_tool_prefix"; then+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.+set dummy ${ac_tool_prefix}gcc; ac_word=$2+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+$as_echo_n "checking for $ac_word... " >&6; }+if ${ac_cv_prog_CC+:} false; then :+ $as_echo_n "(cached) " >&6+else+ if test -n "$CC"; then+ ac_cv_prog_CC="$CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ for ac_exec_ext in '' $ac_executable_extensions; do+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then+ ac_cv_prog_CC="${ac_tool_prefix}gcc"+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5+ break 2+ fi+done+ done+IFS=$as_save_IFS++fi+fi+CC=$ac_cv_prog_CC+if test -n "$CC"; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5+$as_echo "$CC" >&6; }+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+fi+++fi+if test -z "$ac_cv_prog_CC"; then+ ac_ct_CC=$CC+ # Extract the first word of "gcc", so it can be a program name with args.+set dummy gcc; ac_word=$2+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+$as_echo_n "checking for $ac_word... " >&6; }+if ${ac_cv_prog_ac_ct_CC+:} false; then :+ $as_echo_n "(cached) " >&6+else+ if test -n "$ac_ct_CC"; then+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ for ac_exec_ext in '' $ac_executable_extensions; do+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then+ ac_cv_prog_ac_ct_CC="gcc"+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5+ break 2+ fi+done+ done+IFS=$as_save_IFS++fi+fi+ac_ct_CC=$ac_cv_prog_ac_ct_CC+if test -n "$ac_ct_CC"; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5+$as_echo "$ac_ct_CC" >&6; }+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+fi++ if test "x$ac_ct_CC" = x; then+ CC=""+ else+ case $cross_compiling:$ac_tool_warned in+yes:)+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}+ac_tool_warned=yes ;;+esac+ CC=$ac_ct_CC+ fi+else+ CC="$ac_cv_prog_CC"+fi++if test -z "$CC"; then+ if test -n "$ac_tool_prefix"; then+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.+set dummy ${ac_tool_prefix}cc; ac_word=$2+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+$as_echo_n "checking for $ac_word... " >&6; }+if ${ac_cv_prog_CC+:} false; then :+ $as_echo_n "(cached) " >&6+else+ if test -n "$CC"; then+ ac_cv_prog_CC="$CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ for ac_exec_ext in '' $ac_executable_extensions; do+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then+ ac_cv_prog_CC="${ac_tool_prefix}cc"+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5+ break 2+ fi+done+ done+IFS=$as_save_IFS++fi+fi+CC=$ac_cv_prog_CC+if test -n "$CC"; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5+$as_echo "$CC" >&6; }+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+fi+++ fi+fi+if test -z "$CC"; then+ # Extract the first word of "cc", so it can be a program name with args.+set dummy cc; ac_word=$2+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+$as_echo_n "checking for $ac_word... " >&6; }+if ${ac_cv_prog_CC+:} false; then :+ $as_echo_n "(cached) " >&6+else+ if test -n "$CC"; then+ ac_cv_prog_CC="$CC" # Let the user override the test.+else+ ac_prog_rejected=no+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ for ac_exec_ext in '' $ac_executable_extensions; do+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then+ ac_prog_rejected=yes+ continue+ fi+ ac_cv_prog_CC="cc"+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5+ break 2+ fi+done+ done+IFS=$as_save_IFS++if test $ac_prog_rejected = yes; then+ # We found a bogon in the path, so make sure we never use it.+ set dummy $ac_cv_prog_CC+ shift+ if test $# != 0; then+ # We chose a different compiler from the bogus one.+ # However, it has the same basename, so the bogon will be chosen+ # first if we set CC to just the basename; use the full file name.+ shift+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"+ fi+fi+fi+fi+CC=$ac_cv_prog_CC+if test -n "$CC"; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5+$as_echo "$CC" >&6; }+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+fi+++fi+if test -z "$CC"; then+ if test -n "$ac_tool_prefix"; then+ for ac_prog in cl.exe+ do+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.+set dummy $ac_tool_prefix$ac_prog; ac_word=$2+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+$as_echo_n "checking for $ac_word... " >&6; }+if ${ac_cv_prog_CC+:} false; then :+ $as_echo_n "(cached) " >&6+else+ if test -n "$CC"; then+ ac_cv_prog_CC="$CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ for ac_exec_ext in '' $ac_executable_extensions; do+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5+ break 2+ fi+done+ done+IFS=$as_save_IFS++fi+fi+CC=$ac_cv_prog_CC+if test -n "$CC"; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5+$as_echo "$CC" >&6; }+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+fi+++ test -n "$CC" && break+ done+fi+if test -z "$CC"; then+ ac_ct_CC=$CC+ for ac_prog in cl.exe+do+ # Extract the first word of "$ac_prog", so it can be a program name with args.+set dummy $ac_prog; ac_word=$2+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+$as_echo_n "checking for $ac_word... " >&6; }+if ${ac_cv_prog_ac_ct_CC+:} false; then :+ $as_echo_n "(cached) " >&6+else+ if test -n "$ac_ct_CC"; then+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ for ac_exec_ext in '' $ac_executable_extensions; do+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then+ ac_cv_prog_ac_ct_CC="$ac_prog"+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5+ break 2+ fi+done+ done+IFS=$as_save_IFS++fi+fi+ac_ct_CC=$ac_cv_prog_ac_ct_CC+if test -n "$ac_ct_CC"; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5+$as_echo "$ac_ct_CC" >&6; }+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+fi+++ test -n "$ac_ct_CC" && break+done++ if test "x$ac_ct_CC" = x; then+ CC=""+ else+ case $cross_compiling:$ac_tool_warned in+yes:)+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}+ac_tool_warned=yes ;;+esac+ CC=$ac_ct_CC+ fi+fi++fi+++test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}+as_fn_error $? "no acceptable C compiler found in \$PATH+See \`config.log' for more details" "$LINENO" 5; }++# Provide some information about the compiler.+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5+set X $ac_compile+ac_compiler=$2+for ac_option in --version -v -V -qversion; do+ { { ac_try="$ac_compiler $ac_option >&5"+case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err+ ac_status=$?+ if test -s conftest.err; then+ sed '10a\+... rest of stderr output deleted ...+ 10q' conftest.err >conftest.er1+ cat conftest.er1 >&5+ fi+ rm -f conftest.er1 conftest.err+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; }+done++cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */++int+main ()+{++ ;+ return 0;+}+_ACEOF+ac_clean_files_save=$ac_clean_files+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"+# Try to create an executable without -o first, disregard a.out.+# It will help us diagnose broken compilers, and finding out an intuition+# of exeext.+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5+$as_echo_n "checking whether the C compiler works... " >&6; }+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`++# The possible output files:+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"++ac_rmfiles=+for ac_file in $ac_files+do+ case $ac_file in+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;+ esac+done+rm -f $ac_rmfiles++if { { ac_try="$ac_link_default"+case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_link_default") 2>&5+ ac_status=$?+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; }; then :+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'+# in a Makefile. We should not override ac_cv_exeext if it was cached,+# so that the user can short-circuit this test for compilers unknown to+# Autoconf.+for ac_file in $ac_files ''+do+ test -f "$ac_file" || continue+ case $ac_file in+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )+ ;;+ [ab].out )+ # We found the default executable, but exeext='' is most+ # certainly right.+ break;;+ *.* )+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;+ then :; else+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`+ fi+ # We set ac_cv_exeext here because the later test for it is not+ # safe: cross compilers may not add the suffix if given an `-o'+ # argument, so we may need to know it at that point already.+ # Even if this section looks crufty: it has the advantage of+ # actually working.+ break;;+ * )+ break;;+ esac+done+test "$ac_cv_exeext" = no && ac_cv_exeext=++else+ ac_file=''+fi+if test -z "$ac_file"; then :+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+$as_echo "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}+as_fn_error 77 "C compiler cannot create executables+See \`config.log' for more details" "$LINENO" 5; }+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5+$as_echo "yes" >&6; }+fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5+$as_echo_n "checking for C compiler default output file name... " >&6; }+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5+$as_echo "$ac_file" >&6; }+ac_exeext=$ac_cv_exeext++rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out+ac_clean_files=$ac_clean_files_save+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5+$as_echo_n "checking for suffix of executables... " >&6; }+if { { ac_try="$ac_link"+case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_link") 2>&5+ ac_status=$?+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; }; then :+ # If both `conftest.exe' and `conftest' are `present' (well, observable)+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will+# work properly (i.e., refer to `conftest.exe'), while it won't with+# `rm'.+for ac_file in conftest.exe conftest conftest.*; do+ test -f "$ac_file" || continue+ case $ac_file in+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`+ break;;+ * ) break;;+ esac+done+else+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}+as_fn_error $? "cannot compute suffix of executables: cannot compile and link+See \`config.log' for more details" "$LINENO" 5; }+fi+rm -f conftest conftest$ac_cv_exeext+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5+$as_echo "$ac_cv_exeext" >&6; }++rm -f conftest.$ac_ext+EXEEXT=$ac_cv_exeext+ac_exeext=$EXEEXT+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <stdio.h>+int+main ()+{+FILE *f = fopen ("conftest.out", "w");+ return ferror (f) || fclose (f) != 0;++ ;+ return 0;+}+_ACEOF+ac_clean_files="$ac_clean_files conftest.out"+# Check that the compiler produces executables we can run. If not, either+# the compiler is broken, or we cross compile.+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5+$as_echo_n "checking whether we are cross compiling... " >&6; }+if test "$cross_compiling" != yes; then+ { { ac_try="$ac_link"+case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_link") 2>&5+ ac_status=$?+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; }+ if { ac_try='./conftest$ac_cv_exeext'+ { { case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_try") 2>&5+ ac_status=$?+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; }; }; then+ cross_compiling=no+ else+ if test "$cross_compiling" = maybe; then+ cross_compiling=yes+ else+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}+as_fn_error $? "cannot run C compiled programs.+If you meant to cross compile, use \`--host'.+See \`config.log' for more details" "$LINENO" 5; }+ fi+ fi+fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5+$as_echo "$cross_compiling" >&6; }++rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out+ac_clean_files=$ac_clean_files_save+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5+$as_echo_n "checking for suffix of object files... " >&6; }+if ${ac_cv_objext+:} false; then :+ $as_echo_n "(cached) " >&6+else+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */++int+main ()+{++ ;+ return 0;+}+_ACEOF+rm -f conftest.o conftest.obj+if { { ac_try="$ac_compile"+case "(($ac_try" in+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+ *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+$as_echo "$ac_try_echo"; } >&5+ (eval "$ac_compile") 2>&5+ ac_status=$?+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+ test $ac_status = 0; }; then :+ for ac_file in conftest.o conftest.obj conftest.*; do+ test -f "$ac_file" || continue;+ case $ac_file in+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`+ break;;+ esac+done+else+ $as_echo "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}+as_fn_error $? "cannot compute suffix of object files: cannot compile+See \`config.log' for more details" "$LINENO" 5; }+fi+rm -f conftest.$ac_cv_objext conftest.$ac_ext+fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5+$as_echo "$ac_cv_objext" >&6; }+OBJEXT=$ac_cv_objext+ac_objext=$OBJEXT+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }+if ${ac_cv_c_compiler_gnu+:} false; then :+ $as_echo_n "(cached) " >&6+else+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */++int+main ()+{+#ifndef __GNUC__+ choke me+#endif++ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ ac_compiler_gnu=yes+else+ ac_compiler_gnu=no+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+ac_cv_c_compiler_gnu=$ac_compiler_gnu++fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5+$as_echo "$ac_cv_c_compiler_gnu" >&6; }+if test $ac_compiler_gnu = yes; then+ GCC=yes+else+ GCC=+fi+ac_test_CFLAGS=${CFLAGS+set}+ac_save_CFLAGS=$CFLAGS+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5+$as_echo_n "checking whether $CC accepts -g... " >&6; }+if ${ac_cv_prog_cc_g+:} false; then :+ $as_echo_n "(cached) " >&6+else+ ac_save_c_werror_flag=$ac_c_werror_flag+ ac_c_werror_flag=yes+ ac_cv_prog_cc_g=no+ CFLAGS="-g"+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */++int+main ()+{++ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ ac_cv_prog_cc_g=yes+else+ CFLAGS=""+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */++int+main ()+{++ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :++else+ ac_c_werror_flag=$ac_save_c_werror_flag+ CFLAGS="-g"+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */++int+main ()+{++ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ ac_cv_prog_cc_g=yes+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+ ac_c_werror_flag=$ac_save_c_werror_flag+fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5+$as_echo "$ac_cv_prog_cc_g" >&6; }+if test "$ac_test_CFLAGS" = set; then+ CFLAGS=$ac_save_CFLAGS+elif test $ac_cv_prog_cc_g = yes; then+ if test "$GCC" = yes; then+ CFLAGS="-g -O2"+ else+ CFLAGS="-g"+ fi+else+ if test "$GCC" = yes; then+ CFLAGS="-O2"+ else+ CFLAGS=+ fi+fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }+if ${ac_cv_prog_cc_c89+:} false; then :+ $as_echo_n "(cached) " >&6+else+ ac_cv_prog_cc_c89=no+ac_save_CC=$CC+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <stdarg.h>+#include <stdio.h>+struct stat;+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */+struct buf { int x; };+FILE * (*rcsopen) (struct buf *, struct stat *, int);+static char *e (p, i)+ char **p;+ int i;+{+ return p[i];+}+static char *f (char * (*g) (char **, int), char **p, ...)+{+ char *s;+ va_list v;+ va_start (v,p);+ s = g (p, va_arg (v,int));+ va_end (v);+ return s;+}++/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has+ function prototypes and stuff, but not '\xHH' hex character constants.+ These don't provoke an error unfortunately, instead are silently treated+ as 'x'. The following induces an error, until -std is added to get+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an+ array size at least. It's necessary to write '\x00'==0 to get something+ that's true only with -std. */+int osf4_cc_array ['\x00' == 0 ? 1 : -1];++/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters+ inside strings and character constants. */+#define FOO(x) 'x'+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];++int test (int i, double x);+struct s1 {int (*f) (int a);};+struct s2 {int (*f) (double a);};+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);+int argc;+char **argv;+int+main ()+{+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];+ ;+ return 0;+}+_ACEOF+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"+do+ CC="$ac_save_CC $ac_arg"+ if ac_fn_c_try_compile "$LINENO"; then :+ ac_cv_prog_cc_c89=$ac_arg+fi+rm -f core conftest.err conftest.$ac_objext+ test "x$ac_cv_prog_cc_c89" != "xno" && break+done+rm -f conftest.$ac_ext+CC=$ac_save_CC++fi+# AC_CACHE_VAL+case "x$ac_cv_prog_cc_c89" in+ x)+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5+$as_echo "none needed" >&6; } ;;+ xno)+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5+$as_echo "unsupported" >&6; } ;;+ *)+ CC="$CC $ac_cv_prog_cc_c89"+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;+esac+if test "x$ac_cv_prog_cc_c89" != xno; then :++fi++ac_ext=c+ac_cpp='$CPP $CPPFLAGS'+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'+ac_compiler_gnu=$ac_cv_c_compiler_gnu++++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }+if ${ac_cv_c_const+:} false; then :+ $as_echo_n "(cached) " >&6+else+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */++int+main ()+{++#ifndef __cplusplus+ /* Ultrix mips cc rejects this sort of thing. */+ typedef int charset[2];+ const charset cs = { 0, 0 };+ /* SunOS 4.1.1 cc rejects this. */+ char const *const *pcpcc;+ char **ppc;+ /* NEC SVR4.0.2 mips cc rejects this. */+ struct point {int x, y;};+ static struct point const zero = {0,0};+ /* AIX XL C 1.02.0.0 rejects this.+ It does not let you subtract one const X* pointer from another in+ an arm of an if-expression whose if-part is not a constant+ expression */+ const char *g = "string";+ pcpcc = &g + (g ? g-g : 0);+ /* HPUX 7.0 cc rejects these. */+ ++pcpcc;+ ppc = (char**) pcpcc;+ pcpcc = (char const *const *) ppc;+ { /* SCO 3.2v4 cc rejects this sort of thing. */+ char tx;+ char *t = &tx;+ char const *s = 0 ? (char *) 0 : (char const *) 0;++ *t++ = 0;+ if (s) return 0;+ }+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */+ int x[] = {25, 17};+ const int *foo = &x[0];+ ++foo;+ }+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */+ typedef const int *iptr;+ iptr p = 0;+ ++p;+ }+ { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */+ struct s { int j; const int *ap[3]; } bx;+ struct s *b = &bx; b->j = 5;+ }+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */+ const int foo = 10;+ if (!foo) return 0;+ }+ return !cs[0] && !zero.x;+#endif++ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ ac_cv_c_const=yes+else+ ac_cv_c_const=no+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5+$as_echo "$ac_cv_c_const" >&6; }+if test $ac_cv_c_const = no; then++$as_echo "#define const /**/" >>confdefs.h++fi+++ac_ext=c+ac_cpp='$CPP $CPPFLAGS'+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'+ac_compiler_gnu=$ac_cv_c_compiler_gnu+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5+$as_echo_n "checking how to run the C preprocessor... " >&6; }+# On Suns, sometimes $CPP names a directory.+if test -n "$CPP" && test -d "$CPP"; then+ CPP=+fi+if test -z "$CPP"; then+ if ${ac_cv_prog_CPP+:} false; then :+ $as_echo_n "(cached) " >&6+else+ # Double quotes because CPP needs to be expanded+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"+ do+ ac_preproc_ok=false+for ac_c_preproc_warn_flag in '' yes+do+ # Use a header file that comes with gcc, so configuring glibc+ # with a fresh cross-compiler works.+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since+ # <limits.h> exists even on freestanding compilers.+ # On the NeXT, cc -E runs the code through the compiler's parser,+ # not just through cpp. "Syntax error" is here to catch this case.+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#ifdef __STDC__+# include <limits.h>+#else+# include <assert.h>+#endif+ Syntax error+_ACEOF+if ac_fn_c_try_cpp "$LINENO"; then :++else+ # Broken: fails on valid input.+continue+fi+rm -f conftest.err conftest.i conftest.$ac_ext++ # OK, works on sane cases. Now check whether nonexistent headers+ # can be detected and how.+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <ac_nonexistent.h>+_ACEOF+if ac_fn_c_try_cpp "$LINENO"; then :+ # Broken: success on invalid input.+continue+else+ # Passes both tests.+ac_preproc_ok=:+break+fi+rm -f conftest.err conftest.i conftest.$ac_ext++done+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.+rm -f conftest.i conftest.err conftest.$ac_ext+if $ac_preproc_ok; then :+ break+fi++ done+ ac_cv_prog_CPP=$CPP++fi+ CPP=$ac_cv_prog_CPP+else+ ac_cv_prog_CPP=$CPP+fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5+$as_echo "$CPP" >&6; }+ac_preproc_ok=false+for ac_c_preproc_warn_flag in '' yes+do+ # Use a header file that comes with gcc, so configuring glibc+ # with a fresh cross-compiler works.+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since+ # <limits.h> exists even on freestanding compilers.+ # On the NeXT, cc -E runs the code through the compiler's parser,+ # not just through cpp. "Syntax error" is here to catch this case.+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#ifdef __STDC__+# include <limits.h>+#else+# include <assert.h>+#endif+ Syntax error+_ACEOF+if ac_fn_c_try_cpp "$LINENO"; then :++else+ # Broken: fails on valid input.+continue+fi+rm -f conftest.err conftest.i conftest.$ac_ext++ # OK, works on sane cases. Now check whether nonexistent headers+ # can be detected and how.+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <ac_nonexistent.h>+_ACEOF+if ac_fn_c_try_cpp "$LINENO"; then :+ # Broken: success on invalid input.+continue+else+ # Passes both tests.+ac_preproc_ok=:+break+fi+rm -f conftest.err conftest.i conftest.$ac_ext++done+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.+rm -f conftest.i conftest.err conftest.$ac_ext+if $ac_preproc_ok; then :++else+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check+See \`config.log' for more details" "$LINENO" 5; }+fi++ac_ext=c+ac_cpp='$CPP $CPPFLAGS'+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'+ac_compiler_gnu=$ac_cv_c_compiler_gnu+++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }+if ${ac_cv_path_GREP+:} false; then :+ $as_echo_n "(cached) " >&6+else+ if test -z "$GREP"; then+ ac_path_GREP_found=false+ # Loop through the user's path and test for each of PROGNAME-LIST+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ for ac_prog in grep ggrep; do+ for ac_exec_ext in '' $ac_executable_extensions; do+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"+ as_fn_executable_p "$ac_path_GREP" || continue+# Check for GNU ac_path_GREP and select it if it is found.+ # Check for GNU $ac_path_GREP+case `"$ac_path_GREP" --version 2>&1` in+*GNU*)+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;+*)+ ac_count=0+ $as_echo_n 0123456789 >"conftest.in"+ while :+ do+ cat "conftest.in" "conftest.in" >"conftest.tmp"+ mv "conftest.tmp" "conftest.in"+ cp "conftest.in" "conftest.nl"+ $as_echo 'GREP' >> "conftest.nl"+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break+ as_fn_arith $ac_count + 1 && ac_count=$as_val+ if test $ac_count -gt ${ac_path_GREP_max-0}; then+ # Best one so far, save it but keep looking for a better one+ ac_cv_path_GREP="$ac_path_GREP"+ ac_path_GREP_max=$ac_count+ fi+ # 10*(2^10) chars as input seems more than enough+ test $ac_count -gt 10 && break+ done+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;+esac++ $ac_path_GREP_found && break 3+ done+ done+ done+IFS=$as_save_IFS+ if test -z "$ac_cv_path_GREP"; then+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5+ fi+else+ ac_cv_path_GREP=$GREP+fi++fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5+$as_echo "$ac_cv_path_GREP" >&6; }+ GREP="$ac_cv_path_GREP"+++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5+$as_echo_n "checking for egrep... " >&6; }+if ${ac_cv_path_EGREP+:} false; then :+ $as_echo_n "(cached) " >&6+else+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1+ then ac_cv_path_EGREP="$GREP -E"+ else+ if test -z "$EGREP"; then+ ac_path_EGREP_found=false+ # Loop through the user's path and test for each of PROGNAME-LIST+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ for ac_prog in egrep; do+ for ac_exec_ext in '' $ac_executable_extensions; do+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"+ as_fn_executable_p "$ac_path_EGREP" || continue+# Check for GNU ac_path_EGREP and select it if it is found.+ # Check for GNU $ac_path_EGREP+case `"$ac_path_EGREP" --version 2>&1` in+*GNU*)+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;+*)+ ac_count=0+ $as_echo_n 0123456789 >"conftest.in"+ while :+ do+ cat "conftest.in" "conftest.in" >"conftest.tmp"+ mv "conftest.tmp" "conftest.in"+ cp "conftest.in" "conftest.nl"+ $as_echo 'EGREP' >> "conftest.nl"+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break+ as_fn_arith $ac_count + 1 && ac_count=$as_val+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then+ # Best one so far, save it but keep looking for a better one+ ac_cv_path_EGREP="$ac_path_EGREP"+ ac_path_EGREP_max=$ac_count+ fi+ # 10*(2^10) chars as input seems more than enough+ test $ac_count -gt 10 && break+ done+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;+esac++ $ac_path_EGREP_found && break 3+ done+ done+ done+IFS=$as_save_IFS+ if test -z "$ac_cv_path_EGREP"; then+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5+ fi+else+ ac_cv_path_EGREP=$EGREP+fi++ fi+fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5+$as_echo "$ac_cv_path_EGREP" >&6; }+ EGREP="$ac_cv_path_EGREP"+++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5+$as_echo_n "checking for ANSI C header files... " >&6; }+if ${ac_cv_header_stdc+:} false; then :+ $as_echo_n "(cached) " >&6+else+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <stdlib.h>+#include <stdarg.h>+#include <string.h>+#include <float.h>++int+main ()+{++ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ ac_cv_header_stdc=yes+else+ ac_cv_header_stdc=no+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext++if test $ac_cv_header_stdc = yes; then+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <string.h>++_ACEOF+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |+ $EGREP "memchr" >/dev/null 2>&1; then :++else+ ac_cv_header_stdc=no+fi+rm -f conftest*++fi++if test $ac_cv_header_stdc = yes; then+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <stdlib.h>++_ACEOF+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |+ $EGREP "free" >/dev/null 2>&1; then :++else+ ac_cv_header_stdc=no+fi+rm -f conftest*++fi++if test $ac_cv_header_stdc = yes; then+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.+ if test "$cross_compiling" = yes; then :+ :+else+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <ctype.h>+#include <stdlib.h>+#if ((' ' & 0x0FF) == 0x020)+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))+#else+# define ISLOWER(c) \+ (('a' <= (c) && (c) <= 'i') \+ || ('j' <= (c) && (c) <= 'r') \+ || ('s' <= (c) && (c) <= 'z'))+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))+#endif++#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))+int+main ()+{+ int i;+ for (i = 0; i < 256; i++)+ if (XOR (islower (i), ISLOWER (i))+ || toupper (i) != TOUPPER (i))+ return 2;+ return 0;+}+_ACEOF+if ac_fn_c_try_run "$LINENO"; then :++else+ ac_cv_header_stdc=no+fi+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \+ conftest.$ac_objext conftest.beam conftest.$ac_ext+fi++fi+fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5+$as_echo "$ac_cv_header_stdc" >&6; }+if test $ac_cv_header_stdc = yes; then++$as_echo "#define STDC_HEADERS 1" >>confdefs.h++fi++# On IRIX 5.3, sys/types and inttypes.h are conflicting.+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \+ inttypes.h stdint.h unistd.h+do :+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default+"+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :+ cat >>confdefs.h <<_ACEOF+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1+_ACEOF++fi++done+++for ac_header in fcntl.h limits.h stdlib.h sys/types.h unistd.h winsock2.h ws2tcpip.h wspiapi.h+do :+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :+ cat >>confdefs.h <<_ACEOF+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1+_ACEOF++fi++done++for ac_header in arpa/inet.h netdb.h netinet/in.h netinet/tcp.h sys/socket.h sys/uio.h sys/un.h+do :+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :+ cat >>confdefs.h <<_ACEOF+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1+_ACEOF++fi++done+++for ac_func in readlink symlink+do :+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :+ cat >>confdefs.h <<_ACEOF+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1+_ACEOF++fi+done+++ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_control" "ac_cv_member_struct_msghdr_msg_control" "#if HAVE_SYS_TYPES_H+# include <sys/types.h>+#endif+#if HAVE_SYS_SOCKET_H+# include <sys/socket.h>+#endif+#if HAVE_SYS_UIO_H+# include <sys/uio.h>+#endif+"+if test "x$ac_cv_member_struct_msghdr_msg_control" = xyes; then :++cat >>confdefs.h <<_ACEOF+#define HAVE_STRUCT_MSGHDR_MSG_CONTROL 1+_ACEOF+++fi+ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_accrights" "ac_cv_member_struct_msghdr_msg_accrights" "#if HAVE_SYS_TYPES_H+# include <sys/types.h>+#endif+#if HAVE_SYS_SOCKET_H+# include <sys/socket.h>+#endif+#if HAVE_SYS_UIO_H+# include <sys/uio.h>+#endif+"+if test "x$ac_cv_member_struct_msghdr_msg_accrights" = xyes; then :++cat >>confdefs.h <<_ACEOF+#define HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS 1+_ACEOF+++fi+++ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "#if HAVE_SYS_TYPES_H+# include <sys/types.h>+#endif+#if HAVE_SYS_SOCKET_H+# include <sys/socket.h>+#endif+"+if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes; then :++cat >>confdefs.h <<_ACEOF+#define HAVE_STRUCT_SOCKADDR_SA_LEN 1+_ACEOF+++fi+++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for in_addr_t in netinet/in.h" >&5+$as_echo_n "checking for in_addr_t in netinet/in.h... " >&6; }+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <netinet/in.h>++_ACEOF+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |+ $EGREP "in_addr_t" >/dev/null 2>&1; then :++$as_echo "#define HAVE_IN_ADDR_T 1" >>confdefs.h+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5+$as_echo "yes" >&6; }+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+fi+rm -f conftest*+++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SO_PEERCRED and struct ucred in sys/socket.h" >&5+$as_echo_n "checking for SO_PEERCRED and struct ucred in sys/socket.h... " >&6; }+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <sys/types.h>+#include <sys/socket.h>+#ifndef SO_PEERCRED+# error no SO_PEERCRED+#endif+struct ucred u;+int+main ()+{++ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ ac_cv_ucred=yes+else+ ac_cv_ucred=no+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+if test "x$ac_cv_ucred" = xno; then+ old_CFLAGS="$CFLAGS"+ CFLAGS="-D_GNU_SOURCE $CFLAGS"+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <sys/types.h>+#include <sys/socket.h>+#ifndef SO_PEERCRED+# error no SO_PEERCRED+#endif+struct ucred u;+int+main ()+{++ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :+ ac_cv_ucred=yes+else+ ac_cv_ucred=no+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+ if test "x$ac_cv_ucred" = xyes; then+ EXTRA_CPPFLAGS=-D_GNU_SOURCE+ fi+else+ old_CFLAGS="$CFLAGS"+fi+if test "x$ac_cv_ucred" = xno; then+ CFLAGS="$old_CFLAGS"+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+else++$as_echo "#define HAVE_STRUCT_UCRED 1" >>confdefs.h++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5+$as_echo "yes" >&6; }+fi++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _head_libws2_32_a in -lws2_32" >&5+$as_echo_n "checking for _head_libws2_32_a in -lws2_32... " >&6; }+if ${ac_cv_lib_ws2_32__head_libws2_32_a+:} false; then :+ $as_echo_n "(cached) " >&6+else+ ac_check_lib_save_LIBS=$LIBS+LIBS="-lws2_32 $LIBS"+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */++/* Override any GCC internal prototype to avoid an error.+ Use char because int might match the return type of a GCC+ builtin and then its argument prototype would still apply. */+#ifdef __cplusplus+extern "C"+#endif+char _head_libws2_32_a ();+int+main ()+{+return _head_libws2_32_a ();+ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_link "$LINENO"; then :+ ac_cv_lib_ws2_32__head_libws2_32_a=yes+else+ ac_cv_lib_ws2_32__head_libws2_32_a=no+fi+rm -f core conftest.err conftest.$ac_objext \+ conftest$ac_exeext conftest.$ac_ext+LIBS=$ac_check_lib_save_LIBS+fi+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ws2_32__head_libws2_32_a" >&5+$as_echo "$ac_cv_lib_ws2_32__head_libws2_32_a" >&6; }+if test "x$ac_cv_lib_ws2_32__head_libws2_32_a" = xyes; then :+ cat >>confdefs.h <<_ACEOF+#define HAVE_LIBWS2_32 1+_ACEOF++ LIBS="-lws2_32 $LIBS"++fi+++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5+$as_echo_n "checking for getaddrinfo... " >&6; }+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+$ac_includes_default+int testme(){ getaddrinfo; }+int+main ()+{++ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :++$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h+ ac_have_getaddrinfo=yes; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5+$as_echo "yes" >&6; }+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext++if test "x$ac_have_getaddrinfo" = x; then+ old_CFLAGS="$CFLAGS"+ if test "z$ac_cv_lib_ws2_32__head_libws2_32_a" = zyes; then+ CFLAGS="-DWINVER=0x0501 $CFLAGS"+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo if WINVER is 0x0501" >&5+$as_echo_n "checking for getaddrinfo if WINVER is 0x0501... " >&6; }+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+$ac_includes_default+ int testme(){ getaddrinfo; }+int+main ()+{++ ;+ return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"; then :++$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h++$as_echo "#define NEED_WINVER_XP 1" >>confdefs.h+ EXTRA_CPPFLAGS="-DWINVER=0x0501 $EXTRA_CPPFLAGS"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5+$as_echo "yes" >&6; }+else+ CFLAGS="$old_CFLAGS"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+fi+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext+ fi+fi++for ac_func in gai_strerror+do :+ ac_fn_c_check_func "$LINENO" "gai_strerror" "ac_cv_func_gai_strerror"+if test "x$ac_cv_func_gai_strerror" = xyes; then :+ cat >>confdefs.h <<_ACEOF+#define HAVE_GAI_STRERROR 1+_ACEOF++fi+done+++ac_fn_c_check_decl "$LINENO" "AI_ADDRCONFIG" "ac_cv_have_decl_AI_ADDRCONFIG" "$ac_includes_default"+if test "x$ac_cv_have_decl_AI_ADDRCONFIG" = xyes; then :+ ac_have_decl=1+else+ ac_have_decl=0+fi++cat >>confdefs.h <<_ACEOF+#define HAVE_DECL_AI_ADDRCONFIG $ac_have_decl+_ACEOF+ac_fn_c_check_decl "$LINENO" "AI_ALL" "ac_cv_have_decl_AI_ALL" "$ac_includes_default"+if test "x$ac_cv_have_decl_AI_ALL" = xyes; then :+ ac_have_decl=1+else+ ac_have_decl=0+fi++cat >>confdefs.h <<_ACEOF+#define HAVE_DECL_AI_ALL $ac_have_decl+_ACEOF+ac_fn_c_check_decl "$LINENO" "AI_NUMERICSERV" "ac_cv_have_decl_AI_NUMERICSERV" "$ac_includes_default"+if test "x$ac_cv_have_decl_AI_NUMERICSERV" = xyes; then :+ ac_have_decl=1+else+ ac_have_decl=0+fi++cat >>confdefs.h <<_ACEOF+#define HAVE_DECL_AI_NUMERICSERV $ac_have_decl+_ACEOF+ac_fn_c_check_decl "$LINENO" "AI_V4MAPPED" "ac_cv_have_decl_AI_V4MAPPED" "$ac_includes_default"+if test "x$ac_cv_have_decl_AI_V4MAPPED" = xyes; then :+ ac_have_decl=1+else+ ac_have_decl=0+fi++cat >>confdefs.h <<_ACEOF+#define HAVE_DECL_AI_V4MAPPED $ac_have_decl+_ACEOF+++ac_fn_c_check_decl "$LINENO" "IPV6_V6ONLY" "ac_cv_have_decl_IPV6_V6ONLY" "$ac_includes_default"+if test "x$ac_cv_have_decl_IPV6_V6ONLY" = xyes; then :+ ac_have_decl=1+else+ ac_have_decl=0+fi++cat >>confdefs.h <<_ACEOF+#define HAVE_DECL_IPV6_V6ONLY $ac_have_decl+_ACEOF+++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sendfile in sys/sendfile.h" >&5+$as_echo_n "checking for sendfile in sys/sendfile.h... " >&6; }+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <sys/sendfile.h>++_ACEOF+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |+ $EGREP "sendfile" >/dev/null 2>&1; then :++$as_echo "#define HAVE_LINUX_SENDFILE 1" >>confdefs.h+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5+$as_echo "yes" >&6; }+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+fi+rm -f conftest*+++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sendfile in sys/socket.h" >&5+$as_echo_n "checking for sendfile in sys/socket.h... " >&6; }+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h. */+#include <sys/socket.h>++_ACEOF+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |+ $EGREP "sendfile" >/dev/null 2>&1; then :++$as_echo "#define HAVE_BSD_SENDFILE 1" >>confdefs.h+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5+$as_echo "yes" >&6; }+else+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5+$as_echo "no" >&6; }+fi+rm -f conftest*+++for ac_func in gethostent+do :+ ac_fn_c_check_func "$LINENO" "gethostent" "ac_cv_func_gethostent"+if test "x$ac_cv_func_gethostent" = xyes; then :+ cat >>confdefs.h <<_ACEOF+#define HAVE_GETHOSTENT 1+_ACEOF++fi+done+++for ac_func in accept4+do :+ ac_fn_c_check_func "$LINENO" "accept4" "ac_cv_func_accept4"+if test "x$ac_cv_func_accept4" = xyes; then :+ cat >>confdefs.h <<_ACEOF+#define HAVE_ACCEPT4 1+_ACEOF++fi+done+++case "$host" in+*-mingw32)+ EXTRA_SRCS="cbits/initWinSock.c, cbits/winSockErr.c, cbits/asyncAccept.c"+ EXTRA_LIBS=ws2_32+ CALLCONV=stdcall ;;+*-solaris2*)+ EXTRA_SRCS="cbits/ancilData.c"+ EXTRA_LIBS="nsl, socket"+ CALLCONV=ccall ;;+*)+ EXTRA_SRCS="cbits/ancilData.c"+ EXTRA_LIBS=+ CALLCONV=ccall ;;+esac++++++ac_config_files="$ac_config_files network.buildinfo"+++cat >confcache <<\_ACEOF+# This file is a shell script that caches the results of configure+# tests run on this system so they can be shared between configure+# scripts and configure runs, see configure's option --config-cache.+# It is not useful on other systems. If it contains results you don't+# want to keep, you may remove or edit it.+#+# config.status only pays attention to the cache file if you give it+# the --recheck option to rerun configure.+#+# `ac_cv_env_foo' variables (set or unset) will be overridden when+# loading this file, other *unset* `ac_cv_foo' will be assigned the+# following values.++_ACEOF++# The following way of writing the cache mishandles newlines in values,+# but we know of no workaround that is simple, portable, and efficient.+# So, we kill variables containing newlines.+# Ultrix sh set writes to stderr and can't be redirected directly,+# and sets the high bit in the cache file unless we assign to the vars.+(+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do+ eval ac_val=\$$ac_var+ case $ac_val in #(+ *${as_nl}*)+ case $ac_var in #(+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;+ esac+ case $ac_var in #(+ _ | IFS | as_nl) ;; #(+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(+ *) { eval $ac_var=; unset $ac_var;} ;;+ esac ;;+ esac+ done++ (set) 2>&1 |+ case $as_nl`(ac_space=' '; set) 2>&1` in #(+ *${as_nl}ac_space=\ *)+ # `set' does not quote correctly, so add quotes: double-quote+ # substitution turns \\\\ into \\, and sed turns \\ into \.+ sed -n \+ "s/'/'\\\\''/g;+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"+ ;; #(+ *)+ # `set' quotes correctly as required by POSIX, so do not add quotes.+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"+ ;;+ esac |+ sort+) |+ sed '+ /^ac_cv_env_/b end+ t clear+ :clear+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/+ t end+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/+ :end' >>confcache+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else+ if test -w "$cache_file"; then+ if test "x$cache_file" != "x/dev/null"; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5+$as_echo "$as_me: updating cache $cache_file" >&6;}+ if test ! -f "$cache_file" || test -h "$cache_file"; then+ cat confcache >"$cache_file"+ else+ case $cache_file in #(+ */* | ?:*)+ mv -f confcache "$cache_file"$$ &&+ mv -f "$cache_file"$$ "$cache_file" ;; #(+ *)+ mv -f confcache "$cache_file" ;;+ esac+ fi+ fi+ else+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}+ fi+fi+rm -f confcache++test "x$prefix" = xNONE && prefix=$ac_default_prefix+# Let make expand exec_prefix.+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'++DEFS=-DHAVE_CONFIG_H++ac_libobjs=+ac_ltlibobjs=+U=+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue+ # 1. Remove the extension, and $U if already installed.+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR+ # will be set to the directory where LIBOBJS objects are built.+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'+done+LIBOBJS=$ac_libobjs++LTLIBOBJS=$ac_ltlibobjs++++: "${CONFIG_STATUS=./config.status}"+ac_write_fail=0+ac_clean_files_save=$ac_clean_files+ac_clean_files="$ac_clean_files $CONFIG_STATUS"+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}+as_write_fail=0+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1+#! $SHELL+# Generated by $as_me.+# Run this file to recreate the current configuration.+# Compiler output produced by configure, useful for debugging+# configure, is in config.log if it exists.++debug=false+ac_cs_recheck=false+ac_cs_silent=false++SHELL=\${CONFIG_SHELL-$SHELL}+export SHELL+_ASEOF+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1+## -------------------- ##+## M4sh Initialization. ##+## -------------------- ##++# Be more Bourne compatible+DUALCASE=1; export DUALCASE # for MKS sh+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :+ emulate sh+ NULLCMD=:+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which+ # is contrary to our usage. Disable this feature.+ alias -g '${1+"$@"}'='"$@"'+ setopt NO_GLOB_SUBST+else+ case `(set -o) 2>/dev/null` in #(+ *posix*) :+ set -o posix ;; #(+ *) :+ ;;+esac+fi+++as_nl='+'+export as_nl+# Printing a long string crashes Solaris 7 /usr/bin/printf.+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo+# Prefer a ksh shell builtin over an external printf program on Solaris,+# but without wasting forks for bash or zsh.+if test -z "$BASH_VERSION$ZSH_VERSION" \+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then+ as_echo='print -r --'+ as_echo_n='print -rn --'+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then+ as_echo='printf %s\n'+ as_echo_n='printf %s'+else+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'+ as_echo_n='/usr/ucb/echo -n'+ else+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'+ as_echo_n_body='eval+ arg=$1;+ case $arg in #(+ *"$as_nl"*)+ expr "X$arg" : "X\\(.*\\)$as_nl";+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;+ esac;+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"+ '+ export as_echo_n_body+ as_echo_n='sh -c $as_echo_n_body as_echo'+ fi+ export as_echo_body+ as_echo='sh -c $as_echo_body as_echo'+fi++# The user is always right.+if test "${PATH_SEPARATOR+set}" != set; then+ PATH_SEPARATOR=:+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||+ PATH_SEPARATOR=';'+ }+fi+++# IFS+# We need space, tab and new line, in precisely that order. Quoting is+# there to prevent editors from complaining about space-tab.+# (If _AS_PATH_WALK were called with IFS unset, it would disable word+# splitting by setting IFS to empty value.)+IFS=" "" $as_nl"++# Find who we are. Look in the path if we contain no directory separator.+as_myself=+case $0 in #((+ *[\\/]* ) as_myself=$0 ;;+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+ IFS=$as_save_IFS+ test -z "$as_dir" && as_dir=.+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break+ done+IFS=$as_save_IFS++ ;;+esac+# We did not find ourselves, most probably we were run as `sh COMMAND'+# in which case we are not to be found in the path.+if test "x$as_myself" = x; then+ as_myself=$0+fi+if test ! -f "$as_myself"; then+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2+ exit 1+fi++# Unset variables that we do not need and which cause bugs (e.g. in+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"+# suppresses any "Segmentation fault" message there. '((' could+# trigger a bug in pdksh 5.2.14.+for as_var in BASH_ENV ENV MAIL MAILPATH+do eval test x\${$as_var+set} = xset \+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :+done+PS1='$ '+PS2='> '+PS4='+ '++# NLS nuisances.+LC_ALL=C+export LC_ALL+LANGUAGE=C+export LANGUAGE++# CDPATH.+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH+++# as_fn_error STATUS ERROR [LINENO LOG_FD]+# ----------------------------------------+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the+# script with STATUS, using 1 if that was 0.+as_fn_error ()+{+ as_status=$1; test $as_status -eq 0 && as_status=1+ if test "$4"; then+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4+ fi+ $as_echo "$as_me: error: $2" >&2+ as_fn_exit $as_status+} # as_fn_error+++# as_fn_set_status STATUS+# -----------------------+# Set $? to STATUS, without forking.+as_fn_set_status ()+{+ return $1+} # as_fn_set_status++# as_fn_exit STATUS+# -----------------+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.+as_fn_exit ()+{+ set +e+ as_fn_set_status $1+ exit $1+} # as_fn_exit++# as_fn_unset VAR+# ---------------+# Portably unset VAR.+as_fn_unset ()+{+ { eval $1=; unset $1;}+}+as_unset=as_fn_unset+# as_fn_append VAR VALUE+# ----------------------+# Append the text in VALUE to the end of the definition contained in VAR. Take+# advantage of any shell optimizations that allow amortized linear growth over+# repeated appends, instead of the typical quadratic growth present in naive+# implementations.+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :+ eval 'as_fn_append ()+ {+ eval $1+=\$2+ }'+else+ as_fn_append ()+ {+ eval $1=\$$1\$2+ }+fi # as_fn_append++# as_fn_arith ARG...+# ------------------+# Perform arithmetic evaluation on the ARGs, and store the result in the+# global $as_val. Take advantage of shells that can avoid forks. The arguments+# must be portable across $(()) and expr.+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :+ eval 'as_fn_arith ()+ {+ as_val=$(( $* ))+ }'+else+ as_fn_arith ()+ {+ as_val=`expr "$@" || test $? -eq 1`+ }+fi # as_fn_arith+++if expr a : '\(a\)' >/dev/null 2>&1 &&+ test "X`expr 00001 : '.*\(...\)'`" = X001; then+ as_expr=expr+else+ as_expr=false+fi++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then+ as_basename=basename+else+ as_basename=false+fi++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then+ as_dirname=dirname+else+ as_dirname=false+fi++as_me=`$as_basename -- "$0" ||+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \+ X"$0" : 'X\(//\)$' \| \+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||+$as_echo X/"$0" |+ sed '/^.*\/\([^/][^/]*\)\/*$/{+ s//\1/+ q+ }+ /^X\/\(\/\/\)$/{+ s//\1/+ q+ }+ /^X\/\(\/\).*/{+ s//\1/+ q+ }+ s/.*/./; q'`++# Avoid depending upon Character Ranges.+as_cr_letters='abcdefghijklmnopqrstuvwxyz'+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'+as_cr_Letters=$as_cr_letters$as_cr_LETTERS+as_cr_digits='0123456789'+as_cr_alnum=$as_cr_Letters$as_cr_digits++ECHO_C= ECHO_N= ECHO_T=+case `echo -n x` in #(((((+-n*)+ case `echo 'xy\c'` in+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.+ xy) ECHO_C='\c';;+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null+ ECHO_T=' ';;+ esac;;+*)+ ECHO_N='-n';;+esac++rm -f conf$$ conf$$.exe conf$$.file+if test -d conf$$.dir; then+ rm -f conf$$.dir/conf$$.file+else+ rm -f conf$$.dir+ mkdir conf$$.dir 2>/dev/null+fi+if (echo >conf$$.file) 2>/dev/null; then+ if ln -s conf$$.file conf$$ 2>/dev/null; then+ as_ln_s='ln -s'+ # ... but there are two gotchas:+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.+ # In both cases, we have to default to `cp -pR'.+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||+ as_ln_s='cp -pR'+ elif ln conf$$.file conf$$ 2>/dev/null; then+ as_ln_s=ln+ else+ as_ln_s='cp -pR'+ fi+else+ as_ln_s='cp -pR'+fi+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file+rmdir conf$$.dir 2>/dev/null+++# as_fn_mkdir_p+# -------------+# Create "$as_dir" as a directory, including parents if necessary.+as_fn_mkdir_p ()+{++ case $as_dir in #(+ -*) as_dir=./$as_dir;;+ esac+ test -d "$as_dir" || eval $as_mkdir_p || {+ as_dirs=+ while :; do+ case $as_dir in #(+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(+ *) as_qdir=$as_dir;;+ esac+ as_dirs="'$as_qdir' $as_dirs"+ as_dir=`$as_dirname -- "$as_dir" ||+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \+ X"$as_dir" : 'X\(//\)[^/]' \| \+ X"$as_dir" : 'X\(//\)$' \| \+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||+$as_echo X"$as_dir" |+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{+ s//\1/+ q+ }+ /^X\(\/\/\)[^/].*/{+ s//\1/+ q+ }+ /^X\(\/\/\)$/{+ s//\1/+ q+ }+ /^X\(\/\).*/{+ s//\1/+ q+ }+ s/.*/./; q'`+ test -d "$as_dir" && break+ done+ test -z "$as_dirs" || eval "mkdir $as_dirs"+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"+++} # as_fn_mkdir_p+if mkdir -p . 2>/dev/null; then+ as_mkdir_p='mkdir -p "$as_dir"'+else+ test -d ./-p && rmdir ./-p+ as_mkdir_p=false+fi+++# as_fn_executable_p FILE+# -----------------------+# Test if FILE is an executable regular file.+as_fn_executable_p ()+{+ test -f "$1" && test -x "$1"+} # as_fn_executable_p+as_test_x='test -x'+as_executable_p=as_fn_executable_p++# Sed expression to map a string onto a valid CPP name.+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"++# Sed expression to map a string onto a valid variable name.+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"+++exec 6>&1+## ----------------------------------- ##+## Main body of $CONFIG_STATUS script. ##+## ----------------------------------- ##+_ASEOF+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1+# Save the log message, to keep $0 and so on meaningful, and to+# report actual input values of CONFIG_FILES etc. instead of their+# values after options handling.+ac_log="+This file was extended by Haskell network package $as_me 2.3.0.14, which was+generated by GNU Autoconf 2.69. Invocation command line was++ CONFIG_FILES = $CONFIG_FILES+ CONFIG_HEADERS = $CONFIG_HEADERS+ CONFIG_LINKS = $CONFIG_LINKS+ CONFIG_COMMANDS = $CONFIG_COMMANDS+ $ $0 $@++on `(hostname || uname -n) 2>/dev/null | sed 1q`+"++_ACEOF++case $ac_config_files in *"+"*) set x $ac_config_files; shift; ac_config_files=$*;;+esac++case $ac_config_headers in *"+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;+esac+++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1+# Files that config.status was made for.+config_files="$ac_config_files"+config_headers="$ac_config_headers"++_ACEOF++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1+ac_cs_usage="\+\`$as_me' instantiates files and other configuration actions+from templates according to the current configuration. Unless the files+and actions are specified as TAGs, all are instantiated by default.++Usage: $0 [OPTION]... [TAG]...++ -h, --help print this help, then exit+ -V, --version print version number and configuration settings, then exit+ --config print configuration, then exit+ -q, --quiet, --silent+ do not print progress messages+ -d, --debug don't remove temporary files+ --recheck update $as_me by reconfiguring in the same conditions+ --file=FILE[:TEMPLATE]+ instantiate the configuration file FILE+ --header=FILE[:TEMPLATE]+ instantiate the configuration header FILE++Configuration files:+$config_files++Configuration headers:+$config_headers++Report bugs to <libraries@haskell.org>."++_ACEOF+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"+ac_cs_version="\\+Haskell network package config.status 2.3.0.14+configured by $0, generated by GNU Autoconf 2.69,+ with options \\"\$ac_cs_config\\"++Copyright (C) 2012 Free Software Foundation, Inc.+This config.status script is free software; the Free Software Foundation+gives unlimited permission to copy, distribute and modify it."++ac_pwd='$ac_pwd'+srcdir='$srcdir'+test -n "\$AWK" || AWK=awk+_ACEOF++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1+# The default lists apply if the user does not specify any file.+ac_need_defaults=:+while test $# != 0+do+ case $1 in+ --*=?*)+ ac_option=`expr "X$1" : 'X\([^=]*\)='`+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`+ ac_shift=:+ ;;+ --*=)+ ac_option=`expr "X$1" : 'X\([^=]*\)='`+ ac_optarg=+ ac_shift=:+ ;;+ *)+ ac_option=$1+ ac_optarg=$2+ ac_shift=shift+ ;;+ esac++ case $ac_option in+ # Handling of the options.+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)+ ac_cs_recheck=: ;;+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )+ $as_echo "$ac_cs_version"; exit ;;+ --config | --confi | --conf | --con | --co | --c )+ $as_echo "$ac_cs_config"; exit ;;+ --debug | --debu | --deb | --de | --d | -d )+ debug=: ;;+ --file | --fil | --fi | --f )+ $ac_shift+ case $ac_optarg in+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;+ '') as_fn_error $? "missing file argument" ;;+ esac+ as_fn_append CONFIG_FILES " '$ac_optarg'"+ ac_need_defaults=false;;+ --header | --heade | --head | --hea )+ $ac_shift+ case $ac_optarg in+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;+ esac+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"+ ac_need_defaults=false;;+ --he | --h)+ # Conflict between --help and --header+ as_fn_error $? "ambiguous option: \`$1'+Try \`$0 --help' for more information.";;+ --help | --hel | -h )+ $as_echo "$ac_cs_usage"; exit ;;+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \+ | -silent | --silent | --silen | --sile | --sil | --si | --s)+ ac_cs_silent=: ;;++ # This is an error.+ -*) as_fn_error $? "unrecognized option: \`$1'+Try \`$0 --help' for more information." ;;++ *) as_fn_append ac_config_targets " $1"+ ac_need_defaults=false ;;++ esac+ shift+done++ac_configure_extra_args=++if $ac_cs_silent; then+ exec 6>/dev/null+ ac_configure_extra_args="$ac_configure_extra_args --silent"+fi++_ACEOF+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1+if \$ac_cs_recheck; then+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion+ shift+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6+ CONFIG_SHELL='$SHELL'+ export CONFIG_SHELL+ exec "\$@"+fi++_ACEOF+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1+exec 5>>config.log+{+ echo+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX+## Running $as_me. ##+_ASBOX+ $as_echo "$ac_log"+} >&5++_ACEOF+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1+_ACEOF++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1++# Handling of arguments.+for ac_config_target in $ac_config_targets+do+ case $ac_config_target in+ "include/HsNetworkConfig.h") CONFIG_HEADERS="$CONFIG_HEADERS include/HsNetworkConfig.h" ;;+ "network.buildinfo") CONFIG_FILES="$CONFIG_FILES network.buildinfo" ;;++ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;+ esac+done+++# If the user did not use the arguments to specify the items to instantiate,+# then the envvar interface is used. Set only those that are not.+# We use the long form for the default assignment because of an extremely+# bizarre bug on SunOS 4.1.3.+if $ac_need_defaults; then+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers+fi++# Have a temporary directory for convenience. Make it in the build tree+# simply because there is no reason against having it here, and in addition,+# creating and moving files from /tmp can sometimes cause problems.+# Hook for its removal unless debugging.+# Note that there is a small window in which the directory will not be cleaned:+# after its creation but before its name has been assigned to `$tmp'.+$debug ||+{+ tmp= ac_tmp=+ trap 'exit_status=$?+ : "${ac_tmp:=$tmp}"+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status+' 0+ trap 'as_fn_exit 1' 1 2 13 15+}+# Create a (secure) tmp directory for tmp files.++{+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&+ test -d "$tmp"+} ||+{+ tmp=./conf$$-$RANDOM+ (umask 077 && mkdir "$tmp")+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5+ac_tmp=$tmp++# Set up the scripts for CONFIG_FILES section.+# No need to generate them if there are no CONFIG_FILES.+# This happens for instance with `./config.status config.h'.+if test -n "$CONFIG_FILES"; then+++ac_cr=`echo X | tr X '\015'`+# On cygwin, bash can eat \r inside `` if the user requested igncr.+# But we know of no other shell where ac_cr would be empty at this+# point, so we can use a bashism as a fallback.+if test "x$ac_cr" = x; then+ eval ac_cr=\$\'\\r\'+fi+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then+ ac_cs_awk_cr='\\r'+else+ ac_cs_awk_cr=$ac_cr+fi++echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&+_ACEOF+++{+ echo "cat >conf$$subs.awk <<_ACEOF" &&+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&+ echo "_ACEOF"+} >conf$$subs.sh ||+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`+ac_delim='%!_!# '+for ac_last_try in false false false false false :; do+ . ./conf$$subs.sh ||+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5++ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`+ if test $ac_delim_n = $ac_delim_num; then+ break+ elif $ac_last_try; then+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5+ else+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "+ fi+done+rm -f conf$$subs.sh++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&+_ACEOF+sed -n '+h+s/^/S["/; s/!.*/"]=/+p+g+s/^[^!]*!//+:repl+t repl+s/'"$ac_delim"'$//+t delim+:nl+h+s/\(.\{148\}\)..*/\1/+t more1+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/+p+n+b repl+:more1+s/["\\]/\\&/g; s/^/"/; s/$/"\\/+p+g+s/.\{148\}//+t nl+:delim+h+s/\(.\{148\}\)..*/\1/+t more2+s/["\\]/\\&/g; s/^/"/; s/$/"/+p+b+:more2+s/["\\]/\\&/g; s/^/"/; s/$/"\\/+p+g+s/.\{148\}//+t delim+' <conf$$subs.awk | sed '+/^[^""]/{+ N+ s/\n//+}+' >>$CONFIG_STATUS || ac_write_fail=1+rm -f conf$$subs.awk+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1+_ACAWK+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&+ for (key in S) S_is_set[key] = 1+ FS = ""++}+{+ line = $ 0+ nfields = split(line, field, "@")+ substed = 0+ len = length(field[1])+ for (i = 2; i < nfields; i++) {+ key = field[i]+ keylen = length(key)+ if (S_is_set[key]) {+ value = S[key]+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)+ len += length(value) + length(field[++i])+ substed = 1+ } else+ len += 1 + keylen+ }++ print line+}++_ACAWK+_ACEOF+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"+else+ cat+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5+_ACEOF++# VPATH may cause trouble with some makes, so we remove sole $(srcdir),+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and+# trailing colons and then remove the whole line if VPATH becomes empty+# (actually we leave an empty line to preserve line numbers).+if test "x$srcdir" = x.; then+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{+h+s///+s/^/:/+s/[ ]*$/:/+s/:\$(srcdir):/:/g+s/:\${srcdir}:/:/g+s/:@srcdir@:/:/g+s/^:*//+s/:*$//+x+s/\(=[ ]*\).*/\1/+G+s/\n//+s/^[^=]*=[ ]*$//+}'+fi++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1+fi # test -n "$CONFIG_FILES"++# Set up the scripts for CONFIG_HEADERS section.+# No need to generate them if there are no CONFIG_HEADERS.+# This happens for instance with `./config.status Makefile'.+if test -n "$CONFIG_HEADERS"; then+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||+BEGIN {+_ACEOF++# Transform confdefs.h into an awk script `defines.awk', embedded as+# here-document in config.status, that substitutes the proper values into+# config.h.in to produce config.h.++# Create a delimiter string that does not exist in confdefs.h, to ease+# handling of long lines.+ac_delim='%!_!# '+for ac_last_try in false false :; do+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`+ if test -z "$ac_tt"; then+ break+ elif $ac_last_try; then+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5+ else+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "+ fi+done++# For the awk script, D is an array of macro values keyed by name,+# likewise P contains macro parameters if any. Preserve backslash+# newline sequences.++ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*+sed -n '+s/.\{148\}/&'"$ac_delim"'/g+t rset+:rset+s/^[ ]*#[ ]*define[ ][ ]*/ /+t def+d+:def+s/\\$//+t bsnl+s/["\\]/\\&/g+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\+D["\1"]=" \3"/p+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p+d+:bsnl+s/["\\]/\\&/g+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\+D["\1"]=" \3\\\\\\n"\\/p+t cont+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p+t cont+d+:cont+n+s/.\{148\}/&'"$ac_delim"'/g+t clear+:clear+s/\\$//+t bsnlc+s/["\\]/\\&/g; s/^/"/; s/$/"/p+d+:bsnlc+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p+b cont+' <confdefs.h | sed '+s/'"$ac_delim"'/"\\\+"/g' >>$CONFIG_STATUS || ac_write_fail=1++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1+ for (key in D) D_is_set[key] = 1+ FS = ""+}+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {+ line = \$ 0+ split(line, arg, " ")+ if (arg[1] == "#") {+ defundef = arg[2]+ mac1 = arg[3]+ } else {+ defundef = substr(arg[1], 2)+ mac1 = arg[2]+ }+ split(mac1, mac2, "(") #)+ macro = mac2[1]+ prefix = substr(line, 1, index(line, defundef) - 1)+ if (D_is_set[macro]) {+ # Preserve the white space surrounding the "#".+ print prefix "define", macro P[macro] D[macro]+ next+ } else {+ # Replace #undef with comments. This is necessary, for example,+ # in the case of _POSIX_SOURCE, which is predefined and required+ # on some systems where configure will not decide to define it.+ if (defundef == "undef") {+ print "/*", prefix defundef, macro, "*/"+ next+ }+ }+}+{ print }+_ACAWK+_ACEOF+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5+fi # test -n "$CONFIG_HEADERS"+++eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS "+shift+for ac_tag+do+ case $ac_tag in+ :[FHLC]) ac_mode=$ac_tag; continue;;+ esac+ case $ac_mode$ac_tag in+ :[FHL]*:*);;+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;+ :[FH]-) ac_tag=-:-;;+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;+ esac+ ac_save_IFS=$IFS+ IFS=:+ set x $ac_tag+ IFS=$ac_save_IFS+ shift+ ac_file=$1+ shift++ case $ac_mode in+ :L) ac_source=$1;;+ :[FH])+ ac_file_inputs=+ for ac_f+ do+ case $ac_f in+ -) ac_f="$ac_tmp/stdin";;+ *) # Look for the file first in the build tree, then in the source tree+ # (if the path is not absolute). The absolute path cannot be DOS-style,+ # because $ac_f cannot contain `:'.+ test -f "$ac_f" ||+ case $ac_f in+ [\\/$]*) false;;+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;+ esac ||+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;+ esac+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac+ as_fn_append ac_file_inputs " '$ac_f'"+ done++ # Let's still pretend it is `configure' which instantiates (i.e., don't+ # use $as_me), people would be surprised to read:+ # /* config.h. Generated by config.status. */+ configure_input='Generated from '`+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'+ `' by configure.'+ if test x"$ac_file" != x-; then+ configure_input="$ac_file. $configure_input"+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5+$as_echo "$as_me: creating $ac_file" >&6;}+ fi+ # Neutralize special characters interpreted by sed in replacement strings.+ case $configure_input in #(+ *\&* | *\|* | *\\* )+ ac_sed_conf_input=`$as_echo "$configure_input" |+ sed 's/[\\\\&|]/\\\\&/g'`;; #(+ *) ac_sed_conf_input=$configure_input;;+ esac++ case $ac_tag in+ *:-:* | *:-) cat >"$ac_tmp/stdin" \+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;+ esac+ ;;+ esac++ ac_dir=`$as_dirname -- "$ac_file" ||+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \+ X"$ac_file" : 'X\(//\)[^/]' \| \+ X"$ac_file" : 'X\(//\)$' \| \+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||+$as_echo X"$ac_file" |+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{+ s//\1/+ q+ }+ /^X\(\/\/\)[^/].*/{+ s//\1/+ q+ }+ /^X\(\/\/\)$/{+ s//\1/+ q+ }+ /^X\(\/\).*/{+ s//\1/+ q+ }+ s/.*/./; q'`+ as_dir="$ac_dir"; as_fn_mkdir_p+ ac_builddir=.++case "$ac_dir" in+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;+*)+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`+ # A ".." for each directory in $ac_dir_suffix.+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`+ case $ac_top_builddir_sub in+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;+ esac ;;+esac+ac_abs_top_builddir=$ac_pwd+ac_abs_builddir=$ac_pwd$ac_dir_suffix+# for backward compatibility:+ac_top_builddir=$ac_top_build_prefix++case $srcdir in+ .) # We are building in place.+ ac_srcdir=.+ ac_top_srcdir=$ac_top_builddir_sub+ ac_abs_top_srcdir=$ac_pwd ;;+ [\\/]* | ?:[\\/]* ) # Absolute name.+ ac_srcdir=$srcdir$ac_dir_suffix;+ ac_top_srcdir=$srcdir+ ac_abs_top_srcdir=$srcdir ;;+ *) # Relative name.+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix+ ac_top_srcdir=$ac_top_build_prefix$srcdir+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;+esac+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix+++ case $ac_mode in+ :F)+ #+ # CONFIG_FILE+ #++_ACEOF++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1+# If the template does not know about datarootdir, expand it.+# FIXME: This hack should be removed a few years after 2.60.+ac_datarootdir_hack=; ac_datarootdir_seen=+ac_sed_dataroot='+/datarootdir/ {+ p+ q+}+/@datadir@/p+/@docdir@/p+/@infodir@/p+/@localedir@/p+/@mandir@/p'+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in+*datarootdir*) ac_datarootdir_seen=yes;;+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}+_ACEOF+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1+ ac_datarootdir_hack='+ s&@datadir@&$datadir&g+ s&@docdir@&$docdir&g+ s&@infodir@&$infodir&g+ s&@localedir@&$localedir&g+ s&@mandir@&$mandir&g+ s&\\\${datarootdir}&$datarootdir&g' ;;+esac+_ACEOF++# Neutralize VPATH when `$srcdir' = `.'.+# Shell code in configure.ac might set extrasub.+# FIXME: do we really want to maintain this feature?+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1+ac_sed_extra="$ac_vpsub+$extrasub+_ACEOF+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1+:t+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b+s|@configure_input@|$ac_sed_conf_input|;t t+s&@top_builddir@&$ac_top_builddir_sub&;t t+s&@top_build_prefix@&$ac_top_build_prefix&;t t+s&@srcdir@&$ac_srcdir&;t t+s&@abs_srcdir@&$ac_abs_srcdir&;t t+s&@top_srcdir@&$ac_top_srcdir&;t t+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t+s&@builddir@&$ac_builddir&;t t+s&@abs_builddir@&$ac_abs_builddir&;t t+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t+$ac_datarootdir_hack+"+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5++test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \+ "$ac_tmp/out"`; test -z "$ac_out"; } &&+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'+which seems to be undefined. Please make sure it is defined" >&5+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'+which seems to be undefined. Please make sure it is defined" >&2;}++ rm -f "$ac_tmp/stdin"+ case $ac_file in+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;+ esac \+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5+ ;;+ :H)+ #+ # CONFIG_HEADER+ #+ if test x"$ac_file" != x-; then+ {+ $as_echo "/* $configure_input */" \+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"+ } >"$ac_tmp/config.h" \+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5+$as_echo "$as_me: $ac_file is unchanged" >&6;}+ else+ rm -f "$ac_file"+ mv "$ac_tmp/config.h" "$ac_file" \+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5+ fi+ else+ $as_echo "/* $configure_input */" \+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \+ || as_fn_error $? "could not create -" "$LINENO" 5+ fi+ ;;+++ esac++done # for ac_tag+++as_fn_exit 0+_ACEOF+ac_clean_files=$ac_clean_files_save++test $ac_write_fail = 0 ||+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5+++# configure is writing to config.log, and then calls config.status.+# config.status does its own redirection, appending to config.log.+# Unfortunately, on DOS this fails, as config.log is still kept open+# by configure, so config.status won't be able to write to it; its+# output is simply discarded. So we exec the FD to /dev/null,+# effectively closing config.log, so it can be properly (re)opened and+# appended to by config.status. When coming back to configure, we+# need to make the FD available again.+if test "$no_create" != yes; then+ ac_cs_success=:+ ac_config_status_args=+ test "$silent" = yes &&+ ac_config_status_args="$ac_config_status_args --quiet"+ exec 5>/dev/null+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false+ exec 5>>config.log+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which+ # would make configure fail if this is the last instruction.+ $ac_cs_success || as_fn_exit 1+fi+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}+fi+
+ standalone/android/tmp/network-2.4.1.2/configure.ac view
@@ -0,0 +1,184 @@+AC_INIT([Haskell network package], [2.3.0.14], [libraries@haskell.org], [network])++ac_includes_default="$ac_includes_default+#ifdef HAVE_SYS_SOCKET_H+# include <sys/socket.h>+#endif+#ifdef HAVE_NETINET_IN_H+# include <netinet/in.h>+#endif+#ifdef HAVE_NETDB_H+# include <netdb.h>+#endif+#ifdef HAVE_WINSOCK2_H+# include <winsock2.h>+#endif+#ifdef HAVE_WS2TCPIP_H+# include <ws2tcpip.h>+// fix for MingW not defining IPV6_V6ONLY+# define IPV6_V6ONLY 27+#endif+#ifdef HAVE_WSPIAPI_H+# include <wspiapi.h>+#endif"++# Safety check: Ensure that we are in the correct source directory.+AC_CONFIG_SRCDIR([include/HsNet.h])++AC_CONFIG_HEADERS([include/HsNetworkConfig.h])++AC_CANONICAL_HOST++AC_ARG_WITH([cc],+ [C compiler],+ [CC=$withval])+AC_PROG_CC()++AC_C_CONST++dnl ** check for specific header (.h) files that we are interested in+AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h sys/types.h unistd.h winsock2.h ws2tcpip.h wspiapi.h])+AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h netinet/tcp.h sys/socket.h sys/uio.h sys/un.h])++AC_CHECK_FUNCS([readlink symlink])++dnl ** check what fields struct msghdr contains+AC_CHECK_MEMBERS([struct msghdr.msg_control, struct msghdr.msg_accrights], [], [], [#if HAVE_SYS_TYPES_H+# include <sys/types.h>+#endif+#if HAVE_SYS_SOCKET_H+# include <sys/socket.h>+#endif+#if HAVE_SYS_UIO_H+# include <sys/uio.h>+#endif])++dnl ** check if struct sockaddr contains sa_len+AC_CHECK_MEMBERS([struct sockaddr.sa_len], [], [], [#if HAVE_SYS_TYPES_H+# include <sys/types.h>+#endif+#if HAVE_SYS_SOCKET_H+# include <sys/socket.h>+#endif])++dnl --------------------------------------------------+dnl * test for in_addr_t+dnl --------------------------------------------------+AC_MSG_CHECKING(for in_addr_t in netinet/in.h)+AC_EGREP_HEADER(in_addr_t, netinet/in.h,+ [ AC_DEFINE([HAVE_IN_ADDR_T], [1], [Define to 1 if in_addr_t is available.]) AC_MSG_RESULT(yes) ],+ AC_MSG_RESULT(no))++dnl --------------------------------------------------+dnl * test for SO_PEERCRED and struct ucred+dnl --------------------------------------------------+AC_MSG_CHECKING(for SO_PEERCRED and struct ucred in sys/socket.h)+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>+#include <sys/socket.h>+#ifndef SO_PEERCRED+# error no SO_PEERCRED+#endif+struct ucred u;]])],ac_cv_ucred=yes,ac_cv_ucred=no)+if test "x$ac_cv_ucred" = xno; then+ old_CFLAGS="$CFLAGS"+ CFLAGS="-D_GNU_SOURCE $CFLAGS"+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>+#include <sys/socket.h>+#ifndef SO_PEERCRED+# error no SO_PEERCRED+#endif+struct ucred u;]])],ac_cv_ucred=yes,ac_cv_ucred=no)+ if test "x$ac_cv_ucred" = xyes; then+ EXTRA_CPPFLAGS=-D_GNU_SOURCE+ fi+else+ old_CFLAGS="$CFLAGS"+fi+if test "x$ac_cv_ucred" = xno; then+ CFLAGS="$old_CFLAGS"+ AC_MSG_RESULT(no)+else+ AC_DEFINE([HAVE_STRUCT_UCRED], [1], [Define to 1 if you have both SO_PEERCRED and struct ucred.])+ AC_MSG_RESULT(yes)+fi++dnl --------------------------------------------------+dnl * check for Windows networking libraries+dnl --------------------------------------------------+AC_CHECK_LIB(ws2_32, _head_libws2_32_a)++dnl --------------------------------------------------+dnl * test for getaddrinfo as proxy for IPv6 support+dnl --------------------------------------------------+AC_MSG_CHECKING(for getaddrinfo)+dnl Can't use AC_CHECK_FUNC here, because it doesn't do the right+dnl thing on Windows.+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$ac_includes_default+int testme(){ getaddrinfo; }]])],[AC_DEFINE([HAVE_GETADDRINFO], [1], [Define to 1 if you have the `getaddrinfo' function.]) ac_have_getaddrinfo=yes; AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)])++dnl Under mingw, we may need to set WINVER to 0x0501 to expose getaddrinfo.+if test "x$ac_have_getaddrinfo" = x; then+ old_CFLAGS="$CFLAGS"+ if test "z$ac_cv_lib_ws2_32__head_libws2_32_a" = zyes; then+ CFLAGS="-DWINVER=0x0501 $CFLAGS"+ AC_MSG_CHECKING(for getaddrinfo if WINVER is 0x0501)+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$ac_includes_default+ int testme(){ getaddrinfo; }]])],[AC_DEFINE([HAVE_GETADDRINFO], [1], [Define to 1 if you have the `getaddrinfo' function.]) AC_DEFINE([NEED_WINVER_XP], [1], [Define to 1 if the `getaddrinfo' function needs WINVER set.]) EXTRA_CPPFLAGS="-DWINVER=0x0501 $EXTRA_CPPFLAGS"; AC_MSG_RESULT(yes)],[CFLAGS="$old_CFLAGS"; AC_MSG_RESULT(no)])+ fi+fi++dnl Missing under mingw, sigh.+AC_CHECK_FUNCS(gai_strerror)++dnl -------------------------------------------------------+dnl * test for AI_* flags that not all implementations have+dnl -------------------------------------------------------+AC_CHECK_DECLS([AI_ADDRCONFIG, AI_ALL, AI_NUMERICSERV, AI_V4MAPPED])++dnl -------------------------------------------------------+dnl * test for IPV6_V6ONLY flags that not all implementations have+dnl -------------------------------------------------------+AC_CHECK_DECLS([IPV6_V6ONLY])++dnl --------------------------------------------------+dnl * test for Linux sendfile(2)+dnl --------------------------------------------------+AC_MSG_CHECKING(for sendfile in sys/sendfile.h)+AC_EGREP_HEADER(sendfile, sys/sendfile.h,+ [ AC_DEFINE([HAVE_LINUX_SENDFILE], [1], [Define to 1 if you have a Linux sendfile(2) implementation.]) AC_MSG_RESULT(yes) ],+ AC_MSG_RESULT(no))++dnl --------------------------------------------------+dnl * test for BSD sendfile(2)+dnl --------------------------------------------------+AC_MSG_CHECKING(for sendfile in sys/socket.h)+AC_EGREP_HEADER(sendfile, sys/socket.h,+ [ AC_DEFINE([HAVE_BSD_SENDFILE], [1], [Define to 1 if you have a BSDish sendfile(2) implementation.]) AC_MSG_RESULT(yes) ],+ AC_MSG_RESULT(no))++AC_CHECK_FUNCS(gethostent)++AC_CHECK_FUNCS(accept4)++case "$host" in+*-mingw32)+ EXTRA_SRCS="cbits/initWinSock.c, cbits/winSockErr.c, cbits/asyncAccept.c"+ EXTRA_LIBS=ws2_32+ CALLCONV=stdcall ;;+*-solaris2*)+ EXTRA_SRCS="cbits/ancilData.c"+ EXTRA_LIBS="nsl, socket"+ CALLCONV=ccall ;;+*)+ EXTRA_SRCS="cbits/ancilData.c"+ EXTRA_LIBS=+ CALLCONV=ccall ;;+esac+AC_SUBST([CALLCONV])+AC_SUBST([EXTRA_CPPFLAGS])+AC_SUBST([EXTRA_LIBS])+AC_SUBST([EXTRA_SRCS])++AC_CONFIG_FILES([network.buildinfo])++AC_OUTPUT
+ standalone/android/tmp/network-2.4.1.2/examples/EchoClient.hs view
@@ -0,0 +1,18 @@+-- Echo client program+module Main where++import Network.Socket hiding (recv)+import Network.Socket.ByteString (recv, sendAll)+import qualified Data.ByteString.Char8 as C++main :: IO ()+main = withSocketsDo $+ do addrinfos <- getAddrInfo Nothing (Just "") (Just "3000")+ let serveraddr = head addrinfos+ sock <- socket (addrFamily serveraddr) Stream defaultProtocol+ connect sock (addrAddress serveraddr)+ sendAll sock $ C.pack "Hello, world!"+ msg <- recv sock 1024+ sClose sock+ putStr "Received "+ C.putStrLn msg
+ standalone/android/tmp/network-2.4.1.2/examples/EchoServer.hs view
@@ -0,0 +1,27 @@+-- Echo server program+module Main where++import Control.Monad (unless)+import Network.Socket hiding (recv)+import qualified Data.ByteString as S+import Network.Socket.ByteString (recv, sendAll)++main :: IO ()+main = withSocketsDo $+ do addrinfos <- getAddrInfo+ (Just (defaultHints {addrFlags = [AI_PASSIVE]}))+ Nothing (Just "3000")+ let serveraddr = head addrinfos+ sock <- socket (addrFamily serveraddr) Stream defaultProtocol+ bindSocket sock (addrAddress serveraddr)+ listen sock 1+ (conn, _) <- accept sock+ talk conn+ sClose conn+ sClose sock++ where+ talk :: Socket -> IO ()+ talk conn =+ do msg <- recv conn 1024+ unless (S.null msg) $ sendAll conn msg >> talk conn
+ standalone/android/tmp/network-2.4.1.2/include/HsNet.h view
@@ -0,0 +1,179 @@+/* -----------------------------------------------------------------------------+ *+ * Definitions for package `net' which are visible in Haskell land.+ *+ * ---------------------------------------------------------------------------*/++#ifndef HSNET_H+#define HSNET_H++#include "HsNetworkConfig.h"++#ifdef NEED_WINVER+# define WINVER 0x0501+#endif++/* ultra-evil... */+#undef PACKAGE_BUGREPORT+#undef PACKAGE_NAME+#undef PACKAGE_STRING+#undef PACKAGE_TARNAME+#undef PACKAGE_VERSION++#ifndef INLINE+# if defined(_MSC_VER)+# define INLINE extern __inline+# elif defined(__GNUC__)+# define INLINE extern inline+# else+# define INLINE inline+# endif+#endif++#ifdef HAVE_GETADDRINFO+# define IPV6_SOCKET_SUPPORT 1+#else+# undef IPV6_SOCKET_SUPPORT+#endif++#if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)+#include <winsock2.h>+# ifdef HAVE_WS2TCPIP_H+# include <ws2tcpip.h>+// fix for MingW not defining IPV6_V6ONLY+# define IPV6_V6ONLY 27+# endif+# ifdef HAVE_WSPIAPI_H+# include <wspiapi.h>+# endif++extern void shutdownWinSock();+extern int initWinSock ();+extern const char* getWSErrorDescr(int err);+extern void* newAcceptParams(int sock,+ int sz,+ void* sockaddr);+extern int acceptNewSock(void* d);+extern int acceptDoProc(void* param);++#else++#ifdef HAVE_LIMITS_H+# include <limits.h>+#endif+#ifdef HAVE_STDLIB_H+# include <stdlib.h>+#endif+#ifdef HAVE_UNISTD_H+#include <unistd.h>+#endif+#ifdef HAVE_SYS_TYPES_H+# include <sys/types.h>+#endif+#ifdef HAVE_FCNTL_H+# include <fcntl.h>+#endif+#ifdef HAVE_SYS_UIO_H+# include <sys/uio.h>+#endif+#ifdef HAVE_SYS_SOCKET_H+# include <sys/socket.h>+#endif+#ifdef HAVE_NETINET_TCP_H+# include <netinet/tcp.h>+#endif+#ifdef HAVE_NETINET_IN_H+# include <netinet/in.h>+#endif+#ifdef HAVE_SYS_UN_H+# include <sys/un.h>+#endif+#ifdef HAVE_ARPA_INET_H+# include <arpa/inet.h>+#endif+#ifdef HAVE_NETDB_H+#include <netdb.h>+#endif++#ifdef HAVE_BSD_SENDFILE+#include <sys/uio.h>+#endif+#ifdef HAVE_LINUX_SENDFILE+#if !defined(__USE_FILE_OFFSET64)+#include <sys/sendfile.h>+#endif+#endif++extern int+sendFd(int sock, int outfd);++extern int+recvFd(int sock);++#endif /* HAVE_WINSOCK2_H && !__CYGWIN */++INLINE char *+my_inet_ntoa(+#if defined(HAVE_WINSOCK2_H)+ u_long addr+#elif defined(HAVE_IN_ADDR_T)+ in_addr_t addr+#elif defined(HAVE_INTTYPES_H)+ u_int32_t addr+#else+ unsigned long addr+#endif+ )+{ + struct in_addr a;+ a.s_addr = addr;+ return inet_ntoa(a);+}++#ifdef HAVE_GETADDRINFO+INLINE int+hsnet_getnameinfo(const struct sockaddr* a,socklen_t b, char* c,+# if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)+ DWORD d, char* e, DWORD f, int g)+# else+ socklen_t d, char* e, socklen_t f, int g)+# endif+{+ return getnameinfo(a,b,c,d,e,f,g);+}++INLINE int+hsnet_getaddrinfo(const char *hostname, const char *servname,+ const struct addrinfo *hints, struct addrinfo **res)+{+ return getaddrinfo(hostname, servname, hints, res);+}++INLINE void+hsnet_freeaddrinfo(struct addrinfo *ai)+{+ freeaddrinfo(ai);+}+#endif++#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)+# define WITH_WINSOCK 1+#endif++#if !defined(mingw32_HOST_OS) && !defined(_WIN32)+# define DOMAIN_SOCKET_SUPPORT 1+#endif++#if !defined(CALLCONV)+# if defined(WITH_WINSOCK)+# define CALLCONV stdcall+# else+# define CALLCONV ccall+# endif+#endif++#if !defined(IOV_MAX)+# define IOV_MAX 1024+#endif++#endif /* HSNET_H */
+ standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h view
@@ -0,0 +1,154 @@+/* include/HsNetworkConfig.h. Generated from HsNetworkConfig.h.in by configure. */+/* include/HsNetworkConfig.h.in. Generated from configure.ac by autoheader. */++/* Define to 1 if you have the `accept4' function. */+/* #undef HAVE_ACCEPT4 */++/* Define to 1 if you have the <arpa/inet.h> header file. */+#define HAVE_ARPA_INET_H 1++/* Define to 1 if you have a BSDish sendfile(2) implementation. */+#define HAVE_BSD_SENDFILE 1++/* Define to 1 if you have the declaration of `AI_ADDRCONFIG', and to 0 if you+ don't. */+#define HAVE_DECL_AI_ADDRCONFIG 1++/* Define to 1 if you have the declaration of `AI_ALL', and to 0 if you don't.+ */+#define HAVE_DECL_AI_ALL 1++/* Define to 1 if you have the declaration of `AI_NUMERICSERV', and to 0 if+ you don't. */+#define HAVE_DECL_AI_NUMERICSERV 1++/* Define to 1 if you have the declaration of `AI_V4MAPPED', and to 0 if you+ don't. */+#define HAVE_DECL_AI_V4MAPPED 1++/* Define to 1 if you have the declaration of `IPV6_V6ONLY', and to 0 if you+ don't. */+#define HAVE_DECL_IPV6_V6ONLY 1++/* Define to 1 if you have the <fcntl.h> header file. */+#define HAVE_FCNTL_H 1++/* Define to 1 if you have the `gai_strerror' function. */+#define HAVE_GAI_STRERROR 1++/* Define to 1 if you have the `getaddrinfo' function. */+#define HAVE_GETADDRINFO 1++/* Define to 1 if you have the `gethostent' function. */+#define HAVE_GETHOSTENT 1++/* Define to 1 if you have the <inttypes.h> header file. */+#define HAVE_INTTYPES_H 1++/* Define to 1 if in_addr_t is available. */+#define HAVE_IN_ADDR_T 1++/* Define to 1 if you have the `ws2_32' library (-lws2_32). */+/* #undef HAVE_LIBWS2_32 */++/* Define to 1 if you have the <limits.h> header file. */+#define HAVE_LIMITS_H 1++/* Define to 1 if you have a Linux sendfile(2) implementation. */+/* #undef HAVE_LINUX_SENDFILE */++/* Define to 1 if you have the <memory.h> header file. */+#define HAVE_MEMORY_H 1++/* Define to 1 if you have the <netdb.h> header file. */+#define HAVE_NETDB_H 1++/* Define to 1 if you have the <netinet/in.h> header file. */+#define HAVE_NETINET_IN_H 1++/* Define to 1 if you have the <netinet/tcp.h> header file. */+#define HAVE_NETINET_TCP_H 1++/* Define to 1 if you have the `readlink' function. */+#define HAVE_READLINK 1++/* Define to 1 if you have the <stdint.h> header file. */+#define HAVE_STDINT_H 1++/* Define to 1 if you have the <stdlib.h> header file. */+#define HAVE_STDLIB_H 1++/* Define to 1 if you have the <strings.h> header file. */+#define HAVE_STRINGS_H 1++/* Define to 1 if you have the <string.h> header file. */+#define HAVE_STRING_H 1++/* Define to 1 if `msg_accrights' is a member of `struct msghdr'. */+/* #undef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */++/* Define to 1 if `msg_control' is a member of `struct msghdr'. */+#define HAVE_STRUCT_MSGHDR_MSG_CONTROL 1++/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */+#define HAVE_STRUCT_SOCKADDR_SA_LEN 1++/* Define to 1 if you have both SO_PEERCRED and struct ucred. */+/* #undef HAVE_STRUCT_UCRED */++/* Define to 1 if you have the `symlink' function. */+#define HAVE_SYMLINK 1++/* Define to 1 if you have the <sys/socket.h> header file. */+#define HAVE_SYS_SOCKET_H 1++/* Define to 1 if you have the <sys/stat.h> header file. */+#define HAVE_SYS_STAT_H 1++/* Define to 1 if you have the <sys/types.h> header file. */+#define HAVE_SYS_TYPES_H 1++/* Define to 1 if you have the <sys/uio.h> header file. */+#define HAVE_SYS_UIO_H 1++/* Define to 1 if you have the <sys/un.h> header file. */+#define HAVE_SYS_UN_H 1++/* Define to 1 if you have the <unistd.h> header file. */+#define HAVE_UNISTD_H 1++/* Define to 1 if you have the <winsock2.h> header file. */+/* #undef HAVE_WINSOCK2_H */++/* Define to 1 if you have the <ws2tcpip.h> header file. */+/* #undef HAVE_WS2TCPIP_H */++/* Define to 1 if you have the <wspiapi.h> header file. */+/* #undef HAVE_WSPIAPI_H */++/* Define to 1 if the `getaddrinfo' function needs WINVER set. */+/* #undef NEED_WINVER_XP */++/* Define to the address where bug reports for this package should be sent. */+#define PACKAGE_BUGREPORT "libraries@haskell.org"++/* Define to the full name of this package. */+#define PACKAGE_NAME "Haskell network package"++/* Define to the full name and version of this package. */+#define PACKAGE_STRING "Haskell network package 2.3.0.14"++/* Define to the one symbol short name of this package. */+#define PACKAGE_TARNAME "network"++/* Define to the home page for this package. */+#define PACKAGE_URL ""++/* Define to the version of this package. */+#define PACKAGE_VERSION "2.3.0.14"++/* Define to 1 if you have the ANSI C header files. */+#define STDC_HEADERS 1++/* Define to empty if `const' does not conform to ANSI C. */+/* #undef const */
+ standalone/android/tmp/network-2.4.1.2/include/HsNetworkConfig.h.in view
@@ -0,0 +1,153 @@+/* include/HsNetworkConfig.h.in. Generated from configure.ac by autoheader. */++/* Define to 1 if you have the `accept4' function. */+#undef HAVE_ACCEPT4++/* Define to 1 if you have the <arpa/inet.h> header file. */+#undef HAVE_ARPA_INET_H++/* Define to 1 if you have a BSDish sendfile(2) implementation. */+#undef HAVE_BSD_SENDFILE++/* Define to 1 if you have the declaration of `AI_ADDRCONFIG', and to 0 if you+ don't. */+#undef HAVE_DECL_AI_ADDRCONFIG++/* Define to 1 if you have the declaration of `AI_ALL', and to 0 if you don't.+ */+#undef HAVE_DECL_AI_ALL++/* Define to 1 if you have the declaration of `AI_NUMERICSERV', and to 0 if+ you don't. */+#undef HAVE_DECL_AI_NUMERICSERV++/* Define to 1 if you have the declaration of `AI_V4MAPPED', and to 0 if you+ don't. */+#undef HAVE_DECL_AI_V4MAPPED++/* Define to 1 if you have the declaration of `IPV6_V6ONLY', and to 0 if you+ don't. */+#undef HAVE_DECL_IPV6_V6ONLY++/* Define to 1 if you have the <fcntl.h> header file. */+#undef HAVE_FCNTL_H++/* Define to 1 if you have the `gai_strerror' function. */+#undef HAVE_GAI_STRERROR++/* Define to 1 if you have the `getaddrinfo' function. */+#undef HAVE_GETADDRINFO++/* Define to 1 if you have the `gethostent' function. */+#undef HAVE_GETHOSTENT++/* Define to 1 if you have the <inttypes.h> header file. */+#undef HAVE_INTTYPES_H++/* Define to 1 if in_addr_t is available. */+#undef HAVE_IN_ADDR_T++/* Define to 1 if you have the `ws2_32' library (-lws2_32). */+#undef HAVE_LIBWS2_32++/* Define to 1 if you have the <limits.h> header file. */+#undef HAVE_LIMITS_H++/* Define to 1 if you have a Linux sendfile(2) implementation. */+#undef HAVE_LINUX_SENDFILE++/* Define to 1 if you have the <memory.h> header file. */+#undef HAVE_MEMORY_H++/* Define to 1 if you have the <netdb.h> header file. */+#undef HAVE_NETDB_H++/* Define to 1 if you have the <netinet/in.h> header file. */+#undef HAVE_NETINET_IN_H++/* Define to 1 if you have the <netinet/tcp.h> header file. */+#undef HAVE_NETINET_TCP_H++/* Define to 1 if you have the `readlink' function. */+#undef HAVE_READLINK++/* Define to 1 if you have the <stdint.h> header file. */+#undef HAVE_STDINT_H++/* Define to 1 if you have the <stdlib.h> header file. */+#undef HAVE_STDLIB_H++/* Define to 1 if you have the <strings.h> header file. */+#undef HAVE_STRINGS_H++/* Define to 1 if you have the <string.h> header file. */+#undef HAVE_STRING_H++/* Define to 1 if `msg_accrights' is a member of `struct msghdr'. */+#undef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS++/* Define to 1 if `msg_control' is a member of `struct msghdr'. */+#undef HAVE_STRUCT_MSGHDR_MSG_CONTROL++/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */+#undef HAVE_STRUCT_SOCKADDR_SA_LEN++/* Define to 1 if you have both SO_PEERCRED and struct ucred. */+#undef HAVE_STRUCT_UCRED++/* Define to 1 if you have the `symlink' function. */+#undef HAVE_SYMLINK++/* Define to 1 if you have the <sys/socket.h> header file. */+#undef HAVE_SYS_SOCKET_H++/* Define to 1 if you have the <sys/stat.h> header file. */+#undef HAVE_SYS_STAT_H++/* Define to 1 if you have the <sys/types.h> header file. */+#undef HAVE_SYS_TYPES_H++/* Define to 1 if you have the <sys/uio.h> header file. */+#undef HAVE_SYS_UIO_H++/* Define to 1 if you have the <sys/un.h> header file. */+#undef HAVE_SYS_UN_H++/* Define to 1 if you have the <unistd.h> header file. */+#undef HAVE_UNISTD_H++/* Define to 1 if you have the <winsock2.h> header file. */+#undef HAVE_WINSOCK2_H++/* Define to 1 if you have the <ws2tcpip.h> header file. */+#undef HAVE_WS2TCPIP_H++/* Define to 1 if you have the <wspiapi.h> header file. */+#undef HAVE_WSPIAPI_H++/* Define to 1 if the `getaddrinfo' function needs WINVER set. */+#undef NEED_WINVER_XP++/* Define to the address where bug reports for this package should be sent. */+#undef PACKAGE_BUGREPORT++/* Define to the full name of this package. */+#undef PACKAGE_NAME++/* Define to the full name and version of this package. */+#undef PACKAGE_STRING++/* Define to the one symbol short name of this package. */+#undef PACKAGE_TARNAME++/* Define to the home page for this package. */+#undef PACKAGE_URL++/* Define to the version of this package. */+#undef PACKAGE_VERSION++/* Define to 1 if you have the ANSI C header files. */+#undef STDC_HEADERS++/* Define to empty if `const' does not conform to ANSI C. */+#undef const
+ standalone/android/tmp/network-2.4.1.2/install-sh view
@@ -0,0 +1,295 @@+#!/bin/sh+# install - install a program, script, or datafile++scriptversion=2003-09-24.23++# This originates from X11R5 (mit/util/scripts/install.sh), which was+# later released in X11R6 (xc/config/util/install.sh) with the+# following copyright and license.+#+# Copyright (C) 1994 X Consortium+#+# Permission is hereby granted, free of charge, to any person obtaining a copy+# of this software and associated documentation files (the "Software"), to+# deal in the Software without restriction, including without limitation the+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or+# sell copies of the Software, and to permit persons to whom the Software is+# furnished to do so, subject to the following conditions:+#+# The above copyright notice and this permission notice shall be included in+# all copies or substantial portions of the Software.+#+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.+#+# Except as contained in this notice, the name of the X Consortium shall not+# be used in advertising or otherwise to promote the sale, use or other deal-+# ings in this Software without prior written authorization from the X Consor-+# tium.+#+#+# FSF changes to this file are in the public domain.+#+# Calling this script install-sh is preferred over install.sh, to prevent+# `make' implicit rules from creating a file called install from it+# when there is no Makefile.+#+# This script is compatible with the BSD install script, but was written+# from scratch. It can only install one file at a time, a restriction+# shared with many OS's install programs.++# set DOITPROG to echo to test this script++# Don't use :- since 4.3BSD and earlier shells don't like it.+doit="${DOITPROG-}"++# put in absolute paths if you don't have them in your path; or use env. vars.++mvprog="${MVPROG-mv}"+cpprog="${CPPROG-cp}"+chmodprog="${CHMODPROG-chmod}"+chownprog="${CHOWNPROG-chown}"+chgrpprog="${CHGRPPROG-chgrp}"+stripprog="${STRIPPROG-strip}"+rmprog="${RMPROG-rm}"+mkdirprog="${MKDIRPROG-mkdir}"++transformbasename=+transform_arg=+instcmd="$mvprog"+chmodcmd="$chmodprog 0755"+chowncmd=+chgrpcmd=+stripcmd=+rmcmd="$rmprog -f"+mvcmd="$mvprog"+src=+dst=+dir_arg=++usage="Usage: $0 [OPTION]... SRCFILE DSTFILE+ or: $0 -d DIR1 DIR2...++In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.+In the second, create the directory path DIR.++Options:+-b=TRANSFORMBASENAME+-c copy source (using $cpprog) instead of moving (using $mvprog).+-d create directories instead of installing files.+-g GROUP $chgrp installed files to GROUP.+-m MODE $chmod installed files to MODE.+-o USER $chown installed files to USER.+-s strip installed files (using $stripprog).+-t=TRANSFORM+--help display this help and exit.+--version display version info and exit.++Environment variables override the default commands:+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG+"++while test -n "$1"; do+ case $1 in+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`+ shift+ continue;;++ -c) instcmd=$cpprog+ shift+ continue;;++ -d) dir_arg=true+ shift+ continue;;++ -g) chgrpcmd="$chgrpprog $2"+ shift+ shift+ continue;;++ --help) echo "$usage"; exit 0;;++ -m) chmodcmd="$chmodprog $2"+ shift+ shift+ continue;;++ -o) chowncmd="$chownprog $2"+ shift+ shift+ continue;;++ -s) stripcmd=$stripprog+ shift+ continue;;++ -t=*) transformarg=`echo $1 | sed 's/-t=//'`+ shift+ continue;;++ --version) echo "$0 $scriptversion"; exit 0;;++ *) if test -z "$src"; then+ src=$1+ else+ # this colon is to work around a 386BSD /bin/sh bug+ :+ dst=$1+ fi+ shift+ continue;;+ esac+done++if test -z "$src"; then+ echo "$0: no input file specified." >&2+ exit 1+fi++# Protect names starting with `-'.+case $src in+ -*) src=./$src ;;+esac++if test -n "$dir_arg"; then+ dst=$src+ src=++ if test -d "$dst"; then+ instcmd=:+ chmodcmd=+ else+ instcmd=$mkdirprog+ fi+else+ # Waiting for this to be detected by the "$instcmd $src $dsttmp" command+ # might cause directories to be created, which would be especially bad+ # if $src (and thus $dsttmp) contains '*'.+ if test ! -f "$src" && test ! -d "$src"; then+ echo "$0: $src does not exist." >&2+ exit 1+ fi++ if test -z "$dst"; then+ echo "$0: no destination specified." >&2+ exit 1+ fi++ # Protect names starting with `-'.+ case $dst in+ -*) dst=./$dst ;;+ esac++ # If destination is a directory, append the input filename; won't work+ # if double slashes aren't ignored.+ if test -d "$dst"; then+ dst=$dst/`basename "$src"`+ fi+fi++# This sed command emulates the dirname command.+dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`++# Make sure that the destination directory exists.++# Skip lots of stat calls in the usual case.+if test ! -d "$dstdir"; then+ defaultIFS='+ '+ IFS="${IFS-$defaultIFS}"++ oIFS=$IFS+ # Some sh's can't handle IFS=/ for some reason.+ IFS='%'+ set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`+ IFS=$oIFS++ pathcomp=++ while test $# -ne 0 ; do+ pathcomp=$pathcomp$1+ shift+ test -d "$pathcomp" || $mkdirprog "$pathcomp"+ pathcomp=$pathcomp/+ done+fi++if test -n "$dir_arg"; then+ $doit $instcmd "$dst" \+ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \+ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }++else+ # If we're going to rename the final executable, determine the name now.+ if test -z "$transformarg"; then+ dstfile=`basename "$dst"`+ else+ dstfile=`basename "$dst" $transformbasename \+ | sed $transformarg`$transformbasename+ fi++ # don't allow the sed command to completely eliminate the filename.+ test -z "$dstfile" && dstfile=`basename "$dst"`++ # Make a couple of temp file names in the proper directory.+ dsttmp=$dstdir/_inst.$$_+ rmtmp=$dstdir/_rm.$$_++ # Trap to clean up those temp files at exit.+ trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0+ trap '(exit $?); exit' 1 2 13 15++ # Move or copy the file name to the temp name+ $doit $instcmd "$src" "$dsttmp" &&++ # and set any options; do chmod last to preserve setuid bits.+ #+ # If any of these fail, we abort the whole thing. If we want to+ # ignore errors from any of these, just make sure not to ignore+ # errors from the above "$doit $instcmd $src $dsttmp" command.+ #+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \+ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&++ # Now remove or move aside any old file at destination location. We+ # try this two ways since rm can't unlink itself on some systems and+ # the destination file might be busy for other reasons. In this case,+ # the final cleanup might fail but the new file should still install+ # successfully.+ {+ if test -f "$dstdir/$dstfile"; then+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \+ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \+ || {+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2+ (exit 1); exit+ }+ else+ :+ fi+ } &&++ # Now rename the file to the real destination.+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"+fi &&++# The final little trick to "correctly" pass the exit status to the exit trap.+{+ (exit 0); exit+}++# Local variables:+# eval: (add-hook 'write-file-hooks 'time-stamp)+# time-stamp-start: "scriptversion="+# time-stamp-format: "%:y-%02m-%02d.%02H"+# time-stamp-end: "$"+# End:
+ standalone/android/tmp/network-2.4.1.2/network.buildinfo.in view
@@ -0,0 +1,5 @@+ghc-options: -DCALLCONV=@CALLCONV@ @EXTRA_CPPFLAGS@+ghc-prof-options: -DCALLCONV=@CALLCONV@ @EXTRA_CPPFLAGS@+cc-options: -DCALLCONV=@CALLCONV@ @EXTRA_CPPFLAGS@+c-sources: @EXTRA_SRCS@+extra-libraries: @EXTRA_LIBS@
+ standalone/android/tmp/network-2.4.1.2/network.cabal view
@@ -0,0 +1,103 @@+name: network+version: 2.4.1.2+license: BSD3+license-file: LICENSE+maintainer: Johan Tibell <johan.tibell@gmail.com>+synopsis: Low-level networking interface+description: Low-level networking interface+category: Network+build-type: Configure+cabal-version: >=1.8+extra-tmp-files:+ config.log config.status autom4te.cache network.buildinfo+ include/HsNetworkConfig.h+extra-source-files:+ README examples/*.hs tests/*.hs config.guess config.sub install-sh+ configure.ac configure network.buildinfo.in+ include/HsNetworkConfig.h.in include/HsNet.h+ -- C sources only used on some systems+ cbits/ancilData.c cbits/asyncAccept.c cbits/initWinSock.c+ cbits/winSockErr.c+homepage: https://github.com/haskell/network+bug-reports: https://github.com/haskell/network/issues++library+ exposed-modules:+ Network+ Network.BSD+ Network.Socket+ Network.Socket.ByteString+ Network.Socket.ByteString.Lazy+ Network.Socket.Internal+ Network.URI+ other-modules:+ Network.Socket.ByteString.Internal+ Network.Socket.Types++ if !os(windows)+ other-modules:+ Network.Socket.ByteString.IOVec+ Network.Socket.ByteString.MsgHdr++ build-depends:+ base >= 3 && < 5,+ bytestring,+ parsec >= 3.0++ if !os(windows)+ build-depends:+ unix >= 2++ extensions:+ CPP, DeriveDataTypeable, ForeignFunctionInterface, TypeSynonymInstances+ include-dirs: include+ includes: HsNet.h+ install-includes: HsNet.h HsNetworkConfig.h+ c-sources: cbits/HsNet.c+ if impl(ghc >= 6.8)+ ghc-options: -fwarn-tabs++test-suite simple+ hs-source-dirs: tests+ main-is: Simple.hs+ type: exitcode-stdio-1.0++ build-depends:+ base < 5,+ bytestring,+ HUnit,+ network,+ test-framework,+ test-framework-hunit++test-suite regression+ hs-source-dirs: tests+ main-is: Regression.hs+ type: exitcode-stdio-1.0++ build-depends:+ base < 5,+ bytestring,+ HUnit,+ network,+ test-framework,+ test-framework-hunit++ ghc-options: -Wall++test-suite uri+ hs-source-dirs: tests+ main-is: uri001.hs+ type: exitcode-stdio-1.0++ build-depends:+ base < 5,+ HUnit,+ network,+ test-framework,+ test-framework-hunit,+ test-framework-quickcheck2++source-repository head+ type: git+ location: git://github.com/haskell/network.git
+ standalone/android/tmp/network-2.4.1.2/tests/Regression.hs view
@@ -0,0 +1,31 @@+-- | Tests for things that didn't work in the past.+module Main where++import Network.Socket+import Test.Framework (Test, defaultMain)+import Test.Framework.Providers.HUnit (testCase)++------------------------------------------------------------------------+-- Tests++-- Used to segfault on OS X 10.8.2 due to AI_NUMERICSERV being set+-- without a service being set. This is a OS X bug.+testGetAddrInfo :: IO ()+testGetAddrInfo = do+ let hints = defaultHints { addrFlags = [AI_NUMERICSERV] }+ _ <- getAddrInfo (Just hints) (Just "localhost") Nothing+ return ()++------------------------------------------------------------------------+-- List of all tests++tests :: [Test]+tests =+ [ testCase "testGetAddrInfo" testGetAddrInfo+ ]++------------------------------------------------------------------------+-- Test harness++main :: IO ()+main = withSocketsDo $ defaultMain tests
+ standalone/android/tmp/network-2.4.1.2/tests/Simple.hs view
@@ -0,0 +1,244 @@+{-# LANGUAGE ScopedTypeVariables #-}++module Main where++import Control.Concurrent (ThreadId, forkIO, myThreadId)+import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar, readMVar)+import qualified Control.Exception as E+import qualified Data.ByteString as S+import qualified Data.ByteString.Char8 as C+import Network.Socket hiding (recv, recvFrom, send, sendTo)+import Network.Socket.ByteString+import Test.Framework (Test, defaultMain, testGroup)+import Test.Framework.Providers.HUnit (testCase)+import Test.HUnit (Assertion, (@=?))++------------------------------------------------------------------------++serverAddr :: String+serverAddr = "127.0.0.1"++testMsg :: S.ByteString+testMsg = C.pack "This is a test message."++------------------------------------------------------------------------+-- Tests++------------------------------------------------------------------------+-- Sending and receiving++testSend :: Assertion+testSend = tcpTest client server+ where+ server sock = recv sock 1024 >>= (@=?) testMsg+ client sock = send sock testMsg++testSendAll :: Assertion+testSendAll = tcpTest client server+ where+ server sock = recv sock 1024 >>= (@=?) testMsg+ client sock = sendAll sock testMsg++testSendTo :: Assertion+testSendTo = udpTest client server+ where+ server sock = recv sock 1024 >>= (@=?) testMsg+ client sock serverPort = do+ addr <- inet_addr serverAddr+ sendTo sock testMsg (SockAddrInet serverPort addr)++testSendAllTo :: Assertion+testSendAllTo = udpTest client server+ where+ server sock = recv sock 1024 >>= (@=?) testMsg+ client sock serverPort = do+ addr <- inet_addr serverAddr+ sendAllTo sock testMsg (SockAddrInet serverPort addr)++testSendMany :: Assertion+testSendMany = tcpTest client server+ where+ server sock = recv sock 1024 >>= (@=?) (S.append seg1 seg2)+ client sock = sendMany sock [seg1, seg2]++ seg1 = C.pack "This is a "+ seg2 = C.pack "test message."++testSendManyTo :: Assertion+testSendManyTo = udpTest client server+ where+ server sock = recv sock 1024 >>= (@=?) (S.append seg1 seg2)+ client sock serverPort = do+ addr <- inet_addr serverAddr+ sendManyTo sock [seg1, seg2] (SockAddrInet serverPort addr)++ seg1 = C.pack "This is a "+ seg2 = C.pack "test message."++testRecv :: Assertion+testRecv = tcpTest client server+ where+ server sock = recv sock 1024 >>= (@=?) testMsg+ client sock = send sock testMsg++testOverFlowRecv :: Assertion+testOverFlowRecv = tcpTest client server+ where+ server sock = do seg1 <- recv sock (S.length testMsg - 3)+ seg2 <- recv sock 1024+ let msg = S.append seg1 seg2+ testMsg @=? msg++ client sock = send sock testMsg++testRecvFrom :: Assertion+testRecvFrom = tcpTest client server+ where+ server sock = do (msg, _) <- recvFrom sock 1024+ testMsg @=? msg++ client sock = do+ serverPort <- getPeerPort sock+ addr <- inet_addr serverAddr+ sendTo sock testMsg (SockAddrInet serverPort addr)++testOverFlowRecvFrom :: Assertion+testOverFlowRecvFrom = tcpTest client server+ where+ server sock = do (seg1, _) <- recvFrom sock (S.length testMsg - 3)+ (seg2, _) <- recvFrom sock 1024+ let msg = S.append seg1 seg2+ testMsg @=? msg++ client sock = send sock testMsg++------------------------------------------------------------------------+-- Other++------------------------------------------------------------------------+-- List of all tests++basicTests :: Test+basicTests = testGroup "Basic socket operations"+ [+ -- Sending and receiving+ testCase "testSend" testSend+ , testCase "testSendAll" testSendAll+ , testCase "testSendTo" testSendTo+ , testCase "testSendAllTo" testSendAllTo+ , testCase "testSendMany" testSendMany+ , testCase "testSendManyTo" testSendManyTo+ , testCase "testRecv" testRecv+ , testCase "testOverFlowRecv" testOverFlowRecv+ , testCase "testRecvFrom" testRecvFrom+ , testCase "testOverFlowRecvFrom" testOverFlowRecvFrom+ ]++tests :: [Test]+tests = [basicTests]++------------------------------------------------------------------------+-- Test helpers++-- | Returns the 'PortNumber' of the peer. Will throw an 'error' if+-- used on a non-IP socket.+getPeerPort :: Socket -> IO PortNumber+getPeerPort sock = do+ sockAddr <- getPeerName sock+ case sockAddr of+ (SockAddrInet port _) -> return port+ (SockAddrInet6 port _ _ _) -> return port+ _ -> error "getPeerPort: only works with IP sockets"++-- | Establish a connection between client and server and then run+-- 'clientAct' and 'serverAct', in different threads. Both actions+-- get passed a connected 'Socket', used for communicating between+-- client and server. 'tcpTest' makes sure that the 'Socket' is+-- closed after the actions have run.+tcpTest :: (Socket -> IO a) -> (Socket -> IO b) -> IO ()+tcpTest clientAct serverAct = do+ portVar <- newEmptyMVar+ test (clientSetup portVar) clientAct (serverSetup portVar) server+ where+ clientSetup portVar = do+ sock <- socket AF_INET Stream defaultProtocol+ addr <- inet_addr serverAddr+ serverPort <- readMVar portVar+ connect sock $ SockAddrInet serverPort addr+ return sock++ serverSetup portVar = do+ sock <- socket AF_INET Stream defaultProtocol+ setSocketOption sock ReuseAddr 1+ addr <- inet_addr serverAddr+ bindSocket sock (SockAddrInet aNY_PORT addr)+ listen sock 1+ serverPort <- socketPort sock+ putMVar portVar serverPort+ return sock++ server sock = do+ (clientSock, _) <- accept sock+ serverAct clientSock+ sClose clientSock++-- | Create an unconnected 'Socket' for sending UDP and receiving+-- datagrams and then run 'clientAct' and 'serverAct'.+udpTest :: (Socket -> PortNumber -> IO a) -> (Socket -> IO b) -> IO ()+udpTest clientAct serverAct = do+ portVar <- newEmptyMVar+ test clientSetup (client portVar) (serverSetup portVar) serverAct+ where+ clientSetup = socket AF_INET Datagram defaultProtocol++ client portVar sock = do+ serverPort <- readMVar portVar+ clientAct sock serverPort++ serverSetup portVar = do+ sock <- socket AF_INET Datagram defaultProtocol+ setSocketOption sock ReuseAddr 1+ addr <- inet_addr serverAddr+ bindSocket sock (SockAddrInet aNY_PORT addr)+ serverPort <- socketPort sock+ putMVar portVar serverPort+ return sock++-- | Run a client/server pair and synchronize them so that the server+-- is started before the client and the specified server action is+-- finished before the client closes the 'Socket'.+test :: IO Socket -> (Socket -> IO b) -> IO Socket -> (Socket -> IO c) -> IO ()+test clientSetup clientAct serverSetup serverAct = do+ tid <- myThreadId+ barrier <- newEmptyMVar+ forkIO $ server barrier+ client tid barrier+ where+ server barrier = do+ E.bracket serverSetup sClose $ \sock -> do+ serverReady+ serverAct sock+ putMVar barrier ()+ where+ -- | Signal to the client that it can proceed.+ serverReady = putMVar barrier ()++ client tid barrier = do+ takeMVar barrier+ -- Transfer exceptions to the main thread.+ bracketWithReraise tid clientSetup sClose $ \res -> do+ clientAct res+ takeMVar barrier++-- | Like 'bracket' but catches and reraises the exception in another+-- thread, specified by the first argument.+bracketWithReraise :: ThreadId -> IO a -> (a -> IO b) -> (a -> IO ()) -> IO ()+bracketWithReraise tid before after thing =+ E.bracket before after thing+ `E.catch` \ (e :: E.SomeException) -> E.throwTo tid e++------------------------------------------------------------------------+-- Test harness++main :: IO ()+main = withSocketsDo $ defaultMain tests
+ standalone/android/tmp/network-2.4.1.2/tests/uri001.hs view
@@ -0,0 +1,1431 @@+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}+--------------------------------------------------------------------------------+-- $Id: URITest.hs,v 1.8 2005/07/19 22:01:27 gklyne Exp $+--+-- Copyright (c) 2004, G. KLYNE. All rights reserved.+-- See end of this file for licence information.+--------------------------------------------------------------------------------+-- |+-- Module : URITest+-- Copyright : (c) 2004, Graham Klyne+-- License : BSD-style (see end of this file)+--+-- Maintainer : Graham Klyne+-- Stability : provisional+-- Portability : H98+--+-- This Module contains test cases for module URI.+--+-- To run this test without using Cabal to build the package+-- (2013-01-05, instructions tested on MacOS):+-- 1. Install Haskell platform+-- 2. cabal install test-framework+-- 3. cabal install test-framework-hunit+-- 4. ghc -XDeriveDataTypeable -D"MIN_VERSION_base(x,y,z)=1" ../Network/URI.hs uri001.hs+-- 5. ./uri001+--+-- Previous build instructions:+-- Using GHC, I compile with this command line:+-- ghc --make -fglasgow-exts+-- -i..\;C:\Dev\Haskell\Lib\HUnit;C:\Dev\Haskell\Lib\Parsec+-- -o URITest.exe URITest -main-is URITest.main+-- The -i line may need changing for alternative installations.+--+--------------------------------------------------------------------------------++module Main where++import Network.URI+ ( URI(..), URIAuth(..)+ , nullURI+ , parseURI, parseURIReference, parseRelativeReference, parseAbsoluteURI+ , parseAbsoluteURI+ , isURI, isURIReference, isRelativeReference, isAbsoluteURI+ , uriIsAbsolute, uriIsRelative+ , relativeTo, nonStrictRelativeTo+ , relativeFrom+ , uriToString+ , isUnescapedInURIComponent+ , isUnescapedInURI, escapeURIString, unEscapeString+ , normalizeCase, normalizeEscape, normalizePathSegments+ )++import Test.HUnit++import Data.Maybe (fromJust)+import System.IO (openFile, IOMode(WriteMode), hClose)+import qualified Test.Framework as TF+import qualified Test.Framework.Providers.HUnit as TF+import qualified Test.Framework.Providers.QuickCheck2 as TF++-- Test supplied string for valid URI reference syntax+-- isValidURIRef :: String -> Bool+-- Test supplied string for valid absolute URI reference syntax+-- isAbsoluteURIRef :: String -> Bool+-- Test supplied string for valid absolute URI syntax+-- isAbsoluteURI :: String -> Bool++data URIType = AbsId -- URI form (absolute, no fragment)+ | AbsRf -- Absolute URI reference+ | RelRf -- Relative URI reference+ | InvRf -- Invalid URI reference+isValidT :: URIType -> Bool+isValidT InvRf = False+isValidT _ = True++isAbsRfT :: URIType -> Bool+isAbsRfT AbsId = True+isAbsRfT AbsRf = True+isAbsRfT _ = False++isRelRfT :: URIType -> Bool+isRelRfT RelRf = True+isRelRfT _ = False++isAbsIdT :: URIType -> Bool+isAbsIdT AbsId = True+isAbsIdT _ = False++testEq :: (Eq a, Show a) => String -> a -> a -> Assertion+testEq lab a1 a2 = assertEqual lab a1 a2++testURIRef :: URIType -> String -> Assertion+testURIRef t u = sequence_+ [ testEq ("test_isURIReference:"++u) (isValidT t) (isURIReference u)+ , testEq ("test_isRelativeReference:"++u) (isRelRfT t) (isRelativeReference u)+ , testEq ("test_isAbsoluteURI:"++u) (isAbsIdT t) (isAbsoluteURI u)+ ]++testURIRefComponents :: String -> (Maybe URI) -> String -> Assertion+testURIRefComponents _lab uv us =+ testEq ("testURIRefComponents:"++us) uv (parseURIReference us)+++testURIRef001 = testURIRef AbsRf "http://example.org/aaa/bbb#ccc"+testURIRef002 = testURIRef AbsId "mailto:local@domain.org"+testURIRef003 = testURIRef AbsRf "mailto:local@domain.org#frag"+testURIRef004 = testURIRef AbsRf "HTTP://EXAMPLE.ORG/AAA/BBB#CCC"+testURIRef005 = testURIRef RelRf "//example.org/aaa/bbb#ccc"+testURIRef006 = testURIRef RelRf "/aaa/bbb#ccc"+testURIRef007 = testURIRef RelRf "bbb#ccc"+testURIRef008 = testURIRef RelRf "#ccc"+testURIRef009 = testURIRef RelRf "#"+testURIRef010 = testURIRef RelRf "/"+-- escapes+testURIRef011 = testURIRef AbsRf "http://example.org/aaa%2fbbb#ccc"+testURIRef012 = testURIRef AbsRf "http://example.org/aaa%2Fbbb#ccc"+testURIRef013 = testURIRef RelRf "%2F"+testURIRef014 = testURIRef RelRf "aaa%2Fbbb"+-- ports+testURIRef015 = testURIRef AbsRf "http://example.org:80/aaa/bbb#ccc"+testURIRef016 = testURIRef AbsRf "http://example.org:/aaa/bbb#ccc"+testURIRef017 = testURIRef AbsRf "http://example.org./aaa/bbb#ccc"+testURIRef018 = testURIRef AbsRf "http://example.123./aaa/bbb#ccc"+-- bare authority+testURIRef019 = testURIRef AbsId "http://example.org"+-- IPv6 literals (from RFC2732):+testURIRef021 = testURIRef AbsId "http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html"+testURIRef022 = testURIRef AbsId "http://[1080:0:0:0:8:800:200C:417A]/index.html"+testURIRef023 = testURIRef AbsId "http://[3ffe:2a00:100:7031::1]"+testURIRef024 = testURIRef AbsId "http://[1080::8:800:200C:417A]/foo"+testURIRef025 = testURIRef AbsId "http://[::192.9.5.5]/ipng"+testURIRef026 = testURIRef AbsId "http://[::FFFF:129.144.52.38]:80/index.html"+testURIRef027 = testURIRef AbsId "http://[2010:836B:4179::836B:4179]"+testURIRef028 = testURIRef RelRf "//[2010:836B:4179::836B:4179]"+testURIRef029 = testURIRef InvRf "[2010:836B:4179::836B:4179]"+-- RFC2396 test cases+testURIRef031 = testURIRef RelRf "./aaa"+testURIRef032 = testURIRef RelRf "../aaa"+testURIRef033 = testURIRef AbsId "g:h"+testURIRef034 = testURIRef RelRf "g"+testURIRef035 = testURIRef RelRf "./g"+testURIRef036 = testURIRef RelRf "g/"+testURIRef037 = testURIRef RelRf "/g"+testURIRef038 = testURIRef RelRf "//g"+testURIRef039 = testURIRef RelRf "?y"+testURIRef040 = testURIRef RelRf "g?y"+testURIRef041 = testURIRef RelRf "#s"+testURIRef042 = testURIRef RelRf "g#s"+testURIRef043 = testURIRef RelRf "g?y#s"+testURIRef044 = testURIRef RelRf ";x"+testURIRef045 = testURIRef RelRf "g;x"+testURIRef046 = testURIRef RelRf "g;x?y#s"+testURIRef047 = testURIRef RelRf "."+testURIRef048 = testURIRef RelRf "./"+testURIRef049 = testURIRef RelRf ".."+testURIRef050 = testURIRef RelRf "../"+testURIRef051 = testURIRef RelRf "../g"+testURIRef052 = testURIRef RelRf "../.."+testURIRef053 = testURIRef RelRf "../../"+testURIRef054 = testURIRef RelRf "../../g"+testURIRef055 = testURIRef RelRf "../../../g"+testURIRef056 = testURIRef RelRf "../../../../g"+testURIRef057 = testURIRef RelRf "/./g"+testURIRef058 = testURIRef RelRf "/../g"+testURIRef059 = testURIRef RelRf "g."+testURIRef060 = testURIRef RelRf ".g"+testURIRef061 = testURIRef RelRf "g.."+testURIRef062 = testURIRef RelRf "..g"+testURIRef063 = testURIRef RelRf "./../g"+testURIRef064 = testURIRef RelRf "./g/."+testURIRef065 = testURIRef RelRf "g/./h"+testURIRef066 = testURIRef RelRf "g/../h"+testURIRef067 = testURIRef RelRf "g;x=1/./y"+testURIRef068 = testURIRef RelRf "g;x=1/../y"+testURIRef069 = testURIRef RelRf "g?y/./x"+testURIRef070 = testURIRef RelRf "g?y/../x"+testURIRef071 = testURIRef RelRf "g#s/./x"+testURIRef072 = testURIRef RelRf "g#s/../x"+testURIRef073 = testURIRef RelRf ""+testURIRef074 = testURIRef RelRf "A'C"+testURIRef075 = testURIRef RelRf "A$C"+testURIRef076 = testURIRef RelRf "A@C"+testURIRef077 = testURIRef RelRf "A,C"+-- Invalid+testURIRef080 = testURIRef InvRf "http://foo.org:80Path/More"+testURIRef081 = testURIRef InvRf "::"+testURIRef082 = testURIRef InvRf " "+testURIRef083 = testURIRef InvRf "%"+testURIRef084 = testURIRef InvRf "A%Z"+testURIRef085 = testURIRef InvRf "%ZZ"+testURIRef086 = testURIRef InvRf "%AZ"+testURIRef087 = testURIRef InvRf "A C"+-- testURIRef088 = -- (case removed)+-- testURIRef089 = -- (case removed)+testURIRef090 = testURIRef InvRf "A\"C"+testURIRef091 = testURIRef InvRf "A`C"+testURIRef092 = testURIRef InvRf "A<C"+testURIRef093 = testURIRef InvRf "A>C"+testURIRef094 = testURIRef InvRf "A^C"+testURIRef095 = testURIRef InvRf "A\\C"+testURIRef096 = testURIRef InvRf "A{C"+testURIRef097 = testURIRef InvRf "A|C"+testURIRef098 = testURIRef InvRf "A}C"+-- From RFC2396:+-- rel_segment = 1*( unreserved | escaped |+-- ";" | "@" | "&" | "=" | "+" | "$" | "," )+-- unreserved = alphanum | mark+-- mark = "-" | "_" | "." | "!" | "~" | "*" | "'" |+-- "(" | ")"+-- Note RFC 2732 allows '[', ']' ONLY for reserved purpose of IPv6 literals,+-- or does it?+testURIRef101 = testURIRef InvRf "A[C"+testURIRef102 = testURIRef InvRf "A]C"+testURIRef103 = testURIRef InvRf "A[**]C"+testURIRef104 = testURIRef InvRf "http://[xyz]/"+testURIRef105 = testURIRef InvRf "http://]/"+testURIRef106 = testURIRef InvRf "http://example.org/[2010:836B:4179::836B:4179]"+testURIRef107 = testURIRef InvRf "http://example.org/abc#[2010:836B:4179::836B:4179]"+testURIRef108 = testURIRef InvRf "http://example.org/xxx/[qwerty]#a[b]"+-- Random other things that crop up+testURIRef111 = testURIRef AbsRf "http://example/Andrȷ"+testURIRef112 = testURIRef AbsId "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/"+testURIRef113 = testURIRef AbsId "http://46229EFFE16A9BD60B9F1BE88B2DB047ADDED785/demo.mp3"+testURIRef114 = testURIRef InvRf "http://example.org/xxx/qwerty#a#b"+testURIRef115 = testURIRef InvRf "dcp.tcp.pft://192.168.0.1:1002:3002?fec=1&crc=0"+testURIRef116 = testURIRef AbsId "dcp.tcp.pft://192.168.0.1:1002?fec=1&crc=0"+testURIRef117 = testURIRef AbsId "foo://"+-- URIs prefixed with IPv4 addresses+testURIRef118 = testURIRef AbsId "http://192.168.0.1.example.com/"+testURIRef119 = testURIRef AbsId "http://192.168.0.1.example.com./"+-- URI prefixed with 3 octets of an IPv4 address and a subdomain part with a leading digit.+testURIRef120 = testURIRef AbsId "http://192.168.0.1test.example.com/"+-- URI with IPv(future) address+testURIRef121 = testURIRef AbsId "http://[v9.123.abc;456.def]/"+testURIRef122 = testEq "v.future authority" + (Just (URIAuth "" "[v9.123.abc;456.def]" ":42"))+ ((maybe Nothing uriAuthority) . parseURI $ "http://[v9.123.abc;456.def]:42/") +-- URI with non-ASCII characters, fail with Network.HTTP escaping code (see below)+-- Currently not supported by Network.URI, but captured here for possible future reference+-- when IRI support may be added.+testURIRef123 = testURIRef AbsId "http://example.com/test123/䡥汬漬⁗潲汤/index.html"+testURIRef124 = testURIRef AbsId "http://example.com/test124/Москва/index.html"++-- From report by Alexander Ivanov:+-- should return " 䡥汬漬⁗潲汤", but returns "Hello, World" instead+-- print $ urlDecode $ urlEncode " 䡥汬漬⁗潲汤"+-- should return "Москва"+-- print $ urlDecode $ urlEncode "Москва"++testURIRefSuite = TF.testGroup "Test URIrefs" testURIRefList+testURIRefList =+ [ TF.testCase "testURIRef001" testURIRef001+ , TF.testCase "testURIRef002" testURIRef002+ , TF.testCase "testURIRef003" testURIRef003+ , TF.testCase "testURIRef004" testURIRef004+ , TF.testCase "testURIRef005" testURIRef005+ , TF.testCase "testURIRef006" testURIRef006+ , TF.testCase "testURIRef007" testURIRef007+ , TF.testCase "testURIRef008" testURIRef008+ , TF.testCase "testURIRef009" testURIRef009+ , TF.testCase "testURIRef010" testURIRef010+ --+ , TF.testCase "testURIRef011" testURIRef011+ , TF.testCase "testURIRef012" testURIRef012+ , TF.testCase "testURIRef013" testURIRef013+ , TF.testCase "testURIRef014" testURIRef014+ , TF.testCase "testURIRef015" testURIRef015+ , TF.testCase "testURIRef016" testURIRef016+ , TF.testCase "testURIRef017" testURIRef017+ , TF.testCase "testURIRef018" testURIRef018+ --+ , TF.testCase "testURIRef019" testURIRef019+ --+ , TF.testCase "testURIRef021" testURIRef021+ , TF.testCase "testURIRef022" testURIRef022+ , TF.testCase "testURIRef023" testURIRef023+ , TF.testCase "testURIRef024" testURIRef024+ , TF.testCase "testURIRef025" testURIRef025+ , TF.testCase "testURIRef026" testURIRef026+ , TF.testCase "testURIRef027" testURIRef027+ , TF.testCase "testURIRef028" testURIRef028+ , TF.testCase "testURIRef029" testURIRef029+ --+ , TF.testCase "testURIRef031" testURIRef031+ , TF.testCase "testURIRef032" testURIRef032+ , TF.testCase "testURIRef033" testURIRef033+ , TF.testCase "testURIRef034" testURIRef034+ , TF.testCase "testURIRef035" testURIRef035+ , TF.testCase "testURIRef036" testURIRef036+ , TF.testCase "testURIRef037" testURIRef037+ , TF.testCase "testURIRef038" testURIRef038+ , TF.testCase "testURIRef039" testURIRef039+ , TF.testCase "testURIRef040" testURIRef040+ , TF.testCase "testURIRef041" testURIRef041+ , TF.testCase "testURIRef042" testURIRef042+ , TF.testCase "testURIRef043" testURIRef043+ , TF.testCase "testURIRef044" testURIRef044+ , TF.testCase "testURIRef045" testURIRef045+ , TF.testCase "testURIRef046" testURIRef046+ , TF.testCase "testURIRef047" testURIRef047+ , TF.testCase "testURIRef048" testURIRef048+ , TF.testCase "testURIRef049" testURIRef049+ , TF.testCase "testURIRef050" testURIRef050+ , TF.testCase "testURIRef051" testURIRef051+ , TF.testCase "testURIRef052" testURIRef052+ , TF.testCase "testURIRef053" testURIRef053+ , TF.testCase "testURIRef054" testURIRef054+ , TF.testCase "testURIRef055" testURIRef055+ , TF.testCase "testURIRef056" testURIRef056+ , TF.testCase "testURIRef057" testURIRef057+ , TF.testCase "testURIRef058" testURIRef058+ , TF.testCase "testURIRef059" testURIRef059+ , TF.testCase "testURIRef060" testURIRef060+ , TF.testCase "testURIRef061" testURIRef061+ , TF.testCase "testURIRef062" testURIRef062+ , TF.testCase "testURIRef063" testURIRef063+ , TF.testCase "testURIRef064" testURIRef064+ , TF.testCase "testURIRef065" testURIRef065+ , TF.testCase "testURIRef066" testURIRef066+ , TF.testCase "testURIRef067" testURIRef067+ , TF.testCase "testURIRef068" testURIRef068+ , TF.testCase "testURIRef069" testURIRef069+ , TF.testCase "testURIRef070" testURIRef070+ , TF.testCase "testURIRef071" testURIRef071+ , TF.testCase "testURIRef072" testURIRef072+ , TF.testCase "testURIRef073" testURIRef073+ , TF.testCase "testURIRef074" testURIRef074+ , TF.testCase "testURIRef075" testURIRef075+ , TF.testCase "testURIRef076" testURIRef076+ , TF.testCase "testURIRef077" testURIRef077+ --+ , TF.testCase "testURIRef080" testURIRef080+ , TF.testCase "testURIRef081" testURIRef081+ , TF.testCase "testURIRef082" testURIRef082+ , TF.testCase "testURIRef083" testURIRef083+ , TF.testCase "testURIRef084" testURIRef084+ , TF.testCase "testURIRef085" testURIRef085+ , TF.testCase "testURIRef086" testURIRef086+ , TF.testCase "testURIRef087" testURIRef087+ -- testURIRef088,+ -- testURIRef089,+ , TF.testCase "testURIRef090" testURIRef090+ , TF.testCase "testURIRef091" testURIRef091+ , TF.testCase "testURIRef092" testURIRef092+ , TF.testCase "testURIRef093" testURIRef093+ , TF.testCase "testURIRef094" testURIRef094+ , TF.testCase "testURIRef095" testURIRef095+ , TF.testCase "testURIRef096" testURIRef096+ , TF.testCase "testURIRef097" testURIRef097+ , TF.testCase "testURIRef098" testURIRef098+ -- testURIRef099,+ --+ , TF.testCase "testURIRef101" testURIRef101+ , TF.testCase "testURIRef102" testURIRef102+ , TF.testCase "testURIRef103" testURIRef103+ , TF.testCase "testURIRef104" testURIRef104+ , TF.testCase "testURIRef105" testURIRef105+ , TF.testCase "testURIRef106" testURIRef106+ , TF.testCase "testURIRef107" testURIRef107+ , TF.testCase "testURIRef108" testURIRef108+ --+ , TF.testCase "testURIRef111" testURIRef111+ , TF.testCase "testURIRef112" testURIRef112+ , TF.testCase "testURIRef113" testURIRef113+ , TF.testCase "testURIRef114" testURIRef114+ , TF.testCase "testURIRef115" testURIRef115+ , TF.testCase "testURIRef116" testURIRef116+ , TF.testCase "testURIRef117" testURIRef117+ --+ , TF.testCase "testURIRef118" testURIRef118+ , TF.testCase "testURIRef119" testURIRef119+ , TF.testCase "testURIRef120" testURIRef120+ --+ , TF.testCase "testURIRef121" testURIRef121+ , TF.testCase "testURIRef122" testURIRef122+ -- IRI test cases not currently supported+ -- , TF.testCase "testURIRef123" testURIRef123+ -- , TF.testCase "testURIRef124" testURIRef124+ ]++-- test decomposition of URI into components+testComponent01 = testURIRefComponents "testComponent01"+ ( Just $ URI+ { uriScheme = "http:"+ , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")+ , uriPath = "/aaa/bbb"+ , uriQuery = "?qqq"+ , uriFragment = "#fff"+ } )+ "http://user:pass@example.org:99/aaa/bbb?qqq#fff"+testComponent02 = testURIRefComponents "testComponent02"+ ( const Nothing+ ( Just $ URI+ { uriScheme = "http:"+ , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")+ , uriPath = "aaa/bbb"+ , uriQuery = ""+ , uriFragment = ""+ } )+ )+ "http://user:pass@example.org:99aaa/bbb"+testComponent03 = testURIRefComponents "testComponent03"+ ( Just $ URI+ { uriScheme = "http:"+ , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")+ , uriPath = ""+ , uriQuery = "?aaa/bbb"+ , uriFragment = ""+ } )+ "http://user:pass@example.org:99?aaa/bbb"+testComponent04 = testURIRefComponents "testComponent03"+ ( Just $ URI+ { uriScheme = "http:"+ , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")+ , uriPath = ""+ , uriQuery = ""+ , uriFragment = "#aaa/bbb"+ } )+ "http://user:pass@example.org:99#aaa/bbb"+-- These test cases contributed by Robert Buck (mathworks.com)+testComponent11 = testURIRefComponents "testComponent03"+ ( Just $ URI+ { uriScheme = "about:"+ , uriAuthority = Nothing+ , uriPath = ""+ , uriQuery = ""+ , uriFragment = ""+ } )+ "about:"+testComponent12 = testURIRefComponents "testComponent03"+ ( Just $ URI+ { uriScheme = "file:"+ , uriAuthority = Just (URIAuth "" "windowsauth" "")+ , uriPath = "/d$"+ , uriQuery = ""+ , uriFragment = ""+ } )+ "file://windowsauth/d$"++testComponentSuite = TF.testGroup "Test URIrefs" $+ [ TF.testCase "testComponent01" testComponent01+ , TF.testCase "testComponent02" testComponent02+ , TF.testCase "testComponent03" testComponent03+ , TF.testCase "testComponent04" testComponent04+ , TF.testCase "testComponent11" testComponent11+ , TF.testCase "testComponent12" testComponent12+ ]++-- Get reference relative to given base+-- relativeRef :: String -> String -> String+--+-- Get absolute URI given base and relative reference+-- absoluteURI :: String -> String -> String+--+-- Test cases taken from: http://www.w3.org/2000/10/swap/uripath.py+-- (Thanks, Dan Connolly)+--+-- NOTE: absoluteURI base (relativeRef base u) is always equivalent to u.+-- cf. http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html++testRelSplit :: String -> String -> String -> String -> Assertion+testRelSplit label base uabs urel =+ testEq label urel (mkrel puabs pubas)+ where+ mkrel (Just u1) (Just u2) = show (u1 `relativeFrom` u2)+ mkrel Nothing _ = "Invalid URI: "++urel+ mkrel _ Nothing = "Invalid URI: "++uabs+ puabs = parseURIReference uabs+ pubas = parseURIReference base++testRelJoin :: String -> String -> String -> String -> Assertion+testRelJoin label base urel uabs =+ testEq label uabs (mkabs purel pubas)+ where+ mkabs (Just u1) (Just u2) = show (u1 `relativeTo` u2)+ mkabs Nothing _ = "Invalid URI: "++urel+ mkabs _ Nothing = "Invalid URI: "++uabs+ purel = parseURIReference urel+ pubas = parseURIReference base++testRelative :: String -> String -> String -> String -> Assertion+testRelative label base uabs urel = sequence_+ [+ (testRelSplit (label++"(rel)") base uabs urel),+ (testRelJoin (label++"(abs)") base urel uabs)+ ]++testRelative01 = testRelative "testRelative01"+ "foo:xyz" "bar:abc" "bar:abc"+testRelative02 = testRelative "testRelative02"+ "http://example/x/y/z" "http://example/x/abc" "../abc"+testRelative03 = testRelative "testRelative03"+ "http://example2/x/y/z" "http://example/x/abc" "//example/x/abc"+ -- "http://example2/x/y/z" "http://example/x/abc" "http://example/x/abc"+testRelative04 = testRelative "testRelative04"+ "http://ex/x/y/z" "http://ex/x/r" "../r"+testRelative05 = testRelative "testRelative05"+ "http://ex/x/y/z" "http://ex/r" "/r"+ -- "http://ex/x/y/z" "http://ex/r" "../../r"+testRelative06 = testRelative "testRelative06"+ "http://ex/x/y/z" "http://ex/x/y/q/r" "q/r"+testRelative07 = testRelative "testRelative07"+ "http://ex/x/y" "http://ex/x/q/r#s" "q/r#s"+testRelative08 = testRelative "testRelative08"+ "http://ex/x/y" "http://ex/x/q/r#s/t" "q/r#s/t"+testRelative09 = testRelative "testRelative09"+ "http://ex/x/y" "ftp://ex/x/q/r" "ftp://ex/x/q/r"+testRelative10 = testRelative "testRelative10"+ -- "http://ex/x/y" "http://ex/x/y" "y"+ "http://ex/x/y" "http://ex/x/y" ""+testRelative11 = testRelative "testRelative11"+ -- "http://ex/x/y/" "http://ex/x/y/" "./"+ "http://ex/x/y/" "http://ex/x/y/" ""+testRelative12 = testRelative "testRelative12"+ -- "http://ex/x/y/pdq" "http://ex/x/y/pdq" "pdq"+ "http://ex/x/y/pdq" "http://ex/x/y/pdq" ""+testRelative13 = testRelative "testRelative13"+ "http://ex/x/y/" "http://ex/x/y/z/" "z/"+testRelative14 = testRelative "testRelative14"+ -- "file:/swap/test/animal.rdf" "file:/swap/test/animal.rdf#Animal" "animal.rdf#Animal"+ "file:/swap/test/animal.rdf" "file:/swap/test/animal.rdf#Animal" "#Animal"+testRelative15 = testRelative "testRelative15"+ "file:/e/x/y/z" "file:/e/x/abc" "../abc"+testRelative16 = testRelative "testRelative16"+ "file:/example2/x/y/z" "file:/example/x/abc" "/example/x/abc"+testRelative17 = testRelative "testRelative17"+ "file:/ex/x/y/z" "file:/ex/x/r" "../r"+testRelative18 = testRelative "testRelative18"+ "file:/ex/x/y/z" "file:/r" "/r"+testRelative19 = testRelative "testRelative19"+ "file:/ex/x/y" "file:/ex/x/q/r" "q/r"+testRelative20 = testRelative "testRelative20"+ "file:/ex/x/y" "file:/ex/x/q/r#s" "q/r#s"+testRelative21 = testRelative "testRelative21"+ "file:/ex/x/y" "file:/ex/x/q/r#" "q/r#"+testRelative22 = testRelative "testRelative22"+ "file:/ex/x/y" "file:/ex/x/q/r#s/t" "q/r#s/t"+testRelative23 = testRelative "testRelative23"+ "file:/ex/x/y" "ftp://ex/x/q/r" "ftp://ex/x/q/r"+testRelative24 = testRelative "testRelative24"+ -- "file:/ex/x/y" "file:/ex/x/y" "y"+ "file:/ex/x/y" "file:/ex/x/y" ""+testRelative25 = testRelative "testRelative25"+ -- "file:/ex/x/y/" "file:/ex/x/y/" "./"+ "file:/ex/x/y/" "file:/ex/x/y/" ""+testRelative26 = testRelative "testRelative26"+ -- "file:/ex/x/y/pdq" "file:/ex/x/y/pdq" "pdq"+ "file:/ex/x/y/pdq" "file:/ex/x/y/pdq" ""+testRelative27 = testRelative "testRelative27"+ "file:/ex/x/y/" "file:/ex/x/y/z/" "z/"+testRelative28 = testRelative "testRelative28"+ "file:/devel/WWW/2000/10/swap/test/reluri-1.n3"+ "file://meetings.example.com/cal#m1" "//meetings.example.com/cal#m1"+ -- "file:/devel/WWW/2000/10/swap/test/reluri-1.n3"+ -- "file://meetings.example.com/cal#m1" "file://meetings.example.com/cal#m1"+testRelative29 = testRelative "testRelative29"+ "file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3"+ "file://meetings.example.com/cal#m1" "//meetings.example.com/cal#m1"+ -- "file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3"+ -- "file://meetings.example.com/cal#m1" "file://meetings.example.com/cal#m1"+testRelative30 = testRelative "testRelative30"+ "file:/some/dir/foo" "file:/some/dir/#blort" "./#blort"+testRelative31 = testRelative "testRelative31"+ "file:/some/dir/foo" "file:/some/dir/#" "./#"+testRelative32 = testRelative "testRelative32"+ "http://ex/x/y" "http://ex/x/q:r" "./q:r"+ -- see RFC2396bis, section 5 ^^+testRelative33 = testRelative "testRelative33"+ "http://ex/x/y" "http://ex/x/p=q:r" "./p=q:r"+ -- "http://ex/x/y" "http://ex/x/p=q:r" "p=q:r"+testRelative34 = testRelative "testRelative34"+ "http://ex/x/y?pp/qq" "http://ex/x/y?pp/rr" "?pp/rr"+testRelative35 = testRelative "testRelative35"+ "http://ex/x/y?pp/qq" "http://ex/x/y/z" "y/z"+testRelative36 = testRelative "testRelative36"+ "mailto:local"+ "mailto:local/qual@domain.org#frag"+ "local/qual@domain.org#frag"+testRelative37 = testRelative "testRelative37"+ "mailto:local/qual1@domain1.org"+ "mailto:local/more/qual2@domain2.org#frag"+ "more/qual2@domain2.org#frag"+testRelative38 = testRelative "testRelative38"+ "http://ex/x/z?q" "http://ex/x/y?q" "y?q"+testRelative39 = testRelative "testRelative39"+ "http://ex?p" "http://ex/x/y?q" "/x/y?q"+testRelative40 = testRelative "testRelative40"+ "foo:a/b" "foo:a/c/d" "c/d"+testRelative41 = testRelative "testRelative41"+ "foo:a/b" "foo:/c/d" "/c/d"+testRelative42 = testRelative "testRelative42"+ "foo:a/b?c#d" "foo:a/b?c" ""+testRelative43 = testRelative "testRelative42"+ "foo:a" "foo:b/c" "b/c"+testRelative44 = testRelative "testRelative44"+ "foo:/a/y/z" "foo:/a/b/c" "../b/c"+testRelative45 = testRelJoin "testRelative45"+ "foo:a" "./b/c" "foo:b/c"+testRelative46 = testRelJoin "testRelative46"+ "foo:a" "/./b/c" "foo:/b/c"+testRelative47 = testRelJoin "testRelative47"+ "foo://a//b/c" "../../d" "foo://a/d"+testRelative48 = testRelJoin "testRelative48"+ "foo:a" "." "foo:"+testRelative49 = testRelJoin "testRelative49"+ "foo:a" ".." "foo:"++-- add escape tests+testRelative50 = testRelative "testRelative50"+ "http://example/x/y%2Fz" "http://example/x/abc" "abc"+testRelative51 = testRelative "testRelative51"+ "http://example/a/x/y/z" "http://example/a/x%2Fabc" "../../x%2Fabc"+testRelative52 = testRelative "testRelative52"+ "http://example/a/x/y%2Fz" "http://example/a/x%2Fabc" "../x%2Fabc"+testRelative53 = testRelative "testRelative53"+ "http://example/x%2Fy/z" "http://example/x%2Fy/abc" "abc"+testRelative54 = testRelative "testRelative54"+ "http://ex/x/y" "http://ex/x/q%3Ar" "q%3Ar"+testRelative55 = testRelative "testRelative55"+ "http://example/x/y%2Fz" "http://example/x%2Fabc" "/x%2Fabc"+-- Apparently, TimBL prefers the following way to 41, 42 above+-- cf. http://lists.w3.org/Archives/Public/uri/2003Feb/0028.html+-- He also notes that there may be different relative fuctions+-- that satisfy the basic equivalence axiom:+-- cf. http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html+testRelative56 = testRelative "testRelative56"+ "http://example/x/y/z" "http://example/x%2Fabc" "/x%2Fabc"+testRelative57 = testRelative "testRelative57"+ "http://example/x/y%2Fz" "http://example/x%2Fabc" "/x%2Fabc"++-- Other oddball tests+ -- Check segment normalization code:+testRelative60 = testRelJoin "testRelative60"+ "ftp://example/x/y" "http://example/a/b/../../c" "http://example/c"+testRelative61 = testRelJoin "testRelative61"+ "ftp://example/x/y" "http://example/a/b/c/../../" "http://example/a/"+testRelative62 = testRelJoin "testRelative62"+ "ftp://example/x/y" "http://example/a/b/c/./" "http://example/a/b/c/"+testRelative63 = testRelJoin "testRelative63"+ "ftp://example/x/y" "http://example/a/b/c/.././" "http://example/a/b/"+testRelative64 = testRelJoin "testRelative64"+ "ftp://example/x/y" "http://example/a/b/c/d/../../../../e" "http://example/e"+testRelative65 = testRelJoin "testRelative65"+ "ftp://example/x/y" "http://example/a/b/c/d/../.././../../e" "http://example/e"+ -- Check handling of queries and fragments with non-relative paths+testRelative70 = testRelative "testRelative70"+ "mailto:local1@domain1?query1" "mailto:local2@domain2"+ "local2@domain2"+testRelative71 = testRelative "testRelative71"+ "mailto:local1@domain1" "mailto:local2@domain2?query2"+ "local2@domain2?query2"+testRelative72 = testRelative "testRelative72"+ "mailto:local1@domain1?query1" "mailto:local2@domain2?query2"+ "local2@domain2?query2"+testRelative73 = testRelative "testRelative73"+ "mailto:local@domain?query1" "mailto:local@domain?query2"+ "?query2"+testRelative74 = testRelative "testRelative74"+ "mailto:?query1" "mailto:local@domain?query2"+ "local@domain?query2"+testRelative75 = testRelative "testRelative75"+ "mailto:local@domain?query1" "mailto:local@domain?query2"+ "?query2"+testRelative76 = testRelative "testRelative76"+ "foo:bar" "http://example/a/b?c/../d" "http://example/a/b?c/../d"+testRelative77 = testRelative "testRelative77"+ "foo:bar" "http://example/a/b#c/../d" "http://example/a/b#c/../d"+{- These (78-81) are some awkward test cases thrown up by a question on the URI list:+ http://lists.w3.org/Archives/Public/uri/2005Jul/0013+ Mote that RFC 3986 discards path segents after the final '/' only when merging two+ paths - otherwise the final segment in the base URI is mnaintained. This leads to+ difficulty in constructinmg a reversible relativeTo/relativeFrom pair of functions.+-}+testRelative78 = testRelative "testRelative78"+ "http://www.example.com/data/limit/.." "http://www.example.com/data/limit/test.xml"+ "test.xml"+testRelative79 = testRelative "testRelative79"+ "file:/some/dir/foo" "file:/some/dir/#blort" "./#blort"+testRelative80 = testRelative "testRelative80"+ "file:/some/dir/foo" "file:/some/dir/#" "./#"+testRelative81 = testRelative "testRelative81"+ "file:/some/dir/.." "file:/some/dir/#blort" "./#blort"++-- testRelative base abs rel+-- testRelSplit base abs rel+-- testRelJoin base rel abs+testRelative91 = testRelSplit "testRelative91"+ "http://example.org/base/uri" "http:this"+ "this"+testRelative92 = testRelJoin "testRelative92"+ "http://example.org/base/uri" "http:this"+ "http:this"+testRelative93 = testRelJoin "testRelative93"+ "http:base" "http:this"+ "http:this"+testRelative94 = testRelJoin "testRelative94"+ "f:/a" ".//g"+ "f://g"+testRelative95 = testRelJoin "testRelative95"+ "f://example.org/base/a" "b/c//d/e"+ "f://example.org/base/b/c//d/e"+testRelative96 = testRelJoin "testRelative96"+ "mid:m@example.ord/c@example.org" "m2@example.ord/c2@example.org"+ "mid:m@example.ord/m2@example.ord/c2@example.org"+testRelative97 = testRelJoin "testRelative97"+ "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/" "mini1.xml"+ "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/mini1.xml"+testRelative98 = testRelative "testRelative98"+ "foo:a/y/z" "foo:a/b/c" "../b/c"+testRelative99 = testRelJoin "testRelative99"+ "f:/a/" "..//g"+ "f://g"+++testRelativeSuite = TF.testGroup "Test Relative URIs" testRelativeList+testRelativeList =+ [ TF.testCase "testRelative01" testRelative01+ , TF.testCase "testRelative02" testRelative02+ , TF.testCase "testRelative03" testRelative03+ , TF.testCase "testRelative04" testRelative04+ , TF.testCase "testRelative05" testRelative05+ , TF.testCase "testRelative06" testRelative06+ , TF.testCase "testRelative07" testRelative07+ , TF.testCase "testRelative08" testRelative08+ , TF.testCase "testRelative09" testRelative09+ , TF.testCase "testRelative10" testRelative10+ , TF.testCase "testRelative11" testRelative11+ , TF.testCase "testRelative12" testRelative12+ , TF.testCase "testRelative13" testRelative13+ , TF.testCase "testRelative14" testRelative14+ , TF.testCase "testRelative15" testRelative15+ , TF.testCase "testRelative16" testRelative16+ , TF.testCase "testRelative17" testRelative17+ , TF.testCase "testRelative18" testRelative18+ , TF.testCase "testRelative19" testRelative19+ , TF.testCase "testRelative20" testRelative20+ , TF.testCase "testRelative21" testRelative21+ , TF.testCase "testRelative22" testRelative22+ , TF.testCase "testRelative23" testRelative23+ , TF.testCase "testRelative24" testRelative24+ , TF.testCase "testRelative25" testRelative25+ , TF.testCase "testRelative26" testRelative26+ , TF.testCase "testRelative27" testRelative27+ , TF.testCase "testRelative28" testRelative28+ , TF.testCase "testRelative29" testRelative29+ , TF.testCase "testRelative30" testRelative30+ , TF.testCase "testRelative31" testRelative31+ , TF.testCase "testRelative32" testRelative32+ , TF.testCase "testRelative33" testRelative33+ , TF.testCase "testRelative34" testRelative34+ , TF.testCase "testRelative35" testRelative35+ , TF.testCase "testRelative36" testRelative36+ , TF.testCase "testRelative37" testRelative37+ , TF.testCase "testRelative38" testRelative38+ , TF.testCase "testRelative39" testRelative39+ , TF.testCase "testRelative40" testRelative40+ , TF.testCase "testRelative41" testRelative41+ , TF.testCase "testRelative42" testRelative42+ , TF.testCase "testRelative43" testRelative43+ , TF.testCase "testRelative44" testRelative44+ , TF.testCase "testRelative45" testRelative45+ , TF.testCase "testRelative46" testRelative46+ , TF.testCase "testRelative47" testRelative47+ , TF.testCase "testRelative48" testRelative48+ , TF.testCase "testRelative49" testRelative49+ --+ , TF.testCase "testRelative50" testRelative50+ , TF.testCase "testRelative51" testRelative51+ , TF.testCase "testRelative52" testRelative52+ , TF.testCase "testRelative53" testRelative53+ , TF.testCase "testRelative54" testRelative54+ , TF.testCase "testRelative55" testRelative55+ , TF.testCase "testRelative56" testRelative56+ , TF.testCase "testRelative57" testRelative57+ --+ , TF.testCase "testRelative60" testRelative60+ , TF.testCase "testRelative61" testRelative61+ , TF.testCase "testRelative62" testRelative62+ , TF.testCase "testRelative63" testRelative63+ , TF.testCase "testRelative64" testRelative64+ , TF.testCase "testRelative65" testRelative65+ --+ , TF.testCase "testRelative70" testRelative70+ , TF.testCase "testRelative71" testRelative71+ , TF.testCase "testRelative72" testRelative72+ , TF.testCase "testRelative73" testRelative73+ , TF.testCase "testRelative74" testRelative74+ , TF.testCase "testRelative75" testRelative75+ , TF.testCase "testRelative76" testRelative76+ , TF.testCase "testRelative77" testRelative77+ -- Awkward cases:+ , TF.testCase "testRelative78" testRelative78+ , TF.testCase "testRelative79" testRelative79+ , TF.testCase "testRelative80" testRelative80+ , TF.testCase "testRelative81" testRelative81+ --+ -- , TF.testCase "testRelative90" testRelative90+ , TF.testCase "testRelative91" testRelative91+ , TF.testCase "testRelative92" testRelative92+ , TF.testCase "testRelative93" testRelative93+ , TF.testCase "testRelative94" testRelative94+ , TF.testCase "testRelative95" testRelative95+ , TF.testCase "testRelative96" testRelative96+ , TF.testCase "testRelative97" testRelative97+ , TF.testCase "testRelative98" testRelative98+ , TF.testCase "testRelative99" testRelative99+ ]++-- RFC2396 relative-to-absolute URI tests++rfcbase = "http://a/b/c/d;p?q"+-- normal cases, RFC2396bis 5.4.1+testRFC01 = testRelJoin "testRFC01" rfcbase "g:h" "g:h"+testRFC02 = testRelJoin "testRFC02" rfcbase "g" "http://a/b/c/g"+testRFC03 = testRelJoin "testRFC03" rfcbase "./g" "http://a/b/c/g"+testRFC04 = testRelJoin "testRFC04" rfcbase "g/" "http://a/b/c/g/"+testRFC05 = testRelJoin "testRFC05" rfcbase "/g" "http://a/g"+testRFC06 = testRelJoin "testRFC06" rfcbase "//g" "http://g"+testRFC07 = testRelJoin "testRFC07" rfcbase "?y" "http://a/b/c/d;p?y"+testRFC08 = testRelJoin "testRFC08" rfcbase "g?y" "http://a/b/c/g?y"+testRFC09 = testRelJoin "testRFC09" rfcbase "?q#s" "http://a/b/c/d;p?q#s"+testRFC23 = testRelJoin "testRFC10" rfcbase "#s" "http://a/b/c/d;p?q#s"+testRFC10 = testRelJoin "testRFC11" rfcbase "g#s" "http://a/b/c/g#s"+testRFC11 = testRelJoin "testRFC12" rfcbase "g?y#s" "http://a/b/c/g?y#s"+testRFC12 = testRelJoin "testRFC13" rfcbase ";x" "http://a/b/c/;x"+testRFC13 = testRelJoin "testRFC14" rfcbase "g;x" "http://a/b/c/g;x"+testRFC14 = testRelJoin "testRFC15" rfcbase "g;x?y#s" "http://a/b/c/g;x?y#s"+testRFC24 = testRelJoin "testRFC16" rfcbase "" "http://a/b/c/d;p?q"+testRFC15 = testRelJoin "testRFC17" rfcbase "." "http://a/b/c/"+testRFC16 = testRelJoin "testRFC18" rfcbase "./" "http://a/b/c/"+testRFC17 = testRelJoin "testRFC19" rfcbase ".." "http://a/b/"+testRFC18 = testRelJoin "testRFC20" rfcbase "../" "http://a/b/"+testRFC19 = testRelJoin "testRFC21" rfcbase "../g" "http://a/b/g"+testRFC20 = testRelJoin "testRFC22" rfcbase "../.." "http://a/"+testRFC21 = testRelJoin "testRFC23" rfcbase "../../" "http://a/"+testRFC22 = testRelJoin "testRFC24" rfcbase "../../g" "http://a/g"+-- abnormal cases, RFC2396bis 5.4.2+testRFC31 = testRelJoin "testRFC31" rfcbase "?q" rfcbase+testRFC32 = testRelJoin "testRFC32" rfcbase "../../../g" "http://a/g"+testRFC33 = testRelJoin "testRFC33" rfcbase "../../../../g" "http://a/g"+testRFC34 = testRelJoin "testRFC34" rfcbase "/./g" "http://a/g"+testRFC35 = testRelJoin "testRFC35" rfcbase "/../g" "http://a/g"+testRFC36 = testRelJoin "testRFC36" rfcbase "g." "http://a/b/c/g."+testRFC37 = testRelJoin "testRFC37" rfcbase ".g" "http://a/b/c/.g"+testRFC38 = testRelJoin "testRFC38" rfcbase "g.." "http://a/b/c/g.."+testRFC39 = testRelJoin "testRFC39" rfcbase "..g" "http://a/b/c/..g"+testRFC40 = testRelJoin "testRFC40" rfcbase "./../g" "http://a/b/g"+testRFC41 = testRelJoin "testRFC41" rfcbase "./g/." "http://a/b/c/g/"+testRFC42 = testRelJoin "testRFC42" rfcbase "g/./h" "http://a/b/c/g/h"+testRFC43 = testRelJoin "testRFC43" rfcbase "g/../h" "http://a/b/c/h"+testRFC44 = testRelJoin "testRFC44" rfcbase "g;x=1/./y" "http://a/b/c/g;x=1/y"+testRFC45 = testRelJoin "testRFC45" rfcbase "g;x=1/../y" "http://a/b/c/y"+testRFC46 = testRelJoin "testRFC46" rfcbase "g?y/./x" "http://a/b/c/g?y/./x"+testRFC47 = testRelJoin "testRFC47" rfcbase "g?y/../x" "http://a/b/c/g?y/../x"+testRFC48 = testRelJoin "testRFC48" rfcbase "g#s/./x" "http://a/b/c/g#s/./x"+testRFC49 = testRelJoin "testRFC49" rfcbase "g#s/../x" "http://a/b/c/g#s/../x"+testRFC50 = testRelJoin "testRFC50" rfcbase "http:x" "http:x"++-- Null path tests+-- See RFC2396bis, section 5.2,+-- "If the base URI's path component is the empty string, then a single+-- slash character is copied to the buffer"+testRFC60 = testRelative "testRFC60" "http://ex" "http://ex/x/y?q" "/x/y?q"+testRFC61 = testRelJoin "testRFC61" "http://ex" "x/y?q" "http://ex/x/y?q"+testRFC62 = testRelative "testRFC62" "http://ex?p" "http://ex/x/y?q" "/x/y?q"+testRFC63 = testRelJoin "testRFC63" "http://ex?p" "x/y?q" "http://ex/x/y?q"+testRFC64 = testRelative "testRFC64" "http://ex#f" "http://ex/x/y?q" "/x/y?q"+testRFC65 = testRelJoin "testRFC65" "http://ex#f" "x/y?q" "http://ex/x/y?q"+testRFC66 = testRelative "testRFC66" "http://ex?p" "http://ex/x/y#g" "/x/y#g"+testRFC67 = testRelJoin "testRFC67" "http://ex?p" "x/y#g" "http://ex/x/y#g"+testRFC68 = testRelative "testRFC68" "http://ex" "http://ex/" "/"+testRFC69 = testRelJoin "testRFC69" "http://ex" "./" "http://ex/"+testRFC70 = testRelative "testRFC70" "http://ex" "http://ex/a/b" "/a/b"+testRFC71 = testRelative "testRFC71" "http://ex/a/b" "http://ex" "./"++testRFC2396Suite = TF.testGroup "Test RFC2396 examples" testRFC2396List+testRFC2396List =+ [ TF.testCase "testRFC01" testRFC01+ , TF.testCase "testRFC02" testRFC02+ , TF.testCase "testRFC03" testRFC03+ , TF.testCase "testRFC04" testRFC04+ , TF.testCase "testRFC05" testRFC05+ , TF.testCase "testRFC06" testRFC06+ , TF.testCase "testRFC07" testRFC07+ , TF.testCase "testRFC08" testRFC08+ , TF.testCase "testRFC09" testRFC09+ , TF.testCase "testRFC10" testRFC10+ , TF.testCase "testRFC11" testRFC11+ , TF.testCase "testRFC12" testRFC12+ , TF.testCase "testRFC13" testRFC13+ , TF.testCase "testRFC14" testRFC14+ , TF.testCase "testRFC15" testRFC15+ , TF.testCase "testRFC16" testRFC16+ , TF.testCase "testRFC17" testRFC17+ , TF.testCase "testRFC18" testRFC18+ , TF.testCase "testRFC19" testRFC19+ , TF.testCase "testRFC20" testRFC20+ , TF.testCase "testRFC21" testRFC21+ , TF.testCase "testRFC22" testRFC22+ , TF.testCase "testRFC23" testRFC23+ , TF.testCase "testRFC24" testRFC24+ -- testRFC30,+ , TF.testCase "testRFC31" testRFC31+ , TF.testCase "testRFC32" testRFC32+ , TF.testCase "testRFC33" testRFC33+ , TF.testCase "testRFC34" testRFC34+ , TF.testCase "testRFC35" testRFC35+ , TF.testCase "testRFC36" testRFC36+ , TF.testCase "testRFC37" testRFC37+ , TF.testCase "testRFC38" testRFC38+ , TF.testCase "testRFC39" testRFC39+ , TF.testCase "testRFC40" testRFC40+ , TF.testCase "testRFC41" testRFC41+ , TF.testCase "testRFC42" testRFC42+ , TF.testCase "testRFC43" testRFC43+ , TF.testCase "testRFC44" testRFC44+ , TF.testCase "testRFC45" testRFC45+ , TF.testCase "testRFC46" testRFC46+ , TF.testCase "testRFC47" testRFC47+ , TF.testCase "testRFC48" testRFC48+ , TF.testCase "testRFC49" testRFC49+ , TF.testCase "testRFC50" testRFC50+ --+ , TF.testCase "testRFC60" testRFC60+ , TF.testCase "testRFC61" testRFC61+ , TF.testCase "testRFC62" testRFC62+ , TF.testCase "testRFC63" testRFC63+ , TF.testCase "testRFC64" testRFC64+ , TF.testCase "testRFC65" testRFC65+ , TF.testCase "testRFC66" testRFC66+ , TF.testCase "testRFC67" testRFC67+ , TF.testCase "testRFC68" testRFC68+ , TF.testCase "testRFC69" testRFC69+ , TF.testCase "testRFC70" testRFC70+ ]++-- And some other oddballs:+mailbase = "mailto:local/option@domain.org?notaquery#frag"+testMail01 = testRelJoin "testMail01"+ mailbase "more@domain"+ "mailto:local/more@domain"+testMail02 = testRelJoin "testMail02"+ mailbase "#newfrag"+ "mailto:local/option@domain.org?notaquery#newfrag"+testMail03 = testRelJoin "testMail03"+ mailbase "l1/q1@domain"+ "mailto:local/l1/q1@domain"++testMail11 = testRelJoin "testMail11"+ "mailto:local1@domain1?query1" "mailto:local2@domain2"+ "mailto:local2@domain2"+testMail12 = testRelJoin "testMail12"+ "mailto:local1@domain1" "mailto:local2@domain2?query2"+ "mailto:local2@domain2?query2"+testMail13 = testRelJoin "testMail13"+ "mailto:local1@domain1?query1" "mailto:local2@domain2?query2"+ "mailto:local2@domain2?query2"+testMail14 = testRelJoin "testMail14"+ "mailto:local@domain?query1" "mailto:local@domain?query2"+ "mailto:local@domain?query2"+testMail15 = testRelJoin "testMail15"+ "mailto:?query1" "mailto:local@domain?query2"+ "mailto:local@domain?query2"+testMail16 = testRelJoin "testMail16"+ "mailto:local@domain?query1" "?query2"+ "mailto:local@domain?query2"+testInfo17 = testRelJoin "testInfo17"+ "info:name/1234/../567" "name/9876/../543"+ "info:name/name/543"+testInfo18 = testRelJoin "testInfo18"+ "info:/name/1234/../567" "name/9876/../543"+ "info:/name/name/543"++testOddballSuite = TF.testGroup "Test oddball examples" testOddballList+testOddballList =+ [ TF.testCase "testMail01" testMail01+ , TF.testCase "testMail02" testMail02+ , TF.testCase "testMail03" testMail03+ , TF.testCase "testMail11" testMail11+ , TF.testCase "testMail12" testMail12+ , TF.testCase "testMail13" testMail13+ , TF.testCase "testMail14" testMail14+ , TF.testCase "testMail15" testMail15+ , TF.testCase "testMail16" testMail16+ , TF.testCase "testInfo17" testInfo17+ ]++-- Normalization tests++-- Case normalization; cf. RFC2396bis section 6.2.2.1+-- NOTE: authority case normalization is not performed+testNormalize01 = testEq "testNormalize01"+ "http://EXAMPLE.com/Root/%2A?%2B#%2C"+ (normalizeCase "HTTP://EXAMPLE.com/Root/%2a?%2b#%2c")++-- Encoding normalization; cf. RFC2396bis section 6.2.2.2+testNormalize11 = testEq "testNormalize11"+ "HTTP://EXAMPLE.com/Root/~Me/"+ (normalizeEscape "HTTP://EXAMPLE.com/Root/%7eMe/")+testNormalize12 = testEq "testNormalize12"+ "foo:%40AZ%5b%60az%7b%2f09%3a-._~"+ (normalizeEscape "foo:%40%41%5a%5b%60%61%7a%7b%2f%30%39%3a%2d%2e%5f%7e")+testNormalize13 = testEq "testNormalize13"+ "foo:%3a%2f%3f%23%5b%5d%40"+ (normalizeEscape "foo:%3a%2f%3f%23%5b%5d%40")++-- Path segment normalization; cf. RFC2396bis section 6.2.2.4+testNormalize21 = testEq "testNormalize21"+ "http://example/c"+ (normalizePathSegments "http://example/a/b/../../c")+testNormalize22 = testEq "testNormalize22"+ "http://example/a/"+ (normalizePathSegments "http://example/a/b/c/../../")+testNormalize23 = testEq "testNormalize23"+ "http://example/a/b/c/"+ (normalizePathSegments "http://example/a/b/c/./")+testNormalize24 = testEq "testNormalize24"+ "http://example/a/b/"+ (normalizePathSegments "http://example/a/b/c/.././")+testNormalize25 = testEq "testNormalize25"+ "http://example/e"+ (normalizePathSegments "http://example/a/b/c/d/../../../../e")+testNormalize26 = testEq "testNormalize26"+ "http://example/e"+ (normalizePathSegments "http://example/a/b/c/d/../.././../../e")+testNormalize27 = testEq "testNormalize27"+ "http://example/e"+ (normalizePathSegments "http://example/a/b/../.././../../e")+testNormalize28 = testEq "testNormalize28"+ "foo:e"+ (normalizePathSegments "foo:a/b/../.././../../e")++testNormalizeSuite = TF.testGroup "testNormalizeSuite"+ [ TF.testCase "testNormalize01" testNormalize01+ , TF.testCase "testNormalize11" testNormalize11+ , TF.testCase "testNormalize12" testNormalize12+ , TF.testCase "testNormalize13" testNormalize13+ , TF.testCase "testNormalize21" testNormalize21+ , TF.testCase "testNormalize22" testNormalize22+ , TF.testCase "testNormalize23" testNormalize23+ , TF.testCase "testNormalize24" testNormalize24+ , TF.testCase "testNormalize25" testNormalize25+ , TF.testCase "testNormalize26" testNormalize26+ , TF.testCase "testNormalize27" testNormalize27+ , TF.testCase "testNormalize28" testNormalize28+ ]++-- URI formatting (show) tests++ts02URI = URI { uriScheme = "http:"+ , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")+ , uriPath = "/aaa/bbb"+ , uriQuery = "?ccc"+ , uriFragment = "#ddd/eee"+ }++ts04URI = URI { uriScheme = "http:"+ , uriAuthority = Just (URIAuth "user:anonymous@" "example.org" ":99")+ , uriPath = "/aaa/bbb"+ , uriQuery = "?ccc"+ , uriFragment = "#ddd/eee"+ }++ts02str = "http://user:...@example.org:99/aaa/bbb?ccc#ddd/eee"+ts03str = "http://user:pass@example.org:99/aaa/bbb?ccc#ddd/eee"+ts04str = "http://user:...@example.org:99/aaa/bbb?ccc#ddd/eee"++testShowURI01 = testEq "testShowURI01" "" (show nullURI)+testShowURI02 = testEq "testShowURI02" ts02str (show ts02URI)+testShowURI03 = testEq "testShowURI03" ts03str ((uriToString id ts02URI) "")+testShowURI04 = testEq "testShowURI04" ts04str (show ts04URI)++testShowURI = TF.testGroup "testShowURI"+ [ TF.testCase "testShowURI01" testShowURI01+ , TF.testCase "testShowURI02" testShowURI02+ , TF.testCase "testShowURI03" testShowURI03+ , TF.testCase "testShowURI04" testShowURI04+ ]+++-- URI escaping tests++te01str = "http://example.org/az/09-_/.~:/?#[]@!$&'()*+,;="+te02str = "http://example.org/a</b>/c%/d /e"+te02esc = "http://example.org/a%3C/b%3E/c%25/d%20/e"++testEscapeURIString01 = testEq "testEscapeURIString01"+ te01str (escapeURIString isUnescapedInURI te01str)++testEscapeURIString02 = testEq "testEscapeURIString02"+ te02esc (escapeURIString isUnescapedInURI te02str)++testEscapeURIString03 = testEq "testEscapeURIString03"+ te01str (unEscapeString te01str)++testEscapeURIString04 = testEq "testEscapeURIString04"+ te02str (unEscapeString te02esc)++testEscapeURIString05 = testEq "testEscapeURIString05"+ "http%3A%2F%2Fexample.org%2Faz%2F09-_%2F.~%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D"+ (escapeURIString isUnescapedInURIComponent te01str)++testEscapeURIString06 = testEq "testEscapeURIString06"+ "hello%C3%B8%C2%A9%E6%97%A5%E6%9C%AC"+ (escapeURIString isUnescapedInURIComponent "helloø©日本")++propEscapeUnEscapeLoop :: String -> Bool+propEscapeUnEscapeLoop s = s == (unEscapeString $! escaped)+ where+ escaped = escapeURIString (const False) s+ {-# NOINLINE escaped #-}++testEscapeURIString = TF.testGroup "testEscapeURIString"+ [ TF.testCase "testEscapeURIString01" testEscapeURIString01+ , TF.testCase "testEscapeURIString02" testEscapeURIString02+ , TF.testCase "testEscapeURIString03" testEscapeURIString03+ , TF.testCase "testEscapeURIString04" testEscapeURIString04+ , TF.testCase "testEscapeURIString05" testEscapeURIString05+ , TF.testCase "testEscapeURIString06" testEscapeURIString06+ , TF.testProperty "propEscapeUnEscapeLoop" propEscapeUnEscapeLoop+ ]++-- URI string normalization tests++tn01str = "eXAMPLE://a/b/%7bfoo%7d"+tn01nrm = "example://a/b/%7Bfoo%7D"++tn02str = "example://a/b/%63/"+tn02nrm = "example://a/b/c/"++tn03str = "example://a/./b/../b/c/foo"+tn03nrm = "example://a/b/c/foo"++tn04str = "eXAMPLE://a/b/%7bfoo%7d" -- From RFC2396bis, 6.2.2+tn04nrm = "example://a/b/%7Bfoo%7D"++tn06str = "file:/x/..//y"+tn06nrm = "file://y"++tn07str = "file:x/..//y/"+tn07nrm = "file:/y/"++testNormalizeURIString01 = testEq "testNormalizeURIString01"+ tn01nrm (normalizeCase tn01str)+testNormalizeURIString02 = testEq "testNormalizeURIString02"+ tn02nrm (normalizeEscape tn02str)+testNormalizeURIString03 = testEq "testNormalizeURIString03"+ tn03nrm (normalizePathSegments tn03str)+testNormalizeURIString04 = testEq "testNormalizeURIString04"+ tn04nrm ((normalizeCase . normalizeEscape . normalizePathSegments) tn04str)+testNormalizeURIString05 = testEq "testNormalizeURIString05"+ tn04nrm ((normalizePathSegments . normalizeEscape . normalizeCase) tn04str)+testNormalizeURIString06 = testEq "testNormalizeURIString06"+ tn06nrm (normalizePathSegments tn06str)+testNormalizeURIString07 = testEq "testNormalizeURIString07"+ tn07nrm (normalizePathSegments tn07str)++testNormalizeURIString = TF.testGroup "testNormalizeURIString"+ [ TF.testCase "testNormalizeURIString01" testNormalizeURIString01+ , TF.testCase "testNormalizeURIString02" testNormalizeURIString02+ , TF.testCase "testNormalizeURIString03" testNormalizeURIString03+ , TF.testCase "testNormalizeURIString04" testNormalizeURIString04+ , TF.testCase "testNormalizeURIString05" testNormalizeURIString05+ , TF.testCase "testNormalizeURIString06" testNormalizeURIString06+ , TF.testCase "testNormalizeURIString07" testNormalizeURIString07+ ]++-- Test strict vs non-strict relativeTo logic++trbase = fromJust $ parseURIReference "http://bar.org/"++testRelativeTo01 = testEq "testRelativeTo01"+ "http://bar.org/foo"+ (show $+ (fromJust $ parseURIReference "foo") `relativeTo` trbase)++testRelativeTo02 = testEq "testRelativeTo02"+ "http:foo"+ (show $+ (fromJust $ parseURIReference "http:foo") `relativeTo` trbase)++testRelativeTo03 = testEq "testRelativeTo03"+ "http://bar.org/foo"+ (show $+ (fromJust $ parseURIReference "http:foo") `nonStrictRelativeTo` trbase)++testRelativeTo = TF.testGroup "testRelativeTo"+ [ TF.testCase "testRelativeTo01" testRelativeTo01+ , TF.testCase "testRelativeTo02" testRelativeTo02+ , TF.testCase "testRelativeTo03" testRelativeTo03+ ]++-- Test alternative parsing functions+testAltFn01 = testEq "testAltFn01" "Just http://a.b/c#f"+ (show . parseURI $ "http://a.b/c#f")+testAltFn02 = testEq "testAltFn02" "Just http://a.b/c#f"+ (show . parseURIReference $ "http://a.b/c#f")+testAltFn03 = testEq "testAltFn03" "Just c/d#f"+ (show . parseRelativeReference $ "c/d#f")+testAltFn04 = testEq "testAltFn04" "Nothing"+ (show . parseRelativeReference $ "http://a.b/c#f")+testAltFn05 = testEq "testAltFn05" "Just http://a.b/c"+ (show . parseAbsoluteURI $ "http://a.b/c")+testAltFn06 = testEq "testAltFn06" "Nothing"+ (show . parseAbsoluteURI $ "http://a.b/c#f")+testAltFn07 = testEq "testAltFn07" "Nothing"+ (show . parseAbsoluteURI $ "c/d")+testAltFn08 = testEq "testAltFn08" "Just http://a.b/c"+ (show . parseAbsoluteURI $ "http://a.b/c")++testAltFn11 = testEq "testAltFn11" True (isURI "http://a.b/c#f")+testAltFn12 = testEq "testAltFn12" True (isURIReference "http://a.b/c#f")+testAltFn13 = testEq "testAltFn13" True (isRelativeReference "c/d#f")+testAltFn14 = testEq "testAltFn14" False (isRelativeReference "http://a.b/c#f")+testAltFn15 = testEq "testAltFn15" True (isAbsoluteURI "http://a.b/c")+testAltFn16 = testEq "testAltFn16" False (isAbsoluteURI "http://a.b/c#f")+testAltFn17 = testEq "testAltFn17" False (isAbsoluteURI "c/d")++testAltFn = TF.testGroup "testAltFn"+ [ TF.testCase "testAltFn01" testAltFn01+ , TF.testCase "testAltFn02" testAltFn02+ , TF.testCase "testAltFn03" testAltFn03+ , TF.testCase "testAltFn04" testAltFn04+ , TF.testCase "testAltFn05" testAltFn05+ , TF.testCase "testAltFn06" testAltFn06+ , TF.testCase "testAltFn07" testAltFn07+ , TF.testCase "testAltFn08" testAltFn08+ , TF.testCase "testAltFn11" testAltFn11+ , TF.testCase "testAltFn12" testAltFn12+ , TF.testCase "testAltFn13" testAltFn13+ , TF.testCase "testAltFn14" testAltFn14+ , TF.testCase "testAltFn15" testAltFn15+ , TF.testCase "testAltFn16" testAltFn16+ , TF.testCase "testAltFn17" testAltFn17+ ]++testUriIsAbsolute :: String -> Assertion+testUriIsAbsolute str =+ assertBool str (uriIsAbsolute uri)+ where+ Just uri = parseURIReference str++testUriIsRelative :: String -> Assertion+testUriIsRelative str =+ assertBool str (uriIsRelative uri)+ where+ Just uri = parseURIReference str++testIsAbsolute = TF.testGroup "testIsAbsolute"+ [ TF.testCase "testIsAbsolute01" $ testUriIsAbsolute "http://google.com"+ , TF.testCase "testIsAbsolute02" $ testUriIsAbsolute "ftp://p.x.ca/woo?hai=a"+ , TF.testCase "testIsAbsolute03" $ testUriIsAbsolute "mailto:bob@example.com"+ ]++testIsRelative = TF.testGroup "testIsRelative"+ [ TF.testCase "testIsRelative01" $ testUriIsRelative "//google.com"+ , TF.testCase "testIsRelative02" $ testUriIsRelative "/hello"+ , TF.testCase "testIsRelative03" $ testUriIsRelative "this/is/a/path"+ , TF.testCase "testIsRelative04" $ testUriIsRelative "?what=that"+ ]++-- Full test suite+allTests =+ [ testURIRefSuite+ , testComponentSuite+ , testRelativeSuite+ , testRFC2396Suite+ , testOddballSuite+ , testNormalizeSuite+ , testShowURI+ , testEscapeURIString+ , testNormalizeURIString+ , testRelativeTo+ , testAltFn+ , testIsAbsolute+ , testIsRelative+ ]++main = TF.defaultMain allTests++runTestFile t = do+ h <- openFile "a.tmp" WriteMode+ _ <- runTestText (putTextToHandle h False) t+ hClose h+tf = runTestFile+tt = runTestTT++-- Miscellaneous values for hand-testing/debugging in Hugs:++uref = testURIRefSuite+tr01 = testRelative01+tr02 = testRelative02+tr03 = testRelative03+tr04 = testRelative04+rel = testRelativeSuite+rfc = testRFC2396Suite+oddb = testOddballSuite++(Just bu02) = parseURIReference "http://example/x/y/z"+(Just ou02) = parseURIReference "../abc"+(Just ru02) = parseURIReference "http://example/x/abc"+-- fileuri = testURIReference "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/"++cu02 = ou02 `relativeTo` bu02++--------------------------------------------------------------------------------+--+-- Copyright (c) 2004, G. KLYNE. All rights reserved.+-- Distributed as free software under the following license.+--+-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions+-- are met:+--+-- - Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+--+-- - Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+--+-- - Neither name of the copyright holders nor the names of its+-- contributors may be used to endorse or promote products derived from+-- this software without specific prior written permission.+--+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND THE CONTRIBUTORS+-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+-- HOLDERS OR THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,+-- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,+-- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS+-- OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND+-- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR+-- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE+-- USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+--+--------------------------------------------------------------------------------+-- $Source: /srv/cvs/cvs.haskell.org/fptools/libraries/network/tests/URITest.hs,v $+-- $Author: gklyne $+-- $Revision: 1.8 $+-- $Log: URITest.hs,v $+-- Revision 1.81 2012/08/01 aaronfriel+-- Added additional test case for the "xip.io" service style URLs and absolute URLs prefixed with ipv4 addresses.+--+-- Revision 1.8 2005/07/19 22:01:27 gklyne+-- Added some additional test cases raised by discussion on URI@w3.org mailing list about 2005-07-19. The test p[roposed by this discussion exposed a subtle bug in relativeFrom not being an exact inverse of relativeTo.+--+-- Revision 1.7 2005/06/06 16:31:44 gklyne+-- Added two new test cases.+--+-- Revision 1.6 2005/05/31 17:18:36 gklyne+-- Added some additional test cases triggered by URI-list discussions.+--+-- Revision 1.5 2005/04/07 11:09:37 gklyne+-- Added test cases for alternate parsing functions (including deprecated 'parseabsoluteURI')+--+-- Revision 1.4 2005/04/05 12:47:32 gklyne+-- Added test case.+-- Changed module name, now requires GHC -main-is to compile.+-- All tests run OK with GHC 6.4 on MS-Windows.+--+-- Revision 1.3 2004/11/05 17:29:09 gklyne+-- Changed password-obscuring logic to reflect late change in revised URI+-- specification (password "anonymous" is no longer a special case).+-- Updated URI test module to use function 'escapeURIString'.+-- (Should unEscapeString be similarly updated?)+--+-- Revision 1.2 2004/10/27 13:06:55 gklyne+-- Updated URI module function names per:+-- http://www.haskell.org//pipermail/cvs-libraries/2004-October/002916.html+-- Added test cases to give better covereage of module functions.+--+-- Revision 1.1 2004/10/14 16:11:30 gklyne+-- Add URI unit test to cvs.haskell.org repository+--+-- Revision 1.17 2004/10/14 11:51:09 graham+-- Confirm that URITest runs with GHC.+-- Fix up some comments and other minor details.+--+-- Revision 1.16 2004/10/14 11:45:30 graham+-- Use moduke name main for GHC 6.2+--+-- Revision 1.15 2004/08/11 11:07:39 graham+-- Add new test case.+--+-- Revision 1.14 2004/06/30 11:35:27 graham+-- Update URI code to use hierarchical libraries for Parsec and Network.+--+-- Revision 1.13 2004/06/22 16:19:16 graham+-- New URI test case added.+--+-- Revision 1.12 2004/04/21 15:13:29 graham+-- Add test case+--+-- Revision 1.11 2004/04/21 14:54:05 graham+-- Fix up some tests+--+-- Revision 1.10 2004/04/20 14:54:13 graham+-- Fix up test cases related to port number in authority,+-- and add some more URI decomposition tests.+--+-- Revision 1.9 2004/04/07 15:06:17 graham+-- Add extra test case+-- Revise syntax in line with changes to RFC2396bis+--+-- Revision 1.8 2004/03/17 14:34:58 graham+-- Add Network.HTTP files to CVS+--+-- Revision 1.7 2004/03/16 14:19:38 graham+-- Change licence to BSD style; add nullURI definition; new test cases.+--+-- Revision 1.6 2004/02/20 12:12:00 graham+-- Add URI normalization functions+--+-- Revision 1.5 2004/02/19 23:19:35 graham+-- Network.URI module passes all test cases+--+-- Revision 1.4 2004/02/17 20:06:02 graham+-- Revised URI parser to reflect latest RFC2396bis (-04)+--+-- Revision 1.3 2004/02/11 14:32:14 graham+-- Added work-in-progress notes.+--+-- Revision 1.2 2004/02/02 14:00:39 graham+-- Fix optional host name in URI. Add test cases.+--+-- Revision 1.1 2004/01/27 21:13:45 graham+-- New URI module and test suite added,+-- implementing the GHC Network.URI interface.+--
standalone/linux/skel/runshell view
@@ -42,34 +42,42 @@ trap cleanuptbase EXIT fi -# Install shim that's used to run git-annex-shell from ssh authorized_keys.-# The assistant also does this when run, but the user may not be using the-# assistant.-if [ ! -e "$HOME/.ssh/git-annex-shell" ]; then- mkdir "$HOME/.ssh" >/dev/null 2>&1 || true- if [ -e "$HOME/.ssh" ]; then- (- echo "#!/bin/sh"- echo "set -e"- echo "if [ \"x\$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then"- echo "exec '$base/runshell' git-annex-shell -c \"\$SSH_ORIGINAL_COMMAND\""- echo "else"- echo "exec '$base/runshell' git-annex-shell -c \"\$@\""- echo "fi"- ) > "$HOME/.ssh/git-annex-shell"- chmod +x "$HOME/.ssh/git-annex-shell"+# Set this variable when using this script inside a package of git-annex,+# which arranges for git-annex, git-annex-shell, and git to all be in the+# standard PATH.+GIT_ANNEX_PACKAGE_INSTALL=+if [ -z "$GIT_ANNEX_PACKAGE_INSTALL" ]; then+ # Install shim that's used to run git-annex-shell from ssh authorized+ # keys. The assistant also does this when run, but the user may not+ # be using the assistant.+ if [ ! -e "$HOME/.ssh/git-annex-shell" ]; then+ mkdir "$HOME/.ssh" >/dev/null 2>&1 || true+ if [ -e "$HOME/.ssh" ]; then+ (+ echo "#!/bin/sh"+ echo "set -e"+ echo "if [ \"x\$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then"+ echo "exec '$base/runshell' git-annex-shell -c \"\$SSH_ORIGINAL_COMMAND\""+ echo "else"+ echo "exec '$base/runshell' git-annex-shell -c \"\$@\""+ echo "fi"+ ) > "$HOME/.ssh/git-annex-shell"+ chmod +x "$HOME/.ssh/git-annex-shell"+ fi fi-fi -# And this shim is used by the webapp when adding a remote ssh server.-if [ ! -e "$HOME/.ssh/git-annex-wrapper" ]; then- mkdir "$HOME/.ssh" >/dev/null 2>&1 || true- (- echo "#!/bin/sh"- echo "set -e"- echo "exec '$base/runshell' \"\$@\""- ) > "$HOME/.ssh/git-annex-wrapper"- chmod +x "$HOME/.ssh/git-annex-wrapper"+ # And this shim is used by the webapp when adding a remote ssh server.+ if [ ! -e "$HOME/.ssh/git-annex-wrapper" ]; then+ mkdir "$HOME/.ssh" >/dev/null 2>&1 || true+ if [ -e "$HOME/.ssh" ]; then+ (+ echo "#!/bin/sh"+ echo "set -e"+ echo "exec '$base/runshell' \"\$@\""+ ) > "$HOME/.ssh/git-annex-wrapper"+ chmod +x "$HOME/.ssh/git-annex-wrapper"+ fi+ fi fi # Put our binaries first, to avoid issues with out of date or incompatable
+ standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch view
@@ -0,0 +1,26 @@+From 392602f5ff14c0b5a801397d075ddcbcd890aa83 Mon Sep 17 00:00:00 2001+From: Joey Hess <joey@kitenet.net>+Date: Thu, 18 Apr 2013 17:50:59 -0400+Subject: [PATCH] fix cross build++---+ src/Data/Profunctor/Unsafe.hs | 3 ---+ 1 file changed, 3 deletions(-)++diff --git a/src/Data/Profunctor/Unsafe.hs b/src/Data/Profunctor/Unsafe.hs+index 025c7c4..0249274 100644+--- a/src/Data/Profunctor/Unsafe.hs++++ b/src/Data/Profunctor/Unsafe.hs+@@ -40,9 +40,6 @@ import Data.Tagged+ import Prelude hiding (id,(.),sequence)+ import Unsafe.Coerce+ +-{-# ANN module "Hlint: ignore Redundant lambda" #-}+-{-# ANN module "Hlint: ignore Collapse lambdas" #-}+-+ infixr 9 #.+ infixl 8 .#+ +-- +1.8.2.rc3+
+ standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch view
@@ -0,0 +1,33 @@+From e82ed4e6fd7b5ea6dbe474b5de2755ec5794161c Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Thu, 16 Oct 2014 02:23:50 +0000+Subject: [PATCH] stub out++---+ yesod-persistent.cabal | 10 ----------+ 1 file changed, 10 deletions(-)++diff --git a/yesod-persistent.cabal b/yesod-persistent.cabal+index b116f3a..017b184 100644+--- a/yesod-persistent.cabal++++ b/yesod-persistent.cabal+@@ -14,16 +14,6 @@ description: Some helpers for using Persistent from Yesod.+ + library+ build-depends: base >= 4 && < 5+- , yesod-core >= 1.2.2 && < 1.3+- , persistent >= 1.2 && < 2.1+- , persistent-template >= 1.2 && < 2.1+- , transformers >= 0.2.2+- , blaze-builder+- , conduit+- , resourcet >= 0.4.5+- , resource-pool+- exposed-modules: Yesod.Persist+- Yesod.Persist.Core+ ghc-options: -Wall+ + test-suite test+-- +2.1.1+
standalone/osx/git-annex.app/Contents/MacOS/runshell view
@@ -50,12 +50,14 @@ # And this shim is used by the webapp when adding a remote ssh server. if [ ! -e "$HOME/.ssh/git-annex-wrapper" ]; then mkdir "$HOME/.ssh" >/dev/null 2>&1 || true- (- echo "#!/bin/sh"- echo "set -e"- echo "exec '$base/runshell' \"\$@\""- ) > "$HOME/.ssh/git-annex-wrapper"- chmod +x "$HOME/.ssh/git-annex-wrapper"+ if [ -e "$HOME/.ssh" ]; then+ (+ echo "#!/bin/sh"+ echo "set -e"+ echo "exec '$base/runshell' \"\$@\""+ ) > "$HOME/.ssh/git-annex-wrapper"+ chmod +x "$HOME/.ssh/git-annex-wrapper"+ fi fi # Put our binaries first, to avoid issues with out of date or incompatable