diff options
author | Tobias Brunner <tobias@strongswan.org> | 2013-09-23 17:01:53 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2013-09-24 08:44:00 +0200 |
commit | ed72f2d65e586a9168b9c461ba7f14d3284ad309 (patch) | |
tree | 988c099fccc5e0e4d822b7bf241a88c413eba652 /src | |
parent | c17cbfdb7244e5553ae2e9e874c7ca7a2e3d8a9c (diff) | |
download | strongswan-ed72f2d65e586a9168b9c461ba7f14d3284ad309.tar.bz2 strongswan-ed72f2d65e586a9168b9c461ba7f14d3284ad309.tar.xz |
printf-hook: Write to output stream instead of the FD directly when using Vstr
This avoids problems when other stdio functions are used (fputs,
fwrite) as writes via Vstr/FD were always unbuffered.
Diffstat (limited to 'src')
-rw-r--r-- | src/libstrongswan/utils/printf_hook.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/src/libstrongswan/utils/printf_hook.c b/src/libstrongswan/utils/printf_hook.c index f030f45c8..aabfdc53f 100644 --- a/src/libstrongswan/utils/printf_hook.c +++ b/src/libstrongswan/utils/printf_hook.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Tobias Brunner + * Copyright (C) 2009-2013 Tobias Brunner * Copyright (C) 2006-2008 Martin Willi * Hochschule fuer Technik Rapperswil * @@ -22,6 +22,7 @@ #include <stdio.h> #include <stdarg.h> #include <string.h> +#include <sys/uio.h> typedef struct private_printf_hook_t private_printf_hook_t; typedef struct printf_hook_handler_t printf_hook_handler_t; @@ -300,23 +301,23 @@ int vstr_wrapper_asprintf(char **str, const char *format, ...) va_end(args); return written; } -static inline int vstr_wrapper_vprintf_internal(Vstr_conf *conf, int fd, +static inline int vstr_wrapper_vprintf_internal(Vstr_conf *conf, FILE *stream, const char *format, va_list args) { - int written; + struct iovec *iov; + int iovcnt, written = 0; Vstr_base *s = vstr_make_base(conf); vstr_add_vfmt(s, 0, format, args); - written = s->len; - while (s->len) + if (vstr_export_iovec_ptr_all(s, &iov, &iovcnt)) { - if (!vstr_sc_write_fd(s, 1, s->len, fd, NULL)) + while (iovcnt--) { - if (errno != EAGAIN && errno != EINTR) + if (iov->iov_base) { - written -= s->len; - break; + written += fwrite(iov->iov_base, 1, iov->iov_len, stream); } + iov++; } } vstr_free_base(s); @@ -327,7 +328,7 @@ int vstr_wrapper_vprintf(const char *format, va_list args) Vstr_conf *conf = get_vstr_conf(); if (conf) { - return vstr_wrapper_vprintf_internal(conf, STDOUT_FILENO, format, args); + return vstr_wrapper_vprintf_internal(conf, stdout, format, args); } return vprintf(format, args); } @@ -336,8 +337,7 @@ int vstr_wrapper_vfprintf(FILE *stream, const char *format, va_list args) Vstr_conf *conf = get_vstr_conf(); if (conf) { - return vstr_wrapper_vprintf_internal(conf, fileno(stream), format, - args); + return vstr_wrapper_vprintf_internal(conf, stream, format, args); } return vfprintf(stream, format, args); } |