@@ -35,24 +35,57 @@ static inline void mdns_dbg_flush(void)
35
35
}
36
36
}
37
37
38
- static void mdns_dbg_printf (const char * fmt , ... )
38
+ static void mdns_dbg_vprintf (const char * fmt , va_list args )
39
39
{
40
- va_list ap ;
41
- va_start ( ap , fmt );
42
- int len = vsnprintf ( s_mdns_dbg_buf + s_mdns_dbg_pos , MDNS_DBG_MAX_LINE - s_mdns_dbg_pos , fmt , ap );
43
- va_end ( ap );
40
+ // Try to format directly into the buffer
41
+ int len = vsnprintf ( s_mdns_dbg_buf + s_mdns_dbg_pos ,
42
+ MDNS_DBG_MAX_LINE - s_mdns_dbg_pos ,
43
+ fmt , args );
44
44
45
45
if (len < 0 ) {
46
- return ;
46
+ return ; // Error in formatting
47
47
}
48
48
49
- s_mdns_dbg_pos += len ;
49
+ // Check if the entire formatted string fit in the buffer
50
+ if (len < (MDNS_DBG_MAX_LINE - s_mdns_dbg_pos )) {
51
+ // If it fit, just update the position
52
+ s_mdns_dbg_pos += len ;
53
+ } else {
54
+ // The formatted string was truncated because it didn't fit
55
+ // First, flush what we have (the partial string)
56
+ mdns_dbg_flush ();
57
+
58
+ // Create a new va_list copy and try again with the full buffer
59
+ va_list args_copy ;
60
+ va_copy (args_copy , args );
61
+
62
+ // Format again with the entire buffer available
63
+ len = vsnprintf (s_mdns_dbg_buf , MDNS_DBG_MAX_LINE - 1 , fmt , args_copy );
64
+ va_end (args_copy );
65
+
66
+ if (len < 0 ) {
67
+ return ; // Error
68
+ }
69
+
70
+ // Update position based on what fit this time
71
+ s_mdns_dbg_pos = (len >= MDNS_DBG_MAX_LINE - 1 ) ?
72
+ (MDNS_DBG_MAX_LINE - 1 ) : len ;
73
+ }
50
74
75
+ // If buffer is nearly full after this operation, flush it
51
76
if (s_mdns_dbg_pos >= MDNS_DBG_MAX_LINE - 1 ) {
52
77
mdns_dbg_flush ();
53
78
}
54
79
}
55
80
81
+ static void mdns_dbg_printf (const char * fmt , ...)
82
+ {
83
+ va_list ap ;
84
+ va_start (ap , fmt );
85
+ mdns_dbg_vprintf (fmt , ap );
86
+ va_end (ap );
87
+ }
88
+
56
89
#define dbg_printf (...) mdns_dbg_printf(__VA_ARGS__)
57
90
#else
58
91
#define dbg_printf (...) printf(__VA_ARGS__)
0 commit comments