From Michael Lum: add the ability to have a preferences file containing
a list of disabled protocols, and to save that list from the Edit > Protocols dialog box. Add checks for read errors in "read_prefs()". Clean up white space. svn path=/trunk/; revision=8144
This commit is contained in:
parent
b6aa3275fd
commit
ddf6a8acf2
4
AUTHORS
4
AUTHORS
|
@ -1769,6 +1769,10 @@ Oleg Terletsky <oleg.terletsky [AT] comverse.com> {
|
|||
LWRES support
|
||||
}
|
||||
|
||||
Michael Lum <mlum [AT] telostech.com> {
|
||||
Support for saving list of disabled protocols
|
||||
}
|
||||
|
||||
And assorted fixes and enhancements by the people listed above and by:
|
||||
|
||||
Pavel Roskin <proski [AT] gnu.org>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Makefile.am
|
||||
# Automake file for Ethereal
|
||||
#
|
||||
# $Id: Makefile.am,v 1.606 2003/08/05 05:09:35 guy Exp $
|
||||
# $Id: Makefile.am,v 1.607 2003/08/07 00:41:26 guy Exp $
|
||||
#
|
||||
# Ethereal - Network traffic analyzer
|
||||
# By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -713,7 +713,8 @@ ETHEREAL_COMMON_SRC = \
|
|||
crypt-md5.h \
|
||||
crypt-rc4.c \
|
||||
crypt-rc4.h \
|
||||
packet-dcerpc-nt.c \
|
||||
disabled_protos.c \
|
||||
disabled_protos.h \
|
||||
etypes.h \
|
||||
file.h \
|
||||
follow.c \
|
||||
|
@ -730,6 +731,7 @@ ETHEREAL_COMMON_SRC = \
|
|||
llcsaps.h \
|
||||
nlpid.h \
|
||||
oui.h \
|
||||
packet-dcerpc-nt.c \
|
||||
pcap-util.c \
|
||||
pcap-util.h \
|
||||
ppptypes.h \
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
## Makefile for building ethereal.exe with Microsoft C and nmake
|
||||
## Use: $(MAKE) /$(MAKEFLAGS) -f makefile.nmake
|
||||
#
|
||||
# $Id: Makefile.nmake,v 1.321 2003/08/01 09:16:47 sahlberg Exp $
|
||||
# $Id: Makefile.nmake,v 1.322 2003/08/07 00:41:26 guy Exp $
|
||||
|
||||
include config.nmake
|
||||
include <win32.mak>
|
||||
|
@ -403,6 +403,7 @@ ETHEREAL_COMMON_OBJECTS = \
|
|||
crypt-md4.obj \
|
||||
crypt-md5.obj \
|
||||
crypt-rc4.obj \
|
||||
disabled_protos.obj \
|
||||
follow.obj \
|
||||
g711.obj \
|
||||
getopt.obj \
|
||||
|
|
|
@ -0,0 +1,350 @@
|
|||
/* disabled_protos.c
|
||||
* Code for reading and writing the disabled protocols file.
|
||||
*
|
||||
* $Id: disabled_protos.c,v 1.1 2003/08/07 00:41:26 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
* Copyright 1998 Gerald Combs
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <epan/filesystem.h>
|
||||
#include <epan/proto.h>
|
||||
|
||||
#include "disabled_protos.h"
|
||||
|
||||
#define PROTOCOLS_FILE_NAME "disabled_protos"
|
||||
|
||||
/*
|
||||
* List of disabled protocols
|
||||
*/
|
||||
static GList *disabled_protos = NULL;
|
||||
|
||||
#define INIT_BUF_SIZE 128
|
||||
|
||||
/*
|
||||
* Read in a list of disabled protocols.
|
||||
*
|
||||
* On success, "*pref_path_return" is set to NULL.
|
||||
* On error, "*pref_path_return" is set to point to the pathname of
|
||||
* the file we tried to read - it should be freed by our caller -
|
||||
* and "*open_errno_return" is set to the error if an open failed
|
||||
* or "*read_errno_return" is set to the error if a read failed.
|
||||
*/
|
||||
|
||||
void
|
||||
read_disabled_protos_list(char **pref_path_return, int *open_errno_return,
|
||||
int *read_errno_return)
|
||||
{
|
||||
char *ff_path, *ff_name;
|
||||
FILE *ff;
|
||||
GList **flp;
|
||||
GList *fl_ent;
|
||||
protocol_def *prot;
|
||||
int c;
|
||||
char *prot_name;
|
||||
int prot_name_len;
|
||||
int prot_name_index;
|
||||
int line = 1;
|
||||
|
||||
*pref_path_return = NULL; /* assume no error */
|
||||
|
||||
ff_name = PROTOCOLS_FILE_NAME;
|
||||
flp = &disabled_protos;
|
||||
|
||||
/* To do: generalize this */
|
||||
ff_path = get_persconffile_path(ff_name, FALSE);
|
||||
if ((ff = fopen(ff_path, "r")) == NULL) {
|
||||
/*
|
||||
* Did that fail because we the file didn't exist?
|
||||
*/
|
||||
if (errno != ENOENT) {
|
||||
/*
|
||||
* No. Just give up.
|
||||
*/
|
||||
*pref_path_return = ff_path;
|
||||
*open_errno_return = errno;
|
||||
*read_errno_return = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Yes. See if there's a "protocols" file; if so, read it.
|
||||
*/
|
||||
g_free(ff_path);
|
||||
ff_path = get_persconffile_path(PROTOCOLS_FILE_NAME, FALSE);
|
||||
if ((ff = fopen(ff_path, "r")) == NULL) {
|
||||
/*
|
||||
* Well, that didn't work, either. Just give up.
|
||||
* Return an error if the file existed but we couldn't open it.
|
||||
*/
|
||||
if (errno != ENOENT) {
|
||||
*pref_path_return = ff_path;
|
||||
*open_errno_return = errno;
|
||||
*read_errno_return = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we already have a list of protocols, discard it. */
|
||||
if (*flp != NULL) {
|
||||
fl_ent = g_list_first(*flp);
|
||||
while (fl_ent != NULL) {
|
||||
prot = (protocol_def *) fl_ent->data;
|
||||
g_free(prot->name);
|
||||
g_free(prot);
|
||||
fl_ent = fl_ent->next;
|
||||
}
|
||||
g_list_free(*flp);
|
||||
*flp = NULL;
|
||||
}
|
||||
|
||||
/* Allocate the protocol name buffer. */
|
||||
prot_name_len = INIT_BUF_SIZE;
|
||||
prot_name = g_malloc(prot_name_len + 1);
|
||||
|
||||
for (line = 1; ; line++) {
|
||||
/* Lines in a disabled protocol file contain the "filter name" of
|
||||
a protocol to be disabled. */
|
||||
|
||||
/* Skip over leading white space, if any. */
|
||||
while ((c = getc(ff)) != EOF && isspace(c)) {
|
||||
if (c == '\n') {
|
||||
/* Blank line. */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (c == EOF) {
|
||||
if (ferror(ff))
|
||||
goto error; /* I/O error */
|
||||
else
|
||||
break; /* Nothing more to read */
|
||||
}
|
||||
ungetc(c, ff); /* Unread the non-white-space character. */
|
||||
|
||||
/* Get the name of the protocol. */
|
||||
prot_name_index = 0;
|
||||
for (;;) {
|
||||
c = getc(ff);
|
||||
if (c == EOF)
|
||||
break; /* End of file, or I/O error */
|
||||
if (isspace(c))
|
||||
break; /* Trailing white space, or end of line. */
|
||||
if (c == '#')
|
||||
break; /* Start of comment, running to end of line. */
|
||||
/* Add this character to the protocol name string. */
|
||||
if (prot_name_index >= prot_name_len) {
|
||||
/* protocol name buffer isn't long enough; double its length. */
|
||||
prot_name_len *= 2;
|
||||
prot_name = g_realloc(prot_name, prot_name_len + 1);
|
||||
}
|
||||
prot_name[prot_name_index] = c;
|
||||
prot_name_index++;
|
||||
}
|
||||
|
||||
if (isspace(c) && c != '\n') {
|
||||
/* Skip over trailing white space. */
|
||||
while ((c = getc(ff)) != EOF && c != '\n' && isspace(c))
|
||||
;
|
||||
if (c != EOF && c != '\n') {
|
||||
/* Non-white-space after the protocol name; warn about it,
|
||||
in case we come up with a reason to use it. */
|
||||
g_warning("'%s' line %d has extra stuff after the protocol name.",
|
||||
ff_path, line);
|
||||
|
||||
/* Skip to end of line. */
|
||||
while ((c = getc(ff)) != EOF && c != '\n')
|
||||
;
|
||||
}
|
||||
} else if (c == '#') {
|
||||
/* Comment - skip to end of line. */
|
||||
while ((c = getc(ff)) != EOF && c != '\n')
|
||||
;
|
||||
}
|
||||
|
||||
if (c == EOF) {
|
||||
if (ferror(ff))
|
||||
goto error; /* I/O error */
|
||||
else {
|
||||
/* EOF, not error; no newline seen before EOF */
|
||||
g_warning("'%s' line %d doesn't have a newline.", ff_path,
|
||||
line);
|
||||
}
|
||||
break; /* nothing more to read */
|
||||
}
|
||||
|
||||
/* Null-terminate the protocol name. */
|
||||
if (prot_name_index >= prot_name_len) {
|
||||
/* protocol name buffer isn't long enough; double its length. */
|
||||
prot_name_len *= 2;
|
||||
prot_name = g_realloc(prot_name, prot_name_len + 1);
|
||||
}
|
||||
prot_name[prot_name_index] = '\0';
|
||||
|
||||
/* Add the new protocol to the list of disabled protocols */
|
||||
prot = (protocol_def *) g_malloc(sizeof(protocol_def));
|
||||
prot->name = g_strdup(prot_name);
|
||||
*flp = g_list_append(*flp, prot);
|
||||
}
|
||||
g_free(ff_path);
|
||||
fclose(ff);
|
||||
g_free(prot_name);
|
||||
return;
|
||||
|
||||
error:
|
||||
*pref_path_return = ff_path;
|
||||
*open_errno_return = 0;
|
||||
*read_errno_return = errno;
|
||||
fclose(ff);
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable protocols as per the stored configuration
|
||||
*/
|
||||
void
|
||||
set_disabled_protos_list(void)
|
||||
{
|
||||
gint i;
|
||||
GList *fl_ent;
|
||||
protocol_def *prot;
|
||||
|
||||
/*
|
||||
* assume all protocols are enabled by default
|
||||
*/
|
||||
if (disabled_protos == NULL)
|
||||
return; /* nothing to disable */
|
||||
|
||||
fl_ent = g_list_first(disabled_protos);
|
||||
|
||||
while (fl_ent != NULL) {
|
||||
prot = (protocol_def *) fl_ent->data;
|
||||
i = proto_get_id_by_filter_name(prot->name);
|
||||
if (i == -1) {
|
||||
/* XXX - complain here? */
|
||||
} else {
|
||||
if (proto_can_disable_protocol(i))
|
||||
proto_set_decoding(i, FALSE);
|
||||
}
|
||||
|
||||
fl_ent = fl_ent->next;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Write out a list of disabled protocols.
|
||||
*
|
||||
* On success, "*pref_path_return" is set to NULL.
|
||||
* On error, "*pref_path_return" is set to point to the pathname of
|
||||
* the file we tried to read - it should be freed by our caller -
|
||||
* and "*errno_return" is set to the error.
|
||||
*/
|
||||
void
|
||||
save_disabled_protos_list(char **pref_path_return, int *errno_return)
|
||||
{
|
||||
gchar *ff_path, *ff_path_new, *ff_name;
|
||||
FILE *ff;
|
||||
gint i;
|
||||
void *cookie;
|
||||
|
||||
*pref_path_return = NULL; /* assume no error */
|
||||
|
||||
ff_name = PROTOCOLS_FILE_NAME;
|
||||
|
||||
ff_path = get_persconffile_path(ff_name, TRUE);
|
||||
|
||||
/* Write to "XXX.new", and rename if that succeeds.
|
||||
That means we don't trash the file if we fail to write it out
|
||||
completely. */
|
||||
ff_path_new = (gchar *) g_malloc(strlen(ff_path) + 5);
|
||||
sprintf(ff_path_new, "%s.new", ff_path);
|
||||
|
||||
if ((ff = fopen(ff_path_new, "w")) == NULL) {
|
||||
*pref_path_return = ff_path;
|
||||
*errno_return = errno;
|
||||
g_free(ff_path_new);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Iterate over all the protocols */
|
||||
|
||||
for (i = proto_get_first_protocol(&cookie); i != -1;
|
||||
i = proto_get_next_protocol(&cookie)) {
|
||||
|
||||
if (!proto_can_disable_protocol(i)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (proto_is_protocol_enabled(i)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Write out the protocol name. */
|
||||
fprintf(ff, "%s\n", proto_get_protocol_filter_name(i));
|
||||
}
|
||||
|
||||
if (fclose(ff) == EOF) {
|
||||
*pref_path_return = ff_path;
|
||||
*errno_return = errno;
|
||||
unlink(ff_path_new);
|
||||
g_free(ff_path_new);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
/* ANSI C doesn't say whether "rename()" removes the target if it
|
||||
exists; the Win32 call to rename files doesn't do so, which I
|
||||
infer is the reason why the MSVC++ "rename()" doesn't do so.
|
||||
We must therefore remove the target file first, on Windows. */
|
||||
if (remove(ff_path) < 0 && errno != ENOENT) {
|
||||
/* It failed for some reason other than "it's not there"; if
|
||||
it's not there, we don't need to remove it, so we just
|
||||
drive on. */
|
||||
*pref_path_return = ff_path;
|
||||
*errno_return = errno;
|
||||
unlink(ff_path_new);
|
||||
g_free(ff_path_new);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (rename(ff_path_new, ff_path) < 0) {
|
||||
*pref_path_return = ff_path;
|
||||
*errno_return = errno;
|
||||
unlink(ff_path_new);
|
||||
g_free(ff_path_new);
|
||||
return;
|
||||
}
|
||||
g_free(ff_path_new);
|
||||
g_free(ff_path);
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
/* disabled_protos.h
|
||||
* Declarations of routines for reading and writing the disabled protocols file.
|
||||
*
|
||||
* $Id: disabled_protos.h,v 1.1 2003/08/07 00:41:26 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
* Copyright 1998 Gerald Combs
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Item in a list of disabled protocols.
|
||||
*/
|
||||
typedef struct {
|
||||
char *name; /* protocol name */
|
||||
} protocol_def;
|
||||
|
||||
/*
|
||||
* Read in a list of disabled protocols.
|
||||
*
|
||||
* On success, "*pref_path_return" is set to NULL.
|
||||
* On error, "*pref_path_return" is set to point to the pathname of
|
||||
* the file we tried to read - it should be freed by our caller -
|
||||
* and "*open_errno_return" is set to the error if we couldn't open the file
|
||||
* or "*read_errno_return" is set to the error if we got an error reading
|
||||
* the file.
|
||||
*/
|
||||
void read_disabled_protos_list(char **pref_path_return, int *open_errno_return,
|
||||
int *read_errno_return);
|
||||
|
||||
/*
|
||||
* Disable protocols as per the stored configuration
|
||||
*/
|
||||
void set_disabled_protos_list(void);
|
||||
|
||||
/*
|
||||
* Write out a list of disabled protocols.
|
||||
*
|
||||
* On success, "*pref_path_return" is set to NULL.
|
||||
* On error, "*pref_path_return" is set to point to the pathname of
|
||||
* the file we tried to read - it should be freed by our caller -
|
||||
* and "*errno_return" is set to the error.
|
||||
*/
|
||||
void save_disabled_protos_list(char **pref_path_return, int *errno_return);
|
|
@ -1862,7 +1862,8 @@ B<http://www.ethereal.com>.
|
|||
Christoph Wiest <ch.wiest [AT] tesionmail.de>
|
||||
Xuan Zhang <xz [AT] aemail4u.com>
|
||||
Thierry Martin <thierry.martin [AT] accellent-group.com>
|
||||
Oleg Terletsky <oleg.terletsky [AT] comverse.com> {
|
||||
Oleg Terletsky <oleg.terletsky [AT] comverse.com>
|
||||
Michael Lum <mlum [AT] telostech.com>
|
||||
Pavel Roskin <proski [AT] gnu.org>
|
||||
Georgi Guninski <guninski [AT] guninski.com>
|
||||
Jason Copenhaver <jcopenha [AT] typedef.org>
|
||||
|
|
186
gtk/main.c
186
gtk/main.c
|
@ -1,6 +1,6 @@
|
|||
/* main.c
|
||||
*
|
||||
* $Id: main.c,v 1.303 2003/07/25 04:11:51 gram Exp $
|
||||
* $Id: main.c,v 1.304 2003/08/07 00:41:28 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -84,6 +84,7 @@
|
|||
#include "summary.h"
|
||||
#include "file.h"
|
||||
#include "filters.h"
|
||||
#include "disabled_protos.h"
|
||||
#include "prefs.h"
|
||||
#include "menu.h"
|
||||
#include "../menu.h"
|
||||
|
@ -1445,9 +1446,12 @@ main(int argc, char *argv[])
|
|||
WSADATA wsaData;
|
||||
#endif /* WIN32 */
|
||||
|
||||
char *gpf_path, *cf_path, *df_path;
|
||||
char *pf_path;
|
||||
int gpf_open_errno, pf_open_errno, cf_open_errno, df_open_errno;
|
||||
char *gpf_path, *pf_path;
|
||||
char *cf_path, *df_path, *dp_path;
|
||||
int gpf_open_errno, gpf_read_errno;
|
||||
int pf_open_errno, pf_read_errno;
|
||||
int cf_open_errno, df_open_errno;
|
||||
int dp_open_errno, dp_read_errno;
|
||||
int err;
|
||||
#ifdef HAVE_LIBPCAP
|
||||
gboolean start_capture = FALSE;
|
||||
|
@ -1601,7 +1605,8 @@ main(int argc, char *argv[])
|
|||
gtk_init (&argc, &argv);
|
||||
|
||||
/* Read the preference files. */
|
||||
prefs = read_prefs(&gpf_open_errno, &gpf_path, &pf_open_errno, &pf_path);
|
||||
prefs = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
|
||||
&pf_open_errno, &pf_read_errno, &pf_path);
|
||||
|
||||
#ifdef HAVE_LIBPCAP
|
||||
capture_opts.has_snaplen = FALSE;
|
||||
|
@ -1646,6 +1651,9 @@ main(int argc, char *argv[])
|
|||
/* Read the display filter file. */
|
||||
read_filter_list(DFILTER_LIST, &df_path, &df_open_errno);
|
||||
|
||||
/* Read the disabled protocols file. */
|
||||
read_disabled_protos_list(&dp_path, &dp_open_errno, &dp_read_errno);
|
||||
|
||||
init_cap_file(&cfile);
|
||||
|
||||
#ifdef WIN32
|
||||
|
@ -1977,6 +1985,11 @@ main(int argc, char *argv[])
|
|||
line that their preferences have changed. */
|
||||
prefs_apply_all();
|
||||
|
||||
/* disabled protocols as per configuration file */
|
||||
if (dp_path == NULL) {
|
||||
set_disabled_protos_list();
|
||||
}
|
||||
|
||||
#ifndef HAVE_LIBPCAP
|
||||
if (capture_option_specified)
|
||||
fprintf(stderr, "This version of Ethereal was not built with support for capturing packets.\n");
|
||||
|
@ -2215,24 +2228,40 @@ main(int argc, char *argv[])
|
|||
}
|
||||
#endif
|
||||
|
||||
/* If the global preferences file exists but we failed to open it,
|
||||
pop up an alert box; we defer that until now, so that the alert
|
||||
box is more likely to come up on top of the main window. */
|
||||
/* If the global preferences file exists but we failed to open it
|
||||
or had an error reading it, pop up an alert box; we defer that
|
||||
until now, so that the alert box is more likely to come up on top of
|
||||
the main window. */
|
||||
if (gpf_path != NULL) {
|
||||
if (gpf_open_errno != 0) {
|
||||
simple_dialog(ESD_TYPE_WARN, NULL,
|
||||
"Could not open global preferences file\n\"%s\": %s.", gpf_path,
|
||||
strerror(gpf_open_errno));
|
||||
}
|
||||
if (gpf_read_errno != 0) {
|
||||
simple_dialog(ESD_TYPE_WARN, NULL,
|
||||
"I/O error reading global preferences file\n\"%s\": %s.", gpf_path,
|
||||
strerror(gpf_read_errno));
|
||||
}
|
||||
}
|
||||
|
||||
/* If the user's preferences file exists but we failed to open it,
|
||||
pop up an alert box; we defer that until now, so that the alert
|
||||
box is more likely to come up on top of the main window. */
|
||||
/* If the user's preferences file exists but we failed to open it
|
||||
or had an error reading it, pop up an alert box; we defer that
|
||||
until now, so that the alert box is more likely to come up on top of
|
||||
the main window. */
|
||||
if (pf_path != NULL) {
|
||||
if (pf_open_errno != 0) {
|
||||
simple_dialog(ESD_TYPE_WARN, NULL,
|
||||
"Could not open your preferences file\n\"%s\": %s.", pf_path,
|
||||
strerror(pf_open_errno));
|
||||
g_free(pf_path);
|
||||
pf_path = NULL;
|
||||
}
|
||||
if (pf_read_errno != 0) {
|
||||
simple_dialog(ESD_TYPE_WARN, NULL,
|
||||
"I/O error reading your preferences file\n\"%s\": %s.", pf_path,
|
||||
strerror(pf_read_errno));
|
||||
}
|
||||
g_free(pf_path);
|
||||
pf_path = NULL;
|
||||
}
|
||||
|
||||
/* If the user's capture filter file exists but we failed to open it,
|
||||
|
@ -2255,6 +2284,24 @@ main(int argc, char *argv[])
|
|||
g_free(df_path);
|
||||
}
|
||||
|
||||
/* If the user's disabled protocols file exists but we failed to open it,
|
||||
or had an error reading it, pop up an alert box; we defer that until now,
|
||||
so that the alert box is more likely to come up on top of the main
|
||||
window. */
|
||||
if (dp_path != NULL) {
|
||||
if (dp_open_errno != 0) {
|
||||
simple_dialog(ESD_TYPE_WARN, NULL,
|
||||
"Could not open your disabled protocols file\n\"%s\": %s.", dp_path,
|
||||
strerror(dp_open_errno));
|
||||
}
|
||||
if (dp_read_errno != 0) {
|
||||
simple_dialog(ESD_TYPE_WARN, NULL,
|
||||
"I/O error reading your disabled protocols file\n\"%s\": %s.", dp_path,
|
||||
strerror(dp_read_errno));
|
||||
}
|
||||
g_free(dp_path);
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBPCAP
|
||||
if (capture_child) {
|
||||
/* This is the child process for a sync mode or fork mode capture,
|
||||
|
@ -2289,68 +2336,69 @@ main(int argc, char *argv[])
|
|||
|
||||
gtk_main();
|
||||
|
||||
/* Try to save our geometry. GTK+ provides two routines to get a
|
||||
window's position relative to the X root window. If I understand the
|
||||
documentation correctly, gdk_window_get_deskrelative_origin applies
|
||||
mainly to Enlightenment and gdk_window_get_root_origin applies for
|
||||
all other WMs.
|
||||
/* Try to save our geometry. GTK+ provides two routines to get a
|
||||
window's position relative to the X root window. If I understand the
|
||||
documentation correctly, gdk_window_get_deskrelative_origin applies
|
||||
mainly to Enlightenment and gdk_window_get_root_origin applies for
|
||||
all other WMs.
|
||||
|
||||
The code below tries both routines, and picks the one that returns
|
||||
the upper-left-most coordinates.
|
||||
The code below tries both routines, and picks the one that returns
|
||||
the upper-left-most coordinates.
|
||||
|
||||
More info at:
|
||||
More info at:
|
||||
|
||||
http://mail.gnome.org/archives/gtk-devel-list/2001-March/msg00289.html
|
||||
http://www.gtk.org/faq/#AEN600 */
|
||||
http://mail.gnome.org/archives/gtk-devel-list/2001-March/msg00289.html
|
||||
http://www.gtk.org/faq/#AEN600 */
|
||||
|
||||
/* Re-read our saved preferences. */
|
||||
/* XXX - Move all of this into a separate function? */
|
||||
prefs = read_prefs(&gpf_open_errno, &gpf_path, &pf_open_errno, &pf_path);
|
||||
/* Re-read our saved preferences. */
|
||||
/* XXX - Move all of this into a separate function? */
|
||||
prefs = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
|
||||
&pf_open_errno, &pf_read_errno, &pf_path);
|
||||
|
||||
if (pf_path == NULL) {
|
||||
if (prefs->gui_geometry_save_position) {
|
||||
if (top_level->window != NULL) {
|
||||
gdk_window_get_root_origin(top_level->window, &root_x, &root_y);
|
||||
if (gdk_window_get_deskrelative_origin(top_level->window,
|
||||
&desk_x, &desk_y)) {
|
||||
if (desk_x <= root_x && desk_y <= root_y) {
|
||||
root_x = desk_x;
|
||||
root_y = desk_y;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (prefs->gui_geometry_main_x != root_x) {
|
||||
prefs->gui_geometry_main_x = root_x;
|
||||
prefs_write_needed = TRUE;
|
||||
}
|
||||
if (prefs->gui_geometry_main_y != root_y) {
|
||||
prefs->gui_geometry_main_y = root_y;
|
||||
prefs_write_needed = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (prefs->gui_geometry_save_size) {
|
||||
if (top_level->window != NULL) {
|
||||
/* XXX - Is this the "approved" method? */
|
||||
gdk_window_get_size(top_level->window, &top_width, &top_height);
|
||||
}
|
||||
if (prefs->gui_geometry_main_width != top_width) {
|
||||
prefs->gui_geometry_main_width = top_width;
|
||||
prefs_write_needed = TRUE;
|
||||
}
|
||||
if (prefs->gui_geometry_main_height != top_height) {
|
||||
prefs->gui_geometry_main_height = top_height;
|
||||
prefs_write_needed = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (prefs_write_needed) {
|
||||
write_prefs(&pf_path);
|
||||
}
|
||||
} else {
|
||||
/* Ignore errors silently */
|
||||
g_free(pf_path);
|
||||
if (pf_path == NULL) {
|
||||
if (prefs->gui_geometry_save_position) {
|
||||
if (top_level->window != NULL) {
|
||||
gdk_window_get_root_origin(top_level->window, &root_x, &root_y);
|
||||
if (gdk_window_get_deskrelative_origin(top_level->window,
|
||||
&desk_x, &desk_y)) {
|
||||
if (desk_x <= root_x && desk_y <= root_y) {
|
||||
root_x = desk_x;
|
||||
root_y = desk_y;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (prefs->gui_geometry_main_x != root_x) {
|
||||
prefs->gui_geometry_main_x = root_x;
|
||||
prefs_write_needed = TRUE;
|
||||
}
|
||||
if (prefs->gui_geometry_main_y != root_y) {
|
||||
prefs->gui_geometry_main_y = root_y;
|
||||
prefs_write_needed = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (prefs->gui_geometry_save_size) {
|
||||
if (top_level->window != NULL) {
|
||||
/* XXX - Is this the "approved" method? */
|
||||
gdk_window_get_size(top_level->window, &top_width, &top_height);
|
||||
}
|
||||
if (prefs->gui_geometry_main_width != top_width) {
|
||||
prefs->gui_geometry_main_width = top_width;
|
||||
prefs_write_needed = TRUE;
|
||||
}
|
||||
if (prefs->gui_geometry_main_height != top_height) {
|
||||
prefs->gui_geometry_main_height = top_height;
|
||||
prefs_write_needed = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (prefs_write_needed) {
|
||||
write_prefs(&pf_path);
|
||||
}
|
||||
} else {
|
||||
/* Ignore errors silently */
|
||||
g_free(pf_path);
|
||||
}
|
||||
|
||||
epan_cleanup();
|
||||
g_free(rc_file);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* proto_dlg.c
|
||||
*
|
||||
* $Id: proto_dlg.c,v 1.25 2003/01/26 19:35:31 deniel Exp $
|
||||
* $Id: proto_dlg.c,v 1.26 2003/08/07 00:41:28 guy Exp $
|
||||
*
|
||||
* Laurent Deniel <laurent.deniel@free.fr>
|
||||
*
|
||||
|
@ -38,11 +38,15 @@
|
|||
#include "ui_util.h"
|
||||
#include "dlg_utils.h"
|
||||
#include "proto_dlg.h"
|
||||
#include "simple_dialog.h"
|
||||
#include "compat_macros.h"
|
||||
#include "disabled_protos.h"
|
||||
#include <epan/filesystem.h>
|
||||
|
||||
static gboolean proto_delete_cb(GtkWidget *, gpointer);
|
||||
static void proto_ok_cb(GtkWidget *, gpointer);
|
||||
static void proto_apply_cb(GtkWidget *, gpointer);
|
||||
static void proto_save_cb(GtkWidget *, gpointer);
|
||||
static void proto_cancel_cb(GtkWidget *, gpointer);
|
||||
static void proto_destroy_cb(GtkWidget *, gpointer);
|
||||
|
||||
|
@ -243,6 +247,16 @@ proto_cb(GtkWidget *w _U_, gpointer data _U_)
|
|||
gtk_box_pack_start(GTK_BOX (bbox), button, TRUE, TRUE, 0);
|
||||
gtk_widget_show(button);
|
||||
|
||||
#if GTK_MAJOR_VERSION < 2
|
||||
button = gtk_button_new_with_label ("Save");
|
||||
#else
|
||||
button = gtk_button_new_from_stock(GTK_STOCK_SAVE);
|
||||
#endif
|
||||
SIGNAL_CONNECT(button, "clicked", proto_save_cb, proto_w);
|
||||
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
|
||||
gtk_box_pack_start(GTK_BOX (bbox), button, TRUE, TRUE, 0);
|
||||
gtk_widget_show(button);
|
||||
|
||||
#if GTK_MAJOR_VERSION < 2
|
||||
button = gtk_button_new_with_label ("Cancel");
|
||||
#else
|
||||
|
@ -432,6 +446,42 @@ proto_apply_cb(GtkWidget *apply_bt _U_, gpointer parent_w)
|
|||
redissect_packets(&cfile);
|
||||
}
|
||||
|
||||
static void
|
||||
proto_save_cb(GtkWidget *save_bt _U_, gpointer parent_w)
|
||||
{
|
||||
gboolean must_redissect = FALSE;
|
||||
char *pf_dir_path;
|
||||
char *pf_path;
|
||||
int pf_save_errno;
|
||||
|
||||
/* Create the directory that holds personal configuration files, if
|
||||
necessary. */
|
||||
if (create_persconffile_dir(&pf_dir_path) == -1) {
|
||||
simple_dialog(ESD_TYPE_WARN, NULL,
|
||||
"Can't create directory\n\"%s\"\nfor disabled protocols file: %s.", pf_dir_path,
|
||||
strerror(errno));
|
||||
g_free(pf_dir_path);
|
||||
} else {
|
||||
/*
|
||||
* make disabled/enabled protocol settings current
|
||||
*/
|
||||
must_redissect = set_proto_selection(GTK_WIDGET(parent_w));
|
||||
|
||||
save_disabled_protos_list(&pf_path, &pf_save_errno);
|
||||
if (pf_path != NULL) {
|
||||
simple_dialog(ESD_TYPE_WARN, NULL,
|
||||
"Could not save to your disabled protocols file\n\"%s\": %s.",
|
||||
pf_path, strerror(pf_save_errno));
|
||||
g_free(pf_path);
|
||||
}
|
||||
}
|
||||
|
||||
if (must_redissect) {
|
||||
/* Redissect all the packets, and re-evaluate the display filter. */
|
||||
redissect_packets(&cfile);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
proto_cancel_cb(GtkWidget *cancel_bt _U_, gpointer parent_w)
|
||||
{
|
||||
|
|
39
prefs.c
39
prefs.c
|
@ -1,7 +1,7 @@
|
|||
/* prefs.c
|
||||
* Routines for handling preferences
|
||||
*
|
||||
* $Id: prefs.c,v 1.103 2003/08/04 17:32:46 guy Exp $
|
||||
* $Id: prefs.c,v 1.104 2003/08/07 00:41:26 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -847,7 +847,7 @@ print.file: /a/very/long/path/
|
|||
|
||||
#define DEF_NUM_COLS 6
|
||||
|
||||
static void read_prefs_file(const char *pf_path, FILE *pf);
|
||||
static int read_prefs_file(const char *pf_path, FILE *pf);
|
||||
|
||||
/* Read the preferences file, fill in "prefs", and return a pointer to it.
|
||||
|
||||
|
@ -861,10 +861,12 @@ static void read_prefs_file(const char *pf_path, FILE *pf);
|
|||
and a pointer to the path of the file into "*pf_path_return", and
|
||||
return NULL. */
|
||||
e_prefs *
|
||||
read_prefs(int *gpf_errno_return, char **gpf_path_return,
|
||||
int *pf_errno_return, char **pf_path_return)
|
||||
read_prefs(int *gpf_errno_return, int *gpf_read_errno_return,
|
||||
char **gpf_path_return, int *pf_errno_return,
|
||||
int *pf_read_errno_return, char **pf_path_return)
|
||||
{
|
||||
int i;
|
||||
int err;
|
||||
char *pf_path;
|
||||
FILE *pf;
|
||||
fmt_data *cfmt;
|
||||
|
@ -994,7 +996,14 @@ read_prefs(int *gpf_errno_return, char **gpf_path_return,
|
|||
*gpf_path_return = NULL;
|
||||
if ((pf = fopen(gpf_path, "r")) != NULL) {
|
||||
/* We succeeded in opening it; read it. */
|
||||
read_prefs_file(gpf_path, pf);
|
||||
err = read_prefs_file(gpf_path, pf);
|
||||
if (err != 0) {
|
||||
/* We had an error reading the file; return the errno and the
|
||||
pathname, so our caller can report the error. */
|
||||
*gpf_errno_return = 0;
|
||||
*gpf_read_errno_return = err;
|
||||
*gpf_path_return = gpf_path;
|
||||
}
|
||||
fclose(pf);
|
||||
} else {
|
||||
/* We failed to open it. If we failed for some reason other than
|
||||
|
@ -1002,6 +1011,7 @@ read_prefs(int *gpf_errno_return, char **gpf_path_return,
|
|||
caller can report the error. */
|
||||
if (errno != ENOENT) {
|
||||
*gpf_errno_return = errno;
|
||||
*gpf_read_errno_return = 0;
|
||||
*gpf_path_return = gpf_path;
|
||||
}
|
||||
}
|
||||
|
@ -1013,16 +1023,23 @@ read_prefs(int *gpf_errno_return, char **gpf_path_return,
|
|||
*pf_path_return = NULL;
|
||||
if ((pf = fopen(pf_path, "r")) != NULL) {
|
||||
/* We succeeded in opening it; read it. */
|
||||
read_prefs_file(pf_path, pf);
|
||||
err = read_prefs_file(pf_path, pf);
|
||||
if (err != 0) {
|
||||
/* We had an error reading the file; return the errno and the
|
||||
pathname, so our caller can report the error. */
|
||||
*pf_errno_return = 0;
|
||||
*pf_read_errno_return = err;
|
||||
*pf_path_return = pf_path;
|
||||
} else
|
||||
g_free(pf_path);
|
||||
fclose(pf);
|
||||
g_free(pf_path);
|
||||
pf_path = NULL;
|
||||
} else {
|
||||
/* We failed to open it. If we failed for some reason other than
|
||||
"it doesn't exist", return the errno and the pathname, so our
|
||||
caller can report the error. */
|
||||
if (errno != ENOENT) {
|
||||
*pf_errno_return = errno;
|
||||
*pf_read_errno_return = 0;
|
||||
*pf_path_return = pf_path;
|
||||
}
|
||||
}
|
||||
|
@ -1030,7 +1047,7 @@ read_prefs(int *gpf_errno_return, char **gpf_path_return,
|
|||
return &prefs;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
read_prefs_file(const char *pf_path, FILE *pf)
|
||||
{
|
||||
enum { START, IN_VAR, PRE_VAL, IN_VAL, IN_SKIP };
|
||||
|
@ -1161,6 +1178,10 @@ read_prefs_file(const char *pf_path, FILE *pf)
|
|||
g_warning ("%s line %d: Incomplete preference", pf_path, pline);
|
||||
}
|
||||
}
|
||||
if (ferror(pf))
|
||||
return errno;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
10
prefs.h
10
prefs.h
|
@ -1,7 +1,7 @@
|
|||
/* prefs.h
|
||||
* Definitions for preference handling routines
|
||||
*
|
||||
* $Id: prefs.h,v 1.43 2003/07/22 03:14:28 gerald Exp $
|
||||
* $Id: prefs.h,v 1.44 2003/08/07 00:41:26 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -226,14 +226,16 @@ extern void prefs_register_modules(void);
|
|||
|
||||
If we got an error (other than "it doesn't exist") trying to read
|
||||
the global preferences file, stuff the errno into "*gpf_errno_return"
|
||||
and a pointer to the path of the file into "*gpf_path_return", and
|
||||
on an open error and into "*gpf_read_errno_return" on a read error,
|
||||
stuff a pointer to the path of the file into "*gpf_path_return", and
|
||||
return NULL.
|
||||
|
||||
If we got an error (other than "it doesn't exist") trying to read
|
||||
the user's preferences file, stuff the errno into "*pf_errno_return"
|
||||
and a pointer to the path of the file into "*pf_path_return", and
|
||||
on an open error and into "*pf_read_errno_return" on a read error,
|
||||
stuff a pointer to the path of the file into "*pf_path_return", and
|
||||
return NULL. */
|
||||
extern e_prefs *read_prefs(int *, char **, int *, char **);
|
||||
extern e_prefs *read_prefs(int *, int *, char **, int *, int *, char **);
|
||||
|
||||
/* Write out "prefs" to the user's preferences file, and return 0.
|
||||
|
||||
|
|
55
tethereal.c
55
tethereal.c
|
@ -1,6 +1,6 @@
|
|||
/* tethereal.c
|
||||
*
|
||||
* $Id: tethereal.c,v 1.190 2003/07/25 04:11:50 gram Exp $
|
||||
* $Id: tethereal.c,v 1.191 2003/08/07 00:41:27 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -76,6 +76,7 @@
|
|||
#include <epan/timestamp.h>
|
||||
#include <epan/packet.h>
|
||||
#include "file.h"
|
||||
#include "disabled_protos.h"
|
||||
#include "prefs.h"
|
||||
#include "column.h"
|
||||
#include "print.h"
|
||||
|
@ -748,9 +749,11 @@ main(int argc, char *argv[])
|
|||
WSADATA wsaData;
|
||||
#endif /* _WIN32 */
|
||||
|
||||
char *gpf_path;
|
||||
char *pf_path;
|
||||
int gpf_open_errno, pf_open_errno;
|
||||
char *gpf_path, *pf_path;
|
||||
char *dp_path;
|
||||
int gpf_open_errno, gpf_read_errno;
|
||||
int pf_open_errno, pf_read_errno;
|
||||
int dp_open_errno, dp_read_errno;
|
||||
int err;
|
||||
#ifdef HAVE_LIBPCAP
|
||||
gboolean capture_filter_specified = FALSE;
|
||||
|
@ -810,14 +813,27 @@ main(int argc, char *argv[])
|
|||
/* Set the C-language locale to the native environment. */
|
||||
setlocale(LC_ALL, "");
|
||||
|
||||
prefs = read_prefs(&gpf_open_errno, &gpf_path, &pf_open_errno, &pf_path);
|
||||
prefs = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
|
||||
&pf_open_errno, &pf_read_errno, &pf_path);
|
||||
if (gpf_path != NULL) {
|
||||
fprintf(stderr, "Can't open global preferences file \"%s\": %s.\n", pf_path,
|
||||
strerror(gpf_open_errno));
|
||||
if (gpf_open_errno != 0) {
|
||||
fprintf(stderr, "Can't open global preferences file \"%s\": %s.\n",
|
||||
pf_path, strerror(gpf_open_errno));
|
||||
}
|
||||
if (gpf_read_errno != 0) {
|
||||
fprintf(stderr, "I/O error reading global preferences file \"%s\": %s.\n",
|
||||
pf_path, strerror(gpf_read_errno));
|
||||
}
|
||||
}
|
||||
if (pf_path != NULL) {
|
||||
fprintf(stderr, "Can't open your preferences file \"%s\": %s.\n", pf_path,
|
||||
strerror(pf_open_errno));
|
||||
if (pf_open_errno != 0) {
|
||||
fprintf(stderr, "Can't open your preferences file \"%s\": %s.\n", pf_path,
|
||||
strerror(pf_open_errno));
|
||||
}
|
||||
if (pf_read_errno != 0) {
|
||||
fprintf(stderr, "I/O error reading your preferences file \"%s\": %s.\n",
|
||||
pf_path, strerror(pf_read_errno));
|
||||
}
|
||||
g_free(pf_path);
|
||||
pf_path = NULL;
|
||||
}
|
||||
|
@ -825,6 +841,22 @@ main(int argc, char *argv[])
|
|||
/* Set the name resolution code's flags from the preferences. */
|
||||
g_resolv_flags = prefs->name_resolve;
|
||||
|
||||
/* Read the disabled protocols file. */
|
||||
read_disabled_protos_list(&dp_path, &dp_open_errno, &dp_read_errno);
|
||||
if (dp_path != NULL) {
|
||||
if (dp_open_errno != 0) {
|
||||
fprintf(stderr,
|
||||
"Could not open your disabled protocols file\n\"%s\": %s.\n", dp_path,
|
||||
strerror(dp_open_errno));
|
||||
}
|
||||
if (dp_read_errno != 0) {
|
||||
fprintf(stderr,
|
||||
"I/O error reading your disabled protocols file\n\"%s\": %s.\n", dp_path,
|
||||
strerror(dp_read_errno));
|
||||
}
|
||||
g_free(dp_path);
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
/* Load Wpcap, if possible */
|
||||
load_wpcap();
|
||||
|
@ -1175,6 +1207,11 @@ main(int argc, char *argv[])
|
|||
line that their preferences have changed. */
|
||||
prefs_apply_all();
|
||||
|
||||
/* disabled protocols as per configuration file */
|
||||
if (dp_path == NULL) {
|
||||
set_disabled_protos_list();
|
||||
}
|
||||
|
||||
#ifndef HAVE_LIBPCAP
|
||||
if (capture_option_specified)
|
||||
fprintf(stderr, "This version of Tethereal was not built with support for capturing packets.\n");
|
||||
|
|
Loading…
Reference in New Issue