diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c index 2ec0c76890d2d0b4be8904a250f14c4b95801998..187842d6be63ea0608fecc5348f7e5f69e0bab45 100644 --- a/gtests/net/packetdrill/run_system_call.c +++ b/gtests/net/packetdrill/run_system_call.c @@ -514,7 +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_ANY, /* accept any result */ + CHECK_ACCEPT, /* 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) @@ -558,8 +558,20 @@ static int end_syscall(struct state *state, struct syscall_spec *syscall, expected, actual); return STATUS_ERR; } - } else if (mode == CHECK_ANY) { - return STATUS_OK; + } else if (mode == CHECK_ACCEPT) { + 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"); } @@ -997,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_ANY, result, error)) + if (end_syscall(state, syscall, CHECK_ACCEPT, result, error)) return STATUS_ERR; if (result >= 0) {