… | |
… | |
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 | |
… | |
… | |
226 | |
237 | |
227 | #if PAGESIZE <= 0 |
238 | #if PAGESIZE <= 0 |
228 | # define PAGESIZE sysconf (_SC_PAGESIZE) |
239 | # define PAGESIZE sysconf (_SC_PAGESIZE) |
229 | #endif |
240 | #endif |
230 | |
241 | |
|
|
242 | /* solaris perl seems to declare a wrong syscall function that clashes with system includes */ |
|
|
243 | #ifdef __sun |
|
|
244 | # undef HAVE_SYSCALL |
|
|
245 | #endif |
|
|
246 | |
|
|
247 | #if HAVE_SYSCALL |
|
|
248 | #include <sys/syscall.h> |
|
|
249 | #else |
|
|
250 | # define syscall(nr,...) (errno = ENOSYS, -1) |
|
|
251 | #endif |
|
|
252 | |
231 | /*****************************************************************************/ |
253 | /*****************************************************************************/ |
232 | |
254 | |
233 | #if !_POSIX_MAPPED_FILES |
255 | #if !_POSIX_MAPPED_FILES |
234 | # define mmap(addr,length,prot,flags,fd,offs) (errno = ENOSYS, (void *)-1) |
256 | # define mmap(addr,length,prot,flags,fd,offs) (errno = ENOSYS, (void *)-1) |
235 | # define munmap(addr,length) EIO_ENOSYS () |
257 | # define munmap(addr,length) EIO_ENOSYS () |
… | |
… | |
344 | int count = req->int3; |
366 | int count = req->int3; |
345 | |
367 | |
346 | req->flags |= EIO_FLAG_PTR1_FREE; |
368 | req->flags |= EIO_FLAG_PTR1_FREE; |
347 | |
369 | |
348 | /* heuristic: start with 512 bytes (8 extents), and if that isn't enough, */ |
370 | /* heuristic: start with 512 bytes (8 extents), and if that isn't enough, */ |
349 | /* increase in 3.5kb steps */ |
371 | /* increase in fixed steps */ |
350 | if (count < 0) |
372 | if (count < 0) |
351 | count = 8; |
373 | count = 8; |
352 | |
374 | |
353 | fiemap = malloc (sizeof (*fiemap) + sizeof (struct fiemap_extent) * count); |
375 | fiemap = malloc (sizeof (*fiemap) + sizeof (struct fiemap_extent) * count); |
354 | errno = ENOMEM; |
376 | errno = ENOMEM; |
… | |
… | |
407 | |
429 | |
408 | for (count = 0; count < incmap->fm_mapped_extents; ++count) |
430 | for (count = 0; count < incmap->fm_mapped_extents; ++count) |
409 | { |
431 | { |
410 | struct fiemap_extent *e = incmap->fm_extents + count; |
432 | struct fiemap_extent *e = incmap->fm_extents + count; |
411 | |
433 | |
|
|
434 | fiemap->fm_extents [fiemap->fm_mapped_extents++] = *e; |
|
|
435 | |
412 | if (e->fe_logical + e->fe_length >= end_offset) |
436 | if (e->fe_logical >= end_offset) |
413 | goto done; |
437 | goto done; |
414 | |
|
|
415 | fiemap->fm_extents [fiemap->fm_mapped_extents++] = *e; |
|
|
416 | |
438 | |
417 | if (e->fe_flags & FIEMAP_EXTENT_LAST) |
439 | if (e->fe_flags & FIEMAP_EXTENT_LAST) |
418 | goto done; |
440 | goto done; |
419 | |
441 | |
420 | } |
442 | } |
… | |
… | |
1081 | return ts->tv_sec + ts->tv_nsec * 1e-9; |
1103 | return ts->tv_sec + ts->tv_nsec * 1e-9; |
1082 | } |
1104 | } |
1083 | |
1105 | |
1084 | /*****************************************************************************/ |
1106 | /*****************************************************************************/ |
1085 | |
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; |
|
|
1132 | } |
|
|
1133 | |
|
|
1134 | /*****************************************************************************/ |
|
|
1135 | |
1086 | XS(boot_IO__AIO) ecb_cold; |
1136 | XS(boot_IO__AIO) ecb_cold; |
1087 | |
1137 | |
1088 | MODULE = IO::AIO PACKAGE = IO::AIO |
1138 | MODULE = IO::AIO PACKAGE = IO::AIO |
1089 | |
1139 | |
1090 | PROTOTYPES: ENABLE |
1140 | PROTOTYPES: ENABLE |
… | |
… | |
1191 | const_iv (MAP_NONBLOCK) |
1241 | const_iv (MAP_NONBLOCK) |
1192 | const_iv (MAP_GROWSDOWN) |
1242 | const_iv (MAP_GROWSDOWN) |
1193 | const_iv (MAP_32BIT) |
1243 | const_iv (MAP_32BIT) |
1194 | const_iv (MAP_HUGETLB) |
1244 | const_iv (MAP_HUGETLB) |
1195 | 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) |
1196 | |
1250 | |
1197 | const_iv (MREMAP_MAYMOVE) |
1251 | const_iv (MREMAP_MAYMOVE) |
1198 | const_iv (MREMAP_FIXED) |
1252 | const_iv (MREMAP_FIXED) |
1199 | |
1253 | |
1200 | const_iv (MSG_CMSG_CLOEXEC) |
1254 | const_iv (MSG_CMSG_CLOEXEC) |
… | |
… | |
1222 | |
1276 | |
1223 | const_iv (FS_IOC_GETFLAGS) |
1277 | const_iv (FS_IOC_GETFLAGS) |
1224 | const_iv (FS_IOC_SETFLAGS) |
1278 | const_iv (FS_IOC_SETFLAGS) |
1225 | const_iv (FS_IOC_GETVERSION) |
1279 | const_iv (FS_IOC_GETVERSION) |
1226 | const_iv (FS_IOC_SETVERSION) |
1280 | const_iv (FS_IOC_SETVERSION) |
|
|
1281 | #if HAVE_FIEMAP /* broken on musl for, like, foreever */ |
1227 | const_iv (FS_IOC_FIEMAP) |
1282 | const_iv (FS_IOC_FIEMAP) |
|
|
1283 | #endif |
1228 | const_iv (FS_IOC_FSGETXATTR) |
1284 | const_iv (FS_IOC_FSGETXATTR) |
1229 | const_iv (FS_IOC_FSSETXATTR) |
1285 | const_iv (FS_IOC_FSSETXATTR) |
1230 | const_iv (FS_IOC_SET_ENCRYPTION_POLICY) |
1286 | const_iv (FS_IOC_SET_ENCRYPTION_POLICY) |
1231 | const_iv (FS_IOC_GET_ENCRYPTION_PWSALT) |
1287 | const_iv (FS_IOC_GET_ENCRYPTION_PWSALT) |
1232 | const_iv (FS_IOC_GET_ENCRYPTION_POLICY) |
1288 | const_iv (FS_IOC_GET_ENCRYPTION_POLICY) |
… | |
… | |
1295 | const_iv (EFD_SEMAPHORE) |
1351 | const_iv (EFD_SEMAPHORE) |
1296 | |
1352 | |
1297 | const_iv (MFD_CLOEXEC) |
1353 | const_iv (MFD_CLOEXEC) |
1298 | const_iv (MFD_ALLOW_SEALING) |
1354 | const_iv (MFD_ALLOW_SEALING) |
1299 | const_iv (MFD_HUGETLB) |
1355 | const_iv (MFD_HUGETLB) |
|
|
1356 | const_iv (MFD_HUGETLB_2MB) |
|
|
1357 | const_iv (MFD_HUGETLB_1GB) |
1300 | |
1358 | |
1301 | const_iv (CLOCK_REALTIME) |
1359 | const_iv (CLOCK_REALTIME) |
1302 | const_iv (CLOCK_MONOTONIC) |
1360 | const_iv (CLOCK_MONOTONIC) |
1303 | const_iv (CLOCK_BOOTTIME) |
1361 | const_iv (CLOCK_BOOTTIME) |
1304 | const_iv (CLOCK_REALTIME_ALARM) |
1362 | const_iv (CLOCK_REALTIME_ALARM) |
… | |
… | |
1329 | const_iv (STATX_ATTR_APPEND) |
1387 | const_iv (STATX_ATTR_APPEND) |
1330 | const_iv (STATX_ATTR_NODUMP) |
1388 | const_iv (STATX_ATTR_NODUMP) |
1331 | const_iv (STATX_ATTR_ENCRYPTED) |
1389 | const_iv (STATX_ATTR_ENCRYPTED) |
1332 | const_iv (STATX_ATTR_AUTOMOUNT) |
1390 | const_iv (STATX_ATTR_AUTOMOUNT) |
1333 | |
1391 | |
|
|
1392 | const_iv (AT_FDCWD) |
|
|
1393 | const_iv (AT_SYMLINK_NOFOLLOW) |
|
|
1394 | const_iv (AT_EACCESS) |
|
|
1395 | const_iv (AT_REMOVEDIR) |
|
|
1396 | const_iv (AT_SYMLINK_FOLLOW) |
|
|
1397 | const_iv (AT_NO_AUTOMOUNT) |
|
|
1398 | const_iv (AT_EMPTY_PATH) |
|
|
1399 | const_iv (AT_STATX_SYNC_TYPE) |
|
|
1400 | const_iv (AT_STATX_AS_STAT) |
|
|
1401 | const_iv (AT_STATX_FORCE_SYNC) |
|
|
1402 | const_iv (AT_STATX_DONT_SYNC) |
|
|
1403 | const_iv (AT_RECURSIVE) |
|
|
1404 | |
|
|
1405 | const_iv (OPEN_TREE_CLONE) |
|
|
1406 | |
|
|
1407 | const_iv (FSOPEN_CLOEXEC) |
|
|
1408 | |
|
|
1409 | const_iv (FSPICK_CLOEXEC) |
|
|
1410 | const_iv (FSPICK_SYMLINK_NOFOLLOW) |
|
|
1411 | const_iv (FSPICK_NO_AUTOMOUNT) |
|
|
1412 | const_iv (FSPICK_EMPTY_PATH) |
|
|
1413 | |
|
|
1414 | const_iv (MOVE_MOUNT_F_SYMLINKS) |
|
|
1415 | const_iv (MOVE_MOUNT_F_AUTOMOUNTS) |
|
|
1416 | const_iv (MOVE_MOUNT_F_EMPTY_PATH) |
|
|
1417 | const_iv (MOVE_MOUNT_T_SYMLINKS) |
|
|
1418 | const_iv (MOVE_MOUNT_T_AUTOMOUNTS) |
|
|
1419 | const_iv (MOVE_MOUNT_T_EMPTY_PATH) |
|
|
1420 | |
|
|
1421 | /* waitid */ |
|
|
1422 | const_iv (P_PID) |
|
|
1423 | const_iv (P_PIDFD) |
|
|
1424 | const_iv (P_PGID) |
|
|
1425 | const_iv (P_ALL) |
|
|
1426 | |
|
|
1427 | const_iv (FSCONFIG_SET_FLAG) |
|
|
1428 | const_iv (FSCONFIG_SET_STRING) |
|
|
1429 | const_iv (FSCONFIG_SET_BINARY) |
|
|
1430 | const_iv (FSCONFIG_SET_PATH) |
|
|
1431 | const_iv (FSCONFIG_SET_PATH_EMPTY) |
|
|
1432 | const_iv (FSCONFIG_SET_FD) |
|
|
1433 | const_iv (FSCONFIG_CMD_CREATE) |
|
|
1434 | const_iv (FSCONFIG_CMD_RECONFIGURE) |
|
|
1435 | |
|
|
1436 | const_iv (MOUNT_ATTR_RDONLY) |
|
|
1437 | const_iv (MOUNT_ATTR_NOSUID) |
|
|
1438 | const_iv (MOUNT_ATTR_NODEV) |
|
|
1439 | const_iv (MOUNT_ATTR_NOEXEC) |
|
|
1440 | const_iv (MOUNT_ATTR__ATIME) |
|
|
1441 | const_iv (MOUNT_ATTR_RELATIME) |
|
|
1442 | const_iv (MOUNT_ATTR_NOATIME) |
|
|
1443 | const_iv (MOUNT_ATTR_STRICTATIME) |
|
|
1444 | const_iv (MOUNT_ATTR_NODIRATIME) |
|
|
1445 | |
|
|
1446 | /* sys/mount.h */ |
|
|
1447 | const_iv (MS_RDONLY) |
|
|
1448 | const_iv (MS_NOSUID) |
|
|
1449 | const_iv (MS_NODEV) |
|
|
1450 | const_iv (MS_NOEXEC) |
|
|
1451 | const_iv (MS_SYNCHRONOUS) |
|
|
1452 | const_iv (MS_REMOUNT) |
|
|
1453 | const_iv (MS_MANDLOCK) |
|
|
1454 | const_iv (MS_DIRSYNC) |
|
|
1455 | const_iv (MS_NOATIME) |
|
|
1456 | const_iv (MS_NODIRATIME) |
|
|
1457 | const_iv (MS_BIND) |
|
|
1458 | const_iv (MS_MOVE) |
|
|
1459 | const_iv (MS_REC) |
|
|
1460 | const_iv (MS_SILENT) |
|
|
1461 | const_iv (MS_POSIXACL) |
|
|
1462 | const_iv (MS_UNBINDABLE) |
|
|
1463 | const_iv (MS_PRIVATE) |
|
|
1464 | const_iv (MS_SLAVE) |
|
|
1465 | const_iv (MS_SHARED) |
|
|
1466 | const_iv (MS_RELATIME) |
|
|
1467 | const_iv (MS_KERNMOUNT) |
|
|
1468 | const_iv (MS_I_VERSION) |
|
|
1469 | const_iv (MS_STRICTATIME) |
|
|
1470 | const_iv (MS_LAZYTIME) |
|
|
1471 | const_iv (MS_ACTIVE) |
|
|
1472 | const_iv (MS_NOUSER) |
|
|
1473 | const_iv (MS_RMT_MASK) |
|
|
1474 | const_iv (MS_MGC_VAL) |
|
|
1475 | const_iv (MS_MGC_MSK) |
|
|
1476 | |
|
|
1477 | const_iv (MNT_FORCE) |
|
|
1478 | const_iv (MNT_DETACH) |
|
|
1479 | const_iv (MNT_EXPIRE) |
|
|
1480 | const_iv (UMOUNT_NOFOLLOW) |
|
|
1481 | |
|
|
1482 | const_iv (BLKROSET) |
|
|
1483 | const_iv (BLKROGET) |
|
|
1484 | const_iv (BLKRRPART) |
|
|
1485 | const_iv (BLKGETSIZE) |
|
|
1486 | const_iv (BLKFLSBUF) |
|
|
1487 | const_iv (BLKRASET) |
|
|
1488 | const_iv (BLKRAGET) |
|
|
1489 | const_iv (BLKFRASET) |
|
|
1490 | const_iv (BLKFRAGET) |
|
|
1491 | const_iv (BLKSECTSET) |
|
|
1492 | const_iv (BLKSECTGET) |
|
|
1493 | const_iv (BLKSSZGET) |
|
|
1494 | const_iv (BLKBSZGET) |
|
|
1495 | const_iv (BLKBSZSET) |
|
|
1496 | const_iv (BLKGETSIZE64) |
|
|
1497 | |
1334 | /* these are libeio constants, and are independent of gendef0 */ |
1498 | /* these are libeio constants, and are independent of gendef0 */ |
1335 | const_eio (SEEK_SET) |
1499 | const_eio (SEEK_SET) |
1336 | const_eio (SEEK_CUR) |
1500 | const_eio (SEEK_CUR) |
1337 | const_eio (SEEK_END) |
1501 | const_eio (SEEK_END) |
1338 | |
1502 | |
… | |
… | |
2512 | } |
2676 | } |
2513 | |
2677 | |
2514 | int res = accept4 (rfh, salen ? (struct sockaddr *)SvPVX (sockaddr) : 0, salen ? &salen_ : 0, flags); |
2678 | int res = accept4 (rfh, salen ? (struct sockaddr *)SvPVX (sockaddr) : 0, salen ? &salen_ : 0, flags); |
2515 | |
2679 | |
2516 | retval = newmortalFH (res, O_RDWR); |
2680 | retval = newmortalFH (res, O_RDWR); |
2517 | sv_dump(retval); |
|
|
2518 | |
2681 | |
2519 | if (res >= 0 && salen > 0) |
2682 | if (res >= 0 && salen > 0) |
2520 | { |
2683 | { |
2521 | if (salen_ > salen + 1) |
2684 | if (salen_ > salen + 1) |
2522 | salen_ = salen + 1; |
2685 | salen_ = salen + 1; |
… | |
… | |
2529 | retval = &PL_sv_undef; |
2692 | retval = &PL_sv_undef; |
2530 | #endif |
2693 | #endif |
2531 | XPUSHs (retval); |
2694 | XPUSHs (retval); |
2532 | } |
2695 | } |
2533 | |
2696 | |
2534 | int |
2697 | ssize_t |
2535 | splice (aio_rfd rfh, SV *off_in, aio_wfd wfh, SV *off_out, size_t length, unsigned int flags) |
2698 | splice (aio_rfd rfh, SV *off_in, aio_wfd wfh, SV *off_out, size_t length, unsigned int flags) |
2536 | CODE: |
2699 | CODE: |
2537 | { |
2700 | { |
2538 | #if HAVE_LINUX_SPLICE |
2701 | #if HAVE_LINUX_SPLICE |
2539 | loff_t off_in_, off_out_; |
2702 | loff_t off_in_, off_out_; |
… | |
… | |
2547 | #endif |
2710 | #endif |
2548 | } |
2711 | } |
2549 | OUTPUT: |
2712 | OUTPUT: |
2550 | RETVAL |
2713 | RETVAL |
2551 | |
2714 | |
2552 | int |
2715 | ssize_t |
2553 | tee (aio_rfd rfh, aio_wfd wfh, size_t length, unsigned int flags) |
2716 | tee (aio_rfd rfh, aio_wfd wfh, size_t length, unsigned int flags) |
2554 | CODE: |
2717 | CODE: |
2555 | #if HAVE_LINUX_SPLICE |
2718 | #if HAVE_LINUX_SPLICE |
2556 | RETVAL = tee (rfh, wfh, length, flags); |
2719 | RETVAL = tee (rfh, wfh, length, flags); |
2557 | #else |
2720 | #else |
… | |
… | |
2600 | PUSHs (newmortalFH (fd[1], O_WRONLY)); |
2763 | PUSHs (newmortalFH (fd[1], O_WRONLY)); |
2601 | } |
2764 | } |
2602 | } |
2765 | } |
2603 | |
2766 | |
2604 | void |
2767 | void |
|
|
2768 | pidfd_open (int pid, unsigned int flags = 0) |
|
|
2769 | PPCODE: |
|
|
2770 | { |
|
|
2771 | /*GENDEF0_SYSCALL(pidfd_open,434)*/ |
|
|
2772 | int fd = syscall (SYS_pidfd_open, pid, flags); |
|
|
2773 | XPUSHs (newmortalFH (fd, O_RDWR)); |
|
|
2774 | } |
|
|
2775 | |
|
|
2776 | int |
|
|
2777 | pidfd_send_signal (SV *pidfh, int sig, SV *siginfo = &PL_sv_undef, unsigned int flags = 0) |
|
|
2778 | PPCODE: |
|
|
2779 | { |
|
|
2780 | int res; |
|
|
2781 | #if HAVE_SIGINFO_T |
|
|
2782 | siginfo_t si = { 0 }; |
|
|
2783 | |
|
|
2784 | if (SvOK (siginfo)) |
|
|
2785 | { |
|
|
2786 | HV *hv; |
|
|
2787 | SV **svp; |
|
|
2788 | |
|
|
2789 | if (!SvROK (siginfo) || SvTYPE (SvRV (siginfo)) != SVt_PVHV) |
|
|
2790 | croak ("siginfo argument must be a hashref with 'code', 'pid', 'uid' and 'value_int' or 'value_ptr' members, caught"); |
|
|
2791 | |
|
|
2792 | hv = (HV *)SvRV (siginfo); |
|
|
2793 | |
|
|
2794 | if ((svp = hv_fetchs (hv, "code" , 0))) si.si_code = SvIV (*svp); |
|
|
2795 | if ((svp = hv_fetchs (hv, "pid" , 0))) si.si_pid = SvIV (*svp); |
|
|
2796 | if ((svp = hv_fetchs (hv, "uid" , 0))) si.si_uid = SvIV (*svp); |
|
|
2797 | if ((svp = hv_fetchs (hv, "value_int", 0))) si.si_value.sival_int = SvIV (*svp); |
|
|
2798 | if ((svp = hv_fetchs (hv, "value_ptr", 0))) si.si_value.sival_ptr = (void *)SvIV (*svp); |
|
|
2799 | } |
|
|
2800 | |
|
|
2801 | /*GENDEF0_SYSCALL(pidfd_send_signal,424)*/ |
|
|
2802 | res = syscall (SYS_pidfd_send_signal, s_fileno_croak (pidfh, 0), sig, SvOK (siginfo) ? &si : 0, flags); |
|
|
2803 | #else |
|
|
2804 | res = (errno = ENOSYS, -1); |
|
|
2805 | #endif |
|
|
2806 | |
|
|
2807 | XPUSHs (sv_2mortal (newSViv (res))); |
|
|
2808 | } |
|
|
2809 | |
|
|
2810 | void |
|
|
2811 | pidfd_getfd (SV *pidfh, int targetfd, unsigned int flags = 0) |
|
|
2812 | PPCODE: |
|
|
2813 | { |
|
|
2814 | /*GENDEF0_SYSCALL(pidfd_getfd,438)*/ |
|
|
2815 | int fd = syscall (SYS_pidfd_getfd, s_fileno_croak (pidfh, 0), targetfd, flags); |
|
|
2816 | XPUSHs (newmortalFH (fd, O_RDWR)); |
|
|
2817 | } |
|
|
2818 | |
|
|
2819 | void |
2605 | eventfd (unsigned int initval = 0, int flags = 0) |
2820 | eventfd (unsigned int initval = 0, int flags = 0) |
2606 | PPCODE: |
2821 | PPCODE: |
2607 | { |
2822 | { |
2608 | int fd; |
2823 | int fd; |
2609 | #if HAVE_EVENTFD |
2824 | #if HAVE_EVENTFD |
… | |
… | |
2673 | errno = ENOSYS; |
2888 | errno = ENOSYS; |
2674 | #endif |
2889 | #endif |
2675 | } |
2890 | } |
2676 | |
2891 | |
2677 | void |
2892 | void |
2678 | memfd_create (SV8 *pathname, int flags = 0) |
2893 | memfd_create (octet_string pathname, int flags = 0) |
2679 | PPCODE: |
2894 | PPCODE: |
2680 | { |
2895 | { |
2681 | int fd; |
2896 | int fd; |
2682 | #if HAVE_MEMFD_CREATE |
2897 | #if HAVE_MEMFD_CREATE |
2683 | fd = memfd_create (SvPVbyte_nolen (pathname), flags); |
2898 | fd = memfd_create (pathname, flags); |
2684 | #else |
2899 | #else |
2685 | fd = (errno = ENOSYS, -1); |
2900 | fd = (errno = ENOSYS, -1); |
2686 | #endif |
2901 | #endif |
2687 | |
2902 | |
2688 | XPUSHs (newmortalFH (fd, O_RDWR)); |
2903 | XPUSHs (newmortalFH (fd, O_RDWR)); |
2689 | } |
2904 | } |
|
|
2905 | |
|
|
2906 | int |
|
|
2907 | fexecve (SV *fh, SV *args, SV *envs = &PL_sv_undef) |
|
|
2908 | CODE: |
|
|
2909 | { |
|
|
2910 | int fd = PerlIO_fileno (IoIFP (sv_2io (fh))); |
|
|
2911 | char **envp, **argv; |
|
|
2912 | argv = extract_stringvec (args, "IO::AIO::fexecve: args must be an array of strings"); |
|
|
2913 | if (!SvOK (envs)) |
|
|
2914 | { |
|
|
2915 | extern char **environ; |
|
|
2916 | envp = environ; |
|
|
2917 | } |
|
|
2918 | else |
|
|
2919 | envp = extract_stringvec (envs, "IO::AIO::fexecve: envs must be an array of strings"); |
|
|
2920 | #if HAVE_FEXECVE |
|
|
2921 | RETVAL = fexecve (fd, argv, envp); |
|
|
2922 | #else |
|
|
2923 | RETVAL = (errno = ENOSYS, -1); |
|
|
2924 | #endif |
|
|
2925 | } |
|
|
2926 | OUTPUT: RETVAL |
|
|
2927 | |
|
|
2928 | int |
|
|
2929 | mount (octet_string special, octet_string path, octet_string fstype, UV flags = 0, octet_string_ornull data = 0) |
|
|
2930 | CODE: |
|
|
2931 | #if HAVE_MOUNT |
|
|
2932 | RETVAL = mount (special, path, fstype, flags, data); |
|
|
2933 | #else |
|
|
2934 | RETVAL = (errno = ENOSYS, -1); |
|
|
2935 | #endif |
|
|
2936 | OUTPUT: RETVAL |
|
|
2937 | |
|
|
2938 | int |
|
|
2939 | umount (octet_string path, int flags = 0) |
|
|
2940 | CODE: |
|
|
2941 | if (flags) |
|
|
2942 | #if HAVE_UMOUNT2 |
|
|
2943 | RETVAL = umount2 (path, flags); |
|
|
2944 | #else |
|
|
2945 | RETVAL = (errno = ENOSYS, -1); |
|
|
2946 | #endif |
|
|
2947 | else |
|
|
2948 | #if HAVE_UMOUNT |
|
|
2949 | RETVAL = umount (path); |
|
|
2950 | #else |
|
|
2951 | RETVAL = (errno = ENOSYS, -1); |
|
|
2952 | #endif |
|
|
2953 | OUTPUT: RETVAL |
2690 | |
2954 | |
2691 | UV |
2955 | UV |
2692 | get_fdlimit () |
2956 | get_fdlimit () |
2693 | CODE: |
2957 | CODE: |
2694 | #if HAVE_RLIMITS |
2958 | #if HAVE_RLIMITS |
… | |
… | |
2728 | if (0 == setrlimit (RLIMIT_NOFILE, &rl)) |
2992 | if (0 == setrlimit (RLIMIT_NOFILE, &rl)) |
2729 | XSRETURN_YES; |
2993 | XSRETURN_YES; |
2730 | |
2994 | |
2731 | if (errno == EPERM) |
2995 | if (errno == EPERM) |
2732 | { |
2996 | { |
2733 | /* setlimit failed with EPERM - maybe we can't raise the hardlimit, or maybe */ |
2997 | /* setrlimit failed with EPERM - maybe we can't raise the hardlimit, or maybe */ |
2734 | /* our limit overflows a system-wide limit */ |
2998 | /* our limit overflows a system-wide limit */ |
2735 | /* try an adaptive algorithm, but do not lower the hardlimit */ |
2999 | /* try an adaptive algorithm, but do not lower the hardlimit */ |
2736 | rl.rlim_max = 0; |
3000 | rl.rlim_max = 0; |
2737 | for (bit = 0x40000000U; bit; bit >>= 1) |
3001 | for (bit = 0x40000000U; bit; bit >>= 1) |
2738 | { |
3002 | { |
2739 | rl.rlim_max |= bit; |
3003 | rl.rlim_max |= bit; |
2740 | rl.rlim_cur = rl.rlim_max; |
3004 | rl.rlim_cur = rl.rlim_max; |
2741 | |
3005 | |
2742 | /* nevr decrease the hard limit */ |
3006 | /* never decrease the hard limit */ |
2743 | if (rl.rlim_max < orig_rlim_max) |
3007 | if (rl.rlim_max < orig_rlim_max) |
2744 | break; |
3008 | break; |
2745 | |
3009 | |
2746 | if (0 != setrlimit (RLIMIT_NOFILE, &rl)) |
3010 | if (0 != setrlimit (RLIMIT_NOFILE, &rl)) |
2747 | rl.rlim_max &= ~bit; /* too high, remove bit again */ |
3011 | rl.rlim_max &= ~bit; /* too high, remove bit again */ |