Commit | Line | Data |
---|---|---|
81c4586f PC |
1 | |
2 | #include "mman.h" | |
3 | ||
4 | #include <errno.h> | |
5 | #include <fcntl.h> | |
6 | #include <sys/stat.h> | |
7 | ||
8 | #ifndef NULL | |
9 | #define NULL (void*)0 | |
10 | #endif | |
11 | ||
12 | const char* map_file_name = "map_file.dat"; | |
13 | ||
14 | int test_anon_map_readwrite() | |
15 | { | |
16 | void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE, | |
17 | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); | |
18 | if (map == MAP_FAILED) | |
19 | { | |
20 | printf("mmap (MAP_ANONYMOUS, PROT_READ | PROT_WRITE) returned unexpected error: %d\n", errno); | |
21 | return -1; | |
22 | } | |
23 | ||
24 | *((unsigned char*)map) = 1; | |
25 | ||
26 | int result = munmap(map, 1024); | |
27 | ||
28 | if (result != 0) | |
29 | printf("munmap (MAP_ANONYMOUS, PROT_READ | PROT_WRITE) returned unexpected error: %d\n", errno); | |
30 | ||
31 | return result; | |
32 | } | |
33 | ||
34 | int test_anon_map_readonly() | |
35 | { | |
36 | void* map = mmap(NULL, 1024, PROT_READ, | |
37 | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); | |
38 | if (map == MAP_FAILED) | |
39 | { | |
40 | printf("mmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno); | |
41 | return -1; | |
42 | } | |
43 | ||
44 | *((unsigned char*)map) = 1; | |
45 | ||
46 | int result = munmap(map, 1024); | |
47 | ||
48 | if (result != 0) | |
49 | printf("munmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno); | |
50 | ||
51 | return result; | |
52 | } | |
53 | ||
54 | int test_anon_map_writeonly() | |
55 | { | |
56 | void* map = mmap(NULL, 1024, PROT_WRITE, | |
57 | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); | |
58 | if (map == MAP_FAILED) | |
59 | { | |
60 | printf("mmap (MAP_ANONYMOUS, PROT_WRITE) returned unexpected error: %d\n", errno); | |
61 | return -1; | |
62 | } | |
63 | ||
64 | *((unsigned char*)map) = 1; | |
65 | ||
66 | int result = munmap(map, 1024); | |
67 | ||
68 | if (result != 0) | |
69 | printf("munmap (MAP_ANONYMOUS, PROT_WRITE) returned unexpected error: %d\n", errno); | |
70 | ||
71 | return result; | |
72 | } | |
73 | ||
74 | int test_anon_map_readonly_nowrite() | |
75 | { | |
76 | void* map = mmap(NULL, 1024, PROT_READ, | |
77 | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); | |
78 | if (map == MAP_FAILED) | |
79 | { | |
80 | printf("mmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno); | |
81 | return -1; | |
82 | } | |
83 | ||
84 | if (*((unsigned char*)map) != 0) | |
85 | printf("test_anon_map_readonly_nowrite (MAP_ANONYMOUS, PROT_READ) returned unexpected value: %d\n", | |
86 | (int)*((unsigned char*)map)); | |
87 | ||
88 | int result = munmap(map, 1024); | |
89 | ||
90 | if (result != 0) | |
91 | printf("munmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno); | |
92 | ||
93 | return result; | |
94 | } | |
95 | ||
96 | int test_file_map_readwrite() | |
97 | { | |
98 | mode_t mode = S_IRUSR | S_IWUSR; | |
99 | int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode); | |
100 | ||
101 | void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0); | |
102 | if (map == MAP_FAILED) | |
103 | { | |
104 | printf("mmap returned unexpected error: %d\n", errno); | |
105 | return -1; | |
106 | } | |
107 | ||
108 | *((unsigned char*)map) = 1; | |
109 | ||
110 | int result = munmap(map, 1024); | |
111 | ||
112 | if (result != 0) | |
113 | printf("munmap returned unexpected error: %d\n", errno); | |
114 | ||
115 | close(o); | |
116 | ||
117 | /*TODO: get file info and content and compare it with the sources conditions */ | |
118 | unlink(map_file_name); | |
119 | ||
120 | return result; | |
121 | } | |
122 | ||
123 | int test_file_map_mlock_munlock() | |
124 | { | |
125 | const size_t map_size = 1024; | |
126 | ||
127 | int result = 0; | |
128 | mode_t mode = S_IRUSR | S_IWUSR; | |
129 | int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode); | |
130 | if (o == -1) | |
131 | { | |
132 | printf("unable to create file %s: %d\n", map_file_name, errno); | |
133 | return -1; | |
134 | } | |
135 | ||
136 | void* map = mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0); | |
137 | if (map == MAP_FAILED) | |
138 | { | |
139 | printf("mmap returned unexpected error: %d\n", errno); | |
140 | result = -1; | |
141 | goto done_close; | |
142 | } | |
143 | ||
144 | if (mlock(map, map_size) != 0) | |
145 | { | |
146 | printf("mlock returned unexpected error: %d\n", errno); | |
147 | result = -1; | |
148 | goto done_munmap; | |
149 | } | |
150 | ||
151 | *((unsigned char*)map) = 1; | |
152 | ||
153 | if (munlock(map, map_size) != 0) | |
154 | { | |
155 | printf("munlock returned unexpected error: %d\n", errno); | |
156 | result = -1; | |
157 | } | |
158 | ||
159 | done_munmap: | |
160 | result = munmap(map, map_size); | |
161 | ||
162 | if (result != 0) | |
163 | printf("munmap returned unexpected error: %d\n", errno); | |
164 | ||
165 | done_close: | |
166 | close(o); | |
167 | ||
168 | unlink(map_file_name); | |
169 | done: | |
170 | return result; | |
171 | } | |
172 | ||
173 | int test_file_map_msync() | |
174 | { | |
175 | const size_t map_size = 1024; | |
176 | ||
177 | int result = 0; | |
178 | mode_t mode = S_IRUSR | S_IWUSR; | |
179 | int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode); | |
180 | if (o == -1) | |
181 | { | |
182 | printf("unable to create file %s: %d\n", map_file_name, errno); | |
183 | return -1; | |
184 | } | |
185 | ||
186 | void* map = mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0); | |
187 | if (map == MAP_FAILED) | |
188 | { | |
189 | printf("mmap returned unexpected error: %d\n", errno); | |
190 | result = -1; | |
191 | goto done_close; | |
192 | } | |
193 | ||
194 | *((unsigned char*)map) = 1; | |
195 | ||
196 | if (msync(map, map_size, MS_SYNC) != 0) | |
197 | { | |
198 | printf("msync returned unexpected error: %d\n", errno); | |
199 | result = -1; | |
200 | } | |
201 | ||
202 | result = munmap(map, map_size); | |
203 | ||
204 | if (result != 0) | |
205 | printf("munmap returned unexpected error: %d\n", errno); | |
206 | ||
207 | done_close: | |
208 | close(o); | |
209 | ||
210 | unlink(map_file_name); | |
211 | done: | |
212 | return result; | |
213 | } | |
214 | ||
215 | #define EXEC_TEST(name) \ | |
216 | if (name() != 0) { result = -1; printf( #name ": fail\n"); } \ | |
217 | else { printf(#name ": pass\n"); } | |
218 | ||
219 | int main() | |
220 | { | |
221 | int result = 0; | |
222 | ||
223 | EXEC_TEST(test_anon_map_readwrite); | |
224 | //NOTE: this test must cause an access violation exception | |
225 | //EXEC_TEST(test_anon_map_readonly); | |
226 | EXEC_TEST(test_anon_map_readonly_nowrite); | |
227 | EXEC_TEST(test_anon_map_writeonly); | |
228 | ||
229 | EXEC_TEST(test_file_map_readwrite); | |
230 | EXEC_TEST(test_file_map_mlock_munlock); | |
231 | EXEC_TEST(test_file_map_msync); | |
232 | //TODO: EXEC_TEST(test_file_map_mprotect); | |
233 | ||
234 | return result; | |
235 | } |