{-# LINE 1 "src/System/Rados/FFI.hsc" #-}
{-# LANGUAGE EmptyDataDecls           #-}
{-# LINE 2 "src/System/Rados/FFI.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE CPP #-}
-- |
-- Module      : System.Rados.FFI
-- Copyright   : (c) 2010-2014 Anchor
-- License     : BSD-3
-- Maintainer  : Christian Marie <christian@ponies.io>
-- Stability   : experimental
-- Portability : non-portable
--
-- The underlying FFI wrappers, feel free to use these. I will not remove any
-- between major versions and they shouldn't need to change.

module System.Rados.FFI
where

import Foreign
import Foreign.C.Error
import Foreign.C.String
import Foreign.C.Types


{-# LINE 24 "src/System/Rados/FFI.hsc" #-}

{-# LINE 25 "src/System/Rados/FFI.hsc" #-}

-- typedef void *rados_t;
data RadosT

-- typedef void *rados_ioctx_t;
data RadosIOCtxT

-- typedef void *rados_list_ctx_t;
data RadosListCtxT

-- typedef void *rados_completion_t;
data RadosCompletionT

-- typedef void *rados_write_op_t;
data RadosWriteOpT

type RadosCallback  = Ptr RadosCompletionT -> Ptr () -> IO ()
type RadosCallbackT = FunPtr RadosCallback

newtype LockFlag = LockFlag { unLockFlag :: Word8 }
idempotent  :: LockFlag
idempotent  = LockFlag 1

{-# LINE 46 "src/System/Rados/FFI.hsc" #-}

data TimeVal = TimeVal
    { seconds      :: CLong 
    , microseconds :: CLong
    } deriving (Eq, Show)

instance Num TimeVal where
    (+) = undefined
    (*) = undefined
    (-) = undefined
    abs = undefined
    signum = undefined
    fromInteger i = let clong = fromIntegral i in TimeVal clong 0

-- http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs

{-# LINE 62 "src/System/Rados/FFI.hsc" #-}

{-# LINE 63 "src/System/Rados/FFI.hsc" #-}

instance Storable TimeVal where
    alignment _ = 8
{-# LINE 66 "src/System/Rados/FFI.hsc" #-}
    sizeOf    _ = (16)
{-# LINE 67 "src/System/Rados/FFI.hsc" #-}
    peek p = do
        seconds  <-  (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 69 "src/System/Rados/FFI.hsc" #-}
        microseconds  <- (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 70 "src/System/Rados/FFI.hsc" #-}
        return $ TimeVal seconds microseconds
    poke p (TimeVal sec usec) = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p sec
{-# LINE 73 "src/System/Rados/FFI.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p usec
{-# LINE 74 "src/System/Rados/FFI.hsc" #-}

foreign import ccall safe "librados.h rados_create"
    c_rados_create :: Ptr (Ptr RadosT)
                   -> CString
                   -> IO CInt

foreign import ccall safe "librados.h rados_shutdown"
    c_rados_shutdown :: Ptr RadosT
                     -> IO ()

foreign import ccall safe "librados.h rados_conf_read_file"
    c_rados_conf_read_file :: Ptr RadosT
                            -> CString
                            -> IO CInt

foreign import ccall safe "librados.h rados_conf_parse_argv"
    c_rados_conf_parse_argv :: Ptr RadosT
                            -> CInt
                            -> Ptr CString
                            -> IO CInt

foreign import ccall safe "librados.h rados_conf_parse_env"
    c_rados_conf_parse_env :: Ptr RadosT
                           -> CString
                           -> IO CInt

foreign import ccall unsafe "librados.h rados_connect"
    c_rados_connect :: Ptr RadosT
                    -> IO CInt

foreign import ccall safe "librados.h rados_ioctx_create"
    c_rados_ioctx_create
        :: Ptr RadosT
        -> CString
        -> Ptr (Ptr RadosIOCtxT)
        -> IO CInt

foreign import ccall safe "librados.h rados_ioctx_destroy"
    c_rados_ioctx_destroy :: Ptr RadosIOCtxT -> IO ()

foreign import ccall safe "librados.h rados_aio_create_completion"
    c_rados_aio_create_completion
        :: Ptr ()
        -> RadosCallbackT
        -> RadosCallbackT
        -> Ptr (Ptr RadosCompletionT)
        -> IO CInt

foreign import ccall safe "librados.h &rados_aio_release"
    c_rados_aio_release :: FunPtr (Ptr RadosCompletionT -> IO ())

foreign import ccall safe "string.h strerror"
    c_strerror :: Errno -> IO (Ptr CChar)

foreign import ccall safe "librados.h rados_aio_wait_for_complete"
    c_rados_aio_wait_for_complete :: Ptr RadosCompletionT -> IO CInt

foreign import ccall safe "librados.h rados_aio_wait_for_safe"
    c_rados_aio_wait_for_safe :: Ptr RadosCompletionT -> IO CInt

foreign import ccall safe "librados.h rados_aio_get_return_value"
    c_rados_aio_get_return_value :: Ptr RadosCompletionT -> IO CInt

foreign import ccall safe "librados.h rados_aio_read"
    c_rados_aio_read
        :: Ptr RadosIOCtxT
        -> CString
        -> Ptr RadosCompletionT
        -> CString
        -> CSize
        -> Word64
        -> IO CInt

foreign import ccall safe "librados.h rados_aio_write"
    c_rados_aio_write
        :: Ptr RadosIOCtxT
        -> CString
        -> Ptr RadosCompletionT
        -> CString
        -> CSize
        -> Word64
        -> IO CInt


foreign import ccall safe "librados.h rados_aio_write_full"
    c_rados_aio_write_full
        :: Ptr RadosIOCtxT
        -> CString
        -> Ptr RadosCompletionT
        -> CString
        -> CSize
        -> IO CInt


foreign import ccall safe "librados.h rados_aio_append"
    c_rados_aio_append
        :: Ptr RadosIOCtxT
        -> CString
        -> Ptr RadosCompletionT
        -> CString
        -> CSize
        -> IO CInt

foreign import ccall safe "librados.h rados_aio_stat"
    c_rados_aio_stat
        :: Ptr RadosIOCtxT
        -> CString
        -> Ptr RadosCompletionT
        -> Ptr Word64
        -> Ptr CTime
        -> IO CInt

foreign import ccall safe "librados.h rados_aio_remove"
    c_rados_aio_remove
        :: Ptr RadosIOCtxT
        -> CString
        -> Ptr RadosCompletionT
        -> IO CInt

foreign import ccall safe "librados.h rados_write"
    c_rados_write :: Ptr RadosIOCtxT
        -> CString
        -> CString
        -> CSize
        -> Word64
        -> IO CInt

foreign import ccall safe "librados.h rados_write_full"
    c_rados_write_full
        :: Ptr RadosIOCtxT
        -> CString
        -> CString
        -> CSize
        -> IO CInt

foreign import ccall safe "librados.h rados_append"
    c_rados_append
        :: Ptr RadosIOCtxT
        -> CString
        -> CString
        -> CSize
        -> IO CInt

foreign import ccall safe "librados.h rados_read"
    c_rados_read
        :: Ptr RadosIOCtxT
        -> CString
        -> CString
        -> CSize
        -> Word64
        -> IO CInt

foreign import ccall safe "librados.h rados_remove"
    c_rados_remove
        :: Ptr RadosIOCtxT
        -> CString
        -> IO CInt

foreign import ccall safe "librados.h rados_stat"
    c_rados_stat
        :: Ptr RadosIOCtxT
        -> CString
        -> Ptr Word64
        -> Ptr CTime
        -> IO CInt

foreign import ccall safe "librados.h rados_lock_exclusive"
    c_rados_lock_exclusive
        :: Ptr RadosIOCtxT
        -> CString
        -> CString
        -> CString
        -> CString
        -> Ptr TimeVal
        -> LockFlag
        -> IO CInt

foreign import ccall safe "librados.h rados_unlock"
    c_rados_unlock
        :: Ptr RadosIOCtxT
        -> CString
        -> CString
        -> CString
        -> IO CInt

foreign import ccall safe "librados.h rados_lock_shared"
    c_rados_lock_shared
        :: Ptr RadosIOCtxT
        -> CString
        -> CString
        -> CString
        -> CString
        -> CString
        -> Ptr TimeVal
        -> LockFlag
        -> IO CInt

foreign import ccall safe "librados.h rados_objects_list_open"
    c_rados_objects_list_open
        :: Ptr RadosIOCtxT
        -> Ptr (Ptr RadosListCtxT)
        -> IO CInt

foreign import ccall unsafe "librados.h rados_objects_list_close"
    c_rados_objects_list_close
        :: Ptr RadosListCtxT
        -> IO ()

foreign import ccall safe "librados.h rados_objects_list_next"
    c_rados_objects_list_next
        :: Ptr RadosListCtxT
        -> Ptr CString
        -> Ptr CString
        -> IO CInt

foreign import ccall safe "getProgArgv"
    c_getProgArgv
        :: Ptr CInt
        -> Ptr (Ptr CString)
        -> IO ()


{-# LINE 394 "src/System/Rados/FFI.hsc" #-}