diff --git a/capture_opts.c b/capture_opts.c index 08f023e705..6c451458a1 100644 --- a/capture_opts.c +++ b/capture_opts.c @@ -48,7 +48,7 @@ #include -static gboolean capture_opts_output_to_pipe(const char *save_file); +static gboolean capture_opts_output_to_pipe(const char *save_file, gboolean *is_pipe); void @@ -292,7 +292,7 @@ get_pipe_arguments(capture_options *capture_opts, const char *arg) #endif -void +static int capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg) { long adapter_index; @@ -316,16 +316,16 @@ capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg) if (p != NULL && *p == '\0') { if (adapter_index < 0) { cmdarg_err("The specified adapter index is a negative number"); - exit(1); + return 1; } if (adapter_index > INT_MAX) { cmdarg_err("The specified adapter index is too large (greater than %d)", INT_MAX); - exit(1); + return 1; } if (adapter_index == 0) { cmdarg_err("there is no interface with that adapter index"); - exit(1); + return 1; } if_list = get_interface_list(&err, err_str); if (if_list == NULL) { @@ -342,35 +342,39 @@ capture_opts_add_iface_opt(capture_options *capture_opts, const char *optarg) cmdarg_err("There are no interfaces on which a capture can be done"); break; } - exit(2); + return 2; } if_info = g_list_nth_data(if_list, adapter_index - 1); if (if_info == NULL) { cmdarg_err("there is no interface with that adapter index"); - exit(1); + return 1; } capture_opts->iface = g_strdup(if_info->name); free_interface_list(if_list); } else { capture_opts->iface = g_strdup(optarg); } + + return 0; } -void +int capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg, gboolean *start_capture) { + int status; + switch(opt) { case 'a': /* autostop criteria */ if (set_autostop_criterion(capture_opts, optarg) == FALSE) { cmdarg_err("Invalid or unknown -a flag \"%s\"", optarg); - exit(1); + return 1; } break; case 'b': /* Ringbuffer option */ capture_opts->multi_files_on = TRUE; if (get_ring_arguments(capture_opts, optarg) == FALSE) { cmdarg_err("Invalid or unknown -b arg \"%s\"", optarg); - exit(1); + return 1; } break; #ifdef _WIN32 @@ -391,7 +395,10 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg, capture_opts->show_info = FALSE; break; case 'i': /* Use interface xxx */ - capture_opts_add_iface_opt(capture_opts, optarg); + status = capture_opts_add_iface_opt(capture_opts, optarg); + if(status != 0) { + return status; + } break; case 'k': /* Start capture immediately */ *start_capture = TRUE; @@ -418,7 +425,8 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg, #else capture_opts->save_file = g_strdup(optarg); #endif - capture_opts->output_to_pipe = capture_opts_output_to_pipe(capture_opts->save_file); + status = capture_opts_output_to_pipe(capture_opts->save_file, &capture_opts->output_to_pipe); + return status; break; case 'y': /* Set the pcap data link type */ #ifdef HAVE_PCAP_DATALINK_NAME_TO_VAL @@ -426,7 +434,7 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg, if (capture_opts->linktype == -1) { cmdarg_err("The specified data link type \"%s\" isn't valid", optarg); - exit(1); + return 1; } #else /* HAVE_PCAP_DATALINK_NAME_TO_VAL */ /* XXX - just treat it as a number */ @@ -438,7 +446,7 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg, case 'Z': /* Write to pipe FD XXX */ if (get_pipe_arguments(capture_opts, optarg) == FALSE) { cmdarg_err("Invalid or unknown -Z flag \"%s\"", optarg); - exit(1); + return 1; } break; #endif /* _WIN32 */ @@ -446,10 +454,12 @@ capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg, /* the caller is responsible to send us only the right opt's */ g_assert_not_reached(); } + + return 0; } -void capture_opts_list_link_layer_types(capture_options *capture_opts) +int capture_opts_list_link_layer_types(capture_options *capture_opts) { gchar err_str[PCAP_ERRBUF_SIZE]; GList *lt_list, *lt_entry; @@ -464,7 +474,7 @@ void capture_opts_list_link_layer_types(capture_options *capture_opts) "you have the proper interface or pipe specified.\n", err_str); } else cmdarg_err("The capture device has no data link types."); - exit(2); + return 2; } cmdarg_err_cont("Data link types (use option -y to set):"); for (lt_entry = lt_list; lt_entry != NULL; @@ -478,10 +488,12 @@ void capture_opts_list_link_layer_types(capture_options *capture_opts) putchar('\n'); } free_pcap_linktype_list(lt_list); + + return 0; } -void capture_opts_list_interfaces() +int capture_opts_list_interfaces() { GList *if_list; GList *if_entry; @@ -505,7 +517,7 @@ void capture_opts_list_interfaces() cmdarg_err("There are no interfaces on which a capture can be done"); break; } - exit(2); + return 2; } i = 1; /* Interface id number */ @@ -518,6 +530,8 @@ void capture_opts_list_interfaces() printf("\n"); } free_interface_list(if_list); + + return 0; } @@ -607,7 +621,7 @@ static int capture_opts_test_for_fifo(const char *path) return 0; } -static gboolean capture_opts_output_to_pipe(const char *save_file) +static gboolean capture_opts_output_to_pipe(const char *save_file, gboolean *is_pipe) { int err; @@ -619,7 +633,7 @@ static gboolean capture_opts_output_to_pipe(const char *save_file) silly to do "-w - >output_file" rather than "-w output_file", but by not checking we might be violating the Principle Of Least Astonishment. */ - return TRUE; + *is_pipe = TRUE; } else { /* not a capture file, test for a FIFO (aka named pipe) */ err = capture_opts_test_for_fifo(save_file); @@ -631,18 +645,20 @@ static gboolean capture_opts_output_to_pipe(const char *save_file) break; case ESPIPE: /* it is a FIFO */ - return TRUE; + *is_pipe = TRUE; break; default: /* couldn't stat it */ cmdarg_err("Error testing whether capture file is a pipe: %s", strerror(errno)); - exit(2); + return 2; } } } - return FALSE; + *is_pipe = FALSE; + + return 0; } #endif /* HAVE_LIBPCAP */ diff --git a/capture_opts.h b/capture_opts.h index 7bf7c177ea..178757e2c8 100644 --- a/capture_opts.h +++ b/capture_opts.h @@ -103,7 +103,7 @@ extern void capture_opts_init(capture_options *capture_opts, void *cfile); /* set a command line option value */ -extern void +extern int capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg, gboolean *start_capture); /* log content of capture_opts */ @@ -111,11 +111,11 @@ extern void capture_opts_log(const char *log_domain, GLogLevelFlags log_level, capture_options *capture_opts); /* list link layer types */ -extern void +extern int capture_opts_list_link_layer_types(capture_options *capture_opts); /* list interfaces */ -extern void +extern int capture_opts_list_interfaces(void); /* trim the snaplen entry */ diff --git a/dumpcap.c b/dumpcap.c index a8e84d776d..659b922ba8 100644 --- a/dumpcap.c +++ b/dumpcap.c @@ -252,6 +252,7 @@ main(int argc, char *argv[]) struct pcap_stat stats; GLogLevelFlags log_flags; gboolean list_link_layer_types = FALSE; + int status; #define OPTSTRING_INIT "a:b:c:Df:hi:Lps:vw:y:" @@ -358,13 +359,16 @@ main(int argc, char *argv[]) /* Hidden option supporting Sync mode */ case 'Z': /* Write to pipe FD x */ #endif /* _WIN32 */ - capture_opts_add_opt(capture_opts, opt, optarg, &start_capture); + status = capture_opts_add_opt(capture_opts, opt, optarg, &start_capture); + if(status != 0) { + exit_main(status); + } break; /*** all non capture option specific ***/ case 'D': /* Print a list of capture devices and exit */ - capture_opts_list_interfaces(); - exit_main(0); + status = capture_opts_list_interfaces(); + exit_main(status); break; case 'L': /* Print list of link-layer types and exit */ list_link_layer_types = TRUE; @@ -441,8 +445,8 @@ main(int argc, char *argv[]) } if (list_link_layer_types) { - capture_opts_list_link_layer_types(capture_opts); - exit_main(0); + status = capture_opts_list_link_layer_types(capture_opts); + exit_main(status); } capture_opts_trim_snaplen(capture_opts, MIN_PACKET_SIZE); diff --git a/gtk/main.c b/gtk/main.c index 77476c8a71..6e0df73fb3 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1897,6 +1897,7 @@ main(int argc, char *argv[]) GLogLevelFlags log_flags; guint go_to_packet = 0; int optind_initial; + int status; #define OPTSTRING_INIT "a:b:c:Df:g:Hhi:klLm:nN:o:pQr:R:Ss:t:vw:X:y:z:" @@ -2295,7 +2296,10 @@ main(int argc, char *argv[]) case 'Z': /* Write to pipe FD XXX */ #endif /* _WIN32 */ #ifdef HAVE_LIBPCAP - capture_opts_add_opt(capture_opts, opt, optarg, &start_capture); + status = capture_opts_add_opt(capture_opts, opt, optarg, &start_capture); + if(status != 0) { + exit(status); + } #else capture_option_specified = TRUE; arg_error = TRUE; @@ -2553,8 +2557,8 @@ main(int argc, char *argv[]) } if (list_link_layer_types) { - capture_opts_list_link_layer_types(capture_opts); - exit(0); + status = capture_opts_list_link_layer_types(capture_opts); + exit(status); } capture_opts_trim_snaplen(capture_opts, MIN_PACKET_SIZE); diff --git a/tethereal.c b/tethereal.c index 27ea607b45..10d6049c1d 100644 --- a/tethereal.c +++ b/tethereal.c @@ -683,6 +683,7 @@ main(int argc, char *argv[]) e_prefs *prefs; char badopt; GLogLevelFlags log_flags; + int status; #define OPTSTRING_INIT "a:b:c:d:Df:F:hi:lLnN:o:pqr:R:s:St:T:vVw:xX:y:z:" #ifdef HAVE_LIBPCAP @@ -885,7 +886,10 @@ main(int argc, char *argv[]) case 'B': /* Buffer size */ #endif /* _WIN32 */ #ifdef HAVE_LIBPCAP - capture_opts_add_opt(&capture_opts, opt, optarg, &start_capture); + status = capture_opts_add_opt(&capture_opts, opt, optarg, &start_capture); + if(status != 0) { + exit(status); + } #else capture_option_specified = TRUE; arg_error = TRUE; @@ -897,8 +901,8 @@ main(int argc, char *argv[]) break; case 'D': /* Print a list of capture devices and exit */ #ifdef HAVE_LIBPCAP - capture_opts_list_interfaces(); - exit(0); + status = capture_opts_list_interfaces(); + exit(status); #else capture_option_specified = TRUE; arg_error = TRUE; @@ -1386,8 +1390,8 @@ main(int argc, char *argv[]) /* if requested, list the link layer types and exit */ if (list_link_layer_types) { - capture_opts_list_link_layer_types(&capture_opts); - exit(0); + status = capture_opts_list_link_layer_types(&capture_opts); + exit(status); } if (!quiet) {