3ebade98e396408f068a78df93633729074a3160
[metze/misc/junkcode.git] / splice / splice2.c
1 #define _GNU_SOURCE
2 #include <unistd.h>
3 #include <fcntl.h>
4 #include <sys/uio.h>
5 #include <stdlib.h>
6 #include <stdio.h>
7 #include <errno.h>
8 #include <string.h>
9 #include <stdint.h>
10 #include <sys/socket.h>
11 #include <sys/sendfile.h>
12
13 int main(int argc, const char * const *argv)
14 {
15         int pfd[2];
16         int zfd;
17         int nfd;
18         size_t i;
19         size_t total_size;
20         size_t current_size = 0;
21         uint8_t *buffer = NULL;;
22         size_t buffer_size;
23
24         if (argc != 4) {
25                 printf("%s: usage %s <'splice'|'rw'> <total_size> <buffer_size>\n",
26                         argv[0], argv[0]);
27                 exit(1);
28         }
29
30         total_size = strtoull(argv[2], NULL, 0);
31         buffer_size = strtoull(argv[3], NULL, 0);
32
33         if (strcmp(argv[1], "splice") == 0) {
34                 pipe(pfd);
35                 fcntl(pfd[1], F_SETPIPE_SZ, buffer_size);
36                 buffer_size = fcntl(pfd[1], F_GETPIPE_SZ);
37         } else {
38                 buffer = malloc(buffer_size);
39         }
40
41         zfd = open("/dev/zero", O_RDONLY);
42         nfd = open("/dev/null", O_WRONLY);
43
44         while (current_size < total_size) {
45                 ssize_t zret;
46                 ssize_t nret;
47
48                 errno = 0;
49                 if (buffer) {
50                         zret = read(zfd, buffer, buffer_size);
51                 } else {
52                         zret = splice(zfd, NULL, pfd[1], NULL,
53                                       buffer_size, SPLICE_F_MOVE|SPLICE_F_NONBLOCK);
54                 }
55                 if (zret < 0) {
56                         printf("%d: zret[%lld] errno[%d/%s]\n", __LINE__,
57                                 (long long int)zret, errno, strerror(errno));
58                         break;
59                 }
60
61                 errno = 0;
62                 if (buffer) {
63                         nret = write(nfd, buffer, zret);
64                 } else {
65                         nret = splice(pfd[0], NULL, nfd, NULL,
66                                       zret, SPLICE_F_MOVE|SPLICE_F_NONBLOCK);
67                 }
68                 if (nret < 0) {
69                         printf("%d: nret[%lld] errno[%d/%s]\n", __LINE__,
70                                 (long long int)nret, errno, strerror(errno));
71                         break;
72                 }
73                 if (nret != zret) {
74                         printf("%d: zret[%lld] nret[%lld]\n", __LINE__,
75                                 (long long int)zret,
76                                 (long long int)nret);
77                         break;
78                 }
79
80                 current_size += nret;
81                 i++;
82         }
83
84         printf("%s: i[%lld] total_size[%lld] buffer_size[%lld => %lld]\n",
85                 argv[1],
86                 (long long int)i,
87                 (long long int)total_size,
88                 (long long int)buffer_size,
89                 (long long int)(total_size/i));
90         return 0;
91 }