Ethereal-dev: [Ethereal-dev] [Patch] Tweaks to command-line interface
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Graeme Hewson <ghewson@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 22 May 2002 21:17:25 +0100
Attached are patches to main.c (ethereal) and tethereal.c which tweak the command-line interface. Both patches: - Exit if an error is found in the options or arguments. - In print_usage(), improve the visibility of any getopt() error message by suppressing the version information when -h is not specified, and by adding an empty line. Ethereal: - If the -k option is specified, use the interface in the preferences file, if present. - Prevent the user from specifying any hidden options which are used internally in -S mode. Tethereal: - Fix a memory leak in the processing of the -f option. - In print_usage(), change "capture file type" to "output file type", which I think is clearer; move the -q flag from the non-libpcap case to the libpcap case. Graeme Hewson
--- main.c.orig Thu May 16 03:44:47 2002
+++ main.c Wed May 22 18:14:08 2002
@@ -1066,12 +1066,14 @@
}
static void
-print_usage(void) {
+print_usage(const char print_ver) {
- fprintf(stderr, "This is GNU " PACKAGE " " VERSION ", compiled %s\n",
+ if (print_ver == 'Y') {
+ fprintf(stderr, "This is GNU " PACKAGE " " VERSION ", compiled %s\n",
comp_info_str->str);
+ }
#ifdef HAVE_LIBPCAP
- fprintf(stderr, "%s [ -vh ] [ -klpQS ] [ -a <capture autostop condition> ] ...\n",
+ fprintf(stderr, "\n%s [ -vh ] [ -klpQS ] [ -a <capture autostop condition> ] ...\n",
PACKAGE);
fprintf(stderr, "\t[ -b <number of ringbuffer files> ] [ -B <byte view height> ]\n");
fprintf(stderr, "\t[ -c <count> ] [ -f <capture filter> ] [ -i <interface> ]\n");
@@ -1081,7 +1083,7 @@
fprintf(stderr, "\t[ -t <time stamp format> ] [ -T <tree view height> ]\n");
fprintf(stderr, "\t[ -w <savefile> ] [ <infile> ]\n");
#else
- fprintf(stderr, "%s [ -vh ] [ -B <byte view height> ] [ -m <medium font> ]\n",
+ fprintf(stderr, "\n%s [ -vh ] [ -B <byte view height> ] [ -m <medium font> ]\n",
PACKAGE);
fprintf(stderr, "\t[ -n ] [ -N <resolving> ]\n");
fprintf(stderr, "\t[ -o <preference setting> ... [ -P <packet list height> ]\n");
@@ -1225,6 +1227,20 @@
gint desk_x, desk_y;
gboolean prefs_write_needed = FALSE;
+#define OPTSTRING_INIT "a:b:B:c:f:hi:klm:nN:o:pP:Qr:R:Ss:t:T:w:v"
+
+#ifdef HAVE_LIBPCAP
+#ifdef WIN32
+#define OPTSTRING_CHILD "W:Z:"
+#else
+#define OPTSTRING_CHILD "W:"
+#endif /* WIN32 */
+#else
+#define OPTSTRING_CHILD ""
+#endif /* HAVE_LIBPCAP */
+
+ char optstring[sizeof(OPTSTRING_INIT) + sizeof(OPTSTRING_CHILD) - 1] =
+ OPTSTRING_INIT;
ethereal_path = argv[0];
@@ -1251,6 +1267,8 @@
/* Set "capture_child" to indicate whether this is going to be a child
process for a "-S" capture. */
capture_child = (strcmp(command_name, CHILD_NAME) == 0);
+ if (capture_child)
+ strcat(optstring, OPTSTRING_CHILD);
#endif
/* Register all dissectors; we must do this before checking for the
@@ -1434,7 +1452,7 @@
#endif
/* Now get our args */
- while ((opt = getopt(argc, argv, "a:b:B:c:f:hi:klm:nN:o:pP:Qr:R:Ss:t:T:w:W:vZ:")) != -1) {
+ while ((opt = getopt(argc, argv, optstring)) != -1) {
switch (opt) {
case 'a': /* autostop criteria */
#ifdef HAVE_LIBPCAP
@@ -1480,7 +1498,7 @@
#endif
break;
case 'h': /* Print help and exit */
- print_usage();
+ print_usage('Y');
exit(0);
break;
case 'i': /* Use interface xxx */
@@ -1623,29 +1641,27 @@
arg_error = TRUE;
#endif
break;
- case 'W': /* Write to capture file FD xxx */
#ifdef HAVE_LIBPCAP
+ /* This is a hidden option supporting Sync mode, so we don't set
+ * the error flags for the user in the non-libpcap case.
+ */
+ case 'W': /* Write to capture file FD xxx */
cfile.save_file_fd = atoi(optarg);
-#else
- capture_option_specified = TRUE;
- arg_error = TRUE;
-#endif
break;
+#endif
#ifdef _WIN32
- case 'Z': /* Write to pipe FD XXX */
#ifdef HAVE_LIBPCAP
+ /* Hidden option supporting Sync mode */
+ case 'Z': /* Write to pipe FD XXX */
/* associate stdout with pipe */
i = atoi(optarg);
if (dup2(i, 1) < 0) {
fprintf(stderr, "Unable to dup pipe handle\n");
exit(1);
}
-#else
- capture_option_specified = TRUE;
- arg_error = TRUE;
-#endif /* HAVE_LIBPCAP */
break;
+#endif /* HAVE_LIBPCAP */
#endif /* _WIN32 */
default:
@@ -1684,8 +1700,13 @@
/*
* Extra command line arguments were specified; complain.
*/
+ fprintf(stderr, "Invalid argument: %s\n", argv[0]);
arg_error = TRUE;
}
+ if (arg_error) {
+ print_usage('N');
+ exit(1);
+ }
#ifdef HAVE_LIBPCAP
if (capture_opts.ringbuffer_on) {
@@ -1727,31 +1748,35 @@
if (capture_option_specified)
fprintf(stderr, "This version of Ethereal was not built with support for capturing packets.\n");
#endif
- if (arg_error)
- print_usage();
#ifdef HAVE_LIBPCAP
if (start_capture) {
/* We're supposed to do a live capture; did the user specify an interface
to use? */
if (cfile.iface == NULL) {
+ /* No - is a default specified in the preferences file? */
+ if (prefs->capture_device != NULL) {
+ /* Yes - use it. */
+ cfile.iface = g_strdup(prefs->capture_device);
+ } else {
/* No - pick the first one from the list of interfaces. */
- if_list = get_interface_list(&err, err_str);
- if (if_list == NULL) {
- switch (err) {
-
- case CANT_GET_INTERFACE_LIST:
- fprintf(stderr, "ethereal: Can't get list of interfaces: %s\n",
- err_str);
- break;
-
- case NO_INTERFACES_FOUND:
- fprintf(stderr, "ethereal: There are no interfaces on which a capture can be done\n");
- break;
+ if_list = get_interface_list(&err, err_str);
+ if (if_list == NULL) {
+ switch (err) {
+
+ case CANT_GET_INTERFACE_LIST:
+ fprintf(stderr, "ethereal: Can't get list of interfaces: %s\n",
+ err_str);
+ break;
+
+ case NO_INTERFACES_FOUND:
+ fprintf(stderr, "ethereal: There are no interfaces on which a capture can be done\n");
+ break;
+ }
+ exit(2);
}
- exit(2);
+ cfile.iface = g_strdup(if_list->data); /* first interface */
+ free_interface_list(if_list);
}
- cfile.iface = g_strdup(if_list->data); /* first interface */
- free_interface_list(if_list);
}
}
if (capture_child) {
--- tethereal.c.orig Thu May 16 03:44:47 2002
+++ tethereal.c Wed May 22 18:32:17 2002
@@ -180,22 +180,24 @@
#endif
static void
-print_usage(void)
+print_usage(const char print_ver)
{
int i;
- fprintf(stderr, "This is GNU t%s %s, compiled %s\n", PACKAGE, VERSION,
+ if (print_ver == 'Y') {
+ fprintf(stderr, "This is GNU t%s %s, compiled %s\n", PACKAGE, VERSION,
comp_info_str->str);
+ }
#ifdef HAVE_LIBPCAP
- fprintf(stderr, "t%s [ -DvVhlp ] [ -a <capture autostop condition> ] ...\n",
+ fprintf(stderr, "\nt%s [ -DvVhqlp ] [ -a <capture autostop condition> ] ...\n",
PACKAGE);
fprintf(stderr, "\t[ -b <number of ring buffer files> ] [ -c <count> ]\n");
- fprintf(stderr, "\t[ -f <capture filter> ] [ -F <capture file type> ]\n");
+ fprintf(stderr, "\t[ -f <capture filter> ] [ -F <output file type> ]\n");
fprintf(stderr, "\t[ -i <interface> ] [ -n ] [ -N <resolving> ]\n");
fprintf(stderr, "\t[ -o <preference setting> ] ... [ -r <infile> ] [ -R <read filter> ]\n");
fprintf(stderr, "\t[ -s <snaplen> ] [ -t <time stamp format> ] [ -w <savefile> ] [ -x ]\n");
#else
- fprintf(stderr, "t%s [ -qvVhl ] [ -F <capture file type> ] [ -n ] [ -N <resolving> ]\n", PACKAGE);
+ fprintf(stderr, "\nt%s [ -vVhl ] [ -F <output file type> ] [ -n ] [ -N <resolving> ]\n", PACKAGE);
fprintf(stderr, "\t[ -o <preference setting> ] ... [ -r <infile> ] [ -R <read filter> ]\n");
fprintf(stderr, "\t[ -t <time stamp format> ] [ -w <savefile> ] [ -x ]\n");
#endif
@@ -505,6 +507,8 @@
case 'f':
#ifdef HAVE_LIBPCAP
capture_filter_specified = TRUE;
+ if (cfile.cfilter)
+ g_free(cfile.cfilter);
cfile.cfilter = g_strdup(optarg);
#else
capture_option_specified = TRUE;
@@ -520,7 +524,7 @@
}
break;
case 'h': /* Print help and exit */
- print_usage();
+ print_usage('Y');
exit(0);
break;
case 'i': /* Use interface xxx */
@@ -629,6 +633,10 @@
case 'x': /* Print packet data in hex (and ASCII) */
print_hex = TRUE;
break;
+ default:
+ case '?': /* Bad flag - print usage message */
+ arg_error = TRUE;
+ break;
}
}
@@ -702,8 +710,10 @@
if (capture_option_specified)
fprintf(stderr, "This version of Tethereal was not built with support for capturing packets.\n");
#endif
- if (arg_error)
- print_usage();
+ if (arg_error) {
+ print_usage('N');
+ exit(1);
+ }
/* Build the column format array */
for (i = 0; i < cfile.cinfo.num_cols; i++) {
- Follow-Ups:
- Re: [Ethereal-dev] [Patch] Tweaks to command-line interface
- From: Guy Harris
- Re: [Ethereal-dev] [Patch] Tweaks to command-line interface
- Prev by Date: Re: [Ethereal-dev] Dropped packets in Solaris snoop
- Next by Date: Re: [Ethereal-dev] [Patch] Tweaks to command-line interface
- Previous by thread: Re: [Ethereal-dev] Re: [Ethereal-announce] Ethereal 0.9.4 sources and Windows installer released
- Next by thread: Re: [Ethereal-dev] [Patch] Tweaks to command-line interface
- Index(es):





