|
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 |
|
@@ -10644,18 +10648,35 @@ os_mkfifo_impl(PyObject *module, path_t *path, int mode, int dir_fd)
|
10644 | 10648 | {
|
10645 | 10649 | int result;
|
10646 | 10650 | int async_err = 0;
|
| 10651 | +#ifdef HAVE_MKFIFOAT |
| 10652 | + int mkfifoat_unavailable = 0; |
| 10653 | +#endif |
10647 | 10654 |
|
10648 | 10655 | do {
|
10649 | 10656 | Py_BEGIN_ALLOW_THREADS
|
10650 | 10657 | #ifdef HAVE_MKFIFOAT
|
10651 |
| - if (dir_fd != DEFAULT_DIR_FD) |
10652 |
| - result = mkfifoat(dir_fd, path->narrow, mode); |
10653 |
| - else |
| 10658 | + if (dir_fd != DEFAULT_DIR_FD) { |
| 10659 | + if (HAVE_MKFIFOAT_RUNTIME) { |
| 10660 | + result = mkfifoat(dir_fd, path->narrow, mode); |
| 10661 | + |
| 10662 | + } else { |
| 10663 | + mkfifoat_unavailable = 1; |
| 10664 | + result = 0; |
| 10665 | + } |
| 10666 | + } else |
10654 | 10667 | #endif
|
10655 | 10668 | result = mkfifo(path->narrow, mode);
|
10656 | 10669 | Py_END_ALLOW_THREADS
|
10657 | 10670 | } while (result != 0 && errno == EINTR &&
|
10658 | 10671 | !(async_err = PyErr_CheckSignals()));
|
| 10672 | + |
| 10673 | +#ifdef HAVE_MKFIFOAT |
| 10674 | + if (mkfifoat_unavailable) { |
| 10675 | + argument_unavailable_error(NULL, "dir_fd"); |
| 10676 | + return NULL; |
| 10677 | + } |
| 10678 | +#endif |
| 10679 | + |
10659 | 10680 | if (result != 0)
|
10660 | 10681 | return (!async_err) ? posix_error() : NULL;
|
10661 | 10682 |
|
@@ -10696,18 +10717,33 @@ os_mknod_impl(PyObject *module, path_t *path, int mode, dev_t device,
|
10696 | 10717 | {
|
10697 | 10718 | int result;
|
10698 | 10719 | int async_err = 0;
|
| 10720 | +#ifdef HAVE_MKNODAT |
| 10721 | + int mknodat_unavailable = 0; |
| 10722 | +#endif |
10699 | 10723 |
|
10700 | 10724 | do {
|
10701 | 10725 | Py_BEGIN_ALLOW_THREADS
|
10702 | 10726 | #ifdef HAVE_MKNODAT
|
10703 |
| - if (dir_fd != DEFAULT_DIR_FD) |
10704 |
| - result = mknodat(dir_fd, path->narrow, mode, device); |
10705 |
| - else |
| 10727 | + if (dir_fd != DEFAULT_DIR_FD) { |
| 10728 | + if (HAVE_MKNODAT_RUNTIME) { |
| 10729 | + result = mknodat(dir_fd, path->narrow, mode, device); |
| 10730 | + |
| 10731 | + } else { |
| 10732 | + mknodat_unavailable = 1; |
| 10733 | + result = 0; |
| 10734 | + } |
| 10735 | + } else |
10706 | 10736 | #endif
|
10707 | 10737 | result = mknod(path->narrow, mode, device);
|
10708 | 10738 | Py_END_ALLOW_THREADS
|
10709 | 10739 | } while (result != 0 && errno == EINTR &&
|
10710 | 10740 | !(async_err = PyErr_CheckSignals()));
|
| 10741 | +#ifdef HAVE_MKNODAT |
| 10742 | + if (mknodat_unavailable) { |
| 10743 | + argument_unavailable_error(NULL, "dir_fd"); |
| 10744 | + return NULL; |
| 10745 | + } |
| 10746 | +#endif |
10711 | 10747 | if (result != 0)
|
10712 | 10748 | return (!async_err) ? posix_error() : NULL;
|
10713 | 10749 |
|
@@ -15576,6 +15612,14 @@ PROBE(probe_fdopendir, HAVE_FDOPENDIR_RUNTIME)
|
15576 | 15612 | PROBE(probe_mkdirat, HAVE_MKDIRAT_RUNTIME)
|
15577 | 15613 | #endif
|
15578 | 15614 |
|
| 15615 | +#ifdef HAVE_MKFIFOAT |
| 15616 | +PROBE(probe_mkfifoat, HAVE_MKFIFOAT_RUNTIME) |
| 15617 | +#endif |
| 15618 | + |
| 15619 | +#ifdef HAVE_MKNODAT |
| 15620 | +PROBE(probe_mknodat, HAVE_MKNODAT_RUNTIME) |
| 15621 | +#endif |
| 15622 | + |
15579 | 15623 | #ifdef HAVE_RENAMEAT
|
15580 | 15624 | PROBE(probe_renameat, HAVE_RENAMEAT_RUNTIME)
|
15581 | 15625 | #endif
|
@@ -15709,11 +15753,11 @@ static const struct have_function {
|
15709 | 15753 | #endif
|
15710 | 15754 |
|
15711 | 15755 | #ifdef HAVE_MKFIFOAT
|
15712 |
| - { "HAVE_MKFIFOAT", NULL }, |
| 15756 | + { "HAVE_MKFIFOAT", probe_mkfifoat }, |
15713 | 15757 | #endif
|
15714 | 15758 |
|
15715 | 15759 | #ifdef HAVE_MKNODAT
|
15716 |
| - { "HAVE_MKNODAT", NULL }, |
| 15760 | + { "HAVE_MKNODAT", probe_mknodat }, |
15717 | 15761 | #endif
|
15718 | 15762 |
|
15719 | 15763 | #ifdef HAVE_OPENAT
|
|
0 commit comments