chiark
/
gitweb
/
~ianmdlvl
/
secnet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
build system: add a .gitignore
[secnet.git]
/
slip.c
diff --git
a/slip.c
b/slip.c
index 60152c9a984deea96a8839e89d6222fd346660a4..de138f9fd98a4e904aeb14c4936662b67f6da696 100644
(file)
--- a/
slip.c
+++ b/
slip.c
@@
-37,7
+37,7
@@
static void slip_stuff(struct slip *st, struct buffer_if *buf, int fd)
BUF_ASSERT_USED(buf);
BUF_ASSERT_USED(buf);
- /*
XXX crunchy bytestuff code
*/
+ /*
There's probably a much more efficient way of implementing this
*/
txbuf[j++]=SLIP_END;
for (i=buf->start; i<(buf->start+buf->size); i++) {
switch (*i) {
txbuf[j++]=SLIP_END;
for (i=buf->start; i<(buf->start+buf->size); i++) {
switch (*i) {
@@
-71,8
+71,6
@@
static void slip_unstuff(struct slip *st, uint8_t *buf, uint32_t l)
{
uint32_t i;
{
uint32_t i;
- /* XXX really crude unstuff code */
- /* XXX check for buffer overflow */
BUF_ASSERT_USED(st->buff);
for (i=0; i<l; i++) {
if (st->pending_esc) {
BUF_ASSERT_USED(st->buff);
for (i=0; i<l; i++) {
if (st->pending_esc) {
@@
-85,7
+83,7
@@
static void slip_unstuff(struct slip *st, uint8_t *buf, uint32_t l)
*(uint8_t *)buf_append(st->buff,1)=SLIP_ESC;
break;
default:
*(uint8_t *)buf_append(st->buff,1)=SLIP_ESC;
break;
default:
- fatal("userv_afterpoll: bad SLIP escape character
\n
");
+ fatal("userv_afterpoll: bad SLIP escape character");
}
} else {
switch (buf[i]) {
}
} else {
switch (buf[i]) {
@@
-108,7
+106,7
@@
static void slip_unstuff(struct slip *st, uint8_t *buf, uint32_t l)
}
static void slip_init(struct slip *st, struct cloc loc, dict_t *dict,
}
static void slip_init(struct slip *st, struct cloc loc, dict_t *dict,
- string_t name, netlink_deliver_fn *to_host)
+
c
string_t name, netlink_deliver_fn *to_host)
{
st->netlink_to_tunnel=
netlink_init(&st->nl,st,loc,dict,
{
st->netlink_to_tunnel=
netlink_init(&st->nl,st,loc,dict,
@@
-126,9
+124,9
@@
struct userv {
struct slip slip;
int txfd; /* We transmit to userv */
int rxfd; /* We receive from userv */
struct slip slip;
int txfd; /* We transmit to userv */
int rxfd; /* We receive from userv */
- string_t userv_path;
- string_t service_user;
- string_t service_name;
+
c
string_t userv_path;
+
c
string_t service_user;
+
c
string_t service_name;
pid_t pid;
bool_t expecting_userv_exit;
};
pid_t pid;
bool_t expecting_userv_exit;
};
@@
-142,9
+140,9
@@
static int userv_beforepoll(void *sst, struct pollfd *fds, int *nfds_io,
if (st->rxfd!=-1) {
*nfds_io=2;
fds[0].fd=st->txfd;
if (st->rxfd!=-1) {
*nfds_io=2;
fds[0].fd=st->txfd;
- fds[0].events=
POLLERR
; /* Might want to pick up POLLOUT sometime */
+ fds[0].events=
0
; /* Might want to pick up POLLOUT sometime */
fds[1].fd=st->rxfd;
fds[1].fd=st->rxfd;
- fds[1].events=POLLIN
|POLLERR|POLLHUP
;
+ fds[1].events=POLLIN;
} else {
*nfds_io=0;
}
} else {
*nfds_io=0;
}
@@
-170,7
+168,7
@@
static void userv_afterpoll(void *sst, struct pollfd *fds, int nfds,
fatal_perror("%s: userv_afterpoll: read(rxfd)",
st->slip.nl.name);
} else if (l==0) {
fatal_perror("%s: userv_afterpoll: read(rxfd)",
st->slip.nl.name);
} else if (l==0) {
- fatal("%s: userv_afterpoll: read(rxfd)=0; userv gone away?
\n
",
+ fatal("%s: userv_afterpoll: read(rxfd)=0; userv gone away?",
st->slip.nl.name);
} else slip_unstuff(&st->slip,rxbuf,l);
}
st->slip.nl.name);
} else slip_unstuff(&st->slip,rxbuf,l);
}
@@
-195,13
+193,13
@@
static void userv_userv_callback(void *sst, pid_t pid, int status)
}
if (!st->expecting_userv_exit) {
if (WIFEXITED(status)) {
}
if (!st->expecting_userv_exit) {
if (WIFEXITED(status)) {
- fatal("%s: userv exited unexpectedly with status %d
\n
",
+ fatal("%s: userv exited unexpectedly with status %d",
st->slip.nl.name,WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
st->slip.nl.name,WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
- fatal("%s: userv exited unexpectedly: uncaught signal %d
\n
",
+ fatal("%s: userv exited unexpectedly: uncaught signal %d",
st->slip.nl.name,WTERMSIG(status));
} else {
st->slip.nl.name,WTERMSIG(status));
} else {
- fatal("%s: userv stopped unexpectedly
\n
");
+ fatal("%s: userv stopped unexpectedly");
}
}
Message(M_WARNING,"%s: userv subprocess died with status %d\n",
}
}
Message(M_WARNING,"%s: userv subprocess died with status %d\n",
@@
-210,8
+208,8
@@
static void userv_userv_callback(void *sst, pid_t pid, int status)
}
struct userv_entry_rec {
}
struct userv_entry_rec {
- string_t path;
- char **argv;
+
c
string_t path;
+ c
onst c
har **argv;
int in;
int out;
/* XXX perhaps we should collect and log stderr? */
int in;
int out;
/* XXX perhaps we should collect and log stderr? */
@@
-226,7
+224,9
@@
static void userv_entry(void *sst)
/* XXX close all other fds */
setsid();
/* XXX close all other fds */
setsid();
- execvp(st->path,st->argv);
+ /* XXX We really should strdup() all of argv[] but because we'll just
+ exit anyway if execvp() fails it doesn't seem worth bothering. */
+ execvp(st->path,(char *const*)st->argv);
perror("userv-entry: execvp()");
exit(1);
}
perror("userv-entry: execvp()");
exit(1);
}
@@
-239,14
+239,14
@@
static void userv_invoke_userv(struct userv *st)
string_t addrs;
string_t nets;
string_t s;
string_t addrs;
string_t nets;
string_t s;
- struct netlink_
route
*r;
- struct ipset *
is
nets;
+ struct netlink_
client
*r;
+ struct ipset *
all
nets;
struct subnet_list *snets;
struct subnet_list *snets;
- int i;
+ int i
, nread
;
uint8_t confirm;
if (st->pid) {
uint8_t confirm;
if (st->pid) {
- fatal("userv_invoke_userv: already running
\n
");
+ fatal("userv_invoke_userv: already running");
}
/* This is where we actually invoke userv - all the networks we'll
}
/* This is where we actually invoke userv - all the networks we'll
@@
-257,21
+257,18
@@
static void userv_invoke_userv(struct userv *st)
ipaddr_to_string(st->slip.local_address),
ipaddr_to_string(st->slip.nl.secnet_address),st->slip.nl.mtu);
ipaddr_to_string(st->slip.local_address),
ipaddr_to_string(st->slip.nl.secnet_address),st->slip.nl.mtu);
- r=st->slip.nl.routes;
- isnets=ipset_new();
- for (i=0; i<st->slip.nl.n_routes; i++) {
- if (r[i].up) {
- struct ipset *sn,*nis;
- r[i].kup=True;
- sn=ipset_from_subnet(r[i].net);
- nis=ipset_union(isnets,sn);
- ipset_free(sn);
- ipset_free(isnets);
- isnets=nis;
+ allnets=ipset_new();
+ for (r=st->slip.nl.clients; r; r=r->next) {
+ if (r->up) {
+ struct ipset *nan;
+ r->kup=True;
+ nan=ipset_union(allnets,r->networks);
+ ipset_free(allnets);
+ allnets=nan;
}
}
}
}
- snets=ipset_to_subnet_list(
is
nets);
- ipset_free(
is
nets);
+ snets=ipset_to_subnet_list(
all
nets);
+ ipset_free(
all
nets);
nets=safe_malloc(20*snets->entries,"userv_invoke_userv:nets");
*nets=0;
for (i=0; i<snets->entries; i++) {
nets=safe_malloc(20*snets->entries,"userv_invoke_userv:nets");
*nets=0;
for (i=0; i<snets->entries; i++) {
@@
-328,23
+325,25
@@
static void userv_invoke_userv(struct userv *st)
Message(M_INFO,"%s: userv-ipif pid is %d\n",st->slip.nl.name,st->pid);
/* Read a single character from the pipe to confirm userv-ipif is
running. If we get a SIGCHLD at this point then we'll get EINTR. */
Message(M_INFO,"%s: userv-ipif pid is %d\n",st->slip.nl.name,st->pid);
/* Read a single character from the pipe to confirm userv-ipif is
running. If we get a SIGCHLD at this point then we'll get EINTR. */
- if (
read(st->rxfd,&confirm,1
)!=1) {
+ if (
(nread=read(st->rxfd,&confirm,1)
)!=1) {
if (errno==EINTR) {
Message(M_WARNING,"%s: read of confirmation byte was "
"interrupted\n",st->slip.nl.name);
} else {
if (errno==EINTR) {
Message(M_WARNING,"%s: read of confirmation byte was "
"interrupted\n",st->slip.nl.name);
} else {
- fatal_perror("%s: read() of confirmation byte",st->slip.nl.name);
+ if (nread<0) {
+ fatal_perror("%s: error reading confirmation byte",
+ st->slip.nl.name);
+ } else {
+ fatal("%s: unexpected EOF instead of confirmation byte"
+ " - userv ipif failed?", st->slip.nl.name);
+ }
}
} else {
if (confirm!=SLIP_END) {
}
} else {
if (confirm!=SLIP_END) {
- fatal("%s: bad confirmation byte %d from userv-ipif
\n
",
+ fatal("%s: bad confirmation byte %d from userv-ipif",
st->slip.nl.name,confirm);
}
}
st->slip.nl.name,confirm);
}
}
- /* Mark rxfd non-blocking */
- if (fcntl(st->rxfd, F_SETFL, fcntl(st->rxfd, F_GETFL)|O_NONBLOCK)==-1) {
- fatal_perror("%s: fcntl(O_NONBLOCK)",st->slip.nl.name);
- }
}
static void userv_kill_userv(struct userv *st)
}
static void userv_kill_userv(struct userv *st)
@@
-412,9
+411,4
@@
init_module slip_module;
void slip_module(dict_t *dict)
{
add_closure(dict,"userv-ipif",userv_apply);
void slip_module(dict_t *dict)
{
add_closure(dict,"userv-ipif",userv_apply);
-#if 0
- /* TODO */
- add_closure(dict,"pty-slip",ptyslip_apply);
- add_closure(dict,"slipd",slipd_apply);
-#endif /* 0 */
}
}