|
91 | 91 | # define HAVE_FUTIMENS_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
|
92 | 92 | # define HAVE_UTIMENSAT_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
|
93 | 93 | # define HAVE_PWRITEV_RUNTIME __builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
| 94 | +# define HAVE_MKFIFOAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *) |
| 95 | +# define HAVE_MKNODAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *) |
94 | 96 |
|
95 | 97 | # define HAVE_POSIX_SPAWN_SETSID_RUNTIME __builtin_available(macOS 10.15, *)
|
96 | 98 |
|
|
175 | 177 | # define HAVE_FUTIMENS_RUNTIME 1
|
176 | 178 | # define HAVE_UTIMENSAT_RUNTIME 1
|
177 | 179 | # define HAVE_PWRITEV_RUNTIME 1
|
| 180 | +# define HAVE_MKFIFOAT_RUNTIME 1 |
| 181 | +# define HAVE_MKNODAT_RUNTIME 1 |
178 | 182 | #endif
|
179 | 183 |
|
180 | 184 |
|
@@ -10619,18 +10623,35 @@ os_mkfifo_impl(PyObject *module, path_t *path, int mode, int dir_fd)
|
10619 | 10623 | {
|
10620 | 10624 | int result;
|
10621 | 10625 | int async_err = 0;
|
| 10626 | +#ifdef HAVE_MKFIFOAT |
| 10627 | + int mkfifoat_unavailable = 0; |
| 10628 | +#endif |
10622 | 10629 |
|
10623 | 10630 | do {
|
10624 | 10631 | Py_BEGIN_ALLOW_THREADS
|
10625 | 10632 | #ifdef HAVE_MKFIFOAT
|
10626 |
| - if (dir_fd != DEFAULT_DIR_FD) |
10627 |
| - result = mkfifoat(dir_fd, path->narrow, mode); |
10628 |
| - else |
| 10633 | + if (dir_fd != DEFAULT_DIR_FD) { |
| 10634 | + if (HAVE_MKFIFOAT_RUNTIME) { |
| 10635 | + result = mkfifoat(dir_fd, path->narrow, mode); |
| 10636 | + |
| 10637 | + } else { |
| 10638 | + mkfifoat_unavailable = 1; |
| 10639 | + result = 0; |
| 10640 | + } |
| 10641 | + } else |
10629 | 10642 | #endif
|
10630 | 10643 | result = mkfifo(path->narrow, mode);
|
10631 | 10644 | Py_END_ALLOW_THREADS
|
10632 | 10645 | } while (result != 0 && errno == EINTR &&
|
10633 | 10646 | !(async_err = PyErr_CheckSignals()));
|
| 10647 | + |
| 10648 | +#ifdef HAVE_MKFIFOAT |
| 10649 | + if (mkfifoat_unavailable) { |
| 10650 | + argument_unavailable_error(NULL, "dir_fd"); |
| 10651 | + return NULL; |
| 10652 | + } |
| 10653 | +#endif |
| 10654 | + |
10634 | 10655 | if (result != 0)
|
10635 | 10656 | return (!async_err) ? posix_error() : NULL;
|
10636 | 10657 |
|
@@ -10671,18 +10692,33 @@ os_mknod_impl(PyObject *module, path_t *path, int mode, dev_t device,
|
10671 | 10692 | {
|
10672 | 10693 | int result;
|
10673 | 10694 | int async_err = 0;
|
| 10695 | +#ifdef HAVE_MKNODAT |
| 10696 | + int mknodat_unavailable = 0; |
| 10697 | +#endif |
10674 | 10698 |
|
10675 | 10699 | do {
|
10676 | 10700 | Py_BEGIN_ALLOW_THREADS
|
10677 | 10701 | #ifdef HAVE_MKNODAT
|
10678 |
| - if (dir_fd != DEFAULT_DIR_FD) |
10679 |
| - result = mknodat(dir_fd, path->narrow, mode, device); |
10680 |
| - else |
| 10702 | + if (dir_fd != DEFAULT_DIR_FD) { |
| 10703 | + if (HAVE_MKNODAT_RUNTIME) { |
| 10704 | + result = mknodat(dir_fd, path->narrow, mode, device); |
| 10705 | + |
| 10706 | + } else { |
| 10707 | + mknodat_unavailable = 1; |
| 10708 | + result = 0; |
| 10709 | + } |
| 10710 | + } else |
10681 | 10711 | #endif
|
10682 | 10712 | result = mknod(path->narrow, mode, device);
|
10683 | 10713 | Py_END_ALLOW_THREADS
|
10684 | 10714 | } while (result != 0 && errno == EINTR &&
|
10685 | 10715 | !(async_err = PyErr_CheckSignals()));
|
| 10716 | +#ifdef HAVE_MKNODAT |
| 10717 | + if (mknodat_unavailable) { |
| 10718 | + argument_unavailable_error(NULL, "dir_fd"); |
| 10719 | + return NULL; |
| 10720 | + } |
| 10721 | +#endif |
10686 | 10722 | if (result != 0)
|
10687 | 10723 | return (!async_err) ? posix_error() : NULL;
|
10688 | 10724 |
|
@@ -15525,6 +15561,14 @@ PROBE(probe_fdopendir, HAVE_FDOPENDIR_RUNTIME)
|
15525 | 15561 | PROBE(probe_mkdirat, HAVE_MKDIRAT_RUNTIME)
|
15526 | 15562 | #endif
|
15527 | 15563 |
|
| 15564 | +#ifdef HAVE_MKFIFOAT |
| 15565 | +PROBE(probe_mkfifoat, HAVE_MKFIFOAT_RUNTIME) |
| 15566 | +#endif |
| 15567 | + |
| 15568 | +#ifdef HAVE_MKNODAT |
| 15569 | +PROBE(probe_mknodat, HAVE_MKNODAT_RUNTIME) |
| 15570 | +#endif |
| 15571 | + |
15528 | 15572 | #ifdef HAVE_RENAMEAT
|
15529 | 15573 | PROBE(probe_renameat, HAVE_RENAMEAT_RUNTIME)
|
15530 | 15574 | #endif
|
@@ -15658,11 +15702,11 @@ static const struct have_function {
|
15658 | 15702 | #endif
|
15659 | 15703 |
|
15660 | 15704 | #ifdef HAVE_MKFIFOAT
|
15661 |
| - { "HAVE_MKFIFOAT", NULL }, |
| 15705 | + { "HAVE_MKFIFOAT", probe_mkfifoat }, |
15662 | 15706 | #endif
|
15663 | 15707 |
|
15664 | 15708 | #ifdef HAVE_MKNODAT
|
15665 |
| - { "HAVE_MKNODAT", NULL }, |
| 15709 | + { "HAVE_MKNODAT", probe_mknodat }, |
15666 | 15710 | #endif
|
15667 | 15711 |
|
15668 | 15712 | #ifdef HAVE_OPENAT
|
|
0 commit comments