diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
commit | e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch) | |
tree | 68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dfilter/sttype-field.c | |
parent | Initial commit. (diff) | |
download | wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip |
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dfilter/sttype-field.c')
-rw-r--r-- | epan/dfilter/sttype-field.c | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/epan/dfilter/sttype-field.c b/epan/dfilter/sttype-field.c new file mode 100644 index 0000000..8df1c84 --- /dev/null +++ b/epan/dfilter/sttype-field.c @@ -0,0 +1,235 @@ +/* + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 2001 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* The ideas in this code came from Ed Warnicke's original implementation + * of dranges for the old display filter code (Ethereal 0.8.15 and before). + * The code is different, but definitely inspired by his code. + */ + +#include "config.h" + +#include <glib.h> + +#include <epan/proto.h> +#include "sttype-field.h" +#include <wsutil/ws_assert.h> + +typedef struct { + uint32_t magic; + header_field_info *hfinfo; + drange_t *drange; + bool raw; +} field_t; + +#define FIELD_MAGIC 0xfc2002cf + +static void * +field_new(void *hfinfo) +{ + field_t *field; + + field = g_new(field_t, 1); + field->magic = FIELD_MAGIC; + field->hfinfo = hfinfo; + field->drange = NULL; + field->raw = false; + + return field; +} + +static void * +field_dup(gconstpointer data) +{ + const field_t *org = data; + field_t *field; + + ws_assert_magic(org, FIELD_MAGIC); + field = field_new(NULL); + field->hfinfo = org->hfinfo; + field->drange = drange_dup(org->drange); + field->raw = org->raw; + + return field; +} + +static void +field_free(void *data) +{ + field_t *field = data; + ws_assert_magic(field, FIELD_MAGIC); + + if (field->drange) + drange_free(field->drange); + g_free(field); +} + +static char * +field_tostr(const void *data, bool pretty _U_) +{ + const field_t *field = data; + ws_assert_magic(field, FIELD_MAGIC); + wmem_strbuf_t *repr; + char *drange_str = NULL; + + + repr = wmem_strbuf_new(NULL, NULL); + + if (field->raw) { + wmem_strbuf_append_c(repr, '@'); + } + + wmem_strbuf_append(repr, field->hfinfo->abbrev); + + if (field->drange) { + drange_str = drange_tostr(field->drange); + wmem_strbuf_append_printf(repr, "#[%s]", drange_str); + g_free(drange_str); + } + + if (field->raw) { + wmem_strbuf_append(repr, " <FT_BYTES>"); + } + else { + wmem_strbuf_append_printf(repr, " <%s>", + ftype_name(field->hfinfo->type)); + } + + return wmem_strbuf_finalize(repr); +} + +header_field_info * +sttype_field_hfinfo(stnode_t *node) +{ + field_t *field = node->data; + ws_assert_magic(field, FIELD_MAGIC); + return field->hfinfo; +} + +ftenum_t +sttype_field_ftenum(stnode_t *node) +{ + field_t *field = node->data; + ws_assert_magic(field, FIELD_MAGIC); + if (field->raw) + return FT_BYTES; + return field->hfinfo->type; +} + +drange_t * +sttype_field_drange(stnode_t *node) +{ + field_t *field = node->data; + ws_assert_magic(field, FIELD_MAGIC); + return field->drange; +} + +bool +sttype_field_raw(stnode_t *node) +{ + field_t *field = node->data; + ws_assert_magic(field, FIELD_MAGIC); + return field->raw; +} + +drange_t * +sttype_field_drange_steal(stnode_t *node) +{ + field_t *field; + drange_t *dr; + + field = stnode_data(node); + ws_assert_magic(field, FIELD_MAGIC); + dr = field->drange; + field->drange = NULL; + return dr; +} + +/* Set a field */ +void +sttype_field_set_range(stnode_t *node, GSList* drange_list) +{ + field_t *field = stnode_data(node); + ws_assert_magic(field, FIELD_MAGIC); + ws_assert(field->drange == NULL); + field->drange = drange_new_from_list(drange_list); +} + +void +sttype_field_set_range1(stnode_t *node, drange_node *rn) +{ + field_t *field = stnode_data(node); + ws_assert_magic(field, FIELD_MAGIC); + ws_assert(field->drange == NULL); + field->drange = drange_new(rn); +} + +void +sttype_field_set_drange(stnode_t *node, drange_t *dr) +{ + field_t *field = stnode_data(node); + ws_assert_magic(field, FIELD_MAGIC); + ws_assert(field->drange == NULL); + field->drange = dr; +} + +void +sttype_field_set_raw(stnode_t *node, bool raw) +{ + field_t *field = stnode_data(node); + ws_assert_magic(field, FIELD_MAGIC); + field->raw = raw; +} + +char * +sttype_field_set_number(stnode_t *node, const char *number_str) +{ + char *err_msg = NULL; + drange_node *rn = drange_node_from_str(number_str, &err_msg); + if (err_msg != NULL) + return err_msg; + + sttype_field_set_range1(node, rn); + return NULL; +} + +void +sttype_register_field(void) +{ + static sttype_t field_type = { + STTYPE_FIELD, + "FIELD", + field_new, + field_free, + field_dup, + field_tostr + }; + static sttype_t reference_type = { + STTYPE_REFERENCE, + "REFERENCE", + field_new, + field_free, + field_dup, + field_tostr + }; + + sttype_register(&field_type); + sttype_register(&reference_type); +} + +/* + * Editor modelines - https://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 8 + * tab-width: 8 + * indent-tabs-mode: t + * End: + * + * vi: set shiftwidth=8 tabstop=8 noexpandtab: + * :indentSize=8:tabSize=8:noTabs=false: + */ |