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);