1010#include <bfdev/types.h>
1111#include <bfdev/stddef.h>
1212#include <bfdev/stdarg.h>
13+ #include <bfdev/errno.h>
14+ #include <bfdev/ilist.h>
1315#include <bfdev/level.h>
1416#include <bfdev/bits.h>
1517#include <bfdev/bitflags.h>
@@ -25,8 +27,12 @@ BFDEV_BEGIN_DECLS
2527#endif
2628
2729typedef struct bfdev_log bfdev_log_t ;
30+ typedef struct bfdev_log_chain bfdev_log_chain_t ;
2831typedef struct bfdev_log_message bfdev_log_message_t ;
2932
33+ typedef int (* bfdev_log_hook_t )
34+ (bfdev_log_message_t * msg , void * pdata );
35+
3036typedef int (* bfdev_log_write_t )
3137(bfdev_log_message_t * msg , void * pdata );
3238
@@ -38,22 +44,33 @@ enum bfdev_log_flags {
3844 BFDEV_LOG_LEVEL = BFDEV_BIT (__BFDEV_LOG_LEVEL ),
3945};
4046
47+ struct bfdev_log_chain {
48+ bfdev_ilist_node_t list ;
49+ bfdev_log_hook_t func ;
50+ int priority ;
51+ };
52+
4153struct bfdev_log {
4254 unsigned int default_level ;
4355 unsigned int record_level ;
4456 unsigned long flags ;
4557
58+ bfdev_ilist_head_t prefix_hooks ;
59+ bfdev_ilist_head_t suffix_hooks ;
60+
4661 bfdev_log_write_t write ;
4762 void * pdata ;
4863};
4964
5065struct bfdev_log_message {
5166 unsigned int level ;
52- char * buff ;
5367 bfdev_size_t length ;
68+ char * buff ;
5469};
5570
5671#define BFDEV_LOG_STATIC (HEAD , DEFAULT , RECORD , FLAGS , WRITE , PDATA ) { \
72+ .prefix_hooks = BFDEV_ILIST_HEAD_STATIC(&(HEAD)->prefix_hooks), \
73+ .suffix_hooks = BFDEV_ILIST_HEAD_STATIC(&(HEAD)->suffix_hooks), \
5774 .default_level = (DEFAULT), .record_level = (RECORD), \
5875 .flags = (FLAGS), .write = (WRITE), .pdata = (PDATA), \
5976}
@@ -95,6 +112,18 @@ bfdev_vlog_core(bfdev_log_t *log, const char *fmt, bfdev_va_list args);
95112extern __bfdev_printf (2 , 3 ) int
96113bfdev_log_core (bfdev_log_t * log , const char * fmt , ...);
97114
115+ extern __bfdev_printf (2 , 0 ) int
116+ bfdev_msg_vappend (bfdev_log_message_t * msg , const char * fmt , bfdev_va_list args );
117+
118+ extern __bfdev_printf (2 , 3 ) int
119+ bfdev_msg_append (bfdev_log_message_t * msg , const char * fmt , ...);
120+
121+ extern int
122+ bfdev_log_hook_register (bfdev_log_t * log , bfdev_log_chain_t * hook );
123+
124+ extern void
125+ bfdev_log_hook_unregister (bfdev_log_t * log , bfdev_log_chain_t * hook );
126+
98127/**
99128 * bfdev_log_fmt - used by the bfdev_log_*() macros to generate the bfdev_log format string
100129 * @fmt: format string passed from a bfdev_log_*() macro
0 commit comments