Updated splash screen for Wireshark that shows the initialisation progress.

The splash screen shows a progress bar and a percentage complete - like the progress dialog.
As dissectors are initialised and handed off the name is shown. However, the names of plugin dissectors are not shown.
The update to the make-dissector-reg shell script has been tested, though I think generally the python version is used.


svn path=/trunk/; revision=21716
This commit is contained in:
Graeme Lunt 2007-05-07 17:55:42 +00:00
parent a38b44a647
commit cf56e76be9
13 changed files with 274 additions and 49 deletions

View File

@ -88,7 +88,7 @@ main(int argc, char **argv)
by the dissectors, and we must do it before we read the preferences, by the dissectors, and we must do it before we read the preferences,
in case any dissectors register preferences. */ in case any dissectors register preferences. */
epan_init(register_all_protocols, epan_init(register_all_protocols,
register_all_protocol_handoffs, register_all_protocol_handoffs, NULL, NULL,
failure_message, open_failure_message, read_failure_message); failure_message, open_failure_message, read_failure_message);
/* now register the preferences for any non-dissector modules. /* now register the preferences for any non-dissector modules.

View File

@ -68,8 +68,10 @@ epan_get_version(void) {
} }
void void
epan_init(void (*register_all_protocols)(void), epan_init(void (*register_all_protocols)(register_cb cb, gpointer client_data),
void (*register_all_handoffs)(void), void (*register_all_handoffs)(register_cb cb, gpointer client_data),
register_cb cb,
gpointer client_data,
void (*report_failure)(const char *, va_list), void (*report_failure)(const char *, va_list),
void (*report_open_failure)(const char *, int, gboolean), void (*report_open_failure)(const char *, int, gboolean),
void (*report_read_failure)(const char *, int)) void (*report_read_failure)(const char *, int))
@ -94,7 +96,7 @@ epan_init(void (*register_all_protocols)(void),
tvbuff_init(); tvbuff_init();
oid_resolv_init(); oid_resolv_init();
tap_init(); tap_init();
proto_init(register_all_protocols, register_all_handoffs); proto_init(register_all_protocols, register_all_handoffs, cb, client_data);
packet_init(); packet_init();
dfilter_init(); dfilter_init();
final_registration_all_protocols(); final_registration_all_protocols();

View File

@ -27,14 +27,17 @@
#include <glib.h> #include <glib.h>
#include "frame_data.h" #include "frame_data.h"
#include "column_info.h" #include "column_info.h"
#include "register.h"
typedef struct _epan_dissect_t epan_dissect_t; typedef struct _epan_dissect_t epan_dissect_t;
#include "dfilter/dfilter.h" #include "dfilter/dfilter.h"
/* init the whole epan module, this is used to be called only once in a program */ /* init the whole epan module, this is used to be called only once in a program */
void epan_init(void (*register_all_protocols)(void), void epan_init(void (*register_all_protocols)(register_cb cb, gpointer client_data),
void (*register_all_handoffs)(void), void (*register_all_handoffs)(register_cb cb, gpointer client_data),
register_cb cb,
void *client_data,
void (*report_failure)(const char *, va_list), void (*report_failure)(const char *, va_list),
void (*report_open_failure)(const char *, int, gboolean), void (*report_open_failure)(const char *, int, gboolean),
void (*report_read_failure)(const char *, int)); void (*report_read_failure)(const char *, int));

View File

@ -656,6 +656,7 @@ register_all_protocols
register_all_protocol_handoffs register_all_protocol_handoffs
register_ber_syntax_dissector register_ber_syntax_dissector
register_ber_oid_syntax register_ber_oid_syntax
register_count
register_dissector register_dissector
register_dissector_table register_dissector_table
register_final_registration_routine register_final_registration_routine

View File

