diff --git a/capture_opts.c b/capture_opts.c index 6bf735b707..13eb70c3b3 100644 --- a/capture_opts.c +++ b/capture_opts.c @@ -150,7 +150,7 @@ capture_opts_cleanup(capture_options *capture_opts) /* log content of capture_opts */ void -capture_opts_log(enum ws_log_domain log_domain, enum ws_log_level log_level, capture_options *capture_opts) { +capture_opts_log(const char *log_domain, enum ws_log_level log_level, capture_options *capture_opts) { guint i; ws_log(log_domain, log_level, "CAPTURE OPTIONS :"); diff --git a/capture_opts.h b/capture_opts.h index 2c6fffc8a3..6ce656a389 100644 --- a/capture_opts.h +++ b/capture_opts.h @@ -339,7 +339,7 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg) /* log content of capture_opts */ extern void -capture_opts_log(enum ws_log_domain domain, enum ws_log_level level, capture_options *capture_opts); +capture_opts_log(const char *domain, enum ws_log_level level, capture_options *capture_opts); enum caps_query { CAPS_QUERY_LINK_TYPES = 0x1, diff --git a/debian/libwsutil0.symbols b/debian/libwsutil0.symbols index d9ea8f3d8e..78c8f36c20 100644 --- a/debian/libwsutil0.symbols +++ b/debian/libwsutil0.symbols @@ -227,7 +227,6 @@ libwsutil.so.0 libwsutil0 #MINVER# ws_init_sockets@Base 3.1.0 ws_log@Base 3.5.0 ws_log_add_custom_file@Base 3.5.0 - ws_log_domain_to_string@Base 3.5.0 ws_log_fprint@Base 3.5.0 ws_log_full@Base 3.5.0 ws_log_get_level@Base 3.5.0 @@ -235,6 +234,8 @@ libwsutil.so.0 libwsutil0 #MINVER# ws_log_init_with_data@Base 3.5.0 ws_log_level_is_active@Base 3.5.0 ws_log_level_to_string@Base 3.5.0 + ws_log_set_domain_filter_args@Base 3.5.0 + ws_log_set_domain_filter_str@Base 3.5.0 ws_log_set_level@Base 3.5.0 ws_log_set_level_args@Base 3.5.0 ws_log_set_level_str@Base 3.5.0 diff --git a/dumpcap.c b/dumpcap.c index 3391e2697c..b9cffabdba 100644 --- a/dumpcap.c +++ b/dumpcap.c @@ -329,7 +329,7 @@ static gboolean need_timeout_workaround; static void dumpcap_log_writer(const char *format, va_list ap, const char *prefix, - enum ws_log_domain domain, + const char *domain, enum ws_log_level level, void *user_data); @@ -4859,6 +4859,7 @@ main(int argc, char *argv[]) cmdarg_err("Invalid log level \"%s\"", opt_err_val); exit (1); } + ws_log_set_domain_filter_args(&argc, argv); #ifdef _WIN32 create_app_running_mutex(); @@ -5572,7 +5573,7 @@ main(int argc, char *argv[]) static void dumpcap_log_writer(const char *format, va_list ap, const char *prefix, - enum ws_log_domain domain _U_, + const char *domain _U_, enum ws_log_level level _U_, void *user_data _U_) { diff --git a/extcap/androiddump.c b/extcap/androiddump.c index 1f0f21eab4..318cfde299 100644 --- a/extcap/androiddump.c +++ b/extcap/androiddump.c @@ -2540,6 +2540,7 @@ int main(int argc, char *argv[]) { cmdarg_err("Invalid log level \"%s\"", opt_err_val); return EXIT_FAILURE; } + ws_log_set_domain_filter_args(&argc, argv); /* * Get credential information for later use. diff --git a/extcap/randpktdump.c b/extcap/randpktdump.c index a3336f8e7a..495850fac3 100644 --- a/extcap/randpktdump.c +++ b/extcap/randpktdump.c @@ -163,6 +163,7 @@ int main(int argc, char *argv[]) cmdarg_err("Invalid log level \"%s\"", opt_err_val); return EXIT_FAILURE; } + ws_log_set_domain_filter_args(&argc, argv); /* * Get credential information for later use. diff --git a/rawshark.c b/rawshark.c index 28593cd263..ec8700fd30 100644 --- a/rawshark.c +++ b/rawshark.c @@ -459,6 +459,7 @@ main(int argc, char *argv[]) cmdarg_err("Invalid log level \"%s\"", opt_err_val); return INVALID_OPTION; } + ws_log_set_domain_filter_args(&argc, argv); /* Initialize the version information. */ ws_init_version_info("Rawshark (Wireshark)", NULL, diff --git a/sharkd.c b/sharkd.c index d3c770d71d..fbc92862bc 100644 --- a/sharkd.c +++ b/sharkd.c @@ -126,6 +126,7 @@ main(int argc, char *argv[]) cmdarg_err("Invalid log level \"%s\"", opt_err_val); return INIT_FAILED; } + ws_log_set_domain_filter_args(&argc, argv); /* * Get credential information for later use, and drop privileges diff --git a/tfshark.c b/tfshark.c index c9192d4dc1..9c8ed9c9b6 100644 --- a/tfshark.c +++ b/tfshark.c @@ -359,6 +359,7 @@ main(int argc, char *argv[]) cmdarg_err("Invalid log level \"%s\"", opt_err_val); return INVALID_OPTION; } + ws_log_set_domain_filter_args(&argc, argv); #ifdef _WIN32 create_app_running_mutex(); diff --git a/tshark.c b/tshark.c index a224c5eaf2..5e0000875b 100644 --- a/tshark.c +++ b/tshark.c @@ -784,6 +784,7 @@ main(int argc, char *argv[]) cmdarg_err("Invalid log level \"%s\"", opt_err_val); return INVALID_OPTION; } + ws_log_set_domain_filter_args(&argc, argv); ws_debug("tshark started with %d args", argc); diff --git a/ui/console.c b/ui/console.c index cb3a62ea73..717d5bf0fc 100644 --- a/ui/console.c +++ b/ui/console.c @@ -20,7 +20,7 @@ void console_log_writer(const char *format, va_list ap, - const char *prefix, enum ws_log_domain domain _U_, + const char *prefix, const char *domain _U_, enum ws_log_level level _U_, void *ptr _U_) { gboolean fatal = level == LOG_LEVEL_ERROR; diff --git a/ui/console.h b/ui/console.h index 6760efa15b..08933ba0d4 100644 --- a/ui/console.h +++ b/ui/console.h @@ -27,7 +27,7 @@ extern "C" { */ void console_log_writer(const char *format, va_list ap, - const char *prefix, enum ws_log_domain domain, + const char *prefix, const char *domain, enum ws_log_level level, void *ptr); #ifdef __cplusplus diff --git a/ui/qt/main.cpp b/ui/qt/main.cpp index 53baad6b0f..608109fd85 100644 --- a/ui/qt/main.cpp +++ b/ui/qt/main.cpp @@ -587,6 +587,7 @@ int main(int argc, char *qt_argv[]) cmdarg_err("Invalid log level \"%s\"", opt_err_val); exit_application(INVALID_OPTION); } + ws_log_set_domain_filter_args(&argc, argv); /* * Get credential information for later use, and drop privileges diff --git a/ws_log_domains.h b/ws_log_domains.h index 29ad446402..92ea91cff7 100644 --- a/ws_log_domains.h +++ b/ws_log_domains.h @@ -11,22 +11,21 @@ #ifndef __WS_LOG_DOMAINS_H__ #define __WS_LOG_DOMAINS_H__ -enum ws_log_domain { + /* Null domain */ +#define LOG_DOMAIN_NONE "(notset)" /* Default domain */ - LOG_DOMAIN_DEFAULT, +#define LOG_DOMAIN_DEFAULT "Default" /* Main execution domain (wireshark, tshark, etc) */ - LOG_DOMAIN_MAIN, +#define LOG_DOMAIN_MAIN "Main" /* Capture domain (except for capture child, see below) */ - LOG_DOMAIN_CAPTURE, +#define LOG_DOMAIN_CAPTURE "Capture" /* Capture child domain (the capture child might also contain * file domain messages!) */ - LOG_DOMAIN_CAPCHILD, - LOG_DOMAIN_WIRETAP, - LOG_DOMAIN_EPAN, - LOG_DOMAIN_WSUTIL, - LOG_DOMAIN_QTUI, - _LOG_DOMAIN_LAST -}; +#define LOG_DOMAIN_CAPCHILD "Capchild" +#define LOG_DOMAIN_WIRETAP "Wiretap" +#define LOG_DOMAIN_EPAN "Epan" +#define LOG_DOMAIN_WSUTIL "WSUtil" +#define LOG_DOMAIN_QTUI "GUI" #endif /* __WS_LOG_DOMAINS_H__ */ diff --git a/wsutil/wslog.c b/wsutil/wslog.c index 00eeab1e62..e89fe173ea 100644 --- a/wsutil/wslog.c +++ b/wsutil/wslog.c @@ -20,13 +20,16 @@ #define PREFIX_BUFSIZE 128 -#define LOGENVVAR "WS_LOG_LEVEL" +#define _ENV_LEVEL "WS_LOG_LEVEL" +#define _ENV_DOMAINS "WS_LOG_DOMAINS" /* TODO: Add filtering by domain. */ static enum ws_log_level current_log_level = LOG_LEVEL_MESSAGE; +GPtrArray *domain_filter = NULL; + static ws_log_writer_cb *registered_log_writer = NULL; static void *registered_log_writer_data = NULL; @@ -73,37 +76,33 @@ const char *ws_log_level_to_string(enum ws_log_level level) } -const char *ws_log_domain_to_string(enum ws_log_domain domain) -{ - switch (domain) { - case LOG_DOMAIN_DEFAULT: - return "Default"; - case LOG_DOMAIN_MAIN: - return "Main"; - case LOG_DOMAIN_CAPTURE: - return "Capture"; - case LOG_DOMAIN_CAPCHILD: - return "CapChild"; - case LOG_DOMAIN_WIRETAP: - return "Wiretap"; - case LOG_DOMAIN_EPAN: - return "Epan"; - case LOG_DOMAIN_WSUTIL: - return "Util"; - case LOG_DOMAIN_QTUI: - return "GUI"; - default: - return "(BOGUS LOG DOMAIN)"; - } -} - - gboolean ws_log_level_is_active(enum ws_log_level level) { return level <= current_log_level; } +gboolean ws_log_domain_is_active(const char *domain) +{ + if (domain_filter == NULL) + return TRUE; + + for (guint i = 0; i < domain_filter->len; i++) { + if (g_ascii_strcasecmp(domain_filter->pdata[i], domain) == 0) { + return TRUE; + } + } + + return FALSE; +} + + +static gboolean log_drop_message(const char *domain, enum ws_log_level level) +{ + return !ws_log_level_is_active(level) || !ws_log_domain_is_active(domain); +} + + enum ws_log_level ws_log_get_level(void) { return current_log_level; @@ -146,14 +145,11 @@ enum ws_log_level ws_log_set_level_str(const char *str_level) } -static const char *set_level_and_prune_argv(int count, char **ptr, int prune_extra, +static const char *log_prune_argv(int count, char **ptr, int prune_extra, const char *optarg, int *ret_argc) { - if (optarg && ws_log_set_level_str(optarg) != LOG_LEVEL_NONE) - optarg = NULL; /* success */ - /* - * We found a "--log-level" option. We will remove it from + * We found a log option. We will remove it from * the argv by moving up the other strings in the array. This is * so that it doesn't generate an unrecognized option * error further along in the initialization process. @@ -165,21 +161,20 @@ static const char *set_level_and_prune_argv(int count, char **ptr, int prune_ext return optarg; } -const char *ws_log_set_level_args(int *argc_ptr, char *argv[]) +const char *log_parse_args(int *argc_ptr, char *argv[], const char *optstr) { char **p; int c; - const char *opt = "--log-level"; - size_t len = strlen(opt); + size_t optlen = strlen(optstr); const char *optarg; for (p = argv, c = *argc_ptr; *p != NULL; p++, c--) { - if (strncmp(*p, opt, len) == 0) { - optarg = *p + len; + if (strncmp(*p, optstr, optlen) == 0) { + optarg = *p + optlen; /* Two possibilities: - * --log_level + * --