diff options
author | Eamon Walsh <ewalsh@tycho.nsa.gov> | 2008-12-18 14:40:47 -0500 |
---|---|---|
committer | Eamon Walsh <ewalsh@tycho.nsa.gov> | 2008-12-18 14:40:47 -0500 |
commit | 97446481d42a90ceb47561b877c3f9fc8100fe5a (patch) | |
tree | 8bdc9331463e67efb901c2ce3d6514ec8849841f | |
parent | c907da382ee3da32d1419982774cfa9098a0b98b (diff) |
Add support for defining color mnemonics.
-rw-r--r-- | src/mcscolor.c | 75 |
1 files changed, 69 insertions, 6 deletions
diff --git a/src/mcscolor.c b/src/mcscolor.c index 8ea05e3..abc142d 100644 --- a/src/mcscolor.c +++ b/src/mcscolor.c @@ -21,6 +21,12 @@ typedef struct secolor { uint32_t bg; } secolor_t; +typedef struct semnemonic { + char *name; + uint32_t color; + struct semnemonic *next; +} semnemonic_t; + typedef struct setab { char *pattern; secolor_t color; @@ -33,15 +39,18 @@ typedef struct setab { #define COLOR_RANGE 3 #define N_COLOR 4 +#define AUX_RULE_COLOR "color" static char *rules[] = { "user", "role", "type", "range" }; static setab_t *clist[N_COLOR]; static setab_t *cend[N_COLOR]; +static semnemonic_t *mnemonics; static security_context_t my_context; void finish_context_colors(void) { setab_t *cur, *next; + semnemonic_t *ptr; unsigned i; for (i = 0; i < N_COLOR; i++) { @@ -55,6 +64,14 @@ void finish_context_colors(void) { clist[i] = cend[i] = NULL; } + ptr = mnemonics; + while (ptr) { + mnemonics = ptr->next; + free(ptr->name); + free(ptr); + ptr = mnemonics; + } + freecon(my_context); my_context = NULL; } @@ -162,10 +179,48 @@ static int add_secolor(int idx, char *pattern, uint32_t fg, uint32_t bg) { return 0; } +static int find_mnemonic(const char *name, uint32_t *retval) +{ + semnemonic_t *ptr; + + if (*name == '#') + return sscanf(name, "#%x", retval) == 1 ? 0 : -1; + + ptr = mnemonics; + while (ptr) { + if (!strcmp(ptr->name, name)) { + *retval = ptr->color; + return 0; + } + ptr = ptr->next; + } + + return -1; +} + +static int add_mnemonic(const char *name, uint32_t color) +{ + semnemonic_t *ptr = malloc(sizeof(semnemonic_t)); + if (!ptr) + return -1; + + ptr->color = color; + ptr->name = strdup(name); + if (!ptr->name) { + free(ptr); + return -1; + } + + ptr->next = mnemonics; + mnemonics = ptr; + return 0; +} + + /* Process line from color file. May modify the data pointed to by the buffer paremeter */ static int process_color(char *buffer, int line) { - char rule[10], pat[256]; + char rule[10], pat[256], f[256], b[256]; uint32_t i, fg, bg; int ret; @@ -173,11 +228,19 @@ static int process_color(char *buffer, int line) { buffer++; if(buffer[0] == '#' || buffer[0] == '\0') return 0; - ret = sscanf(buffer, "%8s %255s = %x %x", rule, pat, &fg, &bg); - if (ret == 4) - for (i = 0; i < N_COLOR; i++) - if (!strcmp(rule, rules[i])) - return add_secolor(i, pat, fg, bg); + ret = sscanf(buffer, "%8s %255s = %255s %255s", rule, pat, f, b); + if (ret == 4) { + if (find_mnemonic(f, &fg) == 0 && find_mnemonic(b, &bg) == 0) + for (i = 0; i < N_COLOR; i++) + if (!strcmp(rule, rules[i])) + return add_secolor(i, pat, fg, bg); + } + else if (ret == 3) { + if (!strcmp(rule, AUX_RULE_COLOR)) { + if (sscanf(f, "#%x", &fg) == 1) + return add_mnemonic(pat, fg); + } + } syslog(LOG_WARNING, "Line %d of secolors file is invalid.", line); return 0; |