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