|
79 | 79 | # define HAVE_FUTIMENS_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
|
80 | 80 | # define HAVE_UTIMENSAT_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
|
81 | 81 | # define HAVE_PWRITEV_RUNTIME __builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
| 82 | +# define HAVE_MKFIFOAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *) |
| 83 | +# define HAVE_MKNODAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *) |
82 | 84 |
|
83 | 85 | # define HAVE_POSIX_SPAWN_SETSID_RUNTIME __builtin_available(macOS 10.15, *)
|
84 | 86 |
|
|
163 | 165 | # define HAVE_FUTIMENS_RUNTIME 1
|
164 | 166 | # define HAVE_UTIMENSAT_RUNTIME 1
|
165 | 167 | # define HAVE_PWRITEV_RUNTIME 1
|
| 168 | +# define HAVE_MKFIFOAT_RUNTIME 1 |
| 169 | +# define HAVE_MKNODAT_RUNTIME 1 |
166 | 170 | #endif
|
167 | 171 |
|
168 | 172 |
|
@@ -10482,18 +10486,35 @@ os_mkfifo_impl(PyObject *module, path_t *path, int mode, int dir_fd)
|
10482 | 10486 | {
|
10483 | 10487 | int result;
|
10484 | 10488 | int async_err = 0;
|
| 10489 | +#ifdef HAVE_MKFIFOAT |
| 10490 | + int mkfifoat_unavailable = 0; |
| 10491 | +#endif |
10485 | 10492 |
|
10486 | 10493 | do {
|
10487 | 10494 | Py_BEGIN_ALLOW_THREADS
|
10488 | 10495 | #ifdef HAVE_MKFIFOAT
|
10489 |
| - if (dir_fd != DEFAULT_DIR_FD) |
10490 |
| - result = mkfifoat(dir_fd, path->narrow, mode); |
10491 |
| - else |
| 10496 | + if (dir_fd != DEFAULT_DIR_FD) { |
| 10497 | + if (HAVE_MKFIFOAT_RUNTIME) { |
| 10498 | + result = mkfifoat(dir_fd, path->narrow, mode); |
| 10499 | + |
| 10500 | + } else { |
| 10501 | + mkfifoat_unavailable = 1; |
| 10502 | + result = 0; |
| 10503 | + } |
| 10504 | + } else |
10492 | 10505 | #endif
|
10493 | 10506 | result = mkfifo(path->narrow, mode);
|
10494 | 10507 | Py_END_ALLOW_THREADS
|
10495 | 10508 | } while (result != 0 && errno == EINTR &&
|
10496 | 10509 | !(async_err = PyErr_CheckSignals()));
|
| 10510 | + |
| 10511 | +#ifdef HAVE_MKFIFOAT |
| 10512 | + if (mkfifoat_unavailable) { |
| 10513 | + argument_unavailable_error(NULL, "dir_fd"); |
| 10514 | + return NULL; |
| 10515 | + } |
| 10516 | +#endif |
| 10517 | + |
10497 | 10518 | if (result != 0)
|
10498 | 10519 | return (!async_err) ? posix_error() : NULL;
|
10499 | 10520 |
|
@@ -10534,18 +10555,33 @@ os_mknod_impl(PyObject *module, path_t *path, int mode, dev_t device,
|
10534 | 10555 | {
|
10535 | 10556 | int result;
|
10536 | 10557 | int async_err = 0;
|
| 10558 | +#ifdef HAVE_MKNODAT |
| 10559 | + int mknodat_unavailable = 0; |
| 10560 | +#endif |
10537 | 10561 |
|
10538 | 10562 | do {
|
10539 | 10563 | Py_BEGIN_ALLOW_THREADS
|
10540 | 10564 | #ifdef HAVE_MKNODAT
|
10541 |
| - if (dir_fd != DEFAULT_DIR_FD) |
10542 |
| - result = mknodat(dir_fd, path->narrow, mode, device); |
10543 |
| - else |
| 10565 | + if (dir_fd != DEFAULT_DIR_FD) { |
| 10566 | + if (HAVE_MKNODAT_RUNTIME) { |
| 10567 | + result = mknodat(dir_fd, path->narrow, mode, device); |
| 10568 | + |
| 10569 | + } else { |
| 10570 | + mknodat_unavailable = 1; |
| 10571 | + result = 0; |
| 10572 | + } |
| 10573 | + } else |
10544 | 10574 | #endif
|
10545 | 10575 | result = mknod(path->narrow, mode, device);
|
10546 | 10576 | Py_END_ALLOW_THREADS
|
10547 | 10577 | } while (result != 0 && errno == EINTR &&
|
10548 | 10578 | !(async_err = PyErr_CheckSignals()));
|
| 10579 | +#ifdef HAVE_MKNODAT |
| 10580 | + if (mknodat_unavailable) { |
| 10581 | + argument_unavailable_error(NULL, "dir_fd"); |
| 10582 | + return NULL; |
| 10583 | + } |
| 10584 | +#endif |
10549 | 10585 | if (result != 0)
|
10550 | 10586 | return (!async_err) ? posix_error() : NULL;
|
10551 | 10587 |
|
@@ -15265,6 +15301,14 @@ PROBE(probe_fdopendir, HAVE_FDOPENDIR_RUNTIME)
|
15265 | 15301 | PROBE(probe_mkdirat, HAVE_MKDIRAT_RUNTIME)
|
15266 | 15302 | #endif
|
15267 | 15303 |
|
| 15304 | +#ifdef HAVE_MKFIFOAT |
| 15305 | +PROBE(probe_mkfifoat, HAVE_MKFIFOAT_RUNTIME) |
| 15306 | +#endif |
| 15307 | + |
| 15308 | +#ifdef HAVE_MKNODAT |
| 15309 | +PROBE(probe_mknodat, HAVE_MKNODAT_RUNTIME) |
| 15310 | +#endif |
| 15311 | + |
15268 | 15312 | #ifdef HAVE_RENAMEAT
|
15269 | 15313 | PROBE(probe_renameat, HAVE_RENAMEAT_RUNTIME)
|
15270 | 15314 | #endif
|
@@ -15394,11 +15438,11 @@ static const struct have_function {
|
15394 | 15438 | #endif
|
15395 | 15439 |
|
15396 | 15440 | #ifdef HAVE_MKFIFOAT
|
15397 |
| - { "HAVE_MKFIFOAT", NULL }, |
| 15441 | + { "HAVE_MKFIFOAT", probe_mkfifoat }, |
15398 | 15442 | #endif
|
15399 | 15443 |
|
15400 | 15444 | #ifdef HAVE_MKNODAT
|
15401 |
| - { "HAVE_MKNODAT", NULL }, |
| 15445 | + { "HAVE_MKNODAT", probe_mknodat }, |
15402 | 15446 | #endif
|
15403 | 15447 |
|
15404 | 15448 | #ifdef HAVE_OPENAT
|
|
0 commit comments