~mdw
/
secnet
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
netlink: abolish check_config and output_config
[secnet]
/
slip.c
diff --git
a/slip.c
b/slip.c
index
fe6cb15
..
db89a27
100644
(file)
--- a/
slip.c
+++ b/
slip.c
@@
-33,7
+33,7
@@
static void slip_stuff(struct slip *st, struct buffer_if *buf, int fd)
{
uint8_t txbuf[DEFAULT_BUFSIZE];
uint8_t *i;
{
uint8_t txbuf[DEFAULT_BUFSIZE];
uint8_t *i;
-
u
int32_t j=0;
+ int32_t j=0;
BUF_ASSERT_USED(buf);
BUF_ASSERT_USED(buf);
@@
-83,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]) {
@@
-106,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,
@@
-124,33
+124,31
@@
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;
};
static int userv_beforepoll(void *sst, struct pollfd *fds, int *nfds_io,
pid_t pid;
bool_t expecting_userv_exit;
};
static int userv_beforepoll(void *sst, struct pollfd *fds, int *nfds_io,
- int *timeout_io, const struct timeval *tv_now,
- uint64_t *now)
+ int *timeout_io)
{
struct userv *st=sst;
if (st->rxfd!=-1) {
*nfds_io=2;
fds[0].fd=st->txfd;
{
struct userv *st=sst;
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;
}
return 0;
}
} else {
*nfds_io=0;
}
return 0;
}
-static void userv_afterpoll(void *sst, struct pollfd *fds, int nfds,
- const struct timeval *tv_now, uint64_t *now)
+static void userv_afterpoll(void *sst, struct pollfd *fds, int nfds)
{
struct userv *st=sst;
uint8_t rxbuf[DEFAULT_BUFSIZE];
{
struct userv *st=sst;
uint8_t rxbuf[DEFAULT_BUFSIZE];
@@
-168,7
+166,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);
}
@@
-193,13
+191,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",
@@
-208,8
+206,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? */
@@
-224,7
+222,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);
}
@@
-240,11
+240,11
@@
static void userv_invoke_userv(struct userv *st)
struct netlink_client *r;
struct ipset *allnets;
struct subnet_list *snets;
struct netlink_client *r;
struct ipset *allnets;
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,7
+257,7
@@
static void userv_invoke_userv(struct userv *st)
allnets=ipset_new();
for (r=st->slip.nl.clients; r; r=r->next) {
allnets=ipset_new();
for (r=st->slip.nl.clients; r; r=r->next) {
- if (r->
up
) {
+ if (r->
link_quality > LINK_QUALITY_UNUSED
) {
struct ipset *nan;
r->kup=True;
nan=ipset_union(allnets,r->networks);
struct ipset *nan;
r->kup=True;
nan=ipset_union(allnets,r->networks);
@@
-323,23
+323,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)
@@
-403,7
+405,6
@@
static list_t *userv_apply(closure_t *self, struct cloc loc, dict_t *context,
return new_closure(&st->slip.nl.cl);
}
return new_closure(&st->slip.nl.cl);
}
-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);