/* ethereal.c
*
- * $Id: ethereal.c,v 1.50 1999/07/08 04:23:02 gram Exp $
+ * $Id: ethereal.c,v 1.54 1999/07/13 03:08:04 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
#endif
#include <gtk/gtk.h>
-#include <pcap.h> /* needed for capture.h */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
+#endif
+
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
+
+#ifdef HAVE_DIRECT_H
+#include <direct.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
+#endif
+
#include <signal.h>
#ifdef NEED_SNPRINTF_H
GtkStyle *item_style;
+#ifdef HAVE_LIBPCAP
int sync_mode; /* allow sync */
int sync_pipe[2]; /* used to sync father */
int fork_mode; /* fork a child to do the capture */
int sigusr2_received = 0;
int quit_after_cap; /* Makes a "capture only mode". Implies -k */
+#endif
/* Specifies byte offsets for object selected in tree */
static gint tree_selected_start=-1, tree_selected_len=-1;
cf_name);
}
g_free(cf_name);
-#ifdef USE_ITEM
- set_menu_sensitivity("/File/Save", FALSE);
- set_menu_sensitivity("/File/Save As...", TRUE);
- set_menu_sensitivity("/Tools/Summary", TRUE);
-#else
- set_menu_sensitivity("<Main>/File/Save", FALSE);
- set_menu_sensitivity("<Main>/File/Save As...", TRUE);
- set_menu_sensitivity("<Main>/Tools/Summary", TRUE);
-#endif
+ set_menu_sensitivity("/File/Save", FALSE);
+ set_menu_sensitivity("/File/Save As...", TRUE);
+ set_menu_sensitivity("/Tools/Summary", TRUE);
}
/* Update the progress bar */
(file_sel)->cancel_button), "clicked", (GtkSignalFunc)
gtk_widget_destroy, GTK_OBJECT (file_sel));
+#ifdef HAVE_LIBPCAP
if( fork_mode && (cf.save_file != NULL) )
+#else
+ if( cf.save_file != NULL )
+#endif
gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_sel), cf.save_file);
else
gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_sel), "");
void
file_close_cmd_cb(GtkWidget *widget, gpointer data) {
close_cap_file(&cf, info_bar, file_ctx);
-#ifdef USE_ITEM
set_menu_sensitivity("/File/Close", FALSE);
set_menu_sensitivity("/File/Reload", FALSE);
set_menu_sensitivity("/Tools/Summary", FALSE);
-#else
- set_menu_sensitivity("<Main>/File/Close", FALSE);
- set_menu_sensitivity("<Main>/File/Reload", FALSE);
- set_menu_sensitivity("<Main>/Tools/Summary", FALSE);
-#endif
}
void
file_open_error_message(err, FALSE), cf_name);
}
-#ifdef USE_ITEM
set_menu_sensitivity("/File/Save", FALSE);
set_menu_sensitivity("/File/Save As...", TRUE);
-#else
- set_menu_sensitivity("<Main>/File/Save", FALSE);
- set_menu_sensitivity("<Main>/File/Save As...", TRUE);
-#endif
}
static void
file_open_error_message(err, FALSE), cf_name);
}
-#ifdef USE_ITEM
set_menu_sensitivity("/File/Save", FALSE);
set_menu_sensitivity("/File/Save As...", TRUE);
-#else
- set_menu_sensitivity("<Main>/File/Save", FALSE);
- set_menu_sensitivity("<Main>/File/Save As...", TRUE);
-#endif
}
/* Reload a file using the current display filter */
}
}
+/* Run the current display filter on the current packet set, and
+ redisplay. */
+static void
+filter_activate_cb(GtkWidget *w, gpointer data) {
+ if (cf.dfilter) g_free(cf.dfilter);
+ cf.dfilter = g_strdup(gtk_entry_get_text(GTK_ENTRY(w)));
+ filter_packets(&cf);
+}
+
/* Print a packet */
void
file_print_cmd_cb(GtkWidget *widget, gpointer data) {
void
packet_list_select_cb(GtkWidget *w, gint row, gint col, gpointer evt) {
+#ifdef HAVE_PCAP
if (!sync_mode) {
- if (cf.wth) return;
+#endif
+ if (cf.wth)
+ return;
+#ifdef HAVE_PCAP
}
+#endif
blank_packetinfo();
gtk_text_freeze(GTK_TEXT(byte_view));
gtk_text_set_point(GTK_TEXT(byte_view), 0);
/* Things to do when the main window is realized */
void
main_realize_cb(GtkWidget *w, gpointer data) {
+#ifdef HAVE_LIBPCAP
if (start_capture) {
capture();
start_capture = 0;
}
+#endif
}
+#ifdef HAVE_LIBPCAP
static void
sigusr2_handler(int sig) {
sigusr2_received = 1;
signal(SIGUSR2, sigusr2_handler);
}
+#endif
/* call initialization routines at program startup time */
static void
int
main(int argc, char *argv[])
{
- int opt, i;
+ int i;
+#ifndef WIN32
+ int opt;
extern char *optarg;
+#endif
char *pf_path;
int pf_open_errno = 0;
int err;
GtkWidget *window, *main_vbox, *menubar, *u_pane, *l_pane,
*bv_table, *bv_hscroll, *bv_vscroll, *stat_hbox,
*tv_scrollw, *filter_bt, *filter_te;
-#ifdef GTK_HAVE_FEATURES_1_1_0
GtkAccelGroup *accel;
-#else
- GtkAcceleratorTable *accel;
-#endif
-
-#ifdef GTK_HAVE_FEATURES_1_1_4
GtkWidget *packet_sw;
-#endif
gint pl_size = 280, tv_size = 95, bv_size = 75;
gchar *rc_file, *cf_name = NULL;
e_prefs *prefs;
cf.wth = NULL;
cf.fh = NULL;
cf.dfilter = NULL;
- cf.cfilter = NULL;
cf.dfcode = NULL;
+#ifdef HAVE_LIBPCAP
+ cf.cfilter = NULL;
+#endif
cf.iface = NULL;
cf.save_file = NULL;
cf.user_saved = 0;
/* Assemble the compile-time options */
snprintf(comp_info_str, 256,
#ifdef GTK_MAJOR_VERSION
- "GTK+ %d.%d.%d", GTK_MAJOR_VERSION, GTK_MINOR_VERSION,
- GTK_MICRO_VERSION
+ "GTK+ %d.%d.%d, %s libpcap", GTK_MAJOR_VERSION, GTK_MINOR_VERSION,
+ GTK_MICRO_VERSION,
#else
- "GTK+ (version unknown)"
+ "GTK+ (version unknown), %s libpcap",
+#endif
+
+#ifdef HAVE_LIBPCAP
+ "with"
+#else
+ "without"
#endif
);
+#ifndef WIN32
/* Now get our args */
while ((opt = getopt(argc, argv, "b:B:c:f:Fhi:km:nP:Qr:Ss:t:T:w:v")) != EOF) {
switch (opt) {
case 'c': /* Capture xxx packets */
cf.count = atoi(optarg);
break;
+#ifdef HAVE_LIBPCAP
case 'f':
cf.cfilter = g_strdup(optarg);
break;
case 'F': /* Fork to capture */
fork_mode = 1;
break;
+#endif
case 'h': /* Print help and exit */
print_usage();
exit(0);
case 'n': /* No name resolution */
g_resolving_actif = 0;
break;
+#ifdef HAVE_LIBPCAP
case 'k': /* Start capture immediately */
start_capture = 1;
break;
+#endif
case 'P': /* Packet list pane height */
pl_size = atoi(optarg);
break;
+#ifdef HAVE_LIBPCAP
case 'Q': /* Quit after capture (just capture to file) */
quit_after_cap = 1;
start_capture = 1; /*** -Q implies -k !! ***/
break;
+#endif
case 'r': /* Read capture file xxx */
cf_name = g_strdup(optarg);
break;
+#ifdef HAVE_LIBPCAP
case 's': /* Set the snapshot (capture) length */
cf.snap = atoi(optarg);
break;
sync_mode = 1;
fork_mode = 1; /* -S implies -F */
break;
+#endif
case 't': /* Time stamp type */
if (strcmp(optarg, "r") == 0)
timestamp_type = RELATIVE;
printf("%s %s, with %s\n", PACKAGE, VERSION, comp_info_str);
exit(0);
break;
+#ifdef HAVE_LIBPCAP
case 'w': /* Write capture file xxx */
cf.save_file = g_strdup(optarg);
break;
+#endif
}
}
+#endif
if (start_capture) {
if (cf.iface == NULL) {
}
}
+#ifdef HAVE_LIBPCAP
if (sync_mode)
signal(SIGUSR2, sigusr2_handler);
+#endif
/* Build the column format array */
col_fmt = (gint *) g_malloc(sizeof(gint) * cf.cinfo.num_cols);
/* Menu bar */
get_main_menu(&menubar, &accel);
-#ifdef GTK_HAVE_FEATURES_1_1_0
gtk_window_add_accel_group(GTK_WINDOW(window), accel);
-#else
- gtk_window_add_accelerator_table(GTK_WINDOW(window), accel);
-#endif
gtk_box_pack_start(GTK_BOX(main_vbox), menubar, FALSE, TRUE, 0);
gtk_widget_show(menubar);
packet_list = gtk_clist_new_with_titles(cf.cinfo.num_cols,
cf.cinfo.col_title);
gtk_clist_column_titles_passive(GTK_CLIST(packet_list));
-#ifdef GTK_HAVE_FEATURES_1_1_4
packet_sw = gtk_scrolled_window_new(NULL, NULL);
gtk_widget_show(packet_sw);
gtk_container_add(GTK_CONTAINER(packet_sw), packet_list);
-#endif
pl_style = gtk_style_new();
gdk_font_unref(pl_style->font);
pl_style->font = m_r_font;
GTK_JUSTIFY_RIGHT);
}
gtk_widget_set_usize(packet_list, -1, pl_size);
-#ifdef GTK_HAVE_FEATURES_1_1_4
gtk_paned_add1(GTK_PANED(u_pane), packet_sw);
-#else
- gtk_paned_add1(GTK_PANED(u_pane), packet_list);
-#endif
gtk_widget_show(packet_list);
/* Tree view */
gtk_widget_show(tv_scrollw);
tree_view = gtk_tree_new();
-#ifdef GTK_HAVE_FEATURES_1_1_4
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tv_scrollw),
tree_view);
-#else
- gtk_container_add(GTK_CONTAINER(tv_scrollw), tree_view);
-#endif
gtk_tree_set_selection_mode(GTK_TREE(tree_view), GTK_SELECTION_SINGLE);
gtk_tree_set_view_lines(GTK_TREE(tree_view), FALSE);
gtk_tree_set_view_mode(GTK_TREE(tree_view), TRUE);
filter_te = gtk_entry_new();
gtk_object_set_data(GTK_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
gtk_box_pack_start(GTK_BOX(stat_hbox), filter_te, TRUE, TRUE, 3);
+ gtk_signal_connect(GTK_OBJECT(filter_te), "activate",
+ GTK_SIGNAL_FUNC(filter_activate_cb), (gpointer) NULL);
gtk_widget_show(filter_te);
-#ifdef USE_ITEM
set_menu_object_data("/File/Open...", E_DFILTER_TE_KEY, filter_te);
set_menu_object_data("/File/Reload", E_DFILTER_TE_KEY, filter_te);
set_menu_object_data("/Tools/Follow TCP Stream", E_DFILTER_TE_KEY,
filter_te);
-#else
- set_menu_object_data("<Main>/File/Open...", E_DFILTER_TE_KEY, filter_te);
- set_menu_object_data("<Main>/File/Reload", E_DFILTER_TE_KEY, filter_te);
- set_menu_object_data("<Main>/Tools/Follow TCP Stream", E_DFILTER_TE_KEY,
- filter_te);
-#endif
info_bar = gtk_statusbar_new();
main_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(info_bar), "main");
file_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(info_bar), "file");
cf_name);
}
cf_name[0] = '\0';
-#ifdef USE_ITEM
set_menu_sensitivity("/File/Save As...", TRUE);
set_menu_sensitivity("/Tools/Summary", TRUE);
-#else
- set_menu_sensitivity("<Main>/File/Save As...", TRUE);
- set_menu_sensitivity("<Main>/Tools/Summary", TRUE);
-#endif
}
/* If we failed to open the preferences file, pop up an alert box;