static struct lock_info *locks = NULL;
static unsigned int lock_num = 0;
-static const char info_to_arg[] = "mceoprwf";
+static const char info_to_arg[] = "mceoxprwf";
/* Dummy call used for failtest_undo wrappers. */
static struct failtest_call unrecorded_call;
}
/* We trap this so we can record it: we don't fail it. */
-int failtest_close(int fd)
+int failtest_close(int fd, const char *file, unsigned line)
{
int i;
+ struct close_call call;
+ struct failtest_call *p;
+
+ call.fd = fd;
+ p = add_history(FAILTEST_CLOSE, file, line, &call);
+ p->fail = false;
+
+ /* Consume close from failpath. */
+ if (failpath)
+ if (should_fail(p))
+ abort();
if (fd < 0)
return close(fd);
{
int i;
- if (control_fd == -1) {
- free_everything();
- exit(status);
- }
-
if (failtest_exit_check) {
if (!failtest_exit_check(history, history_num))
child_fail(NULL, 0, "failtest_exit_check failed\n");
}
+ if (control_fd == -1) {
+ free_everything();
+ exit(status);
+ }
+
/* Cleanup everything, in reverse order. */
for (i = history_num - 1; i >= 0; i--)
if (history[i].cleanup)