Skip to content
Snippets Groups Projects
Commit bf46721d authored by deian's avatar deian Committed by dterei
Browse files

System.Posix.Temp compliance

parent 15226db1
No related branches found
No related tags found
No related merge requests found
......@@ -6,9 +6,10 @@
-- |
-- Module : System.Posix.Temp
-- Copyright : (c) Volker Stolz <vs@foldr.org>
-- Deian Stefan <deian@cs.stanford.edu>
-- License : BSD-style (see the file libraries/base/LICENSE)
--
-- Maintainer : libraries@haskell.org
-- Maintainer : libraries@haskell.org, vs@foldr.org, deian@cs.stanford.edu
-- Stability : provisional
-- Portability : non-portable (requires POSIX)
--
......@@ -22,6 +23,7 @@ module System.Posix.Temp (
#include "HsUnix.h"
import Control.Exception (throwIO)
import System.IO
import System.Posix.IO
import System.Posix.Types
......@@ -70,6 +72,10 @@ mkstemp template' = do
#endif
#if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
foreign import ccall unsafe "HsUnix.h __hscore_mkstemp"
c_mkstemp :: CString -> IO CInt
#endif
-- |'mkstemps' - make a unique filename with a given prefix and suffix
-- and open it for reading\/writing (only safe on GHC & Hugs).
-- The returned 'FilePath' is the (possibly relative) path of
......@@ -77,6 +83,7 @@ mkstemp template' = do
-- the prefix and suffix.
mkstemps :: String -> String -> IO (FilePath, Handle)
mkstemps prefix suffix = do
#if HAVE_MKSTEMPS
let template = prefix ++ "XXXXXX" ++ suffix
lenOfsuf :: CInt
lenOfsuf = fromIntegral $ length suffix
......@@ -85,7 +92,11 @@ mkstemps prefix suffix = do
name <- peekFilePath ptr
h <- fdToHandle (Fd fd)
return (name, h)
#else
throwIO . userError $ "mkstemps: System does not have a mkstemp C function."
#endif
#if HAVE_MKSTEMPS
foreign import ccall unsafe "HsUnix.h __hscore_mkstemps"
c_mkstemps :: CString -> CInt -> IO CInt
#endif
......@@ -99,7 +110,7 @@ foreign import ccall unsafe "HsUnix.h __hscore_mkstemps"
mkdtemp :: String -> IO FilePath
mkdtemp template' = do
let template = template' ++ "XXXXXX"
#if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
#if HAVE_MKDTEMP
withFilePath template $ \ ptr -> do
_ <- throwErrnoIfNull "mkdtemp" (c_mkdtemp ptr)
name <- peekFilePath ptr
......@@ -108,7 +119,14 @@ mkdtemp template' = do
name <- mktemp template
h <- createDirectory name (toEnum 0o700)
return name
#endif
#if HAVE_MKDTEMP
foreign import ccall unsafe "HsUnix.h __hscore_mkdtemp"
c_mkdtemp :: CString -> IO CString
#endif
#if (!defined(__GLASGOW_HASKELL__) && !defined(__HUGS__)) || !HAVE_MKDTEMP
-- | Make a unique file name It is required that the template have six trailing
-- \'X\'s. This function should be considered deprecated.
{-# WARNING mktemp "This function is unsafe; use mkstemp instead" #-}
......@@ -122,9 +140,3 @@ foreign import ccall unsafe "mktemp"
c_mktemp :: CString -> IO CString
#endif
foreign import ccall unsafe "HsUnix.h __hscore_mkstemp"
c_mkstemp :: CString -> IO CInt
foreign import ccall unsafe "HsUnix.h __hscore_mkdtemp"
c_mkdtemp :: CString -> IO CString
......@@ -6,9 +6,10 @@
-- |
-- Module : System.Posix.Temp.ByteString
-- Copyright : (c) Volker Stolz <vs@foldr.org>
-- Deian Stefan <deian@cs.stanford.edu>
-- License : BSD-style (see the file libraries/base/LICENSE)
--
-- Maintainer : libraries@haskell.org
-- Maintainer : libraries@haskell.org, vs@foldr.org, deian@cs.stanford.edu
-- Stability : provisional
-- Portability : non-portable (requires POSIX)
--
......@@ -22,6 +23,8 @@ module System.Posix.Temp.ByteString (
#include "HsUnix.h"
import Control.Exception (throwIO)
import System.IO
import System.Posix.IO
import System.Posix.Types
......@@ -61,6 +64,10 @@ mkstemp template' = do
#endif
#if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
foreign import ccall unsafe "HsUnix.h __hscore_mkstemp"
c_mkstemp :: CString -> IO CInt
#endif
-- |'mkstemps' - make a unique filename with a given prefix and suffix
-- and open it for reading\/writing (only safe on GHC & Hugs).
-- The returned 'RawFilePath' is the (possibly relative) path of
......@@ -68,6 +75,7 @@ mkstemp template' = do
-- the prefix and suffix.
mkstemps :: ByteString -> ByteString -> IO (RawFilePath, Handle)
mkstemps prefix suffix = do
#if HAVE_MKSTEMPS
let template = prefix `B.append` (BC.pack "XXXXXX") `B.append` suffix
lenOfsuf :: CInt
lenOfsuf = fromIntegral $ B.length suffix
......@@ -76,7 +84,11 @@ mkstemps prefix suffix = do
name <- peekFilePath ptr
h <- fdToHandle (Fd fd)
return (name, h)
#else
throwIO . userError $ "mkstemps: System does not have a mkstemp C function."
#endif
#if HAVE_MKSTEMPS
foreign import ccall unsafe "HsUnix.h __hscore_mkstemps"
c_mkstemps :: CString -> CInt -> IO CInt
#endif
......@@ -90,7 +102,7 @@ foreign import ccall unsafe "HsUnix.h __hscore_mkstemps"
mkdtemp :: ByteString -> IO RawFilePath
mkdtemp template' = do
let template = template' `B.append` (BC.pack "XXXXXX")
#if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
#if HAVE_MKDTEMP
withFilePath template $ \ ptr -> do
_ <- throwErrnoIfNull "mkdtemp" (c_mkdtemp ptr)
name <- peekFilePath ptr
......@@ -99,7 +111,14 @@ mkdtemp template' = do
name <- mktemp template
h <- createDirectory (BC.unpack name) (toEnum 0o700)
return name
#endif
#if HAVE_MKDTEMP
foreign import ccall unsafe "HsUnix.h __hscore_mkdtemp"
c_mkdtemp :: CString -> IO CString
#endif
#if (!defined(__GLASGOW_HASKELL__) && !defined(__HUGS__)) || !HAVE_MKDTEMP
-- | Make a unique file name It is required that the template have six trailing
-- \'X\'s. This function should be considered deprecated.
{-# WARNING mktemp "This function is unsafe; use mkstemp instead" #-}
......@@ -113,9 +132,3 @@ foreign import ccall unsafe "mktemp"
c_mktemp :: CString -> IO CString
#endif
foreign import ccall unsafe "HsUnix.h __hscore_mkstemp"
c_mkstemp :: CString -> IO CInt
foreign import ccall unsafe "HsUnix.h __hscore_mkdtemp"
c_mkdtemp :: CString -> IO CString
......@@ -132,14 +132,21 @@ int __hsunix_push_module(int fd, const char *module)
int __hscore_mkstemp(char *filetemplate) {
return (mkstemp(filetemplate));
}
char *__hscore_mkdtemp(char *filetemplate) {
return (mkdtemp(filetemplate));
}
#endif
#if HAVE_MKSTEMPS
int __hscore_mkstemps(char *filetemplate, int suffixlen) {
return (mkstemps(filetemplate, suffixlen));
}
#endif
#if HAVE_MKDTEMP
char *__hscore_mkdtemp(char *filetemplate) {
return (mkdtemp(filetemplate));
}
#endif
#if !defined(__MINGW32__) && !defined(irix_HOST_OS)
int __hscore_getrlimit(int resource, struct rlimit *rlim) {
return (getrlimit(resource, rlim));
......
......@@ -34,6 +34,9 @@ AC_CHECK_FUNCS([ptsname])
AC_CHECK_FUNCS([setitimer])
AC_CHECK_FUNCS([readdir_r])
# Additional temp functions
AC_CHECK_FUNCS([mkstemps mkdtemp])
# Avoid adding rt if absent or unneeded
AC_CHECK_LIB(rt, shm_open, [EXTRA_LIBS="$EXTRA_LIBS rt" CFLAGS="$CFLAGS -lrt"])
......
......@@ -175,7 +175,13 @@ int __hsunix_push_module(int fd, const char *module);
#if !defined(__MINGW32__)
int __hscore_mkstemp(char *filetemplate);
#endif
#if HAVE_MKSTEMPS
int __hscore_mkstemps(char *filetemplate, int suffixlen);
#endif
#if HAVE_MKDTEMP
char *__hscore_mkdtemp(char *filetemplate);
#endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment