|
85 | 85 | # define HAVE_FUTIMENS_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
|
86 | 86 | # define HAVE_UTIMENSAT_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
|
87 | 87 | # define HAVE_PWRITEV_RUNTIME __builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
| 88 | +# define HAVE_MKFIFOAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *) |
| 89 | +# define HAVE_MKNODAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *) |
88 | 90 |
|
89 | 91 | # define HAVE_POSIX_SPAWN_SETSID_RUNTIME __builtin_available(macOS 10.15, *)
|
90 | 92 |
|
|
169 | 171 | # define HAVE_FUTIMENS_RUNTIME 1
|
170 | 172 | # define HAVE_UTIMENSAT_RUNTIME 1
|
171 | 173 | # define HAVE_PWRITEV_RUNTIME 1
|
| 174 | +# define HAVE_MKFIFOAT_RUNTIME 1 |
| 175 | +# define HAVE_MKNODAT_RUNTIME 1 |
172 | 176 | #endif
|
173 | 177 |
|
174 | 178 |
|
@@ -10554,18 +10558,35 @@ os_mkfifo_impl(PyObject *module, path_t *path, int mode, int dir_fd)
|
10554 | 10558 | {
|
10555 | 10559 | int result;
|
10556 | 10560 | int async_err = 0;
|
| 10561 | +#ifdef HAVE_MKFIFOAT |
| 10562 | + int mkfifoat_unavailable = 0; |
| 10563 | +#endif |
10557 | 10564 |
|
10558 | 10565 | do {
|
10559 | 10566 | Py_BEGIN_ALLOW_THREADS
|
10560 | 10567 | #ifdef HAVE_MKFIFOAT
|
10561 |
| - if (dir_fd != DEFAULT_DIR_FD) |
10562 |
| - result = mkfifoat(dir_fd, path->narrow, mode); |
10563 |
| - else |
| 10568 | + if (dir_fd != DEFAULT_DIR_FD) { |
| 10569 | + if (HAVE_MKFIFOAT_RUNTIME) { |
| 10570 | + result = mkfifoat(dir_fd, path->narrow, mode); |
| 10571 | + |
| 10572 | + } else { |
| 10573 | + mkfifoat_unavailable = 1; |
| 10574 | + result = 0; |
| 10575 | + } |
| 10576 | + } else |
10564 | 10577 | #endif
|
10565 | 10578 | result = mkfifo(path->narrow, mode);
|
10566 | 10579 | Py_END_ALLOW_THREADS
|
10567 | 10580 | } while (result != 0 && errno == EINTR &&
|
10568 | 10581 | !(async_err = PyErr_CheckSignals()));
|
| 10582 | + |
| 10583 | +#ifdef HAVE_MKFIFOAT |
| 10584 | + if (mkfifoat_unavailable) { |
| 10585 | + argument_unavailable_error(NULL, "dir_fd"); |
| 10586 | + return NULL; |
| 10587 | + } |
| 10588 | +#endif |
| 10589 | + |
10569 | 10590 | if (result != 0)
|
10570 | 10591 | return (!async_err) ? posix_error() : NULL;
|
10571 | 10592 |
|
@@ -10606,18 +10627,33 @@ os_mknod_impl(PyObject *module, path_t *path, int mode, dev_t device,
|
10606 | 10627 | {
|
10607 | 10628 | int result;
|
10608 | 10629 | int async_err = 0;
|
| 10630 | +#ifdef HAVE_MKNODAT |
| 10631 | + int mknodat_unavailable = 0; |
| 10632 | +#endif |
10609 | 10633 |
|
10610 | 10634 | do {
|
10611 | 10635 | Py_BEGIN_ALLOW_THREADS
|
10612 | 10636 | #ifdef HAVE_MKNODAT
|
10613 |
| - if (dir_fd != DEFAULT_DIR_FD) |
10614 |
| - result = mknodat(dir_fd, path->narrow, mode, device); |
10615 |
| - else |
| 10637 | + if (dir_fd != DEFAULT_DIR_FD) { |
| 10638 | + if (HAVE_MKNODAT_RUNTIME) { |
| 10639 | + result = mknodat(dir_fd, path->narrow, mode, device); |
| 10640 | + |
| 10641 | + } else { |
| 10642 | + mknodat_unavailable = 1; |
| 10643 | + result = 0; |
| 10644 | + } |
| 10645 | + } else |
10616 | 10646 | #endif
|
10617 | 10647 | result = mknod(path->narrow, mode, device);
|
10618 | 10648 | Py_END_ALLOW_THREADS
|
10619 | 10649 | } while (result != 0 && errno == EINTR &&
|
10620 | 10650 | !(async_err = PyErr_CheckSignals()));
|
| 10651 | +#ifdef HAVE_MKNODAT |
| 10652 | + if (mknodat_unavailable) { |
| 10653 | + argument_unavailable_error(NULL, "dir_fd"); |
| 10654 | + return NULL; |
| 10655 | + } |
| 10656 | +#endif |
10621 | 10657 | if (result != 0)
|
10622 | 10658 | return (!async_err) ? posix_error() : NULL;
|
10623 | 10659 |
|
@@ -15466,6 +15502,14 @@ PROBE(probe_fdopendir, HAVE_FDOPENDIR_RUNTIME)
|
15466 | 15502 | PROBE(probe_mkdirat, HAVE_MKDIRAT_RUNTIME)
|
15467 | 15503 | #endif
|
15468 | 15504 |
|
| 15505 | +#ifdef HAVE_MKFIFOAT |
| 15506 | +PROBE(probe_mkfifoat, HAVE_MKFIFOAT_RUNTIME) |
| 15507 | +#endif |
| 15508 | + |
| 15509 | +#ifdef HAVE_MKNODAT |
| 15510 | +PROBE(probe_mknodat, HAVE_MKNODAT_RUNTIME) |
| 15511 | +#endif |
| 15512 | + |
15469 | 15513 | #ifdef HAVE_RENAMEAT
|
15470 | 15514 | PROBE(probe_renameat, HAVE_RENAMEAT_RUNTIME)
|
15471 | 15515 | #endif
|
@@ -15599,11 +15643,11 @@ static const struct have_function {
|
15599 | 15643 | #endif
|
15600 | 15644 |
|
15601 | 15645 | #ifdef HAVE_MKFIFOAT
|
15602 |
| - { "HAVE_MKFIFOAT", NULL }, |
| 15646 | + { "HAVE_MKFIFOAT", probe_mkfifoat }, |
15603 | 15647 | #endif
|
15604 | 15648 |
|
15605 | 15649 | #ifdef HAVE_MKNODAT
|
15606 |
| - { "HAVE_MKNODAT", NULL }, |
| 15650 | + { "HAVE_MKNODAT", probe_mknodat }, |
15607 | 15651 | #endif
|
15608 | 15652 |
|
15609 | 15653 | #ifdef HAVE_OPENAT
|
|
0 commit comments