posix-pty 0.2.1.1 → 0.2.2
raw patch · 3 files changed
+35/−19 lines, 3 filesdep ~basedep ~process
Dependency ranges changed: base, process
Files
- System/Posix/Pty.hs +4/−2
- cbits/fork_exec_with_pty.c +27/−4
- posix-pty.cabal +4/−13
System/Posix/Pty.hs view
@@ -54,6 +54,7 @@ import Control.Applicative #endif +import Control.Concurrent (withMVar) import Control.Exception (bracket, throwIO, ErrorCall(..)) import Control.Monad (when) @@ -74,7 +75,7 @@ import System.IO.Error (mkIOError, eofErrorType) import System.Posix.IO (fdReadBuf, fdWriteBuf,closeFd) import System.Posix.Types-import System.Process.Internals (mkProcessHandle, ProcessHandle)+import System.Process.Internals (mkProcessHandle, runInteractiveProcess_lock, ProcessHandle) import qualified System.Posix.Terminal as T import System.Posix.Terminal hiding@@ -225,7 +226,8 @@ bracket allocLists cleanupLists $ \(argv, env) -> do alloca $ \pidPtr -> do fd <- throwErrnoIfMinus1Retry "failed to fork or open pty" $- fork_exec_with_pty x y search path argv env pidPtr+ withMVar runInteractiveProcess_lock $ \_ ->+ fork_exec_with_pty x y search path argv env pidPtr pid <- peek pidPtr handle <- mkProcessHandle (fromIntegral pid) True
cbits/fork_exec_with_pty.c view
@@ -13,14 +13,20 @@ #if defined(__APPLE__) #include <util.h>-#elif defined(__linux__)+#elif defined(__GLIBC__) #include <pty.h>-#else /* bsd */+#else /* bsd without glibc */ #include <libutil.h> #endif #include <HsFFI.h> +#include "Rts.h"++// Rts internal API, not exposed in a public header file+extern void blockUserSignals(void);+extern void unblockUserSignals(void);+ #include "fork_exec_with_pty.h" /* Should be exported by unistd.h, but isn't on OSX. */@@ -48,11 +54,23 @@ ws.ws_row = sy; /* Fork and exec, returning the master pty. */+ blockUserSignals();+ stopTimer();+ *child_pid = forkpty(&pty, NULL, NULL, &ws);++ int ret = pty;+ switch (*child_pid) { case -1:+ unblockUserSignals();+ startTimer();+ return -1; case 0:+ /* Child process */+ unblockUserSignals();+ /* If an environment is specified, override the old one. */ if (env) environ = (char**) env; @@ -63,10 +81,15 @@ perror("exec failed"); exit(EXIT_FAILURE); default:+ /* Parent process */+ /* Switch the pty to packet mode, we'll deal with packeting on the haskell side of things. */- if (ioctl(pty, TIOCPKT, &packet_mode) == -1) return 1;+ if (ioctl(pty, TIOCPKT, &packet_mode) == -1) ret = 1; - return pty;+ unblockUserSignals();+ startTimer();++ return ret; } }
posix-pty.cabal view
@@ -1,12 +1,12 @@ Name: posix-pty-Version: 0.2.1.1+Version: 0.2.2 Homepage: https://bitbucket.org/merijnv/posix-pty Bug-Reports: https://github.com/merijn/posix-pty/issues Author: Merijn Verstraaten Maintainer: Merijn Verstraaten <merijn@inconsistent.nl>-Copyright: Copyright © 2013-2015 Merijn Verstraaten,+Copyright: Copyright © 2013-2020 Merijn Verstraaten, Copyright © 2014 Vladimir Kirillov License: BSD3@@ -28,18 +28,17 @@ Library Default-Language: Haskell2010 GHC-Options: -Wall- GHC-Prof-Options: -auto-all -caf-all Exposed-Modules: System.Posix.Pty Other-Modules: C-Sources: cbits/fork_exec_with_pty.c cbits/pty_size.c- CC-Options: -Wall -Wextra -pedantic -std=c99+ CC-Options: -Wall -Wextra -std=c99 Include-Dirs: cbits Includes: fork_exec_with_pty.h pty_size.h Build-Depends: base >= 4 && < 5 , bytestring >= 0.10- , process >= 1.2+ , process >= 1.6.6.0 , unix >= 2.6 if os(linux) || os(freebsd)@@ -59,11 +58,3 @@ Source-Repository head Type: git Location: ssh://github.com:merijn/posix-pty.git--Source-Repository head- Type: mercurial- Location: git+ssh://github.com:merijn/posix-pty.git--Source-Repository head- Type: mercurial- Location: https://bitbucket.org/merijnv/posix-pty