* 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"
CCMD(logstats) { showstats(); }
CCMD(dump);
+CCMD(dumphere);
/* messing with our head: */
CCMD(period) { period(); }
{ "logstats", ccmd_logstats },
{ "dump q", ccmd_dump, 0,0 },
{ "dump a", ccmd_dump, 0,1 },
+ { "show", ccmd_dumphere },
{ "p", ccmd_period },
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);
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);
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);
}
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");
+}