X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/1e14551ab904b85db4e1f11c1a37c18ed0a0ac58..77781be832eea78e2942b3a9422e0f3b438045ac:/uslip/uslip.c diff --git a/uslip/uslip.c b/uslip/uslip.c index 74a5b17e..0ed9e70e 100644 --- a/uslip/uslip.c +++ b/uslip/uslip.c @@ -55,6 +55,7 @@ #include #include #include +#include #include #include @@ -135,7 +136,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; @@ -195,10 +196,10 @@ static void destroy_pkq(pkq *q) * calls a user-supplied calback function, and quits. */ -static void gobbler_close(gobbler *g) +static void close_gobbler(gobbler *g) { if (g->f.fd != -1) { sel_rmfile(&g->f); close(g->f.fd); g->f.fd = -1; } } -static void gobbler_destroy(gobbler *g) { gobbler_close(g); DESTROY(g); } +static void destroy_gobbler(gobbler *g) { close_gobbler(g); DESTROY(g); } static void do_gobble_in(int fd, unsigned mode, void *p) { @@ -213,12 +214,12 @@ static void do_gobble_in(int fd, unsigned mode, void *p) else { moan("read (gobble): %s", strerror(errno)); if (g->done) g->done(g, errno, g->p); - gobbler_close(g); + close_gobbler(g); break; } } else if (n == 0) { if (g->done) g->done(g, 0, g->p); - gobbler_close(g); + close_gobbler(g); break; } } @@ -320,7 +321,7 @@ static void done_client_dribble(dribbler *d, int err, void *p) { if (err) moan("write (client): %s", strerror(err)); - gobbler_destroy(p); + destroy_gobbler(p); destroy_dribbler(d); reasons--; } @@ -345,7 +346,7 @@ static void dequeue_to_waiter(void) } } -static void client_destroy(client *c) +static void destroy_client(client *c) { sel_rmfile(&c->f); close(c->f.fd); @@ -374,7 +375,7 @@ static void do_client_in(int fd, unsigned mode, void *p) break; else { moan("read (client): %s", strerror(errno)); - client_destroy(c); + destroy_client(c); return; } } else if (n == 0) { @@ -383,7 +384,7 @@ static void do_client_in(int fd, unsigned mode, void *p) if (enqueue_dribble(dribble_out, make_pkqnode(c->d.buf, c->d.len))) reasons++; } - client_destroy(c); + destroy_client(c); return; } if (c->mode == '?') { @@ -405,7 +406,7 @@ static void do_client_in(int fd, unsigned mode, void *p) return; default: moan("bad client mode `%c'", buf[0]); - client_destroy(c); + destroy_client(c); return; } } @@ -451,7 +452,7 @@ static void do_accept(int fd, unsigned mode, void *hunoz) /*----- Main daemon -------------------------------------------------------*/ -static void done_slip_dribble(dribbler *d, int err, void *p) +static void done_slip_dribble(dribbler *d, int err, void *hunoz) { if (!err) reasons--; @@ -461,6 +462,16 @@ static void done_slip_dribble(dribbler *d, int err, void *p) 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 +488,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) @@ -572,11 +571,15 @@ static void do_slip_in(int fd, unsigned mode, void *hunoz) } } +static void slip_term(int n, void *fdp) + { close_slip(*(int *)fdp); } + static void slipif(void) { int fd; dstr d = DSTR_INIT; struct sockaddr_un sun; + sig term; size_t sz; /* --- Make the socket --- */ @@ -601,6 +604,10 @@ static void slipif(void) dribble_out = make_dribbler(STDOUT_FILENO, done_slip_dribble, 0); sel_addfile(&slip_in); + sig_init(&sel); + sig_add(&term, SIGTERM, slip_term, &fd); + sig_add(&term, SIGINT, slip_term, &fd); + initqueue(&q_in); reasons++; @@ -720,7 +727,7 @@ static void conndoconnect(conninfo *c) static int timerflag; -static void conndrip(struct timeval *tv, void *p) +static void conndrip(struct timeval *tv, void *hunoz) { conninfo *c, *cc; @@ -759,7 +766,7 @@ static void connloop(void (*connected)(int, conninfo *)) /* --- Sinking (glug glug) --- */ -static void sink_close(gobbler *g, int err, void *p) +static void close_sink(gobbler *g, int err, void *p) { static char baton[4] = "/-\\|"; static int pos = 0; @@ -796,14 +803,14 @@ static void sink_connected(int fd, conninfo *c) connrecycle(c); return; } - make_gobbler(fd, sink_close, c); + make_gobbler(fd, close_sink, c); } static void sink(void) { connloop(sink_connected); } /* --- Flooding --- */ -static void flood_close(dribbler *d, int err, void *p) +static void close_flood(dribbler *d, int err, void *p) { conninfo *c = p; @@ -828,7 +835,7 @@ static void flood_connected(int fd, conninfo *c) for (i = 4; i < FLOOD_PKSZ; i++) pn->buf[i + 1] = i & 0xff; seq++; - d = make_dribbler(fd, flood_close, c); + d = make_dribbler(fd, close_flood, c); enqueue_dribble(d, pn); }