aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGilbert Ramirez <gram@alumni.rice.edu>1999-04-06 16:24:50 +0000
committerGilbert Ramirez <gram@alumni.rice.edu>1999-04-06 16:24:50 +0000
commit2870ce29ce6b02be8a1e3044e98800d3db45d82c (patch)
treeb0a74c3c123e11753fcf51bd369444a4b42e9c62
parentbad78f629a420ede7fa0ad7929efb343354fb037 (diff)
downloadwireshark-2870ce29ce6b02be8a1e3044e98800d3db45d82c.tar.gz
wireshark-2870ce29ce6b02be8a1e3044e98800d3db45d82c.tar.bz2
wireshark-2870ce29ce6b02be8a1e3044e98800d3db45d82c.zip
Capturing packets from ethereal now saves the capture in an "anonymous" buffer. That is, it's
a random name chosen by tempnam(), unknown to the user. If the user decides to save that trace, he then uses File | Save to save it to a file. File | Save As lets him make a copy of his named trace file as well. I also updated my e-mail address in the various credit locations. svn path=/trunk/; revision=242
-rw-r--r--AUTHORS2
-rw-r--r--capture.c93
-rw-r--r--capture.h4
-rw-r--r--doc/ethereal.pod20
-rw-r--r--ethereal.c155
-rw-r--r--ethereal.h4
-rw-r--r--file.c21
-rw-r--r--file.h7
-rw-r--r--menu.c12
-rw-r--r--packet-ipv6.h25
-rw-r--r--util.c79
-rw-r--r--util.h8
12 files changed, 323 insertions, 107 deletions
diff --git a/AUTHORS b/AUTHORS
index 4a4330dfbe..3cca180a8a 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -5,7 +5,7 @@ Gerald Combs <gerald@zing.org>
Contributors
------------
-Gilbert Ramirez Jr. <gram@verdict.uthscsa.edu> {
+Gilbert Ramirez <gramirez@tivoli.com> {
http://verdict.uthscsa.edu/gram/
Wiretap
diff --git a/capture.c b/capture.c
index 8bbfebda46..4effc25607 100644
--- a/capture.c
+++ b/capture.c
@@ -1,7 +1,7 @@
/* capture.c
* Routines for packet capture windows
*
- * $Id: capture.c,v 1.20 1999/02/11 07:11:45 guy Exp $
+ * $Id: capture.c,v 1.21 1999/04/06 16:24:47 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -36,6 +36,7 @@
#include <pcap.h>
#include <stdlib.h>
+#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
@@ -59,6 +60,7 @@
#include "ethereal.h"
#include "packet.h"
#include "file.h"
+#include "menu.h"
#include "capture.h"
#include "etypes.h"
#include "util.h"
@@ -75,7 +77,6 @@ extern guint file_ctx;
/* Capture callback data keys */
#define E_CAP_IFACE_KEY "cap_iface"
#define E_CAP_FILT_KEY "cap_filter"
-#define E_CAP_FILE_KEY "cap_file"
#define E_CAP_COUNT_KEY "cap_count"
#define E_CAP_OPEN_KEY "cap_open"
#define E_CAP_SNAP_KEY "cap_snap"
@@ -141,10 +142,10 @@ get_interface_list() {
void
capture_prep_cb(GtkWidget *w, gpointer d) {
- GtkWidget *cap_open_w, *if_cb, *if_lb, *file_te, *file_bt,
+ GtkWidget *cap_open_w, *if_cb, *if_lb,
*count_lb, *count_cb, *main_vb, *if_hb, *count_hb,
- *filter_hb, *filter_bt, *filter_te, *file_hb, *caplen_hb,
- *bbox, *ok_bt, *cancel_bt, *capfile_ck, *snap_lb,
+ *filter_hb, *filter_bt, *filter_te, *caplen_hb,
+ *bbox, *ok_bt, *cancel_bt, *snap_lb,
*snap_sb;
GtkAdjustment *adj;
GList *if_list, *count_list = NULL;
@@ -223,35 +224,12 @@ capture_prep_cb(GtkWidget *w, gpointer d) {
gtk_object_set_data(GTK_OBJECT(filter_bt), E_FILT_TE_PTR_KEY, filter_te);
gtk_box_pack_start(GTK_BOX(filter_hb), filter_te, TRUE, TRUE, 0);
gtk_widget_show(filter_te);
-
- /* File row: File: button and text entry */
- file_hb = gtk_hbox_new(FALSE, 3);
- gtk_container_add(GTK_CONTAINER(main_vb), file_hb);
- gtk_widget_show(file_hb);
-
- file_bt = gtk_button_new_with_label("File:");
- gtk_box_pack_start(GTK_BOX(file_hb), file_bt, FALSE, FALSE, 0);
- gtk_widget_show(file_bt);
-
- file_te = gtk_entry_new();
- if (cf.save_file)
- gtk_entry_set_text(GTK_ENTRY(file_te), cf.save_file);
- gtk_box_pack_start(GTK_BOX(file_hb), file_te, TRUE, TRUE, 0);
- gtk_widget_show(file_te);
-
- gtk_signal_connect_object(GTK_OBJECT(file_bt), "clicked",
- GTK_SIGNAL_FUNC(capture_prep_file_cb), GTK_OBJECT(file_te));
/* Misc row: Capture file checkbox and snap spinbutton */
caplen_hb = gtk_hbox_new(FALSE, 3);
gtk_container_add(GTK_CONTAINER(main_vb), caplen_hb);
gtk_widget_show(caplen_hb);
- capfile_ck = gtk_check_button_new_with_label("Open file after capture");
- gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(capfile_ck), TRUE);
- gtk_box_pack_start(GTK_BOX(caplen_hb), capfile_ck, FALSE, FALSE, 3);
- gtk_widget_show(capfile_ck);
-
snap_lb = gtk_label_new("Capture length");
gtk_misc_set_alignment(GTK_MISC(snap_lb), 0, 0.5);
gtk_box_pack_start(GTK_BOX(caplen_hb), snap_lb, FALSE, FALSE, 6);
@@ -290,9 +268,7 @@ capture_prep_cb(GtkWidget *w, gpointer d) {
/* Attach pointers to needed widgets to the capture prefs window/object */
gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_IFACE_KEY, if_cb);
gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_FILT_KEY, filter_te);
- gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_FILE_KEY, file_te);
gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_COUNT_KEY, count_cb);
- gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_OPEN_KEY, capfile_ck);
gtk_object_set_data(GTK_OBJECT(cap_open_w), E_CAP_SNAP_KEY, snap_sb);
gtk_widget_show(cap_open_w);
@@ -340,29 +316,28 @@ cap_prep_fs_cancel_cb(GtkWidget *w, gpointer data) {
void
capture_prep_ok_cb(GtkWidget *w, gpointer data) {
- GtkWidget *if_cb, *filter_te, *file_te, *count_cb, *open_ck, *snap_sb;
- gint open;
+ GtkWidget *if_cb, *filter_te, *count_cb, *snap_sb;
+ gchar *filter_text;
#ifdef GTK_HAVE_FEATURES_1_1_0
data = w;
#endif
if_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_IFACE_KEY);
filter_te = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_FILT_KEY);
- file_te = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_FILE_KEY);
count_cb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_COUNT_KEY);
- open_ck = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_OPEN_KEY);
snap_sb = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(data), E_CAP_SNAP_KEY);
if (cf.iface) g_free(cf.iface);
cf.iface =
g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(if_cb)->entry)));
+
+ filter_text = gtk_entry_get_text(GTK_ENTRY(filter_te));
if (cf.cfilter) g_free(cf.cfilter);
- cf.cfilter = g_strdup(gtk_entry_get_text(GTK_ENTRY(filter_te)));
- if (cf.save_file) g_free(cf.save_file);
- cf.save_file = g_strdup(gtk_entry_get_text(GTK_ENTRY(file_te)));
+ if (filter_text && filter_text[0]) {
+ cf.cfilter = g_strdup(gtk_entry_get_text(GTK_ENTRY(filter_te)));
+ }
cf.count =
atoi(g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(count_cb)->entry))));
- open = GTK_TOGGLE_BUTTON(open_ck)->active;
cf.snap = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb));
if (cf.snap < 1)
cf.snap = MAX_PACKET_SIZE;
@@ -370,8 +345,16 @@ capture_prep_ok_cb(GtkWidget *w, gpointer data) {
cf.snap = MIN_PACKET_SIZE;
gtk_widget_destroy(GTK_WIDGET(data));
+
+ /* Choose a random name for the capture buffer */
+ if (cf.save_file && !cf.user_saved) {
+ unlink(cf.save_file); /* silently ignore error */
+ g_free(cf.save_file);
+ }
+ cf.save_file = tempnam(NULL, "ether");
+ cf.user_saved = 0;
- capture(open);
+ capture();
}
void
@@ -385,7 +368,7 @@ capture_prep_close_cb(GtkWidget *w, gpointer win) {
}
void
-capture(gint open) {
+capture(void) {
GtkWidget *cap_w, *main_vb, *count_lb, *tcp_lb, *udp_lb,
*ospf_lb, *other_lb, *stop_bt;
pcap_t *pch;
@@ -409,17 +392,14 @@ capture(gint open) {
pch = pcap_open_live(cf.iface, cf.snap, 1, 250, err_str);
if (pch) {
- if (cf.save_file[0]) {
- ld.pdh = pcap_dump_open(pch, cf.save_file);
- if (ld.pdh == NULL) { /* We have an error */
- snprintf(err_str, PCAP_ERRBUF_SIZE, "Error trying to open dump "
- "file:\n%s", pcap_geterr(pch));
- simple_dialog(ESD_TYPE_WARN, NULL, err_str);
- g_free(cf.save_file);
- cf.save_file = NULL;
- pcap_close(pch);
- return;
- }
+ ld.pdh = pcap_dump_open(pch, cf.save_file);
+
+ if (ld.pdh == NULL) { /* We have an error */
+ snprintf(err_str, PCAP_ERRBUF_SIZE, "Error trying to save capture to "
+ "file:\n%s", pcap_geterr(pch));
+ simple_dialog(ESD_TYPE_WARN, NULL, err_str);
+ pcap_close(pch);
+ return;
}
ld.linktype = pcap_datalink(pch);
@@ -522,11 +502,16 @@ capture(gint open) {
"The capture session could not be initiated. Please\n"
"check to make sure you have sufficient permissions, and\n"
"that you have the proper interface specified.");
- g_free(cf.save_file);
- cf.save_file = NULL;
}
- if (cf.save_file && open) load_cap_file(cf.save_file, &cf);
+ if (cf.save_file) load_cap_file(cf.save_file, &cf);
+#ifdef USE_ITEM
+ set_menu_sensitivity("/File/Save", TRUE);
+ set_menu_sensitivity("/File/Save as", FALSE);
+#else
+ set_menu_sensitivity("<Main>/File/Save", TRUE);
+ set_menu_sensitivity("<Main>/File/Save as", FALSE);
+#endif
}
float
diff --git a/capture.h b/capture.h
index 747948c3bd..d8db026b22 100644
--- a/capture.h
+++ b/capture.h
@@ -1,7 +1,7 @@
/* capture.h
* Definitions for packet capture windows
*
- * $Id: capture.h,v 1.4 1999/02/09 00:35:35 guy Exp $
+ * $Id: capture.h,v 1.5 1999/04/06 16:24:48 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -41,7 +41,7 @@ void cap_prep_fs_ok_cb(GtkWidget *, gpointer);
void cap_prep_fs_cancel_cb(GtkWidget *, gpointer);
void capture_prep_ok_cb(GtkWidget *, gpointer);
void capture_prep_close_cb(GtkWidget *, gpointer);
-void capture(gint);
+void capture(void);
float pct(gint, gint);
void capture_stop_cb(GtkWidget *, gpointer);
void capture_pcap_cb(u_char *, const struct pcap_pkthdr *, const u_char *);
diff --git a/doc/ethereal.pod b/doc/ethereal.pod
index 7883f63131..84bf091203 100644
--- a/doc/ethereal.pod
+++ b/doc/ethereal.pod
@@ -311,13 +311,19 @@ B<http://ethereal.zing.org>.
Contributors
------------
- Gilbert Ramirez Jr. <gram@verdict.uthscsa.edu>
- Hannes R. Boehm <hannes@boehm.org>
- Mike Hall <mlh@io.com>
- Bobo Rajec <bobo@bsp-consulting.sk>
- Laurent Deniel <deniel@worldnet.fr>
- Don Lafontaine <lafont02@cn.ca>
-
+ Gilbert Ramirez <gramirez@tivoli.com>
+ Hannes R. Boehm <hannes@boehm.org>
+ Mike Hall <mlh@io.com>
+ Bobo Rajec <bobo@bsp-consulting.sk>
+ Laurent Deniel <deniel@worldnet.fr>
+ Don Lafontaine <lafont02@cn.ca>
+ Guy Harris <guy@netapp.com>
+ Simon Wilkinson <sxw@dcs.ed.ac.uk>
+ Joerg Mayer <jmayer@telemation.de>
+ Martin Maciaszek <fastjack@i-s-o.net>
+ Didier Jorand <Didier.Jorand@alcatel.fr>
+ Jun-ichiro itojun Hagino <itojun@iijlab.net>
+ Richard Sharpe <sharpe@ns.aus.com>
Alain Magloire <alainm@rcsm.ece.mcgill.ca> was kind enough to give his
permission to use his version of snprintf.c.
diff --git a/ethereal.c b/ethereal.c
index 03546d5d6b..a2d592c0ee 100644
--- a/ethereal.c
+++ b/ethereal.c
@@ -1,6 +1,6 @@
/* ethereal.c
*
- * $Id: ethereal.c,v 1.28 1999/04/05 21:54:39 guy Exp $
+ * $Id: ethereal.c,v 1.29 1999/04/06 16:24:48 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -32,7 +32,6 @@
* - Playback window
* - Multiple window support
* - Add cut/copy/paste
- * - Handle snoop files
* - Fix progress/status bar glitches? (GTK+ bug?)
* - Create header parsing routines
* - Check fopens, freads, fwrites
@@ -80,6 +79,9 @@
#include "util.h"
#include "gtkpacket.h"
+static void file_save_ok_cb(GtkWidget *w, GtkFileSelection *fs);
+static void file_save_as_ok_cb(GtkWidget *w, GtkFileSelection *fs);
+
FILE *data_out_file = NULL;
packet_info pi;
capture_file cf;
@@ -105,7 +107,8 @@ about_ethereal( GtkWidget *w, gpointer data ) {
"Version %s (C) 1998 Gerald Combs <gerald@zing.org>\n"
"Compiled with %s\n\n"
"Contributors:\n"
- "Gilbert Ramirez Jr. <gram@verdict.uthscsa.edu>\n"
+
+ "Gilbert Ramirez <gramirez@tivoli.com>\n"
"Hannes R. Boehm <hannes@boehm.org>\n"
"Mike Hall <mlh@io.com>\n"
"Bobo Rajec <bobo@bsp-consulting.sk>\n"
@@ -117,8 +120,9 @@ about_ethereal( GtkWidget *w, gpointer data ) {
"Martin Maciaszek <fastjack@i-s-o.net>\n"
"Didier Jorand <Didier.Jorand@alcatel.fr>\n"
"Jun-ichiro itojun Hagino <itojun@iijlab.net>\n"
- "Richard Sharpe <sharpe@ns.aus.com>\n\n"
- "See http://ethereal.zing.org for more information",
+ "Richard Sharpe <sharpe@ns.aus.com>\n"
+
+ "\nSee http://ethereal.zing.org for more information",
VERSION, comp_info_str);
}
@@ -127,23 +131,35 @@ void
file_sel_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
gchar *cf_name;
int err;
+#if 0
GtkWidget *filter_te = NULL;
/* Gilbert --- I added this if statement. Is this right? */
if (w)
filter_te = gtk_object_get_data(GTK_OBJECT(w), E_DFILTER_TE_KEY);
-
+#endif
cf_name = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION (fs)));
gtk_widget_hide(GTK_WIDGET (fs));
gtk_widget_destroy(GTK_WIDGET (fs));
+#if 0
if (w && cf.dfilter) {
g_free(cf.dfilter);
cf.dfilter = g_strdup(gtk_entry_get_text(GTK_ENTRY(filter_te)));
}
+#endif
+ /* this depends upon load_cap_file removing the filename from
+ * cf_name, leaving only the path to the directory. */
if ((err = load_cap_file(cf_name, &cf)) == 0)
chdir(cf_name);
g_free(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
}
/* Update the progress bar */
@@ -295,10 +311,96 @@ file_close_cmd_cb(GtkWidget *widget, gpointer data) {
#endif
}
+void
+file_save_cmd_cb(GtkWidget *w, gpointer data) {
+ file_sel = gtk_file_selection_new ("Ethereal: Save Capture File");
+
+ /* Connect the ok_button to file_ok_sel_cb function and pass along the
+ pointer to the filter entry */
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_sel)->ok_button),
+ "clicked", (GtkSignalFunc) file_save_ok_cb, file_sel );
+
+ /* Connect the cancel_button to destroy the widget */
+ gtk_signal_connect_object(GTK_OBJECT (GTK_FILE_SELECTION
+ (file_sel)->cancel_button), "clicked", (GtkSignalFunc)
+ gtk_widget_destroy, GTK_OBJECT (file_sel));
+
+ gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_sel), "");
+
+ gtk_widget_show(file_sel);
+}
+
+void
+file_save_as_cmd_cb(GtkWidget *w, gpointer data) {
+ file_sel = gtk_file_selection_new ("Ethereal: Save Capture File as");
+
+ /* Connect the ok_button to file_ok_sel_cb function and pass along the
+ pointer to the filter entry */
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_sel)->ok_button),
+ "clicked", (GtkSignalFunc) file_save_as_ok_cb, file_sel );
+
+ /* Connect the cancel_button to destroy the widget */
+ gtk_signal_connect_object(GTK_OBJECT (GTK_FILE_SELECTION
+ (file_sel)->cancel_button), "clicked", (GtkSignalFunc)
+ gtk_widget_destroy, GTK_OBJECT (file_sel));
+
+ gtk_file_selection_set_filename(GTK_FILE_SELECTION(file_sel), "");
+ gtk_widget_show(file_sel);
+}
+
+static void
+file_save_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
+ gchar *cf_name;
+
+ cf_name = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs)));
+ gtk_widget_hide(GTK_WIDGET (fs));
+ gtk_widget_destroy(GTK_WIDGET (fs));
+
+ if (!file_mv(cf.save_file, cf_name))
+ return;
+ g_free(cf.save_file);
+ cf.save_file = g_strdup(cf_name);
+ cf.user_saved = 1;
+ load_cap_file(cf_name, &cf);
+
+#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_save_as_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
+ gchar *cf_name;
+
+ cf_name = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs)));
+ gtk_widget_hide(GTK_WIDGET (fs));
+ gtk_widget_destroy(GTK_WIDGET (fs));
+
+ if (!file_cp(cf.save_file, cf_name))
+ return;
+ g_free(cf.save_file);
+ cf.save_file = g_strdup(cf_name);
+ cf.user_saved = 1;
+ load_cap_file(cf_name, &cf);
+
+#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 */
void
file_reload_cmd_cb(GtkWidget *w, gpointer data) {
- GtkWidget *filter_te = gtk_object_get_data(GTK_OBJECT(w), E_DFILTER_TE_KEY);
+ /*GtkWidget *filter_te = gtk_object_get_data(GTK_OBJECT(w), E_DFILTER_TE_KEY);*/
+ GtkWidget *filter_te;
filter_te = gtk_object_get_data(GTK_OBJECT(w), E_DFILTER_TE_KEY);
@@ -391,12 +493,17 @@ main_realize_cb(GtkWidget *w, gpointer data) {
if (cf_name) {
err = load_cap_file(cf_name, &cf);
cf_name[0] = '\0';
+#ifdef USE_ITEM
+ set_menu_sensitivity("/File/Save as", TRUE);
+#else
+ set_menu_sensitivity("<Main>/File/Save as", TRUE);
+#endif
}
if (start_capture) {
if (cf.save_file)
- capture(1);
+ capture();
else
- capture(0);
+ capture();
start_capture = 0;
}
}
@@ -453,24 +560,23 @@ main(int argc, char *argv[])
prefs = read_prefs();
/* Initialize the capture file struct */
- cf.plist = NULL;
+ cf.plist = NULL;
#ifdef WITH_WIRETAP
- cf.wth = NULL;
+ cf.wth = NULL;
#else
- cf.pfh = NULL;
+ cf.pfh = NULL;
#endif
- cf.fh = NULL;
- cf.dfilter = NULL;
- cf.cfilter = NULL;
- cf.iface = NULL;
- cf.save_file = NULL;
- cf.snap = MIN_PACKET_SIZE;
- cf.count = 0;
- cf.cinfo.num_cols = prefs->num_cols;
- cf.cinfo.fmt_matx = (gboolean **) g_malloc(sizeof(gboolean *) *
- cf.cinfo.num_cols);
- cf.cinfo.col_data = (gchar **) g_malloc(sizeof(gchar *) *
- cf.cinfo.num_cols);
+ cf.fh = NULL;
+ cf.dfilter = NULL;
+ cf.cfilter = NULL;
+ cf.iface = NULL;
+ cf.save_file = NULL;
+ cf.user_saved = 0;
+ cf.snap = MIN_PACKET_SIZE;
+ cf.count = 0;
+ cf.cinfo.num_cols = prefs->num_cols;
+ cf.cinfo.fmt_matx = (gboolean **) g_malloc(sizeof(gboolean *) * cf.cinfo.num_cols);
+ cf.cinfo.col_data = (gchar **) g_malloc(sizeof(gchar *) * cf.cinfo.num_cols);
/* Assemble the compile-time options */
snprintf(comp_info_str, 256,
@@ -749,6 +855,7 @@ main(int argc, char *argv[])
ethereal_proto_init(); /* Init anything that needs initializing */
gtk_widget_show(window);
+
gtk_main();
exit(0);
diff --git a/ethereal.h b/ethereal.h
index a3ddea5812..a5e8956164 100644
--- a/ethereal.h
+++ b/ethereal.h
@@ -1,7 +1,7 @@
/* ethereal.h
* Global defines, etc.
*
- * $Id: ethereal.h,v 1.12 1999/03/23 03:14:33 gram Exp $
+ * $Id: ethereal.h,v 1.13 1999/04/06 16:24:48 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -109,6 +109,8 @@ void blank_packetinfo();
gint file_progress_cb(gpointer);
void follow_stream_cb( GtkWidget *, gpointer);
void file_open_cmd_cb(GtkWidget *, gpointer);
+void file_save_cmd_cb(GtkWidget *, gpointer);
+void file_save_as_cmd_cb(GtkWidget *, gpointer);
void file_close_cmd_cb(GtkWidget *, gpointer);
void file_quit_cmd_cb(GtkWidget *, gpointer);
void file_reload_cmd_cb(GtkWidget *, gpointer);
diff --git a/file.c b/file.c
index 16b4636dc9..e22fff3caa 100644
--- a/file.c
+++ b/file.c
@@ -1,7 +1,7 @@
/* file.c
* File I/O routines
*
- * $Id: file.c,v 1.22 1999/03/23 03:14:34 gram Exp $
+ * $Id: file.c,v 1.23 1999/04/06 16:24:48 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -119,8 +119,8 @@ open_cap_file(char *fname, capture_file *cf) {
#else
cf->cd_t = CD_UNKNOWN;
cf->lnk_t = DLT_NULL;
-#endif
cf->swap = 0;
+#endif
cf->count = 0;
cf->drops = 0;
cf->esec = 0;
@@ -240,6 +240,7 @@ load_cap_file(char *fname, capture_file *cf) {
close_cap_file(cf, info_bar, file_ctx);
+ /* Initialize protocol-speficic variables */
ncp_init_protocol();
if ((name_ptr = (gchar *) strrchr(fname, '/')) == NULL)
@@ -281,11 +282,14 @@ load_cap_file(char *fname, capture_file *cf) {
if (err == 0) {
msg_len = strlen(name_ptr) + strlen(done_fmt) + 64;
load_msg = g_realloc(load_msg, msg_len);
- snprintf(load_msg, msg_len, done_fmt, name_ptr, cf->drops);
+ if (cf->user_saved)
+ snprintf(load_msg, msg_len, done_fmt, name_ptr, cf->drops);
+ else
+ snprintf(load_msg, msg_len, done_fmt, "<none>", cf->drops);
gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg);
g_free(load_msg);
- name_ptr[-1] = '\0';
+/* name_ptr[-1] = '\0'; Why is this here? It causes problems with capture files */
#ifdef USE_ITEM
set_menu_sensitivity("/File/Close", TRUE);
set_menu_sensitivity("/File/Reload", TRUE);
@@ -300,14 +304,17 @@ load_cap_file(char *fname, capture_file *cf) {
gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, load_msg);
g_free(load_msg);
#ifdef USE_ITEM
- set_menu_sensitivity("<Main>/File/Close", FALSE);
- set_menu_sensitivity("<Main>/File/Reload", FALSE);
+ set_menu_sensitivity("/File/Close", FALSE);
+ set_menu_sensitivity("/File/Save", FALSE);
+ set_menu_sensitivity("/File/Save as", FALSE);
+ set_menu_sensitivity("/File/Reload", FALSE);
#else
set_menu_sensitivity("<Main>/File/Close", FALSE);
+ set_menu_sensitivity("<Main>/File/Save", FALSE);
+ set_menu_sensitivity("<Main>/File/Save as", FALSE);
set_menu_sensitivity("<Main>/File/Reload", FALSE);
#endif
}
-
return err;
}
diff --git a/file.h b/file.h
index 92eef4a67a..f41f003fc5 100644
--- a/file.h
+++ b/file.h
@@ -1,7 +1,7 @@
/* file.h
* Definitions for file structures and routines
*
- * $Id: file.h,v 1.11 1999/03/23 03:14:34 gram Exp $
+ * $Id: file.h,v 1.12 1999/04/06 16:24:49 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -61,7 +61,9 @@ typedef struct _capture_file {
FILE *fh; /* Capture file */
gchar *filename; /* filename */
long f_len; /* File length */
+#ifndef WITH_WIRETAP
int swap; /* Swap data bytes? */
+#endif
guint16 cd_t; /* Capture data type */
guint32 vers; /* Version. For tcpdump minor is appended to major */
#ifndef WITH_WIRETAP
@@ -73,7 +75,8 @@ typedef struct _capture_file {
guint32 eusec; /* Elapsed microseconds */
guint32 snap; /* Captured packet length */
gchar *iface; /* Interface */
- gchar *save_file; /* File to write capture data */
+ gchar *save_file; /* File that user saved capture to */
+ gint user_saved;/* Was capture file saved by user yet? */
#ifdef WITH_WIRETAP
wtap *wth; /* Wiretap session */
#else
diff --git a/menu.c b/menu.c
index bf37e8db1a..ab07faa1e4 100644
--- a/menu.c
+++ b/menu.c
@@ -1,7 +1,7 @@
/* menu.c
* Menu routines
*
- * $Id: menu.c,v 1.16 1999/04/05 22:51:43 guy Exp $
+ * $Id: menu.c,v 1.17 1999/04/06 16:24:49 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -62,8 +62,8 @@ static GtkItemFactoryEntry menu_items[] =
{"/_File", NULL, NULL, 0, "<Branch>" },
{"/File/_Open", "<control>O", GTK_MENU_FUNC(file_open_cmd_cb), 0, NULL},
{"/File/_Close", "<control>W", GTK_MENU_FUNC(file_close_cmd_cb), 0, NULL},
- {"/File/_Save", "<control>S", NULL, 0, NULL},
- {"/File/Save _as", NULL, NULL, 0, NULL},
+ {"/File/_Save", "<control>S", GTK_MENU_FUNC(file_save_cmd_cb), 0, NULL},
+ {"/File/Save as", NULL, GTK_MENU_FUNC(file_save_as_cmd_cb), 0, NULL},
{"/File/_Reload", "<control>R", GTK_MENU_FUNC(file_reload_cmd_cb), 0, NULL},
{"/File/<separator>", NULL, NULL, 0, "<Separator>"},
{"/File/_Print Packet", "<control>P", GTK_MENU_FUNC(file_print_cmd_cb), 0, NULL},
@@ -89,8 +89,8 @@ static GtkMenuEntry menu_items[] =
{
{"<Main>/File/Open", "<control>O", file_open_cmd_cb, NULL},
{"<Main>/File/Close", "<control>W", file_close_cmd_cb, NULL},
- {"<Main>/File/Save", "<control>S", NULL, NULL},
- {"<Main>/File/Save as", NULL, NULL, NULL},
+ {"<Main>/File/Save", "<control>S", file_save_cmd_cb, NULL},
+ {"<Main>/File/Save as", NULL, file_save_as_cmd_cb, NULL},
{"<Main>/File/Reload", "<control>R", file_reload_cmd_cb, NULL},
{"<Main>/File/<separator>", NULL, NULL, NULL},
{"<Main>/File/Print Packet", "<control>P", file_print_cmd_cb, NULL},
@@ -167,8 +167,6 @@ menus_init(void) {
#ifdef USE_ITEM
factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", grp);
- /*gtk_item_factory_create_items(factory, nmenu_items, menu_items,
- *NULL);grj*/
gtk_item_factory_create_items_ac(factory, nmenu_items, menu_items, NULL,2);
set_menu_sensitivity("/File/Close", FALSE);
set_menu_sensitivity("/File/Save", FALSE);
diff --git a/packet-ipv6.h b/packet-ipv6.h
index f37465ebad..65fddab696 100644
--- a/packet-ipv6.h
+++ b/packet-ipv6.h
@@ -1,3 +1,28 @@
+/* packet-ipv6.h
+ * Definitions for IPv6 packet disassembly
+ *
+ * $Id: packet-ipv6.h,v 1.3 1999/04/06 16:24:49 gram Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@zing.org>
+ * Copyright 1998 Gerald Combs
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
#ifndef __PACKET_IPV6_H_DEFINED__
#define __PACKET_IPV6_H_DEFINED__
diff --git a/util.c b/util.c
index e3b551d244..4c8277db3c 100644
--- a/util.c
+++ b/util.c
@@ -1,7 +1,7 @@
/* util.c
* Utility routines
*
- * $Id: util.c,v 1.13 1999/04/05 22:51:44 guy Exp $
+ * $Id: util.c,v 1.14 1999/04/06 16:24:49 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -34,6 +34,14 @@
#include <stdarg.h>
#include <stdio.h>
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
#ifdef NEED_SNPRINTF_H
# ifdef HAVE_STDARG_H
# include <stdarg.h>
@@ -166,3 +174,72 @@ simple_dialog_cancel_cb(GtkWidget *w, gpointer win) {
*btn_mask = ESD_BTN_CANCEL;
gtk_widget_destroy(GTK_WIDGET(win));
}
+
+/* Tries to mv a file. If unsuccessful, tries to cp the file.
+ * Returns 0 on failure to do either, 1 on success of either
+ */
+int
+file_mv(char *from, char *to)
+{
+
+#define COPY_BUFFER_SIZE 8192
+
+ int retval;
+
+ /* try a hard link */
+ retval = link(from, to);
+
+ /* or try a copy */
+ if (retval < 0) {
+ retval = file_cp(from, to);
+ if (!retval) {
+ return 0;
+ }
+ }
+
+ unlink(from);
+ return 1;
+}
+
+/* Copies a file.
+ * Returns 0 on failure to do either, 1 on success of either
+ */
+int
+file_cp(char *from, char *to)
+{
+
+#define COPY_BUFFER_SIZE 8192
+
+ int from_fd, to_fd, nread;
+ char *buffer;
+ gint dialogue_button = ESD_BTN_OK;
+
+ buffer = g_malloc(COPY_BUFFER_SIZE);
+
+ from_fd = open(from, O_RDONLY);
+ if (from_fd < 0) {
+ simple_dialog(ESD_TYPE_WARN, &dialogue_button,
+ "Cannot open from-file for copying.");
+ return 0;
+ }
+
+ to_fd = creat(to, 0644);
+ if (to_fd < 0) {
+ simple_dialog(ESD_TYPE_WARN, &dialogue_button,
+ "Cannot open to-file for copying.");
+ close(from_fd);
+ return 0;
+ }
+
+ while( (nread = read(from_fd, buffer, COPY_BUFFER_SIZE)) > 0) {
+ if (write(to_fd, buffer, nread) < nread) {
+ close(from_fd);
+ close(to_fd);
+ return 0;
+ }
+ }
+ close(from_fd);
+ close(to_fd);
+
+ return 1;
+}
diff --git a/util.h b/util.h
index aa351c17e0..69dffb8266 100644
--- a/util.h
+++ b/util.h
@@ -1,7 +1,7 @@
/* util.h
* Utility definitions
*
- * $Id: util.h,v 1.8 1999/03/31 08:20:28 guy Exp $
+ * $Id: util.h,v 1.9 1999/04/06 16:24:50 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -46,6 +46,12 @@ void simple_dialog(gint, gint *, gchar *, ...)
void simple_dialog(gint, gint *, gchar *, ...);
#endif
+/* Moves or copies a file. Returns 0 on failure, 1 on success */
+int file_mv(char *from, char *to);
+
+/* Copies a file. Returns 0 on failure, 1 on success */
+int file_cp(char *from, char *to);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */