X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/1e14551ab904b85db4e1f11c1a37c18ed0a0ac58..8d1d183ef5293bcd1e68dd4154b00a8a64d33fa8:/uslip/uslip.c?ds=sidebyside
diff --git a/uslip/uslip.c b/uslip/uslip.c
index 74a5b17e..66cc0797 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,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 +726,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 +765,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 +802,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 +834,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);
}