X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/1e14551ab904b85db4e1f11c1a37c18ed0a0ac58..6734d5281b0eff7a390a50a813edc8abeefc2e2e:/uslip/uslip.c diff --git a/uslip/uslip.c b/uslip/uslip.c index 74a5b17e..629da123 100644 --- a/uslip/uslip.c +++ b/uslip/uslip.c @@ -9,19 +9,18 @@ * * This file is part of Trivial IP Encryption (TrIPE). * - * TrIPE is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * TrIPE is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at your + * option) any later version. * - * TrIPE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * TrIPE is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. * * You should have received a copy of the GNU General Public License - * along with TrIPE; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * along with TrIPE. If not, see . */ /*----- Header files ------------------------------------------------------*/ @@ -55,6 +54,7 @@ #include #include #include +#include #include #include @@ -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; @@ -195,10 +195,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 +213,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 +320,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 +345,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 +374,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 +383,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 +405,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 +451,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 +461,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 +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) @@ -572,11 +570,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 +603,11 @@ 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, SIGHUP, slip_term, &fd); + sig_add(&term, SIGINT, slip_term, &fd); + initqueue(&q_in); reasons++; @@ -614,7 +621,7 @@ static void slipif(void) /* --- Main loop --- */ while (reasons) { - if (sel_select(&sel)) + if (sel_select(&sel) && errno != EINTR) die(EXIT_FAILURE, "select: %s", strerror(errno)); } @@ -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); }