#ifndef _UCW_LOG_H_
#define _UCW_LOG_H_
-#include "ucw/clists.h"
+#include <ucw/clists.h>
+
+#ifdef CONFIG_UCW_CLEAN_ABI
+#define log_add_substream ucw_log_add_substream
+#define log_check_configured ucw_log_check_configured
+#define log_close_all ucw_log_close_all
+#define log_close_stream ucw_log_close_stream
+#define log_configured ucw_log_configured
+#define log_find_type ucw_log_find_type
+#define log_new_configured ucw_log_new_configured
+#define log_new_fd ucw_log_new_fd
+#define log_new_file ucw_log_new_file
+#define log_new_stream ucw_log_new_stream
+#define log_new_syslog ucw_log_new_syslog
+#define log_register_type ucw_log_register_type
+#define log_rm_substream ucw_log_rm_substream
+#define log_set_default_stream ucw_log_set_default_stream
+#define log_set_format ucw_log_set_format
+#define log_stream_by_flags ucw_log_stream_by_flags
+#define log_switch ucw_log_switch
+#define log_switch_disable ucw_log_switch_disable
+#define log_switch_enable ucw_log_switch_enable
+#define log_syslog_facility_exists ucw_log_syslog_facility_exists
+#define log_type_name ucw_log_type_name
+#endif
/*** === Messages and streams ***/
/***
* === Message flags
*
- * The @flags parameter of msg() is divided to several groups of bits (from the LSB):
+ * The @flags parameter of <<basics:msg()>> is divided to several groups of bits (from the LSB):
* message severity level (`L_xxx`), destination stream, message type
* and control bits (e.g., `L_SIGHANDLER`).
***/
return log_stream_by_flags(0);
}
+/**
+ * Make the specified stream the default destination.
+ *
+ * In fact, it takes the fixed default stream and attaches @ls as its only
+ * substream. If there were any other substreams, they are removed.
+ *
+ * Log streams created by <<basics:log_file()>> or @log_configured() are made default
+ * by calling this function.
+ **/
+void log_set_default_stream(struct log_stream *ls);
+
/**
* Close all open streams, un-initialize the module, free all memory and
* reset the logging mechanism to use stderr only.
* even in multi-threaded programs.
***/
-struct log_stream *log_new_file(const char *path); /** Create a stream bound to a log file. **/
-struct log_stream *log_new_fd(int fd); /** Create a stream bound to a file descriptor. **/
+struct log_stream *log_new_file(const char *path, uns flags); /** Create a stream bound to a log file. See `FF_xxx` for @flags. **/
+struct log_stream *log_new_fd(int fd, uns flags); /** Create a stream bound to a file descriptor. See `FF_xxx` for @flags. **/
+
+enum log_file_flag { /** Flags used for file-based logging **/
+ FF_FORMAT_NAME = 1, // Internal: Name contains strftime escapes
+ FF_CLOSE_FD = 2, // Close the fd with the stream (use with log_new_fd())
+ FF_FD2_FOLLOWS = 4, // Maintain stderr as a clone of this stream
+};
/**
* When a time-based name of the log file changes, the logger switches to a new