Fix various compile warnings
[splice.git] / splice.h
CommitLineData
d8525fbd
JA
1#ifndef SPLICE_H
2#define SPLICE_H
3
a05d2973 4#include <errno.h>
001a41ec 5#include <sys/uio.h>
76797253 6#include <sys/stat.h>
af14506c 7#include <linux/unistd.h>
001a41ec 8
d8525fbd 9#if defined(__i386__)
a05d2973
JA
10#define __NR_sys_splice 313
11#define __NR_sys_tee 315
12#define __NR_sys_vmsplice 316
d8525fbd 13#elif defined(__x86_64__)
a05d2973
JA
14#define __NR_sys_splice 275
15#define __NR_sys_tee 276
16#define __NR_sys_vmsplice 278
d8525fbd 17#elif defined(__powerpc__) || defined(__powerpc64__)
a05d2973
JA
18#define __NR_sys_splice 283
19#define __NR_sys_tee 284
20#define __NR_sys_vmsplice 285
d8525fbd 21#elif defined(__ia64__)
a05d2973
JA
22#define __NR_sys_splice 1297
23#define __NR_sys_tee 1301
24#define __NR_sys_vmsplice 1302
d8525fbd
JA
25#else
26#error unsupported arch
27#endif
28
5d4d8cbd
JA
29#ifndef SPLICE_F_MOVE
30
d8525fbd
JA
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 */
96897528 36#define SPLICE_F_GIFT (0x08) /* pages passed in are a gift */
d8525fbd 37
13b72067
JA
38#endif /* SPLICE_F_MOVE defined */
39
4ffe329a
JA
40/*
41 * SPLICE_F_UNMAP was introduced later, so check for that seperately
42 */
43#ifndef SPLICE_F_UNMAP
44#define SPLICE_F_UNMAP (0x10) /* undo vmsplice map */
45#endif
46
13b72067 47static inline int ssplice(int fdin, loff_t *off_in, int fdout, loff_t *off_out,
ae118771 48 size_t len, unsigned int flags)
d8525fbd 49{
1233e72a
BP
50
51 return syscall(__NR_sys_splice, fdin, off_in, fdout, off_out, len, flags);
d8525fbd
JA
52}
53
13b72067 54static inline int stee(int fdin, int fdout, size_t len, unsigned int flags)
d8525fbd 55{
1233e72a 56 return syscall(__NR_sys_tee, fdin, fdout, len, flags);
d8525fbd
JA
57}
58
13b72067
JA
59static inline int svmsplice(int fd, const struct iovec *iov,
60 unsigned long nr_segs, unsigned int flags)
7ee0f27f 61{
1233e72a 62 return syscall(__NR_sys_vmsplice, fd, iov, nr_segs, flags);
7ee0f27f
JA
63}
64
d8525fbd
JA
65#define SPLICE_SIZE (64*1024)
66
67#define BUG_ON(c) assert(!(c))
68
69#define min(x,y) ({ \
70 typeof(x) _x = (x); \
71 typeof(y) _y = (y); \
72 (void) (&_x == &_y); \
73 _x < _y ? _x : _y; })
74
75#define max(x,y) ({ \
76 typeof(x) _x = (x); \
77 typeof(y) _y = (y); \
78 (void) (&_x == &_y); \
79 _x > _y ? _x : _y; })
80
81static inline int error(const char *n)
82{
83 perror(n);
84 return -1;
85}
86
76797253
JA
87static int __check_pipe(int pfd)
88{
89 struct stat sb;
90
91 if (fstat(pfd, &sb) < 0)
92 return error("stat");
93 if (!S_ISFIFO(sb.st_mode))
94 return 1;
95
96 return 0;
97}
98
99static inline int check_input_pipe(void)
100{
101 if (!__check_pipe(STDIN_FILENO))
102 return 0;
103
104 fprintf(stderr, "stdin must be a pipe\n");
105 return 1;
106}
107
108static inline int check_output_pipe(void)
109{
110 if (!__check_pipe(STDOUT_FILENO))
111 return 0;
112
113 fprintf(stderr, "stdout must be a pipe\n");
114 return 1;
115}
116
d8525fbd 117#endif