|
@@ -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);
|
|
|
}
|
|
|
-
|