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