Handle "-G" only in Tethereal - it doesn't work in Ethereal, and isn't
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 17 Nov 2005 05:59:21 +0000 (05:59 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 17 Nov 2005 05:59:21 +0000 (05:59 +0000)
necessary there.

Add a "cmdarg_err()" routine to report command-line option errors; it
creates a console if necessary, and prints the command name and the
trailing newline.  Also add "cmdarg_err_cont()", which also creates a
console if necessary, and prints a trailing newline but no command name;
it's used to continue the message.  Use those, rather than
"g_warning()", for errors.

That means that we no longer need to pass the command name to various
command-line argument parsing routines.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@16526 f5534014-38df-0310-8fa8-9805f1628bb7

Makefile.common
capture.h
capture_opts.c
clopts_common.c
clopts_common.h
cmdarg_err.h [new file with mode: 0644]
gtk/main.c
tethereal.c

index 1ecf008e9d470b9b783458b5f2b272fc9bd5af82..934b658b627dc21293bff1bdd9d48e514449f786 100644 (file)
@@ -71,6 +71,7 @@ ETHEREAL_COMMON_INCLUDES =    \
        capture_ui_utils.h      \
        cfile.h \
        clopts_common.h \
+       cmdarg_err.h    \
        color.h \
        conditions.h    \
        disabled_protos.h       \
index c46c21f6e5945fa5c529244d934a41580b97c03a..ce90327acb9ce41e0a995bc59047c5889d0e645a 100644 (file)
--- a/capture.h
+++ b/capture.h
@@ -104,7 +104,7 @@ extern void
 capture_opts_init(capture_options *capture_opts, void *cfile);
 
 extern void
-capture_opts_add_opt(capture_options *capture_opts, const char *appname, int opt, const char *optarg, gboolean *start_capture);
+capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg, gboolean *start_capture);
 
 /* log content of capture_opts */
 extern void
index e3c5ec3ea31f0bde07672294ab51b9084a94fcdf..df66d6b3a34c5470db11169d5ed1cccbe8510945 100644 (file)
@@ -40,6 +40,7 @@
 #include "capture.h"
 #include "ringbuffer.h"
 #include "clopts_common.h"
+#include "cmdarg_err.h"
 
 void
 capture_opts_init(capture_options *capture_opts, void *cfile)
