diff --git a/src/conf/janetconf.h b/src/conf/janetconf.h index aee3f4bc..b8875f7b 100644 --- a/src/conf/janetconf.h +++ b/src/conf/janetconf.h @@ -1,27 +1,4 @@ -/* -* Copyright (c) 2020 Calvin Rose -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to -* deal in the Software without restriction, including without limitation the -* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -* sell copies of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in -* all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -* IN THE SOFTWARE. -*/ - -/* This is an example janetconf.h file. This will be usually generated - * by the build system. */ +/* This will be generated by the build system if this file is not used */ #ifndef JANETCONF_H #define JANETCONF_H diff --git a/src/core/ev.c b/src/core/ev.c index 4c4f72dd..0a63e83f 100644 --- a/src/core/ev.c +++ b/src/core/ev.c @@ -1622,6 +1622,54 @@ void janet_ev_sendto_string(JanetStream *stream, JanetString str, void *dest, in } #endif +/* For a pipe ID */ +#ifdef JANET_WINDOWS +static volatile long PipeSerialNumber; +#endif + +int janet_make_pipe(JanetHandle handles[2]) { +#ifdef JANET_WINDOWS + /* + * 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. + */ + JanetHandle rhandle, whandle; + UCHAR PipeNameBuffer[MAX_PATH]; + sprintf(PipeNameBuffer, + "\\\\.\\Pipe\\JanetPipeFile.%08x.%08x", + GetCurrentProcessId(), + InterlockedIncrement(&PipeSerialNumber)); + rhandle = CreateNamedPipeA( + PipeNameBuffer, + PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE | PIPE_WAIT, + 1, /* Number of pipes */ + 4096, /* Out buffer size */ + 4096, /* In buffer size */ + 120 * 1000, /* Timeout in ms */ + NULL); + if (!rhandle) return -1; + whandle = CreateFileA( + PipeNameBuffer, + GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, + NULL); + if (whandle == INVALID_HANDLE_VALUE) { + CloseHandle(rhandle); + return -1; + } + handles[0] = rhandle; + handles[1] = whandle; + return 0; +#else + if (pipe(handles)) return -1; + return 0; +#endif +} + /* C functions */ static Janet cfun_ev_go(int32_t argc, Janet *argv) { diff --git a/src/core/os.c b/src/core/os.c index 4586d52a..07697fc9 100644 --- a/src/core/os.c +++ b/src/core/os.c @@ -1747,56 +1747,13 @@ static Janet os_open(int32_t argc, Janet *argv) { return janet_wrap_abstract(janet_stream(fd, stream_flags, NULL)); } -/* For a pipe ID */ -#ifdef JANET_WINDOWS -static volatile long PipeSerialNumber; -#endif - static Janet os_pipe(int32_t argc, Janet *argv) { (void) argv; janet_fixarity(argc, 0); -#ifdef JANET_WINDOWS - /* - * 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. - */ - JanetHandle rhandle, whandle; - UCHAR PipeNameBuffer[MAX_PATH]; - sprintf(PipeNameBuffer, - "\\\\.\\Pipe\\JanetPipeFile.%08x.%08x", - GetCurrentProcessId(), - InterlockedIncrement(&PipeSerialNumber)); - rhandle = CreateNamedPipeA( - PipeNameBuffer, - PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, - PIPE_TYPE_BYTE | PIPE_WAIT, - 1, /* Number of pipes */ - 4096, /* Out buffer size */ - 4096, /* In buffer size */ - 120 * 1000, /* Timeout in ms */ - NULL); - if (!rhandle) janet_panicv(janet_ev_lasterr()); - whandle = CreateFileA( - PipeNameBuffer, - GENERIC_WRITE, - 0, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, - NULL); - if (whandle == INVALID_HANDLE_VALUE) { - Janet x = janet_ev_lasterr(); - CloseHandle(rhandle); - janet_panicv(x); - } - JanetStream *reader = janet_stream(rhandle, JANET_STREAM_READABLE, NULL); - JanetStream *writer = janet_stream(whandle, JANET_STREAM_WRITABLE, NULL); -#else - int fds[2]; - if (pipe(fds)) janet_panicv(janet_ev_lasterr()); + JanetHandle fds[2]; + if (janet_make_pipe(fds)) janet_panicv(janet_ev_lasterr()); JanetStream *reader = janet_stream(fds[0], JANET_STREAM_READABLE, NULL); JanetStream *writer = janet_stream(fds[1], JANET_STREAM_WRITABLE, NULL); -#endif Janet tup[2] = {janet_wrap_abstract(reader), janet_wrap_abstract(writer)}; return janet_wrap_tuple(janet_tuple_n(tup, 2)); } diff --git a/src/core/util.h b/src/core/util.h index fc4b0aa7..c3f2fbfd 100644 --- a/src/core/util.h +++ b/src/core/util.h @@ -145,6 +145,7 @@ extern const JanetAbstractType janet_address_type; #ifdef JANET_EV void janet_lib_ev(JanetTable *env); void janet_ev_mark(void); +int janet_make_pipe(JanetHandle handles[2]); #endif #endif diff --git a/tools/patch-header.janet b/tools/patch-header.janet index bbc86653..af44aba0 100644 --- a/tools/patch-header.janet +++ b/tools/patch-header.janet @@ -1,12 +1,3 @@ # Patch janet.h - (def [_ janeth janetconf output] (dyn :args)) - -(def- replace-peg - (peg/compile - ~(% (* '(to `#include "janetconf.h"`) - (constant ,(slurp janetconf)) - (thru `#include "janetconf.h"`) - '(any 1))))) - -(spit output (first (peg/match replace-peg (slurp janeth)))) +(spit output (peg/replace `#include "janetconf.h"` (slurp janetconf) (slurp janeth)))