… | |
… | |
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 */ |
… | |
… | |
122 | |
108 | |
123 | #if HAVE_SYS_UIO_H |
109 | #if HAVE_SYS_UIO_H |
124 | # include <sys/uio.h> |
110 | # include <sys/uio.h> |
125 | #endif |
111 | #endif |
126 | |
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 |
|
|
133 | #endif |
|
|
134 | |
127 | #if HAVE_ST_XTIMENSEC |
135 | #if HAVE_ST_XTIMENSEC |
128 | # define ATIMENSEC PL_statcache.st_atimensec |
136 | # define ATIMENSEC PL_statcache.st_atimensec |
129 | # define MTIMENSEC PL_statcache.st_mtimensec |
137 | # define MTIMENSEC PL_statcache.st_mtimensec |
130 | # define CTIMENSEC PL_statcache.st_ctimensec |
138 | # define CTIMENSEC PL_statcache.st_ctimensec |
131 | #elif HAVE_ST_XTIMESPEC |
139 | #elif HAVE_ST_XTIMESPEC |
… | |
… | |
169 | #include <sys/time.h> |
177 | #include <sys/time.h> |
170 | #include <sys/resource.h> |
178 | #include <sys/resource.h> |
171 | #endif |
179 | #endif |
172 | |
180 | |
173 | 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; |
174 | typedef int aio_rfd; /* read file desriptor */ |
184 | typedef int aio_rfd; /* read file desriptor */ |
175 | typedef int aio_wfd; /* write file descriptor */ |
185 | typedef int aio_wfd; /* write file descriptor */ |
176 | |
186 | |
177 | 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; |
178 | |
188 | |
… | |
… | |
1089 | |
1099 | |
1090 | static NV |
1100 | static NV |
1091 | ts_get (const struct timespec *ts) |
1101 | ts_get (const struct timespec *ts) |
1092 | { |
1102 | { |
1093 | return ts->tv_sec + ts->tv_nsec * 1e-9; |
1103 | return ts->tv_sec + ts->tv_nsec * 1e-9; |
|
|
1104 | } |
|
|
1105 | |
|
|
1106 | /*****************************************************************************/ |
|
|
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 ("%s", 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; |
1094 | } |
1132 | } |
1095 | |
1133 | |
1096 | /*****************************************************************************/ |
1134 | /*****************************************************************************/ |
1097 | |
1135 | |
1098 | XS(boot_IO__AIO) ecb_cold; |
1136 | XS(boot_IO__AIO) ecb_cold; |
… | |
… | |
1311 | const_iv (EFD_SEMAPHORE) |
1349 | const_iv (EFD_SEMAPHORE) |
1312 | |
1350 | |
1313 | const_iv (MFD_CLOEXEC) |
1351 | const_iv (MFD_CLOEXEC) |
1314 | const_iv (MFD_ALLOW_SEALING) |
1352 | const_iv (MFD_ALLOW_SEALING) |
1315 | const_iv (MFD_HUGETLB) |
1353 | const_iv (MFD_HUGETLB) |
|
|
1354 | const_iv (MFD_HUGETLB_2MB) |
|
|
1355 | const_iv (MFD_HUGETLB_1GB) |
1316 | |
1356 | |
1317 | const_iv (CLOCK_REALTIME) |
1357 | const_iv (CLOCK_REALTIME) |
1318 | const_iv (CLOCK_MONOTONIC) |
1358 | const_iv (CLOCK_MONOTONIC) |
1319 | const_iv (CLOCK_BOOTTIME) |
1359 | const_iv (CLOCK_BOOTTIME) |
1320 | const_iv (CLOCK_REALTIME_ALARM) |
1360 | const_iv (CLOCK_REALTIME_ALARM) |
… | |
… | |
1399 | const_iv (MOUNT_ATTR_RELATIME) |
1439 | const_iv (MOUNT_ATTR_RELATIME) |
1400 | const_iv (MOUNT_ATTR_NOATIME) |
1440 | const_iv (MOUNT_ATTR_NOATIME) |
1401 | const_iv (MOUNT_ATTR_STRICTATIME) |
1441 | const_iv (MOUNT_ATTR_STRICTATIME) |
1402 | const_iv (MOUNT_ATTR_NODIRATIME) |
1442 | const_iv (MOUNT_ATTR_NODIRATIME) |
1403 | |
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) |
|
|
1495 | |
1404 | /* these are libeio constants, and are independent of gendef0 */ |
1496 | /* these are libeio constants, and are independent of gendef0 */ |
1405 | const_eio (SEEK_SET) |
1497 | const_eio (SEEK_SET) |
1406 | const_eio (SEEK_CUR) |
1498 | const_eio (SEEK_CUR) |
1407 | const_eio (SEEK_END) |
1499 | const_eio (SEEK_END) |
1408 | |
1500 | |
… | |
… | |
2794 | errno = ENOSYS; |
2886 | errno = ENOSYS; |
2795 | #endif |
2887 | #endif |
2796 | } |
2888 | } |
2797 | |
2889 | |
2798 | void |
2890 | void |
2799 | memfd_create (SV8 *pathname, int flags = 0) |
2891 | memfd_create (octet_string pathname, int flags = 0) |
2800 | PPCODE: |
2892 | PPCODE: |
2801 | { |
2893 | { |
2802 | int fd; |
2894 | int fd; |
2803 | #if HAVE_MEMFD_CREATE |
2895 | #if HAVE_MEMFD_CREATE |
2804 | fd = memfd_create (SvPVbyte_nolen (pathname), flags); |
2896 | fd = memfd_create (pathname, flags); |
2805 | #else |
2897 | #else |
2806 | fd = (errno = ENOSYS, -1); |
2898 | fd = (errno = ENOSYS, -1); |
2807 | #endif |
2899 | #endif |
2808 | |
2900 | |
2809 | XPUSHs (newmortalFH (fd, O_RDWR)); |
2901 | XPUSHs (newmortalFH (fd, O_RDWR)); |
2810 | } |
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 | CODE: |
|
|
2929 | #if HAVE_MOUNT |
|
|
2930 | RETVAL = mount (special, path, fstype, flags, data); |
|
|
2931 | #else |
|
|
2932 | RETVAL = (errno = ENOSYS, -1); |
|
|
2933 | #endif |
|
|
2934 | OUTPUT: RETVAL |
|
|
2935 | |
|
|
2936 | int |
|
|
2937 | umount (octet_string path, int flags = 0) |
|
|
2938 | CODE: |
|
|
2939 | if (flags) |
|
|
2940 | #if HAVE_UMOUNT2 |
|
|
2941 | RETVAL = umount2 (path, flags); |
|
|
2942 | #else |
|
|
2943 | RETVAL = (errno = ENOSYS, -1); |
|
|
2944 | #endif |
|
|
2945 | else |
|
|
2946 | #if HAVE_UMOUNT |
|
|
2947 | RETVAL = umount (path); |
|
|
2948 | #else |
|
|
2949 | RETVAL = (errno = ENOSYS, -1); |
|
|
2950 | #endif |
|
|
2951 | OUTPUT: RETVAL |
2811 | |
2952 | |
2812 | UV |
2953 | UV |
2813 | get_fdlimit () |
2954 | get_fdlimit () |
2814 | CODE: |
2955 | CODE: |
2815 | #if HAVE_RLIMITS |
2956 | #if HAVE_RLIMITS |