chiark / gitweb /
changelog: Finalise 2.2
[innduct.git] / recv.c
diff --git a/recv.c b/recv.c
index 870e0e52ec38e83d0f06d77fdc08190e5e4b4db3..44587bf1fb954dca661bf9e1a0569b1f5b26b26a 100644 (file)
--- a/recv.c
+++ b/recv.c
@@ -1,14 +1,26 @@
+/*
+ *  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;
@@ -87,12 +99,15 @@ static void update_nocheck(int accepted) {
   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;
 
@@ -129,9 +144,9 @@ static void article_done(Article *art, int whichcount) {
     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) {
@@ -157,8 +172,9 @@ static void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_rd_event ev,
               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);
     }
@@ -195,8 +211,9 @@ static void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_rd_event ev,
       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;
 
@@ -214,7 +231,7 @@ static void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_rd_event ev,
   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;