aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
Diffstat (limited to 'epan')
-rw-r--r--epan/addr_resolv.c95
-rw-r--r--epan/addr_resolv.h30
-rw-r--r--epan/geoip_db.c29
-rw-r--r--epan/geoip_db.h2
-rw-r--r--epan/oids.c148
-rw-r--r--epan/oids.h2
-rw-r--r--epan/prefs.c268
-rw-r--r--epan/prefs.h7
8 files changed, 281 insertions, 300 deletions
diff --git a/epan/addr_resolv.c b/epan/addr_resolv.c
index efd671e3b7..e51e4caeff 100644
--- a/epan/addr_resolv.c
+++ b/epan/addr_resolv.c
@@ -286,7 +286,8 @@ static void add_serv_port_cb(const guint32 port);
/*
* Flag controlling what names to resolve.
*/
-guint32 gbl_resolv_flags;
+e_addr_resolve gbl_resolv_flags = {TRUE, FALSE, TRUE, TRUE};
+static guint name_resolve_concurrency = 500;
/*
* Global variables (can be changed in GUI sections)
@@ -362,7 +363,7 @@ typedef struct _async_dns_queue_msg
#endif /* HAVE_C_ARES */
#ifdef ASYNC_DNS
static gboolean async_dns_initialized = FALSE;
-static int async_dns_in_flight = 0;
+static guint async_dns_in_flight = 0;
static GList *async_dns_queue_head = NULL;
/* push a dns request */
@@ -656,7 +657,7 @@ static gchar
tp->port = port;
tp->next = NULL;
- if (!(gbl_resolv_flags & RESOLV_TRANSPORT) ||
+ if ((!gbl_resolv_flags.transport_name) ||
(servp = getservbyport(g_htons(port), serv_proto)) == NULL) {
/* unknown port */
guint32_to_str_buf(port, tp->name, MAXNAMELEN);
@@ -799,8 +800,8 @@ host_lookup(const guint addr, const gboolean resolve, gboolean *found)
if (resolve) {
tp->resolve = TRUE;
#ifdef ASYNC_DNS
- if ((gbl_resolv_flags & RESOLV_CONCURRENT) &&
- prefs.name_resolve_concurrency > 0 &&
+ if (gbl_resolv_flags.concurrent_dns &&
+ name_resolve_concurrency > 0 &&
async_dns_initialized) {
add_async_dns_ipv4(AF_INET, addr);
/* XXX found is set to TRUE, which seems a bit odd, but I'm not
@@ -817,7 +818,7 @@ host_lookup(const guint addr, const gboolean resolve, gboolean *found)
* botch, we don't try to translate an all-zero IP address to a host
* name.
*/
- if (addr != 0 && (gbl_resolv_flags & RESOLV_NETWORK)) {
+ if (addr != 0 && gbl_resolv_flags.network_name) {
/* Use async DNS if possible, else fall back to timeouts,
* else call gethostbyaddr and hope for the best
*/
@@ -908,8 +909,8 @@ host_lookup6(const struct e_in6_addr *addr, const gboolean resolve, gboolean *fo
#ifdef INET6
#ifdef HAVE_C_ARES
- if ((gbl_resolv_flags & RESOLV_CONCURRENT) &&
- prefs.name_resolve_concurrency > 0 &&
+ if ((gbl_resolv_flags.concurrent_dns) &&
+ name_resolve_concurrency > 0 &&
async_dns_initialized) {
caqm = g_malloc(sizeof(async_dns_queue_msg_t));
caqm->family = AF_INET6;
@@ -2377,6 +2378,42 @@ subnet_name_lookup_init(void)
* External Functions
*/
+void
+addr_resolve_pref_init(module_t *nameres)
+{
+ prefs_register_bool_preference(nameres, "mac_name",
+ "Enable MAC name resolution",
+ "e.g. Ethernet address to manufacturer name",
+ &gbl_resolv_flags.mac_name);
+
+ prefs_register_bool_preference(nameres, "network_name",
+ "Enable network name resolution",
+ "e.g. IP address to DNS name (hostname)",
+ &gbl_resolv_flags.network_name);
+
+ prefs_register_bool_preference(nameres, "transport_name",
+ "Enable transport name resolution",
+ "e.g. TCP/UDP port to service name",
+ &gbl_resolv_flags.transport_name);
+
+#if defined(HAVE_C_ARES) || defined(HAVE_GNU_ADNS)
+ prefs_register_bool_preference(nameres, "concurrent_dns",
+ "Enable concurrent DNS name resolution",
+ "be sure to enable network name resolution",
+ &gbl_resolv_flags.concurrent_dns);
+
+ prefs_register_uint_preference(nameres, "name_resolve_concurrency",
+ "Maximum concurrent requests",
+ "maximum parallel running DNS requests",
+ 10,
+ &name_resolve_concurrency);
+#else
+ prefs_register_static_text_preference(nameres, "no_concurrent_dns",
+ "Enable concurrent DNS name resolution: N/A",
+ "Support for this feature was not compiled into this version of Wireshark");
+#endif
+}
+
void
host_name_lookup_init(void) {
char *hostspath;
@@ -2492,7 +2529,7 @@ host_name_lookup_process(gpointer data _U_) {
async_dns_queue_head = g_list_first(async_dns_queue_head);
- while (async_dns_queue_head != NULL && async_dns_in_flight <= prefs.name_resolve_concurrency) {
+ while (async_dns_queue_head != NULL && async_dns_in_flight <= name_resolve_concurrency) {
caqm = (async_dns_queue_msg_t *) async_dns_queue_head->data;
async_dns_queue_head = g_list_remove(async_dns_queue_head, (void *) caqm);
if (caqm->family == AF_INET) {
@@ -2636,7 +2673,7 @@ const gchar *
get_hostname(const guint addr)
{
gboolean found;
- gboolean resolve = gbl_resolv_flags & RESOLV_NETWORK;
+ gboolean resolve = gbl_resolv_flags.network_name;
hashipv4_t *tp = host_lookup(addr, resolve, &found);
if (!resolve)
@@ -2651,7 +2688,7 @@ const gchar *
get_hostname6(const struct e_in6_addr *addr)
{
gboolean found;
- gboolean resolve = gbl_resolv_flags & RESOLV_NETWORK;
+ gboolean resolve = gbl_resolv_flags.network_name;
hashipv6_t *tp = host_lookup6(addr, resolve, &found);
if (!resolve)
@@ -2794,7 +2831,7 @@ gchar *
get_udp_port(guint port)
{
- if (!(gbl_resolv_flags & RESOLV_TRANSPORT)) {
+ if (!gbl_resolv_flags.transport_name) {
return ep_utoa(port);
}
@@ -2806,7 +2843,7 @@ gchar *
get_dccp_port(guint port)
{
- if (!(gbl_resolv_flags & RESOLV_TRANSPORT)) {
+ if (!gbl_resolv_flags.transport_name) {
return ep_utoa(port);
}
@@ -2819,7 +2856,7 @@ gchar *
get_tcp_port(guint port)
{
- if (!(gbl_resolv_flags & RESOLV_TRANSPORT)) {
+ if (!gbl_resolv_flags.transport_name) {
return ep_utoa(port);
}
@@ -2831,7 +2868,7 @@ gchar *
get_sctp_port(guint port)
{
- if (!(gbl_resolv_flags & RESOLV_TRANSPORT)) {
+ if (!gbl_resolv_flags.transport_name) {
return ep_utoa(port);
}
@@ -2894,7 +2931,7 @@ gchar *
get_ether_name(const guint8 *addr)
{
hashether_t *tp;
- gboolean resolve = (gbl_resolv_flags & RESOLV_MAC) != 0;
+ gboolean resolve = gbl_resolv_flags.mac_name;
if (resolve && !eth_resolution_initialized) {
initialize_ethers();
@@ -2917,7 +2954,7 @@ get_ether_name_if_known(const guint8 *addr)
/* Initialize ether structs if we're the first
* ether-related function called */
- if (!(gbl_resolv_flags & RESOLV_MAC))
+ if (!gbl_resolv_flags.mac_name)
return NULL;
if (!eth_resolution_initialized) {
@@ -2962,7 +2999,7 @@ add_ether_byip(const guint ip, const guint8 *eth)
gboolean found;
/* first check that IP address can be resolved */
- if (!(gbl_resolv_flags & RESOLV_NETWORK))
+ if (!gbl_resolv_flags.network_name)
return;
if ((host = host_name_lookup(ip, &found)) == NULL)
@@ -2979,7 +3016,7 @@ const gchar *
get_ipxnet_name(const guint32 addr)
{
- if (!(gbl_resolv_flags & RESOLV_NETWORK)) {
+ if (!gbl_resolv_flags.network_name) {
return ipxnet_to_str_punct(addr, '\0');
}
@@ -3018,12 +3055,12 @@ get_manuf_name(const guint8 *addr)
gchar *cur;
hashmanuf_t *mtp;
- if ((gbl_resolv_flags & RESOLV_MAC) && !eth_resolution_initialized) {
+ if (gbl_resolv_flags.mac_name && !eth_resolution_initialized) {
initialize_ethers();
eth_resolution_initialized = TRUE;
}
- if (!(gbl_resolv_flags & RESOLV_MAC) || ((mtp = manuf_name_lookup(addr)) == NULL)) {
+ if (!gbl_resolv_flags.mac_name || ((mtp = manuf_name_lookup(addr)) == NULL)) {
cur=ep_strdup_printf("%02x:%02x:%02x", addr[0], addr[1], addr[2]);
return cur;
}
@@ -3094,12 +3131,12 @@ get_eui64_name(const guint64 addr_eui64)
/* Copy and convert the address to network byte order. */
*(guint64 *)(void *)(addr) = pntoh64(&(addr_eui64));
- if ((gbl_resolv_flags & RESOLV_MAC) && !eth_resolution_initialized) {
+ if (gbl_resolv_flags.mac_name && !eth_resolution_initialized) {
initialize_ethers();
eth_resolution_initialized = TRUE;
}
- if (!(gbl_resolv_flags & RESOLV_MAC) || ((mtp = manuf_name_lookup(addr)) == NULL)) {
+ if (!gbl_resolv_flags.mac_name || ((mtp = manuf_name_lookup(addr)) == NULL)) {
cur=ep_strdup_printf("%02x:%02x:%02x%02x:%02x:%02x%02x:%02x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7]);
return cur;
}
@@ -3177,14 +3214,14 @@ get_host_ipaddr(const char *host, guint32 *addrp)
* less-than-4 octet notation.
*/
if (!inet_aton(host, &ipaddr)) {
- if (! (gbl_resolv_flags & RESOLV_NETWORK)) {
+ if (!gbl_resolv_flags.network_name) {
return FALSE;
}
/* It's not a valid dotted-quad IP address; is it a valid
* host name? */
#ifdef HAVE_C_ARES
- if (! (gbl_resolv_flags & RESOLV_CONCURRENT) ||
- prefs.name_resolve_concurrency < 1 ||
+ if (! (gbl_resolv_flags.concurrent_dns) ||
+ name_resolve_concurrency < 1 ||
! async_dns_initialized) {
return FALSE;
}
@@ -3253,14 +3290,14 @@ get_host_ipaddr6(const char *host, struct e_in6_addr *addrp)
if (inet_pton(AF_INET6, host, addrp) == 1)
return TRUE;
- if (! (gbl_resolv_flags & RESOLV_NETWORK)) {
+ if (!gbl_resolv_flags.network_name) {
return FALSE;
}
/* try FQDN */
#ifdef HAVE_C_ARES
- if (! (gbl_resolv_flags & RESOLV_CONCURRENT) ||
- prefs.name_resolve_concurrency < 1 ||
+ if (! (gbl_resolv_flags.concurrent_dns) ||
+ name_resolve_concurrency < 1 ||
! async_dns_initialized) {
return FALSE;
}
diff --git a/epan/addr_resolv.h b/epan/addr_resolv.h
index f751efdb12..7b0f13769a 100644
--- a/epan/addr_resolv.h
+++ b/epan/addr_resolv.h
@@ -45,22 +45,17 @@ extern "C" {
#define MAXNAMELEN 64 /* max name length (hostname and port name) */
#endif
+typedef struct _e_addr_resolve {
+ gboolean mac_name;
+ gboolean network_name;
+ gboolean transport_name;
+ gboolean concurrent_dns;
+} e_addr_resolve;
+
/*
* Flag controlling what names to resolve.
*/
-WS_VAR_IMPORT guint32 gbl_resolv_flags;
-
-/* 32 types are sufficient (as are 640k of RAM) */
-/* FIXME: Maybe MANUF/m, IP/i, IP6/6, IPX/x, UDP+TCP/t etc would be
- more useful/consistent */
-#define RESOLV_NONE 0x0
-#define RESOLV_MAC 0x1
-#define RESOLV_NETWORK 0x2
-#define RESOLV_TRANSPORT 0x4
-#define RESOLV_CONCURRENT 0x8
-
-#define RESOLV_ALL_ADDRS (RESOLV_MAC|RESOLV_NETWORK|RESOLV_TRANSPORT)
-#define RESOLV_ALL 0xFFFFFFFF
+WS_VAR_IMPORT e_addr_resolve gbl_resolv_flags;
/* global variables */
@@ -69,10 +64,7 @@ extern gchar *g_ipxnets_path;
extern gchar *g_pethers_path;
extern gchar *g_pipxnets_path;
-/* Functions in resolv.c */
-
-/* Set the flags controlling what names to resolve */
-extern void resolv_set_flags(guint32 flags);
+/* Functions in addr_resolv.c */
/*
* get_udp_port() returns the port name corresponding to that UDP port,
@@ -122,6 +114,10 @@ void get_addr_name_buf(const address *addr, gchar *buf, gsize size);
* Asynchronous host name lookup initialization, processing, and cleanup
*/
+/* Setup name resolution preferences */
+typedef struct pref_module module_t;
+extern void addr_resolve_pref_init(module_t *nameres);
+
/* host_name_lookup_init fires up an ADNS socket if we're using ADNS */
extern void host_name_lookup_init(void);
diff --git a/epan/geoip_db.c b/epan/geoip_db.c
index f99e23ef5e..98bca94dec 100644
--- a/epan/geoip_db.c
+++ b/epan/geoip_db.c
@@ -140,16 +140,13 @@ static void geoip_db_path_free_cb(void* p) {
/**
* Initialize GeoIP lookups
*/
-void
-geoip_db_init(void) {
- guint i;
+void
+geoip_db_pref_init(module_t *nameres)
+{
static uat_field_t geoip_db_paths_fields[] = {
UAT_FLD_DIRECTORYNAME(geoip_mod, path, "GeoIP Database Directory", "The GeoIP database directory path"),
UAT_END_FIELDS
};
- char* geoip_load_error = NULL;
-
- geoip_dat_arr = g_array_new(FALSE, FALSE, sizeof(GeoIP *));
geoip_db_paths_uat = uat_new("GeoIP Database Paths",
sizeof(geoip_db_path_t),
@@ -165,12 +162,22 @@ geoip_db_init(void) {
NULL,
geoip_db_paths_fields);
- uat_load(geoip_db_paths_uat, &geoip_load_error);
+ prefs_register_uat_preference(nameres,
+ "geoip_db_paths",
+ "GeoIP database directories",
+ "Search paths for GeoIP address mapping databases.\n"
+ "Wireshark will look in each directory for files beginning\n"
+ "with \"Geo\" and ending with \".dat\".\n"
+ "You must restart Wireshark for these changes to take\n"
+ "effect.",
+ geoip_db_paths_uat);
+}
+
+void
+geoip_db_init(void) {
+ guint i;
- if (geoip_load_error) {
- report_failure("Error loading GeoIP database path table: %s", geoip_load_error);
- return;
- }
+ geoip_dat_arr = g_array_new(FALSE, FALSE, sizeof(GeoIP *));
for (i = 0; i < num_geoip_db_paths; i++) {
if (geoip_db_paths[i].path) {
diff --git a/epan/geoip_db.h b/epan/geoip_db.h
index ac6ae388c9..85ddd11bbb 100644
--- a/epan/geoip_db.h
+++ b/epan/geoip_db.h
@@ -28,6 +28,7 @@
#define __GEOIP_DB_H__
#include <epan/ipv6-utils.h>
+#include <epan/prefs.h>
/* Fake databases to make lat/lon values available */
/* XXX - find a better way to interface */
@@ -39,6 +40,7 @@
* Init function called from epan.h
*/
extern void geoip_db_init(void);
+extern void geoip_db_pref_init(module_t *nameres);
/**
* Number of databases we have loaded
diff --git a/epan/oids.c b/epan/oids.c
index b6825fcb24..561b1e4732 100644
--- a/epan/oids.c
+++ b/epan/oids.c
@@ -46,6 +46,8 @@
#include <smi.h>
static gboolean oids_init_done = FALSE;
+static gboolean load_smi_modules = FALSE;
+static gboolean suppress_smi_errors = FALSE;
#endif
#define D(level,args) do if (debuglevel >= level) { printf args; printf("\n"); fflush(stdout); } while(0)
@@ -514,61 +516,9 @@ static void register_mibs(void) {
int proto_mibs = -1;
GArray* hfa = g_array_new(FALSE,TRUE,sizeof(hf_register_info));
GArray* etta = g_array_new(FALSE,TRUE,sizeof(gint*));
- static uat_field_t smi_fields[] = {
- UAT_FLD_CSTRING(smi_mod,name,"Module name","The module's name"),
- UAT_END_FIELDS
- };
- static uat_field_t smi_paths_fields[] = {
- UAT_FLD_DIRECTORYNAME(smi_mod,name,"Directory path","The directory name"),
- UAT_END_FIELDS
- };
- char* smi_load_error = NULL;
gchar* path_str;
- smi_modules_uat = uat_new("SMI Modules",
- sizeof(smi_module_t),
- "smi_modules",
- FALSE,
- (void*)&smi_modules,
- &num_smi_modules,
- UAT_CAT_GENERAL,
- "ChSNMPSMIModules",
- smi_mod_copy_cb,
- NULL,
- smi_mod_free_cb,
- restart_needed_warning,
- smi_fields);
-
- smi_paths_uat = uat_new("SMI Paths",
- sizeof(smi_module_t),
- "smi_paths",
- FALSE,
- (void*)&smi_paths,
- &num_smi_paths,
- UAT_CAT_GENERAL,
- "ChSNMPSMIPaths",
- smi_mod_copy_cb,
- NULL,
- smi_mod_free_cb,
- restart_needed_warning,
- smi_paths_fields);
-
-
- uat_load(smi_modules_uat, &smi_load_error);
-
- if (smi_load_error) {
- report_failure("Error Loading SMI Modules Table: %s",smi_load_error);
- return;
- }
-
- uat_load(smi_paths_uat, &smi_load_error);
-
- if (smi_load_error) {
- report_failure("Error Loading SMI Paths Table: %s",smi_load_error);
- return;
- }
-
- if (!prefs.load_smi_modules) {
+ if (!load_smi_modules) {
D(1,("OID resolution not enabled"));
return;
}
@@ -607,7 +557,7 @@ static void register_mibs(void) {
}
if (smi_errors->len) {
- if (!prefs.suppress_smi_errors) {
+ if (!suppress_smi_errors) {
report_failure("The following errors were found while loading the MIBS:\n%s\n\n"
"The Current Path is: %s\n\nYou can avoid this error message "
"by removing the missing MIB modules at Edit -> Preferences"
@@ -631,7 +581,7 @@ static void register_mibs(void) {
* Currently there is no such version. :-(
*/
if (smiModule->conformance == 1) {
- if (!prefs.suppress_smi_errors) {
+ if (!suppress_smi_errors) {
report_failure("Stopped processing module %s due to "
"error(s) to prevent potential crash in libsmi.\n"
"Module's conformance level: %d.\n"
@@ -768,21 +718,103 @@ static void register_mibs(void) {
}
#endif
+void oid_pref_init(module_t *nameres)
+{
+ static uat_field_t smi_fields[] = {
+ UAT_FLD_CSTRING(smi_mod,name,"Module name","The module's name"),
+ UAT_END_FIELDS
+ };
+ static uat_field_t smi_paths_fields[] = {
+ UAT_FLD_DIRECTORYNAME(smi_mod,name,"Directory path","The directory name"),
+ UAT_END_FIELDS
+ };
+
+#ifdef HAVE_LIBSMI
+ prefs_register_bool_preference(nameres, "load_smi_modules",
+ "Enable OID resolution",
+ "You must restart Wireshark for this change to take effect",
+ &load_smi_modules);
+
+ prefs_register_bool_preference(nameres, "suppress_smi_errors",
+ "Suppress SMI errors",
+ "Some errors can be ignored. If unsure, set to false.",
+ &suppress_smi_errors);
+
+ smi_paths_uat = uat_new("SMI Paths",
+ sizeof(smi_module_t),
+ "smi_paths",
+ FALSE,
+ (void*)&smi_paths,
+ &num_smi_paths,
+ UAT_CAT_GENERAL,
+ "ChSNMPSMIPaths",
+ smi_mod_copy_cb,
+ NULL,
+ smi_mod_free_cb,
+ restart_needed_warning,
+ smi_paths_fields);
+
+ prefs_register_uat_preference(nameres,
+ "smi_paths",
+ "SMI (MIB and PIB) paths",
+ "Search paths for SMI (MIB and PIB) modules. You must\n"
+ "restart Wireshark for these changes to take effect.",
+ smi_paths_uat);
+
+ smi_modules_uat = uat_new("SMI Modules",
+ sizeof(smi_module_t),
+ "smi_modules",
+ FALSE,
+ (void*)&smi_modules,
+ &num_smi_modules,
+ UAT_CAT_GENERAL,
+ "ChSNMPSMIModules",
+ smi_mod_copy_cb,
+ NULL,
+ smi_mod_free_cb,
+ restart_needed_warning,
+ smi_fields);
+
+ prefs_register_uat_preference(nameres,
+ "smi_modules",
+ "SMI (MIB and PIB) modules",
+ "List of enabled SMI (MIB and PIB) modules. You must\n"
+ "restart Wireshark for these changes to take effect.",
+ smi_modules_uat);
+
+#else
+ prefs_register_static_text_preference(nameres, "load_smi_modules_static",
+ "Enable OID resolution: N/A",
+ "Support for this feature was not compiled into this version of Wireshark");
+
+ prefs_register_static_text_preference(nameres, "suppress_smi_errors_static",
+ "Suppress SMI errors: N/A",
+ "Support for this feature was not compiled into this version of Wireshark");
+
+ prefs_register_static_text_preference(nameres, "smi_module_path",
+ "SMI (MIB and PIB) modules and paths: N/A",
+ "Support for this feature was not compiled into this version of Wireshark");
+#endif
+}
void oids_init(void) {
+ if (load_smi_modules) {
#ifdef HAVE_LIBSMI
register_mibs();
#else
D(1,("libsmi disabled oid resolution not enabled"));
#endif
+ }
}
void oids_cleanup(void) {
+ if (load_smi_modules) {
#ifdef HAVE_LIBSMI
- unregister_mibs();
+ unregister_mibs();
#else
- D(1,("libsmi disabled oid resolution not enabled"));
+ D(1,("libsmi disabled oid resolution not enabled"));
#endif
+ }
}
const char* oid_subid2string(guint32* subids, guint len) {
@@ -1123,7 +1155,7 @@ oid_get_default_mib_path(void) {
path_str = g_string_new("");
- if (!prefs.load_smi_modules) {
+ if (!load_smi_modules) {
D(1,("OID resolution not enabled"));
return path_str->str;
}
diff --git a/epan/oids.h b/epan/oids.h
index d8c353f50d..3fd03ff293 100644
--- a/epan/oids.h
+++ b/epan/oids.h
@@ -28,6 +28,7 @@
#define __OIDS_H__
#include <epan/ftypes/ftypes.h>
+#include <epan/prefs.h>
/**
*@file
*/
@@ -106,6 +107,7 @@ typedef struct _oid_info_t {
/** init funcion called from epan.h */
extern void oids_init(void);
+extern void oid_pref_init(module_t *nameres);
/** init funcion called from epan.h */
extern void oids_cleanup(void);
diff --git a/epan/prefs.c b/epan/prefs.c
index 35707035d3..1c348ea75d 100644
--- a/epan/prefs.c
+++ b/epan/prefs.c
@@ -42,6 +42,7 @@
#include <epan/address.h>
#include <epan/addr_resolv.h>
#include <epan/oids.h>
+#include <epan/geoip_db.h>
#include <epan/packet.h>
#include <epan/prefs.h>
#include <epan/proto.h>
@@ -315,7 +316,8 @@ prefs_register_module_or_subtree(module_t *parent, const char *name,
/*
* Register that a protocol has preferences.
*/
-module_t *protocols_module;
+module_t *protocols_module = NULL;
+module_t *stats_module = NULL;
module_t *
prefs_register_protocol(int id, void (*apply_cb)(void))
@@ -339,7 +341,6 @@ prefs_register_protocol(int id, void (*apply_cb)(void))
proto_get_protocol_name(id), apply_cb);
}
-
module_t *
prefs_register_protocol_subtree(const char *subtree, int id, void (*apply_cb)(void))
{
@@ -931,6 +932,23 @@ prefs_pref_foreach(module_t *module, pref_cb callback, gpointer user_data)
return 0;
}
+static const enum_val_t print_format_vals[] = {
+ { "text", "Plain Text", PR_FMT_TEXT },
+ { "postscript", "Postscript", PR_FMT_PS },
+ { NULL, NULL, 0 }
+};
+
+static const enum_val_t print_dest_vals[] = {
+#ifdef _WIN32
+ /* "PR_DEST_CMD" means "to printer" on Windows */
+ { "command", "Printer", PR_DEST_CMD },
+#else
+ { "command", "Command", PR_DEST_CMD },
+#endif
+ { "file", "File", PR_DEST_FILE },
+ { NULL, NULL, 0 }
+};
+
static void stats_callback(void)
{
/* Test for a sane tap update interval */
@@ -952,30 +970,61 @@ static void stats_callback(void)
void
prefs_register_modules(void)
{
- module_t* stats;
+ module_t *printing, *nameres_module;
if (protocols_module != NULL) {
/* Already setup preferences */
return;
}
- stats = prefs_register_module(NULL, "statistics", "Statistics",
+ /* Name Resolution */
+ nameres_module = prefs_register_module(NULL, "nameres", "Name Resolution",
+ "Name Resolution", NULL);
+ addr_resolve_pref_init(nameres_module);
+ oid_pref_init(nameres_module);
+ geoip_db_pref_init(nameres_module);
+
+ /* Printing */
+ printing = prefs_register_module(NULL, "print", "Printing",
+ "Printing", NULL);
+
+ prefs_register_enum_preference(printing, "format",
+ "Format", "Can be one of \"text\" or \"postscript\"",
+ &prefs.pr_format, print_format_vals, TRUE);
+
+ prefs_register_enum_preference(printing, "destination",
+ "Print to", "Can be one of \"command\" or \"file\"",
+ &prefs.pr_dest, print_dest_vals, TRUE);
+
+#ifndef _WIN32
+ prefs_register_string_preference(printing, "command", "Command",
+ "Output gets piped to this command when the destination is set to \"command\"", &prefs.pr_cmd);
+#endif
+
+ prefs_register_filename_preference(printing, "file", "File",
+ "This is the file that gets written to when the destination is set to \"file\"", &prefs.pr_file);
+
+
+ /* Statistics */
+ stats_module = prefs_register_module(NULL, "statistics", "Statistics",
"Statistics", &stats_callback);
- prefs_register_uint_preference(stats, "update_interval",
+ prefs_register_uint_preference(stats_module, "update_interval",
"Tap update interval in ms",
"Determines time between tap updates",
10,
&prefs.tap_update_interval);
#ifdef HAVE_LIBPORTAUDIO
- prefs_register_uint_preference(stats, "rtp_player_max_visible",
+ prefs_register_uint_preference(stats_module, "rtp_player_max_visible",
"Max visible channels in RTP Player",
"Determines maximum height of RTP Player window",
10,
&prefs.rtp_player_max_visible);
#endif
+
+ /* Protocols */
protocols_module = prefs_register_module(NULL, "protocols", "Protocols",
"Protocols", NULL);
@@ -1456,12 +1505,6 @@ init_prefs(void)
prefs.capture_auto_scroll = TRUE;
prefs.capture_show_info = FALSE;
-/* set the default values for the name resolution dialog box */
- prefs.name_resolve = RESOLV_ALL ^ RESOLV_NETWORK;
- prefs.name_resolve_concurrency = 500;
- prefs.load_smi_modules = FALSE;
- prefs.suppress_smi_errors = FALSE;
-
/* set the default values for the tap/statistics dialog box */
prefs.tap_update_interval = TAP_UPDATE_DEFAULT_INTERVAL;
prefs.rtp_player_max_visible = RTP_PLAYER_DEFAULT_VISIBLE;
@@ -1616,9 +1659,7 @@ read_prefs(int *gpf_errno_return, int *gpf_read_errno_return,
FILE *pf;
/* clean up libsmi structures before reading prefs */
- if (prefs.load_smi_modules) {
- oids_cleanup();
- }
+ oids_cleanup();
init_prefs();
@@ -1719,10 +1760,8 @@ read_prefs(int *gpf_errno_return, int *gpf_read_errno_return,
}
/* load SMI modules if needed */
- if (prefs.load_smi_modules) {
- oids_init();
- }
-
+ oids_init();
+
return &prefs;
}
@@ -2081,10 +2120,6 @@ prefs_capture_device_monitor_mode(const char *name)
return FALSE;
}
-#define PRS_PRINT_FMT "print.format"
-#define PRS_PRINT_DEST "print.destination"
-#define PRS_PRINT_FILE "print.file"
-#define PRS_PRINT_CMD "print.command"
#define PRS_COL_HIDDEN "column.hidden"
#define PRS_COL_FMT "column.format"
#define PRS_STREAM_CL_FG "stream.client.fg"
@@ -2139,7 +2174,7 @@ prefs_capture_device_monitor_mode(const char *name)
#define PRS_GUI_LAYOUT_CONTENT_1 "gui.layout_content_1"
#define PRS_GUI_LAYOUT_CONTENT_2 "gui.layout_content_2"
#define PRS_GUI_LAYOUT_CONTENT_3 "gui.layout_content_3"
-#define PRS_CONSOLE_LOG_LEVEL "console.log.level"
+#define PRS_CONSOLE_LOG_LEVEL "console.log.level"
#define PRS_GUI_FILTER_LABEL "gui.filter_expressions.label"
#define PRS_GUI_FILTER_EXPR "gui.filter_expressions.expr"
#define PRS_GUI_FILTER_ENABLED "gui.filter_expressions.enabled"
@@ -2179,67 +2214,37 @@ prefs_capture_device_monitor_mode(const char *name)
static const gchar *pr_formats[] = { "text", "postscript" };
static const gchar *pr_dests[] = { "command", "file" };
-typedef struct {
- char letter;
- guint32 value;
-} name_resolve_opt_t;
-
-static name_resolve_opt_t name_resolve_opt[] = {
- { 'm', RESOLV_MAC },
- { 'n', RESOLV_NETWORK },
- { 't', RESOLV_TRANSPORT },
- { 'C', RESOLV_CONCURRENT },
-};
-
-#define N_NAME_RESOLVE_OPT (sizeof name_resolve_opt / sizeof name_resolve_opt[0])
-
-static const char *
-name_resolve_to_string(guint32 name_resolve)
-{
- static char string[N_NAME_RESOLVE_OPT+1];
- char *p;
- unsigned int i;
- gboolean all_opts_set = TRUE;
-
- if (name_resolve == RESOLV_NONE)
- return "FALSE";
- p = &string[0];
- for (i = 0; i < N_NAME_RESOLVE_OPT; i++) {
- if (name_resolve & name_resolve_opt[i].value)
- *p++ = name_resolve_opt[i].letter;
- else
- all_opts_set = FALSE;
- }
- *p = '\0';
- if (all_opts_set)
- return "TRUE";
- return string;
-}
-
char
-string_to_name_resolve(char *string, guint32 *name_resolve)
+string_to_name_resolve(char *string, e_addr_resolve *name_resolve)
{
char c;
- unsigned int i;
- *name_resolve = 0;
+ memset(name_resolve, 0, sizeof(e_addr_resolve));
while ((c = *string++) != '\0') {
- for (i = 0; i < N_NAME_RESOLVE_OPT; i++) {
- if (c == name_resolve_opt[i].letter) {
- *name_resolve |= name_resolve_opt[i].value;
- break;
+ switch (c) {
+ case 'm':
+ name_resolve->mac_name = TRUE;
+ break;
+ case 'n':
+ name_resolve->network_name = TRUE;
+ break;
+ case 't':
+ name_resolve->transport_name = TRUE;
+ break;
+ case 'C':
+ name_resolve->concurrent_dns = TRUE;
+ break;
+ default:
+ /*
+ * Unrecognized letter.
+ */
+ return c;
}
- }
- if (i == N_NAME_RESOLVE_OPT) {
- /*
- * Unrecognized letter.
- */
- return c;
- }
}
return '\0';
}
+
static void
try_convert_to_custom_column(gpointer *el_data)
{
@@ -2303,29 +2308,7 @@ set_pref(gchar *pref_name, gchar *value, void *private_data _U_,
pref_t *pref;
gboolean had_a_dot;
- if (strcmp(pref_name, PRS_PRINT_FMT) == 0) {
- if (strcmp(value, pr_formats[PR_FMT_TEXT]) == 0) {
- prefs.pr_format = PR_FMT_TEXT;
- } else if (strcmp(value, pr_formats[PR_FMT_PS]) == 0) {
- prefs.pr_format = PR_FMT_PS;
- } else {
- return PREFS_SET_SYNTAX_ERR;
- }
- } else if (strcmp(pref_name, PRS_PRINT_DEST) == 0) {
- if (strcmp(value, pr_dests[PR_DEST_CMD]) == 0) {
- prefs.pr_dest = PR_DEST_CMD;
- } else if (strcmp(value, pr_dests[PR_DEST_FILE]) == 0) {
- prefs.pr_dest = PR_DEST_FILE;
- } else {
- return PREFS_SET_SYNTAX_ERR;
- }
- } else if (strcmp(pref_name, PRS_PRINT_FILE) == 0) {
- g_free(prefs.pr_file);
- prefs.pr_file = g_strdup(value);
- } else if (strcmp(pref_name, PRS_PRINT_CMD) == 0) {
- g_free(prefs.pr_cmd);
- prefs.pr_cmd = g_strdup(value);
- } else if (strcmp(pref_name, PRS_COL_HIDDEN) == 0) {
+ if (strcmp(pref_name, PRS_COL_HIDDEN) == 0) {
g_free(cols_hidden_list);
cols_hidden_list = g_strdup(value);
/*
@@ -2681,30 +2664,6 @@ set_pref(gchar *pref_name, gchar *value, void *private_data _U_,
} else if (strcmp(pref_name, PRS_CAP_SYNTAX_CHECK_FILTER) == 0) {
/* Obsolete preference. */
;
-/* handle the global options */
- } else if (strcmp(pref_name, PRS_NAME_RESOLVE) == 0 ||
- strcmp(pref_name, PRS_CAP_NAME_RESOLVE) == 0) {
- /*
- * "TRUE" and "FALSE", for backwards compatibility, are synonyms for
- * RESOLV_ALL and RESOLV_NONE.
- *
- * Otherwise, we treat it as a list of name types we want to resolve.
- */
- if (g_ascii_strcasecmp(value, "true") == 0)
- prefs.name_resolve = RESOLV_ALL;
- else if (g_ascii_strcasecmp(value, "false") == 0)
- prefs.name_resolve = RESOLV_NONE;
- else {
- prefs.name_resolve = RESOLV_NONE; /* start out with none set */
- if (string_to_name_resolve(value, &prefs.name_resolve) != '\0')
- return PREFS_SET_SYNTAX_ERR;
- }
- } else if (strcmp(pref_name, PRS_NAME_RESOLVE_CONCURRENCY) == 0) {
- prefs.name_resolve_concurrency = strtol(value, NULL, 10);
- } else if (strcmp(pref_name, PRS_NAME_RESOLVE_LOAD_SMI_MODULES) == 0) {
- prefs.load_smi_modules = ((g_ascii_strcasecmp(value, "true") == 0)?TRUE:FALSE);
- } else if (strcmp(pref_name, PRS_NAME_RESOLVE_SUPPRESS_SMI_ERRORS) == 0) {
- prefs.suppress_smi_errors = ((g_ascii_strcasecmp(value, "true") == 0)?TRUE:FALSE);
} else {
/* To which module does this preference belong? */
module = NULL;
@@ -3739,63 +3698,13 @@ write_prefs(char **pf_path_return)
fprintf(pf, PRS_CAP_SHOW_INFO ": %s\n",
prefs.capture_show_info == TRUE ? "TRUE" : "FALSE");
- fprintf (pf, "\n######## Printing ########\n");
-
- fprintf (pf, "\n# Can be one of \"text\" or \"postscript\".\n");
- if (prefs.pr_format == default_prefs.pr_format)
- fprintf(pf, "#");
- fprintf (pf, "print.format: %s\n", pr_formats[prefs.pr_format]);
-
- fprintf (pf, "\n# Can be one of \"command\" or \"file\".\n");
- if (prefs.pr_dest == default_prefs.pr_dest)
- fprintf(pf, "#");
- fprintf (pf, "print.destination: %s\n", pr_dests[prefs.pr_dest]);
-
- fprintf (pf, "\n# This is the file that gets written to when the "
- "destination is set to \"file\"\n");
- if (strcmp(prefs.pr_file, default_prefs.pr_file) == 0)
- fprintf(pf, "#");
- fprintf (pf, "%s: %s\n", PRS_PRINT_FILE, prefs.pr_file);
-
- fprintf (pf, "\n# Output gets piped to this command when the destination "
- "is set to \"command\"\n");
- if (strcmp(prefs.pr_cmd, default_prefs.pr_cmd) == 0)
- fprintf(pf, "#");
- fprintf (pf, "%s: %s\n", PRS_PRINT_CMD, prefs.pr_cmd);
-
- fprintf(pf, "\n####### Name Resolution ########\n");
-
- fprintf(pf, "\n# Resolve addresses to names?\n");
- fprintf(pf, "# TRUE or FALSE (case-insensitive), or a list of address types to resolve.\n");
- if (prefs.name_resolve == default_prefs.name_resolve)
- fprintf(pf, "#");
- fprintf(pf, PRS_NAME_RESOLVE ": %s\n",
- name_resolve_to_string(prefs.name_resolve));
-
- fprintf(pf, "\n# Name resolution concurrency.\n");
- fprintf(pf, "# A decimal number.\n");
- if (prefs.name_resolve_concurrency == default_prefs.name_resolve_concurrency)
- fprintf(pf, "#");
- fprintf(pf, PRS_NAME_RESOLVE_CONCURRENCY ": %d\n",
- prefs.name_resolve_concurrency);
-
- fprintf(pf, "\n# Load SMI modules?\n");
- fprintf(pf, "# TRUE or FALSE (case-insensitive).\n");
- if (prefs.load_smi_modules == default_prefs.load_smi_modules)
- fprintf(pf, "#");
- fprintf(pf, PRS_NAME_RESOLVE_LOAD_SMI_MODULES ": %s\n",
- prefs.load_smi_modules == TRUE ? "TRUE" : "FALSE");
-
- fprintf(pf, "\n# Suppress SMI errors?\n");
- fprintf(pf, "# TRUE or FALSE (case-insensitive).\n");
- if (prefs.suppress_smi_errors == default_prefs.suppress_smi_errors)
- fprintf(pf, "#");
- fprintf(pf, PRS_NAME_RESOLVE_SUPPRESS_SMI_ERRORS ": %s\n",
- prefs.suppress_smi_errors == TRUE ? "TRUE" : "FALSE");
-
/*
* XXX - The following members are intentionally not written here because
* they are handled within the 'generic' preference handling:
+ * pr_format
+ * pr_dest
+ * pr_file
+ * pr_cmd
* tap_update_interval
* rtp_player_max_visible
*/
@@ -3842,8 +3751,6 @@ copy_prefs(e_prefs *dest, e_prefs *src)
fmt_data *src_cfmt, *dest_cfmt;
GList *entry;
- dest->pr_format = src->pr_format;
- dest->pr_dest = src->pr_dest;
dest->pr_file = g_strdup(src->pr_file);
dest->pr_cmd = g_strdup(src->pr_cmd);
dest->col_list = NULL;
@@ -3917,11 +3824,12 @@ copy_prefs(e_prefs *dest, e_prefs *src)
dest->capture_real_time = src->capture_real_time;
dest->capture_auto_scroll = src->capture_auto_scroll;
dest->capture_show_info = src->capture_show_info;
- dest->name_resolve = src->name_resolve;
- dest->name_resolve_concurrency = src->name_resolve_concurrency;
+
/*
* XXX - The following members are intentionally not copied because they
* are handled within the 'generic' preference handling:
+ * pr_format
+ * pr_dest
* tap_update_interval
* rtp_player_max_visible
* display_hidden_proto_items
diff --git a/epan/prefs.h b/epan/prefs.h
index 50cac30822..066f136a73 100644
--- a/epan/prefs.h
+++ b/epan/prefs.h
@@ -35,6 +35,7 @@ extern "C" {
#include <epan/params.h>
#include <epan/range.h>
+#include <epan/addr_resolv.h>
#define PR_DEST_CMD 0
#define PR_DEST_FILE 1
@@ -54,7 +55,7 @@ extern "C" {
* Set "*name_resolve" to the bitmask, and return '\0', on success;
* return the bad character in the string on error.
*/
-char string_to_name_resolve(char *string, guint32 *name_resolve);
+char string_to_name_resolve(char *string, e_addr_resolve *name_resolve);
/*
* Modes for the starting directory in File Open dialogs.
@@ -153,10 +154,6 @@ typedef struct _e_prefs {
layout_pane_content_e gui_layout_content_2;
layout_pane_content_e gui_layout_content_3;
gint console_log_level;
- guint32 name_resolve;
- gint name_resolve_concurrency;
- gboolean load_smi_modules;
- gboolean suppress_smi_errors;
gchar *capture_device;
gchar *capture_devices_linktypes;
gchar *capture_devices_descr;