diff --git a/ui/ui.c b/ui/ui.c index f1490d5..897371b 100644 --- a/ui/ui.c +++ b/ui/ui.c @@ -9,6 +9,8 @@ int max_offset; GList *all_cpus = NULL; GList *all_irqs = NULL; +static char **irq_name; + char *IRQ_CLASS_TO_STR[] = { "Other", "Legacy", @@ -392,6 +394,38 @@ void print_assigned_objects_string(irq_t *irq, int *line_offset) mvprintw(*line_offset, 68, "%s ", assigned_to); } +void get_irq_name(int end) +{ + int i, cpunr, len; + FILE *output; + char *cmd; + char buffer[128]; + + if (irq_name == NULL) { + irq_name = malloc(sizeof(char *) * LINES); + for (i = 4; i < LINES; i++) { + irq_name[i] = malloc(sizeof(char) * 50); + memset(irq_name[i], 0, sizeof(char) * 50); + } + } + + output = popen("cat /proc/interrupts | head -1 | awk '{print NF}'", "r"); + if (!output) + return; + fscanf(output, "%d", &cpunr); + pclose(output); + + len = snprintf(NULL, 0, "cat /proc/interrupts | awk '{for (i=%d;i<=NF;i++)printf(\"%%s \", $i);print \"\"}' | cut -c-49", cpunr + 2); + cmd = alloca(sizeof(char) * (len + 1)); + snprintf(cmd, len + 1, "cat /proc/interrupts | awk '{for (i=%d;i<=NF;i++)printf(\"%%s \", $i);print \"\"}' | cut -c-49", cpunr + 2); + output = popen(cmd, "r"); + for (i = 0; i <= offset; i++) + fgets(buffer, 50, output); + for (i = 4; i < end; i++) + fgets(irq_name[i], 50, output); + pclose(output); +} + void print_tmp_irq_line(irq_t *irq, void *data __attribute__((unused))) { int line = max_offset - offset + 4; @@ -428,6 +462,7 @@ void print_tmp_irq_line(irq_t *irq, void *data __attribute__((unused))) mvprintw(line, 36, "%s ", irq->class < 0 ? "Unknown" : IRQ_CLASS_TO_STR[irq->class]); print_assigned_objects_string(irq, &line); + mvprintw(line, 120, "%s", irq_name[line]); } void print_irq_line(irq_t *irq, void *data __attribute__((unused))) @@ -466,6 +501,7 @@ void print_irq_line(irq_t *irq, void *data __attribute__((unused))) mvprintw(line, 36, "%s ", irq->class < 0 ? "Unknown" : IRQ_CLASS_TO_STR[irq->class]); print_assigned_objects_string(irq, &line); + mvprintw(line, 120, "%s", irq_name[line]); } void print_all_irqs() @@ -474,7 +510,8 @@ void print_all_irqs() attrset(COLOR_PAIR(0)); mvprintw(2, 3, "NUMBER IS BANNED CLASS \ - ASSIGNED TO CPUS"); + ASSIGNED TO CPUS IRQ NAME"); + get_irq_name(LINES - 2); for_each_irq(all_irqs, print_irq_line, NULL); max_offset -= LINES - 6; if (max_offset < 0) @@ -545,6 +582,7 @@ void handle_irq_banning() } else if (offset > 0) { offset--; max_offset = 0; + get_irq_name(LINES - 3); for_each_irq(tmp, print_tmp_irq_line, NULL); max_offset -= LINES - 7; if (max_offset < 0) @@ -561,6 +599,7 @@ void handle_irq_banning() } else if (offset < max_offset) { offset++; max_offset = 0; + get_irq_name(LINES - 3); for_each_irq(tmp, print_tmp_irq_line, NULL); max_offset -= LINES - 7; if (max_offset < 0)