[commit: process] master: Improved Unicode support (PEP383, Unicode env on Windows) (ccd64e5)
Max Bolingbroke
batterseapower at hotmail.com
Sun May 15 00:25:07 CEST 2011
Repository : ssh://darcs.haskell.org//srv/darcs/packages/process
On branch : master
http://hackage.haskell.org/trac/ghc/changeset/ccd64e56749f85a4839b839515548f07929c231e
>---------------------------------------------------------------
commit ccd64e56749f85a4839b839515548f07929c231e
Author: Max Bolingbroke <batterseapower at hotmail.com>
Date: Sat May 14 22:44:05 2011 +0100
Improved Unicode support (PEP383, Unicode env on Windows)
>---------------------------------------------------------------
System/Process/Internals.hs | 13 ++++++-------
cbits/runProcess.c | 8 +++++---
include/runProcess.h | 2 +-
3 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/System/Process/Internals.hs b/System/Process/Internals.hs
index 2c984ad..b68f268 100644
--- a/System/Process/Internals.hs
+++ b/System/Process/Internals.hs
@@ -236,8 +236,8 @@ runGenProcess_ fun CreateProcess{ cmdspec = cmdsp,
alloca $ \ pfdStdOutput ->
alloca $ \ pfdStdError ->
maybeWith withCEnvironment mb_env $ \pEnv ->
- maybeWith withCString mb_cwd $ \pWorkDir ->
- withMany withCString (cmd:args) $ \cstrs ->
+ maybeWith withFilePath mb_cwd $ \pWorkDir ->
+ withMany withFilePath (cmd:args) $ \cstrs ->
withArray0 nullPtr cstrs $ \pargs -> do
fdin <- mbFd fun fd_stdin mb_stdin
@@ -361,7 +361,7 @@ foreign import ccall unsafe "runInteractiveProcess"
c_runInteractiveProcess
:: CWString
-> CWString
- -> Ptr ()
+ -> Ptr CWString
-> FD
-> FD
-> FD
@@ -370,11 +370,10 @@ foreign import ccall unsafe "runInteractiveProcess"
-> Ptr FD
-> CInt -- flags
-> IO PHANDLE
+#endif
#endif /* __GLASGOW_HASKELL__ */
-#endif
-
fd_stdin, fd_stdout, fd_stderr :: FD
fd_stdin = 0
fd_stdout = 1
@@ -602,9 +601,9 @@ withCEnvironment envir act =
let env' = map (\(name, val) -> name ++ ('=':val)) envir
in withMany withCString env' (\pEnv -> withArray0 nullPtr pEnv act)
#else
-withCEnvironment :: [(String,String)] -> (Ptr () -> IO a) -> IO a
+withCEnvironment :: [(String,String)] -> (Ptr CWString -> IO a) -> IO a
withCEnvironment envir act =
let env' = foldr (\(name, val) env -> name ++ ('=':val)++'\0':env) "\0" envir
- in withCString env' (act . castPtr)
+ in withCWString env' (act . castPtr)
#endif
diff --git a/cbits/runProcess.c b/cbits/runProcess.c
index 2c1028f..6154d1d 100644
--- a/cbits/runProcess.c
+++ b/cbits/runProcess.c
@@ -107,6 +107,7 @@ runInteractiveProcess (char *const args[],
if ((flags & RUN_PROCESS_IN_NEW_GROUP) != 0) {
setpgid(0, 0);
}
+
unblockUserSignals();
if (workingDirectory) {
@@ -356,7 +357,7 @@ mkAnonPipe (HANDLE* pHandleIn, BOOL isInheritableIn,
ProcHandle
runInteractiveProcess (wchar_t *cmd, wchar_t *workingDirectory,
- void *environment,
+ wchar_t *environment,
int fdStdIn, int fdStdOut, int fdStdErr,
int *pfdStdInput, int *pfdStdOutput, int *pfdStdError,
int flags)
@@ -370,7 +371,8 @@ runInteractiveProcess (wchar_t *cmd, wchar_t *workingDirectory,
HANDLE hStdErrorRead = INVALID_HANDLE_VALUE;
HANDLE hStdErrorWrite = INVALID_HANDLE_VALUE;
BOOL close_fds = ((flags & RUN_PROCESS_IN_CLOSE_FDS) != 0);
- DWORD dwFlags = 0;
+ // We always pass a wide environment block, so we MUST set this flag
+ DWORD dwFlags = CREATE_UNICODE_ENVIRONMENT;
BOOL status;
BOOL inherit;
@@ -438,7 +440,7 @@ runInteractiveProcess (wchar_t *cmd, wchar_t *workingDirectory,
sInfo.hStdError = hStdErrorWrite;
}
- if (sInfo.hStdInput != GetStdHandle(STD_INPUT_HANDLE) &&
+ if (sInfo.hStdInput != GetStdHandle(STD_INPUT_HANDLE) &&
sInfo.hStdOutput != GetStdHandle(STD_OUTPUT_HANDLE) &&
sInfo.hStdError != GetStdHandle(STD_ERROR_HANDLE) &&
(flags & RUN_PROCESS_IN_NEW_GROUP) == 0)
diff --git a/include/runProcess.h b/include/runProcess.h
index 818a96f..7eb5c75 100644
--- a/include/runProcess.h
+++ b/include/runProcess.h
@@ -63,7 +63,7 @@ extern ProcHandle runInteractiveProcess( char *const args[],
extern ProcHandle runInteractiveProcess( wchar_t *cmd,
wchar_t *workingDirectory,
- void *environment,
+ wchar_t *environment,
int fdStdIn, int fdStdOut, int fdStdErr,
int *pfdStdInput,
int *pfdStdOutput,
More information about the Cvs-libraries
mailing list