chiark / gitweb /
fixes
[innduct.git] / backends / innduct.c
index bc954f41c785666e9c3878ec68294fbb19ace6ba..acbae608ad4ecef16452814f886d56ef3a565d8d 100644 (file)
@@ -1,4 +1,18 @@
 /*
+ * bugs
+ *
+
+ [740] <sit> info: processed feedfile(null) read=4(+0bl,+6err) offered=5(ch5,nc0) accepted=0(ch0+nc0) unwanted=0(0id+0bd+0nc) rejected=0(0id+0bd+0nc) deferred=0(0id+0bd+0nc) missing=2(0id+2bd+0nc) connretry=0(0id+0bd+0nc)
+
+    (null) ?!
+
+   also unwanted should be nonzero I think
+
+   %d(  is too hard to read
+
+ [740] <sit> warning: corrupted file: /home/ian/things/Innfeed/inn2-2.4.5/fee, offset 349: line partially blanked: in `                                                  @050000002D130000006A0000000000000000@ <mi'..
+
+
  * todo
  *  - actually do something with readable on control master
  *  - option for realsockdir
@@ -291,6 +305,8 @@ static void statemc_setstate(StateMachineState newsms, int periods,
 static void statemc_start_flush(const char *why); /* Normal => Flushing */
 static void spawn_inndcomm_flush(const char *why); /* Moved => Flushing */
 
+static void article_done(Conn *conn, Article *art, int whichcount);
+
 static void check_assign_articles(void);
 static void queue_check_input_done(void);
 
@@ -359,7 +375,7 @@ typedef enum {      /* in queue                 in conn->sent             */
   art_Unchecked,    /*   not checked, not sent    checking                */
   art_Wanted,       /*   checked, wanted          sent body as requested  */
   art_Unsolicited,  /*   -                        sent body without check */
-  art_MaxState
+  art_MaxState,
 } ArtState;
 
 #define RESULT_COUNTS(RCS,RCN)                 \
@@ -368,9 +384,10 @@ typedef enum {      /* in queue                 in conn->sent             */
   RCN(unwanted)                                        \
   RCN(rejected)                                        \
   RCN(deferred)                                        \
+  RCN(missing)                                 \
   RCN(connretry)
 
-#define RCI_TRIPLE_FMT_BASE "%d(id%d+bd%d+nc%d)"
+#define RCI_TRIPLE_FMT_BASE "%d(%did+%dbd+%dnc)"
 #define RCI_TRIPLE_VALS_BASE(counts,x)         \
        counts[art_Unchecked] x                 \
        + counts[art_Wanted] x                  \
@@ -427,7 +444,7 @@ struct InputFile {
 struct Article {
   ISNODE(Article);
   ArtState state;
-  int midlen;
+  int midlen, missing;
   InputFile *ipf;
   TOKEN token;
   off_t offset;
@@ -1039,6 +1056,7 @@ static void *conn_exception(oop_source *lp, int fd,
 
 static void vconnfail(Conn *conn, const char *fmt, va_list al) {
   int requeue[art_MaxState];
+  memset(requeue,0,sizeof(requeue));
 
   Article *art;
   while ((art= LIST_REMHEAD(conn->priority))) LIST_ADDTAIL(queue, art);
@@ -1242,7 +1260,7 @@ static void *connchild_event(oop_source *lp, int fd, oop_event e, void *u) {
 
   connect_attempt_discard();
   check_assign_articles();
-  return 0;
+  return OOP_CONTINUE;
 
  x:
   conn_dispose(conn);
@@ -1510,12 +1528,23 @@ static void conn_make_some_xmits(Conn *conn) {
 
       ARTHANDLE *artdata= SMretrieve(art->token, RETR_ALL);
 
+      art->state=
+       art->state == art_Unchecked ? art_Unsolicited :
+       art->state == art_Wanted    ? art_Wanted      :
+       (abort(),-1);
+
+      if (!artdata) art->missing= 1;
+      art->ipf->counts[art->state][ artdata ? RC_sent : RC_missing ]++;
+
       if (conn->stream) {
        if (artdata) {
          XMIT_LITERAL("TAKETHIS ");
          xmit_noalloc(conn, art->messageid, art->midlen);
          XMIT_LITERAL("\r\n");
          xmit_artbody(conn, artdata);
+       } else {
+         article_done(conn, art, -1);
+         continue;
        }
       } else {
        /* we got 235 from IHAVE */
@@ -1526,20 +1555,15 @@ static void conn_make_some_xmits(Conn *conn) {
        }
       }
 
-      art->state=
-       art->state == art_Unchecked ? art_Unsolicited :
-       art->state == art_Wanted    ? art_Wanted      :
-       (abort(),-1);
-      art->ipf->counts[art->state][RC_sent]++;
       LIST_ADDTAIL(conn->sent, art);
 
     } else {
       /* check it */
 
       if (conn->stream)
-       XMIT_LITERAL("IHAVE ");
-      else
        XMIT_LITERAL("CHECK ");
+      else
+       XMIT_LITERAL("IHAVE ");
       xmit_noalloc(conn, art->messageid, art->midlen);
       XMIT_LITERAL("\r\n");
 
@@ -1641,7 +1665,8 @@ static void update_nocheck(int accepted) {
 }
 
 static void article_done(Conn *conn, Article *art, int whichcount) {
-  art->ipf->counts[art->state][whichcount]++;
+  if (!art->missing) art->ipf->counts[art->state][whichcount]++;
+
   if (whichcount == RC_accepted) update_nocheck(1);
   else if (whichcount == RC_unwanted) update_nocheck(0);
 
@@ -1713,7 +1738,7 @@ static void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_rd_event ev,
   Article *art;
 
 #define GET_ARTICLE(musthavesent)                                          \
-  art= article_reply_check(conn, data, musthavesent, code_streaming, sani); \
+  art= article_reply_check(conn, data, code_streaming, musthavesent, sani); \
   if (art) ; else return OOP_CONTINUE /* reply_check has failed the conn */
 
 #define ARTICLE_DEALTWITH(streaming,musthavesent,how)          \
@@ -1787,7 +1812,7 @@ static void feedfile_eof(InputFile *ipf) {
 }
 
 static InputFile *open_input_file(const char *path) {
-  int fd= open(path, O_RDONLY);
+  int fd= open(path, O_RDWR);
   if (fd<0) {
     if (errno==ENOENT) return 0;
     sysfatal("unable to open input file %s", path);