-- GENERATED by C->Haskell Compiler, version 0.16.3 Crystal Seed, 24 Jan 2009 (Haskell) -- Edit the ORIGNAL .chs file instead! {-# LINE 1 "System/LibVirt/Errors.chs" #-}{-# LANGUAGE ForeignFunctionInterface, ScopedTypeVariables, StandaloneDeriving, DeriveDataTypeable #-} {-# LINE 3 "System/LibVirt/Errors.chs" #-} 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 {-# LINE 22 "System/LibVirt/Errors.chs" #-} 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) {-# LINE 24 "System/LibVirt/Errors.chs" #-} 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 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 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 unmatched = error ("ErrorDomain.toEnum: Cannot match " ++ show unmatched) {-# LINE 28 "System/LibVirt/Errors.chs" #-} 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) {-# LINE 49 "System/LibVirt/Errors.chs" #-} 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 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 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 unmatched = error ("ErrorNumber.toEnum: Cannot match " ++ show unmatched) {-# LINE 51 "System/LibVirt/Errors.chs" #-} 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 16 ::IO CInt}) err conn <- ptrToConnection' =<< (\ptr -> do {peekByteOff ptr 24 ::IO (Ptr ())}) err dom <- ptrToDomain' =<< (\ptr -> do {peekByteOff ptr 32 ::IO (Ptr ())}) err str1 <- peekCString' =<< (\ptr -> do {peekByteOff ptr 40 ::IO (Ptr CChar)}) err str2 <- peekCString' =<< (\ptr -> do {peekByteOff ptr 48 ::IO (Ptr CChar)}) err str3 <- peekCString' =<< (\ptr -> do {peekByteOff ptr 56 ::IO (Ptr CChar)}) err int1 <- (\ptr -> do {peekByteOff ptr 64 ::IO CInt}) err int2 <- (\ptr -> do {peekByteOff ptr 68 ::IO CInt}) err net <- ptrToNetwork' =<< (\ptr -> do {peekByteOff ptr 72 ::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') {-# LINE 97 "System/LibVirt/Errors.chs" #-} 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 ()))