chiark / gitweb /
Merge branch 'master' of login.chiark.greenend.org.uk:public-git/inn-innduct
[inn-innduct.git] / backends / innduct.c
index 2e375d5d69517a4dc9ceb679c34b18eb3331f5fa..561ff0022ff30e3d43130aa31e4bcc5ce4f56d6a 100644 (file)
  *  with GPLv3.  If not then please let me know.  -Ian Jackson.)
  */
 
+/*
+ * todo
+ *
+ *  don't mind reconnecting if we just disconnected due to idle
+ *  some weird disconnection event still investigating
+ */
+
 /*
  * Newsfeeds file entries should look like this:
  *     host.name.of.site[/exclude,exclude,...]\
@@ -1116,12 +1123,13 @@ static void vconnfail(Conn *conn, const char *fmt, va_list al) {
   for (i=0, d=conn->xmitd; i<conn->xmitu; i++, d++)
     xmit_free(d);
 
+  LIST_REMOVE(conns,conn);
+
   char *m= xvasprintf(fmt,al);
-  warn("C%d connection failed requeueing " RCI_TRIPLE_FMT_BASE ": %s",
-       conn->fd, RCI_TRIPLE_VALS_BASE(requeue, /*nothing*/), m);
+  warn("C%d (now %d) connection failed requeueing " RCI_TRIPLE_FMT_BASE ": %s",
+       conn->fd, conns.count, RCI_TRIPLE_VALS_BASE(requeue, /*nothing*/), m);
   free(m);
 
-  LIST_REMOVE(conns,conn);
   conn_dispose(conn);
   check_assign_articles();
 }
@@ -1298,8 +1306,9 @@ static void *connchild_event(oop_source *lp, int fd, oop_event e, void *u) {
                     &peer_rd_err, conn);
   if (r) sysdie("oop_rd_read for peer (fd=%d)",conn->fd);
 
-  notice("C%d connected %s", conn->fd, conn->stream ? "streaming" : "plain");
   LIST_ADDHEAD(conns, conn);
+  notice("C%d (now %d) connected %s",
+        conn->fd, conns.count, conn->stream ? "streaming" : "plain");
 
   connect_attempt_discard();
   check_assign_articles();
@@ -1661,15 +1670,18 @@ static void *conn_write_some_xmits(Conn *conn) {
     assert(rs > 0);
 
     int done;
-    for (done=0; rs && done<conn->xmitu; done++) {
+    for (done=0; rs; ) {
+      assert(done<conn->xmitu);
       struct iovec *vp= &conn->xmit[done];
       XmitDetails *dp= &conn->xmitd[done];
-      if (rs > vp->iov_len) {
+      if (rs >= vp->iov_len) {
        rs -= vp->iov_len;
-       xmit_free(dp);
+       xmit_free(dp); /* vp->iov_len -= vp->iov_len, etc. */
+       done++;
       } else {
        vp->iov_base= (char*)vp->iov_base + rs;
        vp->iov_len -= rs;
+       break; /* rs -= rs */
       }
     }
     int newu= conn->xmitu - done;
@@ -1899,9 +1911,10 @@ static void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_rd_event ev,
     if (code!=205 && code!=503) {
       connfail(conn, "peer gave unexpected response to QUIT: %s", sani);
     } else {
-      notice("C%d idle connection closed by us", conn->fd);
-      assert(!conn_busy);
       LIST_REMOVE(conns,conn);
+      notice("C%d (now %d) idle connection closed by us",
+            conn->fd, conns.count);
+      assert(!conn_busy);
       conn_dispose(conn);
     }
     return OOP_CONTINUE;
@@ -1936,8 +1949,9 @@ static void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_rd_event ev,
     if (conn_busy)
       PEERBADMSG("peer timed us out or stopped accepting articles");
 
-    notice("C%d idle connection closed by peer", conn->fd);
     LIST_REMOVE(conns,conn);
+    notice("C%d (now %d) idle connection closed by peer",
+          conns.count, conn->fd);
     conn_dispose(conn);
     return OOP_CONTINUE;
 
@@ -3082,10 +3096,10 @@ static void *inndcomm_event(oop_source *lp, int fd, oop_event e, void *u) {
            " to site %s in newsfeeds)", feedfile, sitename);
 
       if (flushing_input_file) {
-       SMS(SEPARATED, max_separated_periods, "recovery flush complete");
+       SMS(SEPARATED, max_separated_periods, "flush complete");
       } else {
        close_defer();
-       SMS(NORMAL, spontaneous_flush_periods, "flush complete");
+       SMS(NORMAL, spontaneous_flush_periods, "recovery flush complete");
       }
       return OOP_CONTINUE;
 
@@ -3643,7 +3657,10 @@ int main(int argc, char **argv) {
 
   sitename= *argv++;
   if (!sitename) badusage("need site name argument");
-  remote_host= *argv++;
+
+  if (*argv) remote_host= *argv++;
+  else remote_host= sitename;
+  
   if (*argv) badusage("too many non-option arguments");
 
   /* defaults */