X-Git-Url: https://ruderich.org/simon/gitweb/?p=coloredstderr%2Fcoloredstderr.git;a=blobdiff_plain;f=src%2Fdebug.h;h=b15695d068b18ddac26720cc3d909600232a78a0;hp=6456898cb7e601bb6fe987e3e4f6a39831f154cd;hb=8a65b4486febf00e3fad5bafc3773a811e675a4c;hpb=abc3d7889f3774717baf5795ffab2efb396d2570 diff --git a/src/debug.h b/src/debug.h index 6456898..b15695d 100644 --- a/src/debug.h +++ b/src/debug.h @@ -1,7 +1,7 @@ /* * Debug functions. * - * Copyright (C) 2013 Simon Ruderich + * Copyright (C) 2013-2015 Simon Ruderich * * 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 @@ -20,31 +20,85 @@ #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); + if (written < 0) { + return; /* shouldn't happen */ + /* Overflow. */ + } else if ((size_t)written >= sizeof(buffer)) { + written = sizeof(buffer) - 1; + } /* Make sure these functions are loaded. */ DLSYM_FUNCTION(real_write, "write"); DLSYM_FUNCTION(real_close, "close"); - static int first_call = 0; - if (!first_call++) { - char nl = '\n'; + if (first_call) { + char const nl = '\n'; real_write(fd, &nl, 1); } real_write(fd, buffer, (size_t)written); 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