From ddabda536acf33abbfef28bc199d2b3ae7219b46 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Mon, 22 Oct 2018 16:53:12 +0200 Subject: [PATCH] Drop support for Cygwin. Tinc can be built as a native Windows binary using MinGW, and should support all of the features that the Cygwin version did. --- configure.ac | 5 +- doc/tinc.conf.5.in | 2 +- doc/tinc.texi | 16 +-- doc/tincd.8.in | 2 +- src/Makefile.am | 4 - src/cygwin/device.c | 278 -------------------------------------------- src/fsck.c | 4 +- src/ifconfig.c | 4 +- src/net_setup.c | 4 +- src/utils.c | 6 +- 10 files changed, 13 insertions(+), 312 deletions(-) delete mode 100644 src/cygwin/device.c diff --git a/configure.ac b/configure.ac index 5a82c696..d593dadc 100644 --- a/configure.ac +++ b/configure.ac @@ -65,8 +65,7 @@ case $host_os in AC_DEFINE(HAVE_BSD, 1, [Unknown BSD variant]) ;; *cygwin*) - cygwin=true - AC_DEFINE(HAVE_CYGWIN, 1, [Cygwin]) + AC_MSG_ERROR("Cygwin is no longer supported. Use MinGW to build native Windows binaries.") ;; *mingw*) mingw=true @@ -267,6 +266,6 @@ if test "x$runstatedir" = "x"; then AC_SUBST([runstatedir], ['${localstatedir}/run']) fi -AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile test/Makefile systemd/Makefile bash_completion.d/Makefile]) +AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile test/Makefile test/testlib.sh systemd/Makefile bash_completion.d/Makefile]) AC_OUTPUT diff --git a/doc/tinc.conf.5.in b/doc/tinc.conf.5.in index 5465c55d..a907e5fc 100644 --- a/doc/tinc.conf.5.in +++ b/doc/tinc.conf.5.in @@ -683,7 +683,7 @@ this means that tinc will temporarily stop processing packets until the called s This guarantees that scripts will execute in the exact same order as the events that trigger them. If you need to run commands asynchronously, you have to ensure yourself that they are being run in the background. .Pp -Under Windows (not Cygwin), the scripts must have the extension +Under Windows, the scripts must have the extension .Pa .bat or .Pa .cmd . diff --git a/doc/tinc.texi b/doc/tinc.texi index c7021dd7..65011bdf 100644 --- a/doc/tinc.texi +++ b/doc/tinc.texi @@ -182,7 +182,7 @@ available too. @section Supported platforms @cindex platforms -Tinc has been verified to work under Linux, FreeBSD, OpenBSD, NetBSD, MacOS/X (Darwin), Solaris, and Windows (both natively and in a Cygwin environment), +Tinc has been verified to work under Linux, FreeBSD, OpenBSD, NetBSD, MacOS/X (Darwin), Solaris, and Windows, with various hardware architectures. These are some of the platforms that are supported by the universal tun/tap device driver or other virtual network device drivers. Without such a driver, tinc will most @@ -553,7 +553,6 @@ The documentation that comes along with your distribution will tell you how to d @menu * Darwin (MacOS/X) build environment:: -* Cygwin (Windows) build environment:: * MinGW (Windows) build environment:: @end menu @@ -568,17 +567,6 @@ It might also help to install a recent version of Fink from @uref{http://www.fin You need to download and install LibreSSL (or OpenSSL) and LZO, either directly from their websites (see @ref{Libraries}) or using Fink. -@c ================================================================== -@node Cygwin (Windows) build environment -@subsection Cygwin (Windows) build environment - -If Cygwin hasn't already been installed, install it directly from -@uref{https://www.cygwin.com/}. - -When tinc is compiled in a Cygwin environment, it can only be run in this environment, -but all programs, including those started outside the Cygwin environment, will be able to use the VPN. -It will also support all features. - @c ================================================================== @node MinGW (Windows) build environment @subsection MinGW (Windows) build environment @@ -1455,7 +1443,7 @@ this means that tinc will temporarily stop processing packets until the called s This guarantees that scripts will execute in the exact same order as the events that trigger them. If you need to run commands asynchronously, you have to ensure yourself that they are being run in the background. -Under Windows (not Cygwin), the scripts should have the extension @file{.bat} or @file{.cmd}. +Under Windows, the scripts should have the extension @file{.bat} or @file{.cmd}. @table @file @cindex tinc-up diff --git a/doc/tincd.8.in b/doc/tincd.8.in index a14eb4e2..4c2348e8 100644 --- a/doc/tincd.8.in +++ b/doc/tincd.8.in @@ -35,7 +35,7 @@ If that succeeds, it will detach from the controlling terminal and continue in the background, accepting and setting up connections to other tinc daemons that are part of the virtual private network. -Under Windows (not Cygwin) tinc will install itself as a service, +Under Windows tinc will install itself as a service, which will be restarted automatically after reboots. .Sh OPTIONS .Bl -tag -width indent diff --git a/src/Makefile.am b/src/Makefile.am index cb188d24..12261fff 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -190,10 +190,6 @@ if MINGW tincd_SOURCES += mingw/device.c mingw/common.h endif -if CYGWIN -tincd_SOURCES += cygwin/device.c -endif - if UML tincd_SOURCES += uml_device.c endif diff --git a/src/cygwin/device.c b/src/cygwin/device.c deleted file mode 100644 index 6d94988e..00000000 --- a/src/cygwin/device.c +++ /dev/null @@ -1,278 +0,0 @@ -/* - device.c -- Interaction with Windows tap driver in a Cygwin environment - Copyright (C) 2002-2005 Ivo Timmermans, - 2002-2014 Guus Sliepen - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "../system.h" -#include "../net.h" - -#include -#include - -#include "../conf.h" -#include "../device.h" -#include "../logger.h" -#include "../names.h" -#include "../route.h" -#include "../utils.h" -#include "../xalloc.h" - -#include "../mingw/common.h" - -int device_fd = -1; -static HANDLE device_handle = INVALID_HANDLE_VALUE; -char *device = NULL; -char *iface = NULL; -static const char *device_info = "Windows tap device"; - -static pid_t reader_pid; -static int sp[2]; - -static bool setup_device(void) { - HKEY key, key2; - int i, err; - - char regpath[1024]; - char adapterid[1024]; - char adaptername[1024]; - char tapname[1024]; - char gelukt = 0; - long len; - - bool found = false; - - get_config_string(lookup_config(config_tree, "Device"), &device); - get_config_string(lookup_config(config_tree, "Interface"), &iface); - - if(device && iface) { - logger(LOG_WARNING, "Warning: both Device and Interface specified, results may not be as expected"); - } - - /* Open registry and look for network adapters */ - - if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, NETWORK_CONNECTIONS_KEY, 0, KEY_READ, &key)) { - logger(DEBUG_ALWAYS, LOG_ERR, "Unable to read registry: %s", winerror(GetLastError())); - return false; - } - - for(i = 0; ; i++) { - len = sizeof(adapterid); - - if(RegEnumKeyEx(key, i, adapterid, &len, 0, 0, 0, NULL)) { - break; - } - - /* Find out more about this adapter */ - - snprintf(regpath, sizeof(regpath), "%s\\%s\\Connection", NETWORK_CONNECTIONS_KEY, adapterid); - - if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, regpath, 0, KEY_READ, &key2)) { - continue; - } - - len = sizeof(adaptername); - err = RegQueryValueEx(key2, "Name", 0, 0, adaptername, &len); - - RegCloseKey(key2); - - if(err) { - continue; - } - - if(device) { - if(!strcmp(device, adapterid)) { - found = true; - break; - } else { - continue; - } - } - - if(iface) { - if(!strcmp(iface, adaptername)) { - found = true; - break; - } else { - continue; - } - } - - snprintf(tapname, sizeof(tapname), USERMODEDEVICEDIR "%s" TAPSUFFIX, adapterid); - device_handle = CreateFile(tapname, GENERIC_WRITE | GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0); - - if(device_handle != INVALID_HANDLE_VALUE) { - CloseHandle(device_handle); - found = true; - break; - } - } - - RegCloseKey(key); - - if(!found) { - logger(DEBUG_ALWAYS, LOG_ERR, "No Windows tap device found!"); - return false; - } - - if(!device) { - device = xstrdup(adapterid); - } - - if(!iface) { - iface = xstrdup(adaptername); - } - - snprintf(tapname, sizeof(tapname), USERMODEDEVICEDIR "%s" TAPSUFFIX, device); - - /* Now we are going to open this device twice: once for reading and once for writing. - We do this because apparently it isn't possible to check for activity in the select() loop. - Furthermore I don't really know how to do it the "Windows" way. */ - - if(socketpair(AF_UNIX, SOCK_DGRAM, PF_UNIX, sp)) { - logger(DEBUG_ALWAYS, LOG_DEBUG, "System call `%s' failed: %s", "socketpair", strerror(errno)); - return false; - } - - /* The parent opens the tap device for writing. */ - - device_handle = CreateFile(tapname, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0); - - if(device_handle == INVALID_HANDLE_VALUE) { - logger(DEBUG_ALWAYS, LOG_ERR, "Could not open Windows tap device %s (%s) for writing: %s", device, iface, winerror(GetLastError())); - return false; - } - - device_fd = sp[0]; - - /* Get MAC address from tap device */ - - if(!DeviceIoControl(device_handle, TAP_IOCTL_GET_MAC, mymac.x, sizeof(mymac.x), mymac.x, sizeof(mymac.x), &len, 0)) { - logger(DEBUG_ALWAYS, LOG_ERR, "Could not get MAC address from Windows tap device %s (%s): %s", device, iface, winerror(GetLastError())); - return false; - } - - if(routing_mode == RMODE_ROUTER) { - overwrite_mac = 1; - } - - /* Now we start the child */ - - reader_pid = fork(); - - if(reader_pid == -1) { - logger(DEBUG_ALWAYS, LOG_DEBUG, "System call `%s' failed: %s", "fork", strerror(errno)); - return false; - } - - if(!reader_pid) { - /* The child opens the tap device for reading, blocking. - It passes everything it reads to the socket. */ - - char buf[MTU]; - long inlen; - - CloseHandle(device_handle); - - device_handle = CreateFile(tapname, GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0); - - if(device_handle == INVALID_HANDLE_VALUE) { - logger(DEBUG_ALWAYS, LOG_ERR, "Could not open Windows tap device %s (%s) for reading: %s", device, iface, winerror(GetLastError())); - buf[0] = 0; - write(sp[1], buf, 1); - exit(1); - } - - logger(DEBUG_ALWAYS, LOG_DEBUG, "Tap reader forked and running."); - - /* Notify success */ - - buf[0] = 1; - write(sp[1], buf, 1); - - /* Pass packets */ - - for(;;) { - ReadFile(device_handle, buf, MTU, &inlen, NULL); - write(sp[1], buf, inlen); - } - } - - read(device_fd, &gelukt, 1); - - if(gelukt != 1) { - logger(DEBUG_ALWAYS, LOG_DEBUG, "Tap reader failed!"); - return false; - } - - logger(DEBUG_ALWAYS, LOG_INFO, "%s (%s) is a %s", device, iface, device_info); - - return true; -} - -static void close_device(void) { - close(sp[0]); - close(sp[1]); - CloseHandle(device_handle); - device_handle = INVALID_HANDLE_VALUE; - - kill(reader_pid, SIGKILL); - - free(device); - device = NULL; - free(iface); - iface = NULL; - device_info = NULL; -} - -static bool read_packet(vpn_packet_t *packet) { - int inlen; - - if((inlen = read(sp[0], DATA(packet), MTU)) <= 0) { - logger(DEBUG_ALWAYS, LOG_ERR, "Error while reading from %s %s: %s", device_info, - device, strerror(errno)); - return false; - } - - packet->len = inlen; - - logger(DEBUG_TRAFFIC, LOG_DEBUG, "Read packet of %d bytes from %s", packet->len, - device_info); - - return true; -} - -static bool write_packet(vpn_packet_t *packet) { - long outlen; - - logger(DEBUG_TRAFFIC, LOG_DEBUG, "Writing packet of %d bytes to %s", - packet->len, device_info); - - if(!WriteFile(device_handle, DATA(packet), packet->len, &outlen, NULL)) { - logger(DEBUG_ALWAYS, LOG_ERR, "Error while writing to %s %s: %s", device_info, device, winerror(GetLastError())); - return false; - } - - return true; -} - -const devops_t os_devops = { - .setup = setup_device, - .close = close_device, - .read = read_packet, - .write = write_packet, -}; diff --git a/src/fsck.c b/src/fsck.c index e19f03ff..3804f2d8 100644 --- a/src/fsck.c +++ b/src/fsck.c @@ -254,7 +254,7 @@ int fsck(const char *argv0) { return 1; } -#if !defined(HAVE_MINGW) && !defined(HAVE_CYGWIN) +#ifndef HAVE_MINGW if(st.st_mode & 077) { fprintf(stderr, "WARNING: unsafe file permissions on %s.\n", fname); @@ -303,7 +303,7 @@ int fsck(const char *argv0) { return 1; } -#if !defined(HAVE_MINGW) && !defined(HAVE_CYGWIN) +#ifndef HAVE_MINGW if(st.st_mode & 077) { fprintf(stderr, "WARNING: unsafe file permissions on %s.\n", fname); diff --git a/src/ifconfig.c b/src/ifconfig.c index 742d2ebe..0bbbf828 100644 --- a/src/ifconfig.c +++ b/src/ifconfig.c @@ -128,7 +128,7 @@ void ifconfig_address(FILE *out, const char *value) { return; } -#elif defined(HAVE_MINGW) || defined(HAVE_CYGWIN) +#elif defined(HAVE_MINGW) switch(address.type) { case SUBNET_MAC: @@ -226,7 +226,7 @@ void ifconfig_route(FILE *out, const char *value) { } } -#elif defined(HAVE_MINGW) || defined(HAVE_CYGWIN) +#elif defined(HAVE_MINGW) if(*gateway_str) { switch(subnet.type) { diff --git a/src/net_setup.c b/src/net_setup.c index 7d88c326..7b4c741f 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -222,7 +222,7 @@ static bool read_ecdsa_private_key(void) { return false; } -#if !defined(HAVE_MINGW) && !defined(HAVE_CYGWIN) +#ifndef HAVE_MINGW struct stat s; if(fstat(fileno(fp), &s)) { @@ -314,7 +314,7 @@ static bool read_rsa_private_key(void) { return false; } -#if !defined(HAVE_MINGW) && !defined(HAVE_CYGWIN) +#ifndef HAVE_MINGW struct stat s; if(fstat(fileno(fp), &s)) { diff --git a/src/utils.c b/src/utils.c index 857d47ed..c9f3085a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -173,11 +173,7 @@ size_t b64encode_urlsafe(const void *src, char *dst, size_t length) { return b64encode_internal(src, dst, length, base64_urlsafe); } -#if defined(HAVE_MINGW) || defined(HAVE_CYGWIN) -#ifdef HAVE_CYGWIN -#include -#endif - +#ifdef HAVE_MINGW const char *winerror(int err) { static char buf[1024], *ptr; -- 2.20.1