ISNODE(Conn);
int fd; /* may be 0, meaning closed (during construction/destruction) */
oop_read *rd; /* likewise */
- int max_queue, stream, quitting;
+ int max_queue, stream;
+ const char *quitting;
int since_activity; /* periods */
ArticleList waiting; /* not yet told peer */
ArticleList priority; /* peer says send it now */
assert(r<=todo);
todo -= r;
if (!todo) {
- conn->quitting= 1;
+ conn->quitting= why;
conn->since_activity= 0;
debug("C%d is idle (%s), quitting", conn->fd, why);
break;
/* We need to shut this down */
if (conn->quitting)
- connfail(conn,"timed out waiting for response to QUIT");
+ connfail(conn,"timed out waiting for response to QUIT (%s)",
+ conn->quitting);
else if (conn->sent.count)
connfail(conn,"timed out waiting for responses");
else if (conn->waiting.count || conn->priority.count)
}
static void autodefer_input_file(InputFile *ipf) {
+ static const char *const abandon= "stuck";
ipf->autodefer= 0;
autodefer_input_file_articles(ipf);
if (has_article_in(&walk->waiting, ipf) ||
has_article_in(&walk->priority, ipf) ||
has_article_in(&walk->sent, ipf))
- walk->quitting= -1;
+ walk->quitting= abandon;
}
while (ipf->inprogress) {
FOR_CONN(walk)
- if (walk->quitting < 0) goto found;
+ if (walk->quitting == abandon) goto found;
abort(); /* where are they ?? */
found:
if (conn->quitting) {
if (code!=205 && code!=400) {
- connfail(conn, "peer gave unexpected response to QUIT: %s", sani);
+ connfail(conn, "peer gave unexpected response to QUIT (%s): %s",
+ conn->quitting, sani);
} else {
LIST_REMOVE(conns,conn);
- notice("C%d (now %d) idle connection closed by us",
- conn->fd, conns.count);
+ notice("C%d (now %d) idle connection closed (%s)",
+ conn->fd, conns.count, conn->quitting);
assert(!busy);
conn_dispose(conn);
}
fprintf(f,"C%d",conn->fd);
DUMPV("%p",conn->,rd); DUMPV("%d",conn->,max_queue);
- DUMPV("%d",conn->,stream); DUMPV("%d",conn->,quitting);
+ DUMPV("%d",conn->,stream); DUMPV("\"%s\"",conn->,quitting);
DUMPV("%d",conn->,since_activity);
fprintf(f,"\n");