forked from osmocom/wireshark
Allow a dissector to register preferences that it no longer supports as
obsolete; we silently ignore attempts to set those in a preferences file, so that we don't spam the user with error messages caused by them having saved preferences in an earlier release that contained those preferences. Make the Diameter and iSCSI dissectors register obsolete preferences. Crash if some code tries to register a preferences module with a name that contains something other than lower-case ASCII letters, numbers, or underscores, or that has already been registered, or if some code tries to register a preference with a name that contains something other than lower-case ASCII letters, numbers, underscores, or periods, or that has already been registered, so that we don't put code like that in a release and have to shovel code into "prefs.c" to fix it up later. (The problem with multiple modules or preferences with the same name should be obvious; the problem with names with blanks, or upper-case letters, or punctuation, is that they're a pain to type on the command line.) svn path=/trunk/; revision=4148
This commit is contained in:
parent
52bf3d770f
commit
cc7347ebf6
|
@ -1,6 +1,6 @@
|
|||
/* main.c
|
||||
*
|
||||
* $Id: main.c,v 1.208 2001/10/24 07:18:39 guy Exp $
|
||||
* $Id: main.c,v 1.209 2001/11/04 02:50:21 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -1133,6 +1133,7 @@ main(int argc, char *argv[])
|
|||
break;
|
||||
|
||||
case PREFS_SET_NO_SUCH_PREF:
|
||||
case PREFS_SET_OBSOLETE:
|
||||
fprintf(stderr, "ethereal: -o flag \"%s\" specifies unknown preference\n",
|
||||
optarg);
|
||||
exit(1);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* prefs_dlg.c
|
||||
* Routines for handling preferences
|
||||
*
|
||||
* $Id: prefs_dlg.c,v 1.32 2001/10/24 06:13:07 guy Exp $
|
||||
* $Id: prefs_dlg.c,v 1.33 2001/11/04 02:50:21 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -136,6 +136,7 @@ pref_show(pref_t *pref, gpointer user_data)
|
|||
/* Save the current value of the preference, so that we can revert it if
|
||||
the user does "Apply" and then "Cancel", and create the control for
|
||||
editing the preference. */
|
||||
widget = NULL; /* squelch GCC complaints */
|
||||
switch (pref->type) {
|
||||
|
||||
case PREF_UINT:
|
||||
|
@ -220,7 +221,7 @@ pref_show(pref_t *pref, gpointer user_data)
|
|||
pref->control = widget;
|
||||
break;
|
||||
|
||||
default:
|
||||
case PREF_OBSOLETE:
|
||||
g_assert_not_reached();
|
||||
widget = NULL;
|
||||
break;
|
||||
|
@ -531,6 +532,10 @@ pref_fetch(pref_t *pref, gpointer user_data)
|
|||
*pref->varp.string = g_strdup(str_val);
|
||||
}
|
||||
break;
|
||||
|
||||
case PREF_OBSOLETE:
|
||||
g_assert_not_reached();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -571,6 +576,10 @@ pref_clean(pref_t *pref, gpointer user_data)
|
|||
pref->saved_val.string = NULL;
|
||||
}
|
||||
break;
|
||||
|
||||
case PREF_OBSOLETE:
|
||||
g_assert_not_reached();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -741,6 +750,10 @@ pref_revert(pref_t *pref, gpointer user_data)
|
|||
*pref->varp.string = g_strdup(pref->saved_val.string);
|
||||
}
|
||||
break;
|
||||
|
||||
case PREF_OBSOLETE:
|
||||
g_assert_not_reached();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* packet-diameter.c
|
||||
* Routines for Diameter packet disassembly
|
||||
*
|
||||
* $Id: packet-diameter.c,v 1.32 2001/11/03 23:13:03 guy Exp $
|
||||
* $Id: packet-diameter.c,v 1.33 2001/11/04 02:50:19 guy Exp $
|
||||
*
|
||||
* Copyright (c) 2001 by David Frascone <dave@frascone.com>
|
||||
*
|
||||
|
@ -1801,4 +1801,9 @@ proto_register_diameter(void)
|
|||
"Desegment all Diameter messages spanning multiple TCP segments",
|
||||
"Whether the Diameter dissector should desegment all messages spanning multiple TCP segments",
|
||||
&gbl_diameter_desegment);
|
||||
|
||||
/* Register some preferences we no longer support, so we can report
|
||||
them as obsolete rather than just illegal. */
|
||||
prefs_register_obsolete_preference(diameter_module, "udp.port");
|
||||
prefs_register_obsolete_preference(diameter_module, "command_in_header");
|
||||
} /* proto_register_diameter */
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
*
|
||||
* Conforms to the protocol described in: draft-ietf-ips-iscsi-08.txt
|
||||
*
|
||||
* $Id: packet-iscsi.c,v 1.16 2001/11/04 00:58:23 guy Exp $
|
||||
* $Id: packet-iscsi.c,v 1.17 2001/11/04 02:50:19 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -1767,6 +1767,13 @@ proto_register_iscsi(void)
|
|||
"The size of a data digest (bytes)",
|
||||
10,
|
||||
&dataDigestSize);
|
||||
|
||||
/* Preference supported in older versions.
|
||||
Register them as obsolete. */
|
||||
prefs_register_obsolete_preference(iscsi_module,
|
||||
"version_03_compatible");
|
||||
prefs_register_obsolete_preference(iscsi_module,
|
||||
"bogus_pdu_max_digest_padding");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
12
prefs-int.h
12
prefs-int.h
|
@ -2,12 +2,11 @@
|
|||
* Definitions for implementation of preference handling routines;
|
||||
* used by "friends" of the preferences type.
|
||||
*
|
||||
* $Id: prefs-int.h,v 1.3 2000/11/18 21:41:36 guy Exp $
|
||||
* $Id: prefs-int.h,v 1.4 2001/11/04 02:50:19 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
* 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
|
||||
|
@ -36,11 +35,16 @@ struct pref_module {
|
|||
gboolean prefs_changed; /* if TRUE, a preference has changed since we last checked */
|
||||
};
|
||||
|
||||
/*
|
||||
* PREF_OBSOLETE is used for preferences that a module used to support
|
||||
* but no longer supports; we give different error messages for them.
|
||||
*/
|
||||
typedef enum {
|
||||
PREF_UINT,
|
||||
PREF_BOOL,
|
||||
PREF_ENUM,
|
||||
PREF_STRING
|
||||
PREF_STRING,
|
||||
PREF_OBSOLETE
|
||||
} pref_type_t;
|
||||
|
||||
struct preference {
|
||||
|
|
98
prefs.c
98
prefs.c
|
@ -1,7 +1,7 @@
|
|||
/* prefs.c
|
||||
* Routines for handling preferences
|
||||
*
|
||||
* $Id: prefs.c,v 1.69 2001/11/03 21:37:00 guy Exp $
|
||||
* $Id: prefs.c,v 1.70 2001/11/04 02:50:19 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -53,6 +53,7 @@
|
|||
#include "prefs-int.h"
|
||||
|
||||
/* Internal functions */
|
||||
static module_t *find_module(const char *name);
|
||||
static struct preference *find_preference(module_t *, const char *);
|
||||
static int set_pref(gchar*, gchar*);
|
||||
static GList *get_string_list(gchar *);
|
||||
|
@ -111,6 +112,7 @@ prefs_register_module(const char *name, const char *title,
|
|||
void (*apply_cb)(void))
|
||||
{
|
||||
module_t *module;
|
||||
const guchar *p;
|
||||
|
||||
module = g_malloc(sizeof (module_t));
|
||||
module->name = name;
|
||||
|
@ -120,6 +122,28 @@ prefs_register_module(const char *name, const char *title,
|
|||
module->numprefs = 0;
|
||||
module->prefs_changed = FALSE;
|
||||
|
||||
/*
|
||||
* Make sure that only lower-case ASCII letters, numbers, and
|
||||
* underscores appear in the module name.
|
||||
*
|
||||
* Crash if there is, as that's an error in the code;
|
||||
* you can make the title a nice string with capitalization,
|
||||
* white space, punctuation, etc., but the name can be used
|
||||
* on the command line, and shouldn't require quoting,
|
||||
* shifting, etc.
|
||||
*/
|
||||
for (p = name; *p != '\0'; p++)
|
||||
g_assert(isascii(*p) &&
|
||||
(islower(*p) || isdigit(*p) || *p == '_'));
|
||||
|
||||
/*
|
||||
* Make sure there's not already a module with that
|
||||
* name. Crash if there is, as that's an error in the
|
||||
* code, and the code has to be fixed not to register
|
||||
* more than one module with the same name.
|
||||
*/
|
||||
g_assert(find_module(name) == NULL);
|
||||
|
||||
modules = g_list_insert_sorted(modules, module, module_compare_name);
|
||||
|
||||
return module;
|
||||
|
@ -149,11 +173,11 @@ module_match(gconstpointer a, gconstpointer b)
|
|||
}
|
||||
|
||||
static module_t *
|
||||
find_module(char *name)
|
||||
find_module(const char *name)
|
||||
{
|
||||
GList *list_entry;
|
||||
|
||||
list_entry = g_list_find_custom(modules, name, module_match);
|
||||
list_entry = g_list_find_custom(modules, (gpointer)name, module_match);
|
||||
if (list_entry == NULL)
|
||||
return NULL; /* no such module */
|
||||
return (module_t *) list_entry->data;
|
||||
|
@ -218,6 +242,7 @@ register_preference(module_t *module, const char *name, const char *title,
|
|||
const char *description)
|
||||
{
|
||||
pref_t *preference;
|
||||
const guchar *p;
|
||||
|
||||
preference = g_malloc(sizeof (pref_t));
|
||||
preference->name = name;
|
||||
|
@ -225,6 +250,20 @@ register_preference(module_t *module, const char *name, const char *title,
|
|||
preference->description = description;
|
||||
preference->ordinal = module->numprefs;
|
||||
|
||||
/*
|
||||
* Make sure that only lower-case ASCII letters, numbers,
|
||||
* underscores, and dots appear in the preference name.
|
||||
*
|
||||
* Crash if there is, as that's an error in the code;
|
||||
* you can make the title and description nice strings
|
||||
* with capitalization, white space, punctuation, etc.,
|
||||
* but the name can be used on the command line,
|
||||
* and shouldn't require quoting, Shifting, etc.
|
||||
*/
|
||||
for (p = name; *p != '\0'; p++)
|
||||
g_assert(isascii(*p) &&
|
||||
(islower(*p) || isdigit(*p) || *p == '_' || *p == '.'));
|
||||
|
||||
/*
|
||||
* Make sure there's not already a preference with that
|
||||
* name. Crash if there is, as that's an error in the
|
||||
|
@ -348,6 +387,18 @@ prefs_register_string_preference(module_t *module, const char *name,
|
|||
preference->saved_val.string = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Register a preference that used to be supported but no longer is.
|
||||
*/
|
||||
void
|
||||
prefs_register_obsolete_preference(module_t *module, const char *name)
|
||||
{
|
||||
pref_t *preference;
|
||||
|
||||
preference = register_preference(module, name, NULL, NULL);
|
||||
preference->type = PREF_OBSOLETE;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
pref_cb callback;
|
||||
gpointer user_data;
|
||||
|
@ -359,6 +410,17 @@ do_pref_callback(gpointer data, gpointer user_data)
|
|||
pref_t *pref = data;
|
||||
pref_cb_arg_t *arg = user_data;
|
||||
|
||||
if (pref->type == PREF_OBSOLETE) {
|
||||
/*
|
||||
* This preference is no longer supported; it's not a
|
||||
* real preference, so we don't call the callback for
|
||||
* it (i.e., we treat it as if it weren't found in the
|
||||
* list of preferences, and we weren't called in the
|
||||
* first place).
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
(*arg->callback)(pref, arg->user_data);
|
||||
}
|
||||
|
||||
|
@ -837,6 +899,13 @@ read_prefs_file(const char *pf_path, FILE *pf)
|
|||
g_warning ("%s line %d: No such preference \"%s\"", pf_path,
|
||||
pline, cur_var);
|
||||
break;
|
||||
|
||||
case PREFS_SET_OBSOLETE:
|
||||
/* We silently ignore attempts to set these; it's
|
||||
probably not the user's fault that it's in there -
|
||||
they may have saved preferences with a release that
|
||||
supported them. */
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
g_warning ("%s line %d: Incomplete preference", pf_path, pline);
|
||||
|
@ -898,6 +967,12 @@ read_prefs_file(const char *pf_path, FILE *pf)
|
|||
g_warning ("%s line %d: No such preference \"%s\"", pf_path,
|
||||
pline, cur_var);
|
||||
break;
|
||||
|
||||
case PREFS_SET_OBSOLETE:
|
||||
/* We silently ignore attempts to set these; it's probably not
|
||||
the user's fault that it's in there - they may have saved
|
||||
preferences with a release that supported it. */
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
g_warning ("%s line %d: Incomplete preference", pf_path, pline);
|
||||
|
@ -1355,6 +1430,9 @@ set_pref(gchar *pref_name, gchar *value)
|
|||
*pref->varp.string = g_strdup(value);
|
||||
}
|
||||
break;
|
||||
|
||||
case PREF_OBSOLETE:
|
||||
return PREFS_SET_OBSOLETE; /* no such preference any more */
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1377,6 +1455,16 @@ write_pref(gpointer data, gpointer user_data)
|
|||
const enum_val_t *enum_valp;
|
||||
const char *val_string;
|
||||
|
||||
if (pref->type == PREF_OBSOLETE) {
|
||||
/*
|
||||
* This preference is no longer supported; it's not a
|
||||
* real preference, so we don't write it out (i.e., we
|
||||
* treat it as if it weren't found in the list of
|
||||
* preferences, and we weren't called in the first place).
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
fprintf(arg->pf, "\n# %s\n", pref->description);
|
||||
|
||||
switch (pref->type) {
|
||||
|
@ -1434,6 +1522,10 @@ write_pref(gpointer data, gpointer user_data)
|
|||
fprintf(arg->pf, "%s.%s: %s\n", arg->module->name, pref->name,
|
||||
*pref->varp.string);
|
||||
break;
|
||||
|
||||
case PREF_OBSOLETE:
|
||||
g_assert_not_reached();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
9
prefs.h
9
prefs.h
|
@ -1,7 +1,7 @@
|
|||
/* prefs.h
|
||||
* Definitions for preference handling routines
|
||||
*
|
||||
* $Id: prefs.h,v 1.33 2001/10/31 07:47:25 guy Exp $
|
||||
* $Id: prefs.h,v 1.34 2001/11/04 02:50:19 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -161,6 +161,12 @@ extern void prefs_register_enum_preference(module_t *module, const char *name,
|
|||
extern void prefs_register_string_preference(module_t *module, const char *name,
|
||||
const char *title, const char *description, char **var);
|
||||
|
||||
/*
|
||||
* Register a preference that used to be supported but no longer is.
|
||||
*/
|
||||
extern void prefs_register_obsolete_preference(module_t *module,
|
||||
const char *name);
|
||||
|
||||
typedef void (*pref_cb)(pref_t *pref, gpointer user_data);
|
||||
|
||||
/*
|
||||
|
@ -212,6 +218,7 @@ extern void free_prefs(e_prefs *pr);
|
|||
#define PREFS_SET_OK 0 /* succeeded */
|
||||
#define PREFS_SET_SYNTAX_ERR 1 /* syntax error in string */
|
||||
#define PREFS_SET_NO_SUCH_PREF 2 /* no such preference */
|
||||
#define PREFS_SET_OBSOLETE 3 /* preference used to exist but no longer does */
|
||||
|
||||
extern int prefs_set_pref(char *prefarg);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* tethereal.c
|
||||
*
|
||||
* $Id: tethereal.c,v 1.95 2001/10/26 18:28:16 gram Exp $
|
||||
* $Id: tethereal.c,v 1.96 2001/11/04 02:50:19 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -446,6 +446,7 @@ main(int argc, char *argv[])
|
|||
break;
|
||||
|
||||
case PREFS_SET_NO_SUCH_PREF:
|
||||
case PREFS_SET_OBSOLETE:
|
||||
fprintf(stderr, "tethereal: -o flag \"%s\" specifies unknown preference\n",
|
||||
optarg);
|
||||
exit(1);
|
||||
|
|
Loading…
Reference in New Issue