Drop support for Cygwin.
authorGuus Sliepen <guus@tinc-vpn.org>
Mon, 22 Oct 2018 14:53:12 +0000 (16:53 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Mon, 22 Oct 2018 14:53:12 +0000 (16:53 +0200)
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
doc/tinc.conf.5.in
doc/tinc.texi
doc/tincd.8.in
src/Makefile.am
src/cygwin/device.c [deleted file]
src/fsck.c
src/ifconfig.c
src/net_setup.c
src/utils.c

index 5a82c69651fa6557eb2b8ee4a44b24fd9587a97e..d593dadcfe2d393769f6c5f70d3b34092228c101 100644 (file)
@@ -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
index 5465c55dba8e0e6edb20179b73e8e6168e330d67..a907e5fc61b11a84e683887f7e9fd979534c3b21 100644 (file)
@@ -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 .
index c7021dd708b7a764b58137719660d3ffcc631f4b..65011bdf534a9cfe2c065ee80fab36c3eeffcd36 100644 (file)
@@ -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
index a14eb4e2b726fe8a326712c251a033cb9b536cc1..4c2348e889f99a3187aa0452a30e9f3d1791951c 100644 (file)
@@ -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
index cb188d24576aaec475c96f092cc722cefc5e7116..12261fffc816fc035a2a09e6e6f6c4054d68f57a 100644 (file)
@@ -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 (file)
index 6d94988..0000000
+++ /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 <guus@tinc-vpn.org>
-
-    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 <w32api/windows.h>
-#include <w32api/winioctl.h>
-
-#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,
-};
index e19f03ffa243223ecad15cbdd629f94f70d988d0..3804f2d8364b2c198f963cd76c78672945fdddaa 100644 (file)
@@ -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);
index 742d2ebe1a61d8e91e780401564a47d3f69fe789..0bbbf828fb90e7fa27218d74b57e5514c93a6395 100644 (file)
@@ -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) {
index 7d88c326bbb8a43c9839e39e959c45102445a3b2..7b4c741f0fe55ce1bd5daefcf39e2d990fa8867e 100644 (file)
@@ -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)) {
index 857d47ed590f8ee3db3775cfa762cea44e9db806..c9f3085a4d1586ac799061f69fdf5cc0b68f484c 100644 (file)
@@ -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 <w32api/windows.h>
-#endif
-
+#ifdef HAVE_MINGW
 const char *winerror(int err) {
        static char buf[1024], *ptr;