]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/blobdiff - src/debug.h
Add more error checks.
[coloredstderr/coloredstderr.git] / src / debug.h
index 4dab03c3407600fad3556e498ca921ddf33a370d..5e5cc6d937ef55e7e73de1f62310183daa40bb8a 100644 (file)
 #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. */
-    if ((size_t)written >= sizeof(buffer)) {
+    } else if ((size_t)written >= sizeof(buffer)) {
         written = sizeof(buffer) - 1;
     }
 
@@ -42,8 +35,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);
     }
@@ -51,4 +43,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