commit ghc-IPv6Addr for openSUSE:Factory
![](https://seccdn.libravatar.org/avatar/e2145bc5cf53dda95c308a3c75e8fef3.jpg?s=120&d=mm&r=g)
Hello community, here is the log from the commit of package ghc-IPv6Addr for openSUSE:Factory checked in at 2016-12-06 14:23:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-IPv6Addr (Old) and /work/SRC/openSUSE:Factory/.ghc-IPv6Addr.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "ghc-IPv6Addr" Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-IPv6Addr/ghc-IPv6Addr.changes 2016-09-05 21:19:43.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.ghc-IPv6Addr.new/ghc-IPv6Addr.changes 2016-12-06 14:23:54.000000000 +0100 @@ -1,0 +2,5 @@ +Mon Nov 14 09:30:06 UTC 2016 - psimons@suse.com + +- Update to version 0.6.2.0 with cabal2obs. + +------------------------------------------------------------------- Old: ---- IPv6Addr-0.6.1.0.tar.gz New: ---- IPv6Addr-0.6.2.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-IPv6Addr.spec ++++++ --- /var/tmp/diff_new_pack.SKnqpI/_old 2016-12-06 14:23:55.000000000 +0100 +++ /var/tmp/diff_new_pack.SKnqpI/_new 2016-12-06 14:23:55.000000000 +0100 @@ -19,15 +19,14 @@ %global pkg_name IPv6Addr %bcond_with tests Name: ghc-%{pkg_name} -Version: 0.6.1.0 +Version: 0.6.2.0 Release: 0 Summary: Library to deal with IPv6 address text representations License: BSD-3-Clause -Group: System/Libraries +Group: Development/Languages/Other Url: https://hackage.haskell.org/package/%{pkg_name} Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz BuildRequires: ghc-Cabal-devel -# Begin cabal-rpm deps: BuildRequires: ghc-attoparsec-devel BuildRequires: ghc-iproute-devel BuildRequires: ghc-network-devel @@ -41,7 +40,6 @@ BuildRequires: ghc-test-framework-devel BuildRequires: ghc-test-framework-hunit-devel %endif -# End cabal-rpm deps %description Library to deal with IPv6 address text representations, canonization and @@ -61,20 +59,14 @@ %prep %setup -q -n %{pkg_name}-%{version} - %build %ghc_lib_build - %install %ghc_lib_install - %check -%if %{with tests} -%{cabal} test -%endif - +%cabal_test %post devel %ghc_pkg_recache ++++++ IPv6Addr-0.6.1.0.tar.gz -> IPv6Addr-0.6.2.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IPv6Addr-0.6.1.0/IPv6Addr.cabal new/IPv6Addr-0.6.2.0/IPv6Addr.cabal --- old/IPv6Addr-0.6.1.0/IPv6Addr.cabal 2016-04-05 18:21:55.000000000 +0200 +++ new/IPv6Addr-0.6.2.0/IPv6Addr.cabal 2016-11-09 11:43:41.000000000 +0100 @@ -1,13 +1,13 @@ name: IPv6Addr -version: 0.6.1.0 +version: 0.6.2.0 synopsis: Library to deal with IPv6 address text representations. description: Library to deal with IPv6 address text representations, canonization and manipulations. homepage: https://github.com/MichelBoucey/IPv6Addr license: BSD3 license-file: LICENSE author: Michel Boucey -maintainer: michel.boucey@gmail.com -copyright: Copyright (c) 2011-2015 - Michel Boucey +maintainer: michel.boucey@cybervisible.fr +copyright: (c) 2011-2016 - Michel Boucey category: Network build-type: Simple extra-source-files: README.md @@ -18,21 +18,27 @@ Location: https://github.com/MichelBoucey/IPv6Addr.git library - exposed-modules: Text.IPv6Addr, Text.IPv6Addr.Types, Text.IPv6Addr.Manip, Text.IPv6Addr.Internal - other-extensions: OverloadedStrings - build-depends: base >=4.6 && <5, text >=1.1, iproute >=1.3, network >=2.5, random >=1.0, attoparsec >=0.12, network-info >=0.2 - default-language: Haskell2010 - GHC-Options: -Wall + exposed-modules: Text.IPv6Addr, Text.IPv6Addr.Types, Text.IPv6Addr.Manip, Text.IPv6Addr.Internal + other-extensions: OverloadedStrings + build-depends: base >=4.6 && <5 + , text >=1.1 + , iproute >=1.3 + , network >=2.5 + , random >=1.0 + , attoparsec >=0.12 + , network-info >=0.2 + default-language: Haskell2010 + GHC-Options: -Wall Test-Suite tests - Type: exitcode-stdio-1.0 - default-language: Haskell2010 - HS-Source-Dirs: tests - Main-Is: Main.hs - Build-Depends: base, - HUnit, - IPv6Addr, - test-framework, - test-framework-hunit, - text + Type: exitcode-stdio-1.0 + default-language: Haskell2010 + HS-Source-Dirs: tests + Main-Is: Main.hs + Build-Depends: base, + HUnit, + IPv6Addr, + test-framework, + test-framework-hunit, + text diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IPv6Addr-0.6.1.0/README.md new/IPv6Addr-0.6.2.0/README.md --- old/IPv6Addr-0.6.1.0/README.md 2016-02-13 13:22:52.000000000 +0100 +++ new/IPv6Addr-0.6.2.0/README.md 2016-09-15 14:15:43.000000000 +0200 @@ -1 +1,3 @@ -IPv6Addr is a Haskell library to deal with IPv6 address text representations, canonization and manipulations. +# IPv6Addr [![Build Status](https://travis-ci.org/MichelBoucey/IPv6Addr.svg?branch=master)](https://travis-ci.org/MichelBoucey/IPv6Addr) + +A library to deal with IPv6 address text representations, canonization and manipulations. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IPv6Addr-0.6.1.0/Text/IPv6Addr/Internal.hs new/IPv6Addr-0.6.2.0/Text/IPv6Addr/Internal.hs --- old/IPv6Addr-0.6.1.0/Text/IPv6Addr/Internal.hs 2016-04-04 18:03:42.000000000 +0200 +++ new/IPv6Addr-0.6.2.0/Text/IPv6Addr/Internal.hs 2016-11-09 11:41:07.000000000 +0100 @@ -17,6 +17,7 @@ ) where import Control.Applicative ((<|>)) +import Control.Monad (guard) import Data.Attoparsec.Text import Data.Char (isDigit) import Data.List (elemIndex, elemIndices, group, @@ -52,89 +53,95 @@ isIPv6Addr [DoubleColon] = True isIPv6Addr [DoubleColon,SixteenBit "1"] = True isIPv6Addr tks = - diffNext tks && (do - let cdctks = countDoubleColon tks - lentks = length tks - lasttk = last tks - lenconst = (lentks == 15 && cdctks == 0) || (lentks < 15 && cdctks == 1) - firstValidToken tks && - (case countIPv4Addr tks :: Int of - 0 -> case lasttk of - SixteenBit _ -> lenconst - DoubleColon -> lenconst - AllZeros -> lenconst - _ -> False - 1 -> case lasttk of - IPv4Addr _ -> (lentks == 13 && cdctks == 0) || (lentks < 12 && cdctks == 1) - _ -> False - _ -> False)) - where diffNext [] = False - diffNext [_] = True - diffNext (t:ts) = do - let h = head ts - case t of - SixteenBit _ -> case h of - SixteenBit _ -> False - AllZeros -> False - _ -> diffNext ts - AllZeros -> case h of - SixteenBit _ -> False - AllZeros -> False - _ -> diffNext ts - _ -> diffNext ts - firstValidToken l = - case head l of - SixteenBit _ -> True - DoubleColon -> True - AllZeros -> True - _ -> False - countDoubleColon l = length $ elemIndices DoubleColon l + diffNext tks && (do + let cdctks = countDoubleColon tks + lentks = length tks + lasttk = last tks + lenconst = (lentks == 15 && cdctks == 0) || (lentks < 15 && cdctks == 1) + firstValidToken tks && + (case countIPv4Addr tks :: Int of + 0 -> case lasttk of + SixteenBit _ -> lenconst + DoubleColon -> lenconst + AllZeros -> lenconst + _ -> False + 1 -> case lasttk of + IPv4Addr _ -> (lentks == 13 && cdctks == 0) || (lentks < 12 && cdctks == 1) + _ -> False + _ -> False)) + where + diffNext [] = False + diffNext [_] = True + diffNext (t:ts) = do + let h = head ts + case t of + SixteenBit _ -> + case h of + SixteenBit _ -> False + AllZeros -> False + _ -> diffNext ts + AllZeros -> + case h of + SixteenBit _ -> False + AllZeros -> False + _ -> diffNext ts + _ -> diffNext ts + firstValidToken l = + case head l of + SixteenBit _ -> True + DoubleColon -> True + AllZeros -> True + _ -> False + countDoubleColon l = length $ elemIndices DoubleColon l countIPv4Addr :: [IPv6AddrToken] -> Int countIPv4Addr = - foldr oneMoreIPv4Addr 0 + foldr oneMoreIPv4Addr 0 where oneMoreIPv4Addr t c = case t of - IPv4Addr _ -> c + 1 - _ -> c + IPv4Addr _ -> c + 1 + _ -> c -- | This is the main function which returns 'Just' the list of a tokenized IPv6 -- address text representation validated against RFC 4291 and canonized -- in conformation with RFC 5952, or 'Nothing'. maybeTokIPv6Addr :: T.Text -> Maybe [IPv6AddrToken] maybeTokIPv6Addr t = - case maybeIPv6AddrTokens t of - Just ltks -> if isIPv6Addr ltks - then Just $ (ipv4AddrReplacement . toDoubleColon . fromDoubleColon) ltks - else Nothing - Nothing -> Nothing + case maybeIPv6AddrTokens t of + Just ltks -> do + guard (isIPv6Addr ltks) + Just $ (ipv4AddrReplacement . toDoubleColon . fromDoubleColon) ltks + Nothing -> Nothing where ipv4AddrReplacement ltks = - if ipv4AddrRewrite ltks - then init ltks ++ ipv4AddrToIPv6AddrTokens (last ltks) - else ltks + if ipv4AddrRewrite ltks + then init ltks ++ ipv4AddrToIPv6AddrTokens (last ltks) + else ltks -- | Returns 'Just' the list of tokenized pure IPv6 address, always rewriting an -- embedded IPv4 address if present. maybeTokPureIPv6Addr :: T.Text -> Maybe [IPv6AddrToken] maybeTokPureIPv6Addr t = do - ltks <- maybeIPv6AddrTokens t - if isIPv6Addr ltks - then Just $ (toDoubleColon . ipv4AddrReplacement . fromDoubleColon) ltks - else Nothing + ltks <- maybeIPv6AddrTokens t + guard (isIPv6Addr ltks) + return $ (toDoubleColon . ipv4AddrReplacement . fromDoubleColon) ltks where - ipv4AddrReplacement ltks' = init ltks' ++ ipv4AddrToIPv6AddrTokens (last ltks') + ipv4AddrReplacement ltks' = + init ltks' ++ ipv4AddrToIPv6AddrTokens (last ltks') -- | Tokenize a 'T.Text' into 'Just' a list of 'IPv6AddrToken', or 'Nothing'. maybeIPv6AddrTokens :: T.Text -> Maybe [IPv6AddrToken] maybeIPv6AddrTokens s = - case readText s of - Done r l -> if r==T.empty then Just l else Nothing - Fail {} -> Nothing - Partial _ -> Nothing + case readText s of + Done r l -> if r==T.empty then Just l else Nothing + Fail {} -> Nothing + Partial _ -> Nothing where - readText _s = feed (parse (many1 $ ipv4Addr <|> sixteenBit <|> doubleColon <|> colon) _s) T.empty + readText _s = + feed + (parse (many1 $ ipv4Addr <|> sixteenBit <|> doubleColon <|> colon) _s) + T.empty -- | An embedded IPv4 address have to be rewritten to output a pure IPv6 Address -- text representation in hexadecimal digits. But some well-known prefixed IPv6 @@ -153,17 +160,17 @@ -- ipv4AddrRewrite :: [IPv6AddrToken] -> Bool ipv4AddrRewrite tks = - case last tks of - IPv4Addr _ -> do - let itks = init tks - not (itks == [DoubleColon] - || itks == [DoubleColon,SixteenBit tokffff,Colon] - || itks == [DoubleColon,SixteenBit tokffff,Colon,AllZeros,Colon] - || itks == [SixteenBit "64",Colon,SixteenBit "ff9b",DoubleColon] - || [SixteenBit "200",Colon,SixteenBit tok5efe,Colon] `isSuffixOf` itks - || [AllZeros,Colon,SixteenBit tok5efe,Colon] `isSuffixOf` itks - || [DoubleColon,SixteenBit tok5efe,Colon] `isSuffixOf` itks) - _ -> False + case last tks of + IPv4Addr _ -> do + let itks = init tks + not (itks == [DoubleColon] + || itks == [DoubleColon,SixteenBit tokffff,Colon] + || itks == [DoubleColon,SixteenBit tokffff,Colon,AllZeros,Colon] + || itks == [SixteenBit "64",Colon,SixteenBit "ff9b",DoubleColon] + || [SixteenBit "200",Colon,SixteenBit tok5efe,Colon] `isSuffixOf` itks + || [AllZeros,Colon,SixteenBit tok5efe,Colon] `isSuffixOf` itks + || [DoubleColon,SixteenBit tok5efe,Colon] `isSuffixOf` itks) + _ -> False where tokffff = "ffff" tok5efe = "5efe" @@ -174,63 +181,68 @@ -- ipv4AddrToIPv6AddrTokens :: IPv6AddrToken -> [IPv6AddrToken] ipv4AddrToIPv6AddrTokens t = - case t of - IPv4Addr a -> do - let m = toHex a - [ SixteenBit ((!!) m 0 <> addZero ((!!) m 1)) - , Colon - , SixteenBit ((!!) m 2 <> addZero ((!!) m 3)) ] - _ -> [t] - where - toHex a = map (\x -> T.pack $ showHex (read (T.unpack x)::Int) "") $ T.split (=='.') a - addZero d = if T.length d == 1 then "0" <> d else d + case t of + IPv4Addr a -> do + let m = toHex a + [ SixteenBit ((!!) m 0 <> addZero ((!!) m 1)) + , Colon + , SixteenBit ((!!) m 2 <> addZero ((!!) m 3)) ] + _ -> [t] + where + toHex a = map (\x -> T.pack $ showHex (read (T.unpack x)::Int) "") $ T.split (=='.') a + addZero d = if T.length d == 1 then "0" <> d else d expandTokens :: [IPv6AddrToken] -> [IPv6AddrToken] -expandTokens = map expandToken - where expandToken (SixteenBit s) = SixteenBit $ T.justifyRight 4 '0' s - expandToken AllZeros = SixteenBit "0000" - expandToken t = t +expandTokens = + map expandToken + where + expandToken (SixteenBit s) = SixteenBit $ T.justifyRight 4 '0' s + expandToken AllZeros = SixteenBit "0000" + expandToken t = t fromDoubleColon :: [IPv6AddrToken] -> [IPv6AddrToken] fromDoubleColon tks = - if DoubleColon `notElem` tks - then tks - else do let s = splitAt (fromJust $ elemIndex DoubleColon tks) tks - fsts = fst s - snds = if not (null (snd s)) then tail(snd s) else [] - fste = if null fsts then [] else fsts ++ [Colon] - snde = if null snds then [] else Colon : snds - fste ++ allZerosTokensReplacement(quantityOfAllZerosTokenToReplace tks) ++ snde + if DoubleColon `notElem` tks + then tks + else do + let s = splitAt (fromJust $ elemIndex DoubleColon tks) tks + fsts = fst s + snds = if not (null (snd s)) then tail(snd s) else [] + fste = if null fsts then [] else fsts ++ [Colon] + snde = if null snds then [] else Colon : snds + fste ++ allZerosTokensReplacement(quantityOfAllZerosTokenToReplace tks) ++ snde where allZerosTokensReplacement x = intersperse Colon (replicate x AllZeros) quantityOfAllZerosTokenToReplace _x = - ntks tks - foldl (\c _x -> if (_x /= DoubleColon) && (_x /= Colon) then c+1 else c) 0 _x + ntks tks - foldl (\c _x -> if (_x /= DoubleColon) && (_x /= Colon) then c+1 else c) 0 _x where ntks _tks = if countIPv4Addr _tks == 1 then 7 else 8 toDoubleColon :: [IPv6AddrToken] -> [IPv6AddrToken] toDoubleColon tks = - zerosToDoubleColon tks (zerosRunToReplace $ zerosRunsList tks) + zerosToDoubleColon tks (zerosRunToReplace $ zerosRunsList tks) where - zerosToDoubleColon :: [IPv6AddrToken] -> (Int,Int) -> [IPv6AddrToken] -- No all zeros token, so no double colon replacement... zerosToDoubleColon ls (_,0) = ls -- "The symbol '::' MUST NOT be used to shorten just one 16-bit 0 field" (RFC 5952 4.2.2) zerosToDoubleColon ls (_,1) = ls zerosToDoubleColon ls (i,l) = - let ls' = filter (/= Colon) ls - in intersperse Colon (Prelude.take i ls') ++ [DoubleColon] ++ intersperse Colon (drop (i+l) ls') + let ls' = filter (/= Colon) ls + in intersperse Colon (Prelude.take i ls') ++ [DoubleColon] ++ intersperse Colon (drop (i+l) ls') zerosRunToReplace t = - let l = longestLengthZerosRun t - in (firstLongestZerosRunIndex t l,l) + let l = longestLengthZerosRun t + in (firstLongestZerosRunIndex t l,l) where firstLongestZerosRunIndex x y = sum . snd . unzip $ Prelude.takeWhile (/=(True,y)) x longestLengthZerosRun x = - maximum $ map longest x - where longest _t = case _t of - (True,i) -> i - _ -> 0 - zerosRunsList x = map helper $ groupZerosRuns x + maximum $ map longest x + where + longest _t = + case _t of + (True,i) -> i + _ -> 0 + zerosRunsList x = + map helper $ groupZerosRuns x where helper h = (head h == AllZeros, lh) where lh = length h groupZerosRuns = group . filter (/= Colon) @@ -240,62 +252,58 @@ networkInterfacesIPv6AddrList :: IO [(String,IPv6)] networkInterfacesIPv6AddrList = - getNetworkInterfaces >>= \n -> return $ map networkInterfacesIPv6Addr n + fmap networkInterfacesIPv6Addr <$> getNetworkInterfaces where networkInterfacesIPv6Addr (NetworkInterface n _ a _) = (n,a) macAddr :: Parser (Maybe [IPv6AddrToken]) macAddr = do - n1 <- count 2 hexaChar <* ":" - n2 <- count 2 hexaChar <* ":" - n3 <- count 2 hexaChar <* ":" - n4 <- count 2 hexaChar <* ":" - n5 <- count 2 hexaChar <* ":" - n6 <- count 2 hexaChar - return $ maybeIPv6AddrTokens $ T.pack $ concat [n1,n2,n3,n4,n5,n6] + n1 <- count 2 hexaChar <* ":" + n2 <- count 2 hexaChar <* ":" + n3 <- count 2 hexaChar <* ":" + n4 <- count 2 hexaChar <* ":" + n5 <- count 2 hexaChar <* ":" + n6 <- count 2 hexaChar + return $ maybeIPv6AddrTokens $ T.pack $ concat [n1,n2,n3,n4,n5,n6] sixteenBit :: Parser IPv6AddrToken sixteenBit = do - r <- ipv6AddrFullChunk <|> count 3 hexaChar <|> count 2 hexaChar <|> count 1 hexaChar - -- "Leading zeros MUST be suppressed" (RFC 5952, 4.1) - let r' = T.dropWhile (=='0') $ T.pack r - return $ if T.null r' - then AllZeros - -- Hexadecimal digits MUST be in lowercase (RFC 5952 4.3) - else SixteenBit $ T.toLower r' + r <- ipv6AddrFullChunk <|> count 3 hexaChar <|> count 2 hexaChar <|> count 1 hexaChar + -- "Leading zeros MUST be suppressed" (RFC 5952, 4.1) + let r' = T.dropWhile (=='0') $ T.pack r + return $ + if T.null r' + then AllZeros + -- Hexadecimal digits MUST be in lowercase (RFC 5952 4.3) + else SixteenBit $ T.toLower r' ipv4Addr :: Parser IPv6AddrToken ipv4Addr = do - n1 <- manyDigits <* "." - if n1 /= T.empty - then do n2 <- manyDigits <* "." - if n2 /= T.empty - then do n3 <- manyDigits <* "." - if n3 /= T.empty - then do n4 <- manyDigits - if n4 /= T.empty - then return $ IPv4Addr $ T.intercalate "." [n1,n2,n3,n4] - else parserFailure - else parserFailure - else parserFailure - else parserFailure + n1 <- manyDigits <* "." + guard (n1 /= T.empty) + n2 <- manyDigits <* "." + guard (n2 /= T.empty) + n3 <- manyDigits <* "." + guard (n3 /= T.empty) + n4 <- manyDigits + guard (n4 /= T.empty) + return $ IPv4Addr $ T.intercalate "." [n1,n2,n3,n4] where - parserFailure = fail "ipv4Addr parsing failure" manyDigits = do ds <- takeWhile1 isDigit case R.decimal ds :: Either String (Integer, T.Text) of - Right (n,_) -> return (if n < 256 then T.pack $ show n else T.empty) - Left _ -> return T.empty + Right (n,_) -> return $ if n < 256 then T.pack $ show n else T.empty + Left _ -> return T.empty doubleColon :: Parser IPv6AddrToken doubleColon = do - _ <- string "::" - return DoubleColon + _ <- string "::" + return DoubleColon colon :: Parser IPv6AddrToken colon = do - _ <- string ":" - return Colon + _ <- string ":" + return Colon ipv6AddrFullChunk :: Parser String ipv6AddrFullChunk = count 4 hexaChar diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IPv6Addr-0.6.1.0/Text/IPv6Addr/Manip.hs new/IPv6Addr-0.6.2.0/Text/IPv6Addr/Manip.hs --- old/IPv6Addr-0.6.1.0/Text/IPv6Addr/Manip.hs 2016-04-04 17:36:33.000000000 +0200 +++ new/IPv6Addr-0.6.2.0/Text/IPv6Addr/Manip.hs 2016-11-09 11:22:21.000000000 +0100 @@ -24,7 +24,7 @@ -- randIPv6AddrChunk :: String -> IO IPv6AddrToken randIPv6AddrChunk m = - mapM getHex m >>= \g -> return $ SixteenBit $ T.dropWhile (=='0') $ T.pack g + mapM getHex m >>= \g -> return $ SixteenBit $ T.dropWhile (=='0') $ T.pack g where getHex c | c == '_' = intToDigit <$> randomRIO (0,15) @@ -33,8 +33,8 @@ -- | Generates a random partial 'IPv6Addr' with n 'SixteenBit' randPartialIPv6Addr :: Int -> IO [IPv6AddrToken] randPartialIPv6Addr n - | n > 0 && n < 9 = intersperse Colon <$> replicateM n (randIPv6AddrChunk "____") - | otherwise = return [] + | n > 0 && n < 9 = intersperse Colon <$> replicateM n (randIPv6AddrChunk "____") + | otherwise = return [] -- | Given a MAC address, returns 'Just' the corresponding 'IPv6AddrToken' list, or 'Nothing'. -- @@ -42,9 +42,12 @@ -- macAddrToIPv6AddrTokens :: T.Text -> Maybe [IPv6AddrToken] macAddrToIPv6AddrTokens t = - case parse macAddr t of - Done a b -> if a == T.empty then intersperse Colon <$> b else Nothing - _ -> Nothing + case parse macAddr t of + Done a b -> + if a == T.empty + then intersperse Colon <$> b + else Nothing + _ -> Nothing -- -- Functions based upon Network.Info to get local MAC and IPv6 addresses. @@ -55,7 +58,8 @@ -- > getTokIPv6AddrOf "eth0" == Just [SixteenBit "fe80",DoubleColon,SixteenBit "fa1d",Colon,SixteenBit "58cc",Colon,SixteenBit "9516"] -- getTokIPv6AddrOf :: String -> IO (Maybe [IPv6AddrToken]) -getTokIPv6AddrOf s = maybe Nothing (maybeTokIPv6Addr. T.pack . show) <$> (lookup s <$> networkInterfacesIPv6AddrList) +getTokIPv6AddrOf s = maybe Nothing (maybeTokIPv6Addr. T.pack . show) <$> + (lookup s <$> networkInterfacesIPv6AddrList) -- | Given a valid name of a local network interface, -- returns 'Just' the corresponding list of 'IPv6AddrToken' of the interface's MAC Address, @@ -65,7 +69,8 @@ -- getTokMacAddrOf :: String -> IO (Maybe [IPv6AddrToken]) getTokMacAddrOf s = - maybe Nothing (macAddrToIPv6AddrTokens . T.pack . show) <$> (lookup s <$> networkInterfacesMacAddrList) + maybe Nothing (macAddrToIPv6AddrTokens . T.pack . show) <$> + (lookup s <$> networkInterfacesMacAddrList) where networkInterfacesMacAddrList = getNetworkInterfaces >>= \n -> return $ map networkInterfacesMac n where networkInterfacesMac (NetworkInterface n _ _ m) = (n,m) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IPv6Addr-0.6.1.0/Text/IPv6Addr/Types.hs new/IPv6Addr-0.6.2.0/Text/IPv6Addr/Types.hs --- old/IPv6Addr-0.6.1.0/Text/IPv6Addr/Types.hs 2016-04-06 17:04:01.000000000 +0200 +++ new/IPv6Addr-0.6.2.0/Text/IPv6Addr/Types.hs 2016-11-09 11:31:02.000000000 +0100 @@ -2,16 +2,16 @@ import qualified Data.Text as T -data IPv6Addr = IPv6Addr T.Text +data IPv6Addr = IPv6Addr !T.Text instance Show IPv6Addr where - show (IPv6Addr addr) = T.unpack addr + show (IPv6Addr a) = T.unpack a data IPv6AddrToken - = SixteenBit T.Text -- ^ A four hexadecimal digits group representing a 16-Bit chunk - | AllZeros -- ^ An all zeros 16-Bit chunk - | Colon -- ^ A separator between 16-Bit chunks - | DoubleColon -- ^ A double-colon stands for a unique compression of many consecutive 16-Bit chunks - | IPv4Addr T.Text -- ^ An embedded IPv4 address as representation of the last 32-Bit - deriving (Eq,Show) + = SixteenBit !T.Text -- ^ A four hexadecimal digits group representing a 16-Bit chunk + | AllZeros -- ^ An all zeros 16-Bit chunk + | Colon -- ^ A separator between 16-Bit chunks + | DoubleColon -- ^ A double-colon stands for a unique compression of many consecutive 16-Bit chunks + | IPv4Addr !T.Text -- ^ An embedded IPv4 address as representation of the last 32-Bit + deriving (Eq, Show) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/IPv6Addr-0.6.1.0/Text/IPv6Addr.hs new/IPv6Addr-0.6.2.0/Text/IPv6Addr.hs --- old/IPv6Addr-0.6.1.0/Text/IPv6Addr.hs 2016-04-06 16:09:54.000000000 +0200 +++ new/IPv6Addr-0.6.2.0/Text/IPv6Addr.hs 2016-11-02 10:39:18.000000000 +0100 @@ -8,22 +8,26 @@ , maybePureIPv6Addr , maybeFullIPv6Addr , sameIPv6Addr + -- * Conversions , fromIPv6Addr , toIPv6 , toHostName - -- * Utils , toIP6ARPA , toUNC + + -- * Utils , getIPv6AddrOf , randIPv6Addr , randIPv6AddrWithPrefix + ) where import Data.IP (IPv6) import Data.Maybe (fromJust, isNothing) import Data.Monoid ((<>)) import qualified Data.Text as T +import Control.Monad (guard) import Network (HostName) import System.Random (randomRIO) @@ -32,7 +36,8 @@ import Text.IPv6Addr.Types instance Eq IPv6Addr where - (==) (IPv6Addr a) (IPv6Addr b) = show (maybePureIPv6Addr a) == show (maybePureIPv6Addr b) + (==) (IPv6Addr a) (IPv6Addr b) = + show (maybePureIPv6Addr a) == show (maybePureIPv6Addr b) -- | Returns 'Just' the text representation of a canonized -- 'IPv6Addr' in conformation with RFC 5952, or 'Nothing'. @@ -54,16 +59,19 @@ -- > maybeFullIPv6Addr "::ffff:192.0.2.128" == Just (IPv6Addr "0000:0000:0000:0000:0000:ffff:c000:0280") -- maybeFullIPv6Addr :: T.Text -> Maybe IPv6Addr -maybeFullIPv6Addr t = maybeTokPureIPv6Addr t >>= (ipv6TokensToIPv6Addr . expandTokens . fromDoubleColon) +maybeFullIPv6Addr t = + maybeTokPureIPv6Addr t >>= + (ipv6TokensToIPv6Addr . expandTokens . fromDoubleColon) -- | Returns 'True' if arguments are two textual representations of a same IPv6 address. sameIPv6Addr :: T.Text -> T.Text -> Bool sameIPv6Addr a b = - case maybePureIPv6Addr a of + case maybePureIPv6Addr a of + Nothing -> False + Just a' -> + case maybePureIPv6Addr b of Nothing -> False - Just a' -> case maybePureIPv6Addr b of - Nothing -> False - Just b' -> a' == b' + Just b' -> a' == b' -- | Returns the reverse lookup domain name corresponding of the given IPv6 address (RFC 3596 Section 2.5). -- @@ -71,7 +79,7 @@ -- toIP6ARPA :: IPv6Addr -> T.Text toIP6ARPA a = - T.reverse (T.concatMap trans $ fromIPv6Addr $ fromJust $ maybeFullIPv6Addr $ fromIPv6Addr a) <> "IP6.ARPA." + T.reverse (T.concatMap trans $ fromIPv6Addr $ fromJust $ maybeFullIPv6Addr $ fromIPv6Addr a) <> "IP6.ARPA." where trans ':' = T.empty trans c = "." <> T.pack [c] @@ -82,7 +90,7 @@ -- toUNC :: IPv6Addr -> T.Text toUNC a = - (T.concatMap trans $ fromIPv6Addr $ fromJust $ maybePureIPv6Addr $ fromIPv6Addr a) <> ".ipv6-literal.net" + (T.concatMap trans $ fromIPv6Addr $ fromJust $ maybePureIPv6Addr $ fromIPv6Addr a) <> ".ipv6-literal.net" where trans ':' = "-" trans c = T.pack [c] @@ -101,8 +109,9 @@ -- > getIPv6AddrOf "eth0" -- getIPv6AddrOf :: String -> IO (Maybe IPv6Addr) -getIPv6AddrOf s = maybe Nothing (maybeIPv6Addr . T.pack . show) <$> - (lookup s <$> networkInterfacesIPv6AddrList) +getIPv6AddrOf s = + maybe Nothing (maybeIPv6Addr . T.pack . show) <$> + (lookup s <$> networkInterfacesIPv6AddrList) -- | Returns a random 'IPv6Addr'. randIPv6Addr :: IO IPv6Addr @@ -114,56 +123,55 @@ -- randIPv6AddrWithPrefix :: Maybe T.Text -> IO (Maybe IPv6Addr) randIPv6AddrWithPrefix p = - if isNothing p - then do - r <- randomRIO (1,8) - tks <- case r of - 8 -> randPartialIPv6Addr 8 - _ -> do - r' <- randomRIO (1,8-r) - case r + r' of - 7 -> concat <$> - sequence [ randPartialIPv6Addr r - , pure [Colon,AllZeros,Colon] - , randPartialIPv6Addr r' - ] - 8 -> randPartialIPv6Addr 8 - _ -> concat <$> - sequence [ randPartialIPv6Addr r - , pure [DoubleColon] - , randPartialIPv6Addr r' - ] - return $ ipv6TokensToIPv6Addr tks - else case maybeIPv6AddrTokens (fromJust p) of - Just tks -> do - ntks <- do let ctks = countChunks tks - case (snd ctks :: Int) of - 0 -> return $ 8 - fst ctks - 1 -> return $ 6 - fst ctks - _ -> return 0 - if ntks > 0 - then do - rtks <- randPartialIPv6Addr ntks - let tks' = addColon tks ++ rtks - return $ if isIPv6Addr tks' - then ipv6TokensToIPv6Addr $ - (toDoubleColon . fromDoubleColon) tks' - else Nothing - else return Nothing - Nothing -> return Nothing + if isNothing p + then do + r <- randomRIO (1,8) + tks <- + case r of + 8 -> randPartialIPv6Addr 8 + _ -> do + r' <- randomRIO (1,8-r) + case r + r' of + 7 -> concat <$> + sequence [ randPartialIPv6Addr r + , pure [Colon,AllZeros,Colon] + , randPartialIPv6Addr r' + ] + 8 -> randPartialIPv6Addr 8 + _ -> concat <$> + sequence [ randPartialIPv6Addr r + , pure [DoubleColon] + , randPartialIPv6Addr r' + ] + return $ ipv6TokensToIPv6Addr tks + else + case maybeIPv6AddrTokens (fromJust p) of + Just tks -> do + ntks <- do let ctks = countChunks tks + case (snd ctks :: Int) of + 0 -> return $ 8 - fst ctks + 1 -> return $ 6 - fst ctks + _ -> return 0 + guard (ntks > 0) + rtks <- randPartialIPv6Addr ntks + let tks' = addColon tks ++ rtks + guard (isIPv6Addr tks') + return $ ipv6TokensToIPv6Addr $ + (toDoubleColon . fromDoubleColon) tks' + Nothing -> return Nothing where - countChunks = - foldr count (0,0) - where - count c (a,b) = - case c of - SixteenBit _ -> (a+1,b) - AllZeros -> (a+1,b) - DoubleColon -> (a,b+1) - _ -> (a,b) - addColon ts = - case last ts of - SixteenBit _ -> ts ++ [Colon] - AllZeros -> ts ++ [Colon] - _ -> ts + countChunks = + foldr count (0,0) + where + count c (a,b) = + case c of + SixteenBit _ -> (a+1,b) + AllZeros -> (a+1,b) + DoubleColon -> (a,b+1) + _ -> (a,b) + addColon ts = + case last ts of + SixteenBit _ -> ts ++ [Colon] + AllZeros -> ts ++ [Colon] + _ -> ts
participants (1)
-
root@hilbert.suse.de