fb-util-0.1.0.1: Util/Network.hsc
{-
Copyright (c) Meta Platforms, Inc. and affiliates.
All rights reserved.
This source code is licensed under the BSD-style license found in the
LICENSE file in the root directory of this source tree.
-}
{-# LANGUAGE ForeignFunctionInterface #-}
module Util.Network
( ntop6, ntop
) where
import Data.ByteString
import Data.Text
import Foreign (nullPtr)
import Foreign.C
import Foreign.Marshal.Alloc (allocaBytes)
import System.IO.Unsafe (unsafePerformIO)
import Util.Text (cStringToText)
ntop' :: Int -> Int -> ByteString -> Maybe Text
ntop' inet' inetAddrStrLen' source =
unsafePerformIO $ useAsCString source $ \source' ->
allocaBytes inetAddrStrLen' $ \target -> do
result <- inet_ntop inet' source' target inet6AddrStrLen
if result == nullPtr
then return Nothing
else Just <$> cStringToText result
ntop6 :: ByteString -> Maybe Text
ntop6 = ntop' inet6 inet6AddrStrLen
ntop :: ByteString -> Maybe Text
ntop = ntop' inet inetAddrStrLen
#include <arpa/inet.h>
inet6AddrStrLen :: Int
inet6AddrStrLen = #{ const INET6_ADDRSTRLEN }
inet6 :: Int
inet6 = #{ const AF_INET6 }
inetAddrStrLen :: Int
inetAddrStrLen = #{ const INET_ADDRSTRLEN }
inet :: Int
inet = #{ const AF_INET }
foreign import ccall unsafe "inet_ntop"
inet_ntop :: Int -> CString -> CString -> Int -> IO CString