@@ -125,7 +126,7 @@ capture_opts_log(const char *log_domain, GLogLevelFlags log_level, capture_optio
  * in some fashion.
  */
 static gboolean
-set_autostop_criterion(capture_options *capture_opts, const char *appname, const char *autostoparg)
+set_autostop_criterion(capture_options *capture_opts, const char *autostoparg)
 {
   gchar *p, *colonp;
 
@@ -154,14 +155,14 @@ set_autostop_criterion(capture_options *capture_opts, const char *appname, const
   }
   if (strcmp(autostoparg,"duration") == 0) {
     capture_opts->has_autostop_duration = TRUE;
-    capture_opts->autostop_duration = get_positive_int(appname, p,"autostop duration");
+    capture_opts->autostop_duration = get_positive_int(p,"autostop duration");
   } else if (strcmp(autostoparg,"filesize") == 0) {
     capture_opts->has_autostop_filesize = TRUE;
-    capture_opts->autostop_filesize = get_positive_int(appname, p,"autostop filesize");
+    capture_opts->autostop_filesize = get_positive_int(p,"autostop filesize");
   } else if (strcmp(autostoparg,"files") == 0) {
     capture_opts->multi_files_on = TRUE;
     capture_opts->has_autostop_files = TRUE;
-    capture_opts->autostop_files = get_positive_int(appname, p,"autostop files");
+    capture_opts->autostop_files = get_positive_int(p,"autostop files");
   } else {
     return FALSE;
   }
@@ -176,7 +177,7 @@ set_autostop_criterion(capture_options *capture_opts, const char *appname, const
  * in some fashion.
  */
 static gboolean
-get_ring_arguments(capture_options *capture_opts, const char *appname, const char *arg)
+get_ring_arguments(capture_options *capture_opts, const char *arg)
 {
   gchar *p = NULL, *colonp;
 
@@ -206,13 +207,13 @@ get_ring_arguments(capture_options *capture_opts, const char *appname, const cha
 
   if (strcmp(arg,"files") == 0) {
     capture_opts->has_ring_num_files = TRUE;
-    capture_opts->ring_num_files = get_natural_int(appname, p, "number of ring buffer files");
+    capture_opts->ring_num_files = get_natural_int(p, "number of ring buffer files");
   } else if (strcmp(arg,"filesize") == 0) {
     capture_opts->has_autostop_filesize = TRUE;
-    capture_opts->autostop_filesize = get_positive_int(appname, p, "ring buffer filesize");
+    capture_opts->autostop_filesize = get_positive_int(p, "ring buffer filesize");
   } else if (strcmp(arg,"duration") == 0) {
     capture_opts->has_file_duration = TRUE;
-    capture_opts->file_duration = get_positive_int(appname, p, "ring buffer duration");
+    capture_opts->file_duration = get_positive_int(p, "ring buffer duration");
   }
 
   *colonp = ':';       /* put the colon back */
@@ -228,7 +229,7 @@ get_ring_arguments(capture_options *capture_opts, const char *appname, const cha
  * in some fashion.
  */
 static gboolean
-get_pipe_arguments(capture_options *capture_opts, const char *appname, const char *arg)
+get_pipe_arguments(capture_options *capture_opts, const char *arg)
 {
   gchar *p = NULL, *colonp;
   int pipe_fd;
@@ -260,16 +261,16 @@ get_pipe_arguments(capture_options *capture_opts, const char *appname, const cha
 
   if (strcmp(arg,"sync") == 0) {
     /* associate stdout with sync pipe */
-    pipe_fd = get_natural_int(appname, p, "sync pipe file descriptor");
+    pipe_fd = get_natural_int(p, "sync pipe file descriptor");
     if (dup2(pipe_fd, 1) < 0) {
-      fprintf(stderr, "%s: Unable to dup sync pipe handle\n", appname);
+      cmdarg_err("Unable to dup sync pipe handle");
       return FALSE;
     }
   } else if (strcmp(arg,"signal") == 0) {
     /* associate stdin with signal pipe */
-    pipe_fd = get_natural_int(appname, p, "signal pipe file descriptor");
+    pipe_fd = get_natural_int(p, "signal pipe file descriptor");
     if (dup2(pipe_fd, 0) < 0) {
-      fprintf(stderr, "%s: Unable to dup signal pipe handle\n", appname);
+      cmdarg_err("Unable to dup signal pipe handle");
       return FALSE;
     }
   }
@@ -281,30 +282,30 @@ get_pipe_arguments(capture_options *capture_opts, const char *appname, const cha
 
 
 void
-capture_opts_add_opt(capture_options *capture_opts, const char *appname, int opt, const char *optarg, gboolean *start_capture)
+capture_opts_add_opt(capture_options *capture_opts, int opt, const char *optarg, gboolean *start_capture)
 {
     switch(opt) {
     case 'a':        /* autostop criteria */
-        if (set_autostop_criterion(capture_opts, appname, optarg) == FALSE) {
-          fprintf(stderr, "%s: Invalid or unknown -a flag \"%s\"\n", appname, optarg);
+        if (set_autostop_criterion(capture_opts, optarg) == FALSE) {
+          cmdarg_err("Invalid or unknown -a flag \"%s\"", optarg);
           exit(1);
         }
         break;
     case 'b':        /* Ringbuffer option */
         capture_opts->multi_files_on = TRUE;
-        if (get_ring_arguments(capture_opts, appname, optarg) == FALSE) {
-          fprintf(stderr, "%s: Invalid or unknown -b arg \"%s\"\n", appname, optarg);
+        if (get_ring_arguments(capture_opts, optarg) == FALSE) {
+          cmdarg_err("Invalid or unknown -b arg \"%s\"", optarg);
           exit(1);
         }
         break;
 #ifdef _WIN32
     case 'B':        /* Buffer size */
-        capture_opts->buffer_size = get_positive_int(appname, optarg, "buffer size");
+        capture_opts->buffer_size = get_positive_int(optarg, "buffer size");
         break;
 #endif
     case 'c':        /* Capture xxx packets */
         capture_opts->has_autostop_packets = TRUE;
-        capture_opts->autostop_packets = get_positive_int(appname, optarg, "packet count");
+        capture_opts->autostop_packets = get_positive_int(optarg, "packet count");
         break;
     case 'f':        /* capture filter */
         if (capture_opts->cfilter)
@@ -330,7 +331,7 @@ capture_opts_add_opt(capture_options *capture_opts, const char *appname, int opt
         break;
     case 's':        /* Set the snapshot (capture) length */
         capture_opts->has_snaplen = TRUE;
-        capture_opts->snaplen = get_positive_int(appname, optarg, "snapshot length");
+        capture_opts->snaplen = get_positive_int(optarg, "snapshot length");
         break;
     case 'S':        /* "Real-Time" mode: used for following file ala tail -f */
         capture_opts->real_time_mode = TRUE;
@@ -342,20 +343,20 @@ capture_opts_add_opt(capture_options *capture_opts, const char *appname, int opt
 #ifdef HAVE_PCAP_DATALINK_NAME_TO_VAL
         capture_opts->linktype = pcap_datalink_name_to_val(optarg);
         if (capture_opts->linktype == -1) {
-          fprintf(stderr, "%s: The specified data link type \"%s\" isn't valid\n",
-                  appname, optarg);
+          cmdarg_err("The specified data link type \"%s\" isn't valid",
+                  optarg);
           exit(1);
         }
 #else /* HAVE_PCAP_DATALINK_NAME_TO_VAL */
         /* XXX - just treat it as a number */
-        capture_opts->linktype = get_natural_int(appname, optarg, "data link type");
+        capture_opts->linktype = get_natural_int(optarg, "data link type");
 #endif /* HAVE_PCAP_DATALINK_NAME_TO_VAL */
         break;
 #ifdef _WIN32
       /* Hidden option supporting Sync mode */
     case 'Z':        /* Write to pipe FD XXX */
-       if (get_pipe_arguments(capture_opts, appname, optarg) == FALSE) {
-          fprintf(stderr, "%s: Invalid or unknown -Z flag \"%s\"\n", appname, optarg);
+       if (get_pipe_arguments(capture_opts, optarg) == FALSE) {
+          cmdarg_err("Invalid or unknown -Z flag \"%s\"", optarg);
           exit(1);
         }
         break;
index 1528d726e8ae4aa1b7b452ec33a7a3a7c0cce853..6b3187eaad39e80c97ef413784dfddbdb2255614 100644 (file)
 #include <epan/prefs.h>
 
 #include "clopts_common.h"
-
-/*
- * Handle the "-G" option, to cause protocol field, etc. information
- * to be printed.
- */
-void
-handle_dashG_option(int argc, char **argv, const char *progname)
-{
-  char *gpf_path, *pf_path;
-  int   gpf_open_errno, gpf_read_errno;
-  int   pf_open_errno, pf_read_errno;
-
-  if (argc >= 2 && strcmp(argv[1], "-G") == 0) {
-    if (argc == 2)
-      proto_registrar_dump_fields(1);
-    else {
-      if (strcmp(argv[2], "fields") == 0)
-        proto_registrar_dump_fields(1);
-      else if (strcmp(argv[2], "fields2") == 0)
-        proto_registrar_dump_fields(2);
-      else if (strcmp(argv[2], "fields3") == 0)
-        proto_registrar_dump_fields(3);
-      else if (strcmp(argv[2], "protocols") == 0)
-        proto_registrar_dump_protocols();
-      else if (strcmp(argv[2], "values") == 0)
-        proto_registrar_dump_values();
-      else if (strcmp(argv[2], "decodes") == 0)
-        dissector_dump_decodes();
-      else if (strcmp(argv[2], "defaultprefs") == 0)
-        write_prefs(NULL);
-      else if (strcmp(argv[2], "currentprefs") == 0) {
-        read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
-            &pf_open_errno, &pf_read_errno, &pf_path);
-        write_prefs(NULL);
-      } else {
-        fprintf(stderr, "%s: Invalid \"%s\" option for -G flag\n", progname,
-                argv[2]);
-        exit(1);
-      }
-    }
-    exit(0);
-  }
-}
+#include "cmdarg_err.h"
 
 int
-get_natural_int(const char *appname, const char *string, const char *name)
+get_natural_int(const char *string, const char *name)
 {
   long number;
   char *p;
 
   number = strtol(string, &p, 10);
   if (p == string || *p != '\0') {
-    fprintf(stderr, "%s: The specified %s \"%s\" isn't a decimal number\n",
-           appname, name, string);
+    cmdarg_err("The specified %s \"%s\" isn't a decimal number", name, string);
     exit(1);
   }
   if (number < 0) {
-    fprintf(stderr, "%s: The specified %s \"%s\" is a negative number\n",
-           appname, name, string);
+    cmdarg_err("The specified %s \"%s\" is a negative number", name, string);
     exit(1);
   }
   if (number > INT_MAX) {
-    fprintf(stderr, "%s: The specified %s \"%s\" is too large (greater than %d)\n",
-           appname, name, string, INT_MAX);
+    cmdarg_err("The specified %s \"%s\" is too large (greater than %d)",
+              name, string, INT_MAX);
     exit(1);
   }
   return number;
@@ -105,15 +61,14 @@ get_natural_int(const char *appname, const char *string, const char *name)
 
 
 int
-get_positive_int(const char *appname, const char *string, const char *name)
+get_positive_int(const char *string, const char *name)
 {
   long number;
 
-  number = get_natural_int(appname, string, name);
+  number = get_natural_int(string, name);
 
   if (number == 0) {
-    fprintf(stderr, "%s: The specified %s is zero\n",
-           appname, name);
+    cmdarg_err("The specified %s is zero", name);
     exit(1);
   }
 
index d4862f85751bafcd2979d15f5ead74989f7105f6..461fad4bb3536388cffeaaa1358bf71d91c9a6df 100644 (file)
 extern "C" {
 #endif /* __cplusplus */
 
-/*
- * Handle the "-G" option, to cause protocol field, etc. information
- * to be printed.
- */
-void handle_dashG_option(int argc, char **argv, const char *progname);
-
-int get_natural_int(const char *appname, const char *string, const char *name);
+int get_natural_int(const char *string, const char *name);
 
-int get_positive_int(const char *appname, const char *string, const char *name);
+int get_positive_int(const char *string, const char *name);
 
 #ifdef __cplusplus
 }
diff --git a/cmdarg_err.h b/cmdarg_err.h
new file mode 100644 (file)
index 0000000..e50b89a
--- /dev/null
@@ -0,0 +1,46 @@
+/* cmdarg_err.h
+ * Declarations of routines to report command-line errors.
+ *
+ * $Id$
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifndef __CMDARG_ERR_H__
+#define __CMDARG_ERR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*
+ * Report an error in command-line arguments.
+ */
+extern void cmdarg_err(const char *fmt, ...);
+
+/*
+ * Report additional information for an error in command-line arguments.
+ */
+extern void cmdarg_err_cont(const char *fmt, ...);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __CMDARG_ERR_H__ */
index 6c20aa20e2374b7a67e3595098d31c56362960d0..c046b0191006fa95ba873cffd935cf45c454996a 100644 (file)
@@ -83,6 +83,7 @@
 #include <epan/stat_cmd_args.h>
 #include "util.h"
 #include "clopts_common.h"
+#include "cmdarg_err.h"
 #include "version_info.h"
 #include "merge.h"
 
@@ -1124,6 +1125,47 @@ show_version(void)
 #endif
 }
 
+/*
+ * Report an error in command-line arguments.
+ * Creates a console on Windows.
+ * XXX - pop this up in a window of some sort on UNIX+X11 if the controlling
+ * terminal isn't the standard error?
+ */
+void
+cmdarg_err(const char *fmt, ...)
+{
+  va_list ap;
+
+#ifdef _WIN32
+  create_console();
+#endif
+  va_start(ap, fmt);
+  fprintf(stderr, "ethereal: ");
+  vfprintf(stderr, fmt, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}
+
+/*
+ * Report additional information for an error in command-line arguments.
+ * Creates a console on Windows.
+ * XXX - pop this up in a window of some sort on UNIX+X11 if the controlling
+ * terminal isn't the standard error?
+ */
+void
+cmdarg_err_cont(const char *fmt, ...)
+{
+  va_list ap;
+
+#ifdef _WIN32
+  create_console();
+#endif
+  va_start(ap, fmt);
+  vfprintf(stderr, fmt, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}
+
 #if defined(_WIN32) || GTK_MAJOR_VERSION < 2 || ! defined USE_THREADS
 /* 
    Once every 3 seconds we get a callback here which we use to update
@@ -1758,8 +1800,7 @@ main(int argc, char *argv[])
 
   /* "pre-scan" the command line parameters, if we have "console only"
      parameters.  We do this so we don't start GTK+ if we're only showing
-     command-line help information, version information, or "-G"
-     information.
+     command-line help or version information.
 
      XXX - this pre-scan is doen before we start GTK+, so we haven't
      run gtk_init() on the arguments.  That means that GTK+ arguments
@@ -1780,11 +1821,6 @@ main(int argc, char *argv[])
         show_version();
         exit(0);
         break;
-      case 'G':        /* dump various field or other infos, see handle_dashG_option() */
-        handle_dashG_option(argc, argv, "ethereal");
-        /* will never return! */
-        exit(0);
-        break;
       case '?':        /* Ignore errors - the "real" scan will catch them. */
         break;
     }
@@ -2091,7 +2127,7 @@ main(int argc, char *argv[])
       case 'Z':        /* Write to pipe FD XXX */
 #endif /* _WIN32 */
 #ifdef HAVE_LIBPCAP
-        capture_opts_add_opt(capture_opts, "ethereal", opt, optarg, &start_capture);
+        capture_opts_add_opt(capture_opts, opt, optarg, &start_capture);
 #else
         capture_option_specified = TRUE;
         arg_error = TRUE;
@@ -2102,13 +2138,13 @@ main(int argc, char *argv[])
        * the error flags for the user in the non-libpcap case.
        */
       case 'W':        /* Write to capture file FD xxx */
-        capture_opts_add_opt(capture_opts, "ethereal", opt, optarg, &start_capture);
+        capture_opts_add_opt(capture_opts, opt, optarg, &start_capture);
        break;
 #endif
 
       /*** all non capture option specific ***/
       case 'g':        /* Go to packet */
-        go_to_packet = get_positive_int("Ethereal", optarg, "go to packet");
+        go_to_packet = get_positive_int(optarg, "go to packet");
         break;
       case 'l':        /* Automatic scrolling in live capture mode */
 #ifdef HAVE_LIBPCAP
@@ -2139,7 +2175,7 @@ main(int argc, char *argv[])
           g_resolv_flags = RESOLV_NONE;
         badopt = string_to_name_resolve(optarg, &g_resolv_flags);
         if (badopt != '\0') {
-          g_warning("ethereal: -N specifies unknown resolving option '%c'; valid options are 'm', 'n', and 't'",
+          cmdarg_err("-N specifies unknown resolving option '%c'; valid options are 'm', 'n', and 't'",
                        badopt);
           exit(1);
         }
@@ -2149,7 +2185,7 @@ main(int argc, char *argv[])
         case PREFS_SET_OK:
           break;
         case PREFS_SET_SYNTAX_ERR:
-          g_warning("ethereal: Invalid -o flag \"%s\"", optarg);
+          cmdarg_err("Invalid -o flag \"%s\"", optarg);
           exit(1);
           break;
         case PREFS_SET_NO_SUCH_PREF:
@@ -2159,12 +2195,12 @@ main(int argc, char *argv[])
               break;
             case PREFS_SET_SYNTAX_ERR:
               /* shouldn't happen, checked already above */
-              g_warning("ethereal: Invalid -o flag \"%s\"", optarg);
+              cmdarg_err("Invalid -o flag \"%s\"", optarg);
               exit(1);
               break;
             case PREFS_SET_NO_SUCH_PREF:
             case PREFS_SET_OBSOLETE:
-              g_warning("ethereal: -o flag \"%s\" specifies unknown preference/recent value",
+              cmdarg_err("-o flag \"%s\" specifies unknown preference/recent value",
                    optarg);
               exit(1);
               break;
@@ -2173,7 +2209,7 @@ main(int argc, char *argv[])
             }
           break;
         case PREFS_SET_OBSOLETE:
-          g_warning("ethereal: -o flag \"%s\" specifies obsolete preference",
+          cmdarg_err("-o flag \"%s\" specifies obsolete preference",
                        optarg);
           exit(1);
           break;
@@ -2200,10 +2236,9 @@ main(int argc, char *argv[])
         else if (strcmp(optarg, "d") == 0)
           timestamp_set_type(TS_DELTA);
         else {
-          g_warning("ethereal: Invalid time stamp type \"%s\"",
-            optarg);
-          g_warning("It must be \"r\" for relative, \"a\" for absolute,");
-          g_warning("\"ad\" for absolute with date, or \"d\" for delta.");
+          cmdarg_err("Invalid time stamp type \"%s\"", optarg);
+          cmdarg_err_cont("It must be \"r\" for relative, \"a\" for absolute,");
+          cmdarg_err_cont("\"ad\" for absolute with date, or \"d\" for delta.");
           exit(1);
         }
         break;
@@ -2214,15 +2249,14 @@ main(int argc, char *argv[])
            part of a tap filter.  Instead, we just add the argument
            to a list of stat arguments. */
         if (!process_stat_cmd_arg(optarg)) {
-         g_warning("ethereal: invalid -z argument.");
-         g_warning("  -z argument must be one of :");
+         cmdarg_err("Invalid -z argument.");
+         cmdarg_err_cont("  -z argument must be one of :");
          list_stat_cmd_args();
          exit(1);
        }
         break;
       default:
       case '?':        /* Bad flag - print usage message */
-        g_warning("Bad flag");
         arg_error = TRUE;
         break;
     }
@@ -2235,7 +2269,7 @@ main(int argc, char *argv[])
        * Input file name specified with "-r" *and* specified as a regular
        * command-line argument.
        */
-         g_warning("File name specified both with -r and regular argument");
+      cmdarg_err("File name specified both with -r and regular argument");
       arg_error = TRUE;
     } else {
       /*
@@ -2260,14 +2294,14 @@ main(int argc, char *argv[])
     /*
      * Extra command line arguments were specified; complain.
      */
-    g_warning("Invalid argument: %s", argv[0]);
+    cmdarg_err("Invalid argument: %s", argv[0]);
     arg_error = TRUE;
   }
 
   if (arg_error) {
 #ifndef HAVE_LIBPCAP
     if (capture_option_specified) {
-      g_warning("This version of Ethereal was not built with support for capturing packets.");
+      cmdarg_err("This version of Ethereal was not built with support for capturing packets.");
     }
 #endif
     print_usage(FALSE);
@@ -2277,7 +2311,7 @@ main(int argc, char *argv[])
 #ifdef HAVE_LIBPCAP
   if (start_capture && list_link_layer_types) {
     /* Specifying *both* is bogus. */
-    g_warning("ethereal: You can't specify both -L and a live capture.");
+    cmdarg_err("You can't specify both -L and a live capture.");
     exit(1);
   }
 
@@ -2286,12 +2320,12 @@ main(int argc, char *argv[])
        did the user also specify a capture file to be read? */
     if (cf_name) {
       /* Yes - that's bogus. */
-      g_warning("ethereal: You can't specify -L and a capture file to be read.");
+      cmdarg_err("You can't specify -L and a capture file to be read.");
       exit(1);
     }
     /* No - did they specify a ring buffer option? */
     if (capture_opts->multi_files_on) {
-      g_warning("ethereal: Ring buffer requested, but a capture isn't being done.");
+      cmdarg_err("Ring buffer requested, but a capture isn't being done.");
       exit(1);
     }
   } else {
@@ -2299,7 +2333,7 @@ main(int argc, char *argv[])
        a capture file to be read? */
     if (start_capture && cf_name) {
       /* Yes - that's bogus. */
-      g_warning("ethereal: You can't specify both a live capture and a capture file to be read.");
+      cmdarg_err("You can't specify both a live capture and a capture file to be read.");
       exit(1);
     }
 
@@ -2313,15 +2347,15 @@ main(int argc, char *argv[])
         c) it makes no sense to enable the ring buffer if the maximum
            file size is set to "infinite". */
       if (capture_opts->save_file == NULL) {
-       g_warning("ethereal: Ring buffer requested, but capture isn't being saved to a permanent file.");
+       cmdarg_err("Ring buffer requested, but capture isn't being saved to a permanent file.");
        capture_opts->multi_files_on = FALSE;
       }
 /*      if (capture_opts->real_time_mode) {
-       g_warning("ethereal: Ring buffer requested, but an \"Update list of packets in real time\" capture is being done.");
+       cmdarg_err("Ring buffer requested, but an \"Update list of packets in real time\" capture is being done.");
        capture_opts->multi_files_on = FALSE;
       }*/
       if (!capture_opts->has_autostop_filesize && !capture_opts->has_file_duration) {
-       g_warning("ethereal: Ring buffer requested, but no maximum capture file size or duration were specified.");
+       cmdarg_err("Ring buffer requested, but no maximum capture file size or duration were specified.");
 /* XXX - this must be redesigned as the conditions changed */
 /*     capture_opts->multi_files_on = FALSE;*/
       }
@@ -2343,12 +2377,12 @@ main(int argc, char *argv[])
 
           case CANT_GET_INTERFACE_LIST:
               cant_get_if_list_errstr = cant_get_if_list_error_message(err_str);
-              g_warning("%s", cant_get_if_list_errstr);
+              cmdarg_err("%s", cant_get_if_list_errstr);
               g_free(cant_get_if_list_errstr);
               break;
 
           case NO_INTERFACES_FOUND:
-              g_warning("ethereal: There are no interfaces on which a capture can be done");
+              cmdarg_err("There are no interfaces on which a capture can be done");
               break;
           }
           exit(2);
@@ -2365,11 +2399,11 @@ main(int argc, char *argv[])
     lt_list = get_pcap_linktype_list(capture_opts->iface, err_str);
     if (lt_list == NULL) {
       if (err_str[0] != '\0') {
-       g_warning("ethereal: The list of data link types for the capture device could not be obtained (%s)."
+       cmdarg_err("The list of data link types for the capture device could not be obtained (%s)."
          "Please check to make sure you have sufficient permissions, and that\n"
          "you have the proper interface or pipe specified.\n", err_str);
       } else
-       g_warning("ethereal: The capture device has no data link types.");
+       cmdarg_err("The capture device has no data link types.");
       exit(2);
     }
     g_warning("Data link types (use option -y to set):");
index d016dc823f7f7927e2208885a73aa0941bd94dd6..02ab7b397d395af24c5cb532c07edc39337b3ff2 100644 (file)
@@ -75,6 +75,7 @@
 #include <epan/addr_resolv.h>
 #include "util.h"
 #include "clopts_common.h"
+#include "cmdarg_err.h"
 #include "version_info.h"
 #include <epan/conversation.h>
 #include <epan/plugins.h>
@@ -689,9 +690,38 @@ main(int argc, char *argv[])
      for backwards compatibility we dump out a glossary of display
      filter symbols.
 
-     We do this here to mirror what happens in the GTK+ version, although
-     it's not necessary here. */
-  handle_dashG_option(argc, argv, "tethereal");
+     XXX - we do this here, for now, to support "-G" with no arguments.
+     If none of our build or other processes uses "-G" with no arguments,
+     we can just process it with the other arguments. */
+  if (argc >= 2 && strcmp(argv[1], "-G") == 0) {
+    if (argc == 2)
+      proto_registrar_dump_fields(1);
+    else {
+      if (strcmp(argv[2], "fields") == 0)
+        proto_registrar_dump_fields(1);
+      else if (strcmp(argv[2], "fields2") == 0)
+        proto_registrar_dump_fields(2);
+      else if (strcmp(argv[2], "fields3") == 0)
+        proto_registrar_dump_fields(3);
+      else if (strcmp(argv[2], "protocols") == 0)
+        proto_registrar_dump_protocols();
+      else if (strcmp(argv[2], "values") == 0)
+        proto_registrar_dump_values();
+      else if (strcmp(argv[2], "decodes") == 0)
+        dissector_dump_decodes();
+      else if (strcmp(argv[2], "defaultprefs") == 0)
+        write_prefs(NULL);
+      else if (strcmp(argv[2], "currentprefs") == 0) {
+        read_prefs(&gpf_open_errno, &gpf_read_errno, &gpf_path,
+            &pf_open_errno, &pf_read_errno, &pf_path);
+        write_prefs(NULL);
+      } else {
+        cmdarg_err("Invalid \"%s\" option for -G flag", argv[2]);
+        exit(1);
+      }
+    }
+    exit(0);
+  }
 
   /* Set the C-language locale to the native environment. */
   setlocale(LC_ALL, "");
@@ -783,7 +813,7 @@ main(int argc, char *argv[])
       case 's':        /* Set the snapshot (capture) length */
       case 'y':        /* Set the pcap data link type */
 #ifdef HAVE_LIBPCAP
-        capture_opts_add_opt(&capture_opts, "tethereal", opt, optarg, &start_capture);
+        capture_opts_add_opt(&capture_opts, opt, optarg, &start_capture);
 #else
         capture_option_specified = TRUE;
         arg_error = TRUE;
@@ -3355,3 +3385,32 @@ read_failure_message(const char *filename, int err)
   fprintf(stderr, "tethereal: An error occurred while reading from the file \"%s\": %s.\n",
           filename, strerror(err));
 }
+
+/*
+ * Report an error in command-line arguments.
+ */
+void
+cmdarg_err(const char *fmt, ...)
+{
+  va_list ap;
+
+  va_start(ap, fmt);
+  fprintf(stderr, "tethereal: ");
+  vfprintf(stderr, fmt, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}
+
+/*
+ * Report additional information for an error in command-line arguments.
+ */
+void
+cmdarg_err_cont(const char *fmt, ...)
+{
+  va_list ap;
+
+  va_start(ap, fmt);
+  vfprintf(stderr, fmt, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}