#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/time.h>
+#include <sys/mman.h>
#include <signal.h>
#include <assert.h>
#include <ccan/time/time.h>
static pid_t orig_pid;
-static const char info_to_arg[] = "mceoxprwf";
+static const char info_to_arg[] = "mceoxprwfa";
/* Dummy call used for failtest_undo wrappers. */
static struct failtest_call unrecorded_call;
return p->u.open.ret;
}
+void *failtest_mmap(void *addr, size_t length, int prot, int flags,
+ int fd, off_t offset, const char *file, unsigned line)
+{
+ struct failtest_call *p;
+ struct mmap_call call;
+
+ call.addr = addr;
+ call.length = length;
+ call.prot = prot;
+ call.flags = flags;
+ call.offset = offset;
+ call.fd = fd;
+
+ p = add_history(FAILTEST_MMAP, file, line, &call);
+ if (should_fail(p)) {
+ p->u.mmap.ret = MAP_FAILED;
+ p->error = ENOMEM;
+ } else {
+ p->u.mmap.ret = mmap(addr, length, prot, flags, fd, offset);
+ }
+ errno = p->error;
+ return p->u.mmap.ret;
+}
+
static void cleanup_pipe(struct pipe_call *call)
{
if (!call->closed[0])
FAILTEST_READ,
FAILTEST_WRITE,
FAILTEST_FCNTL,
+ FAILTEST_MMAP,
};
struct calloc_call {
} arg;
};
+struct mmap_call {
+ void *ret;
+ void *addr;
+ size_t length;
+ int prot;
+ int flags;
+ int fd;
+ off_t offset;
+};
+
/**
* struct failtest_call - description of a call redirected to failtest module
* @type: the call type
struct read_call read;
struct write_call write;
struct fcntl_call fcntl;
+ struct mmap_call mmap;
} u;
};
/* Replacement of I/O. */
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#undef fcntl
#define fcntl(fd, ...) failtest_fcntl((fd), __FILE__, __LINE__, __VA_ARGS__)
+#undef mmap
+#define mmap(addr, length, prot, flags, fd, offset) \
+ failtest_mmap((addr), (length), (prot), (flags), (fd), (offset), \
+ __FILE__, __LINE__)
+
/* Replacement of getpid (since failtest will fork). */
#undef getpid
#define getpid() failtest_getpid(__FILE__, __LINE__)
const char *file, unsigned line);
ssize_t failtest_pwrite(int fd, const void *buf, size_t count, off_t offset,
const char *file, unsigned line);
+void *failtest_mmap(void *addr, size_t length, int prot, int flags,
+ int fd, off_t offset, const char *file, unsigned line);
int failtest_close(int fd, const char *file, unsigned line);
int failtest_fcntl(int fd, const char *file, unsigned line, int cmd, ...);
pid_t failtest_getpid(const char *file, unsigned line);
#define write(fd, buf, count) \
failtest_write((fd), (buf), (count), NULL, 0)
+#undef mmap
+#define mmap(addr, length, prot, flags, fd, offset) \
+ failtest_mmap((addr), (length), (prot), (flags), (fd), (offset), NULL, 0)
+
#undef close
#define close(fd) failtest_close(fd)