~ chicken-core (chicken-5) 2477220de9c5663417f1d2626b34a3f71fc68992
commit 2477220de9c5663417f1d2626b34a3f71fc68992
Author: Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Fri Nov 22 20:34:30 2013 +0100
Commit: Christian Kellermann <ckeen@pestilenz.org>
CommitDate: Wed Dec 11 11:01:35 2013 +0100
Fix "process" under Windows and fix general error handling under Windows.
- In PROCESS, don't try to mark duplicated descriptors from the parent
process as inheritable; this isn't allowed (and they should already
be inheritable or you can't duplicate them, and we duplicate with
SAME_ACCESS anyway).
- In PROCESS[*], don't try to close handles that haven't been opened.
- When setting the errno for nonexisting error, don't loop endlessly.
- When no error is known, just set it to ENOTSUP (what to do?)
- Add simple regression test for process/process*.
Signed-off-by: Christian Kellermann <ckeen@pestilenz.org>
diff --git a/NEWS b/NEWS
index 56987d05..36b53aec 100644
--- a/NEWS
+++ b/NEWS
@@ -13,10 +13,12 @@
use modules and forgot to require ports but use procedures from it.
- Support has been added for the space-safe R7RS macro "delay-force".
- Export file-type from the posix unit (thanks to Alan Post).
- - unsetenv has been fixed on Windows.
- SRFI-4 s8vectors now work correctly in compiled code on PowerPC and ARM.
- thread-join! now works correctly even if the waiting thread was
prematurely woken up by a signal.
+ - unsetenv has been fixed on Windows.
+ - The process procedure has been fixed on Windows.
+ - The posix unit will no longer hang upon any error in Windows.
- Platform support
- CHICKEN can now be built on AIX (contributed by Erik Falor)
diff --git a/posixwin.scm b/posixwin.scm
index b8ae2da0..ede7e094 100644
--- a/posixwin.scm
+++ b/posixwin.scm
@@ -367,15 +367,16 @@ static errmap_t errmap[] =
static void C_fcall
set_errno(DWORD w32err)
{
- errmap_t *map = errmap;
- for (; errmap->win32; ++map)
+ errmap_t *map;
+ for (map = errmap; map->win32; ++map)
{
- if (errmap->win32 == w32err)
+ if (map->win32 == w32err)
{
- errno = errmap->libc;
+ errno = map->libc;
return;
}
}
+ errno = ENOSYS; /* For lack of anything better */
}
static int C_fcall
@@ -783,15 +784,13 @@ C_process(const char * app, const char * cmdlin, const char ** env,
if (modes[i]=='r') { child_io_handles[i]=a; parent_end=b; }
else { parent_end=a; child_io_handles[i]=b; }
success = (io_fds[i] = _open_osfhandle((C_word)parent_end,0)) >= 0;
+ /* Make new handle inheritable */
+ if (success)
+ success = SetHandleInformation(child_io_handles[i], HANDLE_FLAG_INHERIT, -1);
}
}
}
- /****** make handles inheritable */
-
- for (i=0; i<3 && success; ++i)
- success = SetHandleInformation(child_io_handles[i], HANDLE_FLAG_INHERIT, -1);
-
#if 0 /* Requires a sorted list by key! */
/****** create environment block if necessary ****/
@@ -851,7 +850,10 @@ C_process(const char * app, const char * cmdlin, const char ** env,
/****** cleanup & return *********/
/* parent must close child end */
- for (i=0; i<3; ++i) CloseHandle(child_io_handles[i]);
+ for (i=0; i<3; ++i) {
+ if (child_io_handles[i] != NULL)
+ CloseHandle(child_io_handles[i]);
+ }
if (success)
{
@@ -862,7 +864,10 @@ C_process(const char * app, const char * cmdlin, const char ** env,
}
else
{
- for (i=0; i<3; ++i) _close(io_fds[i]);
+ for (i=0; i<3; ++i) {
+ if (io_fds[i] != -1)
+ _close(io_fds[i]);
+ }
}
return success;
diff --git a/tests/posix-tests.scm b/tests/posix-tests.scm
index f2273974..4459e36e 100644
--- a/tests/posix-tests.scm
+++ b/tests/posix-tests.scm
@@ -32,6 +32,17 @@
(assert-error (process-execute "false" '("1" "123\x00456")))
(assert-error (process-execute "false" '("123\x00456") '("foo\x00bar" "blabla") '("lalala" "qux\x00mooh")))
+(receive (in out pid)
+ (process "../csi" '("-n" "-e"
+ "(write 'err (current-error-port)) (write 'ok)"))
+ (assert (equal? 'ok (read in))))
+
+(receive (in out pid err)
+ (process* "../csi" '("-n" "-e"
+ "(write 'err (current-error-port)) (write 'ok)"))
+ (assert (equal? 'ok (read in)))
+ (assert (equal? 'err (read err))))
+
(let ((tnpfilpn (create-temporary-file)))
(let ((tmpfilno (file-open tnpfilpn (+ open/rdwr open/creat)))
(data "abcde")
Trap