upstream: 1.18
This commit is contained in:
parent
8e468ffc54
commit
ff84fef381
88 changed files with 6525 additions and 26617 deletions
2
COPYING
2
COPYING
|
@ -1,4 +1,4 @@
|
||||||
Copyright (C) 1998-2018 Ivo Timmermans, Guus Sliepen and others.
|
Copyright (C) 1998-2021 Ivo Timmermans, Guus Sliepen and others.
|
||||||
See the AUTHORS file for a complete list.
|
See the AUTHORS file for a complete list.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = gnu
|
AUTOMAKE_OPTIONS = gnu
|
||||||
|
|
||||||
SUBDIRS = src doc test systemd
|
SUBDIRS = src doc test systemd bash_completion.d
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
|
22
Makefile.in
22
Makefile.in
|
@ -1,7 +1,7 @@
|
||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -145,8 +145,8 @@ am__recursive_targets = \
|
||||||
$(am__extra_recursive_targets)
|
$(am__extra_recursive_targets)
|
||||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||||
cscope distdir distdir-am dist dist-all distcheck
|
cscope distdir distdir-am dist dist-all distcheck
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \
|
||||||
$(LISP)config.h.in
|
config.h.in
|
||||||
# Read a list of newline-separated strings from the standard input,
|
# Read a list of newline-separated strings from the standard input,
|
||||||
# and print each of them once, without duplicates. Input order is
|
# and print each of them once, without duplicates. Input order is
|
||||||
# *not* preserved.
|
# *not* preserved.
|
||||||
|
@ -208,6 +208,8 @@ am__relativize = \
|
||||||
DIST_ARCHIVES = $(distdir).tar.gz
|
DIST_ARCHIVES = $(distdir).tar.gz
|
||||||
GZIP_ENV = --best
|
GZIP_ENV = --best
|
||||||
DIST_TARGETS = dist-gzip
|
DIST_TARGETS = dist-gzip
|
||||||
|
# Exists only to be overridden by the user if desired.
|
||||||
|
AM_DISTCHECK_DVI_TARGET = dvi
|
||||||
distuninstallcheck_listfiles = find . -type f -print
|
distuninstallcheck_listfiles = find . -type f -print
|
||||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||||
|
@ -323,7 +325,7 @@ top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
AUTOMAKE_OPTIONS = gnu
|
AUTOMAKE_OPTIONS = gnu
|
||||||
SUBDIRS = src doc test systemd
|
SUBDIRS = src doc test systemd bash_completion.d
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
EXTRA_DIST = COPYING.README README.android
|
EXTRA_DIST = COPYING.README README.android
|
||||||
all: config.h
|
all: config.h
|
||||||
|
@ -568,6 +570,10 @@ dist-xz: distdir
|
||||||
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
||||||
$(am__post_remove_distdir)
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-zstd: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
dist-tarZ: distdir
|
dist-tarZ: distdir
|
||||||
@echo WARNING: "Support for distribution archives compressed with" \
|
@echo WARNING: "Support for distribution archives compressed with" \
|
||||||
"legacy program 'compress' is deprecated." >&2
|
"legacy program 'compress' is deprecated." >&2
|
||||||
|
@ -610,6 +616,8 @@ distcheck: dist
|
||||||
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
|
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
|
||||||
*.zip*) \
|
*.zip*) \
|
||||||
unzip $(distdir).zip ;;\
|
unzip $(distdir).zip ;;\
|
||||||
|
*.tar.zst*) \
|
||||||
|
zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
|
||||||
esac
|
esac
|
||||||
chmod -R a-w $(distdir)
|
chmod -R a-w $(distdir)
|
||||||
chmod u+w $(distdir)
|
chmod u+w $(distdir)
|
||||||
|
@ -625,7 +633,7 @@ distcheck: dist
|
||||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
--srcdir=../.. --prefix="$$dc_install_base" \
|
--srcdir=../.. --prefix="$$dc_install_base" \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
&& $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||||
|
@ -786,7 +794,7 @@ uninstall-am:
|
||||||
am--refresh check check-am clean clean-cscope clean-generic \
|
am--refresh check check-am clean clean-cscope clean-generic \
|
||||||
cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
|
cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
|
||||||
dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
|
dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
|
||||||
distcheck distclean distclean-generic distclean-hdr \
|
dist-zstd distcheck distclean distclean-generic distclean-hdr \
|
||||||
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
||||||
dvi-am html html-am info info-am install install-am \
|
dvi-am html html-am info info-am install install-am \
|
||||||
install-data install-data-am install-dvi install-dvi-am \
|
install-data install-data-am install-dvi install-dvi-am \
|
||||||
|
|
20
NEWS
20
NEWS
|
@ -1,3 +1,23 @@
|
||||||
|
# Version 1.1pre18 June 27 2021
|
||||||
|
|
||||||
|
* Check all Address statements when making outgoing connections.
|
||||||
|
* Make more variables safe for use in invitations.
|
||||||
|
* Allow "tinc --force join" to accept all variables sent in an invitation.
|
||||||
|
* Make sure the stop command works on Windows if tincd is running in the
|
||||||
|
foreground.
|
||||||
|
* Handle DOS line endings in invitation files.
|
||||||
|
* Double-quote node names in dump graph output.
|
||||||
|
* Prevent large amounts of UDP probes being sent consecutively.
|
||||||
|
* Try harder to reconnect with unreachable nodes.
|
||||||
|
* Generate tinc-up.bat on Windows.
|
||||||
|
* Fix a possible infinite loop when adding Subnets to a running tincd.
|
||||||
|
* Allow a tun/tap filedescriptor to be passed through a UNIX socket.
|
||||||
|
* Use auto-clone tun/tap devices as default on FreeBSD and DragonFlyBSD.
|
||||||
|
|
||||||
|
Thanks to Fabian Maurer, Ilia Pavlikhin, Maciej S. Szmigiero, Pacien
|
||||||
|
Tran-Girard, Aaron Li, Andreas Rammhold, Rosen Penev, Shengjing Zhu, Werner
|
||||||
|
Schreiber, iczero and leptonyu for their contributions to this version of tinc.
|
||||||
|
|
||||||
# Version 1.1pre17 October 8 2018
|
# Version 1.1pre17 October 8 2018
|
||||||
|
|
||||||
* Prevent oracle attacks in the legacy protocol (CVE-2018-16737,
|
* Prevent oracle attacks in the legacy protocol (CVE-2018-16737,
|
||||||
|
|
6
README
6
README
|
@ -1,7 +1,7 @@
|
||||||
This is the README file for tinc version 1.1pre17. Installation
|
This is the README file for tinc version 1.1pre18. Installation
|
||||||
instructions may be found in the INSTALL file.
|
instructions may be found in the INSTALL file.
|
||||||
|
|
||||||
tinc is Copyright © 1998-2018 Ivo Timmermans, Guus Sliepen <guus@tinc-vpn.org>, and others.
|
tinc is Copyright © 1998-2021 Ivo Timmermans, Guus Sliepen <guus@tinc-vpn.org>, and others.
|
||||||
|
|
||||||
For a complete list of authors see the AUTHORS file.
|
For a complete list of authors see the AUTHORS file.
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ versions, the security might only be as good as that of the oldest version.
|
||||||
Compatibility
|
Compatibility
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
Version 1.1pre17 is compatible with 1.0pre8, 1.0 and later, but not with older
|
Version 1.1pre18 is compatible with 1.0pre8, 1.0 and later, but not with older
|
||||||
versions of tinc.
|
versions of tinc.
|
||||||
|
|
||||||
When the ExperimentalProtocol option is used, tinc is still compatible with
|
When the ExperimentalProtocol option is used, tinc is still compatible with
|
||||||
|
|
21
THANKS
21
THANKS
|
@ -1,9 +1,11 @@
|
||||||
We would like to thank the following people for their contributions to tinc:
|
We would like to thank the following people for their contributions to tinc:
|
||||||
|
|
||||||
|
* Aaron Li
|
||||||
* Alexander Reil and Gemeinde Berg
|
* Alexander Reil and Gemeinde Berg
|
||||||
* Alexander Ried
|
* Alexander Ried
|
||||||
* Alexis Hildebrandt
|
* Alexis Hildebrandt
|
||||||
* Allesandro Gatti
|
* Allesandro Gatti
|
||||||
|
* Andreas Rammhold
|
||||||
* Andreas van Cranenburgh
|
* Andreas van Cranenburgh
|
||||||
* Andrew Hahn
|
* Andrew Hahn
|
||||||
* Anthony G. Basile
|
* Anthony G. Basile
|
||||||
|
@ -26,17 +28,23 @@ We would like to thank the following people for their contributions to tinc:
|
||||||
* Enrique Zanardi
|
* Enrique Zanardi
|
||||||
* Erik Tews
|
* Erik Tews
|
||||||
* Etienne Dechamps
|
* Etienne Dechamps
|
||||||
|
* Fabian Maurer
|
||||||
* Florent Clairambault
|
* Florent Clairambault
|
||||||
* Florian Forster
|
* Florian Forster
|
||||||
* Florian Klink
|
* Florian Klink
|
||||||
* Florian Weik
|
* Florian Weik
|
||||||
* Flynn Marquardt
|
* Flynn Marquardt
|
||||||
* Franz Pletz
|
* Franz Pletz
|
||||||
|
* Fufu Fang
|
||||||
* Gary Kessler and Claudia Gonzalez
|
* Gary Kessler and Claudia Gonzalez
|
||||||
* Grzegorz Dymarek
|
* Grzegorz Dymarek
|
||||||
* Gusariev Oleksandr
|
* Gusariev Oleksandr
|
||||||
* Hans Bayle
|
* Hans Bayle
|
||||||
* Harvest
|
* Harvest
|
||||||
|
* Huai An Hsu
|
||||||
|
* iczero
|
||||||
|
* Ilia Pavlikhin
|
||||||
|
* Ivan Mirić
|
||||||
* Ivo Smits
|
* Ivo Smits
|
||||||
* Ivo van Dong
|
* Ivo van Dong
|
||||||
* James Cook
|
* James Cook
|
||||||
|
@ -49,17 +57,21 @@ We would like to thank the following people for their contributions to tinc:
|
||||||
* Jeroen Domburg
|
* Jeroen Domburg
|
||||||
* Jeroen Ubbink
|
* Jeroen Ubbink
|
||||||
* Jerome Etienne
|
* Jerome Etienne
|
||||||
|
* Jiang Sheng
|
||||||
* Jochen Voss
|
* Jochen Voss
|
||||||
* Jo-Philipp Wich
|
* Jo-Philipp Wich
|
||||||
* Julien Muchembled
|
* Julien Muchembled
|
||||||
* Lavrans Laading
|
* Lavrans Laading
|
||||||
|
* leptonyu
|
||||||
* Loïc Dachary
|
* Loïc Dachary
|
||||||
* Loïc Grenié
|
* Loïc Grenié
|
||||||
* Lubomír Bulej
|
* Lubomír Bulej
|
||||||
* luckyhacky
|
* luckyhacky
|
||||||
* LunarShaddow
|
* LunarShaddow
|
||||||
|
* Maciej S. Szmigiero
|
||||||
* Mads Kiilerich
|
* Mads Kiilerich
|
||||||
* Marc A. Lehmann
|
* Marc A. Lehmann
|
||||||
|
* Marco Oggioni
|
||||||
* Mark Glines
|
* Mark Glines
|
||||||
* Mark Petryk
|
* Mark Petryk
|
||||||
* Markus Goetz
|
* Markus Goetz
|
||||||
|
@ -78,20 +90,26 @@ We would like to thank the following people for their contributions to tinc:
|
||||||
* Nathan Stratton Treadway
|
* Nathan Stratton Treadway
|
||||||
* Nick Hibma
|
* Nick Hibma
|
||||||
* Nick Patavalis
|
* Nick Patavalis
|
||||||
|
* Pacien Tran-Girard
|
||||||
|
* Patrick Helms
|
||||||
* Paul Littlefield
|
* Paul Littlefield
|
||||||
* Philipp Babel
|
* Philipp Babel
|
||||||
* Pierre Emeriaud
|
* Pierre Emeriaud
|
||||||
* Pierre-Olivier Mercier
|
* Pierre-Olivier Mercier
|
||||||
* Rafael Sadowski
|
* Rafael Sadowski
|
||||||
* Rafał Leśniak
|
* Rafał Leśniak
|
||||||
|
* René Rüthlein
|
||||||
* Rhosyn Celyn
|
* Rhosyn Celyn
|
||||||
* Robert van der Meulen
|
* Robert van der Meulen
|
||||||
|
* Robert Waniek
|
||||||
|
* Rosen Penev
|
||||||
* Rumko
|
* Rumko
|
||||||
* Ryan Miller
|
* Ryan Miller
|
||||||
* Sam Bryan
|
* Sam Bryan
|
||||||
* Samuel Thibault
|
* Samuel Thibault
|
||||||
* Saverio Proto
|
* Saverio Proto
|
||||||
* Scott Lamb
|
* Scott Lamb
|
||||||
|
* Shengjing Zhu
|
||||||
* Steffan Karger
|
* Steffan Karger
|
||||||
* Stig Fagrell
|
* Stig Fagrell
|
||||||
* Sven-Haegar Koch
|
* Sven-Haegar Koch
|
||||||
|
@ -104,8 +122,11 @@ We would like to thank the following people for their contributions to tinc:
|
||||||
* Tonnerre Lombard
|
* Tonnerre Lombard
|
||||||
* Ulrich Seifert
|
* Ulrich Seifert
|
||||||
* Vil Brekin
|
* Vil Brekin
|
||||||
|
* Vincent Laurent
|
||||||
* Vittorio Gambaletta
|
* Vittorio Gambaletta
|
||||||
|
* Volker Augustin
|
||||||
* Wendy Willard
|
* Wendy Willard
|
||||||
|
* Werner Schreiber
|
||||||
* Wessel Dankers
|
* Wessel Dankers
|
||||||
* William A. Kennington III
|
* William A. Kennington III
|
||||||
* William McArthur
|
* William McArthur
|
||||||
|
|
55
aclocal.m4
vendored
55
aclocal.m4
vendored
|
@ -1,6 +1,6 @@
|
||||||
# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
|
# generated automatically by aclocal 1.16.3 -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to.
|
||||||
If you have problems, you may need to regenerate the build system entirely.
|
If you have problems, you may need to regenerate the build system entirely.
|
||||||
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
|
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
|
||||||
|
|
||||||
# Copyright (C) 2002-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2002-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -35,7 +35,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
|
||||||
[am__api_version='1.16'
|
[am__api_version='1.16'
|
||||||
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
||||||
dnl require some minimum version. Point them to the right macro.
|
dnl require some minimum version. Point them to the right macro.
|
||||||
m4_if([$1], [1.16.1], [],
|
m4_if([$1], [1.16.3], [],
|
||||||
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
|
||||||
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
||||||
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
||||||
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
||||||
[AM_AUTOMAKE_VERSION([1.16.1])dnl
|
[AM_AUTOMAKE_VERSION([1.16.3])dnl
|
||||||
m4_ifndef([AC_AUTOCONF_VERSION],
|
m4_ifndef([AC_AUTOCONF_VERSION],
|
||||||
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
||||||
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
||||||
|
|
||||||
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -110,7 +110,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
|
||||||
|
|
||||||
# AM_CONDITIONAL -*- Autoconf -*-
|
# AM_CONDITIONAL -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1997-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1997-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -141,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE(
|
||||||
Usually this means the macro was only invoked conditionally.]])
|
Usually this means the macro was only invoked conditionally.]])
|
||||||
fi])])
|
fi])])
|
||||||
|
|
||||||
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -332,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
|
||||||
|
|
||||||
# Generate code to set up dependency tracking. -*- Autoconf -*-
|
# Generate code to set up dependency tracking. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -371,7 +371,9 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
done
|
done
|
||||||
if test $am_rc -ne 0; then
|
if test $am_rc -ne 0; then
|
||||||
AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
|
AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
|
||||||
for automatic dependency tracking. Try re-running configure with the
|
for automatic dependency tracking. If GNU make was not used, consider
|
||||||
|
re-running the configure script with MAKE="gmake" (or whatever is
|
||||||
|
necessary). You can also try re-running configure with the
|
||||||
'--disable-dependency-tracking' option to at least be able to build
|
'--disable-dependency-tracking' option to at least be able to build
|
||||||
the package (albeit without support for automatic dependency tracking).])
|
the package (albeit without support for automatic dependency tracking).])
|
||||||
fi
|
fi
|
||||||
|
@ -398,7 +400,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
|
|
||||||
# Do all the work for Automake. -*- Autoconf -*-
|
# Do all the work for Automake. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -595,7 +597,7 @@ for _am_header in $config_headers :; do
|
||||||
done
|
done
|
||||||
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
||||||
|
|
||||||
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -616,7 +618,7 @@ if test x"${install_sh+set}" != xset; then
|
||||||
fi
|
fi
|
||||||
AC_SUBST([install_sh])])
|
AC_SUBST([install_sh])])
|
||||||
|
|
||||||
# Copyright (C) 2003-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2003-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -637,7 +639,7 @@ AC_SUBST([am__leading_dot])])
|
||||||
|
|
||||||
# Check to see how 'make' treats includes. -*- Autoconf -*-
|
# Check to see how 'make' treats includes. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -680,7 +682,7 @@ AC_SUBST([am__quote])])
|
||||||
|
|
||||||
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1997-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1997-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -701,12 +703,7 @@ AC_DEFUN([AM_MISSING_HAS_RUN],
|
||||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||||
AC_REQUIRE_AUX_FILE([missing])dnl
|
AC_REQUIRE_AUX_FILE([missing])dnl
|
||||||
if test x"${MISSING+set}" != xset; then
|
if test x"${MISSING+set}" != xset; then
|
||||||
case $am_aux_dir in
|
MISSING="\${SHELL} '$am_aux_dir/missing'"
|
||||||
*\ * | *\ *)
|
|
||||||
MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
|
|
||||||
*)
|
|
||||||
MISSING="\${SHELL} $am_aux_dir/missing" ;;
|
|
||||||
esac
|
|
||||||
fi
|
fi
|
||||||
# Use eval to expand $SHELL
|
# Use eval to expand $SHELL
|
||||||
if eval "$MISSING --is-lightweight"; then
|
if eval "$MISSING --is-lightweight"; then
|
||||||
|
@ -719,7 +716,7 @@ fi
|
||||||
|
|
||||||
# Helper functions for option handling. -*- Autoconf -*-
|
# Helper functions for option handling. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -748,7 +745,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
|
||||||
AC_DEFUN([_AM_IF_OPTION],
|
AC_DEFUN([_AM_IF_OPTION],
|
||||||
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
||||||
|
|
||||||
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -795,7 +792,7 @@ AC_LANG_POP([C])])
|
||||||
# For backward compatibility.
|
# For backward compatibility.
|
||||||
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
|
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
|
||||||
|
|
||||||
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -814,7 +811,7 @@ AC_DEFUN([AM_RUN_LOG],
|
||||||
|
|
||||||
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -895,7 +892,7 @@ AC_CONFIG_COMMANDS_PRE(
|
||||||
rm -f conftest.file
|
rm -f conftest.file
|
||||||
])
|
])
|
||||||
|
|
||||||
# Copyright (C) 2009-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2009-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -955,7 +952,7 @@ AC_SUBST([AM_BACKSLASH])dnl
|
||||||
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
|
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
# Copyright (C) 2001-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -983,7 +980,7 @@ fi
|
||||||
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
||||||
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
||||||
|
|
||||||
# Copyright (C) 2006-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2006-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1002,7 +999,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
|
||||||
|
|
||||||
# Check how to create a tarball. -*- Autoconf -*-
|
# Check how to create a tarball. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2004-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2004-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
|
6
compile
6
compile
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
scriptversion=2018-03-07.03; # UTC
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2020 Free Software Foundation, Inc.
|
||||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -53,7 +53,7 @@ func_file_conv ()
|
||||||
MINGW*)
|
MINGW*)
|
||||||
file_conv=mingw
|
file_conv=mingw
|
||||||
;;
|
;;
|
||||||
CYGWIN*)
|
CYGWIN* | MSYS*)
|
||||||
file_conv=cygwin
|
file_conv=cygwin
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
@ -67,7 +67,7 @@ func_file_conv ()
|
||||||
mingw/*)
|
mingw/*)
|
||||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
||||||
;;
|
;;
|
||||||
cygwin/*)
|
cygwin/* | msys/*)
|
||||||
file=`cygpath -m "$file" || echo "$file"`
|
file=`cygpath -m "$file" || echo "$file"`
|
||||||
;;
|
;;
|
||||||
wine/*)
|
wine/*)
|
||||||
|
|
12
config.h.in
12
config.h.in
|
@ -33,9 +33,6 @@
|
||||||
/* Define to 1 if you have the <curses.h> header file. */
|
/* Define to 1 if you have the <curses.h> header file. */
|
||||||
#undef HAVE_CURSES_H
|
#undef HAVE_CURSES_H
|
||||||
|
|
||||||
/* Cygwin */
|
|
||||||
#undef HAVE_CYGWIN
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `daemon' function. */
|
/* Define to 1 if you have the `daemon' function. */
|
||||||
#undef HAVE_DAEMON
|
#undef HAVE_DAEMON
|
||||||
|
|
||||||
|
@ -264,6 +261,9 @@
|
||||||
/* Solaris/SunOS */
|
/* Solaris/SunOS */
|
||||||
#undef HAVE_SOLARIS
|
#undef HAVE_SOLARIS
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stddef.h> header file. */
|
||||||
|
#undef HAVE_STDDEF_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
#undef HAVE_STDINT_H
|
#undef HAVE_STDINT_H
|
||||||
|
|
||||||
|
@ -381,9 +381,6 @@
|
||||||
/* Define to the version of this package. */
|
/* Define to the version of this package. */
|
||||||
#undef PACKAGE_VERSION
|
#undef PACKAGE_VERSION
|
||||||
|
|
||||||
/* Define as the return type of signal handlers (`int' or `void'). */
|
|
||||||
#undef RETSIGTYPE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
#undef STDC_HEADERS
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
@ -422,9 +419,6 @@
|
||||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
||||||
#undef _POSIX_SOURCE
|
#undef _POSIX_SOURCE
|
||||||
|
|
||||||
/* Enable BSD extensions */
|
|
||||||
#undef __USE_BSD
|
|
||||||
|
|
||||||
/* Defined if the __malloc__ attribute is not supported. */
|
/* Defined if the __malloc__ attribute is not supported. */
|
||||||
#undef __malloc__
|
#undef __malloc__
|
||||||
|
|
||||||
|
|
20
configure.ac
20
configure.ac
|
@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
origcflags="$CFLAGS"
|
origcflags="$CFLAGS"
|
||||||
|
|
||||||
AC_PREREQ(2.61)
|
AC_PREREQ(2.69)
|
||||||
AC_INIT([tinc], m4_esyscmd_s((git describe || echo UNKNOWN) | sed 's/release-//'))
|
AC_INIT([tinc], m4_esyscmd_s((git describe || echo UNKNOWN) | sed 's/release-//'))
|
||||||
AC_CONFIG_SRCDIR([src/tincd.c])
|
AC_CONFIG_SRCDIR([src/tincd.c])
|
||||||
AM_INIT_AUTOMAKE([std-options subdir-objects nostdinc silent-rules -Wall])
|
AM_INIT_AUTOMAKE([std-options subdir-objects nostdinc silent-rules -Wall])
|
||||||
|
@ -10,14 +10,11 @@ AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
AM_SILENT_RULES([yes])
|
AM_SILENT_RULES([yes])
|
||||||
|
|
||||||
# Enable GNU extensions.
|
AC_USE_SYSTEM_EXTENSIONS
|
||||||
# Define this here, not in acconfig's @TOP@ section, since definitions
|
|
||||||
# in the latter don't make it into the configure-time tests.
|
|
||||||
AC_GNU_SOURCE
|
|
||||||
AC_DEFINE([__USE_BSD], 1, [Enable BSD extensions])
|
|
||||||
|
|
||||||
dnl Checks for programs.
|
dnl Checks for programs.
|
||||||
AC_PROG_CC_C99
|
AC_PROG_CC
|
||||||
|
AC_PROG_CC_STDC
|
||||||
AC_PROG_CPP
|
AC_PROG_CPP
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AM_PROG_CC_C_O
|
AM_PROG_CC_C_O
|
||||||
|
@ -65,8 +62,7 @@ case $host_os in
|
||||||
AC_DEFINE(HAVE_BSD, 1, [Unknown BSD variant])
|
AC_DEFINE(HAVE_BSD, 1, [Unknown BSD variant])
|
||||||
;;
|
;;
|
||||||
*cygwin*)
|
*cygwin*)
|
||||||
cygwin=true
|
AC_MSG_ERROR("Cygwin is no longer supported. Use MinGW to build native Windows binaries.")
|
||||||
AC_DEFINE(HAVE_CYGWIN, 1, [Cygwin])
|
|
||||||
;;
|
;;
|
||||||
*mingw*)
|
*mingw*)
|
||||||
mingw=true
|
mingw=true
|
||||||
|
@ -95,6 +91,7 @@ AC_ARG_ENABLE(vde,
|
||||||
AS_HELP_STRING([--enable-vde], [enable support for Virtual Distributed Ethernet]),
|
AS_HELP_STRING([--enable-vde], [enable support for Virtual Distributed Ethernet]),
|
||||||
[ AS_IF([test "x$enable_vde" = "xyes"],
|
[ AS_IF([test "x$enable_vde" = "xyes"],
|
||||||
[ AC_CHECK_HEADERS(libvdeplug_dyn.h, [], [AC_MSG_ERROR([VDE plug header files not found.]); break])
|
[ AC_CHECK_HEADERS(libvdeplug_dyn.h, [], [AC_MSG_ERROR([VDE plug header files not found.]); break])
|
||||||
|
AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"], [AC_MSG_ERROR([VDE plug depends on libdl.]); break])
|
||||||
AC_DEFINE(ENABLE_VDE, 1, [Support for VDE])
|
AC_DEFINE(ENABLE_VDE, 1, [Support for VDE])
|
||||||
vde=true
|
vde=true
|
||||||
],
|
],
|
||||||
|
@ -168,7 +165,7 @@ AS_IF([test "x$enable_hardening" != "xno"],
|
||||||
dnl Checks for header files.
|
dnl Checks for header files.
|
||||||
dnl We do this in multiple stages, because unlike Linux all the other operating systems really suck and don't include their own dependencies.
|
dnl We do this in multiple stages, because unlike Linux all the other operating systems really suck and don't include their own dependencies.
|
||||||
|
|
||||||
AC_CHECK_HEADERS([syslog.h sys/file.h sys/ioctl.h sys/mman.h sys/param.h sys/resource.h sys/socket.h sys/time.h sys/un.h sys/wait.h netdb.h arpa/inet.h dirent.h getopt.h])
|
AC_CHECK_HEADERS([syslog.h sys/file.h sys/ioctl.h sys/mman.h sys/param.h sys/resource.h sys/socket.h sys/time.h sys/un.h sys/wait.h netdb.h arpa/inet.h dirent.h getopt.h stddef.h])
|
||||||
AC_CHECK_HEADERS([net/if.h net/if_types.h net/ethernet.h net/if_arp.h netinet/in_systm.h netinet/in.h netinet/in6.h netpacket/packet.h],
|
AC_CHECK_HEADERS([net/if.h net/if_types.h net/ethernet.h net/if_arp.h netinet/in_systm.h netinet/in.h netinet/in6.h netpacket/packet.h],
|
||||||
[], [], [#include "$srcdir/src/have.h"]
|
[], [], [#include "$srcdir/src/have.h"]
|
||||||
)
|
)
|
||||||
|
@ -189,7 +186,6 @@ AC_CHECK_TYPES([struct ether_header, struct arphdr, struct ether_arp, struct ip,
|
||||||
)
|
)
|
||||||
|
|
||||||
dnl Checks for library functions.
|
dnl Checks for library functions.
|
||||||
AC_TYPE_SIGNAL
|
|
||||||
AC_CHECK_FUNCS([asprintf daemon fchmod flock fork gettimeofday mlockall putenv recvmmsg strsignal nanosleep unsetenv vsyslog devname fdevname],
|
AC_CHECK_FUNCS([asprintf daemon fchmod flock fork gettimeofday mlockall putenv recvmmsg strsignal nanosleep unsetenv vsyslog devname fdevname],
|
||||||
[], [], [#include "$srcdir/src/have.h"]
|
[], [], [#include "$srcdir/src/have.h"]
|
||||||
)
|
)
|
||||||
|
@ -266,6 +262,6 @@ if test "x$runstatedir" = "x"; then
|
||||||
AC_SUBST([runstatedir], ['${localstatedir}/run'])
|
AC_SUBST([runstatedir], ['${localstatedir}/run'])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile test/Makefile systemd/Makefile])
|
AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile test/Makefile test/testlib.sh systemd/Makefile bash_completion.d/Makefile])
|
||||||
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
2
depcomp
2
depcomp
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
scriptversion=2018-03-07.03; # UTC
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
|
1441
doc/texinfo.tex
1441
doc/texinfo.tex
File diff suppressed because it is too large
Load diff
|
@ -75,7 +75,7 @@ option, the value of this environment variable is used.
|
||||||
.Sh COMMANDS
|
.Sh COMMANDS
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
.It init Op Ar name
|
.It init Op Ar name
|
||||||
Create initial configuration files and RSA and Ed25519 keypairs with default length.
|
Create initial configuration files and RSA and Ed25519 key pairs with default length.
|
||||||
If no
|
If no
|
||||||
.Ar name
|
.Ar name
|
||||||
for this node is given, it will be asked for.
|
for this node is given, it will be asked for.
|
||||||
|
@ -149,11 +149,11 @@ will be made.
|
||||||
Shows the PID of the currently running
|
Shows the PID of the currently running
|
||||||
.Xr tincd 8 .
|
.Xr tincd 8 .
|
||||||
.It generate-keys Op bits
|
.It generate-keys Op bits
|
||||||
Generate both RSA and Ed25519 keypairs (see below) and exit.
|
Generate both RSA and Ed25519 key pairs (see below) and exit.
|
||||||
.It generate-ed25519-keys
|
.It generate-ed25519-keys
|
||||||
Generate public/private Ed25519 keypair and exit.
|
Generate public/private Ed25519 key pair and exit.
|
||||||
.It generate-rsa-keys Op bits
|
.It generate-rsa-keys Op bits
|
||||||
Generate public/private RSA keypair and exit.
|
Generate public/private RSA key pair and exit.
|
||||||
If
|
If
|
||||||
.Ar bits
|
.Ar bits
|
||||||
is omitted, the default length will be 2048 bits.
|
is omitted, the default length will be 2048 bits.
|
||||||
|
|
|
@ -64,7 +64,7 @@ or by using
|
||||||
.Sh PUBLIC/PRIVATE KEYS
|
.Sh PUBLIC/PRIVATE KEYS
|
||||||
The
|
The
|
||||||
.Nm tinc Li init
|
.Nm tinc Li init
|
||||||
command will have generated both RSA and Ed25519 public/private keypairs.
|
command will have generated both RSA and Ed25519 public/private key pairs.
|
||||||
The private keys should be stored in files named
|
The private keys should be stored in files named
|
||||||
.Pa rsa_key.priv
|
.Pa rsa_key.priv
|
||||||
and
|
and
|
||||||
|
@ -114,7 +114,7 @@ If
|
||||||
.Qq any
|
.Qq any
|
||||||
is selected, then depending on the operating system both IPv4 and IPv6 or just
|
is selected, then depending on the operating system both IPv4 and IPv6 or just
|
||||||
IPv6 listening sockets will be created.
|
IPv6 listening sockets will be created.
|
||||||
.It Va AutoConnect Li = yes | no Po yes
|
.It Va AutoConnect Li = yes | no Pq yes
|
||||||
If set to yes,
|
If set to yes,
|
||||||
.Nm tinc
|
.Nm tinc
|
||||||
will automatically set up meta connections to other nodes,
|
will automatically set up meta connections to other nodes,
|
||||||
|
@ -235,7 +235,8 @@ Do NOT connect multiple
|
||||||
daemons to the same multicast address, this will very likely cause routing loops.
|
daemons to the same multicast address, this will very likely cause routing loops.
|
||||||
Also note that this can cause decrypted VPN packets to be sent out on a real network if misconfigured.
|
Also note that this can cause decrypted VPN packets to be sent out on a real network if misconfigured.
|
||||||
.It fd
|
.It fd
|
||||||
Use a file descriptor.
|
Use a file descriptor, given directly as an integer or passed through a unix domain socket.
|
||||||
|
On Linux, an abstract socket address can be specified by using "@" as a prefix.
|
||||||
All packets are read from this interface.
|
All packets are read from this interface.
|
||||||
Packets received for the local node are written to it.
|
Packets received for the local node are written to it.
|
||||||
.It uml Pq not compiled in by default
|
.It uml Pq not compiled in by default
|
||||||
|
@ -683,7 +684,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.
|
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.
|
If you need to run commands asynchronously, you have to ensure yourself that they are being run in the background.
|
||||||
.Pp
|
.Pp
|
||||||
Under Windows (not Cygwin), the scripts must have the extension
|
Under Windows, the scripts must have the extension
|
||||||
.Pa .bat
|
.Pa .bat
|
||||||
or
|
or
|
||||||
.Pa .cmd .
|
.Pa .cmd .
|
||||||
|
|
548
doc/tinc.info
548
doc/tinc.info
File diff suppressed because it is too large
Load diff
213
doc/tinc.texi
213
doc/tinc.texi
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
This is the info manual for @value{PACKAGE} version @value{VERSION}, a Virtual Private Network daemon.
|
This is the info manual for @value{PACKAGE} version @value{VERSION}, a Virtual Private Network daemon.
|
||||||
|
|
||||||
Copyright @copyright{} 1998-2018 Ivo Timmermans,
|
Copyright @copyright{} 1998-2021 Ivo Timmermans,
|
||||||
Guus Sliepen <guus@@tinc-vpn.org> and
|
Guus Sliepen <guus@@tinc-vpn.org> and
|
||||||
Wessel Dankers <wsl@@tinc-vpn.org>.
|
Wessel Dankers <wsl@@tinc-vpn.org>.
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ permission notice identical to this one.
|
||||||
@vskip 0pt plus 1filll
|
@vskip 0pt plus 1filll
|
||||||
This is the info manual for @value{PACKAGE} version @value{VERSION}, a Virtual Private Network daemon.
|
This is the info manual for @value{PACKAGE} version @value{VERSION}, a Virtual Private Network daemon.
|
||||||
|
|
||||||
Copyright @copyright{} 1998-2018 Ivo Timmermans,
|
Copyright @copyright{} 1998-2021 Ivo Timmermans,
|
||||||
Guus Sliepen <guus@@tinc-vpn.org> and
|
Guus Sliepen <guus@@tinc-vpn.org> and
|
||||||
Wessel Dankers <wsl@@tinc-vpn.org>.
|
Wessel Dankers <wsl@@tinc-vpn.org>.
|
||||||
|
|
||||||
|
@ -182,7 +182,7 @@ available too.
|
||||||
@section Supported platforms
|
@section Supported platforms
|
||||||
|
|
||||||
@cindex 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
|
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.
|
that are supported by the universal tun/tap device driver or other virtual network device drivers.
|
||||||
Without such a driver, tinc will most
|
Without such a driver, tinc will most
|
||||||
|
@ -267,7 +267,7 @@ alias char-major-10-200 tun
|
||||||
@subsection Configuration of FreeBSD kernels
|
@subsection Configuration of FreeBSD kernels
|
||||||
|
|
||||||
For FreeBSD version 4.1 and higher, tun and tap drivers are included in the default kernel configuration.
|
For FreeBSD version 4.1 and higher, tun and tap drivers are included in the default kernel configuration.
|
||||||
The tap driver can be loaded with @code{kldload if_tap}, or by adding @code{if_tap_load="YES"} to @file{/boot/loader.conf}.
|
The tap driver can be loaded with @command{kldload if_tap}, or by adding @samp{if_tap_load="YES"} to @file{/boot/loader.conf}.
|
||||||
|
|
||||||
|
|
||||||
@c ==================================================================
|
@c ==================================================================
|
||||||
|
@ -308,7 +308,7 @@ Tinc also supports the driver from @uref{http://tuntaposx.sourceforge.net/},
|
||||||
which supports both tun and tap style devices,
|
which supports both tun and tap style devices,
|
||||||
|
|
||||||
By default, tinc expects the tuntaposx driver to be installed.
|
By default, tinc expects the tuntaposx driver to be installed.
|
||||||
To use the utun driver, set add @code{Device = utunX} to @file{tinc.conf},
|
To use the utun driver, set add @samp{Device = utunX} to @file{tinc.conf},
|
||||||
where X is the desired number for the utun interface.
|
where X is the desired number for the utun interface.
|
||||||
You can also omit the number, in which case the first free number will be chosen.
|
You can also omit the number, in which case the first free number will be chosen.
|
||||||
|
|
||||||
|
@ -421,7 +421,7 @@ by the zlib library.
|
||||||
|
|
||||||
If this library is not installed, you will get an error when running the
|
If this library is not installed, you will get an error when running the
|
||||||
configure script. You can either install the zlib library, or disable support
|
configure script. You can either install the zlib library, or disable support
|
||||||
for zlib compression by using the "--disable-zlib" option when running the
|
for zlib compression by using the @option{--disable-zlib} option when running the
|
||||||
configure script. Note that if you disable support for zlib, the resulting
|
configure script. Note that if you disable support for zlib, the resulting
|
||||||
binary will not work correctly on VPNs where zlib compression is used.
|
binary will not work correctly on VPNs where zlib compression is used.
|
||||||
|
|
||||||
|
@ -445,7 +445,7 @@ Another form of compression is offered using the LZO library.
|
||||||
|
|
||||||
If this library is not installed, you will get an error when running the
|
If this library is not installed, you will get an error when running the
|
||||||
configure script. You can either install the LZO library, or disable support
|
configure script. You can either install the LZO library, or disable support
|
||||||
for LZO compression by using the "--disable-lzo" option when running the
|
for LZO compression by using the @option{--disable-lzo} option when running the
|
||||||
configure script. Note that if you disable support for LZO, the resulting
|
configure script. Note that if you disable support for LZO, the resulting
|
||||||
binary will not work correctly on VPNs where LZO compression is used.
|
binary will not work correctly on VPNs where LZO compression is used.
|
||||||
|
|
||||||
|
@ -465,12 +465,12 @@ default).
|
||||||
@subsection libcurses
|
@subsection libcurses
|
||||||
|
|
||||||
@cindex libcurses
|
@cindex libcurses
|
||||||
For the "tinc top" command, tinc requires a curses library.
|
For the @command{tinc top} command, tinc requires a curses library.
|
||||||
|
|
||||||
If this library is not installed, you will get an error when running the
|
If this library is not installed, you will get an error when running the
|
||||||
configure script. You can either install a suitable curses library, or disable
|
configure script. You can either install a suitable curses library, or disable
|
||||||
all functionality that depends on a curses library by using the
|
all functionality that depends on a curses library by using the
|
||||||
"--disable-curses" option when running the configure script.
|
@option{--disable-curses} option when running the configure script.
|
||||||
|
|
||||||
There are several curses libraries. It is recommended that you install
|
There are several curses libraries. It is recommended that you install
|
||||||
"ncurses" (@url{https://invisible-island.net/ncurses/}),
|
"ncurses" (@url{https://invisible-island.net/ncurses/}),
|
||||||
|
@ -488,12 +488,12 @@ of this package.
|
||||||
@subsection libreadline
|
@subsection libreadline
|
||||||
|
|
||||||
@cindex libreadline
|
@cindex libreadline
|
||||||
For the "tinc" command's shell functionality, tinc uses the readline library.
|
For the @command{tinc} command's shell functionality, tinc uses the readline library.
|
||||||
|
|
||||||
If this library is not installed, you will get an error when running the
|
If this library is not installed, you will get an error when running the
|
||||||
configure script. You can either install a suitable readline library, or
|
configure script. You can either install a suitable readline library, or
|
||||||
disable all functionality that depends on a readline library by using the
|
disable all functionality that depends on a readline library by using the
|
||||||
"--disable-readline" option when running the configure script.
|
@option{--disable-readline} option when running the configure script.
|
||||||
|
|
||||||
You can use your operating system's package manager to install this if
|
You can use your operating system's package manager to install this if
|
||||||
available. Make sure you install the development AND runtime versions
|
available. Make sure you install the development AND runtime versions
|
||||||
|
@ -553,7 +553,6 @@ The documentation that comes along with your distribution will tell you how to d
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Darwin (MacOS/X) build environment::
|
* Darwin (MacOS/X) build environment::
|
||||||
* Cygwin (Windows) build environment::
|
|
||||||
* MinGW (Windows) build environment::
|
* MinGW (Windows) build environment::
|
||||||
@end menu
|
@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,
|
You need to download and install LibreSSL (or OpenSSL) and LZO,
|
||||||
either directly from their websites (see @ref{Libraries}) or using Fink.
|
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 ==================================================================
|
@c ==================================================================
|
||||||
@node MinGW (Windows) build environment
|
@node MinGW (Windows) build environment
|
||||||
@subsection MinGW (Windows) build environment
|
@subsection MinGW (Windows) build environment
|
||||||
|
@ -639,7 +627,7 @@ myvpn 10.0.0.0
|
||||||
|
|
||||||
@cindex port numbers
|
@cindex port numbers
|
||||||
You may add this line to @file{/etc/services}. The effect is that you
|
You may add this line to @file{/etc/services}. The effect is that you
|
||||||
may supply a @samp{tinc} as a valid port number to some programs. The
|
may supply @samp{tinc} as a valid port number to some programs. The
|
||||||
number 655 is registered with the IANA.
|
number 655 is registered with the IANA.
|
||||||
|
|
||||||
@example
|
@example
|
||||||
|
@ -695,14 +683,14 @@ A good resource on networking is the
|
||||||
|
|
||||||
If you have everything clearly pictured in your mind,
|
If you have everything clearly pictured in your mind,
|
||||||
proceed in the following order:
|
proceed in the following order:
|
||||||
First, create the initial configuration files and public/private keypairs using the following command:
|
First, create the initial configuration files and public/private key pairs using the following command:
|
||||||
@example
|
@example
|
||||||
tinc -n @var{NETNAME} init @var{NAME}
|
tinc -n @var{NETNAME} init @var{NAME}
|
||||||
@end example
|
@end example
|
||||||
Second, use @samp{tinc -n @var{NETNAME} add ...} to further configure tinc.
|
Second, use @command{tinc -n @var{NETNAME} add ...} to further configure tinc.
|
||||||
Finally, export your host configuration file using @samp{tinc -n @var{NETNAME} export} and send it to those
|
Finally, export your host configuration file using @command{tinc -n @var{NETNAME} export} and send it to those
|
||||||
people or computers you want tinc to connect to.
|
people or computers you want tinc to connect to.
|
||||||
They should send you their host configuration file back, which you can import using @samp{tinc -n @var{NETNAME} import}.
|
They should send you their host configuration file back, which you can import using @command{tinc -n @var{NETNAME} import}.
|
||||||
|
|
||||||
These steps are described in the subsections below.
|
These steps are described in the subsections below.
|
||||||
|
|
||||||
|
@ -953,7 +941,8 @@ Also note that this can cause decrypted VPN packets to be sent out on a real net
|
||||||
|
|
||||||
@cindex fd
|
@cindex fd
|
||||||
@item fd
|
@item fd
|
||||||
Use a file descriptor.
|
Use a file descriptor, given directly as an integer or passed through a unix domain socket.
|
||||||
|
On Linux, an abstract socket address can be specified by using @samp{@@} as a prefix.
|
||||||
All packets are read from this interface.
|
All packets are read from this interface.
|
||||||
Packets received for the local node are written to it.
|
Packets received for the local node are written to it.
|
||||||
|
|
||||||
|
@ -1024,7 +1013,7 @@ When this option is enabled, the SPTPS protocol will be used when connecting to
|
||||||
Ephemeral ECDH will be used for key exchanges,
|
Ephemeral ECDH will be used for key exchanges,
|
||||||
and Ed25519 will be used instead of RSA for authentication.
|
and Ed25519 will be used instead of RSA for authentication.
|
||||||
When enabled, an Ed25519 key must have been generated before with
|
When enabled, an Ed25519 key must have been generated before with
|
||||||
@samp{tinc generate-ed25519-keys}.
|
@command{tinc generate-ed25519-keys}.
|
||||||
|
|
||||||
@cindex Forwarding
|
@cindex Forwarding
|
||||||
@item Forwarding = <off|internal|kernel> (internal) [experimental]
|
@item Forwarding = <off|internal|kernel> (internal) [experimental]
|
||||||
|
@ -1081,7 +1070,7 @@ in which case listening sockets for each specified address are made.
|
||||||
|
|
||||||
If no @var{port} is specified, the socket will listen on the port specified by the Port option,
|
If no @var{port} is specified, the socket will listen on the port specified by the Port option,
|
||||||
or to port 655 if neither is given.
|
or to port 655 if neither is given.
|
||||||
To only listen on a specific port but not to a specific address, use "*" for the @var{address}.
|
To only listen on a specific port but not to a specific address, use @samp{*} for the @var{address}.
|
||||||
|
|
||||||
@cindex LocalDiscovery
|
@cindex LocalDiscovery
|
||||||
@item LocalDiscovery = <yes | no> (no)
|
@item LocalDiscovery = <yes | no> (no)
|
||||||
|
@ -1141,7 +1130,7 @@ impossible to crack a single key.
|
||||||
@cindex MACExpire
|
@cindex MACExpire
|
||||||
@item MACExpire = <@var{seconds}> (600)
|
@item MACExpire = <@var{seconds}> (600)
|
||||||
This option controls the amount of time MAC addresses are kept before they are removed.
|
This option controls the amount of time MAC addresses are kept before they are removed.
|
||||||
This only has effect when Mode is set to "switch".
|
This only has effect when Mode is set to @samp{switch}.
|
||||||
|
|
||||||
@cindex MaxConnectionBurst
|
@cindex MaxConnectionBurst
|
||||||
@item MaxConnectionBurst = <@var{count}> (100)
|
@item MaxConnectionBurst = <@var{count}> (100)
|
||||||
|
@ -1185,7 +1174,7 @@ accidental eavesdropping if you are editing the configuration file.
|
||||||
@cindex PrivateKeyFile
|
@cindex PrivateKeyFile
|
||||||
@item PrivateKeyFile = <@var{path}> (@file{@value{sysconfdir}/tinc/@var{netname}/rsa_key.priv})
|
@item PrivateKeyFile = <@var{path}> (@file{@value{sysconfdir}/tinc/@var{netname}/rsa_key.priv})
|
||||||
This is the full path name of the RSA private key file that was
|
This is the full path name of the RSA private key file that was
|
||||||
generated by @samp{tinc generate-keys}. It must be a full path, not a
|
generated by @command{tinc generate-keys}. It must be a full path, not a
|
||||||
relative directory.
|
relative directory.
|
||||||
|
|
||||||
@cindex ProcessPriority
|
@cindex ProcessPriority
|
||||||
|
@ -1287,7 +1276,7 @@ Note: this setting can have a significant impact on performance, especially raw
|
||||||
@item UPnP = <yes|udponly|no> (no)
|
@item UPnP = <yes|udponly|no> (no)
|
||||||
If this option is enabled then tinc will search for UPnP-IGD devices on the local network.
|
If this option is enabled then tinc will search for UPnP-IGD devices on the local network.
|
||||||
It will then create and maintain port mappings for tinc's listening TCP and UDP ports.
|
It will then create and maintain port mappings for tinc's listening TCP and UDP ports.
|
||||||
If set to "udponly", tinc will only create a mapping for its UDP (data) port, not for its TCP (metaconnection) port.
|
If set to @samp{udponly}, tinc will only create a mapping for its UDP (data) port, not for its TCP (metaconnection) port.
|
||||||
Note that tinc must have been built with miniupnpc support for this feature to be available.
|
Note that tinc must have been built with miniupnpc support for this feature to be available.
|
||||||
Furthermore, be advised that enabling this can have security implications, because the miniupnpc library that
|
Furthermore, be advised that enabling this can have security implications, because the miniupnpc library that
|
||||||
tinc uses might not be well-hardened with regard to malicious UPnP replies.
|
tinc uses might not be well-hardened with regard to malicious UPnP replies.
|
||||||
|
@ -1322,7 +1311,7 @@ tried until a working connection has been established.
|
||||||
@item Cipher = <@var{cipher}> (blowfish)
|
@item Cipher = <@var{cipher}> (blowfish)
|
||||||
The symmetric cipher algorithm used to encrypt UDP packets using the legacy protocol.
|
The symmetric cipher algorithm used to encrypt UDP packets using the legacy protocol.
|
||||||
Any cipher supported by LibreSSL or OpenSSL is recognized.
|
Any cipher supported by LibreSSL or OpenSSL is recognized.
|
||||||
Furthermore, specifying "none" will turn off packet encryption.
|
Furthermore, specifying @samp{none} will turn off packet encryption.
|
||||||
It is best to use only those ciphers which support CBC mode.
|
It is best to use only those ciphers which support CBC mode.
|
||||||
This option has no effect for connections using the SPTPS protocol, which always use AES-256-CTR.
|
This option has no effect for connections using the SPTPS protocol, which always use AES-256-CTR.
|
||||||
|
|
||||||
|
@ -1342,7 +1331,7 @@ Possible values are 0 (off), 1 (fast zlib) and any integer up to 9 (best zlib),
|
||||||
@item Digest = <@var{digest}> (sha1)
|
@item Digest = <@var{digest}> (sha1)
|
||||||
The digest algorithm used to authenticate UDP packets using the legacy protocol.
|
The digest algorithm used to authenticate UDP packets using the legacy protocol.
|
||||||
Any digest supported by LibreSSL or OpenSSL is recognized.
|
Any digest supported by LibreSSL or OpenSSL is recognized.
|
||||||
Furthermore, specifying "none" will turn off packet authentication.
|
Furthermore, specifying @samp{none} will turn off packet authentication.
|
||||||
This option has no effect for connections using the SPTPS protocol, which always use HMAC-SHA-256.
|
This option has no effect for connections using the SPTPS protocol, which always use HMAC-SHA-256.
|
||||||
|
|
||||||
@cindex IndirectData
|
@cindex IndirectData
|
||||||
|
@ -1383,7 +1372,7 @@ This is the RSA public key for this host.
|
||||||
@cindex PublicKeyFile
|
@cindex PublicKeyFile
|
||||||
@item PublicKeyFile = <@var{path}> [obsolete]
|
@item PublicKeyFile = <@var{path}> [obsolete]
|
||||||
This is the full path name of the RSA public key file that was generated
|
This is the full path name of the RSA public key file that was generated
|
||||||
by @samp{tinc generate-keys}. It must be a full path, not a relative
|
by @command{tinc generate-keys}. It must be a full path, not a relative
|
||||||
directory.
|
directory.
|
||||||
|
|
||||||
@cindex PEM format
|
@cindex PEM format
|
||||||
|
@ -1455,7 +1444,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.
|
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.
|
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
|
@table @file
|
||||||
@cindex tinc-up
|
@cindex tinc-up
|
||||||
|
@ -1557,7 +1546,7 @@ this is set to the invitation URL that has been created.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
Do not forget that under UNIX operating systems,
|
Do not forget that under UNIX operating systems,
|
||||||
you have to make the scripts executable, using the command @samp{chmod a+x script}.
|
you have to make the scripts executable, using the command @command{chmod a+x script}.
|
||||||
|
|
||||||
|
|
||||||
@c ==================================================================
|
@c ==================================================================
|
||||||
|
@ -1566,13 +1555,13 @@ you have to make the scripts executable, using the command @samp{chmod a+x scrip
|
||||||
|
|
||||||
@subsubheading Step 1. Creating initial configuration files.
|
@subsubheading Step 1. Creating initial configuration files.
|
||||||
|
|
||||||
The initial directory structure, configuration files and public/private keypairs are created using the following command:
|
The initial directory structure, configuration files and public/private key pairs are created using the following command:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
tinc -n @var{netname} init @var{name}
|
tinc -n @var{netname} init @var{name}
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
(You will need to run this as root, or use "sudo".)
|
(You will need to run this as root, or use @command{sudo}.)
|
||||||
This will create the configuration directory @file{@value{sysconfdir}/tinc/@var{netname}.},
|
This will create the configuration directory @file{@value{sysconfdir}/tinc/@var{netname}.},
|
||||||
and inside it will create another directory named @file{hosts/}.
|
and inside it will create another directory named @file{hosts/}.
|
||||||
In the configuration directory, it will create the file @file{tinc.conf} with the following contents:
|
In the configuration directory, it will create the file @file{tinc.conf} with the following contents:
|
||||||
|
@ -1706,8 +1695,8 @@ The netmask is the mask of the @emph{entire} VPN network, not just your
|
||||||
own subnet.
|
own subnet.
|
||||||
The second command gives the interface an IPv6 address and netmask,
|
The second command gives the interface an IPv6 address and netmask,
|
||||||
which will also automatically add an IPv6 route.
|
which will also automatically add an IPv6 route.
|
||||||
If you only want to use "ip addr" commands on Linux, don't forget that it doesn't bring the interface up, unlike ifconfig,
|
If you only want to use @command{ip addr} commands on Linux, don't forget that it doesn't bring the interface up, unlike ifconfig,
|
||||||
so you need to add @samp{ip link set $INTERFACE up} in that case.
|
so you need to add @command{ip link set $INTERFACE up} in that case.
|
||||||
|
|
||||||
The exact syntax of the ifconfig and route commands differs from platform to platform.
|
The exact syntax of the ifconfig and route commands differs from platform to platform.
|
||||||
You can look up the commands for setting addresses and adding routes in @ref{Platform specific information},
|
You can look up the commands for setting addresses and adding routes in @ref{Platform specific information},
|
||||||
|
@ -1747,7 +1736,7 @@ the real interface is also shown as a comment, to give you an idea of
|
||||||
how these example host is set up. All branches use the netname `company'
|
how these example host is set up. All branches use the netname `company'
|
||||||
for this particular VPN.
|
for this particular VPN.
|
||||||
|
|
||||||
Each branch is set up using the @samp{tinc init} and @samp{tinc config} commands,
|
Each branch is set up using the @command{tinc init} and @command{tinc config} commands,
|
||||||
here we just show the end results:
|
here we just show the end results:
|
||||||
|
|
||||||
@subsubheading For Branch A
|
@subsubheading For Branch A
|
||||||
|
@ -1893,7 +1882,7 @@ Address = 4.5.6.7
|
||||||
|
|
||||||
@subsubheading Key files
|
@subsubheading Key files
|
||||||
|
|
||||||
A, B, C and D all have their own public/private keypairs:
|
A, B, C and D all have their own public/private key pairs:
|
||||||
|
|
||||||
The private RSA key is stored in @file{@value{sysconfdir}/tinc/company/rsa_key.priv},
|
The private RSA key is stored in @file{@value{sysconfdir}/tinc/company/rsa_key.priv},
|
||||||
the private Ed25519 key is stored in @file{@value{sysconfdir}/tinc/company/ed25519_key.priv},
|
the private Ed25519 key is stored in @file{@value{sysconfdir}/tinc/company/ed25519_key.priv},
|
||||||
|
@ -2149,7 +2138,7 @@ Some of them will only be visible if the debug level is high enough.
|
||||||
@item Error reading RSA key file `rsa_key.priv': No such file or directory
|
@item Error reading RSA key file `rsa_key.priv': No such file or directory
|
||||||
|
|
||||||
@itemize
|
@itemize
|
||||||
@item You forgot to create a public/private keypair.
|
@item You forgot to create a public/private key pair.
|
||||||
@item Specify the complete pathname to the private key file with the @samp{PrivateKeyFile} option.
|
@item Specify the complete pathname to the private key file with the @samp{PrivateKeyFile} option.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
|
@ -2217,8 +2206,8 @@ You can add @samp{TCPOnly = yes} to host configuration files to force all VPN tr
|
||||||
@item Got bad/bogus/unauthorized REQUEST from foo (1.2.3.4 port 12345)
|
@item Got bad/bogus/unauthorized REQUEST from foo (1.2.3.4 port 12345)
|
||||||
|
|
||||||
@itemize
|
@itemize
|
||||||
@item Node foo does not have the right public/private keypair.
|
@item Node foo does not have the right public/private key pair.
|
||||||
Generate new keypairs and distribute them again.
|
Generate new key pairs and distribute them again.
|
||||||
@item An attacker tries to gain access to your VPN.
|
@item An attacker tries to gain access to your VPN.
|
||||||
@item A network error caused corruption of metadata sent from foo.
|
@item A network error caused corruption of metadata sent from foo.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
@ -2238,7 +2227,7 @@ Be sure to include the following information in your bugreport:
|
||||||
@item What platform (operating system, version, hardware architecture) and which version of tinc you use.
|
@item What platform (operating system, version, hardware architecture) and which version of tinc you use.
|
||||||
@item If compiling tinc fails, a copy of @file{config.log} and the error messages you get.
|
@item If compiling tinc fails, a copy of @file{config.log} and the error messages you get.
|
||||||
@item Otherwise, a copy of @file{tinc.conf}, @file{tinc-up} and all files in the @file{hosts/} directory.
|
@item Otherwise, a copy of @file{tinc.conf}, @file{tinc-up} and all files in the @file{hosts/} directory.
|
||||||
@item The output of the commands @samp{ifconfig -a} and @samp{route -n} (or @samp{netstat -rn} if that doesn't work).
|
@item The output of the commands @command{ifconfig -a} and @command{route -n} (or @command{netstat -rn} if that doesn't work).
|
||||||
@item The output of any command that fails to work as it should (like ping or traceroute).
|
@item The output of any command that fails to work as it should (like ping or traceroute).
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
|
@ -2319,11 +2308,11 @@ the value of this environment variable is used.
|
||||||
@section tinc commands
|
@section tinc commands
|
||||||
|
|
||||||
@c from the manpage
|
@c from the manpage
|
||||||
@table @code
|
@table @samp
|
||||||
|
|
||||||
@cindex init
|
@cindex init
|
||||||
@item init [@var{name}]
|
@item init [@var{name}]
|
||||||
Create initial configuration files and RSA and Ed25519 keypairs with default length.
|
Create initial configuration files and RSA and Ed25519 key pairs with default length.
|
||||||
If no @var{name} for this node is given, it will be asked for.
|
If no @var{name} for this node is given, it will be asked for.
|
||||||
|
|
||||||
@cindex get
|
@cindex get
|
||||||
|
@ -2386,15 +2375,15 @@ If no @var{URL} is given, it will be read from standard input.
|
||||||
|
|
||||||
@cindex start
|
@cindex start
|
||||||
@item start [tincd options]
|
@item start [tincd options]
|
||||||
Start @samp{tincd}, optionally with the given extra options.
|
Start @command{tincd}, optionally with the given extra options.
|
||||||
|
|
||||||
@cindex stop
|
@cindex stop
|
||||||
@item stop
|
@item stop
|
||||||
Stop @samp{tincd}.
|
Stop @command{tincd}.
|
||||||
|
|
||||||
@cindex restart
|
@cindex restart
|
||||||
@item restart [tincd options]
|
@item restart [tincd options]
|
||||||
Restart @samp{tincd}, optionally with the given extra options.
|
Restart @command{tincd}, optionally with the given extra options.
|
||||||
|
|
||||||
@cindex reload
|
@cindex reload
|
||||||
@item reload
|
@item reload
|
||||||
|
@ -2404,21 +2393,21 @@ in @file{tinc.conf} will be made.
|
||||||
|
|
||||||
@cindex pid
|
@cindex pid
|
||||||
@item pid
|
@item pid
|
||||||
Shows the PID of the currently running @samp{tincd}.
|
Shows the PID of the currently running @command{tincd}.
|
||||||
|
|
||||||
@cindex generate-keys
|
@cindex generate-keys
|
||||||
@item generate-keys [@var{bits}]
|
@item generate-keys [@var{bits}]
|
||||||
Generate both RSA and Ed25519 keypairs (see below) and exit.
|
Generate both RSA and Ed25519 key pairs (see below) and exit.
|
||||||
tinc will ask where you want to store the files, but will default to the
|
tinc will ask where you want to store the files, but will default to the
|
||||||
configuration directory (you can use the -c or -n option).
|
configuration directory (you can use the -c or -n option).
|
||||||
|
|
||||||
@cindex generate-ed25519-keys
|
@cindex generate-ed25519-keys
|
||||||
@item generate-ed25519-keys
|
@item generate-ed25519-keys
|
||||||
Generate public/private Ed25519 keypair and exit.
|
Generate public/private Ed25519 key pair and exit.
|
||||||
|
|
||||||
@cindex generate-rsa-keys
|
@cindex generate-rsa-keys
|
||||||
@item generate-rsa-keys [@var{bits}]
|
@item generate-rsa-keys [@var{bits}]
|
||||||
Generate public/private RSA keypair and exit. If @var{bits} is omitted, the
|
Generate public/private RSA key pair and exit. If @var{bits} is omitted, the
|
||||||
default length will be 2048 bits. When saving keys to existing files, tinc
|
default length will be 2048 bits. When saving keys to existing files, tinc
|
||||||
will not delete the old keys; you have to remove them manually.
|
will not delete the old keys; you have to remove them manually.
|
||||||
|
|
||||||
|
@ -2515,8 +2504,8 @@ The signed file is written to standard output.
|
||||||
|
|
||||||
Check the signature of a file against a node's public key.
|
Check the signature of a file against a node's public key.
|
||||||
The @var{name} of the node must be given,
|
The @var{name} of the node must be given,
|
||||||
or can be "." to check against the local node's public key,
|
or can be @samp{.} to check against the local node's public key,
|
||||||
or "*" to allow a signature from any node whose public key is known.
|
or @samp{*} to allow a signature from any node whose public key is known.
|
||||||
If no @var{filename} is given, the file is read from standard input.
|
If no @var{filename} is given, the file is read from standard input.
|
||||||
If the verification is successful, a copy of the input with the signature removed is written to standard output, and the exit code will be zero.
|
If the verification is successful, a copy of the input with the signature removed is written to standard output, and the exit code will be zero.
|
||||||
If the verification failed, nothing will be written to standard output, and the exit code will be non-zero.
|
If the verification failed, nothing will be written to standard output, and the exit code will be non-zero.
|
||||||
|
@ -2612,9 +2601,9 @@ Quit.
|
||||||
@chapter Invitations
|
@chapter Invitations
|
||||||
|
|
||||||
Invitations are an easy way to add new nodes to an existing VPN. Invitations
|
Invitations are an easy way to add new nodes to an existing VPN. Invitations
|
||||||
can be created on an existing node using the @code{tinc invite} command, which
|
can be created on an existing node using the @command{tinc invite} command, which
|
||||||
generates a relatively short URL which can be given to someone else, who uses
|
generates a relatively short URL which can be given to someone else, who uses
|
||||||
the @code{tinc join} command to automatically set up tinc so it can connect to
|
the @command{tinc join} command to automatically set up tinc so it can connect to
|
||||||
the inviting node. The next sections describe how invitations actually work,
|
the inviting node. The next sections describe how invitations actually work,
|
||||||
and how to further automate the invitations.
|
and how to further automate the invitations.
|
||||||
|
|
||||||
|
@ -2630,7 +2619,7 @@ and how to further automate the invitations.
|
||||||
@section How invitations work
|
@section How invitations work
|
||||||
|
|
||||||
When an invitation is created on a node (which from now on we will call the
|
When an invitation is created on a node (which from now on we will call the
|
||||||
server) using the @code{tinc invite} command, an invitation file is created
|
server) using the @command{tinc invite} command, an invitation file is created
|
||||||
that contains all the information necessary for the invitee (which we will call
|
that contains all the information necessary for the invitee (which we will call
|
||||||
the client) to create its configuration files. The invitation file is stays on
|
the client) to create its configuration files. The invitation file is stays on
|
||||||
the server, but a URL is generated that has enough information for the client
|
the server, but a URL is generated that has enough information for the client
|
||||||
|
@ -2668,14 +2657,14 @@ information in the invitation file.
|
||||||
|
|
||||||
It is important that the invitation URL is kept secret until it is used; if
|
It is important that the invitation URL is kept secret until it is used; if
|
||||||
another person gets a copy of the invitation URL before the real client runs
|
another person gets a copy of the invitation URL before the real client runs
|
||||||
the @code{tinc join} command, then that other person can try to join the VPN.
|
the @command{tinc join} command, then that other person can try to join the VPN.
|
||||||
|
|
||||||
|
|
||||||
@c ==================================================================
|
@c ==================================================================
|
||||||
@node Invitation file format
|
@node Invitation file format
|
||||||
@section Invitation file format
|
@section Invitation file format
|
||||||
|
|
||||||
The contents of an invitation file that is generated by the @code{tinc invite}
|
The contents of an invitation file that is generated by the @command{tinc invite}
|
||||||
command looks like this:
|
command looks like this:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
|
@ -2689,15 +2678,15 @@ Address = server.example.com
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
The file is basically a concatenation of several host config blocks. Each host
|
The file is basically a concatenation of several host config blocks. Each host
|
||||||
config block starts with @code{Name = ...}. Lines that look like @code{#---#}
|
config block starts with @samp{Name = ...}. Lines that look like @samp{#---#}
|
||||||
are not important, it just makes it easier for humans to read the file.
|
are not important, it just makes it easier for humans to read the file.
|
||||||
However, the first line of an invitation file @emph{must} always start with
|
However, the first line of an invitation file @emph{must} always start with
|
||||||
@code{Name = ...}.
|
@samp{Name = ...}.
|
||||||
|
|
||||||
The first host config block is always the one representing the invitee. So the
|
The first host config block is always the one representing the invitee. So the
|
||||||
first Name statement determines the name that the invitee will get. From the
|
first Name statement determines the name that the invitee will get. From the
|
||||||
first block, the @file{tinc.conf} and @file{hosts/client} files will be
|
first block, the @file{tinc.conf} and @file{hosts/client} files will be
|
||||||
generated; the @code{tinc join} command on the client will automatically
|
generated; the @command{tinc join} command on the client will automatically
|
||||||
separate statements based on whether they should be in @file{tinc.conf} or in a
|
separate statements based on whether they should be in @file{tinc.conf} or in a
|
||||||
host config file. Some statements are special and are treated differently:
|
host config file. Some statements are special and are treated differently:
|
||||||
|
|
||||||
|
@ -2711,9 +2700,9 @@ configuration with the same netname.
|
||||||
@item Ifconfig = <@var{address}[/@var{netmask}] | dhcp | dhcp6 | slaac>
|
@item Ifconfig = <@var{address}[/@var{netmask}] | dhcp | dhcp6 | slaac>
|
||||||
This is a hint for generating a @file{tinc-up} script.
|
This is a hint for generating a @file{tinc-up} script.
|
||||||
If an address is specified, a command will be added to @file{tinc-up} so the VPN interface will be configured to have the given address.
|
If an address is specified, a command will be added to @file{tinc-up} so the VPN interface will be configured to have the given address.
|
||||||
If it is the word "dhcp", a command will be added to start a DHCP client on the VPN interface.
|
If it is the word @samp{dhcp}, a command will be added to start a DHCP client on the VPN interface.
|
||||||
If it is the word dhcpv6, it will be a DHCPv6 client.
|
If it is the word @samp{dhcpv6}, it will be a DHCPv6 client.
|
||||||
If it is "slaac", then it will add commands to enable IPv6 stateless address autoconfiguration.
|
If it is @samp{slaac}, then it will add commands to enable IPv6 stateless address autoconfiguration.
|
||||||
It is also possible to specify a MAC address, in which case a command will be added to set the MAC address of the VPN interface.
|
It is also possible to specify a MAC address, in which case a command will be added to set the MAC address of the VPN interface.
|
||||||
|
|
||||||
The exact commands added to the @file{tinc-up} script depends on the operating system the client is using.
|
The exact commands added to the @file{tinc-up} script depends on the operating system the client is using.
|
||||||
|
@ -2729,7 +2718,7 @@ In general, a gateway is only necessary when running tinc in switch mode.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
Subsequent host config blocks are copied verbatim into their respective files
|
Subsequent host config blocks are copied verbatim into their respective files
|
||||||
in @file{hosts/}. The invitation file generated by @code{tinc invite} will
|
in @file{hosts/}. The invitation file generated by @command{tinc invite} will
|
||||||
normally only contain two blocks; one for the client and one for the server.
|
normally only contain two blocks; one for the client and one for the server.
|
||||||
|
|
||||||
|
|
||||||
|
@ -2737,7 +2726,7 @@ normally only contain two blocks; one for the client and one for the server.
|
||||||
@node Writing an invitation-created script
|
@node Writing an invitation-created script
|
||||||
@section Writing an invitation-created script
|
@section Writing an invitation-created script
|
||||||
|
|
||||||
When an invitation is generated, the "invitation-created" script is called (if
|
When an invitation is generated, the @file{invitation-created} script is called (if
|
||||||
it exists) right after the invitation file is written, but before the URL has
|
it exists) right after the invitation file is written, but before the URL has
|
||||||
been written to stdout. This allows one to change the invitation file
|
been written to stdout. This allows one to change the invitation file
|
||||||
automatically before the invitation URL is passed to the invitee. Here is an
|
automatically before the invitation URL is passed to the invitee. Here is an
|
||||||
|
@ -3424,42 +3413,42 @@ For IPv4 addresses:
|
||||||
|
|
||||||
@multitable {Darwin (MacOS/X)} {ifconfig route add -bla network address netmask netmask prefixlength interface}
|
@multitable {Darwin (MacOS/X)} {ifconfig route add -bla network address netmask netmask prefixlength interface}
|
||||||
@item Linux
|
@item Linux
|
||||||
@tab @code{ifconfig} @var{interface} @var{address} @code{netmask} @var{netmask}
|
@tab @command{ifconfig} @var{interface} @var{address} @samp{netmask} @var{netmask}
|
||||||
@item Linux iproute2
|
@item Linux iproute2
|
||||||
@tab @code{ip addr add} @var{address}@code{/}@var{prefixlength} @code{dev} @var{interface}
|
@tab @command{ip addr add} @var{address}@samp{/}@var{prefixlength} @samp{dev} @var{interface}
|
||||||
@item FreeBSD
|
@item FreeBSD
|
||||||
@tab @code{ifconfig} @var{interface} @var{address} @code{netmask} @var{netmask}
|
@tab @command{ifconfig} @var{interface} @var{address} @samp{netmask} @var{netmask}
|
||||||
@item OpenBSD
|
@item OpenBSD
|
||||||
@tab @code{ifconfig} @var{interface} @var{address} @code{netmask} @var{netmask}
|
@tab @command{ifconfig} @var{interface} @var{address} @samp{netmask} @var{netmask}
|
||||||
@item NetBSD
|
@item NetBSD
|
||||||
@tab @code{ifconfig} @var{interface} @var{address} @code{netmask} @var{netmask}
|
@tab @command{ifconfig} @var{interface} @var{address} @samp{netmask} @var{netmask}
|
||||||
@item Solaris
|
@item Solaris
|
||||||
@tab @code{ifconfig} @var{interface} @var{address} @code{netmask} @var{netmask}
|
@tab @command{ifconfig} @var{interface} @var{address} @samp{netmask} @var{netmask}
|
||||||
@item Darwin (MacOS/X)
|
@item Darwin (MacOS/X)
|
||||||
@tab @code{ifconfig} @var{interface} @var{address} @code{netmask} @var{netmask}
|
@tab @command{ifconfig} @var{interface} @var{address} @samp{netmask} @var{netmask}
|
||||||
@item Windows
|
@item Windows
|
||||||
@tab @code{netsh interface ip set address} @var{interface} @code{static} @var{address} @var{netmask}
|
@tab @command{netsh interface ip set address} @var{interface} @samp{static} @var{address} @var{netmask}
|
||||||
@end multitable
|
@end multitable
|
||||||
|
|
||||||
For IPv6 addresses:
|
For IPv6 addresses:
|
||||||
|
|
||||||
@multitable {Darwin (MacOS/X)} {ifconfig route add -bla network address netmask netmask prefixlength interface}
|
@multitable {Darwin (MacOS/X)} {ifconfig route add -bla network address netmask netmask prefixlength interface}
|
||||||
@item Linux
|
@item Linux
|
||||||
@tab @code{ifconfig} @var{interface} @code{add} @var{address}@code{/}@var{prefixlength}
|
@tab @command{ifconfig} @var{interface} @samp{add} @var{address}@samp{/}@var{prefixlength}
|
||||||
@item FreeBSD
|
@item FreeBSD
|
||||||
@tab @code{ifconfig} @var{interface} @code{inet6} @var{address} @code{prefixlen} @var{prefixlength}
|
@tab @command{ifconfig} @var{interface} @samp{inet6} @var{address} @samp{prefixlen} @var{prefixlength}
|
||||||
@item OpenBSD
|
@item OpenBSD
|
||||||
@tab @code{ifconfig} @var{interface} @code{inet6} @var{address} @code{prefixlen} @var{prefixlength}
|
@tab @command{ifconfig} @var{interface} @samp{inet6} @var{address} @samp{prefixlen} @var{prefixlength}
|
||||||
@item NetBSD
|
@item NetBSD
|
||||||
@tab @code{ifconfig} @var{interface} @code{inet6} @var{address} @code{prefixlen} @var{prefixlength}
|
@tab @command{ifconfig} @var{interface} @samp{inet6} @var{address} @samp{prefixlen} @var{prefixlength}
|
||||||
@item Solaris
|
@item Solaris
|
||||||
@tab @code{ifconfig} @var{interface} @code{inet6 plumb up}
|
@tab @command{ifconfig} @var{interface} @samp{inet6 plumb up}
|
||||||
@item
|
@item
|
||||||
@tab @code{ifconfig} @var{interface} @code{inet6 addif} @var{address} @var{address}
|
@tab @command{ifconfig} @var{interface} @samp{inet6 addif} @var{address} @var{address}
|
||||||
@item Darwin (MacOS/X)
|
@item Darwin (MacOS/X)
|
||||||
@tab @code{ifconfig} @var{interface} @code{inet6} @var{address} @code{prefixlen} @var{prefixlength}
|
@tab @command{ifconfig} @var{interface} @samp{inet6} @var{address} @samp{prefixlen} @var{prefixlength}
|
||||||
@item Windows
|
@item Windows
|
||||||
@tab @code{netsh interface ipv6 add address} @var{interface} @code{static} @var{address}/@var{prefixlength}
|
@tab @command{netsh interface ipv6 add address} @var{interface} @samp{static} @var{address}/@var{prefixlength}
|
||||||
@end multitable
|
@end multitable
|
||||||
|
|
||||||
On Linux, it is possible to create a persistent tun/tap interface which will
|
On Linux, it is possible to create a persistent tun/tap interface which will
|
||||||
|
@ -3469,7 +3458,7 @@ tinc can be started without needing any root privileges at all.
|
||||||
|
|
||||||
@multitable {Darwin (MacOS/X)} {ifconfig route add -bla network address netmask netmask prefixlength interface}
|
@multitable {Darwin (MacOS/X)} {ifconfig route add -bla network address netmask netmask prefixlength interface}
|
||||||
@item Linux
|
@item Linux
|
||||||
@tab @code{ip tuntap add dev} @var{interface} @code{mode} @var{tun|tap} @code{user} @var{username}
|
@tab @command{ip tuntap add dev} @var{interface} @samp{mode} @var{tun|tap} @samp{user} @var{username}
|
||||||
@end multitable
|
@end multitable
|
||||||
|
|
||||||
@c ==================================================================
|
@c ==================================================================
|
||||||
|
@ -3487,42 +3476,42 @@ Adding routes to IPv4 subnets:
|
||||||
|
|
||||||
@multitable {Darwin (MacOS/X)} {ifconfig route add -bla network address netmask netmask prefixlength interface}
|
@multitable {Darwin (MacOS/X)} {ifconfig route add -bla network address netmask netmask prefixlength interface}
|
||||||
@item Linux
|
@item Linux
|
||||||
@tab @code{route add -net} @var{network_address} @code{netmask} @var{netmask} @var{interface}
|
@tab @command{route add -net} @var{network_address} @samp{netmask} @var{netmask} @var{interface}
|
||||||
@item Linux iproute2
|
@item Linux iproute2
|
||||||
@tab @code{ip route add} @var{network_address}@code{/}@var{prefixlength} @code{dev} @var{interface}
|
@tab @command{ip route add} @var{network_address}@samp{/}@var{prefixlength} @samp{dev} @var{interface}
|
||||||
@item FreeBSD
|
@item FreeBSD
|
||||||
@tab @code{route add} @var{network_address}@code{/}@var{prefixlength} @var{local_address}
|
@tab @command{route add} @var{network_address}@samp{/}@var{prefixlength} @var{local_address}
|
||||||
@item OpenBSD
|
@item OpenBSD
|
||||||
@tab @code{route add} @var{network_address}@code{/}@var{prefixlength} @var{local_address}
|
@tab @command{route add} @var{network_address}@samp{/}@var{prefixlength} @var{local_address}
|
||||||
@item NetBSD
|
@item NetBSD
|
||||||
@tab @code{route add} @var{network_address}@code{/}@var{prefixlength} @var{local_address}
|
@tab @command{route add} @var{network_address}@samp{/}@var{prefixlength} @var{local_address}
|
||||||
@item Solaris
|
@item Solaris
|
||||||
@tab @code{route add} @var{network_address}@code{/}@var{prefixlength} @var{local_address} @code{-interface}
|
@tab @command{route add} @var{network_address}@samp{/}@var{prefixlength} @var{local_address} @samp{-interface}
|
||||||
@item Darwin (MacOS/X)
|
@item Darwin (MacOS/X)
|
||||||
@tab @code{route add} @var{network_address}@code{/}@var{prefixlength} @var{local_address}
|
@tab @command{route add} @var{network_address}@samp{/}@var{prefixlength} @var{local_address}
|
||||||
@item Windows
|
@item Windows
|
||||||
@tab @code{netsh routing ip add persistentroute} @var{network_address} @var{netmask} @var{interface} @var{local_address}
|
@tab @command{netsh routing ip add persistentroute} @var{network_address} @var{netmask} @var{interface} @var{local_address}
|
||||||
@end multitable
|
@end multitable
|
||||||
|
|
||||||
Adding routes to IPv6 subnets:
|
Adding routes to IPv6 subnets:
|
||||||
|
|
||||||
@multitable {Darwin (MacOS/X)} {ifconfig route add -bla network address netmask netmask prefixlength interface}
|
@multitable {Darwin (MacOS/X)} {ifconfig route add -bla network address netmask netmask prefixlength interface}
|
||||||
@item Linux
|
@item Linux
|
||||||
@tab @code{route add -A inet6} @var{network_address}@code{/}@var{prefixlength} @var{interface}
|
@tab @command{route add -A inet6} @var{network_address}@samp{/}@var{prefixlength} @var{interface}
|
||||||
@item Linux iproute2
|
@item Linux iproute2
|
||||||
@tab @code{ip route add} @var{network_address}@code{/}@var{prefixlength} @code{dev} @var{interface}
|
@tab @command{ip route add} @var{network_address}@samp{/}@var{prefixlength} @samp{dev} @var{interface}
|
||||||
@item FreeBSD
|
@item FreeBSD
|
||||||
@tab @code{route add -inet6} @var{network_address}@code{/}@var{prefixlength} @var{local_address}
|
@tab @command{route add -inet6} @var{network_address}@samp{/}@var{prefixlength} @var{local_address}
|
||||||
@item OpenBSD
|
@item OpenBSD
|
||||||
@tab @code{route add -inet6} @var{network_address} @var{local_address} @code{-prefixlen} @var{prefixlength}
|
@tab @command{route add -inet6} @var{network_address} @var{local_address} @samp{-prefixlen} @var{prefixlength}
|
||||||
@item NetBSD
|
@item NetBSD
|
||||||
@tab @code{route add -inet6} @var{network_address} @var{local_address} @code{-prefixlen} @var{prefixlength}
|
@tab @command{route add -inet6} @var{network_address} @var{local_address} @samp{-prefixlen} @var{prefixlength}
|
||||||
@item Solaris
|
@item Solaris
|
||||||
@tab @code{route add -inet6} @var{network_address}@code{/}@var{prefixlength} @var{local_address} @code{-interface}
|
@tab @command{route add -inet6} @var{network_address}@samp{/}@var{prefixlength} @var{local_address} @samp{-interface}
|
||||||
@item Darwin (MacOS/X)
|
@item Darwin (MacOS/X)
|
||||||
@tab ?
|
@tab ?
|
||||||
@item Windows
|
@item Windows
|
||||||
@tab @code{netsh interface ipv6 add route} @var{network address}/@var{prefixlength} @var{interface}
|
@tab @command{netsh interface ipv6 add route} @var{network address}/@var{prefixlength} @var{interface}
|
||||||
@end multitable
|
@end multitable
|
||||||
|
|
||||||
@c ==================================================================
|
@c ==================================================================
|
||||||
|
@ -3544,10 +3533,10 @@ There are many Linux distributions, and historically, many of them had their
|
||||||
own way of starting programs at boot time. Today, a number of major Linux
|
own way of starting programs at boot time. Today, a number of major Linux
|
||||||
distributions have chosen to use systemd as their init system. Tinc ships with
|
distributions have chosen to use systemd as their init system. Tinc ships with
|
||||||
systemd service files that allow you to start and stop tinc using systemd.
|
systemd service files that allow you to start and stop tinc using systemd.
|
||||||
There are two service files: @code{tinc.service} is used to globally enable or
|
There are two service files: @samp{tinc.service} is used to globally enable or
|
||||||
disable all tinc daemons managed by systemd, and
|
disable all tinc daemons managed by systemd, and
|
||||||
@code{tinc@@@var{netname}.service} is used to enable or disable specific tinc
|
@samp{tinc@@@var{netname}.service} is used to enable or disable specific tinc
|
||||||
daemons. So if one has created a tinc network with netname @code{foo}, then
|
daemons. So if one has created a tinc network with netname @samp{foo}, then
|
||||||
you have to run the following two commands to ensure it is started at boot
|
you have to run the following two commands to ensure it is started at boot
|
||||||
time:
|
time:
|
||||||
|
|
||||||
|
@ -3563,7 +3552,7 @@ following command:
|
||||||
systemctl start tinc@@foo
|
systemctl start tinc@@foo
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
You can also use @samp{systemctl start tinc}, this will start all tinc daemons
|
You can also use @command{systemctl start tinc}, this will start all tinc daemons
|
||||||
that are enabled. You can stop and disable tinc networks in the same way.
|
that are enabled. You can stop and disable tinc networks in the same way.
|
||||||
|
|
||||||
If your system is not using systemd, then you have to look up your
|
If your system is not using systemd, then you have to look up your
|
||||||
|
@ -3573,10 +3562,10 @@ distribution's way of starting tinc at boot time.
|
||||||
@node Windows
|
@node Windows
|
||||||
@subsection Windows
|
@subsection Windows
|
||||||
|
|
||||||
On Windows, if tinc is started with the @code{tinc start} command without using
|
On Windows, if tinc is started with the @command{tinc start} command without using
|
||||||
the @code{-D} or @code{--no-detach} option, it will automatically register
|
the @option{-D} or @option{--no-detach} option, it will automatically register
|
||||||
itself as a service that is started at boot time. When tinc is stopped using
|
itself as a service that is started at boot time. When tinc is stopped using
|
||||||
the @code{tinc stop} command, it will also automatically unregister itself.
|
the @command{tinc stop} command, it will also automatically unregister itself.
|
||||||
Once tinc is registered as a service, it is also possible to stop and start
|
Once tinc is registered as a service, it is also possible to stop and start
|
||||||
tinc using the Windows Services Manager.
|
tinc using the Windows Services Manager.
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ If that succeeds,
|
||||||
it will detach from the controlling terminal and continue in the background,
|
it will detach from the controlling terminal and continue in the background,
|
||||||
accepting and setting up connections to other tinc daemons
|
accepting and setting up connections to other tinc daemons
|
||||||
that are part of the virtual private network.
|
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.
|
which will be restarted automatically after reboots.
|
||||||
.Sh OPTIONS
|
.Sh OPTIONS
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
@set VERSION 1.1pre17
|
@set VERSION 1.1pre17-49-g4cc4b9bc
|
||||||
@set PACKAGE tinc
|
@set PACKAGE tinc
|
||||||
@set sysconfdir /etc
|
@set sysconfdir /usr/local/etc
|
||||||
@set localstatedir /var
|
@set localstatedir /usr/local/var
|
||||||
@set runstatedir /var/run
|
@set runstatedir /usr/local/var/run
|
||||||
|
|
157
install-sh
157
install-sh
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# install - install a program, script, or datafile
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
scriptversion=2018-03-11.20; # UTC
|
scriptversion=2020-11-14.01; # UTC
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
|
@ -69,6 +69,11 @@ posix_mkdir=
|
||||||
# Desired mode of installed file.
|
# Desired mode of installed file.
|
||||||
mode=0755
|
mode=0755
|
||||||
|
|
||||||
|
# Create dirs (including intermediate dirs) using mode 755.
|
||||||
|
# This is like GNU 'install' as of coreutils 8.32 (2020).
|
||||||
|
mkdir_umask=22
|
||||||
|
|
||||||
|
backupsuffix=
|
||||||
chgrpcmd=
|
chgrpcmd=
|
||||||
chmodcmd=$chmodprog
|
chmodcmd=$chmodprog
|
||||||
chowncmd=
|
chowncmd=
|
||||||
|
@ -99,18 +104,28 @@ Options:
|
||||||
--version display version info and exit.
|
--version display version info and exit.
|
||||||
|
|
||||||
-c (ignored)
|
-c (ignored)
|
||||||
-C install only if different (preserve the last data modification time)
|
-C install only if different (preserve data modification time)
|
||||||
-d create directories instead of installing files.
|
-d create directories instead of installing files.
|
||||||
-g GROUP $chgrpprog installed files to GROUP.
|
-g GROUP $chgrpprog installed files to GROUP.
|
||||||
-m MODE $chmodprog installed files to MODE.
|
-m MODE $chmodprog installed files to MODE.
|
||||||
-o USER $chownprog installed files to USER.
|
-o USER $chownprog installed files to USER.
|
||||||
|
-p pass -p to $cpprog.
|
||||||
-s $stripprog installed files.
|
-s $stripprog installed files.
|
||||||
|
-S SUFFIX attempt to back up existing files, with suffix SUFFIX.
|
||||||
-t DIRECTORY install into DIRECTORY.
|
-t DIRECTORY install into DIRECTORY.
|
||||||
-T report an error if DSTFILE is a directory.
|
-T report an error if DSTFILE is a directory.
|
||||||
|
|
||||||
Environment variables override the default commands:
|
Environment variables override the default commands:
|
||||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||||
RMPROG STRIPPROG
|
RMPROG STRIPPROG
|
||||||
|
|
||||||
|
By default, rm is invoked with -f; when overridden with RMPROG,
|
||||||
|
it's up to you to specify -f if you want it.
|
||||||
|
|
||||||
|
If -S is not specified, no backups are attempted.
|
||||||
|
|
||||||
|
Email bug reports to bug-automake@gnu.org.
|
||||||
|
Automake home page: https://www.gnu.org/software/automake/
|
||||||
"
|
"
|
||||||
|
|
||||||
while test $# -ne 0; do
|
while test $# -ne 0; do
|
||||||
|
@ -137,8 +152,13 @@ while test $# -ne 0; do
|
||||||
-o) chowncmd="$chownprog $2"
|
-o) chowncmd="$chownprog $2"
|
||||||
shift;;
|
shift;;
|
||||||
|
|
||||||
|
-p) cpprog="$cpprog -p";;
|
||||||
|
|
||||||
-s) stripcmd=$stripprog;;
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
|
-S) backupsuffix="$2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
-t)
|
-t)
|
||||||
is_target_a_directory=always
|
is_target_a_directory=always
|
||||||
dst_arg=$2
|
dst_arg=$2
|
||||||
|
@ -255,6 +275,10 @@ do
|
||||||
dstdir=$dst
|
dstdir=$dst
|
||||||
test -d "$dstdir"
|
test -d "$dstdir"
|
||||||
dstdir_status=$?
|
dstdir_status=$?
|
||||||
|
# Don't chown directories that already exist.
|
||||||
|
if test $dstdir_status = 0; then
|
||||||
|
chowncmd=""
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
|
|
||||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||||
|
@ -301,22 +325,6 @@ do
|
||||||
if test $dstdir_status != 0; then
|
if test $dstdir_status != 0; then
|
||||||
case $posix_mkdir in
|
case $posix_mkdir in
|
||||||
'')
|
'')
|
||||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
|
||||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
|
||||||
umask=`umask`
|
|
||||||
case $stripcmd.$umask in
|
|
||||||
# Optimize common cases.
|
|
||||||
*[2367][2367]) mkdir_umask=$umask;;
|
|
||||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
mkdir_umask=`expr $umask + 22 \
|
|
||||||
- $umask % 100 % 40 + $umask % 20 \
|
|
||||||
- $umask % 10 % 4 + $umask % 2
|
|
||||||
`;;
|
|
||||||
*) mkdir_umask=$umask,go-w;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# With -d, create the new directory with the user-specified mode.
|
# With -d, create the new directory with the user-specified mode.
|
||||||
# Otherwise, rely on $mkdir_umask.
|
# Otherwise, rely on $mkdir_umask.
|
||||||
if test -n "$dir_arg"; then
|
if test -n "$dir_arg"; then
|
||||||
|
@ -326,52 +334,49 @@ do
|
||||||
fi
|
fi
|
||||||
|
|
||||||
posix_mkdir=false
|
posix_mkdir=false
|
||||||
case $umask in
|
# The $RANDOM variable is not portable (e.g., dash). Use it
|
||||||
*[123567][0-7][0-7])
|
# here however when possible just to lower collision chance.
|
||||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# Note that $RANDOM variable is not portable (e.g. dash); Use it
|
|
||||||
# here however when possible just to lower collision chance.
|
|
||||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
|
||||||
|
|
||||||
trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
|
trap '
|
||||||
|
ret=$?
|
||||||
|
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
|
||||||
|
exit $ret
|
||||||
|
' 0
|
||||||
|
|
||||||
# Because "mkdir -p" follows existing symlinks and we likely work
|
# Because "mkdir -p" follows existing symlinks and we likely work
|
||||||
# directly in world-writeable /tmp, make sure that the '$tmpdir'
|
# directly in world-writeable /tmp, make sure that the '$tmpdir'
|
||||||
# directory is successfully created first before we actually test
|
# directory is successfully created first before we actually test
|
||||||
# 'mkdir -p' feature.
|
# 'mkdir -p'.
|
||||||
if (umask $mkdir_umask &&
|
if (umask $mkdir_umask &&
|
||||||
$mkdirprog $mkdir_mode "$tmpdir" &&
|
$mkdirprog $mkdir_mode "$tmpdir" &&
|
||||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
|
||||||
then
|
then
|
||||||
if test -z "$dir_arg" || {
|
if test -z "$dir_arg" || {
|
||||||
# Check for POSIX incompatibilities with -m.
|
# Check for POSIX incompatibilities with -m.
|
||||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||||
# other-writable bit of parent directory when it shouldn't.
|
# other-writable bit of parent directory when it shouldn't.
|
||||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||||
test_tmpdir="$tmpdir/a"
|
test_tmpdir="$tmpdir/a"
|
||||||
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
|
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
|
||||||
case $ls_ld_tmpdir in
|
case $ls_ld_tmpdir in
|
||||||
d????-?r-*) different_mode=700;;
|
d????-?r-*) different_mode=700;;
|
||||||
d????-?--*) different_mode=755;;
|
d????-?--*) different_mode=755;;
|
||||||
*) false;;
|
*) false;;
|
||||||
esac &&
|
esac &&
|
||||||
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
|
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
|
||||||
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
|
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
|
||||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
then posix_mkdir=:
|
then posix_mkdir=:
|
||||||
fi
|
fi
|
||||||
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
|
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
|
||||||
else
|
else
|
||||||
# Remove any dirs left behind by ancient mkdir implementations.
|
# Remove any dirs left behind by ancient mkdir implementations.
|
||||||
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
|
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
|
||||||
fi
|
fi
|
||||||
trap '' 0;;
|
trap '' 0;;
|
||||||
esac;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if
|
if
|
||||||
|
@ -382,7 +387,7 @@ do
|
||||||
then :
|
then :
|
||||||
else
|
else
|
||||||
|
|
||||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
# mkdir does not conform to POSIX,
|
||||||
# or it failed possibly due to a race condition. Create the
|
# or it failed possibly due to a race condition. Create the
|
||||||
# directory the slow way, step by step, checking for races as we go.
|
# directory the slow way, step by step, checking for races as we go.
|
||||||
|
|
||||||
|
@ -411,7 +416,7 @@ do
|
||||||
prefixes=
|
prefixes=
|
||||||
else
|
else
|
||||||
if $posix_mkdir; then
|
if $posix_mkdir; then
|
||||||
(umask=$mkdir_umask &&
|
(umask $mkdir_umask &&
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||||
# Don't fail if two instances are running concurrently.
|
# Don't fail if two instances are running concurrently.
|
||||||
test -d "$prefix" || exit 1
|
test -d "$prefix" || exit 1
|
||||||
|
@ -451,7 +456,18 @@ do
|
||||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
|
||||||
# Copy the file name to the temp name.
|
# Copy the file name to the temp name.
|
||||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
(umask $cp_umask &&
|
||||||
|
{ test -z "$stripcmd" || {
|
||||||
|
# Create $dsttmp read-write so that cp doesn't create it read-only,
|
||||||
|
# which would cause strip to fail.
|
||||||
|
if test -z "$doit"; then
|
||||||
|
: >"$dsttmp" # No need to fork-exec 'touch'.
|
||||||
|
else
|
||||||
|
$doit touch "$dsttmp"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
} &&
|
||||||
|
$doit_exec $cpprog "$src" "$dsttmp") &&
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits.
|
# and set any options; do chmod last to preserve setuid bits.
|
||||||
#
|
#
|
||||||
|
@ -477,6 +493,13 @@ do
|
||||||
then
|
then
|
||||||
rm -f "$dsttmp"
|
rm -f "$dsttmp"
|
||||||
else
|
else
|
||||||
|
# If $backupsuffix is set, and the file being installed
|
||||||
|
# already exists, attempt a backup. Don't worry if it fails,
|
||||||
|
# e.g., if mv doesn't support -f.
|
||||||
|
if test -n "$backupsuffix" && test -f "$dst"; then
|
||||||
|
$doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
# Rename the file to the real destination.
|
# Rename the file to the real destination.
|
||||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||||
|
|
||||||
|
@ -491,9 +514,9 @@ do
|
||||||
# file should still install successfully.
|
# file should still install successfully.
|
||||||
{
|
{
|
||||||
test ! -f "$dst" ||
|
test ! -f "$dst" ||
|
||||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
$doit $rmcmd "$dst" 2>/dev/null ||
|
||||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
{ $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
|
||||||
} ||
|
} ||
|
||||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||||
(exit 1); exit 1
|
(exit 1); exit 1
|
||||||
|
|
|
@ -9,8 +9,8 @@ AC_DEFUN([tinc_ATTRIBUTE],
|
||||||
CFLAGS="$CFLAGS -Wall -Werror"
|
CFLAGS="$CFLAGS -Wall -Werror"
|
||||||
AC_COMPILE_IFELSE(
|
AC_COMPILE_IFELSE(
|
||||||
[AC_LANG_SOURCE(
|
[AC_LANG_SOURCE(
|
||||||
[void *test(void) __attribute__ (($1));
|
[void *test(void *x) __attribute__ (($1));
|
||||||
void *test(void) { return (void *)0; }
|
void *test(void *x) { return (void *)x; }
|
||||||
],
|
],
|
||||||
)],
|
)],
|
||||||
[tinc_cv_attribute_$1=yes],
|
[tinc_cv_attribute_$1=yes],
|
||||||
|
|
2
missing
2
missing
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
scriptversion=2018-03-07.03; # UTC
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||||
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
|
|
@ -190,10 +190,6 @@ if MINGW
|
||||||
tincd_SOURCES += mingw/device.c mingw/common.h
|
tincd_SOURCES += mingw/device.c mingw/common.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if CYGWIN
|
|
||||||
tincd_SOURCES += cygwin/device.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
if UML
|
if UML
|
||||||
tincd_SOURCES += uml_device.c
|
tincd_SOURCES += uml_device.c
|
||||||
endif
|
endif
|
||||||
|
|
121
src/Makefile.in
121
src/Makefile.in
|
@ -1,7 +1,7 @@
|
||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -114,17 +114,16 @@ EXTRA_PROGRAMS = sptps_test$(EXEEXT) sptps_keypair$(EXEEXT) \
|
||||||
@BSD_TRUE@@TUNEMU_TRUE@am__append_8 = bsd/tunemu.c bsd/tunemu.h
|
@BSD_TRUE@@TUNEMU_TRUE@am__append_8 = bsd/tunemu.c bsd/tunemu.h
|
||||||
@SOLARIS_TRUE@am__append_9 = solaris/device.c
|
@SOLARIS_TRUE@am__append_9 = solaris/device.c
|
||||||
@MINGW_TRUE@am__append_10 = mingw/device.c mingw/common.h
|
@MINGW_TRUE@am__append_10 = mingw/device.c mingw/common.h
|
||||||
@CYGWIN_TRUE@am__append_11 = cygwin/device.c
|
@UML_TRUE@am__append_11 = uml_device.c
|
||||||
@UML_TRUE@am__append_12 = uml_device.c
|
@VDE_TRUE@am__append_12 = vde_device.c
|
||||||
@VDE_TRUE@am__append_13 = vde_device.c
|
@OPENSSL_TRUE@am__append_13 = \
|
||||||
@OPENSSL_TRUE@am__append_14 = \
|
|
||||||
@OPENSSL_TRUE@ openssl/cipher.c \
|
@OPENSSL_TRUE@ openssl/cipher.c \
|
||||||
@OPENSSL_TRUE@ openssl/crypto.c \
|
@OPENSSL_TRUE@ openssl/crypto.c \
|
||||||
@OPENSSL_TRUE@ openssl/digest.c openssl/digest.h \
|
@OPENSSL_TRUE@ openssl/digest.c openssl/digest.h \
|
||||||
@OPENSSL_TRUE@ openssl/prf.c \
|
@OPENSSL_TRUE@ openssl/prf.c \
|
||||||
@OPENSSL_TRUE@ openssl/rsa.c
|
@OPENSSL_TRUE@ openssl/rsa.c
|
||||||
|
|
||||||
@OPENSSL_TRUE@am__append_15 = \
|
@OPENSSL_TRUE@am__append_14 = \
|
||||||
@OPENSSL_TRUE@ openssl/cipher.c \
|
@OPENSSL_TRUE@ openssl/cipher.c \
|
||||||
@OPENSSL_TRUE@ openssl/crypto.c \
|
@OPENSSL_TRUE@ openssl/crypto.c \
|
||||||
@OPENSSL_TRUE@ openssl/digest.c openssl/digest.h \
|
@OPENSSL_TRUE@ openssl/digest.c openssl/digest.h \
|
||||||
|
@ -132,27 +131,27 @@ EXTRA_PROGRAMS = sptps_test$(EXEEXT) sptps_keypair$(EXEEXT) \
|
||||||
@OPENSSL_TRUE@ openssl/rsa.c \
|
@OPENSSL_TRUE@ openssl/rsa.c \
|
||||||
@OPENSSL_TRUE@ openssl/rsagen.c
|
@OPENSSL_TRUE@ openssl/rsagen.c
|
||||||
|
|
||||||
@OPENSSL_TRUE@am__append_16 = \
|
@OPENSSL_TRUE@am__append_15 = \
|
||||||
@OPENSSL_TRUE@ openssl/crypto.c \
|
@OPENSSL_TRUE@ openssl/crypto.c \
|
||||||
@OPENSSL_TRUE@ openssl/digest.c openssl/digest.h \
|
@OPENSSL_TRUE@ openssl/digest.c openssl/digest.h \
|
||||||
@OPENSSL_TRUE@ openssl/prf.c
|
@OPENSSL_TRUE@ openssl/prf.c
|
||||||
|
|
||||||
@OPENSSL_TRUE@am__append_17 = \
|
@OPENSSL_TRUE@am__append_16 = \
|
||||||
@OPENSSL_TRUE@ openssl/crypto.c
|
@OPENSSL_TRUE@ openssl/crypto.c
|
||||||
|
|
||||||
@OPENSSL_TRUE@am__append_18 = \
|
@OPENSSL_TRUE@am__append_17 = \
|
||||||
@OPENSSL_TRUE@ openssl/crypto.c \
|
@OPENSSL_TRUE@ openssl/crypto.c \
|
||||||
@OPENSSL_TRUE@ openssl/digest.c openssl/digest.h \
|
@OPENSSL_TRUE@ openssl/digest.c openssl/digest.h \
|
||||||
@OPENSSL_TRUE@ openssl/prf.c
|
@OPENSSL_TRUE@ openssl/prf.c
|
||||||
|
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@am__append_19 = \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@am__append_18 = \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/cipher.c \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/cipher.c \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/crypto.c \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/crypto.c \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/digest.c gcrypt/digest.h \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/digest.c gcrypt/digest.h \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/prf.c \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/prf.c \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/rsa.c
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/rsa.c
|
||||||
|
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@am__append_20 = \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@am__append_19 = \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/cipher.c \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/cipher.c \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/crypto.c \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/crypto.c \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/digest.c gcrypt/digest.h \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/digest.c gcrypt/digest.h \
|
||||||
|
@ -160,20 +159,24 @@ EXTRA_PROGRAMS = sptps_test$(EXEEXT) sptps_keypair$(EXEEXT) \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/rsa.c \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/rsa.c \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/rsagen.c
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/rsagen.c
|
||||||
|
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@am__append_21 = \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@am__append_20 = \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/cipher.c \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/cipher.c \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/crypto.c \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/crypto.c \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/digest.c gcrypt/digest.h \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/digest.c gcrypt/digest.h \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/prf.c
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/prf.c
|
||||||
|
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@am__append_22 = \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@am__append_21 = \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ openssl/crypto.c
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ openssl/crypto.c
|
||||||
|
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@am__append_23 = \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@am__append_22 = \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ openssl/crypto.c \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ openssl/crypto.c \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ openssl/digest.c openssl/digest.h \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ openssl/digest.c openssl/digest.h \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ openssl/prf.c
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ openssl/prf.c
|
||||||
|
|
||||||
|
@GCRYPT_FALSE@@OPENSSL_FALSE@am__append_23 = \
|
||||||
|
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/crypto.c \
|
||||||
|
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/prf.c
|
||||||
|
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@am__append_24 = \
|
@GCRYPT_FALSE@@OPENSSL_FALSE@am__append_24 = \
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/crypto.c \
|
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/crypto.c \
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/prf.c
|
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/prf.c
|
||||||
|
@ -183,18 +186,14 @@ EXTRA_PROGRAMS = sptps_test$(EXEEXT) sptps_keypair$(EXEEXT) \
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/prf.c
|
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/prf.c
|
||||||
|
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@am__append_26 = \
|
@GCRYPT_FALSE@@OPENSSL_FALSE@am__append_26 = \
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/crypto.c \
|
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/prf.c
|
|
||||||
|
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@am__append_27 = \
|
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/crypto.c
|
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/crypto.c
|
||||||
|
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@am__append_28 = \
|
@GCRYPT_FALSE@@OPENSSL_FALSE@am__append_27 = \
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/crypto.c \
|
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/crypto.c \
|
||||||
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/prf.c
|
@GCRYPT_FALSE@@OPENSSL_FALSE@ nolegacy/prf.c
|
||||||
|
|
||||||
@MINIUPNPC_TRUE@am__append_29 = upnp.h upnp.c
|
@MINIUPNPC_TRUE@am__append_28 = upnp.h upnp.c
|
||||||
@TUNEMU_TRUE@am__append_30 = -lpcap
|
@TUNEMU_TRUE@am__append_29 = -lpcap
|
||||||
subdir = src
|
subdir = src
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
||||||
|
@ -362,8 +361,8 @@ am__tincd_SOURCES_DIST = address_cache.c address_cache.h autoconnect.c \
|
||||||
chacha-poly1305/chacha-poly1305.h chacha-poly1305/poly1305.c \
|
chacha-poly1305/chacha-poly1305.h chacha-poly1305/poly1305.c \
|
||||||
chacha-poly1305/poly1305.h getopt.c getopt.h getopt1.c \
|
chacha-poly1305/poly1305.h getopt.c getopt.h getopt1.c \
|
||||||
linux/device.c bsd/device.c bsd/tunemu.c bsd/tunemu.h \
|
linux/device.c bsd/device.c bsd/tunemu.c bsd/tunemu.h \
|
||||||
solaris/device.c mingw/device.c mingw/common.h cygwin/device.c \
|
solaris/device.c mingw/device.c mingw/common.h uml_device.c \
|
||||||
uml_device.c vde_device.c openssl/cipher.c openssl/crypto.c \
|
vde_device.c openssl/cipher.c openssl/crypto.c \
|
||||||
openssl/digest.c openssl/digest.h openssl/prf.c openssl/rsa.c \
|
openssl/digest.c openssl/digest.h openssl/prf.c openssl/rsa.c \
|
||||||
gcrypt/cipher.c gcrypt/crypto.c gcrypt/digest.c \
|
gcrypt/cipher.c gcrypt/crypto.c gcrypt/digest.c \
|
||||||
gcrypt/digest.h gcrypt/prf.c gcrypt/rsa.c nolegacy/crypto.c \
|
gcrypt/digest.h gcrypt/prf.c gcrypt/rsa.c nolegacy/crypto.c \
|
||||||
|
@ -373,19 +372,18 @@ am__tincd_SOURCES_DIST = address_cache.c address_cache.h autoconnect.c \
|
||||||
@BSD_TRUE@@TUNEMU_TRUE@am__objects_15 = bsd/tunemu.$(OBJEXT)
|
@BSD_TRUE@@TUNEMU_TRUE@am__objects_15 = bsd/tunemu.$(OBJEXT)
|
||||||
@SOLARIS_TRUE@am__objects_16 = solaris/device.$(OBJEXT)
|
@SOLARIS_TRUE@am__objects_16 = solaris/device.$(OBJEXT)
|
||||||
@MINGW_TRUE@am__objects_17 = mingw/device.$(OBJEXT)
|
@MINGW_TRUE@am__objects_17 = mingw/device.$(OBJEXT)
|
||||||
@CYGWIN_TRUE@am__objects_18 = cygwin/device.$(OBJEXT)
|
@UML_TRUE@am__objects_18 = uml_device.$(OBJEXT)
|
||||||
@UML_TRUE@am__objects_19 = uml_device.$(OBJEXT)
|
@VDE_TRUE@am__objects_19 = vde_device.$(OBJEXT)
|
||||||
@VDE_TRUE@am__objects_20 = vde_device.$(OBJEXT)
|
@OPENSSL_TRUE@am__objects_20 = openssl/cipher.$(OBJEXT) \
|
||||||
@OPENSSL_TRUE@am__objects_21 = openssl/cipher.$(OBJEXT) \
|
|
||||||
@OPENSSL_TRUE@ openssl/crypto.$(OBJEXT) \
|
@OPENSSL_TRUE@ openssl/crypto.$(OBJEXT) \
|
||||||
@OPENSSL_TRUE@ openssl/digest.$(OBJEXT) openssl/prf.$(OBJEXT) \
|
@OPENSSL_TRUE@ openssl/digest.$(OBJEXT) openssl/prf.$(OBJEXT) \
|
||||||
@OPENSSL_TRUE@ openssl/rsa.$(OBJEXT)
|
@OPENSSL_TRUE@ openssl/rsa.$(OBJEXT)
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@am__objects_22 = gcrypt/cipher.$(OBJEXT) \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@am__objects_21 = gcrypt/cipher.$(OBJEXT) \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/crypto.$(OBJEXT) \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/crypto.$(OBJEXT) \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/digest.$(OBJEXT) \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/digest.$(OBJEXT) \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/prf.$(OBJEXT) \
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/prf.$(OBJEXT) \
|
||||||
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/rsa.$(OBJEXT)
|
@GCRYPT_TRUE@@OPENSSL_FALSE@ gcrypt/rsa.$(OBJEXT)
|
||||||
@MINIUPNPC_TRUE@am__objects_23 = upnp.$(OBJEXT)
|
@MINIUPNPC_TRUE@am__objects_22 = upnp.$(OBJEXT)
|
||||||
am_tincd_OBJECTS = address_cache.$(OBJEXT) autoconnect.$(OBJEXT) \
|
am_tincd_OBJECTS = address_cache.$(OBJEXT) autoconnect.$(OBJEXT) \
|
||||||
buffer.$(OBJEXT) conf.$(OBJEXT) connection.$(OBJEXT) \
|
buffer.$(OBJEXT) conf.$(OBJEXT) connection.$(OBJEXT) \
|
||||||
control.$(OBJEXT) dropin.$(OBJEXT) dummy_device.$(OBJEXT) \
|
control.$(OBJEXT) dropin.$(OBJEXT) dummy_device.$(OBJEXT) \
|
||||||
|
@ -405,8 +403,7 @@ am_tincd_OBJECTS = address_cache.$(OBJEXT) autoconnect.$(OBJEXT) \
|
||||||
$(am__objects_2) $(am__objects_13) $(am__objects_14) \
|
$(am__objects_2) $(am__objects_13) $(am__objects_14) \
|
||||||
$(am__objects_15) $(am__objects_16) $(am__objects_17) \
|
$(am__objects_15) $(am__objects_16) $(am__objects_17) \
|
||||||
$(am__objects_18) $(am__objects_19) $(am__objects_20) \
|
$(am__objects_18) $(am__objects_19) $(am__objects_20) \
|
||||||
$(am__objects_21) $(am__objects_22) $(am__objects_9) \
|
$(am__objects_21) $(am__objects_9) $(am__objects_22)
|
||||||
$(am__objects_23)
|
|
||||||
tincd_OBJECTS = $(am_tincd_OBJECTS)
|
tincd_OBJECTS = $(am_tincd_OBJECTS)
|
||||||
@MINIUPNPC_TRUE@tincd_DEPENDENCIES = $(am__DEPENDENCIES_1)
|
@MINIUPNPC_TRUE@tincd_DEPENDENCIES = $(am__DEPENDENCIES_1)
|
||||||
tincd_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(tincd_LDFLAGS) \
|
tincd_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(tincd_LDFLAGS) \
|
||||||
|
@ -458,21 +455,20 @@ am__depfiles_remade = ./$(DEPDIR)/address_cache.Po \
|
||||||
chacha-poly1305/$(DEPDIR)/chacha-poly1305.Po \
|
chacha-poly1305/$(DEPDIR)/chacha-poly1305.Po \
|
||||||
chacha-poly1305/$(DEPDIR)/chacha.Po \
|
chacha-poly1305/$(DEPDIR)/chacha.Po \
|
||||||
chacha-poly1305/$(DEPDIR)/poly1305.Po \
|
chacha-poly1305/$(DEPDIR)/poly1305.Po \
|
||||||
cygwin/$(DEPDIR)/device.Po ed25519/$(DEPDIR)/ecdh.Po \
|
ed25519/$(DEPDIR)/ecdh.Po ed25519/$(DEPDIR)/ecdsa.Po \
|
||||||
ed25519/$(DEPDIR)/ecdsa.Po ed25519/$(DEPDIR)/ecdsagen.Po \
|
ed25519/$(DEPDIR)/ecdsagen.Po ed25519/$(DEPDIR)/fe.Po \
|
||||||
ed25519/$(DEPDIR)/fe.Po ed25519/$(DEPDIR)/ge.Po \
|
ed25519/$(DEPDIR)/ge.Po ed25519/$(DEPDIR)/key_exchange.Po \
|
||||||
ed25519/$(DEPDIR)/key_exchange.Po ed25519/$(DEPDIR)/keypair.Po \
|
ed25519/$(DEPDIR)/keypair.Po ed25519/$(DEPDIR)/sc.Po \
|
||||||
ed25519/$(DEPDIR)/sc.Po ed25519/$(DEPDIR)/sha512.Po \
|
ed25519/$(DEPDIR)/sha512.Po ed25519/$(DEPDIR)/sign.Po \
|
||||||
ed25519/$(DEPDIR)/sign.Po ed25519/$(DEPDIR)/verify.Po \
|
ed25519/$(DEPDIR)/verify.Po gcrypt/$(DEPDIR)/cipher.Po \
|
||||||
gcrypt/$(DEPDIR)/cipher.Po gcrypt/$(DEPDIR)/crypto.Po \
|
gcrypt/$(DEPDIR)/crypto.Po gcrypt/$(DEPDIR)/digest.Po \
|
||||||
gcrypt/$(DEPDIR)/digest.Po gcrypt/$(DEPDIR)/prf.Po \
|
gcrypt/$(DEPDIR)/prf.Po gcrypt/$(DEPDIR)/rsa.Po \
|
||||||
gcrypt/$(DEPDIR)/rsa.Po gcrypt/$(DEPDIR)/rsagen.Po \
|
gcrypt/$(DEPDIR)/rsagen.Po linux/$(DEPDIR)/device.Po \
|
||||||
linux/$(DEPDIR)/device.Po mingw/$(DEPDIR)/device.Po \
|
mingw/$(DEPDIR)/device.Po nolegacy/$(DEPDIR)/crypto.Po \
|
||||||
nolegacy/$(DEPDIR)/crypto.Po nolegacy/$(DEPDIR)/prf.Po \
|
nolegacy/$(DEPDIR)/prf.Po openssl/$(DEPDIR)/cipher.Po \
|
||||||
openssl/$(DEPDIR)/cipher.Po openssl/$(DEPDIR)/crypto.Po \
|
openssl/$(DEPDIR)/crypto.Po openssl/$(DEPDIR)/digest.Po \
|
||||||
openssl/$(DEPDIR)/digest.Po openssl/$(DEPDIR)/prf.Po \
|
openssl/$(DEPDIR)/prf.Po openssl/$(DEPDIR)/rsa.Po \
|
||||||
openssl/$(DEPDIR)/rsa.Po openssl/$(DEPDIR)/rsagen.Po \
|
openssl/$(DEPDIR)/rsagen.Po solaris/$(DEPDIR)/device.Po
|
||||||
solaris/$(DEPDIR)/device.Po
|
|
||||||
am__mv = mv -f
|
am__mv = mv -f
|
||||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
@ -555,7 +551,7 @@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
LCOV = @LCOV@
|
LCOV = @LCOV@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@ -lm $(CODE_COVERAGE_LIBS) $(am__append_30)
|
LIBS = @LIBS@ -lm $(CODE_COVERAGE_LIBS) $(am__append_29)
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MINIUPNPC_LIBS = @MINIUPNPC_LIBS@
|
MINIUPNPC_LIBS = @MINIUPNPC_LIBS@
|
||||||
|
@ -665,28 +661,27 @@ tincd_SOURCES = address_cache.c address_cache.h autoconnect.c \
|
||||||
$(am__append_2) $(am__append_6) $(am__append_7) \
|
$(am__append_2) $(am__append_6) $(am__append_7) \
|
||||||
$(am__append_8) $(am__append_9) $(am__append_10) \
|
$(am__append_8) $(am__append_9) $(am__append_10) \
|
||||||
$(am__append_11) $(am__append_12) $(am__append_13) \
|
$(am__append_11) $(am__append_12) $(am__append_13) \
|
||||||
$(am__append_14) $(am__append_19) $(am__append_24) \
|
$(am__append_18) $(am__append_23) $(am__append_28)
|
||||||
$(am__append_29)
|
|
||||||
tinc_SOURCES = dropin.c dropin.h fsck.c fsck.h ifconfig.c ifconfig.h \
|
tinc_SOURCES = dropin.c dropin.h fsck.c fsck.h ifconfig.c ifconfig.h \
|
||||||
info.c info.h invitation.c invitation.h list.c list.h names.c \
|
info.c info.h invitation.c invitation.h list.c list.h names.c \
|
||||||
names.h netutl.c netutl.h script.c script.h sptps.c sptps.h \
|
names.h netutl.c netutl.h script.c script.h sptps.c sptps.h \
|
||||||
subnet_parse.c subnet.h tincctl.c tincctl.h top.c top.h \
|
subnet_parse.c subnet.h tincctl.c tincctl.h top.c top.h \
|
||||||
utils.c utils.h version.c version.h ed25519/ecdh.c \
|
utils.c utils.h version.c version.h ed25519/ecdh.c \
|
||||||
ed25519/ecdsa.c ed25519/ecdsagen.c $(ed25519_SOURCES) \
|
ed25519/ecdsa.c ed25519/ecdsagen.c $(ed25519_SOURCES) \
|
||||||
$(chacha_poly1305_SOURCES) $(am__append_3) $(am__append_15) \
|
$(chacha_poly1305_SOURCES) $(am__append_3) $(am__append_14) \
|
||||||
$(am__append_20) $(am__append_25)
|
$(am__append_19) $(am__append_24)
|
||||||
sptps_test_SOURCES = logger.c logger.h sptps.c sptps.h sptps_test.c \
|
sptps_test_SOURCES = logger.c logger.h sptps.c sptps.h sptps_test.c \
|
||||||
utils.c utils.h ed25519/ecdh.c ed25519/ecdsa.c \
|
utils.c utils.h ed25519/ecdh.c ed25519/ecdsa.c \
|
||||||
$(ed25519_SOURCES) $(chacha_poly1305_SOURCES) $(am__append_4) \
|
$(ed25519_SOURCES) $(chacha_poly1305_SOURCES) $(am__append_4) \
|
||||||
$(am__append_16) $(am__append_21) $(am__append_26)
|
$(am__append_15) $(am__append_20) $(am__append_25)
|
||||||
sptps_keypair_SOURCES = sptps_keypair.c utils.c utils.h \
|
sptps_keypair_SOURCES = sptps_keypair.c utils.c utils.h \
|
||||||
ed25519/ecdsagen.c $(ed25519_SOURCES) $(am__append_5) \
|
ed25519/ecdsagen.c $(ed25519_SOURCES) $(am__append_5) \
|
||||||
$(am__append_17) $(am__append_22) $(am__append_27)
|
$(am__append_16) $(am__append_21) $(am__append_26)
|
||||||
sptps_speed_SOURCES = logger.c logger.h sptps.c sptps.h sptps_speed.c \
|
sptps_speed_SOURCES = logger.c logger.h sptps.c sptps.h sptps_speed.c \
|
||||||
utils.c utils.h ed25519/ecdh.c ed25519/ecdsa.c \
|
utils.c utils.h ed25519/ecdh.c ed25519/ecdsa.c \
|
||||||
ed25519/ecdsagen.c $(ed25519_SOURCES) \
|
ed25519/ecdsagen.c $(ed25519_SOURCES) \
|
||||||
$(chacha_poly1305_SOURCES) $(am__append_18) $(am__append_23) \
|
$(chacha_poly1305_SOURCES) $(am__append_17) $(am__append_22) \
|
||||||
$(am__append_28)
|
$(am__append_27)
|
||||||
@MINIUPNPC_TRUE@tincd_LDADD = $(MINIUPNPC_LIBS)
|
@MINIUPNPC_TRUE@tincd_LDADD = $(MINIUPNPC_LIBS)
|
||||||
@MINIUPNPC_TRUE@tincd_LDFLAGS = -pthread
|
@MINIUPNPC_TRUE@tincd_LDFLAGS = -pthread
|
||||||
tinc_LDADD = $(READLINE_LIBS) $(CURSES_LIBS)
|
tinc_LDADD = $(READLINE_LIBS) $(CURSES_LIBS)
|
||||||
|
@ -924,14 +919,6 @@ mingw/$(DEPDIR)/$(am__dirstamp):
|
||||||
@: > mingw/$(DEPDIR)/$(am__dirstamp)
|
@: > mingw/$(DEPDIR)/$(am__dirstamp)
|
||||||
mingw/device.$(OBJEXT): mingw/$(am__dirstamp) \
|
mingw/device.$(OBJEXT): mingw/$(am__dirstamp) \
|
||||||
mingw/$(DEPDIR)/$(am__dirstamp)
|
mingw/$(DEPDIR)/$(am__dirstamp)
|
||||||
cygwin/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) cygwin
|
|
||||||
@: > cygwin/$(am__dirstamp)
|
|
||||||
cygwin/$(DEPDIR)/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) cygwin/$(DEPDIR)
|
|
||||||
@: > cygwin/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
cygwin/device.$(OBJEXT): cygwin/$(am__dirstamp) \
|
|
||||||
cygwin/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
|
|
||||||
tincd$(EXEEXT): $(tincd_OBJECTS) $(tincd_DEPENDENCIES) $(EXTRA_tincd_DEPENDENCIES)
|
tincd$(EXEEXT): $(tincd_OBJECTS) $(tincd_DEPENDENCIES) $(EXTRA_tincd_DEPENDENCIES)
|
||||||
@rm -f tincd$(EXEEXT)
|
@rm -f tincd$(EXEEXT)
|
||||||
|
@ -941,7 +928,6 @@ mostlyclean-compile:
|
||||||
-rm -f *.$(OBJEXT)
|
-rm -f *.$(OBJEXT)
|
||||||
-rm -f bsd/*.$(OBJEXT)
|
-rm -f bsd/*.$(OBJEXT)
|
||||||
-rm -f chacha-poly1305/*.$(OBJEXT)
|
-rm -f chacha-poly1305/*.$(OBJEXT)
|
||||||
-rm -f cygwin/*.$(OBJEXT)
|
|
||||||
-rm -f ed25519/*.$(OBJEXT)
|
-rm -f ed25519/*.$(OBJEXT)
|
||||||
-rm -f gcrypt/*.$(OBJEXT)
|
-rm -f gcrypt/*.$(OBJEXT)
|
||||||
-rm -f linux/*.$(OBJEXT)
|
-rm -f linux/*.$(OBJEXT)
|
||||||
|
@ -1013,7 +999,6 @@ distclean-compile:
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@chacha-poly1305/$(DEPDIR)/chacha-poly1305.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@chacha-poly1305/$(DEPDIR)/chacha-poly1305.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@chacha-poly1305/$(DEPDIR)/chacha.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@chacha-poly1305/$(DEPDIR)/chacha.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@chacha-poly1305/$(DEPDIR)/poly1305.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@chacha-poly1305/$(DEPDIR)/poly1305.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@cygwin/$(DEPDIR)/device.Po@am__quote@ # am--include-marker
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@ed25519/$(DEPDIR)/ecdh.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@ed25519/$(DEPDIR)/ecdh.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@ed25519/$(DEPDIR)/ecdsa.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@ed25519/$(DEPDIR)/ecdsa.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@ed25519/$(DEPDIR)/ecdsagen.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@ed25519/$(DEPDIR)/ecdsagen.Po@am__quote@ # am--include-marker
|
||||||
|
@ -1189,8 +1174,6 @@ distclean-generic:
|
||||||
-rm -f bsd/$(am__dirstamp)
|
-rm -f bsd/$(am__dirstamp)
|
||||||
-rm -f chacha-poly1305/$(DEPDIR)/$(am__dirstamp)
|
-rm -f chacha-poly1305/$(DEPDIR)/$(am__dirstamp)
|
||||||
-rm -f chacha-poly1305/$(am__dirstamp)
|
-rm -f chacha-poly1305/$(am__dirstamp)
|
||||||
-rm -f cygwin/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
-rm -f cygwin/$(am__dirstamp)
|
|
||||||
-rm -f ed25519/$(DEPDIR)/$(am__dirstamp)
|
-rm -f ed25519/$(DEPDIR)/$(am__dirstamp)
|
||||||
-rm -f ed25519/$(am__dirstamp)
|
-rm -f ed25519/$(am__dirstamp)
|
||||||
-rm -f gcrypt/$(DEPDIR)/$(am__dirstamp)
|
-rm -f gcrypt/$(DEPDIR)/$(am__dirstamp)
|
||||||
|
@ -1275,7 +1258,6 @@ distclean: distclean-am
|
||||||
-rm -f chacha-poly1305/$(DEPDIR)/chacha-poly1305.Po
|
-rm -f chacha-poly1305/$(DEPDIR)/chacha-poly1305.Po
|
||||||
-rm -f chacha-poly1305/$(DEPDIR)/chacha.Po
|
-rm -f chacha-poly1305/$(DEPDIR)/chacha.Po
|
||||||
-rm -f chacha-poly1305/$(DEPDIR)/poly1305.Po
|
-rm -f chacha-poly1305/$(DEPDIR)/poly1305.Po
|
||||||
-rm -f cygwin/$(DEPDIR)/device.Po
|
|
||||||
-rm -f ed25519/$(DEPDIR)/ecdh.Po
|
-rm -f ed25519/$(DEPDIR)/ecdh.Po
|
||||||
-rm -f ed25519/$(DEPDIR)/ecdsa.Po
|
-rm -f ed25519/$(DEPDIR)/ecdsa.Po
|
||||||
-rm -f ed25519/$(DEPDIR)/ecdsagen.Po
|
-rm -f ed25519/$(DEPDIR)/ecdsagen.Po
|
||||||
|
@ -1409,7 +1391,6 @@ maintainer-clean: maintainer-clean-am
|
||||||
-rm -f chacha-poly1305/$(DEPDIR)/chacha-poly1305.Po
|
-rm -f chacha-poly1305/$(DEPDIR)/chacha-poly1305.Po
|
||||||
-rm -f chacha-poly1305/$(DEPDIR)/chacha.Po
|
-rm -f chacha-poly1305/$(DEPDIR)/chacha.Po
|
||||||
-rm -f chacha-poly1305/$(DEPDIR)/poly1305.Po
|
-rm -f chacha-poly1305/$(DEPDIR)/poly1305.Po
|
||||||
-rm -f cygwin/$(DEPDIR)/device.Po
|
|
||||||
-rm -f ed25519/$(DEPDIR)/ecdh.Po
|
-rm -f ed25519/$(DEPDIR)/ecdh.Po
|
||||||
-rm -f ed25519/$(DEPDIR)/ecdsa.Po
|
-rm -f ed25519/$(DEPDIR)/ecdsa.Po
|
||||||
-rm -f ed25519/$(DEPDIR)/ecdsagen.Po
|
-rm -f ed25519/$(DEPDIR)/ecdsagen.Po
|
||||||
|
|
|
@ -151,7 +151,7 @@ const sockaddr_t *get_recent_address(address_cache_t *cache) {
|
||||||
cache->cfg = lookup_config(cache->config_tree, "Address");
|
cache->cfg = lookup_config(cache->config_tree, "Address");
|
||||||
}
|
}
|
||||||
|
|
||||||
while(cache->cfg && !cache->ai) {
|
while(cache->cfg && !cache->aip) {
|
||||||
char *address, *port;
|
char *address, *port;
|
||||||
|
|
||||||
get_config_string(cache->cfg, &address);
|
get_config_string(cache->cfg, &address);
|
||||||
|
@ -167,6 +167,10 @@ const sockaddr_t *get_recent_address(address_cache_t *cache) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(cache->ai) {
|
||||||
|
free_known_addresses(cache->ai);
|
||||||
|
}
|
||||||
|
|
||||||
cache->aip = cache->ai = str2addrinfo(address, port, SOCK_STREAM);
|
cache->aip = cache->ai = str2addrinfo(address, port, SOCK_STREAM);
|
||||||
|
|
||||||
if(cache->ai) {
|
if(cache->ai) {
|
||||||
|
|
|
@ -186,10 +186,9 @@ void do_autoconnect() {
|
||||||
drop_superfluous_outgoing_connection();
|
drop_superfluous_outgoing_connection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Drop pending outgoing connections from the outgoing list. */
|
||||||
|
drop_superfluous_pending_connections();
|
||||||
|
|
||||||
/* Check if there are unreachable nodes that we should try to connect to. */
|
/* Check if there are unreachable nodes that we should try to connect to. */
|
||||||
connect_to_unreachable();
|
connect_to_unreachable();
|
||||||
|
|
||||||
/* Drop pending outgoing connections from the outgoing list. */
|
|
||||||
drop_superfluous_pending_connections();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
device.c -- Interaction BSD tun/tap device
|
device.c -- Interaction BSD tun/tap device
|
||||||
Copyright (C) 2001-2005 Ivo Timmermans,
|
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>
|
2009 Grzegorz Dymarek <gregd72002@googlemail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -40,8 +40,13 @@
|
||||||
#include <net/if_utun.h>
|
#include <net/if_utun.h>
|
||||||
#endif
|
#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_TUN_DEVICE "/dev/tun0"
|
||||||
#define DEFAULT_TAP_DEVICE "/dev/tap0"
|
#define DEFAULT_TAP_DEVICE "/dev/tap0"
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum device_type {
|
typedef enum device_type {
|
||||||
DEVICE_TYPE_TUN,
|
DEVICE_TYPE_TUN,
|
||||||
|
|
20
src/conf.c
20
src/conf.c
|
@ -4,7 +4,7 @@
|
||||||
1998-2005 Ivo Timmermans
|
1998-2005 Ivo Timmermans
|
||||||
2000 Cris van Pelt
|
2000 Cris van Pelt
|
||||||
2010-2011 Julien Muchembled <jm@jmuchemb.eu>
|
2010-2011 Julien Muchembled <jm@jmuchemb.eu>
|
||||||
2000-2015 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
2013 Florent Clairambault <florent@clairambault.fr>
|
2013 Florent Clairambault <florent@clairambault.fr>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -206,20 +206,14 @@ bool get_config_subnet(const config_t *cfg, subnet_t **result) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Teach newbies what subnets are... */
|
if(subnetcheck(subnet)) {
|
||||||
|
*(*result = new_subnet()) = subnet;
|
||||||
if(((subnet.type == SUBNET_IPV4)
|
return true;
|
||||||
&& !maskcheck(&subnet.net.ipv4.address, subnet.net.ipv4.prefixlength, sizeof(subnet.net.ipv4.address)))
|
|
||||||
|| ((subnet.type == SUBNET_IPV6)
|
|
||||||
&& !maskcheck(&subnet.net.ipv6.address, subnet.net.ipv6.prefixlength, sizeof(subnet.net.ipv6.address)))) {
|
|
||||||
logger(DEBUG_ALWAYS, LOG_ERR, "Network address and prefix length do not match for configuration variable %s in %s line %d",
|
|
||||||
cfg->variable, cfg->file, cfg->line);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*(*result = new_subnet()) = subnet;
|
logger(DEBUG_ALWAYS, LOG_ERR, "Network address and prefix length do not match for configuration variable %s in %s line %d",
|
||||||
|
cfg->variable, cfg->file, cfg->line);
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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,
|
|
||||||
};
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
dropin.c -- a set of drop-in replacements for libc functions
|
dropin.c -- a set of drop-in replacements for libc functions
|
||||||
Copyright (C) 2000-2005 Ivo Timmermans,
|
Copyright (C) 2000-2005 Ivo Timmermans,
|
||||||
2000-2016 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2018 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -82,6 +82,8 @@ int daemon(int nochdir, int noclose) {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
|
(void)nochdir;
|
||||||
|
(void)noclose;
|
||||||
return -1;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -144,6 +146,7 @@ int gettimeofday(struct timeval *tv, void *tz) {
|
||||||
|
|
||||||
#ifndef HAVE_NANOSLEEP
|
#ifndef HAVE_NANOSLEEP
|
||||||
int nanosleep(const struct timespec *req, struct timespec *rem) {
|
int nanosleep(const struct timespec *req, struct timespec *rem) {
|
||||||
|
(void)rem;
|
||||||
struct timeval tv = {req->tv_sec, req->tv_nsec / 1000};
|
struct timeval tv = {req->tv_sec, req->tv_nsec / 1000};
|
||||||
return select(0, NULL, NULL, NULL, &tv);
|
return select(0, NULL, NULL, NULL, &tv);
|
||||||
}
|
}
|
||||||
|
|
18
src/edge.c
18
src/edge.c
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
edge.c -- edge tree management
|
edge.c -- edge tree management
|
||||||
Copyright (C) 2000-2013 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2000-2021 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
2000-2005 Ivo Timmermans
|
2000-2005 Ivo Timmermans
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -83,14 +83,26 @@ void free_edge(edge_t *e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void edge_add(edge_t *e) {
|
void edge_add(edge_t *e) {
|
||||||
splay_insert(edge_weight_tree, e);
|
splay_node_t *node = splay_insert(e->from->edge_tree, e);
|
||||||
splay_insert(e->from->edge_tree, e);
|
|
||||||
|
if(!node) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Edge from %s to %s already exists in edge_tree\n", e->from->name, e->to->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
e->reverse = lookup_edge(e->to, e->from);
|
e->reverse = lookup_edge(e->to, e->from);
|
||||||
|
|
||||||
if(e->reverse) {
|
if(e->reverse) {
|
||||||
e->reverse->reverse = e;
|
e->reverse->reverse = e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node = splay_insert(edge_weight_tree, e);
|
||||||
|
|
||||||
|
if(!node) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Edge from %s to %s already exists in edge_weight_tree\n", e->from->name, e->to->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void edge_del(edge_t *e) {
|
void edge_del(edge_t *e) {
|
||||||
|
|
|
@ -63,7 +63,7 @@ struct ether_header {
|
||||||
uint8_t ether_dhost[ETH_ALEN];
|
uint8_t ether_dhost[ETH_ALEN];
|
||||||
uint8_t ether_shost[ETH_ALEN];
|
uint8_t ether_shost[ETH_ALEN];
|
||||||
uint16_t ether_type;
|
uint16_t ether_type;
|
||||||
} __attribute__((__gcc_struct__, __packed__));
|
} __attribute__((__gcc_struct__)) __attribute((__packed__));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_STRUCT_ARPHDR
|
#ifndef HAVE_STRUCT_ARPHDR
|
||||||
|
@ -73,7 +73,7 @@ struct arphdr {
|
||||||
uint8_t ar_hln;
|
uint8_t ar_hln;
|
||||||
uint8_t ar_pln;
|
uint8_t ar_pln;
|
||||||
uint16_t ar_op;
|
uint16_t ar_op;
|
||||||
} __attribute__((__gcc_struct__, __packed__));
|
} __attribute__((__gcc_struct__)) __attribute((__packed__));
|
||||||
|
|
||||||
#define ARPOP_REQUEST 1
|
#define ARPOP_REQUEST 1
|
||||||
#define ARPOP_REPLY 2
|
#define ARPOP_REPLY 2
|
||||||
|
@ -91,7 +91,7 @@ struct ether_arp {
|
||||||
uint8_t arp_spa[4];
|
uint8_t arp_spa[4];
|
||||||
uint8_t arp_tha[ETH_ALEN];
|
uint8_t arp_tha[ETH_ALEN];
|
||||||
uint8_t arp_tpa[4];
|
uint8_t arp_tpa[4];
|
||||||
} __attribute__((__gcc_struct__, __packed__));
|
} __attribute__((__gcc_struct__)) __attribute((__packed__));
|
||||||
#define arp_hrd ea_hdr.ar_hrd
|
#define arp_hrd ea_hdr.ar_hrd
|
||||||
#define arp_pro ea_hdr.ar_pro
|
#define arp_pro ea_hdr.ar_pro
|
||||||
#define arp_hln ea_hdr.ar_hln
|
#define arp_hln ea_hdr.ar_hln
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
event.c -- I/O, timeout and signal event handling
|
event.c -- I/O, timeout and signal event handling
|
||||||
Copyright (C) 2012-2013 Guus Sliepen <guus@tinc-vpn.org>
|
Copyright (C) 2012-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -378,7 +378,7 @@ bool event_loop(void) {
|
||||||
while(running) {
|
while(running) {
|
||||||
struct timeval diff;
|
struct timeval diff;
|
||||||
struct timeval *tv = get_time_remaining(&diff);
|
struct timeval *tv = get_time_remaining(&diff);
|
||||||
DWORD timeout_ms = tv ? (tv->tv_sec * 1000 + tv->tv_usec / 1000 + 1) : WSA_INFINITE;
|
DWORD timeout_ms = tv ? (DWORD)(tv->tv_sec * 1000 + tv->tv_usec / 1000 + 1) : WSA_INFINITE;
|
||||||
|
|
||||||
if(!event_count) {
|
if(!event_count) {
|
||||||
Sleep(timeout_ms);
|
Sleep(timeout_ms);
|
||||||
|
@ -436,7 +436,7 @@ bool event_loop(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(result < WSA_WAIT_EVENT_0 || result >= WSA_WAIT_EVENT_0 + event_count - event_offset) {
|
if(result < WSA_WAIT_EVENT_0 || result >= WSA_WAIT_EVENT_0 + event_count - event_offset) {
|
||||||
return(false);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Look up io in the map by index. */
|
/* Look up io in the map by index. */
|
||||||
|
|
136
src/fd_device.c
136
src/fd_device.c
|
@ -1,9 +1,9 @@
|
||||||
/*
|
/*
|
||||||
fd_device.c -- Interaction with Android tun fd
|
fd_device.c -- Interaction with Android tun fd
|
||||||
Copyright (C) 2001-2005 Ivo Timmermans,
|
Copyright (C) 2001-2005 Ivo Timmermans,
|
||||||
2001-2016 Guus Sliepen <guus@tinc-vpn.org>
|
2001-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
2009 Grzegorz Dymarek <gregd72002@googlemail.com>
|
2009 Grzegorz Dymarek <gregd72002@googlemail.com>
|
||||||
2016 Pacien TRAN-GIRARD <pacien@pacien.net>
|
2016-2020 Pacien TRAN-GIRARD <pacien@pacien.net>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -21,6 +21,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_UN_H
|
||||||
|
#include <sys/un.h>
|
||||||
|
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "ethernet.h"
|
#include "ethernet.h"
|
||||||
|
@ -29,23 +33,132 @@
|
||||||
#include "route.h"
|
#include "route.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
static inline bool check_config(void) {
|
struct unix_socket_addr {
|
||||||
|
size_t size;
|
||||||
|
struct sockaddr_un addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int read_fd(int socket) {
|
||||||
|
char iobuf;
|
||||||
|
struct iovec iov = {0};
|
||||||
|
char cmsgbuf[CMSG_SPACE(sizeof(device_fd))];
|
||||||
|
struct msghdr msg = {0};
|
||||||
|
int ret;
|
||||||
|
struct cmsghdr *cmsgptr;
|
||||||
|
|
||||||
|
iov.iov_base = &iobuf;
|
||||||
|
iov.iov_len = 1;
|
||||||
|
msg.msg_iov = &iov;
|
||||||
|
msg.msg_iovlen = 1;
|
||||||
|
msg.msg_control = cmsgbuf;
|
||||||
|
msg.msg_controllen = sizeof(cmsgbuf);
|
||||||
|
|
||||||
|
if((ret = recvmsg(socket, &msg, 0)) < 1) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Could not read from unix socket (error %d)!", ret);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef IP_RECVERR
|
||||||
|
|
||||||
|
if(msg.msg_flags & (MSG_CTRUNC | MSG_OOB | MSG_ERRQUEUE)) {
|
||||||
|
#else
|
||||||
|
|
||||||
|
if(msg.msg_flags & (MSG_CTRUNC | MSG_OOB)) {
|
||||||
|
#endif
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Error while receiving message (flags %d)!", msg.msg_flags);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmsgptr = CMSG_FIRSTHDR(&msg);
|
||||||
|
|
||||||
|
if(cmsgptr->cmsg_level != SOL_SOCKET) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Wrong CMSG level: %d, expected %d!",
|
||||||
|
cmsgptr->cmsg_level, SOL_SOCKET);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cmsgptr->cmsg_type != SCM_RIGHTS) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Wrong CMSG type: %d, expected %d!",
|
||||||
|
cmsgptr->cmsg_type, SCM_RIGHTS);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cmsgptr->cmsg_len != CMSG_LEN(sizeof(device_fd))) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Wrong CMSG data length: %lu, expected %lu!",
|
||||||
|
(unsigned long)cmsgptr->cmsg_len, (unsigned long)CMSG_LEN(sizeof(device_fd)));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *(int *) CMSG_DATA(cmsgptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int receive_fd(struct unix_socket_addr socket_addr) {
|
||||||
|
int socketfd;
|
||||||
|
int ret;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
if((socketfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Could not open stream socket (error %d)!", socketfd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((ret = connect(socketfd, (struct sockaddr *) &socket_addr.addr, socket_addr.size)) < 0) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Could not connect to Unix socket (error %d)!", ret);
|
||||||
|
result = -1;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = read_fd(socketfd);
|
||||||
|
|
||||||
|
end:
|
||||||
|
close(socketfd);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct unix_socket_addr parse_socket_addr(const char *path) {
|
||||||
|
struct sockaddr_un socket_addr;
|
||||||
|
size_t path_length;
|
||||||
|
|
||||||
|
if(strlen(path) >= sizeof(socket_addr.sun_path)) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Unix socket path too long!");
|
||||||
|
return (struct unix_socket_addr) {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
socket_addr.sun_family = AF_UNIX;
|
||||||
|
strncpy(socket_addr.sun_path, path, sizeof(socket_addr.sun_path));
|
||||||
|
|
||||||
|
if(path[0] == '@') {
|
||||||
|
/* abstract namespace socket */
|
||||||
|
socket_addr.sun_path[0] = '\0';
|
||||||
|
path_length = strlen(path);
|
||||||
|
} else {
|
||||||
|
/* filesystem path with NUL terminator */
|
||||||
|
path_length = strlen(path) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (struct unix_socket_addr) {
|
||||||
|
.size = offsetof(struct sockaddr_un, sun_path) + path_length,
|
||||||
|
.addr = socket_addr
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool setup_device(void) {
|
||||||
if(routing_mode == RMODE_SWITCH) {
|
if(routing_mode == RMODE_SWITCH) {
|
||||||
logger(DEBUG_ALWAYS, LOG_ERR, "Switch mode not supported (requires unsupported TAP device)!");
|
logger(DEBUG_ALWAYS, LOG_ERR, "Switch mode not supported (requires unsupported TAP device)!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!get_config_int(lookup_config(config_tree, "Device"), &device_fd)) {
|
if(!get_config_string(lookup_config(config_tree, "Device"), &device)) {
|
||||||
logger(DEBUG_ALWAYS, LOG_ERR, "Could not read fd from configuration!");
|
logger(DEBUG_ALWAYS, LOG_ERR, "Could not read device from configuration!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
/* device is either directly a file descriptor or an unix socket to read it from */
|
||||||
}
|
if(sscanf(device, "%d", &device_fd) != 1) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_INFO, "Receiving fd from Unix socket at %s.", device);
|
||||||
static bool setup_device(void) {
|
device_fd = receive_fd(parse_socket_addr(device));
|
||||||
if(!check_config()) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(device_fd < 0) {
|
if(device_fd < 0) {
|
||||||
|
@ -123,3 +236,4 @@ const devops_t fd_devops = {
|
||||||
.read = read_packet,
|
.read = read_packet,
|
||||||
.write = write_packet,
|
.write = write_packet,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
46
src/fsck.c
46
src/fsck.c
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
fsck.c -- Check the configuration files for problems
|
fsck.c -- Check the configuration files for problems
|
||||||
Copyright (C) 2014 Guus Sliepen <guus@tinc-vpn.org>
|
Copyright (C) 2014-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -254,7 +254,7 @@ int fsck(const char *argv0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(HAVE_MINGW) && !defined(HAVE_CYGWIN)
|
#ifndef HAVE_MINGW
|
||||||
|
|
||||||
if(st.st_mode & 077) {
|
if(st.st_mode & 077) {
|
||||||
fprintf(stderr, "WARNING: unsafe file permissions on %s.\n", fname);
|
fprintf(stderr, "WARNING: unsafe file permissions on %s.\n", fname);
|
||||||
|
@ -303,7 +303,7 @@ int fsck(const char *argv0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(HAVE_MINGW) && !defined(HAVE_CYGWIN)
|
#ifndef HAVE_MINGW
|
||||||
|
|
||||||
if(st.st_mode & 077) {
|
if(st.st_mode & 077) {
|
||||||
fprintf(stderr, "WARNING: unsafe file permissions on %s.\n", fname);
|
fprintf(stderr, "WARNING: unsafe file permissions on %s.\n", fname);
|
||||||
|
@ -385,26 +385,38 @@ int fsck(const char *argv0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char buf1[len], buf2[len], buf3[len];
|
char *buf1 = malloc(len);
|
||||||
randomize(buf1, sizeof(buf1));
|
char *buf2 = malloc(len);
|
||||||
|
char *buf3 = malloc(len);
|
||||||
|
|
||||||
|
randomize(buf1, len);
|
||||||
buf1[0] &= 0x7f;
|
buf1[0] &= 0x7f;
|
||||||
memset(buf2, 0, sizeof(buf2));
|
memset(buf2, 0, len);
|
||||||
memset(buf3, 0, sizeof(buf2));
|
memset(buf3, 0, len);
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
if(!rsa_public_encrypt(rsa_pub, buf1, sizeof(buf1), buf2)) {
|
if(rsa_public_encrypt(rsa_pub, buf1, len, buf2)) {
|
||||||
|
if(rsa_private_decrypt(rsa_priv, buf2, len, buf3)) {
|
||||||
|
if(memcmp(buf1, buf3, len)) {
|
||||||
|
result = true;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "ERROR: public and private RSA keys do not match.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "ERROR: private RSA key does not work.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
fprintf(stderr, "ERROR: public RSA key does not work.\n");
|
fprintf(stderr, "ERROR: public RSA key does not work.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buf3);
|
||||||
|
free(buf2);
|
||||||
|
free(buf1);
|
||||||
|
|
||||||
|
if(!result) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!rsa_private_decrypt(rsa_priv, buf2, sizeof(buf2), buf3)) {
|
|
||||||
fprintf(stderr, "ERROR: private RSA key does not work.\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(memcmp(buf1, buf3, sizeof(buf1))) {
|
|
||||||
fprintf(stderr, "ERROR: public and private RSA keys do not match.\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(rsa_pub) {
|
if(rsa_pub) {
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
/*
|
/*
|
||||||
have.h -- include headers which are known to exist
|
have.h -- include headers which are known to exist
|
||||||
Copyright (C) 1998-2005 Ivo Timmermans
|
Copyright (C) 1998-2005 Ivo Timmermans
|
||||||
2003-2016 Guus Sliepen <guus@tinc-vpn.org>
|
2003-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -57,6 +57,10 @@
|
||||||
|
|
||||||
/* Include system specific headers */
|
/* Include system specific headers */
|
||||||
|
|
||||||
|
#ifdef HAVE_STDDEF_H
|
||||||
|
#include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SYSLOG_H
|
#ifdef HAVE_SYSLOG_H
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
ifconfig.c -- Generate platform specific interface configuration commands
|
ifconfig.c -- Generate platform specific interface configuration commands
|
||||||
Copyright (C) 2016-2017 Guus Sliepen <guus@tinc-vpn.org>
|
Copyright (C) 2016-2018 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -71,10 +71,12 @@ void ifconfig_dhcp(FILE *out) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ifconfig_dhcp6(FILE *out) {
|
void ifconfig_dhcp6(FILE *out) {
|
||||||
|
(void)out;
|
||||||
fprintf(stderr, "DHCPv6 requested, but not supported by tinc on this platform\n");
|
fprintf(stderr, "DHCPv6 requested, but not supported by tinc on this platform\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ifconfig_slaac(FILE *out) {
|
void ifconfig_slaac(FILE *out) {
|
||||||
|
(void)out;
|
||||||
// It's the default?
|
// It's the default?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,7 +128,7 @@ void ifconfig_address(FILE *out, const char *value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(HAVE_MINGW) || defined(HAVE_CYGWIN)
|
#elif defined(HAVE_MINGW)
|
||||||
|
|
||||||
switch(address.type) {
|
switch(address.type) {
|
||||||
case SUBNET_MAC:
|
case SUBNET_MAC:
|
||||||
|
@ -134,11 +136,11 @@ void ifconfig_address(FILE *out, const char *value) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SUBNET_IPV4:
|
case SUBNET_IPV4:
|
||||||
fprintf(out, "netsh inetface ipv4 set address \"$INTERFACE\" static %s\n", address_str);
|
fprintf(out, "netsh interface ipv4 set address \"%%INTERFACE%%\" static %s\n", address_str);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SUBNET_IPV6:
|
case SUBNET_IPV6:
|
||||||
fprintf(out, "netsh inetface ipv6 set address \"$INTERFACE\" static %s\n", address_str);
|
fprintf(out, "netsh interface ipv6 set address \"%%INTERFACE%%\" %s\n", address_str);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -199,11 +201,11 @@ void ifconfig_route(FILE *out, const char *value) {
|
||||||
if(*gateway_str) {
|
if(*gateway_str) {
|
||||||
switch(subnet.type) {
|
switch(subnet.type) {
|
||||||
case SUBNET_IPV4:
|
case SUBNET_IPV4:
|
||||||
fprintf(out, "ip route add %s via %s dev \"$INTERFACE\"\n", subnet_str, gateway_str);
|
fprintf(out, "ip route add %s via %s dev \"$INTERFACE\" onlink\n", subnet_str, gateway_str);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SUBNET_IPV6:
|
case SUBNET_IPV6:
|
||||||
fprintf(out, "ip route add %s via %s dev \"$INTERFACE\"\n", subnet_str, gateway_str);
|
fprintf(out, "ip route add %s via %s dev \"$INTERFACE\" onlink\n", subnet_str, gateway_str);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -224,16 +226,16 @@ void ifconfig_route(FILE *out, const char *value) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(HAVE_MINGW) || defined(HAVE_CYGWIN)
|
#elif defined(HAVE_MINGW)
|
||||||
|
|
||||||
if(*gateway_str) {
|
if(*gateway_str) {
|
||||||
switch(subnet.type) {
|
switch(subnet.type) {
|
||||||
case SUBNET_IPV4:
|
case SUBNET_IPV4:
|
||||||
fprintf(out, "netsh inetface ipv4 add route %s \"%%INTERFACE%%\" %s\n", subnet_str, gateway_str);
|
fprintf(out, "netsh interface ipv4 add route %s \"%%INTERFACE%%\" %s\n", subnet_str, gateway_str);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SUBNET_IPV6:
|
case SUBNET_IPV6:
|
||||||
fprintf(out, "netsh inetface ipv6 add route %s \"%%INTERFACE%%\" %s\n", subnet_str, gateway_str);
|
fprintf(out, "netsh interface ipv6 add route %s \"%%INTERFACE%%\" %s\n", subnet_str, gateway_str);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -242,11 +244,11 @@ void ifconfig_route(FILE *out, const char *value) {
|
||||||
} else {
|
} else {
|
||||||
switch(subnet.type) {
|
switch(subnet.type) {
|
||||||
case SUBNET_IPV4:
|
case SUBNET_IPV4:
|
||||||
fprintf(out, "netsh inetface ipv4 add route %s \"%%INTERFACE%%\"\n", subnet_str);
|
fprintf(out, "netsh interface ipv4 add route %s \"%%INTERFACE%%\"\n", subnet_str);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SUBNET_IPV6:
|
case SUBNET_IPV6:
|
||||||
fprintf(out, "netsh inetface ipv6 add route %s \"%%INTERFACE%%\"\n", subnet_str);
|
fprintf(out, "netsh interface ipv6 add route %s \"%%INTERFACE%%\"\n", subnet_str);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -836,8 +836,12 @@ make_names:
|
||||||
fprintf(stderr, "Ignoring unknown variable '%s' in invitation.\n", l);
|
fprintf(stderr, "Ignoring unknown variable '%s' in invitation.\n", l);
|
||||||
continue;
|
continue;
|
||||||
} else if(!(variables[i].type & VAR_SAFE)) {
|
} else if(!(variables[i].type & VAR_SAFE)) {
|
||||||
fprintf(stderr, "Ignoring unsafe variable '%s' in invitation.\n", l);
|
if(force) {
|
||||||
continue;
|
fprintf(stderr, "Warning: unsafe variable '%s' in invitation.\n", l);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Ignoring unsafe variable '%s' in invitation.\n", l);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy the safe variable to the right config file
|
// Copy the safe variable to the right config file
|
||||||
|
@ -983,7 +987,12 @@ ask_netname:
|
||||||
|
|
||||||
char filename2[PATH_MAX];
|
char filename2[PATH_MAX];
|
||||||
snprintf(filename, sizeof(filename), "%s" SLASH "tinc-up.invitation", confbase);
|
snprintf(filename, sizeof(filename), "%s" SLASH "tinc-up.invitation", confbase);
|
||||||
|
|
||||||
|
#ifdef HAVE_MINGW
|
||||||
|
snprintf(filename2, sizeof(filename2), "%s" SLASH "tinc-up.bat", confbase);
|
||||||
|
#else
|
||||||
snprintf(filename2, sizeof(filename2), "%s" SLASH "tinc-up", confbase);
|
snprintf(filename2, sizeof(filename2), "%s" SLASH "tinc-up", confbase);
|
||||||
|
#endif
|
||||||
|
|
||||||
if(valid_tinc_up) {
|
if(valid_tinc_up) {
|
||||||
if(tty) {
|
if(tty) {
|
||||||
|
@ -1013,10 +1022,14 @@ ask_netname:
|
||||||
char *command;
|
char *command;
|
||||||
#ifndef HAVE_MINGW
|
#ifndef HAVE_MINGW
|
||||||
const char *editor = getenv("VISUAL");
|
const char *editor = getenv("VISUAL");
|
||||||
if (!editor)
|
|
||||||
|
if(!editor) {
|
||||||
editor = getenv("EDITOR");
|
editor = getenv("EDITOR");
|
||||||
if (!editor)
|
}
|
||||||
|
|
||||||
|
if(!editor) {
|
||||||
editor = "vi";
|
editor = "vi";
|
||||||
|
}
|
||||||
|
|
||||||
xasprintf(&command, "\"%s\" \"%s\"", editor, filename);
|
xasprintf(&command, "\"%s\" \"%s\"", editor, filename);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -81,7 +81,7 @@ struct ip {
|
||||||
uint8_t ip_p;
|
uint8_t ip_p;
|
||||||
uint16_t ip_sum;
|
uint16_t ip_sum;
|
||||||
struct in_addr ip_src, ip_dst;
|
struct in_addr ip_src, ip_dst;
|
||||||
} __attribute__((__gcc_struct__, __packed__));
|
} __attribute__((__gcc_struct__)) __attribute((__packed__));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef IP_OFFMASK
|
#ifndef IP_OFFMASK
|
||||||
|
@ -143,7 +143,7 @@ struct icmp {
|
||||||
#define icmp_radv icmp_dun.id_radv
|
#define icmp_radv icmp_dun.id_radv
|
||||||
#define icmp_mask icmp_dun.id_mask
|
#define icmp_mask icmp_dun.id_mask
|
||||||
#define icmp_data icmp_dun.id_data
|
#define icmp_data icmp_dun.id_data
|
||||||
} __attribute__((__gcc_struct__, __packed__));
|
} __attribute__((__gcc_struct__)) __attribute((__packed__));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -49,7 +49,7 @@ struct ip6_hdr {
|
||||||
} ip6_ctlun;
|
} ip6_ctlun;
|
||||||
struct in6_addr ip6_src;
|
struct in6_addr ip6_src;
|
||||||
struct in6_addr ip6_dst;
|
struct in6_addr ip6_dst;
|
||||||
} __attribute__((__gcc_struct__, __packed__));
|
} __attribute__((__gcc_struct__)) __attribute((__packed__));
|
||||||
#define ip6_vfc ip6_ctlun.ip6_un2_vfc
|
#define ip6_vfc ip6_ctlun.ip6_un2_vfc
|
||||||
#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
|
#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
|
||||||
#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
|
#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
|
||||||
|
@ -68,7 +68,7 @@ struct icmp6_hdr {
|
||||||
uint16_t icmp6_un_data16[2];
|
uint16_t icmp6_un_data16[2];
|
||||||
uint8_t icmp6_un_data8[4];
|
uint8_t icmp6_un_data8[4];
|
||||||
} icmp6_dataun;
|
} icmp6_dataun;
|
||||||
} __attribute__((__gcc_struct__, __packed__));
|
} __attribute__((__gcc_struct__)) __attribute((__packed__));
|
||||||
#define ICMP6_DST_UNREACH_NOROUTE 0
|
#define ICMP6_DST_UNREACH_NOROUTE 0
|
||||||
#define ICMP6_DST_UNREACH 1
|
#define ICMP6_DST_UNREACH 1
|
||||||
#define ICMP6_PACKET_TOO_BIG 2
|
#define ICMP6_PACKET_TOO_BIG 2
|
||||||
|
@ -88,7 +88,7 @@ struct icmp6_hdr {
|
||||||
struct nd_neighbor_solicit {
|
struct nd_neighbor_solicit {
|
||||||
struct icmp6_hdr nd_ns_hdr;
|
struct icmp6_hdr nd_ns_hdr;
|
||||||
struct in6_addr nd_ns_target;
|
struct in6_addr nd_ns_target;
|
||||||
} __attribute__((__gcc_struct__, __packed__));
|
} __attribute__((__gcc_struct__)) __attribute((__packed__));
|
||||||
#define ND_OPT_SOURCE_LINKADDR 1
|
#define ND_OPT_SOURCE_LINKADDR 1
|
||||||
#define ND_OPT_TARGET_LINKADDR 2
|
#define ND_OPT_TARGET_LINKADDR 2
|
||||||
#define nd_ns_type nd_ns_hdr.icmp6_type
|
#define nd_ns_type nd_ns_hdr.icmp6_type
|
||||||
|
@ -101,7 +101,7 @@ struct nd_neighbor_solicit {
|
||||||
struct nd_opt_hdr {
|
struct nd_opt_hdr {
|
||||||
uint8_t nd_opt_type;
|
uint8_t nd_opt_type;
|
||||||
uint8_t nd_opt_len;
|
uint8_t nd_opt_len;
|
||||||
} __attribute__((__gcc_struct__, __packed__));
|
} __attribute__((__gcc_struct__)) __attribute((__packed__));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
meta.c -- handle the meta communication
|
meta.c -- handle the meta communication
|
||||||
Copyright (C) 2000-2014 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2000-2018 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
2000-2005 Ivo Timmermans
|
2000-2005 Ivo Timmermans
|
||||||
2006 Scott Lamb <slamb@slamb.org>
|
2006 Scott Lamb <slamb@slamb.org>
|
||||||
|
|
||||||
|
@ -31,7 +31,9 @@
|
||||||
#include "xalloc.h"
|
#include "xalloc.h"
|
||||||
|
|
||||||
#ifndef MIN
|
#ifndef MIN
|
||||||
#define MIN(x, y) (((x)<(y))?(x):(y))
|
static ssize_t MIN(ssize_t x, ssize_t y) {
|
||||||
|
return x < y ? x : y;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool send_meta_sptps(void *handle, uint8_t type, const void *buffer, size_t length) {
|
bool send_meta_sptps(void *handle, uint8_t type, const void *buffer, size_t length) {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
device.c -- Interaction with Windows tap driver in a MinGW environment
|
device.c -- Interaction with Windows tap driver in a MinGW environment
|
||||||
Copyright (C) 2002-2005 Ivo Timmermans,
|
Copyright (C) 2002-2005 Ivo Timmermans,
|
||||||
2002-2014 Guus Sliepen <guus@tinc-vpn.org>
|
2002-2018 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -71,6 +71,9 @@ static void device_issue_read() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void device_handle_read(void *data, int flags) {
|
static void device_handle_read(void *data, int flags) {
|
||||||
|
(void)data;
|
||||||
|
(void)flags;
|
||||||
|
|
||||||
DWORD len;
|
DWORD len;
|
||||||
|
|
||||||
if(!GetOverlappedResult(device_handle, &device_read_overlapped, &len, FALSE)) {
|
if(!GetOverlappedResult(device_handle, &device_read_overlapped, &len, FALSE)) {
|
||||||
|
@ -300,6 +303,7 @@ static void close_device(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool read_packet(vpn_packet_t *packet) {
|
static bool read_packet(vpn_packet_t *packet) {
|
||||||
|
(void)packet;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
names.c -- generate commonly used (file)names
|
names.c -- generate commonly used (file)names
|
||||||
Copyright (C) 1998-2005 Ivo Timmermans
|
Copyright (C) 1998-2005 Ivo Timmermans
|
||||||
2000-2017 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2018 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -93,6 +93,7 @@ void make_names(bool daemon) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_MINGW
|
#ifdef HAVE_MINGW
|
||||||
|
(void)daemon;
|
||||||
|
|
||||||
if(!logfilename) {
|
if(!logfilename) {
|
||||||
xasprintf(&logfilename, "%s" SLASH "log", confbase);
|
xasprintf(&logfilename, "%s" SLASH "log", confbase);
|
||||||
|
|
24
src/net.c
24
src/net.c
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
net.c -- most of the network code
|
net.c -- most of the network code
|
||||||
Copyright (C) 1998-2005 Ivo Timmermans,
|
Copyright (C) 1998-2005 Ivo Timmermans,
|
||||||
2000-2017 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
2006 Scott Lamb <slamb@slamb.org>
|
2006 Scott Lamb <slamb@slamb.org>
|
||||||
2011 Loïc Grenié <loic.grenie@gmail.com>
|
2011 Loïc Grenié <loic.grenie@gmail.com>
|
||||||
|
|
||||||
|
@ -404,20 +404,18 @@ int reload_configuration(void) {
|
||||||
while(cfg) {
|
while(cfg) {
|
||||||
subnet_t *subnet, *s2;
|
subnet_t *subnet, *s2;
|
||||||
|
|
||||||
if(!get_config_subnet(cfg, &subnet)) {
|
if(get_config_subnet(cfg, &subnet)) {
|
||||||
continue;
|
if((s2 = lookup_subnet(myself, subnet))) {
|
||||||
}
|
if(s2->expires == 1) {
|
||||||
|
s2->expires = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if((s2 = lookup_subnet(myself, subnet))) {
|
free_subnet(subnet);
|
||||||
if(s2->expires == 1) {
|
} else {
|
||||||
s2->expires = 0;
|
subnet_add(myself, subnet);
|
||||||
|
send_add_subnet(everyone, subnet);
|
||||||
|
subnet_update(myself, subnet, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
free_subnet(subnet);
|
|
||||||
} else {
|
|
||||||
subnet_add(myself, subnet);
|
|
||||||
send_add_subnet(everyone, subnet);
|
|
||||||
subnet_update(myself, subnet, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg = lookup_config_next(config_tree, cfg);
|
cfg = lookup_config_next(config_tree, cfg);
|
||||||
|
|
|
@ -121,7 +121,6 @@ typedef struct listen_socket_t {
|
||||||
typedef struct outgoing_t {
|
typedef struct outgoing_t {
|
||||||
struct node_t *node;
|
struct node_t *node;
|
||||||
int timeout;
|
int timeout;
|
||||||
struct address_cache_t *address_cache;
|
|
||||||
timeout_t ev;
|
timeout_t ev;
|
||||||
} outgoing_t;
|
} outgoing_t;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
net_packet.c -- Handles in- and outgoing VPN packets
|
net_packet.c -- Handles in- and outgoing VPN packets
|
||||||
Copyright (C) 1998-2005 Ivo Timmermans,
|
Copyright (C) 1998-2005 Ivo Timmermans,
|
||||||
2000-2017 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
2010 Timothy Redaelli <timothy@redaelli.eu>
|
2010 Timothy Redaelli <timothy@redaelli.eu>
|
||||||
2010 Brandon Black <blblack@gmail.com>
|
2010 Brandon Black <blblack@gmail.com>
|
||||||
|
|
||||||
|
@ -152,11 +152,12 @@ static void udp_probe_h(node_t *n, vpn_packet_t *packet, length_t len) {
|
||||||
len = ntohs(len16);
|
len = ntohs(len16);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(n->udp_ping_sent.tv_sec != 0) { // a probe in flight
|
if(n->status.ping_sent) { // a probe in flight
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
struct timeval rtt;
|
struct timeval rtt;
|
||||||
timersub(&now, &n->udp_ping_sent, &rtt);
|
timersub(&now, &n->udp_ping_sent, &rtt);
|
||||||
n->udp_ping_rtt = rtt.tv_sec * 1000000 + rtt.tv_usec;
|
n->udp_ping_rtt = rtt.tv_sec * 1000000 + rtt.tv_usec;
|
||||||
|
n->status.ping_sent = false;
|
||||||
logger(DEBUG_TRAFFIC, LOG_INFO, "Got type %d UDP probe reply %d from %s (%s) rtt=%d.%03d", DATA(packet)[0], len, n->name, n->hostname, n->udp_ping_rtt / 1000, n->udp_ping_rtt % 1000);
|
logger(DEBUG_TRAFFIC, LOG_INFO, "Got type %d UDP probe reply %d from %s (%s) rtt=%d.%03d", DATA(packet)[0], len, n->name, n->hostname, n->udp_ping_rtt / 1000, n->udp_ping_rtt % 1000);
|
||||||
} else {
|
} else {
|
||||||
logger(DEBUG_TRAFFIC, LOG_INFO, "Got type %d UDP probe reply %d from %s (%s)", DATA(packet)[0], len, n->name, n->hostname);
|
logger(DEBUG_TRAFFIC, LOG_INFO, "Got type %d UDP probe reply %d from %s (%s)", DATA(packet)[0], len, n->name, n->hostname);
|
||||||
|
@ -175,8 +176,7 @@ static void udp_probe_h(node_t *n, vpn_packet_t *packet, length_t len) {
|
||||||
reset_address_cache(n->address_cache, &n->address);
|
reset_address_cache(n->address_cache, &n->address);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset the UDP ping timer. (no probe in flight)
|
// Reset the UDP ping timer.
|
||||||
n->udp_ping_sent.tv_sec = 0;
|
|
||||||
|
|
||||||
if(udp_discovery) {
|
if(udp_discovery) {
|
||||||
timeout_del(&n->udp_ping_timeout);
|
timeout_del(&n->udp_ping_timeout);
|
||||||
|
@ -314,13 +314,6 @@ static bool try_mac(node_t *n, const vpn_packet_t *inpkt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool receive_udppacket(node_t *n, vpn_packet_t *inpkt) {
|
static bool receive_udppacket(node_t *n, vpn_packet_t *inpkt) {
|
||||||
vpn_packet_t pkt1, pkt2;
|
|
||||||
vpn_packet_t *pkt[] = { &pkt1, &pkt2, &pkt1, &pkt2 };
|
|
||||||
int nextpkt = 0;
|
|
||||||
size_t outlen;
|
|
||||||
pkt1.offset = DEFAULT_PACKET_OFFSET;
|
|
||||||
pkt2.offset = DEFAULT_PACKET_OFFSET;
|
|
||||||
|
|
||||||
if(n->status.sptps) {
|
if(n->status.sptps) {
|
||||||
if(!n->sptps.state) {
|
if(!n->sptps.state) {
|
||||||
if(!n->status.waitingforkey) {
|
if(!n->status.waitingforkey) {
|
||||||
|
@ -356,6 +349,12 @@ static bool receive_udppacket(node_t *n, vpn_packet_t *inpkt) {
|
||||||
#ifdef DISABLE_LEGACY
|
#ifdef DISABLE_LEGACY
|
||||||
return false;
|
return false;
|
||||||
#else
|
#else
|
||||||
|
vpn_packet_t pkt1, pkt2;
|
||||||
|
vpn_packet_t *pkt[] = { &pkt1, &pkt2, &pkt1, &pkt2 };
|
||||||
|
int nextpkt = 0;
|
||||||
|
size_t outlen;
|
||||||
|
pkt1.offset = DEFAULT_PACKET_OFFSET;
|
||||||
|
pkt2.offset = DEFAULT_PACKET_OFFSET;
|
||||||
|
|
||||||
if(!n->status.validkey_in) {
|
if(!n->status.validkey_in) {
|
||||||
logger(DEBUG_TRAFFIC, LOG_DEBUG, "Got packet from %s (%s) but he hasn't got our key yet", n->name, n->hostname);
|
logger(DEBUG_TRAFFIC, LOG_DEBUG, "Got packet from %s (%s) but he hasn't got our key yet", n->name, n->hostname);
|
||||||
|
@ -546,7 +545,10 @@ bool receive_tcppacket_sptps(connection_t *c, const char *data, size_t len) {
|
||||||
/* If we're not the final recipient, relay the packet. */
|
/* If we're not the final recipient, relay the packet. */
|
||||||
|
|
||||||
if(to != myself) {
|
if(to != myself) {
|
||||||
send_sptps_data(to, from, 0, data, len);
|
if(to->status.validkey) {
|
||||||
|
send_sptps_data(to, from, 0, data, len);
|
||||||
|
}
|
||||||
|
|
||||||
try_tx(to, true);
|
try_tx(to, true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -699,18 +701,6 @@ static void choose_local_address(const node_t *n, const sockaddr_t **sa, int *so
|
||||||
}
|
}
|
||||||
|
|
||||||
static void send_udppacket(node_t *n, vpn_packet_t *origpkt) {
|
static void send_udppacket(node_t *n, vpn_packet_t *origpkt) {
|
||||||
vpn_packet_t pkt1, pkt2;
|
|
||||||
vpn_packet_t *pkt[] = { &pkt1, &pkt2, &pkt1, &pkt2 };
|
|
||||||
vpn_packet_t *inpkt = origpkt;
|
|
||||||
int nextpkt = 0;
|
|
||||||
vpn_packet_t *outpkt;
|
|
||||||
int origlen = origpkt->len;
|
|
||||||
size_t outlen;
|
|
||||||
int origpriority = origpkt->priority;
|
|
||||||
|
|
||||||
pkt1.offset = DEFAULT_PACKET_OFFSET;
|
|
||||||
pkt2.offset = DEFAULT_PACKET_OFFSET;
|
|
||||||
|
|
||||||
if(!n->status.reachable) {
|
if(!n->status.reachable) {
|
||||||
logger(DEBUG_TRAFFIC, LOG_INFO, "Trying to send UDP packet to unreachable node %s (%s)", n->name, n->hostname);
|
logger(DEBUG_TRAFFIC, LOG_INFO, "Trying to send UDP packet to unreachable node %s (%s)", n->name, n->hostname);
|
||||||
return;
|
return;
|
||||||
|
@ -724,6 +714,18 @@ static void send_udppacket(node_t *n, vpn_packet_t *origpkt) {
|
||||||
#ifdef DISABLE_LEGACY
|
#ifdef DISABLE_LEGACY
|
||||||
return;
|
return;
|
||||||
#else
|
#else
|
||||||
|
vpn_packet_t pkt1, pkt2;
|
||||||
|
vpn_packet_t *pkt[] = { &pkt1, &pkt2, &pkt1, &pkt2 };
|
||||||
|
vpn_packet_t *inpkt = origpkt;
|
||||||
|
int nextpkt = 0;
|
||||||
|
vpn_packet_t *outpkt;
|
||||||
|
int origlen = origpkt->len;
|
||||||
|
size_t outlen;
|
||||||
|
int origpriority = origpkt->priority;
|
||||||
|
|
||||||
|
pkt1.offset = DEFAULT_PACKET_OFFSET;
|
||||||
|
pkt2.offset = DEFAULT_PACKET_OFFSET;
|
||||||
|
|
||||||
/* Make sure we have a valid key */
|
/* Make sure we have a valid key */
|
||||||
|
|
||||||
if(!n->status.validkey) {
|
if(!n->status.validkey) {
|
||||||
|
@ -1133,6 +1135,7 @@ static void try_udp(node_t *n) {
|
||||||
if(ping_tx_elapsed.tv_sec >= interval) {
|
if(ping_tx_elapsed.tv_sec >= interval) {
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
n->udp_ping_sent = now; // a probe in flight
|
n->udp_ping_sent = now; // a probe in flight
|
||||||
|
n->status.ping_sent = true;
|
||||||
send_udp_probe_packet(n, MIN_PROBE_SIZE);
|
send_udp_probe_packet(n, MIN_PROBE_SIZE);
|
||||||
|
|
||||||
if(localdiscovery && !n->status.udp_confirmed && n->prevedge) {
|
if(localdiscovery && !n->status.udp_confirmed && n->prevedge) {
|
||||||
|
@ -1229,9 +1232,8 @@ static length_t choose_initial_maxmtu(node_t *n) {
|
||||||
return mtu;
|
return mtu;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
(void)n;
|
||||||
return MTU;
|
return MTU;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1776,13 +1778,13 @@ void handle_incoming_vpn_data(void *data, int flags) {
|
||||||
|
|
||||||
#else
|
#else
|
||||||
vpn_packet_t pkt;
|
vpn_packet_t pkt;
|
||||||
sockaddr_t addr = {};
|
sockaddr_t addr = {0};
|
||||||
socklen_t addrlen = sizeof(addr);
|
socklen_t addrlen = sizeof(addr);
|
||||||
|
|
||||||
pkt.offset = 0;
|
pkt.offset = 0;
|
||||||
int len = recvfrom(ls->udp.fd, (void *)DATA(&pkt), MAXSIZE, 0, &addr.sa, &addrlen);
|
int len = recvfrom(ls->udp.fd, (void *)DATA(&pkt), MAXSIZE, 0, &addr.sa, &addrlen);
|
||||||
|
|
||||||
if(len <= 0 || len > MAXSIZE) {
|
if(len <= 0 || (size_t)len > MAXSIZE) {
|
||||||
if(!sockwouldblock(sockerrno)) {
|
if(!sockwouldblock(sockerrno)) {
|
||||||
logger(DEBUG_ALWAYS, LOG_ERR, "Receiving packet failed: %s", sockstrerror(sockerrno));
|
logger(DEBUG_ALWAYS, LOG_ERR, "Receiving packet failed: %s", sockstrerror(sockerrno));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
net_setup.c -- Setup.
|
net_setup.c -- Setup.
|
||||||
Copyright (C) 1998-2005 Ivo Timmermans,
|
Copyright (C) 1998-2005 Ivo Timmermans,
|
||||||
2000-2017 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
2006 Scott Lamb <slamb@slamb.org>
|
2006 Scott Lamb <slamb@slamb.org>
|
||||||
2010 Brandon Black <blblack@gmail.com>
|
2010 Brandon Black <blblack@gmail.com>
|
||||||
|
|
||||||
|
@ -215,14 +215,14 @@ static bool read_ecdsa_private_key(void) {
|
||||||
logger(DEBUG_ALWAYS, LOG_ERR, "Error reading Ed25519 private key file `%s': %s", fname, strerror(errno));
|
logger(DEBUG_ALWAYS, LOG_ERR, "Error reading Ed25519 private key file `%s': %s", fname, strerror(errno));
|
||||||
|
|
||||||
if(errno == ENOENT) {
|
if(errno == ENOENT) {
|
||||||
logger(DEBUG_ALWAYS, LOG_INFO, "Create an Ed25519 keypair with `tinc -n %s generate-ed25519-keys'.", netname ? netname : ".");
|
logger(DEBUG_ALWAYS, LOG_INFO, "Create an Ed25519 key pair with `tinc -n %s generate-ed25519-keys'.", netname ? netname : ".");
|
||||||
}
|
}
|
||||||
|
|
||||||
free(fname);
|
free(fname);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(HAVE_MINGW) && !defined(HAVE_CYGWIN)
|
#ifndef HAVE_MINGW
|
||||||
struct stat s;
|
struct stat s;
|
||||||
|
|
||||||
if(fstat(fileno(fp), &s)) {
|
if(fstat(fileno(fp), &s)) {
|
||||||
|
@ -307,14 +307,14 @@ static bool read_rsa_private_key(void) {
|
||||||
fname, strerror(errno));
|
fname, strerror(errno));
|
||||||
|
|
||||||
if(errno == ENOENT) {
|
if(errno == ENOENT) {
|
||||||
logger(DEBUG_ALWAYS, LOG_INFO, "Create an RSA keypair with `tinc -n %s generate-rsa-keys'.", netname ? netname : ".");
|
logger(DEBUG_ALWAYS, LOG_INFO, "Create an RSA key pair with `tinc -n %s generate-rsa-keys'.", netname ? netname : ".");
|
||||||
}
|
}
|
||||||
|
|
||||||
free(fname);
|
free(fname);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(HAVE_MINGW) && !defined(HAVE_CYGWIN)
|
#ifndef HAVE_MINGW
|
||||||
struct stat s;
|
struct stat s;
|
||||||
|
|
||||||
if(fstat(fileno(fp), &s)) {
|
if(fstat(fileno(fp), &s)) {
|
||||||
|
@ -341,6 +341,7 @@ static bool read_rsa_private_key(void) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef DISABLE_LEGACY
|
||||||
static timeout_t keyexpire_timeout;
|
static timeout_t keyexpire_timeout;
|
||||||
|
|
||||||
static void keyexpire_handler(void *data) {
|
static void keyexpire_handler(void *data) {
|
||||||
|
@ -349,6 +350,7 @@ static void keyexpire_handler(void *data) {
|
||||||
keylifetime, rand() % 100000
|
keylifetime, rand() % 100000
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void regenerate_key(void) {
|
void regenerate_key(void) {
|
||||||
logger(DEBUG_STATUS, LOG_INFO, "Expiring symmetric keys");
|
logger(DEBUG_STATUS, LOG_INFO, "Expiring symmetric keys");
|
||||||
|
@ -822,7 +824,7 @@ void device_disable(void) {
|
||||||
Configure node_t myself and set up the local sockets (listen only)
|
Configure node_t myself and set up the local sockets (listen only)
|
||||||
*/
|
*/
|
||||||
static bool setup_myself(void) {
|
static bool setup_myself(void) {
|
||||||
char *name, *hostname, *cipher, *digest, *type;
|
char *name, *hostname, *type;
|
||||||
char *address = NULL;
|
char *address = NULL;
|
||||||
bool port_specified = false;
|
bool port_specified = false;
|
||||||
|
|
||||||
|
@ -967,6 +969,8 @@ static bool setup_myself(void) {
|
||||||
#ifndef DISABLE_LEGACY
|
#ifndef DISABLE_LEGACY
|
||||||
/* Generate packet encryption key */
|
/* Generate packet encryption key */
|
||||||
|
|
||||||
|
char *cipher;
|
||||||
|
|
||||||
if(!get_config_string(lookup_config(config_tree, "Cipher"), &cipher)) {
|
if(!get_config_string(lookup_config(config_tree, "Cipher"), &cipher)) {
|
||||||
cipher = xstrdup("aes-256-cbc");
|
cipher = xstrdup("aes-256-cbc");
|
||||||
}
|
}
|
||||||
|
@ -995,6 +999,8 @@ static bool setup_myself(void) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *digest;
|
||||||
|
|
||||||
if(!get_config_string(lookup_config(config_tree, "Digest"), &digest)) {
|
if(!get_config_string(lookup_config(config_tree, "Digest"), &digest)) {
|
||||||
digest = xstrdup("sha256");
|
digest = xstrdup("sha256");
|
||||||
}
|
}
|
||||||
|
@ -1047,10 +1053,14 @@ static bool setup_myself(void) {
|
||||||
devops = raw_socket_devops;
|
devops = raw_socket_devops;
|
||||||
} else if(!strcasecmp(type, "multicast")) {
|
} else if(!strcasecmp(type, "multicast")) {
|
||||||
devops = multicast_devops;
|
devops = multicast_devops;
|
||||||
} else if(!strcasecmp(type, "fd")) {
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_UN_H
|
||||||
|
else if(!strcasecmp(type, "fd")) {
|
||||||
devops = fd_devops;
|
devops = fd_devops;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
#ifdef ENABLE_UML
|
#ifdef ENABLE_UML
|
||||||
else if(!strcasecmp(type, "uml")) {
|
else if(!strcasecmp(type, "uml")) {
|
||||||
devops = uml_devops;
|
devops = uml_devops;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
net_socket.c -- Handle various kinds of sockets.
|
net_socket.c -- Handle various kinds of sockets.
|
||||||
Copyright (C) 1998-2005 Ivo Timmermans,
|
Copyright (C) 1998-2005 Ivo Timmermans,
|
||||||
2000-2017 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2018 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
2006 Scott Lamb <slamb@slamb.org>
|
2006 Scott Lamb <slamb@slamb.org>
|
||||||
2009 Florian Forster <octo@verplant.org>
|
2009 Florian Forster <octo@verplant.org>
|
||||||
|
|
||||||
|
@ -122,6 +122,7 @@ static bool bind_to_interface(int sd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* if !defined(SOL_SOCKET) || !defined(SO_BINDTODEVICE) */
|
#else /* if !defined(SOL_SOCKET) || !defined(SO_BINDTODEVICE) */
|
||||||
|
(void)sd;
|
||||||
logger(DEBUG_ALWAYS, LOG_WARNING, "%s not supported on this platform", "BindToInterface");
|
logger(DEBUG_ALWAYS, LOG_WARNING, "%s not supported on this platform", "BindToInterface");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -387,7 +388,7 @@ void finish_connecting(connection_t *c) {
|
||||||
send_id(c);
|
send_id(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_outgoing_pipe(connection_t *c, char *command) {
|
static void do_outgoing_pipe(connection_t *c, const char *command) {
|
||||||
#ifndef HAVE_MINGW
|
#ifndef HAVE_MINGW
|
||||||
int fd[2];
|
int fd[2];
|
||||||
|
|
||||||
|
@ -435,6 +436,8 @@ static void do_outgoing_pipe(connection_t *c, char *command) {
|
||||||
|
|
||||||
exit(result);
|
exit(result);
|
||||||
#else
|
#else
|
||||||
|
(void)c;
|
||||||
|
(void)command;
|
||||||
logger(DEBUG_ALWAYS, LOG_ERR, "Proxy type exec not supported on this platform!");
|
logger(DEBUG_ALWAYS, LOG_ERR, "Proxy type exec not supported on this platform!");
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
@ -524,7 +527,7 @@ bool do_outgoing_connection(outgoing_t *outgoing) {
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
begin:
|
begin:
|
||||||
sa = get_recent_address(outgoing->address_cache);
|
sa = get_recent_address(outgoing->node->address_cache);
|
||||||
|
|
||||||
if(!sa) {
|
if(!sa) {
|
||||||
logger(DEBUG_CONNECTIONS, LOG_ERR, "Could not set up a meta connection to %s", outgoing->node->name);
|
logger(DEBUG_CONNECTIONS, LOG_ERR, "Could not set up a meta connection to %s", outgoing->node->name);
|
||||||
|
@ -629,6 +632,10 @@ void setup_outgoing_connection(outgoing_t *outgoing, bool verbose) {
|
||||||
|
|
||||||
node_t *n = outgoing->node;
|
node_t *n = outgoing->node;
|
||||||
|
|
||||||
|
if(!n->address_cache) {
|
||||||
|
n->address_cache = open_address_cache(n);
|
||||||
|
}
|
||||||
|
|
||||||
if(n->connection) {
|
if(n->connection) {
|
||||||
logger(DEBUG_CONNECTIONS, LOG_INFO, "Already connected to %s", n->name);
|
logger(DEBUG_CONNECTIONS, LOG_INFO, "Already connected to %s", n->name);
|
||||||
|
|
||||||
|
@ -640,10 +647,6 @@ void setup_outgoing_connection(outgoing_t *outgoing, bool verbose) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!outgoing->address_cache) {
|
|
||||||
outgoing->address_cache = open_address_cache(n);
|
|
||||||
}
|
|
||||||
|
|
||||||
do_outgoing_connection(outgoing);
|
do_outgoing_connection(outgoing);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -784,11 +787,6 @@ void handle_new_unix_connection(void *data, int flags) {
|
||||||
|
|
||||||
static void free_outgoing(outgoing_t *outgoing) {
|
static void free_outgoing(outgoing_t *outgoing) {
|
||||||
timeout_del(&outgoing->ev);
|
timeout_del(&outgoing->ev);
|
||||||
|
|
||||||
if(outgoing->address_cache) {
|
|
||||||
close_address_cache(outgoing->address_cache);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(outgoing);
|
free(outgoing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,8 @@ typedef struct node_status_t {
|
||||||
unsigned int udppacket: 1; /* 1 if the most recently received packet was UDP */
|
unsigned int udppacket: 1; /* 1 if the most recently received packet was UDP */
|
||||||
unsigned int validkey_in: 1; /* 1 if we have sent a valid key to him */
|
unsigned int validkey_in: 1; /* 1 if we have sent a valid key to him */
|
||||||
unsigned int has_address: 1; /* 1 if we know an external address for this node */
|
unsigned int has_address: 1; /* 1 if we know an external address for this node */
|
||||||
unsigned int unused: 20;
|
unsigned int ping_sent: 1; /* 1 if we sent a UDP probe but haven't received the reply yet */
|
||||||
|
unsigned int unused: 19;
|
||||||
} node_status_t;
|
} node_status_t;
|
||||||
|
|
||||||
typedef struct node_t {
|
typedef struct node_t {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
crypto.c -- Cryptographic miscellaneous functions and initialisation
|
crypto.c -- Cryptographic miscellaneous functions and initialisation
|
||||||
Copyright (C) 2007-2014 Guus Sliepen <guus@tinc-vpn.org>
|
Copyright (C) 2007-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -42,12 +42,14 @@ static void random_exit(void) {
|
||||||
close(random_fd);
|
close(random_fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void randomize(void *out, size_t outlen) {
|
void randomize(void *vout, size_t outlen) {
|
||||||
|
char *out = vout;
|
||||||
|
|
||||||
while(outlen) {
|
while(outlen) {
|
||||||
size_t len = read(random_fd, out, outlen);
|
ssize_t len = read(random_fd, out, outlen);
|
||||||
|
|
||||||
if(len <= 0) {
|
if(len <= 0) {
|
||||||
if(errno == EAGAIN || errno == EINTR) {
|
if(len == -1 && (errno == EAGAIN || errno == EINTR)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -189,7 +189,7 @@ bool cipher_decrypt(cipher_t *cipher, const void *indata, size_t inlen, void *ou
|
||||||
} else {
|
} else {
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if(EVP_EncryptUpdate(cipher->ctx, outdata, &len, indata, inlen)) {
|
if(EVP_DecryptUpdate(cipher->ctx, outdata, &len, indata, inlen)) {
|
||||||
if(outlen) {
|
if(outlen) {
|
||||||
*outlen = len;
|
*outlen = len;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
crypto.c -- Cryptographic miscellaneous functions and initialisation
|
crypto.c -- Cryptographic miscellaneous functions and initialisation
|
||||||
Copyright (C) 2007-2014 Guus Sliepen <guus@tinc-vpn.org>
|
Copyright (C) 2007-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -50,10 +50,10 @@ void randomize(void *vout, size_t outlen) {
|
||||||
char *out = vout;
|
char *out = vout;
|
||||||
|
|
||||||
while(outlen) {
|
while(outlen) {
|
||||||
size_t len = read(random_fd, out, outlen);
|
ssize_t len = read(random_fd, out, outlen);
|
||||||
|
|
||||||
if(len <= 0) {
|
if(len <= 0) {
|
||||||
if(errno == EAGAIN || errno == EINTR) {
|
if(len == -1 && (errno == EAGAIN || errno == EINTR)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,9 +96,10 @@ void crypto_init(void) {
|
||||||
|
|
||||||
ENGINE_load_builtin_engines();
|
ENGINE_load_builtin_engines();
|
||||||
ENGINE_register_all_complete();
|
ENGINE_register_all_complete();
|
||||||
|
#if OPENSSL_API_COMPAT < 0x10100000L
|
||||||
ERR_load_crypto_strings();
|
ERR_load_crypto_strings();
|
||||||
OpenSSL_add_all_algorithms();
|
OpenSSL_add_all_algorithms();
|
||||||
|
#endif
|
||||||
|
|
||||||
if(!RAND_status()) {
|
if(!RAND_status()) {
|
||||||
fprintf(stderr, "Not enough entropy for the PRNG!\n");
|
fprintf(stderr, "Not enough entropy for the PRNG!\n");
|
||||||
|
@ -107,8 +108,10 @@ void crypto_init(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void crypto_exit(void) {
|
void crypto_exit(void) {
|
||||||
|
#if OPENSSL_API_COMPAT < 0x10100000L
|
||||||
EVP_cleanup();
|
EVP_cleanup();
|
||||||
ERR_free_strings();
|
ERR_free_strings();
|
||||||
ENGINE_cleanup();
|
ENGINE_cleanup();
|
||||||
|
#endif
|
||||||
random_exit();
|
random_exit();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
rsa.c -- RSA key handling
|
rsa.c -- RSA key handling
|
||||||
Copyright (C) 2007-2013 Guus Sliepen <guus@tinc-vpn.org>
|
Copyright (C) 2007-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#include <openssl/pem.h>
|
#include <openssl/pem.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
|
#include <openssl/rsa.h>
|
||||||
|
|
||||||
#define TINC_RSA_INTERNAL
|
#define TINC_RSA_INTERNAL
|
||||||
typedef RSA rsa_t;
|
typedef RSA rsa_t;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
process.c -- process management functions
|
process.c -- process management functions
|
||||||
Copyright (C) 1999-2005 Ivo Timmermans,
|
Copyright (C) 1999-2005 Ivo Timmermans,
|
||||||
2000-2013 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2018 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -115,7 +115,11 @@ static bool install_service(void) {
|
||||||
|
|
||||||
io_t stop_io;
|
io_t stop_io;
|
||||||
|
|
||||||
DWORD WINAPI controlhandler(DWORD request, DWORD type, LPVOID boe, LPVOID bah) {
|
DWORD WINAPI controlhandler(DWORD request, DWORD type, LPVOID data, LPVOID context) {
|
||||||
|
(void)type;
|
||||||
|
(void)data;
|
||||||
|
(void)context;
|
||||||
|
|
||||||
switch(request) {
|
switch(request) {
|
||||||
case SERVICE_CONTROL_INTERROGATE:
|
case SERVICE_CONTROL_INTERROGATE:
|
||||||
SetServiceStatus(statushandle, &status);
|
SetServiceStatus(statushandle, &status);
|
||||||
|
|
|
@ -284,13 +284,16 @@ static bool receive_invitation_sptps(void *handle, uint8_t type, const void *dat
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the new node's Name from the file
|
// Read the new node's Name from the file
|
||||||
char buf[1024];
|
char buf[1024] = "";
|
||||||
fgets(buf, sizeof(buf), f);
|
fgets(buf, sizeof(buf), f);
|
||||||
|
size_t buflen = strlen(buf);
|
||||||
|
|
||||||
if(*buf) {
|
// Strip whitespace at the end
|
||||||
buf[strlen(buf) - 1] = 0;
|
while(buflen && strchr(" \t\r\n", buf[buflen - 1])) {
|
||||||
|
buf[--buflen] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Split the first line into variable and value
|
||||||
len = strcspn(buf, " \t=");
|
len = strcspn(buf, " \t=");
|
||||||
char *name = buf + len;
|
char *name = buf + len;
|
||||||
name += strspn(name, " \t");
|
name += strspn(name, " \t");
|
||||||
|
@ -302,6 +305,7 @@ static bool receive_invitation_sptps(void *handle, uint8_t type, const void *dat
|
||||||
|
|
||||||
buf[len] = 0;
|
buf[len] = 0;
|
||||||
|
|
||||||
|
// Check that it is a valid Name
|
||||||
if(!*buf || !*name || strcasecmp(buf, "Name") || !check_id(name) || !strcmp(name, myself->name)) {
|
if(!*buf || !*name || strcasecmp(buf, "Name") || !check_id(name) || !strcmp(name, myself->name)) {
|
||||||
logger(DEBUG_ALWAYS, LOG_ERR, "Invalid invitation file %s\n", cookie);
|
logger(DEBUG_ALWAYS, LOG_ERR, "Invalid invitation file %s\n", cookie);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
@ -486,11 +490,8 @@ bool id_h(connection_t *c, const char *request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef DISABLE_LEGACY
|
||||||
bool send_metakey(connection_t *c) {
|
bool send_metakey(connection_t *c) {
|
||||||
#ifdef DISABLE_LEGACY
|
|
||||||
return false;
|
|
||||||
#else
|
|
||||||
|
|
||||||
if(!myself->connection->rsa) {
|
if(!myself->connection->rsa) {
|
||||||
logger(DEBUG_CONNECTIONS, LOG_ERR, "Peer %s (%s) uses legacy protocol which we don't support", c->name, c->hostname);
|
logger(DEBUG_CONNECTIONS, LOG_ERR, "Peer %s (%s) uses legacy protocol which we don't support", c->name, c->hostname);
|
||||||
return false;
|
return false;
|
||||||
|
@ -580,14 +581,9 @@ bool send_metakey(connection_t *c) {
|
||||||
|
|
||||||
c->status.encryptout = true;
|
c->status.encryptout = true;
|
||||||
return result;
|
return result;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool metakey_h(connection_t *c, const char *request) {
|
bool metakey_h(connection_t *c, const char *request) {
|
||||||
#ifdef DISABLE_LEGACY
|
|
||||||
return false;
|
|
||||||
#else
|
|
||||||
|
|
||||||
if(!myself->connection->rsa) {
|
if(!myself->connection->rsa) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -655,13 +651,9 @@ bool metakey_h(connection_t *c, const char *request) {
|
||||||
c->allow_request = CHALLENGE;
|
c->allow_request = CHALLENGE;
|
||||||
|
|
||||||
return send_challenge(c);
|
return send_challenge(c);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool send_challenge(connection_t *c) {
|
bool send_challenge(connection_t *c) {
|
||||||
#ifdef DISABLE_LEGACY
|
|
||||||
return false;
|
|
||||||
#else
|
|
||||||
const size_t len = rsa_size(c->rsa);
|
const size_t len = rsa_size(c->rsa);
|
||||||
char buffer[len * 2 + 1];
|
char buffer[len * 2 + 1];
|
||||||
|
|
||||||
|
@ -678,14 +670,9 @@ bool send_challenge(connection_t *c) {
|
||||||
/* Send the challenge */
|
/* Send the challenge */
|
||||||
|
|
||||||
return send_request(c, "%d %s", CHALLENGE, buffer);
|
return send_request(c, "%d %s", CHALLENGE, buffer);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool challenge_h(connection_t *c, const char *request) {
|
bool challenge_h(connection_t *c, const char *request) {
|
||||||
#ifdef DISABLE_LEGACY
|
|
||||||
return false;
|
|
||||||
#else
|
|
||||||
|
|
||||||
if(!myself->connection->rsa) {
|
if(!myself->connection->rsa) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -720,8 +707,6 @@ bool challenge_h(connection_t *c, const char *request) {
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool send_chal_reply(connection_t *c) {
|
bool send_chal_reply(connection_t *c) {
|
||||||
|
@ -748,9 +733,6 @@ bool send_chal_reply(connection_t *c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool chal_reply_h(connection_t *c, const char *request) {
|
bool chal_reply_h(connection_t *c, const char *request) {
|
||||||
#ifdef DISABLE_LEGACY
|
|
||||||
return false;
|
|
||||||
#else
|
|
||||||
char hishash[MAX_STRING_SIZE];
|
char hishash[MAX_STRING_SIZE];
|
||||||
|
|
||||||
if(sscanf(request, "%*d " MAX_STRING, hishash) != 1) {
|
if(sscanf(request, "%*d " MAX_STRING, hishash) != 1) {
|
||||||
|
@ -791,13 +773,9 @@ bool chal_reply_h(connection_t *c, const char *request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return send_ack(c);
|
return send_ack(c);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool send_upgrade(connection_t *c) {
|
static bool send_upgrade(connection_t *c) {
|
||||||
#ifdef DISABLE_LEGACY
|
|
||||||
return false;
|
|
||||||
#else
|
|
||||||
/* Special case when protocol_minor is 1: the other end is Ed25519 capable,
|
/* Special case when protocol_minor is 1: the other end is Ed25519 capable,
|
||||||
* but doesn't know our key yet. So send it now. */
|
* but doesn't know our key yet. So send it now. */
|
||||||
|
|
||||||
|
@ -810,8 +788,46 @@ static bool send_upgrade(connection_t *c) {
|
||||||
bool result = send_request(c, "%d %s", ACK, pubkey);
|
bool result = send_request(c, "%d %s", ACK, pubkey);
|
||||||
free(pubkey);
|
free(pubkey);
|
||||||
return result;
|
return result;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
bool send_metakey(connection_t *c) {
|
||||||
|
(void)c;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool metakey_h(connection_t *c, const char *request) {
|
||||||
|
(void)c;
|
||||||
|
(void)request;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool send_challenge(connection_t *c) {
|
||||||
|
(void)c;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool challenge_h(connection_t *c, const char *request) {
|
||||||
|
(void)c;
|
||||||
|
(void)request;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool send_chal_reply(connection_t *c) {
|
||||||
|
(void)c;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool chal_reply_h(connection_t *c, const char *request) {
|
||||||
|
(void)c;
|
||||||
|
(void)request;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool send_upgrade(connection_t *c) {
|
||||||
|
(void)c;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool send_ack(connection_t *c) {
|
bool send_ack(connection_t *c) {
|
||||||
if(c->protocol_minor == 1) {
|
if(c->protocol_minor == 1) {
|
||||||
|
|
|
@ -34,7 +34,9 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "xalloc.h"
|
#include "xalloc.h"
|
||||||
|
|
||||||
|
#ifndef DISABLE_LEGACY
|
||||||
static bool mykeyused = false;
|
static bool mykeyused = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
void send_key_changed(void) {
|
void send_key_changed(void) {
|
||||||
#ifndef DISABLE_LEGACY
|
#ifndef DISABLE_LEGACY
|
||||||
|
|
|
@ -71,9 +71,9 @@ bool pong_h(connection_t *c, const char *request) {
|
||||||
|
|
||||||
/* Successful connection, reset timeout if this is an outgoing connection. */
|
/* Successful connection, reset timeout if this is an outgoing connection. */
|
||||||
|
|
||||||
if(c->outgoing) {
|
if(c->outgoing && c->outgoing->timeout) {
|
||||||
c->outgoing->timeout = 0;
|
c->outgoing->timeout = 0;
|
||||||
reset_address_cache(c->outgoing->address_cache, &c->address);
|
reset_address_cache(c->outgoing->node->address_cache, &c->address);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
25
src/route.c
25
src/route.c
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
route.c -- routing
|
route.c -- routing
|
||||||
Copyright (C) 2000-2005 Ivo Timmermans,
|
Copyright (C) 2000-2005 Ivo Timmermans,
|
||||||
2000-2013 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2018 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -59,33 +59,30 @@ static const size_t opt_size = sizeof(struct nd_opt_hdr);
|
||||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
volatile int dummy;
|
|
||||||
static timeout_t age_subnets_timeout;
|
static timeout_t age_subnets_timeout;
|
||||||
|
|
||||||
/* RFC 1071 */
|
/* RFC 1071 */
|
||||||
|
|
||||||
static uint16_t inet_checksum(void *data, int len, uint16_t prevsum) {
|
static uint16_t inet_checksum(void *vdata, int len, uint16_t prevsum) {
|
||||||
uint16_t *p = data;
|
uint8_t *data = vdata;
|
||||||
|
uint16_t word;
|
||||||
uint32_t checksum = prevsum ^ 0xFFFF;
|
uint32_t checksum = prevsum ^ 0xFFFF;
|
||||||
|
|
||||||
while(len >= 2) {
|
while(len >= 2) {
|
||||||
checksum += *p++;
|
memcpy(&word, data, sizeof(word));
|
||||||
|
checksum += word;
|
||||||
|
data += 2;
|
||||||
len -= 2;
|
len -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(len) {
|
if(len) {
|
||||||
checksum += *(uint8_t *)p;
|
checksum += *data;
|
||||||
}
|
}
|
||||||
|
|
||||||
while(checksum >> 16) {
|
while(checksum >> 16) {
|
||||||
checksum = (checksum & 0xFFFF) + (checksum >> 16);
|
checksum = (checksum & 0xFFFF) + (checksum >> 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Work around a compiler optimization bug.
|
|
||||||
if(checksum) {
|
|
||||||
dummy = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ~checksum;
|
return ~checksum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +162,7 @@ static void route_ipv4_unreachable(node_t *source, vpn_packet_t *packet, length_
|
||||||
addr.sin_family = AF_INET;
|
addr.sin_family = AF_INET;
|
||||||
socklen_t addrlen = sizeof(addr);
|
socklen_t addrlen = sizeof(addr);
|
||||||
|
|
||||||
if(!getsockname(sockfd, (struct sockaddr *) &addr, &addrlen) && addrlen <= sizeof(addr)) {
|
if(!getsockname(sockfd, (struct sockaddr *) &addr, &addrlen) && (size_t)addrlen <= sizeof(addr)) {
|
||||||
ip_dst = addr.sin_addr;
|
ip_dst = addr.sin_addr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -270,7 +267,7 @@ static void route_ipv6_unreachable(node_t *source, vpn_packet_t *packet, length_
|
||||||
addr.sin6_family = AF_INET6;
|
addr.sin6_family = AF_INET6;
|
||||||
socklen_t addrlen = sizeof(addr);
|
socklen_t addrlen = sizeof(addr);
|
||||||
|
|
||||||
if(!getsockname(sockfd, (struct sockaddr *) &addr, &addrlen) && addrlen <= sizeof(addr)) {
|
if(!getsockname(sockfd, (struct sockaddr *) &addr, &addrlen) && (size_t)addrlen <= sizeof(addr)) {
|
||||||
pseudo.ip6_src = addr.sin6_addr;
|
pseudo.ip6_src = addr.sin6_addr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -598,7 +595,7 @@ static void fragment_ipv4_packet(node_t *dest, vpn_packet_t *packet, length_t et
|
||||||
logger(DEBUG_TRAFFIC, LOG_INFO, "Fragmenting packet of %d bytes to %s (%s)", packet->len, dest->name, dest->hostname);
|
logger(DEBUG_TRAFFIC, LOG_INFO, "Fragmenting packet of %d bytes to %s (%s)", packet->len, dest->name, dest->hostname);
|
||||||
|
|
||||||
offset = DATA(packet) + ether_size + ip_size;
|
offset = DATA(packet) + ether_size + ip_size;
|
||||||
maxlen = (dest->mtu - ether_size - ip_size) & ~0x7;
|
maxlen = (MAX(dest->mtu, 590) - ether_size - ip_size) & ~0x7;
|
||||||
ip_off = ntohs(ip.ip_off);
|
ip_off = ntohs(ip.ip_off);
|
||||||
origf = ip_off & ~IP_OFFMASK;
|
origf = ip_off & ~IP_OFFMASK;
|
||||||
ip_off &= IP_OFFMASK;
|
ip_off &= IP_OFFMASK;
|
||||||
|
|
11
src/script.c
11
src/script.c
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
script.c -- call an external script
|
script.c -- call an external script
|
||||||
Copyright (C) 1999-2005 Ivo Timmermans,
|
Copyright (C) 1999-2005 Ivo Timmermans,
|
||||||
2000-2017 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2018 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -50,7 +50,7 @@ static void unputenv(const char *p) {
|
||||||
#else
|
#else
|
||||||
// We must keep what we putenv() around in memory.
|
// We must keep what we putenv() around in memory.
|
||||||
// To do this without memory leaks, keep things in a list and reuse if possible.
|
// To do this without memory leaks, keep things in a list and reuse if possible.
|
||||||
static list_t list = {};
|
static list_t list = {0};
|
||||||
|
|
||||||
for list_each(char, data, &list) {
|
for list_each(char, data, &list) {
|
||||||
if(!strcmp(data, var)) {
|
if(!strcmp(data, var)) {
|
||||||
|
@ -142,7 +142,12 @@ bool execute_script(const char *name, environment_t *env) {
|
||||||
#ifdef HAVE_MINGW
|
#ifdef HAVE_MINGW
|
||||||
|
|
||||||
if(!*scriptextension) {
|
if(!*scriptextension) {
|
||||||
const char *pathext = getenv("PATHEXT") ? : ".COM;.EXE;.BAT;.CMD";
|
const char *pathext = getenv("PATHEXT");
|
||||||
|
|
||||||
|
if(!pathext) {
|
||||||
|
pathext = ".COM;.EXE;.BAT;.CMD";
|
||||||
|
}
|
||||||
|
|
||||||
size_t pathlen = strlen(pathext);
|
size_t pathlen = strlen(pathext);
|
||||||
size_t scriptlen = strlen(scriptname);
|
size_t scriptlen = strlen(scriptname);
|
||||||
char fullname[scriptlen + pathlen + 1];
|
char fullname[scriptlen + pathlen + 1];
|
||||||
|
|
|
@ -78,6 +78,7 @@ static bool send_data(void *handle, uint8_t type, const void *data, size_t len)
|
||||||
|
|
||||||
static bool receive_record(void *handle, uint8_t type, const void *data, uint16_t len) {
|
static bool receive_record(void *handle, uint8_t type, const void *data, uint16_t len) {
|
||||||
(void)handle;
|
(void)handle;
|
||||||
|
|
||||||
if(verbose) {
|
if(verbose) {
|
||||||
fprintf(stderr, "Received type %d record of %u bytes:\n", type, len);
|
fprintf(stderr, "Received type %d record of %u bytes:\n", type, len);
|
||||||
}
|
}
|
||||||
|
@ -369,6 +370,7 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char buf[65535] = "";
|
char buf[65535] = "";
|
||||||
|
size_t readsize = datagram ? 1460u : sizeof(buf);
|
||||||
|
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
|
@ -386,7 +388,7 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(FD_ISSET(in, &fds)) {
|
if(FD_ISSET(in, &fds)) {
|
||||||
ssize_t len = read(in, buf, sizeof(buf));
|
ssize_t len = read(in, buf, readsize);
|
||||||
|
|
||||||
if(len < 0) {
|
if(len < 0) {
|
||||||
fprintf(stderr, "Could not read from stdin: %s\n", strerror(errno));
|
fprintf(stderr, "Could not read from stdin: %s\n", strerror(errno));
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
subnet.h -- header for subnet.c
|
subnet.h -- header for subnet.c
|
||||||
Copyright (C) 2000-2012 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2000-2021 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
2000-2005 Ivo Timmermans
|
2000-2005 Ivo Timmermans
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -78,6 +78,7 @@ extern void subnet_update(struct node_t *owner, subnet_t *subnet, bool up);
|
||||||
extern int maskcmp(const void *a, const void *b, int masklen);
|
extern int maskcmp(const void *a, const void *b, int masklen);
|
||||||
extern void maskcpy(void *dest, const void *src, int masklen, int len);
|
extern void maskcpy(void *dest, const void *src, int masklen, int len);
|
||||||
extern void mask(void *mask, int masklen, int len);
|
extern void mask(void *mask, int masklen, int len);
|
||||||
|
extern bool subnetcheck(const subnet_t subnet);
|
||||||
extern bool maskcheck(const void *mask, int masklen, int len);
|
extern bool maskcheck(const void *mask, int masklen, int len);
|
||||||
extern bool net2str(char *netstr, int len, const subnet_t *subnet);
|
extern bool net2str(char *netstr, int len, const subnet_t *subnet);
|
||||||
extern bool str2net(subnet_t *subnet, const char *netstr);
|
extern bool str2net(subnet_t *subnet, const char *netstr);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
subnet_parse.c -- handle subnet parsing
|
subnet_parse.c -- handle subnet parsing
|
||||||
Copyright (C) 2000-2012 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2000-2021 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
2000-2005 Ivo Timmermans
|
2000-2005 Ivo Timmermans
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -87,6 +87,17 @@ void maskcpy(void *va, const void *vb, int masklen, int len) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool subnetcheck(const subnet_t subnet) {
|
||||||
|
if(((subnet.type == SUBNET_IPV4)
|
||||||
|
&& !maskcheck(&subnet.net.ipv4.address, subnet.net.ipv4.prefixlength, sizeof(subnet.net.ipv4.address)))
|
||||||
|
|| ((subnet.type == SUBNET_IPV6)
|
||||||
|
&& !maskcheck(&subnet.net.ipv6.address, subnet.net.ipv6.prefixlength, sizeof(subnet.net.ipv6.address)))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool maskcheck(const void *va, int masklen, int len) {
|
bool maskcheck(const void *va, int masklen, int len) {
|
||||||
int i;
|
int i;
|
||||||
const char *a = va;
|
const char *a = va;
|
||||||
|
|
161
src/tincctl.c
161
src/tincctl.c
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
tincctl.c -- Controlling a running tincd
|
tincctl.c -- Controlling a running tincd
|
||||||
Copyright (C) 2007-2018 Guus Sliepen <guus@tinc-vpn.org>
|
Copyright (C) 2007-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -40,6 +40,7 @@
|
||||||
#include "tincctl.h"
|
#include "tincctl.h"
|
||||||
#include "top.h"
|
#include "top.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
#include "subnet.h"
|
||||||
|
|
||||||
#ifndef MSG_NOSIGNAL
|
#ifndef MSG_NOSIGNAL
|
||||||
#define MSG_NOSIGNAL 0
|
#define MSG_NOSIGNAL 0
|
||||||
|
@ -125,12 +126,12 @@ static void usage(bool status) {
|
||||||
" reload Partially reload configuration of running tincd.\n"
|
" reload Partially reload configuration of running tincd.\n"
|
||||||
" pid Show PID of currently running tincd.\n"
|
" pid Show PID of currently running tincd.\n"
|
||||||
#ifdef DISABLE_LEGACY
|
#ifdef DISABLE_LEGACY
|
||||||
" generate-keys Generate a new Ed25519 public/private keypair.\n"
|
" generate-keys Generate a new Ed25519 public/private key pair.\n"
|
||||||
#else
|
#else
|
||||||
" generate-keys [bits] Generate new RSA and Ed25519 public/private keypairs.\n"
|
" generate-keys [bits] Generate new RSA and Ed25519 public/private key pairs.\n"
|
||||||
" generate-rsa-keys [bits] Generate a new RSA public/private keypair.\n"
|
" generate-rsa-keys [bits] Generate a new RSA public/private key pair.\n"
|
||||||
#endif
|
#endif
|
||||||
" generate-ed25519-keys Generate a new Ed25519 public/private keypair.\n"
|
" generate-ed25519-keys Generate a new Ed25519 public/private key pair.\n"
|
||||||
" dump Dump a list of one of the following things:\n"
|
" dump Dump a list of one of the following things:\n"
|
||||||
" [reachable] nodes - all known nodes in the VPN\n"
|
" [reachable] nodes - all known nodes in the VPN\n"
|
||||||
" edges - all known connections in the VPN\n"
|
" edges - all known connections in the VPN\n"
|
||||||
|
@ -237,7 +238,7 @@ static bool parse_options(int argc, char **argv) {
|
||||||
FILE *fopenmask(const char *filename, const char *mode, mode_t perms) {
|
FILE *fopenmask(const char *filename, const char *mode, mode_t perms) {
|
||||||
mode_t mask = umask(0);
|
mode_t mask = umask(0);
|
||||||
perms &= ~mask;
|
perms &= ~mask;
|
||||||
umask(~perms);
|
umask(~perms & 0777);
|
||||||
FILE *f = fopen(filename, mode);
|
FILE *f = fopen(filename, mode);
|
||||||
|
|
||||||
if(!f) {
|
if(!f) {
|
||||||
|
@ -262,19 +263,21 @@ static void disable_old_keys(const char *filename, const char *what) {
|
||||||
bool disabled = false;
|
bool disabled = false;
|
||||||
bool block = false;
|
bool block = false;
|
||||||
bool error = false;
|
bool error = false;
|
||||||
FILE *r, *w;
|
|
||||||
|
|
||||||
r = fopen(filename, "r");
|
FILE *r = fopen(filename, "r");
|
||||||
|
FILE *w = NULL;
|
||||||
|
|
||||||
if(!r) {
|
if(!r) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(tmpfile, sizeof(tmpfile), "%s.tmp", filename);
|
int result = snprintf(tmpfile, sizeof(tmpfile), "%s.tmp", filename);
|
||||||
|
|
||||||
struct stat st = {.st_mode = 0600};
|
if(result < sizeof(tmpfile)) {
|
||||||
fstat(fileno(r), &st);
|
struct stat st = {.st_mode = 0600};
|
||||||
w = fopenmask(tmpfile, "w", st.st_mode);
|
fstat(fileno(r), &st);
|
||||||
|
w = fopenmask(tmpfile, "w", st.st_mode);
|
||||||
|
}
|
||||||
|
|
||||||
while(fgets(buf, sizeof(buf), r)) {
|
while(fgets(buf, sizeof(buf), r)) {
|
||||||
if(!block && !strncmp(buf, "-----BEGIN ", 11)) {
|
if(!block && !strncmp(buf, "-----BEGIN ", 11)) {
|
||||||
|
@ -416,7 +419,7 @@ ask_filename:
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Generate a public/private Ed25519 keypair, and ask for a file to store
|
Generate a public/private Ed25519 key pair, and ask for a file to store
|
||||||
them in.
|
them in.
|
||||||
*/
|
*/
|
||||||
static bool ed25519_keygen(bool ask) {
|
static bool ed25519_keygen(bool ask) {
|
||||||
|
@ -424,7 +427,7 @@ static bool ed25519_keygen(bool ask) {
|
||||||
FILE *f;
|
FILE *f;
|
||||||
char fname[PATH_MAX];
|
char fname[PATH_MAX];
|
||||||
|
|
||||||
fprintf(stderr, "Generating Ed25519 keypair:\n");
|
fprintf(stderr, "Generating Ed25519 key pair:\n");
|
||||||
|
|
||||||
if(!(key = ecdsa_generate())) {
|
if(!(key = ecdsa_generate())) {
|
||||||
fprintf(stderr, "Error during key generation!\n");
|
fprintf(stderr, "Error during key generation!\n");
|
||||||
|
@ -480,7 +483,7 @@ error:
|
||||||
|
|
||||||
#ifndef DISABLE_LEGACY
|
#ifndef DISABLE_LEGACY
|
||||||
/*
|
/*
|
||||||
Generate a public/private RSA keypair, and ask for a file to store
|
Generate a public/private RSA key pair, and ask for a file to store
|
||||||
them in.
|
them in.
|
||||||
*/
|
*/
|
||||||
static bool rsa_keygen(int bits, bool ask) {
|
static bool rsa_keygen(int bits, bool ask) {
|
||||||
|
@ -725,6 +728,24 @@ static void logcontrol(int fd, FILE *out, int level) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool stop_tincd(void) {
|
||||||
|
if(!connect_tincd(true)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
sendline(fd, "%d %d", CONTROL, REQ_STOP);
|
||||||
|
|
||||||
|
while(recvline(fd, line, sizeof(line))) {
|
||||||
|
// wait for tincd to close the connection...
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
pid = 0;
|
||||||
|
fd = -1;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_MINGW
|
#ifdef HAVE_MINGW
|
||||||
static bool remove_service(void) {
|
static bool remove_service(void) {
|
||||||
SC_HANDLE manager = NULL;
|
SC_HANDLE manager = NULL;
|
||||||
|
@ -742,7 +763,12 @@ static bool remove_service(void) {
|
||||||
service = OpenService(manager, identname, SERVICE_ALL_ACCESS);
|
service = OpenService(manager, identname, SERVICE_ALL_ACCESS);
|
||||||
|
|
||||||
if(!service) {
|
if(!service) {
|
||||||
fprintf(stderr, "Could not open %s service: %s\n", identname, winerror(GetLastError()));
|
if(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST) {
|
||||||
|
success = stop_tincd();
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Could not open %s service: %s\n", identname, winerror(GetLastError()));
|
||||||
|
}
|
||||||
|
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -883,7 +909,6 @@ bool connect_tincd(bool verbose) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_MINGW
|
|
||||||
unsigned long arg = 0;
|
unsigned long arg = 0;
|
||||||
|
|
||||||
if(ioctlsocket(fd, FIONBIO, &arg) != 0) {
|
if(ioctlsocket(fd, FIONBIO, &arg) != 0) {
|
||||||
|
@ -892,8 +917,6 @@ bool connect_tincd(bool verbose) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(connect(fd, res->ai_addr, res->ai_addrlen) < 0) {
|
if(connect(fd, res->ai_addr, res->ai_addrlen) < 0) {
|
||||||
if(verbose) {
|
if(verbose) {
|
||||||
fprintf(stderr, "Cannot connect to %s port %s: %s\n", host, port, sockstrerror(sockerrno));
|
fprintf(stderr, "Cannot connect to %s port %s: %s\n", host, port, sockstrerror(sockerrno));
|
||||||
|
@ -1083,9 +1106,11 @@ static int cmd_stop(int argc, char *argv[]) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HAVE_MINGW
|
#ifdef HAVE_MINGW
|
||||||
|
return remove_service();
|
||||||
|
#else
|
||||||
|
|
||||||
if(!connect_tincd(true)) {
|
if(!stop_tincd()) {
|
||||||
if(pid) {
|
if(pid) {
|
||||||
if(kill(pid, SIGTERM)) {
|
if(kill(pid, SIGTERM)) {
|
||||||
fprintf(stderr, "Could not send TERM signal to process with PID %d: %s\n", pid, strerror(errno));
|
fprintf(stderr, "Could not send TERM signal to process with PID %d: %s\n", pid, strerror(errno));
|
||||||
|
@ -1100,24 +1125,8 @@ static int cmd_stop(int argc, char *argv[]) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendline(fd, "%d %d", CONTROL, REQ_STOP);
|
|
||||||
|
|
||||||
while(recvline(fd, line, sizeof(line))) {
|
|
||||||
// Wait for tincd to close the connection...
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
if(!remove_service()) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
close(fd);
|
|
||||||
pid = 0;
|
|
||||||
fd = -1;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cmd_restart(int argc, char *argv[]) {
|
static int cmd_restart(int argc, char *argv[]) {
|
||||||
|
@ -1346,7 +1355,7 @@ static int cmd_dump(int argc, char *argv[]) {
|
||||||
color = "green";
|
color = "green";
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(" %s [label = \"%s\", color = \"%s\"%s];\n", node, node, color, strcmp(host, "MYSELF") ? "" : ", style = \"filled\"");
|
printf(" \"%s\" [label = \"%s\", color = \"%s\"%s];\n", node, node, color, strcmp(host, "MYSELF") ? "" : ", style = \"filled\"");
|
||||||
} else {
|
} else {
|
||||||
if(only_reachable && !status.reachable) {
|
if(only_reachable && !status.reachable) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -1376,9 +1385,9 @@ static int cmd_dump(int argc, char *argv[]) {
|
||||||
float w = 1 + 65536.0 / weight;
|
float w = 1 + 65536.0 / weight;
|
||||||
|
|
||||||
if(do_graph == 1 && strcmp(node1, node2) > 0) {
|
if(do_graph == 1 && strcmp(node1, node2) > 0) {
|
||||||
printf(" %s -- %s [w = %f, weight = %f];\n", node1, node2, w, w);
|
printf(" \"%s\" -- \"%s\" [w = %f, weight = %f];\n", node1, node2, w, w);
|
||||||
} else if(do_graph == 2) {
|
} else if(do_graph == 2) {
|
||||||
printf(" %s -> %s [w = %f, weight = %f];\n", node1, node2, w, w);
|
printf(" \"%s\" -> \"%s\" [w = %f, weight = %f];\n", node1, node2, w, w);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
printf("%s to %s at %s port %s local %s port %s options %x weight %d\n", from, to, host, port, local_host, local_port, options, weight);
|
printf("%s to %s at %s port %s local %s port %s options %x weight %d\n", from, to, host, port, local_host, local_port, options, weight);
|
||||||
|
@ -1717,18 +1726,18 @@ ecdsa_t *get_pubkey(FILE *f) {
|
||||||
|
|
||||||
const var_t variables[] = {
|
const var_t variables[] = {
|
||||||
/* Server configuration */
|
/* Server configuration */
|
||||||
{"AddressFamily", VAR_SERVER},
|
{"AddressFamily", VAR_SERVER | VAR_SAFE},
|
||||||
{"AutoConnect", VAR_SERVER | VAR_SAFE},
|
{"AutoConnect", VAR_SERVER | VAR_SAFE},
|
||||||
{"BindToAddress", VAR_SERVER | VAR_MULTIPLE},
|
{"BindToAddress", VAR_SERVER | VAR_MULTIPLE},
|
||||||
{"BindToInterface", VAR_SERVER},
|
{"BindToInterface", VAR_SERVER},
|
||||||
{"Broadcast", VAR_SERVER | VAR_SAFE},
|
{"Broadcast", VAR_SERVER | VAR_SAFE},
|
||||||
{"BroadcastSubnet", VAR_SERVER | VAR_MULTIPLE | VAR_SAFE},
|
{"BroadcastSubnet", VAR_SERVER | VAR_MULTIPLE | VAR_SAFE},
|
||||||
{"ConnectTo", VAR_SERVER | VAR_MULTIPLE | VAR_SAFE},
|
{"ConnectTo", VAR_SERVER | VAR_MULTIPLE | VAR_SAFE},
|
||||||
{"DecrementTTL", VAR_SERVER},
|
{"DecrementTTL", VAR_SERVER | VAR_SAFE},
|
||||||
{"Device", VAR_SERVER},
|
{"Device", VAR_SERVER},
|
||||||
{"DeviceStandby", VAR_SERVER},
|
{"DeviceStandby", VAR_SERVER},
|
||||||
{"DeviceType", VAR_SERVER},
|
{"DeviceType", VAR_SERVER},
|
||||||
{"DirectOnly", VAR_SERVER},
|
{"DirectOnly", VAR_SERVER | VAR_SAFE},
|
||||||
{"Ed25519PrivateKeyFile", VAR_SERVER},
|
{"Ed25519PrivateKeyFile", VAR_SERVER},
|
||||||
{"ExperimentalProtocol", VAR_SERVER},
|
{"ExperimentalProtocol", VAR_SERVER},
|
||||||
{"Forwarding", VAR_SERVER},
|
{"Forwarding", VAR_SERVER},
|
||||||
|
@ -1738,34 +1747,34 @@ const var_t variables[] = {
|
||||||
{"IffOneQueue", VAR_SERVER},
|
{"IffOneQueue", VAR_SERVER},
|
||||||
{"Interface", VAR_SERVER},
|
{"Interface", VAR_SERVER},
|
||||||
{"InvitationExpire", VAR_SERVER},
|
{"InvitationExpire", VAR_SERVER},
|
||||||
{"KeyExpire", VAR_SERVER},
|
{"KeyExpire", VAR_SERVER | VAR_SAFE},
|
||||||
{"ListenAddress", VAR_SERVER | VAR_MULTIPLE},
|
{"ListenAddress", VAR_SERVER | VAR_MULTIPLE},
|
||||||
{"LocalDiscovery", VAR_SERVER},
|
{"LocalDiscovery", VAR_SERVER | VAR_SAFE},
|
||||||
{"LogLevel", VAR_SERVER},
|
{"LogLevel", VAR_SERVER},
|
||||||
{"MACExpire", VAR_SERVER},
|
{"MACExpire", VAR_SERVER | VAR_SAFE},
|
||||||
{"MaxConnectionBurst", VAR_SERVER},
|
{"MaxConnectionBurst", VAR_SERVER | VAR_SAFE},
|
||||||
{"MaxOutputBufferSize", VAR_SERVER},
|
{"MaxOutputBufferSize", VAR_SERVER | VAR_SAFE},
|
||||||
{"MaxTimeout", VAR_SERVER},
|
{"MaxTimeout", VAR_SERVER | VAR_SAFE},
|
||||||
{"Mode", VAR_SERVER | VAR_SAFE},
|
{"Mode", VAR_SERVER | VAR_SAFE},
|
||||||
{"Name", VAR_SERVER},
|
{"Name", VAR_SERVER},
|
||||||
{"PingInterval", VAR_SERVER},
|
{"PingInterval", VAR_SERVER | VAR_SAFE},
|
||||||
{"PingTimeout", VAR_SERVER},
|
{"PingTimeout", VAR_SERVER | VAR_SAFE},
|
||||||
{"PriorityInheritance", VAR_SERVER},
|
{"PriorityInheritance", VAR_SERVER},
|
||||||
{"PrivateKey", VAR_SERVER | VAR_OBSOLETE},
|
{"PrivateKey", VAR_SERVER | VAR_OBSOLETE},
|
||||||
{"PrivateKeyFile", VAR_SERVER},
|
{"PrivateKeyFile", VAR_SERVER},
|
||||||
{"ProcessPriority", VAR_SERVER},
|
{"ProcessPriority", VAR_SERVER},
|
||||||
{"Proxy", VAR_SERVER},
|
{"Proxy", VAR_SERVER},
|
||||||
{"ReplayWindow", VAR_SERVER},
|
{"ReplayWindow", VAR_SERVER | VAR_SAFE},
|
||||||
{"ScriptsExtension", VAR_SERVER},
|
{"ScriptsExtension", VAR_SERVER},
|
||||||
{"ScriptsInterpreter", VAR_SERVER},
|
{"ScriptsInterpreter", VAR_SERVER},
|
||||||
{"StrictSubnets", VAR_SERVER},
|
{"StrictSubnets", VAR_SERVER | VAR_SAFE},
|
||||||
{"TunnelServer", VAR_SERVER},
|
{"TunnelServer", VAR_SERVER | VAR_SAFE},
|
||||||
{"UDPDiscovery", VAR_SERVER},
|
{"UDPDiscovery", VAR_SERVER | VAR_SAFE},
|
||||||
{"UDPDiscoveryKeepaliveInterval", VAR_SERVER},
|
{"UDPDiscoveryKeepaliveInterval", VAR_SERVER | VAR_SAFE},
|
||||||
{"UDPDiscoveryInterval", VAR_SERVER},
|
{"UDPDiscoveryInterval", VAR_SERVER | VAR_SAFE},
|
||||||
{"UDPDiscoveryTimeout", VAR_SERVER},
|
{"UDPDiscoveryTimeout", VAR_SERVER | VAR_SAFE},
|
||||||
{"MTUInfoInterval", VAR_SERVER},
|
{"MTUInfoInterval", VAR_SERVER | VAR_SAFE},
|
||||||
{"UDPInfoInterval", VAR_SERVER},
|
{"UDPInfoInterval", VAR_SERVER | VAR_SAFE},
|
||||||
{"UDPRcvBuf", VAR_SERVER},
|
{"UDPRcvBuf", VAR_SERVER},
|
||||||
{"UDPSndBuf", VAR_SERVER},
|
{"UDPSndBuf", VAR_SERVER},
|
||||||
{"UPnP", VAR_SERVER},
|
{"UPnP", VAR_SERVER},
|
||||||
|
@ -1776,12 +1785,12 @@ const var_t variables[] = {
|
||||||
/* Host configuration */
|
/* Host configuration */
|
||||||
{"Address", VAR_HOST | VAR_MULTIPLE},
|
{"Address", VAR_HOST | VAR_MULTIPLE},
|
||||||
{"Cipher", VAR_SERVER | VAR_HOST},
|
{"Cipher", VAR_SERVER | VAR_HOST},
|
||||||
{"ClampMSS", VAR_SERVER | VAR_HOST},
|
{"ClampMSS", VAR_SERVER | VAR_HOST | VAR_SAFE},
|
||||||
{"Compression", VAR_SERVER | VAR_HOST},
|
{"Compression", VAR_SERVER | VAR_HOST | VAR_SAFE},
|
||||||
{"Digest", VAR_SERVER | VAR_HOST},
|
{"Digest", VAR_SERVER | VAR_HOST},
|
||||||
{"Ed25519PublicKey", VAR_HOST},
|
{"Ed25519PublicKey", VAR_HOST},
|
||||||
{"Ed25519PublicKeyFile", VAR_SERVER | VAR_HOST},
|
{"Ed25519PublicKeyFile", VAR_SERVER | VAR_HOST},
|
||||||
{"IndirectData", VAR_SERVER | VAR_HOST},
|
{"IndirectData", VAR_SERVER | VAR_HOST | VAR_SAFE},
|
||||||
{"MACLength", VAR_SERVER | VAR_HOST},
|
{"MACLength", VAR_SERVER | VAR_HOST},
|
||||||
{"PMTU", VAR_SERVER | VAR_HOST},
|
{"PMTU", VAR_SERVER | VAR_HOST},
|
||||||
{"PMTUDiscovery", VAR_SERVER | VAR_HOST},
|
{"PMTUDiscovery", VAR_SERVER | VAR_HOST},
|
||||||
|
@ -1789,7 +1798,7 @@ const var_t variables[] = {
|
||||||
{"PublicKey", VAR_HOST | VAR_OBSOLETE},
|
{"PublicKey", VAR_HOST | VAR_OBSOLETE},
|
||||||
{"PublicKeyFile", VAR_SERVER | VAR_HOST | VAR_OBSOLETE},
|
{"PublicKeyFile", VAR_SERVER | VAR_HOST | VAR_OBSOLETE},
|
||||||
{"Subnet", VAR_HOST | VAR_MULTIPLE | VAR_SAFE},
|
{"Subnet", VAR_HOST | VAR_MULTIPLE | VAR_SAFE},
|
||||||
{"TCPOnly", VAR_SERVER | VAR_HOST},
|
{"TCPOnly", VAR_SERVER | VAR_HOST | VAR_SAFE},
|
||||||
{"Weight", VAR_HOST | VAR_SAFE},
|
{"Weight", VAR_HOST | VAR_SAFE},
|
||||||
{NULL, 0}
|
{NULL, 0}
|
||||||
};
|
};
|
||||||
|
@ -1880,6 +1889,19 @@ static int cmd_config(int argc, char *argv[]) {
|
||||||
found = true;
|
found = true;
|
||||||
variable = (char *)variables[i].name;
|
variable = (char *)variables[i].name;
|
||||||
|
|
||||||
|
if(!strcasecmp(variable, "Subnet")) {
|
||||||
|
subnet_t s = {0};
|
||||||
|
|
||||||
|
if(!str2net(&s, value)) {
|
||||||
|
fprintf(stderr, "Malformed subnet definition %s\n", value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!subnetcheck(s)) {
|
||||||
|
fprintf(stderr, "Network address and prefix length do not match: %s\n", value);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Discourage use of obsolete variables. */
|
/* Discourage use of obsolete variables. */
|
||||||
|
|
||||||
if(variables[i].type & VAR_OBSOLETE && action >= 0) {
|
if(variables[i].type & VAR_OBSOLETE && action >= 0) {
|
||||||
|
@ -2301,6 +2323,7 @@ static int cmd_init(int argc, char *argv[]) {
|
||||||
|
|
||||||
static int cmd_generate_keys(int argc, char *argv[]) {
|
static int cmd_generate_keys(int argc, char *argv[]) {
|
||||||
#ifdef DISABLE_LEGACY
|
#ifdef DISABLE_LEGACY
|
||||||
|
(void)argv;
|
||||||
|
|
||||||
if(argc > 1) {
|
if(argc > 1) {
|
||||||
#else
|
#else
|
||||||
|
@ -2440,10 +2463,14 @@ static int cmd_edit(int argc, char *argv[]) {
|
||||||
char *command;
|
char *command;
|
||||||
#ifndef HAVE_MINGW
|
#ifndef HAVE_MINGW
|
||||||
const char *editor = getenv("VISUAL");
|
const char *editor = getenv("VISUAL");
|
||||||
if (!editor)
|
|
||||||
|
if(!editor) {
|
||||||
editor = getenv("EDITOR");
|
editor = getenv("EDITOR");
|
||||||
if (!editor)
|
}
|
||||||
|
|
||||||
|
if(!editor) {
|
||||||
editor = "vi";
|
editor = "vi";
|
||||||
|
}
|
||||||
|
|
||||||
xasprintf(&command, "\"%s\" \"%s\"", editor, filename);
|
xasprintf(&command, "\"%s\" \"%s\"", editor, filename);
|
||||||
#else
|
#else
|
||||||
|
|
11
src/tincd.c
11
src/tincd.c
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
tincd.c -- the main file for tincd
|
tincd.c -- the main file for tincd
|
||||||
Copyright (C) 1998-2005 Ivo Timmermans
|
Copyright (C) 1998-2005 Ivo Timmermans
|
||||||
2000-2018 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2021 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
2008 Max Rijevski <maksuf@gmail.com>
|
2008 Max Rijevski <maksuf@gmail.com>
|
||||||
2009 Michael Tokarev <mjt@tls.msk.ru>
|
2009 Michael Tokarev <mjt@tls.msk.ru>
|
||||||
2010 Julien Muchembled <jm@jmuchemb.eu>
|
2010 Julien Muchembled <jm@jmuchemb.eu>
|
||||||
|
@ -344,10 +344,15 @@ static bool drop_privs(void) {
|
||||||
# define setpriority(level) !SetPriorityClass(GetCurrentProcess(), (level))
|
# define setpriority(level) !SetPriorityClass(GetCurrentProcess(), (level))
|
||||||
|
|
||||||
static void stop_handler(void *data, int flags) {
|
static void stop_handler(void *data, int flags) {
|
||||||
|
(void)data;
|
||||||
|
(void)flags;
|
||||||
|
|
||||||
event_exit();
|
event_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL WINAPI console_ctrl_handler(DWORD type) {
|
static BOOL WINAPI console_ctrl_handler(DWORD type) {
|
||||||
|
(void)type;
|
||||||
|
|
||||||
logger(DEBUG_ALWAYS, LOG_NOTICE, "Got console shutdown request");
|
logger(DEBUG_ALWAYS, LOG_NOTICE, "Got console shutdown request");
|
||||||
|
|
||||||
if(WSASetEvent(stop_io.event) == FALSE) {
|
if(WSASetEvent(stop_io.event) == FALSE) {
|
||||||
|
@ -373,7 +378,7 @@ int main(int argc, char **argv) {
|
||||||
if(show_version) {
|
if(show_version) {
|
||||||
printf("%s version %s (built %s %s, protocol %d.%d)\n", PACKAGE,
|
printf("%s version %s (built %s %s, protocol %d.%d)\n", PACKAGE,
|
||||||
BUILD_VERSION, BUILD_DATE, BUILD_TIME, PROT_MAJOR, PROT_MINOR);
|
BUILD_VERSION, BUILD_DATE, BUILD_TIME, PROT_MAJOR, PROT_MINOR);
|
||||||
printf("Copyright (C) 1998-2018 Ivo Timmermans, Guus Sliepen and others.\n"
|
printf("Copyright (C) 1998-2021 Ivo Timmermans, Guus Sliepen and others.\n"
|
||||||
"See the AUTHORS file for a complete list.\n\n"
|
"See the AUTHORS file for a complete list.\n\n"
|
||||||
"tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
|
"tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
|
||||||
"and you are welcome to redistribute it under certain conditions;\n"
|
"and you are welcome to redistribute it under certain conditions;\n"
|
||||||
|
@ -481,6 +486,8 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int main2(int argc, char **argv) {
|
int main2(int argc, char **argv) {
|
||||||
|
(void)argc;
|
||||||
|
(void)argv;
|
||||||
#endif
|
#endif
|
||||||
char *priority = NULL;
|
char *priority = NULL;
|
||||||
|
|
||||||
|
|
18
src/upnp.c
18
src/upnp.c
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
upnp.c -- UPnP-IGD client
|
upnp.c -- UPnP-IGD client
|
||||||
Copyright (C) 2015 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2015-2018 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -19,7 +19,9 @@
|
||||||
|
|
||||||
#include "upnp.h"
|
#include "upnp.h"
|
||||||
|
|
||||||
|
#ifndef HAVE_MINGW
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "miniupnpc/miniupnpc.h"
|
#include "miniupnpc/miniupnpc.h"
|
||||||
#include "miniupnpc/upnpcommands.h"
|
#include "miniupnpc/upnpcommands.h"
|
||||||
|
@ -159,7 +161,9 @@ static void *upnp_thread(void *data) {
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
|
|
||||||
if(now < refresh_time) {
|
if(now < refresh_time) {
|
||||||
sleep(refresh_time - now);
|
nanosleep(&(struct timespec) {
|
||||||
|
refresh_time - now, 0
|
||||||
|
}, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,10 +180,20 @@ void upnp_init(bool tcp, bool udp) {
|
||||||
get_config_int(lookup_config(config_tree, "UPnPDiscoverWait"), &upnp_discover_wait);
|
get_config_int(lookup_config(config_tree, "UPnPDiscoverWait"), &upnp_discover_wait);
|
||||||
get_config_int(lookup_config(config_tree, "UPnPRefreshPeriod"), &upnp_refresh_period);
|
get_config_int(lookup_config(config_tree, "UPnPRefreshPeriod"), &upnp_refresh_period);
|
||||||
|
|
||||||
|
#ifdef HAVE_MINGW
|
||||||
|
HANDLE handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)upnp_thread, NULL, 0, NULL);
|
||||||
|
|
||||||
|
if(!handle) {
|
||||||
|
logger(DEBUG_ALWAYS, LOG_ERR, "Unable to start UPnP-IGD client thread");
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
int error = pthread_create(&thread, NULL, upnp_thread, NULL);
|
int error = pthread_create(&thread, NULL, upnp_thread, NULL);
|
||||||
|
|
||||||
if(error) {
|
if(error) {
|
||||||
logger(DEBUG_ALWAYS, LOG_ERR, "Unable to start UPnP-IGD client thread: [%d] %s", error, strerror(error));
|
logger(DEBUG_ALWAYS, LOG_ERR, "Unable to start UPnP-IGD client thread: [%d] %s", error, strerror(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,11 +173,7 @@ size_t b64encode_urlsafe(const void *src, char *dst, size_t length) {
|
||||||
return b64encode_internal(src, dst, length, base64_urlsafe);
|
return b64encode_internal(src, dst, length, base64_urlsafe);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_MINGW) || defined(HAVE_CYGWIN)
|
#ifdef HAVE_MINGW
|
||||||
#ifdef HAVE_CYGWIN
|
|
||||||
#include <w32api/windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const char *winerror(int err) {
|
const char *winerror(int err) {
|
||||||
static char buf[1024], *ptr;
|
static char buf[1024], *ptr;
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ static inline void *xrealloc(void *p, size_t n) {
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline char *xstrdup(const char *s) __attribute__((__malloc__, __nonnull__));
|
static inline char *xstrdup(const char *s) __attribute__((__malloc__)) __attribute((__nonnull__));
|
||||||
static inline char *xstrdup(const char *s) {
|
static inline char *xstrdup(const char *s) {
|
||||||
char *p = strdup(s);
|
char *p = strdup(s);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
|
10
test-driver
10
test-driver
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
scriptversion=2018-03-07.03; # UTC
|
scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
# Copyright (C) 2011-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2011-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -42,11 +42,13 @@ print_usage ()
|
||||||
{
|
{
|
||||||
cat <<END
|
cat <<END
|
||||||
Usage:
|
Usage:
|
||||||
test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
|
test-driver --test-name NAME --log-file PATH --trs-file PATH
|
||||||
[--expect-failure={yes|no}] [--color-tests={yes|no}]
|
[--expect-failure {yes|no}] [--color-tests {yes|no}]
|
||||||
[--enable-hard-errors={yes|no}] [--]
|
[--enable-hard-errors {yes|no}] [--]
|
||||||
TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
|
TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
|
||||||
|
|
||||||
The '--test-name', '--log-file' and '--trs-file' options are mandatory.
|
The '--test-name', '--log-file' and '--trs-file' options are mandatory.
|
||||||
|
See the GNU Automake documentation for information.
|
||||||
END
|
END
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
TESTS = \
|
|
||||||
basic.test \
|
|
||||||
commandline.test \
|
|
||||||
executables.test \
|
|
||||||
import-export.test \
|
|
||||||
invite-join.test \
|
|
||||||
invite-offline.test \
|
|
||||||
invite-tinc-up.test \
|
|
||||||
legacy-protocol.test \
|
|
||||||
ns-ping.test \
|
|
||||||
scripts.test \
|
|
||||||
security.test \
|
|
||||||
sptps-basic.test \
|
|
||||||
variables.test
|
|
||||||
|
|
||||||
dist_check_SCRIPTS = $(TESTS)
|
|
||||||
|
|
||||||
EXTRA_DIST = testlib.sh
|
|
||||||
|
|
||||||
AM_CFLAGS = -iquote.
|
|
||||||
|
|
||||||
check_PROGRAMS = \
|
|
||||||
splice
|
|
||||||
|
|
||||||
splice_SOURCES = splice.c
|
|
||||||
|
|
||||||
clean-local:
|
|
||||||
-for pid in *.test.?/pid; do ../src/tinc --pidfile="$$pid" stop; done
|
|
||||||
-killall ../src/sptps_test
|
|
||||||
-rm -rf *.test.?
|
|
951
test/Makefile.in
951
test/Makefile.in
|
@ -1,951 +0,0 @@
|
||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
VPATH = @srcdir@
|
|
||||||
am__is_gnu_make = { \
|
|
||||||
if test -z '$(MAKELEVEL)'; then \
|
|
||||||
false; \
|
|
||||||
elif test -n '$(MAKE_HOST)'; then \
|
|
||||||
true; \
|
|
||||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
|
||||||
true; \
|
|
||||||
else \
|
|
||||||
false; \
|
|
||||||
fi; \
|
|
||||||
}
|
|
||||||
am__make_running_with_option = \
|
|
||||||
case $${target_option-} in \
|
|
||||||
?) ;; \
|
|
||||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
|
||||||
"target option '$${target_option-}' specified" >&2; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
has_opt=no; \
|
|
||||||
sane_makeflags=$$MAKEFLAGS; \
|
|
||||||
if $(am__is_gnu_make); then \
|
|
||||||
sane_makeflags=$$MFLAGS; \
|
|
||||||
else \
|
|
||||||
case $$MAKEFLAGS in \
|
|
||||||
*\\[\ \ ]*) \
|
|
||||||
bs=\\; \
|
|
||||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
|
||||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
|
||||||
esac; \
|
|
||||||
fi; \
|
|
||||||
skip_next=no; \
|
|
||||||
strip_trailopt () \
|
|
||||||
{ \
|
|
||||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
|
||||||
}; \
|
|
||||||
for flg in $$sane_makeflags; do \
|
|
||||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
|
||||||
case $$flg in \
|
|
||||||
*=*|--*) continue;; \
|
|
||||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
|
||||||
-*I?*) strip_trailopt 'I';; \
|
|
||||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
|
||||||
-*O?*) strip_trailopt 'O';; \
|
|
||||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
|
||||||
-*l?*) strip_trailopt 'l';; \
|
|
||||||
-[dEDm]) skip_next=yes;; \
|
|
||||||
-[JT]) skip_next=yes;; \
|
|
||||||
esac; \
|
|
||||||
case $$flg in \
|
|
||||||
*$$target_option*) has_opt=yes; break;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
test $$has_opt = yes
|
|
||||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
|
||||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
install_sh_DATA = $(install_sh) -c -m 644
|
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
build_triplet = @build@
|
|
||||||
host_triplet = @host@
|
|
||||||
check_PROGRAMS = splice$(EXEEXT)
|
|
||||||
subdir = test
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
|
||||||
$(top_srcdir)/m4/ax_append_flag.m4 \
|
|
||||||
$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
|
|
||||||
$(top_srcdir)/m4/ax_check_compile_flag.m4 \
|
|
||||||
$(top_srcdir)/m4/ax_check_link_flag.m4 \
|
|
||||||
$(top_srcdir)/m4/ax_code_coverage.m4 \
|
|
||||||
$(top_srcdir)/m4/ax_require_defined.m4 \
|
|
||||||
$(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/libgcrypt.m4 \
|
|
||||||
$(top_srcdir)/m4/lzo.m4 $(top_srcdir)/m4/miniupnpc.m4 \
|
|
||||||
$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/readline.m4 \
|
|
||||||
$(top_srcdir)/m4/zlib.m4 $(top_srcdir)/configure.ac
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
|
||||||
$(ACLOCAL_M4)
|
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(dist_check_SCRIPTS) \
|
|
||||||
$(am__DIST_COMMON)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h
|
|
||||||
CONFIG_CLEAN_FILES =
|
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
|
||||||
am_splice_OBJECTS = splice.$(OBJEXT)
|
|
||||||
splice_OBJECTS = $(am_splice_OBJECTS)
|
|
||||||
splice_LDADD = $(LDADD)
|
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
|
||||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
|
||||||
am__v_P_0 = false
|
|
||||||
am__v_P_1 = :
|
|
||||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
|
||||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
|
||||||
am__v_GEN_0 = @echo " GEN " $@;
|
|
||||||
am__v_GEN_1 =
|
|
||||||
AM_V_at = $(am__v_at_@AM_V@)
|
|
||||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
|
||||||
am__v_at_0 = @
|
|
||||||
am__v_at_1 =
|
|
||||||
DEFAULT_INCLUDES =
|
|
||||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
|
||||||
am__maybe_remake_depfiles = depfiles
|
|
||||||
am__depfiles_remade = ./$(DEPDIR)/splice.Po
|
|
||||||
am__mv = mv -f
|
|
||||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
|
||||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
|
||||||
AM_V_CC = $(am__v_CC_@AM_V@)
|
|
||||||
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
|
|
||||||
am__v_CC_0 = @echo " CC " $@;
|
|
||||||
am__v_CC_1 =
|
|
||||||
CCLD = $(CC)
|
|
||||||
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
|
||||||
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
|
||||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
|
||||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
|
||||||
am__v_CCLD_1 =
|
|
||||||
SOURCES = $(splice_SOURCES)
|
|
||||||
DIST_SOURCES = $(splice_SOURCES)
|
|
||||||
am__can_run_installinfo = \
|
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
|
||||||
n|no|NO) false;; \
|
|
||||||
*) (install-info --version) >/dev/null 2>&1;; \
|
|
||||||
esac
|
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
|
||||||
# Read a list of newline-separated strings from the standard input,
|
|
||||||
# and print each of them once, without duplicates. Input order is
|
|
||||||
# *not* preserved.
|
|
||||||
am__uniquify_input = $(AWK) '\
|
|
||||||
BEGIN { nonempty = 0; } \
|
|
||||||
{ items[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in items) print i; }; } \
|
|
||||||
'
|
|
||||||
# Make sure the list of sources is unique. This is necessary because,
|
|
||||||
# e.g., the same source file might be shared among _SOURCES variables
|
|
||||||
# for different programs/libraries.
|
|
||||||
am__define_uniq_tagged_files = \
|
|
||||||
list='$(am__tagged_files)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | $(am__uniquify_input)`
|
|
||||||
ETAGS = etags
|
|
||||||
CTAGS = ctags
|
|
||||||
am__tty_colors_dummy = \
|
|
||||||
mgn= red= grn= lgn= blu= brg= std=; \
|
|
||||||
am__color_tests=no
|
|
||||||
am__tty_colors = { \
|
|
||||||
$(am__tty_colors_dummy); \
|
|
||||||
if test "X$(AM_COLOR_TESTS)" = Xno; then \
|
|
||||||
am__color_tests=no; \
|
|
||||||
elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
|
|
||||||
am__color_tests=yes; \
|
|
||||||
elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
|
|
||||||
am__color_tests=yes; \
|
|
||||||
fi; \
|
|
||||||
if test $$am__color_tests = yes; then \
|
|
||||||
red='[0;31m'; \
|
|
||||||
grn='[0;32m'; \
|
|
||||||
lgn='[1;32m'; \
|
|
||||||
blu='[1;34m'; \
|
|
||||||
mgn='[0;35m'; \
|
|
||||||
brg='[1m'; \
|
|
||||||
std='[m'; \
|
|
||||||
fi; \
|
|
||||||
}
|
|
||||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
|
||||||
am__vpath_adj = case $$p in \
|
|
||||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
|
||||||
*) f=$$p;; \
|
|
||||||
esac;
|
|
||||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
|
||||||
am__install_max = 40
|
|
||||||
am__nobase_strip_setup = \
|
|
||||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
|
||||||
am__nobase_strip = \
|
|
||||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
|
||||||
am__nobase_list = $(am__nobase_strip_setup); \
|
|
||||||
for p in $$list; do echo "$$p $$p"; done | \
|
|
||||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
|
||||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
|
||||||
if (++n[$$2] == $(am__install_max)) \
|
|
||||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
|
||||||
END { for (dir in files) print dir, files[dir] }'
|
|
||||||
am__base_list = \
|
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
|
||||||
am__uninstall_files_from_dir = { \
|
|
||||||
test -z "$$files" \
|
|
||||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
|
||||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
|
||||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
|
||||||
}
|
|
||||||
am__recheck_rx = ^[ ]*:recheck:[ ]*
|
|
||||||
am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
|
|
||||||
am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
|
|
||||||
# A command that, given a newline-separated list of test names on the
|
|
||||||
# standard input, print the name of the tests that are to be re-run
|
|
||||||
# upon "make recheck".
|
|
||||||
am__list_recheck_tests = $(AWK) '{ \
|
|
||||||
recheck = 1; \
|
|
||||||
while ((rc = (getline line < ($$0 ".trs"))) != 0) \
|
|
||||||
{ \
|
|
||||||
if (rc < 0) \
|
|
||||||
{ \
|
|
||||||
if ((getline line2 < ($$0 ".log")) < 0) \
|
|
||||||
recheck = 0; \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
|
|
||||||
{ \
|
|
||||||
recheck = 0; \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
|
|
||||||
{ \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
}; \
|
|
||||||
if (recheck) \
|
|
||||||
print $$0; \
|
|
||||||
close ($$0 ".trs"); \
|
|
||||||
close ($$0 ".log"); \
|
|
||||||
}'
|
|
||||||
# A command that, given a newline-separated list of test names on the
|
|
||||||
# standard input, create the global log from their .trs and .log files.
|
|
||||||
am__create_global_log = $(AWK) ' \
|
|
||||||
function fatal(msg) \
|
|
||||||
{ \
|
|
||||||
print "fatal: making $@: " msg | "cat >&2"; \
|
|
||||||
exit 1; \
|
|
||||||
} \
|
|
||||||
function rst_section(header) \
|
|
||||||
{ \
|
|
||||||
print header; \
|
|
||||||
len = length(header); \
|
|
||||||
for (i = 1; i <= len; i = i + 1) \
|
|
||||||
printf "="; \
|
|
||||||
printf "\n\n"; \
|
|
||||||
} \
|
|
||||||
{ \
|
|
||||||
copy_in_global_log = 1; \
|
|
||||||
global_test_result = "RUN"; \
|
|
||||||
while ((rc = (getline line < ($$0 ".trs"))) != 0) \
|
|
||||||
{ \
|
|
||||||
if (rc < 0) \
|
|
||||||
fatal("failed to read from " $$0 ".trs"); \
|
|
||||||
if (line ~ /$(am__global_test_result_rx)/) \
|
|
||||||
{ \
|
|
||||||
sub("$(am__global_test_result_rx)", "", line); \
|
|
||||||
sub("[ ]*$$", "", line); \
|
|
||||||
global_test_result = line; \
|
|
||||||
} \
|
|
||||||
else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
|
|
||||||
copy_in_global_log = 0; \
|
|
||||||
}; \
|
|
||||||
if (copy_in_global_log) \
|
|
||||||
{ \
|
|
||||||
rst_section(global_test_result ": " $$0); \
|
|
||||||
while ((rc = (getline line < ($$0 ".log"))) != 0) \
|
|
||||||
{ \
|
|
||||||
if (rc < 0) \
|
|
||||||
fatal("failed to read from " $$0 ".log"); \
|
|
||||||
print line; \
|
|
||||||
}; \
|
|
||||||
printf "\n"; \
|
|
||||||
}; \
|
|
||||||
close ($$0 ".trs"); \
|
|
||||||
close ($$0 ".log"); \
|
|
||||||
}'
|
|
||||||
# Restructured Text title.
|
|
||||||
am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
|
|
||||||
# Solaris 10 'make', and several other traditional 'make' implementations,
|
|
||||||
# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
|
|
||||||
# by disabling -e (using the XSI extension "set +e") if it's set.
|
|
||||||
am__sh_e_setup = case $$- in *e*) set +e;; esac
|
|
||||||
# Default flags passed to test drivers.
|
|
||||||
am__common_driver_flags = \
|
|
||||||
--color-tests "$$am__color_tests" \
|
|
||||||
--enable-hard-errors "$$am__enable_hard_errors" \
|
|
||||||
--expect-failure "$$am__expect_failure"
|
|
||||||
# To be inserted before the command running the test. Creates the
|
|
||||||
# directory for the log if needed. Stores in $dir the directory
|
|
||||||
# containing $f, in $tst the test, in $log the log. Executes the
|
|
||||||
# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
|
|
||||||
# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
|
|
||||||
# will run the test scripts (or their associated LOG_COMPILER, if
|
|
||||||
# thy have one).
|
|
||||||
am__check_pre = \
|
|
||||||
$(am__sh_e_setup); \
|
|
||||||
$(am__vpath_adj_setup) $(am__vpath_adj) \
|
|
||||||
$(am__tty_colors); \
|
|
||||||
srcdir=$(srcdir); export srcdir; \
|
|
||||||
case "$@" in \
|
|
||||||
*/*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
|
|
||||||
*) am__odir=.;; \
|
|
||||||
esac; \
|
|
||||||
test "x$$am__odir" = x"." || test -d "$$am__odir" \
|
|
||||||
|| $(MKDIR_P) "$$am__odir" || exit $$?; \
|
|
||||||
if test -f "./$$f"; then dir=./; \
|
|
||||||
elif test -f "$$f"; then dir=; \
|
|
||||||
else dir="$(srcdir)/"; fi; \
|
|
||||||
tst=$$dir$$f; log='$@'; \
|
|
||||||
if test -n '$(DISABLE_HARD_ERRORS)'; then \
|
|
||||||
am__enable_hard_errors=no; \
|
|
||||||
else \
|
|
||||||
am__enable_hard_errors=yes; \
|
|
||||||
fi; \
|
|
||||||
case " $(XFAIL_TESTS) " in \
|
|
||||||
*[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
|
|
||||||
am__expect_failure=yes;; \
|
|
||||||
*) \
|
|
||||||
am__expect_failure=no;; \
|
|
||||||
esac; \
|
|
||||||
$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
|
|
||||||
# A shell command to get the names of the tests scripts with any registered
|
|
||||||
# extension removed (i.e., equivalently, the names of the test logs, with
|
|
||||||
# the '.log' extension removed). The result is saved in the shell variable
|
|
||||||
# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
|
|
||||||
# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
|
|
||||||
# since that might cause problem with VPATH rewrites for suffix-less tests.
|
|
||||||
# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
|
|
||||||
am__set_TESTS_bases = \
|
|
||||||
bases='$(TEST_LOGS)'; \
|
|
||||||
bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
|
|
||||||
bases=`echo $$bases`
|
|
||||||
RECHECK_LOGS = $(TEST_LOGS)
|
|
||||||
AM_RECURSIVE_TARGETS = check recheck
|
|
||||||
TEST_SUITE_LOG = test-suite.log
|
|
||||||
TEST_EXTENSIONS = @EXEEXT@ .test
|
|
||||||
am__test_logs1 = $(TESTS:=.log)
|
|
||||||
am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
|
|
||||||
TEST_LOGS = $(am__test_logs2:.test.log=.log)
|
|
||||||
TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
|
|
||||||
TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
|
|
||||||
$(TEST_LOG_FLAGS)
|
|
||||||
am__set_b = \
|
|
||||||
case '$@' in \
|
|
||||||
*/*) \
|
|
||||||
case '$*' in \
|
|
||||||
*/*) b='$*';; \
|
|
||||||
*) b=`echo '$@' | sed 's/\.log$$//'`; \
|
|
||||||
esac;; \
|
|
||||||
*) \
|
|
||||||
b='$*';; \
|
|
||||||
esac
|
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
|
|
||||||
$(top_srcdir)/test-driver
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AWK = @AWK@
|
|
||||||
CC = @CC@
|
|
||||||
CCDEPMODE = @CCDEPMODE@
|
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@
|
|
||||||
CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@
|
|
||||||
CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@
|
|
||||||
CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@
|
|
||||||
CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@
|
|
||||||
CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@
|
|
||||||
CPP = @CPP@
|
|
||||||
CPPFLAGS = @CPPFLAGS@
|
|
||||||
CURSES_LIBS = @CURSES_LIBS@
|
|
||||||
CYGPATH_W = @CYGPATH_W@
|
|
||||||
DEFS = @DEFS@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
GCOV = @GCOV@
|
|
||||||
GENHTML = @GENHTML@
|
|
||||||
GREP = @GREP@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
LCOV = @LCOV@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MINIUPNPC_LIBS = @MINIUPNPC_LIBS@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
READLINE_LIBS = @READLINE_LIBS@
|
|
||||||
SED = @SED@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
abs_builddir = @abs_builddir@
|
|
||||||
abs_srcdir = @abs_srcdir@
|
|
||||||
abs_top_builddir = @abs_top_builddir@
|
|
||||||
abs_top_srcdir = @abs_top_srcdir@
|
|
||||||
ac_ct_CC = @ac_ct_CC@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__leading_dot = @am__leading_dot@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
am__tar = @am__tar@
|
|
||||||
am__untar = @am__untar@
|
|
||||||
bindir = @bindir@
|
|
||||||
build = @build@
|
|
||||||
build_alias = @build_alias@
|
|
||||||
build_cpu = @build_cpu@
|
|
||||||
build_os = @build_os@
|
|
||||||
build_vendor = @build_vendor@
|
|
||||||
builddir = @builddir@
|
|
||||||
datadir = @datadir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
docdir = @docdir@
|
|
||||||
dvidir = @dvidir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
host = @host@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
host_cpu = @host_cpu@
|
|
||||||
host_os = @host_os@
|
|
||||||
host_vendor = @host_vendor@
|
|
||||||
htmldir = @htmldir@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localedir = @localedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
pdfdir = @pdfdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
psdir = @psdir@
|
|
||||||
runstatedir = @runstatedir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
systemd_path = @systemd_path@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
top_build_prefix = @top_build_prefix@
|
|
||||||
top_builddir = @top_builddir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
TESTS = \
|
|
||||||
basic.test \
|
|
||||||
commandline.test \
|
|
||||||
executables.test \
|
|
||||||
import-export.test \
|
|
||||||
invite-join.test \
|
|
||||||
invite-offline.test \
|
|
||||||
invite-tinc-up.test \
|
|
||||||
legacy-protocol.test \
|
|
||||||
ns-ping.test \
|
|
||||||
scripts.test \
|
|
||||||
security.test \
|
|
||||||
sptps-basic.test \
|
|
||||||
variables.test
|
|
||||||
|
|
||||||
dist_check_SCRIPTS = $(TESTS)
|
|
||||||
EXTRA_DIST = testlib.sh
|
|
||||||
AM_CFLAGS = -iquote.
|
|
||||||
splice_SOURCES = splice.c
|
|
||||||
all: all-am
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
.SUFFIXES: .c .log .o .obj .test .test$(EXEEXT) .trs
|
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
|
||||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --gnu test/Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
@case '$?' in \
|
|
||||||
*config.status*) \
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
|
||||||
*) \
|
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
|
||||||
esac;
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
|
|
||||||
clean-checkPROGRAMS:
|
|
||||||
-test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS)
|
|
||||||
|
|
||||||
splice$(EXEEXT): $(splice_OBJECTS) $(splice_DEPENDENCIES) $(EXTRA_splice_DEPENDENCIES)
|
|
||||||
@rm -f splice$(EXEEXT)
|
|
||||||
$(AM_V_CCLD)$(LINK) $(splice_OBJECTS) $(splice_LDADD) $(LIBS)
|
|
||||||
|
|
||||||
mostlyclean-compile:
|
|
||||||
-rm -f *.$(OBJEXT)
|
|
||||||
|
|
||||||
distclean-compile:
|
|
||||||
-rm -f *.tab.c
|
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/splice.Po@am__quote@ # am--include-marker
|
|
||||||
|
|
||||||
$(am__depfiles_remade):
|
|
||||||
@$(MKDIR_P) $(@D)
|
|
||||||
@echo '# dummy' >$@-t && $(am__mv) $@-t $@
|
|
||||||
|
|
||||||
am--depfiles: $(am__depfiles_remade)
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
|
|
||||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
|
|
||||||
|
|
||||||
.c.obj:
|
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
|
|
||||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
|
||||||
|
|
||||||
ID: $(am__tagged_files)
|
|
||||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
|
||||||
tags: tags-am
|
|
||||||
TAGS: tags
|
|
||||||
|
|
||||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
|
||||||
set x; \
|
|
||||||
here=`pwd`; \
|
|
||||||
$(am__define_uniq_tagged_files); \
|
|
||||||
shift; \
|
|
||||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
|
||||||
test -n "$$unique" || unique=$$empty_fix; \
|
|
||||||
if test $$# -gt 0; then \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
"$$@" $$unique; \
|
|
||||||
else \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
$$unique; \
|
|
||||||
fi; \
|
|
||||||
fi
|
|
||||||
ctags: ctags-am
|
|
||||||
|
|
||||||
CTAGS: ctags
|
|
||||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
|
||||||
$(am__define_uniq_tagged_files); \
|
|
||||||
test -z "$(CTAGS_ARGS)$$unique" \
|
|
||||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
|
||||||
$$unique
|
|
||||||
|
|
||||||
GTAGS:
|
|
||||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
|
||||||
&& $(am__cd) $(top_srcdir) \
|
|
||||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
|
||||||
cscopelist: cscopelist-am
|
|
||||||
|
|
||||||
cscopelist-am: $(am__tagged_files)
|
|
||||||
list='$(am__tagged_files)'; \
|
|
||||||
case "$(srcdir)" in \
|
|
||||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
|
||||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
|
||||||
esac; \
|
|
||||||
for i in $$list; do \
|
|
||||||
if test -f "$$i"; then \
|
|
||||||
echo "$(subdir)/$$i"; \
|
|
||||||
else \
|
|
||||||
echo "$$sdir/$$i"; \
|
|
||||||
fi; \
|
|
||||||
done >> $(top_builddir)/cscope.files
|
|
||||||
|
|
||||||
distclean-tags:
|
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
|
||||||
|
|
||||||
# Recover from deleted '.trs' file; this should ensure that
|
|
||||||
# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
|
|
||||||
# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
|
|
||||||
# to avoid problems with "make -n".
|
|
||||||
.log.trs:
|
|
||||||
rm -f $< $@
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) $<
|
|
||||||
|
|
||||||
# Leading 'am--fnord' is there to ensure the list of targets does not
|
|
||||||
# expand to empty, as could happen e.g. with make check TESTS=''.
|
|
||||||
am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
|
|
||||||
am--force-recheck:
|
|
||||||
@:
|
|
||||||
|
|
||||||
$(TEST_SUITE_LOG): $(TEST_LOGS)
|
|
||||||
@$(am__set_TESTS_bases); \
|
|
||||||
am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
|
|
||||||
redo_bases=`for i in $$bases; do \
|
|
||||||
am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
|
|
||||||
done`; \
|
|
||||||
if test -n "$$redo_bases"; then \
|
|
||||||
redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
|
|
||||||
redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
|
|
||||||
if $(am__make_dryrun); then :; else \
|
|
||||||
rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
|
|
||||||
fi; \
|
|
||||||
fi; \
|
|
||||||
if test -n "$$am__remaking_logs"; then \
|
|
||||||
echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
|
|
||||||
"recursion detected" >&2; \
|
|
||||||
elif test -n "$$redo_logs"; then \
|
|
||||||
am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
|
|
||||||
fi; \
|
|
||||||
if $(am__make_dryrun); then :; else \
|
|
||||||
st=0; \
|
|
||||||
errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
|
|
||||||
for i in $$redo_bases; do \
|
|
||||||
test -f $$i.trs && test -r $$i.trs \
|
|
||||||
|| { echo "$$errmsg $$i.trs" >&2; st=1; }; \
|
|
||||||
test -f $$i.log && test -r $$i.log \
|
|
||||||
|| { echo "$$errmsg $$i.log" >&2; st=1; }; \
|
|
||||||
done; \
|
|
||||||
test $$st -eq 0 || exit 1; \
|
|
||||||
fi
|
|
||||||
@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
|
|
||||||
ws='[ ]'; \
|
|
||||||
results=`for b in $$bases; do echo $$b.trs; done`; \
|
|
||||||
test -n "$$results" || results=/dev/null; \
|
|
||||||
all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
|
|
||||||
pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
|
|
||||||
fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
|
|
||||||
skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
|
|
||||||
xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
|
|
||||||
xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
|
|
||||||
error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
|
|
||||||
if test `expr $$fail + $$xpass + $$error` -eq 0; then \
|
|
||||||
success=true; \
|
|
||||||
else \
|
|
||||||
success=false; \
|
|
||||||
fi; \
|
|
||||||
br='==================='; br=$$br$$br$$br$$br; \
|
|
||||||
result_count () \
|
|
||||||
{ \
|
|
||||||
if test x"$$1" = x"--maybe-color"; then \
|
|
||||||
maybe_colorize=yes; \
|
|
||||||
elif test x"$$1" = x"--no-color"; then \
|
|
||||||
maybe_colorize=no; \
|
|
||||||
else \
|
|
||||||
echo "$@: invalid 'result_count' usage" >&2; exit 4; \
|
|
||||||
fi; \
|
|
||||||
shift; \
|
|
||||||
desc=$$1 count=$$2; \
|
|
||||||
if test $$maybe_colorize = yes && test $$count -gt 0; then \
|
|
||||||
color_start=$$3 color_end=$$std; \
|
|
||||||
else \
|
|
||||||
color_start= color_end=; \
|
|
||||||
fi; \
|
|
||||||
echo "$${color_start}# $$desc $$count$${color_end}"; \
|
|
||||||
}; \
|
|
||||||
create_testsuite_report () \
|
|
||||||
{ \
|
|
||||||
result_count $$1 "TOTAL:" $$all "$$brg"; \
|
|
||||||
result_count $$1 "PASS: " $$pass "$$grn"; \
|
|
||||||
result_count $$1 "SKIP: " $$skip "$$blu"; \
|
|
||||||
result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
|
|
||||||
result_count $$1 "FAIL: " $$fail "$$red"; \
|
|
||||||
result_count $$1 "XPASS:" $$xpass "$$red"; \
|
|
||||||
result_count $$1 "ERROR:" $$error "$$mgn"; \
|
|
||||||
}; \
|
|
||||||
{ \
|
|
||||||
echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
|
|
||||||
$(am__rst_title); \
|
|
||||||
create_testsuite_report --no-color; \
|
|
||||||
echo; \
|
|
||||||
echo ".. contents:: :depth: 2"; \
|
|
||||||
echo; \
|
|
||||||
for b in $$bases; do echo $$b; done \
|
|
||||||
| $(am__create_global_log); \
|
|
||||||
} >$(TEST_SUITE_LOG).tmp || exit 1; \
|
|
||||||
mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
|
|
||||||
if $$success; then \
|
|
||||||
col="$$grn"; \
|
|
||||||
else \
|
|
||||||
col="$$red"; \
|
|
||||||
test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
|
|
||||||
fi; \
|
|
||||||
echo "$${col}$$br$${std}"; \
|
|
||||||
echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
|
|
||||||
echo "$${col}$$br$${std}"; \
|
|
||||||
create_testsuite_report --maybe-color; \
|
|
||||||
echo "$$col$$br$$std"; \
|
|
||||||
if $$success; then :; else \
|
|
||||||
echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
|
|
||||||
if test -n "$(PACKAGE_BUGREPORT)"; then \
|
|
||||||
echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
|
|
||||||
fi; \
|
|
||||||
echo "$$col$$br$$std"; \
|
|
||||||
fi; \
|
|
||||||
$$success || exit 1
|
|
||||||
|
|
||||||
check-TESTS: $(check_PROGRAMS) $(dist_check_SCRIPTS)
|
|
||||||
@list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
|
|
||||||
@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
|
|
||||||
@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
|
|
||||||
@set +e; $(am__set_TESTS_bases); \
|
|
||||||
log_list=`for i in $$bases; do echo $$i.log; done`; \
|
|
||||||
trs_list=`for i in $$bases; do echo $$i.trs; done`; \
|
|
||||||
log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
|
|
||||||
exit $$?;
|
|
||||||
recheck: all $(check_PROGRAMS) $(dist_check_SCRIPTS)
|
|
||||||
@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
|
|
||||||
@set +e; $(am__set_TESTS_bases); \
|
|
||||||
bases=`for i in $$bases; do echo $$i; done \
|
|
||||||
| $(am__list_recheck_tests)` || exit 1; \
|
|
||||||
log_list=`for i in $$bases; do echo $$i.log; done`; \
|
|
||||||
log_list=`echo $$log_list`; \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
|
|
||||||
am__force_recheck=am--force-recheck \
|
|
||||||
TEST_LOGS="$$log_list"; \
|
|
||||||
exit $$?
|
|
||||||
.test.log:
|
|
||||||
@p='$<'; \
|
|
||||||
$(am__set_b); \
|
|
||||||
$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
|
|
||||||
--log-file $$b.log --trs-file $$b.trs \
|
|
||||||
$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
|
|
||||||
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
|
||||||
@am__EXEEXT_TRUE@.test$(EXEEXT).log:
|
|
||||||
@am__EXEEXT_TRUE@ @p='$<'; \
|
|
||||||
@am__EXEEXT_TRUE@ $(am__set_b); \
|
|
||||||
@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
|
|
||||||
@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
|
|
||||||
@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
|
|
||||||
@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
|
|
||||||
|
|
||||||
distdir: $(BUILT_SOURCES)
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
|
||||||
|
|
||||||
distdir-am: $(DISTFILES)
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
list='$(DISTFILES)'; \
|
|
||||||
dist_files=`for file in $$list; do echo $$file; done | \
|
|
||||||
sed -e "s|^$$srcdirstrip/||;t" \
|
|
||||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
|
||||||
case $$dist_files in \
|
|
||||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
|
||||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
|
||||||
sort -u` ;; \
|
|
||||||
esac; \
|
|
||||||
for file in $$dist_files; do \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test -d "$(distdir)/$$file"; then \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
|
||||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
else \
|
|
||||||
test -f "$(distdir)/$$file" \
|
|
||||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
check-am: all-am
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
|
|
||||||
$(dist_check_SCRIPTS)
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) check-TESTS
|
|
||||||
check: check-am
|
|
||||||
all-am: Makefile
|
|
||||||
installdirs:
|
|
||||||
install: install-am
|
|
||||||
install-exec: install-exec-am
|
|
||||||
install-data: install-data-am
|
|
||||||
uninstall: uninstall-am
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-am
|
|
||||||
install-strip:
|
|
||||||
if test -z '$(STRIP)'; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
install; \
|
|
||||||
else \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
|
||||||
fi
|
|
||||||
mostlyclean-generic:
|
|
||||||
-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
|
|
||||||
-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
|
|
||||||
-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-am
|
|
||||||
|
|
||||||
clean-am: clean-checkPROGRAMS clean-generic clean-local mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-am
|
|
||||||
-rm -f ./$(DEPDIR)/splice.Po
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-compile distclean-generic \
|
|
||||||
distclean-tags
|
|
||||||
|
|
||||||
dvi: dvi-am
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-am
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-am
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am:
|
|
||||||
|
|
||||||
install-dvi: install-dvi-am
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am:
|
|
||||||
|
|
||||||
install-html: install-html-am
|
|
||||||
|
|
||||||
install-html-am:
|
|
||||||
|
|
||||||
install-info: install-info-am
|
|
||||||
|
|
||||||
install-info-am:
|
|
||||||
|
|
||||||
install-man:
|
|
||||||
|
|
||||||
install-pdf: install-pdf-am
|
|
||||||
|
|
||||||
install-pdf-am:
|
|
||||||
|
|
||||||
install-ps: install-ps-am
|
|
||||||
|
|
||||||
install-ps-am:
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-am
|
|
||||||
-rm -f ./$(DEPDIR)/splice.Po
|
|
||||||
-rm -f Makefile
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-am
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic
|
|
||||||
|
|
||||||
pdf: pdf-am
|
|
||||||
|
|
||||||
pdf-am:
|
|
||||||
|
|
||||||
ps: ps-am
|
|
||||||
|
|
||||||
ps-am:
|
|
||||||
|
|
||||||
uninstall-am:
|
|
||||||
|
|
||||||
.MAKE: check-am install-am install-strip
|
|
||||||
|
|
||||||
.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
|
|
||||||
check-am clean clean-checkPROGRAMS clean-generic clean-local \
|
|
||||||
cscopelist-am ctags ctags-am distclean distclean-compile \
|
|
||||||
distclean-generic distclean-tags distdir dvi dvi-am html \
|
|
||||||
html-am info info-am install install-am install-data \
|
|
||||||
install-data-am install-dvi install-dvi-am install-exec \
|
|
||||||
install-exec-am install-html install-html-am install-info \
|
|
||||||
install-info-am install-man install-pdf install-pdf-am \
|
|
||||||
install-ps install-ps-am install-strip installcheck \
|
|
||||||
installcheck-am installdirs maintainer-clean \
|
|
||||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
|
||||||
mostlyclean-generic pdf pdf-am ps ps-am recheck tags tags-am \
|
|
||||||
uninstall uninstall-am
|
|
||||||
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
|
|
||||||
|
|
||||||
clean-local:
|
|
||||||
-for pid in *.test.?/pid; do ../src/tinc --pidfile="$$pid" stop; done
|
|
||||||
-killall ../src/sptps_test
|
|
||||||
-rm -rf *.test.?
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
|
@ -1,20 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Initialize and test one node
|
|
||||||
|
|
||||||
$tinc $c1 init foo
|
|
||||||
$tinc $c1 set DeviceType dummy
|
|
||||||
$tinc $c1 set Port 0
|
|
||||||
|
|
||||||
# Test running in the foreground
|
|
||||||
|
|
||||||
(sleep 1; $tinc $c1 stop) &
|
|
||||||
$tinc $c1 start $r1 -D
|
|
||||||
|
|
||||||
# Test running tinc in the background
|
|
||||||
|
|
||||||
$tinc $c1 start $r1
|
|
||||||
sleep 1
|
|
||||||
$tinc $c1 stop
|
|
|
@ -1,50 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Initialize one node
|
|
||||||
|
|
||||||
$tinc $c1 <<EOF
|
|
||||||
init foo
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 0
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat >$d1/tinc-up <<EOF
|
|
||||||
#!/bin/sh
|
|
||||||
read pid rest <$d1/pid
|
|
||||||
(sleep 0.1; kill \$pid) &
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Test tincd command line options that should work
|
|
||||||
|
|
||||||
$tincd $c1 $r1 -D
|
|
||||||
$tincd $c1 $r1 --no-detach
|
|
||||||
$tincd $c1 $r1 -D -d
|
|
||||||
$tincd $c1 $r1 -D -d2
|
|
||||||
$tincd $c1 $r1 -D -d 2
|
|
||||||
$tincd $c1 $r1 -D -n foo
|
|
||||||
$tincd $c1 $r1 -D -nfoo
|
|
||||||
$tincd $c1 $r1 -D --net=foo
|
|
||||||
$tincd $c1 $r1 -D --net foo
|
|
||||||
|
|
||||||
# Test tincd command line options that should not work
|
|
||||||
|
|
||||||
$tincd $c1 $r1 foo && exit 1 || true
|
|
||||||
$tincd $c1 $r1 --pidfile && exit 1 || true
|
|
||||||
$tincd $c1 $r1 --foo && exit 1 || true
|
|
||||||
|
|
||||||
# Test tinc command line options that should work
|
|
||||||
|
|
||||||
$tinc $c1 get name
|
|
||||||
$tinc $c1 -n foo get name
|
|
||||||
$tinc $c1 -nfoo get name
|
|
||||||
$tinc $c1 --net=foo get name
|
|
||||||
$tinc $c1 --net foo get name
|
|
||||||
|
|
||||||
# Test tinc command line options that should not work
|
|
||||||
|
|
||||||
$tinc $c1 -n foo get somethingreallyunknown && exit 1 || true
|
|
||||||
$tinc $c1 --net && exit 1 || true
|
|
||||||
$tinc $c1 --net get name && exit 1 || true
|
|
||||||
$tinc $c1 foo && exit 1 || true
|
|
|
@ -1,10 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Just test whether the executables work
|
|
||||||
$tincd --help
|
|
||||||
$tinc --help
|
|
||||||
if [ -e $sptps_test ]; then
|
|
||||||
$sptps_test --help
|
|
||||||
fi
|
|
|
@ -1,64 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Initialize three nodes
|
|
||||||
|
|
||||||
$tinc $c1 <<EOF
|
|
||||||
init foo
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 32752
|
|
||||||
set Address localhost
|
|
||||||
EOF
|
|
||||||
|
|
||||||
$tinc $c2 <<EOF
|
|
||||||
init bar
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 0
|
|
||||||
EOF
|
|
||||||
|
|
||||||
$tinc $c3 <<EOF
|
|
||||||
init baz
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 0
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Test import, export and exchange commands
|
|
||||||
|
|
||||||
$tinc $c1 export | $tinc $c2 exchange | $tinc $c1 import
|
|
||||||
|
|
||||||
# Test export-all and exchange-all
|
|
||||||
|
|
||||||
$tinc $c1 export-all | $tinc $c3 exchange | $tinc $c1 import
|
|
||||||
$tinc $c1 exchange-all </dev/null | $tinc $c2 import
|
|
||||||
|
|
||||||
# Test equivalence of host config files
|
|
||||||
|
|
||||||
cmp $d1/hosts/foo $d2/hosts/foo
|
|
||||||
cmp $d1/hosts/foo $d3/hosts/foo
|
|
||||||
cmp $d1/hosts/bar $d2/hosts/bar
|
|
||||||
cmp $d1/hosts/bar $d3/hosts/bar
|
|
||||||
cmp $d1/hosts/baz $d2/hosts/baz
|
|
||||||
cmp $d1/hosts/baz $d3/hosts/baz
|
|
||||||
|
|
||||||
# Check whether the nodes can connect to each other
|
|
||||||
|
|
||||||
$tinc $c1 start $r1
|
|
||||||
|
|
||||||
$tinc $c2 add ConnectTo foo
|
|
||||||
$tinc $c3 add ConnectTo foo
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
$tinc $c2 start $r2
|
|
||||||
$tinc $c3 start $r3
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
test `$tinc $c1 dump reachable nodes | wc -l` = 3
|
|
||||||
test `$tinc $c2 dump reachable nodes | wc -l` = 3
|
|
||||||
test `$tinc $c3 dump reachable nodes | wc -l` = 3
|
|
||||||
|
|
||||||
$tinc $c3 stop
|
|
||||||
$tinc $c2 stop
|
|
||||||
$tinc $c1 stop
|
|
|
@ -1,46 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Initialize one node
|
|
||||||
|
|
||||||
$tinc $c1 <<EOF
|
|
||||||
init foo
|
|
||||||
set DeviceType dummy
|
|
||||||
set Mode switch
|
|
||||||
set Broadcast no
|
|
||||||
set Address localhost
|
|
||||||
set Port 32751
|
|
||||||
start $r1
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Generate an invitation and let another node join the VPN
|
|
||||||
|
|
||||||
$tinc $c1 invite bar | $tinc $c2 join
|
|
||||||
|
|
||||||
# Test equivalence of host config files
|
|
||||||
|
|
||||||
cmp $d1/hosts/foo $d2/hosts/foo
|
|
||||||
test "`grep ^Ed25519PublicKey $d1/hosts/bar`" = "`grep ^Ed25519PublicKey $d2/hosts/bar`"
|
|
||||||
|
|
||||||
# Test Mode, Broadcast and ConnectTo statements
|
|
||||||
|
|
||||||
test `$tinc $c2 get Mode` = switch
|
|
||||||
test `$tinc $c2 get Broadcast` = no
|
|
||||||
test `$tinc $c2 get ConnectTo` = foo
|
|
||||||
|
|
||||||
# Check whether the new node can join the VPN
|
|
||||||
|
|
||||||
$tinc $c2 << EOF
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 0
|
|
||||||
start $r2
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
test `$tinc $c1 dump reachable nodes | wc -l` = 2
|
|
||||||
test `$tinc $c2 dump reachable nodes | wc -l` = 2
|
|
||||||
|
|
||||||
$tinc $c2 stop
|
|
||||||
$tinc $c1 stop
|
|
|
@ -1,49 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Initialize one node
|
|
||||||
|
|
||||||
$tinc $c1 <<EOF
|
|
||||||
init foo
|
|
||||||
set DeviceType dummy
|
|
||||||
set Mode switch
|
|
||||||
set Broadcast no
|
|
||||||
set Address localhost
|
|
||||||
set Port 32758
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Generate an invitation offline and let another node join the VPN
|
|
||||||
|
|
||||||
invitation=`$tinc $c1 invite bar`
|
|
||||||
|
|
||||||
$tinc $c1 start $r1
|
|
||||||
|
|
||||||
$tinc $c2 join $invitation
|
|
||||||
|
|
||||||
# Test equivalence of host config files
|
|
||||||
|
|
||||||
cmp $d1/hosts/foo $d2/hosts/foo
|
|
||||||
test "`grep ^Ed25519PublicKey $d1/hosts/bar`" = "`grep ^Ed25519PublicKey $d2/hosts/bar`"
|
|
||||||
|
|
||||||
# Test Mode, Broadcast and ConnectTo statements
|
|
||||||
|
|
||||||
test `$tinc $c2 get Mode` = switch
|
|
||||||
test `$tinc $c2 get Broadcast` = no
|
|
||||||
test `$tinc $c2 get ConnectTo` = foo
|
|
||||||
|
|
||||||
# Check whether the new node can join the VPN
|
|
||||||
|
|
||||||
$tinc $c2 << EOF
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 0
|
|
||||||
start $r2
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
test `$tinc $c1 dump reachable nodes | wc -l` = 2
|
|
||||||
test `$tinc $c2 dump reachable nodes | wc -l` = 2
|
|
||||||
|
|
||||||
$tinc $c2 stop
|
|
||||||
$tinc $c1 stop
|
|
|
@ -1,51 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Initialize one node
|
|
||||||
|
|
||||||
$tinc $c1 <<EOF
|
|
||||||
init foo
|
|
||||||
set DeviceType dummy
|
|
||||||
set Address localhost
|
|
||||||
set Port 32756
|
|
||||||
start $r1
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Generate an invitation and let another node join the VPN
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
cat >$d1/invitation-created <<EOF
|
|
||||||
#!/bin/sh
|
|
||||||
echo Name = \$NODE >\$INVITATION_FILE
|
|
||||||
echo Ifconfig = 93.184.216.34/24 >>\$INVITATION_FILE
|
|
||||||
echo Route = 2606:2800:220:1::/64 2606:2800:220:1:248:1893:25c8:1946 >>\$INVITATION_FILE
|
|
||||||
echo Route = 1.2.3.4 1234:: >>\$INVITATION_FILE
|
|
||||||
$tinc $c1 export >>\$INVITATION_FILE
|
|
||||||
EOF
|
|
||||||
|
|
||||||
chmod u+x $d1/invitation-created
|
|
||||||
|
|
||||||
$tinc $c1 invite bar | $tinc $c2 --batch join
|
|
||||||
|
|
||||||
# Test equivalence of host config files
|
|
||||||
|
|
||||||
cmp $d1/hosts/foo $d2/hosts/foo
|
|
||||||
test "`grep ^Ed25519PublicKey $d1/hosts/bar`" = "`grep ^Ed25519PublicKey $d2/hosts/bar`"
|
|
||||||
|
|
||||||
# Check if the tinc-up.invitation file is created and contains the right commands
|
|
||||||
|
|
||||||
test -f $d2/tinc-up.invitation
|
|
||||||
|
|
||||||
fgrep -q "93.184.216.34/24" $d2/tinc-up.invitation
|
|
||||||
fgrep -q "2606:2800:220:1::/64" $d2/tinc-up.invitation
|
|
||||||
fgrep -q "2606:2800:220:1:248:1893:25c8:1946" $d2/tinc-up.invitation
|
|
||||||
fgrep -q "1234::" $d2/tinc-up.invitation && exit 1
|
|
||||||
|
|
||||||
# Check that no tinc-up is created and that tinc-up.invitation is not executable
|
|
||||||
|
|
||||||
test -x $d2/tinc-up.invitation && exit 1
|
|
||||||
test -f $d2/tinc-up && exit 1
|
|
||||||
|
|
||||||
$tinc $c1 stop
|
|
|
@ -1,79 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Initialize two nodes
|
|
||||||
|
|
||||||
$tinc $c1 <<EOF
|
|
||||||
init foo
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 32753
|
|
||||||
set Address localhost
|
|
||||||
set PingTimeout 1
|
|
||||||
EOF
|
|
||||||
|
|
||||||
$tinc $c2 <<EOF
|
|
||||||
init bar
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 0
|
|
||||||
set PingTimeout 1
|
|
||||||
set MaxTimeout 1
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Exchange host config files
|
|
||||||
|
|
||||||
$tinc $c1 export | $tinc $c2 exchange | $tinc $c1 import
|
|
||||||
$tinc $c2 add ConnectTo foo
|
|
||||||
|
|
||||||
# Foo 1.1, bar 1.0
|
|
||||||
|
|
||||||
$tinc $c2 set ExperimentalProtocol no
|
|
||||||
$tinc $c1 del bar.Ed25519PublicKey
|
|
||||||
$tinc $c2 del foo.Ed25519PublicKey
|
|
||||||
|
|
||||||
$tinc $c1 start $r1
|
|
||||||
$tinc $c2 start $r2
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
test `$tinc $c1 dump reachable nodes | wc -l` = 2
|
|
||||||
test `$tinc $c2 dump reachable nodes | wc -l` = 2
|
|
||||||
|
|
||||||
$tinc $c2 stop
|
|
||||||
$tinc $c1 stop
|
|
||||||
|
|
||||||
test -z "`$tinc $c1 get bar.Ed25519PublicKey`"
|
|
||||||
test -z "`$tinc $c2 get foo.Ed25519PublicKey`"
|
|
||||||
|
|
||||||
# Foo 1.1, bar upgrades to 1.1
|
|
||||||
|
|
||||||
$tinc $c2 del ExperimentalProtocol
|
|
||||||
|
|
||||||
$tinc $c1 start $r1
|
|
||||||
$tinc $c2 start $r2
|
|
||||||
|
|
||||||
sleep 5
|
|
||||||
|
|
||||||
test `$tinc $c1 dump reachable nodes | wc -l` = 2
|
|
||||||
test `$tinc $c2 dump reachable nodes | wc -l` = 2
|
|
||||||
|
|
||||||
$tinc $c2 stop
|
|
||||||
$tinc $c1 stop
|
|
||||||
|
|
||||||
test -n "`$tinc $c1 get bar.Ed25519PublicKey`"
|
|
||||||
test -n "`$tinc $c2 get foo.Ed25519PublicKey`"
|
|
||||||
|
|
||||||
# Bar downgrades, must no longer be allowed to connect
|
|
||||||
|
|
||||||
$tinc $c2 set ExperimentalProtocol no
|
|
||||||
|
|
||||||
$tinc $c1 start $r1
|
|
||||||
$tinc $c2 start $r2
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
test `$tinc $c1 dump reachable nodes | wc -l` = 1
|
|
||||||
test `$tinc $c2 dump reachable nodes | wc -l` = 1
|
|
||||||
|
|
||||||
$tinc $c2 stop
|
|
||||||
$tinc $c1 stop
|
|
|
@ -1,70 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Skip this test if we aren't root or if "ip netns" does not exist
|
|
||||||
|
|
||||||
test "`id -u`" = "0" || exit 77
|
|
||||||
ip netns list || exit 77
|
|
||||||
|
|
||||||
# Initialize two nodes
|
|
||||||
|
|
||||||
$tinc $c1 <<EOF
|
|
||||||
init foo
|
|
||||||
set Mode switch
|
|
||||||
set Interface ping.test1
|
|
||||||
set Port 32577
|
|
||||||
set Address localhost
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat >$d1/tinc-up <<EOF
|
|
||||||
#!/bin/sh
|
|
||||||
ip netns add ping.test1
|
|
||||||
ip link set dev \$INTERFACE netns ping.test1
|
|
||||||
ip netns exec ping.test1 ip addr add 192.168.1.1/24 dev \$INTERFACE
|
|
||||||
ip netns exec ping.test1 ip link set \$INTERFACE up
|
|
||||||
EOF
|
|
||||||
|
|
||||||
$tinc $c2 <<EOF
|
|
||||||
init bar
|
|
||||||
set Mode switch
|
|
||||||
set Interface ping.test2
|
|
||||||
set Port 32574
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat >$d2/tinc-up <<EOF
|
|
||||||
#!/bin/sh
|
|
||||||
ip netns add ping.test2
|
|
||||||
ip link set dev \$INTERFACE netns ping.test2
|
|
||||||
ip netns exec ping.test2 ip addr add 192.168.1.2/24 dev \$INTERFACE
|
|
||||||
ip netns exec ping.test2 ip link set \$INTERFACE up
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Exchange configuration files
|
|
||||||
|
|
||||||
$tinc $c1 export | $tinc $c2 exchange | $tinc $c1 import
|
|
||||||
|
|
||||||
# Start tinc
|
|
||||||
|
|
||||||
$tinc $c1 start $r1
|
|
||||||
$tinc $c2 start $r2
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
# The nodes should not be able to ping each other if there is no connection
|
|
||||||
|
|
||||||
ip netns exec ping.test1 ping -W1 -c3 192.168.1.2 && exit 1
|
|
||||||
|
|
||||||
# After connecting they should be
|
|
||||||
|
|
||||||
$tinc $c2 add ConnectTo foo
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
ip netns exec ping.test1 ping -W1 -c3 192.168.1.2
|
|
||||||
|
|
||||||
# Clean up
|
|
||||||
|
|
||||||
$tinc $c2 stop
|
|
||||||
$tinc $c1 stop
|
|
||||||
ip netns del ping.test2
|
|
||||||
ip netns del ping.test1
|
|
|
@ -1,112 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Initialize server node
|
|
||||||
|
|
||||||
$tinc $c1 <<EOF
|
|
||||||
init foo
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 32759
|
|
||||||
set Address 127.0.0.1
|
|
||||||
add Subnet 10.0.0.1
|
|
||||||
add Subnet fec0::/64
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Set up scripts
|
|
||||||
|
|
||||||
OUT=$d1/scripts.out
|
|
||||||
rm -f $OUT
|
|
||||||
|
|
||||||
for script in tinc-up tinc-down host-up host-down subnet-up subnet-down hosts/foo-up hosts/foo-down hosts/bar-up hosts/bar-down invitation-created invitation-accepted; do
|
|
||||||
cat >$d1/$script << EOF
|
|
||||||
#!/bin/sh
|
|
||||||
echo $script \$NETNAME,\$NAME,\$DEVICE,\$IFACE,\$NODE,\$REMOTEADDRESS,\$REMOTEPORT,\$SUBNET,\$WEIGHT,\$INVITATION_FILE,\$INVITATION_URL,\$DEBUG >>$OUT
|
|
||||||
EOF
|
|
||||||
chmod u+x $d1/$script
|
|
||||||
done
|
|
||||||
|
|
||||||
# Start server node
|
|
||||||
|
|
||||||
$tinc -n netname $c1 start $r1
|
|
||||||
|
|
||||||
echo foo-started >>$OUT
|
|
||||||
|
|
||||||
# Invite client node
|
|
||||||
|
|
||||||
url=`$tinc -n netname2 $c1 invite bar`
|
|
||||||
file=`cd $d1/invitations; ls | grep -v ed25519_key.priv`
|
|
||||||
echo bar-invited >>$OUT
|
|
||||||
$tinc -n netname3 $c2 join $url
|
|
||||||
echo bar-joined >>$OUT
|
|
||||||
|
|
||||||
# Start and stop client node
|
|
||||||
|
|
||||||
$tinc $c2 << EOF
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 32760
|
|
||||||
add Subnet 10.0.0.2
|
|
||||||
add Subnet fec0::/64#5
|
|
||||||
start $r2
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
echo bar-started >>$OUT
|
|
||||||
|
|
||||||
$tinc $c1 debug 4
|
|
||||||
$tinc $c2 stop
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
echo bar-stopped >>$OUT
|
|
||||||
|
|
||||||
$tinc $c1 debug 5
|
|
||||||
$tinc $c2 start $r2
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
echo bar-started >>$OUT
|
|
||||||
|
|
||||||
# Stop server node
|
|
||||||
|
|
||||||
$tinc $c1 stop
|
|
||||||
sleep 1
|
|
||||||
$tinc $c2 stop
|
|
||||||
|
|
||||||
# Check if the script output is what is expected
|
|
||||||
|
|
||||||
cat >$OUT.expected << EOF
|
|
||||||
tinc-up netname,foo,dummy,,,,,,,,,5
|
|
||||||
subnet-up netname,foo,dummy,,foo,,,10.0.0.1,,,,5
|
|
||||||
subnet-up netname,foo,dummy,,foo,,,fec0::/64,,,,5
|
|
||||||
foo-started
|
|
||||||
invitation-created netname2,foo,,,bar,,,,,$d1/invitations/$file,$url,
|
|
||||||
bar-invited
|
|
||||||
invitation-accepted netname,foo,dummy,,bar,127.0.0.1,,,,,,5
|
|
||||||
bar-joined
|
|
||||||
host-up netname,foo,dummy,,bar,127.0.0.1,32760,,,,,5
|
|
||||||
hosts/bar-up netname,foo,dummy,,bar,127.0.0.1,32760,,,,,5
|
|
||||||
subnet-up netname,foo,dummy,,bar,127.0.0.1,32760,10.0.0.2,,,,5
|
|
||||||
subnet-up netname,foo,dummy,,bar,127.0.0.1,32760,fec0::/64,5,,,5
|
|
||||||
bar-started
|
|
||||||
host-down netname,foo,dummy,,bar,127.0.0.1,32760,,,,,4
|
|
||||||
hosts/bar-down netname,foo,dummy,,bar,127.0.0.1,32760,,,,,4
|
|
||||||
subnet-down netname,foo,dummy,,bar,127.0.0.1,32760,10.0.0.2,,,,4
|
|
||||||
subnet-down netname,foo,dummy,,bar,127.0.0.1,32760,fec0::/64,5,,,4
|
|
||||||
bar-stopped
|
|
||||||
host-up netname,foo,dummy,,bar,127.0.0.1,32760,,,,,5
|
|
||||||
hosts/bar-up netname,foo,dummy,,bar,127.0.0.1,32760,,,,,5
|
|
||||||
subnet-up netname,foo,dummy,,bar,127.0.0.1,32760,10.0.0.2,,,,5
|
|
||||||
subnet-up netname,foo,dummy,,bar,127.0.0.1,32760,fec0::/64,5,,,5
|
|
||||||
bar-started
|
|
||||||
host-down netname,foo,dummy,,bar,127.0.0.1,32760,,,,,5
|
|
||||||
hosts/bar-down netname,foo,dummy,,bar,127.0.0.1,32760,,,,,5
|
|
||||||
subnet-down netname,foo,dummy,,bar,127.0.0.1,32760,10.0.0.2,,,,5
|
|
||||||
subnet-down netname,foo,dummy,,bar,127.0.0.1,32760,fec0::/64,5,,,5
|
|
||||||
subnet-down netname,foo,dummy,,foo,,,10.0.0.1,,,,5
|
|
||||||
subnet-down netname,foo,dummy,,foo,,,fec0::/64,,,,5
|
|
||||||
tinc-down netname,foo,dummy,,,,,,,,,5
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cmp $OUT $OUT.expected
|
|
|
@ -1,98 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Skip this test if tools are missing
|
|
||||||
|
|
||||||
which socket >/dev/null || exit 77
|
|
||||||
which timeout >/dev/null || exit 77
|
|
||||||
|
|
||||||
# Initialize two nodes
|
|
||||||
|
|
||||||
$tinc $c1 <<EOF
|
|
||||||
init foo
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 32754
|
|
||||||
set Address localhost
|
|
||||||
set PingTimeout 1
|
|
||||||
set AutoConnect no
|
|
||||||
EOF
|
|
||||||
|
|
||||||
$tinc $c2 <<EOF
|
|
||||||
init bar
|
|
||||||
set DeviceType dummy
|
|
||||||
set Port 32755
|
|
||||||
set PingTimeout 1
|
|
||||||
set MaxTimeout 1
|
|
||||||
set ExperimentalProtocol no
|
|
||||||
set AutoConnect no
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Exchange host config files
|
|
||||||
|
|
||||||
$tinc $c1 export | $tinc $c2 exchange | $tinc $c1 import
|
|
||||||
|
|
||||||
$tinc $c1 start $r1
|
|
||||||
$tinc $c2 start $r2
|
|
||||||
|
|
||||||
# No ID sent by responding node if we don't send an ID first, before the timeout
|
|
||||||
|
|
||||||
result=`(sleep 2; echo "0 bar 17.7") | timeout 3 socket localhost 32754` && exit 1
|
|
||||||
test $? = 124
|
|
||||||
test -z "$result"
|
|
||||||
|
|
||||||
# ID sent if initiator sends first, but still tarpitted
|
|
||||||
|
|
||||||
result=`echo "0 bar 17.7" | timeout 3 socket localhost 32754` && exit 1
|
|
||||||
test $? = 124
|
|
||||||
test "`echo "$result" | head -c 10`" = "0 foo 17.7"
|
|
||||||
|
|
||||||
# No invalid IDs allowed
|
|
||||||
|
|
||||||
result=`echo "0 foo 17.7" | timeout 1 socket localhost 32754` && exit 1
|
|
||||||
test $? = 124
|
|
||||||
test -z "$result"
|
|
||||||
|
|
||||||
result=`echo "0 baz 17.7" | timeout 1 socket localhost 32754` && exit 1
|
|
||||||
test $? = 124
|
|
||||||
test -z "$result"
|
|
||||||
|
|
||||||
# No NULL METAKEYs allowed
|
|
||||||
|
|
||||||
result=`printf "0 foo 17.0\n1 0 672 0 0 834188619F4D943FD0F4B1336F428BD4AC06171FEABA66BD2356BC9593F0ECD643F0E4B748C670D7750DFDE75DC9F1D8F65AB1026F5ED2A176466FBA4167CC567A2085ABD070C1545B180BDA86020E275EA9335F509C57786F4ED2378EFFF331869B856DDE1C05C461E4EECAF0E2FB97AF77B7BC2AD1B34C12992E45F5D1254BBF0C3FB224ABB3E8859594A83B6CA393ED81ECAC9221CE6BC71A727BCAD87DD80FC0834B87BADB5CB8FD3F08BEF90115A8DF1923D7CD9529729F27E1B8ABD83C4CF8818AE10257162E0057A658E265610B71F9BA4B365A20C70578FAC65B51B91100392171BA12A440A5E93C4AA62E0C9B6FC9B68F953514AAA7831B4B2C31C4\n" | timeout 3 socket localhost 32755` && exit 1
|
|
||||||
test $? = 124
|
|
||||||
test -z "$result" # Not even the ID should be sent when the first packet contains illegal data
|
|
||||||
|
|
||||||
# No splicing allowed
|
|
||||||
|
|
||||||
$tinc $c2 stop
|
|
||||||
$tinc $c2 del ExperimentalProtocol
|
|
||||||
$tinc $c2 start $r2
|
|
||||||
|
|
||||||
./splice foo localhost 32754 bar localhost 32755 17.7 &
|
|
||||||
sleep 3
|
|
||||||
test `$tinc $c1 dump reachable nodes | wc -l` = 1
|
|
||||||
test `$tinc $c2 dump reachable nodes | wc -l` = 1
|
|
||||||
kill $!
|
|
||||||
|
|
||||||
$tinc $c2 stop
|
|
||||||
$tinc $c1 stop
|
|
||||||
|
|
||||||
# Test splicing again with legacy protocol
|
|
||||||
|
|
||||||
$tinc $c1 set ExperimentalProtocol no
|
|
||||||
$tinc $c2 set ExperimentalProtocol no
|
|
||||||
|
|
||||||
$tinc $c1 start $r1
|
|
||||||
$tinc $c2 start $r2
|
|
||||||
|
|
||||||
./splice foo localhost 32754 bar localhost 32755 17.0 &
|
|
||||||
sleep 3
|
|
||||||
test `$tinc $c1 dump reachable nodes | wc -l` = 1
|
|
||||||
test `$tinc $c2 dump reachable nodes | wc -l` = 1
|
|
||||||
kill $!
|
|
||||||
|
|
||||||
# Clean up
|
|
||||||
|
|
||||||
$tinc $c2 stop
|
|
||||||
$tinc $c1 stop
|
|
144
test/splice.c
144
test/splice.c
|
@ -1,144 +0,0 @@
|
||||||
/*
|
|
||||||
splice.c -- Splice two outgoing tinc connections together
|
|
||||||
Copyright (C) 2018 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 <stdio.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_MINGW
|
|
||||||
extern const char *winerror(int);
|
|
||||||
#define strerror(x) ((x)>0?strerror(x):winerror(GetLastError()))
|
|
||||||
#define sockerrno WSAGetLastError()
|
|
||||||
#define sockstrerror(x) winerror(x)
|
|
||||||
#else
|
|
||||||
#define sockerrno errno
|
|
||||||
#define sockstrerror(x) strerror(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
if(argc < 7) {
|
|
||||||
fprintf(stderr, "Usage: %s name1 host1 port1 name2 host2 port2 [protocol]\n", argv[0]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *protocol;
|
|
||||||
|
|
||||||
if(argc >= 8) {
|
|
||||||
protocol = argv[7];
|
|
||||||
} else {
|
|
||||||
protocol = "17.7";
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_MINGW
|
|
||||||
static struct WSAData wsa_state;
|
|
||||||
|
|
||||||
if(WSAStartup(MAKEWORD(2, 2), &wsa_state)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
int sock[2];
|
|
||||||
char buf[1024];
|
|
||||||
|
|
||||||
struct addrinfo *ai, hint;
|
|
||||||
memset(&hint, 0, sizeof(hint));
|
|
||||||
|
|
||||||
hint.ai_family = AF_UNSPEC;
|
|
||||||
hint.ai_socktype = SOCK_STREAM;
|
|
||||||
hint.ai_protocol = IPPROTO_TCP;
|
|
||||||
hint.ai_flags = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
if(getaddrinfo(argv[2 + 3 * i], argv[3 + 3 * i], &hint, &ai) || !ai) {
|
|
||||||
fprintf(stderr, "getaddrinfo() failed: %s\n", sockstrerror(sockerrno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sock[i] = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
|
|
||||||
|
|
||||||
if(sock[i] == -1) {
|
|
||||||
fprintf(stderr, "Could not create socket: %s\n", sockstrerror(sockerrno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(connect(sock[i], ai->ai_addr, ai->ai_addrlen)) {
|
|
||||||
fprintf(stderr, "Could not connect to %s: %s\n", argv[i + 3 * i], sockstrerror(sockerrno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Connected to %s\n", argv[1 + 3 * i]);
|
|
||||||
|
|
||||||
/* Pretend to be the other one */
|
|
||||||
int len = snprintf(buf, sizeof buf, "0 %s %s\n", argv[4 - 3 * i], protocol);
|
|
||||||
if (send(sock[i], buf, len, 0) != len) {
|
|
||||||
fprintf(stderr, "Error sending data to %s: %s\n", argv[1 + 3 * i], sockstrerror(sockerrno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ignore the response */
|
|
||||||
do {
|
|
||||||
if (recv(sock[i], buf, 1, 0) != 1) {
|
|
||||||
fprintf(stderr, "Error reading data from %s: %s\n", argv[1 + 3 * i], sockstrerror(sockerrno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
} while(*buf != '\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Splicing...\n");
|
|
||||||
|
|
||||||
int nfds = (sock[0] > sock[1] ? sock[0] : sock[1]) + 1;
|
|
||||||
|
|
||||||
while(true) {
|
|
||||||
fd_set fds;
|
|
||||||
FD_ZERO(&fds);
|
|
||||||
FD_SET(sock[0], &fds);
|
|
||||||
FD_SET(sock[1], &fds);
|
|
||||||
|
|
||||||
if(select(nfds, &fds, NULL, NULL, NULL) <= 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int i = 0; i < 2; i++ ) {
|
|
||||||
if(FD_ISSET(sock[i], &fds)) {
|
|
||||||
ssize_t len = recv(sock[i], buf, sizeof buf, 0);
|
|
||||||
|
|
||||||
if(len < 0) {
|
|
||||||
fprintf(stderr, "Error while reading from %s: %s\n", argv[1 + i * 3], sockstrerror(sockerrno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(len == 0) {
|
|
||||||
fprintf(stderr, "Connection closed by %s\n", argv[1 + i * 3]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(send(sock[i ^ 1], buf, len, 0) != len) {
|
|
||||||
fprintf(stderr, "Error while writing to %s: %s\n", argv[4 - i * 3], sockstrerror(sockerrno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Skip this test if we did not compile sptps_test
|
|
||||||
|
|
||||||
test -e $sptps_test -a -e $sptps_keypair || exit 77
|
|
||||||
|
|
||||||
# Generate keys
|
|
||||||
|
|
||||||
mkdir -p $d1
|
|
||||||
|
|
||||||
$sptps_keypair $d1/server.priv $d1/server.pub
|
|
||||||
$sptps_keypair $d1/client.priv $d1/client.pub
|
|
||||||
|
|
||||||
# Test transfer of a simple file.
|
|
||||||
|
|
||||||
(sleep 1; $sptps_test -4 -q $d1/client.priv $d1/server.pub localhost 32750 <Makefile) &
|
|
||||||
$sptps_test -4 $d1/server.priv $d1/client.pub 32750 >$d1/out1
|
|
||||||
cmp $d1/out1 Makefile
|
|
||||||
|
|
||||||
$sptps_test -4 -q $d1/server.priv $d1/client.pub 32750 <Makefile &
|
|
||||||
sleep 1
|
|
||||||
$sptps_test -4 $d1/client.priv $d1/server.pub localhost 32750 > $d1/out2
|
|
||||||
cmp $d1/out2 Makefile
|
|
||||||
|
|
||||||
# Datagram mode
|
|
||||||
|
|
||||||
$sptps_test -4 -dq $d1/server.priv $d1/client.pub 32750 <Makefile &
|
|
||||||
sleep 1
|
|
||||||
sleep 1 | $sptps_test -4 -dq $d1/client.priv $d1/server.pub localhost 32750 >$d1/out3
|
|
||||||
cmp $d1/out3 Makefile
|
|
|
@ -1,41 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Paths to executables
|
|
||||||
|
|
||||||
tincd=../src/tincd
|
|
||||||
tinc=../src/tinc
|
|
||||||
sptps_test=../src/sptps_test
|
|
||||||
sptps_keypair=../src/sptps_keypair
|
|
||||||
|
|
||||||
# Test directories
|
|
||||||
|
|
||||||
scriptname=`basename $0`
|
|
||||||
d1=$PWD/$scriptname.1
|
|
||||||
d2=$PWD/$scriptname.2
|
|
||||||
d3=$PWD/$scriptname.3
|
|
||||||
|
|
||||||
# Default arguments for both tinc and tincd
|
|
||||||
|
|
||||||
c1="--config=$d1 --pidfile=$d1/pid"
|
|
||||||
c2="--config=$d2 --pidfile=$d2/pid"
|
|
||||||
c3="--config=$d3 --pidfile=$d3/pid"
|
|
||||||
|
|
||||||
# Arguments when running tincd
|
|
||||||
|
|
||||||
r1="--logfile=$d1/log -d5"
|
|
||||||
r2="--logfile=$d2/log -d5"
|
|
||||||
r3="--logfile=$d3/log -d5"
|
|
||||||
|
|
||||||
# Check for leftover tinc daemons
|
|
||||||
|
|
||||||
[ -f $d1/pid ] && $tinc $c1 stop
|
|
||||||
[ -f $d2/pid ] && $tinc $c2 stop
|
|
||||||
[ -f $d3/pid ] && $tinc $c3 stop
|
|
||||||
|
|
||||||
# Remove test directories
|
|
||||||
|
|
||||||
rm -rf $d1 $d2 $d3
|
|
||||||
|
|
||||||
# Exit on errors, log all commands being executed
|
|
||||||
|
|
||||||
set -ex
|
|
|
@ -1,86 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. "${0%/*}/testlib.sh"
|
|
||||||
|
|
||||||
# Initialize one node
|
|
||||||
|
|
||||||
$tinc $c1 init foo
|
|
||||||
test "`$tinc $c1 get Name`" = "foo"
|
|
||||||
|
|
||||||
# Test case sensitivity
|
|
||||||
|
|
||||||
$tinc $c1 set Mode switch
|
|
||||||
test "`$tinc $c1 get Mode`" = "switch"
|
|
||||||
test "`$tinc $c1 get mode`" = "switch"
|
|
||||||
$tinc $c1 set mode router
|
|
||||||
test "`$tinc $c1 get Mode`" = "router"
|
|
||||||
test "`$tinc $c1 get mode`" = "router"
|
|
||||||
$tinc $c1 set Mode Switch
|
|
||||||
test "`$tinc $c1 get Mode`" = "Switch"
|
|
||||||
|
|
||||||
# Test deletion
|
|
||||||
|
|
||||||
$tinc $c1 del Mode hub && exit 1 || true
|
|
||||||
$tinc $c1 del Mode switch
|
|
||||||
test -z "`$tinc $c1 get Mode`"
|
|
||||||
|
|
||||||
# There can only be one Mode variable
|
|
||||||
|
|
||||||
$tinc $c1 add Mode switch
|
|
||||||
$tinc $c1 add Mode hub
|
|
||||||
test "`$tinc $c1 get Mode`" = "hub"
|
|
||||||
|
|
||||||
# Test addition/deletion of multivalued variables
|
|
||||||
|
|
||||||
$tinc $c1 add Subnet 1
|
|
||||||
$tinc $c1 add Subnet 2
|
|
||||||
$tinc $c1 add Subnet 2
|
|
||||||
$tinc $c1 add Subnet 3
|
|
||||||
test "`$tinc $c1 get Subnet`" = "1
|
|
||||||
2
|
|
||||||
3"
|
|
||||||
$tinc $c1 del Subnet 2
|
|
||||||
test "`$tinc $c1 get Subnet`" = "1
|
|
||||||
3"
|
|
||||||
$tinc $c1 del Subnet
|
|
||||||
test -z "`$tinc $c1 get Subnet`"
|
|
||||||
|
|
||||||
# We should not be able to get/set server variables using node.variable syntax
|
|
||||||
|
|
||||||
test -z "`$tinc $c1 get foo.Name`"
|
|
||||||
$tinc $c1 set foo.Name bar && exit 1 || true
|
|
||||||
|
|
||||||
# Test getting/setting host variables for other nodes
|
|
||||||
|
|
||||||
touch $d1/hosts/bar
|
|
||||||
|
|
||||||
$tinc $c1 add bar.PMTU 1
|
|
||||||
$tinc $c1 add bar.PMTU 2
|
|
||||||
test "`$tinc $c1 get bar.PMTU`" = "2"
|
|
||||||
|
|
||||||
$tinc $c1 add bar.Subnet 1
|
|
||||||
$tinc $c1 add bar.Subnet 2
|
|
||||||
$tinc $c1 add bar.Subnet 2
|
|
||||||
$tinc $c1 add bar.Subnet 3
|
|
||||||
test "`$tinc $c1 get bar.Subnet`" = "1
|
|
||||||
2
|
|
||||||
3"
|
|
||||||
$tinc $c1 del bar.Subnet 2
|
|
||||||
test "`$tinc $c1 get bar.Subnet`" = "1
|
|
||||||
3"
|
|
||||||
$tinc $c1 del bar.Subnet
|
|
||||||
test -z "`$tinc $c1 get bar.Subnet`"
|
|
||||||
|
|
||||||
# We should not be able to get/set for nodes with invalid names
|
|
||||||
|
|
||||||
touch $d1/hosts/qu-ux
|
|
||||||
|
|
||||||
$tinc $c1 set qu-ux.Subnet 1 && exit 1 || true
|
|
||||||
|
|
||||||
# We should not be able to set obsolete variables unless forced
|
|
||||||
|
|
||||||
$tinc $c1 set PrivateKey 12345 && exit 1 || true
|
|
||||||
$tinc $c1 --force set PrivateKey 12345
|
|
||||||
test "`$tinc $c1 get PrivateKey`" = "12345"
|
|
||||||
$tinc $c1 del PrivateKey
|
|
||||||
test -z "`$tinc $c1 get PrivateKey`"
|
|
Loading…
Reference in a new issue