| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | 
/* 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);}
 |