7 #define __NR_splice 313
9 #define __NR_vmsplice 316
10 #elif defined(__x86_64__)
11 #define __NR_splice 275
13 #define __NR_vmsplice 278
14 #elif defined(__powerpc__) || defined(__powerpc64__)
15 #define __NR_splice 283
17 #define __NR_vmsplice 285
18 #elif defined(__ia64__)
19 #define __NR_splice 1297
21 #define __NR_vmsplice 1301
23 #error unsupported arch
31 #define SPLICE_F_MOVE (0x01) /* move pages instead of copying */
32 #define SPLICE_F_NONBLOCK (0x02) /* don't block on the pipe splicing (but */
33 /* we may still block on the fd we splice */
34 /* from/to, of course */
35 #define SPLICE_F_MORE (0x04) /* expect more data */
37 static inline int splice(int fdin, loff_t *off_in, int fdout, loff_t *off_out,
38 size_t len, unsigned long flags)
40 return syscall(__NR_splice, fdin, off_in, fdout, off_out, len, flags);
44 static inline int tee(int fdin, int fdout, size_t len, unsigned int flags)
46 return syscall(__NR_tee, fdin, fdout, len, flags);
49 static inline int vmsplice(int fd, const struct iovec *iov,
50 unsigned long nr_segs, unsigned int flags)
52 return syscall(__NR_vmsplice, fd, iov, nr_segs, flags);
55 #define SPLICE_SIZE (64*1024)
57 #define BUG_ON(c) assert(!(c))
62 (void) (&_x == &_y); \
68 (void) (&_x == &_y); \
71 static inline int error(const char *n)