added keepalive tool
[tridge/junkcode.git] / mmap_check.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <fcntl.h>
4 #include <unistd.h>
5 #include <sys/mman.h>
6 #include <fcntl.h>
7 #include <sys/socket.h>
8 #include <sys/wait.h>
9
10 #ifndef MAP_FILE
11 #define MAP_FILE 0
12 #endif
13
14
15 static pid_t child_pid;
16
17 #define LENGTH (1<<20)
18 #define FNAME "mmap.dat"
19
20 static void child_main(int pfd)
21 {
22         int fd;
23         char *map;
24
25         while ((fd = open(FNAME,O_RDWR)) == -1) sleep(1);
26
27         map = mmap(0, LENGTH, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FILE, fd, 0);
28
29         while (1) {
30                 int ofs, len, ret;
31                 int i;
32                 char buf[64];
33
34                 read(pfd, &ofs, sizeof(ofs));
35                 read(pfd, &len, sizeof(len));
36
37                 if (random() % 2) {
38                         memcpy(buf, map+ofs, len);
39                 } else {
40                         pread(fd, buf, len, ofs);
41                 }
42
43                 for (i=0;i<len;i++) {
44                         if (buf[i] != (char)(ofs+len+i)) {
45                                 printf("child failed\n");
46                                 exit(1);
47                         }
48                 }
49
50                 ret = 0;
51                 write(pfd, &ret, sizeof(ret));
52         }
53 }
54
55         
56 static void parent_main(int pfd)
57 {
58         char *map;
59         int fd = open(FNAME,O_RDWR|O_CREAT|O_TRUNC, 0600);
60
61         ftruncate(fd, LENGTH);
62
63         map = mmap(0, LENGTH, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FILE, fd, 0);
64
65         while (1) {
66                 int ofs, len, ret;
67                 int i;
68                 char buf[64];
69
70                 ofs = random() % (LENGTH-64);
71                 len = random() % 64;
72
73                 for (i=0;i<len;i++) buf[i] = ofs+len+i;
74
75                 if (random() % 2) {
76                         memcpy(map+ofs, buf, len);
77                 } else {
78                         pwrite(fd, buf, len, ofs);
79                 }
80
81                 write(pfd, &ofs, sizeof(ofs));
82                 write(pfd, &len, sizeof(len));
83
84                 read(pfd, &ret, sizeof(ret));
85         }
86 }
87
88
89
90 int main()
91 {
92         int pfd[2];
93
94         socketpair(AF_UNIX, SOCK_STREAM, 0, pfd);
95
96         srandom(getpid());
97
98         if ((child_pid=fork()) == 0) {
99                 close(pfd[0]);
100                 child_main(pfd[1]);
101         } else {
102                 close(pfd[1]);
103                 parent_main(pfd[0]);
104         }
105         return 0;
106 }