1*d4514f0bSApple OSS Distributions #include <string.h>
2*d4514f0bSApple OSS Distributions #include <stdio.h>
3*d4514f0bSApple OSS Distributions #include <stdlib.h>
4*d4514f0bSApple OSS Distributions #include <sys/reason.h>
5*d4514f0bSApple OSS Distributions #include <dispatch/dispatch.h>
6*d4514f0bSApple OSS Distributions #include <dispatch/private.h>
7*d4514f0bSApple OSS Distributions
8*d4514f0bSApple OSS Distributions #define TEST_REASON_CODE 4
9*d4514f0bSApple OSS Distributions
10*d4514f0bSApple OSS Distributions #define countof(x) (sizeof(x) / sizeof(x[0]))
11*d4514f0bSApple OSS Distributions
12*d4514f0bSApple OSS Distributions static bool
_should_spin(char * mode)13*d4514f0bSApple OSS Distributions _should_spin(char *mode)
14*d4514f0bSApple OSS Distributions {
15*d4514f0bSApple OSS Distributions // These tests are signaled by the parent
16*d4514f0bSApple OSS Distributions char *spin_modes[] = {
17*d4514f0bSApple OSS Distributions "spin",
18*d4514f0bSApple OSS Distributions "reason",
19*d4514f0bSApple OSS Distributions "reason_signal",
20*d4514f0bSApple OSS Distributions "clean",
21*d4514f0bSApple OSS Distributions "dirty",
22*d4514f0bSApple OSS Distributions };
23*d4514f0bSApple OSS Distributions for (size_t i = 0; i < countof(spin_modes); i++) {
24*d4514f0bSApple OSS Distributions if (strcmp(mode, spin_modes[i]) == 0) {
25*d4514f0bSApple OSS Distributions return true;
26*d4514f0bSApple OSS Distributions }
27*d4514f0bSApple OSS Distributions }
28*d4514f0bSApple OSS Distributions return false;
29*d4514f0bSApple OSS Distributions }
30*d4514f0bSApple OSS Distributions
31*d4514f0bSApple OSS Distributions int
main(int argc,char * argv[])32*d4514f0bSApple OSS Distributions main(int argc, char *argv[])
33*d4514f0bSApple OSS Distributions {
34*d4514f0bSApple OSS Distributions if (argc != 2) {
35*d4514f0bSApple OSS Distributions printf("Missing arguments\n");
36*d4514f0bSApple OSS Distributions exit(1);
37*d4514f0bSApple OSS Distributions }
38*d4514f0bSApple OSS Distributions
39*d4514f0bSApple OSS Distributions if (strcmp(argv[1], "crash") == 0) {
40*d4514f0bSApple OSS Distributions abort_with_reason(OS_REASON_TEST, TEST_REASON_CODE, "Test forcing crash", OS_REASON_FLAG_CONSISTENT_FAILURE | OS_REASON_FLAG_NO_CRASH_REPORT);
41*d4514f0bSApple OSS Distributions } else if (strcmp(argv[1], "success") == 0) {
42*d4514f0bSApple OSS Distributions exit(0);
43*d4514f0bSApple OSS Distributions } else if (strcmp(argv[1], "exit") == 0) {
44*d4514f0bSApple OSS Distributions exit(2);
45*d4514f0bSApple OSS Distributions } else if (strcmp(argv[1], "wait") == 0) {
46*d4514f0bSApple OSS Distributions signal(SIGUSR1, SIG_IGN);
47*d4514f0bSApple OSS Distributions dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, SIGUSR1, 0, NULL);
48*d4514f0bSApple OSS Distributions dispatch_source_set_event_handler(source, ^{
49*d4514f0bSApple OSS Distributions abort_with_reason(OS_REASON_TEST, TEST_REASON_CODE, "Test forcing crash", OS_REASON_FLAG_CONSISTENT_FAILURE | OS_REASON_FLAG_NO_CRASH_REPORT);
50*d4514f0bSApple OSS Distributions });
51*d4514f0bSApple OSS Distributions dispatch_activate(source);
52*d4514f0bSApple OSS Distributions } else if (_should_spin(argv[1])) {
53*d4514f0bSApple OSS Distributions while (1) {
54*d4514f0bSApple OSS Distributions // Do nothing until the parent kills us
55*d4514f0bSApple OSS Distributions continue;
56*d4514f0bSApple OSS Distributions }
57*d4514f0bSApple OSS Distributions } else {
58*d4514f0bSApple OSS Distributions printf("Unknown argument: %s\n", argv[1]);
59*d4514f0bSApple OSS Distributions exit(1);
60*d4514f0bSApple OSS Distributions }
61*d4514f0bSApple OSS Distributions dispatch_main();
62*d4514f0bSApple OSS Distributions }
63