Ethereal-dev: [Ethereal-dev] revised patch to enable SIGINT trace stops
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Neil Horman <nhorman@xxxxxxxxxxxxx>
Date: Fri, 12 Sep 2003 08:43:27 -0400
Guy-Hey there! As promised, I revised my patch to allow both a user to press ctrl-c in a window or send a SIGINT to ethereal to stop an in-progress trace. I assumed since I didn't hear back from you that SIGINT was the most appropriate signal to use here (as opposed to SIGUSR2). Anywho, let me know what you think. Thanks!
Neil
Index: capture.c =================================================================== RCS file: /cvsroot/ethereal/capture.c,v retrieving revision 1.208 diff -u -r1.208 capture.c --- capture.c 23 Jul 2003 05:01:15 -0000 1.208 +++ capture.c 12 Sep 2003 12:39:07 -0000 @@ -1,4 +1,4 @@ -/* capture.c +/* CAPTURe.c * Routines for packet capture windows * * $Id: capture.c,v 1.208 2003/07/23 05:01:15 guy Exp $ @@ -247,6 +247,37 @@ int child_process; #endif + +/* + * This needs to be static, so that the SIGUSR1 handler can clear the "go" + * flag. + */ +static loop_data ld; + +/* + *This is the ASCII value of a ctrl-c + */ +#define CTRL_C 0x03 +static void key_press_win(GtkWidget *widget, + GdkEventKey *key, + gpointer callback_data ) +{ + /* + *check to see if the key press event + *is a ctrl-c. If it is, end the capture + */ + if((char)*(key->string) == CTRL_C) + { + ld.go = FALSE; + } +} + + +int capture_in_progress() +{ + return ld.go; +} + /* Add a string pointer to a NULL-terminated array of string pointers. */ static char ** add_arg(char **args, int *argc, char *arg) @@ -1342,12 +1373,6 @@ } #endif -/* - * This needs to be static, so that the SIGUSR1 handler can clear the "go" - * flag. - */ -static loop_data ld; - /* Do the low-level work of a capture. Returns TRUE if it succeeds, FALSE otherwise. */ int @@ -1696,6 +1721,8 @@ main_vb = gtk_vbox_new(FALSE, 1); gtk_container_border_width(GTK_CONTAINER(main_vb), 5); gtk_container_add(GTK_CONTAINER(cap_w), main_vb); + gtk_signal_connect(GTK_OBJECT(cap_w), "key_press_event", + (GtkSignalFunc) key_press_win, NULL ); gtk_widget_show(main_vb); counts_fr = gtk_frame_new("Captured Frames"); @@ -2182,7 +2209,7 @@ } } -static void +void stop_capture(int signo _U_) { ld.go = FALSE; @@ -2209,6 +2236,8 @@ #ifndef _WIN32 if (fork_child != -1) kill(fork_child, SIGUSR1); + else + ld.go = FALSE; #endif } Index: capture.h =================================================================== RCS file: /cvsroot/ethereal/capture.h,v retrieving revision 1.35 diff -u -r1.35 capture.h --- capture.h 15 May 2003 13:33:53 -0000 1.35 +++ capture.h 12 Sep 2003 12:39:07 -0000 @@ -58,6 +58,11 @@ extern int quit_after_cap; /* Makes a "capture only mode". Implies -k */ extern gboolean capture_child; /* if this is the child for "-S" */ +/* + *tell us if we are in the middle of a capture + */ +int caputure_in_progress(); + /* Open a specified file, or create a temporary file, and start a capture to the file in question. */ void do_capture(const char *save_file); @@ -67,6 +72,9 @@ /* Stop a capture from a menu item. */ void capture_stop(void); + +/* Stop a capture from a signal */ +void stop_capture(int signo _U_); /* Terminate the capture child cleanly when exiting. */ void kill_capture_child(void); Index: gtk/main.c =================================================================== RCS file: /cvsroot/ethereal/gtk/main.c,v retrieving revision 1.310 diff -u -r1.310 main.c --- gtk/main.c 10 Sep 2003 05:35:26 -0000 1.310 +++ gtk/main.c 12 Sep 2003 12:39:08 -0000 @@ -43,6 +43,7 @@ #include <string.h> #include <ctype.h> +#include <signal.h> #ifdef HAVE_UNISTD_H #include <unistd.h> @@ -146,6 +147,12 @@ gchar *last_open_dir = NULL; gint root_x = G_MAXINT, root_y = G_MAXINT, top_width, top_height; + +/* + *the cascaded signal handler, if it exists + */ +__sighandler_t cascade; + ts_type timestamp_type = RELATIVE; #if GTK_MAJOR_VERSION < 2 @@ -1483,6 +1490,56 @@ } +/* + *This is the ASCII value of a ctrl-c + */ +#define CTRL_C 0x03 +static void key_press_handler(GtkWidget *widget, + GdkEventKey *key, + gpointer callback_data ) +{ + /* + *check to see if the key press event + *is a ctrl-c. If it is, end the capture + */ + if((char)*(key->string) == CTRL_C) + { + capture_stop(); + } +} + +/* + *Signal handler for SIGINT signal + */ +void sigint_catcher(int sig) +{ + /* + *if we are in the middle of a capture + *this SIGINT was meant to stop the + *capture + */ + if(capture_in_progress() == TRUE) + { + capture_stop(); + } + else + { + /* + *otherwise it was meant to do + *whatever the previous signal handler + *does with it, if anything + */ + if((cascade != SIG_ERR) && + (cascade != SIG_DFL) && + (cascade != SIG_IGN) && + (cascade != NULL)) + { + cascade(sig); + } + } +} + + /* And now our feature presentation... [ fade to music ] */ int main(int argc, char *argv[]) @@ -1659,6 +1716,11 @@ /* Let GTK get its args */ gtk_init (&argc, &argv); + /* + *after we init gtk, we should register to override the SIGINT handler + */ + cascade = signal(SIGINT,sigint_catcher); + /* Read the preference files. */ prefs = read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path, &pf_open_errno, &pf_read_errno, &pf_path); @@ -2663,6 +2725,8 @@ /* Main window */ top_level = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_signal_connect(GTK_OBJECT(top_level), "key_press_event", + (GtkSignalFunc) key_press_handler, NULL ); gtk_widget_set_name(top_level, "main window"); SIGNAL_CONNECT(top_level, "delete_event", main_window_delete_event_cb, NULL);
- Follow-Ups:
- Re: [Ethereal-dev] revised patch to enable SIGINT trace stops
- From: Joerg Mayer
- Re: [Ethereal-dev] revised patch to enable SIGINT trace stops
- Prev by Date: [Ethereal-dev] Update to COPS dissector
- Next by Date: Re: [Ethereal-dev] revised patch to enable SIGINT trace stops
- Previous by thread: Re: [Ethereal-dev] Update to COPS dissector
- Next by thread: Re: [Ethereal-dev] revised patch to enable SIGINT trace stops
- Index(es):