| /* Test assert_perror(). |
| * |
| * This is hairier than you'd think, involving games with |
| * stdio and signals. |
| * |
| */ |
| |
| #include <signal.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <setjmp.h> |
| |
| jmp_buf rec; |
| char buf[160]; |
| |
| static void |
| sigabrt (int unused) |
| { |
| longjmp (rec, 1); /* recover control */ |
| } |
| |
| #undef NDEBUG |
| #include <assert.h> |
| static void |
| assert1 (void) |
| { |
| assert_perror (1); |
| } |
| |
| static void |
| assert2 (void) |
| { |
| assert_perror (0); |
| } |
| |
| #define NDEBUG |
| #include <assert.h> |
| static void |
| assert3 (void) |
| { |
| assert_perror (2); |
| } |
| |
| int |
| main(void) |
| { |
| volatile int failed = 1; /* safety in presence of longjmp() */ |
| |
| fclose (stderr); |
| stderr = tmpfile (); |
| if (!stderr) |
| abort (); |
| |
| signal (SIGABRT, sigabrt); |
| |
| if (!setjmp (rec)) |
| assert1 (); |
| else |
| failed = 0; /* should happen */ |
| |
| if (!setjmp (rec)) |
| assert2 (); |
| else |
| failed = 1; /* should not happen */ |
| |
| if (!setjmp (rec)) |
| assert3 (); |
| else |
| failed = 1; /* should not happen */ |
| |
| rewind (stderr); |
| fgets (buf, 160, stderr); |
| if (!strstr(buf, strerror (1))) |
| failed = 1; |
| |
| fgets (buf, 160, stderr); |
| if (strstr (buf, strerror (0))) |
| failed = 1; |
| |
| fgets (buf, 160, stderr); |
| if (strstr (buf, strerror (2))) |
| failed = 1; |
| |
| return failed; |
| } |