{-# LINE 1 "System/Posix/StatVFS.hsc" #-}
{-# LANGUAGE CPP, GeneralizedNewtypeDeriving, ForeignFunctionInterface, CApiFFI #-}
{-# LINE 2 "System/Posix/StatVFS.hsc" #-}

#include "StatVFSConfig.h"

{-# LINE 5 "System/Posix/StatVFS.hsc" #-}

{-# LINE 6 "System/Posix/StatVFS.hsc" #-}

module System.Posix.StatVFS where

import Control.Applicative
import Foreign
import Foreign.C.Error (throwErrnoIfMinus1_)
import Foreign.C.Types (CInt(..), CULong(..))
import Foreign.C.String (CString, withCString)
import System.Posix.Types
import Unsafe.Coerce (unsafeCoerce)

newtype CFSBlkCnt = CFSBlkCnt HTYPE_FSBLKCNT_T deriving (Bounded, Enum, Eq, Integral, Num, Ord, Real, Storable)
newtype CFSFilCnt = CFSFilCnt HTYPE_FSFILCNT_T deriving (Bounded, Enum, Eq, Integral, Num, Ord, Real, Storable)

instance Read CFSBlkCnt where
  readsPrec            = unsafeCoerce (readsPrec :: Int -> ReadS HTYPE_FSBLKCNT_T)
  readList             = unsafeCoerce (readList  :: ReadS [HTYPE_FSBLKCNT_T])

instance Show CFSBlkCnt where
   showsPrec            = unsafeCoerce (showsPrec :: Int -> HTYPE_FSBLKCNT_T -> ShowS)
   show                 = unsafeCoerce (show :: HTYPE_FSBLKCNT_T -> String)
   showList             = unsafeCoerce (showList :: [HTYPE_FSBLKCNT_T] -> ShowS)

instance Read CFSFilCnt where
  readsPrec            = unsafeCoerce (readsPrec :: Int -> ReadS HTYPE_FSFILCNT_T)
  readList             = unsafeCoerce (readList  :: ReadS [HTYPE_FSFILCNT_T])

instance Show CFSFilCnt where
   showsPrec            = unsafeCoerce (showsPrec :: Int -> HTYPE_FSFILCNT_T -> ShowS)
   show                 = unsafeCoerce (show :: HTYPE_FSFILCNT_T -> String)
   showList             = unsafeCoerce (showList :: [HTYPE_FSFILCNT_T] -> ShowS)

type CStatVFS = ()

foreign import capi unsafe "sys/statvfs.h fstatvfs"
  c_fstatvfs :: CInt -> Ptr CStatVFS -> IO CInt

foreign import capi unsafe "sys/statvfs.h statvfs"
  c_statvfs :: CString -> Ptr CStatVFS -> IO CInt

data StatVFS = StatVFS { statVFS_bsize :: CULong
                       , statVFS_frsize :: CULong
                       , statVFS_blocks :: CFSBlkCnt
                       , statVFS_bfree :: CFSBlkCnt
                       , statVFS_bavail :: CFSBlkCnt
                       , statVFS_files :: CFSFilCnt
                       , statVFS_ffree :: CFSFilCnt
                       , statVFS_favail :: CFSFilCnt
                       , statVFS_fsid :: CULong
                       , statVFS_flag :: CULong
                       , statVFS_namemax :: CULong
                       } deriving Show

statVFS_st_rdonly :: CULong
statVFS_st_rdonly = (1)
{-# LINE 61 "System/Posix/StatVFS.hsc" #-}

statVFS_st_nosuid :: CULong
statVFS_st_nosuid = (2)
{-# LINE 64 "System/Posix/StatVFS.hsc" #-}

toStatVFS :: Ptr CStatVFS -> IO StatVFS
toStatVFS p = StatVFS
              <$> ((\hsc_ptr -> peekByteOff hsc_ptr 0)) p
{-# LINE 68 "System/Posix/StatVFS.hsc" #-}
              <*> ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p
{-# LINE 69 "System/Posix/StatVFS.hsc" #-}
              <*> ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p
{-# LINE 70 "System/Posix/StatVFS.hsc" #-}
              <*> ((\hsc_ptr -> peekByteOff hsc_ptr 16)) p
{-# LINE 71 "System/Posix/StatVFS.hsc" #-}
              <*> ((\hsc_ptr -> peekByteOff hsc_ptr 24)) p
{-# LINE 72 "System/Posix/StatVFS.hsc" #-}
              <*> ((\hsc_ptr -> peekByteOff hsc_ptr 32)) p
{-# LINE 73 "System/Posix/StatVFS.hsc" #-}
              <*> ((\hsc_ptr -> peekByteOff hsc_ptr 40)) p
{-# LINE 74 "System/Posix/StatVFS.hsc" #-}
              <*> ((\hsc_ptr -> peekByteOff hsc_ptr 48)) p
{-# LINE 75 "System/Posix/StatVFS.hsc" #-}
              <*> ((\hsc_ptr -> peekByteOff hsc_ptr 56)) p
{-# LINE 76 "System/Posix/StatVFS.hsc" #-}
              <*> ((\hsc_ptr -> peekByteOff hsc_ptr 64)) p
{-# LINE 77 "System/Posix/StatVFS.hsc" #-}
              <*> ((\hsc_ptr -> peekByteOff hsc_ptr 68)) p
{-# LINE 78 "System/Posix/StatVFS.hsc" #-}

fStatVFS :: Fd -> IO StatVFS
fStatVFS (Fd fd) = do
  fp <- mallocForeignPtrBytes (96)
{-# LINE 82 "System/Posix/StatVFS.hsc" #-}
  withForeignPtr fp $ \p -> do
    throwErrnoIfMinus1_ "fStatVFS" $ c_fstatvfs fd p
    toStatVFS p

statVFS :: FilePath -> IO StatVFS
statVFS path = do
  withCString path $ \c_path -> do
    fp <- mallocForeignPtrBytes (96)
{-# LINE 90 "System/Posix/StatVFS.hsc" #-}
    withForeignPtr fp $ \p -> do
      throwErrnoIfMinus1_ "statVFS" $ c_statvfs c_path p
      toStatVFS p