}
static int tun_beforepoll(void *sst, struct pollfd *fds, int *nfds_io,
- int *timeout_io, const struct timeval *tv_now,
- uint64_t *now)
+ int *timeout_io)
{
struct tun *st=sst;
*nfds_io=1;
return 0;
}
-static void tun_afterpoll(void *sst, struct pollfd *fds, int nfds,
- const struct timeval *tv_now, uint64_t *now)
+static void tun_afterpoll(void *sst, struct pollfd *fds, int nfds)
{
struct tun *st=sst;
int l;
struct tun *st=sst;
string_t network, mask, secnetaddr;
struct subnet_list *nets;
- uint32_t i;
+ int32_t i;
int fd=-1;
if (routes->up == routes->kup) return False;
break;
case TUN_CONFIG_IOCTL:
{
-#ifdef HAVE_NET_ROUTE_H
+ /* darwin rtentry has a different format, use /sbin/route instead */
+#if HAVE_NET_ROUTE_H && ! __APPLE__
struct rtentry rt;
struct sockaddr_in *sa;
int action;
{
struct tun *st=sst;
string_t hostaddr,secnetaddr;
- uint8_t mtu[6];
+ char mtu[6];
struct netlink_client *r;
if (st->tun_flavour==TUN_FLAVOUR_BSD) {
hostaddr,secnetaddr,"mtu",mtu,"up",(char *)0);
break;
case TUN_CONFIG_IOCTL:
-#ifdef HAVE_NET_IF_H
+#if HAVE_NET_IF_H && ! __APPLE__
{
int fd;
struct ifreq ifr;
}
} else if (strcmp(u.sysname,"SunOS")==0) {
st->tun_flavour=TUN_FLAVOUR_STREAMS;
- } else if (strcmp(u.sysname,"FreeBSD")==0) {
+ } else if (strcmp(u.sysname,"FreeBSD")==0
+ || strcmp(u.sysname,"Darwin")==0) {
st->tun_flavour=TUN_FLAVOUR_BSD;
}
}
st->ifconfig_type=TUN_CONFIG_IOCTL;
break;
case TUN_FLAVOUR_BSD:
+#if __linux__
/* XXX on Linux we still want TUN_CONFIG_IOCTL. Perhaps we can
use this on BSD too. */
st->ifconfig_type=TUN_CONFIG_IOCTL;
+#else
+ st->ifconfig_type=TUN_CONFIG_BSD;
+#endif
break;
case TUN_FLAVOUR_STREAMS:
st->ifconfig_type=TUN_CONFIG_BSD;
return tun_create(self,loc,context,args,TUN_FLAVOUR_BSD);
}
-init_module tun_module;
void tun_module(dict_t *dict)
{
add_closure(dict,"tun",tun_apply);