{- |
   Module      :  Network.IP.Address
   Copyright   :  (c) 2006-04-08 by Peter Simons
   License     :  GPL2

   Maintainer  :  simons@cryp.to
   Stability   :  provisional
   Portability :  Haskell 2-pre

   Tools for manipulating IP addresses.
-}

module Network.IP.Address
  ( module Network.IP.Address
  , HostAddress
  , inet_addr
  , inet_ntoa
  )
  where

import Data.Endian
import Data.Bits
import Network.Socket

-- |Split up an IP address in network byte-order.

ha2tpl :: HostAddress -> (Int, Int, Int, Int)
ha2tpl n =
  let (b1,n1) = (n  .&. 255, n  `shiftR` 8)
      (b2,n2) = (n1 .&. 255, n1 `shiftR` 8)
      (b3,n3) = (n2 .&. 255, n2 `shiftR` 8)
      b4      = n3 .&. 255
  in
  case ourEndian of
    BigEndian    -> (fromEnum b4, fromEnum b3, fromEnum b2, fromEnum b1)
    LittleEndian -> (fromEnum b1, fromEnum b2, fromEnum b3, fromEnum b4)
    PDPEndian    -> (fromEnum b4, fromEnum b3, fromEnum b1, fromEnum b2)

-- |Turn a 32-bit IP address into a string suitable for
-- 'Network.DNS.PTR' lookups in the Domain Name System.

ha2ptr :: HostAddress -> String
ha2ptr n = shows b4 . ('.':) .
           shows b3 . ('.':) .
           shows b2 . ('.':) .
           shows b1 $ ".in-addr.arpa."
  where
  (b1,b2,b3,b4) = ha2tpl n