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 5a82c69..d593dad 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 5465c55..a907e5f 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 c7021dd..65011bd 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 a14eb4e..4c2348e 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 cb188d2..12261ff 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 e19f03f..3804f2d 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 742d2eb..0bbbf82 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 7d88c32..7b4c741 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 857d47e..c9f3085 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;