/* The mmap test is useful, since syscalls with 6 arguments * (as mmap) are done differently on various architectures. */ #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) { int i; struct mmap_test *t; for (i=0; i<SIZEOF_ARRAY(tests); ++i) { t = tests + i; errno = 0; t->ret = mmap(t->args.start, t->args.length, t->args.prot, t->args.flags, t->args.fd, t->args.offset); 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); } } exit(0); }