chiark / gitweb /
changelog: Finalise 2.2
[innduct.git] / cli.c
diff --git a/cli.c b/cli.c
index b03f37065c799d175edfc627d95e0a85f92a5764..941021bf43eec9f14a6b9030c5b751661e547145 100644 (file)
--- a/cli.c
+++ b/cli.c
@@ -3,25 +3,9 @@
  *  tailing reliable realtime streaming feeder for inn
  *  cli.c - command and control connections
  *
- *  Copyright (C) 2010 Ian Jackson <ijackson@chiark.greenend.org.uk>
- * 
- *  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 3 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, see <http://www.gnu.org/licenses/>.
- *
- *  (I believe that when you compile and link this as part of the inn2
- *  build, with the Makefile runes I have provided, all the libraries
- *  and files which end up included in innduct are licence-compatible
- *  with GPLv3.  If not then please let me know.  -Ian Jackson.)
+ *  Copyright Ian Jackson <ijackson@chiark.greenend.org.uk>
+ *  and contributors; see LICENCE.txt.
+ *  SPDX-License-Identifier: GPL-3.0-or-later
  */
 
 #include "innduct.h"
@@ -103,6 +87,7 @@ CCMD(stop) {
 CCMD(logstats) { showstats(); }
 
 CCMD(dump);
+CCMD(dumphere);
 
 /* messing with our head: */
 CCMD(period) { period(); }
@@ -117,6 +102,7 @@ static const CliCommand cli_commands[]= {
   { "logstats",      ccmd_logstats  },
   { "dump q",        ccmd_dump, 0,0 },
   { "dump a",        ccmd_dump, 0,1 },
+  { "show",          ccmd_dumphere  },
 
   { "p",             ccmd_period    },
 
@@ -321,41 +307,43 @@ static void dump_article_list(FILE *f, const CliCommand *c,
     fprintf(f, " %s %s\n", TokenToText(art->token), art->messageid);
   }
 }
-  
+
+static void dump_counts_events(FILE *f, const Counts *counts) {
+  DUMPV("%d", counts->,events[read_ok]);
+  DUMPV("%d", counts->,events[read_blank]);
+  DUMPV("%d", counts->,events[read_err]);
+  DUMPV("%d", counts->,events[nooffer_missing]);
+}
+
+static void dump_counts_results(FILE *f, const Counts *counts,
+                               const char *wh1, const char *wh2) {
+  ArtState state; const char *const *statename;
+  for (state=0, statename=artstate_names; *statename; state++,statename++) {
+#define RC_DUMP_FMT(x) " " #x "=%d"
+#define RC_DUMP_VAL(x) ,counts->results[state][RC_##x]
+    fprintf(f,"%s%s counts %-11s"
+           RESULT_COUNTS(RC_DUMP_FMT,RC_DUMP_FMT) "\n",
+           wh1,wh2, *statename
+           RESULT_COUNTS(RC_DUMP_VAL,RC_DUMP_VAL));
+  }
+}
+
 static void dump_input_file(FILE *f, const CliCommand *c,
                            InputFile *ipf, const char *wh) {
   char *dipf= dbg_report_ipf(ipf);
   fprintf(f,"input %s %s", wh, dipf);
   free(dipf);
-  
-  if (ipf) {
-    DUMPV("%d", ipf->,readcount_ok);
-    DUMPV("%d", ipf->,readcount_blank);
-    DUMPV("%d", ipf->,readcount_err);
-    DUMPV("%d", ipf->,count_nooffer_missing);
-  }
+  if (ipf) dump_counts_events(f, &ipf->counts);
   fprintf(f,"\n");
   if (ipf) {
-    ArtState state; const char *const *statename; 
-    for (state=0, statename=artstate_names; *statename; state++,statename++) {
-#define RC_DUMP_FMT(x) " " #x "=%d"
-#define RC_DUMP_VAL(x) ,ipf->counts[state][RC_##x]
-      fprintf(f,"input %s counts %-11s"
-             RESULT_COUNTS(RC_DUMP_FMT,RC_DUMP_FMT) "\n",
-             wh, *statename
-             RESULT_COUNTS(RC_DUMP_VAL,RC_DUMP_VAL));
-    }
+    dump_counts_results(f, &ipf->counts, "input ",wh);
     fprintf(f,"input %s queue", wh);
     dump_article_list(f,c,&ipf->queue);
   }
 }
 
-CCMD(dump) {
+static void dumpinfo(const CliCommand *c, FILE *f) {
   int i;
-  fprintf(cc->out, "dumping state to %s\n", path_dump);
-  FILE *f= fopen(path_dump, "w");
-  if (!f) { fprintf(cc->out, "failed: open: %s\n", strerror(errno)); return; }
-
   fprintf(f,"general");
   DUMPV("%s", sms_names,[sms]);
   DUMPV("%d", ,until_flush);
@@ -393,6 +381,12 @@ CCMD(dump) {
   dump_input_file(f,c, main_input_file,     "main"    );
   dump_input_file(f,c, flushing_input_file, "flushing");
   dump_input_file(f,c, backlog_input_file,  "backlog" );
+  if (backlog_counts_report) {
+    fprintf(f,"completed backlogs");
+    dump_counts_events(f, &backlog_counts);
+    fprintf(f,"\n");
+    dump_counts_results(f, &backlog_counts, "completed backlogs","");
+  }
 
   fprintf(f,"conns count=%d\n", conns.count);
 
@@ -415,12 +409,12 @@ CCMD(dump) {
       const XmitDetails *xd= &conn->xmitd[i];
       char *dinfo;
       switch (xd->kind) {
-      case xk_Const:    dinfo= xasprintf("Const");                 break;
-      case xk_Artdata:  dinfo= xasprintf("A%p", xd->info.sm_art);  break;
+      case xk_Const:    dinfo= masprintf("Const");                 break;
+      case xk_Artdata:  dinfo= masprintf("A%p", xd->info.sm_art);  break;
       default:
        abort();
       }
-      fprintf(f," #%03d %-11s l=%d %s\n", i, dinfo, iv->iov_len,
+      fprintf(f," #%03d %-11s l=%zd %s\n", i, dinfo, iv->iov_len,
              sanitise(iv->iov_base, iv->iov_len));
       free(dinfo);
     }
@@ -435,9 +429,20 @@ CCMD(dump) {
   DUMPV("%s", , path_dump);
   DUMPV("%s", , globpat_backlog);
   fprintf(f,"\n");
+}
 
+CCMD(dump) {
+  fprintf(cc->out, "dumping state to %s\n", path_dump);
+  FILE *f= fopen(path_dump, "w");
+  if (!f) { fprintf(cc->out, "failed: open: %s\n", strerror(errno)); return; }
+  dumpinfo(c,f);
   if (!!ferror(f) + !!fclose(f)) {
     fprintf(cc->out, "failed: write: %s\n", strerror(errno));
     return;
   }
 }
+
+CCMD(dumphere) {
+  dumpinfo(c,cc->out);
+  fprintf(cc->out, ".\n");
+}