diff --git a/hgettext.cabal b/hgettext.cabal
--- a/hgettext.cabal
+++ b/hgettext.cabal
@@ -1,5 +1,5 @@
 Name:                   hgettext
-Version:                0.1.6
+Version:                0.1.8
 Cabal-Version:          >= 1.6
 
 License:                BSD3
diff --git a/src/Text/I18N/GetText.hs b/src/Text/I18N/GetText.hs
--- a/src/Text/I18N/GetText.hs
+++ b/src/Text/I18N/GetText.hs
@@ -13,6 +13,7 @@
 
 import Foreign.C.Types
 import Foreign.C.String
+import Foreign.C.Error
 import Foreign.Ptr
 import Data.Maybe (fromMaybe)
 import System.Locale.SetLocale
@@ -46,6 +47,10 @@
 fromCString x | x == nullPtr = return Nothing
               | otherwise = peekCString x >>= return . Just
 
+fromCStringError :: String -> CString -> IO String
+fromCStringError err x | x == nullPtr = throwErrno err
+                       | otherwise = peekCString x
+
 fromCStringDefault :: String -> CString -> IO String
 fromCStringDefault d x = fromCString x >>= \r -> return (fromMaybe d r)
 
@@ -158,19 +163,24 @@
 -- |bindTextDomain sets the base directory of the hierarchy
 -- containing message catalogs for a given message domain.
 --
+-- Throws 'IOError' if fails
+--
 bindTextDomain :: String        -- ^ domain name
                -> Maybe String  -- ^ path to the locale folder or 'Nothing' to return
                                 -- base directory for domain
-               -> IO (Maybe String) -- ^ return value
+               -> IO String     -- ^ return value
 bindTextDomain domainname dirname = 
   withCString domainname $ \domain -> 
       withCStringMaybe dirname $ \dir ->
-          c_bindtextdomain domain dir >>= fromCString
+          c_bindtextdomain domain dir >>= fromCStringError "bindTextDomain fails"
 
 -- |textDomain sets domain for future 'getText' call
+--
+-- Throws 'IOError' if fails
+-- 
 textDomain :: Maybe String      -- ^ domain name, if 'Nothing' than returns
                                 -- current domain name
-           -> IO (Maybe String) -- ^ return value
+           -> IO String         -- ^ return value
 textDomain domainname = 
     withCStringMaybe domainname $ \domain ->
-        c_textdomain domain >>= fromCString
+        c_textdomain domain >>= fromCStringError "textDomain fails"
diff --git a/src/hgettext.hs b/src/hgettext.hs
--- a/src/hgettext.hs
+++ b/src/hgettext.hs
@@ -7,6 +7,8 @@
 
 import Data.Generics.PlateData
 
+import Distribution.Simple.PreProcess.Unlit
+
 import Data.List
 
 data Options = Options {
@@ -76,8 +78,12 @@
 process opts fl = do
   t <- mapM read' fl
   writeFile (outputFile opts) $ writePOTFile $ map (\(n,c) -> formatMessages n $ toTranslate (keyword opts) $ parseModule c) t
-    where read' "-" = getContents >>= \s -> return ("-", s)
-          read' s = readFile s >>= \c -> return (s, c)
+    where read' "-" = do 
+                    s <- getContents
+                    return ("-", either id (\_ -> "") (unlit "-" s))
+          read' s = do 
+                    c <- readFile s
+                    return (s, either id (\_ -> "") (unlit s c))
 
 main = 
     getArgs >>= parseArgs >>= uncurry process
