chiark / gitweb /
server shouldn't crash on client disconnect!
authorRichard Kettlewell <rjk@greenend.org.uk>
Sat, 10 Nov 2007 13:42:11 +0000 (13:42 +0000)
committerRichard Kettlewell <rjk@greenend.org.uk>
Sat, 10 Nov 2007 13:42:11 +0000 (13:42 +0000)
lib/event.c
server/server.c

index 0745695..c42eca3 100644 (file)
@@ -976,10 +976,12 @@ static int writer_shutdown(ev_source *ev,
   ev_fd_cancel(ev, ev_write, w->fd);
   w->timeout = 0;
   if(w->reader) {
+    info("found a tied reader");
     /* If there is a reader still around we just untie it */
     w->reader->writer = 0;
     shutdown(w->fd, SHUT_WR);          /* there'll be no more writes */
   } else {
+    info("no tied reader");
     /* There's no reader so we are free to close the FD */
     xclose(w->fd);
   }
@@ -1237,10 +1239,12 @@ static int reader_shutdown(ev_source *ev,
   ev_fd_cancel(ev, ev_read, r->fd);
   r->eof = 1;
   if(r->writer) {
+    info("found a tied writer");
     /* If there is a writer still around we just untie it */
     r->writer->reader = 0;
     shutdown(r->fd, SHUT_RD);          /* there'll be no more reads */
   } else {
+    info("no tied writer found");
     /* There's no writer so we are free to close the FD */
     xclose(r->fd);
   }
index 4b71e4e..89447c0 100644 (file)
@@ -109,13 +109,16 @@ static int writer_error(ev_source attribute((unused)) *ev,
   struct conn *c = u;
 
   D(("server writer_error %d", errno_value));
+  info("writer_error S%x %d", c->tag, errno_value);
   if(errno_value == 0) {
     /* writer is done */
     error(errno_value, "S%x writer completed", c->tag);        /* TODO */
   } else {
     if(errno_value != EPIPE)
       error(errno_value, "S%x write error on socket", c->tag);
+    info("cancel reader");
     ev_reader_cancel(c->r);
+    info("done cancel reader");
   }
   ev_report(ev);
   return 0;
@@ -127,7 +130,8 @@ static int reader_error(ev_source attribute((unused)) *ev,
   struct conn *c = u;
 
   D(("server reader_error %d", errno_value));
-  error(errno, "S%x read error on socket", c->tag);
+  info("reader_error S%x %d", c->tag, errno_value);
+  error(errno_value, "S%x read error on socket", c->tag);
   ev_writer_close(c->w);
   ev_report(ev);
   return 0;
@@ -1082,7 +1086,6 @@ static int reader_callback(ev_source attribute((unused)) *ev,
   if(eof) {
     if(bytes)
       error(0, "S%x unterminated line", c->tag);
-    c->r = 0;
     return ev_writer_close(c->w);
   }
   return 0;