... by setting FILE* properties and replace the explicit flushes.
Explicit flushing couldn't be well done e.g. for lua's error() function.
In particular, we had problems with journald not getting logs timely.
- policy module: support '#' for separating port numbers, for consistency
- fix startup on macOS+BSD when </dev/null and cqueues installed
- policy.RPZ: log problems from zone-file level of parser as well (#453)
+- fix flushing of messages to logs in some cases (!781)
Improvements
------------
lua_settop(L, 0);
}
finish:
- fflush(out);
free(cmd);
/* Close if redirected */
if (stream_fd != STDIN_FILENO) {
return 1;
}
+ if (setvbuf(stdout, NULL, _IONBF, 0) || setvbuf(stderr, NULL, _IONBF, 0)) {
+ kr_log_error("[system] failed to to set output buffering (ignored): %s\n",
+ strerror(errno));
+ fflush(stderr);
+ }
+
/* Control sockets or TTY */
auto_free char *sock_file = NULL;
uv_pipe_t pipe;
if (args->interactive) {
if (!args->quiet)
printf("[system] interactive mode\n> ");
- fflush(stdout);
uv_pipe_open(&pipe, 0);
uv_read_start((uv_stream_t*) &pipe, tty_alloc, tty_process_input);
} else {
void kr_log_verbose(const char *fmt, ...)
{
- if (kr_verbose_status) {
+ if (unlikely(kr_verbose_status)) {
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
- fflush(stdout);
}
}
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
- fflush(stdout);
}
bool kr_log_trace(const struct kr_query *query, const char *source, const char *fmt, ...)
/** @brief Callback for request logging handler. */
typedef void (*trace_log_f)(const struct kr_query *query, const char *source, const char *msg);
-#define kr_log_info(...) do { printf(__VA_ARGS__); fflush(stdout); } while(0)
+#define kr_log_info printf
#define kr_log_error(...) fprintf(stderr, ## __VA_ARGS__)
/* Always export these, but override direct calls by macros conditionally. */