Wireshark 4.5.0
The Wireshark network protocol analyzer
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
wslog.h
Go to the documentation of this file.
1
12#ifndef __WSLOG_H__
13#define __WSLOG_H__
14
15#include <inttypes.h>
16#include <stdbool.h>
17#include <stdio.h>
18#include <stdarg.h>
19#include <time.h>
20#include <glib.h>
21
22#include <ws_symbol_export.h>
23#include <ws_attributes.h>
24#include <ws_log_defs.h>
25#include <ws_posix_compat.h>
26#include "ws_getopt.h"
27
28#ifdef WS_LOG_DOMAIN
29#define _LOG_DOMAIN WS_LOG_DOMAIN
30#else
31#define _LOG_DOMAIN ""
32#endif
33
34#ifdef WS_DEBUG
35#define _LOG_DEBUG_ENABLED true
36#else
37#define _LOG_DEBUG_ENABLED false
38#endif
39
40/*
41 * Define the macro WS_LOG_DOMAIN *before* including this header,
42 * for example:
43 * #define WS_LOG_DOMAIN LOG_DOMAIN_MAIN
44 */
45
46#ifdef __cplusplus
47extern "C" {
48#endif /* __cplusplus */
49
50/*
51 * Console open preference is stored in the Windows registry.
52 * HKEY_CURRENT_USER\Software\Wireshark\ConsoleOpen
53 */
54#define LOG_HKCU_CONSOLE_OPEN "ConsoleOpen"
55
56typedef enum {
57 LOG_CONSOLE_OPEN_NEVER,
58 LOG_CONSOLE_OPEN_AUTO, /* On demand. */
59 LOG_CONSOLE_OPEN_ALWAYS, /* Open during startup. */
60} ws_log_console_open_pref;
61
62WSUTIL_EXPORT
63ws_log_console_open_pref ws_log_console_open;
64
65typedef struct {
66 struct tm tstamp_secs;
67 long nanosecs;
68 intmax_t pid;
70
72typedef void (ws_log_writer_cb)(const char *domain, enum ws_log_level level,
73 const char *file, long line, const char *func,
74 const char *fatal_msg, ws_log_manifest_t *mft,
75 const char *user_format, va_list user_ap,
76 void *user_data);
77
78
80typedef void (ws_log_writer_free_data_cb)(void *user_data);
81
82
83WS_DLL_PUBLIC
84void ws_log_file_writer(FILE *fp, const char *domain, enum ws_log_level level,
85 const char *file, long line, const char *func,
87 const char *user_format, va_list user_ap);
88
89
90WS_DLL_PUBLIC
91void ws_log_console_writer(const char *domain, enum ws_log_level level,
92 const char *file, long line, const char *func,
94 const char *user_format, va_list user_ap);
95
96
103WS_DLL_PUBLIC
104void ws_log_console_writer_set_use_stdout(bool use_stdout);
105
106
108WS_DLL_PUBLIC
109WS_RETNONNULL
110const char *ws_log_level_to_string(enum ws_log_level level);
111
112
117WS_DLL_PUBLIC
118bool ws_log_msg_is_active(const char *domain, enum ws_log_level level);
119
120
122WS_DLL_PUBLIC
123enum ws_log_level ws_log_get_level(void);
124
125
128WS_DLL_PUBLIC
129enum ws_log_level ws_log_set_level(enum ws_log_level level);
130
131
139WS_DLL_PUBLIC
140enum ws_log_level ws_log_set_level_str(const char *str_level);
141
142
150WS_DLL_PUBLIC
151void ws_log_set_domain_filter(const char *domain_filter);
152
158WS_DLL_PUBLIC
159void ws_log_set_fatal_domain_filter(const char *domain_filter);
160
161
169WS_DLL_PUBLIC
170void ws_log_set_debug_filter(const char *str_filter);
171
172
177WS_DLL_PUBLIC
178void ws_log_set_noisy_filter(const char *str_filter);
179
180
187WS_DLL_PUBLIC
188enum ws_log_level ws_log_set_fatal_level(enum ws_log_level level);
189
190
196WS_DLL_PUBLIC
197enum ws_log_level ws_log_set_fatal_level_str(const char *str_level);
198
199
204WS_DLL_PUBLIC
206
207
214WS_DLL_PUBLIC
216 void *user_data,
217 ws_log_writer_free_data_cb *free_user_data);
218
219
220#define LOG_ARGS_NOEXIT -1
221
222#define LONGOPT_WSLOG_BASE LONGOPT_BASE_APPLICATION+1000
223#define LONGOPT_WSLOG_LOG_LEVEL LONGOPT_WSLOG_BASE+1
224#define LONGOPT_WSLOG_LOG_DOMAIN LONGOPT_WSLOG_BASE+2
225#define LONGOPT_WSLOG_LOG_FILE LONGOPT_WSLOG_BASE+3
226#define LONGOPT_WSLOG_LOG_FATAL LONGOPT_WSLOG_BASE+4
227#define LONGOPT_WSLOG_LOG_FATAL_DOMAIN LONGOPT_WSLOG_BASE+5
228#define LONGOPT_WSLOG_LOG_DEBUG LONGOPT_WSLOG_BASE+6
229#define LONGOPT_WSLOG_LOG_NOISY LONGOPT_WSLOG_BASE+7
230
233#define LONGOPT_WSLOG \
234 {"log-level", ws_required_argument, NULL, LONGOPT_WSLOG_LOG_LEVEL}, \
235 {"log-domain", ws_required_argument, NULL, LONGOPT_WSLOG_LOG_DOMAIN}, \
236 /* Alias "domain" and "domains". */ \
237 {"log-domains", ws_required_argument, NULL, LONGOPT_WSLOG_LOG_DOMAIN}, \
238 {"log-file", ws_required_argument, NULL, LONGOPT_WSLOG_LOG_FILE}, \
239 {"log-fatal", ws_required_argument, NULL, LONGOPT_WSLOG_LOG_FATAL}, \
240 /* Alias "domain" and "domains". */ \
241 {"log-fatal-domain", ws_required_argument, NULL, LONGOPT_WSLOG_LOG_FATAL_DOMAIN}, \
242 {"log-fatal-domains", ws_required_argument, NULL, LONGOPT_WSLOG_LOG_FATAL_DOMAIN}, \
243 {"log-debug", ws_required_argument, NULL, LONGOPT_WSLOG_LOG_DEBUG}, \
244 {"log-noisy", ws_required_argument, NULL, LONGOPT_WSLOG_LOG_NOISY},
245
250WS_DLL_PUBLIC
251int ws_log_parse_args(int *argc_ptr, char *argv[],
252 const char* optstring, const struct ws_option* long_options,
253 void (*vcmdarg_err)(const char *, va_list ap),
254 int exit_failure);
255
261WS_DLL_PUBLIC
262bool ws_log_is_wslog_arg(int arg);
263
264
265
272WS_DLL_PUBLIC
273void ws_log_init(void (*vcmdarg_err)(const char *, va_list ap));
274
275
281WS_DLL_PUBLIC
283 void (*vcmdarg_err)(const char *, va_list ap));
284
285
292WS_DLL_PUBLIC
294 void *user_data,
295 ws_log_writer_free_data_cb *free_user_data,
296 void (*vcmdarg_err)(const char *, va_list ap));
297
298
303WS_DLL_PUBLIC
304void ws_log(const char *domain, enum ws_log_level level,
305 const char *format, ...) G_GNUC_PRINTF(3,4);
306
307
312WS_DLL_PUBLIC
313void ws_logv(const char *domain, enum ws_log_level level,
314 const char *format, va_list ap);
315
316
322WS_DLL_PUBLIC
323void ws_log_full(const char *domain, enum ws_log_level level,
324 const char *file, long line, const char *func,
325 const char *format, ...) G_GNUC_PRINTF(6,7);
326
327
333WS_DLL_PUBLIC
334void ws_logv_full(const char *domain, enum ws_log_level level,
335 const char *file, long line, const char *func,
336 const char *format, va_list ap);
337
338
339WS_DLL_PUBLIC
340WS_NORETURN
341void ws_log_fatal_full(const char *domain, enum ws_log_level level,
342 const char *file, long line, const char *func,
343 const char *format, ...) G_GNUC_PRINTF(6,7);
344
345
346/*
347 * The if condition avoids -Wunused warnings for variables used only with
348 * WS_DEBUG, typically inside a ws_debug() call. The compiler will
349 * optimize away the dead execution branch.
350 */
351#define _LOG_IF_ACTIVE(active, level, file, line, func, ...) \
352 do { \
353 if (active) { \
354 ws_log_full(_LOG_DOMAIN, level, \
355 file, line, func, \
356 __VA_ARGS__); \
357 } \
358 } while (0)
359
360#define _LOG_FULL(active, level, ...) \
361 _LOG_IF_ACTIVE(active, level, __FILE__, __LINE__, __func__, __VA_ARGS__)
362
363#define _LOG_SIMPLE(active, level, ...) \
364 _LOG_IF_ACTIVE(active, level, NULL, -1, NULL, __VA_ARGS__)
365
372#define ws_error(...) \
373 ws_log_fatal_full(_LOG_DOMAIN, LOG_LEVEL_ERROR, \
374 __FILE__, __LINE__, __func__, __VA_ARGS__)
375
380#define ws_critical(...) \
381 _LOG_FULL(true, LOG_LEVEL_CRITICAL, __VA_ARGS__)
382
387#define ws_warning(...) \
388 _LOG_FULL(true, LOG_LEVEL_WARNING, __VA_ARGS__)
389
395#define ws_message(...) \
396 _LOG_SIMPLE(true, LOG_LEVEL_MESSAGE, __VA_ARGS__)
397
403#define ws_info(...) \
404 _LOG_SIMPLE(true, LOG_LEVEL_INFO, __VA_ARGS__)
405
410#define ws_debug(...) \
411 _LOG_FULL(_LOG_DEBUG_ENABLED, LOG_LEVEL_DEBUG, __VA_ARGS__)
412
417#define ws_noisy(...) \
418 _LOG_FULL(_LOG_DEBUG_ENABLED, LOG_LEVEL_NOISY, __VA_ARGS__)
419
421#define WS_DEBUG_HERE(...) \
422 _LOG_FULL(true, LOG_LEVEL_ECHO, __VA_ARGS__)
423
424#define WS_NOT_IMPLEMENTED() \
425 ws_error("Not implemented yet")
426
427WS_DLL_PUBLIC
428void ws_log_utf8_full(const char *domain, enum ws_log_level level,
429 const char *file, long line, const char *func,
430 const char *string, ssize_t length, const char *endptr);
431
432
433#define ws_log_utf8(str, len, endptr) \
434 do { \
435 if (_LOG_DEBUG_ENABLED) { \
436 ws_log_utf8_full(LOG_DOMAIN_UTF_8, LOG_LEVEL_DEBUG, \
437 __FILE__, __LINE__, __func__, \
438 str, len, endptr); \
439 } \
440 } while (0)
441
442
447WS_DLL_PUBLIC
448void ws_log_buffer_full(const char *domain, enum ws_log_level level,
449 const char *file, long line, const char *func,
450 const uint8_t *buffer, size_t size,
451 size_t max_bytes_len, const char *msg);
452
453
454#define ws_log_buffer(buf, size, msg) \
455 do { \
456 if (_LOG_DEBUG_ENABLED) { \
457 ws_log_buffer_full(_LOG_DOMAIN, LOG_LEVEL_DEBUG, \
458 __FILE__, __LINE__, __func__, \
459 buf, size, 36, msg ? msg : #buf); \
460 } \
461 } while (0)
462
463
471WS_DLL_PUBLIC
472void ws_log_write_always_full(const char *domain, enum ws_log_level level,
473 const char *file, long line, const char *func,
474 const char *format, ...) G_GNUC_PRINTF(6,7);
475
476
482WS_DLL_PUBLIC
483void ws_log_add_custom_file(FILE *fp);
484
485
486WS_DLL_PUBLIC
487void ws_log_print_usage(FILE *fp);
488
489#ifdef __cplusplus
490}
491#endif /* __cplusplus */
492
493#endif /* __WSLOG_H__ */
Definition mcast_stream.h:30
Definition wslog.h:65
Definition ws_getopt.h:42
WS_DLL_PUBLIC void ws_log(const char *domain, enum ws_log_level level, const char *format,...) G_GNUC_PRINTF(3
WS_DLL_PUBLIC void ws_log_set_writer_with_data(ws_log_writer_cb *writer, void *user_data, ws_log_writer_free_data_cb *free_user_data)
Definition wslog.c:578
WS_DLL_PUBLIC void ws_log_set_domain_filter(const char *domain_filter)
Definition wslog.c:516
WS_DLL_PUBLIC void ws_log_set_debug_filter(const char *str_filter)
Definition wslog.c:530
void() ws_log_writer_free_data_cb(void *user_data)
Definition wslog.h:80
WS_DLL_PUBLIC void ws_log_set_fatal_domain_filter(const char *domain_filter)
Definition wslog.c:523
WS_DLL_PUBLIC void ws_log_console_writer_set_use_stdout(bool use_stdout)
Definition wslog.c:1170
WS_DLL_PUBLIC enum ws_log_level ws_log_set_level(enum ws_log_level level)
Definition wslog.c:351
WS_DLL_PUBLIC void ws_log_set_noisy_filter(const char *str_filter)
Definition wslog.c:537
WS_DLL_PUBLIC void WS_DLL_PUBLIC void ws_logv_full(const char *domain, enum ws_log_level level, const char *file, long line, const char *func, const char *format, va_list ap)
Definition wslog.c:951
WS_DLL_PUBLIC int ws_log_parse_args(int *argc_ptr, char *argv[], const char *optstring, const struct ws_option *long_options, void(*vcmdarg_err)(const char *, va_list ap), int exit_failure)
Definition wslog.c:388
WS_DLL_PUBLIC void ws_log_write_always_full(const char *domain, enum ws_log_level level, const char *file, long line, const char *func, const char *format,...) G_GNUC_PRINTF(6
void() ws_log_writer_cb(const char *domain, enum ws_log_level level, const char *file, long line, const char *func, const char *fatal_msg, ws_log_manifest_t *mft, const char *user_format, va_list user_ap, void *user_data)
Definition wslog.h:72
WS_DLL_PUBLIC void ws_log_buffer_full(const char *domain, enum ws_log_level level, const char *file, long line, const char *func, const uint8_t *buffer, size_t size, size_t max_bytes_len, const char *msg)
Definition wslog.c:1123
WS_DLL_PUBLIC enum ws_log_level ws_log_set_fatal_level(enum ws_log_level level)
Definition wslog.c:544
WS_DLL_PUBLIC void ws_log_init(void(*vcmdarg_err)(const char *, va_list ap))
Definition wslog.c:650
WS_DLL_PUBLIC void WS_DLL_PUBLIC void ws_log_add_custom_file(FILE *fp)
Definition wslog.c:1193
WS_DLL_PUBLIC WS_RETNONNULL const char * ws_log_level_to_string(enum ws_log_level level)
Definition wslog.c:137
WS_DLL_PUBLIC void ws_log_full(const char *domain, enum ws_log_level level, const char *file, long line, const char *func, const char *format,...) G_GNUC_PRINTF(6
WS_DLL_PUBLIC void ws_log_init_with_writer(ws_log_writer_cb *writer, void(*vcmdarg_err)(const char *, va_list ap))
Definition wslog.c:726
WS_DLL_PUBLIC void WS_DLL_PUBLIC void ws_logv(const char *domain, enum ws_log_level level, const char *format, va_list ap)
Definition wslog.c:940
WS_DLL_PUBLIC void ws_log_init_with_writer_and_data(ws_log_writer_cb *writer, void *user_data, ws_log_writer_free_data_cb *free_user_data, void(*vcmdarg_err)(const char *, va_list ap))
Definition wslog.c:734
WS_DLL_PUBLIC bool ws_log_is_wslog_arg(int arg)
Definition wslog.c:458
WS_DLL_PUBLIC enum ws_log_level ws_log_get_level(void)
Definition wslog.c:345
WS_DLL_PUBLIC void ws_log_set_writer(ws_log_writer_cb *writer)
Definition wslog.c:567
WS_DLL_PUBLIC bool ws_log_msg_is_active(const char *domain, enum ws_log_level level)
Definition wslog.c:279
WS_DLL_PUBLIC enum ws_log_level ws_log_set_fatal_level_str(const char *str_level)
Definition wslog.c:558
WS_DLL_PUBLIC enum ws_log_level ws_log_set_level_str(const char *str_level)
Definition wslog.c:363