module System.LibVirt.Errors
(Error (..), ErrorLevel (..),
ErrorDomain (..), ErrorNumber (..),
catchVirtError,
exceptionOnMinusOne,
ptrToConnection, ptrToDomain, ptrToNetwork,
connectionToPtr, domainToPtr, networkToPtr)
where
import qualified Control.Exception as E
import Data.Generics
import Foreign
import Foreign.C.Types
import Foreign.C.String
import System.LibVirt.Internal
data ErrorLevel = ErrNone
| ErrWarning
| ErrError
deriving (Eq,Show)
instance Enum ErrorLevel where
fromEnum ErrNone = 0
fromEnum ErrWarning = 1
fromEnum ErrError = 2
toEnum 0 = ErrNone
toEnum 1 = ErrWarning
toEnum 2 = ErrError
toEnum unmatched = error ("ErrorLevel.toEnum: Cannot match " ++ show unmatched)
deriving instance Data ErrorLevel
deriving instance Typeable ErrorLevel
data ErrorDomain = FromNone
| FromXen
| FromXend
| FromXenstore
| FromSexpr
| FromXml
| FromDom
| FromRpc
| FromProxy
| FromConf
| FromQemu
| FromNet
| FromTest
| FromRemote
| FromOpenvz
| FromXenxm
| FromStatsLinux
| FromLxc
| FromStorage
| FromNetwork
| FromDomain
| FromUml
| FromNodedev
| FromXenInotify
| FromSecurity
| FromVbox
| FromInterface
| FromOne
| FromEsx
| FromPhyp
| FromSecret
| FromCpu
| FromXenapi
| FromNwfilter
| FromHook
| FromDomainSnapshot
| FromAudit
| FromSysinfo
| FromStreams
| FromVmware
| FromEvent
| FromLibxl
| FromLocking
| FromHyperv
| FromCapabilities
| FromUri
| FromAuth
| FromDbus
deriving (Eq,Show)
instance Enum ErrorDomain where
fromEnum FromNone = 0
fromEnum FromXen = 1
fromEnum FromXend = 2
fromEnum FromXenstore = 3
fromEnum FromSexpr = 4
fromEnum FromXml = 5
fromEnum FromDom = 6
fromEnum FromRpc = 7
fromEnum FromProxy = 8
fromEnum FromConf = 9
fromEnum FromQemu = 10
fromEnum FromNet = 11
fromEnum FromTest = 12
fromEnum FromRemote = 13
fromEnum FromOpenvz = 14
fromEnum FromXenxm = 15
fromEnum FromStatsLinux = 16
fromEnum FromLxc = 17
fromEnum FromStorage = 18
fromEnum FromNetwork = 19
fromEnum FromDomain = 20
fromEnum FromUml = 21
fromEnum FromNodedev = 22
fromEnum FromXenInotify = 23
fromEnum FromSecurity = 24
fromEnum FromVbox = 25
fromEnum FromInterface = 26
fromEnum FromOne = 27
fromEnum FromEsx = 28
fromEnum FromPhyp = 29
fromEnum FromSecret = 30
fromEnum FromCpu = 31
fromEnum FromXenapi = 32
fromEnum FromNwfilter = 33
fromEnum FromHook = 34
fromEnum FromDomainSnapshot = 35
fromEnum FromAudit = 36
fromEnum FromSysinfo = 37
fromEnum FromStreams = 38
fromEnum FromVmware = 39
fromEnum FromEvent = 40
fromEnum FromLibxl = 41
fromEnum FromLocking = 42
fromEnum FromHyperv = 43
fromEnum FromCapabilities = 44
fromEnum FromUri = 45
fromEnum FromAuth = 46
fromEnum FromDbus = 47
toEnum 0 = FromNone
toEnum 1 = FromXen
toEnum 2 = FromXend
toEnum 3 = FromXenstore
toEnum 4 = FromSexpr
toEnum 5 = FromXml
toEnum 6 = FromDom
toEnum 7 = FromRpc
toEnum 8 = FromProxy
toEnum 9 = FromConf
toEnum 10 = FromQemu
toEnum 11 = FromNet
toEnum 12 = FromTest
toEnum 13 = FromRemote
toEnum 14 = FromOpenvz
toEnum 15 = FromXenxm
toEnum 16 = FromStatsLinux
toEnum 17 = FromLxc
toEnum 18 = FromStorage
toEnum 19 = FromNetwork
toEnum 20 = FromDomain
toEnum 21 = FromUml
toEnum 22 = FromNodedev
toEnum 23 = FromXenInotify
toEnum 24 = FromSecurity
toEnum 25 = FromVbox
toEnum 26 = FromInterface
toEnum 27 = FromOne
toEnum 28 = FromEsx
toEnum 29 = FromPhyp
toEnum 30 = FromSecret
toEnum 31 = FromCpu
toEnum 32 = FromXenapi
toEnum 33 = FromNwfilter
toEnum 34 = FromHook
toEnum 35 = FromDomainSnapshot
toEnum 36 = FromAudit
toEnum 37 = FromSysinfo
toEnum 38 = FromStreams
toEnum 39 = FromVmware
toEnum 40 = FromEvent
toEnum 41 = FromLibxl
toEnum 42 = FromLocking
toEnum 43 = FromHyperv
toEnum 44 = FromCapabilities
toEnum 45 = FromUri
toEnum 46 = FromAuth
toEnum 47 = FromDbus
toEnum unmatched = error ("ErrorDomain.toEnum: Cannot match " ++ show unmatched)
deriving instance Data ErrorDomain
deriving instance Typeable ErrorDomain
data Error = Error {
veCode :: ErrorNumber,
veDomain :: ErrorDomain,
veMessage :: String,
veLevel :: ErrorLevel,
veConnect :: Connection,
veDom :: Domain,
veStr1 :: Maybe String,
veStr2 :: Maybe String,
veStr3 :: Maybe String,
veInt1 :: Int,
veInt2 :: Int,
veNet :: Network }
deriving (Eq, Show, Data, Typeable)
instance E.Exception Error
type VirtErrorPtr = Ptr (Error)
data ErrorNumber = ErrOk
| ErrInternalError
| ErrNoMemory
| ErrNoSupport
| ErrUnknownHost
| ErrNoConnect
| ErrInvalidConn
| ErrInvalidDomain
| ErrInvalidArg
| ErrOperationFailed
| ErrGetFailed
| ErrPostFailed
| ErrHttpError
| ErrSexprSerial
| ErrNoXen
| ErrXenCall
| ErrOsType
| ErrNoKernel
| ErrNoRoot
| ErrNoSource
| ErrNoTarget
| ErrNoName
| ErrNoOs
| ErrNoDevice
| ErrNoXenstore
| ErrDriverFull
| ErrCallFailed
| ErrXmlError
| ErrDomExist
| ErrOperationDenied
| ErrOpenFailed
| ErrReadFailed
| ErrParseFailed
| ErrConfSyntax
| ErrWriteFailed
| ErrXmlDetail
| ErrInvalidNetwork
| ErrNetworkExist
| ErrSystemError
| ErrRpc
| ErrGnutlsError
| WarNoNetwork
| ErrNoDomain
| ErrNoNetwork
| ErrInvalidMac
| ErrAuthFailed
| ErrInvalidStoragePool
| ErrInvalidStorageVol
| WarNoStorage
| ErrNoStoragePool
| ErrNoStorageVol
| WarNoNode
| ErrInvalidNodeDevice
| ErrNoNodeDevice
| ErrNoSecurityModel
| ErrOperationInvalid
| WarNoInterface
| ErrNoInterface
| ErrInvalidInterface
| ErrMultipleInterfaces
| WarNoNwfilter
| ErrInvalidNwfilter
| ErrNoNwfilter
| ErrBuildFirewall
| WarNoSecret
| ErrInvalidSecret
| ErrNoSecret
| ErrConfigUnsupported
| ErrOperationTimeout
| ErrMigratePersistFailed
| ErrHookScriptFailed
| ErrInvalidDomainSnapshot
| ErrNoDomainSnapshot
| ErrInvalidStream
| ErrArgumentUnsupported
| ErrStorageProbeFailed
| ErrStoragePoolBuilt
| ErrSnapshotRevertRisky
| ErrOperationAborted
| ErrAuthCancelled
| ErrNoDomainMetadata
| ErrMigrateUnsafe
| ErrOverflow
| ErrBlockCopyActive
deriving (Eq,Show)
instance Enum ErrorNumber where
fromEnum ErrOk = 0
fromEnum ErrInternalError = 1
fromEnum ErrNoMemory = 2
fromEnum ErrNoSupport = 3
fromEnum ErrUnknownHost = 4
fromEnum ErrNoConnect = 5
fromEnum ErrInvalidConn = 6
fromEnum ErrInvalidDomain = 7
fromEnum ErrInvalidArg = 8
fromEnum ErrOperationFailed = 9
fromEnum ErrGetFailed = 10
fromEnum ErrPostFailed = 11
fromEnum ErrHttpError = 12
fromEnum ErrSexprSerial = 13
fromEnum ErrNoXen = 14
fromEnum ErrXenCall = 15
fromEnum ErrOsType = 16
fromEnum ErrNoKernel = 17
fromEnum ErrNoRoot = 18
fromEnum ErrNoSource = 19
fromEnum ErrNoTarget = 20
fromEnum ErrNoName = 21
fromEnum ErrNoOs = 22
fromEnum ErrNoDevice = 23
fromEnum ErrNoXenstore = 24
fromEnum ErrDriverFull = 25
fromEnum ErrCallFailed = 26
fromEnum ErrXmlError = 27
fromEnum ErrDomExist = 28
fromEnum ErrOperationDenied = 29
fromEnum ErrOpenFailed = 30
fromEnum ErrReadFailed = 31
fromEnum ErrParseFailed = 32
fromEnum ErrConfSyntax = 33
fromEnum ErrWriteFailed = 34
fromEnum ErrXmlDetail = 35
fromEnum ErrInvalidNetwork = 36
fromEnum ErrNetworkExist = 37
fromEnum ErrSystemError = 38
fromEnum ErrRpc = 39
fromEnum ErrGnutlsError = 40
fromEnum WarNoNetwork = 41
fromEnum ErrNoDomain = 42
fromEnum ErrNoNetwork = 43
fromEnum ErrInvalidMac = 44
fromEnum ErrAuthFailed = 45
fromEnum ErrInvalidStoragePool = 46
fromEnum ErrInvalidStorageVol = 47
fromEnum WarNoStorage = 48
fromEnum ErrNoStoragePool = 49
fromEnum ErrNoStorageVol = 50
fromEnum WarNoNode = 51
fromEnum ErrInvalidNodeDevice = 52
fromEnum ErrNoNodeDevice = 53
fromEnum ErrNoSecurityModel = 54
fromEnum ErrOperationInvalid = 55
fromEnum WarNoInterface = 56
fromEnum ErrNoInterface = 57
fromEnum ErrInvalidInterface = 58
fromEnum ErrMultipleInterfaces = 59
fromEnum WarNoNwfilter = 60
fromEnum ErrInvalidNwfilter = 61
fromEnum ErrNoNwfilter = 62
fromEnum ErrBuildFirewall = 63
fromEnum WarNoSecret = 64
fromEnum ErrInvalidSecret = 65
fromEnum ErrNoSecret = 66
fromEnum ErrConfigUnsupported = 67
fromEnum ErrOperationTimeout = 68
fromEnum ErrMigratePersistFailed = 69
fromEnum ErrHookScriptFailed = 70
fromEnum ErrInvalidDomainSnapshot = 71
fromEnum ErrNoDomainSnapshot = 72
fromEnum ErrInvalidStream = 73
fromEnum ErrArgumentUnsupported = 74
fromEnum ErrStorageProbeFailed = 75
fromEnum ErrStoragePoolBuilt = 76
fromEnum ErrSnapshotRevertRisky = 77
fromEnum ErrOperationAborted = 78
fromEnum ErrAuthCancelled = 79
fromEnum ErrNoDomainMetadata = 80
fromEnum ErrMigrateUnsafe = 81
fromEnum ErrOverflow = 82
fromEnum ErrBlockCopyActive = 83
toEnum 0 = ErrOk
toEnum 1 = ErrInternalError
toEnum 2 = ErrNoMemory
toEnum 3 = ErrNoSupport
toEnum 4 = ErrUnknownHost
toEnum 5 = ErrNoConnect
toEnum 6 = ErrInvalidConn
toEnum 7 = ErrInvalidDomain
toEnum 8 = ErrInvalidArg
toEnum 9 = ErrOperationFailed
toEnum 10 = ErrGetFailed
toEnum 11 = ErrPostFailed
toEnum 12 = ErrHttpError
toEnum 13 = ErrSexprSerial
toEnum 14 = ErrNoXen
toEnum 15 = ErrXenCall
toEnum 16 = ErrOsType
toEnum 17 = ErrNoKernel
toEnum 18 = ErrNoRoot
toEnum 19 = ErrNoSource
toEnum 20 = ErrNoTarget
toEnum 21 = ErrNoName
toEnum 22 = ErrNoOs
toEnum 23 = ErrNoDevice
toEnum 24 = ErrNoXenstore
toEnum 25 = ErrDriverFull
toEnum 26 = ErrCallFailed
toEnum 27 = ErrXmlError
toEnum 28 = ErrDomExist
toEnum 29 = ErrOperationDenied
toEnum 30 = ErrOpenFailed
toEnum 31 = ErrReadFailed
toEnum 32 = ErrParseFailed
toEnum 33 = ErrConfSyntax
toEnum 34 = ErrWriteFailed
toEnum 35 = ErrXmlDetail
toEnum 36 = ErrInvalidNetwork
toEnum 37 = ErrNetworkExist
toEnum 38 = ErrSystemError
toEnum 39 = ErrRpc
toEnum 40 = ErrGnutlsError
toEnum 41 = WarNoNetwork
toEnum 42 = ErrNoDomain
toEnum 43 = ErrNoNetwork
toEnum 44 = ErrInvalidMac
toEnum 45 = ErrAuthFailed
toEnum 46 = ErrInvalidStoragePool
toEnum 47 = ErrInvalidStorageVol
toEnum 48 = WarNoStorage
toEnum 49 = ErrNoStoragePool
toEnum 50 = ErrNoStorageVol
toEnum 51 = WarNoNode
toEnum 52 = ErrInvalidNodeDevice
toEnum 53 = ErrNoNodeDevice
toEnum 54 = ErrNoSecurityModel
toEnum 55 = ErrOperationInvalid
toEnum 56 = WarNoInterface
toEnum 57 = ErrNoInterface
toEnum 58 = ErrInvalidInterface
toEnum 59 = ErrMultipleInterfaces
toEnum 60 = WarNoNwfilter
toEnum 61 = ErrInvalidNwfilter
toEnum 62 = ErrNoNwfilter
toEnum 63 = ErrBuildFirewall
toEnum 64 = WarNoSecret
toEnum 65 = ErrInvalidSecret
toEnum 66 = ErrNoSecret
toEnum 67 = ErrConfigUnsupported
toEnum 68 = ErrOperationTimeout
toEnum 69 = ErrMigratePersistFailed
toEnum 70 = ErrHookScriptFailed
toEnum 71 = ErrInvalidDomainSnapshot
toEnum 72 = ErrNoDomainSnapshot
toEnum 73 = ErrInvalidStream
toEnum 74 = ErrArgumentUnsupported
toEnum 75 = ErrStorageProbeFailed
toEnum 76 = ErrStoragePoolBuilt
toEnum 77 = ErrSnapshotRevertRisky
toEnum 78 = ErrOperationAborted
toEnum 79 = ErrAuthCancelled
toEnum 80 = ErrNoDomainMetadata
toEnum 81 = ErrMigrateUnsafe
toEnum 82 = ErrOverflow
toEnum 83 = ErrBlockCopyActive
toEnum unmatched = error ("ErrorNumber.toEnum: Cannot match " ++ show unmatched)
deriving instance Data ErrorNumber
deriving instance Typeable ErrorNumber
data UnknownError = UnknownError
deriving (Eq, Show, Data, Typeable)
instance E.Exception UnknownError
peekCString' :: CString -> IO (Maybe String)
peekCString' ptr
| ptr == nullPtr = return Nothing
| otherwise = Just `fmap` peekCString ptr
convertError :: Ptr () -> IO (Maybe Error)
convertError ptr
| ptr == nullPtr = return Nothing
| otherwise = do
let err = castPtr ptr :: VirtErrorPtr
code <- (\ptr -> do {peekByteOff ptr 0 ::IO CInt}) err
domain <- (\ptr -> do {peekByteOff ptr 4 ::IO CInt}) err
message <- peekCString =<< (\ptr -> do {peekByteOff ptr 8 ::IO (Ptr CChar)}) err
level <- (\ptr -> do {peekByteOff ptr 12 ::IO CInt}) err
conn <- ptrToConnection' =<< (\ptr -> do {peekByteOff ptr 16 ::IO (Ptr ())}) err
dom <- ptrToDomain' =<< (\ptr -> do {peekByteOff ptr 20 ::IO (Ptr ())}) err
str1 <- peekCString' =<< (\ptr -> do {peekByteOff ptr 24 ::IO (Ptr CChar)}) err
str2 <- peekCString' =<< (\ptr -> do {peekByteOff ptr 28 ::IO (Ptr CChar)}) err
str3 <- peekCString' =<< (\ptr -> do {peekByteOff ptr 32 ::IO (Ptr CChar)}) err
int1 <- (\ptr -> do {peekByteOff ptr 36 ::IO CInt}) err
int2 <- (\ptr -> do {peekByteOff ptr 40 ::IO CInt}) err
net <- ptrToNetwork' =<< (\ptr -> do {peekByteOff ptr 44 ::IO (Ptr ())}) err
return $ Just $ Error {
veCode = toEnum $ fromIntegral code,
veDomain = toEnum $ fromIntegral domain,
veMessage = message,
veLevel = toEnum $ fromIntegral level,
veConnect = conn,
veDom = dom,
veStr1 = str1,
veStr2 = str2,
veStr3 = str3,
veInt1 = fromIntegral int1,
veInt2 = fromIntegral int2,
veNet = net }
getLastError :: IO (Maybe Error)
getLastError =
getLastError'_ >>= \res ->
convertError res >>= \res' ->
return (res')
catchVirtError :: IO a -> (Error -> IO b) -> IO (Either b a)
catchVirtError m f = do
(Right `fmap` m) `E.catch` (\e -> Left `fmap` f e)
exceptionOnMinusOne :: CInt -> IO Int
exceptionOnMinusOne x = do
if x == 1
then handleError' (fromIntegral x)
else return (fromIntegral x)
handleError :: IO a
handleError = do
merr <- getLastError
case merr of
Just err -> E.throw err
Nothing -> E.throw UnknownError
handleError' :: a -> IO a
handleError' x = do
merr <- getLastError
case merr of
Just err -> E.throw err
Nothing -> return x
ptrToConnection :: Ptr () -> IO Connection
ptrToConnection ptr
| ptr == nullPtr = handleError
| otherwise = return $ Connection (castPtr ptr)
ptrToConnection' :: Ptr () -> IO Connection
ptrToConnection' ptr = return $ Connection (castPtr ptr)
connectionToPtr :: Connection -> Ptr ()
connectionToPtr (Connection ptr) = castPtr ptr
ptrToDomain :: Ptr () -> IO Domain
ptrToDomain ptr
| ptr == nullPtr = handleError
| otherwise = return $ Domain (castPtr ptr)
ptrToDomain' :: Ptr () -> IO Domain
ptrToDomain' ptr = return $ Domain (castPtr ptr)
domainToPtr :: Domain -> Ptr ()
domainToPtr (Domain ptr) = castPtr ptr
ptrToNetwork :: Ptr () -> IO Network
ptrToNetwork ptr
| ptr == nullPtr = handleError
| otherwise = return $ Network (castPtr ptr)
ptrToNetwork' :: Ptr () -> IO Network
ptrToNetwork' ptr = return $ Network (castPtr ptr)
networkToPtr :: Network -> Ptr ()
networkToPtr (Network ptr) = castPtr ptr
foreign import ccall safe "System/LibVirt/Errors.chs.h virGetLastError"
getLastError'_ :: (IO (Ptr ()))