#if defined(__printflike)
#define _BT_LOG_PRINTFLIKE(str_index, first_to_check) \
__printflike(str_index, first_to_check)
+#elif defined(__MINGW_PRINTF_FORMAT)
+ #define _BT_LOG_PRINTFLIKE(str_index, first_to_check) \
+ __attribute__((format(__MINGW_PRINTF_FORMAT, str_index, first_to_check)))
#elif defined(__GNUC__)
#define _BT_LOG_PRINTFLIKE(str_index, first_to_check) \
__attribute__((format(__printf__, str_index, first_to_check)))
* - BT_LOGE("format string", args, ...)
* - BT_LOGF("format string", args, ...)
*
+ * Message and error string (errno) logging macros:
+ * - BT_LOGV_ERRNO("initial message", "format string", args, ...)
+ * - BT_LOGD_ERRNO("initial message", "format string", args, ...)
+ * - BT_LOGI_ERRNO("initial message", "format string", args, ...)
+ * - BT_LOGW_ERRNO("initial message", "format string", args, ...)
+ * - BT_LOGE_ERRNO("initial message", "format string", args, ...)
+ * - BT_LOGF_ERRNO("initial message", "format string", args, ...)
+ *
* Memory logging macros:
* - BT_LOGV_MEM(data_ptr, data_sz, "format string", args, ...)
* - BT_LOGD_MEM(data_ptr, data_sz, "format string", args, ...)
} _BT_LOG_ONCE
#endif
+#if (_POSIX_C_SOURCE >= 200112L) && ! _GNU_SOURCE
+ /* XSI-compliant version of strerror_r(). */
+ #define BT_LOG_WRITE_ERRNO(lvl, tag, _msg, _fmt, args...) \
+ do { \
+ char error_str[BUFSIZ]; \
+ memset(error_str, 0, sizeof(error_str)); \
+ (void) strerror_r(errno, error_str, sizeof(error_str)); \
+ BT_LOG_WRITE(lvl, tag, _msg ": %s" _fmt, error_str, ## args); \
+ } _BT_LOG_ONCE
+#else
+ /* GNU version of strerror_r(). */
+ #define BT_LOG_WRITE_ERRNO(lvl, tag, _msg, _fmt, args...) \
+ do { \
+ char error_str_buf[BUFSIZ]; \
+ char *error_str; \
+ error_str = strerror_r(errno, error_str_buf, sizeof(error_str_buf)); \
+ BT_LOG_WRITE(lvl, tag, _msg ": %s" _fmt, error_str, ## args); \
+ } _BT_LOG_ONCE
+#endif
+
static _BT_LOG_INLINE void _bt_log_unused(const int dummy, ...) {(void)dummy;}
#define _BT_LOG_UNUSED(...) \
#if BT_LOG_ENABLED_VERBOSE
#define BT_LOGV(...) \
BT_LOG_WRITE(BT_LOG_VERBOSE, _BT_LOG_TAG, __VA_ARGS__)
+ #define BT_LOGV_ERRNO(...) \
+ BT_LOG_WRITE_ERRNO(BT_LOG_VERBOSE, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGV_AUX(log, ...) \
BT_LOG_WRITE_AUX(log, BT_LOG_VERBOSE, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGV_MEM(d, d_sz, ...) \
#if BT_LOG_ENABLED_DEBUG
#define BT_LOGD(...) \
BT_LOG_WRITE(BT_LOG_DEBUG, _BT_LOG_TAG, __VA_ARGS__)
+ #define BT_LOGD_ERRNO(...) \
+ BT_LOG_WRITE_ERRNO(BT_LOG_DEBUG, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGD_AUX(log, ...) \
BT_LOG_WRITE_AUX(log, BT_LOG_DEBUG, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGD_MEM(d, d_sz, ...) \
#if BT_LOG_ENABLED_INFO
#define BT_LOGI(...) \
BT_LOG_WRITE(BT_LOG_INFO, _BT_LOG_TAG, __VA_ARGS__)
+ #define BT_LOGI_ERRNO(...) \
+ BT_LOG_WRITE_ERRNO(BT_LOG_INFO, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGI_AUX(log, ...) \
BT_LOG_WRITE_AUX(log, BT_LOG_INFO, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGI_MEM(d, d_sz, ...) \
#if BT_LOG_ENABLED_WARN
#define BT_LOGW(...) \
BT_LOG_WRITE(BT_LOG_WARN, _BT_LOG_TAG, __VA_ARGS__)
+ #define BT_LOGW_ERRNO(...) \
+ BT_LOG_WRITE_ERRNO(BT_LOG_WARN, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGW_AUX(log, ...) \
BT_LOG_WRITE_AUX(log, BT_LOG_WARN, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGW_MEM(d, d_sz, ...) \
#if BT_LOG_ENABLED_ERROR
#define BT_LOGE(...) \
BT_LOG_WRITE(BT_LOG_ERROR, _BT_LOG_TAG, __VA_ARGS__)
+ #define BT_LOGE_ERRNO(...) \
+ BT_LOG_WRITE_ERRNO(BT_LOG_ERROR, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGE_AUX(log, ...) \
BT_LOG_WRITE_AUX(log, BT_LOG_ERROR, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGE_MEM(d, d_sz, ...) \
#if BT_LOG_ENABLED_FATAL
#define BT_LOGF(...) \
BT_LOG_WRITE(BT_LOG_FATAL, _BT_LOG_TAG, __VA_ARGS__)
+ #define BT_LOGF_ERRNO(...) \
+ BT_LOG_WRITE_ERRNO(BT_LOG_FATAL, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGF_AUX(log, ...) \
BT_LOG_WRITE_AUX(log, BT_LOG_FATAL, _BT_LOG_TAG, __VA_ARGS__)
#define BT_LOGF_MEM(d, d_sz, ...) \
* bt_log_set_output_v(BT_LOG_OUT_STDERR);
*/
enum { BT_LOG_OUT_STDERR_MASK = BT_LOG_PUT_STD };
+
+BT_HIDDEN
void bt_log_out_stderr_callback(const bt_log_message *const msg, void *arg);
#define BT_LOG_OUT_STDERR BT_LOG_OUT_STDERR_MASK, 0, bt_log_out_stderr_callback