module HSNTP.Util.UDP (connectUDP, listenUDP,
                 recvBufFrom, sendBufTo,
                 sockAddr, newSock, sClose
                ) where
import Data.Char
import Network.BSD
import Network.Socket
#if (__GLASGOW_HASKELL__ < 603)
import Data.Word
import Foreign.C.String
import Foreign.Marshal.Array
import Foreign.Ptr
recvBufFrom :: Socket -> Ptr Word8 -> Int -> IO (Int, SockAddr)
recvBufFrom sock ptr n = do (str,len,sa) <- recvFrom sock n
                            pokeArray ptr ((map (fromIntegral . ord) str) :: [Word8])
                            return (len,sa)
sendBufTo :: Socket -> Ptr Word8 -> Int -> SockAddr -> IO Int
sendBufTo sock ptr len sa = do str <- peekArray len ptr
                               sendTo sock (map (chr . fromIntegral) str) sa
#endif
connectUDP :: String -> Int -> IO Socket
connectUDP host port = do sock <- socket AF_INET Datagram 0
                          addr <- getHostByName host
                          connect sock $ SockAddrInet (toEnum port) $ hostAddress addr
                          
                          return sock
sockAddr :: String -> Int -> IO SockAddr
sockAddr host port = do ha <- getHostByName host
                        return $ SockAddrInet (toEnum port) (hostAddress ha)
newSock :: IO Socket
newSock = socket AF_INET Datagram 0
listenUDP :: Int -> IO Socket
listenUDP port = do sock <- socket AF_INET Datagram 0
                    bindSocket sock $ SockAddrInet (toEnum port) iNADDR_ANY
                    return sock