X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=innduct.git;a=blobdiff_plain;f=conn.c;h=36f554f1a6e422ca34e3de52540bea7157750dc4;hp=c99174c59317482768167b6f520e2e278471af6d;hb=e3812169fa785d9f7632bf8a82b4e9775fb7fbd6;hpb=0d0b89542d5657ecb96b02f35b1bfdd53c635cb2 diff --git a/conn.c b/conn.c index c99174c..36f554f 100644 --- a/conn.c +++ b/conn.c @@ -100,8 +100,9 @@ void vconnfail(Conn *conn, const char *fmt, va_list al) { LIST_REMOVE(conns,conn); - char *m= xvasprintf(fmt,al); - warn("C%d (now %d) connection failed requeueing " RCI_TRIPLE_FMT_BASE ": %s", + char *m= mvasprintf(fmt,al); + 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); @@ -188,6 +189,30 @@ void check_idle_conns(void) { conn_idle_close(conn, "low volume"); } +/*---------- reporting numbers of connections ----------*/ + +static int conns_max_reported, conns_idle_reported; + +void notice_conns_more(const char *new_kind) { + if (conns.count > conns_max_reported) { + notice("up to %d connection(s) (%s)", conns.count, new_kind); + conns_max_reported= conns.count; + } +} + +void notice_conns_fewer(void) { + if (!conns.count && !conns_idle_reported) { + notice("low volume, using intermittent connection"); + conns_idle_reported= 1; + } +} + +void notice_conns_stats(void) { + notice("currently %d connection(s)", conns.count); + conns_max_reported= conns.count; + conns_idle_reported= 0; +} + /*---------- making new connections ----------*/ pid_t connecting_child; @@ -302,14 +327,15 @@ static void *connchild_event(oop_source *lp, int fd, oop_event e, void *u) { loop->on_fd(loop, conn->fd, OOP_EXCEPTION, conn_exception, conn); conn->rd= oop_rd_new_fd(loop,conn->fd, 0, 0); /* sets nonblocking, too */ if (!conn->fd) crash("oop_rd_new_fd conn failed (fd=%d)",conn->fd); - int r= oop_rd_read(conn->rd, &peer_rd_style, NNTP_STRLEN, + int r= oop_rd_read(conn->rd, &peer_rd_style, NNTP_MAXLEN_COMMAND+1, &peer_rd_ok, conn, &peer_rd_err, conn); if (r) syscrash("oop_rd_read for peer (fd=%d)",conn->fd); LIST_ADDHEAD(conns, conn); - notice("C%d (now %d) connected %s", - conn->fd, conns.count, conn->stream ? "streaming" : "plain"); + const char *streamdesc= conn->stream ? "streaming" : "plain"; + info("C%d (now %d) connected %s", conn->fd, conns.count, streamdesc); + notice_conns_more(streamdesc); connect_attempt_discard(); check_assign_articles(); @@ -344,13 +370,15 @@ void connect_start(void) { if (!connecting_child) { FILE *cn_from, *cn_to; - char buf[NNTP_STRLEN+100]; + char buf[NNTP_MAXLEN_COMMAND+100]; int exitstatus= CONNCHILD_ESTATUS_NOSTREAM; xclose(socks[0], "(in child) parent's connection fdpass socket",0); alarm(connection_setup_timeout); - if (NNTPconnect((char*)remote_host, port, &cn_from, &cn_to, buf) < 0) { + buf[sizeof(buf)-1] = 0; + if (NNTPconnect(remote_host, port, &cn_from, &cn_to, + buf, sizeof(buf)-1) < 0) { int l= strlen(buf); int stripped=0; while (l>0) { @@ -402,7 +430,7 @@ void connect_start(void) { default: warn("connect: unexpected response to MODE STREAM: %.50s", sanitise(buf,-1)); - exitstatus= 2; + exitstatus= CONNCHILD_ESTATUS_NOSTREAM; break; } }