diff --git a/libmget/logger.c b/libmget/logger.c index dd09cdbb..d79a82ee 100644 --- a/libmget/logger.c +++ b/libmget/logger.c @@ -88,10 +88,25 @@ static void _logger_write_func(const mget_logger_t *logger, const char *buf, siz logger->func(buf, len); } +static void G_GNUC_MGET_PRINTF_FORMAT(2,0) G_GNUC_MGET_NONNULL((1,2)) +_logger_vfprintf(FILE *fp, const char *fmt, va_list args) +{ + char sbuf[4096]; + mget_buffer_t buf; + int err = errno; + + mget_buffer_init(&buf, sbuf, sizeof(sbuf)); + mget_buffer_vprintf2(&buf, fmt, args); + fwrite(buf.data, 1, buf.length, fp); + mget_buffer_deinit(&buf); + + errno = err; +} + static void G_GNUC_MGET_PRINTF_FORMAT(2,0) G_GNUC_MGET_NONNULL((1,2)) _logger_vprintf_file(const mget_logger_t *logger, const char *fmt, va_list args) { - vfprintf(logger->fp, fmt, args); + _logger_vfprintf(logger->fp, fmt, args); } static void _logger_write_file(const mget_logger_t *logger, const char *buf, size_t len) @@ -105,7 +120,7 @@ _logger_vprintf_fname(const mget_logger_t *logger, const char *fmt, va_list args FILE *fp = fopen(logger->fname, "a"); if (fp) { - vfprintf(fp, fmt, args); + _logger_vfprintf(fp, fmt, args); fclose(fp); } } diff --git a/src/log.c b/src/log.c index 45952cc9..fa468a05 100644 --- a/src/log.c +++ b/src/log.c @@ -40,13 +40,13 @@ #include "options.h" #include "log.h" -static void _write_debug(const char *buf, size_t len) +static void _write_debug(const char *data, size_t len) { FILE *fp; struct timeval tv; struct tm *tp, tbuf; - if (!buf || (ssize_t)len <= 0) + if (!data || (ssize_t)len <= 0) return; gettimeofday(&tv, NULL); // obsoleted by POSIX.1-2008, maybe use clock_gettime() ? needs -lrt @@ -60,9 +60,17 @@ static void _write_debug(const char *buf, size_t len) fp = fopen(config.logfile, "a"); if (fp) { - fprintf(fp, "%02d.%02d%02d%02d.%03ld %s%s", - tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec, tv.tv_usec / 1000, - buf, buf[len - 1] == '\n' ? "" : "\n"); + char sbuf[4096]; + mget_buffer_t buf; + + mget_buffer_init(&buf, sbuf, sizeof(sbuf)); + mget_buffer_printf2(&buf, "%02d.%02d%02d%02d.%03ld ", + tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec, tv.tv_usec / 1000); + mget_buffer_memcat(&buf, data, len); + if (data[len -1] != '\n') + mget_buffer_memcat(&buf, "\n", 1); + fwrite(buf.data, 1, buf.length, fp); + mget_buffer_deinit(&buf); if (fp != stderr && fp != stdout) fclose(fp);