Home | History | Annotate | Download | only in mman-win32
      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