#ifndef DEBUG_H
#define DEBUG_H 1
-static void debug(const char *format, ...) {
+static void debug_write(int fd, int first_call, const char *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;
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);
}
real_close(fd);
}
+static void debug(const char *format, ...) {
+ va_list ap;
+
+ /* 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;
+ }
+
+ static int call_count = 0;
+ call_count++;
+
+ va_start(ap, format);
+ debug_write(fd, call_count == 1, format, ap);
+ va_end(ap);
+}
+
+static void warning(const char *format, ...) {
+ va_list ap;
+
+ char *home = getenv("HOME");
+ if (!home) {
+ 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) {
+ return;
+ }
+
+ static int call_count = 0;
+ call_count++;
+
+ va_start(ap, format);
+ debug_write(fd, call_count == 1, format, ap);
+ va_end(ap);
+}
+
#endif
tracked_fds_list = malloc(tracked_fds_list_space * sizeof(*tracked_fds_list));
if (!tracked_fds_list) {
+#ifdef DEBUG
+ warning("malloc(%zu): failed [%d]\n",
+ tracked_fds_list_space * sizeof(*tracked_fds_list), getpid());
+#endif
return;
}
int length = snprintf(x, 10 + 1, "%d", tracked_fds_list[i]);
if (length >= 10 + 1) {
/* Integer too big to fit the buffer, skip it. */
+#ifdef DEBUG
+ warning("update_environment_buffer_entry(): truncated fd: %d [%d]\n",
+ tracked_fds_list[i], getpid());
+#endif
continue;
}
static void tracked_fds_add(int fd) {
if (tracked_fds_list_count >= tracked_fds_list_space) {
size_t new_space = tracked_fds_list_space + TRACKFDS_REALLOC_STEP;
- int *tmp = realloc(tracked_fds_list, sizeof(*tracked_fds_list) * new_space);
+ int *tmp = realloc(tracked_fds_list,
+ sizeof(*tracked_fds_list) * new_space);
if (!tmp) {
/* We can do nothing, just ignore the error. We made sure not to
* destroy our state, so the new descriptor is ignored without any
* other consequences. */
#ifdef DEBUG
- debug("realloc(tracked_fds_list, %zu) failed! [%d]\n",
- sizeof(*tracked_fds_list) * new_space, getpid());
+ warning("realloc(tracked_fds_list, %zu) failed! [%d]\n",
+ sizeof(*tracked_fds_list) * new_space, getpid());
#endif
return;
}