FAILTEST_READ,
FAILTEST_WRITE,
FAILTEST_FCNTL,
+ FAILTEST_MMAP,
+ FAILTEST_LSEEK
};
struct calloc_call {
const char *pathname;
int flags;
mode_t mode;
+ bool always_save;
+ bool closed;
+ /* This is used for O_TRUNC opens on existing files. */
+ struct contents_saved *saved;
};
struct close_call {
const void *buf;
size_t count;
off_t off;
+ bool is_pwrite;
+ struct failtest_call *opener;
+ struct contents_saved *saved;
};
struct fcntl_call {
} arg;
};
+struct mmap_call {
+ void *ret;
+ void *addr;
+ size_t length;
+ int prot;
+ int flags;
+ int fd;
+ off_t offset;
+ struct failtest_call *opener;
+ struct contents_saved *saved;
+};
+
+struct lseek_call {
+ ssize_t ret;
+ int fd;
+ off_t offset;
+ int whence;
+ off_t old_off;
+};
+
/**
* struct failtest_call - description of a call redirected to failtest module
* @type: the call type
/* What we set errno to. */
int error;
/* How do we clean this up? */
- void (*cleanup)(void *u);
+ void (*cleanup)(void *u, bool restore);
+ /* Should their program have cleaned up? */
+ bool can_leak;
+ /* Backtrace of call chain. */
+ void **backtrace;
+ unsigned int backtrace_num;
/* The actual call data. */
union {
struct calloc_call calloc;
struct read_call read;
struct write_call write;
struct fcntl_call fcntl;
+ struct mmap_call mmap;
+ struct lseek_call lseek;
} u;
};
* static enum failtest_result dont_fail_alloc(struct tlist_calls *history)
* {
* struct failtest_call *call;
- * call = tlist_tail(history, struct failtest_call, list);
+ * call = tlist_tail(history, list);
* if (call->type == FAILTEST_MALLOC
* || call->type == FAILTEST_CALLOC
* || call->type == FAILTEST_REALLOC)