[PATCH] vmsplice2: warning fix
[splice.git] / splice-test4s.c
1 #include <errno.h>
2 #include <fcntl.h>
3 #include <netinet/in.h>
4 #include <signal.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <sys/sendfile.h>
8 #include <sys/socket.h>
9 #include <sys/time.h>
10 #include <sys/types.h>
11 #include <unistd.h>
12
13 static int error(const char *n)
14 {
15         perror(n);
16         return -1;
17 }
18
19 static int parent(int listen_sk)
20 {
21         unsigned long received;
22         struct sockaddr addr;
23         unsigned int len = sizeof(addr);
24         int sk;
25
26 again:
27         sk = accept(listen_sk, &addr, &len);
28         if (sk < 0)
29                 return error("accept");
30
31         /* read forever */
32         received = 0;
33         for (;;) {
34                 int ret = recv(sk, NULL, 128*1024*1024, MSG_TRUNC);
35                 if (ret > 0) {
36                         received += ret;
37                         continue;
38                 }
39                 if (!ret)
40                         break;
41                 if (errno == EAGAIN || errno == EINTR)
42                         continue;
43                 break;
44         }
45
46         printf("Received %f MB of data\n", (double) received / (1024*1024));
47         close(sk);
48         goto again;
49 }
50
51 int main(int argc, char **argv)
52 {
53         unsigned int sk, len;
54         struct sockaddr addr;
55         struct sockaddr_in saddr_in;
56
57         signal(SIGCHLD, SIG_IGN);
58         sk = socket(PF_INET, SOCK_STREAM, 0);
59         if (sk < 0) {
60                 perror("socket");
61                 exit(1);
62         }
63         saddr_in.sin_addr.s_addr = htonl(INADDR_ANY);
64         saddr_in.sin_port = htons(1111);
65
66         if (bind(sk, (struct sockaddr*)&saddr_in, sizeof(saddr_in)) < 0) {
67                 fprintf(stderr,"bind failed\n");
68                 exit(1);
69         }
70
71         if (listen(sk, 1) < 0) {
72                 perror("listen");
73                 exit(1);
74         }
75         len = sizeof(addr);
76         if (getsockname(sk, &addr, &len) < 0) {
77                 perror("getsockname");
78                 exit(1);
79         }
80         return parent(sk);
81 }