X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fbsd%2Fdevice.c;h=70e0b0b12fee0646dced9a624a0d98e6d2ed500f;hp=b58db8aed6fc9358246e0bbbb7eff49a6155faf6;hb=ac685f112deb7eafc047c718da094a8b160182ad;hpb=5894e2f9be52ce96142a3f70dca1c00c265c8db3 diff --git a/src/bsd/device.c b/src/bsd/device.c index b58db8ae..70e0b0b1 100644 --- a/src/bsd/device.c +++ b/src/bsd/device.c @@ -60,7 +60,7 @@ static device_type_t device_type = DEVICE_TYPE_TUN; #endif static bool setup_device(void) { - char *type; + // Find out which device file to open if(!get_config_string(lookup_config(config_tree, "Device"), &device)) { if(routing_mode == RMODE_ROUTER) @@ -69,10 +69,9 @@ static bool setup_device(void) { device = xstrdup(DEFAULT_TAP_DEVICE); } - if(!get_config_string(lookup_config(config_tree, "Interface"), &iface)) - iface = xstrdup(strrchr(device, '/') ? strrchr(device, '/') + 1 : device); - else if(strcmp(iface, strrchr(device, '/') ? strrchr(device, '/') + 1 : device)) - logger(LOG_WARNING, "Warning: Interface does not match Device. $INTERFACE might be set incorrectly."); + // 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(!strcasecmp(type, "tun")) @@ -96,6 +95,8 @@ static bool setup_device(void) { device_type = DEVICE_TYPE_TAP; } + // Open the device + switch(device_type) { #ifdef ENABLE_TUNEMU case DEVICE_TYPE_TUNEMU: { @@ -117,6 +118,27 @@ static bool setup_device(void) { fcntl(device_fd, F_SETFD, FD_CLOEXEC); #endif + // Guess what the corresponding interface is called + + char *realname; + +#if defined(HAVE_FDEVNAME) + realname = fdevname(device_fd) ? : device; +#elif defined(HAVE_DEVNAME) + struct stat buf; + if(!fstat(device_fd, &buf)) + realname = devname(buf.st_rdev, S_IFCHR) ? : device; +#else + realname = device; +#endif + + 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(LOG_WARNING, "Warning: Interface does not match Device. $INTERFACE might be set incorrectly."); + + // Configure the device as best as we can + switch(device_type) { default: device_type = DEVICE_TYPE_TUN;