]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/commitdiff
Fix error_at_line() not always exiting if status != 0.
authorSimon Ruderich <simon@ruderich.org>
Wed, 1 Jan 2014 15:37:48 +0000 (16:37 +0100)
committerSimon Ruderich <simon@ruderich.org>
Wed, 1 Jan 2014 15:37:48 +0000 (16:37 +0100)
Also add tests.

NEWS
src/coloredstderr.c
tests/example_error.c
tests/example_error.expected

diff --git a/NEWS b/NEWS
index 2c5e4775b6f6f055f2283cda5c4a44286f632dea..9c37519b23e9d65806ccde9813add778d5bae9c4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,14 @@
 NEWS
 ====
 
+0.X
+---
+
+- Fix hook for GNU's error_at_line() not exiting if status != 0. If
+  error_one_per_line was used and suppressed a message, then error_at_line()
+  didn't exit.
+
+
 0.1
 ---
 
index e6f1f6aab30999a2ecb55b017dfe4ae171658e95..2970a1eb95170558dd2cbbb8c647f4766a2b3c58 100644 (file)
@@ -371,7 +371,7 @@ static void error_vararg(int status, int errnum,
     if (error_one_per_line
             && filename != NULL && linenum != 0
             && filename == last_filename && linenum == last_linenum) {
-        return;
+        goto out;
     }
     last_filename = filename;
     last_linenum  = linenum;
@@ -404,6 +404,7 @@ static void error_vararg(int status, int errnum,
 
     fprintf(stderr, "\n");
 
+out:
     if (status != 0) {
         exit(status);
     }
index 0ed8746b26ff3138e9938826cdc6e24369777304..0d979db7fe50eb6e0fd0132ccf34c41403e030d0 100644 (file)
 #include <config.h>
 
 #define _GNU_SOURCE /* for program_invocation_name */
-#include <stdio.h>
-#include <stdlib.h>
 #include <errno.h>
 #include <error.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
 
 #include "../src/compiler.h"
+#include "example.h"
 
 
 void (*error_print_progname)(void);
@@ -37,26 +41,41 @@ static void print_progname(void) {
 
 
 int main(int argc unused, char **argv unused) {
-    program_invocation_name = "./example_error";
+    pid_t pid;
+
+    char name[] = "./example_error";
+    program_invocation_name = name;
 
     error(0, 0, "<message>");
     error_at_line(0, 0, "file", 42, "<message>");
+    FORKED_TEST(pid) { error(1, 0, "<message>"); }
+    FORKED_TEST(pid) { error_at_line(1, 0, "file", 42, "<message>"); }
 
     error(0, ENOMEM, "<message>");
     error_at_line(0, ENOMEM, "file", 42, "<message>");
     error_at_line(0, ENOMEM, "file", 42, "<message>");
+    FORKED_TEST(pid) { error(1, ENOMEM, "<message>"); }
+    FORKED_TEST(pid) { error_at_line(1, ENOMEM, "file", 42, "<message>"); }
+
+    fflush(stdout);
+    printf("\n\n");
+    fflush(stdout);
 
     error_print_progname = print_progname;
     error_one_per_line = 1;
 
     error(0, 0, "<message>");
     error_at_line(0, 0, "file", 42, "<message>");
+    FORKED_TEST(pid) { error(1, 0, "<message>"); }
+    FORKED_TEST(pid) { error_at_line(1, 0, "file", 42, "<message>"); }
 
     error(0, ENOMEM, "<message>");
     error_at_line(0, ENOMEM, "file", 42, "<message>");
     error_at_line(0, ENOMEM, "file", 42, "<message>");
+    FORKED_TEST(pid) { error(1, ENOMEM, "<message>"); }
 
-    /* Exit codes are not tested. */
+    error_one_per_line = 0;
+    FORKED_TEST(pid) { error_at_line(1, ENOMEM, "file", 42, "<message>"); }
 
     return EXIT_SUCCESS;
 }
index 43025755172f275c8d70edd2b912488f3d5694dd..01c76b8553e342e54bd61c88c0eae93cf3ffacdb 100644 (file)
@@ -1,10 +1,27 @@
 >STDERR>./example_error: <message>
 ./example_error:file:42: <message>
-./example_error: <message>: Cannot allocate memory
+./example_error: <message>
+<STDERR<exit code: 1
+>STDERR>./example_error:file:42: <message>
+<STDERR<exit code: 1
+>STDERR>./example_error: <message>: Cannot allocate memory
 ./example_error:file:42: <message>: Cannot allocate memory
 ./example_error:file:42: <message>: Cannot allocate memory
-PROG<message>
+./example_error: <message>: Cannot allocate memory
+<STDERR<exit code: 1
+>STDERR>./example_error:file:42: <message>: Cannot allocate memory
+<STDERR<exit code: 1
+
+
+>STDERR>PROG<message>
 PROGfile:42: <message>
-PROG<message>: Cannot allocate memory
+PROG<message>
+<STDERR<exit code: 1
+exit code: 1
+>STDERR>PROG<message>: Cannot allocate memory
 PROGfile:42: <message>: Cannot allocate memory
-<STDERR<EOF
+PROG<message>: Cannot allocate memory
+<STDERR<exit code: 1
+>STDERR>PROGfile:42: <message>: Cannot allocate memory
+<STDERR<exit code: 1
+EOF