packages feed

xattr-0.6.1: System/Xattr/CFuncs.hsc

module System.Xattr.CFuncs where

import Foreign.C
import Foreign.Ptr
#ifdef __APPLE__
import Data.Bits ((.|.))
#endif
import System.Posix.Types

type Void = CChar

#ifdef __APPLE__

#include <sys/xattr.h>

foreign import ccall unsafe "setxattr" c_osx_setxattr :: CString -> CString -> Ptr Void -> CSize -> CInt -> CInt -> IO CInt
foreign import ccall unsafe "fsetxattr" c_osx_fsetxattr :: CInt -> CString -> Ptr Void -> CSize -> CInt -> CInt -> IO CInt

c_setxattr :: CString -> CString -> Ptr Void -> CSize -> CInt -> IO CInt
c_setxattr path name value size flags = c_osx_setxattr path name value size 0 flags

c_lsetxattr :: CString -> CString -> Ptr Void -> CSize -> CInt -> IO CInt
c_lsetxattr path name value size flags = c_osx_setxattr path name value size 0 (#{const XATTR_NOFOLLOW} .|. flags)

c_fsetxattr :: CInt -> CString -> Ptr Void -> CSize -> CInt -> IO CInt
c_fsetxattr fd name value size flags = c_osx_fsetxattr fd name value size 0 flags


foreign import ccall unsafe "getxattr" c_osx_getxattr :: CString -> CString -> Ptr Void -> CSize -> CInt -> CInt -> IO CSize
foreign import ccall unsafe "fgetxattr" c_osx_fgetxattr :: CInt -> CString -> Ptr Void -> CSize -> CInt -> CInt -> IO CSize

c_getxattr :: CString -> CString -> Ptr Void -> CSize -> IO CSize
c_getxattr path name value size = c_osx_getxattr path name value size 0 0

c_lgetxattr :: CString -> CString -> Ptr Void -> CSize -> IO CSize
c_lgetxattr path name value size = c_osx_getxattr path name value size 0 #{const XATTR_NOFOLLOW}

c_fgetxattr :: CInt -> CString -> Ptr Void -> CSize -> IO CSize
c_fgetxattr fd name value size = c_osx_fgetxattr fd name value size 0 0


foreign import ccall unsafe "listxattr" c_osx_listxattr :: CString -> CString -> CSize -> CInt -> IO CSsize
foreign import ccall unsafe "flistxattr" c_osx_flistxattr :: CInt -> CString -> CSize -> CInt -> IO CSsize

c_listxattr :: CString -> CString -> CSize -> IO CSsize
c_listxattr path list size = c_osx_listxattr path list size 0

c_llistxattr :: CString -> CString -> CSize -> IO CSsize
c_llistxattr path list size = c_osx_listxattr path list size #{const XATTR_NOFOLLOW}

c_flistxattr :: CInt -> CString -> CSize -> IO CSsize
c_flistxattr fd list size = c_osx_flistxattr fd list size 0

#else

-- We assume Linux.

foreign import ccall unsafe "setxattr" c_setxattr :: CString -> CString -> Ptr Void -> CSize -> CInt -> IO CInt
foreign import ccall unsafe "lsetxattr" c_lsetxattr :: CString -> CString -> Ptr Void -> CSize -> CInt -> IO CInt
foreign import ccall unsafe "fsetxattr" c_fsetxattr :: CInt -> CString -> Ptr Void -> CSize -> CInt -> IO CInt

foreign import ccall unsafe "getxattr" c_getxattr :: CString -> CString -> Ptr Void -> CSize -> IO CSize
foreign import ccall unsafe "lgetxattr" c_lgetxattr :: CString -> CString -> Ptr Void -> CSize -> IO CSize
foreign import ccall unsafe "fgetxattr" c_fgetxattr :: CInt -> CString -> Ptr Void -> CSize -> IO CSize

foreign import ccall unsafe "listxattr" c_listxattr :: CString -> CString -> CSize -> IO CSsize
foreign import ccall unsafe "llistxattr" c_llistxattr :: CString -> CString -> CSize -> IO CSsize
foreign import ccall unsafe "flistxattr" c_flistxattr :: CInt -> CString -> CSize -> IO CSsize

#endif