Support for "-N" flag enabling selected forms of name resolution, from

Joerg Meyer.

Support for saving to the preferences file the settings for all types of
name resolution.

Do a case-insensitive check for "true" and "false" in Boolean preference
settings.

svn path=/trunk/; revision=3489
This commit is contained in:
Guy Harris 2001-05-31 08:36:46 +00:00
parent 6200054304
commit 6ee04dad33
11 changed files with 331 additions and 106 deletions

View File

@ -75,6 +75,7 @@ Joerg Mayer <jmayer@loplof.de> {
Banyan Vines support
NTP fixes
DHCP support for Intel PXEclient DHCP requests
Support for "-N" flag enabling selected forms of name resolution
}
Martin Maciaszek <fastjack@i-s-o.net> {

View File

@ -15,6 +15,7 @@ S<[ B<-k> ]>
S<[ B<-l> ]>
S<[ B<-m> font ]>
S<[ B<-n> ]>
S<[ B<-N> resolving flags ] ...>
S<[ B<-o> preference setting ] ...>
S<[ B<-p> ]>
S<[ B<-P> packet list height ]>
@ -127,6 +128,14 @@ protocol tree pane from the name of the main text font.
Disables network object name resolution (such as hostname, TCP and UDP port
names).
=item -N
Turns on name resolving for particular types of addresses and port
numbers; the argument is a string that may contain the letters B<m> to
enable MAC address resolution, B<n> to enable network address
resolution, and B<t> to enable transport-layer port number resolution.
This overrides B<-n> if both B<-N> and B<-n> are present.
=item -o
Sets a preference value, overriding the default value and any value read
@ -714,8 +723,9 @@ the I<Update list of packets in real time> check box, can specify
whether in such a capture the packet list pane should scroll to show the
most recently captured packets with the I<Automatic scrolling in live
capture> check box, and can specify whether addresses should be
translated to names in the display with the I<Enable name resolution>
check box.
translated to names in the display with the I<Enable MAC name resolution>,
I<Enable network name resolution> and I<Enable transport name resolution>
check boxes.
=item Display Options
@ -726,8 +736,9 @@ date, "Seconds since beginning of capture" for relative time stamps, or
"Seconds since previous frame" for delta time stamps. You can also
specify whether, when the display is updated as packets are captured,
the list should automatically scroll to show the most recently captured
packets or not and whether addresses should be translated to names in
the display.
packets or not and whether addresses or port numbers should be
translated to names in the display on a MAC, network and transport layer
basis.
=item Plugins

View File

@ -14,6 +14,7 @@ S<[ B<-h> ]>
S<[ B<-i> interface ]>
S<[ B<-l> ]>
S<[ B<-n> ]>
S<[ B<-N> resolving flags ] ...>
S<[ B<-o> preference setting ] ...>
S<[ B<-p> ]>
S<[ B<-r> infile ]>
@ -163,6 +164,14 @@ standard output buffer containing that data fills up.
Disables network object name resolution (such as hostname, TCP and UDP port
names).
=item -N
Turns on name resolving for particular types of addresses and port
numbers; the argument is a string that may contain the letters B<m> to
enable MAC address resolution, B<n> to enable network address
resolution, and B<t> to enable transport-layer port number resolution.
This overrides B<-n> if both B<-N> and B<-n> are present.
=item -o
Sets a preference value, overriding the default value and any value read

View File

@ -1,7 +1,7 @@
/* resolv.c
* Routines for network object lookup
*
* $Id: resolv.c,v 1.9 2001/04/15 03:37:15 guy Exp $
* $Id: resolv.c,v 1.10 2001/05/31 08:36:44 guy Exp $
*
* Laurent Deniel <deniel@worldnet.fr>
*
@ -220,7 +220,7 @@ static guchar *serv_name_lookup(guint port, port_type proto)
tp->addr = port;
tp->next = NULL;
if (!prefs.name_resolve ||
if (!(prefs.name_resolve & PREFS_RESOLV_TRANSPORT) ||
(servp = getservbyport(htons(port), serv_proto)) == NULL) {
/* unknown port */
sprintf(tp->name, "%d", port);
@ -279,7 +279,7 @@ static guchar *host_name_lookup(guint addr, gboolean *found)
tp->addr = addr;
tp->next = NULL;
if (prefs.name_resolve) {
if (prefs.name_resolve & PREFS_RESOLV_NETWORK) {
#ifdef AVOID_DNS_TIMEOUT
/* Quick hack to avoid DNS/YP timeout */
@ -319,7 +319,7 @@ static guchar *host_name_lookup6(struct e_in6_addr *addr, gboolean *found)
#ifdef INET6
struct hostent *hostp;
if (prefs.name_resolve) {
if (prefs.name_resolve & PREFS_RESOLV_NETWORK) {
#ifdef AVOID_DNS_TIMEOUT
/* Quick hack to avoid DNS/YP timeout */
@ -1036,7 +1036,7 @@ extern guchar *get_hostname(guint addr)
{
gboolean found;
if (!prefs.name_resolve)
if (!(prefs.name_resolve & PREFS_RESOLV_NETWORK))
return ip_to_str((guint8 *)&addr);
return host_name_lookup(addr, &found);
@ -1047,7 +1047,7 @@ extern const guchar *get_hostname6(struct e_in6_addr *addr)
gboolean found;
#ifdef INET6
if (!prefs.name_resolve)
if (!(prefs.name_resolve & PREFS_RESOLV_NETWORK))
return ip6_to_str(addr);
if (IN6_IS_ADDR_LINKLOCAL(addr) || IN6_IS_ADDR_MULTICAST(addr))
return ip6_to_str(addr);
@ -1100,7 +1100,7 @@ extern guchar *get_udp_port(guint port)
static gchar str[3][MAXNAMELEN];
static gchar *cur;
if (!prefs.name_resolve) {
if (!(prefs.name_resolve & PREFS_RESOLV_TRANSPORT)) {
if (cur == &str[0][0]) {
cur = &str[1][0];
} else if (cur == &str[1][0]) {
@ -1121,7 +1121,7 @@ extern guchar *get_tcp_port(guint port)
static gchar str[3][MAXNAMELEN];
static gchar *cur;
if (!prefs.name_resolve) {
if (!(prefs.name_resolve & PREFS_RESOLV_TRANSPORT)) {
if (cur == &str[0][0]) {
cur = &str[1][0];
} else if (cur == &str[1][0]) {
@ -1142,7 +1142,7 @@ extern guchar *get_sctp_port(guint port)
static gchar str[3][MAXNAMELEN];
static gchar *cur;
if (!prefs.name_resolve) {
if (!(prefs.name_resolve & PREFS_RESOLV_TRANSPORT)) {
if (cur == &str[0][0]) {
cur = &str[1][0];
} else if (cur == &str[1][0]) {
@ -1160,7 +1160,7 @@ extern guchar *get_sctp_port(guint port)
extern guchar *get_ether_name(const guint8 *addr)
{
if (!prefs.name_resolve)
if (!(prefs.name_resolve & PREFS_RESOLV_MAC))
return ether_to_str((guint8 *)addr);
if (!eth_resolution_initialized) {
@ -1184,7 +1184,7 @@ guchar *get_ether_name_if_known(const guint8 *addr)
/* Initialize ether structs if we're the first
* ether-related function called */
if (!prefs.name_resolve)
if (!(prefs.name_resolve & PREFS_RESOLV_MAC))
return NULL;
if (!eth_resolution_initialized) {
@ -1268,7 +1268,7 @@ extern void add_ether_byip(guint ip, const guint8 *eth)
extern const guchar *get_ipxnet_name(const guint32 addr)
{
if (!prefs.name_resolve) {
if (!(prefs.name_resolve & PREFS_RESOLV_NETWORK)) {
return ipxnet_to_str_punct(addr, '\0');
}
@ -1306,12 +1306,12 @@ extern const guchar *get_manuf_name(const guint8 *addr)
static gchar *cur;
hashmanuf_t *manufp;
if (prefs.name_resolve && !eth_resolution_initialized) {
if ((prefs.name_resolve & PREFS_RESOLV_MAC) && !eth_resolution_initialized) {
initialize_ethers();
eth_resolution_initialized = 1;
}
if (!prefs.name_resolve || ((manufp = manuf_name_lookup(addr)) == NULL)) {
if (!(prefs.name_resolve & PREFS_RESOLV_MAC) || ((manufp = manuf_name_lookup(addr)) == NULL)) {
if (cur == &str[0][0]) {
cur = &str[1][0];
} else if (cur == &str[1][0]) {

View File

@ -1,7 +1,7 @@
/* capture_dlg.c
* Routines for packet capture windows
*
* $Id: capture_dlg.c,v 1.42 2001/05/31 05:33:15 guy Exp $
* $Id: capture_dlg.c,v 1.43 2001/05/31 08:36:45 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -72,7 +72,9 @@
#define E_CAP_PROMISC_KEY "cap_promisc"
#define E_CAP_SYNC_KEY "cap_sync"
#define E_CAP_AUTO_SCROLL_KEY "cap_auto_scroll"
#define E_CAP_RESOLVE_KEY "cap_resolve"
#define E_CAP_M_RESOLVE_KEY "cap_m_resolve"
#define E_CAP_N_RESOLVE_KEY "cap_n_resolve"
#define E_CAP_T_RESOLVE_KEY "cap_t_resolve"
#define E_FS_CALLER_PTR_KEY "fs_caller_ptr"
#define E_FILE_SEL_DIALOG_PTR_KEY "file_sel_dialog_ptr"
@ -121,7 +123,8 @@ capture_prep_cb(GtkWidget *w, gpointer d)
*file_bt, *file_te,
*caplen_hb, *table,
*bbox, *ok_bt, *cancel_bt, *snap_lb,
*snap_sb, *promisc_cb, *sync_cb, *auto_scroll_cb, *resolv_cb;
*snap_sb, *promisc_cb, *sync_cb, *auto_scroll_cb,
*m_resolv_cb, *n_resolv_cb, *t_resolv_cb;
GtkAccelGroup *accel_group;
GtkAdjustment *adj;
GList *if_list, *count_list = NULL;
@ -276,11 +279,26 @@ capture_prep_cb(GtkWidget *w, gpointer d)
gtk_container_add(GTK_CONTAINER(main_vb), auto_scroll_cb);
gtk_widget_show(auto_scroll_cb);
resolv_cb = dlg_check_button_new_with_label_with_mnemonic(
"Enable _name resolution", accel_group);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(resolv_cb), prefs.name_resolve);
gtk_container_add(GTK_CONTAINER(main_vb), resolv_cb);
gtk_widget_show(resolv_cb);
m_resolv_cb = dlg_check_button_new_with_label_with_mnemonic(
"Enable _MAC name resolution", accel_group);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(m_resolv_cb),
prefs.name_resolve & PREFS_RESOLV_MAC);
gtk_container_add(GTK_CONTAINER(main_vb), m_resolv_cb);
gtk_widget_show(m_resolv_cb);
n_resolv_cb = dlg_check_button_new_with_label_with_mnemonic(
"Enable _network name resolution", accel_group);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(n_resolv_cb),
prefs.name_resolve & PREFS_RESOLV_NETWORK);
gtk_container_add(GTK_CONTAINER(main_vb), n_resolv_cb);
gtk_widget_show(n_resolv_cb);
t_resolv_cb = dlg_check_button_new_with_label_with_mnemonic(
"Enable _transport name resolution", accel_group);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(t_resolv_cb),
prefs.name_resolve & PREFS_RESOLV_TRANSPORT);
gtk_container_add(GTK_CONTAINER(main_vb), t_resolv_cb);
gtk_widget_show(t_resolv_cb);
/* Button row: OK and cancel buttons */
bbox = gtk_hbutton_box_new();
@ -313,7 +331,9 @@ capture_prep_cb(GtkWidget *w, gpointer d)
gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_PROMISC_KEY, promisc_cb);
gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_SYNC_KEY, sync_cb);
gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_AUTO_SCROLL_KEY, auto_scroll_cb);
gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_RESOLVE_KEY, resolv_cb);
gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_M_RESOLVE_KEY, m_resolv_cb);
gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_N_RESOLVE_KEY, n_resolv_cb);
gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_T_RESOLVE_KEY, t_resolv_cb);
/* Catch the "activate" signal on the frame number and file name text
entries, so that if the user types Return there, we act as if the
@ -435,7 +455,7 @@ cap_prep_fs_destroy_cb(GtkWidget *win, gpointer data)
static void
capture_prep_ok_cb(GtkWidget *ok_bt, gpointer parent_w) {
GtkWidget *if_cb, *filter_te, *file_te, *count_cb, *snap_sb, *promisc_cb,
*sync_cb, *auto_scroll_cb, *resolv_cb;
*sync_cb, *auto_scroll_cb, *m_resolv_cb, *n_resolv_cb, *t_resolv_cb;
gchar *if_text;
gchar *if_name;
gchar *filter_text;
@ -449,7 +469,9 @@ capture_prep_ok_cb(GtkWidget *ok_bt, gpointer parent_w) {
promisc_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_PROMISC_KEY);
sync_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_SYNC_KEY);
auto_scroll_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_AUTO_SCROLL_KEY);
resolv_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_RESOLVE_KEY);
m_resolv_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_M_RESOLVE_KEY);
n_resolv_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_N_RESOLVE_KEY);
t_resolv_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w), E_CAP_T_RESOLVE_KEY);
if_text =
g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(if_cb)->entry)));
@ -502,7 +524,10 @@ capture_prep_ok_cb(GtkWidget *ok_bt, gpointer parent_w) {
prefs.capture_auto_scroll = GTK_TOGGLE_BUTTON (auto_scroll_cb)->active;
prefs.name_resolve = GTK_TOGGLE_BUTTON (resolv_cb)->active;
prefs.name_resolve = PREFS_RESOLV_NONE;
prefs.name_resolve |= (GTK_TOGGLE_BUTTON (m_resolv_cb)->active ? PREFS_RESOLV_MAC : PREFS_RESOLV_NONE);
prefs.name_resolve |= (GTK_TOGGLE_BUTTON (n_resolv_cb)->active ? PREFS_RESOLV_NETWORK : PREFS_RESOLV_NONE);
prefs.name_resolve |= (GTK_TOGGLE_BUTTON (t_resolv_cb)->active ? PREFS_RESOLV_TRANSPORT : PREFS_RESOLV_NONE);
gtk_widget_destroy(GTK_WIDGET(parent_w));

View File

@ -1,7 +1,7 @@
/* display_opts.c
* Routines for packet display windows
*
* $Id: display_opts.c,v 1.20 2001/04/15 03:37:16 guy Exp $
* $Id: display_opts.c,v 1.21 2001/05/31 08:36:45 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -71,7 +71,9 @@ extern GtkWidget *packet_list;
#define E_DISPLAY_TIME_REL_KEY "display_time_rel"
#define E_DISPLAY_TIME_DELTA_KEY "display_time_delta"
#define E_DISPLAY_AUTO_SCROLL_KEY "display_auto_scroll"
#define E_DISPLAY_NAME_RESOLUTION_KEY "display_name_resolution"
#define E_DISPLAY_M_NAME_RESOLUTION_KEY "display_mac_name_resolution"
#define E_DISPLAY_N_NAME_RESOLUTION_KEY "display_network_name_resolution"
#define E_DISPLAY_T_NAME_RESOLUTION_KEY "display_transport_name_resolution"
static void display_opt_ok_cb(GtkWidget *, gpointer);
static void display_opt_apply_cb(GtkWidget *, gpointer);
@ -178,9 +180,28 @@ display_opt_cb(GtkWidget *w, gpointer d) {
gtk_widget_show(button);
button = dlg_check_button_new_with_label_with_mnemonic(
"Enable _name resolution", accel_group);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button), prefs.name_resolve);
gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_NAME_RESOLUTION_KEY,
"Enable _MAC name resolution", accel_group);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button),
prefs.name_resolve & PREFS_RESOLV_MAC);
gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_M_NAME_RESOLUTION_KEY,
button);
gtk_box_pack_start(GTK_BOX(main_vb), button, TRUE, TRUE, 0);
gtk_widget_show(button);
button = dlg_check_button_new_with_label_with_mnemonic(
"Enable _network name resolution", accel_group);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button),
prefs.name_resolve & PREFS_RESOLV_NETWORK);
gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_N_NAME_RESOLUTION_KEY,
button);
gtk_box_pack_start(GTK_BOX(main_vb), button, TRUE, TRUE, 0);
gtk_widget_show(button);
button = dlg_check_button_new_with_label_with_mnemonic(
"Enable _transport name resolution", accel_group);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button),
prefs.name_resolve & PREFS_RESOLV_TRANSPORT);
gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_T_NAME_RESOLUTION_KEY,
button);
gtk_box_pack_start(GTK_BOX(main_vb), button, TRUE, TRUE, 0);
gtk_widget_show(button);
@ -267,9 +288,16 @@ get_display_options(GtkWidget *parent_w)
E_DISPLAY_AUTO_SCROLL_KEY);
prefs.capture_auto_scroll = (GTK_TOGGLE_BUTTON (button)->active);
prefs.name_resolve = PREFS_RESOLV_NONE;
button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
E_DISPLAY_NAME_RESOLUTION_KEY);
prefs.name_resolve = (GTK_TOGGLE_BUTTON (button)->active);
E_DISPLAY_M_NAME_RESOLUTION_KEY);
prefs.name_resolve |= (GTK_TOGGLE_BUTTON (button)->active ? PREFS_RESOLV_MAC : PREFS_RESOLV_NONE);
button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
E_DISPLAY_N_NAME_RESOLUTION_KEY);
prefs.name_resolve |= (GTK_TOGGLE_BUTTON (button)->active ? PREFS_RESOLV_NETWORK : PREFS_RESOLV_NONE);
button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
E_DISPLAY_T_NAME_RESOLUTION_KEY);
prefs.name_resolve |= (GTK_TOGGLE_BUTTON (button)->active ? PREFS_RESOLV_TRANSPORT : PREFS_RESOLV_NONE);
}

View File

@ -1,7 +1,7 @@
/* file_dlg.c
* Dialog boxes for handling files
*
* $Id: file_dlg.c,v 1.38 2001/04/15 03:37:16 guy Exp $
* $Id: file_dlg.c,v 1.39 2001/05/31 08:36:46 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -57,7 +57,9 @@ static void select_file_type_cb(GtkWidget *w, gpointer data);
static void file_save_as_ok_cb(GtkWidget *w, GtkFileSelection *fs);
static void file_save_as_destroy_cb(GtkWidget *win, gpointer user_data);
#define E_FILE_RESOLVE_KEY "file_dlg_resolve_key"
#define E_FILE_M_RESOLVE_KEY "file_dlg_mac_resolve_key"
#define E_FILE_N_RESOLVE_KEY "file_dlg_network_resolve_key"
#define E_FILE_T_RESOLVE_KEY "file_dlg_transport_resolve_key"
/*
* Keep a static pointer to the current "Open Capture File" window, if
@ -71,8 +73,9 @@ static GtkWidget *file_open_w;
void
file_open_cmd_cb(GtkWidget *w, gpointer data)
{
GtkWidget *filter_hbox, *filter_bt, *filter_te,
*resolv_cb;
GtkWidget *main_vb, *filter_hbox, *filter_bt, *filter_te,
*m_resolv_cb, *n_resolv_cb, *t_resolv_cb;
GtkAccelGroup *accel_group;
/* No Apply button, and "OK" just sets our text widget, it doesn't
activate it (i.e., it doesn't cause us to try to open the file). */
static construct_args_t args = {
@ -91,33 +94,27 @@ file_open_cmd_cb(GtkWidget *w, gpointer data)
gtk_signal_connect(GTK_OBJECT(file_open_w), "destroy",
GTK_SIGNAL_FUNC(file_open_destroy_cb), NULL);
/* Accelerator group for the accelerators (or, as they're called in
Windows and, I think, in Motif, "mnemonics"; Alt+<key> is a mnemonic,
Ctrl+<key> is an accelerator). */
accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(file_open_w), accel_group);
/* If we've opened a file, start out by showing the files in the directory
in which that file resided. */
if (last_open_dir)
gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_open_w), last_open_dir);
resolv_cb = dlg_check_button_new_with_label_with_mnemonic(
"Enable name resolution", NULL);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(resolv_cb), prefs.name_resolve);
gtk_box_pack_end(GTK_BOX(GTK_FILE_SELECTION(file_open_w)->main_vbox),
resolv_cb, FALSE, FALSE, 5);
gtk_widget_show(resolv_cb);
gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(file_open_w)->ok_button),
E_FILE_RESOLVE_KEY, resolv_cb);
/* Connect the ok_button to file_open_ok_cb function and pass along a
pointer to the file selection box widget */
gtk_signal_connect(GTK_OBJECT (GTK_FILE_SELECTION (file_open_w)->ok_button),
"clicked", (GtkSignalFunc) file_open_ok_cb, file_open_w);
gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(file_open_w)->ok_button),
E_DFILTER_TE_KEY, gtk_object_get_data(GTK_OBJECT(w), E_DFILTER_TE_KEY));
/* Container for each row of widgets */
main_vb = gtk_vbox_new(FALSE, 3);
gtk_container_border_width(GTK_CONTAINER(main_vb), 5);
gtk_box_pack_start(GTK_BOX(GTK_FILE_SELECTION(file_open_w)->action_area),
main_vb, FALSE, FALSE, 0);
gtk_widget_show(main_vb);
filter_hbox = gtk_hbox_new(FALSE, 1);
gtk_container_border_width(GTK_CONTAINER(filter_hbox), 0);
gtk_box_pack_start(GTK_BOX(GTK_FILE_SELECTION(file_open_w)->action_area),
filter_hbox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(main_vb), filter_hbox, FALSE, FALSE, 0);
gtk_widget_show(filter_hbox);
filter_bt = gtk_button_new_with_label("Filter:");
@ -134,6 +131,41 @@ file_open_cmd_cb(GtkWidget *w, gpointer data)
gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(file_open_w)->ok_button),
E_RFILTER_TE_KEY, filter_te);
m_resolv_cb = dlg_check_button_new_with_label_with_mnemonic(
"Enable _MAC name resolution", accel_group);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(m_resolv_cb),
prefs.name_resolve & PREFS_RESOLV_MAC);
gtk_box_pack_start(GTK_BOX(main_vb), m_resolv_cb, FALSE, FALSE, 0);
gtk_widget_show(m_resolv_cb);
gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(file_open_w)->ok_button),
E_FILE_M_RESOLVE_KEY, m_resolv_cb);
n_resolv_cb = dlg_check_button_new_with_label_with_mnemonic(
"Enable _network name resolution", accel_group);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(n_resolv_cb),
prefs.name_resolve & PREFS_RESOLV_NETWORK);
gtk_box_pack_start(GTK_BOX(main_vb), n_resolv_cb, FALSE, FALSE, 0);
gtk_widget_show(n_resolv_cb);
gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(file_open_w)->ok_button),
E_FILE_N_RESOLVE_KEY, n_resolv_cb);
t_resolv_cb = dlg_check_button_new_with_label_with_mnemonic(
"Enable _transport name resolution", accel_group);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(t_resolv_cb),
prefs.name_resolve & PREFS_RESOLV_TRANSPORT);
gtk_box_pack_start(GTK_BOX(main_vb), t_resolv_cb, FALSE, FALSE, 0);
gtk_widget_show(t_resolv_cb);
gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(file_open_w)->ok_button),
E_FILE_T_RESOLVE_KEY, t_resolv_cb);
/* Connect the ok_button to file_open_ok_cb function and pass along a
pointer to the file selection box widget */
gtk_signal_connect(GTK_OBJECT (GTK_FILE_SELECTION(file_open_w)->ok_button),
"clicked", (GtkSignalFunc) file_open_ok_cb, file_open_w);
gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(file_open_w)->ok_button),
E_DFILTER_TE_KEY, gtk_object_get_data(GTK_OBJECT(w), E_DFILTER_TE_KEY));
/* Connect the cancel_button to destroy the widget */
gtk_signal_connect_object(GTK_OBJECT (GTK_FILE_SELECTION
(file_open_w)->cancel_button), "clicked", (GtkSignalFunc)
@ -150,7 +182,7 @@ file_open_cmd_cb(GtkWidget *w, gpointer data)
static void
file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
gchar *cf_name, *rfilter, *s;
GtkWidget *filter_te, *resolv_cb;
GtkWidget *filter_te, *m_resolv_cb, *n_resolv_cb, *t_resolv_cb;
dfilter_t *rfcode = NULL;
int err;
@ -190,8 +222,13 @@ file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
cfile.rfcode = rfcode;
/* Set the global resolving variable */
resolv_cb = gtk_object_get_data(GTK_OBJECT(w), E_FILE_RESOLVE_KEY);
prefs.name_resolve = GTK_TOGGLE_BUTTON (resolv_cb)->active;
prefs.name_resolve = 0;
m_resolv_cb = gtk_object_get_data(GTK_OBJECT(w), E_FILE_M_RESOLVE_KEY);
prefs.name_resolve |= GTK_TOGGLE_BUTTON (m_resolv_cb)->active ? PREFS_RESOLV_MAC : PREFS_RESOLV_NONE;
n_resolv_cb = gtk_object_get_data(GTK_OBJECT(w), E_FILE_N_RESOLVE_KEY);
prefs.name_resolve |= GTK_TOGGLE_BUTTON (n_resolv_cb)->active ? PREFS_RESOLV_NETWORK : PREFS_RESOLV_NONE;
t_resolv_cb = gtk_object_get_data(GTK_OBJECT(w), E_FILE_T_RESOLVE_KEY);
prefs.name_resolve |= GTK_TOGGLE_BUTTON (t_resolv_cb)->active ? PREFS_RESOLV_TRANSPORT : PREFS_RESOLV_NONE;
/* We've crossed the Rubicon; get rid of the file selection box. */
gtk_widget_hide(GTK_WIDGET (fs));

View File

@ -1,6 +1,6 @@
/* main.c
*
* $Id: main.c,v 1.198 2001/05/01 00:41:46 guy Exp $
* $Id: main.c,v 1.199 2001/05/31 08:36:46 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -539,8 +539,8 @@ void expand_all_cb(GtkWidget *widget, gpointer data) {
void resolve_name_cb(GtkWidget *widget, gpointer data) {
if (cfile.protocol_tree) {
int tmp = prefs.name_resolve;
prefs.name_resolve = 1;
gint tmp = prefs.name_resolve;
prefs.name_resolve = PREFS_RESOLV_ALL;
gtk_clist_clear ( GTK_CLIST(tree_view) );
proto_tree_draw(cfile.protocol_tree, tree_view);
prefs.name_resolve = tmp;
@ -730,17 +730,19 @@ print_usage(void) {
fprintf(stderr, "This is GNU " PACKAGE " " VERSION ", compiled %s\n",
comp_info_str->str);
#ifdef HAVE_LIBPCAP
fprintf(stderr, "%s [ -vh ] [ -klpQS ] [ -B <byte view height> ] [ -c count ]\n",
fprintf(stderr, "%s [ -vh ] [ -klpQS ] [ -B <byte view height> ] [ -c <count> ]\n",
PACKAGE);
fprintf(stderr, "\t[ -f <capture filter> ] [ -i interface ] [ -m <medium font> ] \n");
fprintf(stderr, "\t[ -n ] [ -o <preference setting> ] ... [ -P <packet list height> ]\n");
fprintf(stderr, "\t[ -r infile ] [ -R <read filter> ] [ -s snaplen ] \n");
fprintf(stderr, "\t[ -t <time stamp format> ] [ -T <tree view height> ] [ -w savefile ]\n");
fprintf(stderr, "\t[ -f <capture filter> ] [ -i <interface> ] [ -m <medium font> ] \n");
fprintf(stderr, "\t[ -n ] [ -N <resolving> ]\n");
fprintf(stderr, "\t[ -o <preference setting> ] ... [ -P <packet list height> ]\n");
fprintf(stderr, "\t[ -r <infile> ] [ -R <read filter> ] [ -s <snaplen> ] \n");
fprintf(stderr, "\t[ -t <time stamp format> ] [ -T <tree view height> ] [ -w <savefile> ]\n");
#else
fprintf(stderr, "%s [ -vh ] [ -B <byte view height> ] [ -m <medium font> ] [ -n ]\n",
fprintf(stderr, "%s [ -vh ] [ -B <byte view height> ] [ -m <medium font> ]\n";
fprintf(stderr, "\t[ -n ] [ -N <resolving> ]\n",
PACKAGE);
fprintf(stderr, "\t[ -o <preference setting> ... [ -P <packet list height> ]\n");
fprintf(stderr, "\t[ -r infile ] [ -R <read filter> ] [ -t <time stamp format> ]\n");
fprintf(stderr, "\t[ -r <infile> ] [ -R <read filter> ] [ -t <time stamp format> ]\n");
fprintf(stderr, "\t[ -T <tree view height> ]\n");
#endif
}
@ -823,6 +825,7 @@ main(int argc, char *argv[])
dfilter_t *rfcode = NULL;
gboolean rfilter_parse_failed = FALSE;
e_prefs *prefs;
char badopt;
char *bold_font_name;
ethereal_path = argv[0];
@ -983,7 +986,7 @@ main(int argc, char *argv[])
#endif
/* Now get our args */
while ((opt = getopt(argc, argv, "B:c:f:hi:klm:no:pP:Qr:R:Ss:t:T:w:W:vZ:")) != EOF) {
while ((opt = getopt(argc, argv, "B:c:f:hi:klm:nN:o:pP:Qr:R:Ss:t:T:w:W:vZ:")) != EOF) {
switch (opt) {
case 'B': /* Byte view pane height */
bv_size = get_positive_int(optarg, "byte view pane height");
@ -1032,11 +1035,21 @@ main(int argc, char *argv[])
case 'm': /* Fixed-width font for the display */
if (prefs->gui_font_name != NULL)
g_free(prefs->gui_font_name);
prefs->gui_font_name = g_strdup(optarg);
break;
prefs->gui_font_name = g_strdup(optarg);
break;
case 'n': /* No name resolution */
prefs->name_resolve = 0;
break;
prefs->name_resolve = PREFS_RESOLV_NONE;
break;
case 'N': /* Select what types of addresses/port #s to resolve */
if (prefs->name_resolve == PREFS_RESOLV_ALL)
prefs->name_resolve = PREFS_RESOLV_NONE;
badopt = string_to_name_resolve(optarg, &prefs->name_resolve);
if (badopt != '\0') {
fprintf(stderr, "ethereal: -N specifies unknown resolving option '%c'; valid options are 'm', 'n', and 't'\n",
badopt);
exit(1);
}
break;
case 'o': /* Override preference from command line */
switch (prefs_set_pref(optarg)) {

99
prefs.c
View File

@ -1,7 +1,7 @@
/* prefs.c
* Routines for handling preferences
*
* $Id: prefs.c,v 1.50 2001/04/15 03:37:13 guy Exp $
* $Id: prefs.c,v 1.51 2001/05/31 08:36:41 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -615,8 +615,7 @@ read_prefs(int *gpf_errno_return, char **gpf_path_return,
prefs.capture_prom_mode = 0;
prefs.capture_real_time = 0;
prefs.capture_auto_scroll = 0;
prefs.name_resolve= 1;
prefs.name_resolve = PREFS_RESOLV_ALL;
}
/* Read the global preferences file, if it exists. */
@ -873,6 +872,66 @@ prefs_set_pref(char *prefarg)
static gchar *pr_formats[] = { "text", "postscript" };
static gchar *pr_dests[] = { "command", "file" };
typedef struct {
char letter;
guint32 value;
} name_resolve_opt_t;
static name_resolve_opt_t name_resolve_opt[] = {
{ 'm', PREFS_RESOLV_MAC },
{ 'n', PREFS_RESOLV_NETWORK },
{ 't', PREFS_RESOLV_TRANSPORT },
};
#define N_NAME_RESOLVE_OPT (sizeof name_resolve_opt / sizeof name_resolve_opt[0])
static char *
name_resolve_to_string(guint32 name_resolve)
{
static char string[N_NAME_RESOLVE_OPT+1];
char *p;
int i;
gboolean all_opts_set = TRUE;
if (name_resolve == PREFS_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)
{
char c;
int i;
*name_resolve = 0;
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;
}
}
if (i == N_NAME_RESOLVE_OPT) {
/*
* Unrecognized letter.
*/
return c;
}
}
return '\0';
}
static int
set_pref(gchar *pref_name, gchar *value)
{
@ -953,21 +1012,21 @@ set_pref(gchar *pref_name, gchar *value)
prefs.st_server_bg.green = GREEN_COMPONENT(cval);
prefs.st_server_bg.blue = BLUE_COMPONENT(cval);
} else if (strcmp(pref_name, PRS_GUI_SCROLLBAR_ON_RIGHT) == 0) {
if (strcmp(value, "TRUE") == 0) {
if (strcasecmp(value, "true") == 0) {
prefs.gui_scrollbar_on_right = TRUE;
}
else {
prefs.gui_scrollbar_on_right = FALSE;
}
} else if (strcmp(pref_name, PRS_GUI_PLIST_SEL_BROWSE) == 0) {
if (strcmp(value, "TRUE") == 0) {
if (strcasecmp(value, "true") == 0) {
prefs.gui_plist_sel_browse = TRUE;
}
else {
prefs.gui_plist_sel_browse = FALSE;
}
} else if (strcmp(pref_name, PRS_GUI_PTREE_SEL_BROWSE) == 0) {
if (strcmp(value, "TRUE") == 0) {
if (strcasecmp(value, "true") == 0) {
prefs.gui_ptree_sel_browse = TRUE;
}
else {
@ -1001,18 +1060,32 @@ set_pref(gchar *pref_name, gchar *value)
/* handle the capture options */
} else if (strcmp(pref_name, PRS_CAP_PROM_MODE) == 0) {
prefs.capture_prom_mode = ((strcmp(value, "TRUE") == 0)?TRUE:FALSE);
prefs.capture_prom_mode = ((strcasecmp(value, "true") == 0)?TRUE:FALSE);
} else if (strcmp(pref_name, PRS_CAP_REAL_TIME) == 0) {
prefs.capture_real_time = ((strcmp(value, "TRUE") == 0)?TRUE:FALSE);
prefs.capture_real_time = ((strcasecmp(value, "true") == 0)?TRUE:FALSE);
} else if (strcmp(pref_name, PRS_CAP_AUTO_SCROLL) == 0) {
prefs.capture_auto_scroll = ((strcmp(value, "TRUE") == 0)?TRUE:FALSE);
prefs.capture_auto_scroll = ((strcasecmp(value, "true") == 0)?TRUE:FALSE);
/* handle the global options */
} else if (strcmp(pref_name, PRS_NAME_RESOLVE) == 0 ||
strcmp(pref_name, PRS_CAP_NAME_RESOLVE) == 0) {
prefs.name_resolve = ((strcmp(value, "TRUE") == 0)?TRUE:FALSE);
/*
* "TRUE" and "FALSE", for backwards compatibility, are synonyms for
* PREFS_RESOLV_ALL and PREFS_RESOLV_NONE.
*
* Otherwise, we treat it as a list of name types we want to resolve.
*/
if (strcasecmp(value, "true") == 0)
prefs.name_resolve = PREFS_RESOLV_ALL;
else if (strcasecmp(value, "false") == 0)
prefs.name_resolve = PREFS_RESOLV_NONE;
else {
prefs.name_resolve = PREFS_RESOLV_NONE; /* start out with none set */
if (string_to_name_resolve(value, &prefs.name_resolve) != '\0')
return PREFS_SET_SYNTAX_ERR;
}
} else {
/* To which module does this preference belong? */
dotp = strchr(pref_name, '.');
@ -1337,9 +1410,9 @@ write_prefs(char **pf_path_return)
(prefs.gui_marked_bg.green * 255 / 65535),
(prefs.gui_marked_bg.blue * 255 / 65535));
fprintf(pf, "\n# Resolve addresses to names? TRUE/FALSE\n");
fprintf(pf, "\n# Resolve addresses to names? TRUE/FALSE/{list of address types to resolve}\n");
fprintf(pf, PRS_NAME_RESOLVE ": %s\n",
prefs.name_resolve == TRUE ? "TRUE" : "FALSE");
name_resolve_to_string(prefs.name_resolve));
/* write the capture options */
fprintf(pf, "\n# Capture in promiscuous mode? TRUE/FALSE\n");

23
prefs.h
View File

@ -1,7 +1,7 @@
/* prefs.h
* Definitions for preference handling routines
*
* $Id: prefs.h,v 1.29 2001/04/15 03:37:13 guy Exp $
* $Id: prefs.h,v 1.30 2001/05/31 08:36:41 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -33,6 +33,24 @@
#define PR_DEST_CMD 0
#define PR_DEST_FILE 1
/* 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 PREFS_RESOLV_NONE 0x0
#define PREFS_RESOLV_MAC 0x1
#define PREFS_RESOLV_NETWORK 0x2
#define PREFS_RESOLV_TRANSPORT 0x4
#define PREFS_RESOLV_ALL 0xFFFFFFFF
/*
* Convert a string listing name resolution types to a bitmask of
* those types.
*
* 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);
typedef struct _e_prefs {
gint pr_format;
gint pr_dest;
@ -50,11 +68,10 @@ typedef struct _e_prefs {
gchar *gui_font_name;
color_t gui_marked_fg;
color_t gui_marked_bg;
gboolean name_resolve;
guint32 name_resolve;
gboolean capture_prom_mode;
gboolean capture_real_time;
gboolean capture_auto_scroll;
} e_prefs;
extern e_prefs prefs;

View File

@ -1,6 +1,6 @@
/* tethereal.c
*
* $Id: tethereal.c,v 1.82 2001/04/20 21:50:06 guy Exp $
* $Id: tethereal.c,v 1.83 2001/05/31 08:36:41 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -151,14 +151,14 @@ print_usage(void)
fprintf(stderr, "This is GNU t%s %s, compiled %s\n", PACKAGE, VERSION,
comp_info_str->str);
#ifdef HAVE_LIBPCAP
fprintf(stderr, "t%s [ -DvVhlp ] [ -c count ] [ -f <capture filter> ]\n", PACKAGE);
fprintf(stderr, "\t[ -F <capture file type> ] [ -i interface ] [ -n ]\n");
fprintf(stderr, "\t[ -o <preference setting> ] ... [ -r infile ] [ -R <read filter> ]\n");
fprintf(stderr, "\t[ -s snaplen ] [ -t <time stamp format> ] [ -w savefile ] [ -x ]\n");
fprintf(stderr, "t%s [ -DvVhlp ] [ -c <count> ] [ -f <capture filter> ]\n", PACKAGE);
fprintf(stderr, "\t[ -F <capture file type> ] [ -i <interface> ] [ -n ] [ -N <resolving> ]\n");
fprintf(stderr, "\t[ -o <preference setting> ] ... [ -r <infile> ] [ -R <read filter> ]\n");
fprintf(stderr, "\t[ -s <snaplen> ] [ -t <time stamp format> ] [ -w <savefile> ] [ -x ]\n");
#else
fprintf(stderr, "t%s [ -vVhl ] [ -F <capture file type> ] [ -n ]\n", PACKAGE);
fprintf(stderr, "\t[ -o <preference setting> ] ... [ -r infile ] [ -R <read filter> ]\n");
fprintf(stderr, "\t[ -t <time stamp format> ] [ -w savefile ] [ -x ]\n");
fprintf(stderr, "t%s [ -vVhl ] [ -F <capture file type> ] [ -n ] [ -N <resolving> ]\n", PACKAGE);
fprintf(stderr, "\t[ -o <preference setting> ] ... [ -r <infile> ] [ -R <read filter> ]\n");
fprintf(stderr, "\t[ -t <time stamp format> ] [ -w <savefile> ] [ -x ]\n");
#endif
fprintf(stderr, "Valid file type arguments to the \"-F\" flag:\n");
for (i = 0; i < WTAP_NUM_FILE_TYPES; i++) {
@ -223,10 +223,11 @@ main(int argc, char *argv[])
#else
gboolean capture_option_specified = FALSE;
#endif
int out_file_type = WTAP_FILE_PCAP;
int out_file_type = WTAP_FILE_PCAP;
gchar *cf_name = NULL, *rfilter = NULL;
dfilter_t *rfcode = NULL;
e_prefs *prefs;
char badopt;
/* Register all dissectors; we must do this before checking for the
"-G" flag, as the "-G" flag dumps a list of fields registered
@ -336,7 +337,7 @@ main(int argc, char *argv[])
#endif
/* Now get our args */
while ((opt = getopt(argc, argv, "c:Df:F:hi:lno:pr:R:s:t:vw:Vx")) != EOF) {
while ((opt = getopt(argc, argv, "c:Df:F:hi:lnN:o:pr:R:s:t:vw:Vx")) != EOF) {
switch (opt) {
case 'c': /* Capture xxx packets */
#ifdef HAVE_LIBPCAP
@ -417,8 +418,18 @@ main(int argc, char *argv[])
line_buffered = TRUE;
break;
case 'n': /* No name resolution */
prefs->name_resolve = 0;
break;
prefs->name_resolve = PREFS_RESOLV_NONE;
break;
case 'N': /* Select what types of addresses/port #s to resolve */
if (prefs->name_resolve == PREFS_RESOLV_ALL)
prefs->name_resolve = PREFS_RESOLV_NONE;
badopt = string_to_name_resolve(optarg, &prefs->name_resolve);
if (badopt != '\0') {
fprintf(stderr, "tethereal: -N specifies unknown resolving option '%c'; valid options are 'm', 'n', and 't'\n",
badopt);
exit(1);
}
break;
case 'o': /* Override preference from command line */
switch (prefs_set_pref(optarg)) {