chiark / gitweb /
Work around Bison's crazy redeclaration of malloc/free.
[secnet.git] / tun.c
diff --git a/tun.c b/tun.c
index 63aa1f1d9919d1935c21e4836631e4f30faa677f..5f9aa98d1051c5ae4d43ba32e6aa1768fa356447 100644 (file)
--- a/tun.c
+++ b/tun.c
@@ -68,12 +68,12 @@ static struct flagstr config_types[]={
 struct tun {
     struct netlink nl;
     int fd;
-    string_t device_path;
-    string_t ip_path;
+    cstring_t device_path;
+    cstring_t ip_path;
     string_t interface_name;
-    string_t ifconfig_path;
+    cstring_t ifconfig_path;
     uint32_t ifconfig_type;
-    string_t route_path;
+    cstring_t route_path;
     uint32_t route_type;
     uint32_t tun_flavour;
     bool_t search_for_if; /* Applies to tun-BSD only */
@@ -83,7 +83,7 @@ struct tun {
     uint32_t local_address; /* host interface address */
 };
 
-static string_t tun_flavour_str(uint32_t flavour)
+static cstring_t tun_flavour_str(uint32_t flavour)
 {
     switch (flavour) {
     case TUN_FLAVOUR_GUESS: return "guess";
@@ -95,18 +95,16 @@ static string_t tun_flavour_str(uint32_t flavour)
 }
 
 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;
     fds[0].fd=st->fd;
-    fds[0].events=POLLIN|POLLERR|POLLHUP;
+    fds[0].events=POLLIN;
     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;
@@ -123,7 +121,7 @@ static void tun_afterpoll(void *sst, struct pollfd *fds, int nfds,
            fatal_perror("tun_afterpoll: read()");
        }
        if (l==0) {
-           fatal("tun_afterpoll: read()=0; device gone away?\n");
+           fatal("tun_afterpoll: read()=0; device gone away?");
        }
        if (l>0) {
            st->buff->size=l;
@@ -149,7 +147,7 @@ static bool_t tun_set_route(void *sst, struct netlink_client *routes)
     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;
@@ -190,7 +188,8 @@ static bool_t tun_set_route(void *sst, struct netlink_client *routes)
            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;
@@ -211,12 +210,12 @@ static bool_t tun_set_route(void *sst, struct netlink_client *routes)
                fatal_perror("tun_set_route: ioctl()");
            }
 #else
-           fatal("tun_set_route: ioctl method not supported\n");
+           fatal("tun_set_route: ioctl method not supported");
 #endif
        }
        break;
        default:
-           fatal("tun_set_route: unsupported route command type\n");
+           fatal("tun_set_route: unsupported route command type");
            break;
        }
        free(network); free(mask);
@@ -233,7 +232,7 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
 {
     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) {
@@ -255,7 +254,7 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
                }
            }
            if (st->fd==-1) {
-               fatal("%s: unable to open any TUN device (%s...)\n",
+               fatal("%s: unable to open any TUN device (%s...)",
                      st->nl.name,st->device_path);
            }
        } else {
@@ -291,7 +290,7 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
                    st->interface_name);
        }
 #else
-       fatal("tun_phase_hook: TUN_FLAVOUR_LINUX unexpected\n");
+       fatal("tun_phase_hook: TUN_FLAVOUR_LINUX unexpected");
 #endif /* LINUX_TUN_SUPPORTED */
     } else if (st->tun_flavour==TUN_FLAVOUR_STREAMS) {
 #ifdef HAVE_TUN_STREAMS
@@ -322,10 +321,10 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
        sprintf(st->interface_name,"tun%d",ppa);
        st->fd=tun_fd;
 #else
-       fatal("tun_phase_hook: TUN_FLAVOUR_STREAMS unexpected\n");
+       fatal("tun_phase_hook: TUN_FLAVOUR_STREAMS unexpected");
 #endif /* HAVE_TUN_STREAMS */
     } else {
-       fatal("tun_phase_hook: unknown flavour of TUN\n");
+       fatal("tun_phase_hook: unknown flavour of TUN");
     }
     /* All the networks we'll be using have been registered. Invoke ifconfig
        to set the TUN device's address, and route to add routes to all
@@ -333,10 +332,10 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
 
     hostaddr=ipaddr_to_string(st->local_address);
     secnetaddr=ipaddr_to_string(st->nl.secnet_address);
-    snprintf(mtu,6,"%d",st->nl.mtu);
+    snprintf(mtu,sizeof(mtu),"%d",st->nl.mtu);
     mtu[5]=0;
 
-    switch (st->route_type) {
+    switch (st->ifconfig_type) {
     case TUN_CONFIG_LINUX:
        sys_cmd(st->ifconfig_path,"ifconfig",st->interface_name,
                hostaddr,"netmask","255.255.255.255","-broadcast",
@@ -353,7 +352,7 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
                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;
@@ -405,11 +404,11 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
        close(fd);
     }
 #else
-    fatal("tun_apply: ifconfig by ioctl() not supported\n");
+    fatal("tun_apply: ifconfig by ioctl() not supported");
 #endif /* HAVE_NET_IF_H */
     break;
     default:
-       fatal("tun_apply: unsupported ifconfig method\n");
+       fatal("tun_apply: unsupported ifconfig method");
        break;
     }
        
@@ -486,7 +485,8 @@ static list_t *tun_create(closure_t *self, struct cloc loc, dict_t *context,
            }
        } 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;
        }
     }
@@ -501,7 +501,13 @@ static list_t *tun_create(closure_t *self, struct cloc loc, dict_t *context,
            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;
@@ -595,7 +601,6 @@ static list_t *tun_bsd_apply(closure_t *self, struct cloc loc, dict_t *context,
     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);