Get rid of TestBigEndian and AC_C_BIGENDIAN.
[metze/wireshark/wip.git] / epan / dissector_filters.c
1 /* dissector_filters.c
2  * Routines for dissector-generated conversation filters for use as
3  * display and color filters
4  *
5  * Wireshark - Network traffic analyzer
6  * By Gerald Combs <gerald@wireshark.org>
7  * Copyright 1998 Gerald Combs
8  *
9  * SPDX-License-Identifier: GPL-2.0-or-later
10  */
11
12 #include "config.h"
13
14 #include <glib.h>
15 #include "packet.h"
16
17 #include "dissector_filters.h"
18
19
20 GList *conv_filter_list = NULL;
21
22
23 void register_conversation_filter(const char *proto_name, const char *display_name,
24                                         is_filter_valid_func is_filter_valid, build_filter_string_func build_filter_string) {
25     conversation_filter_t *entry;
26
27     entry = (conversation_filter_t *)g_malloc(sizeof(conversation_filter_t));
28
29     entry->proto_name           = proto_name;
30     entry->display_name         = display_name;
31     entry->is_filter_valid      = is_filter_valid;
32     entry->build_filter_string  = build_filter_string;
33
34     conv_filter_list = g_list_append(conv_filter_list, entry);
35 }
36
37 struct conversation_filter_s* find_conversation_filter(const char *name)
38 {
39     GList *list_entry = conv_filter_list;
40     conversation_filter_t* filter;
41
42     while (list_entry != NULL) {
43         filter = (conversation_filter_t*)list_entry->data;
44         if (!strcmp(filter->proto_name, name))
45             return filter;
46
47         list_entry = g_list_next(list_entry);
48     }
49
50     return NULL;
51 }
52
53 static void conversation_filter_free(gpointer p, gpointer user_data _U_)
54 {
55     g_free(p);
56 }
57
58 void conversation_filters_cleanup(void)
59 {
60     g_list_foreach(conv_filter_list, conversation_filter_free, NULL);
61     g_list_free(conv_filter_list);
62 }
63
64 gchar *conversation_filter_from_packet(struct _packet_info *pinfo)
65 {
66     const char *layers[] = { "tcp", "udp", "ip", "ipv6", "eth" };
67     conversation_filter_t *conv_filter;
68     gchar *filter;
69     size_t i;
70
71     for (i = 0; i < G_N_ELEMENTS(layers); i++) {
72         conv_filter = find_conversation_filter(layers[i]);
73         if (conv_filter && conv_filter->is_filter_valid(pinfo)) {
74             if ((filter = conv_filter->build_filter_string(pinfo)) != NULL)
75                 return filter;
76         }
77     }
78
79     return NULL;
80 }
81
82 /*
83  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
84  *
85  * Local variables:
86  * c-basic-offset: 4
87  * tab-width: 8
88  * indent-tabs-mode: nil
89  * End:
90  *
91  * vi: set shiftwidth=4 tabstop=8 expandtab:
92  * :indentSize=4:tabSize=8:noTabs=true:
93  */