diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index 5457c70580d851771f3834e2507778f75881e714..6330bdd83f743c253d7f9845614d3de4720799fd 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -514,6 +514,7 @@ static void begin_syscall(struct state *state, struct syscall_spec *syscall) enum result_check_t { CHECK_EXACT, /* check that result matches exactly */ CHECK_NON_NEGATIVE, /* check that result is non-negative */ + CHECK_ALLOW_MAPPING, /* checks for results after accept-syscall */ }; static int end_syscall(struct state *state, struct syscall_spec *syscall, enum result_check_t mode, int actual, char **error) @@ -557,6 +558,20 @@ static int end_syscall(struct state *state, struct syscall_spec *syscall, expected, actual); return STATUS_ERR; } + } else if (mode == CHECK_ALLOW_MAPPING) { + if ((expected >= 0) && (actual < 0)) { + asprintf(error, + "Expected non-negative result but got %d " + "with errno %d (%s)", + actual, actual_errno, strerror(actual_errno)); + return STATUS_ERR; + } + else if ((expected < 0) && (actual != expected)) { + asprintf(error, + "Expected result %d but got %d", + expected, actual); + return STATUS_ERR; + } } else { assert(!"bad mode"); } @@ -994,7 +1009,7 @@ static int syscall_accept(struct state *state, struct syscall_spec *syscall, result = accept(live_fd, (struct sockaddr *)&live_addr, &live_addrlen); - if (end_syscall(state, syscall, CHECK_NON_NEGATIVE, result, error)) + if (end_syscall(state, syscall, CHECK_ALLOW_MAPPING, result, error)) return STATUS_ERR; if (result >= 0) {