blob: 612121a1cc4d07c310aaed0f2d29a35dd9ad525b [file] [log] [blame]
/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include "util.h"
int main(void) {
volatile pid_t* child_sibling = (pid_t*)malloc(sizeof(pid_t));
pid_t child = vfork();
test_assert(child != -1);
if (child == 0) {
*child_sibling = 0;
syscall(SYS_clone, CLONE_PARENT_SETTID | CLONE_PARENT | SIGCHLD, (void*)0,
child_sibling, (void*)0, 0L);
test_assert(*child_sibling != -1);
if (*child_sibling == 0) {
_exit(77);
}
test_assert(*child_sibling != 0);
_exit(76);
test_assert(0 && "Should not reach here");
}
test_assert(child != 0 && *child_sibling != 0);
int exit_code_sum = 0;
for (;;) {
int expected_exit_code = 0, status;
int ret = wait(&status);
if (ret == -1) {
test_assert(errno == ECHILD);
test_assert(exit_code_sum == 153);
atomic_puts("EXIT-SUCCESS");
syscall(SYS_exit, 0);
} else if (ret == child) {
expected_exit_code = 76;
} else if (ret == *child_sibling) {
expected_exit_code = 77;
} else {
test_assert(0 && "Unexpected child");
}
test_assert(WIFEXITED(status) && expected_exit_code == WEXITSTATUS(status));
exit_code_sum += expected_exit_code;
}
test_assert(0 && "Should not reach here");
return 1;
}