50424ab7c4766d79b54de9d5896773812ca85436
[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         } else {
36                 buffer = malloc(buffer_size);
37         }
38
39         zfd = open("/dev/zero", O_RDONLY);
40         nfd = open("/dev/null", O_WRONLY);
41
42         while (current_size < total_size) {
43                 ssize_t zret;
44                 ssize_t nret;
45
46                 errno = 0;
47                 if (buffer) {
48                         zret = read(zfd, buffer, buffer_size);
49                 } else {
50                         zret = splice(zfd, NULL, pfd[1], NULL,
51                                       buffer_size, SPLICE_F_MOVE|SPLICE_F_NONBLOCK);
52                 }
53                 if (zret < 0) {
54                         printf("%d: zret[%lld] errno[%d/%s]\n", __LINE__,
55                                 (long long int)zret, errno, strerror(errno));
56                         break;
57                 }
58
59                 errno = 0;
60                 if (buffer) {
61                         nret = write(nfd, buffer, zret);
62                 } else {
63                         nret = splice(pfd[0], NULL, nfd, NULL,
64                                       zret, SPLICE_F_MOVE|SPLICE_F_NONBLOCK);
65                 }
66                 if (nret < 0) {
67                         printf("%d: nret[%lld] errno[%d/%s]\n", __LINE__,
68                                 (long long int)nret, errno, strerror(errno));
69                         break;
70                 }
71                 if (nret != zret) {
72                         printf("%d: zret[%lld] nret[%lld]\n", __LINE__,
73                                 (long long int)zret,
74                                 (long long int)nret);
75                         break;
76                 }
77
78                 current_size += nret;
79                 i++;
80         }
81
82         printf("%s: i[%lld] total_size[%lld] buffer_size[%lld => %lld]\n",
83                 argv[1],
84                 (long long int)i,
85                 (long long int)total_size,
86                 (long long int)buffer_size,
87                 (long long int)(total_size/i));
88         return 0;
89 }