Update/add some Cisco multicast addresses
[obnox/wireshark/wip.git] / dftest.c
1 /* dftest.c.c
2  *
3  * $Id$
4  *
5  * Ethereal - Network traffic analyzer
6  * By Gerald Combs <gerald@ethereal.com>
7  * Copyright 1998 Gerald Combs
8  *
9  * Shows display filter byte-code, for debugging dfilter routines.
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  */
25
26 #ifdef HAVE_CONFIG_H
27 # include "config.h"
28 #endif
29
30 #include <stdlib.h>
31 #include <stdio.h>
32 #include <locale.h>
33 #include <string.h>
34 #include <errno.h>
35
36 #ifdef NEED_STRERROR_H
37 #include "strerror.h"
38 #endif
39
40 #include <glib.h>
41 #include <epan/epan.h>
42
43 #include <epan/timestamp.h>
44 #include <epan/plugins.h>
45 #include <epan/filesystem.h>
46 #include <epan/privileges.h>
47 #include <epan/prefs.h>
48 #include "util.h"
49 #include "epan/dfilter/dfilter.h"
50 #include "register.h"
51
52 packet_info     pi;
53
54 static void failure_message(const char *msg_format, va_list ap);
55 static void open_failure_message(const char *filename, int err,
56     gboolean for_writing);
57 static void read_failure_message(const char *filename, int err);
58
59 int
60 main(int argc, char **argv)
61 {
62         char            *text;
63         char            *gpf_path, *pf_path;
64         int             gpf_open_errno, gpf_read_errno;
65         int             pf_open_errno, pf_read_errno;
66         e_prefs         *prefs;
67         dfilter_t       *df;
68
69         /*
70          * Get credential information for later use.
71          */
72         get_credential_info();
73
74         timestamp_set_type(TS_RELATIVE);
75
76         /* register all dissectors; we must do this before checking for the
77         "-g" flag, as the "-g" flag dumps a list of fields registered
78         by the dissectors, and we must do it before we read the preferences,
79         in case any dissectors register preferences. */
80         epan_init(PLUGIN_DIR,register_all_protocols,
81                   register_all_protocol_handoffs,
82                   failure_message, open_failure_message, read_failure_message);
83
84         /* now register the preferences for any non-dissector modules.
85         we must do that before we read the preferences as well. */
86         prefs_register_modules();
87
88         /* set the c-language locale to the native environment. */
89         setlocale(LC_ALL, "");
90
91         prefs = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
92             &pf_open_errno, &pf_read_errno, &pf_path);
93         if (gpf_path != NULL) {
94                 if (gpf_open_errno != 0) {
95                         fprintf(stderr,
96                             "can't open global preferences file \"%s\": %s.\n",
97                             pf_path, strerror(gpf_open_errno));
98                 }
99                 if (gpf_read_errno != 0) {
100                         fprintf(stderr,
101                             "I/O error reading global preferences file \"%s\": %s.\n",
102                             pf_path, strerror(gpf_read_errno));
103                 }
104         }
105         if (pf_path != NULL) {
106                 if (pf_open_errno != 0) {
107                         fprintf(stderr,
108                             "can't open your preferences file \"%s\": %s.\n",
109                             pf_path, strerror(pf_open_errno));
110                 }
111                 if (pf_read_errno != 0) {
112                         fprintf(stderr,
113                             "I/O error reading your preferences file \"%s\": %s.\n",
114                             pf_path, strerror(pf_read_errno));
115                 }
116         }
117
118         /* notify all registered modules that have had any of their preferences
119         changed either from one of the preferences file or from the command
120         line that its preferences have changed. */
121         prefs_apply_all();
122
123         /* Check for filter on command line */
124         if (argc <= 1) {
125                 fprintf(stderr, "Usage: dftest filter\n");
126                 exit(1);
127         }
128
129         /* Get filter text */
130         text = get_args_as_string(argc, argv, 1);
131
132         printf("Filter: \"%s\"\n", text);
133
134         /* Compile it */
135         if (!dfilter_compile(text, &df)) {
136                 fprintf(stderr, "dftest: %s\n", dfilter_error_msg);
137                 epan_cleanup();
138                 exit(2);
139         }
140         printf("dfilter ptr = 0x%08x\n", GPOINTER_TO_INT(df));
141
142         printf("\n\n");
143
144         dfilter_dump(df);
145
146         epan_cleanup();
147         exit(0);
148 }
149
150 /*
151  * General errors are reported with an console message in "dftest".
152  */
153 static void
154 failure_message(const char *msg_format, va_list ap)
155 {
156         fprintf(stderr, "dftest: ");
157         vfprintf(stderr, msg_format, ap);
158         fprintf(stderr, "\n");
159 }
160
161 /*
162  * Open/create errors are reported with an console message in "dftest".
163  */
164 static void
165 open_failure_message(const char *filename, int err, gboolean for_writing)
166 {
167         fprintf(stderr, "dftest: ");
168         fprintf(stderr, file_open_error_message(err, for_writing), filename);
169         fprintf(stderr, "\n");
170 }
171
172 /*
173  * Read errors are reported with an console message in "dftest".
174  */
175 static void
176 read_failure_message(const char *filename, int err)
177 {
178         fprintf(stderr, "dftest: An error occurred while reading from the file \"%s\": %s.\n",
179             filename, strerror(err));
180 }