Replace pointers to global splay trees with structs.
[tinc] / src / bsd / device.c
index 6d68bc7..fe2d6c5 100644 (file)
@@ -1,7 +1,7 @@
 /*
     device.c -- Interaction BSD tun/tap device
     Copyright (C) 2001-2005 Ivo Timmermans,
-                  2001-2017 Guus Sliepen <guus@tinc-vpn.org>
+                  2001-2021 Guus Sliepen <guus@tinc-vpn.org>
                   2009      Grzegorz Dymarek <gregd72002@googlemail.com>
 
     This program is free software; you can redistribute it and/or modify
 #include "../conf.h"
 #include "../device.h"
 #include "../logger.h"
-#include "../names.h"
-#include "../net.h"
 #include "../route.h"
-#include "../utils.h"
 #include "../xalloc.h"
 
 #ifdef ENABLE_TUNEMU
 #include <net/if_utun.h>
 #endif
 
+#if defined(HAVE_FREEBSD) || defined(HAVE_DRAGONFLY)
+#define DEFAULT_TUN_DEVICE "/dev/tun"  // Use the autoclone device
+#define DEFAULT_TAP_DEVICE "/dev/tap"
+#else
 #define DEFAULT_TUN_DEVICE "/dev/tun0"
 #define DEFAULT_TAP_DEVICE "/dev/tap0"
+#endif
 
 typedef enum device_type {
        DEVICE_TYPE_TUN,
@@ -56,7 +58,7 @@ typedef enum device_type {
 int device_fd = -1;
 char *device = NULL;
 char *iface = NULL;
-static char *device_info = NULL;
+static const char *device_info = "OS X utun device";
 #if defined(ENABLE_TUNEMU)
 static device_type_t device_type = DEVICE_TYPE_TUNEMU;
 #elif defined(HAVE_OPENBSD) || defined(HAVE_FREEBSD) || defined(HAVE_DRAGONFLY)
@@ -83,7 +85,7 @@ static bool setup_utun(void) {
                return false;
        }
 
-       int unit = -1;
+       long unit = -1;
        char *p = strstr(device, "utun"), *e = NULL;
 
        if(p) {
@@ -116,8 +118,6 @@ static bool setup_utun(void) {
                iface = xstrdup(name);
        }
 
-       device_info = "OS X utun device";
-
        logger(DEBUG_ALWAYS, LOG_INFO, "%s is a %s", device, device_info);
 
        return true;
@@ -125,13 +125,13 @@ static bool setup_utun(void) {
 #endif
 
 static bool setup_device(void) {
-       get_config_string(lookup_config(config_tree, "Device"), &device);
+       get_config_string(lookup_config(&config_tree, "Device"), &device);
 
        // Find out if it's supposed to be a tun or a tap device
 
        char *type;
 
-       if(get_config_string(lookup_config(config_tree, "DeviceType"), &type)) {
+       if(get_config_string(lookup_config(&config_tree, "DeviceType"), &type)) {
                if(!strcasecmp(type, "tun"))
                        /* use default */;
 
@@ -233,7 +233,7 @@ static bool setup_device(void) {
                realname = device;
        }
 
-       if(!get_config_string(lookup_config(config_tree, "Interface"), &iface)) {
+       if(!get_config_string(lookup_config(&config_tree, "Interface"), &iface)) {
                iface = xstrdup(strrchr(realname, '/') ? strrchr(realname, '/') + 1 : realname);
        } else if(strcmp(iface, strrchr(realname, '/') ? strrchr(realname, '/') + 1 : realname)) {
                logger(DEBUG_ALWAYS, LOG_WARNING, "Warning: Interface does not match Device. $INTERFACE might be set incorrectly.");
@@ -300,10 +300,7 @@ static bool setup_device(void) {
                        struct ifreq ifr;
 
                        if(ioctl(device_fd, TAPGIFNAME, (void *)&ifr) == 0) {
-                               if(iface) {
-                                       free(iface);
-                               }
-
+                               free(iface);
                                iface = xstrdup(ifr.ifr_name);
                        }
                }
@@ -354,7 +351,7 @@ static void close_device(void) {
 }
 
 static bool read_packet(vpn_packet_t *packet) {
-       int inlen;
+       ssize_t inlen;
 
        switch(device_type) {
        case DEVICE_TYPE_TUN:
@@ -503,7 +500,7 @@ static bool write_packet(vpn_packet_t *packet) {
 #ifdef ENABLE_TUNEMU
 
        case DEVICE_TYPE_TUNEMU:
-               if(tunemu_write(device_fd, DATA(packet) + 14, packet->len - 14) < 0) {
+               if(tunemu_write(DATA(packet) + 14, packet->len - 14) < 0) {
                        logger(DEBUG_ALWAYS, LOG_ERR, "Error while writing to %s %s: %s", device_info,
                               device, strerror(errno));
                        return false;