Ethereal-dev: [Ethereal-dev] Packet Comparision
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: suid <suid@xxxxxxxxxxxxxxxxxx>
Date: Sun, 3 Mar 2002 01:59:04 +0000 (GMT)
Godday. Attached to this letter is a simple (yet working) code to compare two packets to eachother. This is just a simple draft, missing things like modifing colors, saving and printing. It currently works by letting the user mark the two frames he/she wants to compare, and then uses some simple coloring to show the differences. Hope you like it. -s
Index: gtk/menu.c
===================================================================
RCS file: /cvsroot/ethereal/gtk/menu.c,v
retrieving revision 1.62
diff -u -r1.62 gtk/menu.c
--- gtk/menu.c 2002/01/21 07:37:41 1.62
+++ gtk/menu.c 2002/03/03 00:43:05
@@ -45,6 +45,7 @@
#include "prefs.h"
#include "capture_dlg.h"
#include "color_dlg.h"
+#include "compare_pkts_dlg.h"
#include "file_dlg.h"
#include "filter_prefs.h"
#include "find_dlg.h"
@@ -174,6 +175,7 @@
{"/_Tools/TCP Stream Analysis/RTT Graph", NULL, GTK_MENU_FUNC (tcp_graph_cb), 3, NULL},
{"/Tools/_Summary", NULL, GTK_MENU_FUNC(summary_open_cb), 0, NULL},
{"/Tools/Protocol Hierarchy Statistics", NULL, GTK_MENU_FUNC(proto_hier_stats_cb), 0, NULL},
+ {"/Tools/_Compare Packets", NULL, GTK_MENU_FUNC(compare_pkts_cb), 0, NULL},
{"/_Help", NULL, NULL, 0, "<LastBranch>" },
{"/Help/_Help", NULL, GTK_MENU_FUNC(help_cb), 0, NULL},
{"/Help/<separator>", NULL, NULL, 0, "<Separator>"},
@@ -469,6 +471,7 @@
set_menu_sensitivity("/Display/Colorize Display...", have_captured_packets);
set_menu_sensitivity("/Tools/Summary", have_captured_packets);
set_menu_sensitivity("/Tools/Protocol Hierarchy Statistics", have_captured_packets);
+ set_menu_sensitivity("/Tools/Compare Packets", have_captured_packets);
set_menu_sensitivity("<PacketList>/Display/Match", have_captured_packets);
set_menu_sensitivity("<PacketList>/Display/Prepare", have_captured_packets);
}
Index: gtk/Makefile.am =================================================================== RCS file: /cvsroot/ethereal/gtk/Makefile.am,v retrieving revision 1.38 diff -u -r1.38 gtk/Makefile.am --- gtk/Makefile.am 2002/01/13 20:35:11 1.38 +++ gtk/Makefile.am 2002/03/03 00:42:38 @@ -41,6 +41,8 @@ color_utils.h \ column_prefs.c \ column_prefs.h \ + compare_pkts_dlg.c \ + compare_pkts_dlg.h \ decode_as_dlg.c \ decode_as_dlg.h \ dfilter_expr_dlg.c \
#ifndef __COMPARE_PKTS_DLG_H #define __COMPARE_PKTS_DLG_H void compare_pkts_cb(GtkWidget *widget, gpointer data); #endif
/*
compare_pkts_dlg.c
suid 2002
Compares two packets using neat colors.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#include <ctype.h>
#include "main.h"
#include <epan/packet.h>
#include "util.h"
#include "menu.h"
#include "colors.h"
#include "prefs.h"
#include "ui_util.h"
#include "gtkglobals.h"
#include "globals.h"
#include "color_utils.h"
#include "file.h"
#include "compare_pkts_dlg.h"
#include "dlg_utils.h"
#include "simple_dialog.h"
/* global variables */
GtkWidget *file_selection=NULL;
GtkWidget *text_box;
void compare_frames( frame_data *frame_1, frame_data *frame_2, gint startpos){
gint32 size_ar[2];
GdkColormap *colormap;
GdkColor color_diff;
GdkColor color_add;
gchar i, j;
gint pos = 0;
guchar buf[64];
guint8 *buf1;
guint8 *buf2;
frame_data *temp_frame;
temp_frame = cfile.current_frame;
/* setup buffers and arrays */
cfile.current_frame = frame_1;
buf1 = (guint8*)g_malloc( frame_1->cap_len * sizeof(guint8) );
buf2 = (guint8*)g_malloc( frame_2->cap_len * sizeof(guint8) );
size_ar[0] = frame_1->cap_len - 1;
size_ar[1] = frame_2->cap_len - 1;
/* read and save the first packet */
wtap_seek_read(cfile.wth, frame_1->file_off, &cfile.pseudo_header,
cfile.pd, frame_1->cap_len);
memcpy(buf1,cfile.pd,frame_1->cap_len);
cfile.current_frame = frame_2;
/* read and save the second packet */
wtap_seek_read(cfile.wth, frame_2->file_off, &cfile.pseudo_header,
cfile.pd, frame_2->cap_len);
memcpy(buf2,cfile.pd,frame_2->cap_len);
/* now reread the old frame that was selected */
if( temp_frame->num != frame_2->num ){
cfile.current_frame = temp_frame;
wtap_seek_read(cfile.wth, temp_frame->file_off, &cfile.pseudo_header,
cfile.pd, temp_frame->cap_len);
}
/* create some colors for the textbox */
colormap = gdk_colormap_get_system();
color_diff.red = 0xffff; color_diff.green = 0; color_diff.blue = 0;
if( !gdk_color_alloc(colormap,&color_diff)){
g_error("Cannot allocate color!\n");
}
color_add.red = 0; color_add.green = 0; color_add.blue = 0xffff;
if( !gdk_color_alloc(colormap,&color_add)){
g_error("Cannot allocate color!\n");
}
/* add a simple header */
sprintf(buf,"Packet %.4d Packet %.4d\n",frame_1->num, frame_2->num);
gtk_text_insert( GTK_TEXT(text_box), m_r_font, NULL, NULL, buf, -1);
while( pos < size_ar[0] || pos < size_ar[1]){
sprintf(buf,"%.4x ",pos);
gtk_text_insert( GTK_TEXT(text_box), m_r_font, NULL, NULL, buf, -1);
for(i=0;i<4;i++){
if( pos >= size_ar[i>>1] )
j = 0;
else
for( j=0; j<8; j++ ){
switch(i){
case 0:
sprintf(buf,"%.2x ", buf1[pos] & 0xff); break;
case 1:
sprintf(buf,"%c", isprint(buf1[pos]) ? buf1[pos] : '.'); break;
case 2:
sprintf(buf,"%.2x ", buf2[pos] & 0xff); break;
case 3:
sprintf(buf,"%c", isprint(buf2[pos]) ? buf2[pos] : '.'); break;
}
if( size_ar[((i+2)&2)>>1] < pos ){
gtk_text_insert( GTK_TEXT(text_box),
m_r_font, &color_add, NULL, buf, -1);
}else if( buf1[pos] != buf2[pos] ){
gtk_text_insert( GTK_TEXT(text_box),
m_r_font, &color_diff, NULL, buf, -1);
}else{
gtk_text_insert( GTK_TEXT(text_box),
m_r_font, NULL, NULL, buf, -1);
}
if( pos >= size_ar[i>>1] ){
break;
}
pos++;
}
if( i == 0 || i == 2 ){
buf[0] = ' '; buf[1] = ' '; buf[2] = ' '; buf[3] = '\0';
pos -= j;
if( !j ) j--;
if( j < 7 )
for(;j<7;j++)
strcat(buf," ");
}else if( i == 1 ){
buf[0] = ' '; buf[1] = ' '; buf[2] = ' '; buf[3] = '\0';
pos -= j;
if( !j ) j--;
if( j < 7 )
for(;j<7;j++)
strcat(buf," ");
}else if( i == 3){
pos += (8-j);
buf[0] = '\n'; buf[1] = '\0';
}
gtk_text_insert( GTK_TEXT(text_box),
m_r_font, NULL, NULL, buf, -1);
}
}
/* free the buffers */
g_free(buf1);
g_free(buf2);
}
gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data){
return(FALSE);
}
void compare_pkts_cb(GtkWidget *widget, gpointer data){
GtkWidget *compare_win, *scroll_win;
GtkWidget *vbox = NULL,*hbox = NULL;
GtkWidget *button = NULL;
frame_data *frame1 = NULL, *frame2 = NULL;
/* this should not happen ! */
if( !cfile.count ){
simple_dialog(ESD_TYPE_CRIT, NULL,
"You have no captured packets!");
return;
}
if( cfile.marked_count == 2 ){ /* we have 2 marked entries, so */
/* we'll compare those */
/* find the first frame */
for(frame1 = cfile.plist; frame1 != NULL && !frame1->flags.marked ; frame1 = frame1->next)
;
/* find the second frame */
if( frame1 != NULL )
for( frame2 = frame1->next; frame2 != NULL && !frame2->flags.marked ; frame2 = frame2->next)
;
/* this should NEVER happen */
if( frame1 == NULL || frame2 == NULL ){
simple_dialog(ESD_TYPE_CRIT, NULL,
"Corrupt capture! Try restarting ethereal!");
gtk_widget_destroy(compare_win);
return;
}
}else{
simple_dialog(ESD_TYPE_INFO, NULL,
"You must mark two packets to compare.");
return;
}
compare_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_name(compare_win, "Packet Comparision Window");
gtk_signal_connect(GTK_OBJECT(compare_win), "destroy",
GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(compare_win));
gtk_widget_set_usize(GTK_WIDGET(compare_win), DEF_WIDTH, DEF_HEIGHT);
gtk_container_set_border_width( GTK_CONTAINER(compare_win), 5);
/* create a vbox... */
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_add(GTK_CONTAINER(compare_win),vbox);
/* create a scroll-win */
scroll_win = scrolled_window_new(NULL, NULL);
gtk_box_pack_start( GTK_BOX(vbox), scroll_win, TRUE, TRUE, FALSE);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_win),
GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
/* create a text-box */
text_box = gtk_text_new( NULL, NULL);
gtk_container_add( GTK_CONTAINER(scroll_win), text_box );
/* pack the stuff into a hbox and show them */
gtk_widget_show(text_box);
gtk_widget_show(scroll_win);
/* create a hbox for the button */
hbox = gtk_hbox_new(FALSE,5);
gtk_box_pack_start( GTK_BOX(vbox), GTK_WIDGET(hbox), FALSE, FALSE, FALSE);
/* create a 'Close' button */
button = gtk_button_new_with_label("Close");
gtk_signal_connect_object( GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(compare_win));
gtk_widget_set_usize(GTK_WIDGET(button), 80, 20);
gtk_widget_show(button);
gtk_box_pack_end( GTK_BOX(hbox), GTK_WIDGET(button), FALSE, FALSE, FALSE);
gtk_widget_show(vbox);
gtk_widget_show(hbox);
gtk_widget_show(compare_win);
compare_frames( frame1, frame2, 0);
}
- Prev by Date: Re: [Ethereal-dev] Re: Plugins.c
- Next by Date: [Ethereal-dev] Windows UI
- Previous by thread: Re: [Ethereal-dev] Plugins.c
- Next by thread: [Ethereal-dev] Windows UI
- Index(es):





