1
0
mirror of https://github.com/janet-lang/janet synced 2024-11-24 17:27:18 +00:00

Pass non-blocking pipes to subprocesses on non-windows platform.

This commit is contained in:
Calvin Rose 2021-10-14 13:57:51 -05:00
parent a3ec37741a
commit 0774e79e4f

View File

@ -2558,15 +2558,16 @@ void janet_ev_sendto_string(JanetStream *stream, JanetString str, void *dest, in
static volatile long PipeSerialNumber; static volatile long PipeSerialNumber;
#endif #endif
/*
* mode = 0: both sides non-blocking.
* mode = 1: only read side non-blocking: write side sent to subprocess
* mode = 2: only write side non-blocking: read side sent to subprocess
*/
int janet_make_pipe(JanetHandle handles[2], int mode) { int janet_make_pipe(JanetHandle handles[2], int mode) {
#ifdef JANET_WINDOWS #ifdef JANET_WINDOWS
/* /*
* On windows, the built in CreatePipe function doesn't support overlapped IO * On windows, the built in CreatePipe function doesn't support overlapped IO
* so we lift from the windows source code and modify for our own version. * so we lift from the windows source code and modify for our own version.
*
* mode = 0: both sides non-blocking.
* mode = 1: only read side non-blocking: write side sent to subprocess
* mode = 2: only write side non-blocking: read side sent to subprocess
*/ */
JanetHandle shandle, chandle; JanetHandle shandle, chandle;
UCHAR PipeNameBuffer[MAX_PATH]; UCHAR PipeNameBuffer[MAX_PATH];
@ -2616,10 +2617,9 @@ int janet_make_pipe(JanetHandle handles[2], int mode) {
} }
return 0; return 0;
#else #else
(void) mode;
if (pipe(handles)) return -1; if (pipe(handles)) return -1;
if (fcntl(handles[0], F_SETFL, O_NONBLOCK)) goto error; if (mode != 2 && fcntl(handles[0], F_SETFL, O_NONBLOCK)) goto error;
if (fcntl(handles[1], F_SETFL, O_NONBLOCK)) goto error; if (mode != 1 && fcntl(handles[1], F_SETFL, O_NONBLOCK)) goto error;
return 0; return 0;
error: error:
close(handles[0]); close(handles[0]);