/* * TCPVIEW * * Author: Martin Hunt * Networks and Distributed Computing * Computing & Communications * University of Washington * Administration Building, AG-44 * Seattle, WA 98195 * Internet: martinh@cac.washington.edu * * * Copyright 1992 by the University of Washington * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appears in all copies and that both the * above copyright notice and this permission notice appear in supporting * documentation, and that the name of the University of Washington not be * used in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. This software is made * available "as is", and * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/staff/martinh/tcpview/RCS/dialogs.c,v 1.1 1993/04/22 20:18:20 martinh Exp $ (UW)"; #endif #include #include #include #include #include #include #include #include #include #include #include #include #include "tcpview.h" #include "motif.h" void generic_callback(); static void timea_callback(), timer_callback(), timed_callback(); static void times_callback(), timen_callback(), line_callback(); static void addr1_callback(), addr2_callback(), addr3_callback(), addr4_callback(); static void verbose_callback(), brief_callback(), seq_callback(), dlc_callback(); static Widget bb_widget, text_widget; #ifdef __STDC__ void savefile( char *, Boolean , u_short ); void printfile( char *, Boolean , u_short ); #else void savefile(); void printfile(); #endif extern char FileName1[]; char PrintName[128]; static Boolean SaveAll=False; static u_short Filetype = 0; static Boolean Print2File=False; /* these are temporary flags */ static int nfl, Nfl, qfl, vfl, Sfl, efl, tfl; static u_short Line_Fl, Man_Fl; extern u_long Current_Packets, Packet_Count; static void save_callback( widget, name, call_data ) Widget widget; char *name; caddr_t call_data; { char *string; string = XmTextFieldGetString(text_widget); XtUnrealizeWidget( bb_widget ); savefile( string, SaveAll, Filetype ); SaveAll = False; XtFree(string); } /* save_callback */ static void print_callback( widget, name, call_data ) Widget widget; char *name; caddr_t call_data; { char *filename, str[128]; extern char PrintCommand[]; if( Print2File ) filename = XmTextFieldGetString(text_widget); else filename = tmpnam(NULL); XtUnrealizeWidget( bb_widget ); printfile( filename, SaveAll, Filetype ); if( Print2File == False ) { sprintf( str, "%s %s",PrintCommand, filename ); system( str ); unlink( filename ); } SaveAll = False; XtFree(filename); } /* print_callback */ static void tog_callback( widget, data, call_data ) Widget widget; caddr_t data; caddr_t call_data; { int i = (int)data; switch(i) { case 0: SaveAll = False; break; case 1: SaveAll = True; break; case 2: Filetype = 0; break; case 3: Filetype = 1; break; case 4: if( Print2File==True ) Print2File = False; else Print2File = True; } } /* tog_callback */ static void sumopts_callback( widget, name, call_data ) Widget widget; char *name; caddr_t call_data; { void redisplay_current_list(); XtUnrealizeWidget( bb_widget ); /* set flags with their temporary values */ tflag = tfl; eflag = efl; vflag = vfl; nflag = nfl; Nflag = Nfl; Sflag = Sfl; Line_Flag = Line_Fl; Man_Flag = Man_Fl; /* rescan list and display */ redisplay_current_list(); } static void cancel_callback( widget, name, call_data ) Widget widget; char *name; caddr_t call_data; { XtUnrealizeWidget( bb_widget ); } /* ** SaveDialog() creates the dialog displayed when "Save" ** is selected. */ void SaveDialog (parent, name, callback) Widget parent; char *name; void (*callback)(); { Widget pack_label, main_row, row, ok, cancel, help; Widget frame1, frame2, rc1, rc2, form; Arg args[10]; int n; char buf[30]; n=0; XtSetArg( args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL ); n++; bb_widget = XmCreateBulletinBoardDialog (parent,"save",args,n); n = 0; XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++; main_row = XmCreateRowColumn( bb_widget,"main",args,n); XtManageChild( main_row ); sprintf(buf,"%d packets selected out of %d",Current_Packets,Packet_Count); n=0; pack_label = CreateLabelWidget (main_row,"save_packets",buf,args,n); n = 0; XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++; XtSetArg( args[n], XmNpacking, XmPACK_COLUMN ); n++; row = XmCreateRowColumn( main_row,"row",args,n); XtManageChild( row ); /* make a frame */ n=0; XtSetArg ( args[n], XmNshadowThickness, 4 ); n++; frame1 = XmCreateFrame (row,"frame",args,n); XtManageChild(frame1); /* create a radio box to hold toggle buttons */ rc1 = CreateRadioBox (frame1, "options"); /* create toggles */ (void)CreateSimpleToggle (rc1, "Filtered",!SaveAll,XmONE_OF_MANY, tog_callback,(caddr_t)0); (void)CreateSimpleToggle (rc1,"All",SaveAll,XmONE_OF_MANY, tog_callback,(caddr_t)1); XtManageChild(rc1); /* create another frame */ n=0; XtSetArg ( args[n], XmNshadowThickness, 4 ); n++; frame2 = XmCreateFrame (row,"frame",args,n); XtManageChild(frame2); /* create a radio box to hold toggle buttons */ rc2 = CreateRadioBox (frame2, "options"); /* create toggles */ CreateSimpleToggle (rc2, "Sniffer Format",(Filetype==0)?True:False, XmONE_OF_MANY,tog_callback,(caddr_t)2); CreateSimpleToggle (rc2, "TCPDUMP Format",(Filetype==1)?True:False, XmONE_OF_MANY,tog_callback,(caddr_t)3); XtManageChild(rc2); n=0; (void)CreateLabelWidget (main_row,"","Filename:",args,n); /* make a textfield to hold filename */ n=0; if( *FileName1 ) { XtSetArg ( args[n], XmNvalue, FileName1 ); n++; XtSetArg ( args[n], XmNcursorPosition, strlen(FileName1) ); n++; } text_widget = XmCreateTextField(main_row,"text",args,n); XtManageChild(text_widget); /* create a form to hold OK, Cancel, and Help buttons */ n = 0; form = XtCreateManagedWidget("buttons", xmFormWidgetClass,main_row,args,n); /* create 'OK' pushbutton */ n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 30); n++; ok = CreatePushButton( form, "OK", "OK" ,args, n, save_callback ); /* Set OK button as default */ BulletinDefaultButton( bb_widget, ok ); /* create 'Cancel' pushbutton */ n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 35); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 65); n++; cancel = CreatePushButton( form, "Cancel", "Cancel", args, n, cancel_callback ); /* create 'Help' pushbutton */ n = 0; XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 70); n++; help = CreatePushButton( form, "Help", "Help", args, n, generic_callback ); /* turn off 'Help' pushbutton for now */ XtSetSensitive( help, False ); XtManageChild(form); XtManageChild( bb_widget ); } void SummaryOptionDialog (parent, name, callback) Widget parent; char *name; void (*callback)(); { Widget frame1, frame2, tog_row, main_row, form; Widget rc1, rc2, help, cancel, ok, add_label, col1; int n; Arg args[10]; tfl = tflag; efl = eflag; vfl = vflag; nfl = nflag; Man_Fl = Man_Flag; Nfl = Nflag; Sfl = Sflag; Line_Fl = Line_Flag; n=0; XtSetArg( args[n], XmNautoUnmanage, False ); n++; XtSetArg( args[n], XmNnoResize, True ); n++; XtSetArg( args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL ); n++; bb_widget = XmCreateBulletinBoardDialog (parent,"sumopts",args,n); n = 0; XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++; main_row = XmCreateRowColumn( bb_widget,"main",args,n); XtManageChild( main_row ); n = 0; XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++; XtSetArg( args[n], XmNpacking, XmPACK_COLUMN ); n++; tog_row = XmCreateRowColumn( main_row,"sumopts_row",args,n); XtManageChild( tog_row ); /* make a frame */ n=0; XtSetArg ( args[n], XmNshadowThickness, 4 ); n++; frame1 = XmCreateFrame (tog_row,"frame",args,n); XtManageChild(frame1); n = 0; XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++; col1 = XmCreateRowColumn( frame1,"col1",args,n); n=0; XtSetArg( args[n], XmNalignment, XmALIGNMENT_CENTER ); n++; add_label = CreateLabelWidget (col1,"addopt","ADDRESS OPTIONS",args,n); /* create a radio box to hold toggle buttons */ rc1 = CreateRadioBox (col1, "addroptions"); /* create toggles */ (void)CreateToggle (rc1, "name","Name (from DNS or host table)", nfl?False:True,XmONE_OF_MANY,addr1_callback); (void)CreateToggle (rc1, "numerical","Number (IP or DLC)",nfl, XmONE_OF_MANY,addr2_callback); XtManageChild(rc1); /* create toggles */ (void)CreateSimpleToggle (col1, "Use full domain name", Nfl?False:True,XmN_OF_MANY,addr3_callback,(caddr_t)0); (void)CreateSimpleToggle (col1, "Use manuf. name in DLC addresses",Man_Fl, XmN_OF_MANY,addr4_callback,(caddr_t)0); XtManageChild( col1 ); /* Now do the time options */ /* create another frame */ n=0; XtSetArg ( args[n], XmNshadowThickness, 4 ); n++; frame2 = XmCreateFrame (tog_row,"frame",args,n); XtManageChild(frame2); n = 0; XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++; col1 = XmCreateRowColumn( frame2,"col1",args,n); n=0; XtSetArg( args[n], XmNalignment, XmALIGNMENT_CENTER ); n++; (void)CreateLabelWidget (col1,"timeopt"," TIME OPTIONS",args,n); /* create a rowcolumn to hold toggle buttons */ n = 0; XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++; XtSetArg( args[n], XmNnumColumns, 2 ); n++; rc2 = XmCreateRadioBox( col1,"timecol",args,n); /* create toggles */ (void)CreateSimpleToggle (rc2, "Absolute",tfl==0?True:False, XmONE_OF_MANY,timea_callback,(caddr_t)0); (void)CreateSimpleToggle (rc2, "Delta",tfl==3?True:False, XmONE_OF_MANY,timed_callback,(caddr_t)0); (void)CreateSimpleToggle (rc2, "None", tfl==1?True:False, XmONE_OF_MANY,timen_callback,(caddr_t)0); (void)CreateSimpleToggle (rc2, "Unix Timestamp",tfl==2?True:False, XmONE_OF_MANY,times_callback,(caddr_t)0); (void)CreateSimpleToggle (rc2, "Relative",tfl==4?True:False, XmONE_OF_MANY,timer_callback,(caddr_t)0); XtManageChild(rc2); XtManageChild(col1); /* make a frame */ n=0; XtSetArg ( args[n], XmNshadowThickness, 4 ); n++; frame1 = XmCreateFrame (main_row,"frame",args,n); XtManageChild(frame1); /* put a row-column in frame */ n = 0; XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++; XtSetArg( args[n], XmNpacking, XmPACK_COLUMN ); n++; XtSetArg( args[n], XmNnumColumns, 2 ); n++; col1 = XmCreateRowColumn( frame1,"col1",args,n); /* create toggles */ (void)CreateSimpleToggle (col1, "Verbose",vfl,XmN_OF_MANY,verbose_callback,(caddr_t)0); (void)CreateSimpleToggle (col1, "Brief",qfl,XmN_OF_MANY,brief_callback,(caddr_t)0); (void)CreateSimpleToggle (col1, "Display DLC header",efl,XmN_OF_MANY,dlc_callback,(caddr_t)0); (void)CreateSimpleToggle (col1, "Use relative TCP sequence numbers",!Sfl,XmN_OF_MANY,seq_callback,(caddr_t)0); (void)CreateSimpleToggle (col1, "Display line numbers", Line_Fl,XmN_OF_MANY, line_callback,(caddr_t)0); XtManageChild( col1 ); /* create a form to hold OK, Cancel, and Help buttons */ n = 0; form = XtCreateManagedWidget("buttons", xmFormWidgetClass,main_row,args,n); /* create 'OK' pushbutton */ n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 30); n++; ok = CreatePushButton( form, "OK", "OK",args, n, sumopts_callback ); /* Set OK button as default */ BulletinDefaultButton( bb_widget, ok ); /* create 'Cancel' pushbutton */ n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 35); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 65); n++; cancel = CreatePushButton( form, "Cancel", "Cancel",args, n, cancel_callback ); /* create 'Help' pushbutton */ n = 0; XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 70); n++; help = CreatePushButton( form, "Help", "Help",args, n, generic_callback ); /* turn off 'Help' pushbutton for now */ XtSetSensitive( help, False ); XtManageChild( form ); XtManageChild( bb_widget ); } static void timea_callback( widget, name, x ) Widget widget; char *name; XmToggleButtonCallbackStruct *x; { tfl = 0; } static void timer_callback( widget, name, x ) Widget widget; char *name; XmToggleButtonCallbackStruct *x; { tfl = 4; } static void timed_callback( widget, name, x ) Widget widget; char *name; XmToggleButtonCallbackStruct *x; { tfl = 3; } static void times_callback( widget, name, x ) Widget widget; char *name; XmToggleButtonCallbackStruct *x; { tfl = 2; } static void timen_callback( widget, name, x ) Widget widget; char *name; XmToggleButtonCallbackStruct *x; { tfl = 1; } static void addr1_callback( widget, name, call_data ) Widget widget; char *name; caddr_t call_data; { nfl = 0; } static void addr2_callback( widget, name, call_data ) Widget widget; char *name; caddr_t call_data; { nfl = 1; } static void addr3_callback( widget, name, x ) Widget widget; char *name; XmToggleButtonCallbackStruct *x; { if(Nfl) Nfl = 0; else Nfl = 1; } static void addr4_callback( widget, name, x ) Widget widget; char *name; XmToggleButtonCallbackStruct *x; { if(Man_Fl) Man_Fl = 0; else Man_Fl = 1; } static void verbose_callback( widget, name, call_data ) Widget widget; caddr_t name, call_data; { if(vfl) vfl = 0; else vfl = 1; } static void brief_callback( widget, name, call_data ) Widget widget; caddr_t name, call_data; { if(qfl) qfl = 0; else qfl = 1; } static void dlc_callback( widget, name, call_data ) Widget widget; char *name; caddr_t call_data; { if(efl) efl = 0; else efl = 1; } static void seq_callback( widget, name, call_data ) Widget widget; char *name; caddr_t call_data; { if(Sfl) Sfl = 0; else Sfl = 1; } static void line_callback( widget, name, call_data ) Widget widget; char *name; caddr_t call_data; { if(Line_Fl) Line_Fl = 0; else Line_Fl = 1; } void PrintDialog (parent, name, callback) Widget parent; char *name; void (*callback)(); { Widget pack_label, main_row, row, ok, cancel, help; Widget frame1, frame2, rc1, rc2, form; Arg args[10]; int n; char buf[30]; n=0; XtSetArg( args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL ); n++; bb_widget = XmCreateBulletinBoardDialog (parent,"save",args,n); n = 0; XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++; main_row = XmCreateRowColumn( bb_widget,"main",args,n); XtManageChild( main_row ); sprintf(buf,"%d packets selected out of %d",Current_Packets,Packet_Count); n=0; pack_label = CreateLabelWidget (main_row,"save_packets",buf,args,n); n = 0; XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++; XtSetArg( args[n], XmNpacking, XmPACK_COLUMN ); n++; row = XmCreateRowColumn( main_row,"row",args,n); XtManageChild( row ); /* make a frame */ n=0; XtSetArg ( args[n], XmNshadowThickness, 4 ); n++; frame1 = XmCreateFrame (row,"frame",args,n); XtManageChild(frame1); /* create a radio box to hold toggle buttons */ rc1 = CreateRadioBox (frame1, "options"); /* create toggles */ CreateSimpleToggle (rc1, "Filtered",!SaveAll,XmONE_OF_MANY,tog_callback,(caddr_t)0); CreateSimpleToggle (rc1, "All",SaveAll,XmONE_OF_MANY,tog_callback,(caddr_t)1); XtManageChild(rc1); /* create another frame */ n=0; XtSetArg ( args[n], XmNshadowThickness, 4 ); n++; frame2 = XmCreateFrame (row,"frame",args,n); XtManageChild(frame2); /* create a radiobox to hold toggle buttons */ rc2 = CreateRadioBox (frame2, "options"); Filetype = 0; /* create toggles */ CreateSimpleToggle (rc2, "Summary",!Filetype,XmONE_OF_MANY,tog_callback,(caddr_t)2); CreateSimpleToggle (rc2, "Detail",Filetype,XmONE_OF_MANY,tog_callback,(caddr_t)3); XtManageChild(rc2); n=0; /* pack_label = CreateLabelWidget (main_row,"save_packets","Print to file: ",args,n); */ CreateSimpleToggle(main_row,"Print to File",Print2File, XmN_OF_MANY,tog_callback,(caddr_t)4); /* make a textfield to hold filename */ n=0; if( PrintName[0] != '\0' ) { XtSetArg ( args[n], XmNvalue, PrintName ), n++; XtSetArg ( args[n], XmNcursorPosition, strlen(PrintName) ); n++; } text_widget = XmCreateTextField(main_row,"text",args,n); XtManageChild(text_widget); /* create a form to hold OK, Cancel, and Help buttons */ n = 0; form = XtCreateManagedWidget("buttons",xmFormWidgetClass,main_row,args,n); /* create 'OK' pushbutton */ n = 0; /* XtSetArg( args[n], XmNshowAsDefault, 1 ); n++; */ XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 30); n++; ok = CreatePushButton( form, "OK", "OK" ,args, n, print_callback ); /* Set OK button as default */ BulletinDefaultButton( bb_widget, ok ); /* create 'Cancel' pushbutton */ n = 0; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 35); n++; XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNrightPosition, 65); n++; cancel = CreatePushButton( form, "Cancel", "Cancel", args, n, cancel_callback ); /* create 'Help' pushbutton */ n = 0; XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++; XtSetArg (args[n], XmNleftPosition, 70); n++; help = CreatePushButton( form, "Help", "Help", args, n, generic_callback ); /* turn off 'Help' pushbutton for now */ XtSetSensitive( help, False ); XtManageChild(form); XtManageChild( bb_widget ); } void AboutDialog (parent, name, callback) Widget parent; char *name; void (*callback)(); { extern char tcpview_version[]; char buf[256]; XmString ms, Str2XmString(); int n; Arg a[4]; Widget widget; sprintf(buf,"TCPVIEW version %s\n\nBy Martin M. Hunt\nmartinh@cac.washington.edu\nUniversity of Washington\nNetworks and Distributed Computing",tcpview_version); ms = Str2XmString(buf); n=0; XtSetArg( a[n], XmNmessageString, ms ); n++; widget = XmCreateInformationDialog(parent, "About", a, n ); RemoveDialButton( widget, XmDIALOG_CANCEL_BUTTON ); RemoveDialButton( widget, XmDIALOG_HELP_BUTTON ); XtManageChild(widget); XmStringFree(ms); }