123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- diff --git a/.clang-tidy b/.clang-tidy
- index 35bb58f..de92997 100644
- --- a/.clang-tidy
- +++ b/.clang-tidy
- @@ -34,6 +34,7 @@ Checks:
- -performance-no-int-to-ptr,
- -readability-else-after-return,
- -readability-function-cognitive-complexity,
- +-readability-identifier-length,
- -readability-magic-numbers,
- '
- HeaderFilterRegex: '.*reproc\+\+.*$'
- diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
- index 4000454..3858f59 100644
- --- a/.github/workflows/main.yml
- +++ b/.github/workflows/main.yml
- @@ -74,7 +74,7 @@ jobs:
- - name: Install (Windows)
- if: runner.os == 'Windows'
- run: |
- - Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
- + iex "& {$(irm get.scoop.sh)} -RunAsAdmin"
- scoop install ninja llvm --global
-
- if ("${{ matrix.compiler }}" -eq "gcc") {
- diff --git a/README.md b/README.md
- index 62cc299..e7e940d 100644
- --- a/README.md
- +++ b/README.md
- @@ -225,6 +225,16 @@ occurred. You can test against these error codes using values from the
-
- See the examples for more information on how to handle errors when using reproc.
-
- +Note:
- +
- +Both reproc and reproc++ APIs take `options` argument that may define one or more
- +`stop` actions such as `terminate` or `kill`.
- +For that reason if the child process is being terminated or killed using a signal
- +on POSIX, the error code will **not** reflect an error.
- +
- +It's up to the downstream project to *interpret* status codes reflecting unexpected
- +behaviors alongside error codes (see this [example](https://github.com/DaanDeMeyer/reproc/issues/68#issuecomment-959074504)).
- +
- ## Multithreading
-
- Don't call the same operation on the same child process from more than one
- diff --git a/reproc++/include/reproc++/reproc.hpp b/reproc++/include/reproc++/reproc.hpp
- index ab6f139..f722245 100644
- --- a/reproc++/include/reproc++/reproc.hpp
- +++ b/reproc++/include/reproc++/reproc.hpp
- @@ -88,18 +88,18 @@ struct redirect {
-
- struct options {
- struct {
- - env::type behavior;
- + reproc::env::type behavior;
- /*! Implicitly converts from any STL container of string pairs to the
- environment format expected by `reproc_start`. */
- - class env extra;
- + reproc::env extra;
- } env = {};
-
- const char *working_directory = nullptr;
-
- struct {
- - redirect in;
- - redirect out;
- - redirect err;
- + struct redirect in;
- + struct redirect out;
- + struct redirect err;
- bool parent;
- bool discard;
- FILE *file;
- @@ -138,30 +138,12 @@ enum class stream {
- err,
- };
-
- -class process;
- -
- namespace event {
-
- -enum {
- - in = 1 << 0,
- - out = 1 << 1,
- - err = 1 << 2,
- - exit = 1 << 3,
- - deadline = 1 << 4,
- -};
- -
- -struct source {
- - class process &process;
- - int interests;
- - int events;
- -};
- +struct source;
-
- }
-
- -REPROCXX_EXPORT std::error_code poll(event::source *sources,
- - size_t num_sources,
- - milliseconds timeout = infinite);
- -
- /*! Improves on reproc's API by adding RAII and changing the API of some
- functions to be more idiomatic C++. */
- class process {
- @@ -220,4 +202,26 @@ private:
- std::unique_ptr<reproc_t, reproc_t *(*) (reproc_t *)> impl_;
- };
-
- +namespace event {
- +
- +enum {
- + in = 1 << 0,
- + out = 1 << 1,
- + err = 1 << 2,
- + exit = 1 << 3,
- + deadline = 1 << 4,
- +};
- +
- +struct source {
- + class process process;
- + int interests;
- + int events;
- +};
- +
- +}
- +
- +REPROCXX_EXPORT std::error_code poll(event::source *sources,
- + size_t num_sources,
- + milliseconds timeout = infinite);
- +
- }
- diff --git a/reproc++/src/reproc.cpp b/reproc++/src/reproc.cpp
- index e4eed1a..534e9fb 100644
- --- a/reproc++/src/reproc.cpp
- +++ b/reproc++/src/reproc.cpp
- @@ -86,8 +86,9 @@ std::pair<bool, std::error_code> process::fork(const options &options) noexcept
- std::pair<int, std::error_code> process::poll(int interests,
- milliseconds timeout)
- {
- - event::source source{ *this, interests, 0 };
- + event::source source{ std::move(*this), interests, 0 };
- std::error_code ec = ::reproc::poll(&source, 1, timeout);
- + *this = std::move(source.process);
- return { source.events, ec };
- }
-
- diff --git a/reproc/CMakeLists.txt b/reproc/CMakeLists.txt
- index 949cc88..1bb4798 100644
- --- a/reproc/CMakeLists.txt
- +++ b/reproc/CMakeLists.txt
- @@ -1,6 +1,6 @@
- if(WIN32)
- set(REPROC_WINSOCK_LIBRARY ws2_32)
- -elseif(NOT APPLE)
- +elseif(CMAKE_SYSTEM_NAME MATCHES Linux)
- set(REPROC_RT_LIBRARY rt) # clock_gettime
- endif()
-
- diff --git a/reproc/src/clock.windows.c b/reproc/src/clock.windows.c
- index 3130f85..8c6c85a 100644
- --- a/reproc/src/clock.windows.c
- +++ b/reproc/src/clock.windows.c
- @@ -1,4 +1,8 @@
- -#define _WIN32_WINNT _WIN32_WINNT_VISTA
- +#ifndef _WIN32_WINNT
- + #define _WIN32_WINNT 0x0600 // _WIN32_WINNT_VISTA
- +#elif _WIN32_WINNT < 0x0600
- + #error "_WIN32_WINNT must be greater than _WIN32_WINNT_VISTA (0x0600)"
- +#endif
-
- #include "clock.h"
-
- diff --git a/reproc/src/error.windows.c b/reproc/src/error.windows.c
- index b8d8234..9459027 100644
- --- a/reproc/src/error.windows.c
- +++ b/reproc/src/error.windows.c
- @@ -1,4 +1,8 @@
- -#define _WIN32_WINNT _WIN32_WINNT_VISTA
- +#ifndef _WIN32_WINNT
- + #define _WIN32_WINNT 0x0600 // _WIN32_WINNT_VISTA
- +#elif _WIN32_WINNT < 0x0600
- + #error "_WIN32_WINNT must be greater than _WIN32_WINNT_VISTA (0x0600)"
- +#endif
-
- #include "error.h"
-
- diff --git a/reproc/src/handle.windows.c b/reproc/src/handle.windows.c
- index e0cd500..f0fbe56 100644
- --- a/reproc/src/handle.windows.c
- +++ b/reproc/src/handle.windows.c
- @@ -1,4 +1,8 @@
- -#define _WIN32_WINNT _WIN32_WINNT_VISTA
- +#ifndef _WIN32_WINNT
- + #define _WIN32_WINNT 0x0600 // _WIN32_WINNT_VISTA
- +#elif _WIN32_WINNT < 0x0600
- + #error "_WIN32_WINNT must be greater than _WIN32_WINNT_VISTA (0x0600)"
- +#endif
-
- #include "handle.h"
-
- diff --git a/reproc/src/init.windows.c b/reproc/src/init.windows.c
- index 8357b7c..52519bf 100644
- --- a/reproc/src/init.windows.c
- +++ b/reproc/src/init.windows.c
- @@ -1,4 +1,8 @@
- -#define _WIN32_WINNT _WIN32_WINNT_VISTA
- +#ifndef _WIN32_WINNT
- + #define _WIN32_WINNT 0x0600 // _WIN32_WINNT_VISTA
- +#elif _WIN32_WINNT < 0x0600
- + #error "_WIN32_WINNT must be greater than _WIN32_WINNT_VISTA (0x0600)"
- +#endif
-
- #include "init.h"
-
- diff --git a/reproc/src/pipe.windows.c b/reproc/src/pipe.windows.c
- index bb355be..befeaf1 100644
- --- a/reproc/src/pipe.windows.c
- +++ b/reproc/src/pipe.windows.c
- @@ -1,4 +1,8 @@
- -#define _WIN32_WINNT _WIN32_WINNT_VISTA
- +#ifndef _WIN32_WINNT
- + #define _WIN32_WINNT 0x0600 // _WIN32_WINNT_VISTA
- +#elif _WIN32_WINNT < 0x0600
- + #error "_WIN32_WINNT must be greater than _WIN32_WINNT_VISTA (0x0600)"
- +#endif
-
- #include "pipe.h"
-
- diff --git a/reproc/src/process.posix.c b/reproc/src/process.posix.c
- index 0f0fe0d..8dcbfd1 100644
- --- a/reproc/src/process.posix.c
- +++ b/reproc/src/process.posix.c
- @@ -17,6 +17,8 @@
- #include "pipe.h"
- #include "strv.h"
-
- +#define CWD_BUF_SIZE_INCREMENT 4096
- +
- const pid_t PROCESS_INVALID = -1;
-
- static int signal_mask(int how, const sigset_t *newmask, sigset_t *oldmask)
- @@ -51,7 +53,7 @@ static char *path_prepend_cwd(const char *path)
- ASSERT(path);
-
- size_t path_size = strlen(path);
- - size_t cwd_size = PATH_MAX;
- + size_t cwd_size = CWD_BUF_SIZE_INCREMENT;
-
- // We always allocate sufficient space for `path` but do not include this
- // space in `cwd_size` so we can be sure that when `getcwd` succeeds there is
- @@ -70,7 +72,7 @@ static char *path_prepend_cwd(const char *path)
- return NULL;
- }
-
- - cwd_size += PATH_MAX;
- + cwd_size += CWD_BUF_SIZE_INCREMENT;
-
- char *result = realloc(cwd, cwd_size + path_size + 1);
- if (result == NULL) {
- diff --git a/reproc/src/process.windows.c b/reproc/src/process.windows.c
- index 666f3cb..6e28589 100644
- --- a/reproc/src/process.windows.c
- +++ b/reproc/src/process.windows.c
- @@ -1,4 +1,8 @@
- -#define _WIN32_WINNT _WIN32_WINNT_VISTA
- +#ifndef _WIN32_WINNT
- + #define _WIN32_WINNT 0x0600 // _WIN32_WINNT_VISTA
- +#elif _WIN32_WINNT < 0x0600
- + #error "_WIN32_WINNT must be greater than _WIN32_WINNT_VISTA (0x0600)"
- +#endif
-
- #include "process.h"
-
- diff --git a/reproc/src/redirect.windows.c b/reproc/src/redirect.windows.c
- index c634145..151f407 100644
- --- a/reproc/src/redirect.windows.c
- +++ b/reproc/src/redirect.windows.c
- @@ -1,4 +1,8 @@
- -#define _WIN32_WINNT _WIN32_WINNT_VISTA
- +#ifndef _WIN32_WINNT
- + #define _WIN32_WINNT 0x0600 // _WIN32_WINNT_VISTA
- +#elif _WIN32_WINNT < 0x0600
- + #error "_WIN32_WINNT must be greater than _WIN32_WINNT_VISTA (0x0600)"
- +#endif
-
- #include "redirect.h"
-
|