packages feed

git-annex 6.20160126 → 6.20160211

raw patch · 121 files changed

+19320/−469 lines, 121 filesdep +magic

Dependencies added: magic

Files

Annex/BloomFilter.hs view
@@ -49,5 +49,5 @@   where 	lift = liftIO . stToIO -bloomFilter :: Hashable v => [v] -> Bloom v -> [v]+bloomFilter :: [v] -> Bloom v -> [v] bloomFilter l bloom = filter (\v -> v `notElemB` bloom) l
Annex/Branch/Transitions.hs view
@@ -52,7 +52,7 @@ 	Just OtherLog -> PreserveFile 	Nothing -> PreserveFile -dropDeadFromMapLog :: Ord k => TrustMap -> (k -> UUID) -> M.Map k v -> M.Map k v+dropDeadFromMapLog :: TrustMap -> (k -> UUID) -> M.Map k v -> M.Map k v dropDeadFromMapLog trustmap getuuid = M.filterWithKey $ \k _v -> notDead trustmap getuuid k  {- Presence logs can contain UUIDs or other values. Any line that matches
Annex/CheckAttr.hs view
@@ -20,6 +20,7 @@ annexAttrs = 	[ "annex.backend" 	, "annex.numcopies"+	, "annex.largefiles" 	]  checkAttr :: Git.Attr -> FilePath -> Annex String
Annex/FileMatcher.hs view
@@ -1,31 +1,50 @@ {- git-annex file matching  -- - Copyright 2012-2014 Joey Hess <id@joeyh.name>+ - Copyright 2012-2016 Joey Hess <id@joeyh.name>  -  - Licensed under the GNU GPL version 3 or higher.  -} -module Annex.FileMatcher where+{-# LANGUAGE CPP #-} +module Annex.FileMatcher (+	GetFileMatcher,+	checkFileMatcher,+	checkMatcher,+	matchAll,+	preferredContentParser,+	parsedToMatcher,+	mkLargeFilesParser,+	largeFilesMatcher,+) where+ import qualified Data.Map as M  import Annex.Common import Limit import Utility.Matcher import Types.Group-import Logs.Group-import Annex.UUID import qualified Annex import Types.FileMatcher import Git.FilePath import Types.Remote (RemoteConfig)+import Annex.CheckAttr+import Git.CheckAttr (unspecifiedAttr) +#ifdef WITH_MAGICMIME+import Magic+#endif+ import Data.Either import qualified Data.Set as S -checkFileMatcher :: FileMatcher Annex -> FilePath -> Annex Bool-checkFileMatcher matcher file = checkMatcher matcher Nothing (Just file) S.empty True+type GetFileMatcher = FilePath -> Annex (FileMatcher Annex) +checkFileMatcher :: GetFileMatcher -> FilePath -> Annex Bool+checkFileMatcher getmatcher file = do+	matcher <- getmatcher file+	checkMatcher matcher Nothing (Just file) S.empty True+ checkMatcher :: FileMatcher Annex -> Maybe Key -> AssociatedFile -> AssumeNotPresent -> Bool -> Annex Bool checkMatcher matcher mkey afile notpresent d 	| isEmpty matcher = return d@@ -47,52 +66,39 @@ matchAll :: FileMatcher Annex matchAll = generate [] -parsedToMatcher :: [Either String (Token (MatchFiles Annex))] -> Either String (FileMatcher Annex)+parsedToMatcher :: [ParseResult] -> Either String (FileMatcher Annex) parsedToMatcher parsed = case partitionEithers parsed of 	([], vs) -> Right $ generate vs 	(es, _) -> Left $ unwords $ map ("Parse failure: " ++) es -exprParser :: FileMatcher Annex -> FileMatcher Annex -> Annex GroupMap -> M.Map UUID RemoteConfig -> Maybe UUID -> String -> [Either String (Token (MatchFiles Annex))]-exprParser matchstandard matchgroupwanted getgroupmap configmap mu expr =-	map parse $ tokenizeMatcher expr-  where-	parse = parseToken-		matchstandard-		matchgroupwanted-		(limitPresent mu)-		(limitInDir preferreddir)-		getgroupmap-	preferreddir = fromMaybe "public" $-		M.lookup "preferreddir" =<< (`M.lookup` configmap) =<< mu+data ParseToken+	= SimpleToken String ParseResult+	| ValueToken String (String -> ParseResult) -parseToken :: FileMatcher Annex -> FileMatcher Annex -> MkLimit Annex -> MkLimit Annex -> Annex GroupMap -> String -> Either String (Token (MatchFiles Annex))-parseToken matchstandard matchgroupwanted checkpresent checkpreferreddir getgroupmap t+type ParseResult = Either String (Token (MatchFiles Annex))++parseToken :: [ParseToken] -> String -> ParseResult+parseToken l t 	| t `elem` tokens = Right $ token t-	| t == "standard" = call matchstandard-	| t == "groupwanted" = call matchgroupwanted-	| t == "present" = use checkpresent-	| t == "inpreferreddir" = use checkpreferreddir-	| t == "unused" = Right $ Operation limitUnused-	| t == "anything" = Right $ Operation limitAnything-	| otherwise = maybe (Left $ "near " ++ show t) use $ M.lookup k $-		M.fromList-			[ ("include", limitInclude)-			, ("exclude", limitExclude)-			, ("copies", limitCopies)-			, ("lackingcopies", limitLackingCopies False)-			, ("approxlackingcopies", limitLackingCopies True)-			, ("inbackend", limitInBackend)-			, ("largerthan", limitSize (>))-			, ("smallerthan", limitSize (<))-			, ("metadata", limitMetaData)-			, ("inallgroup", limitInAllGroup getgroupmap)-			]+	| otherwise = go l   where+	go [] = Left $ "near " ++ show t+	go (SimpleToken s r : _) | s == t = r+	go (ValueToken s mkr : _) | s == k = mkr v+	go (_ : ps) = go ps 	(k, v) = separate (== '=') t-	use a = Operation <$> a v-	call sub = Right $ Operation $ \notpresent mi ->-		matchMrun sub $ \a -> a notpresent mi +commonTokens :: [ParseToken]+commonTokens =+	[ SimpleToken "unused" (simply limitUnused)+	, SimpleToken "anything" (simply limitAnything)+	, SimpleToken "nothing" (simply limitNothing)+	, ValueToken "include" (usev limitInclude)+	, ValueToken "exclude" (usev limitExclude)+	, ValueToken "largerthan" (usev $ limitSize (>))+	, ValueToken "smallerthan" (usev $ limitSize (<))+	]+ {- This is really dumb tokenization; there's no support for quoted values.  - Open and close parens are always treated as standalone tokens;  - otherwise tokens must be separated by whitespace. -}@@ -101,19 +107,64 @@   where 	splitparens = segmentDelim (`elem` "()") +preferredContentParser :: FileMatcher Annex -> FileMatcher Annex -> Annex GroupMap -> M.Map UUID RemoteConfig -> Maybe UUID -> String -> [ParseResult]+preferredContentParser matchstandard matchgroupwanted getgroupmap configmap mu expr =+	map parse $ tokenizeMatcher expr+  where+ 	parse = parseToken $+		[ SimpleToken "standard" (call matchstandard)+		, SimpleToken "groupwanted" (call matchgroupwanted)+		, SimpleToken "present" (simply $ limitPresent mu)+		, SimpleToken "inpreferreddir" (simply $ limitInDir preferreddir)+		, ValueToken "copies" (usev limitCopies)+		, ValueToken "lackingcopies" (usev $ limitLackingCopies False)+		, ValueToken "approxlackingcopies" (usev $ limitLackingCopies True)+		, ValueToken "inbacked" (usev limitInBackend)+		, ValueToken "metadata" (usev limitMetaData)+		, ValueToken "inallgroup" (usev $ limitInAllGroup getgroupmap)+		] ++ commonTokens+	preferreddir = fromMaybe "public" $+		M.lookup "preferreddir" =<< (`M.lookup` configmap) =<< mu++mkLargeFilesParser :: Annex (String -> [ParseResult])+mkLargeFilesParser = do+#ifdef WITH_MAGICMIME+	magicmime <- liftIO $ magicOpen [MagicMimeType]+	liftIO $ magicLoadDefault magicmime+#endif+	let parse = parseToken $ commonTokens+#ifdef WITH_MAGICMIME+		++ [ ValueToken "mimetype" (usev $ matchMagic magicmime) ]+#else+		++ [ ValueToken "mimetype" (const $ Left "\"mimetype\" not supported; not built with MagicMime support") ]+#endif+	return $ map parse . tokenizeMatcher+ {- Generates a matcher for files large enough (or meeting other criteria)  - to be added to the annex, rather than directly to git. -}-largeFilesMatcher :: Annex (FileMatcher Annex)+largeFilesMatcher :: Annex GetFileMatcher largeFilesMatcher = go =<< annexLargeFiles <$> Annex.getGitConfig   where-	go Nothing = return matchAll 	go (Just expr) = do-		u <- getUUID-		-- No need to read remote configs, that's only needed for-		-- inpreferreddir, which is used in preferred content-		-- expressions but does not make sense in the -		-- annex.largefiles expression.-		let emptyconfig = M.empty-		either badexpr return $-			parsedToMatcher $ exprParser matchAll matchAll groupMap emptyconfig (Just u) expr+		matcher <- mkmatcher expr+		return $ const $ return matcher+	go Nothing = return $ \file -> do+		expr <- checkAttr "annex.largefiles" file+		if null expr || expr == unspecifiedAttr+			then return matchAll+			else mkmatcher expr++	mkmatcher expr = do+		parser <- mkLargeFilesParser+		either badexpr return $ parsedToMatcher $ parser expr 	badexpr e = error $ "bad annex.largefiles configuration: " ++ e++simply :: MatchFiles Annex -> ParseResult+simply = Right . Operation++usev :: MkLimit Annex -> String -> ParseResult+usev a v = Operation <$> a v++call :: FileMatcher Annex -> ParseResult+call sub = Right $ Operation $ \notpresent mi ->+	matchMrun sub $ \a -> a notpresent mi
Annex/Fixup.hs view
@@ -90,8 +90,9 @@   where 	dotgit = w </> ".git" 	replacedotgit = whenM (doesFileExist dotgit) $ do+		linktarget <- relPathDirToFile w d 		nukeFile dotgit-		createSymbolicLink (w </> d) dotgit+		createSymbolicLink linktarget dotgit 		maybe (error "unset core.worktree failed") (\_ -> return ()) 			=<< Git.Config.unset "core.worktree" r fixupSubmodule r _ = return r
Assistant/Threads/Watcher.hs view
@@ -35,7 +35,6 @@ import Annex.CheckIgnore import Annex.Link import Annex.FileMatcher-import Types.FileMatcher import Annex.Content import Annex.ReplaceFile import Annex.Version@@ -202,8 +201,8 @@ 		| otherwise = f  {- Small files are added to git as-is, while large ones go into the annex. -}-add :: FileMatcher Annex -> FilePath -> Assistant (Maybe Change)-add bigfilematcher file = ifM (liftAnnex $ checkFileMatcher bigfilematcher file)+add :: GetFileMatcher -> FilePath -> Assistant (Maybe Change)+add largefilematcher file = ifM (liftAnnex $ checkFileMatcher largefilematcher file) 	( pendingAddChange file 	, do 		liftAnnex $ Annex.Queue.addCommand "add"@@ -211,7 +210,7 @@ 		madeChange file AddFileChange 	) -onAdd :: FileMatcher Annex -> Handler+onAdd :: GetFileMatcher -> Handler onAdd matcher file filestatus 	| maybe False isRegularFile filestatus = 		unlessIgnored file $@@ -221,7 +220,7 @@ shouldRestage :: DaemonStatus -> Bool shouldRestage ds = scanComplete ds || forceRestage ds -onAddUnlocked :: Bool -> FileMatcher Annex -> Handler+onAddUnlocked :: Bool -> GetFileMatcher -> Handler onAddUnlocked = onAddUnlocked' False contentchanged addassociatedfile samefilestatus   where 	addassociatedfile key file = @@ -243,10 +242,10 @@ {- In direct mode, add events are received for both new files, and  - modified existing files.  -}-onAddDirect :: Bool -> FileMatcher Annex -> Handler+onAddDirect :: Bool -> GetFileMatcher -> Handler onAddDirect = onAddUnlocked' True changedDirect (\k f -> void $ addAssociatedFile k f) sameFileStatus -onAddUnlocked' :: Bool -> (Key -> FilePath -> Annex ()) -> (Key -> FilePath -> Annex ()) -> (Key -> FilePath -> FileStatus -> Annex Bool) -> Bool -> FileMatcher Annex -> Handler+onAddUnlocked' :: Bool -> (Key -> FilePath -> Annex ()) -> (Key -> FilePath -> Annex ()) -> (Key -> FilePath -> FileStatus -> Annex Bool) -> Bool -> GetFileMatcher -> Handler onAddUnlocked' isdirect contentchanged addassociatedfile samefilestatus symlinkssupported matcher file fs = do 	v <- liftAnnex $ catKeyFile file 	case (v, fs) of
Assistant/WebApp/Configurators/Delete.hs view
@@ -104,7 +104,7 @@ 			liftIO $ do 				recurseDir SystemFS dir 					>>= mapM_ (void . tryIO . allowWrite)-				removeDirectoryRecursive dir+				removeDirectoryRecursive =<< absPath dir 			 			redirect ShutdownConfirmedR 		_ -> $(widgetFile "configurators/delete/currentrepository")
Build/Version.hs view
@@ -4,12 +4,13 @@  module Build.Version where -import Control.Applicative import Data.List import System.Environment import System.Directory import Data.Char import System.Process+import Control.Applicative+import Prelude  import Utility.Monad import Utility.Exception
BuildFlags.hs view
@@ -76,6 +76,9 @@ #ifdef WITH_TORRENTPARSER 	, "TorrentParser" #endif+#ifdef WITH_MAGICMIME+	, "MagicMime"+#endif #ifdef WITH_EKG 	, "EKG" #endif
CHANGELOG view
@@ -1,3 +1,36 @@+git-annex (6.20160211) unstable; urgency=medium++  * annex.addsmallfiles: New option controlling what is done when+    adding files not matching annex.largefiles.+  * Fix reversion in lookupkey, contentlocation, and examinekey which+    caused them to sometimes output side messages.+  * webapp: Fix deletion of current repository directory.+  * Added "nothing" to preferred content expression syntax.+  * annex.largefiles can be configured in .gitattributes too;+    this is particulary useful for v6 repositories, since the+    .gitattributes configuration will apply in all clones of the+    repository.+  * Limit annex.largefiles parsing to the subset of preferred content+    expressions that make sense in its context. So, not "standard"+    or "lackingcopies", etc.+  * annex.largefiles: Add support for mimetype=text/* etc, when git-annex+    is linked with libmagic.+  * matchexpression: Added --largefiles option to parse an annex.largefiles+    expression.+  * Brought back the dbus and xmpp build flags, so build from source can be+    done without C libraries that may be hard to install.+  * init: Fix bugs in submodule .git symlink fixup, that occurred when+    initializing in a subdirectory of a submodule and a submodule of a+    submodule.+  * WebDAV: Set depth 1 in PROPFIND request, for better compatibility with+    some servers. Thanks, wzhd.+  * WebDAV: Remove a bogus trailing slash from the end of the url to the+    temporary store location for a key. Thanks, wzhd.+  * S3: Allow configuring with requeststyle=path to use path-style bucket+    access instead of the default DNS-style access.++ -- Joey Hess <id@joeyh.name>  Thu, 11 Feb 2016 11:42:19 -0400+ git-annex (6.20160126) unstable; urgency=medium    * Fix nasty reversion in the last release that broke sync --content's
Command/Add.hs view
@@ -49,7 +49,10 @@ 	matcher <- largeFilesMatcher 	let gofile file = ifM (checkFileMatcher matcher file <||> Annex.getState Annex.force) 		( start file-		, startSmall file+		, ifM (annexAddSmallFiles <$> Annex.getGitConfig)+			( startSmall file+			, stop+			) 		) 	case batchOption o of 		Batch -> batchFiles gofile
Command/ContentLocation.hs view
@@ -11,7 +11,7 @@ import Annex.Content  cmd :: Command-cmd = noCommit $ +cmd = noCommit $ noMessages $ 	command "contentlocation" SectionPlumbing  		"looks up content for a key" 		(paramRepeating paramKey)
Command/ExamineKey.hs view
@@ -12,7 +12,7 @@ import Command.Find (parseFormatOption, showFormatted, keyVars)  cmd :: Command-cmd = noCommit $ withGlobalOptions [jsonOption] $+cmd = noCommit $ noMessages $ withGlobalOptions [jsonOption] $ 	command "examinekey" SectionPlumbing  		"prints information from a key" 		(paramRepeating paramKey)
Command/Import.hs view
@@ -17,7 +17,6 @@ import Types.KeySource import Annex.CheckIgnore import Annex.NumCopies-import Types.FileMatcher import Annex.FileMatcher  cmd :: Command@@ -67,7 +66,7 @@ 	largematcher <- largeFilesMatcher 	withPathContents (start largematcher (duplicateMode o)) (importFiles o) -start :: FileMatcher Annex -> DuplicateMode -> (FilePath, FilePath) -> CommandStart+start :: GetFileMatcher -> DuplicateMode -> (FilePath, FilePath) -> CommandStart start largematcher mode (srcfile, destfile) = 	ifM (liftIO $ isRegularFile <$> getSymbolicLinkStatus srcfile) 		( do
Command/LookupKey.hs view
@@ -11,7 +11,7 @@ import Annex.CatFile  cmd :: Command-cmd = notBareRepo $ noCommit $+cmd = notBareRepo $ noCommit $ noMessages $ 	command "lookupkey" SectionPlumbing  		"looks up key used for file" 		(paramRepeating paramFile)
Command/MatchExpression.hs view
@@ -27,12 +27,17 @@  data MatchExpressionOptions = MatchExpressionOptions 	{ matchexpr :: String+	, largeFilesExpression :: Bool 	, matchinfo :: MatchInfo 	}  optParser :: CmdParamsDesc -> Parser MatchExpressionOptions optParser desc = MatchExpressionOptions 	<$> argument str (metavar desc)+	<*> switch+		( long "largefiles"+		<> help "parse as annex.largefiles expression"+		) 	<*> (addkeysize <$> dataparser)   where 	dataparser = MatchingInfo@@ -48,19 +53,27 @@ 			( long "size" <> metavar paramSize 			<> help "specify size to match against" 			))+		<*> optinfo "mimetype" (strOption+			( long "mimetype" <> metavar paramValue+			<> help "specify mime type to match against"+			))+ 	optinfo datadesc mk = (Right <$> mk) 		<|> (pure $ Left $ missingdata datadesc) 	missingdata datadesc = bail $ "cannot match this expression without " ++ datadesc ++ " data" 	-- When a key is provided, use its size.-	addkeysize i@(MatchingInfo f (Right k) _) = case keySize k of-		Just sz -> MatchingInfo f (Right k) (Right sz)+	addkeysize i@(MatchingInfo f (Right k) _ m) = case keySize k of+		Just sz -> MatchingInfo f (Right k) (Right sz) m 		Nothing -> i 	addkeysize i = i  seek :: MatchExpressionOptions -> CommandSeek seek o = do-	u <- getUUID-	case parsedToMatcher $ exprParser matchAll matchAll groupMap M.empty (Just u) (matchexpr o) of+	parser <- if largeFilesExpression o+		then mkLargeFilesParser+		else preferredContentParser +			matchAll matchAll groupMap M.empty . Just <$> getUUID+	case parsedToMatcher $ parser ((matchexpr o)) of 		Left e -> liftIO $ bail $ "bad expression: " ++ e 		Right matcher -> ifM (checkmatcher matcher) 			( liftIO exitSuccess
Command/Wanted.hs view
@@ -50,7 +50,7 @@ 	liftIO $ putStrLn $ fromMaybe "" $ M.lookup a m 	next $ return True -performSet :: Ord a => (a -> PreferredContentExpression -> Annex ()) -> String -> a -> CommandPerform+performSet :: (a -> PreferredContentExpression -> Annex ()) -> String -> a -> CommandPerform performSet setter expr a = case checkPreferredContentExpression expr of 	Just e -> error $ "Parse error: " ++ e 	Nothing -> do
Git/CheckAttr.hs view
@@ -38,12 +38,14 @@ checkAttrStop :: CheckAttrHandle -> IO () checkAttrStop (h, _, _, _) = CoProcess.stop h -{- Gets an attribute of a file. -}+{- Gets an attribute of a file. When the attribute is not specified,+ - returns "" -} checkAttr :: CheckAttrHandle -> Attr -> FilePath -> IO String checkAttr (h, attrs, oldgit, currdir) want file = do 	pairs <- CoProcess.query h send (receive "") 	let vals = map snd $ filter (\(attr, _) -> attr == want) pairs 	case vals of+		["unspecified"] -> return "" 		[v] -> return v 		_ -> error $ "unable to determine " ++ want ++ " attribute of " ++ file   where@@ -92,3 +94,8 @@ 		sep = ": " ++ attr ++ ": " 	getattrvalues (_filename:attr:val:rest) c = getattrvalues rest ((attr,val):c) 	getattrvalues _ c = c++{- User may enter this to override a previous attr setting, when they wish+ - to not specify an attr for some files. -}+unspecifiedAttr :: String+unspecifiedAttr = "!"
Limit.hs view
@@ -1,10 +1,12 @@ {- user-specified limits on files to act on  -- - Copyright 2011-2014 Joey Hess <id@joeyh.name>+ - Copyright 2011-2016 Joey Hess <id@joeyh.name>  -  - Licensed under the GNU GPL version 3 or higher.  -} +{-# LANGUAGE CPP #-}+ module Limit where  import Annex.Common@@ -30,6 +32,10 @@ import Utility.HumanTime import Utility.DataUnits +#ifdef WITH_MAGICMIME+import Magic+#endif+ import Data.Time.Clock.POSIX import qualified Data.Set as S import qualified Data.Map as M@@ -84,12 +90,23 @@  matchGlobFile :: String -> MatchInfo -> Annex Bool matchGlobFile glob = go-	where-		cglob = compileGlob glob CaseSensative -- memoized-		go (MatchingKey _) = pure False-		go (MatchingFile fi) = pure $ matchGlob cglob (matchFile fi)-		go (MatchingInfo af _ _) = matchGlob cglob <$> getInfo af+  where+	cglob = compileGlob glob CaseSensative -- memoized+	go (MatchingKey _) = pure False+	go (MatchingFile fi) = pure $ matchGlob cglob (matchFile fi)+	go (MatchingInfo af _ _ _) = matchGlob cglob <$> getInfo af +#ifdef WITH_MAGICMIME+matchMagic :: Magic -> MkLimit Annex+matchMagic magic glob = Right $ const go+  where+ 	cglob = compileGlob glob CaseSensative -- memoized+	go (MatchingKey _) = pure False+	go (MatchingFile fi) = liftIO $ catchBoolIO $+		matchGlob cglob <$> magicFile magic (matchFile fi)+	go (MatchingInfo _ _ _ mimeval) = matchGlob cglob <$> getInfo mimeval+#endif+ {- Adds a limit to skip files not believed to be present  - in a specfied repository. Optionally on a prior date. -} addIn :: String -> Annex ()@@ -118,11 +135,8 @@ 				else inAnnex key  {- Limit to content that is currently present on a uuid. -}-limitPresent :: Maybe UUID -> MkLimit Annex-limitPresent u _ = Right $ matchPresent u--matchPresent :: Maybe UUID -> MatchFiles Annex-matchPresent u _ = checkKey $ \key -> do+limitPresent :: Maybe UUID -> MatchFiles Annex+limitPresent u _ = checkKey $ \key -> do 	hereu <- getUUID 	if u == Just hereu || isNothing u 		then inAnnex key@@ -131,12 +145,12 @@ 			return $ maybe False (`elem` us) u  {- Limit to content that is in a directory, anywhere in the repository tree -}-limitInDir :: FilePath -> MkLimit Annex-limitInDir dir = const $ Right $ const go+limitInDir :: FilePath -> MatchFiles Annex+limitInDir dir = const go   where 	go (MatchingFile fi) = checkf $ matchFile fi 	go (MatchingKey _) = return False-	go (MatchingInfo af _ _) = checkf =<< getInfo af+	go (MatchingInfo af _ _ _) = checkf =<< getInfo af 	checkf = return . elem dir . splitPath . takeDirectory  {- Adds a limit to skip files not believed to have the specified number@@ -182,7 +196,7 @@ 			else case mi of 				MatchingFile fi -> getGlobalFileNumCopies $ matchFile fi 				MatchingKey _ -> approxNumCopies-				MatchingInfo _ _ _ -> approxNumCopies+				MatchingInfo _ _ _ _ -> approxNumCopies 		us <- filter (`S.notMember` notpresent) 			<$> (trustExclude UnTrusted =<< Remote.keyLocations key) 		return $ numcopies - length us >= needed@@ -196,14 +210,18 @@ limitUnused :: MatchFiles Annex limitUnused _ (MatchingFile _) = return False limitUnused _ (MatchingKey k) = S.member k <$> unusedKeys-limitUnused _ (MatchingInfo _ ak _) = do+limitUnused _ (MatchingInfo _ ak _ _) = do 	k <- getInfo ak 	S.member k <$> unusedKeys -{- Limit that matches any version of any file. -}+{- Limit that matches any version of any file or key. -} limitAnything :: MatchFiles Annex limitAnything _ _ = return True +{- Limit that never matches. -}+limitNothing :: MatchFiles Annex+limitNothing _ _ = return False+ {- Adds a limit to skip files not believed to be present in all  - repositories in the specified group. -} addInAllGroup :: String -> Annex ()@@ -247,7 +265,7 @@   where 	go sz _ (MatchingFile fi) = lookupFileKey fi >>= check fi sz 	go sz _ (MatchingKey key) = checkkey sz key-	go sz _ (MatchingInfo _ _ as) =+	go sz _ (MatchingInfo _ _ as _) = 		getInfo as >>= \sz' -> return (Just sz' `vs` Just sz) 	checkkey sz key = return $ keySize key `vs` Just sz 	check _ sz (Just key) = checkkey sz key@@ -290,4 +308,4 @@ checkKey :: (Key -> Annex Bool) -> MatchInfo -> Annex Bool checkKey a (MatchingFile fi) = lookupFileKey fi >>= maybe (return False) a checkKey a (MatchingKey k) = a k-checkKey a (MatchingInfo _ ak _) = a =<< getInfo ak+checkKey a (MatchingInfo _ ak _ _) = a =<< getInfo ak
Logs/PreferredContent.hs view
@@ -102,7 +102,7 @@ 		| null (lefts tokens) = generate $ rights tokens 		| otherwise = unknownMatcher u 	  where-		tokens = exprParser matchstandard matchgroupwanted (pure groupmap) configmap (Just u) expr+		tokens = preferredContentParser matchstandard matchgroupwanted (pure groupmap) configmap (Just u) expr 		matchstandard 			| expandstandard = maybe (unknownMatcher u) (go False False) 				(standardPreferredContent <$> getStandardGroup mygroups)@@ -125,7 +125,7 @@ unknownMatcher :: UUID -> FileMatcher Annex unknownMatcher u = generate [present]   where-	present = Operation $ matchPresent (Just u)+	present = Operation $ limitPresent (Just u)  {- Checks if an expression can be parsed, if not returns Just error -} checkPreferredContentExpression :: PreferredContentExpression -> Maybe String@@ -133,7 +133,7 @@ 	Left e -> Just e 	Right _ -> Nothing   where-	tokens = exprParser matchAll matchAll (pure emptyGroupMap) M.empty Nothing expr+	tokens = preferredContentParser matchAll matchAll (pure emptyGroupMap) M.empty Nothing expr  {- Puts a UUID in a standard group, and sets its preferred content to use  - the standard expression for that group (unless preferred content is
Makefile view
@@ -18,14 +18,13 @@ Build/SysConfig.hs: configure.hs Build/TestConfig.hs Build/Configure.hs 	if [ "$(BUILDER)" = ./Setup ]; then ghc --make Setup; fi 	if [ "$(BUILDER)" = stack ]; then \-		$(BUILDER) build -j1; \+		$(BUILDER) build $(BUILDEROPTIONS); \ 	else \ 		$(BUILDER) configure --ghc-options="$(shell Build/collect-ghc-options.sh)"; \ 	fi -# -j1 is used for reproducible build git-annex: Build/SysConfig.hs-	$(BUILDER) build -j1+	$(BUILDER) build $(BUILDEROPTIONS) 	if [ "$(BUILDER)" = stack ]; then \ 		ln -sf $$(find .stack-work/ -name git-annex -type f | grep build/git-annex/git-annex | tail -n 1) git-annex; \ 	else \
Remote.hs view
@@ -188,7 +188,7 @@  {- An optional field can be included in the list of UUIDs. -} prettyPrintUUIDsWith-	:: (JSON v, Show v) +	:: JSON v 	=> Maybe String  	-> String  	-> M.Map UUID RemoteName
Remote/S3.hs view
@@ -431,7 +431,13 @@ 		{ managerResponseTimeout = Nothing }  s3Configuration :: RemoteConfig -> S3.S3Configuration AWS.NormalQuery-s3Configuration c = (S3.s3 proto endpoint False) { S3.s3Port = port }+s3Configuration c = cfg+	{ S3.s3Port = port+	, S3.s3RequestStyle = case M.lookup "requeststyle" c of+		Just "path" -> S3.PathStyle+		Just s -> error $ "bad S3 requeststyle value: " ++ s+		Nothing -> S3.s3RequestStyle cfg+	}   where 	proto 		| port == 443 = AWS.HTTPS@@ -448,6 +454,7 @@ 		case reads s of 		[(p, _)] -> p 		_ -> error $ "bad S3 port value: " ++ s+	cfg = S3.s3 proto endpoint False  tryS3 :: Annex a -> Annex (Either S3.S3Error a) tryS3 a = (Right <$> a) `catch` (pure . Left)
Remote/WebDAV.hs view
@@ -260,7 +260,10 @@ existsDAV l = inLocation l check `catchNonAsync` (\e -> return (Left $ show e))   where 	check = do-		setDepth Nothing+		-- Some DAV services only support depth of 1, and+		-- more depth is certainly not needed to check if a+		-- location exists.+		setDepth (Just Depth1) 		catchJust 			(matchStatusCodeException (== notFound404)) 			(getPropsM >> ispresent True)@@ -336,7 +339,7 @@ 	finalizer tmp' dest' = goDAV dav $  		finalizeStore (baseURL dav) tmp' (fromJust $ locationParent dest') -	tmp = keyTmpLocation k+	tmp = addTrailingPathSeparator $ keyTmpLocation k 	dest = keyLocation k  retrieveLegacyChunked :: DavHandle -> Retriever
Remote/WebDAV/DavLocation.hs view
@@ -44,7 +44,7 @@  {- Where we store temporary data for a key as it's being uploaded. -} keyTmpLocation :: Key -> DavLocation-keyTmpLocation = addTrailingPathSeparator . tmpLocation . keyFile+keyTmpLocation = tmpLocation . keyFile  tmpLocation :: FilePath -> DavLocation tmpLocation f = tmpDir </> f
Test.hs view
@@ -916,6 +916,18 @@ 	 - 7b0970b340d7faeb745c666146c7f701ec71808f, where in direct mode 	 - sync committed the symlink standin file to the annex. -} 	git_annex_expectoutput "find" ["--in", "."] []+	{- Regression test for bug fixed in+	 - 039e83ed5d1a11fd562cce55b8429c840d72443e, where a present+	 - wanted file was dropped. -}+	git_annex "get" [annexedfile] @? "get failed"+	git_annex_expectoutput "find" ["--in", "."] [annexedfile]+	git_annex "wanted" [".", "present"] @? "wanted failed"+	git_annex "sync" ["--content"] @? "sync failed"+	git_annex_expectoutput "find" ["--in", "."] [annexedfile]+	git_annex "drop" [annexedfile] @? "drop failed"+	git_annex_expectoutput "find" ["--in", "."] []+	git_annex "sync" ["--content"] @? "sync failed"+	git_annex_expectoutput "find" ["--in", "."] []  {- Regression test for union merge bug fixed in  - 0214e0fb175a608a49b812d81b4632c081f63027 -}
Types/FileMatcher.hs view
@@ -19,7 +19,9 @@ data MatchInfo 	= MatchingFile FileInfo 	| MatchingKey Key-	| MatchingInfo (OptInfo FilePath) (OptInfo Key) (OptInfo FileSize)+	| MatchingInfo (OptInfo FilePath) (OptInfo Key) (OptInfo FileSize) (OptInfo MimeType)++type MimeType = String  data FileInfo = FileInfo 	{ currFile :: FilePath
Types/GitConfig.hs view
@@ -54,6 +54,7 @@ 	, annexWebDownloadCommand :: Maybe String 	, annexCrippledFileSystem :: Bool 	, annexLargeFiles :: Maybe String+	, annexAddSmallFiles :: Bool 	, annexFsckNudge :: Bool 	, annexAutoUpgrade :: AutoUpgrade 	, annexExpireUnused :: Maybe (Maybe Duration)@@ -99,6 +100,7 @@ 	, annexWebDownloadCommand = getmaybe (annex "web-download-command") 	, annexCrippledFileSystem = getbool (annex "crippledfilesystem") False 	, annexLargeFiles = getmaybe (annex "largefiles")+	, annexAddSmallFiles = getbool (annex "addsmallfiles") True 	, annexFsckNudge = getbool (annex "fscknudge") True 	, annexAutoUpgrade = toAutoUpgrade $ getmaybe (annex "autoupgrade") 	, annexExpireUnused = maybe Nothing Just . parseDuration
Types/NumCopies.hs view
@@ -111,7 +111,7 @@ -- Constructs a VerifiedCopy, and runs the action, ensuring that the -- verified copy is invalidated when the action returns, or on error. withVerifiedCopy -	:: (Monad m, MonadMask m, MonadIO m, ToUUID u)+	:: (MonadMask m, MonadIO m, ToUUID u) 	=> (V -> VerifiedCopy) 	-> u 	-> IO Bool
Utility/QuickCheck.hs view
@@ -22,10 +22,10 @@ import Prelude  #if ! MIN_VERSION_QuickCheck(2,8,2)-instance (Arbitrary k, Arbitrary v, Eq k, Ord k) => Arbitrary (M.Map k v) where+instance (Arbitrary k, Arbitrary v, Ord k) => Arbitrary (M.Map k v) where 	arbitrary = M.fromList <$> arbitrary -instance (Arbitrary v, Eq v, Ord v) => Arbitrary (S.Set v) where+instance (Arbitrary v, Ord v) => Arbitrary (S.Set v) where 	arbitrary = S.fromList <$> arbitrary #endif 
debian/changelog view
@@ -1,3 +1,36 @@+git-annex (6.20160211) unstable; urgency=medium++  * annex.addsmallfiles: New option controlling what is done when+    adding files not matching annex.largefiles.+  * Fix reversion in lookupkey, contentlocation, and examinekey which+    caused them to sometimes output side messages.+  * webapp: Fix deletion of current repository directory.+  * Added "nothing" to preferred content expression syntax.+  * annex.largefiles can be configured in .gitattributes too;+    this is particulary useful for v6 repositories, since the+    .gitattributes configuration will apply in all clones of the+    repository.+  * Limit annex.largefiles parsing to the subset of preferred content+    expressions that make sense in its context. So, not "standard"+    or "lackingcopies", etc.+  * annex.largefiles: Add support for mimetype=text/* etc, when git-annex+    is linked with libmagic.+  * matchexpression: Added --largefiles option to parse an annex.largefiles+    expression.+  * Brought back the dbus and xmpp build flags, so build from source can be+    done without C libraries that may be hard to install.+  * init: Fix bugs in submodule .git symlink fixup, that occurred when+    initializing in a subdirectory of a submodule and a submodule of a+    submodule.+  * WebDAV: Set depth 1 in PROPFIND request, for better compatibility with+    some servers. Thanks, wzhd.+  * WebDAV: Remove a bogus trailing slash from the end of the url to the+    temporary store location for a key. Thanks, wzhd.+  * S3: Allow configuring with requeststyle=path to use path-style bucket+    access instead of the default DNS-style access.++ -- Joey Hess <id@joeyh.name>  Thu, 11 Feb 2016 11:42:19 -0400+ git-annex (6.20160126) unstable; urgency=medium    * Fix nasty reversion in the last release that broke sync --content's
debian/control view
@@ -72,6 +72,7 @@ 	libghc-optparse-applicative-dev (>= 0.11.0), 	libghc-torrent-dev, 	libghc-concurrent-output-dev,+	libghc-magic-dev, 	lsof [linux-any], 	ikiwiki, 	perlmagick,
debian/rules view
@@ -2,6 +2,9 @@  export BUILDER=debian/cabal-wrapper +# -j1 is used for reproducible build+export BUILDEROPTIONS=-j1+ STANDALONE_BUILD=$(shell grep -qe '^Package: git-annex-standalone' debian/control \                          && echo 1 || echo 0) 
+ doc/bugs/Adding_torrent_via_addurl_fails.mdwn view
@@ -0,0 +1,56 @@+[[!meta title="addurl failure with non-standard torrent file"]]++### Please describe the problem.+Adding a magnet link via addurl fails after downloading the torrent metatdata if the "announce" field of the torrent is empty++### What steps will reproduce the problem?+    git annex addurl "magnet:?xt=urn:btih:88066b90278f2de655ee2dd44e784c340b54e45c"+++### What version of git-annex are you using? On what operating system?+git-annex version: 6.20160126+archlinux++### Please provide any additional information below.+I have traced back the Problem to the parsing of the torrent metatdata.+Since you also seem to be the author of the haskel-torrent parser I felt it is apropriate to post here.++The above magnet link (an Archlinux Iso) results in a .torrent file that has no "announce" entry. Instead it only has the entry "announce-list" with multiple urls.+This causes the parser to fail.+I dont know if having only "announce-list" horribly violates some standard, however a second magnet link that i tried showed the same behaviour so this might not be an unusual case.++I was able to put in a workarround in btshowmetainfo.py to set "annonuce" to the first entry from "announce-list" if it wasn't defined.+My git-annex binary is compiled with the haskel parser enabled do this doesn't change annexs' behaviour.++It's not a big dealbreaker for me, just playing arround with the torrent feaure for now.++[[!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 addurl "magnet:?xt=urn:btih:88066b90278f2de655ee2dd44e784c340b54e45c"+(downloading torrent file...) ++02/07 16:42:13 [NOTICE] IPv4 DHT: listening on UDP port 6964++02/07 16:42:13 [NOTICE] IPv4 BitTorrent: listening on TCP port 6927++02/07 16:42:13 [NOTICE] IPv6 BitTorrent: listening on TCP port 6927+[#96c5b2 27KiB/27KiB(100%) CN:11 SD:2]                            +02/07 16:42:32 [NOTICE] Download complete: [METADATA]88066b90278f2de655ee2dd44e784c340b54e45c++02/07 16:42:32 [NOTICE] Saved metadata as ../../.git/annex/misctmp/URL--magnet&c,63xt,61urn&cbtih&c88066b90278f2de655ee2dd44e784c340b54e45c/meta/88066b90278f2de655ee2dd44e784c340b54e45c.torrent.+                                                                  +Download Results:+gid   |stat|avg speed  |path/URI+======+====+===========+=======================================================+96c5b2|OK  |       0B/s|[MEMORY][METADATA]88066b90278f2de655ee2dd44e784c340b54e45c++Status Legend:+(OK):download completed.+git-annex: failed to parse torrent: Name not found in dictionary: announce+# 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)++
+ doc/bugs/Android_cannot_setup_gitlab_repo_due_to_ECDSA_key.mdwn view
@@ -0,0 +1,40 @@+### Please describe the problem.+Cannot add gitlab repository on Android.++### What steps will reproduce the problem?+After attempting to add a gitlab repository on git-annex assistant, I am presented with a ssh key and prompted to add it to my gitlab account. After doing so and continuing, git-annex assistant returns to the same page and presents the ssh key again. Attempting to continue repeats the cycle as the ssh key is presented over and over.++### What version of git-annex are you using? On what operating system?+Stable version for Lollipop (I experienced this same error on Kit Kat ~6 months ago but could not resolve it at that point)+Android 5.0 git-annex.apk++### Please provide any additional information below.+In the git-annex assistant log I see:++    No ECDSA host key is known for gitlab.com and you have requested strict checking. +    Host key verification failed. +    No ECDSA host key is known for gitlab.com and you have requested strict checking. +    Host key verification failed. +    fatal: Could not read from remote repository+    +    Please make sure you have the correct access rights and the repository exists.+    Host key verification failed.+    Host key verification failed.+    fatal: Could not read from remote repository.++I resolved the issue by opening a new terminal window, attempting to connect to gitlab (ssh git@gitlab.com), verifying the ECDSA key against the gitlab website (https://about.gitlab.com/gitlab-com/) and accepting the key. The file .ssh/known_hosts was created. The gitlab repository could then be added in git annex assistant.++The lack of information about the error presented to the user in git annex assistant was part of the problem.+++[[!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)++
+ doc/bugs/cannot_remove___96__.t__96___directory.mdwn view
@@ -0,0 +1,34 @@+### Please describe the problem.++I am running `git-annex test`, it stops on an NFS mount with exhausted resources (too many open FDs).++Then I try to remove the `.t` directory with `rm -rf .t` and get many errors like:++```+rm: cannot remove `.t/tmprepo61/.git/annex/objects/96/qw/SHA256E-s10--bcc2eba25d48be76c9d968f2d818196b0e10e13476dcff75371fc0ca4910450c/SHA256E-s10--bcc2eba25d48be76c9d968f2d818196b0e10e13476dcff75371fc0ca4910450c': Permission denied+```++The permissions on those files look normal (they are mine).++### What steps will reproduce the problem?++see above++### What version of git-annex are you using? On what operating system?++git HEAD (self-built). On 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)++On /tmp the self-test works. Maybe it is related to NFS?+
+ doc/bugs/git_annex_get_fails_from_read-only_repository.mdwn view
@@ -0,0 +1,44 @@+### Please describe the problem.++Getting a file from a read-only remote fails with the following error:++[[!format sh """+$ git annex get somefile.avi+get somefile.avi (from some.repo...)+git-annex: ../../../home/annex/repo/.git/annex/transfer/upload/9bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxb4/lck.SHA256E-sxxxxxxx52--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8c.avi: openFd: does not exist (No su+ch file oprotocol version mismatch -- is your shell clean?+(see the rsync man page for an explanation)+rsync error: protocol incompatibility (code 2) at compat.c(176) [Receiver=3.1.1]+r directory)+git-annex-shell: sendkey: 1 failed++  rsync failed -- run git annex again to resume file transfer++  Unable to access these remotes: some.repo++  Try making some of these repositories available:+        xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -- [some.repo]+failed+git-annex: get: 1 failed+"""]]++### What version of git-annex are you using? On what operating system?++Locally git-annex 5.20141125 on debian/jessie, remotely 5.20150727 on FreeBSD.++### Please provide any additional information below.++Using `ps` I got the command executed on the remote side. Running it directly gives:++[[!format sh """+$ git-annex-shell sendkey /home/annex/repo SHA256E-sxxxxxxx52--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8c.avi --uuid 9axxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxde -- remoteuuid=9bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxb4 direct= associatedfile=somefile.avi -- dummy rsync --server --sender -pe.Lsfx --inplace . .+git-annex: ../../../home/annex/repo/.git/annex/transfer/upload/9bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxb4/lck.SHA256E-sxxxxxxx52--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8c.avi: openFd: does not exist (No such file or directory)+failed+git-annex-shell: sendkey: 1 failed+"""]]++The remote repository is marked as read-only. The user on the remote has only read-only access to the git-annex repository.++### 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)++Yes! :-) Despite this, everything works like a charm with several repos on different OSs with lots of data. Thanks for this great tool!
doc/bugs/removeDirectoryRecursive.mdwn view
@@ -27,4 +27,4 @@  ### 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) -+> Fixed it to properly delete the repo. [[done]] --[[Joey]]
+ doc/bugs/use_of_annex_in_submodule_replaces_.git_with_incorrect_symlink.mdwn view
@@ -0,0 +1,49 @@+### Please describe the problem.++Created a temp repository with a submodule under 3rd/visloc referring to another annex via ssh++[[!format sh """++# I have removed some output/wrong cmd calls, hopefully without side-effects++hopa:/tmp/test+$> cat 3rd/visloc/.git+gitdir: ../../.git/modules/3rd/visloc++$> git commit -m 'RF: ...' -a                                +[master (root-commit) fc37b4f] RF: ...+ 2 files changed, 4 insertions(+)+ create mode 100644 .gitmodules+ create mode 160000 3rd/visloc++$> ls -l 3rd/visloc/.git                                                                            +-rw------- 1 yoh yoh 38 Feb  8 10:26 3rd/visloc/.git++$> cat 3rd/visloc/.git+gitdir: ../../.git/modules/3rd/visloc++$> cd 3rd/visloc/sub-01/rois ++$> git annex get *+fatal: Not a git repository: '../../.git'+git-annex: First run: git-annex init++$> cd -+/tmp/test++$> ls -l 3rd/visloc/.git    +lrwxrwxrwx 1 yoh yoh 41 Feb  8 10:43 3rd/visloc/.git -> ../../../../../../.git/modules/3rd/visloc++$> git annex version+git-annex version: 6.20160126+gitg65f4442-1~ndall+1+build flags: Assistant Webapp Pairing Testsuite S3(multipartupload) WebDAV Inotify DBus DesktopNotify XMPP ConcurrentOutput DNS TDFA TorrentParser Feeds Quvi+key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384 SHA3_256E SHA3_256 SHA3_512E SHA3_512 SHA3_224E SHA3_224 SHA3_384E SHA3_384 SKEIN256E SKEIN256 SKEIN512E SKEIN512 SHA1E SHA1 MD5E 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 versions: 5 6+upgrade supported from repository versions: 0 1 2 4 5+"""]]++[[!meta author=yoh]]++> [[fixed|done]]
+ doc/design/adjusted_branches.mdwn view
@@ -0,0 +1,224 @@+Consider two use cases:++1. Using a v6 repo with locked files on a crippled filesystem not+   supporting symlinks. For the files to be usable, they need to be+   unlocked. But, the user may not want to unlock the files everywhere,+   just on this one crippled system.+2. [[todo/hide_missing_files]]++Both of these could be met by making `git-annex sync` maintain an adjusted+version of the original branch, eg `adjusted/master`.++There would be a filter function. For #1 above it would simply convert all+annex symlinks to annex file pointers. For #2 above it would omit files+whose content is not currently in the annex. Sometimes, both #1 and #2 would+be wanted.++[Alternatively, it could stay on the master branch, and only adjust the+work tree and index. See WORKTREE notes below for how this choice would+play out.]++[[!toc]]++## merge++When merging changes from a remote, apply the filter to the head of the+remote branch, resulting in a commit with its changes. Merge in that+commit. Note that it's possible to control the metadata of the commit such+that 2 users who have the same adjusted branch checked out, both generate+the same commit sha.++This would be done by `git annex merge` and `git annex sync`.++Since the adjusted/master branch is not present on the remote, if the user+does a `git pull`, it won't merge in changes from origin/master. Which is+good because the filter needs to be applied first.++[WORKTREE: `git pull` would update the work tree, and may lead to conflicts+between the adjusted work tree and pulled changes. A post-merge hook would+be needed to re-adjust the work tree, and there would be a window where eg,+not present files would appear in the work tree.]++However, if the user does `git merge origin/master`, they'll get into a+state where the filter has not been applied. The post-merge hook could be+used to clean up after that. Or, let the user foot-shoot this way; they can+always reset back once they notice the mistake.++## annex object add/remove++When objects are added/removed from the annex, the associated file has to+be looked up, and the filter applied to it. So, dropping a file with the+missing file filter would cause it to be removed from the adjusted branch,+and receiving a file's content would cause it to appear in the adjusted+branch.++These changes would need to be committed to the adjusted branch, otherwise+`git diff` would show them.++[WORKTREE: Simply adjust the work tree (and index) per the filter.]++## commit++When committing changes, a commit is made as usual to the adjusted branch.+So, the user can `git commit` (or `git annex sync`). This does not touch+the original branch yet. ++Then we need to get from that commit to one with the filters reversed,+which should be the same as if the adjusted branch had not been used.+This commit gets added onto the original branch.++So, the branches would look like this:++        master           adjusted/master+        A ---filter----> A+        |                |+        |                A'+        |                |+        |                B'+        B <--rev filter- |+        |                B+        | ---filter----> |+        |                B''++Note particularly that B does not have A' in its history; the adjusted+branch is not evident from outside. So, we need a way to detect commits+like A'.++Also note that B gets merged back to the adjusted branch, re-applying the+filter. This will make other checkouts that are in the same adjusted branch+end up with the same B'' commit when they pull B.++It might be useful to have a post-commit hook that generates the+reverse-filtered commit and updates the original branch. And/or+`git-annex sync` could do it.++[WORKTREE: A pre-commit hook would be needed to update the staged changes, +reversing the filter before the commit is made. All the other complications+above are avoided.]++## reverse filtering++Reversing filter #1 would mean only converting pointer files to+symlinks when the file was originally a symlink. This is problimatic when a+file is renamed. Would it be ok, if foo is renamed to bar and bar is+committed, for it to be committed as an unlocked file, even if foo was+originally locked?++Reversing filter #2 would mean not deleting removed files whose content was+not present. When the commit includes deletion of files that were removed+due to their content not being present, those deletions are not propigated.+When the user deletes an unlocked file, the content is still+present in annex, so reversing the filter should propigate the file+deletion.++## push++The new master branch can then be pushed out to remotes. The+adjusted/master branch is not pushed to remotes. `git-annex sync` should+automatically push master when adjusted/master is checked out.++When push.default is "simple" (the new default), running `git push` when in+adjusted/master won't push anything. It would with "matching". Pity. (I+continue to feel git picked the wrong default here.) Users may find that+surprising. Users of `git-annex sync` won't need to worry about it though.++[WORKTREE: push works as usual]++## acting on filtered-out files++If a file is filtered out due to not existing, there should be a way+for `git annex get` to get it. Since the filtered out file is not in the+index, that would not normally work. What to do?++Maybe instead of making a branch where the file is deleted, it would be+better to delete it from the work tree, but keep the branch as-is. Then+`git annex get` would see the file, as it's in the index. ++But, not maintaining an adjusted branch complicates other things. See+WORKTREE notes throughout this page. Overall, the WORKTREE approach seems+too problimatic.++Ah, but we know that when filter #2 is in place, any file that `git annex+get` could act on is not in the index. So, it could look at the master branch+instead. (Same for `git annex move --from` and `git annex copy --from`)++OTOH, if filter #1 is in place and not #2, a file might be renamed in the+index, and `git annex get $newname` should work. So, it should look at the+index in that case.++## problems++Using `git checkout` when in an adjusted branch is problimatic, because a+non-adjusted branch would then be checked out. But, we can just say, if+you want to get into an adjusted branch, you have to run some command.+Or, could make a post-checkout hook.++Tags are bit of a problem. If the user tags an ajusted branch, the tag+includes the local adjustments.  +[WORKTREE: not a problem]++If the user refers to commit shas (in, eg commit messages), those won't be+visible to anyone else.  +[WORKTREE: not a problem]++When a pull modifies a file, its content won't be available, and so it+would be hidden temporarily by filter #2. So the file would seem to vanish,+and come back later, which could be confusing. Could be fixed as discussed+in [[todo/deferred_update_mode]]. Arguably, it's just as confusing for the+file to remain visible but have its content temporarily replaced with a+annex pointer.++## integration with view branches++Entering a view from an adjusted branch should probably carry the filtering+over into the creation/updating of the view branch.++Could go a step further, and implement view branches as another branch+adjusting filter, albeit an extreme one. This might improve view branches.+For example, it's not currently possible to update a view branch with+changes fetched from a remote, and this could get us there.++[WORKTREE: Wouldn't be able to integrate, unless view branches are changed+into adjusted view worktrees.]++## filter interface++Distilling all of the above, the filter interface needs to be something+like this, at its most simple:++	data Filter = UnlockFilter | HideMissingFilter | UnlockHideMissingFilter++	getFilter :: Annex Filter++	setFilter :: Filter -> Annex ()++	data FilterAction+		= UnchangedFile FilePath+		| UnlockFile FilePath+		| HideFile FilePath++	data FileInfo = FileInfo+		{ originalBranchFile :: FileStatus+		, isContentPresent :: Bool+		}++	data FileStatus = IsAnnexSymlink | IsAnnexPointer+		deriving (Eq)++	filterAction :: Filter -> FilePath -> FileInfo -> FilterAction+	filterAction UnlockFilter f fi+		| originalBranchFile fi == IsAnnexSymlink = UnlockFile f+	filterAction HideMissingFilter f fi+		| not (isContentPresent fi) = HideFile f+	filterAction UnlockHideMissingFilter f fi+		| not (isContentPresent fi) = HideFile f+		| otherwise = filterAction UnlockFilter f fi+	filterAction _ f _ = UnchangedFile f++	filteredCommit :: Filter -> Git.Commit -> Git.Commit++	-- Generate a version of the commit made on the filter branch+	-- with the filtering of modified files reversed.+	unfilteredCommit :: Filter -> Git.Commit -> Git.Commit++	isFilteredCommit :: Git.Commit -> Bool
doc/design/assistant/polls/Android_default_directory.mdwn view
@@ -4,4 +4,4 @@ want the first time they run it, but to save typing on android, anything that gets enough votes will be included in a list of choices as well. -[[!poll open=yes expandable=yes 73 "/sdcard/annex" 6 "Whole /sdcard" 7 "DCIM directory (photos and videos only)" 2 "Same as for regular git-annex. ~/annex/"]]+[[!poll open=yes expandable=yes 73 "/sdcard/annex" 6 "Whole /sdcard" 8 "DCIM directory (photos and videos only)" 2 "Same as for regular git-annex. ~/annex/"]]
doc/design/balanced_preferred_content.mdwn view
@@ -74,7 +74,7 @@ One way to avoid this problem would be if the preferred content was only used for the initial distribution of files to a repo. If the repo has gotten all the files it wants, it could make a second pass and-opportunisticly get files it doesn't want but that it has space for+opportunistically get files it doesn't want but that it has space for and that don't have enough copies yet. Although this gets back to the original problem of multiple repos racing downloads and files getting more than the desired number of copies.
+ doc/design/new_repo_versions.mdwn view
@@ -0,0 +1,233 @@+This page's purpose is to collect and explore plans for a future+annex.version.++There are two major possible changes that could go in a new repo+version that would require a hard migration of git-annex repositories:++1. Changing .git/annex/objects/ paths, as appear in the git-annex symlinks.++2. Changing the layout of the git-annex branch in a substantial way.++## object path changes++Any change in this area requires the user make changes to their master+branch, any other active branches. Old un-converted tags and other+historical trees in git would also be broken. This is a pretty bad user+experience. (And it bloats history with a commit that rewrites everything+too.++For this reason, any changes in this area have been avoided, going all the+way back to v2 (2011). ++> git-annex had approximately 3 users at the+> time of that migration, and as one of them, I can say it was a total PITA.+--[[Joey]] ++So, there would need to be significant payoffs to justify this change.++Note that changing the hash directories might also change where objects are+stored in special remotes. Because repos can be offline or expensive to+migrate (or both -- Glacier!) any such changes need to keep looking in the+old locations for backwards compatability.++Possible reasons to make changes:++* It's annoyingly inconsistent that git-annex uses a different hash+  directory layout for non-bare repository (on a non-crippled filesystem)+  than is used for bare repositories and some special remotes.++  Users occasionally stumble over this difference when messing with+  internals. The code is somewhat complicated by it. In some cases,+  git-annex checks both locations (eg, a bare repo defaults to xxx/yyy+  but really old ones might use xX/yY for some keys).++  The mixed case hash directories have caused trouble on case-insensative+  filesystems, although that has mostly been papered over to avoid+  problems.++* The hash directories, and also the per-key directories+  can slow down using a repository on a disk (both SSD and spinning).+  +  <https://github.com/datalad/datalad/issues/32>++  Initial benchmarks suggest that going from xX/yY/KEY/OBJ to xX/yY/OBJ+  directories would improve speed 3x.++  Presumably, removing the yY would also speed it up, unless there are too+  many objects and the filesystem gets slow w/o the hash directories.++* Removing a directory level would also reduce disk usage, see [[forum/scalability_with_lots_of_files/]] for more info.++## git-annex branch changes++This might involve, eg, rethinking the xxx/yyy/ hash directories used+in the git-annex branch.++Would this require a hard version transition? It might be possible to avoid+one, but then git-annex would have to look in both the old and the new+place. And if a un-transitioned repo was merged into a transitioned one,+git-annex would have to look in *both* places, and union merge the two sets+of data on the fly. This doubles the git-cat-file overhead of every+operation involving the git-annex branch. So a hard transition would+probably be best.++Also, note that w/o a hard transition, there's the risk that a old+git-annex version gets ahold of a git-annex branch created by a new+git-annex version, and sees only half of the story (the un-transitioned+files). This could be a very confusing failure mode. It doesn't help that+the git-annex branch does not currently have any kind of+version number embedded in it, so the old version of git-annex doesn't even+have a way to check if it can handle the branch.++Possible reasons to make changes:++* There is a discussion of some possible changes to the hash directories here+  <https://github.com/datalad/datalad/issues/17#issuecomment-68558319> with a+  goal of reducing the overhead of the git-annex branch in the overall size+  of the git-annex repository. +  +  Removing the second-level hash directories might improve performance.+  It doesn't save much space when a repository is having incremental changes+  made to it. However, if millions of annexed objects are being added+  in a single commit, removing the second-level hash directories does save+  space; it halves the number of tree+  objects[1](https://github.com/datalad/datalad/issues/17#issuecomment-68759754).++  Also,+  <https://github.com/datalad/datalad/issues/17#issuecomment-68569727>+  suggests using xxx/yyy.log, where one log contains information for+  multiple keys. This would probably improve performance too due to+  caching, although in some cases git-annex would have to process extra+  information to get to the info about the key it wants, which hurts+  performance. The disk usage change of this method has not yet been+  quantified.++* Another reason to do it would be improving git-annex to use vector clocks,+  instead of its current assumption that client's clocks are close enough to+  accurate. This would presumably change the contents of the files.++* While not a sufficient reason on its own, the best practices for file+  formats in the git-annex branch has evolved over time, and there are some+  files that have unusual formats for historical reasons. Other files have+  modern formats, but their parsers have to cope with old versions that+  have other formats. A hard transition would provide an opportunity to+  clean up a lot of that.++## living on the edge++Rather than a hard transition, git-annex could add a mode+that could be optionally enabled when initing a repo for the first time.++Users who know they need that mode could then turn it one, and get the+benefits, while everyone else avoids a transition that doesn't benefit them+much.++There could even be multiple modes, with different tradeoffs depending on+how the repo will be used, its size, etc. Of course that adds complexity.++But the main problem with this idea is, how to avoid the foot shooting+result of merging repo A(v5) into repo B(vNG)? This seems like it would be+all to easy for a user to do. ++As far as git-annex branch changes go, it might be possible for git-annex+to paper over the problem by handling both versions in the merged git-annex+branch, as discussed earlier. But for .git/annex/objects/ changes, there+does not seem to be a reasonable thing for git-annex to do. When it's+receiving an object into a mixed v5 and vNG repo, it can't know which+location that repo expects the object file to be located in. Different+files in the repo might point to the same object in different locations!+Total mess. Must avoid this.++Currently, annex.version is a per-local-repo setting. git-annex can't tell +if two repos that it's merging have different annex.version's. ++It would be possible to add a git-annex:version file, which would work for+git-annex branch merging. Ie, `git-annex merge` could detect if different+git-annex branches have different versions, and refuse to merge them (or+upgrade the old one before merging it).++Also, that file could be used by git-annex, to automatically set+annex.version when auto-initing a clone of a repo that was initted with+a newer than default version.++But git-anex:version won't prevent merging B/master into A's master.+That merge can be done by git; nothing in git-annex can prevent it.++What we could do is have a .annex-version flag file in the root of the+repo. Then git merge would at least have a merge conflict. Note that this+means inflicting the file on all git-annex repos, even ones used by people+with no intention of living on the edge. And, it would take quite a while+until all such repos get updated to contain such a file.++Or, we could just document that if you initialize a repo with experimental+annex.version, you're living on the edge and you can screw up your repo+by merging with a repo from an old version.++git-annex fsck could also fix up any broken links that do result from the+inevitable cases where users ignore the docs.++## version numbers vs configuration++A particular annex.version like 5 encompasses a number of somewhat distinct+things++* git-annex branch layout+* .git/annex/objects/ layout+* other git stuff (like eg, the name of the HEAD branch in direct mode)++If the user is specifying at `git annex init` time some nonstandard things+they want to make the default meet their use case better, that is more+a matter of configuration than of picking a version. ++For example, we could say that the user is opting out of the second-level+object hash directories. Or we could say the user is choosing to use vNG,+which is like  v5 except with different object hash directory structure.++	git annex init --config annex.objects.hashdirectories 1 +		--config annex.objects.hashlower true+	git annex init --version 6++The former would be more flexible. The latter is simpler. ++The former also lets the user chose *no* hash directories, or +choose 2 levels of hash directories while using the (v5 default) mixed+case hashing.++## concrete design++Make git-annex:difference.log be used by newer git-annex versions than v5,+and by nonstandard configurations.++The file contents will be "timestamp uuid [value, ..]", where value is a+serialized data type that describes divergence from v5 (since v5 and older+don't have the git-annex:difference.log file).++So, for example, "[Version 6]" could indicate that v6 is being used. Or,+"[ObjectHashLower True, ObjectHashDirectories 1, BranchHashDirectories 1]"+indicate a nonstandard configuration on top of v5 (this might turn out to+be identical to v6; just make the compare equal and no problem).++git-annex merge would check if it's merging in a git-annex:difference.log from+another repo that doesn't match the git-annex:difference.log of the local repo,+and abort. git-annex sync (and the assistant) would check the same, but+before merging master branches either, to avoid a bad merge there.++The git-annex:difference.log of a local repo could be changed by an upgrade+or some sort of transition. When this happens, the new value is written+for the uuid of the local repo. git-annex merge would then refuse to merge+with remote repos until they were also transitioned.++(There's perhaps some overlap here with the existing+git-annex:transitions.log, however the current transitions involve+forgetting history/dead remotes and so can be done repeatedly on a+repository. Also, the current transitions can be performed on remote+branches before merging them in; that wouldn't work well for version+changes since those require other changes in the remote repo.)++Not covered:++* git-merge of other branches, such as master (can be fixed by `git annex+  fix` or `fsck`)+* Old versions of git-annex will ignore the version file of course,+  and so merging such repos using them can result in pain.+
doc/design/roadmap.mdwn view
@@ -1,13 +1,12 @@ ## ahead -* [[design/caching_database]] for metadata views, direct mode mappings+* [[adjusted_branches]]+* [[design/caching_database]] for metadata views * [[assistant/deltas]] * [[assistant/gpgkeys]] management for the assistant * [[assistant/telehash]] or similar * [[design/requests_routing]]-* [[design/v6]] repo format-* [[todo/deferred_update_mode]]-* [[use smudge and clean filters|todo/smudge]] like Git LFS+* [[design/new_repo_versions]]  ## the rearview 
− doc/design/v6.mdwn
@@ -1,233 +0,0 @@-This page's purpose is to collect and explore plans for a future-annex.version 6.--There are two major possible changes that could go in v6 or a later-version that would require a hard migration of git-annex repositories:--1. Changing .git/annex/objects/ paths, as appear in the git-annex symlinks.--2. Changing the layout of the git-annex branch in a substantial way.--## object path changes--Any change in this area requires the user make changes to their master-branch, any other active branches. Old un-converted tags and other-historical trees in git would also be broken. This is a pretty bad user-experience. (And it bloats history with a commit that rewrites everything-too.--For this reason, any changes in this area have been avoided, going all the-way back to v2 (2011). --> git-annex had approximately 3 users at the-> time of that migration, and as one of them, I can say it was a total PITA.---[[Joey]] --So, there would need to be significant payoffs to justify this change.--Note that changing the hash directories might also change where objects are-stored in special remotes. Because repos can be offline or expensive to-migrate (or both -- Glacier!) any such changes need to keep looking in the-old locations for backwards compatability.--Possible reasons to make changes:--* It's annoyingly inconsistent that git-annex uses a different hash-  directory layout for non-bare repository (on a non-crippled filesystem)-  than is used for bare repositories and some special remotes.--  Users occasionally stumble over this difference when messing with-  internals. The code is somewhat complicated by it. In some cases,-  git-annex checks both locations (eg, a bare repo defaults to xxx/yyy-  but really old ones might use xX/yY for some keys).--  The mixed case hash directories have caused trouble on case-insensative-  filesystems, although that has mostly been papered over to avoid-  problems.--* The hash directories, and also the per-key directories-  can slow down using a repository on a disk (both SSD and spinning).-  -  <https://github.com/datalad/datalad/issues/32>--  Initial benchmarks suggest that going from xX/yY/KEY/OBJ to xX/yY/OBJ-  directories would improve speed 3x.--  Presumably, removing the yY would also speed it up, unless there are too-  many objects and the filesystem gets slow w/o the hash directories.--* Removing a directory level would also reduce disk usage, see [[forum/scalability_with_lots_of_files/]] for more info.--## git-annex branch changes--This might involve, eg, rethinking the xxx/yyy/ hash directories used-in the git-annex branch.--Would this require a hard version transition? It might be possible to avoid-one, but then git-annex would have to look in both the old and the new-place. And if a un-transitioned repo was merged into a transitioned one,-git-annex would have to look in *both* places, and union merge the two sets-of data on the fly. This doubles the git-cat-file overhead of every-operation involving the git-annex branch. So a hard transition would-probably be best.--Also, note that w/o a hard transition, there's the risk that a old-git-annex version gets ahold of a git-annex branch created by a new-git-annex version, and sees only half of the story (the un-transitioned-files). This could be a very confusing failure mode. It doesn't help that-the git-annex branch does not currently have any kind of-version number embedded in it, so the old version of git-annex doesn't even-have a way to check if it can handle the branch.--Possible reasons to make changes:--* There is a discussion of some possible changes to the hash directories here-  <https://github.com/datalad/datalad/issues/17#issuecomment-68558319> with a-  goal of reducing the overhead of the git-annex branch in the overall size-  of the git-annex repository. -  -  Removing the second-level hash directories might improve performance.-  It doesn't save much space when a repository is having incremental changes-  made to it. However, if millions of annexed objects are being added-  in a single commit, removing the second-level hash directories does save-  space; it halves the number of tree-  objects[1](https://github.com/datalad/datalad/issues/17#issuecomment-68759754).--  Also,-  <https://github.com/datalad/datalad/issues/17#issuecomment-68569727>-  suggests using xxx/yyy.log, where one log contains information for-  multiple keys. This would probably improve performance too due to-  caching, although in some cases git-annex would have to process extra-  information to get to the info about the key it wants, which hurts-  performance. The disk usage change of this method has not yet been-  quantified.--* Another reason to do it would be improving git-annex to use vector clocks,-  instead of its current assumption that client's clocks are close enough to-  accurate. This would presumably change the contents of the files.--* While not a sufficient reason on its own, the best practices for file-  formats in the git-annex branch has evolved over time, and there are some-  files that have unusual formats for historical reasons. Other files have-  modern formats, but their parsers have to cope with old versions that-  have other formats. A hard transition would provide an opportunity to-  clean up a lot of that.--## living on the edge--Rather than a hard transition, git-annex could add a v6 mode-that could be optionally enabled when initing a repo for the first time.--Users who know they need that mode could then turn it one, and get the-benefits, while everyone else avoids a transition that doesn't benefit them-much.--There could even be multiple modes, with different tradeoffs depending on-how the repo will be used, its size, etc. Of course that adds complexity.--But the main problem with this idea is, how to avoid the foot shooting-result of merging repo A(v5) into repo B(v6)? This seems like it would be-all to easy for a user to do. --As far as git-annex branch changes go, it might be possible for git-annex-to paper over the problem by handling both versions in the merged git-annex-branch, as discussed earlier. But for .git/annex/objects/ changes, there-does not seem to be a reasonable thing for git-annex to do. When it's-receiving an object into a mixed v5 and v6 repo, it can't know which-location that repo expects the object file to be located in. Different-files in the repo might point to the same object in different locations!-Total mess. Must avoid this.--Currently, annex.version is a per-local-repo setting. git-annex can't tell -if two repos that it's merging have different annex.version's. --It would be possible to add a git-annex:version file, which would work for-git-annex branch merging. Ie, `git-annex merge` could detect if different-git-annex branches have different versions, and refuse to merge them (or-upgrade the old one before merging it).--Also, that file could be used by git-annex, to automatically set-annex.version when auto-initing a clone of a repo that was initted with-a newer than default version.--But git-anex:version won't prevent merging B/master into A's master.-That merge can be done by git; nothing in git-annex can prevent it.--What we could do is have a .annex-version flag file in the root of the-repo. Then git merge would at least have a merge conflict. Note that this-means inflicting the file on all git-annex repos, even ones used by people-with no intention of living on the edge. And, it would take quite a while-until all such repos get updated to contain such a file.--Or, we could just document that if you initialize a repo with experimental-annex.version, you're living on the edge and you can screw up your repo-by merging with a repo from an old version.--git-annex fsck could also fix up any broken links that do result from the-inevitable cases where users ignore the docs.--## version numbers vs configuration--A particular annex.version like 5 encompasses a number of somewhat distinct-things--* git-annex branch layout-* .git/annex/objects/ layout-* other git stuff (like eg, the name of the HEAD branch in direct mode)--If the user is specifying at `git annex init` time some nonstandard things-they want to make the default meet their use case better, that is more-a matter of configuration than of picking a version. --For example, we could say that the user is opting out of the second-level-object hash directories. Or we could say the user is choosing to use v6,-which is like  v5 except with different object hash directory structure.--	git annex init --config annex.objects.hashdirectories 1 -		--config annex.objects.hashlower true-	git annex init --version 6--The former would be more flexible. The latter is simpler. --The former also lets the user chose *no* hash directories, or -choose 2 levels of hash directories while using the (v5 default) mixed-case hashing.--## concrete design--Make git-annex:difference.log be used by newer git-annex versions than v5,-and by nonstandard configurations.--The file contents will be "timestamp uuid [value, ..]", where value is a-serialized data type that describes divergence from v5 (since v5 and older-don't have the git-annex:difference.log file).--So, for example, "[Version 6]" could indicate that v6 is being used. Or,-"[ObjectHashLower True, ObjectHashDirectories 1, BranchHashDirectories 1]"-indicate a nonstandard configuration on top of v5 (this might turn out to-be identical to v6; just make the compare equal and no problem).--git-annex merge would check if it's merging in a git-annex:difference.log from-another repo that doesn't match the git-annex:difference.log of the local repo,-and abort. git-annex sync (and the assistant) would check the same, but-before merging master branches either, to avoid a bad merge there.--The git-annex:difference.log of a local repo could be changed by an upgrade-or some sort of transition. When this happens, the new value is written-for the uuid of the local repo. git-annex merge would then refuse to merge-with remote repos until they were also transitioned.--(There's perhaps some overlap here with the existing-git-annex:transitions.log, however the current transitions involve-forgetting history/dead remotes and so can be done repeatedly on a-repository. Also, the current transitions can be performed on remote-branches before merging them in; that wouldn't work well for version-changes since those require other changes in the remote repo.)--Not covered:--* git-merge of other branches, such as master (can be fixed by `git annex-  fix` or `fsck`)-* Old versions of git-annex will ignore the version file of course,-  and so merging such repos using them can result in pain.-
doc/devblog/day_248__workload_tuning.mdwn view
@@ -15,7 +15,7 @@   make git-annex a lot more complicated, or b) negatively impact others.   (Without having to fork git-annex.) -This is discussed in more depth in [[design/v6]].+This is discussed in more depth in [[design/new_repo_versions]].  The solution, which I've built today, is support for [[tuning]] settings, when a new repository is first created. The resulting
+ doc/devblog/day_359__annex.largefiles_gitattributes.mdwn view
@@ -0,0 +1,18 @@+For use cases that mix annexed files with files stored in git, the+annex.largefiles config is more important in v6 repositories than before,+since it configures the behavior of `git add` and even `git commit -a`. To+make it possible to set annex.largefiles so it'll stick across clones of+a repository, I have now made it be supported in `.gitattributes` files+as well as git config.++Setting it in .gitattributes looks a little bit different, since+the regular .gitattributes syntax can be used to match on the filename.++	* annex.largefiles=(largerthan=100kb)+	*.c annex.largefiles=nothing++It seems there's no way to make a git attribute value contain whitespace.+So, more complicated annex.largefiles expressions need to use parens to+break up the words.++	* annex.largefiles=(largerthan=100kb)and(not(include=*.c))
+ doc/devblog/day_360__annex.largefiles_mimetype.mdwn view
@@ -0,0 +1,8 @@+The same parser was used for both preferred content expressions and+annex.largefiles. Reworked that today, splitting it into two distinct+parsers. It doesn't make any sense to use terms like "standard" or+"lackingcopies" in annex.largefiles, and such are now rejected.++That groundwork also let me add a feature that only makes sense for+annex.largefiles, and not for preferred content expressions: Matching by+mime type, such as `mimetype=text/*`
+ doc/devblog/day_360__results_of_2015_user_survey.mdwn view
@@ -0,0 +1,56 @@+The [2015 git-annex user servey](http://git-annex-survey.branchable.com/polls/2015/)+is over with, and I'm reading through it and comparing with the+[2013 survey](http://git-annex-survey.branchable.com/polls/2013/).++37% fewer users responded to the 2015 survey than in 2013.+It's hard to tell if this has anything to do with the total number of+git-annex users; Debian's popcon suggests the number of users has doubled+since 2013, although its graph also suggests the number of users has+flattened off since 2014. The difference may just be that I +promoted the 2013 survey better than the 2015 survey, perhaps reaching+kickstarter backers who I was in touch with back then.++25% use the assistant. Of those, 20% use XMPP, which is good to know as I'd+like to get rid of it.++Android use has quardrupled, and Windows use has doubled; both are now at+4%. It's not surprising that Android and Windows users still think more+porting work is needed for those OSes. iOS is the only unsupported OS that+more than 1% of users want. Embedded and NAS systems were mentioned much+less than in 2013; probably the+[[arm_tarball_build|forum/new_linux_arm_tarball_build]] met many such+needs.++About the same percentage of users prefer direct mode in 2015 as did in 2013,+and ditto for indirect mode. But, more users in 2015 only use direct mode+on platforms that force its use. Correlating with the OS percentages+suggests that many of these users are using removable media with the+FAT filesystem, rather than an OS like Windows or Android. Hopefully+v6 unlocked files will eventually better meet those user's needs.++The percent of users installing git-annex from source has halved since 2013,+and it seems that builds from this website have taken up most of that slack;+I would have expected more installs from Debian, Homebrew etc, but that+seems not to have increased.++The number of repositories per user has gone up quite a lot since 2013,+when only 7% of users had more than 10 repos. Now, 23% of users do. And,+2% of users have more than 100 repos! This probably involves both more+repositories for different purposes, and cloning of repositories+to more devices.++Similarly, the amount of data stored has gone up. 34% have more than 1+terabyte stored, up from 18% in 2013. 2% have more than 16 terabytes.++There's some indications of more users sharing repositories or+otherwise using it in teams of larger groups, although most users still use+it by themselves.++Users seem happier with git-annex now than in 2013. 16% call it "one of my+favorite applications of all time". And, significantly fewer find it too+hard to use than in 2013.++The main blocking problems are documentation, performance with many+files (a general git problem), and various issues with the assistant.+Respondants suggest more focus on making it easier for nontechnical users,+and for use in larger groups/organizations.
+ doc/devblog/day_361__adjusted_branches_design.mdwn view
@@ -0,0 +1,5 @@+Working on a design for [[design/adjusted_branches]]. I've been kicking+this idea around for a while to replace direct mode on crippled filesystems+with v6 unlocked files. And the same thing would allow for hiding not+present files. It's somewhat complicated, but the design I have seems like+it would work.
+ doc/forum/Annex_keeps_dropping_content.mdwn view
@@ -0,0 +1,9 @@+I'm experiencing a strange behaviour...++I have a few annexes (local, ssh, gitolite) in my group, some of them  are "manual standard" and some are "backup".++If I 'get' files on my laptop annex and then I 'sync --content' local files are dropped! Local is "manual standard".++Am I doing something wrong?++Thanks
+ doc/forum/Backing_up_photos_to_the_cloud.mdwn view
@@ -0,0 +1,13 @@+I'm using git annex to manage my photo collection. The main reason is because my laptop doesn't have enough space to store all my photos, so I'm using git annex to create a sort of split repository between my laptop (which has some photos) and an external drive (which has everything). So far this has worked well, I have around 15,000 photos which is around 40GB.++Now I also want to see if I can use git annex to improve my backup workflow. Previously I've just exported albums from my photo manager (iPhoto on OS X), zipped them up, and uploaded them to S3. I have lifecycle rules setup so that they are automatically replicated to a different region and archived to Glacier (it's a lot easier than dealing with Glacier directly). I am using this as a last resort backup in case everything else is lost, so it doesn't matter if it takes a while to access. This works well, except on it's own I don't really know what photos are stored where, which is where I'm hoping git annex can help.++I've tried using the S3 remote, but there are a few things which I don't like:++1) If the git repository is lost I can't recover the original paths, so I won't know which photo belongs in which album. As this is a last resort backup, if I ever need to get anything from here it's likely that the git repository is also lost. [JGit supports storing Git repositories in S3](http://www.fancybeans.com/blog/2012/08/24/how-to-use-s3-as-a-private-git-repository/), but that seems like the wrong way to solve this, I'd prefer just to have the original folder structure maintained.++2) As there are 15,000 photos, that means 15,000 requests to S3 to upload them and another 15,000 each time I check them. On my connection I can upload to AWS at around 5MB/s, but due to latency that only means one or two photos per second. I'd prefer to just upload archives.++As I understand encryption + chunking with a sufficiently large size (say 100Mb) would help solve the second problem, but as this is a last resort backup I don't want to have to worry about encryption keys or passphrases.++It looks like a wrapper around the [archivedrive feature](https://git-annex.branchable.com/tips/offline_archive_drives/) (which archives, zips and uploads it to S3) would do what I want, but I'm wondering if there is a better way?
+ doc/forum/Move_files_in_git_annex___40__direct_mode__41__.mdwn view
@@ -0,0 +1,22 @@+Hi guys, I have a git annex repo under `/path`.++I ran:++```+cd /path/subdir2+mv ../subdir1/stuff* .+git annex add+git annex sync+```++Then I went to another repo (clone of the first) and did:++```+cd /paht1+git annex sync+git annex get .+```++Now I got the stuff from under `subdir2` in my second repo, just that the same stuff is also still under `subdir1` - how do I make git-annex aware of this change?++Also, someone suggested running `git annex watch`
+ doc/forum/Multisession_compatible__63__.mdwn view
@@ -0,0 +1,8 @@+Thanks for the great tool!++Is git-annex multisession compatible? I'm assuming that an "add" for example, will switch to the git-annex branch, commit data, and switch back to the previous branch. Is this protected by a Lock of some sort so that if two separate processes are interacting with the same repo/annex simultaneously there won't be any corruption?++If not, is this something I could add within my python class that is implementing the interface to the Annex?++Thanks,+Mark
+ doc/forum/Syncing_Compressed_files.mdwn view
@@ -0,0 +1,1 @@+I don't see anywhere in the documentation that specifies this, but git-annex hasn't been syncing any kind of compressed file for me like zip files or 7z compressed files.  Haven't tried gzip files.  It has been working fine with other files like PDFs, video, images etc.  Was wanting to know if that is expected behaviour or if something is wrong?
doc/git-annex-checkpresentkey.mdwn view
@@ -4,7 +4,7 @@  # SYNOPSIS -git annex  `key remote`+git annex checkpresentkey `key remote`  # DESCRIPTION 
doc/git-annex-matchexpression.mdwn view
@@ -1,6 +1,6 @@ # NAME -git-annex matchexpression - checks if a preferred content expression matches+git-annex matchexpression - checks if an expression matches  # SYNOPSIS @@ -8,7 +8,7 @@  # DESCRIPTION -This plumbing-level command is given a prefferred content expression,+This plumbing-level command is given a preferred content expression, and some data, and checks if the expression matches the data. It exits 0 if it matches, and 1 if not. If not enough data was provided, it displays an error and exits with special code 42.@@ -37,6 +37,16 @@    Many keys have a known size, and so --size is not needed when specifying   such a key.++* `--largefiles`++  Parse the expression as an annex.largefiles expression, rather than a+  preferred content expression.++* `--mimetype=`++  Tell what the mime type of the file is. Only needed when using+  --largefiles with a mimetype= expression.  # SEE ALSO 
doc/git-annex-preferred-content.mdwn view
@@ -32,7 +32,7 @@  # EXPRESSIONS -* `include=glob` and `exclude=glob`+* `include=glob` / `exclude=glob`    Match files to include, or exclude. @@ -101,7 +101,7 @@   Matches only files that git-annex believes are present in all repositories   in the specified group. -* `smallerthan=size` and `largerthan=size`+* `smallerthan=size` / `largerthan=size`    Matches only files whose content is smaller than, or larger than the   specified size.@@ -217,6 +217,10 @@ * `anything`    Matches any version of any file.++* `nothing`++  Matches nothing. (Same as "not anything")  * `not expression` 
doc/git-annex.mdwn view
@@ -795,6 +795,9 @@   Space-separated list of names of the key-value backends to use.   The first listed is used to store new files by default. +  This is overridden by annex annex.backend configuration in the+  .gitattributes files.+ * `annex.diskreserve`    Amount of disk space to reserve. Disk space is checked when transferring@@ -807,35 +810,29 @@  * `annex.largefiles` -  Allows configuring which files are considered to be large enough to-  need to be added to the annex. By default, all specified files are added-  to the annex, but configuring this can cause the small files to be-  checked into git, without using the annex.--  The value is a preferred content expression. See [[git-annex-preferred-content]](1)-  for details.--  Example:+  Used to configure which files are large enough to be added to the annex.+  Default: All files. -	annex.largefiles = largerthan=100kb and not (include=*.c or include=*.h)+  Overrides any annex.largefiles attributes in `.gitattributes` files. -  This setting is checked by `git annex add`, `git annex import` and the assistant.-  It's also used by `git annex addurl` and `git annex importfeed` when-  downloading files.+  See <https://git-annex.branchable.com/tips/largefiles> for details. -  It can be useful to temporarily override it via -c at the command line.-  For example:+* `annex.addsmallfiles` -  	git annex add -c annex.largefiles='include=*' 99kbfile+  Controls whether small files (not matching annex.largefiles)+  should be checked into git by `git annex add`. Defaults to true;+  set to false to instead make small files be skipped.  * `annex.numcopies`    This is a deprecated setting. You should instead use the   `git annex numcopies` command to configure how many copies of files-  are kept across all repositories.+  are kept across all repositories, or the annex.numcopies .gitattributes+  setting.    This config setting is only looked at when `git annex numcopies` has-  never been configured.+  never been configured, and when there's no annex.numcopies setting in the+  .gitattributes file.    Note that setting numcopies to 0 is very unsafe. @@ -1285,7 +1282,7 @@    These can be passed to `git annex init` to tune the repository.   They cannot be safely changed in a running repository.-  For details, see <http://git-annex.branchable.com/tuning/>.+  For details, see <https://git-annex.branchable.com/tuning/>.  # CONFIGURATION VIA .gitattributes @@ -1298,6 +1295,10 @@ 	* annex.backend=WORM 	*.ogg annex.backend=SHA256E +There is a annex.largefiles attribute; which is used to configure which+files are large enough to be added to the annex.+See <https://git-annex.branchable.com/tips/largefiles> for details.+ The numcopies setting can also be configured on a per-file-type basis via the `annex.numcopies` attribute in `.gitattributes` files. This overrides other numcopies settings.@@ -1312,7 +1313,8 @@ These settings are honored by git-annex whenever it's operating on a matching file. However, when using --all, --unused, or --key to specify keys to operate on, git-annex is operating on keys and not files, so will-not honor the settings from .gitattributes.+not honor the settings from .gitattributes. For this reason, the `git annex+numcopies` command is useful to configure a global default for numcopies.  Also note that when using views, only the toplevel .gitattributes file is preserved in the view, so other settings in other files won't have any@@ -1351,7 +1353,7 @@ # SEE ALSO  More git-annex documentation is available on its web site,-<http://git-annex.branchable.com/>+<https://git-annex.branchable.com/>  If git-annex is installed from a package, a copy of its documentation should be included, in, for example, `/usr/share/doc/git-annex/`.@@ -1360,6 +1362,6 @@  Joey Hess <id@joeyh.name> -<http://git-annex.branchable.com/>+<https://git-annex.branchable.com/>  Warning: Automatically converted into a man page by mdwn2man. Edit with care.
+ doc/install/Homebrew-cask.mdwn view
@@ -0,0 +1,3 @@+[Homebrew Cask](http://caskroom.io) has a [cask](https://github.com/caskroom/homebrew-cask/blob/master/Casks/git-annex.rb) for git-annex.++Homebrew cask users can simply run `brew cask install git-annex` to install git-annex and git-annex-shell from the OSX binary images.
doc/install/OSX.mdwn view
@@ -3,7 +3,7 @@ [[!img /assistant/osx-app.png align=right link=/assistant]] For easy installation, use the prebuilt app bundle. -* 10.10 Yosemite / 10.9 Mavericks: [git-annex.dmg](https://downloads.kitenet.net/git-annex/OSX/current/10.10_Yosemite/git-annex.dmg)+* 10.11 El Capitan / 10.10 Yosemite / 10.9 Mavericks: [git-annex.dmg](https://downloads.kitenet.net/git-annex/OSX/current/10.10_Yosemite/git-annex.dmg) * 10.8.2 Mountain Lion: [git-annex.dmg.bz2](https://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/git-annex.dmg.bz2) **warning: not being updated any longer** * 10.7.5 Lion: [git-annex.dmg](https://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/git-annex.dmg) **warning: not being updated any longer** @@ -21,14 +21,14 @@ ## autobuilds  [[Joey]] autobuilds the app for 10.10 Yosemite-(also reported to work on 10.9 Mavericks).+(also reported to work on 10.9 Mavericks and 10.11 El Capitan). Thanks to Kevin McKenzie for hosting the autobuilder.  * [autobuild of git-annex.dmg](https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-yosemite/git-annex.dmg) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-yosemite/))  ## using Homebrew -git-annex is now [[available in Homebrew|Homebrew]]!+git-annex is now [[available in Homebrew|Homebrew]] (source) as well as [[available in Homebrew Cask|Homebrew-cask]] (binary).  ## using MacPorts 
+ doc/install/OSX/comment_12_17b84f51de6bed88e373350b194c8a8d._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="andrew.grangaard@bf525d11f8ebfbfb0976f7df2301aa0f36668f59"+ nickname="andrew.grangaard"+ subject="10.10 build works on El Capitan (10.11)"+ date="2016-02-02T01:30:45Z"+ content="""+The OSX 10.10 build works fine on my 10.11 El Capitan machine.   Updated this page to reflect that.++git-annex is also in 'brew cask', automating installation from the OSX binaries.   I've sent  [PR 18105](https://github.com/caskroom/homebrew-cask/pull/18105) to the brew cask team to get the cask to work for 10.11.+"""]]
doc/install/fromsource.mdwn view
@@ -53,17 +53,19 @@  	mv ~/.local/bin/git-annex ~/bin # or /usr/local/bin/ or whatever -Note that this build produces a git-annex without XMPP and DBUS support.-These optional features are only used by the webapp, and require-installing additional C libraries. To try to build with these features+Note that this build produces a git-annex without the build flags+XMPP, DBUS, and MagicMime.+These optional features require installing additional C libraries.+To try to build with these features  enabled, pass extra parameters when running stack: -`--flag git-annex:XMPP --flag git-annex:DBUS`+`--flag git-annex:XMPP --flag git-annex:DBUS --flag git-annex:MagicMime`  ## minimal build from source with cabal -This can be done anywhere, and builds git-annex without some optional features-that require harder-to-install C libraries. This is plenty to let you get started with-git-annex, but it does not include the assistant or webapp.+This can be done anywhere, and builds git-annex without some optional+features that require harder-to-install C libraries. This is plenty to let+you get started with git-annex, but it does not include the assistant or+webapp.  Be warned that this involves building a lot of Haskell libraries from source, and so it has a lot of moving parts, and it's not uncommon for it@@ -81,8 +83,8 @@  To build with all features enabled, including the assistant and webapp, you will need to install several C libraries and their headers,-including libgnutls, libgsasl, libxml2, and zlib. How to do that for-your OS is beyond the scope of this page. +including libgnutls, libgsasl, libxml2, libmagic, and zlib. How to do+that for your OS is beyond the scope of this page.   Once the C libraries are installed, run inside the source tree: 
− doc/news/version_5.20151208.mdwn
@@ -1,24 +0,0 @@-git-annex 5.20151208 released with [[!toggle text="these changes"]]-[[!toggleable text="""-   * Build with -j1 again to get reproducible build.-   * Display progress meter in -J mode when copying from a local git repo,-     to a local git repo, and from a remote git repo.-   * Display progress meter in -J mode when downloading from the web.-   * map: Improve display of git remotes with non-ssh urls, including http-     and gcrypt.-   * When core.sharedRepository is set, annex object files are not made mode-     444, since that prevents a user other than the file owner from locking-     them. Instead, a mode such as 664 is used in this case.-   * tahoe: Include tahoe capabilities in whereis display.-   * import: Changed to honor annex.largefiles settings.-   * addurl, importfeed: Changed to honor annex.largefiles settings,-     when the content of the url is downloaded. (Not when using --fast or-     --relaxed.)-   * webapp: Fix bugs that could result in a relative path such as "."-     being written to ~/.config/git-annex/autostart, and ignore any such-     relative paths in the file.-     This was a reversion caused by the relative path changes in 5.20150113.-   * dropunused: Make more robust when trying to drop an object that has-     already been dropped.-   * Fix reversion in handling of long filenames, particularly when using-     addurl/importfeed, which was introduced in the previous release."""]]
+ doc/news/version_6.20160211.mdwn view
@@ -0,0 +1,30 @@+git-annex 6.20160211 released with [[!toggle text="these changes"]]+[[!toggleable text="""+   * annex.addsmallfiles: New option controlling what is done when+     adding files not matching annex.largefiles.+   * Fix reversion in lookupkey, contentlocation, and examinekey which+     caused them to sometimes output side messages.+   * webapp: Fix deletion of current repository directory.+   * Added "nothing" to preferred content expression syntax.+   * annex.largefiles can be configured in .gitattributes too;+     this is particulary useful for v6 repositories, since the+     .gitattributes configuration will apply in all clones of the+     repository.+   * Limit annex.largefiles parsing to the subset of preferred content+     expressions that make sense in its context. So, not "standard"+     or "lackingcopies", etc.+   * annex.largefiles: Add support for mimetype=text/* etc, when git-annex+     is linked with libmagic.+   * matchexpression: Added --largefiles option to parse an annex.largefiles+     expression.+   * Brought back the dbus and xmpp build flags, so build from source can be+     done without C libraries that may be hard to install.+   * init: Fix bugs in submodule .git symlink fixup, that occurred when+     initializing in a subdirectory of a submodule and a submodule of a+     submodule.+   * WebDAV: Set depth 1 in PROPFIND request, for better compatibility with+     some servers. Thanks, wzhd.+   * WebDAV: Remove a bogus trailing slash from the end of the url to the+     temporary store location for a key. Thanks, wzhd.+   * S3: Allow configuring with requeststyle=path to use path-style bucket+     access instead of the default DNS-style access."""]]
doc/preferred_content.mdwn view
@@ -58,6 +58,7 @@ Here are recent changes to preferred content expressions, and the version they were added in. +* "nothing" 6.201600202 * "anything" 5.20150616 * "standard" 5.20140314     (only when used in a more complicated expression; "standard" by
+ doc/preferred_content/comment_10_d9eb7d8efe731cbcdb456fc56935d886._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="grawity@2ea26be48562f66fcb9b66307da72b1e2e37453f"+ nickname="grawity"+ subject="default settings?"+ date="2016-01-28T09:32:45Z"+ content="""+Could you clarify how the _default_ (empty) preferred content setting works? Is it equivalent to `anything`, or more magical than that?++(Asking because I noticed that `annex find --in . --want-drop` in such a repo matches basically all files, even the ones that `annex sync --content` just retrieved. Likewise, it retrieves files while `annex find --not --in . --want-get` lists nothing. I'm fine with the sync behavior here, but somewhat worried that a _future_ `annex sync --content` would actually decide to drop everything... I'm running 6.20160126 with numcopies=1.)++Also, what happens if I use `standard` for a repo that's not in any group?+"""]]
+ doc/preferred_content/comment_11_fa7249ebbd7d5b499b486311c0a8f96d._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 11"""+ date="2016-01-29T17:30:52Z"+ content="""+@grawity, the empty (or unset) preferred content setting causes a default behavior to+be used. What the default is varies depending on what you're doing. For+example, if you're running `git annex drop --auto`, it defaults to dropping+everything when there's no preferred content setting. On the other hand,+`git annex sync --content` defaults to getting everything. So, this is+diffent than using "anything".++If you use "standard" and the repo is not in exactly one of the standard+groups, it behaves the same as if you'd given it an unparseable preferred+content setting. It will want all files it has and none it doesn't have.+"""]]
doc/special_remotes/S3.mdwn view
@@ -59,6 +59,9 @@ * `host` and `port` - Specify in order to use a different, S3 compatable   service. +* `requeststyle` - Set to "path" to use path style requests, instead of the+  default DNS style requests. This is needed with some S3 services.+ * `bucket` - S3 requires that buckets have a globally unique name,    so by default, a bucket name is chosen based on the remote name   and UUID. This can be specified to pick a bucket name.
+ doc/tips/largefiles.mdwn view
@@ -0,0 +1,110 @@+[[!meta title="annex.largefiles: configuring mixed content repositories"]]++Normally commands like `git annex add` always add files to the annex.+And when using the v6 repository mode, even `git add` and `git commit -a`+will add files to the annex.++Let's suppose you're developing a video game, written in C. You have+source code, and some large game assets. You want to ensure the source+code is stored in git -- that's what git's for! And you want to store+the game assets in the git annex -- to avod bloating your git repos with+possibly enormous files, but still version control them.++The annex.largefiles configuration is useful for such mixed content+repositories. It's checked by `git annex add`, by `git add` and `git commit -a`+(in v6 repositories), by `git annex import` and the assistant. It's+also used by `git annex addurl` and `git annex importfeed` when downloading+files. When a file does not match annex.largefiles, these commands will+add its content to git instead of to the annex.++This saves you the bother of keeping things straight when adding files.++## examples++For example, let's make only files larger than 100 kb be added to the annex,+and never `*.c` and `*.h` source code files.++Write this to the `.gitattributes` file:++	* annex.largefiles=(largerthan=100kb)+	*.c annex.largefiles=nothing+	*.h annex.largefiles=nothing++Or, set the git configuration instead:+  +	git config annex.largefiles 'largerthan=100kb and not (include=*.c or include=*.h)'++Both of these settings do the same thing. Setting it in the `.gitattributes`+file makes any checkout of the repository share that configuration, so is often+a good choice. Setting the annex.largefiles git configuration lets different+checkouts behave differently. The git configuration overrides the+`.gitattributes` configuration.++## syntax++The value of annex.largefiles is similar to a+[[preferred content expression|git-annex-preferred-content]].+The following terms can be used in annex.largefiles:++* `include=glob` / `exclude=glob`++  Specify files to include or exclude.++  The glob can contain `*` and `?` to match arbitrary characters.++* `smallerthan=size` / `largerthan=size`++  Matches only files smaller than, or larger than the specified size.++  The size can be specified with any commonly used units, for example,+  "0.5 gb" or "100 KiloBytes"++* `mimetype=glob`++  Looks up the MIME type of a file, and checks if the glob matches it.++  For example, "mimetype=text/*" will match many varieties of text files,+  including "text/plain", but also "text/x-shellscript", "text/x-makefile",+  etc.++  The MIME types are the same that are displayed by running `file --mime-type`++  This is only available to use when git-annex was built with the+  MagicMime build flag.++* `anything`++  Matches any file.++* `nothing`++  Matches no files. (Same as "not anything")++* `not expression`++  Inverts what the expression matches.++* `and` / `or` / `( expression )`++  These can be used to build up more complicated expressions.++The way the `.gitattributes` example above works is, `*.c` and `*.h` files+have the annex.largefiles attribute set to "nothing",+and so those files are never treated as large files. All other files use+the other value, which checks the file size.++Note that, since git attribute values cannot contain whitespace,+it's useful to instead parenthesize the terms of the annex.largefiles+attribute. This trick allows for more complicated expressions.+For example, this is the same as the git config shown earlier, shoehorned+into a git attribute:++	* annex.largefiles=(largerthan=100kb)and(not((include=*.c)or(include=*.h)))++## temporarily override++If you've set up an annex.largefiles configuration but want to force a file to+be stored in the annex, you can temporarily override the configuration like+this:++	git annex add -c annex.largefiles=anything smallfile
doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn view
@@ -8,11 +8,7 @@  ---- -First, get git-annex version 4.20130329 or newer.--------Let's suppose you're delveloping a video game, written in C. You have+Let's suppose you're developing a video game, written in C. You have source code, and some large game assets. You want to ensure the source code is stored in git -- that's what git's for! And you want to store the game assets in the git annex -- to avod bloating your git repos with@@ -24,20 +20,14 @@  	git config annex.largefiles "largerthan=100kb and not (include=*.c or include=*.h)" +For more details about this configuration, see [[largefiles]].+ ----  Now if you run `git annex add`, it will only add the large files to the-annex. You can `git add` the small files directly to git.--Note that in order to use `git add` on the small files, your repository-needs to be in indirect mode, rather than [[direct mode]]. If it's in-direct mode, `git add` will fail. You can fix that:--	git annex indirect------+annex; small files will be stored in git. -A less manual option is to run `git annex assistant`. It will *automatically*+Or, run `git annex assistant`. It will *automatically* add the large files to the annex, and store the small files in git. It'll notice every time you modify a file, and immediately commit it, too. And sync it out to other repositories you configure using `git annex
doc/tips/unlocked_files.mdwn view
@@ -60,9 +60,7 @@ [[!template id=note text=""" Want `git add` to add some file contents to the annex, but store the contents of smaller files in git itself? Configure annex.largefiles to match the former.--	git config annex.largefiles \-		"largerthan=100kb and not include=*.c"+See [[largefiles]]. """]]  	# cp ~/my_cool_big_file .
+ doc/todo/Remove___39__superfluous_constraints__39___warnings.mdwn view
@@ -0,0 +1,7 @@+Please pull branch `patch-1` from repo++https://github.com/ggreif/git-annex.git++It contains some cleanups from warnings that appear with GHC 7.11 (and probably 8.0 too).++> Merged and thank you! [[done]] --[[Joey]] 
+ doc/todo/checkpresentkey_without_explicit_remote.mdwn view
@@ -0,0 +1,3 @@+While being asked to check if file is available from "[datalad-archives]" remote I need to check if the archive's key available.  Ideally I wish I could ask through the ongoing interaction protocol, but if not, I could use smth like 'git annex checkpresentkey' but that one demands specification also of a remote which to check.  In my case I just want to know if that key is available from any remote, so I could confirm that the file is still present in our archives remote, i.e. that it could be retrieved later on++[[!meta author=yoh]]
doc/todo/deferred_update_mode.mdwn view
@@ -26,3 +26,10 @@  Let `git annex merge` be used to force a merge, even when content is not available.++## alternatively++What about just making `git-annex sync --content` try to get the content of+all files before updating the work tree? (The assistant would need changes+too; it would need to queue all the downloads and trigger a work tree+update once all the downloads have been tried.)
+ doc/todo/dumb__44___unsafe__44___human-readable_backend.mdwn view
@@ -0,0 +1,12 @@+This was already discussed twice previously: [[forum/original_filename_on_s3/]] and [[todo/Facilitate_public_pretty_S3_URLs/]]. Yet I am still constantly having problems with this when trying to use git-annex to do some particular stuff.++My latest example is a friend that wanted to sync files to a remote Webdav server. While I know he can use [[special_remotes/webdav/]] support, the resulting filenames on the webdav server will be basically garbled beyond recognition for any user that will use the Webdav server without git-annex.++I understand the rationale behind the existing [[backends]], but wouldn't it be possible to implement a new backend that would just use the filename as a key?++I know this would have several downsides:++* lack of deduplication+* much more exposed to corruption (no checksum to check against recorded? or can this be put somewhere else?)++The main advantage, for me, is much better interoperability: any remote becomes usable by other non-git-annex clients... It would also be great as it would allow me to store only a *part* of my git-annex files on a remote without having a forest of empty files (on broken filesystems) or symlinks (on real filesystems) for files that are missing, something that is a massive source of confusion for users I work with. It could, for example, allow me to create thumb drives that would solve the [[hide missing files]] problem. -- [[anarcat]]
+ doc/todo/hide_missing_files.mdwn view
@@ -0,0 +1,9 @@+I seem to recall a time when [[direct mode]] would hide files that were not present in the local repository. While this created a bunch of headaches for people that wanted to get the missing files, it was great for users that didn't care and only wanted to see what was actually there. (In fact, it was suggested as a solution in [[forum/usability:_what_are_those_arrow_things__63__/]], a year and a half ago.)++Now this behavior has changed, and with v6 coming up, all those distinctions have basically gone away anyways...++So what's someone to do if he wants to deal with the usability issue mentioned above? To restate: the problem is users I share files with often see a *lot* of files, with only a fraction of them being actually present. A lot of those files are obviously large, and so they are having a frustrating experience with git-annex because they see all those promises of "files being there" but they have a hard time actually finding which files *really* are there. So they click one one broken link after the other and generally give up before they figure out how to pop a terminal open, use `find -L -type l` or `find -type l` (i can never remember which!) - something we can hardly expect from the average GUI user...++Maybe this could be accomplished through a [[dumb, unsafe, human-readable backend]]?++Thanks for any advice! --[[anarcat]]
doc/todo/smudge.mdwn view
@@ -27,7 +27,7 @@   Note that this presents problems when dealing with merge conflicts and   when pushing changes committed in such a repo. Ideally, should avoid   committing implicit unlocks, or should prevent such commits leaking out-  in pushes.+  in pushes. See [[design/adjusted_branches]].  * Eventually (but not yet), make v6 the default for new repositories.   Note that the assistant forces repos into direct mode; that will need to
+ doc/todo/support_path-style_syntax_for_S3_bucket_specification.mdwn view
@@ -0,0 +1,5 @@+It appears that currently there's no way to use the "path-style" method for accessing S3 buckets (as contrasted [here](http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAPI.html) with the "virtual hosted-style" of bucket specification). Would it be possible to add an S3-special-remote configuration parameter to adjust the underlying S3 library's "s3RequestStyle" config parameter? I believe that the "PathStyle" value would be relevant to this specific request, as mentioned in the [S3 library README](https://github.com/aristidb/aws#frequently-asked-questions).++The virtual-hosted style of bucket specification involves a lot of DNS overhead. In my particular use case, I'm looking at running Ceph with a radosgw with S3 support, and in fact the Ceph documention [specifically indicates](http://docs.ceph.com/docs/master/radosgw/s3/commons/#bucket-and-host-name) a preference for "path-style" bucket specification.++> [[done]] --[[Joey]]
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 6.20160126+Version: 6.20160211 Cabal-Version: >= 1.8 License: GPL-3 Maintainer: Joey Hess <id@joeyh.name>@@ -63,6 +63,9 @@ Flag TorrentParser   Description: Use haskell torrent library to parse torrent files +Flag MagicMime+  Description: Use libmagic to determine file MIME types+ Flag ConcurrentOutput   Description: Use concurrent-output library @@ -81,6 +84,12 @@ Flag Cryptonite   Description: Use the cryptonite library, instead of the older cryptohash +Flag Dbus+  Description: Enable dbus support++Flag XMPP+  Description: Enable notifications using XMPP+ Executable git-annex   Main-Is: git-annex.hs   Build-Depends:@@ -178,9 +187,10 @@               CPP-Options: -DWITH_KQUEUE               C-Sources: Utility/libkqueue.c -  if (os(linux))-    Build-Depends: dbus (>= 0.10.7), fdo-notify (>= 0.3)-    CPP-Options: -DWITH_DBUS -DWITH_DESKTOP_NOTIFY -DWITH_DBUS_NOTIFICATIONS+  if flag(Dbus)+    if (os(linux))+      Build-Depends: dbus (>= 0.10.7), fdo-notify (>= 0.3)+      CPP-Options: -DWITH_DBUS -DWITH_DESKTOP_NOTIFY -DWITH_DBUS_NOTIFICATIONS    if flag(Android)     Build-Depends: data-endian@@ -210,13 +220,18 @@     Build-Depends: network-multicast, network-info     CPP-Options: -DWITH_PAIRING -  if (! os(windows))-    Build-Depends: network-protocol-xmpp, gnutls (>= 0.1.4), xml-types-    CPP-Options: -DWITH_XMPP+  if flag(XMPP)+    if (! os(windows))+      Build-Depends: network-protocol-xmpp, gnutls (>= 0.1.4), xml-types+      CPP-Options: -DWITH_XMPP      if flag(TorrentParser)     Build-Depends: torrent (>= 10000.0.0)     CPP-Options: -DWITH_TORRENTPARSER++  if flag(MagicMime)+    Build-Depends: magic+    CPP-Options: -DWITH_MAGICMIME    if flag(ConcurrentOutput)     Build-Depends: concurrent-output (>= 1.6)
man/git-annex-checkpresentkey.1 view
@@ -3,7 +3,7 @@ git-annex-checkpresentkey \- check if key is present in remote .PP .SH SYNOPSIS-git annex  \fBkey remote\fP+git annex checkpresentkey \fBkey remote\fP .PP .SH DESCRIPTION This plumbing\-level command verifies if the specified key's content
+ man/git-annex-clean.1 view
@@ -0,0 +1,33 @@+.TH git-annex-clean 1+.SH NAME+git-annex-clean \- git filter driver for git-annex+.PP+.SH SYNOPSIS+git annex clean+.PP+.SH DESCRIPTION+When git-annex is used as a git filter driver, this command is run+by git commands such as \fBgit add\fP. It generates a file that+is added to the git repository and points to the git-annex object+containing the content of a large file.+.PP+To configure git to use git-annex as a git filter driver, place the+following in the .gitattributes file:+.PP+ * filter=annex+\&.* !filter+.PP+The annex.largefiles config is consulted to decide if a given file should+be added to git as\-is, or if its content are large enough to need to use+git-annex.+.PP+.SH SEE ALSO+git-annex(1)+.PP+git-annex\-smudge(1)+.PP+.SH AUTHOR+Joey Hess <id@joeyh.name>+.PP+.PP+
man/git-annex-matchexpression.1 view
@@ -1,12 +1,12 @@ .TH git-annex-matchexpression 1 .SH NAME-git-annex-matchexpression \- checks if a preferred content expression matches+git-annex-matchexpression \- checks if an expression matches .PP .SH SYNOPSIS git annex matchexpression \fBexpression [data]\fP .PP .SH DESCRIPTION-This plumbing\-level command is given a prefferred content expression,+This plumbing\-level command is given a preferred content expression, and some data, and checks if the expression matches the data. It exits 0 if it matches, and 1 if not. If not enough data was provided, it displays an error and exits with special code 42.@@ -32,6 +32,14 @@ .IP Many keys have a known size, and so \-\-size is not needed when specifying such a key.+.IP+.IP "\fB\-\-largefiles\fP"+Parse the expression as an annex.largefiles expression, rather than a+preferred content expression.+.IP+.IP "\fB\-\-mimetype=\fP"+Tell what the mime type of the file is. Only needed when using+\-\-largefiles with a mimetype= expression. .IP .SH SEE ALSO git-annex(1)
man/git-annex-preferred-content.1 view
@@ -29,7 +29,7 @@ elsewhere to allow removing it). .PP .SH EXPRESSIONS-.IP "\fBinclude=glob\fP and \fBexclude=glob\fP"+.IP "\fBinclude=glob\fP / \fBexclude=glob\fP" .IP Match files to include, or exclude. .IP@@ -91,7 +91,7 @@ Matches only files that git-annex believes are present in all repositories in the specified group. .IP-.IP "\fBsmallerthan=size\fP and \fBlargerthan=size\fP"+.IP "\fBsmallerthan=size\fP / \fBlargerthan=size\fP" Matches only files whose content is smaller than, or larger than the specified size. .IP@@ -199,6 +199,9 @@ .IP .IP "\fBanything\fP" Matches any version of any file.+.IP+.IP "\fBnothing\fP"+Matches nothing. (Same as "not anything") .IP .IP "\fBnot expression\fP" Inverts what the expression matches. For example, \fBnot include=archive/*\fP
man/git-annex.1 view
@@ -680,6 +680,9 @@ Space\-separated list of names of the key\-value backends to use. The first listed is used to store new files by default. .IP+This is overridden by annex annex.backend configuration in the+\&.gitattributes files.+.IP .IP "\fBannex.diskreserve\fP" Amount of disk space to reserve. Disk space is checked when transferring content to avoid running out, and additional free space can be reserved@@ -690,34 +693,27 @@ The default reserve is 1 megabyte. .IP .IP "\fBannex.largefiles\fP"-Allows configuring which files are considered to be large enough to-need to be added to the annex. By default, all specified files are added-to the annex, but configuring this can cause the small files to be-checked into git, without using the annex.-.IP-The value is a preferred content expression. See git-annex\-preferred\-content(1)-for details.-.IP-Example:-.IP- annex.largefiles = largerthan=100kb and not (include=*.c or include=*.h)+Used to configure which files are large enough to be added to the annex.+Default: All files. .IP-This setting is checked by \fBgit annex add\fP, \fBgit annex import\fP and the assistant.-It's also used by \fBgit annex addurl\fP and \fBgit annex importfeed\fP when-downloading files.+Overrides any annex.largefiles attributes in \fB.gitattributes\fP files. .IP-It can be useful to temporarily override it via \-c at the command line.-For example:+See <https://git-annex.branchable.com/tips/largefiles> for details. .IP- git annex add \-c annex.largefiles='include=*' 99kbfile+.IP "\fBannex.addsmallfiles\fP"+Controls whether small files (not matching annex.largefiles)+should be checked into git by \fBgit annex add\fP. Defaults to true;+set to false to instead make small files be skipped. .IP .IP "\fBannex.numcopies\fP" This is a deprecated setting. You should instead use the \fBgit annex numcopies\fP command to configure how many copies of files-are kept across all repositories.+are kept across all repositories, or the annex.numcopies .gitattributes+setting. .IP This config setting is only looked at when \fBgit annex numcopies\fP has-never been configured.+never been configured, and when there's no annex.numcopies setting in the+\&.gitattributes file. .IP Note that setting numcopies to 0 is very unsafe. .IP@@ -1105,7 +1101,7 @@ .IP "\fBannex.tune.objecthash1\fP, \fBannex.tune.objecthashlower\fP, \fBannex.tune.branchhash1\fP" These can be passed to \fBgit annex init\fP to tune the repository. They cannot be safely changed in a running repository.-For details, see <http://git-annex.branchable.com/tuning/>.+For details, see <https://git-annex.branchable.com/tuning/>. .IP .SH CONFIGURATION VIA .gitattributes The key\-value backend used when adding a new file to the annex can be@@ -1117,6 +1113,10 @@  * annex.backend=WORM  *.ogg annex.backend=SHA256E .PP+There is a annex.largefiles attribute; which is used to configure which+files are large enough to be added to the annex.+See <https://git-annex.branchable.com/tips/largefiles> for details.+.PP The numcopies setting can also be configured on a per\-file\-type basis via the \fBannex.numcopies\fP attribute in \fB.gitattributes\fP files. This overrides other numcopies settings.@@ -1131,7 +1131,8 @@ These settings are honored by git-annex whenever it's operating on a matching file. However, when using \-\-all, \-\-unused, or \-\-key to specify keys to operate on, git-annex is operating on keys and not files, so will-not honor the settings from .gitattributes.+not honor the settings from .gitattributes. For this reason, the git annex+numcopies command is useful to configure a global default for numcopies. .PP Also note that when using views, only the toplevel .gitattributes file is preserved in the view, so other settings in other files won't have any@@ -1167,7 +1168,7 @@ .PP .SH SEE ALSO More git-annex documentation is available on its web site,-<http://git-annex.branchable.com/>+<https://git-annex.branchable.com/> .PP If git-annex is installed from a package, a copy of its documentation should be included, in, for example, \fB/usr/share/doc/git-annex/\fP.@@ -1175,7 +1176,7 @@ .SH AUTHOR Joey Hess <id@joeyh.name> .PP-<http://git-annex.branchable.com/>+<https://git-annex.branchable.com/> .PP .PP 
stack.yaml view
@@ -11,6 +11,9 @@     webdav: true     torrentparser: true     webapp: true+    magicmime: false+    dbus: false+    xmpp: false     android: false     androidsplice: false     ekg: false
+ 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&#567;"+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.+--