+/*
+ * innduct
+ * tailing reliable realtime streaming feeder for inn
+ * recv.c - receiving peer responses and disposing of articles
+ *
+ * Copyright Ian Jackson <ijackson@chiark.greenend.org.uk>
+ * and contributors; see LICENCE.txt.
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#include "innduct.h"
+
/*========== handling responses from peer ==========*/
-static const oop_rd_style peer_rd_style= {
+const oop_rd_style peer_rd_style= {
OOP_RD_DELIM_STRIP, '\n',
OOP_RD_NUL_FORBID,
OOP_RD_SHORTREC_FORBID
};
-static void *peer_rd_err(oop_source *lp, oop_read *oread, oop_rd_event ev,
- const char *errmsg, int errnoval,
- const char *data, size_t recsz, void *conn_v) {
+void *peer_rd_err(oop_source *lp, oop_read *oread, oop_rd_event ev,
+ const char *errmsg, int errnoval,
+ const char *data, size_t recsz, void *conn_v) {
Conn *conn= conn_v;
connfail(conn, "error receiving from peer: %s", errmsg);
return OOP_CONTINUE;
nocheck= new_nocheck;
}
-static void article_done(Article *art, int whichcount) {
+void article_done(Article *art, int whichcount) {
if (whichcount>=0 && !art->missing)
- art->ipf->counts[art->state][whichcount]++;
+ art->ipf->counts.results[art->state][whichcount]++;
- if (whichcount == RC_accepted) update_nocheck(1);
- else if (whichcount == RC_unwanted) update_nocheck(0);
+ if (whichcount == RC_accepted)
+ update_nocheck(1);
+ else if (whichcount == RC_unwanted ||
+ (whichcount == RC_rejected && art->state == art_Unsolicited))
+ update_nocheck(0);
InputFile *ipf= art->ipf;
queue_check_input_done();
}
-static void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_rd_event ev,
- const char *errmsg, int errnoval,
- const char *data, size_t recsz, void *conn_v) {
+void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_rd_event ev,
+ const char *errmsg, int errnoval,
+ const char *data, size_t recsz, void *conn_v) {
Conn *conn= conn_v;
if (ev == OOP_RD_EOF) {
conn->quitting, sani);
} else {
LIST_REMOVE(conns,conn);
- notice("C%d (now %d) idle connection closed (%s)",
+ info("C%d (now %d) idle connection closed (%s)",
conn->fd, conns.count, conn->quitting);
+ notice_conns_fewer();
assert(!busy);
conn_dispose(conn);
}
PEERBADMSG("peer timed us out or stopped accepting articles");
LIST_REMOVE(conns,conn);
- notice("C%d (now %d) idle connection closed by peer",
- conns.count, conn->fd);
+ info("C%d (now %d) idle connection closed by peer",
+ conns.count, conn->fd);
+ notice_conns_fewer();
conn_dispose(conn);
return OOP_CONTINUE;
case 335: /* IHAVE says send it */
GET_ARTICLE(-1);
assert(art->state == art_Unchecked);
- art->ipf->counts[art->state][RC_accepted]++;
+ art->ipf->counts.results[art->state][RC_accepted]++;
art->state= art_Wanted;
LIST_ADDTAIL(conn->priority, art);
break;