X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Fdebug.h;h=4a7c00bc107949f2a9ab5b7aaea3c3c1452a429e;hb=d8be625da928025e96417c1b62f3336251204cef;hp=1a45c0f993b5a402fe69ba4e5fd044d4742fa6b7;hpb=5af5f0faa243da42e04028c1f723fe899d24444d;p=coloredstderr%2Fcoloredstderr.git diff --git a/src/debug.h b/src/debug.h index 1a45c0f..4a7c00b 100644 --- a/src/debug.h +++ b/src/debug.h @@ -20,20 +20,10 @@ #ifndef DEBUG_H #define DEBUG_H 1 -static void debug(const char *format, ...) { +static void debug_write(int fd, int first_call, char const *format, va_list ap) { char buffer[1024]; - /* If the file doesn't exist, do nothing. Prevents writing log files in - * unexpected places. The user must create the file manually. */ - int fd = open(DEBUG_FILE, O_WRONLY | O_APPEND); - if (fd == -1) { - return; - } - - va_list ap; - va_start(ap, format); int written = vsnprintf(buffer, sizeof(buffer), format, ap); - va_end(ap); /* Overflow. */ if ((size_t)written >= sizeof(buffer)) { written = sizeof(buffer) - 1; @@ -43,8 +33,7 @@ static void debug(const char *format, ...) { DLSYM_FUNCTION(real_write, "write"); DLSYM_FUNCTION(real_close, "close"); - static int first_call = 0; - if (!first_call++) { + if (first_call) { char nl = '\n'; real_write(fd, &nl, 1); } @@ -52,4 +41,62 @@ static void debug(const char *format, ...) { real_close(fd); } +#ifdef DEBUG +static void debug(char const *format, ...) { + va_list ap; + + int saved_errno = errno; + + /* If the file doesn't exist, do nothing. Prevents writing log files in + * unexpected places. The user must create the file manually. */ + int fd = open(DEBUG_FILE, O_WRONLY | O_APPEND); + if (fd == -1) { + errno = saved_errno; + return; + } + + static int call_count = 0; + call_count++; + + va_start(ap, format); + debug_write(fd, call_count == 1, format, ap); + va_end(ap); + + errno = saved_errno; +} +#endif + +static void warning(char const *format, ...) { + va_list ap; + + int saved_errno = errno; + + char const *home = getenv("HOME"); + if (!home) { + errno = saved_errno; + return; + } + + char path[strlen(home) + 1 + strlen(WARNING_FILE) + 1]; + strcpy(path, home); + strcat(path, "/"); + strcat(path, WARNING_FILE); + + /* Create the warning file if it doesn't exist yet. */ + int fd = open(path, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR); + if (fd == -1) { + errno = saved_errno; + return; + } + + static int call_count = 0; + call_count++; + + va_start(ap, format); + debug_write(fd, call_count == 1, format, ap); + va_end(ap); + + errno = saved_errno; +} + #endif