+void log_printf(char *fmt, ...)
+{
+ static int buffer_len = 128;
+ static char *buffer;
+ va_list ap;
+ int n = 0;
+
+ do {
+ if (n)
+ buffer_len = n + 1;
+ if (!buffer)
+ buffer = malloc(buffer_len);
+ if (!buffer)
+ return;
+ va_start(ap, fmt);
+ n = vsnprintf(buffer, sizeof(buffer), fmt, ap);
+ va_end(ap);
+ if (n < 1)
+ return;
+ if (n >= buffer_len) {
+ free(buffer);
+ buffer = NULL;
+ }
+ } while (n >= buffer_len);
+
+ log_add(buffer, n, SOURCE_INTERNAL);
+}
+