Since ethereal is now dependent on GTK+-1.2.x (because of proto_tree and
[obnox/wireshark/wip.git] / ethereal.c
index d4f498f116cfe22cd41a24dc9cc1194502af92a8..8348c72fddaacff1d8244bdbf5054e6fd3b81935 100644 (file)
@@ -1,6 +1,6 @@
 /* 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
@@ -111,11 +122,13 @@ ts_type timestamp_type = RELATIVE;
 
 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; 
@@ -175,15 +188,9 @@ file_sel_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
                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 */
@@ -399,7 +406,11 @@ file_open_cmd_cb(GtkWidget *w, gpointer data) {
     (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), "");
@@ -411,15 +422,9 @@ file_open_cmd_cb(GtkWidget *w, gpointer data) {
 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
@@ -479,13 +484,8 @@ file_save_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
                    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
@@ -508,13 +508,8 @@ file_save_as_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
                    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 */
@@ -535,6 +530,15 @@ file_reload_cmd_cb(GtkWidget *w, gpointer data) {
   }
 }
 
+/* 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) {
@@ -545,9 +549,14 @@ 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);
@@ -627,17 +636,21 @@ void blank_packetinfo() {
 /* 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
@@ -663,23 +676,19 @@ print_usage(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;
@@ -704,8 +713,10 @@ main(int argc, char *argv[])
   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;
@@ -720,13 +731,20 @@ main(int argc, char *argv[])
   /* 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) {
@@ -739,12 +757,14 @@ main(int argc, char *argv[])
       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);
@@ -758,19 +778,24 @@ main(int argc, char *argv[])
       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;
@@ -778,6 +803,7 @@ main(int argc, char *argv[])
         sync_mode = 1;
         fork_mode = 1; /* -S implies -F */
         break;
+#endif
       case 't':        /* Time stamp type */
         if (strcmp(optarg, "r") == 0)
           timestamp_type = RELATIVE;
@@ -800,11 +826,14 @@ main(int argc, char *argv[])
         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) {
@@ -817,8 +846,10 @@ main(int argc, char *argv[])
     }
   }
 
+#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);
@@ -873,11 +904,7 @@ main(int argc, char *argv[])
 
   /* 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);
 
@@ -895,11 +922,9 @@ main(int argc, char *argv[])
   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;
@@ -917,11 +942,7 @@ main(int argc, char *argv[])
         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 */
@@ -933,12 +954,8 @@ main(int argc, char *argv[])
   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);
@@ -992,19 +1009,14 @@ main(int argc, char *argv[])
   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");
@@ -1033,13 +1045,8 @@ main(int argc, char *argv[])
                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;