From 1effd5fddc073d4ce7a46a32212b713578bcb288 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Wed, 7 Jul 2021 23:05:46 +1000 Subject: [PATCH] [common] debug: add color support to debug messages People often miss the warnings about invalid arguments in their command line, this last minute patch attempts to address this by making warnings, errors, fixme's and fatal errors stand out if stdout is a TTY. --- client/src/main.c | 3 ++ common/include/common/debug.h | 33 +++++++++---- common/src/platform/linux/CMakeLists.txt | 1 + common/src/platform/linux/debug.c | 54 ++++++++++++++++++++++ common/src/platform/windows/CMakeLists.txt | 1 + common/src/platform/windows/debug.c | 37 +++++++++++++++ host/platform/Linux/src/platform.c | 3 ++ host/platform/Windows/src/platform.c | 3 ++ 8 files changed, 126 insertions(+), 9 deletions(-) create mode 100644 common/src/platform/linux/debug.c create mode 100644 common/src/platform/windows/debug.c diff --git a/client/src/main.c b/client/src/main.c index b3a2e23d..734110cf 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -1052,6 +1052,9 @@ static void lg_shutdown(void) int main(int argc, char * argv[]) { + // initialize for DEBUG_* macros + debug_init(); + if (getuid() == 0) { DEBUG_ERROR("Do not run looking glass as root!"); diff --git a/common/include/common/debug.h b/common/include/common/debug.h index 6f45368a..66b84fcf 100644 --- a/common/include/common/debug.h +++ b/common/include/common/debug.h @@ -30,6 +30,20 @@ #include #include "time.h" +enum DebugLevel +{ + DEBUG_LEVEL_INFO, + DEBUG_LEVEL_WARN, + DEBUG_LEVEL_ERROR, + DEBUG_LEVEL_FIXME, + DEBUG_LEVEL_FATAL +}; + +extern const char ** debug_lookup; + +void debug_init(void); +void debug_print(const enum DebugLevel level, const char * fmt, ...); + #ifdef ENABLE_BACKTRACE void printBacktrace(void); #define DEBUG_PRINT_BACKTRACE() printBacktrace() @@ -65,19 +79,20 @@ void printBacktrace(void); sizeof(s) > 20 && (s)[sizeof(s)-21] == DIRECTORY_SEPARATOR ? (s) + sizeof(s) - 20 : \ sizeof(s) > 21 && (s)[sizeof(s)-22] == DIRECTORY_SEPARATOR ? (s) + sizeof(s) - 21 : (s)) -#define DEBUG_PRINT(type, fmt, ...) do { \ - fprintf(stderr, "%12" PRId64 " " type " %20s:%-4u | %-30s | " fmt "\n", \ - microtime(), STRIPPATH(__FILE__), __LINE__, __FUNCTION__, ##__VA_ARGS__);\ +#define DEBUG_PRINT(level, fmt, ...) do { \ + fprintf(stdout, "%s%12" PRId64 "%20s:%-4u | %-30s | " fmt "\n", \ + debug_lookup[level], microtime(), STRIPPATH(__FILE__), \ + __LINE__, __FUNCTION__, ##__VA_ARGS__); \ } while (0) -#define DEBUG_BREAK() DEBUG_PRINT("[ ]", "================================================================================") -#define DEBUG_INFO(fmt, ...) DEBUG_PRINT("[I]", fmt, ##__VA_ARGS__) -#define DEBUG_WARN(fmt, ...) DEBUG_PRINT("[W]", fmt, ##__VA_ARGS__) -#define DEBUG_ERROR(fmt, ...) DEBUG_PRINT("[E]", fmt, ##__VA_ARGS__) -#define DEBUG_FIXME(fmt, ...) DEBUG_PRINT("[F]", fmt, ##__VA_ARGS__) +#define DEBUG_BREAK() DEBUG_PRINT(DEBUG_LEVEL_INFO, "================================================================================") +#define DEBUG_INFO(fmt, ...) DEBUG_PRINT(DEBUG_LEVEL_INFO, fmt, ##__VA_ARGS__) +#define DEBUG_WARN(fmt, ...) DEBUG_PRINT(DEBUG_LEVEL_WARN, fmt, ##__VA_ARGS__) +#define DEBUG_ERROR(fmt, ...) DEBUG_PRINT(DEBUG_LEVEL_ERROR, fmt, ##__VA_ARGS__) +#define DEBUG_FIXME(fmt, ...) DEBUG_PRINT(DEBUG_LEVEL_FIXME, fmt, ##__VA_ARGS__) #define DEBUG_FATAL(fmt, ...) do { \ DEBUG_BREAK(); \ - DEBUG_PRINT("[!]", fmt, ##__VA_ARGS__); \ + DEBUG_PRINT(DEBUG_LEVEL_FATAL, fmt, ##__VA_ARGS__); \ DEBUG_PRINT_BACKTRACE(); \ abort(); \ } while(0) diff --git a/common/src/platform/linux/CMakeLists.txt b/common/src/platform/linux/CMakeLists.txt index 334af35b..405e795f 100644 --- a/common/src/platform/linux/CMakeLists.txt +++ b/common/src/platform/linux/CMakeLists.txt @@ -7,6 +7,7 @@ include_directories( ) add_library(lg_common_platform_code STATIC + debug.c crash.c sysinfo.c thread.c diff --git a/common/src/platform/linux/debug.c b/common/src/platform/linux/debug.c new file mode 100644 index 00000000..310d46d8 --- /dev/null +++ b/common/src/platform/linux/debug.c @@ -0,0 +1,54 @@ +/** + * Looking Glass + * Copyright (C) 2017-2021 The Looking Glass Authors + * https://looking-glass.io + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 59 + * Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "common/debug.h" + +#include + +#define COLOR_RESET "\033[0m" +#define COLOR_YELLOW "\033[0;33m" +#define COLOR_RED "\033[0;31m" +#define COLOR_CYAN "\033[0;36m" +#define COLOR_WHITE "\033[0;37m" + +const char ** debug_lookup = NULL; + +void debug_init(void) +{ + static const char * colorLookup[] = + { + COLOR_RESET "[I] ", // DEBUG_LEVEL_INFO + COLOR_YELLOW "[W] ", // DEBUG_LEVEL_WARN + COLOR_RED "[E] ", // DEBUG_LEVEL_ERROR + COLOR_CYAN "[F] ", // DEBUG_LEVEL_FIXME + COLOR_WHITE "[!] " // DEBUG_LEVEL_FATAL + }; + + static const char * plainLookup[] = + { + "[I] ", // DEBUG_LEVEL_INFO + "[W] ", // DEBUG_LEVEL_WARN + "[E] ", // DEBUG_LEVEL_ERROR + "[F] ", // DEBUG_LEVEL_FIXME + "[!] " // DEBUG_LEVEL_FATAL + }; + + debug_lookup = (isatty(0) == 1) ? colorLookup : plainLookup; +} diff --git a/common/src/platform/windows/CMakeLists.txt b/common/src/platform/windows/CMakeLists.txt index 685c407a..69d2ccc6 100644 --- a/common/src/platform/windows/CMakeLists.txt +++ b/common/src/platform/windows/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories( ) add_library(lg_common_platform_code STATIC + debug.c crash.c dpi.c sysinfo.c diff --git a/common/src/platform/windows/debug.c b/common/src/platform/windows/debug.c new file mode 100644 index 00000000..82eea38b --- /dev/null +++ b/common/src/platform/windows/debug.c @@ -0,0 +1,37 @@ +/** + * Looking Glass + * Copyright (C) 2017-2021 The Looking Glass Authors + * https://looking-glass.io + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 59 + * Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "common/debug.h" + +const char ** debug_lookup = NULL; + +void debug_init(void) +{ + static const char * plainLookup[] = + { + "[I] ", // DEBUG_LEVEL_INFO + "[W] ", // DEBUG_LEVEL_WARN + "[E] ", // DEBUG_LEVEL_ERROR + "[F] ", // DEBUG_LEVEL_FIXME + "[!] " // DEBUG_LEVEL_FATAL + }; + + debug_lookup = plainLookup; +} diff --git a/host/platform/Linux/src/platform.c b/host/platform/Linux/src/platform.c index 3b5be710..dbb436a0 100644 --- a/host/platform/Linux/src/platform.c +++ b/host/platform/Linux/src/platform.c @@ -41,6 +41,9 @@ struct app app = { 0 }; int main(int argc, char * argv[]) { + // initialize for DEBUG_* macros + debug_init(); + app.executable = argv[0]; struct passwd * pw = getpwuid(getuid()); diff --git a/host/platform/Windows/src/platform.c b/host/platform/Windows/src/platform.c index 6d5d577b..a3abf88c 100644 --- a/host/platform/Windows/src/platform.c +++ b/host/platform/Windows/src/platform.c @@ -314,6 +314,9 @@ fail: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { + // initialize for DEBUG_* macros + debug_init(); + // convert the command line to the standard argc and argv LPWSTR * wargv = CommandLineToArgvW(GetCommandLineW(), &app.argc); app.argv = malloc(sizeof(char *) * app.argc);