1 /* Test assert_perror().
2 *
3 * This is hairier than you'd think, involving games with
4 * stdio and signals.
5 *
6 */
7
8 #include <signal.h>
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include <setjmp.h>
13
14 jmp_buf rec;
15 char buf[160];
16
17 static void
sigabrt(int unused)18 sigabrt (int unused)
19 {
20 longjmp (rec, 1); /* recover control */
21 }
22
23 #undef NDEBUG
24 #include <assert.h>
25 static void
assert1(void)26 assert1 (void)
27 {
28 assert_perror (1);
29 }
30
31 static void
assert2(void)32 assert2 (void)
33 {
34 assert_perror (0);
35 }
36
37 #define NDEBUG
38 #include <assert.h>
39 static void
assert3(void)40 assert3 (void)
41 {
42 assert_perror (2);
43 }
44
45 int
main(void)46 main(void)
47 {
48 volatile int failed = 1; /* safety in presence of longjmp() */
49
50 fclose (stderr);
51 stderr = tmpfile ();
52 if (!stderr)
53 abort ();
54
55 signal (SIGABRT, sigabrt);
56
57 if (!setjmp (rec))
58 assert1 ();
59 else
60 failed = 0; /* should happen */
61
62 if (!setjmp (rec))
63 assert2 ();
64 else
65 failed = 1; /* should not happen */
66
67 if (!setjmp (rec))
68 assert3 ();
69 else
70 failed = 1; /* should not happen */
71
72 rewind (stderr);
73 fgets (buf, 160, stderr);
74 if (!strstr(buf, strerror (1)))
75 failed = 1;
76
77 fgets (buf, 160, stderr);
78 if (strstr (buf, strerror (0)))
79 failed = 1;
80
81 fgets (buf, 160, stderr);
82 if (strstr (buf, strerror (2)))
83 failed = 1;
84
85 return failed;
86 }
87