diff options
Diffstat (limited to 'test/mmap/mmap.c')
-rw-r--r-- | test/mmap/mmap.c | 62 |
1 files changed, 54 insertions, 8 deletions
diff --git a/test/mmap/mmap.c b/test/mmap/mmap.c index 3649461ac..8b29737a0 100644 --- a/test/mmap/mmap.c +++ b/test/mmap/mmap.c @@ -5,23 +5,69 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> +#include <errno.h> #include <unistd.h> #include <sys/mman.h> +#define SIZEOF_ARRAY(type) (sizeof(type)/sizeof(*type)) + +struct mmap_test { + void *ret; + int err; + struct { + void *start; + size_t length; + int prot; + int flags; + int fd; + off_t offset; + } args; +}; + +struct mmap_test tests[] = { + [0] { + .err = 0, + .args.start = NULL, + .args.length = 4096, + .args.prot = PROT_READ|PROT_WRITE, + .args.flags = MAP_PRIVATE|MAP_ANONYMOUS, + .args.fd = 0, + .args.offset = 0 + }, +}; + +#define err(fmt, args...) \ + do { \ + fprintf(stderr, fmt "\n" , ## args); \ + exit(1); \ + } while (0) +#define errp(fmt, args...) err(fmt ": %s" , ## args , strerror(errno)) int main(int argc, char **argv) { - void *ptr; + int i; + struct mmap_test *t; + for (i=0; i<SIZEOF_ARRAY(tests); ++i) { + t = tests + i; - ptr = mmap(NULL, 4096, PROT_READ|PROT_WRITE, - MAP_PRIVATE|MAP_ANONYMOUS, 0, 0); + errno = 0; + t->ret = mmap(t->args.start, t->args.length, t->args.prot, + t->args.flags, t->args.fd, t->args.offset); - if(ptr==MAP_FAILED){ - perror("mmap"); - exit(1); + if (t->err) { + if (t->ret != MAP_FAILED) + err("mmap test %i should have failed, but gave us %p", i, t->ret); + else if (t->err != errno) + errp("mmap test %i failed, but gave us wrong errno (got %i instead of %i)", i, errno, t->err); + } else { + if (t->ret == MAP_FAILED) + errp("mmap test %i failed", i); + else if (munmap(t->ret, t->args.length) != 0) + errp("munmap test %i failed", i); + } } - printf("mmap returned %p\n",ptr); + exit(0); } - |