@ -292,8 +292,10 @@ proto_compare_name(gconstpointer p1_arg, gconstpointer p2_arg)
/* initialize data structures and register protocols and fields */ /* initialize data structures and register protocols and fields */
void void
proto_init(void (register_all_protocols)(void), proto_init(void (register_all_protocols)(register_cb cb, gpointer client_data),
void (register_all_protocol_handoffs)(void)) void (register_all_protocol_handoffs)(register_cb cb, gpointer client_data),
register_cb cb,
gpointer client_data)
{ {
static hf_register_info hf[] = { static hf_register_info hf[] = {
{ &hf_text_only, { &hf_text_only,
@ -330,11 +332,13 @@ proto_init(void (register_all_protocols)(void),
dissector tables, and dissectors to be called through a dissector tables, and dissectors to be called through a
handle, and do whatever one-time initialization it needs to handle, and do whatever one-time initialization it needs to
do. */ do. */
register_all_protocols(); register_all_protocols(cb, client_data);
#ifdef HAVE_PLUGINS #ifdef HAVE_PLUGINS
/* Now scan for plugins and load all the ones we find, calling /* Now scan for plugins and load all the ones we find, calling
their register routines to do the stuff described above. */ their register routines to do the stuff described above. */
if(cb)
(*cb)(RA_PLUGIN_REGISTER, NULL, client_data);
init_plugins(); init_plugins();
#endif #endif
@ -342,10 +346,12 @@ proto_init(void (register_all_protocols)(void),
dissectors; those routines register the dissector in other dissectors; those routines register the dissector in other
dissectors' handoff tables, and fetch any dissector handles dissectors' handoff tables, and fetch any dissector handles
they need. */ they need. */
register_all_protocol_handoffs(); register_all_protocol_handoffs(cb, client_data);
#ifdef HAVE_PLUGINS #ifdef HAVE_PLUGINS
/* Now do the same with plugins. */ /* Now do the same with plugins. */
if(cb)
(*cb)(RA_PLUGIN_HANDOFF, NULL, client_data);
register_all_plugin_handoffs(); register_all_plugin_handoffs();
#endif #endif

View File

@ -50,6 +50,7 @@
#include "nstime.h" #include "nstime.h"
#include "tvbuff.h" #include "tvbuff.h"
#include "ftypes/ftypes.h" #include "ftypes/ftypes.h"
#include "register.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -327,8 +328,10 @@ extern void proto_tree_children_foreach(proto_tree *tree,
#define PTREE_DATA(proto_tree) ((proto_tree)->tree_data) #define PTREE_DATA(proto_tree) ((proto_tree)->tree_data)
/** Sets up memory used by proto routines. Called at program startup */ /** Sets up memory used by proto routines. Called at program startup */
extern void proto_init(void (register_all_protocols)(void), extern void proto_init(void (register_all_protocols)(register_cb cb, gpointer client_data),
void (register_all_handoffs)(void)); void (register_all_handoffs)(register_cb cb, gpointer client_data),
register_cb cb, void *client_data);
/** Frees memory used by proto routines. Called at program shutdown */ /** Frees memory used by proto routines. Called at program shutdown */
extern void proto_cleanup(void); extern void proto_cleanup(void);

View File

@ -79,6 +79,20 @@ about_wireshark(GtkWidget *parent, GtkWidget *main_vb, const char *title)
gtk_container_add(GTK_CONTAINER(main_vb), msg_label); gtk_container_add(GTK_CONTAINER(main_vb), msg_label);
} }
static void
splash_update_label(GtkWidget *win, char *message)
{
GtkWidget *main_lb;
if (win == NULL) return;
main_lb = OBJECT_GET_DATA(win, "splash_label");
gtk_label_set_text(GTK_LABEL(main_lb), message);
/* Process all pending GUI events before continuing, so that
the splash screen window gets updated. */
while (gtk_events_pending()) gtk_main_iteration();
}
GtkWidget* GtkWidget*
splash_new(char *message) splash_new(char *message)
@ -87,6 +101,9 @@ splash_new(char *message)
GtkWidget *main_lb; GtkWidget *main_lb;
GtkWidget *main_vb; GtkWidget *main_vb;
GtkWidget *percentage_hb;
GtkWidget *prog_bar;
GtkWidget *percentage_lb;
win = splash_window_new(); win = splash_window_new();
@ -106,26 +123,128 @@ splash_new(char *message)
gtk_container_add(GTK_CONTAINER(main_vb), main_lb); gtk_container_add(GTK_CONTAINER(main_vb), main_lb);
OBJECT_SET_DATA(win, "splash_label", main_lb); OBJECT_SET_DATA(win, "splash_label", main_lb);
main_lb = gtk_label_new("");
gtk_container_add(GTK_CONTAINER(main_vb), main_lb);
OBJECT_SET_DATA(win, "protocol_label", main_lb);
percentage_hb = gtk_hbox_new(FALSE, 1);
gtk_box_pack_start(GTK_BOX(main_vb), percentage_hb, FALSE, TRUE, 3);
prog_bar = gtk_progress_bar_new();
#if GTK_MAJOR_VERSION < 2
gtk_progress_set_activity_mode(GTK_PROGRESS(prog_bar), FALSE);
#endif
gtk_box_pack_start(GTK_BOX(percentage_hb), prog_bar, FALSE, TRUE, 3);
OBJECT_SET_DATA(win, "progress_bar", prog_bar);
percentage_lb = gtk_label_new(" 0%");
gtk_misc_set_alignment(GTK_MISC(percentage_lb), 0.0, 0.0);
gtk_box_pack_start(GTK_BOX(percentage_hb), percentage_lb, FALSE, TRUE, 3);
OBJECT_SET_DATA(win, "percentage_label", percentage_lb);
gtk_widget_show_all(win); gtk_widget_show_all(win);
splash_update(win, message); splash_update_label(win, message);
return win; return win;
} }
void void
splash_update(GtkWidget *win, char *message) splash_update(register_action_e action, char *message, gpointer client_data)
{ {
GtkWidget *win;
GtkWidget *main_lb; GtkWidget *main_lb;
GtkWidget *prog_bar;
GtkWidget *percentage_lb;
gfloat percentage;
gulong ul_percentage;
gchar tmp[100];
char *action_msg;
static gulong ul_sofar = 0;
static gulong ul_count = 0;
static register_action_e last_action = RA_NONE;
win = (GtkWidget *)client_data;
if (win == NULL) return; if (win == NULL) return;
main_lb = OBJECT_GET_DATA(win, "splash_label"); if(last_action != action) {
gtk_label_set_text(GTK_LABEL(main_lb), message); /* the action has changed */
switch(action) {
case RA_DISSECTORS:
action_msg = "Initializing dissectors ...";
break;
case RA_LISTENERS:
action_msg = "Initializing tap listeners ...";
break;
case RA_REGISTER:
action_msg = "Registering dissector ...";
break;
case RA_PLUGIN_REGISTER:
action_msg = "Registering plugins ...";
break;
case RA_HANDOFF:
action_msg = "Handing off dissector ...";
break;
case RA_PLUGIN_HANDOFF:
action_msg = "Handing off plugins ...";
break;
case RA_PREFERENCES:
action_msg = "Loading module preferences ...";
break;
case RA_CONFIGURATION:
action_msg = "Loading configuration files ...";
break;
default:
action_msg = "(Unknown action)";;
break;
}
splash_update_label(win, action_msg);
last_action = action;
}
if(ul_count == 0) /* get the count of dissectors */
ul_count = register_count() + 6; /* additional 6 for:
dissectors, listeners,
registering plugins, handingoff plugins,
preferences and configuration */
main_lb = OBJECT_GET_DATA(win, "protocol_label");
/* make_dissector_reg.py changed -
so we need to strip off the leading elements to get back to the protocol */
if(message) {
if(!strncmp(message, "proto_register_", 15))
message += 15;
else if(!strncmp(message, "proto_reg_handoff_", 18))
message += 18;
}
gtk_label_set_text(GTK_LABEL(main_lb), message ? message : "");
ul_sofar++;
g_assert (ul_sofar <= ul_count);
percentage = (gfloat)ul_sofar/(gfloat)ul_count;
ul_percentage = (gulong)(percentage * 100);
/* update progress bar */
prog_bar = OBJECT_GET_DATA(win, "progress_bar");
#if GTK_MAJOR_VERSION < 2
gtk_progress_bar_update(GTK_PROGRESS_BAR(prog_bar), percentage);
#else
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(prog_bar), percentage);
#endif
percentage_lb = OBJECT_GET_DATA(win, "percentage_label");
g_snprintf(tmp, sizeof(tmp), "%lu%%", ul_percentage);
gtk_label_set_text((GtkLabel*)percentage_lb, tmp);
/* Process all pending GUI events before continuing, so that /* Process all pending GUI events before continuing, so that
the splash screen window gets updated. */ the splash screen window gets updated. */
while (gtk_events_pending()) gtk_main_iteration(); while (gtk_events_pending()) gtk_main_iteration();
} }
guint guint

View File

@ -37,12 +37,13 @@
*/ */
extern GtkWidget *splash_new(char *message); extern GtkWidget *splash_new(char *message);
/** Update the splash screen message. /** Update the splash screen message when loading dissectors and handoffs
* *
* @param win the window handle from splash_new() * @param action the initialisation action being performed
* @param message the new message to be displayed * @param message additional information
* @param client_data the window handle from splash_new()
*/ */
extern void splash_update(GtkWidget *win, char *message); extern void splash_update(register_action_e action, char *message, void *call_data);
/** Destroy the splash screen. /** Destroy the splash screen.
* *

View File

@ -2386,16 +2386,17 @@ main(int argc, char *argv[])
g_free(init_progfile_dir_error); g_free(init_progfile_dir_error);
} }
splash_update(splash_win, "Init dissectors ..."); splash_update(RA_DISSECTORS, NULL, (gpointer)splash_win);
/* Register all dissectors; we must do this before checking for the /* Register all dissectors; we must do this before checking for the
"-G" flag, as the "-G" flag dumps information registered by the "-G" flag, as the "-G" flag dumps information registered by the
dissectors, and we must do it before we read the preferences, in dissectors, and we must do it before we read the preferences, in
case any dissectors register preferences. */ case any dissectors register preferences. */
epan_init(register_all_protocols,register_all_protocol_handoffs, epan_init(register_all_protocols,register_all_protocol_handoffs,
splash_update, (gpointer) splash_win,
failure_alert_box,open_failure_alert_box,read_failure_alert_box); failure_alert_box,open_failure_alert_box,read_failure_alert_box);
splash_update(splash_win, "Init tap listeners ..."); splash_update(RA_LISTENERS, NULL, (gpointer)splash_win);
/* Register all tap listeners; we do this before we parse the arguments, /* Register all tap listeners; we do this before we parse the arguments,
as the "-z" argument can specify a registered tap. */ as the "-z" argument can specify a registered tap. */
@ -2410,7 +2411,7 @@ main(int argc, char *argv[])
register_all_tap_listeners(); register_all_tap_listeners();
splash_update(splash_win, "Loading module preferences ..."); splash_update(RA_PREFERENCES, NULL, (gpointer)splash_win);
/* Now register the preferences for any non-dissector modules. /* Now register the preferences for any non-dissector modules.
We must do that before we read the preferences as well. */ We must do that before we read the preferences as well. */
@ -2434,7 +2435,7 @@ main(int argc, char *argv[])
gtk_timeout_add(750, (GtkFunction) host_name_lookup_process, NULL); gtk_timeout_add(750, (GtkFunction) host_name_lookup_process, NULL);
#endif #endif
splash_update(splash_win, "Loading configuration files ..."); splash_update(RA_CONFIGURATION, NULL, (gpointer)splash_win);
/* Read the preference files. */ /* Read the preference files. */
prefs = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path, prefs = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
@ -2879,7 +2880,7 @@ main(int argc, char *argv[])
font_init(); font_init();
/* close the splash screen, as we are going to open the main window now */ /* close the splash screen, as we are going to open the main window now */
splash_destroy(splash_win); splash_destroy(splash_win);
/************************************************************************/ /************************************************************************/
/* Everything is prepared now, preferences and command line was read in */ /* Everything is prepared now, preferences and command line was read in */

View File

@ -25,7 +25,24 @@
#ifndef __REGISTER_H__ #ifndef __REGISTER_H__
#define __REGISTER_H__ #define __REGISTER_H__
extern void register_all_protocols(void); #include <glib.h>
extern void register_all_protocol_handoffs(void);
typedef enum {
RA_NONE, /* for initialization */
RA_DISSECTORS, /* Initializing dissectors */
RA_LISTENERS, /* Tap listeners */
RA_REGISTER, /* register */
RA_PLUGIN_REGISTER, /* plugin register */
RA_HANDOFF, /* handoff */
RA_PLUGIN_HANDOFF, /* plugin handoff */
RA_PREFERENCES, /* module preferences */
RA_CONFIGURATION /* configuration files */
} register_action_e;
typedef void (*register_cb)(register_action_e action, char *message, gpointer client_data);
extern void register_all_protocols(register_cb cb, gpointer client_data);
extern void register_all_protocol_handoffs(register_cb cb, gpointer client_data);
extern void register_all_tap_listeners(void); extern void register_all_tap_listeners(void);
extern gulong register_count(void);
#endif /* __REGISTER_H__ */ #endif /* __REGISTER_H__ */

View File

@ -54,15 +54,6 @@ G_MODULE_EXPORT void
plugin_register (void) plugin_register (void)
{ {
EOF EOF
else
cat <<"EOF" >>${outfile}-tmp
#include "register.h"
void
register_all_protocols(void)
{
EOF
fi
# #
# Build code to call all the protocol registration routines. # Build code to call all the protocol registration routines.
# #
@ -86,8 +77,41 @@ do
fi fi
grep '^void proto_register_[a-z_0-9A-Z]* *(' $srcfile 2>/dev/null | grep -v ';' grep '^void proto_register_[a-z_0-9A-Z]* *(' $srcfile 2>/dev/null | grep -v ';'
done | sed -e 's/^.*://' -e 's/^void \([a-z_0-9A-Z]*\).*/ {extern void \1 (void); \1 ();}/' >>${outfile}-tmp done | sed -e 's/^.*://' -e 's/^void \([a-z_0-9A-Z]*\).*/ {extern void \1 (void); \1 ();}/' >>${outfile}-tmp
else
cat <<"EOF" >>${outfile}-tmp
#include "register.h"
void
register_all_protocols(register_cb cb, gpointer client_data)
{
EOF
#
# Build code to call all the protocol registration routines.
#
for f in "$@"
do
if [ -f $f ]
then
srcfile=$f
else
srcfile=$srcdir/$f
fi
grep '^proto_register_[a-z_0-9A-Z]* *(' $srcfile 2>/dev/null | grep -v ';'
done | sed -e 's/^.*://' -e 's/^\([a-z_0-9A-Z]*\).*/ {extern void \1 (void); if(cb) (*cb)(RA_REGISTER, \"\1\", client_data); \1 ();}/' >>${outfile}-tmp
for f in "$@"
do
if [ -f $f ]
then
srcfile=$f
else
srcfile=$srcdir/$f
fi
grep '^void proto_register_[a-z_0-9A-Z]* *(' $srcfile 2>/dev/null | grep -v ';'
done | sed -e 's/^.*://' -e 's/^void \([a-z_0-9A-Z]*\).*/ {extern void \1 (void); if(cb) (*cb)(RA_REGISTER, \"\1\", client_data); \1 ();}/' >>${outfile}-tmp
fi
echo '}' >>${outfile}-tmp echo '}' >>${outfile}-tmp
# #
# Build code to call all the protocol handoff registration routines. # Build code to call all the protocol handoff registration routines.
# #
@ -98,13 +122,6 @@ G_MODULE_EXPORT void
plugin_reg_handoff(void) plugin_reg_handoff(void)
{ {
EOF EOF
else
cat <<"EOF" >>${outfile}-tmp
void
register_all_protocol_handoffs(void)
{
EOF
fi
for f in "$@" for f in "$@"
do do
if [ -f $f ] if [ -f $f ]
@ -125,9 +142,45 @@ do
fi fi
grep '^void proto_reg_handoff_[a-z_0-9A-Z]* *(' $srcfile 2>/dev/null | grep -v ';' grep '^void proto_reg_handoff_[a-z_0-9A-Z]* *(' $srcfile 2>/dev/null | grep -v ';'
done | sed -e 's/^.*://' -e 's/^void \([a-z_0-9A-Z]*\).*/ {extern void \1 (void); \1 ();}/' >>${outfile}-tmp done | sed -e 's/^.*://' -e 's/^void \([a-z_0-9A-Z]*\).*/ {extern void \1 (void); \1 ();}/' >>${outfile}-tmp
else
cat <<"EOF" >>${outfile}-tmp
void
register_all_protocol_handoffs(register_cb cb, gpointer client_data)
{
EOF
for f in "$@"
do
if [ -f $f ]
then
srcfile=$f
else
srcfile=$srcdir/$f
fi
grep '^proto_reg_handoff_[a-z_0-9A-Z]* *(' $srcfile 2>/dev/null | grep -v ';'
done | sed -e 's/^.*://' -e 's/^\([a-z_0-9A-Z]*\).*/ {extern void \1 (void); if(cb) (*cb)(RA_HANDOFF, \"\1\", client_data); \1 ();}/' >>${outfile}-tmp
for f in "$@"
do
if [ -f $f ]
then
srcfile=$f
else
srcfile=$srcdir/$f
fi
grep '^void proto_reg_handoff_[a-z_0-9A-Z]* *(' $srcfile 2>/dev/null | grep -v ';'
done | sed -e 's/^.*://' -e 's/^void \([a-z_0-9A-Z]*\).*/ {extern void \1 (void); if(cb) (*cb)(RA_HANDOFF, \"\1\", client_data); \1 ();}/' >>${outfile}-tmp
fi
echo '}' >>${outfile}-tmp echo '}' >>${outfile}-tmp
if [ "$registertype" = plugin ] if [ "$registertype" = plugin ]
then then
echo '#endif' >>${outfile}-tmp echo '#endif' >>${outfile}-tmp
else
cat <<"EOF" >>${outfile}-tmp
gulong register_count(void)
{
EOF
proto_regs=`grep RA_REGISTER ${outfile}-tmp | wc -l`
handoff_regs=`grep RA_HANDOFF ${outfile}-tmp | wc -l`
echo " return $proto_regs + $handoff_regs;" >>${outfile}-tmp
echo '}' >>${outfile}-tmp
fi fi
mv ${outfile}-tmp ${outfile} mv ${outfile}-tmp ${outfile}

View File

@ -169,12 +169,15 @@ else:
reg_code.write(""" reg_code.write("""
#include "register.h" #include "register.h"
void void
register_all_protocols(void) register_all_protocols(register_cb cb, gpointer client_data)
{ {
"""); """);
for symbol in regs['proto_reg']: for symbol in regs['proto_reg']:
line = " {extern void %s (void); %s ();}\n" % (symbol, symbol) if registertype == "plugin":
line = " {extern void %s (void); %s ();}\n" % (symbol, symbol)
else:
line = " {extern void %s (void); if(cb) (*cb)(RA_REGISTER, \"%s\", client_data); %s ();}\n" % (symbol, symbol, symbol)
reg_code.write(line) reg_code.write(line)
reg_code.write("}\n") reg_code.write("}\n")
@ -190,18 +193,34 @@ plugin_reg_handoff(void)
else: else:
reg_code.write(""" reg_code.write("""
void void
register_all_protocol_handoffs(void) register_all_protocol_handoffs(register_cb cb, gpointer client_data)
{ {
"""); """);
for symbol in regs['handoff_reg']: for symbol in regs['handoff_reg']:
line = " {extern void %s (void); %s ();}\n" % (symbol, symbol) if registertype == "plugin":
line = " {extern void %s (void); %s ();}\n" % (symbol, symbol)
else:
line = " {extern void %s (void); if(cb) (*cb)(RA_HANDOFF, \"%s\", client_data); %s ();}\n" % (symbol, symbol, symbol)
reg_code.write(line) reg_code.write(line)
reg_code.write("}\n") reg_code.write("}\n")
if registertype == "plugin": if registertype == "plugin":
reg_code.write("#endif\n"); reg_code.write("#endif\n");
else:
reg_code.write("""
gulong register_count(void)
{
""");
line = " return %d + %d;\n" % (len(regs['proto_reg']), len(regs['handoff_reg']))
reg_code.write(line)
reg_code.write("""
}
""");
# Close the file # Close the file
reg_code.close() reg_code.close()

View File

@ -786,7 +786,7 @@ main(int argc, char *argv[])
"-G" flag, as the "-G" flag dumps information registered by the "-G" flag, as the "-G" flag dumps information registered by the
dissectors, and we must do it before we read the preferences, in dissectors, and we must do it before we read the preferences, in
case any dissectors register preferences. */ case any dissectors register preferences. */
epan_init(register_all_protocols, register_all_protocol_handoffs, epan_init(register_all_protocols, register_all_protocol_handoffs, NULL, NULL,
failure_message, open_failure_message, read_failure_message); failure_message, open_failure_message, read_failure_message);
/* Register all tap listeners; we do this before we parse the arguments, /* Register all tap listeners; we do this before we parse the arguments,