libmagic 1.3 → 1.3.1
raw patch · 5 files changed
+45/−20 lines, 5 files
Files
- CHANGELOG +7/−0
- Magic/Init.hsc +6/−10
- Magic/Operations.hsc +15/−8
- Magic/Utils.hsc +16/−1
- libmagic.cabal +1/−1
CHANGELOG view
@@ -1,3 +1,10 @@+haskell-libmagic (1.3.1) unstable; urgency=medium++ * Fix filename encoding on Windows reversion.+ * Added magicFD.++ -- Joey Hess <id@joeyh.name> Tue, 27 Oct 2026 19:28:00 -0400+ haskell-libmagic (1.3) unstable; urgency=medium * Use ByteString for magic results, rather than String
Magic/Init.hsc view
@@ -20,7 +20,7 @@ Written by John Goerzen, jgoerzen\@complete.org -} -{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE QuasiQuotes #-} module Magic.Init(magicOpen, magicLoad, magicLoadDefault) where@@ -32,9 +32,8 @@ import Magic.Utils import Magic.TypesLL import qualified Data.List.NonEmpty as NE+import System.OsString import System.OsPath.Types-import System.OsString.Internal.Types-import Data.Type.Coercion import qualified Data.ByteString.Short as SBS {- | Create a Magic object. You must call either 'magicLoadDefault'@@ -52,15 +51,12 @@ {- | Load the specified magic databases. -} magicLoad :: Magic -> NE.NonEmpty OsPath -> IO ()-magicLoad m l = withMagicPtr m $ \cmagic ->- SBS.useAsCString s $ \cs ->+magicLoad m l = withMagicPtr m $ \cmagic -> do+ sbs <- decodeOsPath s+ SBS.useAsCString sbs $ \cs -> checkIntError "magicLoad" cmagic $ magic_load cmagic cs where- s = SBS.intercalate ":" (map conv (NE.toList l))-- conv p = case coercionToPlatformTypes of- Left (_, co) -> getWindowsString (coerceWith co p)- Right (_, co) -> getPosixString (coerceWith co p)+ s = intercalate [osstr|:|] (NE.toList l) foreign import ccall unsafe "magic.h magic_open" magic_open :: CInt -> IO (Ptr CMagic)
Magic/Operations.hsc view
@@ -21,7 +21,7 @@ -} module Magic.Operations(-- * Guessing the type- magicFile, magicStdin,+ magicFile, magicStdin, magicFD, magicString, magicCString, -- * Other operations magicSetFlags)@@ -35,22 +35,18 @@ import Magic.Utils import Magic.TypesLL import System.OsPath.Types-import System.OsString.Internal.Types-import Data.Type.Coercion+import GHC.IO.FD import qualified Data.ByteString as BS import qualified Data.ByteString.Short as SBS {- | Calls the Magic system on the specified file. -} magicFile :: Magic -> OsPath -> IO BS.ByteString magicFile magic fp =- withMagicPtr magic $ \cmagic ->+ withMagicPtr magic $ \cmagic -> do+ sbsfp <- decodeOsPath fp SBS.useAsCString sbsfp $ \cfp -> do res <- throwErrorIfNull "magicFile" cmagic (magic_file cmagic cfp) BS.packCString res- where- sbsfp = case coercionToPlatformTypes of- Left (_, co) -> getWindowsString (coerceWith co fp)- Right (_, co) -> getPosixString (coerceWith co fp) {- | Calls the Magic system on stdin. -} magicStdin :: Magic -> IO BS.ByteString@@ -59,6 +55,13 @@ do res <- throwErrorIfNull "magicStdin" cmagic (magic_file cmagic nullPtr) BS.packCString res +{- | Calls the Magic system on the contents of the file descriptor. -}+magicFD :: Magic -> FD -> IO BS.ByteString+magicFD magic fd =+ withMagicPtr magic $ \cmagic ->+ do res <- throwErrorIfNull "magicFD" cmagic (magic_descriptor cmagic (fdFD fd))+ BS.packCString res+ {- | Calls the Magic system to process the given String. Please note: it is not evaluated lazily. -} magicString :: Magic -> String -> IO BS.ByteString@@ -81,6 +84,10 @@ -- Does file I/O -> safe foreign import ccall safe "magic.h magic_file" magic_file :: Ptr CMagic -> CString -> IO CString++-- Does file I/O -> safe+foreign import ccall safe "magic.h magic_descriptor"+ magic_descriptor :: Ptr CMagic -> CInt -> IO CString -- Does not do I/O -> unsafe foreign import ccall unsafe "magic.h magic_buffer"
Magic/Utils.hsc view
@@ -21,7 +21,7 @@ -} module Magic.Utils (flaglist2int, fromMagicPtr, withMagicPtr, checkIntError,- throwErrorIfNull)+ throwErrorIfNull, decodeOsPath) where import Foreign@@ -31,6 +31,11 @@ import Magic.Types import Foreign.C.Types import Control.Concurrent.MVar+import System.OsPath.Types+import System.OsString.Internal.Types+import System.OsString.Encoding+import Data.Type.Coercion+import qualified Data.ByteString.Short as SBS flaglist2int :: [MagicFlag] -> CInt flaglist2int mfl =@@ -68,6 +73,16 @@ then return () else throwError caller cmagic +decodeOsPath :: OsPath -> IO (SBS.ShortByteString)+decodeOsPath p = case coercionToPlatformTypes of+ Right (_, co) -> return (getPosixString (coerceWith co p))+ -- libmagic built for windows with MinGW by eg+ -- https://github.com/nscaife/file-windows does not use+ -- wide bytes as are in WindowsString, so convert it using+ -- the locale encoding+ Left (_, co) ->+ encodeWithBasePosix' =<< decodeWithBaseWindows+ (getWindowsString (coerceWith co p)) foreign import ccall unsafe "magic.h &magic_close" magic_close :: FunPtr (Ptr CMagic -> IO ())
libmagic.cabal view
@@ -1,5 +1,5 @@ Name: libmagic-Version: 1.3+Version: 1.3.1 Cabal-Version: >= 1.10 License: BSD3 Maintainer: Joey Hess <id@joeyh.name>