… | |
… | |
18 | #include <sys/socket.h> |
18 | #include <sys/socket.h> |
19 | #include <sys/stat.h> |
19 | #include <sys/stat.h> |
20 | #include <limits.h> |
20 | #include <limits.h> |
21 | #include <fcntl.h> |
21 | #include <fcntl.h> |
22 | #include <sched.h> |
22 | #include <sched.h> |
23 | |
|
|
24 | /* the incompetent fool that created musl keeps __linux__, refuses |
|
|
25 | * to implement any linux standard apis, and also has no way to test |
|
|
26 | * for his broken iplementation. don't complain to me if this fails |
|
|
27 | * for you. |
|
|
28 | */ |
|
|
29 | #if __linux__ && (defined __GLIBC__ || defined __UCLIBC__) |
|
|
30 | # include <linux/fs.h> |
|
|
31 | # ifdef FS_IOC_FIEMAP |
|
|
32 | # include <linux/types.h> |
|
|
33 | # include <linux/fiemap.h> |
|
|
34 | # define HAVE_FIEMAP 1 |
|
|
35 | # endif |
|
|
36 | #endif |
|
|
37 | |
23 | |
38 | /* perl namespace pollution */ |
24 | /* perl namespace pollution */ |
39 | #undef VERSION |
25 | #undef VERSION |
40 | |
26 | |
41 | /* perl stupidly overrides readdir and maybe others */ |
27 | /* perl stupidly overrides readdir and maybe others */ |
… | |
… | |
84 | |
70 | |
85 | #else |
71 | #else |
86 | |
72 | |
87 | #include <sys/time.h> |
73 | #include <sys/time.h> |
88 | #include <sys/select.h> |
74 | #include <sys/select.h> |
|
|
75 | #include <sys/wait.h> |
89 | #include <unistd.h> |
76 | #include <unistd.h> |
90 | #include <utime.h> |
77 | #include <utime.h> |
91 | #include <signal.h> |
78 | #include <signal.h> |
92 | |
79 | |
93 | #define EIO_STRUCT_STAT Stat_t |
80 | #define EIO_STRUCT_STAT Stat_t |
… | |
… | |
119 | # include <sys/mman.h> |
106 | # include <sys/mman.h> |
120 | #endif |
107 | #endif |
121 | |
108 | |
122 | #if HAVE_SYS_UIO_H |
109 | #if HAVE_SYS_UIO_H |
123 | # include <sys/uio.h> |
110 | # include <sys/uio.h> |
|
|
111 | #endif |
|
|
112 | |
|
|
113 | /* MUST be included before linux/fs.h, as the latter includes |
|
|
114 | * linux/mount.h, which is incompatible to sys/mount.h |
|
|
115 | */ |
|
|
116 | #if HAVE_SYS_MOUNT_H |
|
|
117 | # include <sys/mount.h> |
|
|
118 | #endif |
|
|
119 | |
|
|
120 | /* the incompetent fool that created musl keeps __linux__, refuses |
|
|
121 | * to implement any linux standard apis, and also has no way to test |
|
|
122 | * for his broken implementation. don't complain to me if this fails |
|
|
123 | * for you. |
|
|
124 | */ |
|
|
125 | #if __linux__ && (defined __GLIBC__ || defined __UCLIBC__) |
|
|
126 | # include <linux/fs.h> /* MUST be included after sys/mount.h */ |
|
|
127 | # ifdef FS_IOC_FIEMAP |
|
|
128 | # include <linux/types.h> |
|
|
129 | # include <linux/fiemap.h> |
|
|
130 | # undef HAVE_FIEMAP |
|
|
131 | # define HAVE_FIEMAP 1 |
|
|
132 | # endif |
124 | #endif |
133 | #endif |
125 | |
134 | |
126 | #if HAVE_ST_XTIMENSEC |
135 | #if HAVE_ST_XTIMENSEC |
127 | # define ATIMENSEC PL_statcache.st_atimensec |
136 | # define ATIMENSEC PL_statcache.st_atimensec |
128 | # define MTIMENSEC PL_statcache.st_mtimensec |
137 | # define MTIMENSEC PL_statcache.st_mtimensec |
… | |
… | |
168 | #include <sys/time.h> |
177 | #include <sys/time.h> |
169 | #include <sys/resource.h> |
178 | #include <sys/resource.h> |
170 | #endif |
179 | #endif |
171 | |
180 | |
172 | typedef SV SV8; /* byte-sv, used for argument-checking */ |
181 | typedef SV SV8; /* byte-sv, used for argument-checking */ |
|
|
182 | typedef char *octet_string; |
|
|
183 | typedef char *octet_string_ornull; |
173 | typedef int aio_rfd; /* read file desriptor */ |
184 | typedef int aio_rfd; /* read file desriptor */ |
174 | typedef int aio_wfd; /* write file descriptor */ |
185 | typedef int aio_wfd; /* write file descriptor */ |
175 | |
186 | |
176 | static HV *aio_stash, *aio_req_stash, *aio_grp_stash, *aio_wd_stash; |
187 | static HV *aio_stash, *aio_req_stash, *aio_grp_stash, *aio_wd_stash; |
177 | |
188 | |
… | |
… | |
224 | # undef PAGESIZE |
235 | # undef PAGESIZE |
225 | #endif |
236 | #endif |
226 | |
237 | |
227 | #if PAGESIZE <= 0 |
238 | #if PAGESIZE <= 0 |
228 | # define PAGESIZE sysconf (_SC_PAGESIZE) |
239 | # define PAGESIZE sysconf (_SC_PAGESIZE) |
|
|
240 | #endif |
|
|
241 | |
|
|
242 | /* solaris perl seems to declare a wrong syscall function that clashes with system includes */ |
|
|
243 | #ifdef __sun |
|
|
244 | # undef HAVE_SYSCALL |
229 | #endif |
245 | #endif |
230 | |
246 | |
231 | #if HAVE_SYSCALL |
247 | #if HAVE_SYSCALL |
232 | #include <sys/syscall.h> |
248 | #include <sys/syscall.h> |
233 | #else |
249 | #else |
… | |
… | |
1087 | return ts->tv_sec + ts->tv_nsec * 1e-9; |
1103 | return ts->tv_sec + ts->tv_nsec * 1e-9; |
1088 | } |
1104 | } |
1089 | |
1105 | |
1090 | /*****************************************************************************/ |
1106 | /*****************************************************************************/ |
1091 | |
1107 | |
|
|
1108 | /* extract a ref-to-array of strings into a temporary c style string vector */ |
|
|
1109 | static char ** |
|
|
1110 | extract_stringvec (SV *sv, const char *croakmsg) |
|
|
1111 | { |
|
|
1112 | if (!SvROK (sv) || SvTYPE (SvRV (sv)) != SVt_PVAV) |
|
|
1113 | croak (croakmsg); |
|
|
1114 | |
|
|
1115 | AV *av = (AV *)SvRV (sv); |
|
|
1116 | int i, nelem = av_len (av) + 1; |
|
|
1117 | char **vecp = (char **)SvPVX (sv_2mortal (newSV (sizeof (char *) * (nelem + 1)))); |
|
|
1118 | |
|
|
1119 | for (i = 0; i < nelem; ++i) |
|
|
1120 | { |
|
|
1121 | SV **e = av_fetch (av, i, 0); |
|
|
1122 | |
|
|
1123 | if (e && *e) |
|
|
1124 | vecp[i] = SvPVbyte_nolen (*e); |
|
|
1125 | else |
|
|
1126 | vecp[i] = ""; |
|
|
1127 | } |
|
|
1128 | |
|
|
1129 | vecp[nelem] = 0; |
|
|
1130 | |
|
|
1131 | return vecp; |
|
|
1132 | } |
|
|
1133 | |
|
|
1134 | /*****************************************************************************/ |
|
|
1135 | |
1092 | XS(boot_IO__AIO) ecb_cold; |
1136 | XS(boot_IO__AIO) ecb_cold; |
1093 | |
1137 | |
1094 | MODULE = IO::AIO PACKAGE = IO::AIO |
1138 | MODULE = IO::AIO PACKAGE = IO::AIO |
1095 | |
1139 | |
1096 | PROTOTYPES: ENABLE |
1140 | PROTOTYPES: ENABLE |
… | |
… | |
1197 | const_iv (MAP_NONBLOCK) |
1241 | const_iv (MAP_NONBLOCK) |
1198 | const_iv (MAP_GROWSDOWN) |
1242 | const_iv (MAP_GROWSDOWN) |
1199 | const_iv (MAP_32BIT) |
1243 | const_iv (MAP_32BIT) |
1200 | const_iv (MAP_HUGETLB) |
1244 | const_iv (MAP_HUGETLB) |
1201 | const_iv (MAP_STACK) |
1245 | const_iv (MAP_STACK) |
|
|
1246 | const_iv (MAP_FIXED_NOREPLACE) |
|
|
1247 | const_iv (MAP_SHARED_VALIDATE) |
|
|
1248 | const_iv (MAP_SYNC) |
|
|
1249 | const_iv (MAP_UNINITIALIZED) |
1202 | |
1250 | |
1203 | const_iv (MREMAP_MAYMOVE) |
1251 | const_iv (MREMAP_MAYMOVE) |
1204 | const_iv (MREMAP_FIXED) |
1252 | const_iv (MREMAP_FIXED) |
1205 | |
1253 | |
1206 | const_iv (MSG_CMSG_CLOEXEC) |
1254 | const_iv (MSG_CMSG_CLOEXEC) |
… | |
… | |
1301 | const_iv (EFD_SEMAPHORE) |
1349 | const_iv (EFD_SEMAPHORE) |
1302 | |
1350 | |
1303 | const_iv (MFD_CLOEXEC) |
1351 | const_iv (MFD_CLOEXEC) |
1304 | const_iv (MFD_ALLOW_SEALING) |
1352 | const_iv (MFD_ALLOW_SEALING) |
1305 | const_iv (MFD_HUGETLB) |
1353 | const_iv (MFD_HUGETLB) |
|
|
1354 | const_iv (MFD_HUGETLB_2MB) |
|
|
1355 | const_iv (MFD_HUGETLB_1GB) |
1306 | |
1356 | |
1307 | const_iv (CLOCK_REALTIME) |
1357 | const_iv (CLOCK_REALTIME) |
1308 | const_iv (CLOCK_MONOTONIC) |
1358 | const_iv (CLOCK_MONOTONIC) |
1309 | const_iv (CLOCK_BOOTTIME) |
1359 | const_iv (CLOCK_BOOTTIME) |
1310 | const_iv (CLOCK_REALTIME_ALARM) |
1360 | const_iv (CLOCK_REALTIME_ALARM) |
… | |
… | |
1350 | const_iv (AT_STATX_DONT_SYNC) |
1400 | const_iv (AT_STATX_DONT_SYNC) |
1351 | const_iv (AT_RECURSIVE) |
1401 | const_iv (AT_RECURSIVE) |
1352 | |
1402 | |
1353 | const_iv (OPEN_TREE_CLONE) |
1403 | const_iv (OPEN_TREE_CLONE) |
1354 | |
1404 | |
|
|
1405 | const_iv (FSOPEN_CLOEXEC) |
|
|
1406 | |
|
|
1407 | const_iv (FSPICK_CLOEXEC) |
|
|
1408 | const_iv (FSPICK_SYMLINK_NOFOLLOW) |
|
|
1409 | const_iv (FSPICK_NO_AUTOMOUNT) |
|
|
1410 | const_iv (FSPICK_EMPTY_PATH) |
|
|
1411 | |
1355 | const_iv (MOVE_MOUNT_F_SYMLINKS) |
1412 | const_iv (MOVE_MOUNT_F_SYMLINKS) |
1356 | const_iv (MOVE_MOUNT_F_AUTOMOUNTS) |
1413 | const_iv (MOVE_MOUNT_F_AUTOMOUNTS) |
1357 | const_iv (MOVE_MOUNT_F_EMPTY_PATH) |
1414 | const_iv (MOVE_MOUNT_F_EMPTY_PATH) |
1358 | const_iv (MOVE_MOUNT_T_SYMLINKS) |
1415 | const_iv (MOVE_MOUNT_T_SYMLINKS) |
1359 | const_iv (MOVE_MOUNT_T_AUTOMOUNTS) |
1416 | const_iv (MOVE_MOUNT_T_AUTOMOUNTS) |
1360 | const_iv (MOVE_MOUNT_T_EMPTY_PATH) |
1417 | const_iv (MOVE_MOUNT_T_EMPTY_PATH) |
|
|
1418 | |
|
|
1419 | /* waitid */ |
|
|
1420 | const_iv (P_PID) |
|
|
1421 | const_iv (P_PIDFD) |
|
|
1422 | const_iv (P_PGID) |
|
|
1423 | const_iv (P_ALL) |
|
|
1424 | |
|
|
1425 | const_iv (FSCONFIG_SET_FLAG) |
|
|
1426 | const_iv (FSCONFIG_SET_STRING) |
|
|
1427 | const_iv (FSCONFIG_SET_BINARY) |
|
|
1428 | const_iv (FSCONFIG_SET_PATH) |
|
|
1429 | const_iv (FSCONFIG_SET_PATH_EMPTY) |
|
|
1430 | const_iv (FSCONFIG_SET_FD) |
|
|
1431 | const_iv (FSCONFIG_CMD_CREATE) |
|
|
1432 | const_iv (FSCONFIG_CMD_RECONFIGURE) |
|
|
1433 | |
|
|
1434 | const_iv (MOUNT_ATTR_RDONLY) |
|
|
1435 | const_iv (MOUNT_ATTR_NOSUID) |
|
|
1436 | const_iv (MOUNT_ATTR_NODEV) |
|
|
1437 | const_iv (MOUNT_ATTR_NOEXEC) |
|
|
1438 | const_iv (MOUNT_ATTR__ATIME) |
|
|
1439 | const_iv (MOUNT_ATTR_RELATIME) |
|
|
1440 | const_iv (MOUNT_ATTR_NOATIME) |
|
|
1441 | const_iv (MOUNT_ATTR_STRICTATIME) |
|
|
1442 | const_iv (MOUNT_ATTR_NODIRATIME) |
|
|
1443 | |
|
|
1444 | /* sys/mount.h */ |
|
|
1445 | const_iv (MS_RDONLY) |
|
|
1446 | const_iv (MS_NOSUID) |
|
|
1447 | const_iv (MS_NODEV) |
|
|
1448 | const_iv (MS_NOEXEC) |
|
|
1449 | const_iv (MS_SYNCHRONOUS) |
|
|
1450 | const_iv (MS_REMOUNT) |
|
|
1451 | const_iv (MS_MANDLOCK) |
|
|
1452 | const_iv (MS_DIRSYNC) |
|
|
1453 | const_iv (MS_NOATIME) |
|
|
1454 | const_iv (MS_NODIRATIME) |
|
|
1455 | const_iv (MS_BIND) |
|
|
1456 | const_iv (MS_MOVE) |
|
|
1457 | const_iv (MS_REC) |
|
|
1458 | const_iv (MS_SILENT) |
|
|
1459 | const_iv (MS_POSIXACL) |
|
|
1460 | const_iv (MS_UNBINDABLE) |
|
|
1461 | const_iv (MS_PRIVATE) |
|
|
1462 | const_iv (MS_SLAVE) |
|
|
1463 | const_iv (MS_SHARED) |
|
|
1464 | const_iv (MS_RELATIME) |
|
|
1465 | const_iv (MS_KERNMOUNT) |
|
|
1466 | const_iv (MS_I_VERSION) |
|
|
1467 | const_iv (MS_STRICTATIME) |
|
|
1468 | const_iv (MS_LAZYTIME) |
|
|
1469 | const_iv (MS_ACTIVE) |
|
|
1470 | const_iv (MS_NOUSER) |
|
|
1471 | const_iv (MS_RMT_MASK) |
|
|
1472 | const_iv (MS_MGC_VAL) |
|
|
1473 | const_iv (MS_MGC_MSK) |
|
|
1474 | |
|
|
1475 | const_iv (MNT_FORCE) |
|
|
1476 | const_iv (MNT_DETACH) |
|
|
1477 | const_iv (MNT_EXPIRE) |
|
|
1478 | const_iv (UMOUNT_NOFOLLOW) |
|
|
1479 | |
|
|
1480 | const_iv (BLKROSET) |
|
|
1481 | const_iv (BLKROGET) |
|
|
1482 | const_iv (BLKRRPART) |
|
|
1483 | const_iv (BLKGETSIZE) |
|
|
1484 | const_iv (BLKFLSBUF) |
|
|
1485 | const_iv (BLKRASET) |
|
|
1486 | const_iv (BLKRAGET) |
|
|
1487 | const_iv (BLKFRASET) |
|
|
1488 | const_iv (BLKFRAGET) |
|
|
1489 | const_iv (BLKSECTSET) |
|
|
1490 | const_iv (BLKSECTGET) |
|
|
1491 | const_iv (BLKSSZGET) |
|
|
1492 | const_iv (BLKBSZGET) |
|
|
1493 | const_iv (BLKBSZSET) |
|
|
1494 | const_iv (BLKGETSIZE64) |
1361 | |
1495 | |
1362 | /* these are libeio constants, and are independent of gendef0 */ |
1496 | /* these are libeio constants, and are independent of gendef0 */ |
1363 | const_eio (SEEK_SET) |
1497 | const_eio (SEEK_SET) |
1364 | const_eio (SEEK_CUR) |
1498 | const_eio (SEEK_CUR) |
1365 | const_eio (SEEK_END) |
1499 | const_eio (SEEK_END) |
… | |
… | |
2640 | int |
2774 | int |
2641 | pidfd_send_signal (SV *pidfh, int sig, SV *siginfo = &PL_sv_undef, unsigned int flags = 0) |
2775 | pidfd_send_signal (SV *pidfh, int sig, SV *siginfo = &PL_sv_undef, unsigned int flags = 0) |
2642 | PPCODE: |
2776 | PPCODE: |
2643 | { |
2777 | { |
2644 | int res; |
2778 | int res; |
|
|
2779 | #if HAVE_SIGINFO_T |
2645 | siginfo_t si = { 0 }; |
2780 | siginfo_t si = { 0 }; |
2646 | |
2781 | |
2647 | if (SvOK (siginfo)) |
2782 | if (SvOK (siginfo)) |
2648 | { |
2783 | { |
2649 | HV *hv; |
2784 | HV *hv; |
2650 | SV **svp; |
2785 | SV **svp; |
2651 | |
2786 | |
2652 | if (!SvROK (siginfo) || SvTYPE (SvRV (siginfo)) != SVt_PVHV) |
2787 | if (!SvROK (siginfo) || SvTYPE (SvRV (siginfo)) != SVt_PVHV) |
2653 | croak ("siginfo argument must be a hashref code, pid, uid and value_int or value_ptr members, caught"); |
2788 | croak ("siginfo argument must be a hashref with 'code', 'pid', 'uid' and 'value_int' or 'value_ptr' members, caught"); |
2654 | |
2789 | |
2655 | hv = (HV *)SvRV (siginfo); |
2790 | hv = (HV *)SvRV (siginfo); |
2656 | |
2791 | |
2657 | if ((svp = hv_fetchs (hv, "code" , 0))) si.si_code = SvIV (*svp); |
2792 | if ((svp = hv_fetchs (hv, "code" , 0))) si.si_code = SvIV (*svp); |
2658 | if ((svp = hv_fetchs (hv, "pid" , 0))) si.si_pid = SvIV (*svp); |
2793 | if ((svp = hv_fetchs (hv, "pid" , 0))) si.si_pid = SvIV (*svp); |
… | |
… | |
2661 | if ((svp = hv_fetchs (hv, "value_ptr", 0))) si.si_value.sival_ptr = (void *)SvIV (*svp); |
2796 | if ((svp = hv_fetchs (hv, "value_ptr", 0))) si.si_value.sival_ptr = (void *)SvIV (*svp); |
2662 | } |
2797 | } |
2663 | |
2798 | |
2664 | /*GENDEF0_SYSCALL(pidfd_send_signal,424)*/ |
2799 | /*GENDEF0_SYSCALL(pidfd_send_signal,424)*/ |
2665 | res = syscall (SYS_pidfd_send_signal, s_fileno_croak (pidfh, 0), sig, SvOK (siginfo) ? &si : 0, flags); |
2800 | res = syscall (SYS_pidfd_send_signal, s_fileno_croak (pidfh, 0), sig, SvOK (siginfo) ? &si : 0, flags); |
|
|
2801 | #else |
|
|
2802 | res = (errno = ENOSYS, -1); |
|
|
2803 | #endif |
2666 | |
2804 | |
2667 | XPUSHs (sv_2mortal (newSViv (res))); |
2805 | XPUSHs (sv_2mortal (newSViv (res))); |
2668 | } |
2806 | } |
2669 | |
2807 | |
2670 | void |
2808 | void |
… | |
… | |
2748 | errno = ENOSYS; |
2886 | errno = ENOSYS; |
2749 | #endif |
2887 | #endif |
2750 | } |
2888 | } |
2751 | |
2889 | |
2752 | void |
2890 | void |
2753 | memfd_create (SV8 *pathname, int flags = 0) |
2891 | memfd_create (octet_string pathname, int flags = 0) |
2754 | PPCODE: |
2892 | PPCODE: |
2755 | { |
2893 | { |
2756 | int fd; |
2894 | int fd; |
2757 | #if HAVE_MEMFD_CREATE |
2895 | #if HAVE_MEMFD_CREATE |
2758 | fd = memfd_create (SvPVbyte_nolen (pathname), flags); |
2896 | fd = memfd_create (pathname, flags); |
2759 | #else |
2897 | #else |
2760 | fd = (errno = ENOSYS, -1); |
2898 | fd = (errno = ENOSYS, -1); |
2761 | #endif |
2899 | #endif |
2762 | |
2900 | |
2763 | XPUSHs (newmortalFH (fd, O_RDWR)); |
2901 | XPUSHs (newmortalFH (fd, O_RDWR)); |
2764 | } |
2902 | } |
|
|
2903 | |
|
|
2904 | int |
|
|
2905 | fexecve (SV *fh, SV *args, SV *envs = &PL_sv_undef) |
|
|
2906 | CODE: |
|
|
2907 | { |
|
|
2908 | int fd = PerlIO_fileno (IoIFP (sv_2io (fh))); |
|
|
2909 | char **envp, **argv; |
|
|
2910 | argv = extract_stringvec (args, "IO::AIO::fexecve: args must be an array of strings"); |
|
|
2911 | if (!SvOK (envs)) |
|
|
2912 | { |
|
|
2913 | extern char **environ; |
|
|
2914 | envp = environ; |
|
|
2915 | } |
|
|
2916 | else |
|
|
2917 | envp = extract_stringvec (envs, "IO::AIO::fexecve: envs must be an array of strings"); |
|
|
2918 | #if _POSIX_VERSION >= 200809L |
|
|
2919 | RETVAL = fexecve (fd, argv, envp); |
|
|
2920 | #else |
|
|
2921 | RETVAL = (errno = ENOSYS, -1); |
|
|
2922 | #endif |
|
|
2923 | } |
|
|
2924 | OUTPUT: RETVAL |
|
|
2925 | |
|
|
2926 | int |
|
|
2927 | mount (octet_string special, octet_string path, octet_string fstype, UV flags = 0, octet_string_ornull data = 0) |
|
|
2928 | OUTPUT: RETVAL |
|
|
2929 | |
|
|
2930 | int |
|
|
2931 | umount (octet_string path, int flags = 0) |
|
|
2932 | CODE: |
|
|
2933 | if (flags) |
|
|
2934 | #if HAVE_UMOUNT2 |
|
|
2935 | RETVAL = umount2 (path, flags); |
|
|
2936 | #else |
|
|
2937 | RETVAL = (errno = ENOSYS, -1); |
|
|
2938 | #endif |
|
|
2939 | else |
|
|
2940 | RETVAL = umount (path); |
|
|
2941 | OUTPUT: RETVAL |
2765 | |
2942 | |
2766 | UV |
2943 | UV |
2767 | get_fdlimit () |
2944 | get_fdlimit () |
2768 | CODE: |
2945 | CODE: |
2769 | #if HAVE_RLIMITS |
2946 | #if HAVE_RLIMITS |