add splice and vmsplice syscalls
authorRich Felker <dalias@aerifal.cx>
Mon, 23 Jul 2012 20:50:56 +0000 (16:50 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 23 Jul 2012 20:50:56 +0000 (16:50 -0400)
based on patches by orc and Isaac Dunham.

include/fcntl.h
src/linux/splice.c [new file with mode: 0644]
src/linux/vmsplice.c [new file with mode: 0644]

index fcb622a..f0e5671 100644 (file)
@@ -9,6 +9,12 @@ extern "C" {
 #define __NEED_pid_t
 #define __NEED_mode_t
 
+#ifdef _GNU_SOURCE
+#define __NEED_size_t
+#define __NEED_ssize_t
+#define __NEED_struct_iovec
+#endif
+
 #include <bits/alltypes.h>
 
 #include <bits/fcntl.h>
@@ -108,6 +114,12 @@ struct f_owner_ex {
        int type;
        pid_t pid;
 };
+#define SPLICE_F_MOVE 1
+#define SPLICE_F_NONBLOCK 2
+#define SPLICE_F_MORE 4
+#define SPLICE_F_GIFT 8
+ssize_t vmsplice(int, const struct iovec *, size_t, unsigned);
+ssize_t splice(int, off_t *, int, off_t *, size_t, unsigned);
 #endif
 
 #if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
diff --git a/src/linux/splice.c b/src/linux/splice.c
new file mode 100644 (file)
index 0000000..78b6220
--- /dev/null
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include "syscall.h"
+
+ssize_t splice(int fd_in, off_t *off_in, int fd_out, off_t *off_out, size_t len, unsigned flags)
+{
+       return syscall(SYS_splice, fd_in, off_in, fd_out, off_out, len, flags);
+}
diff --git a/src/linux/vmsplice.c b/src/linux/vmsplice.c
new file mode 100644 (file)
index 0000000..ebf13ee
--- /dev/null
@@ -0,0 +1,8 @@
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include "syscall.h"
+
+ssize_t vmsplice(int fd, const struct iovec *iov, size_t cnt, unsigned flags)
+{
+       return syscall(SYS_vmsplice, fd, iov, cnt, flags);
+}