X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=innduct.git;a=blobdiff_plain;f=cli.c;h=b4938f42f7360a02aa8aebc71fe3d1dd211a4777;hp=b03f37065c799d175edfc627d95e0a85f92a5764;hb=HEAD;hpb=448f81b035e0685c419b28262cacf7114106d8eb diff --git a/cli.c b/cli.c index b03f370..941021b 100644 --- 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 - * - * 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 . - * - * (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 + * 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"); +}