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
14jmp_buf rec;
15char buf[160];
16
17static void
18sigabrt (int unused)
19{
20 longjmp (env: rec, val: 1); /* recover control */
21}
22
23#undef NDEBUG
24#include <assert.h>
25static void
26assert1 (void)
27{
28 assert_perror (1);
29}
30
31static void
32assert2 (void)
33{
34 assert_perror (0);
35}
36
37#define NDEBUG
38#include <assert.h>
39static void
40assert3 (void)
41{
42 assert_perror (2);
43}
44
45int
46main(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, handler: 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 (s: buf, n: 160, stderr);
74 if (!strstr(buf, strerror (errnum: 1)))
75 failed = 1;
76
77 fgets (s: buf, n: 160, stderr);
78 if (strstr (buf, strerror (errnum: 0)))
79 failed = 1;
80
81 fgets (s: buf, n: 160, stderr);
82 if (strstr (buf, strerror (errnum: 2)))
83 failed = 1;
84
85 return failed;
86}
87

source code of glibc/assert/test-assert-perr.c