uslip/uslip.c: Abstract out the server's EOF-on-stdin behaviour.
[tripe] / uslip / uslip.c
index 6a8a4c0..853df5b 100644 (file)
@@ -135,7 +135,7 @@ static void socketaddr(struct sockaddr_un *sun, size_t *sz)
 
 static void initqueue(pkq *q) { q->head = 0; q->tail = &q->head; }
 
-static pkq_node *make_pkqnode(void *p, size_t n)
+static pkq_node *make_pkqnode(const void *p, size_t n)
 {
   pkq_node *pn;
 
@@ -461,6 +461,16 @@ static void done_slip_dribble(dribbler *d, int err, void *hunoz)
     cripple_dribbler(d);
 }
 
+static void close_slip(int fd)
+{
+  switch (slipstate) {
+    case SYNC1: case SYNC2: case START: case BAD: break;
+    default: moan("eof found while processing packet (discarding)"); break;
+  }
+  close(fd); sel_rmfile(&slip_in);
+  reasons--;
+}
+
 static void do_slip_in(int fd, unsigned mode, void *hunoz)
 {
   ssize_t i, n;
@@ -477,19 +487,7 @@ static void do_slip_in(int fd, unsigned mode, void *hunoz)
   for (;;) {
     n = read(fd, buf, sizeof(buf));
     if (n == 0) {
-      switch (slipstate) {
-       case SYNC1:
-       case SYNC2:
-       case START:
-       case BAD:
-         break;
-       default:
-         moan("eof found while processing packet (discarding)");
-         break;
-      }
-      close(fd);
-      sel_rmfile(&slip_in);
-      reasons--;
+      close_slip(fd);
       return;
     } else if (n < 0) {
       if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)