mirror of
https://github.com/janet-lang/janet
synced 2024-12-27 00:40:26 +00:00
Fix some issues in os.c to diagnose improve windows subprocess code.
This commit is contained in:
parent
1f6d0d342b
commit
4df1ac5b23
@ -1,4 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
|
*
|
||||||
* Copyright (c) 2021 Calvin Rose
|
* Copyright (c) 2021 Calvin Rose
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
@ -590,7 +591,7 @@ static const JanetAbstractType ProcAT = {
|
|||||||
|
|
||||||
static JanetHandle janet_getjstream(Janet *argv, int32_t n, void **orig) {
|
static JanetHandle janet_getjstream(Janet *argv, int32_t n, void **orig) {
|
||||||
#ifdef JANET_EV
|
#ifdef JANET_EV
|
||||||
JanetStream *stream = janet_checkabstract(argv[0], &janet_stream_type);
|
JanetStream *stream = janet_checkabstract(argv[n], &janet_stream_type);
|
||||||
if (stream != NULL) {
|
if (stream != NULL) {
|
||||||
if (stream->flags & JANET_STREAM_CLOSED)
|
if (stream->flags & JANET_STREAM_CLOSED)
|
||||||
janet_panic("stream is closed");
|
janet_panic("stream is closed");
|
||||||
@ -598,7 +599,7 @@ static JanetHandle janet_getjstream(Janet *argv, int32_t n, void **orig) {
|
|||||||
return stream->handle;
|
return stream->handle;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
JanetFile *f = janet_checkabstract(argv[0], &janet_file_type);
|
JanetFile *f = janet_checkabstract(argv[n], &janet_file_type);
|
||||||
if (f != NULL) {
|
if (f != NULL) {
|
||||||
if (f->flags & JANET_FILE_CLOSED) {
|
if (f->flags & JANET_FILE_CLOSED) {
|
||||||
janet_panic("file is closed");
|
janet_panic("file is closed");
|
||||||
@ -670,6 +671,7 @@ static Janet os_execute_impl(int32_t argc, Janet *argv, int is_spawn) {
|
|||||||
uint64_t flags = 0;
|
uint64_t flags = 0;
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
flags = janet_getflags(argv, 1, "epx");
|
flags = janet_getflags(argv, 1, "epx");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get environment */
|
/* Get environment */
|
||||||
@ -704,7 +706,7 @@ static Janet os_execute_impl(int32_t argc, Janet *argv, int is_spawn) {
|
|||||||
} else if (!janet_checktype(maybe_stdout, JANET_NIL)) {
|
} else if (!janet_checktype(maybe_stdout, JANET_NIL)) {
|
||||||
new_out = janet_getjstream(&maybe_stdout, 0, &orig_out);
|
new_out = janet_getjstream(&maybe_stdout, 0, &orig_out);
|
||||||
}
|
}
|
||||||
if (janet_keyeq(maybe_stderr, "err")) {
|
if (janet_keyeq(maybe_stderr, "pipe")) {
|
||||||
new_err = make_pipes(&pipe_err, 0, &pipe_errflag);
|
new_err = make_pipes(&pipe_err, 0, &pipe_errflag);
|
||||||
} else if (!janet_checktype(maybe_stderr, JANET_NIL)) {
|
} else if (!janet_checktype(maybe_stderr, JANET_NIL)) {
|
||||||
new_err = janet_getjstream(&maybe_stderr, 0, &orig_err);
|
new_err = janet_getjstream(&maybe_stderr, 0, &orig_err);
|
||||||
@ -800,15 +802,6 @@ static Janet os_execute_impl(int32_t argc, Janet *argv, int is_spawn) {
|
|||||||
pHandle = processInfo.hProcess;
|
pHandle = processInfo.hProcess;
|
||||||
tHandle = processInfo.hThread;
|
tHandle = processInfo.hThread;
|
||||||
|
|
||||||
/* Wait and cleanup immedaitely */
|
|
||||||
if (!is_spawn) {
|
|
||||||
DWORD code;
|
|
||||||
WaitForSingleObject(pHandle, INFINITE);
|
|
||||||
GetExitCodeProcess(pHandle, &code);
|
|
||||||
status = (int) code;
|
|
||||||
CloseHandle(pHandle);
|
|
||||||
CloseHandle(tHandle);
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
const char **child_argv = janet_smalloc(sizeof(char *) * ((size_t) exargs.len + 1));
|
const char **child_argv = janet_smalloc(sizeof(char *) * ((size_t) exargs.len + 1));
|
||||||
@ -890,15 +883,15 @@ static Janet os_execute_impl(int32_t argc, Janet *argv, int is_spawn) {
|
|||||||
proc->out = NULL;
|
proc->out = NULL;
|
||||||
proc->err = NULL;
|
proc->err = NULL;
|
||||||
if (new_in != JANET_HANDLE_NONE) {
|
if (new_in != JANET_HANDLE_NONE) {
|
||||||
proc->in = get_stdio_for_handle(new_in, orig_in, 0);
|
proc->in = get_stdio_for_handle(new_in, orig_in, 1);
|
||||||
if (NULL == proc->in) janet_panic("failed to construct proc");
|
if (NULL == proc->in) janet_panic("failed to construct proc");
|
||||||
}
|
}
|
||||||
if (new_out != JANET_HANDLE_NONE) {
|
if (new_out != JANET_HANDLE_NONE) {
|
||||||
proc->out = get_stdio_for_handle(new_out, orig_out, 1);
|
proc->out = get_stdio_for_handle(new_out, orig_out, 0);
|
||||||
if (NULL == proc->out) janet_panic("failed to construct proc");
|
if (NULL == proc->out) janet_panic("failed to construct proc");
|
||||||
}
|
}
|
||||||
if (new_err != JANET_HANDLE_NONE) {
|
if (new_err != JANET_HANDLE_NONE) {
|
||||||
proc->err = get_stdio_for_handle(new_err, orig_err, 1);
|
proc->err = get_stdio_for_handle(new_err, orig_err, 0);
|
||||||
if (NULL == proc->err) janet_panic("failed to construct proc");
|
if (NULL == proc->err) janet_panic("failed to construct proc");
|
||||||
}
|
}
|
||||||
proc->flags = 0;
|
proc->flags = 0;
|
||||||
|
@ -83,4 +83,9 @@
|
|||||||
|
|
||||||
(assert-error "bad arity to ev/call" (ev/call inc 1 2 3))
|
(assert-error "bad arity to ev/call" (ev/call inc 1 2 3))
|
||||||
|
|
||||||
|
# Subprocess
|
||||||
|
(let [p (os/spawn [(dyn :executable) "-e" `(print "hello")`] :p {:out :pipe})]
|
||||||
|
(assert (deep= @"hello\n" (:read (p :out) :all)) "capture stdout from os/spawn")
|
||||||
|
(os/proc-wait p))
|
||||||
|
|
||||||
(end-suite)
|
(end-suite)
|
||||||
|
Loading…
Reference in New Issue
Block a user