First part to fix #148: use command line parameter -o not only for preferences but also for recent settings.

This way we can simply remove the GUI related command line parameters -B, -P and -T, which are useless now.

svn path=/trunk/; revision=14483
This commit is contained in:
Ulf Lamping 2005-05-30 04:06:22 +00:00
parent feb55854c7
commit 047cdd0f2a
4 changed files with 195 additions and 86 deletions

View File

@ -8,7 +8,6 @@ ethereal - Interactively browse network traffic
B<ethereal>
S<[ B<-a> capture autostop condition ] ...>
S<[ B<-b> ring buffer options] ...>
S<[ B<-B> byte view height ]>
S<[ B<-c> count ]>
S<[ B<-f> capture filter expression ]>
S<[ B<-h> ]>
@ -19,15 +18,13 @@ S<[ B<-L> ]>
S<[ B<-m> font ]>
S<[ B<-n> ]>
S<[ B<-N> resolving flags ] >
S<[ B<-o> preference setting ] ...>
S<[ B<-o> preference/recent setting ] ...>
S<[ B<-p> ]>
S<[ B<-P> packet list height ]>
S<[ B<-Q> ]>
S<[ B<-r> infile ]>
S<[ B<-R> display filter expression ]>
S<[ B<-S> ]>
S<[ B<-s> snaplen ]>
S<[ B<-T> details view height ]>
S<[ B<-t> time stamp format ]>
S<[ B<-v> ]>
S<[ B<-w> savefile]>
@ -172,28 +169,14 @@ Specify a criterion that specifies when B<Ethereal> is to stop writing
to a capture file. The criterion is of the form I<test>B<:>I<value>,
where I<test> is one of:
=for man .RS
B<duration>:I<value> Stop writing to a capture file after I<value> seconds have elapsed.
=for html <P><DL>
=item duration
Stop writing to a capture file after I<value> seconds have elapsed.
=item filesize
Stop writing to a capture file after it reaches a size of I<value>
B<filesize>:I<value> Stop writing to a capture file after it reaches a size of I<value>
kilobytes (where a kilobyte is 1000 bytes, not 1024 bytes). If this option
is used together with the -b option, Ethereal will stop writing to the
current capture file and switch to the next one if filesize is reached.
=item files
Stop writing to capture files after I<value> number of files were written.
=for man .RE
=for html </DL>
B<files>:I<value> Stop writing to capture files after I<value> number of files were written.
=item -b
@ -224,10 +207,6 @@ I<value> kilobytes (where a kilobyte is 1000 bytes, not 1024 bytes).
B<files>:I<value> begin again with the first file after I<value> number of
files were written (form a ring buffer).
=item -B
Set the initial height of the byte view (bottom) pane.
=item -c
Set the default number of packets to read when capturing live
@ -299,11 +278,13 @@ The letter B<C> enables concurrent (asynchronous) DNS lookups.
=item -o
Set a preference value, overriding the default value and any value read
from a preference file. The argument to the flag is a string of the
form I<prefname>B<:>I<value>, where I<prefname> is the name of the
preference (which is the same name that would appear in the preference
file), and I<value> is the value to which it should be set.
Set a preference or recent value, overriding the default value and any value
read from a preference/recent file. The argument to the flag is a string of
the form I<prefname>B<:>I<value>, where I<prefname> is the name of the
preference/recent value (which is the same name that would appear in the
preference/recent file), and I<value> is the value to which it should be set.
Using the recent settings now replaces the formerly used -B, -P and -T
parameters to manipulate the GUI dimensions.
=item -p
@ -314,10 +295,6 @@ traffic sent to or from the machine on which B<Ethereal> is running,
broadcast traffic, and multicast traffic to addresses received by that
machine.
=item -P
Set the initial height of the packet list (top) pane.
=item -Q
Cause B<Ethereal> to exit after the end of capture session (useful in
@ -346,10 +323,6 @@ Set the default snapshot length to use when capturing live data.
No more than I<snaplen> bytes of each network packet will be read into
memory, or saved to disk.
=item -T
Set the initial height of the packet details (middle) pane.
=item -t
Set the format of the packet timestamp displayed in the packet list

View File

@ -1000,15 +1000,12 @@ main_load_window_geometry(GtkWidget *widget)
window_set_geometry(widget, &geom);
#if GTK_MAJOR_VERSION >= 2
/* XXX - rename recent settings? */
if (recent.gui_geometry_main_upper_pane)
if (recent.has_gui_geometry_main_upper_pane && recent.gui_geometry_main_upper_pane)
gtk_paned_set_position(GTK_PANED(main_first_pane), recent.gui_geometry_main_upper_pane);
if (recent.gui_geometry_main_lower_pane)
if (recent.has_gui_geometry_main_lower_pane && recent.gui_geometry_main_lower_pane)
gtk_paned_set_position(GTK_PANED(main_second_pane), recent.gui_geometry_main_lower_pane);
if (recent.gui_geometry_status_pane)
if (recent.has_gui_geometry_main_lower_pane && recent.gui_geometry_status_pane)
gtk_paned_set_position(GTK_PANED(status_pane), recent.gui_geometry_status_pane);
#endif
}
@ -1608,7 +1605,7 @@ main(int argc, char *argv[])
gboolean capture_child; /* True if this is the child for "-S" */
GLogLevelFlags log_flags;
#define OPTSTRING_INIT "a:b:B:c:f:Hhi:klLm:nN:o:pP:Qr:R:Ss:t:T:w:vy:z:"
#define OPTSTRING_INIT "a:b:c:f:Hhi:klLm:nN:o:pQr:R:Ss:t:w:vy:z:"
#ifdef HAVE_LIBPCAP
#ifdef _WIN32
@ -1895,6 +1892,11 @@ main(int argc, char *argv[])
g_free(dp_path);
}
/* Read the (static part) of the recent file. Only the static part of it will be read, */
/* as we don't have the gui now to fill the recent lists which is done in the dynamic part. */
/* We have to do this already here, so command line parameters can overwrite these values. */
recent_read_static(&rf_path, &rf_open_errno);
init_cap_file(&cfile);
#ifdef _WIN32
@ -1964,9 +1966,6 @@ main(int argc, char *argv[])
#endif
/*** all non capture option specific ***/
case 'B': /* Byte view pane height */
bv_size = get_positive_int("ethereal", optarg, "byte view pane height");
break;
case 'h': /* Print help and exit */
print_usage(TRUE);
exit(0);
@ -2007,23 +2006,41 @@ main(int argc, char *argv[])
break;
case 'o': /* Override preference from command line */
switch (prefs_set_pref(optarg)) {
case PREFS_SET_SYNTAX_ERR:
case PREFS_SET_OK:
break;
case PREFS_SET_SYNTAX_ERR:
fprintf(stderr, "ethereal: Invalid -o flag \"%s\"\n", optarg);
exit(1);
break;
case PREFS_SET_NO_SUCH_PREF:
/* not a preference, might be a recent setting */
switch (recent_set_arg(optarg)) {
case PREFS_SET_OK:
break;
case PREFS_SET_SYNTAX_ERR:
/* shouldn't happen, checked already above */
fprintf(stderr, "ethereal: Invalid -o flag \"%s\"\n", optarg);
exit(1);
break;
case PREFS_SET_NO_SUCH_PREF:
case PREFS_SET_OBSOLETE:
fprintf(stderr, "ethereal: -o flag \"%s\" specifies unknown preference/recent value\n",
optarg);
exit(1);
break;
default:
g_assert_not_reached();
}
break;
case PREFS_SET_OBSOLETE:
fprintf(stderr, "ethereal: -o flag \"%s\" specifies unknown preference\n",
fprintf(stderr, "ethereal: -o flag \"%s\" specifies obsolete preference\n",
optarg);
exit(1);
break;
default:
g_assert_not_reached();
}
break;
case 'P': /* Packet list pane height */
pl_size = get_positive_int("ethereal", optarg, "packet list pane height");
break;
case 'r': /* Read capture file xxx */
/* We may set "last_open_dir" to "cf_name", and if we change
"last_open_dir" later, we free the old value, so we have to
@ -2050,9 +2067,6 @@ main(int argc, char *argv[])
exit(1);
}
break;
case 'T': /* Tree view pane height */
tv_size = get_positive_int("ethereal", optarg, "tree view pane height");
break;
case 'v': /* Show version and exit */
show_version();
#ifdef _WIN32
@ -2342,15 +2356,14 @@ main(int argc, char *argv[])
/* Everything is prepared now, preferences and command line was read in,
we are NOT a child window for a synced capture. */
/* Pop up the main window, and read in a capture file if
we were told to. */
/* Pop up the main window. */
create_main_window(pl_size, tv_size, bv_size, prefs);
/* Read the recent file, as we have the gui now ready for it. */
read_recent(&rf_path, &rf_open_errno);
/* Read the dynamic part of the recent file, as we have the gui now ready for it. */
recent_read_dynamic(&rf_path, &rf_open_errno);
color_filters_enable(recent.packet_list_colorize);
/* rearrange all the widgets as we now have the recent settings for this */
/* rearrange all the widgets as we now have all recent settings ready for this */
main_widgets_rearrange();
/* Fill in column titles. This must be done after the top level window

View File

@ -133,19 +133,19 @@ write_recent(void)
"# This file is regenerated each time Ethereal is quit.\n"
"# So be careful, if you want to make manual changes here.\n"
"\n"
"######## Recent capture files (latest last) ########\n"
"######## Recent capture files (latest last), cannot be altered through command line ########\n"
"\n", rf);
menu_recent_file_write_all(rf);
fputs("\n"
"######## Recent capture filters (latest last) ########\n"
"######## Recent capture filters (latest last), cannot be altered through command line ########\n"
"\n", rf);
cfilter_combo_recent_write_all(rf);
fputs("\n"
"######## Recent display filters (latest last) ########\n"
"######## Recent display filters (latest last), cannot be altered through command line ########\n"
"\n", rf);
dfilter_recent_combo_write_all(rf);
@ -204,24 +204,27 @@ write_recent(void)
fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_HEIGHT ": %d\n",
recent.gui_geometry_main_height);
fprintf(rf, "\n# Main window maximized (GTK2 only).\n");
fprintf(rf, "\n# Main window maximized (GTK2 only!).\n");
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_MAXIMIZED ": %s\n",
recent.gui_geometry_main_maximized == TRUE ? "TRUE" : "FALSE");
fprintf(rf, "\n# Main window upper (or leftmost) pane size (GTK2 only).\n");
fprintf(rf, "\n# Main window upper (or leftmost) pane size.\n");
fprintf(rf, "# (GTK1: has no effect here, command line -o usage only).\n");
fprintf(rf, "# Decimal number.\n");
if (recent.gui_geometry_main_upper_pane != 0) {
fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_UPPER_PANE ": %d\n",
recent.gui_geometry_main_upper_pane);
}
fprintf(rf, "\n# Main window middle pane size (GTK2 only).\n");
fprintf(rf, "\n# Main window middle pane size.\n");
fprintf(rf, "# (GTK1: has no effect here, command line -o usage only).\n");
fprintf(rf, "# Decimal number.\n");
if (recent.gui_geometry_main_lower_pane != 0) {
fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_LOWER_PANE ": %d\n",
recent.gui_geometry_main_lower_pane);
}
fprintf(rf, "\n# Statusbar left pane size (GTK2 only).\n");
fprintf(rf, "\n# Statusbar left pane size.\n");
fprintf(rf, "# (GTK1: has no effect here, command line -o usage only).\n");
fprintf(rf, "# Decimal number.\n");
if (recent.gui_geometry_status_pane != 0) {
fprintf(rf, RECENT_GUI_GEOMETRY_STATUS_PANE ": %d\n",
@ -269,18 +272,12 @@ write_recent_geom(gpointer key _U_, gpointer value, gpointer rf)
/* set one user's recent file key/value pair */
static int
read_set_recent_pair(gchar *key, gchar *value)
read_set_recent_pair_static(gchar *key, gchar *value)
{
long num;
char *p;
if (strcmp(key, RECENT_KEY_CAPTURE_FILE) == 0) {
add_menu_recent_capture_file(value);
} else if (strcmp(key, RECENT_KEY_DISPLAY_FILTER) == 0) {
dfilter_combo_add_recent(value);
} else if (strcmp(key, RECENT_KEY_CAPTURE_FILTER) == 0) {
cfilter_combo_add_recent(value);
} else if (strcmp(key, RECENT_KEY_MAIN_TOOLBAR_SHOW) == 0) {
if (strcmp(key, RECENT_KEY_MAIN_TOOLBAR_SHOW) == 0) {
if (strcasecmp(value, "true") == 0) {
recent.main_toolbar_show = TRUE;
}
@ -376,6 +373,7 @@ read_set_recent_pair(gchar *key, gchar *value)
if (num <= 0)
return PREFS_SET_SYNTAX_ERR; /* number must be positive */
recent.gui_geometry_main_upper_pane = num;
recent.has_gui_geometry_main_upper_pane = TRUE;
} else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_LOWER_PANE) == 0) {
num = strtol(value, &p, 0);
if (p == value || *p != '\0')
@ -383,6 +381,7 @@ read_set_recent_pair(gchar *key, gchar *value)
if (num <= 0)
return PREFS_SET_SYNTAX_ERR; /* number must be positive */
recent.gui_geometry_main_lower_pane = num;
recent.has_gui_geometry_main_lower_pane = TRUE;
} else if (strcmp(key, RECENT_GUI_GEOMETRY_STATUS_PANE) == 0) {
num = strtol(value, &p, 0);
if (p == value || *p != '\0')
@ -390,6 +389,7 @@ read_set_recent_pair(gchar *key, gchar *value)
if (num <= 0)
return PREFS_SET_SYNTAX_ERR; /* number must be positive */
recent.gui_geometry_status_pane = num;
recent.has_gui_geometry_status_pane = TRUE;
} else if (strcmp(key, RECENT_GUI_FILEOPEN_REMEMBERED_DIR) == 0) {
set_last_open_dir(value);
} else if (strncmp(key, RECENT_GUI_GEOMETRY, sizeof(RECENT_GUI_GEOMETRY)-1) == 0) {
@ -407,9 +407,67 @@ read_set_recent_pair(gchar *key, gchar *value)
}
/* opens the user's recent file and read it out */
/* set one user's recent file key/value pair */
static int
read_set_recent_pair_dynamic(gchar *key, gchar *value)
{
if (strcmp(key, RECENT_KEY_CAPTURE_FILE) == 0) {
add_menu_recent_capture_file(value);
} else if (strcmp(key, RECENT_KEY_DISPLAY_FILTER) == 0) {
dfilter_combo_add_recent(value);
} else if (strcmp(key, RECENT_KEY_CAPTURE_FILTER) == 0) {
cfilter_combo_add_recent(value);
}
return PREFS_SET_OK;
}
/*
* Given a string of the form "<recent name>:<recent value>", as might appear
* as an argument to a "-o" option, parse it and set the recent value in
* question. Return an indication of whether it succeeded or failed
* in some fashion.
*/
int
recent_set_arg(char *prefarg)
{
guchar *p, *colonp;
int ret;
colonp = strchr(prefarg, ':');
if (colonp == NULL)
return PREFS_SET_SYNTAX_ERR;
p = colonp;
*p++ = '\0';
/*
* Skip over any white space (there probably won't be any, but
* as we allow it in the preferences file, we might as well
* allow it here).
*/
while (isspace(*p))
p++;
if (*p == '\0') {
/*
* Put the colon back, so if our caller uses, in an
* error message, the string they passed us, the message
* looks correct.
*/
*colonp = ':';
return PREFS_SET_SYNTAX_ERR;
}
ret = read_set_recent_pair_static(prefarg, p);
*colonp = ':'; /* put the colon back */
return ret;
}
/* opens the user's recent file and read the first part */
void
read_recent(char **rf_path_return, int *rf_errno_return)
recent_read_static(char **rf_path_return, int *rf_errno_return)
{
char *rf_path;
FILE *rf;
@ -437,6 +495,18 @@ read_recent(char **rf_path_return, int *rf_errno_return)
recent.gui_geometry_main_lower_pane = 0;
recent.gui_geometry_status_pane = 0;
/* the following are only used if GTK2 is used (as GTK1 cannot read these geometry values) */
/* or if set through command line */
#if GTK_MAJOR_VERSION >= 2
recent.has_gui_geometry_main_upper_pane = TRUE;
recent.has_gui_geometry_main_lower_pane = TRUE;
recent.has_gui_geometry_status_pane = TRUE;
#else
recent.has_gui_geometry_main_upper_pane = FALSE;
recent.has_gui_geometry_main_lower_pane = FALSE;
recent.has_gui_geometry_status_pane = FALSE;
#endif
/* Construct the pathname of the user's recent file. */
rf_path = get_persconffile_path(RECENT_FILE_NAME, FALSE);
@ -444,7 +514,39 @@ read_recent(char **rf_path_return, int *rf_errno_return)
*rf_path_return = NULL;
if ((rf = fopen(rf_path, "r")) != NULL) {
/* We succeeded in opening it; read it. */
read_prefs_file(rf_path, rf, read_set_recent_pair);
read_prefs_file(rf_path, rf, read_set_recent_pair_static);
fclose(rf);
g_free(rf_path);
rf_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) {
*rf_errno_return = errno;
*rf_path_return = rf_path;
}
}
}
/* opens the user's recent file and read it out */
void
recent_read_dynamic(char **rf_path_return, int *rf_errno_return)
{
char *rf_path;
FILE *rf;
/* Construct the pathname of the user's recent file. */
rf_path = get_persconffile_path(RECENT_FILE_NAME, FALSE);
/* Read the user's recent file, if it exists. */
*rf_path_return = NULL;
if ((rf = fopen(rf_path, "r")) != NULL) {
/* We succeeded in opening it; read it. */
read_prefs_file(rf_path, rf, read_set_recent_pair_dynamic);
/* set dfilter combobox to have an empty line */
dfilter_combo_add_empty();
fclose(rf);

View File

@ -58,9 +58,12 @@ typedef struct recent_settings_tag {
gboolean gui_geometry_main_maximized; /* this is valid in GTK2 only */
gint gui_geometry_main_upper_pane; /* this is valid in GTK2 only */
gint gui_geometry_main_lower_pane; /* this is valid in GTK2 only */
gint gui_geometry_status_pane; /* this is valid in GTK2 only */
gboolean has_gui_geometry_main_upper_pane; /* gui_geometry_main_upper_pane is valid */
gint gui_geometry_main_upper_pane; /* this is autodetected in GTK2 only */
gboolean has_gui_geometry_main_lower_pane; /* gui_geometry_main_lower_pane is valid */
gint gui_geometry_main_lower_pane; /* this is autodetected in GTK2 only */
gboolean has_gui_geometry_status_pane; /* gui_geometry_status_pane is valid */
gint gui_geometry_status_pane; /* this is autodetected in GTK2 only */
} recent_settings_t;
/** Global recent settings. */
@ -72,12 +75,19 @@ extern recent_settings_t recent;
*/
extern gboolean write_recent(void);
/** Read recent settings file.
/** Read recent settings file (static part).
*
* @param rf_path_return path to recent file if function failed
* @param rf_errno_return if failed
*/
extern void read_recent(char **rf_path_return, int *rf_errno_return);
extern void recent_read_static(char **rf_path_return, int *rf_errno_return);
/** Read recent settings file (dynamic part).
*
* @param rf_path_return path to recent file if function failed
* @param rf_errno_return if failed
*/
extern void recent_read_dynamic(char **rf_path_return, int *rf_errno_return);
/** Write the geometry values of a single window to the recent file.
*
@ -87,4 +97,15 @@ extern void read_recent(char **rf_path_return, int *rf_errno_return);
*/
extern void write_recent_geom(gpointer key, gpointer value, gpointer rf);
/**
* Given a -o command line string, parse it and set the recent value in
* question. Return an indication of whether it succeeded or failed
* in some fashion.
*
* @param a string of the form "<recent name>:<recent value>", as might appear
* as an argument to a "-o" command line option
* @return PREFS_SET_OK or PREFS_SET_SYNTAX_ERR
*/
extern int recent_set_arg(char *prefarg);
#endif /* recent.h */