|
Packit Service |
3880ab |
/* SPDX-License-Identifier: GPL-2.0 */
|
|
Packit Service |
3880ab |
#include <stdio.h>
|
|
Packit Service |
3880ab |
#include <stdarg.h>
|
|
Packit Service |
3880ab |
#include <stdlib.h>
|
|
Packit Service |
3880ab |
#include <string.h>
|
|
Packit Service |
3880ab |
#include <unistd.h>
|
|
Packit Service |
3880ab |
#include <sys/socket.h>
|
|
Packit Service |
3880ab |
#include <sys/types.h>
|
|
Packit Service |
3880ab |
#include <linux/if.h>
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
#include "color.h"
|
|
Packit Service |
3880ab |
#include "utils.h"
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
static void set_color_palette(void);
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
enum color {
|
|
Packit Service |
3880ab |
C_RED,
|
|
Packit Service |
3880ab |
C_GREEN,
|
|
Packit Service |
3880ab |
C_YELLOW,
|
|
Packit Service |
3880ab |
C_BLUE,
|
|
Packit Service |
3880ab |
C_MAGENTA,
|
|
Packit Service |
3880ab |
C_CYAN,
|
|
Packit Service |
3880ab |
C_WHITE,
|
|
Packit Service |
3880ab |
C_BOLD_RED,
|
|
Packit Service |
3880ab |
C_BOLD_GREEN,
|
|
Packit Service |
3880ab |
C_BOLD_YELLOW,
|
|
Packit Service |
3880ab |
C_BOLD_BLUE,
|
|
Packit Service |
3880ab |
C_BOLD_MAGENTA,
|
|
Packit Service |
3880ab |
C_BOLD_CYAN,
|
|
Packit Service |
3880ab |
C_BOLD_WHITE,
|
|
Packit Service |
3880ab |
C_CLEAR
|
|
Packit Service |
3880ab |
};
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
static const char * const color_codes[] = {
|
|
Packit Service |
3880ab |
"\e[31m",
|
|
Packit Service |
3880ab |
"\e[32m",
|
|
Packit Service |
3880ab |
"\e[33m",
|
|
Packit Service |
3880ab |
"\e[34m",
|
|
Packit Service |
3880ab |
"\e[35m",
|
|
Packit Service |
3880ab |
"\e[36m",
|
|
Packit Service |
3880ab |
"\e[37m",
|
|
Packit Service |
3880ab |
"\e[1;31m",
|
|
Packit Service |
3880ab |
"\e[1;32m",
|
|
Packit Service |
3880ab |
"\e[1;33m",
|
|
Packit Service |
3880ab |
"\e[1;34m",
|
|
Packit Service |
3880ab |
"\e[1;35m",
|
|
Packit Service |
3880ab |
"\e[1;36m",
|
|
Packit Service |
3880ab |
"\e[1;37m",
|
|
Packit Service |
3880ab |
"\e[0m",
|
|
Packit Service |
3880ab |
NULL,
|
|
Packit Service |
3880ab |
};
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
/* light background */
|
|
Packit Service |
3880ab |
static enum color attr_colors_light[] = {
|
|
Packit Service |
3880ab |
C_CYAN,
|
|
Packit Service |
3880ab |
C_YELLOW,
|
|
Packit Service |
3880ab |
C_MAGENTA,
|
|
Packit Service |
3880ab |
C_BLUE,
|
|
Packit Service |
3880ab |
C_GREEN,
|
|
Packit Service |
3880ab |
C_RED,
|
|
Packit Service |
3880ab |
C_CLEAR,
|
|
Packit Service |
3880ab |
};
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
/* dark background */
|
|
Packit Service |
3880ab |
static enum color attr_colors_dark[] = {
|
|
Packit Service |
3880ab |
C_BOLD_CYAN,
|
|
Packit Service |
3880ab |
C_BOLD_YELLOW,
|
|
Packit Service |
3880ab |
C_BOLD_MAGENTA,
|
|
Packit Service |
3880ab |
C_BOLD_BLUE,
|
|
Packit Service |
3880ab |
C_BOLD_GREEN,
|
|
Packit Service |
3880ab |
C_BOLD_RED,
|
|
Packit Service |
3880ab |
C_CLEAR
|
|
Packit Service |
3880ab |
};
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
static int is_dark_bg;
|
|
Packit Service |
3880ab |
static int color_is_enabled;
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
static void enable_color(void)
|
|
Packit Service |
3880ab |
{
|
|
Packit Service |
3880ab |
color_is_enabled = 1;
|
|
Packit Service |
3880ab |
set_color_palette();
|
|
Packit Service |
3880ab |
}
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
bool check_enable_color(int color, int json)
|
|
Packit Service |
3880ab |
{
|
|
Packit Service |
3880ab |
if (json || color == COLOR_OPT_NEVER)
|
|
Packit Service |
3880ab |
return false;
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
if (color == COLOR_OPT_ALWAYS || isatty(fileno(stdout))) {
|
|
Packit Service |
3880ab |
enable_color();
|
|
Packit Service |
3880ab |
return true;
|
|
Packit Service |
3880ab |
}
|
|
Packit Service |
3880ab |
return false;
|
|
Packit Service |
3880ab |
}
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
bool matches_color(const char *arg, int *val)
|
|
Packit Service |
3880ab |
{
|
|
Packit Service |
3880ab |
char *dup, *p;
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
if (!val)
|
|
Packit Service |
3880ab |
return false;
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
dup = strdupa(arg);
|
|
Packit Service |
3880ab |
p = strchrnul(dup, '=');
|
|
Packit Service |
3880ab |
if (*p)
|
|
Packit Service |
3880ab |
*(p++) = '\0';
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
if (matches(dup, "-color"))
|
|
Packit Service |
3880ab |
return false;
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
if (*p == '\0' || !strcmp(p, "always"))
|
|
Packit Service |
3880ab |
*val = COLOR_OPT_ALWAYS;
|
|
Packit Service |
3880ab |
else if (!strcmp(p, "auto"))
|
|
Packit Service |
3880ab |
*val = COLOR_OPT_AUTO;
|
|
Packit Service |
3880ab |
else if (!strcmp(p, "never"))
|
|
Packit Service |
3880ab |
*val = COLOR_OPT_NEVER;
|
|
Packit Service |
3880ab |
else
|
|
Packit Service |
3880ab |
return false;
|
|
Packit Service |
3880ab |
return true;
|
|
Packit Service |
3880ab |
}
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
static void set_color_palette(void)
|
|
Packit Service |
3880ab |
{
|
|
Packit Service |
3880ab |
char *p = getenv("COLORFGBG");
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
/*
|
|
Packit Service |
3880ab |
* COLORFGBG environment variable usually contains either two or three
|
|
Packit Service |
3880ab |
* values separated by semicolons; we want the last value in either case.
|
|
Packit Service |
3880ab |
* If this value is 0-6 or 8, background is dark.
|
|
Packit Service |
3880ab |
*/
|
|
Packit Service |
3880ab |
if (p && (p = strrchr(p, ';')) != NULL
|
|
Packit Service |
3880ab |
&& ((p[1] >= '0' && p[1] <= '6') || p[1] == '8')
|
|
Packit Service |
3880ab |
&& p[2] == '\0')
|
|
Packit Service |
3880ab |
is_dark_bg = 1;
|
|
Packit Service |
3880ab |
}
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
__attribute__((format(printf, 3, 4)))
|
|
Packit Service |
3880ab |
int color_fprintf(FILE *fp, enum color_attr attr, const char *fmt, ...)
|
|
Packit Service |
3880ab |
{
|
|
Packit Service |
3880ab |
int ret = 0;
|
|
Packit Service |
3880ab |
va_list args;
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
va_start(args, fmt);
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
if (!color_is_enabled || attr == COLOR_NONE) {
|
|
Packit Service |
3880ab |
ret = vfprintf(fp, fmt, args);
|
|
Packit Service |
3880ab |
goto end;
|
|
Packit Service |
3880ab |
}
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
ret += fprintf(fp, "%s", color_codes[is_dark_bg ?
|
|
Packit Service |
3880ab |
attr_colors_dark[attr] : attr_colors_light[attr]]);
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
ret += vfprintf(fp, fmt, args);
|
|
Packit Service |
3880ab |
ret += fprintf(fp, "%s", color_codes[C_CLEAR]);
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
end:
|
|
Packit Service |
3880ab |
va_end(args);
|
|
Packit Service |
3880ab |
return ret;
|
|
Packit Service |
3880ab |
}
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
enum color_attr ifa_family_color(__u8 ifa_family)
|
|
Packit Service |
3880ab |
{
|
|
Packit Service |
3880ab |
switch (ifa_family) {
|
|
Packit Service |
3880ab |
case AF_INET:
|
|
Packit Service |
3880ab |
return COLOR_INET;
|
|
Packit Service |
3880ab |
case AF_INET6:
|
|
Packit Service |
3880ab |
return COLOR_INET6;
|
|
Packit Service |
3880ab |
default:
|
|
Packit Service |
3880ab |
return COLOR_NONE;
|
|
Packit Service |
3880ab |
}
|
|
Packit Service |
3880ab |
}
|
|
Packit Service |
3880ab |
|
|
Packit Service |
3880ab |
enum color_attr oper_state_color(__u8 state)
|
|
Packit Service |
3880ab |
{
|
|
Packit Service |
3880ab |
switch (state) {
|
|
Packit Service |
3880ab |
case IF_OPER_UP:
|
|
Packit Service |
3880ab |
return COLOR_OPERSTATE_UP;
|
|
Packit Service |
3880ab |
case IF_OPER_DOWN:
|
|
Packit Service |
3880ab |
return COLOR_OPERSTATE_DOWN;
|
|
Packit Service |
3880ab |
default:
|
|
Packit Service |
3880ab |
return COLOR_NONE;
|
|
Packit Service |
3880ab |
}
|
|
Packit Service |
3880ab |
}
|