![Gerald Combs](/assets/img/avatar_default.png)
setuid instead of Wireshark. Remove the "DANGEROUS" notices, but leave it disabled by default. Whine if the user runs Wireshark or TShark as root. Add a preference to disable the whining. Add a "setuid-root" script that can be used to switch dumpcap and TShark's setuid-ness on and off for development and testing. Update the release notes and README.packaging. svn path=/trunk/; revision=22733
639 lines
22 KiB
C
639 lines
22 KiB
C
/* recent.c
|
|
* Recent "preference" handling routines
|
|
* Copyright 2004, Ulf Lamping <ulf.lamping@web.de>
|
|
*
|
|
* $Id$
|
|
*
|
|
* Wireshark - Network traffic analyzer
|
|
* By Gerald Combs <gerald@wireshark.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.
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif
|
|
|
|
#include <gtk/gtk.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
|
|
#include "recent.h"
|
|
#include <epan/epan.h>
|
|
#include <epan/filesystem.h>
|
|
#include "menu.h"
|
|
#include "main.h"
|
|
#include <epan/prefs.h>
|
|
#include <epan/prefs-int.h>
|
|
#include "gui_utils.h"
|
|
#if 0
|
|
#include "dlg_utils.h"
|
|
#endif
|
|
#include "file_dlg.h"
|
|
#include "cfilter_combo_utils.h"
|
|
#include "simple_dialog.h"
|
|
#include "file_util.h"
|
|
#include "u3.h"
|
|
|
|
#define RECENT_KEY_MAIN_TOOLBAR_SHOW "gui.toolbar_main_show"
|
|
#define RECENT_KEY_FILTER_TOOLBAR_SHOW "gui.filter_toolbar_show"
|
|
#define RECENT_KEY_AIRPCAP_TOOLBAR_SHOW "gui.airpcap_toolbar_show"
|
|
#define RECENT_KEY_DRIVER_CHECK_SHOW "gui.airpcap_driver_check_show"
|
|
#define RECENT_KEY_PACKET_LIST_SHOW "gui.packet_list_show"
|
|
#define RECENT_KEY_TREE_VIEW_SHOW "gui.tree_view_show"
|
|
#define RECENT_KEY_BYTE_VIEW_SHOW "gui.byte_view_show"
|
|
#define RECENT_KEY_STATUSBAR_SHOW "gui.statusbar_show"
|
|
#define RECENT_KEY_PACKET_LIST_COLORIZE "gui.packet_list_colorize"
|
|
#define RECENT_GUI_TIME_FORMAT "gui.time_format"
|
|
#define RECENT_GUI_TIME_PRECISION "gui.time_precision"
|
|
#define RECENT_GUI_ZOOM_LEVEL "gui.zoom_level"
|
|
#define RECENT_GUI_GEOMETRY_MAIN_X "gui.geometry_main_x"
|
|
#define RECENT_GUI_GEOMETRY_MAIN_Y "gui.geometry_main_y"
|
|
#define RECENT_GUI_GEOMETRY_MAIN_WIDTH "gui.geometry_main_width"
|
|
#define RECENT_GUI_GEOMETRY_MAIN_HEIGHT "gui.geometry_main_height"
|
|
#define RECENT_GUI_GEOMETRY_MAIN_MAXIMIZED "gui.geometry_main_maximized"
|
|
#define RECENT_GUI_GEOMETRY_MAIN_UPPER_PANE "gui.geometry_main_upper_pane"
|
|
#define RECENT_GUI_GEOMETRY_MAIN_LOWER_PANE "gui.geometry_main_lower_pane"
|
|
#define RECENT_GUI_GEOMETRY_STATUS_PANE "gui.geometry_status_pane"
|
|
#define RECENT_GUI_FILEOPEN_REMEMBERED_DIR "gui.fileopen_remembered_dir"
|
|
#define RECENT_GUI_GEOMETRY "gui.geom."
|
|
#define RECENT_KEY_PRIVS_WARN_IF_ELEVATED "privs.warn_if_elevated"
|
|
|
|
#define RECENT_FILE_NAME "recent"
|
|
|
|
recent_settings_t recent;
|
|
|
|
static const char *ts_type_text[] =
|
|
{ "RELATIVE", "ABSOLUTE", "ABSOLUTE_WITH_DATE", "DELTA", "EPOCH", NULL };
|
|
|
|
static const char *ts_precision_text[] =
|
|
{ "AUTO", "SEC", "DSEC", "CSEC", "MSEC", "USEC", "NSEC", NULL };
|
|
|
|
/* Takes an string and a pointer to an array of strings, and a default int value.
|
|
* The array must be terminated by a NULL string. If the string is found in the array
|
|
* of strings, the index of that string in the array is returned. Otherwise, the
|
|
* default value that was passed as the third argument is returned.
|
|
*/
|
|
static int
|
|
find_index_from_string_array(const char *needle, const char **haystack, int default_value)
|
|
{
|
|
int i = 0;
|
|
|
|
while (haystack[i] != NULL) {
|
|
if (strcmp(needle, haystack[i]) == 0) {
|
|
return i;
|
|
}
|
|
i++;
|
|
}
|
|
return default_value;
|
|
}
|
|
|
|
/* Attempt to Write out "recent" to the user's recent file.
|
|
If we got an error report it with a dialog box and return FALSE,
|
|
otherwise return TRUE. */
|
|
gboolean
|
|
write_recent(void)
|
|
{
|
|
char *pf_dir_path;
|
|
char *rf_path;
|
|
FILE *rf;
|
|
|
|
/* To do:
|
|
* - Split output lines longer than MAX_VAL_LEN
|
|
* - Create a function for the preference directory check/creation
|
|
* so that duplication can be avoided with filter.c
|
|
*/
|
|
|
|
/* Create the directory that holds personal configuration files, if
|
|
necessary. */
|
|
if (create_persconffile_dir(&pf_dir_path) == -1) {
|
|
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
|
|
"Can't create directory\n\"%s\"\nfor recent file: %s.", pf_dir_path,
|
|
strerror(errno));
|
|
g_free(pf_dir_path);
|
|
return FALSE;
|
|
}
|
|
|
|
rf_path = get_persconffile_path(RECENT_FILE_NAME, TRUE);
|
|
if ((rf = eth_fopen(rf_path, "w")) == NULL) {
|
|
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
|
|
"Can't open recent file\n\"%s\": %s.", rf_path,
|
|
strerror(errno));
|
|
g_free(rf_path);
|
|
return FALSE;
|
|
}
|
|
|
|
fputs("# Recent settings file for Wireshark " VERSION ".\n"
|
|
"#\n"
|
|
"# This file is regenerated each time Wireshark is quit.\n"
|
|
"# So be careful, if you want to make manual changes here.\n"
|
|
"\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), cannot be altered through command line ########\n"
|
|
"\n", rf);
|
|
|
|
cfilter_combo_recent_write_all(rf);
|
|
|
|
fputs("\n"
|
|
"######## Recent display filters (latest last), cannot be altered through command line ########\n"
|
|
"\n", rf);
|
|
|
|
dfilter_recent_combo_write_all(rf);
|
|
|
|
fprintf(rf, "\n# Main Toolbar show (hide).\n");
|
|
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
|
|
fprintf(rf, RECENT_KEY_MAIN_TOOLBAR_SHOW ": %s\n",
|
|
recent.main_toolbar_show == TRUE ? "TRUE" : "FALSE");
|
|
|
|
fprintf(rf, "\n# Filter Toolbar show (hide).\n");
|
|
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
|
|
fprintf(rf, RECENT_KEY_FILTER_TOOLBAR_SHOW ": %s\n",
|
|
recent.filter_toolbar_show == TRUE ? "TRUE" : "FALSE");
|
|
|
|
#ifdef HAVE_AIRPCAP
|
|
fprintf(rf, "\n# Wireless Settings Toolbar show (hide).\n");
|
|
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
|
|
fprintf(rf, RECENT_KEY_AIRPCAP_TOOLBAR_SHOW ": %s\n",
|
|
recent.airpcap_toolbar_show == TRUE ? "TRUE" : "FALSE");
|
|
#endif
|
|
|
|
#ifdef HAVE_AIRPCAP
|
|
fprintf(rf, "\n# Show (hide) old AirPcap driver warning dialog box.\n");
|
|
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
|
|
fprintf(rf, RECENT_KEY_DRIVER_CHECK_SHOW ": %s\n",
|
|
recent.airpcap_driver_check_show == TRUE ? "TRUE" : "FALSE");
|
|
#endif
|
|
|
|
fprintf(rf, "\n# Packet list show (hide).\n");
|
|
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
|
|
fprintf(rf, RECENT_KEY_PACKET_LIST_SHOW ": %s\n",
|
|
recent.packet_list_show == TRUE ? "TRUE" : "FALSE");
|
|
|
|
fprintf(rf, "\n# Tree view show (hide).\n");
|
|
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
|
|
fprintf(rf, RECENT_KEY_TREE_VIEW_SHOW ": %s\n",
|
|
recent.tree_view_show == TRUE ? "TRUE" : "FALSE");
|
|
|
|
fprintf(rf, "\n# Byte view show (hide).\n");
|
|
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
|
|
fprintf(rf, RECENT_KEY_BYTE_VIEW_SHOW ": %s\n",
|
|
recent.byte_view_show == TRUE ? "TRUE" : "FALSE");
|
|
|
|
fprintf(rf, "\n# Statusbar show (hide).\n");
|
|
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
|
|
fprintf(rf, RECENT_KEY_STATUSBAR_SHOW ": %s\n",
|
|
recent.statusbar_show == TRUE ? "TRUE" : "FALSE");
|
|
|
|
fprintf(rf, "\n# Packet list colorize (hide).\n");
|
|
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
|
|
fprintf(rf, RECENT_KEY_PACKET_LIST_COLORIZE ": %s\n",
|
|
recent.packet_list_colorize == TRUE ? "TRUE" : "FALSE");
|
|
|
|
fprintf(rf, "\n# Timestamp display format.\n");
|
|
fprintf(rf, "# One of: RELATIVE, ABSOLUTE, ABSOLUTE_WITH_DATE, DELTA, EPOCH\n");
|
|
fprintf(rf, RECENT_GUI_TIME_FORMAT ": %s\n",
|
|
ts_type_text[recent.gui_time_format]);
|
|
|
|
fprintf(rf, "\n# Timestamp display precision.\n");
|
|
fprintf(rf, "# One of: AUTO, SEC, DSEC, CSEC, MSEC, USEC, NSEC\n");
|
|
fprintf(rf, RECENT_GUI_TIME_PRECISION ": %s\n",
|
|
ts_precision_text[recent.gui_time_precision]);
|
|
|
|
fprintf(rf, "\n# Zoom level.\n");
|
|
fprintf(rf, "# A decimal number.\n");
|
|
fprintf(rf, RECENT_GUI_ZOOM_LEVEL ": %d\n",
|
|
recent.gui_zoom_level);
|
|
|
|
fprintf(rf, "\n# Main window geometry.\n");
|
|
fprintf(rf, "# Decimal numbers.\n");
|
|
fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_X ": %d\n", recent.gui_geometry_main_x);
|
|
fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_Y ": %d\n", recent.gui_geometry_main_y);
|
|
fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_WIDTH ": %d\n",
|
|
recent.gui_geometry_main_width);
|
|
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, "# 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.\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.\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.\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",
|
|
recent.gui_geometry_status_pane);
|
|
}
|
|
|
|
fprintf(rf, "\n# Warn if running with elevated permissions (e.g. as root).\n");
|
|
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
|
|
fprintf(rf, RECENT_KEY_PRIVS_WARN_IF_ELEVATED ": %s\n",
|
|
recent.privs_warn_if_elevated == TRUE ? "TRUE" : "FALSE");
|
|
|
|
if (get_last_open_dir() != NULL) {
|
|
fprintf(rf, "\n# Last directory navigated to in File Open dialog.\n");
|
|
|
|
if(u3_active())
|
|
fprintf(rf, RECENT_GUI_FILEOPEN_REMEMBERED_DIR ": %s\n", u3_contract_device_path(get_last_open_dir()));
|
|
else
|
|
fprintf(rf, RECENT_GUI_FILEOPEN_REMEMBERED_DIR ": %s\n", get_last_open_dir());
|
|
}
|
|
|
|
window_geom_recent_write_all(rf);
|
|
|
|
fclose(rf);
|
|
|
|
/* XXX - catch I/O errors (e.g. "ran out of disk space") and return
|
|
an error indication, or maybe write to a new recent file and
|
|
rename that file on top of the old one only if there are not I/O
|
|
errors. */
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/* write the geometry values of a window to recent file */
|
|
void
|
|
write_recent_geom(gpointer key _U_, gpointer value, gpointer rf)
|
|
{
|
|
window_geometry_t *geom = value;
|
|
|
|
fprintf(rf, "\n# Geometry and maximized state (GTK2 only) of %s window.\n", geom->key);
|
|
fprintf(rf, "# Decimal integers.\n");
|
|
fprintf(rf, RECENT_GUI_GEOMETRY "%s.x: %d\n", geom->key, geom->x);
|
|
fprintf(rf, RECENT_GUI_GEOMETRY "%s.y: %d\n", geom->key, geom->y);
|
|
fprintf(rf, RECENT_GUI_GEOMETRY "%s.width: %d\n", geom->key,
|
|
geom->width);
|
|
fprintf(rf, RECENT_GUI_GEOMETRY "%s.height: %d\n", geom->key,
|
|
geom->height);
|
|
|
|
fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
|
|
fprintf(rf, RECENT_GUI_GEOMETRY "%s.maximized: %s\n", geom->key,
|
|
geom->maximized == TRUE ? "TRUE" : "FALSE");
|
|
|
|
}
|
|
|
|
|
|
/* set one user's recent file key/value pair */
|
|
static prefs_set_pref_e
|
|
read_set_recent_pair_static(gchar *key, gchar *value, void *private_data _U_)
|
|
{
|
|
long num;
|
|
char *p;
|
|
|
|
if (strcmp(key, RECENT_KEY_MAIN_TOOLBAR_SHOW) == 0) {
|
|
if (strcasecmp(value, "true") == 0) {
|
|
recent.main_toolbar_show = TRUE;
|
|
}
|
|
else {
|
|
recent.main_toolbar_show = FALSE;
|
|
}
|
|
} else if (strcmp(key, RECENT_KEY_FILTER_TOOLBAR_SHOW) == 0) {
|
|
if (strcasecmp(value, "true") == 0) {
|
|
recent.filter_toolbar_show = TRUE;
|
|
}
|
|
else {
|
|
recent.filter_toolbar_show = FALSE;
|
|
}
|
|
} else if (strcmp(key, RECENT_KEY_AIRPCAP_TOOLBAR_SHOW) == 0) {
|
|
if (strcasecmp(value, "true") == 0) {
|
|
recent.airpcap_toolbar_show = TRUE;
|
|
}
|
|
else {
|
|
recent.airpcap_toolbar_show = FALSE;
|
|
}
|
|
} else if (strcmp(key, RECENT_KEY_DRIVER_CHECK_SHOW) == 0) {
|
|
if (strcasecmp(value, "true") == 0) {
|
|
recent.airpcap_driver_check_show = TRUE;
|
|
}
|
|
else {
|
|
recent.airpcap_driver_check_show = FALSE;
|
|
}
|
|
}else if (strcmp(key, RECENT_KEY_PACKET_LIST_SHOW) == 0) {
|
|
if (strcasecmp(value, "true") == 0) {
|
|
recent.packet_list_show = TRUE;
|
|
}
|
|
else {
|
|
recent.packet_list_show = FALSE;
|
|
}
|
|
} else if (strcmp(key, RECENT_KEY_TREE_VIEW_SHOW) == 0) {
|
|
if (strcasecmp(value, "true") == 0) {
|
|
recent.tree_view_show = TRUE;
|
|
}
|
|
else {
|
|
recent.tree_view_show = FALSE;
|
|
}
|
|
} else if (strcmp(key, RECENT_KEY_BYTE_VIEW_SHOW) == 0) {
|
|
if (strcasecmp(value, "true") == 0) {
|
|
recent.byte_view_show = TRUE;
|
|
}
|
|
else {
|
|
recent.byte_view_show = FALSE;
|
|
}
|
|
} else if (strcmp(key, RECENT_KEY_STATUSBAR_SHOW) == 0) {
|
|
if (strcasecmp(value, "true") == 0) {
|
|
recent.statusbar_show = TRUE;
|
|
}
|
|
else {
|
|
recent.statusbar_show = FALSE;
|
|
}
|
|
} else if (strcmp(key, RECENT_KEY_PACKET_LIST_COLORIZE) == 0) {
|
|
if (strcasecmp(value, "true") == 0) {
|
|
recent.packet_list_colorize = TRUE;
|
|
}
|
|
else {
|
|
recent.packet_list_colorize = FALSE;
|
|
}
|
|
} else if (strcmp(key, RECENT_GUI_TIME_FORMAT) == 0) {
|
|
recent.gui_time_format =
|
|
find_index_from_string_array(value, ts_type_text, TS_RELATIVE);
|
|
} else if (strcmp(key, RECENT_GUI_TIME_PRECISION) == 0) {
|
|
recent.gui_time_precision =
|
|
find_index_from_string_array(value, ts_precision_text, TS_PREC_AUTO);
|
|
} else if (strcmp(key, RECENT_GUI_ZOOM_LEVEL) == 0) {
|
|
num = strtol(value, &p, 0);
|
|
if (p == value || *p != '\0')
|
|
return PREFS_SET_SYNTAX_ERR; /* number was bad */
|
|
recent.gui_zoom_level = num;
|
|
} else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_MAXIMIZED) == 0) {
|
|
if (strcasecmp(value, "true") == 0) {
|
|
recent.gui_geometry_main_maximized = TRUE;
|
|
}
|
|
else {
|
|
recent.gui_geometry_main_maximized = FALSE;
|
|
}
|
|
|
|
} else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_X) == 0) {
|
|
num = strtol(value, &p, 0);
|
|
if (p == value || *p != '\0')
|
|
return PREFS_SET_SYNTAX_ERR; /* number was bad */
|
|
recent.gui_geometry_main_x = num;
|
|
} else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_Y) == 0) {
|
|
num = strtol(value, &p, 0);
|
|
if (p == value || *p != '\0')
|
|
return PREFS_SET_SYNTAX_ERR; /* number was bad */
|
|
recent.gui_geometry_main_y = num;
|
|
} else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_WIDTH) == 0) {
|
|
num = strtol(value, &p, 0);
|
|
if (p == value || *p != '\0')
|
|
return PREFS_SET_SYNTAX_ERR; /* number was bad */
|
|
if (num <= 0)
|
|
return PREFS_SET_SYNTAX_ERR; /* number must be positive */
|
|
recent.gui_geometry_main_width = num;
|
|
} else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_HEIGHT) == 0) {
|
|
num = strtol(value, &p, 0);
|
|
if (p == value || *p != '\0')
|
|
return PREFS_SET_SYNTAX_ERR; /* number was bad */
|
|
if (num <= 0)
|
|
return PREFS_SET_SYNTAX_ERR; /* number must be positive */
|
|
recent.gui_geometry_main_height = num;
|
|
} else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_UPPER_PANE) == 0) {
|
|
num = strtol(value, &p, 0);
|
|
if (p == value || *p != '\0')
|
|
return PREFS_SET_SYNTAX_ERR; /* number was bad */
|
|
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')
|
|
return PREFS_SET_SYNTAX_ERR; /* number was bad */
|
|
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')
|
|
return PREFS_SET_SYNTAX_ERR; /* number was bad */
|
|
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) {
|
|
if(u3_active())
|
|
set_last_open_dir(u3_expand_device_path(value));
|
|
else
|
|
set_last_open_dir(value);
|
|
} else if (strncmp(key, RECENT_GUI_GEOMETRY, sizeof(RECENT_GUI_GEOMETRY)-1) == 0) {
|
|
/* now have something like "gui.geom.main.x", split it into win and sub_key */
|
|
char *win = &key[sizeof(RECENT_GUI_GEOMETRY)-1];
|
|
char *sub_key = strchr(win, '.');
|
|
if(sub_key) {
|
|
*sub_key = '\0';
|
|
sub_key++;
|
|
window_geom_recent_read_pair(win, sub_key, value);
|
|
}
|
|
} else if (strcmp(key, RECENT_KEY_PRIVS_WARN_IF_ELEVATED) == 0) {
|
|
if (strcasecmp(value, "true") == 0) {
|
|
recent.privs_warn_if_elevated = TRUE;
|
|
}
|
|
else {
|
|
recent.privs_warn_if_elevated = FALSE;
|
|
}
|
|
}
|
|
|
|
return PREFS_SET_OK;
|
|
}
|
|
|
|
|
|
/* set one user's recent file key/value pair */
|
|
static prefs_set_pref_e
|
|
read_set_recent_pair_dynamic(gchar *key, gchar *value, void *private_data _U_)
|
|
{
|
|
if (strcmp(key, RECENT_KEY_CAPTURE_FILE) == 0) {
|
|
if(u3_active())
|
|
add_menu_recent_capture_file(u3_expand_device_path(value));
|
|
else
|
|
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, NULL);
|
|
*colonp = ':'; /* put the colon back */
|
|
return ret;
|
|
}
|
|
|
|
|
|
/* opens the user's recent file and read the first part */
|
|
void
|
|
recent_read_static(char **rf_path_return, int *rf_errno_return)
|
|
{
|
|
char *rf_path;
|
|
FILE *rf;
|
|
|
|
|
|
/* set defaults */
|
|
recent.main_toolbar_show = TRUE;
|
|
recent.filter_toolbar_show = TRUE;
|
|
recent.airpcap_toolbar_show = FALSE;
|
|
recent.airpcap_driver_check_show = TRUE;
|
|
recent.packet_list_show = TRUE;
|
|
recent.tree_view_show = TRUE;
|
|
recent.byte_view_show = TRUE;
|
|
recent.statusbar_show = TRUE;
|
|
recent.packet_list_colorize = TRUE;
|
|
recent.gui_time_format = TS_RELATIVE;
|
|
recent.gui_time_precision = TS_PREC_AUTO;
|
|
recent.gui_zoom_level = 0;
|
|
|
|
recent.gui_geometry_main_x = 20;
|
|
recent.gui_geometry_main_y = 20;
|
|
recent.gui_geometry_main_width = DEF_WIDTH;
|
|
recent.gui_geometry_main_height = DEF_HEIGHT;
|
|
recent.gui_geometry_main_maximized= FALSE;
|
|
|
|
/* pane size of zero will autodetect */
|
|
recent.gui_geometry_main_upper_pane = 0;
|
|
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
|
|
|
|
recent.privs_warn_if_elevated = TRUE;
|
|
|
|
/* 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 = eth_fopen(rf_path, "r")) != NULL) {
|
|
/* We succeeded in opening it; read it. */
|
|
read_prefs_file(rf_path, rf, read_set_recent_pair_static, NULL);
|
|
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 = eth_fopen(rf_path, "r")) != NULL) {
|
|
/* We succeeded in opening it; read it. */
|
|
read_prefs_file(rf_path, rf, read_set_recent_pair_dynamic, NULL);
|
|
/* set dfilter combobox to have an empty line */
|
|
dfilter_combo_add_empty();
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
|