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 } 236