From: Martin Willi Date: Fri, 13 Jul 2012 09:46:39 +0000 (+0200) Subject: Write directly to FILE stream in glibc printf hooks X-Git-Tag: 5.0.1~389 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4addc415a5aaa1bac32a0d10587e1eba5dbcc9b7;p=thirdparty%2Fstrongswan.git Write directly to FILE stream in glibc printf hooks --- diff --git a/src/libstrongswan/printf_hook.c b/src/libstrongswan/printf_hook.c index 1ffe550c71..22f5d78d9d 100644 --- a/src/libstrongswan/printf_hook.c +++ b/src/libstrongswan/printf_hook.c @@ -86,25 +86,17 @@ static printf_hook_handler_t *printf_hooks[NUM_HANDLERS]; static int custom_print(FILE *stream, const struct printf_info *info, const void *const *args) { - int written; - char buf[PRINTF_BUF_LEN]; printf_hook_spec_t spec; printf_hook_handler_t *handler = printf_hooks[SPEC_TO_INDEX(info->spec)]; printf_hook_data_t data = { - .buf = buf, - .buflen = sizeof(buf), + .stream = stream, }; spec.hash = info->alt; spec.minus = info->left; spec.width = info->width; - written = handler->hook(&data, &spec, args); - if (written > 0) - { - ignore_result(fwrite(buf, 1, written, stream)); - } - return written; + return handler->hook(&data, &spec, args); } /** diff --git a/src/libstrongswan/printf_hook.h b/src/libstrongswan/printf_hook.h index a72295afdc..fa11b6f9b9 100644 --- a/src/libstrongswan/printf_hook.h +++ b/src/libstrongswan/printf_hook.h @@ -46,6 +46,29 @@ enum printf_hook_argtype_t { PRINTF_HOOK_ARGTYPE_POINTER = PA_POINTER, }; +/** + * Data to pass to a printf hook. + */ +struct printf_hook_data_t { + + /** + * Output FILE stream + */ + FILE *stream;; +}; + +/** + * Helper macro to be used in printf hook callbacks. + */ +#define print_in_hook(data, fmt, ...) ({\ + int _written = fprintf(data->stream, fmt, ##__VA_ARGS__);\ + if (_written < 0)\ + {\ + _written = 0;\ + }\ + _written;\ +}) + #else #include @@ -86,23 +109,24 @@ int vstr_wrapper_vasprintf(char **str, const char *format, va_list ap); #define vsnprintf vstr_wrapper_vsnprintf #define vasprintf vstr_wrapper_vasprintf -#endif - /** - * Callback function type for printf hooks. - * - * @param data hook data, to pass to print_in_hook() - * @param spec format specifier - * @param args arguments array - * @return number of characters written + * Data to pass to a printf hook. */ -typedef int (*printf_hook_function_t)(printf_hook_data_t *data, - printf_hook_spec_t *spec, - const void *const *args); +struct printf_hook_data_t { + + /** + * Buffer to write to + */ + char *buf; + + /** + * Size of the buffer + */ + size_t buflen; +}; /** * Helper macro to be used in printf hook callbacks. - * buf and buflen get modified. */ #define print_in_hook(data, fmt, ...) ({\ int _written = snprintf(data->buf, data->buflen, fmt, ##__VA_ARGS__);\ @@ -115,21 +139,19 @@ typedef int (*printf_hook_function_t)(printf_hook_data_t *data, _written;\ }) +#endif + /** - * Data to pass to a printf hook. + * Callback function type for printf hooks. + * + * @param data hook data, to pass to print_in_hook() + * @param spec format specifier + * @param args arguments array + * @return number of characters written */ -struct printf_hook_data_t { - - /** - * Buffer to write to - */ - char *buf; - - /** - * Size of the buffer - */ - size_t buflen; -}; +typedef int (*printf_hook_function_t)(printf_hook_data_t *data, + printf_hook_spec_t *spec, + const void *const *args); /** * Properties of the format specifier