DECL_TEMPLATE(linux, sys_pwritev);
DECL_TEMPLATE(linux, sys_dup3);
DECL_TEMPLATE(linux, sys_getcpu);
+DECL_TEMPLATE(linux, sys_splice);
// POSIX, but various sub-cases differ between Linux and Darwin.
DECL_TEMPLATE(linux, sys_fcntl);
LINX_(__NR_set_robust_list, sys_set_robust_list), // 273
LINXY(__NR_get_robust_list, sys_get_robust_list), // 274
-// LINX_(__NR_splice, sys_ni_syscall), // 275
+ LINX_(__NR_splice, sys_splice), // 275
// LINX_(__NR_tee, sys_ni_syscall), // 276
LINX_(__NR_sync_file_range, sys_sync_file_range), // 277
// LINX_(__NR_vmsplice, sys_ni_syscall), // 278
PRE_MEM_RASCIIZ("delete_module(name_user)", ARG1);
}
+/* ---------------------------------------------------------------------
+ splice wrappers
+ ------------------------------------------------------------------ */
+
+PRE(sys_splice)
+{
+ *flags |= SfMayBlock;
+ PRINT("sys_splice ( %ld, %#lx, %ld, %#lx, %ld, %ld )",
+ ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
+ PRE_REG_READ6(int32_t, "splice",
+ int, fd_in, vki_loff_t *, off_in,
+ int, fd_out, vki_loff_t *, off_out,
+ vki_size_t, len, unsigned int, flags);
+ if (!ML_(fd_allowed)(ARG1, "splice(fd_in)", tid, False) ||
+ !ML_(fd_allowed)(ARG3, "splice(fd_out)", tid, False)) {
+ SET_STATUS_Failure( VKI_EBADF );
+ } else {
+ if (ARG2 != 0)
+ PRE_MEM_READ( "splice(off_in)", ARG2, sizeof(vki_loff_t));
+ if (ARG4 != 0)
+ PRE_MEM_READ( "splice(off_out)", ARG4, sizeof(vki_loff_t));
+ }
+}
+
/* ---------------------------------------------------------------------
oprofile-related wrappers
------------------------------------------------------------------ */
// LINX_(__NR_unshare, sys_unshare), // 310
LINX_(__NR_set_robust_list, sys_set_robust_list), // 311
LINXY(__NR_get_robust_list, sys_get_robust_list), // 312
-// LINX_(__NR_splice, sys_ni_syscall), // 313
+ LINX_(__NR_splice, sys_splice), // 313
LINX_(__NR_sync_file_range, sys_sync_file_range), // 314
// LINX_(__NR_tee, sys_ni_syscall), // 315