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