scc

A fork of https://git.simple-cc.org/scc/ for Qute

git clone https://git.8pit.net/scc.git

  1#include <assert.h>
  2#include <setjmp.h>
  3#include <signal.h>
  4#include <stdio.h>
  5
  6sig_atomic_t abrt, fpe, iint, segv, term, def;
  7jmp_buf recover;
  8
  9/*
 10output:
 11test 1
 12test 2
 13test 3
 14test 4
 15end:
 16*/
 17
 18void
 19handler1(int sig)
 20{
 21	switch (sig) {
 22	case SIGABRT:
 23		abrt = 1;
 24		break;
 25	case SIGFPE:
 26		fpe = 1;
 27		break;
 28	case SIGINT:
 29		iint = 1;
 30		break;
 31	case SIGSEGV:
 32		segv = 1;
 33		break;
 34	case SIGTERM:
 35		term = 1;
 36		break;
 37	default:
 38		def = 1;
 39		break;
 40	}
 41}
 42
 43void
 44handler2(int sig)
 45{
 46	switch (sig) {
 47	case SIGABRT:
 48		abrt = 1;
 49		break;
 50	case SIGFPE:
 51		fpe = 1;
 52		break;
 53	case SIGINT:
 54		iint = 1;
 55		break;
 56	case SIGSEGV:
 57		segv = 1;
 58		break;
 59	case SIGTERM:
 60		term = 1;
 61		break;
 62	default:
 63		def = 1;
 64		break;
 65	}
 66	longjmp(recover, 1);
 67}
 68
 69void
 70test1()
 71{
 72	void (*shdl)(int);
 73
 74	puts("test 1");
 75	assert(signal(SIGABRT, handler1) == SIG_DFL);
 76	assert(signal(SIGFPE, handler1) == SIG_DFL);
 77
 78	shdl = signal(SIGINT, handler1);
 79	assert(shdl == SIG_DFL || shdl == SIG_IGN);
 80	assert(signal(SIGSEGV, handler1) == SIG_DFL);
 81	assert(signal(SIGTERM, handler1) == SIG_DFL);
 82}
 83
 84void
 85test2()
 86{
 87	puts("test 2");
 88	term = abrt = fpe = iint = segv = 0;
 89	assert(signal(SIGABRT, handler1) == handler1);
 90	assert(signal(SIGFPE, handler1) == handler1);
 91	assert(signal(SIGINT, handler1) == handler1);
 92	assert(signal(SIGSEGV, handler1) == handler1);
 93	assert(signal(SIGTERM, handler1) == handler1);
 94
 95	assert(raise(SIGABRT) != -1);
 96	assert(raise(SIGFPE) != -1);
 97	assert(raise(SIGINT) != -1);
 98	assert(raise(SIGSEGV) != -1);
 99	assert(raise(SIGTERM) != -1);
100
101	if (!abrt || !fpe || !iint || !segv || !term)
102		printf("a handled signal was missed: %d %d %d %d %d\n",
103		       abrt, fpe, iint, segv, term);
104	if (def)
105		puts("a wrong signal was received");
106}
107
108void
109test3()
110{
111	puts("test 3");
112	def = abrt = term = fpe = iint = segv = 0;
113	assert(signal(SIGABRT, SIG_IGN) == handler1);
114	assert(signal(SIGFPE, SIG_IGN) == handler1);
115	assert(signal(SIGINT, SIG_IGN) == handler1);
116	assert(signal(SIGSEGV, SIG_IGN) == handler1);
117	assert(signal(SIGTERM, SIG_IGN) == handler1);
118
119	assert(raise(SIGABRT) != -1);
120	assert(raise(SIGFPE) != -1);
121	assert(raise(SIGINT) != -1);
122	assert(raise(SIGSEGV) != -1);
123	assert(raise(SIGTERM) != -1);
124
125	if (abrt || fpe || iint || segv || term)
126		printf("a handled signal was received: %d %d %d %d %d\n",
127		       abrt, fpe, iint, segv, term);
128	if (def)
129		puts("a wrong signal was received");
130}
131
132void
133test4()
134{
135	puts("test 4");
136	def = abrt = term = fpe = iint = segv = 0;
137	assert(signal(SIGABRT, handler2) == SIG_IGN);
138	assert(signal(SIGFPE, handler2) == SIG_IGN);
139	assert(signal(SIGINT, handler2) == SIG_IGN);
140	assert(signal(SIGSEGV, handler2) == SIG_IGN);
141	assert(signal(SIGTERM, handler2) == SIG_IGN);
142
143	if (!setjmp(recover))
144		assert(raise(SIGABRT) != -1);
145	if (!setjmp(recover))
146		assert(raise(SIGFPE) != -1);
147	if (!setjmp(recover))
148		assert(raise(SIGINT) != -1);
149	if (!setjmp(recover))
150		assert(raise(SIGSEGV) != -1);
151	if (!setjmp(recover))
152		assert(raise(SIGTERM) != -1);
153
154	if (!abrt || !fpe || !iint || !segv || !term)
155		printf("a handled signal was missed: %d %d %d %d %d\n",
156		       abrt, fpe, iint, segv, term);
157	if (def)
158		puts("a wrong signal was received");
159}
160
161int
162main()
163{
164	assert(SIG_ERR != SIG_IGN && SIG_ERR != SIG_DFL);
165
166	test1();
167	test2();
168	test3();
169	test4();
170
171	return 0;
172}