f"https://raw.githubusercontent.com/yhirose/cpp-httplib/{HTTPLIB_VERSION}/split.py": "split.py",
f"https://raw.githubusercontent.com/yhirose/cpp-httplib/{HTTPLIB_VERSION}/LICENSE": "vendor/cpp-httplib/LICENSE",
- "https://raw.githubusercontent.com/sheredom/subprocess.h/8671cee1fc09f11a70ce3782a0ee13177c3aa387/subprocess.h": "vendor/sheredom/subprocess.h",
+ "https://raw.githubusercontent.com/sheredom/subprocess.h/9ce0d701b6fb10f8f8c4445edd31e7c60a1237e3/subprocess.h": "vendor/sheredom/subprocess.h",
}
-# TODO @ngxson : this is temporary, to be removed in the future
-patches = [
- # https://github.com/sheredom/subprocess.h/pull/102
- "vendor/sheredom/patch-bsd.patch",
- # https://github.com/sheredom/subprocess.h/pull/101
- "vendor/sheredom/patch-windows-quote-backslash.patch",
- # https://github.com/sheredom/subprocess.h/pull/104
- # note: must be applied after patch-bsd.patch, they touch adjacent lines
- "vendor/sheredom/patch-glibc-older-than-2.29.patch",
-]
-
for url, filename in vendor.items():
print(f"downloading {url} to {filename}") # noqa: NP100
urllib.request.urlretrieve(url, filename)
-for patch in patches:
- print(f"applying {patch}") # noqa: NP100
- try:
- subprocess.check_call([
- "git", "apply", "--directory", os.path.dirname(patch), patch
- ])
- except Exception as e:
- print(f"Error: {e}") # noqa: NP100
- sys.exit(1)
-
print("Splitting httplib.h...") # noqa: NP100
try:
subprocess.check_call([
+++ /dev/null
-Fix build on NetBSD, which provides posix_spawn_file_actions_addchdir()
-but not the _np() variant.
-
-Upstream PR: https://github.com/sheredom/subprocess.h/pull/102
-Applied locally by scripts/sync_vendor.py until it is merged upstream.
-
-diff --git a/subprocess.h b/subprocess.h
-index 5e809023a4..74a4e006c7 100644
---- a/subprocess.h
-+++ b/subprocess.h
-@@ -1205,7 +1205,7 @@ cleanup:
-
- // Set working directory
- if (process_cwd) {
--#if defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED >= 260000
-+#if defined(__NetBSD__) || (defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED >= 260000)
- posix_error = posix_spawn_file_actions_addchdir(&actions, process_cwd);
- #else
- #if defined(__APPLE__) && defined(__clang__)
+++ /dev/null
-Fix building against glibc older than 2.29, which has no
-posix_spawn_file_actions_addchdir_np (the symbol is genuinely absent from
-libc.so, so no feature-test macro helps). Affects manylinux2014 (glibc 2.17)
-and manylinux_2_28, and was reported on RHEL 8.1. A requested process_cwd now
-fails with ENOSYS there instead of failing the build.
-
-Upstream PR: https://github.com/sheredom/subprocess.h/pull/104
-Applied locally by scripts/sync_vendor.py until it is merged upstream.
-
-(the README.md and test/ changes from the PR are omitted, we only vendor
-subprocess.h; rebased on top of patch-bsd.patch, so apply it after that one)
-
-diff --git a/subprocess.h b/subprocess.h
-index 1ef424a..c363393 100644
---- a/subprocess.h
-+++ b/subprocess.h
-@@ -274,6 +274,21 @@ subprocess_weak int subprocess_alive(struct subprocess_s *const process);
- #include <unistd.h>
- #endif
-
-+/* Whether subprocess_create_ex can honour process_cwd. glibc only gained
-+ posix_spawn_file_actions_addchdir_np in 2.29. Define this yourself to
-+ override the detection, for instance on musl older than 1.1.24. */
-+#if !defined(SUBPROCESS_HAVE_CWD)
-+#if defined(__GLIBC__)
-+#if __GLIBC_PREREQ(2, 29)
-+#define SUBPROCESS_HAVE_CWD 1
-+#else
-+#define SUBPROCESS_HAVE_CWD 0
-+#endif
-+#else
-+#define SUBPROCESS_HAVE_CWD 1
-+#endif
-+#endif
-+
- #if defined(_WIN32)
-
- #include <wchar.h>
-@@ -1219,6 +1234,8 @@ cleanup:
- if (process_cwd) {
- #if defined(__NetBSD__) || (defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED >= 260000)
- posix_error = posix_spawn_file_actions_addchdir(&actions, process_cwd);
-+#elif !SUBPROCESS_HAVE_CWD
-+ posix_error = ENOSYS;
- #else
- #if defined(__APPLE__) && defined(__clang__)
- #pragma clang diagnostic push
+++ /dev/null
-Fix Windows command line quoting of backslash runs: a trailing backslash, or
-backslashes preceding a double quote, were not doubled, so CommandLineToArgvW
-in the child parsed them as escapes and mangled the argument list.
-
-Upstream PR: https://github.com/sheredom/subprocess.h/pull/101
-Applied locally by scripts/sync_vendor.py until it is merged upstream.
-
-(the test/ changes from the PR are omitted, we only vendor subprocess.h)
-
-diff --git a/subprocess.h b/subprocess.h
-index 5e80902..b06ad4d 100644
---- a/subprocess.h
-+++ b/subprocess.h
-@@ -653,6 +653,7 @@ int subprocess_create_ex(const char *const commandLine[], int options,
- int wide_len;
- int i, j;
- int need_quoting;
-+ subprocess_size_t bs_run;
- unsigned long flags = 0;
- unsigned long last_error = 0;
- int result = subprocess_error_unknown;
-@@ -906,25 +907,29 @@ int subprocess_create_ex(const char *const commandLine[], int options,
- len++;
-
- // Quote the argument if it has a space in it
-- if (strpbrk(commandLine[i], "\t\v ") != SUBPROCESS_NULL ||
-- commandLine[i][0] == SUBPROCESS_NULL)
-+ need_quoting = strpbrk(commandLine[i], "\t\v ") != SUBPROCESS_NULL ||
-+ commandLine[i][0] == SUBPROCESS_NULL;
-+ if (need_quoting)
- len += 2;
-
-+ bs_run = 0;
- for (j = 0; '\0' != commandLine[i][j]; j++) {
-- switch (commandLine[i][j]) {
-- default:
-- break;
-- case '\\':
-- if (commandLine[i][j + 1] == '"') {
-- len++;
-- }
-+ len++;
-
-- break;
-- case '"':
-- len++;
-- break;
-+ if ('\\' == commandLine[i][j]) {
-+ bs_run++;
-+ } else {
-+ if ('"' == commandLine[i][j]) {
-+ // Duplicate the preceding run and escape the quote.
-+ len += bs_run + 1;
-+ }
-+ bs_run = 0;
- }
-- len++;
-+ }
-+
-+ if (need_quoting) {
-+ // Duplicate trailing slashes before the generated closing quote.
-+ len += bs_run;
- }
- }
-
-@@ -949,22 +954,29 @@ int subprocess_create_ex(const char *const commandLine[], int options,
- commandLineCombined[len++] = '"';
- }
-
-- for (j = 0; '\0' != commandLine[i][j]; j++) {
-- switch (commandLine[i][j]) {
-- default:
-- break;
-- case '\\':
-- if (commandLine[i][j + 1] == '"') {
-- commandLineCombined[len++] = '\\';
-- }
-+ for (j = 0; '\0' != commandLine[i][j];) {
-+ bs_run = 0;
-+ while ('\\' == commandLine[i][j]) {
-+ bs_run++;
-+ j++;
-+ }
-+
-+ if ('"' == commandLine[i][j]) {
-+ // 2n + 1 slashes preserve n slashes and escape the quote.
-+ bs_run = (bs_run * 2) + 1;
-+ } else if ('\0' == commandLine[i][j] && need_quoting) {
-+ // 2n slashes preserve n slashes before the closing quote.
-+ bs_run *= 2;
-+ }
-
-- break;
-- case '"':
-+ while (bs_run > 0) {
- commandLineCombined[len++] = '\\';
-- break;
-+ bs_run--;
- }
-
-- commandLineCombined[len++] = commandLine[i][j];
-+ if ('\0' != commandLine[i][j]) {
-+ commandLineCombined[len++] = commandLine[i][j++];
-+ }
- }
- if (need_quoting) {
- commandLineCombined[len++] = '"';
subprocess_error_permission_denied = -5,
subprocess_error_no_memory = -6,
subprocess_error_pipe = -7,
- subprocess_error_spawn = -8
+ subprocess_error_spawn = -8,
+ subprocess_error_not_supported = -9
};
#if defined(__cplusplus)
#endif
/* Whether subprocess_create_ex can honour process_cwd. glibc only gained
- posix_spawn_file_actions_addchdir_np in 2.29. Define this yourself to
- override the detection, for instance on musl older than 1.1.24. */
+ posix_spawn_file_actions_addchdir_np in 2.29, and macOS in 10.15; the SDKs
+ mark it unavailable on iOS, tvOS and watchOS, where the undefined version
+ macro folds to 0 and so answers correctly. Define this yourself to override
+ the detection, for instance on musl older than 1.1.24. */
#if !defined(SUBPROCESS_HAVE_CWD)
#if defined(__GLIBC__)
#if __GLIBC_PREREQ(2, 29)
#else
#define SUBPROCESS_HAVE_CWD 0
#endif
+#elif defined(__APPLE__) && MAC_OS_X_VERSION_MIN_REQUIRED < 101500
+#define SUBPROCESS_HAVE_CWD 0
#else
#define SUBPROCESS_HAVE_CWD 1
#endif
#endif
+/* Whether posix_spawn reports a failed exec back to the caller. glibc only
+ started doing so in 2.24; before that the child silently exits with 127. */
+#if !defined(SUBPROCESS_SPAWN_REPORTS_EXEC_ERRORS)
+#if defined(__GLIBC__)
+#if __GLIBC_PREREQ(2, 24)
+#define SUBPROCESS_SPAWN_REPORTS_EXEC_ERRORS 1
+#else
+#define SUBPROCESS_SPAWN_REPORTS_EXEC_ERRORS 0
+#endif
+#else
+#define SUBPROCESS_SPAWN_REPORTS_EXEC_ERRORS 1
+#endif
+#endif
+
#if defined(_WIN32)
#include <wchar.h>
case ENFILE:
case ENOMEM:
return subprocess_error_no_memory;
+ case ENOSYS:
+ return subprocess_error_not_supported;
default:
return subprocess_error_unknown;
}
goto cleanup;
}
} else {
+#if !SUBPROCESS_SPAWN_REPORTS_EXEC_ERRORS
+ /* posix_spawn cannot tell us the exec failed, so check up front */
+ if (0 != access(commandLine[0], X_OK)) {
+ saved_errno = errno;
+ result = subprocess_error_from_errno(saved_errno);
+ if (subprocess_error_unknown == result) {
+ result = subprocess_error_spawn;
+ }
+ goto cleanup;
+ }
+#endif
posix_error = posix_spawn(&child, commandLine[0], &actions,
SUBPROCESS_NULL,
SUBPROCESS_CONST_CAST(char *const *, commandLine),