chiark
/
gitweb
/
~mdw
/
tripe
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
configure.ac: Hack probed Wireshark plugin dir in case of corruption.
[tripe]
/
uslip
/
uslip.c
diff --git
a/uslip/uslip.c
b/uslip/uslip.c
index 7752458c286031d3156f1c6f359dc1d32f015b95..0ed9e70e59b8da707b681dcc203d810758ce0ef7 100644
(file)
--- a/
uslip/uslip.c
+++ b/
uslip/uslip.c
@@
-55,6
+55,7
@@
#include <mLib/quis.h>
#include <mLib/report.h>
#include <mLib/sel.h>
#include <mLib/quis.h>
#include <mLib/report.h>
#include <mLib/sel.h>
+#include <mLib/sig.h>
#include <mLib/sub.h>
#include <mLib/tv.h>
#include <mLib/sub.h>
#include <mLib/tv.h>
@@
-461,6
+462,16
@@
static void done_slip_dribble(dribbler *d, int err, void *hunoz)
cripple_dribbler(d);
}
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;
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) {
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)
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;
static void slipif(void)
{
int fd;
dstr d = DSTR_INIT;
struct sockaddr_un sun;
+ sig term;
size_t sz;
/* --- Make the socket --- */
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);
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++;
initqueue(&q_in);
reasons++;