summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2020-10-04 13:22:23 -0400
committerTavian Barnes <tavianator@tavianator.com>2020-10-04 13:22:23 -0400
commitb3312002a5d96cd486156a711d3c1861c150b7c6 (patch)
treeadf8ce0d8d3984bb54c7b82af89f9aa3d90d294a
parentb0282202ce8b361110ef32b18e7159edc604929d (diff)
downloadbfs-b3312002a5d96cd486156a711d3c1861c150b7c6.tar.xz
parse: Fail if -color is passed and the colors couldn't be parsed
-rw-r--r--ctx.c1
-rw-r--r--ctx.h2
-rw-r--r--parse.c10
3 files changed, 13 insertions, 0 deletions
diff --git a/ctx.c b/ctx.c
index cf47bc4..6146b3c 100644
--- a/ctx.c
+++ b/ctx.c
@@ -48,6 +48,7 @@ struct bfs_ctx *bfs_ctx_new(void) {
ctx->xargs_safe = false;
ctx->colors = NULL;
+ ctx->colors_error = 0;
ctx->cout = NULL;
ctx->cerr = NULL;
diff --git a/ctx.h b/ctx.h
index b638e74..ec626c5 100644
--- a/ctx.h
+++ b/ctx.h
@@ -84,6 +84,8 @@ struct bfs_ctx {
/** Color data. */
struct colors *colors;
+ /** The error that occurred parsing the color table, if any. */
+ int colors_error;
/** Colored stdout. */
CFILE *cout;
/** Colored stderr. */
diff --git a/parse.c b/parse.c
index fadf0c5..c0c345c 100644
--- a/parse.c
+++ b/parse.c
@@ -962,7 +962,13 @@ static struct expr *parse_capable(struct parser_state *state, int flag, int arg2
static struct expr *parse_color(struct parser_state *state, int color, int arg2) {
struct bfs_ctx *ctx = state->ctx;
struct colors *colors = ctx->colors;
+
if (color) {
+ if (!colors) {
+ parse_error(state, "${blu}%s${rs}: %s.\n", state->argv[0], strerror(ctx->colors_error));
+ return NULL;
+ }
+
state->use_color = COLOR_ALWAYS;
ctx->cout->colors = colors;
ctx->cerr->colors = colors;
@@ -971,6 +977,7 @@ static struct expr *parse_color(struct parser_state *state, int color, int arg2)
ctx->cout->colors = NULL;
ctx->cerr->colors = NULL;
}
+
return parse_nullary_option(state);
}
@@ -3479,6 +3486,9 @@ struct bfs_ctx *bfs_parse_cmdline(int argc, char *argv[]) {
}
ctx->colors = parse_colors(getenv("LS_COLORS"));
+ if (!ctx->colors) {
+ ctx->colors_error = errno;
+ }
ctx->cout = cfdup(stdout, use_color ? ctx->colors : NULL);
if (!ctx->cout) {