summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEamon Walsh <ewalsh@tycho.nsa.gov>2008-12-18 14:40:47 -0500
committerEamon Walsh <ewalsh@tycho.nsa.gov>2008-12-18 14:40:47 -0500
commit97446481d42a90ceb47561b877c3f9fc8100fe5a (patch)
tree8bdc9331463e67efb901c2ce3d6514ec8849841f
parentc907da382ee3da32d1419982774cfa9098a0b98b (diff)
Add support for defining color mnemonics.
-rw-r--r--src/mcscolor.c75
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;