{
uint8_t txbuf[DEFAULT_BUFSIZE];
uint8_t *i;
- uint32_t j=0;
+ int32_t j=0;
BUF_ASSERT_USED(buf);
}
static void slip_init(struct slip *st, struct cloc loc, dict_t *dict,
- string_t name, netlink_deliver_fn *to_host)
+ cstring_t name, netlink_deliver_fn *to_host)
{
st->netlink_to_tunnel=
netlink_init(&st->nl,st,loc,dict,
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;
+ cstring_t userv_path;
+ cstring_t service_user;
+ cstring_t service_name;
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;
- 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].events=POLLIN|POLLERR|POLLHUP;
+ fds[1].events=POLLIN;
} 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_entry_rec {
- string_t path;
- char **argv;
+ cstring_t path;
+ const char **argv;
int in;
int out;
/* XXX perhaps we should collect and log stderr? */
/* 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);
}
return new_closure(&st->slip.nl.cl);
}
-init_module slip_module;
void slip_module(dict_t *dict)
{
add_closure(dict,"userv-ipif",userv_apply);