]> gitweb @ CieloNegro.org - haskell-dns.git/blobdiff - Network/Socket/IsString.hs
AAAA support
[haskell-dns.git] / Network / Socket / IsString.hs
diff --git a/Network/Socket/IsString.hs b/Network/Socket/IsString.hs
new file mode 100644 (file)
index 0000000..6ea9f8c
--- /dev/null
@@ -0,0 +1,37 @@
+module Network.Socket.IsString () where
+
+import Data.String
+import Network.Socket
+import System.IO.Unsafe
+
+instance IsString HostAddress where
+    fromString str
+        = let hint = defaultHints {
+                                addrFlags  = [AI_NUMERICHOST]
+                              , addrFamily = AF_INET
+                              }
+              ret  = unsafePerformIO $
+                     getAddrInfo (Just hint) (Just str) Nothing
+          in
+            case ret of
+              []     -> error (str ++ " seems not to be a valid IPv4 address")
+              (x:xs) -> case addrAddress x of
+                          SockAddrInet _ addr
+                              -> addr
+                          _   -> error ("getAddrInfo (" ++ str ++ ") returned a strange result: " ++ show (x:xs))
+
+instance IsString HostAddress6 where
+    fromString str
+        = let hint = defaultHints {
+                                 addrFlags  = [AI_NUMERICHOST]
+                               , addrFamily = AF_INET6
+                               }
+              ret  = unsafePerformIO $
+                     getAddrInfo (Just hint) (Just str) Nothing
+          in
+            case ret of
+              []     -> error (str ++ " seems not to be a valid IPv6 address")
+              (x:xs) -> case addrAddress x of
+                          SockAddrInet6 _ _ addr _
+                              -> addr
+                          _   -> error ("getAddrInfo (" ++ str ++ ") returned a strange result: " ++ show (x:xs))