[commit: packages/unix] master: Use CApiFFI for `ptsname(3)` et al for GHC>=8.0 (fb9b3eb)
git at git.haskell.org
git at git.haskell.org
Tue Apr 19 21:38:23 UTC 2016
Repository : ssh://git@git.haskell.org/unix
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/fb9b3eb74be56579deaa6e653686405e2e0463dd/unix
>---------------------------------------------------------------
commit fb9b3eb74be56579deaa6e653686405e2e0463dd
Author: Herbert Valerio Riedel <hvr at gnu.org>
Date: Sun Jan 31 12:34:59 2016 +0100
Use CApiFFI for `ptsname(3)` et al for GHC>=8.0
This improves on 2ddf4b2b7bf41f878bc7d8a1afa49126710f524c
>---------------------------------------------------------------
fb9b3eb74be56579deaa6e653686405e2e0463dd
System/Posix/Terminal.hsc | 15 +++++++++++++++
System/Posix/Terminal/ByteString.hsc | 17 ++++++++++++++++-
cbits/HsUnix.c | 20 ++++----------------
include/HsUnix.h | 6 ------
4 files changed, 35 insertions(+), 23 deletions(-)
diff --git a/System/Posix/Terminal.hsc b/System/Posix/Terminal.hsc
index c1b3ff8..0545f40 100644
--- a/System/Posix/Terminal.hsc
+++ b/System/Posix/Terminal.hsc
@@ -134,8 +134,14 @@ getSlaveTerminalName (Fd fd) = do
s <- throwErrnoIfNull "getSlaveTerminalName" (c_ptsname fd)
peekFilePath s
+# if __GLASGOW_HASKELL__ < 800
+-- see comment in cbits/HsUnix.c
foreign import ccall unsafe "__hsunix_ptsname"
c_ptsname :: CInt -> IO CString
+# else
+foreign import capi unsafe "HsUnix.h ptsname"
+ c_ptsname :: CInt -> IO CString
+# endif
#else
getSlaveTerminalName _ =
ioError (errnoToIOError "getSlaveTerminalName" eNOSYS Nothing Nothing)
@@ -188,11 +194,20 @@ foreign import ccall unsafe "__hsunix_push_module"
c_push_module :: CInt -> CString -> IO CInt
#ifdef HAVE_PTSNAME
+# if __GLASGOW_HASKELL__ < 800
+-- see comment in cbits/HsUnix.c
foreign import ccall unsafe "__hsunix_grantpt"
c_grantpt :: CInt -> IO CInt
foreign import ccall unsafe "__hsunix_unlockpt"
c_unlockpt :: CInt -> IO CInt
+# else
+foreign import capi unsafe "HsUnix.h grantpt"
+ c_grantpt :: CInt -> IO CInt
+
+foreign import capi unsafe "HsUnix.h unlockpt"
+ c_unlockpt :: CInt -> IO CInt
+# endif
#else
c_grantpt :: CInt -> IO CInt
c_grantpt _ = return (fromIntegral 0)
diff --git a/System/Posix/Terminal/ByteString.hsc b/System/Posix/Terminal/ByteString.hsc
index d98a9c0..cd6e200 100644
--- a/System/Posix/Terminal/ByteString.hsc
+++ b/System/Posix/Terminal/ByteString.hsc
@@ -142,8 +142,14 @@ getSlaveTerminalName (Fd fd) = do
s <- throwErrnoIfNull "getSlaveTerminalName" (c_ptsname fd)
peekFilePath s
+# if __GLASGOW_HASKELL__ < 800
+-- see comment in cbits/HsUnix.c
foreign import ccall unsafe "__hsunix_ptsname"
c_ptsname :: CInt -> IO CString
+# else
+foreign import capi unsafe "HsUnix.h ptsname"
+ c_ptsname :: CInt -> IO CString
+# endif
#else
getSlaveTerminalName _ =
ioError (errnoToIOError "getSlaveTerminalName" eNOSYS Nothing Nothing)
@@ -195,12 +201,21 @@ pushModule (Fd fd) name =
foreign import ccall unsafe "__hsunix_push_module"
c_push_module :: CInt -> CString -> IO CInt
-#ifdef HAVE_PTSNAME
+#if HAVE_PTSNAME
+# if __GLASGOW_HASKELL__ < 800
+-- see comment in cbits/HsUnix.c
foreign import ccall unsafe "__hsunix_grantpt"
c_grantpt :: CInt -> IO CInt
foreign import ccall unsafe "__hsunix_unlockpt"
c_unlockpt :: CInt -> IO CInt
+# else
+foreign import capi unsafe "HsUnix.h grantpt"
+ c_grantpt :: CInt -> IO CInt
+
+foreign import capi unsafe "HsUnix.h unlockpt"
+ c_unlockpt :: CInt -> IO CInt
+# endif
#else
c_grantpt :: CInt -> IO CInt
c_grantpt _ = return (fromIntegral (0::Int))
diff --git a/cbits/HsUnix.c b/cbits/HsUnix.c
index 25fd8ad..5742b49 100644
--- a/cbits/HsUnix.c
+++ b/cbits/HsUnix.c
@@ -16,25 +16,14 @@ void *__hsunix_rtldNext (void) {return RTLD_NEXT;}
void *__hsunix_rtldDefault (void) {return RTLD_DEFAULT;}
#endif
-#ifdef HAVE_PTSNAME
+#if HAVE_PTSNAME && (__GLASGOW_HASKELL__ < 800)
// On Linux (and others), <stdlib.h> needs to be included while
// `_XOPEN_SOURCE` is already defined. However, GHCs before GHC 8.0
// didn't do that yet for CApiFFI, so we need this workaround here.
-char *__hsunix_ptsname(int fd)
-{
- return ptsname(fd);
-}
-
-int __hsunix_grantpt(int fd)
-{
- return grantpt(fd);
-}
-
-int __hsunix_unlockpt(int fd)
-{
- return unlockpt(fd);
-}
+char *__hsunix_ptsname(int fd) { return ptsname(fd); }
+int __hsunix_grantpt(int fd) { return grantpt(fd); }
+int __hsunix_unlockpt(int fd) { return unlockpt(fd); }
#endif
// push a SVR4 STREAMS module; do nothing if STREAMS not available
@@ -71,7 +60,6 @@ HsInt __hsunix_long_path_size(void) {
#endif
}
-
/*
* read an entry from the directory stream; opt for the
* re-entrant friendly way of doing this, if available.
diff --git a/include/HsUnix.h b/include/HsUnix.h
index 2f77d28..fb19f99 100644
--- a/include/HsUnix.h
+++ b/include/HsUnix.h
@@ -113,12 +113,6 @@ fall back to O_FSYNC, which should be the same */
# define WCOREDUMP(s) 0
#endif
-#ifdef HAVE_PTSNAME
-char *__hsunix_ptsname(int fd);
-int __hsunix_grantpt(int fd);
-int __hsunix_unlockpt(int fd);
-#endif
-
// push a SVR4 STREAMS module; do nothing if STREAMS not available
int __hsunix_push_module(int fd, const char *module);
More information about the ghc-commits
mailing list