Update some links.
[obnox/wireshark/wip.git] / tshark.c
index 89c0ad35fcb38ed29465dc23032ef8c18ae13b6c..5c63d2c7ef99c418ef78f87b4b2d11f6a336ab00 100644 (file)
--- a/tshark.c
+++ b/tshark.c
@@ -138,12 +138,6 @@ static print_stream_t *print_stream;
 
 static output_fields_t* output_fields  = NULL;
 
-/*
- * Standard secondary message for unexpected errors.
- */
-static const char please_report[] =
-    "Please report this to the Wireshark developers";
-
 #ifdef HAVE_LIBPCAP
 /*
  * TRUE if we're to print packet counts to keep track of captured packets.
@@ -286,6 +280,8 @@ print_usage(gboolean print_ver)
   fprintf(output, "  -E<fieldsoption>=<value> set options for output when -Tfields selected:\n");
   fprintf(output, "     header=y|n            switch headers on and off\n");
   fprintf(output, "     separator=/t|/s|<char> select tab, space, printable character as separator\n");
+  fprintf(output, "     occurrence=f|l|a      print first, last or all occurrences of each field\n");
+  fprintf(output, "     aggregator=,|/s|<char> select comma, space, printable character as aggregator\n");
   fprintf(output, "     quote=d|s|n           select double, single, no quotes for values\n");
   fprintf(output, "  -t ad|a|r|d|dd|e         output format of time stamps (def: r: rel. to first)\n");
   fprintf(output, "  -u s|hms                 output format of seconds (def: s: seconds)\n");
@@ -300,6 +296,36 @@ print_usage(gboolean print_ver)
   fprintf(output, "  -v                       display version info and exit\n");
   fprintf(output, "  -o <name>:<value> ...    override preference setting\n");
   fprintf(output, "  -K <keytab>              keytab file to use for kerberos decryption\n");
+  fprintf(output, "  -G [report]              dump one of several available reports and exit\n");
+  fprintf(output, "                           default report=\"fields\"\n");
+  fprintf(output, "                           use \"-G ?\" for more help\n");
+}
+
+static void
+glossary_option_help(void)
+{
+  FILE *output;
+
+  output = stdout;
+
+  fprintf(output, "TShark " VERSION "%s\n", wireshark_svnversion);
+
+  fprintf(output, "\n");
+  fprintf(output, "Usage: tshark -G [report]\n");
+  fprintf(output, "\n");
+  fprintf(output, "Glossary table reports:\n");
+  fprintf(output, "  -G [fields]              dump glossary in original format and exit\n");
+  fprintf(output, "  -G fields2               dump glossary in format 2 and exit\n");
+  fprintf(output, "  -G fields3               dump glossary in format 3 and exit\n");
+  fprintf(output, "  -G protocols             dump protocols in registration database and exit\n");
+  fprintf(output, "  -G values                dump value, range, true/false strings and exit\n");
+  fprintf(output, "  -G decodes               dump \"layer type\"/\"decode as\" associations and exit\n");
+  fprintf(output, "\n");
+  fprintf(output, "Preference reports:\n");
+  fprintf(output, "  -G defaultprefs          dump default preferences and exit\n");
+  fprintf(output, "  -G currentprefs          dump current preferences and exit\n");
+  fprintf(output, "\n");
+
 }
 
 /*
@@ -927,12 +953,16 @@ main(int argc, char *argv[])
         dissector_dump_decodes();
       else if (strcmp(argv[2], "defaultprefs") == 0)
         write_prefs(NULL);
+      else if (strcmp(argv[2], "?") == 0)
+        glossary_option_help();
+      else if (strcmp(argv[2], "-?") == 0)
+        glossary_option_help();
       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]);
+        cmdarg_err("Invalid \"%s\" option for -G flag, enter -G ? for more help.", argv[2]);
         return 1;
       }
     }
@@ -1227,7 +1257,7 @@ main(int argc, char *argv[])
         GString             *runtime_info_str;
         /* Assemble the compile-time version information string */
         comp_info_str = g_string_new("Compiled ");
-        get_compiled_version_info(comp_info_str, get_epan_compiled_version_info);
+        get_compiled_version_info(comp_info_str, epan_get_compiled_version_info);
 
         /* Assemble the run-time version information string */
         runtime_info_str = g_string_new("Running ");
@@ -1714,8 +1744,10 @@ main(int argc, char *argv[])
      *
      * The capture code is a bit twisty, so it doesn't appear to
      * be an easy fix.  We just ignore the return value for now.
+     * Instead, pass on the exit status from the capture child.
      */
     capture();
+    exit_status = global_capture_opts.fork_child_status;
 
     if (print_packet_info) {
       if (!write_finale()) {
@@ -2128,6 +2160,7 @@ capture_input_new_packets(capture_options *capture_opts, int to_read)
 
   if(do_dissection) {
     while (to_read-- && cf->wth) {
+      wtap_cleareof(cf->wth);
       ret = wtap_read(cf->wth, &err, &err_info, &data_offset);
       if(ret == FALSE) {
         /* read from file failed, tell the capture child to stop */
@@ -2650,8 +2683,11 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type,
      * going to the same place, flush the standard output, so everything
      * buffered up is written, and then print a newline to the standard error
      * before printing the error message, to separate it from the packet
-     * data.
+     * data.  (Alas, that only works on UN*X; st_dev is meaningless, and
+     * the _fstat() documentation at Microsoft doesn't indicate whether
+     * st_ino is even supported.)
      */
+#ifndef _WIN32
     if (print_packet_info) {
       struct stat stat_stdout, stat_stderr;
 
@@ -2663,6 +2699,7 @@ load_cap_file(capture_file *cf, char *save_file, int out_file_type,
         }
       }
     }
+#endif
     switch (err) {
 
     case WTAP_ERR_UNSUPPORTED_ENCAP: