Index: lib/libc/gen/err.c =================================================================== --- lib/libc/gen/err.c +++ lib/libc/gen/err.c @@ -40,12 +40,14 @@ #include #include #include +#include #include "un-namespace.h" #include "libc_private.h" static FILE *err_file; /* file to use for error output */ static void (*err_exit)(int); +static int do_color = -1; /* * This is declared to take a `void *' so that the caller is not required @@ -67,6 +69,42 @@ err_exit = ef; } +static void +err_pre(void) +{ + if (do_color == -1) { + if (getenv("ERRCOLOR") != NULL && isatty(fileno(err_file))) + do_color = 1; + else + do_color = 0; + } + + if (do_color == 1) + fprintf(err_file, "\033[;31m%s: ", _getprogname()); + else + fprintf(err_file, "%s: ", _getprogname()); +} + +static void +err_post(void) +{ + + if (do_color == 1) + fprintf(err_file, "\033[m\n"); + else + fprintf(err_file, "\n"); +} + +static void +err_post_code(int code) +{ + + if (do_color == 1) + fprintf(err_file, "%s\33[m\n", strerror(code)); + else + fprintf(err_file, "%s\n", strerror(code)); +} + __weak_reference(_err, err); void @@ -98,12 +136,12 @@ { if (err_file == NULL) err_set_file(NULL); - fprintf(err_file, "%s: ", _getprogname()); + err_pre(); if (fmt != NULL) { vfprintf(err_file, fmt, ap); fprintf(err_file, ": "); } - fprintf(err_file, "%s\n", strerror(code)); + err_post_code(code); if (err_exit) err_exit(eval); exit(eval); @@ -123,10 +161,10 @@ { if (err_file == NULL) err_set_file(NULL); - fprintf(err_file, "%s: ", _getprogname()); + err_pre(); if (fmt != NULL) vfprintf(err_file, fmt, ap); - fprintf(err_file, "\n"); + err_post(); if (err_exit) err_exit(eval); exit(eval); @@ -163,12 +201,12 @@ { if (err_file == NULL) err_set_file(NULL); - fprintf(err_file, "%s: ", _getprogname()); + err_pre(); if (fmt != NULL) { vfprintf(err_file, fmt, ap); fprintf(err_file, ": "); } - fprintf(err_file, "%s\n", strerror(code)); + err_post_code(code); } void @@ -185,8 +223,8 @@ { if (err_file == NULL) err_set_file(NULL); - fprintf(err_file, "%s: ", _getprogname()); + err_pre(); if (fmt != NULL) vfprintf(err_file, fmt, ap); - fprintf(err_file, "\n"); + err_post(); }