aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2012-07-13 11:46:39 +0200
committerMartin Willi <martin@revosec.ch>2012-07-13 13:23:29 +0200
commit4addc415a5aaa1bac32a0d10587e1eba5dbcc9b7 (patch)
treecca4b48d9d0ae8cfa4b1460a805fb3eefc171e1c
parent1b40b74de032b36c199c4c65016e4736c09b6c81 (diff)
downloadstrongswan-4addc415a5aaa1bac32a0d10587e1eba5dbcc9b7.tar.bz2
strongswan-4addc415a5aaa1bac32a0d10587e1eba5dbcc9b7.tar.xz
Write directly to FILE stream in glibc printf hooks
-rw-r--r--src/libstrongswan/printf_hook.c12
-rw-r--r--src/libstrongswan/printf_hook.h72
2 files changed, 49 insertions, 35 deletions
diff --git a/src/libstrongswan/printf_hook.c b/src/libstrongswan/printf_hook.c
index 1ffe550c7..22f5d78d9 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 a72295afd..fa11b6f9b 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 <vstr.h>
@@ -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