Index: sys/amd64/linux/linux_dummy.c =================================================================== --- sys/amd64/linux/linux_dummy.c +++ sys/amd64/linux/linux_dummy.c @@ -105,7 +105,6 @@ DUMMY(migrate_pages); DUMMY(unshare); /* Linux 2.6.17: */ -DUMMY(splice); DUMMY(tee); DUMMY(vmsplice); /* Linux 2.6.18: */ Index: sys/amd64/linux/syscalls.master =================================================================== --- sys/amd64/linux/syscalls.master +++ sys/amd64/linux/syscalls.master @@ -1612,7 +1612,14 @@ ); } 275 AUE_NULL STD { - int linux_splice(void); + int linux_splice( + int fd_in, + l_loff_t *off_in, + int fd_out, + l_loff_t *off_out, + l_size_t len, + l_uint flags + ); } 276 AUE_NULL STD { int linux_tee(void); Index: sys/amd64/linux32/linux32_dummy.c =================================================================== --- sys/amd64/linux32/linux32_dummy.c +++ sys/amd64/linux32/linux32_dummy.c @@ -102,7 +102,6 @@ DUMMY(migrate_pages); DUMMY(unshare); /* Linux 2.6.17: */ -DUMMY(splice); DUMMY(tee); DUMMY(vmsplice); /* Linux 2.6.18: */ Index: sys/amd64/linux32/syscalls.master =================================================================== --- sys/amd64/linux32/syscalls.master +++ sys/amd64/linux32/syscalls.master @@ -1731,7 +1731,14 @@ ); } 313 AUE_NULL STD { - int linux_splice(void); + int linux_splice( + int fd_in, + l_loff_t *off_in, + int fd_out, + l_loff_t *off_out, + l_size_t len, + l_uint flags + ); } 314 AUE_NULL STD { int linux_sync_file_range( Index: sys/compat/linux/linux_file.c =================================================================== --- sys/compat/linux/linux_file.c +++ sys/compat/linux/linux_file.c @@ -235,10 +235,42 @@ } #endif +static bool +linux_fd_is_tty(struct thread *td, int fd) +{ + struct file *fp; + struct vnode *vp; + int error; + bool is_tty; + + error = fget(td, fd, &cap_no_rights, &fp); + if (error != 0) + return (false); + + vp = fp->f_vnode; + if (vp == NULL || vp->v_type != VCHR) { + fdrop(fp, td); + return (false); + } + + dev_lock(); + if (vp->v_rdev != NULL && (vp->v_rdev->si_devsw->d_flags & D_TTY) != 0) + is_tty = true; + else + is_tty = false; + dev_unlock(); + fdrop(fp, td); + + return (is_tty); +} + int linux_lseek(struct thread *td, struct linux_lseek_args *args) { + if (linux_fd_is_tty(td, args->fdes)) + return (ESPIPE); + return (kern_lseek(td, args->fdes, args->off, args->whence)); } @@ -249,6 +281,9 @@ int error; off_t off; + if (linux_fd_is_tty(td, args->fd)) + return (ESPIPE); + off = (args->olow) | (((off_t) args->ohigh) << 32); error = kern_lseek(td, args->fd, off, args->whence); @@ -1765,4 +1800,12 @@ shmflags |= SHM_ALLOW_SEALING; return (kern_shm_open2(td, SHM_ANON, oflags, 0, shmflags, NULL, memfd_name)); +} + +int +linux_splice(struct thread *td, struct linux_splice_args *args) +{ + + linux_msg(td, "syscall splice not really implemented"); + return (EINVAL); } Index: sys/i386/linux/linux_dummy.c =================================================================== --- sys/i386/linux/linux_dummy.c +++ sys/i386/linux/linux_dummy.c @@ -98,7 +98,6 @@ DUMMY(migrate_pages); DUMMY(unshare); /* Linux 2.6.17: */ -DUMMY(splice); DUMMY(tee); DUMMY(vmsplice); /* Linux 2.6.18: */ Index: sys/i386/linux/syscalls.master =================================================================== --- sys/i386/linux/syscalls.master +++ sys/i386/linux/syscalls.master @@ -1753,7 +1753,14 @@ ); } 313 AUE_NULL STD { - int linux_splice(void); + int linux_splice( + int fd_in, + l_loff_t *off_in, + int fd_out, + l_loff_t *off_out, + l_size_t len, + l_uint flags + ); } 314 AUE_NULL STD { int linux_sync_file_range(