diff -Nru gvpe-3.0/aclocal.m4 gvpe-3.1/aclocal.m4 --- gvpe-3.0/aclocal.m4 2016-11-10 14:40:18.000000000 +0000 +++ gvpe-3.1/aclocal.m4 2018-10-25 07:30:09.000000000 +0000 @@ -2829,53 +2829,279 @@ AC_SUBST(HAVE_TUNTAP) ]) -dnl Check to find the OpenSSL headers/libraries +dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +dnl serial 11 (pkg-config-0.29) +dnl +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl -AC_DEFUN([tinc_OPENSSL], -[ - tinc_ac_save_CPPFLAGS="$CPPFLAGS" - - AC_ARG_WITH(openssl-include, - [ --with-openssl-include=DIR OpenSSL headers directory (without trailing /openssl)], - [openssl_include="$withval" - CFLAGS="$CFLAGS -I$withval" - CPPFLAGS="$CPPFLAGS -I$withval"] - ) - - AC_ARG_WITH(openssl-lib, - [ --with-openssl-lib=DIR OpenSSL library directory], - [openssl_lib="$withval" - LIBS="$LIBS -L$withval"] - ) - - AC_CHECK_HEADERS(openssl/evp.h openssl/rsa.h openssl/rand.h openssl/err.h openssl/sha.h openssl/pem.h, - [], - [AC_MSG_ERROR([OpenSSL header files not found.]); break] - ) - - CPPFLAGS="$tinc_ac_save_CPPFLAGS" - - AC_CHECK_LIB(crypto, SHA1_Init, - [LIBS="$LIBS -lcrypto"], - [AC_MSG_ERROR([OpenSSL libraries not found.])] - ) - - AC_CHECK_FUNCS([RAND_pseudo_bytes OPENSSL_add_all_algorithms_noconf OpenSSL_add_all_algorithms SSLeay_add_all_algorithms]) - - AC_CHECK_FUNC(dlopen, - [], - [AC_CHECK_LIB(dl, dlopen, - [LIBS="$LIBS -ldl"], - [AC_MSG_ERROR([OpenSSL depends on libdl.])] - )] - ) - - AC_CHECK_FUNC(inflate, - [], - [AC_CHECK_LIB(z, inflate, - [LIBS="$LIBS -lz"], - [AC_MSG_ERROR([OpenSSL depends on libz.])] - )] - ) -]) +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR diff -Nru gvpe-3.0/compile gvpe-3.1/compile --- gvpe-3.0/compile 1970-01-01 00:00:00.000000000 +0000 +++ gvpe-3.1/compile 2017-01-25 18:15:10.000000000 +0000 @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# 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, 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff -Nru gvpe-3.0/config.guess gvpe-3.1/config.guess --- gvpe-3.0/config.guess 2014-09-12 23:10:20.000000000 +0000 +++ gvpe-3.1/config.guess 2016-08-20 12:34:31.000000000 +0000 @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2014 Free Software Foundation, Inc. +# Copyright 1992-2016 Free Software Foundation, Inc. -timestamp='2014-03-23' +timestamp='2016-10-02' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -24,12 +24,12 @@ # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # -# Originally written by Per Bothner. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # -# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` @@ -50,7 +50,7 @@ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2014 Free Software Foundation, Inc. +Copyright 1992-2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -168,19 +168,29 @@ # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || \ + echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. + # to ELF recently (or will in the future) and ABI. case "${UNAME_MACHINE_ARCH}" in + earm*) + os=netbsdelf + ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ @@ -197,6 +207,13 @@ os=netbsd ;; esac + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need @@ -207,13 +224,13 @@ release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" + echo "${machine}-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` @@ -223,6 +240,10 @@ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} + exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; @@ -235,6 +256,9 @@ *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; + *:Sortix:*:*) + echo ${UNAME_MACHINE}-unknown-sortix + exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) @@ -251,42 +275,42 @@ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 @@ -359,16 +383,16 @@ exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build - SUN_ARCH="i386" + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` @@ -393,7 +417,7 @@ exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} @@ -579,8 +603,9 @@ else IBM_ARCH=powerpc fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi @@ -617,13 +642,13 @@ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi @@ -662,11 +687,11 @@ exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if [ ${HP_ARCH} = hppa2.0w ] then eval $set_cc_for_build @@ -679,12 +704,12 @@ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} @@ -789,14 +814,14 @@ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) @@ -878,7 +903,7 @@ exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix @@ -901,7 +926,7 @@ EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) @@ -932,6 +957,9 @@ crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; @@ -944,6 +972,9 @@ ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; + k1om:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; @@ -969,6 +1000,9 @@ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; + mips64el:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; @@ -1001,6 +1035,9 @@ ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; @@ -1020,7 +1057,7 @@ echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} @@ -1099,7 +1136,7 @@ # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1248,6 +1285,9 @@ SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux${UNAME_RELEASE} + exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; @@ -1261,9 +1301,9 @@ UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in @@ -1285,7 +1325,7 @@ exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi @@ -1316,7 +1356,7 @@ # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" @@ -1358,7 +1398,7 @@ echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos @@ -1369,23 +1409,25 @@ x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; esac cat >&2 < in order to provide the needed -information to handle your system. +If $0 has already been updated, send the following data and any +information you think might be pertinent to config-patches@gnu.org to +provide the necessary information to handle your system. config.guess timestamp = $timestamp diff -Nru gvpe-3.0/config.h.in gvpe-3.1/config.h.in --- gvpe-3.0/config.h.in 2016-06-30 10:43:16.000000000 +0000 +++ gvpe-3.1/config.h.in 2018-10-25 03:33:12.000000000 +0000 @@ -174,31 +174,6 @@ /* OpenBSD */ #undef HAVE_OPENBSD -/* Define to 1 if you have the `OpenSSL_add_all_algorithms' function. */ -#undef HAVE_OPENSSL_ADD_ALL_ALGORITHMS - -/* Define to 1 if you have the `OPENSSL_add_all_algorithms_noconf' function. - */ -#undef HAVE_OPENSSL_ADD_ALL_ALGORITHMS_NOCONF - -/* Define to 1 if you have the header file. */ -#undef HAVE_OPENSSL_ERR_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_OPENSSL_EVP_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_OPENSSL_PEM_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_OPENSSL_RAND_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_OPENSSL_RSA_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_OPENSSL_SHA_H - /* Define to 1 if you have the `poll' function. */ #undef HAVE_POLL @@ -214,9 +189,6 @@ /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV -/* Define to 1 if you have the `RAND_pseudo_bytes' function. */ -#undef HAVE_RAND_PSEUDO_BYTES - /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT @@ -229,9 +201,6 @@ /* Solaris/SunOS */ #undef HAVE_SOLARIS -/* Define to 1 if you have the `SSLeay_add_all_algorithms' function. */ -#undef HAVE_SSLEAY_ADD_ALL_ALGORITHMS - /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H diff -Nru gvpe-3.0/config.sub gvpe-3.1/config.sub --- gvpe-3.0/config.sub 2014-09-12 23:10:20.000000000 +0000 +++ gvpe-3.1/config.sub 2016-08-20 12:34:31.000000000 +0000 @@ -1,8 +1,8 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2014 Free Software Foundation, Inc. +# Copyright 1992-2016 Free Software Foundation, Inc. -timestamp='2014-09-11' +timestamp='2016-11-04' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ # of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -33,7 +33,7 @@ # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -53,8 +53,7 @@ me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. @@ -68,7 +67,7 @@ version="\ GNU config.sub ($timestamp) -Copyright 1992-2014 Free Software Foundation, Inc. +Copyright 1992-2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -117,8 +116,8 @@ case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` @@ -255,12 +254,13 @@ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ + | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ @@ -301,11 +301,12 @@ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ @@ -313,6 +314,7 @@ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) @@ -327,6 +329,9 @@ c6x) basic_machine=tic6x-unknown ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none @@ -372,12 +377,13 @@ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ + | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ + | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ @@ -423,13 +429,15 @@ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ | pyramid-* \ + | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ @@ -437,6 +445,7 @@ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ + | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ @@ -513,6 +522,9 @@ basic_machine=i386-pc os=-aros ;; + asmjs) + basic_machine=asmjs-unknown + ;; aux) basic_machine=m68k-apple os=-aux @@ -633,6 +645,14 @@ basic_machine=m68k-bull os=-sysv3 ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + os=$os"spe" + ;; ebmon29k) basic_machine=a29k-amd os=-ebmon @@ -774,6 +794,9 @@ basic_machine=m68k-isi os=-sysv ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; m68knommu) basic_machine=m68k-unknown os=-linux @@ -1009,7 +1032,7 @@ ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - ppcle | powerpclittle | ppc-le | powerpc-little) + ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) @@ -1019,7 +1042,7 @@ ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) + ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) @@ -1365,18 +1388,18 @@ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -bitrig* | -openbsd* | -solidbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ @@ -1385,7 +1408,8 @@ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1517,6 +1541,8 @@ ;; -nacl*) ;; + -ios) + ;; -none) ;; *) diff -Nru gvpe-3.0/configure gvpe-3.1/configure --- gvpe-3.0/configure 2016-11-10 14:40:18.000000000 +0000 +++ gvpe-3.1/configure 2018-10-25 07:30:09.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69. +# Generated by GNU Autoconf 2.69 for gvpe 3.1. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -575,12 +575,12 @@ MAKEFLAGS= # Identity of this package. -PACKAGE_NAME= -PACKAGE_TARNAME= -PACKAGE_VERSION= -PACKAGE_STRING= -PACKAGE_BUGREPORT= -PACKAGE_URL= +PACKAGE_NAME='gvpe' +PACKAGE_TARNAME='gvpe' +PACKAGE_VERSION='3.1' +PACKAGE_STRING='gvpe 3.1' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' ac_unique_file="src/gvpe.C" # Factoring default headers for most tests. @@ -621,10 +621,15 @@ ac_subst_vars='LTLIBOBJS LIBOBJS -INCLUDES +AM_CPPFLAGS ROHC_FALSE ROHC_TRUE LDFLAGS_DAEMON +LIBCRYPTO_LIBS +LIBCRYPTO_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG HAVE_TUNTAP LINUX_IF_TUN_H ALLOCA @@ -754,8 +759,6 @@ with_libintl_prefix enable_iftype with_kernel -with_openssl_include -with_openssl_lib enable_threads enable_static_daemon enable_icmp @@ -782,7 +785,12 @@ CXX CXXFLAGS CCC -CXXCPP' +CXXCPP +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +LIBCRYPTO_CFLAGS +LIBCRYPTO_LIBS' # Initialize some variables set by options. @@ -824,7 +832,7 @@ runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE}' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' @@ -1333,7 +1341,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures this package to adapt to many kinds of systems. +\`configure' configures gvpe 3.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1382,7 +1390,7 @@ --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --docdir=DIR documentation root [DATAROOTDIR/doc/gvpe] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] @@ -1404,7 +1412,9 @@ fi if test -n "$ac_init_help"; then - + case $ac_init_help in + short | recursive ) echo "Configuration of gvpe 3.1:";; + esac cat <<\_ACEOF Optional Features: @@ -1465,8 +1475,6 @@ --without-libintl-prefix don't search for libintl in includedir and libdir --with-kernel=dir give the directory with kernel sources (default: /usr/src/linux) - --with-openssl-include=DIR OpenSSL headers directory (without trailing /openssl) - --with-openssl-lib=DIR OpenSSL library directory Some influential environment variables: CC C compiler command @@ -1480,6 +1488,15 @@ CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + LIBCRYPTO_CFLAGS + C compiler flags for LIBCRYPTO, overriding pkg-config + LIBCRYPTO_LIBS + linker flags for LIBCRYPTO, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -1547,7 +1564,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -configure +gvpe configure 3.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2212,78 +2229,11 @@ as_fn_set_status $ac_retval } # ac_fn_cxx_try_link - -# ac_fn_cxx_check_func LINENO FUNC VAR -# ------------------------------------ -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_cxx_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_cxx_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by $as_me, which was +It was created by gvpe $as_me 3.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3027,8 +2977,8 @@ # Define the identity of the package. - PACKAGE=gvpe - VERSION=3.0 + PACKAGE='gvpe' + VERSION='3.1' cat >>confdefs.h <<_ACEOF @@ -8087,207 +8037,215 @@ - tinc_ac_save_CPPFLAGS="$CPPFLAGS" -# Check whether --with-openssl-include was given. -if test "${with_openssl_include+set}" = set; then : - withval=$with_openssl_include; openssl_include="$withval" - CFLAGS="$CFLAGS -I$withval" - CPPFLAGS="$CPPFLAGS -I$withval" -fi -# Check whether --with-openssl-lib was given. -if test "${with_openssl_lib+set}" = set; then : - withval=$with_openssl_lib; openssl_lib="$withval" - LIBS="$LIBS -L$withval" +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + ;; +esac fi - - - for ac_header in openssl/evp.h openssl/rsa.h openssl/rand.h openssl/err.h openssl/sha.h openssl/pem.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } else - as_fn_error $? "OpenSSL header files not found." "$LINENO" 5; break - + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -done - - - CPPFLAGS="$tinc_ac_save_CPPFLAGS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SHA1_Init in -lcrypto" >&5 -$as_echo_n "checking for SHA1_Init in -lcrypto... " >&6; } -if ${ac_cv_lib_crypto_SHA1_Init+:} false; then : +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lcrypto $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char SHA1_Init (); -int -main () -{ -return SHA1_Init (); - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - ac_cv_lib_crypto_SHA1_Init=yes -else - ac_cv_lib_crypto_SHA1_Init=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS + ;; +esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_SHA1_Init" >&5 -$as_echo "$ac_cv_lib_crypto_SHA1_Init" >&6; } -if test "x$ac_cv_lib_crypto_SHA1_Init" = xyes; then : - LIBS="$LIBS -lcrypto" +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } else - as_fn_error $? "OpenSSL libraries not found." "$LINENO" 5 - -fi - - - for ac_func in RAND_pseudo_bytes OPENSSL_add_all_algorithms_noconf OpenSSL_add_all_algorithms SSLeay_add_all_algorithms -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -done - - ac_fn_cxx_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - LIBS="$LIBS -ldl" -else - as_fn_error $? "OpenSSL depends on libdl." "$LINENO" 5 +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBCRYPTO" >&5 +$as_echo_n "checking for LIBCRYPTO... " >&6; } + +if test -n "$LIBCRYPTO_CFLAGS"; then + pkg_cv_LIBCRYPTO_CFLAGS="$LIBCRYPTO_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcrypto >= 1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libcrypto >= 1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBCRYPTO_CFLAGS=`$PKG_CONFIG --cflags "libcrypto >= 1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBCRYPTO_LIBS"; then + pkg_cv_LIBCRYPTO_LIBS="$LIBCRYPTO_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcrypto >= 1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libcrypto >= 1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBCRYPTO_LIBS=`$PKG_CONFIG --libs "libcrypto >= 1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes fi - - + else + pkg_failed=untried fi - ac_fn_cxx_check_func "$LINENO" "inflate" "ac_cv_func_inflate" -if test "x$ac_cv_func_inflate" = xyes; then : -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 -$as_echo_n "checking for inflate in -lz... " >&6; } -if ${ac_cv_lib_z_inflate+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lz $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char inflate (); -int -main () -{ -return inflate (); - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - ac_cv_lib_z_inflate=yes +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes else - ac_cv_lib_z_inflate=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS + _pkg_short_errors_supported=no fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5 -$as_echo "$ac_cv_lib_z_inflate" >&6; } -if test "x$ac_cv_lib_z_inflate" = xyes; then : - LIBS="$LIBS -lz" -else - as_fn_error $? "OpenSSL depends on libz." "$LINENO" 5 + if test $_pkg_short_errors_supported = yes; then + LIBCRYPTO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libcrypto >= 1" 2>&1` + else + LIBCRYPTO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libcrypto >= 1" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBCRYPTO_PKG_ERRORS" >&5 -fi + as_fn_error $? "Package requirements (libcrypto >= 1) were not met: +$LIBCRYPTO_PKG_ERRORS -fi +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. +Alternatively, you may set the environment variables LIBCRYPTO_CFLAGS +and LIBCRYPTO_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables LIBCRYPTO_CFLAGS +and LIBCRYPTO_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + LIBCRYPTO_CFLAGS=$pkg_cv_LIBCRYPTO_CFLAGS + LIBCRYPTO_LIBS=$pkg_cv_LIBCRYPTO_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } -if test "x$openssl_include" != x; then - CXXFLAGS="$CXXFLAGS -I$openssl_include" fi # Check whether --enable-threads was given. @@ -9110,7 +9068,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by $as_me, which was +This file was extended by gvpe $as_me 3.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -9176,7 +9134,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -config.status +gvpe config.status 3.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -10156,4 +10114,37 @@ echo "***" echo +if pkg-config --exists 'libcrypto >= 1.1 libcrypto < 2.0'; then + cat <= 1]) AC_ARG_ENABLE(threads, [AS_HELP_STRING(--enable-threads,try to use threads for long-running asynchronous operations (default enabled).)], @@ -417,7 +413,7 @@ dnl LDFLAGS="$LDFLAGS -Wl,--gc-sections" dnl fi -AC_SUBST(INCLUDES) +AC_SUBST(AM_CPPFLAGS) AC_CONFIG_FILES([Makefile po/Makefile.in src/Makefile @@ -451,4 +447,37 @@ echo "***" echo +if pkg-config --exists 'libcrypto >= 1.1 libcrypto < 2.0'; then + cat < Sat, 27 Oct 2018 13:13:31 +0900 + +gvpe (3.1-1) unstable; urgency=medium + + * New upstream version 3.1 + * debian/patches/*: Drop openssl1.1 patches. + * Bump Stanrads-Version to 4.2.1 + + -- TANIGUCHI Takaki Fri, 26 Oct 2018 11:43:08 +0900 + gvpe (3.0-2) unstable; urgency=medium [ Unit 193 ] diff -Nru gvpe-3.0/debian/control gvpe-3.1/debian/control --- gvpe-3.0/debian/control 2018-05-13 01:28:55.000000000 +0000 +++ gvpe-3.1/debian/control 2018-10-27 04:13:31.000000000 +0000 @@ -4,9 +4,10 @@ Maintainer: TANIGUCHI Takaki Build-Depends: debhelper (>= 11), libssl-dev, + pkg-config, texinfo, zlib1g-dev -Standards-Version: 4.1.4 +Standards-Version: 4.2.1 Homepage: http://software.schmorp.de/pkg/gvpe.html Vcs-Git: https://salsa.debian.org/debian/gvpe.git Vcs-Browser: https://salsa.debian.org/debian/gvpe diff -Nru gvpe-3.0/debian/copyright gvpe-3.1/debian/copyright --- gvpe-3.0/debian/copyright 2018-05-13 01:28:55.000000000 +0000 +++ gvpe-3.1/debian/copyright 2018-10-27 04:13:31.000000000 +0000 @@ -27,7 +27,7 @@ 2003,2007,2008,2009 Marc Lehmann License: GPL-2.0+ -Files: lib/getopt.c lib/getopt.h lib/getopt1.c lib/gettext.h +Files: lib/getopt1.c lib/gettext.h Copyright: Free Software Foundation, Inc. License: GPL-2.0+ @@ -77,7 +77,7 @@ 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, see . + along with this program. If not, see . . On Debian systems, the complete text of the GNU General Public License version 3 can be found in "/usr/share/common-licenses/GPL-2". @@ -94,7 +94,7 @@ 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, see . + along with this program. If not, see . . On Debian systems, the complete text of the GNU General Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". diff -Nru gvpe-3.0/debian/gvpe.default gvpe-3.1/debian/gvpe.default --- gvpe-3.0/debian/gvpe.default 2018-05-13 01:28:55.000000000 +0000 +++ gvpe-3.1/debian/gvpe.default 2018-10-27 04:13:31.000000000 +0000 @@ -7,5 +7,4 @@ # # Additional options that are passed to the Daemon. -START_DAEMON="0" # DAEMON_ARGS="" diff -Nru gvpe-3.0/debian/init.d gvpe-3.1/debian/init.d --- gvpe-3.0/debian/init.d 2018-05-13 01:28:55.000000000 +0000 +++ gvpe-3.1/debian/init.d 2018-10-27 04:13:31.000000000 +0000 @@ -38,10 +38,6 @@ # do_start() { - if [ "$START_DAEMON" != 1 ]; then - echo -n "(not starting - disbled in /etc/default/gvpe)" - return 0 - fi # Return # 0 if daemon has been started # 1 if daemon was already running diff -Nru gvpe-3.0/debian/patches/bundled_lib.patch gvpe-3.1/debian/patches/bundled_lib.patch --- gvpe-3.0/debian/patches/bundled_lib.patch 2018-05-13 01:28:55.000000000 +0000 +++ gvpe-3.1/debian/patches/bundled_lib.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,1207 +0,0 @@ -Description: Don't include local copies of getopt, causes FTBFS. -Author: Unit 193 -Bug-Debian: https://bugs.debian.org/887662 - -Origin: vendor -Last-Update: 2018-02-11 - ---- gvpe-3.0.orig/lib/Makefile.am 2018-02-11 05:26:10.000000000 +0000 -+++ gvpe-3.0/lib/Makefile.am 2018-02-11 05:35:01.087130864 +0000 -@@ -2,10 +2,10 @@ - - INCLUDES = @INCLUDES@ -I. -I$(top_builddir) - --libgvpe_a_SOURCES = pidfile.c getopt.c getopt1.c dropin.c -+libgvpe_a_SOURCES = pidfile.c getopt1.c dropin.c - - libgvpe_a_LIBADD = @LIBOBJS@ @ALLOCA@ - libgvpe_a_DEPENDENCIES = $(libgvpe_a_LIBADD) - --noinst_HEADERS = pidfile.h getopt.h dropin.h gettext.h -+noinst_HEADERS = pidfile.h dropin.h gettext.h - ---- gvpe-3.0.orig/lib/getopt.c -+++ /dev/null -@@ -1,1046 +0,0 @@ --/* Getopt for GNU. -- NOTE: getopt is now part of the C library, so if you don't know what -- "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu -- before changing it! -- -- Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 -- Free Software Foundation, Inc. -- --NOTE: The canonical source of this file is maintained with the GNU C Library. --Bugs can be reported to bug-glibc@prep.ai.mit.edu. -- --This file is part of GVPE. -- -- GVPE 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, 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 gvpe; if not, write to the Free Software --Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA --*/ -- --/* This tells Alpha OSF/1 not to define a getopt prototype in . -- Ditto for AIX 3.2 and . */ --#ifndef _NO_PROTO --#define _NO_PROTO --#endif -- --#ifdef HAVE_CONFIG_H --#include --#endif -- --#if !defined (__STDC__) || !__STDC__ --/* This is a separate conditional since some stdc systems -- reject `defined (const)'. */ --#ifndef const --#define const --#endif --#endif -- --#include -- --/* Comment out all this code if we are using the GNU C Library, and are not -- actually compiling the library itself. This code is part of the GNU C -- Library, but also included in many other GNU distributions. Compiling -- and linking in this code is a waste when using the GNU C library -- (especially if it is a shared library). Rather than having every GNU -- program understand `configure --with-gnu-libc' and omit the object files, -- it is simpler to just do this in the source for each such file. */ -- --#define GETOPT_INTERFACE_VERSION 2 --#if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2 --#include --#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION --#define ELIDE_CODE --#endif --#endif -- --#ifndef ELIDE_CODE -- -- --/* This needs to come after some library #include -- to get __GNU_LIBRARY__ defined. */ --#ifdef __GNU_LIBRARY__ --/* Don't include stdlib.h for non-GNU C libraries because some of them -- contain conflicting prototypes for getopt. */ --#include --#include --#endif /* GNU C library. */ -- --#ifdef VMS --#include --#if HAVE_STRING_H - 0 --#include --#endif --#endif -- --#if defined (WIN32) && !defined (__CYGWIN32__) --/* It's not Unix, really. See? Capital letters. */ --#include --#define getpid() GetCurrentProcessId() --#endif -- --#include "gettext.h" -- --/* This version of `getopt' appears to the caller like standard Unix `getopt' -- but it behaves differently for the user, since it allows the user -- to intersperse the options with the other arguments. -- -- As `getopt' works, it permutes the elements of ARGV so that, -- when it is done, all the options precede everything else. Thus -- all application programs are extended to handle flexible argument order. -- -- Setting the environment variable POSIXLY_CORRECT disables permutation. -- Then the behavior is completely standard. -- -- GNU application programs can use a third alternative mode in which -- they can distinguish the relative order of options and other arguments. */ -- --#include "getopt.h" -- --/* For communication from `getopt' to the caller. -- When `getopt' finds an option that takes an argument, -- the argument value is returned here. -- Also, when `ordering' is RETURN_IN_ORDER, -- each non-option ARGV-element is returned here. */ -- --char *optarg = NULL; -- --/* Index in ARGV of the next element to be scanned. -- This is used for communication to and from the caller -- and for communication between successive calls to `getopt'. -- -- On entry to `getopt', zero means this is the first call; initialize. -- -- When `getopt' returns -1, this is the index of the first of the -- non-option elements that the caller should itself scan. -- -- Otherwise, `optind' communicates from one call to the next -- how much of ARGV has been scanned so far. */ -- --/* 1003.2 says this must be 1 before any call. */ --int optind = 1; -- --/* Formerly, initialization of getopt depended on optind==0, which -- causes problems with re-calling getopt as programs generally don't -- know that. */ -- --int __getopt_initialized = 0; -- --/* The next char to be scanned in the option-element -- in which the last option character we returned was found. -- This allows us to pick up the scan where we left off. -- -- If this is zero, or a null string, it means resume the scan -- by advancing to the next ARGV-element. */ -- --static char *nextchar; -- --/* Callers store zero here to inhibit the error message -- for unrecognized options. */ -- --int opterr = 1; -- --/* Set to an option character which was unrecognized. -- This must be initialized on some systems to avoid linking in the -- system's own getopt implementation. */ -- --int optopt = '?'; -- --/* Describe how to deal with options that follow non-option ARGV-elements. -- -- If the caller did not specify anything, -- the default is REQUIRE_ORDER if the environment variable -- POSIXLY_CORRECT is defined, PERMUTE otherwise. -- -- REQUIRE_ORDER means don't recognize them as options; -- stop option processing when the first non-option is seen. -- This is what Unix does. -- This mode of operation is selected by either setting the environment -- variable POSIXLY_CORRECT, or using `+' as the first character -- of the list of option characters. -- -- PERMUTE is the default. We permute the contents of ARGV as we scan, -- so that eventually all the non-options are at the end. This allows options -- to be given in any order, even with programs that were not written to -- expect this. -- -- RETURN_IN_ORDER is an option available to programs that were written -- to expect options and other ARGV-elements in any order and that care about -- the ordering of the two. We describe each non-option ARGV-element -- as if it were the argument of an option with character code 1. -- Using `-' as the first character of the list of option characters -- selects this mode of operation. -- -- The special argument `--' forces an end of option-scanning regardless -- of the value of `ordering'. In the case of RETURN_IN_ORDER, only -- `--' can cause `getopt' to return -1 with `optind' != ARGC. */ -- --static enum --{ -- REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER --} ordering; -- --/* Value of POSIXLY_CORRECT environment variable. */ --static char *posixly_correct; -- --#ifdef __GNU_LIBRARY__ --/* We want to avoid inclusion of string.h with non-GNU libraries -- because there are many ways it can cause trouble. -- On some systems, it contains special magic macros that don't work -- in GCC. */ --#include --#define my_index strchr --#else -- --/* Avoid depending on library functions or files -- whose names are inconsistent. */ -- --char *getenv (); -- --static char * --my_index (str, chr) -- const char *str; -- int chr; --{ -- while (*str) -- { -- if (*str == chr) -- return (char *) str; -- str++; -- } -- return 0; --} -- --/* If using GCC, we can safely declare strlen this way. -- If not using GCC, it is ok not to declare it. */ --#ifdef __GNUC__ --/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. -- That was relevant to code that was here before. */ --#if !defined (__STDC__) || !__STDC__ --/* gcc with -traditional declares the built-in strlen to return int, -- and has done so at least since version 2.4.5. -- rms. */ --extern int strlen (const char *); --#endif /* not __STDC__ */ --#endif /* __GNUC__ */ -- --#endif /* not __GNU_LIBRARY__ */ -- --/* Handle permutation of arguments. */ -- --/* Describe the part of ARGV that contains non-options that have -- been skipped. `first_nonopt' is the index in ARGV of the first of them; -- `last_nonopt' is the index after the last of them. */ -- --static int first_nonopt; --static int last_nonopt; -- --#ifdef _LIBC --/* Bash 2.0 gives us an environment variable containing flags -- indicating ARGV elements that should not be considered arguments. */ -- --/* Defined in getopt_init.c */ --extern char *__getopt_nonoption_flags; -- --static int nonoption_flags_max_len; --static int nonoption_flags_len; -- --static int original_argc; --static char *const *original_argv; -- --extern pid_t __libc_pid; -- --/* Make sure the environment variable bash 2.0 puts in the environment -- is valid for the getopt call we must make sure that the ARGV passed -- to getopt is that one passed to the process. */ --static void --__attribute__ ((unused)) --store_args_and_env (int argc, char *const *argv) --{ -- /* XXX This is no good solution. We should rather copy the args so -- that we can compare them later. But we must not use malloc(3). */ -- original_argc = argc; -- original_argv = argv; --} --text_set_element (__libc_subinit, store_args_and_env); -- --# define SWAP_FLAGS(ch1, ch2) \ -- if (nonoption_flags_len > 0) \ -- { \ -- char __tmp = __getopt_nonoption_flags[ch1]; \ -- __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ -- __getopt_nonoption_flags[ch2] = __tmp; \ -- } --#else /* !_LIBC */ --# define SWAP_FLAGS(ch1, ch2) --#endif /* _LIBC */ -- --/* Exchange two adjacent subsequences of ARGV. -- One subsequence is elements [first_nonopt,last_nonopt) -- which contains all the non-options that have been skipped so far. -- The other is elements [last_nonopt,optind), which contains all -- the options processed since those non-options were skipped. -- -- `first_nonopt' and `last_nonopt' are relocated so that they describe -- the new indices of the non-options in ARGV after they are moved. */ -- --#if defined (__STDC__) && __STDC__ --static void exchange (char **); --#endif -- --static void --exchange (argv) -- char **argv; --{ -- int bottom = first_nonopt; -- int middle = last_nonopt; -- int top = optind; -- char *tem; -- -- /* Exchange the shorter segment with the far end of the longer segment. -- That puts the shorter segment into the right place. -- It leaves the longer segment in the right place overall, -- but it consists of two parts that need to be swapped next. */ -- --#ifdef _LIBC -- /* First make sure the handling of the `__getopt_nonoption_flags' -- string can work normally. Our top argument must be in the range -- of the string. */ -- if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) -- { -- /* We must extend the array. The user plays games with us and -- presents new arguments. */ -- char *new_str = malloc (top + 1); -- if (new_str == NULL) -- nonoption_flags_len = nonoption_flags_max_len = 0; -- else -- { -- memcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len); -- memset (&new_str[nonoption_flags_max_len], '\0', -- top + 1 - nonoption_flags_max_len); -- nonoption_flags_max_len = top + 1; -- __getopt_nonoption_flags = new_str; -- } -- } --#endif -- -- while (top > middle && middle > bottom) -- { -- if (top - middle > middle - bottom) -- { -- /* Bottom segment is the short one. */ -- int len = middle - bottom; -- register int i; -- -- /* Swap it with the top part of the top segment. */ -- for (i = 0; i < len; i++) -- { -- tem = argv[bottom + i]; -- argv[bottom + i] = argv[top - (middle - bottom) + i]; -- argv[top - (middle - bottom) + i] = tem; -- SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); -- } -- /* Exclude the moved bottom segment from further swapping. */ -- top -= len; -- } -- else -- { -- /* Top segment is the short one. */ -- int len = top - middle; -- register int i; -- -- /* Swap it with the bottom part of the bottom segment. */ -- for (i = 0; i < len; i++) -- { -- tem = argv[bottom + i]; -- argv[bottom + i] = argv[middle + i]; -- argv[middle + i] = tem; -- SWAP_FLAGS (bottom + i, middle + i); -- } -- /* Exclude the moved top segment from further swapping. */ -- bottom += len; -- } -- } -- -- /* Update records for the slots the non-options now occupy. */ -- -- first_nonopt += (optind - last_nonopt); -- last_nonopt = optind; --} -- --/* Initialize the internal data when the first call is made. */ -- --#if defined (__STDC__) && __STDC__ --static const char *_getopt_initialize (int, char *const *, const char *); --#endif --static const char * --_getopt_initialize (argc, argv, optstring) -- int argc; -- char *const *argv; -- const char *optstring; --{ -- /* Start processing options with ARGV-element 1 (since ARGV-element 0 -- is the program name); the sequence of previously skipped -- non-option ARGV-elements is empty. */ -- -- first_nonopt = last_nonopt = optind; -- -- nextchar = NULL; -- -- posixly_correct = getenv ("POSIXLY_CORRECT"); -- -- /* Determine how to handle the ordering of options and nonoptions. */ -- -- if (optstring[0] == '-') -- { -- ordering = RETURN_IN_ORDER; -- ++optstring; -- } -- else if (optstring[0] == '+') -- { -- ordering = REQUIRE_ORDER; -- ++optstring; -- } -- else if (posixly_correct != NULL) -- ordering = REQUIRE_ORDER; -- else -- ordering = PERMUTE; -- --#ifdef _LIBC -- if (posixly_correct == NULL -- && argc == original_argc && argv == original_argv) -- { -- if (nonoption_flags_max_len == 0) -- { -- if (__getopt_nonoption_flags == NULL -- || __getopt_nonoption_flags[0] == '\0') -- nonoption_flags_max_len = -1; -- else -- { -- const char *orig_str = __getopt_nonoption_flags; -- int len = nonoption_flags_max_len = strlen (orig_str); -- if (nonoption_flags_max_len < argc) -- nonoption_flags_max_len = argc; -- __getopt_nonoption_flags = -- (char *) malloc (nonoption_flags_max_len); -- if (__getopt_nonoption_flags == NULL) -- nonoption_flags_max_len = -1; -- else -- { -- memcpy (__getopt_nonoption_flags, orig_str, len); -- memset (&__getopt_nonoption_flags[len], '\0', -- nonoption_flags_max_len - len); -- } -- } -- } -- nonoption_flags_len = nonoption_flags_max_len; -- } -- else -- nonoption_flags_len = 0; --#endif -- -- return optstring; --} -- --/* Scan elements of ARGV (whose length is ARGC) for option characters -- given in OPTSTRING. -- -- If an element of ARGV starts with '-', and is not exactly "-" or "--", -- then it is an option element. The characters of this element -- (aside from the initial '-') are option characters. If `getopt' -- is called repeatedly, it returns successively each of the option characters -- from each of the option elements. -- -- If `getopt' finds another option character, it returns that character, -- updating `optind' and `nextchar' so that the next call to `getopt' can -- resume the scan with the following option character or ARGV-element. -- -- If there are no more option characters, `getopt' returns -1. -- Then `optind' is the index in ARGV of the first ARGV-element -- that is not an option. (The ARGV-elements have been permuted -- so that those that are not options now come last.) -- -- OPTSTRING is a string containing the legitimate option characters. -- If an option character is seen that is not listed in OPTSTRING, -- return '?' after printing an error message. If you set `opterr' to -- zero, the error message is suppressed but we still return '?'. -- -- If a char in OPTSTRING is followed by a colon, that means it wants an arg, -- so the following text in the same ARGV-element, or the text of the following -- ARGV-element, is returned in `optarg'. Two colons mean an option that -- wants an optional arg; if there is text in the current ARGV-element, -- it is returned in `optarg', otherwise `optarg' is set to zero. -- -- If OPTSTRING starts with `-' or `+', it requests different methods of -- handling the non-option ARGV-elements. -- See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. -- -- Long-named options begin with `--' instead of `-'. -- Their names may be abbreviated as long as the abbreviation is unique -- or is an exact match for some defined option. If they have an -- argument, it follows the option name in the same ARGV-element, separated -- from the option name by a `=', or else the in next ARGV-element. -- When `getopt' finds a long-named option, it returns 0 if that option's -- `flag' field is nonzero, the value of the option's `val' field -- if the `flag' field is zero. -- -- The elements of ARGV aren't really const, because we permute them. -- But we pretend they're const in the prototype to be compatible -- with other systems. -- -- LONGOPTS is a vector of `struct option' terminated by an -- element containing a name which is zero. -- -- LONGIND returns the index in LONGOPT of the long-named option found. -- It is only valid when a long-named option has been found by the most -- recent call. -- -- If LONG_ONLY is nonzero, '-' as well as '--' can introduce -- long-named options. */ -- --int --_getopt_internal (argc, argv, optstring, longopts, longind, long_only) -- int argc; -- char *const *argv; -- const char *optstring; -- const struct option *longopts; -- int *longind; -- int long_only; --{ -- optarg = NULL; -- -- if (optind == 0 || !__getopt_initialized) -- { -- if (optind == 0) -- optind = 1; /* Don't scan ARGV[0], the program name. */ -- optstring = _getopt_initialize (argc, argv, optstring); -- __getopt_initialized = 1; -- } -- -- /* Test whether ARGV[optind] points to a non-option argument. -- Either it does not have option syntax, or there is an environment flag -- from the shell indicating it is not an option. The later information -- is only used when the used in the GNU libc. */ --#ifdef _LIBC --#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ -- || (optind < nonoption_flags_len \ -- && __getopt_nonoption_flags[optind] == '1')) --#else --#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') --#endif -- -- if (nextchar == NULL || *nextchar == '\0') -- { -- /* Advance to the next ARGV-element. */ -- -- /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been -- moved back by the user (who may also have changed the arguments). */ -- if (last_nonopt > optind) -- last_nonopt = optind; -- if (first_nonopt > optind) -- first_nonopt = optind; -- -- if (ordering == PERMUTE) -- { -- /* If we have just processed some options following some non-options, -- exchange them so that the options come first. */ -- -- if (first_nonopt != last_nonopt && last_nonopt != optind) -- exchange ((char **) argv); -- else if (last_nonopt != optind) -- first_nonopt = optind; -- -- /* Skip any additional non-options -- and extend the range of non-options previously skipped. */ -- -- while (optind < argc && NONOPTION_P) -- optind++; -- last_nonopt = optind; -- } -- -- /* The special ARGV-element `--' means premature end of options. -- Skip it like a null option, -- then exchange with previous non-options as if it were an option, -- then skip everything else like a non-option. */ -- -- if (optind != argc && !strcmp (argv[optind], "--")) -- { -- optind++; -- -- if (first_nonopt != last_nonopt && last_nonopt != optind) -- exchange ((char **) argv); -- else if (first_nonopt == last_nonopt) -- first_nonopt = optind; -- last_nonopt = argc; -- -- optind = argc; -- } -- -- /* If we have done all the ARGV-elements, stop the scan -- and back over any non-options that we skipped and permuted. */ -- -- if (optind == argc) -- { -- /* Set the next-arg-index to point at the non-options -- that we previously skipped, so the caller will digest them. */ -- if (first_nonopt != last_nonopt) -- optind = first_nonopt; -- return -1; -- } -- -- /* If we have come to a non-option and did not permute it, -- either stop the scan or describe it to the caller and pass it by. */ -- -- if (NONOPTION_P) -- { -- if (ordering == REQUIRE_ORDER) -- return -1; -- optarg = argv[optind++]; -- return 1; -- } -- -- /* We have found another option-ARGV-element. -- Skip the initial punctuation. */ -- -- nextchar = (argv[optind] + 1 -- + (longopts != NULL && argv[optind][1] == '-')); -- } -- -- /* Decode the current option-ARGV-element. */ -- -- /* Check whether the ARGV-element is a long option. -- -- If long_only and the ARGV-element has the form "-f", where f is -- a valid short option, don't consider it an abbreviated form of -- a long option that starts with f. Otherwise there would be no -- way to give the -f short option. -- -- On the other hand, if there's a long option "fubar" and -- the ARGV-element is "-fu", do consider that an abbreviation of -- the long option, just like "--fu", and not "-f" with arg "u". -- -- This distinction seems to be the most useful approach. */ -- -- if (longopts != NULL -- && (argv[optind][1] == '-' -- || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) -- { -- char *nameend; -- const struct option *p; -- const struct option *pfound = NULL; -- int exact = 0; -- int ambig = 0; -- int indfound = -1; -- int option_index; -- -- for (nameend = nextchar; *nameend && *nameend != '='; nameend++) -- /* Do nothing. */ ; -- -- /* Test all long options for either exact match -- or abbreviated matches. */ -- for (p = longopts, option_index = 0; p->name; p++, option_index++) -- if (!strncmp (p->name, nextchar, nameend - nextchar)) -- { -- if ((unsigned int) (nameend - nextchar) -- == (unsigned int) strlen (p->name)) -- { -- /* Exact match found. */ -- pfound = p; -- indfound = option_index; -- exact = 1; -- break; -- } -- else if (pfound == NULL) -- { -- /* First nonexact match found. */ -- pfound = p; -- indfound = option_index; -- } -- else -- /* Second or later nonexact match found. */ -- ambig = 1; -- } -- -- if (ambig && !exact) -- { -- if (opterr) -- fprintf (stderr, _("%s: option `%s' is ambiguous\n"), -- argv[0], argv[optind]); -- nextchar += strlen (nextchar); -- optind++; -- optopt = 0; -- return '?'; -- } -- -- if (pfound != NULL) -- { -- option_index = indfound; -- optind++; -- if (*nameend) -- { -- /* Don't test has_arg with >, because some C compilers don't -- allow it to be used on enums. */ -- if (pfound->has_arg) -- optarg = nameend + 1; -- else -- { -- if (opterr) -- if (argv[optind - 1][1] == '-') -- /* --option */ -- fprintf (stderr, -- _("%s: option `--%s' doesn't allow an argument\n"), -- argv[0], pfound->name); -- else -- /* +option or -option */ -- fprintf (stderr, -- _("%s: option `%c%s' doesn't allow an argument\n"), -- argv[0], argv[optind - 1][0], pfound->name); -- -- nextchar += strlen (nextchar); -- -- optopt = pfound->val; -- return '?'; -- } -- } -- else if (pfound->has_arg == 1) -- { -- if (optind < argc) -- optarg = argv[optind++]; -- else -- { -- if (opterr) -- fprintf (stderr, -- _("%s: option `%s' requires an argument\n"), -- argv[0], argv[optind - 1]); -- nextchar += strlen (nextchar); -- optopt = pfound->val; -- return optstring[0] == ':' ? ':' : '?'; -- } -- } -- nextchar += strlen (nextchar); -- if (longind != NULL) -- *longind = option_index; -- if (pfound->flag) -- { -- *(pfound->flag) = pfound->val; -- return 0; -- } -- return pfound->val; -- } -- -- /* Can't find it as a long option. If this is not getopt_long_only, -- or the option starts with '--' or is not a valid short -- option, then it's an error. -- Otherwise interpret it as a short option. */ -- if (!long_only || argv[optind][1] == '-' -- || my_index (optstring, *nextchar) == NULL) -- { -- if (opterr) -- { -- if (argv[optind][1] == '-') -- /* --option */ -- fprintf (stderr, _("%s: unrecognized option `--%s'\n"), -- argv[0], nextchar); -- else -- /* +option or -option */ -- fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), -- argv[0], argv[optind][0], nextchar); -- } -- nextchar = (char *) ""; -- optind++; -- optopt = 0; -- return '?'; -- } -- } -- -- /* Look at and handle the next short option-character. */ -- -- { -- char c = *nextchar++; -- char *temp = my_index (optstring, c); -- -- /* Increment `optind' when we start to process its last character. */ -- if (*nextchar == '\0') -- ++optind; -- -- if (temp == NULL || c == ':') -- { -- if (opterr) -- { -- if (posixly_correct) -- /* 1003.2 specifies the format of this message. */ -- fprintf (stderr, _("%s: illegal option -- %c\n"), -- argv[0], c); -- else -- fprintf (stderr, _("%s: invalid option -- %c\n"), -- argv[0], c); -- } -- optopt = c; -- return '?'; -- } -- /* Convenience. Treat POSIX -W foo same as long option --foo */ -- if (temp[0] == 'W' && temp[1] == ';') -- { -- char *nameend; -- const struct option *p; -- const struct option *pfound = NULL; -- int exact = 0; -- int ambig = 0; -- int indfound = 0; -- int option_index; -- -- /* This is an option that requires an argument. */ -- if (*nextchar != '\0') -- { -- optarg = nextchar; -- /* If we end this ARGV-element by taking the rest as an arg, -- we must advance to the next element now. */ -- optind++; -- } -- else if (optind == argc) -- { -- if (opterr) -- { -- /* 1003.2 specifies the format of this message. */ -- fprintf (stderr, _("%s: option requires an argument -- %c\n"), -- argv[0], c); -- } -- optopt = c; -- if (optstring[0] == ':') -- c = ':'; -- else -- c = '?'; -- return c; -- } -- else -- /* We already incremented `optind' once; -- increment it again when taking next ARGV-elt as argument. */ -- optarg = argv[optind++]; -- -- /* optarg is now the argument, see if it's in the -- table of longopts. */ -- -- for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) -- /* Do nothing. */ ; -- -- /* Test all long options for either exact match -- or abbreviated matches. */ -- for (p = longopts, option_index = 0; p->name; p++, option_index++) -- if (!strncmp (p->name, nextchar, nameend - nextchar)) -- { -- if ((unsigned int) (nameend - nextchar) == strlen (p->name)) -- { -- /* Exact match found. */ -- pfound = p; -- indfound = option_index; -- exact = 1; -- break; -- } -- else if (pfound == NULL) -- { -- /* First nonexact match found. */ -- pfound = p; -- indfound = option_index; -- } -- else -- /* Second or later nonexact match found. */ -- ambig = 1; -- } -- if (ambig && !exact) -- { -- if (opterr) -- fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), -- argv[0], argv[optind]); -- nextchar += strlen (nextchar); -- optind++; -- return '?'; -- } -- if (pfound != NULL) -- { -- option_index = indfound; -- if (*nameend) -- { -- /* Don't test has_arg with >, because some C compilers don't -- allow it to be used on enums. */ -- if (pfound->has_arg) -- optarg = nameend + 1; -- else -- { -- if (opterr) -- fprintf (stderr, _("\ --%s: option `-W %s' doesn't allow an argument\n"), -- argv[0], pfound->name); -- -- nextchar += strlen (nextchar); -- return '?'; -- } -- } -- else if (pfound->has_arg == 1) -- { -- if (optind < argc) -- optarg = argv[optind++]; -- else -- { -- if (opterr) -- fprintf (stderr, -- _("%s: option `%s' requires an argument\n"), -- argv[0], argv[optind - 1]); -- nextchar += strlen (nextchar); -- return optstring[0] == ':' ? ':' : '?'; -- } -- } -- nextchar += strlen (nextchar); -- if (longind != NULL) -- *longind = option_index; -- if (pfound->flag) -- { -- *(pfound->flag) = pfound->val; -- return 0; -- } -- return pfound->val; -- } -- nextchar = NULL; -- return 'W'; /* Let the application handle it. */ -- } -- if (temp[1] == ':') -- { -- if (temp[2] == ':') -- { -- /* This is an option that accepts an argument optionally. */ -- if (*nextchar != '\0') -- { -- optarg = nextchar; -- optind++; -- } -- else -- optarg = NULL; -- nextchar = NULL; -- } -- else -- { -- /* This is an option that requires an argument. */ -- if (*nextchar != '\0') -- { -- optarg = nextchar; -- /* If we end this ARGV-element by taking the rest as an arg, -- we must advance to the next element now. */ -- optind++; -- } -- else if (optind == argc) -- { -- if (opterr) -- { -- /* 1003.2 specifies the format of this message. */ -- fprintf (stderr, -- _("%s: option requires an argument -- %c\n"), -- argv[0], c); -- } -- optopt = c; -- if (optstring[0] == ':') -- c = ':'; -- else -- c = '?'; -- } -- else -- /* We already incremented `optind' once; -- increment it again when taking next ARGV-elt as argument. */ -- optarg = argv[optind++]; -- nextchar = NULL; -- } -- } -- return c; -- } --} -- --int --getopt (argc, argv, optstring) -- int argc; -- char *const *argv; -- const char *optstring; --{ -- return _getopt_internal (argc, argv, optstring, -- (const struct option *) 0, -- (int *) 0, -- 0); --} -- --#endif /* Not ELIDE_CODE. */ -- --#ifdef TEST -- --/* Compile with -DTEST to make an executable for use in testing -- the above definition of `getopt'. */ -- --int --main (argc, argv) -- int argc; -- char **argv; --{ -- int c; -- int digit_optind = 0; -- -- while (1) -- { -- int this_option_optind = optind ? optind : 1; -- -- c = getopt (argc, argv, "abc:d:0123456789"); -- if (c == -1) -- break; -- -- switch (c) -- { -- case '0': -- case '1': -- case '2': -- case '3': -- case '4': -- case '5': -- case '6': -- case '7': -- case '8': -- case '9': -- if (digit_optind != 0 && digit_optind != this_option_optind) -- printf ("digits occur in two different argv-elements.\n"); -- digit_optind = this_option_optind; -- printf ("option %c\n", c); -- break; -- -- case 'a': -- printf ("option a\n"); -- break; -- -- case 'b': -- printf ("option b\n"); -- break; -- -- case 'c': -- printf ("option c with value `%s'\n", optarg); -- break; -- -- case '?': -- break; -- -- default: -- printf ("?? getopt returned character code 0%o ??\n", c); -- } -- } -- -- if (optind < argc) -- { -- printf ("non-option ARGV-elements: "); -- while (optind < argc) -- printf ("%s ", argv[optind++]); -- printf ("\n"); -- } -- -- exit (0); --} -- --#endif /* TEST */ ---- gvpe-3.0.orig/lib/getopt.h -+++ /dev/null -@@ -1,133 +0,0 @@ --/* Declarations for getopt. -- Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc. -- --NOTE: The canonical source of this file is maintained with the GNU C Library. --Bugs can be reported to bug-glibc@prep.ai.mit.edu. -- --This file is part of GVPE. -- -- GVPE 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, 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 gvpe; if not, write to the Free Software --Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA --*/ -- --#ifndef _GETOPT_H --#define _GETOPT_H 1 -- --#ifdef __cplusplus --extern "C" { --#endif -- --/* For communication from `getopt' to the caller. -- When `getopt' finds an option that takes an argument, -- the argument value is returned here. -- Also, when `ordering' is RETURN_IN_ORDER, -- each non-option ARGV-element is returned here. */ -- --extern char *optarg; -- --/* Index in ARGV of the next element to be scanned. -- This is used for communication to and from the caller -- and for communication between successive calls to `getopt'. -- -- On entry to `getopt', zero means this is the first call; initialize. -- -- When `getopt' returns -1, this is the index of the first of the -- non-option elements that the caller should itself scan. -- -- Otherwise, `optind' communicates from one call to the next -- how much of ARGV has been scanned so far. */ -- --extern int optind; -- --/* Callers store zero here to inhibit the error message `getopt' prints -- for unrecognized options. */ -- --extern int opterr; -- --/* Set to an option character which was unrecognized. */ -- --extern int optopt; -- --/* Describe the long-named options requested by the application. -- The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector -- of `struct option' terminated by an element containing a name which is -- zero. -- -- The field `has_arg' is: -- no_argument (or 0) if the option does not take an argument, -- required_argument (or 1) if the option requires an argument, -- optional_argument (or 2) if the option takes an optional argument. -- -- If the field `flag' is not NULL, it points to a variable that is set -- to the value given in the field `val' when the option is found, but -- left unchanged if the option is not found. -- -- To have a long-named option do something other than set an `int' to -- a compiled-in constant, such as set a value from `optarg', set the -- option's `flag' field to zero and its `val' field to a nonzero -- value (the equivalent single-letter option character, if there is -- one). For long options that have a zero `flag' field, `getopt' -- returns the contents of the `val' field. */ -- --struct option --{ --#if defined (__STDC__) && __STDC__ -- const char *name; --#else -- char *name; --#endif -- /* has_arg can't be an enum because some compilers complain about -- type mismatches in all the code that assumes it is an int. */ -- int has_arg; -- int *flag; -- int val; --}; -- --/* Names for the values of the `has_arg' field of `struct option'. */ -- --#define no_argument 0 --#define required_argument 1 --#define optional_argument 2 -- --#if defined (__STDC__) && __STDC__ --#ifdef __GNU_LIBRARY__ --/* Many other libraries have conflicting prototypes for getopt, with -- differences in the consts, in stdlib.h. To avoid compilation -- errors, only prototype getopt for the GNU C library. */ --extern int getopt (int argc, char *const *argv, const char *shortopts); --#else /* not __GNU_LIBRARY__ */ --#endif /* __GNU_LIBRARY__ */ --extern int getopt_long (int argc, char *const *argv, const char *shortopts, -- const struct option *longopts, int *longind); --extern int getopt_long_only (int argc, char *const *argv, -- const char *shortopts, -- const struct option *longopts, int *longind); -- --/* Internal only. Users should not call this directly. */ --extern int _getopt_internal (int argc, char *const *argv, -- const char *shortopts, -- const struct option *longopts, int *longind, -- int long_only); --#else /* not __STDC__ */ --extern int getopt_long (); --extern int getopt_long_only (); -- --extern int _getopt_internal (); --#endif /* __STDC__ */ -- --#ifdef __cplusplus --} --#endif -- --#endif /* _GETOPT_H */ diff -Nru gvpe-3.0/debian/patches/openssl1.1.patch gvpe-3.1/debian/patches/openssl1.1.patch --- gvpe-3.0/debian/patches/openssl1.1.patch 2018-05-13 01:28:55.000000000 +0000 +++ gvpe-3.1/debian/patches/openssl1.1.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -From 57c6de81da714b76d3a8e3b0ffca1db026f961ab Mon Sep 17 00:00:00 2001 -From: "Chris West (Faux)" -Date: Wed, 22 Nov 2017 12:12:37 +0000 -Subject: [PATCH] use RSA getters for libssl 1.1 compat - ---- gvpe-3.0.orig/src/conf.C -+++ gvpe-3.0/src/conf.C -@@ -650,12 +650,16 @@ configuration_parser::configuration_pars - } - - if (conf.rsa_key && conf.thisnode->rsa_key) -- if (BN_cmp (conf.rsa_key->n, conf.thisnode->rsa_key->n) != 0 -- || BN_cmp (conf.rsa_key->e, conf.thisnode->rsa_key->e) != 0) -- { -- slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode); -- exit (EXIT_FAILURE); -- } -+ { -+ const BIGNUM *conf_n, *conf_e, *thisnode_n, *thisnode_e; -+ RSA_get0_key(conf.rsa_key, &conf_n, &conf_e, NULL); -+ RSA_get0_key(conf.thisnode->rsa_key, &thisnode_n, &thisnode_e, NULL); -+ if (BN_cmp (conf_n, thisnode_n) != 0 || BN_cmp (conf_e, thisnode_e) != 0) -+ { -+ slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode); -+ exit (EXIT_FAILURE); -+ } -+ } - } - } - diff -Nru gvpe-3.0/debian/patches/series gvpe-3.1/debian/patches/series --- gvpe-3.0/debian/patches/series 2018-05-13 01:28:55.000000000 +0000 +++ gvpe-3.1/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -openssl1.1.patch -bundled_lib.patch diff -Nru gvpe-3.0/debian/rules gvpe-3.1/debian/rules --- gvpe-3.0/debian/rules 2018-05-13 01:28:55.000000000 +0000 +++ gvpe-3.1/debian/rules 2018-10-27 04:13:31.000000000 +0000 @@ -11,3 +11,6 @@ %: dh $@ + +override_dh_installinit: + dh_installinit --no-enable diff -Nru gvpe-3.0/debian/upstream/signing-key.asc gvpe-3.1/debian/upstream/signing-key.asc --- gvpe-3.0/debian/upstream/signing-key.asc 1970-01-01 00:00:00.000000000 +0000 +++ gvpe-3.1/debian/upstream/signing-key.asc 2018-10-27 04:13:31.000000000 +0000 @@ -0,0 +1,1567 @@ +pub dsa1024 1999-01-26 [SC] [expired: 2014-06-01] + 475AFE9BD1D4039E01ACC217A1E80270DA743396 +uid [ expired] Marc Lehmann (nethype GmbH) +uid [ expired] Marc Lehmann +uid [ expired] Marc Alexander Lehmann +uid [ expired] Marc Alexander Lehmann +uid [ expired] Marc Alexander Lehmann + +pub rsa15424 2013-06-01 [C] + 904AD2F81FB16978E7536F726DEA2BA30BC39EB6 +uid [ unknown] Marc Alexander Lehmann +uid [ unknown] Marc Lehmann +uid [ unknown] Marc Alexander Lehmann +uid [ unknown] Marc Alexander Lehmann +uid [ unknown] Marc Lehmann (nethype GmbH) +sub rsa2048 2013-06-01 [S] + 47EAF9583DDC8A883E966BAB14320429BE4B71C1 +sub rsa2048 2013-06-01 [E] + 4252351E7444C01B164CF88C03ED70E24A66F2A9 +sub rsa3200 2016-11-16 [S] [expires: 2021-11-15] + CE694EB2820D25928F469C5B84874CAB6D1A397A +sub rsa3264 2013-06-01 [S] + D3D5631F7FB94BCF1A4F390791FC7D81EF6789F1 +sub rsa3264 2013-06-01 [E] + E3EE6D1A1B3A5DF36995DFA928FA37F2243AB885 +sub elg2048 2013-06-01 [E] + C2EDB079D1F5E48B4E3297210CD89AFE63A7E9D6 +sub dsa2048 2013-06-01 [S] + 2ED6FFD92FD359610193DEAE250246EA0D195BEA +sub elg3264 2013-06-01 [E] + E3C6449415B3EAA2B0FD2E08B9CF428270249B85 +sub dsa3072 2013-06-01 [S] + 74D56AB4EC22A98397C843C4B400783E7081E42C + +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQGiBDatDZcRBACu9ZMyPlPzUpbpTJkW27zKOCoRYW5UXjYgyhvf/5dVgvv2IBp5 +Qc5WjaA6ECJ2uxIBOyib4Sm123oaz3I+NJ658G80TUJp2UE8KTYE+mr9pNMFk4dG +pyU+sOAurMVTYc4kW0RiX80WnpuaLTdLj1EuiBosyhSXY9plmQdfQjH/mwCg9HfU +eMxvUOzEtFjLRWA7FxSafb0D/3a4n/D4OW4dYH72K57ghZh657o9izlM1c/BCcJw +Dxm32mFp7OVgtmIN8gFdEeSBBSWlxHSPKFfRjYtZB3NhuTx9EaNjQ3EjIPU7w+h6 +WCtve7Cg7XdZ4ZD/fvf/8+O6ngchQ+Ax4OaEhLDtLO60oZjQmbMwGd+umWuQPxKg +QGieBACZlGkSeBQ/7xsRQ6oi9syrXhbgYgM79+o6sr8fGPr2gB5cbcXvdZID97dp +SYsx6M4PR8zApI5u/d7T3nYw5GHAt3Ih8e5riPODDrQhTEPkDrdtmoxVi3fmqsW2 +u6j0SrgVRE5RXXDD04JKmIysbQ6KGZWv2OnuDZsrX24Le6sTObQbTWFyYyBMZWht +YW5uIDxwY2dAZ29vZi5jb20+iJIEExEKAFIpGmh0dHA6Ly9wZ3Auc2NobW9ycC5k +ZS9zaWduaW5nLXBvbGljeS50eHQCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA +BQJRrkAsBQkc3pTJAAoJEKHoAnDadDOW9ygAoMre6bnJNq1ihBIFsOFV6RlK7/tN +AKCCCa6hB9QPkMqS7x+CSaaNluC0pLQlTWFyYyBBbGV4YW5kZXIgTGVobWFubiA8 +cGNnQGdvb2YuY29tPoiSBBMRCgBSKRpodHRwOi8vcGdwLnNjaG1vcnAuZGUvc2ln +bmluZy1wb2xpY3kudHh0AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAUCUa5A +LAUJHN6UyQAKCRCh6AJw2nQzlmXpAJ992NJwlCUdfPBq77sUw3IBkAFarQCg3oRK +lczC8r/dDXMmRQcuX1cpubq0Jk1hcmMgQWxleGFuZGVyIExlaG1hbm4gPG1hcmNA +cGxhbjkuZGU+iJIEExEKAFIpGmh0dHA6Ly9wZ3Auc2NobW9ycC5kZS9zaWduaW5n +LXBvbGljeS50eHQCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheABQJRrkAsBQkc +3pTJAAoJEKHoAnDadDOWwdoAni+hm2MSXTGUb+LmFkHntDAHwELfAJ9wI4tIHbCb +1TjSEH3GC3Z0Tcs0yrQrTWFyYyBBbGV4YW5kZXIgTGVobWFubiA8c2NobW9ycEBz +Y2htb3JwLmRlPoiSBBMRCgBSKRpodHRwOi8vcGdwLnNjaG1vcnAuZGUvc2lnbmlu +Zy1wb2xpY3kudHh0AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAUCUa5AJQUJ +HN6UyQAKCRCh6AJw2nQzlh5/AKDna6/Y3Oe/bG3SipdmYhqUKTImywCg43cN2m5Q +h2q2VsdG7yBsx7TLu+a0LU1hcmMgTGVobWFubiAobmV0aHlwZSBHbWJIKSA8bWFy +Y0BuZXRoeXBlLmRlPoiSBBMRCgBSKRpodHRwOi8vcGdwLnNjaG1vcnAuZGUvc2ln +bmluZy1wb2xpY3kudHh0AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAUCUa5A +LAUJHN6UyQAKCRCh6AJw2nQzljXdAKCP4Bd/IEP+jmXIsqAkYVa/pFO7kwCgs8R3 +kfsmIf08ea1mfHhklftUYSS4wwRB8CmdAQXA0nFj4mMUKeVytbtk4IHx31MpmCuq +E3DtVO3P0xwa8zLjGSNznv8ohuVUlxMRzEJjmGfPsY1jaWoUGhSAqz1vxkHRuhOv +EtRzfB9nkpTqE8A2WVOL/lbWwxx6bNNBEqp2wDmzPeU7p2jBWdGYv36WX05zMnyl +CdjS5yGbeStdpwxEFlEsF34+wrL7Ne/2Mgldc42/TriFNcUhSgHIBAxfaB6gCtbi +S1aEl3W/srZ4ThQcgbwPHefiQQAGKYh5BBgRAgA5KRpodHRwOi8vcGdwLnNjaG1v +cnAuZGUvc2lnbmluZy1wb2xpY3kudHh0AhsCBQJB8Cm/BQkB4TOiAAoJEKHoAnDa +dDOWtT0AnRFecE0BE2dU+7w+rkyeDjaslDNlAJsGhsudOVNVgsJiFRe4vnNtQIlo +abjDBEHwKakBBcCj+EydyrXR0YSXFoPJTyVWrBZGXJENkvhV1QK0koiIG120y9hp +a1TuF2FTgWSv6bgdSBMexUEEk9T2jhQRZSKT9ItbiEnDD+YiA/6CrfAacNqBdpbW +C3H1ZRPye0xnnAbk6gRiBlJIRCVF+Ls9lsJ6x3z4rPDiMaXLTn2ZU967t65Zgstw +eXKSDnNO3sGnNyD5hu44LYoe+vkfGx3betB2KDxD6cSTFC+Zfc9Ydr03cXUpXDPn +eyanAAYpiIAEGBECADkpGmh0dHA6Ly9wZ3Auc2NobW9ycC5kZS9zaWduaW5nLXBv +bGljeS50eHQCGwwFAkHwKcoFCQHhM6EAEgkQoegCcNp0M5YHZUdQRwABAVraAJjy +UcBtr3/D4MShnbQZVh03tGb4AJwINGwpoG+ytZ3JXUaVA9ItrCx04okKOQQYAQoA +OSkaaHR0cDovL3BncC5zY2htb3JwLmRlL3NpZ25pbmctcG9saWN5LnR4dAIbAgUJ +D7vSpAUCUaquKwJswD8gBBkBCgAwBQJRqoMTKRpodHRwOi8vcGdwLnNjaG1vcnAu +ZGUvc2lnbmluZy1wb2xpY3kudHh0AAoJEEuCqWwV0jtJ190FwKMRDIOPnxIEChAE +XTPWMNIfEROOzGJExmo+69wwFPYyrIYjaPlQ0X0XaytBqLstsVqDgsswc7AFso26 +f0zmOitNgbCD1YMqwvItJEe9spcqK8sSvAG/ulAAqzfo8x7h8btQGi0bi13i0lk+ +VdcO0p1AWCO5l7HCd16pFBUP+UZFNqPu5UsebtFSuuRT/Bzn91lK9e78wAU6Or4l +2HP0V8kyyW1wlnE/wytumpHYZKzfJ2QQhzoBTWXAnyAEGQEKAJAFAlGqriNfFIAA +AAAALgAoaXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFu +Lm5ldDg1MjQwQzE4MTZDMTFBMzM1RTg2MTg1M0M1MjU0Qzg0MTU3NzA1OEYpGmh0 +dHA6Ly9wZ3Auc2NobW9ycC5kZS9zaWduaW5nLXBvbGljeS50eHQACgkQxSVMhBV3 +BY9SMAXAgF6RNn5zm0+l5vjJ5X1zXmS/JnLf/zQ/2PCVa2NqHDsacbud4vlA+YAy +63NdATzHdk9bFMwRl5l5wQEyeSrdXd/GLuNKyk0YKKRvxVHoEvA42MtQbO5xsbEC +HqAkrhl2IA8sFyL25jj+nnn7XUGP57RpvzJgcyaQUSs51AYEhYImZWQyPjtJXYzz +yE1mP3+JzT39wraSEFk5iisSu07o/0QV0HFs06tRqpB9nC/UNZG77YhW/yeWSAkQ +beorowvDnrZStTxAiL9yEsyybOFtvqpqcUm2kR7+wPf4zMV648xK4XJQhVlg2oLr +CWoIBSnX6Cd6RJjkHfgR8+3lc3Klf/nqTUGqXJKNzD3lrKSdGiwvWCFLlAXBvVrc +gO/IrwIiN0UI2658rugL5mSCy3YtmbOvLT7q5iQybhIl3ClVIu/f7Ze8eeJpytPI +dZswg0WeSq7HYGQpHQoMn1QRTNA72uIgUxcp6NxNttdP+z11IPoKFeefeTwlACqG +MsIXNd5OeR1ZFgR9JCacN+wh9tCLz9JxhKAWiPqDejsmChPzGFkIjJo+c042UFEn +ibJDp2wdsPf4xMuSJLFFO+eVSqzUwhoEjBqsC5x36+aO/J76+8Lqm1zTy7jbjlSn ++UjnlRNO1SMj2c9xkm9pGdkgNH+f1HnCU7RBVRbCJQpW9hHIqzhsGDWKnLdEhIXz +1Yb5POzVLQBDwFBrcmf2KzHgTgJncGhMcum5kJNCRpWeRuNfjETAJuDFd3G7z5Hh +W5XOZa+DlEcv543+QP8NAcrzZB8AgGMxgpCjXWnVdC/X3Yg0UT0OnN7EBYOYIt5J +q8aSUMhP5iYIbVPqBHkWLf39OkRB85zRpwmXGLsOfGXf0F6qbOaD01AI3geXu7Gy +nWgYJUQdNThZsBTXbI3lcCHNXKlZ7YKxBVWLrGC+8swGFfpNfWQxCFOoeiLHvC3i +lJLfgAzVZrhhs0XYCt3/BPel6rHHxo8n2/hwSWbP76YINvBvplqr0xag7FvmgKMm +av6knsIlpO2Amvci7rZIsn3HId381GK2/dUjTeZGaQB0MoMA2r2yTV6L78rJ5j/w +ORKaFfoUjHchTic18duPeCixyQ2GAvMPqAgRqISzIPVCGLoEHND9DBdF41p6Z0zD +PJOPtq0DsPQKxi/kGM1TCdgy2nJH4EMJfnvvDiQ20aQwA8lZPEUA1Alp0H8REGYJ +3+yIb/jlwkSrM3gFPEKJ27tzuAzmP91X7fxOGfKYXRATAlmYOEi3KZAHmWt2jlGK +Rn4rEsGTUkUl1iNYU2pf0+QtPIm8NB64d6Ih0jxTpOSTtzOxm0bYuqdaoqBAvsUY +IjDRMwghVsSKwtENn0un/VNpVsrcVwT4kFTOIgcr9YUrkq0ivgW5Dfjkxg8wPaNd +qUfpSgN3eNTNjYgt5tyHc8Uj/LM1pg872cW7IzBYWjtaaO4WoHQxNnLv4PmtVBqO +x1C5VV/1h/IkRBc9XmNOw5tm9QDBZAXKHv/Eyu6uAxBzdPTaKC5G3/BemcSpEbUm +oVm1OPmF3n8ukWGIkKxq8p1UEsjRy5SnhsKoOCHqzpdkxpvj5Idu9U21MMzSpsBl +6/Ybl5OHLhwEbRYlQT347+rHj0ot1VQpUoUFTbrGrJWDAiQfc2cEp9Q00TEcvoaw +f2jQP+f6Zbxr5uduMg2DoGdvmRYhpJJM//lHOV/RgZ2hHvLXlFIoN1l0drkBwimQ +UqiPZy8mkTavdLqaT3nntFErd3oUJUX3AoezPGxjv+tfaUJp36S56VqDzAxApADL +nhb9oARQ70qRcXMAXWm+y8aRV+AYiungmG6ngGErPlG5qvucbKkzVkUuaVkozgQ0 +J+AbNeLCkoBuYbznvGILoH0y96XKXvVbfxVQCEg8Sq80lFkO1ALm2cn4/2FXO6Ot +KJ7fSCXrRtYLXYVrcAUnnDaWkwKGO9TzUCz61sUmE81VbE6cTIBgT9oCWcefHyRO +QbBYrXDE6nqx4hshb8ydHS/4Jgzj7h0kyLqBeQB9fcj4C2QnzYqSeBUlyLGL96VA +ltxYAuC1u2SQEATlr2G29D7VqHqABiFLhcrQM97G3v2Uw/nXuXYdtBe4TuPlI0C6 +gc2xJl/E0c7u34j32cWvoB3PrTR+6uo0vVDqMe/jAnG+32ItSk+t6k/zyTJDUVOW +Iz7Xh6V5tkgoOxIZ0PDFNcOG0RLgG339Pmd+hEs5S33UcewxzcFZEpYw75gyWt5u +Iw1R7dhwypHDaG+vY4EVtCfBCKqn1zKzSKl0cE94S1lqRtJfRf1yKC4/3F2ExM/T +sWToW3UwPHDjVwiVBg6071hJkbowWzDcgiC7PMugWukJLV91jljl6Vy8liW6/JYo +LqSIUyTBsDY6W5RsddjvLACynFCPuFxnl5Hr4MRkEymE4XeYh0MusyNL7MZ7MgOP +Pd0ZboqlBs2jR9QdiDgotSuLBugBWZqjnQBOB9pdOrbr4uDlgzboo6aJkZa2ZsxO +aqSLmqlKqdOMWJoZajejfpTbWkigYQzFFx9okOhGV97/AESjp0+uTIluI3Jdd6FB +CQawjigmCD3IFaRYlPEXRR0PAe8LGOgIUZDD7eZqJqP5OAr7ZhIQTTVPuqc0JUdy +ctBVDrWfZmdZOp6a1xIU9LuF0xSfbBRXjq07W3BN1hI9SMeEzMhy2NTUPWEw6s0E +SjNZBk8q2Kko3YqzKXG+UzzhD5ipH/o7F1IeMNrm4U0/y4xF9Df2ftj58YZN3JMn +CSwh7/JOuZ9naFn9GK2LJIvt0FBNUHqtwNxPn2V6yG0h5pwPvC0J036Y9sCyAmmm +sUSRj+CNpNodL7KdLsW9YOHKfFa5AQ0EUapK2AEIAO6/mFk3ZL3o3bGNaLweKa27 +HNBQWiX4IQzVGhuBGZ08t5xSXStB4bZUgfYDAB3B8IRSOfrWu2PpY4h3GjvONNks +xpBedYxKMg2qoSqkzUtPLU5wgkCAUf9d+RczfRhyNTmQ7nLdYQv70qgap3wwYnHw +RunyktFA6Jk4JolUxOK5L3ry2VxTFgImrVZBlSv9Z+fFo+fBAzNJiR08AO4QXMZK +TRfaY9ZhS6tucVTNbY5ObZi+ORr2GGFx+OS8n7RoIVK6WsXdYCg6QwRVcYH2cC8S +Wiuofe1YuBSy43meJmBwYP+V18Rh8YtET0lw3YZ9F6SzeSgrY5pX1EpkPF4mPwcA +EQEAAYkBvAQYEQIAMwUCUapK2CkaaHR0cDovL3BncC5zY2htb3JwLmRlL3NpZ25p +bmctcG9saWN5LnR4dAIbAgFTCRCh6AJw2nQzlsCHIAQZAQIAMAUCUapK2CkaaHR0 +cDovL3BncC5zY2htb3JwLmRlL3NpZ25pbmctcG9saWN5LnR4dAAKCRAUMgQpvktx +wRvrB/0dVPOCSi8onfYP/eKvpCdFZefxPjzkrawzauyQ6PS7tkIqZ0jJv3gO++jQ +6yIwRYE3lpBc3w8usD/8G5eaHSxR08Li6nPscUm/CZ62F8tXnMAIpiPtPNHGyUWQ +5RBGVP8U5eBdBWmwQo/n3kKi9raSLXhauVPLIN1XzGsufWDfHBknnvpQLpVILCvU +ntVnlmlmUTKmEcBJZ20JUllCGUPXp576p6TWyigEXqDXjGXkQxrdKlWwRRyBt/H5 +t+q6pD5Q32t7auQvDdya87SXG4BpO9H5CgiR22yIVb2taswOl/WRPXJB10W39C5F +NBA5b/Nug6InIOtHXPAp7DcAn7xeQOoAoNR29e4NyDOs7Lehc3Cx9SZ7t9c3AKCL +5E44ByPUSPa7PRoZNKVwxGtAb4kKwwQYAQoAMykaaHR0cDovL3BncC5zY2htb3Jw +LmRlL3NpZ25pbmctcG9saWN5LnR4dAIbAgUCUaquXwL8wIcgBBkBCgAwBQJRqoSI +KRpodHRwOi8vcGdwLnNjaG1vcnAuZGUvc2lnbmluZy1wb2xpY3kudHh0AAoJEDNp +k0nK2/3DUkkH/26CpGA1sRXJ/ttIHAKFe0/cM5lcUetIdkuVVHfr4AaeDp0Jj5tR +ANEgxmOfOYspigZsGL5R9n7s3j3f8DlxNeb1OSvEWRbSnn5CXeSqoxf4bUNYViJJ +JlaVmQFdlF6fQ/7CoOk5k3mo2Jo8h0d0BGdZFZs8oN/nmYKzr9FERDgudRe/OuZh +TDpsCXEfH/wcXuxFofkMrtATHYT81F0hwEnu6rahHW+SaUAcfRXiyF0lDtqPoVl7 +U36MQfi8hiCX4I1syGQmYbcYZvFMqszMiVG6AeXKW6bnsv+AlhtgxjUKFQy8Rfzc +lX/54hFS7dY3CJZRJuWELmFXJdT1JtjTIbHA5yAEGQEKAJAFAlGqriNfFIAAAAAA +LgAoaXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5l +dDQ3RUFGOTU4M0REQzhBODgzRTk2NkJBQjE0MzIwNDI5QkU0QjcxQzEpGmh0dHA6 +Ly9wZ3Auc2NobW9ycC5kZS9zaWduaW5nLXBvbGljeS50eHQACgkQFDIEKb5LccFU +Qwf/VvJH3Nbg2r34/2qsujGCZRD7SdjZ29CKoGyd87jYzBqlzaYmTNdfTWQQ8zWo +m8lt0WaL3U8vbiH8irjB3F4imcjj6B7wzer7cB03etqS0IiqilbFjaNeSMqy7Gju +S9YVR4919GRxvXeFzEAScvaiCr3xSvxhiqMKj/wPP6TwAcFscXRU/+nxG4JqTXZf +8ZECtxPHBwPgqR9O9DtDD8mGNzrZRhvARlEWao4RGmZ8BcPdUv4/dt376kPPSni8 +F8sFB4X2Hq3aj+DXCrl9b3t63dcINeS9Iu/C9eZ4ixbnVWVOo6MxOxWePum5FHFY +HvqwvsYCt2HlGazkkLwJpD/lugkQbeorowvDnrZ9fDw/VUV5/TsH4dTDuRLiBUuM +bxVJ9/iuTMDXFFYQFY/rwn/YnyDF34dliQfcKQuhS3PZ4PEnC925PYmi97o3KyCE +nL1UCYopQ/rSuTcHr/bq25T0M9EL/AocmjpWPP7uPikhr5Q3tM1mbbDCw1VjZYbI +im8A02Qv23NlFef59XQJNYkB69cx6QlRiwL47PkHS7a20Z4rDGa3v2IG43WZHdG1 +u0y1r63HuzOT6UxzI1tJCRxr5fn5y6h6errfjVGgrpSk+ISrgGOw6pe9QlYWRZXq +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 +AAAALgAoaXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFu +Lm5ldDJFRDZGRkQ5MkZEMzU5NjEwMTkzREVBRTI1MDI0NkVBMEQxOTVCRUEpGmh0 +dHA6Ly9wZ3Auc2NobW9ycC5kZS9zaWduaW5nLXBvbGljeS50eHQACgkQJQJG6g0Z +W+rH/AEAr27/S0HyJMJ3W92k8R6IkC8mhdZgVBm4craFsf1TBKsA/1QeSJ3LauMk +dpPtKXVzi0KuN/LhsrK3K6NWPAdueawsCRBt6iujC8Oetq5sPECHsAzul5L3hLLV +/xKe9mnvEgJZLAJKHGNoEneRzfHw5kY9f5rU6184tTVudnmevuMwNXT9OZ9/mZ4Y +6RbkLesfKvrJDjYhR1brMtUho3sl/BciVBkgOQiKZNo3sACsN2difsa8z5Kt9Nhp +HOmFUR7Dht4jysJUL9jh+KpTmzVfIOVeVOOdzsyto0BvVK8M2rnQkSm4qet2/C6l +Xww4BNhtPUsZGMVJZYav+VzzfYiQkNeNPPx9bluburygT6C0HdqEXRMo406HBpIb +gfWpUi+boIanrewNLpgAgo6tHSGM43Sx9V2jYfLbaqgSm8kyieP1Sm2ogEeBdY9H +g+9UM8mFDwrfTjJVK3oamoBwsJF9o28OW0k+sej29jpeBEgwK48rG8efH/ZeR/1O +0pWXfaMdf+3neTlo+kgiov1UM8F0jhCwasO0rclitKttPKOvl9Uneb/4jdDP9MCf +AsEU+qCWazNfaRL+w8AH1Y4Hr30KEfQraTUGyZ9F1Cn1dXKOIxXpBB+2+8eeHDMR +xUri9VKaH2zjBPE97bYaYGnnE93XKeTWE2MJYuW0ytqk8uFpTTxIE6KgAi8T/eOd +yhAYdbrkiOwVepnveqDIPTF+oSzlU9ceUxHQr4Sx5Fh/OhMsBQ9Ht2x3bM8k5Xyn +in9Xl9OBjfqlcy+oS8SCel6VKY1ECNnoNdEoXGrYRnoRZdEte5wLF0RwyFgyGqQb +DF0pv5KNjiiy0RYfoKjWS/2SdL81DMqQpOJI+0I8snSSjJ+JkQaFuuPxNnUc7X+7 +8C73wMaQDp9NGr4RE0rrAZ0Wk2FLGqUg+nxFC7cACmLwZcfEMIMPa6YuUI0rBfXL ++iF/G/Tb9aHDIBCI8UUIhQnwDKCm5SAQPydLl6fXFU0skQHCdcq9PeRjFHINk0xF +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 +8AHmiQlGBBgBCgAzKRpodHRwOi8vcGdwLnNjaG1vcnAuZGUvc2lnbmluZy1wb2xp +Y3kudHh0AhsCBQJRqq46AX+JIAQZEQoAMAUCUaqDfykaaHR0cDovL3BncC5zY2ht +b3JwLmRlL3NpZ25pbmctcG9saWN5LnR4dAAKCRByizFR8gK9+7fuAQCzSfWABYo7 +ZmnH3zwGc4Gq3nSharyblXZdYUkRujlFpgD/RL5cTWnIZWhQIBS9A2AtuX52P23h +kCsxFNkpRvri/43AKSAEGREKAJAFAlGqriNfFIAAAAAALgAoaXNzdWVyLWZwckBu +b3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDc0RDU2QUI0RUMyMkE5 +ODM5N0M4NDNDNEI0MDA3ODNFNzA4MUU0MkMpGmh0dHA6Ly9wZ3Auc2NobW9ycC5k +ZS9zaWduaW5nLXBvbGljeS50eHQACgkQtAB4PnCB5CwYGQD/TrWLjRMVURO51Bdd +OdxDIkcKfIFFpn8ilstK1rxMNT0BAKHEiRYi4Wx4IBzEwjtbExnCxiRwZNbFSraT +1TYf5Fs8CRBt6iujC8OetrYLPDwKnF1CnbAQz0+83qcV4atuJy0RykEkkcWHHvuD +ZiqBJDIcDk+0SZ1wyFnLh7tYV6vlx21xCD+vVn9w3QOqZL9tsHZoEj/lOQOyCSeA +gAJYfC7bH1PcE1tKGK7Jt8RRpEkYNRAt/9az0O31lpnGDU9wUg+eVs2EVB8e7V2d +6o+kTaExwr9m3iA5fTGLK6OfP9MYHOg2HXdkDGoLVUqI5oqJlHLlmSlbVPWXgVIC +yrTjIdTKzwiIxmsXaKeDL1tzKu6Q0Cq4m2XAWv00KtR6v1dVL/VHOh0pWWgt6a4A +ABsiKogeRBFh+8oBZ4+SnPvytHkYxgU0GhqgIeOVxSzGNv+4ZN0Ae88mHTjr3k0i +So7HE8/sq4YkhwZR86/sn5mLWKhkrDyKFHwGzkP4b0CVd6er6PcvYzmZoeppsB27 +xjh2Vd8rZGPSvZxAUk1Sgth354M4A0TcOVqfRMKk3wI6/eAHuCxSaIYigqN6awuk +Jeplq+MQVmw7Qv6X/qo2niV4A/uaZaI3MLLd356MfYyYnT/ffd2BqRQ1rfUCnOmI +s0G6e4ggsoSfqT2QFd30/3BAscqIsVFePHF5L4pdyLuGZes7SABHtowvWvKk+1am +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 +bmuxCG2eboeIRGiC4PduoN6e2xeqSkEiE+xz04dFXhva5LWa1UEs/iu31XgRwgaS +UhKSELSTb6dYWv7sNLv+RnEW7a6R4YBXJHR1uMMEQfApnQEFwNJxY+JjFCnlcrW7 +ZOCB8d9TKZgrqhNw7VTtz9McGvMy4xkjc57/KIblVJcTEcxCY5hnz7GNY2lqFBoU +gKs9b8ZB0boTrxLUc3wfZ5KU6hPANllTi/5W1sMcemzTQRKqdsA5sz3lO6dowVnR +mL9+ll9OczJ8pQnY0uchm3krXacMRBZRLBd+PsKy+zXv9jIJXXONv064hTXFIUoB +yAQMX2geoArW4ktWhJd1v7K2eE4UHIG8Dx3n4kEABimJCjkEGAEKADkpGmh0dHA6 +Ly9wZ3Auc2NobW9ycC5kZS9zaWduaW5nLXBvbGljeS50eHQCGwIFCQ+70qQFAlGq +risCbMA/IAQZAQoAMAUCUaqDEykaaHR0cDovL3BncC5zY2htb3JwLmRlL3NpZ25p +bmctcG9saWN5LnR4dAAKCRBLgqlsFdI7SdfdBcCjEQyDj58SBAoQBF0z1jDSHxET +jsxiRMZqPuvcMBT2MqyGI2j5UNF9F2srQai7LbFag4LLMHOwBbKNun9M5jorTYGw +g9WDKsLyLSRHvbKXKivLErwBv7pQAKs36PMe4fG7UBotG4td4tJZPlXXDtKdQFgj +uZexwndeqRQVD/lGRTaj7uVLHm7RUrrkU/wc5/dZSvXu/MAFOjq+Jdhz9FfJMslt +cJZxP8MrbpqR2GSs3ydkEIc6AU1lwJ8gBBkBCgCQBQJRqq4jXxSAAAAAAC4AKGlz +c3Vlci1mcHJAbm90YXRpb25zLm9wZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXQ4NTI0 +MEMxODE2QzExQTMzNUU4NjE4NTNDNTI1NEM4NDE1NzcwNThGKRpodHRwOi8vcGdw +LnNjaG1vcnAuZGUvc2lnbmluZy1wb2xpY3kudHh0AAoJEMUlTIQVdwWPUjAFwIBe +kTZ+c5tPpeb4yeV9c15kvyZy3/80P9jwlWtjahw7GnG7neL5QPmAMutzXQE8x3ZP +WxTMEZeZecEBMnkq3V3fxi7jSspNGCikb8VR6BLwONjLUGzucbGxAh6gJK4ZdiAP +LBci9uY4/p55+11Bj+e0ab8yYHMmkFErOdQGBIWCJmVkMj47SV2M88hNZj9/ic09 +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 +RE9JcN2GfReks3koK2OaV9RKZDxeJj8HABEBAAGJCsMEGAEKADMpGmh0dHA6Ly9w +Z3Auc2NobW9ycC5kZS9zaWduaW5nLXBvbGljeS50eHQCGwIFAlGqrl8C/MCHIAQZ +AQoAMAUCUaqEiCkaaHR0cDovL3BncC5zY2htb3JwLmRlL3NpZ25pbmctcG9saWN5 +LnR4dAAKCRAzaZNJytv9w1JJB/9ugqRgNbEVyf7bSBwChXtP3DOZXFHrSHZLlVR3 +6+AGng6dCY+bUQDRIMZjnzmLKYoGbBi+UfZ+7N493/A5cTXm9TkrxFkW0p5+Ql3k +qqMX+G1DWFYiSSZWlZkBXZRen0P+wqDpOZN5qNiaPIdHdARnWRWbPKDf55mCs6/R +REQ4LnUXvzrmYUw6bAlxHx/8HF7sRaH5DK7QEx2E/NRdIcBJ7uq2oR1vkmlAHH0V +4shdJQ7aj6FZe1N+jEH4vIYgl+CNbMhkJmG3GGbxTKrMzIlRugHlylum57L/gJYb +YMY1ChUMvEX83JV/+eIRUu3WNwiWUSblhC5hVyXU9SbY0yGxwOcgBBkBCgCQBQJR +qq4jXxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25zLm9wZW5wZ3AuZmlmdGho +b3JzZW1hbi5uZXQ0N0VBRjk1ODNEREM4QTg4M0U5NjZCQUIxNDMyMDQyOUJFNEI3 +MUMxKRpodHRwOi8vcGdwLnNjaG1vcnAuZGUvc2lnbmluZy1wb2xpY3kudHh0AAoJ +EBQyBCm+S3HBVEMH/1byR9zW4Nq9+P9qrLoxgmUQ+0nY2dvQiqBsnfO42Mwapc2m +JkzXX01kEPM1qJvJbdFmi91PL24h/Iq4wdxeIpnI4+ge8M3q+3AdN3raktCIqopW +xY2jXkjKsuxo7kvWFUePdfRkcb13hcxAEnL2ogq98Ur8YYqjCo/8Dz+k8AHBbHF0 +VP/p8RuCak12X/GRArcTxwcD4KkfTvQ7Qw/Jhjc62UYbwEZRFmqOERpmfAXD3VL+ +P3bd++pDz0p4vBfLBQeF9h6t2o/g1wq5fW97et3XCDXkvSLvwvXmeIsW51VlTqOj +MTsVnj7puRRxWB76sL7GArdh5Rms5JC8CaQ/5boJEG3qK6MLw562fXw8P1VFef07 +B+HUw7kS4gVLjG8VSff4rkzA1xRWEBWP68J/2J8gxd+HZYkH3CkLoUtz2eDxJwvd +uT2Jove6NysghJy9VAmKKUP60rk3B6/26tuU9DPRC/wKHJo6Vjz+7j4pIa+UN7TN +Zm2wwsNVY2WGyIpvANNkL9tzZRXn+fV0CTWJAevXMekJUYsC+Oz5B0u2ttGeKwxm +t79iBuN1mR3RtbtMta+tx7szk+lMcyNbSQkca+X5+cuoenq6341RoK6UpPiEq4Bj +sOqXvUJWFkWV6mWj0Os/FonH+4ATRjeJs6RNYL3uRbi6tC8nnfmRpjURs7CRS35N +gnfj2eWAQwys0yypFYyQ1q7D+hyjBRitHMvL4aT0Izp3b6/hV5xtWoHnGZJ8L9f9 +MWaLsJbfqz03fD2QzBmTuO/PP+vJVhc6rs+rRSuOL1SylVM4Ez//rhk55+HOm5mq +mCm8uR/BGU0FXRRUOYC4XyGdZn3sICudXaeyG31QzBzRqEffT7/hylE8iw52RXaa +/ZdTowODhLW4MzyW7JIHxU+IBYFOGk7ymdHvsOwgVUifKzVWnbe/j0GJus8eSvEj +VnluZAatLiNkItdCLTjIaoWRG1vm0ypMcLTT2TqgCYCpjCnjHSff4NpozepWsH/8 +DW/Oj6iuUfQ5dZ82iwGYTEclVHG+0TnFJDx4eHvKaMzs6z7oN/WTi9z8aP/UrgIT +xBXHLHUhQHHeWJORz5ZKeBhaCwsjBZvoctAlzlbATQNUE+o9MO0DBcoUdI5DxV5L +hjcN6uFBGph+i+GN9pLvTMrNm1iaqn3VzRrUcBqd0/PmiYGrQnahtDlTe40WEEXy +s/ldy3a/QQH+xytR1EXp6Pc2+ne731RZyP+menUKvPUvvwbtxm4wn3ZvU5DnC6XF +5mGYqGWoOHdhTQBXHdmdCKonyxS7y4MV5MZ2VbXVy4g9/LHRM8PFd5icczYe4TPc +g2hpVNVGz7R1IsWkbm6UXK+9wH94aTGAeSjs8+0cDYMPny1tcpHGtEe9UzJmDYwg +Y+4dfx55YceOutqX2qLkPhrL3XZHwV0BdtubUIVouiCAFs4jzzZhmR+7qif10utq +zH38rQb1WeZavN3R8NJ+3G5TYnhNm45d8xEQTecVi6nVYeZGGuH7udfQD84elhc6 +9dHAvZrvU0EH+AxmAMxOqZZkGm6mcd2afUzvxh3MJEQUnMrGnV1yP6R7WEXeQjf3 +8F6KtJzdegr1PpGYAXVORQzcj2A5c8A2JPoWf577lP6rSofYNI/3lvYKK1gikWGJ +K2ZJS+5734DukeFLT4kYY5lzo53x5s2u8jGYtn7fdxRwiEKSSAVHP9hyDSTrrVYQ ++H3pzTtwDbpDDB8EDeg/Fg8gtfejPRYz9whep44CGyj7w/x4Jwaz8zk3ylkzAFXC +eGfvzMFo6gGjAEJcsa8TqcAv04zfQ7ygHnlbwCVL0J0Zz4t5ACmooH0HjhbFtc7P +4Om6waUKCs13lW0ngp2UcCEdczZx6LcsEEJ81kKfzbz/dpVyQyoUVexliQIsaDyL +vL3TXl6T6lg0xyZ9WlS5yiPp/Xo20nSNSB+KpPXKI1G8pUwdxuZoPch4so1gv6kE +bnDKKIYfTYVHZboElBztH6lo6cRBDYTeFnjnOyZTeFieC2Y3EAnXdXvQu3u6Xu6S +XiZoDOgHtq2IBkqAqrRT5Q2zj8AbsUG/Z+s4aza82ezBEdwl8haE197SMiW9CIma +tBJK/CBqkBs7lvWgaz7WAT6NvhbDZoCAFJg1juyEgknmRN1QrwXGK6G4QOAsFet6 +fzysl8PhOu8ctqkJca6PRzwLTJkOZBr8fKp+A9kXwKaV/ZF3wqjbsNj/FUne2Laj +T9xafYq7ILaqRkuShaeLNgi2IpyicR9ZxlY+Hvj1T0YfGQ9+A+ZmkBGeSJXvje6r +XBJifq2Nzxi74SCgVjmIrSPCTFguXTqLJLlTSDHwCZThc2Q5E0a+nOY/MGIRhBKs +L8+hbJzIjW0yNsPNGuTDMHqA0BalbMfmaiKHT6XBAgyBJqqwE2C7owJ/rOQv1apu +Ce/KWJQqP5rw8rAkvvXEWhz3CHa/ntYpDJB8/fARJ7LIq8+15lYbQaRTs/Wjgk1o +jNf7IJYHHPbSct+/I9BPsULJt+vSqNxr8C9Sfm3oQrcV2kH8kkEk9xjJ5CKzG/TK +vcusewyt+uE0FCADd1BeDouy5coriwRdCdLbkGaq8ntypN58p393NDfmOozuWIc7 +ElfPL6DGwOKkMEo1AlyDU9A+0vdsyHaxD7OdWjaBlWC4QbzOR8sh5cIX63t2m51e +Ad/LdtapqBKoBJM8BE+qeFBwxF0WKNygpm8iYkS2xV/Kf/u4ulB7l5J52MKVAIMs +/7GOOTNsuqPdv9tRRX8phoCLVRmSSa4S2lqP1bPIfFtnb6k9r+Qaq90cQa6te1eW +gB+pdy5KoK0RG+ndDBt/oI/TQ3mDeFfF0xe/NoidN+CXzvPaUPMfc/QKNy7kD+eV +h8gL2VbNpXURGZwoqXtotvgxJ+w9/rTORzzL5eIfnX/Et0hfrXDjUsCOzvh5328D ++NCYuQENBFGqSz0BCAC+IF4tQtLemoXfW6pRkSfNB47CzjAf2Ul76huSpa0BEfuY +cyOFrqQ1rD8t8rCpxElIGAsdAALTNMYDKybLt2Y70qEqASJCPIb9ijSwvqOQL86K +lncrg/E8ai77rAsnsoLk9L6Eb87kPAg3zGZE245E/nnctZk57StgB+C/uq/mmRpZ +J7qVYIvzS+n57Gu5aamXbnNLty4tz6PAKyZqSik7AzRgCYBTP1e2niID/pNzx58t +RfORMyCc6T9wF/+B8L3sUYEXpfbJe/Y6zSi/Ux7pcOic10/+0fdxQZwTogu1VgUT +fDS+bCJ97atHW/fQoKet8Einn68NvRSG98eYwiyHABEBAAGIcwQYEQIAMwUCUapL +PSkaaHR0cDovL3BncC5zY2htb3JwLmRlL3NpZ25pbmctcG9saWN5LnR4dAIbDAAK +CRCh6AJw2nQzlmU+AKCrZfNM9L+7uUtB1Omrih14dtYwNwCfWuIa6fHyHghaAPBK ++nhwJ9LSFRmJB9EEGAEKADMpGmh0dHA6Ly9wZ3Auc2NobW9ycC5kZS9zaWduaW5n +LXBvbGljeS50eHQCGwwFAlGqpD8ACgkQbeorowvDnrZjODxAkiSL7cadPgKzeihV +bzUgg5QS8gPkJnG3PkwXVUxkv4m3XK/LwNjN0Q/tndDDSWHnfsUCeOmuPX7PLMVE +r5JEy8Wur6w0+pPsmPbWAN9k9EBB7fyuEeho+016zp+1LoPkxs9xCCMl++twRYyK +ILzrRTtb1LfYvre8PsaQZNo415Mxlqs71BuXDDq0P5wR7WxqZ0utQzIXQiNqmjOR +KW1+lsuqPW/WCogy4JKa0xX+RxVlOvPNTud0yTTGU1dJnik1PqmdxyxTaavZHLy6 +plHJN35gv2klCk39/QwBs7O10xR3ox4vgb8hXYhFG4qoO/cSghB9txcdI/O1Rnlu +Vzz1/g3zKxLPlf8d/3HtEhYLaNkFM7pnkfSTiiUusVzfGEmiHOWAHMUJ4Jnj6DfM +eLC04maeUCnl3irbvDO7AiAJuNhfClhYhXIC6Xp6iNaA9jauzm+vVE7ddihQ35y1 +QXANVCpPUbNE5TYPsHk3104IIQ+CYdDBHXNU4wYPs9ajwk3J+NU0wi4BpDWteKuW +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 +LO60oZjQmbMwGd+umWuQPxKgQGieBACZlGkSeBQ/7xsRQ6oi9syrXhbgYgM79+o6 +sr8fGPr2gB5cbcXvdZID97dpSYsx6M4PR8zApI5u/d7T3nYw5GHAt3Ih8e5riPOD +DrQhTEPkDrdtmoxVi3fmqsW2u6j0SrgVRE5RXXDD04JKmIysbQ6KGZWv2OnuDZsr +X24Le6sTOYkJHAQYAQoAOSkaaHR0cDovL3BncC5zY2htb3JwLmRlL3NpZ25pbmct +cG9saWN5LnR4dAIbAgUJGv7umQUCUaquKgFPcSAEGREKADAFAlGqgt0pGmh0dHA6 +Ly9wZ3Auc2NobW9ycC5kZS9zaWduaW5nLXBvbGljeS50eHQACgkQXduvubXpGY4d +BQCfanbX54djWL6u0hJEWrjf3G3M9qsAn0ew7ePY1dkJdlyFmzx7i3qhyJknwBEg +BBkRCgCQBQJRqq4jXxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25zLm9wZW5w +Z3AuZmlmdGhob3JzZW1hbi5uZXQ0NzVBRkU5QkQxRDQwMzlFMDFBQ0MyMTdBMUU4 +MDI3MERBNzQzMzk2KRpodHRwOi8vcGdwLnNjaG1vcnAuZGUvc2lnbmluZy1wb2xp +Y3kudHh0AAoJEKHoAnDadDOWIGQAn38zjmhvKgAGrykyslLX+u2jtfrfAKCVq+gs +F0w0YMQq6SjVzfJAlCpwygkQbeorowvDnrZ2vDw/WOHH9jDSs/BOigW3tO1DIwwF +Y4Vtp3Uk4bGKmq6vsp2urSR9px9kMAxaPI2f7X5uRPyC6/6cuKIJmrkmtlzRCeHz +bKxIC3ay7qUaT0buPi5mbnyA50pta3qYicAREXKW/BMHIXgaWCFnJHAi/DA5scO8 +HdYFyZ3sPrvL/4uNCJnXX+XM27sqIaZ+t5P1e0N8AZrQuQMU8Gj+ltmPc6050AMW +JFtLmmpZUyalqU8R3TcT090Mqxs3r4xrIIhJhXqOLVGquZA4EZE9nf1Ovs50nZo0 +Cfk20UpNC2wOnixbNevd9EJGFUmtd2pPfGQXXuc5qZVWBOfrCbLXnVDz0p/1mz61 +QTsI4KxSwttAR23NvQvgPZctiLjQ0vFbbTxbH/eN8lmMKk7LJxsS7xf9XN70gezv +kqib3bZrqyUXdThKGGK/d0wKpF/IPNwucmwhLs699X0tkkX4JAOPj3siADv4/0a4 +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 +52Orkq5qa23z77nlyHh1Me6eoJzIXZHerRdgquNnXM8j5C3uQXxd2fxVp2Jofd8c +0kDkh7ASCHPENtCmfVFxvNb1zzDMIRTCFSF6F8OEaTbe6x5zlf5gGGnDcphscBFh +Umyd5oBlapjDePD5PyqIe9B6bp9SModrYxkXTkIgCZ/ybHykIF2xSggAj7dEwti1 +2SnpDH9P5IXpF0Pk6CzFIYUvPiNr7bA5KQARAQABiQJUBBgRAgAzBQJRqkp5KRpo +dHRwOi8vcGdwLnNjaG1vcnAuZGUvc2lnbmluZy1wb2xpY3kudHh0AhsCAesJEKHo +AnDadDOWwR8gBBkBAgAwBQJRqkp5KRpodHRwOi8vcGdwLnNjaG1vcnAuZGUvc2ln +bmluZy1wb2xpY3kudHh0AAoJEJH8fYHvZ4nxWZUMv3E6Pbl8AjQ+zEmq7u11/zft +1k/aI9ngW19pHmKmrQcRVMm+CVwvtPGOikc4+QDXBt1MEM3QPihYeu822c6gbz00 +p6FbyTjVCrToUEYUcw4EKpM+7cSOSoJWwB43jYOh5SFhSpQU8w5d2DGmwHZ13kKE +HoW9dVM6vuwC28N7Cn3S3j0zs+2WNpOmwP5gm8sAZMSqaUctdApguhOA6Cgbywf6 +U9PTNZbYCxxBUGepSgoREkpKxqqpI5ARTRWipOM0pC/cU588PrKO+J3AY2tYfDwe +BaIS3Vk82ufhJRzVfRiGQ7NR5ERAlSkKNrYV2ZbhDGN9F3USnPnxDM5vsdBo07Ox ++R1Kx+eOtYqjXZ97ZSjEB+9e1OJi3CSQOHBaB7g/1f7wnoFa9Hwn6Ww8aZ1hJNDm +Ym9bDmUlduA40IJS3sYRs7i6urp52kz05ns9mk3nGbVsptCosf9S9OR4/gjyn08H +j3HI6TLvT15zYN+a0DLlS8cX1/aoe2+yELTUxuX0JYfx47oeskQWj1Wj5DRX21bi +RZiffuHzgs/ZAKCzC+1c3iZ27Q7YC4wOR5QZdvNl1wCbB1v+nNU3XuFK2zryuNUP +Zo1ac4CJC/MEGAEKADMpGmh0dHA6Ly9wZ3Auc2NobW9ycC5kZS9zaWduaW5nLXBv +bGljeS50eHQCGwIFAlGqrlcELMEfIAQZAQoAMAUCUaqEZSkaaHR0cDovL3BncC5z +Y2htb3JwLmRlL3NpZ25pbmctcG9saWN5LnR4dAAKCRB1gcY2tp+2fTCkDMCJkHUK +QRP0frLAFFNarAArCotLJ4bQlVszk3Z4kUCEZZNMBD66I80eEVxfPJWwEBxiGGU8 +PPDS25u4Bys9ygCf6ysn18CuuQBCBZIzEVgIiL8BJObAEHFNipBmPoQQGpjJyW0y +D0cU5i2i1ir7R9P4onMGEh1yqjGMxdidpKDgQMRdNXgsXlQPrGum71ed1qIVd0M2 +ptcMyX9/Tald7IpGQEVu8SqD013cMZ+Jhi7iPX8BWWNKHAhdBxmQaLaqsky934Mq +dF2ty7U40eyOcLGlKl5xJdpCnEqJnL5UnZqFgAy/2Dcd7NAgY9KEmlnLeAHkUagx +qJedZSsyD7yc/pnXrahOLPHQm7LMgha0b78pmq6uNR8UyOqbKnru/krKtHr0lKTM +hJqqGs2bASpxu5zZjGdijDIe4y5WxCUfIDgcguISD7h54IlHpY2oyGqvDJELQ/UU +TnzkWjQnnk6msD9sRN2iviVfc//N6KCqGjLUYUPYMIHBaZY3ZfP5ig21ZJeRvos2 +sVVPsG3ScaaN+GzAoFqGi2J6P3fBfyAEGQEKAJAFAlGqriNfFIAAAAAALgAoaXNz +dWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEQzRDU2 +MzFGN0ZCOTRCQ0YxQTRGMzkwNzkxRkM3RDgxRUY2Nzg5RjEpGmh0dHA6Ly9wZ3Au +c2NobW9ycC5kZS9zaWduaW5nLXBvbGljeS50eHQACgkQkfx9ge9nifEYYQy+MInn +IJyFGXVz6GzP0SDEIG5JmefopVb7whyworN6dzGx8FL33sVYwHWWADe2dfj3d87O +aL1U1XvWsCZOvBRXiKz3UZ0eMIDH3mQ5wHB47Uv062E+SH7jsGXK7x4lflD5HLkq +Yxq1FAQlgMTeq0cqBMnd7gKUCmE4mtfCBFXxRAmPn56vpll9iRSPGjtXbiNPqgpM +6hjGVnbobSDLmWzwHdrEGnS+ZimPyklaRn9zDYdJl1TaGHr8ez/qPf6shMd/elGn +u458ma8HTPUPlzN//a1h2hm0LiyHaLMtPqqZPgHz/96ywa33eaS0Fd0l0IwC++DA +YQzrWts3RodANfc8szpKkO4ja6xYGPSDBEZxomw0iMK5PP47na9KDnLQWsQ3mxAJ +ogxvBzS2ASX8ZG0Uopowhq/JOoNi54KYBLc4y8uHTBY5sjnQCk9dyoWYajoPNvTQ +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 +yAiYXT7WccARY2bfiaRgkHT95Fw2Am9jlqww3jOedMVTpw3PHtafc4JU5GWGamrv +mMMF6i/c6+ZIUysBALl5Iqkvw6bJrndjceZF2H9oxTs1fQGvSWacZhKWSPNFCACW +KusRtbRGgMoQM87RBDoMLeM7myH9KmHyvA5mx3uAdSmiQ3XdCacG+m1m0v5gXJsV +M4mGJPMltW0fauMFeKZW8Qim98oWb6x50K56Y8Bz+MZmBgSKQ2cGS/GWIKAiZRWx +N2Av9rw/lQnUGT3/fh46rsxJwXcuVfCV/YG8sX4XlHlYI9ZkOWLUXCQIce4yL1EZ +fRUPLR34CL1FvNAJuvDxa+xZrGo1Goa+sd0ZCiVLx4bb6s73lHjk5LjFF/l9+BMv +UaORvjrWUFp3YcATdokW14rLrGma2X6LU+1lvnqD+bu0ojH3Qfu5MAkKwbZeEwon +z3Of5QmzHfIU6Orw5wkbCACbWISYx9PkOPcP9yx2D/H06rTzJW83jcB3addfBzqq +VEnn8OIXrKbZX7427b5+E4t5ZSGZDv8P/waNMqpQ+ny1IxqAL2J+4Cb88CgMetMY +wm1maVO7Td3o1Qc2Pr80XLBYbnlACqcs69JoN+Q8TND6ViEHDUDkrhAZSAtSqzO5 +aeqxLD+Ft7wncP5n3QC0q9Eawz+hJ/25E14KGp81eD/TQ2mxwBkgRhHy3yoZU0Cc +39cd8MDWoWYCbllecjOHfSOJi4cBgZGf4T3JAYxgV4BVx1lBCkIKOrz5b/S3FZ9M +/c3lfTXCN9bZOyc4gZ+fA56edkXsqY0zb1A935s6PEYeiQlGBBgBCgAzKRpodHRw +Oi8vcGdwLnNjaG1vcnAuZGUvc2lnbmluZy1wb2xpY3kudHh0AhsCBQJRqq5JAX+J +IAQZEQoAMAUCUaqDvCkaaHR0cDovL3BncC5zY2htb3JwLmRlL3NpZ25pbmctcG9s +aWN5LnR4dAAKCRAa2XK14mlsFGd+AP9D98RWjul8UbDjRHhjsKzaq6GCu0pK3oMw +PSfaUPwq7QD/aw63yIjNsvamT9bfMM9wwwuTt4X3GXsBj89bnKo/Ki7AKSAEGREK +AJAFAlGqriNfFIAAAAAALgAoaXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5m +aWZ0aGhvcnNlbWFuLm5ldDJFRDZGRkQ5MkZEMzU5NjEwMTkzREVBRTI1MDI0NkVB +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 +lXZdYUkRujlFpgD/RL5cTWnIZWhQIBS9A2AtuX52P23hkCsxFNkpRvri/43AKSAE +GREKAJAFAlGqriNfFIAAAAAALgAoaXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBn +cC5maWZ0aGhvcnNlbWFuLm5ldDc0RDU2QUI0RUMyMkE5ODM5N0M4NDNDNEI0MDA3 +ODNFNzA4MUU0MkMpGmh0dHA6Ly9wZ3Auc2NobW9ycC5kZS9zaWduaW5nLXBvbGlj +eS50eHQACgkQtAB4PnCB5CwYGQD/TrWLjRMVURO51BddOdxDIkcKfIFFpn8ilstK +1rxMNT0BAKHEiRYi4Wx4IBzEwjtbExnCxiRwZNbFSraT1TYf5Fs8CRBt6iujC8Oe +trYLPDwKnF1CnbAQz0+83qcV4atuJy0RykEkkcWHHvuDZiqBJDIcDk+0SZ1wyFnL +h7tYV6vlx21xCD+vVn9w3QOqZL9tsHZoEj/lOQOyCSeAgAJYfC7bH1PcE1tKGK7J +t8RRpEkYNRAt/9az0O31lpnGDU9wUg+eVs2EVB8e7V2d6o+kTaExwr9m3iA5fTGL +K6OfP9MYHOg2HXdkDGoLVUqI5oqJlHLlmSlbVPWXgVICyrTjIdTKzwiIxmsXaKeD +L1tzKu6Q0Cq4m2XAWv00KtR6v1dVL/VHOh0pWWgt6a4AABsiKogeRBFh+8oBZ4+S +nPvytHkYxgU0GhqgIeOVxSzGNv+4ZN0Ae88mHTjr3k0iSo7HE8/sq4YkhwZR86/s +n5mLWKhkrDyKFHwGzkP4b0CVd6er6PcvYzmZoeppsB27xjh2Vd8rZGPSvZxAUk1S +gth354M4A0TcOVqfRMKk3wI6/eAHuCxSaIYigqN6awukJeplq+MQVmw7Qv6X/qo2 +niV4A/uaZaI3MLLd356MfYyYnT/ffd2BqRQ1rfUCnOmIs0G6e4ggsoSfqT2QFd30 +/3BAscqIsVFePHF5L4pdyLuGZes7SABHtowvWvKk+1amtVpKqYSYHYjuLYDW4Q6Z +Cw1LpW09ay+IJ2RZ7oe/D/mmO9ArX2VcCOu9jLBDhENC/A8ZB60B+kqGOMIz5yfv +Wu2HXSvoVrbquL3O0hmCbUVmfA2innEOxwXTx/cDRVuCxGU72H4uX1Iax1rfslUb +wcIFMP0H+F+DkDbc64H+fWh7l47BBE5VTXzRgFvwGUzzaFxyADSW97KwexFCKW1S +ESK/YbzcwenTkVjCl0FtxtoM6k7A2p1Iq9G8HZRs11Wpt29nNVqnJjF8BrrxYX/T +KSyYau1Jnk1qrj9WKceBpZln8SRy1K8iR5LmnbsurELnUvxo2MnzGbSKtUdBl82B +Lx3JyOR0WOvW8nIzqbK97rfaxyJTxD6Fv08W95Y3cq7sx3Km4W1oqq037Rrnb9TL +W1A3JIOg9xXg4Pp03Pu+rd/HBUx0mDTe0SXdNdRusTgy1qYokjvW13U0mIiDhmXt +HDXMLdSyL2VBo5TnyGGuytjLIhbH1XqCd5qssrj9PQNNc32sPrVbL2UOuo/vzD1f +tW8Ct3DIRUsYhaRpgnr1kuakTMjwIoelHslfFgRVKYx3GS5Q57N1C0BO92jPTCYm +f6wwdu34hCfAT+/jCWY0PBiM1Rv+6gFolexCWK5otC6HoB4I+IuQJuidjyLtoTbT ++UzAfIrSrRjdZ677QLLIRBu9vOkKn6V7SsrmhNAjtEfziuAhCCtMLs1aWD+YQSFi +NRhtDXc0THz9y00MZEaKv5t7+3qMVe3KIzsCFgBF6w1FPicLBYKZsRNI14WA6uh7 +KHnSu+qGBCSeUrR+MXgybXYnJab4guLM5EYSUFNCh5P+YkJNMruZjNtZrRZX39yk +Fydc2EIIT7qB6kcTcco4b8CxpJY7PbDmzy0P5SREudv6AVRL6+dU3gSUL4QWyPbx +7yfhpGcSYNFE2LflWrVVHCKRgYdpXpQevVgiRGMn3nB2Op1sIlaFFI3fjQ2kL4rs +gyJY46MvfEISaiFoe44b20iJRPa1IcAQQY+bSWjRICVcT84zDpn3Tqb+5GCk6bQ8 +aGAMdI+FYUaHCYUdrrQDgx+LO1DW1RCyFkqUmo9gKfnooJ+ywx0mXvid6jjqm0zt +sUv95NgdvaxPi7gCs9u6h0Uire1K3RmdjVoxSpXo4TBCtDMuj2s8sDkAxmml1oDu +euSiKLXTYIOLXJLCtbr+EPZfGpxfa0M+N/sMpVMbFIAYVaYBUBE4nHk6ZI67Q5oY +XSxSSaImcvv6+mUrCxpN6fUL1+I+RRzjkbaS4mRdRi2PwLWfKP+7di/4AJkgbcdw +c5kO2KJo/VLaIh/psVEhGIn4xroyxOi8BjYfNF3KSiSai5casuZADWupSBkO7Tkb +je3wQtSMfM8LFs97ib5pQpE2ylEezcmbR3cHt+nXFA13lyUcEQJlBLYWzuq4SwLe +DLoSn2NAO+88oW3hHc+5tu+7+zCMfDQj0xc8r03rcxI7gKOWtKKYEFjmMq1394X3 +D7QZn++57IMnPde9KosLoArsNiMQ9sVr5dALCkgxvveO0nXpiRoFZr5o/dbLmdh8 +W9PxRwVzXjktATiPo7fXzqlyh1vWhlDqOFFgLd7JrHMvI4Q9Do/GnmpJieA0gQN6 +Ddk9kw9+8x6OBTFZJAA2mNMpjNgBXl3koGo0/Aiqe2Y9hLhYWMIV+S7gkcEPlYBd +mL5tF25um8uH61nzgnt4SKt4JwleXN/Oc7zvEk5IfLNhTD0ZwYWJsGXhlWthiFWB +Fvlpf3Jqz22UjrcsAJZSuwghnmAWUTPi5zSh3BnVeCICS1wQ21gaf8OzAaLG5zis +fhxP4zX+aweeJaLNG+/CzV7Ld4CH/Z7Z9zjKq56cW4Zla7eWuQzzSlO8OX6VwavL +nq+iB2U7OEKH0G2M0D5HJYFHqdhCNmyaGv5KVu45mnJj4YWDpSn47GYg8K7/dtoZ +hOqSpl2gdgkvxp8Jsg== +=2Gwi +-----END PGP PUBLIC KEY BLOCK----- diff -Nru gvpe-3.0/debian/watch gvpe-3.1/debian/watch --- gvpe-3.0/debian/watch 2018-05-13 01:28:55.000000000 +0000 +++ gvpe-3.1/debian/watch 2018-10-27 04:13:31.000000000 +0000 @@ -1,3 +1,4 @@ # Compulsory line, this is a version 3 file version=3 -http://ftp.gnu.org/gnu/gvpe/gvpe-(.*)\.tar\.gz +opts="pgpsigurlmangle=s/$/.sig/" \ +https://ftp.gnu.org/gnu/gvpe/gvpe-(.*)\.tar\.gz diff -Nru gvpe-3.0/doc/gvpe.conf.5 gvpe-3.1/doc/gvpe.conf.5 --- gvpe-3.0/doc/gvpe.conf.5 2016-11-02 07:01:51.000000000 +0000 +++ gvpe-3.1/doc/gvpe.conf.5 2018-10-25 03:02:15.000000000 +0000 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.30) +.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.29) .\" .\" Standard preamble: .\" ======================================================================== @@ -133,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "GVPE.CONF 5" -.TH GVPE.CONF 5 "2016-11-02" "2.25" "GNU Virtual Private Ethernet" +.TH GVPE.CONF 5 "2016-11-12" "3.0" "GNU Virtual Private Ethernet" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -611,7 +611,7 @@ .IP "serial = string" 4 .IX Item "serial = string" The configuration serial number. This can be any string up to 16 bytes -length. Only when the serial matches on both sides of a conenction will +length. Only when the serial matches on both sides of a connection will the connection succeed. This is \fInot\fR a security mechanism and eay to spoof, this mechanism exists to alert users that their config is outdated. .Sp diff -Nru gvpe-3.0/doc/gvpe.conf.5.pod gvpe-3.1/doc/gvpe.conf.5.pod --- gvpe-3.0/doc/gvpe.conf.5.pod 2016-11-02 06:56:48.000000000 +0000 +++ gvpe-3.1/doc/gvpe.conf.5.pod 2016-11-12 21:45:46.000000000 +0000 @@ -509,7 +509,7 @@ =item serial = string The configuration serial number. This can be any string up to 16 bytes -length. Only when the serial matches on both sides of a conenction will +length. Only when the serial matches on both sides of a connection will the connection succeed. This is I a security mechanism and eay to spoof, this mechanism exists to alert users that their config is outdated. diff -Nru gvpe-3.0/doc/gvpe.info gvpe-3.1/doc/gvpe.info --- gvpe-3.0/doc/gvpe.info 1970-01-01 00:00:00.000000000 +0000 +++ gvpe-3.1/doc/gvpe.info 2018-10-25 09:32:50.000000000 +0000 @@ -0,0 +1,2211 @@ +This is gvpe.info, produced by makeinfo version 6.3 from gvpe.texi. + +INFO-DIR-SECTION Networking tools +START-INFO-DIR-ENTRY +* gvpe: (gvpe). The GNU VPE Manual. +END-INFO-DIR-ENTRY + +This is the info manual for vpe, the Virtual Private Ethernet daemon. + + Copyright (C) 2003-2008 Marc Lehmann . + + Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice are +preserved on all copies. + + Permission is granted to copy and distribute modified versions of +this manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + + +File: gvpe.info, Node: Top, Next: Overview, Up: (dir) + +1 Introduction +************** + +This is the documentation for the GNU Virtual Private Ethernet suite. +The GNU Virtual Private Ethernet suite implements a virtual (uses udp, +tcp, rawip and other protocols for tunneling), private (encrypted, +authenticated) ethernet (mac-based, broadcast-based network) that is +shared among multiple nodes, in effect implementing an ethernet bus over +public networks. + +* Menu: + +* Overview:: Introduction to and Tutorial for GVPE (gvpe(5)) +* OS Dependencies:: OS-Dependent Installation and Configuration Notes (gvpe.osdep(5)) +* gvpe.conf:: The main configuration file (gvpe.conf(5)) +* gvpectrl:: Configuration/Control Program Reference (gvpectrl(8)) +* gvpe:: The GVPE Daemon (gvpe(8)) +* gvpe.protocol:: The GVPE Transport and VPN Protocols (gvpe.protocol(7)) +* Simple Example:: A simple yet realistic Example +* Complex Example:: A non-trivial Example +* Index:: Keyword and Concept index + + +File: gvpe.info, Node: Overview, Next: OS Dependencies, Prev: Top, Up: Top + +2 Overview +********** + +2.1 NAME +======== + +GNU-VPE - Overview of the GNU Virtual Private Ethernet suite. + +2.2 DESCRIPTION +=============== + +GVPE is a suite designed to provide a virtual private network for +multiple nodes over an untrusted network. This document first gives an +introduction to VPNs in general and then describes the specific +implementation of GVPE. + +2.2.1 WHAT IS A VPN? +-------------------- + +VPN is an acronym, it stands for: + + * Virtual + + Virtual means that no physical network is created (of course), but + a network is _emulated_ by creating multiple tunnels between the + member nodes by encapsulating and sending data over another + transport network. Usually the emulated network is a normal IP or + Ethernet, and the transport network is the Internet. However, + using a VPN system like GVPE to connect nodes over other untrusted + networks such as Wireless LAN is not uncommon. + + * Private + + Private means that non-participating nodes cannot decode ("sniff)" + nor inject ("spoof") packets. This means that nodes can be + connected over untrusted networks such as the public Internet + without fear of being eavesdropped while at the same time being + able to trust data sent by other nodes. In the case of GVPE, even + participating nodes cannot sniff packets send to other nodes or + spoof packets as if sent from other nodes, so communications + between any two nodes is private to those two nodes. + + * Network + + Network means that more than two parties can participate in the + network, so for instance it's possible to connect multiple branches + of a company into a single network. Many so-called "VPN" solutions + only create point-to-point tunnels, which in turn can be used to + build larger networks. GVPE provides a true multi-point network in + which any number of nodes (at least a few dozen in practise, the + theoretical limit is 4095 nodes) can participate. + +2.2.2 GVPE DESIGN GOALS +----------------------- + + * SIMPLE DESIGN + + Cipher, HMAC algorithms and other key parameters must be selected + at compile time - this makes it possible to only link in algorithms + you actually need. It also makes the crypto part of the source + very transparent and easy to inspect, and last not least this makes + it possible to hardcode the layout of all packets into the binary. + GVPE goes a step further and internally reserves blocks of the same + length for all packets, which virtually removes all possibilities + of buffer overflows, as there is only a single type of buffer and + it's always of fixed length. + + * EASY TO SETUP + + A few lines of config (the config file is shared unmodified between + all hosts) and generating an RSA key-pair on each node suffices to + make it work. + + * MAC-BASED SECURITY + + Since every host has it's own private key, other hosts cannot spoof + traffic from this host. That makes it possible to filter packet by + MAC address, e.g. to ensure that packets from a specific IP + address come, in fact, from a specific host that is associated with + that IP and not from another host. + +2.3 PROGRAMS +============ + +Gvpe comes with two programs: one daemon (gvpe) and one control program +(gvpectrl). + + * gvpectrl + + This program is used to generate the keys, check and give an + overview of of the configuration and to control the daemon + (restarting etc.). + + * gvpe + + This is the daemon used to establish and maintain connections to + the other network nodes. It should be run on the gateway of each + VPN subnet. + +2.4 COMPILETIME CONFIGURATION +============================= + +Please have a look at the gvpe.osdep(5) manpage for platform-specific +information. Gvpe hardcodes most encryption parameters. While this +reduces flexibility, it makes the program much simpler and helps making +buffer overflows impossible under most circumstances. Here are a few +recipes for compiling your gvpe, showing the extremes (fast, small, +insecure OR slow, large, more secure), between which you should choose: + +2.4.1 AS LOW PACKET OVERHEAD AS POSSIBLE +---------------------------------------- + + ./configure --enable-hmac-length=4 --enable-rand-length=0 + + Minimize the header overhead of VPN packets (the above will result in +only 4 bytes of overhead over the raw ethernet frame). This is a +insecure configuration because a HMAC length of 4 makes collision +attacks almost trivial. + +2.4.2 MINIMIZE CPU TIME REQUIRED +-------------------------------- + + ./configure --enable-cipher=bf --enable-digest=md4 + + Use the fastest cipher and digest algorithms currently available in +gvpe. MD4 has been broken and is quite insecure, though, so using +another digest algorithm is recommended. + +2.4.3 MAXIMIZE SECURITY +----------------------- + + ./configure --enable-hmac-length=16 --enable-rand-length=12 --enable-digest=ripemd610 + + This uses a 16 byte HMAC checksum to authenticate packets (I guess +8-12 would also be pretty secure ;) and will additionally prefix each +packet with 12 bytes of random data. In general, remember that AES-128 +seems to be as secure but faster than AES-192 or AES-256, more +randomness helps against sniffing and a longer HMAC helps against +spoofing. MD4 is a fast digest, SHA1, RIPEMD160, SHA256 are +consecutively better, and Blowfish is a fast cipher (and also quite +secure). + +2.5 HOW TO SET UP A SIMPLE VPN +============================== + +In this section I will describe how to get a simple VPN consisting of +three hosts up and running. + +2.5.1 STEP 1: configuration +--------------------------- + +First you have to create a daemon configuration file and put it into the +configuration directory. This is usually /etc/gvpe, depending on how +you configured gvpe, and can be overwritten using the -c command line +switch. Put the following lines into /etc/gvpe/gvpe.conf: + + udp-port = 50000 # the external port to listen on (configure your firewall) + mtu = 1400 # minimum MTU of all outgoing interfaces on all hosts + ifname = vpn0 # the local network device name + + node = first # just a nickname + hostname = first.example.net # the DNS name or IP address of the host + + node = second + hostname = 133.55.82.9 + + node = third + hostname = third.example.net + + The only other file necessary is the if-up script that initializes +the virtual ethernet interface on the local host. Put the following +lines into /etc/gvpe/if-up and make it executable (chmod 755 +/etc/gvpe/if-up): + + #!/bin/sh + ip link set $IFNAME address $MAC mtu $MTU up + [ $NODENAME = first ] && ip addr add 10.0.1.1 dev $IFNAME + [ $NODENAME = second ] && ip addr add 10.0.2.1 dev $IFNAME + [ $NODENAME = third ] && ip addr add 10.0.3.1 dev $IFNAME + ip route add 10.0.0.0/16 dev $IFNAME + + This script will give each node a different IP address in the 10.0/16 +network. The internal network (if gvpe runs on a router) should then be +set to a subset of that network, e.g. 10.0.1.0/24 on node first, +10.0.2.0/24 on node second, and so on. By enabling routing on the +gateway host that runs gvpe all nodes will be able to reach the other +nodes. You can, of course, also use proxy ARP or other means of +pseudo-bridging, or (best) full routing - the choice is yours. + +2.5.2 STEP 2: create the RSA key pair for each node +--------------------------------------------------- + +Next you have to generate the RSA keys for the nodes. While you can set +up GVPE so you can generate all keys on a single host and centrally +distribute all keys, it is safer to generate the key for each node on +the node, so that the secret/private key does not have to be copied over +the network. To do so, run the following command to generate a key +pair: + + gvpectrl -c /etc/gvpe -g nodekey + + This will create two files, 'nodekey' and 'nodekey.privkey'. The +former should be copied to '/etc/gvpe/pubkey/_nodename_' on the host +where your config file is (you will have to create the 'pubkey' +directory first): + + scp nodekey confighost:/etc/gvpe/pubkey/nodename + + The private key 'nodekey.privkey' should be moved to +'/etc/gvpe/hostkey': + + mkdir -p /etc/gvpe + mv nodekey.privkey /etc/gvpe/hostkey + +2.5.3 STEP 3: distribute the config files to all nodes +------------------------------------------------------ + +Now distribute the config files and public keys to the other nodes. The +example uses rsync-over-ssh to copy the config file and all the public +keys: + + rsync -avzessh /etc/gvpe first.example.net:/etc/. --exclude hostkey + rsync -avzessh /etc/gvpe 133.55.82.9:/etc/. --exclude hostkey + rsync -avzessh /etc/gvpe third.example.net:/etc/. --exclude hostkey + + You should now check the configuration by issuing the command +gvpectrl -c /etc/gvpe -s on each node and verify it's output. + +2.5.4 STEP 4: starting gvpe +--------------------------- + +You should then start gvpe on each node by issuing a command like: + + gvpe -D -l info first # first is the nodename + + This will make the gvpe daemon stay in foreground. You should then +see "connection established" messages. If you don't see them check your +firewall and routing (use tcpdump ;). If this works you should check +your networking setup by pinging various endpoints. To make gvpe run +more permanently you can either run it as a daemon (by starting it +without the -D switch), or, much better, from your inittab or +equivalent. I use a line like this on all my systems: + + t1:2345:respawn:/opt/gvpe/sbin/gvpe -D -L first >/dev/null 2>&1 + +2.5.5 STEP 5: enjoy +------------------- + +... and play around. Sending a -HUP (gvpectrl -kHUP) to the daemon +will make it try to connect to all other nodes again. If you run it +from inittab gvpectrl -k (or simply killall gvpe) will kill the daemon, +start it again, making it read it's configuration files again. To run +the GVPE daemon permanently from your SysV init, you can add it to your +'inittab', e.g.: + + t1:2345:respawn:/bin/sh -c "exec nice -n-20 /path/to/gvpe -D node >/var/log/gvpe.log 2>&1" + + For systems using systemd, you can use a unit file similar to this +one: + + [Unit] + Description=gvpe + After=network.target + Before=remote-fs.target + + [Service] + ExecStart=/path/to/gvpe -D node + KillMode=process + Restart=always + + [Install] + WantedBy=multi-user.target + +2.6 COPYRIGHTS AND LICENSES +=========================== + +GVPE itself is distributed under the GENERAL PUBLIC LICENSE (see the +file COPYING that should be part of your distribution). In some +configurations it uses modified versions of the tinc vpn suite, which is +also available under the GENERAL PUBLIC LICENSE. + + +File: gvpe.info, Node: OS Dependencies, Next: gvpe.conf, Prev: Overview, Up: Top + +3 OS Dependencies +***************** + +3.1 NAME +======== + +gvpe.osdep - os dependent information + +3.2 DESCRIPTION +=============== + +This file tries to capture OS-dependent configuration or build issues, +quirks and platform limitations, as known. + +3.3 TUN vs. TAP interface +========================= + +Most operating systems nowadays support something called a +_tunnel_-device, which makes it possible to divert IPv4 (and often other +protocols, too) into a user space daemon like gvpe. This is being +referred to as a TUN-device. This is fine for point-to-point tunnels, +but for a virtual ethernet, an additional ethernet header is needed. +This functionality (called a TAP device here) is only provided by a +subset of the configurations. On platforms only supporting a +TUN-device, gvpe will invoke it's magical ethernet emulation package, +which currently only handles ARP requests for the IPv4 protocol (but +more could be added, bu the tincd network drivers might need to be +modified for this to work). This means that on those platforms, only +IPv4 will be supported. Also, since there is no way (currently) to tell +gvpe which IP subnets are found on a specific host, you will either need +to hardwire the MAC address for TUN-style hosts on all networks (and +avoid ARP altogether, which is possible), or you need to send a packet +from these hosts into the vpn network to tell gvpe the local interface +address. + +3.4 Interface Initialisation +============================ + +Unless otherwise notes, the network interface will be initialized with +the expected MAC address and correct MTU value. With most interface +drivers, this is done by running /sbin/ifconfig, so make sure that this +command exists. + +3.5 Interface Types +=================== + +3.5.1 native/linux +------------------ + +TAP-device; already part of the kernel (only 2.4+ supported, but see +tincd/linux). This is the configuration tested best, as gvpe is being +developed on this platform. ifname should be set to the name of the +network device. To hardwire ARP addresses, use iproute2 (arp can do it, +too): + + MAC=fe:fd:80:00:00:$(printf "%02x" $NODEID) + ip neighbour add 10.11.12.13 lladdr $MAC nud permanent dev $IFNAME + +3.5.2 tincd/linux +----------------- + +TAP-device; already part of the kernel (2.2 only). See native/linux for +more info. ifname should be set to the path of a tap device, e.g. +/dev/tap0. The interface will be named accordingly. + +3.5.3 native/cygwin +------------------- + +TAP-device; The TAP device to be used must either be the CIPE driver +(http://cipe-win32.sourceforge.net/), or (highly recommended) the newer +TAP-Win32 driver bundled with openvpn (http://openvpn.sf.net/). Just +download and run the openvpn installer. The only option you need to +select is the TAP driver. ifname should be set to the name of the +device, found in the registry at (no kidding :): + + HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\\Connection\Name + + The MAC address is dynamically being patched into packets and +ARP-requests, so only IPv4 works with ARP on this platform. + +3.5.4 tincd/bsd +--------------- + +TAP-device, maybe; might work for many bsd variants. This driver is a +newer version of the tincd/*bsd drivers. It _might_ provide a TAP +device, or might not work at all. You might try this interface type +first, and, if it doesn't work, try one of the OS-specific drivers. + +3.5.5 tincd/freebsd +------------------- + +TAP-device; part of the kernel (since 4.x, maybe earlier). ifname +should be set to the path of a tap device, e.g. /dev/tap0. The +interface will be named accordingly. These commands might be helpful +examples: + + ifconfig $IFNAME 10.0.0.$NODEID + route add -net 10.0.0.0 -netmask 255.255.255.0 -interface $IFNAME 10.0.0.$NODEID + +3.5.6 tincd/netbsd +------------------ + +TUN-device; The interface is a point-to-point device. To initialize it, +you currently need to configure it as a point-to-point device, giving it +an address on your vpn (the exact address doesn't matter), like this: + + ifconfig $IFNAME mtu $MTU up + ifconfig $IFNAME 10.11.12.13 10.55.66.77 + route add -net 10.0.0.0 10.55.66.77 255.0.0.0 + ping -c1 10.55.66.77 # ping once to tell gvpe your gw ip + + The ping is required to tell the ARP emulator inside GVPE the local +IP address. ifname should be set to the path of a tun device, e.g. +/dev/tun0. The interface will be named accordingly. + +3.5.7 tincd/openbsd +------------------- + +TUN-device; already part of the kernel. See tincd/netbsd for more +information. + +3.5.8 native/darwin +------------------- + +TAP-device; The necessary kernel extension can be found here: + + http://www-user.rhrk.uni-kl.de/~nissler/tuntap/ + + There are two drivers, the one to use is the "tap" driver. It driver +must be loaded before use, read the docs on how to install it as a +startup item. ifname should be set to the path of a tap device, e.g. +/dev/tap0. The interface will be named accordingly. These commands +might be helpful examples: + + ifconfig $IFNAME 10.0.0.$NODEID + route add -net 10.0.0.0 -interface $IFNAME 255.255.255.0 + +3.5.9 tincd/darwin +------------------ + +TUN-device; See tincd/netbsd for more information. native/darwin is +preferable. The necessary kernel extension can be found here: + + http://chrisp.de/en/projects/tunnel.html + + ifname should be set to the path of a tun device, e.g. /dev/tun0. +The interface will be named accordingly. The driver must be loaded +before use: + + kmodload tunnel + +3.5.10 tincd/solaris +-------------------- + +TUN-device; already part of the kernel(?), or available here: + + http://vtun.sourceforge.net/tun/ + + Some precompiled tun drivers might be available here: + + http://www.monkey.org/~dugsong/fragroute/ + + The interface MAC and MTU are _NOT_ set up for you. Please try it +out and send me an ifconfig command invocation that does that. See +tincd/netbsd for more information. Completely untested so far. + +3.5.11 tincd/mingw +------------------ + +TAP-device; see native/cygwin for more information. The setup is likely +to be similar to native/cygwin. Completely untested so far. + +3.5.12 tincd/raw_socket +----------------------- + +TAP-device; purpose unknown and untested, probably binds itself on an +existing ethernet device (given by ifname). It must be down prior to +running the command, and GVPE will try to set it's MAC address and MTU +to the "correct" values. Completely untested so far. + +3.5.13 tincd/uml_socket +----------------------- + +TAP-device; purpose unknown and untested, probably creates a UNIX +datagram socket (path given by ifname) and reads and writes raw packets, +so might be useful in other than UML contexts. No network interface is +created, and the MAC and MTU must be set as appropriate on the other +side of the socket. GVPE will exit if the MAC address doesn't match +what it expects. Completely untested so far. + +3.5.14 tincd/cygwin +------------------- + +Known to be broken, use native/cygwin instead. + + +File: gvpe.info, Node: gvpe.conf, Next: gvpectrl, Prev: OS Dependencies, Up: Top + +4 gvpe.conf +*********** + +4.1 NAME +======== + +gvpe.conf - configuration file for the GNU VPE daemon + +4.2 SYNOPSIS +============ + + # global options for all nodes + udp-port = 407 + mtu = 1492 + ifname = vpn0 + + # first node is named branch1 and is at 1.2.3.4 + node = branch1 + hostname = 1.2.3.4 + + # second node uses dns to resolve the address + node = branch2 + hostname = www.example.net + udp-port = 500 # this host uses a different udp-port + + # third node has no fixed ip address + node = branch3 + connect = ondemand + +4.3 DESCRIPTION +=============== + +The gvpe config file consists of a series of lines that contain variable += value pairs. Empty lines are ignored. Comments start with a # and +extend to the end of the line. They can be used on their own lines, or +after any directives. Whitespace is allowed around the = sign or after +values, but not within the variable names or values themselves. All +settings are applied "in order", that is, later settings of the same +variable overwrite earlier ones. The only exceptions to the above are +the following directives: + + * node nodename + + Introduces a node section. The nodename is used to select the + right configuration section and is the same string as is passed as + an argument to the gvpe daemon. Multiple node statements with the + same node name are supported and will be merged together. + + * global + + This statement switches back to the global section, which is mainly + useful if you want to include a second config file, e..g for local + customisations. To do that, simply include this at the very end of + your config file: + + global + include local.conf + + * on nodename ... + + * on !nodename ... + + You can prefix any configuration directive with on and a nodename. + GVPE will will only "execute" it on the named node, or (if the + nodename starts with !) on all nodes except the named one. + Example: set the MTU to 1450 everywhere, loglevel to noise on + branch1, and connect to ondemand everywhere but on branch2. + + mtu = 1450 + on branch1 loglevel = noise + on !branch2 connect = ondemand + + * include relative-or-absolute-path + + Reads the specified file (the path must not contain whitespace or = + characters) and evaluate all config directives in it as if they + were spelled out in place of the include directive. The path is a + printf format string, that is, you must escape any % by doubling + it, and you can have a single %s inside, which will be replaced by + the current nodename. Relative paths are interpreted relative to + the GVPE config directory. Example: include the file 'local.conf' + in the config directory on every node. + + include local.conf + + Example: include a file 'conf/'nodename'.conf' + + include conf/%s.conf + +4.4 ANATOMY OF A CONFIG FILE +============================ + +Usually, a config file starts with a few global settings (like the UDP +port to listen on), followed by node-specific sections that begin with a +node = nickname line. Every node that is part of the network must have +a section that starts with node = nickname. The number and order of the +nodes is important and must be the same on all nodes. It is not +uncommon for node sections to be completely empty - if the default +values are right. Node-specific settings can be used at any time. If +used before the first node section they will set the default values for +all following nodes. + +4.5 CONFIG VARIABLES +==================== + +4.5.1 GLOBAL SETTINGS +--------------------- + +Global settings will affect the behaviour of the running gvpe daemon, +that is, they are in some sense node-specific (config files can set +different values on different nodes using on), but will affect the +behaviour of the gvpe daemon and all connections it creates. + + * chroot = path or / + + Tells GVPE to chroot(2) to the specified path after reading all + necessary files, binding to sockets and running the if-up script, + but before running node-up or any other scripts. The special path + '/' instructs GVPE to create (and remove) an empty temporary + directory to use as new root. This is most secure, but makes it + impossible to use any scripts other than the if-up one. + + * chuid = numerical-uid + + * chgid = numerical-gid + + These two options tell GVPE to change to the given user and/or + group id after reading all necessary files, binding to sockets and + running the if-up script. Other scripts, such as node-up, are run + with the new user id or group id. + + * chuser = username + + Alternative to chuid and chgid: Sets both chuid and chgid to the + user and (primary) group ids of the specified user (for example, + nobody). + + * dns-forw-host = hostname/ip + + The DNS server to forward DNS requests to for the DNS tunnel + protocol (default: 127.0.0.1, changing it is highly recommended). + + * dns-forw-port = port-number + + The port where the dns-forw-host is to be contacted (default: 53, + which is fine in most cases). + + * dns-case-preserving = yes|true|on | no|false|off + + Sets whether the DNS transport forwarding server preserves case + (DNS servers have to, but some access systems are even more broken + than others) (default: true). Normally, when the forwarding server + changes the case of domain names then GVPE will automatically set + this to false. + + * dns-max-outstanding = integer-number-of-requests + + The maximum number of outstanding DNS transport requests (default: + 100). GVPE will never issue more requests then the given limit + without receiving replies. In heavily overloaded situations it + might help to set this to a low number (e.g. 3 or even 1) to limit + the number of parallel requests. The default should be working OK + for most links. + + * dns-overlap-factor = float + + The DNS transport uses the minimum request latency (*min_latency*) + seen during a connection as it's timing base. This factor + (default: 0.5, must be > 0) is multiplied by *min_latency* to get + the maximum sending rate (= minimum send interval), i.e. a factor + of 1 means that a new request might be generated every + *min_latency* seconds, which means on average there should only + ever be one outstanding request. A factor of 0.5 means that GVPE + will send requests twice as often as the minimum latency measured. + For congested or picky DNS forwarders you could use a value nearer + to or exceeding 1. The default should be working OK for most + links. + + * dns-send-interval = send-interval-in-seconds + + The minimum send interval (= maximum rate) that the DNS transport + will use to send new DNS requests. GVPE will not exceed this rate + even when the latency is very low. The default is 0.01, which + means GVPE will not send more than 100 DNS requests per connection + per second. For high-bandwidth links you could go lower, e.g. to + 0.001 or so. For congested or rate-limited links, you might want + to go higher, say 0.1, 0.2 or even higher. The default should be + working OK for most links. + + * dns-timeout-factor = float + + Factor to multiply the min_latency (see dns-overlap-factor) by to + get request timeouts. The default of 8 means that the DNS + transport will resend the request when no reply has been received + for longer than eight times the minimum (= expected) latency, + assuming the request or reply has been lost. For congested links a + higher value might be necessary (e.g. 30). If the link is very + stable lower values (e.g. 2) might work nicely. Values near or + below 1 makes no sense whatsoever. The default should be working + OK for most links but will result in low throughput if packet loss + is high. + + * if-up = relative-or-absolute-path + + Sets the path of a script that should be called immediately after + the network interface is initialized (but not necessarily up). The + following environment variables are passed to it (the values are + just examples). Variables that have the same value on all nodes: + + * CONFBASE=/etc/gvpe + + The configuration base directory. + + * IFNAME=vpn0 + + The network interface to initialize. + + * IFTYPE=native # or tincd + + * IFSUBTYPE=linux # or freebsd, darwin etc.. + + The interface type (native or tincd) and the subtype (usually + the OS name in lowercase) that this GVPE was configured for. + Can be used to select the correct syntax to use for + network-related commands. + + * MTU=1436 + + The MTU to set the interface to. You can use lower values (if + done consistently on all nodes), but this is usually either + inefficient or simply ineffective. + + * NODES=5 + + The number of nodes in this GVPE network. + + Variables that are node-specific and with values pertaining to the + node running this GVPE: + + * IFUPDATA=string + + The value of the configuration directive if-up-data. + + * MAC=fe:fd:80:00:00:01 + + The MAC address the network interface has to use. Might be + used to initialize interfaces on platforms where GVPE does not + do this automatically. Please see the gvpe.osdep(5) man page + for platform-specific information. + + * NODENAME=branch1 + + The nickname of the node. + + * NODEID=1 + + The numerical node ID of the node running this instance of + GVPE. The first node mentioned in the config file gets ID 1, + the second ID 2 and so on. + + In addition, all node-specific variables (except NODEID) will be + available with a postfix of _nodeid, which contains the value for + that node, e.g. the MAC_1 variable contains the MAC address of + node #1, while the NODENAME_22 variable contains the name of node + #22. Here is a simple if-up script: + + #!/bin/sh + ip link set $IFNAME up + [ $NODENAME = branch1 ] && ip addr add 10.0.0.1 dev $IFNAME + [ $NODENAME = branch2 ] && ip addr add 10.1.0.1 dev $IFNAME + ip route add 10.0.0.0/8 dev $IFNAME + + More complicated examples (using routing to reduce ARP traffic) can + be found in the 'etc/' subdirectory of the distribution. + + * ifname = devname + + Sets the tun interface name to the given name. The default is + OS-specific and most probably something like tun0. + + * ifpersist = yes|true|on | no|false|off + + Should the tun/tap device be made persistent, that is, should the + device stay up even when gvpe exits? Some versions of the tunnel + device have problems sending packets when gvpe is restarted in + persistent mode, so if the connections can be established but you + cannot send packets from the local node, try to set this to off and + do an ifconfig down on the device. + + * ip-proto = numerical-ip-protocol + + Sets the protocol number to be used for the rawip protocol. This + is a global option because all nodes must use the same protocol, + and since there are no port numbers, you cannot easily run more + than one gvpe instance using the same protocol, nor can you share + the protocol with other programs. The default is 47 (GRE), which + has a good chance of tunneling through firewalls (but note that + gvpe's rawip protocol is not GRE compatible). Other common choices + are 50 (IPSEC, ESP), 51 (IPSEC, AH), 4 (IPIP tunnels) or 98 (ENCAP, + rfc1241). Many versions of Linux seem to have a bug that causes + them to reorder packets for some ip protocols (GRE, ESP) but not + for others (AH), so choose wisely (that is, use 51, AH). + + * http-proxy-host = hostname/ip + + The http-proxy-* family of options are only available if gvpe was + compiled with the --enable-http-proxy option and enable tunneling + of tcp connections through a http proxy server. http-proxy-host + and http-proxy-port should specify the hostname and port number of + the proxy server. See http-proxy-loginpw if your proxy requires + authentication. Please note that gvpe will still try to resolve + all hostnames in the configuration file, so if you are behind a + proxy without access to a DNS server better use numerical IP + addresses. To make best use of this option disable all protocols + except TCP in your config file and make sure your routers (or all + other nodes) are listening on a port that the proxy allows (443, + https, is a common choice). If you have a router, connecting to it + will suffice. Otherwise TCP must be enabled on all nodes. + Example: + + http-proxy-host = proxy.example.com + http-proxy-port = 3128 # 8080 is another common choice + http-proxy-auth = schmorp:grumbeere + + * http-proxy-port = proxy-tcp-port + + The port where your proxy server listens. + + * http-proxy-auth = login:password + + The optional login and password used to authenticate to the proxy + server, separated by a literal colon (:). Only basic + authentication is currently supported. + + * keepalive = seconds + + Sets the keepalive probe interval in seconds (default: 60). After + this many seconds of inactivity the daemon will start to send + keepalive probe every 3 seconds until it receives a reply from the + other end. If no reply is received within 15 seconds, the peer is + considered unreachable and the connection is closed. + + * loglevel = noise|trace|debug|info|notice|warn|error|critical + + Set the logging level. Connection established messages are logged + at level info, notable errors are logged with error. Default is + info. + + * mtu = bytes + + Sets the maximum MTU that should be used on outgoing packets + (basically the MTU of the outgoing interface) The daemon will + automatically calculate maximum overhead (e.g. UDP header size, + encryption blocksize...) and pass this information to the if-up + script. Recommended values are 1500 (ethernet), 1492 (pppoe), 1472 + (pptp). This value must be the minimum of the MTU values of all + nodes. + + * nfmark = integer + + This advanced option, when set to a nonzero value (default: 0), + tries to set the netfilter mark (or fwmark) value on all sockets + gvpe uses to send packets. This can be used to make gvpe use a + different set of routing rules. For example, on GNU/Linux, the + if-up could set nfmark to 1000 and then put all routing rules into + table 99 and then use an ip rule to make gvpe traffic avoid that + routing table, in effect routing normal traffic via gvpe and gvpe + traffic via the normal system routing tables: + + ip rule add not fwmark 1000 lookup 99 + + * node-up = relative-or-absolute-path + + Sets a command (default: none) that should be called whenever a + connection is established (even on rekeying operations). Note that + node-up/down scripts will be run asynchronously, but execution is + serialised, so there will only ever be one such script running. In + addition to all the variables passed to if-up scripts, the + following environment variables will be set (values are just + examples): + + * DESTNODE=branch2 + + The name of the remote node. + + * DESTID=2 + + The node id of the remote node. + + * DESTSI=rawip/88.99.77.55:0 + + The "socket info" of the target node, protocol dependent but + usually in the format protocol/ip:port. + + * DESTIP=188.13.66.8 + + The numerical IP address of the remote node (gvpe accepts + connections from everywhere, as long as the other node can + authenticate itself). + + * DESTPORT=655 # deprecated + + The protocol port used by the other side, if applicable. + + * STATE=up + + Node-up scripts get called with STATE=up, node-change scripts + get called with STATE=change and node-down scripts get called + with STATE=down. + + Here is a nontrivial example that uses nsupdate to update the name + => ip mapping in some DNS zone: + + #!/bin/sh + { + echo update delete $DESTNODE.lowttl.example.net. a + echo update add $DESTNODE.lowttl.example.net. 1 in a $DESTIP + echo + } | nsupdate -d -k $CONFBASE:key.example.net. + + * node-change = relative-or-absolute-path + + Same as node-change, but gets called whenever something about a + connection changes (such as the source IP address). + + * node-down = relative-or-absolute-path + + Same as node-up, but gets called whenever a connection is lost. + + * pid-file = path + + The path to the pid file to check and create (default: + LOCALSTATEDIR/run/gvpe.pid). The first %s is replaced by the + nodename - any other use of % must be written as %%. + + * private-key = relative-path-to-key + + Sets the path (relative to the config directory) to the private key + (default: hostkey). This is a printf format string so every % must + be doubled. A single %s is replaced by the hostname, so you could + use paths like hostkeys/%s to be able to share the same config + directory between nodes. Since only the private key file of the + current node is used and the private key file should be kept secret + per-node to avoid spoofing, it is not recommended to use this + feature this way though. + + * rekey = seconds + + Sets the rekeying interval in seconds (default: 3607). Connections + are reestablished every rekey seconds, making them use a new + encryption key. + + * seed-device = path + + The random device used to initially and regularly seed the random + number generator (default: '/dev/urandom'). Randomness is of + paramount importance to the security of the algorithms used in + gvpe. On program start and every seed-interval, gvpe will read 64 + octets. Setting this path to the empty string will disable this + functionality completely (the underlying crypto library will likely + look for entropy sources on it's own though, so not all is lost). + + * seed-interval = seconds + + The number of seconds between reseeds of the random number + generator (default: 3613). A value of 0 disables this regular + reseeding. + + * serial = string + + The configuration serial number. This can be any string up to 16 + bytes length. Only when the serial matches on both sides of a + connection will the connection succeed. This is _not_ a security + mechanism and eay to spoof, this mechanism exists to alert users + that their config is outdated. It's recommended to specify this is + a date string such as 2013-05-05 or 20121205084417. The exact + algorithm is as this: if a connection request is received form a + node with an identical serial, then it succeeds normally. If the + remote serial is lower than the local serial, it is ignored. If + the remote serial is higher than the local serial, a warning + message is logged. + +4.5.2 NODE SPECIFIC SETTINGS +---------------------------- + +The following settings are node-specific, that is, every node can have +different settings, even within the same gvpe instance. Settings that +are set before the first node section set the defaults, settings that +are set within a node section only apply to the given node. + + * allow-direct = nodename + + Allow direct connections to this node. See deny-direct for more + info. + + * compress = yes|true|on | no|false|off + + For the current node, this specified whether it will accept + compressed packets, and for all other nodes, this specifies whether + to try to compress data packets sent to this node (default: yes). + Compression is really cheap even on slow computers, has no size + overhead at all and will only be used when the other side supports + compression, so enabling this is often a good idea. + + * connect = ondemand | never | always | disabled + + Sets the connect mode (default: always). It can be always (always + try to establish and keep a connection to the given node), never + (never initiate a connection to the given host, but accept + connections), ondemand (try to establish a connection when there + are outstanding packets in the queue and take it down after the + keepalive interval) or disabled (node is bad, don't talk to it). + Routers will automatically be forced to always unless they are + disabled, to ensure all nodes can talk to each other. + + * deny-direct = nodename | * + + Deny direct connections to the specified node (or all nodes when * + is given). Only one node can be specified, but you can use + multiple allow-direct and deny-direct statements. This only makes + sense in networks with routers, as routers are required for + indirect connections. Sometimes, a node cannot reach some other + nodes for reasons of network connectivity. For example, a node + behind a firewall that only allows connections to/from a single + other node in the network. In this case one should specify + deny-direct = * and allow-direct = othernodename (the other node + _must_ be a router for this to work). The algorithm to check + whether a connection may be direct is as follows: 1. Other node + mentioned in an allow-direct? If yes, allow the connection. 2. + Other node mentioned in a deny-direct? If yes, deny direct + connections. 3. Allow the connection. That is, allow-direct + takes precedence over deny-direct. The check is done in both + directions, i.e. both nodes must allow a direct connection before + one is attempted, so you only need to specify connect limitations + on one node. + + * dns-domain = domain-suffix + + The DNS domain suffix that points to the DNS tunnel server for this + node. The domain must point to a NS record that points to the + _dns-hostname_, i.e. + + dns-domainname = tunnel.example.net + dns-hostname = tunnel-server.example.net + + Corresponds to the following DNS entries in the example.net domain: + + tunnel.example.net. NS tunnel-server.example.net. + tunnel-server.example.net. A 13.13.13.13 + + * dns-hostname = hostname/ip + + The address to bind the DNS tunnel socket to, similar to the + hostname, but for the DNS tunnel protocol only. Default: 0.0.0.0, + but that might change. + + * dns-port = port-number + + The port to bind the DNS tunnel socket to. Must be 53 on DNS + tunnel servers. + + * enable-dns = yes|true|on | no|false|off + + See gvpe.protocol(7) for a description of the DNS transport + protocol. Avoid this protocol if you can. Enable the DNS + tunneling protocol on this node, either as server or as client. + Support for this transport protocol is only available when gvpe was + compiled using the --enable-dns option. + + * enable-icmp = yes|true|on | no|false|off + + See gvpe.protocol(7) for a description of the ICMP transport + protocol. Enable the ICMP transport using ICMP packets of type + icmp-type on this node. + + * enable-rawip = yes|true|on | no|false|off + + See gvpe.protocol(7) for a description of the RAW IP transport + protocol. Enable the RAW IPv4 transport using the ip-proto + protocol (default: no). + + * enable-tcp = yes|true|on | no|false|off + + See gvpe.protocol(7) for a description of the TCP transport + protocol. Enable the TCPv4 transport using the tcp-port port + (default: no). Support for this transport protocol is only + available when gvpe was compiled using the --enable-tcp option. + + * enable-udp = yes|true|on | no|false|off + + See gvpe.protocol(7) for a description of the UDP transport + protocol. Enable the UDPv4 transport using the udp-port port + (default: no). + + * hostname = hostname | ip [can not be defaulted] + + Forces the address of this node to be set to the given DNS hostname + or IP address. It will be resolved before each connect request, so + dyndns should work fine. If this setting is not specified and a + router is available, then the router will be queried for the + address of this node. Otherwise, the connection attempt will fail. + Note that DNS resolving is done synchronously, pausing the daemon. + If that is an issue you need to specify IP addresses. + + * icmp-type = integer + + Sets the type value to be used for outgoing (and incoming) packets + sent via the ICMP transport. The default is 0 (which is + echo-reply, also known as "ping-reply"). Other useful values + include 8 (echo-request, a.k.a. "ping") and 11 (time-exceeded), + but any 8-bit value can be used. + + * if-up-data = value + + The value specified using this directive will be passed to the + if-up script in the environment variable IFUPDATA. + + * inherit-tos = yes|true|on | no|false|off + + Whether to inherit the TOS settings of packets sent to the tunnel + when sending packets to this node (default: yes). If set to yes + then outgoing tunnel packets will have the same TOS setting as the + packets sent to the tunnel device, which is usually what you want. + + * low-power = yes|true|on | no|false|off + + If true, designates a node as a low-power node. Low-power nodes + use larger timeouts and try to reduce cpu time. Other nodes + talking to a low-power node will also use larger timeouts, and will + use less aggressive optimisations, in the hope of reducing load. + Security is not compromised. The typical low-power node would be a + mobile phone, where wakeups and encryption can significantly + increase power drain. + + * max-retry = positive-number + + The maximum interval in seconds (default: 3600, one hour) between + retries to establish a connection to this node. When a connection + cannot be established, gvpe uses exponential back-off capped at + this value. It's sometimes useful to set this to a much lower + value (e.g. 120) on connections to routers that usually are stable + but sometimes are down, to assure quick reconnections even after + longer downtimes. + + * max-ttl = seconds + + Expire packets that couldn't be sent after this many seconds + (default: 60). Gvpe will normally queue packets for a node without + an active connection, in the hope of establishing a connection + soon. This value specifies the maximum lifetime a packet will stay + in the queue, if a packet gets older, it will be thrown away. + + * max-queue = positive-number>=1 + + The maximum number of packets that will be queued (default: 512) + for this node. If more packets are sent then earlier packets will + be expired. See max-ttl, above. + + * router-priority = 0 | 1 | positive-number>=2 + + Sets the router priority of the given node (default: 0, disabled). + If some node tries to connect to another node but it doesn't have a + hostname, it asks a router node for it's IP address. The router + node chosen is the one with the highest priority larger than 1 that + is currently reachable. This is called a _mediated_ connection, as + the connection itself will still be direct, but it uses another + node to mediate between the two nodes. The value 0 disables + routing, that means if the node receives a packet not for itself it + will not forward it but instead drop it. The special value 1 + allows other hosts to route through the router host, but they will + never route through it by default (i.e. the config file of another + node needs to specify a router priority higher than one to choose + such a node for routing). The idea behind this is that some hosts + can, if required, bump the router-priority setting to higher than 1 + in their local config to route through specific hosts. If + router-priority is 0, then routing will be refused, so 1 serves as + a "enable, but do not use by default" switch. Nodes with + router-priority set to 2 or higher will always be forced to connect + = always (unless they are disabled). + + * tcp-port = port-number + + Similar to udp-port (default: 655), but sets the TCP port number. + + * udp-port = port-number + + Sets the port number used by the UDP protocol (default: 655, not + officially assigned by IANA!). + +4.6 CONFIG DIRECTORY LAYOUT +=========================== + +The default (or recommended) directory layout for the config directory +is: + + * gvpe.conf + + The config file. + + * if-up + + The if-up script + + * node-up, node-down + + If used the node up or node-down scripts. + + * hostkey + + The (default path of the) private key of the current host. + + * pubkey/nodename + + The public keys of the other nodes, one file per node. + + +File: gvpe.info, Node: gvpectrl, Next: gvpe, Prev: gvpe.conf, Up: Top + +5 gvpectrl +********** + +5.1 NAME +======== + +gvpectrl - GNU Virtual Private Ethernet Control Program + +5.2 SYNOPSIS +============ + +gvpectrl [*-ckgs*] [*-config=*_DIR_] [*-generate-keys*] [*-help*] +[*-kill*[*=*_SIGNAL_]] [*-show-config*] [*-version*] + +5.3 DESCRIPTION +=============== + +This is the control program for the gvpe, the virtual private ethernet +daemon. + +5.4 OPTIONS +=========== + + * *-c*, *-config=*_DIR_ + + Read configuration options from _DIR_. + + * *-g*, *-generate-key=path* + + Generates a single RSA key-pair. The public key will be stored in + '_path_' while the private key will be stored in '_path_ .privkey'. + Neither file must be non-empty for this to succeed. The public key + file '_path_' is normally copied to 'pubkey/nodename' in the config + directory on all nodes, while the private key '_path_.privkey' + should be copied to the file 'hostkey' on the node the key is for. + It's recommended to generate the keypair on the node where it will + be used, so that the private key file does not have to travel over + the network. + + * *-G*, *-generate-keys* + + Generate public/private RSA key-pairs for all nodes not having a + key and exit. Note that in normal configurations this will fail, + as there cna only be one private key per host. To make this + configuration work you need to specify separate keyfiles for + hostkeys in your config file, e.g.: + + private-key = hostkeys/%s + + Such a configuration makes it easier to distribute a configuration + centrally but requires private keys to be transported securely over + the network. + + * *-q*, *-quiet* + + Suppresses messages the author finds nonessential for scripting + purposes. + + * *-help* + + Display short list of options. + + * *-kill*[*=*_SIGNAL_] + + Attempt to kill a running gvpectrl (optionally with the specified + _SIGNAL_ instead of SIGTERM) and exit. + + * *-show-config* + + Show a summary of the configuration, and how gvpe interprets it. + Can also be very useful when designing firewall scripts. + + * *-version* + + Output version information and exit. + +5.5 BUGS +======== + +If you find any bugs, report them to gvpe@schmorp.de. + + +File: gvpe.info, Node: gvpe, Next: gvpe.protocol, Prev: gvpectrl, Up: Top + +6 gvpe +****** + +6.1 NAME +======== + +gvpe - GNU Virtual Private Ethernet Daemon + +6.2 SYNOPSIS +============ + +gvpe [*-cDlL*] [*-config=*_DIR_] [*-no-detach*] [*-l=*_LEVEL]_] +[*-kill*[*=*_SIGNAL_]] [*-mlock*] [*-help*] [*-version*] _NODENAME_ +[_option..._] + +6.3 DESCRIPTION +=============== + +See the gvpe(5) man page for an introduction to the gvpe suite. This is +the manual page for gvpe, the virtual private ethernet daemon. When +started, gvpe will read it's configuration file to determine the network +topology, and other configuration information, assuming the role of node +_NODENAME_ It will then create/connect to the tun/tap device and set up +a socket for incoming connections. Then a if-up script will be executed +to further configure the virtual network device. If that succeeds, it +will detach from the controlling terminal and continue in the +background, accepting and setting up connections to other gvpe daemons +that are part of the same virtual private ethernet. The optional +arguments after the node name have to be of the form: + + [I.]var=value + + If the argument has a prefix of nodename. (i.e. +laptop.enable-dns=yes) then it will be parsed after all the config +directives for that node, if not, it is parsed before the first node +directive in the config file, and can be used to set global options or +default variables. For example, to start gvpe in the foreground, with +log-level info on the node laptop, with TCP enabled and HTTP-Proxy host +and Port set, use this: + + gvpe -D -l info laptop \ + http-proxy-host=10.0.0.18 http-proxy-port=3128 \ + laptop.enable-tcp=yes + +6.4 OPTIONS +=========== + + * *-c*, *-config=*_DIR_ + + Read configuration options from _DIR_ + + * *-d*, *-l=*_LEVEL_ + + Set logging level to _LEVEL_ (one of: noise, trace, debug, info, + notice, warn, error, critical). + + * *-help* + + Display short list of options. + + * *-D*, *-no-detach* + + Don't fork and detach but stay in foreground and log messages to + stderr in addition to syslog. + + * *-L*, *-mlock* + + Lock gvpe into main memory. This will prevent sensitive data like + shared private keys to be written to the system swap + files/partitions. + + * *-version* + + Output version information and exit. + +6.5 SIGNALS +=========== + + * HUP + + Closes/resets all connections, resets the retry time and will start + connecting again (it will NOT re-read the config file). This is + useful e.g. in a /etc/ppp/if-up script. + + * TERM + + Closes/resets all connections and exits. + + * USR1 + + Dump current network status into the syslog (at loglevel notice, so + make sure your loglevel allows this). + +6.6 FILES +========= + + * /etc/gvpe/gvpe.conf + + The configuration file for gvpe. + + * /etc/gvpe/if-up + + Script which is executed as soon as the virtual network device has + been allocated. Purpose is to further configure that device. + + * /etc/gvpe/node-up + + Script which is executed whenever a node connects to this node. + This can be used for example to run nsupdate. + + * /etc/gvpe/node-down + + Script which is executed whenever a connection to another node is + lost. for example to run nsupdate. + + * /etc/gvpe/pubkey/* + + The directory containing the public keys for every node, one file + per node with the name of the node. + + * /etc/gvpe/hostkey + + The file containing the private key of the node GVPE runs on. + Unlike all the other files in the '/etc/gvpe' directory, this file + usually differes for each node that GVPE runs on. + + * /var/run/gvpe.pid + + The PID of the currently running gvpe is stored in this file. + +6.7 BUGS +======== + +The cryptography in gvpe has not been thoroughly checked by many people +yet. Use it at your own risk! If you find any bugs, report them to +gvpe@schmorp.de. + + +File: gvpe.info, Node: gvpe.protocol, Next: Simple Example, Prev: gvpe, Up: Top + +7 gvpe.protocol +*************** + +7.1 The GNU-VPE Protocols +========================= + +7.2 Overview +============ + +GVPE can make use of a number of protocols. One of them is the GNU VPE +protocol which is used to authenticate tunnels and send encrypted data +packets. This protocol is described in more detail the second part of +this document. The first part of this document describes the transport +protocols which are used by GVPE to send its data packets over the +network. + +7.3 PART 1: Transport protocols +=============================== + +GVPE offers a wide range of transport protocols that can be used to +interchange data between nodes. Protocols differ in their overhead, +speed, reliability, and robustness. The following sections describe +each transport protocol in more detail. They are sorted by +overhead/efficiency, the most efficient transport is listed first: + +7.3.1 RAW IP +------------ + +This protocol is the best choice, performance-wise, as the minimum +overhead per packet is only 38 bytes. It works by sending the VPN +payload using raw IP frames (using the protocol set by ip-proto). Using +raw IP frames has the drawback that many firewalls block "unknown" +protocols, so this transport only works if you have full IP connectivity +between nodes. + +7.3.2 ICMP +---------- + +This protocol offers very low overhead (minimum 42 bytes), and can +sometimes tunnel through firewalls when other protocols can not. It +works by prepending an ICMP header with type icmp-type and a code of +255. The default icmp-type is echo-reply, so the resulting packets look +like echo replies, which looks rather strange to network administrators. +This transport should only be used if other transports (i.e. raw IP) +are not available or undesirable (due to their overhead). + +7.3.3 UDP +--------- + +This is a good general choice for the transport protocol as UDP packets +tunnel well through most firewalls and routers, and the overhead per +packet is moderate (minimum 58 bytes). It should be used if RAW IP is +not available. + +7.3.4 TCP +--------- + +This protocol is a very bad choice, as it not only has high overhead +(more than 60 bytes), but the transport also retries on its own, which +leads to congestion when the link has moderate packet loss (as both the +TCP transport and the tunneled traffic will retry, increasing congestion +more and more). It also has high latency and is quite inefficient. +It's only useful when tunneling through firewalls that block better +protocols. If a node doesn't have direct internet access but a HTTP +proxy that supports the CONNECT method it can be used to tunnel through +a web proxy. For this to work, the tcp-port should be 443 (https), as +most proxies do not allow connections to other ports. It is an abuse of +the usage a proxy was designed for, so make sure you are allowed to use +it for GVPE. This protocol also has server and client sides. If the +tcp-port is set to zero, other nodes cannot connect to this node +directly. If the tcp-port is non-zero, the node can act both as a +client as well as a server. + +7.3.5 DNS +--------- + +*WARNING:* Parsing and generating DNS packets is rather tricky. The +code almost certainly contains buffer overflows and other, likely +exploitable, bugs. You have been warned. This is the worst choice of +transport protocol with respect to overhead (overhead can be 2-3 times +higher than the transferred data), and latency (which can be many +seconds). Some DNS servers might not be prepared to handle the traffic +and drop or corrupt packets. The client also has to constantly poll the +server for data, so the client will constantly create traffic even if it +doesn't need to transport packets. In addition, the same problems as +the TCP transport also plague this protocol. Its only use is to tunnel +through firewalls that do not allow direct internet access. Similar to +using a HTTP proxy (as the TCP transport does), it uses a local DNS +server/forwarder (given by the dns-forw-host configuration value) as a +proxy to send and receive data as a client, and an NS record pointing to +the GVPE server (as given by the dns-hostname directive). The only good +side of this protocol is that it can tunnel through most firewalls +mostly undetected, iff the local DNS server/forwarder is sane (which is +true for most routers, wireless LAN gateways and nameservers). +Fine-tuning needs to be done by editing src/vpn_dns.C directly. + +7.4 PART 2: The GNU VPE protocol +================================ + +This section, unfortunately, is not yet finished, although the protocol +is stable (until bugs in the cryptography are found, which will likely +completely change the following description). Nevertheless, it should +give you some overview over the protocol. + +7.4.1 Anatomy of a VPN packet +----------------------------- + +The exact layout and field lengths of a VPN packet is determined at +compile time and doesn't change. The same structure is used for all +transport protocols, be it RAWIP or TCP. + + +------+------+--------+------+ + | HMAC | TYPE | SRCDST | DATA | + +------+------+--------+------+ + + The HMAC field is present in all packets, even if not used (e.g. in +auth request packets), in which case it is set to all zeroes. The MAC +itself is calculated over the TYPE, SRCDST and DATA fields in all cases. +The TYPE field is a single byte and determines the purpose of the packet +(e.g. RESET, COMPRESSED/UNCOMPRESSED DATA, PING, AUTH REQUEST/RESPONSE, +CONNECT REQUEST/INFO etc.). SRCDST is a three byte field which contains +the source and destination node IDs (12 bits each). The DATA portion +differs between each packet type, naturally, and is the only part that +can be encrypted. Data packets contain more fields, as shown: + + +------+------+--------+-------+------+ + | HMAC | TYPE | SRCDST | SEQNO | DATA | + +------+------+--------+-------+------+ + + SEQNO is a 32-bit sequence number. It is negotiated at every +connection initialization and starts at some random 31 bit value. GVPE +currently uses a sliding window of 512 packets/sequence numbers to +detect reordering, duplication and replay attacks. The encryption is +done on SEQNO+DATA in CTR mode with IV generated from the seqno (for +AES: seqno || seqno || seqno || (u32)0), which ensures uniqueness for a +given key. + +7.4.2 The authentication/key exchange protocol +---------------------------------------------- + +Before nodes can exchange packets, they need to establish authenticity +of the other side and a key. Every node has a private RSA key and the +public RSA keys of all other nodes. When a node wants to establish a +connection to another node, it sends an RSA-OEAP-encrypted challenge and +an ECDH (curve25519) key. The other node replies with its own ECDH key +and a HKDF of the challenge and both ECDH keys to prove its identity. +The remote node enganges in exactly the same protocol. When both nodes +have exchanged their challenge and verified the response, they calculate +a cipher key and a HMAC key and start exchanging data packets. In +detail, the challenge consist of: + + RSA-OAEP (SEQNO MAC CIPHER SALT EXTRA-AUTH) ECDH1 + + That is, it encrypts (with the public key of the remote node) an +initial sequence number for data packets, key material for the HMAC key, +key material for the cipher key, a salt used by the HKDF (as shown +later) and some extra random bytes that are unused except for +authentication. It also sends the public key of a curve25519 exchange. +The remote node decrypts the RSA data, generates its own ECDH key +(ECDH2), and replies with: + + HKDF-Expand (HKDF-Extract (ECDH2, RSA), ECDH1, AUTH_DIGEST_SIZE) ECDH2 + + That is, it extracts from the decrypted RSA challenge, using its ECDH +key as salt, and then expands using the requesting node's ECDH1 key. +The resulting hash is returned as a proof that the node could decrypt +the RSA challenge data, together with the ECDH key. After both nodes +have done this to each other, they calculate the shared ECDH secret, +cipher and HMAC keys for the session (each node generates two cipher and +HMAC keys, one for sending and one for receiving). The HMAC key for +sending is generated as follow: + + HMAC_KEY = HKDF-Expand (HKDF-Extract (REMOTE_SALT, MAC ECDH_SECRET), info, HMAC_MD_SIZE) + + It extracts from MAC and ECDH_SECRET using the _remote_ SALT, then +expands using a static info string. The cipher key is generated in the +same way, except using the CIPHER part of the original challenge. The +result of this process is to authenticate each node to the other node, +while exchanging keys using both RSA and ECDH, the latter providing +perfect forward secrecy. The protocol has been overdesigned where this +was possible without increasing implementation complexity, in an attempt +to protect against implementation or protocol failures. For example, if +the ECDH challenge was found to be flawed, perfect forward secrecy would +be lost, but the data would likely still be protected. Likewise, +standard algorithms and implementations are used where possible. + +7.4.3 Retrying +-------------- + +When there is no response to an auth request, the node will send auth +requests in bursts with an exponential back-off. After some time it +will resort to PING packets, which are very small (8 bytes + protocol +header) and lightweight (no RSA operations required). A node that +receives ping requests from an unconnected peer will respond by trying +to create a connection. In addition to the exponential back-off, there +is a global rate-limit on a per-IP base. It allows long bursts but will +limit total packet rate to something like one control packet every ten +seconds, to avoid accidental floods due to protocol problems (like a RSA +key file mismatch between two nodes). The intervals between retries are +limited by the max-retry configuration value. A node with connect = +always will always retry, a node with connect = ondemand will only try +(and re-try) to connect as long as there are packets in the queue, +usually this limits the retry period to max-ttl seconds. Sending +packets over the VPN will reset the retry intervals as well, which means +as long as somebody is trying to send packets to a given node, GVPE will +try to connect every few seconds. + +7.4.4 Routing and Protocol translation +-------------------------------------- + +The GVPE routing algorithm is easy: there isn't much routing to speak +of: When routing packets to another node, GVPE tries the following +options, in order: + + * If the two nodes should be able to reach each other directly + (common protocol, port known), then GVPE will send the packet + directly to the other node. + + * If this isn't possible (e.g. because the node doesn't have a + hostname or known port), but the nodes speak a common protocol and + a router is available, then GVPE will ask a router to "mediate" + between both nodes (see below). + + * If a direct connection isn't possible (no common protocols) or + forbidden (deny-direct) and there are any routers, then GVPE will + try to send packets to the router with the highest priority that is + connected already _and_ is able (as specified by the config file) + to connect directly to the target node. + + * If no such router exists, then GVPE will simply send the packet to + the node with the highest priority available. + + * Failing all that, the packet will be dropped. + + A host can usually declare itself unreachable directly by setting its +port number(s) to zero. It can declare other hosts as unreachable by +using a config-file that disables all protocols for these other hosts. +Another option is to disable all protocols on that host in the other +config files. If two hosts cannot connect to each other because their +IP address(es) are not known (such as dial-up hosts), one side will send +a _mediated_ connection request to a router (routers must be configured +to act as routers!), which will send both the originating and the +destination host a connection info request with protocol information and +IP address of the other host (if known). Both hosts will then try to +establish a direct connection to the other peer, which is usually +possible even when both hosts are behind a NAT gateway. Routing via +other nodes works because the SRCDST field is not encrypted, so the +router can just forward the packet to the destination host. Since each +host uses its own private key, the router will not be able to decrypt or +encrypt packets, it will just act as a simple router and protocol +translator. + + +File: gvpe.info, Node: Simple Example, Next: Complex Example, Prev: gvpe.protocol, Up: Top + +8 Simple Example +**************** + +In this example, gvpe is used to implement a simple, UDP-based ethernet +on three hosts. The config file (gvpe.conf) is the same on all hosts: + + enable-udp = yes # use UDP + udp-port = 407 # use this UDP port + mtu = 1492 # handy for TDSL + ifname = vpn0 # I prefer vpn0 over e.g. tap0 + + node = huffy # arbitrary node name + hostname = 1.2.3.4 # ip address if this host + + node = welshy + hostname = www.example.net # resolve at connection time + + node = wheelery + # no hostname, will be determinded dynamically using router1 or router2 + + gvpe will execute the if-up script on every hosts, which, for linux, +could look like this for all three hosts: + + ifconfig $IFNAME hw ether $MAC mtu $MTU + ifconfig $IFNAME 10.0.0.$NODE + route add -net 10.0.0.0 netmask 255.0.0.0 dev $IFNAME + + The 10.0.0.$NODE resolves to 10.0.0.1 on huffy, 10.0.0.2 on welshy +and so on. Other schemes, such as 10.$NODE.0.1 might be useful, too. +After generating the keys (gvpectrl) and starting the daemon (gvpe -D -l +info _NODENAME_ for test purposes) the three hosts should be able to +ping each other. If you have an internal 10.x.x.x network (with a +tighter netmask then 255.0.0.0, e.g. 10.1.0.0 on huffy, 10.2.0.0 on +welshy and so on), you can now enable ip-forwarding and proxy-arp (or +set the hosts as default gateway), and your three hosts should forward +traffic from each network to each other. + + +File: gvpe.info, Node: Complex Example, Next: complex/gvpe.conf, Prev: Simple Example, Up: Top + +9 Complex Example +***************** + +These files are configuration files for "our" internal network. + + It is highly non-trivial, so don't use this configuration as the +basis of your network unless you know what you are doing. + + It features: around 30 hosts, many of them have additional networks +behind them and use an assortment of different tunneling protocols. The +vpn is fully routed, no arp is used at all. + + The public IP addresses of connecting nodes are automatically +registered via dns on the node ruth, using a node-up/node-down script. + + And last not least: the if-up script can generate information to be +used in firewall rules (IP-net/MAC-address pairs) so ensure packet +integrity so you can use your iptables etc. firewall to filter by IP +address only. + +* Menu: + +* complex/gvpe.conf:: An example gvpe configuration +* complex/if-up:: A fully-routing if-up config +* complex/node-up:: A node-up/node-down script utilizing dynds + + +File: gvpe.info, Node: complex/gvpe.conf, Next: complex/if-up, Prev: Complex Example, Up: Complex Example + +10 complex/gvpe.conf +******************** + + # sample configfile + # the config file must be exactly(!) the same on all nodes + + rekey = 54321 # the rekeying interval + keepalive = 300 # the keepalive interval + on ruth keepalive = 120 # ruth is important and demands lower keepalives + on surfer keepalive = 40 + mtu = 1492 # the mtu (minimum mtu of attached host) + ifname = vpn0 # the tunnel interface name to use + ifpersist = no # the tun device should be persistent + inherit-tos = yes # should tunnel packets inherit tos flags? + compress = yes # wether compression should be used (NYI) + connect = ondemand # connect to this host always/never or ondemand + router-priority = 1 # route for everybody - if necessary + + loglevel = notice # info logs connects, notice only important messages + on mobil loglevel = info + on doom loglevel = info + on ruth loglevel = info + + udp-port = 407 # the udp port to use for sending/receiving packets + tcp-port = 443 # the tcp port to listen for connections (we use https over proxy) + ip-proto = 50 # (ab)use the ipsec protocol as rawip + icmp-type = 0 # (ab)use echo replies for tunneling + enable-udp = yes # udp is spoken almost everywhere + enable-tcp = no # tcp is not spoken everywhere + enable-rawip = no # rawip is not spoken everywhere + enable-icmp = no # most hosts don't bother to icmp + + # every "node =" introduces a new node in the network + # the options following it don't set defaults but are + # node-specific. + + # marc@lap + node = mobil + + # marc@home + node = doom + enable-rawip = yes + enable-tcp = yes + + # marc@uni + node = ruth + enable-rawip = yes + enable-tcp = yes + enable-icmp = yes + hostname = 200.100.162.95 + connect = always + router-priority = 30 + on ruth node-up = node-up + on ruth node-down = node-up + + # marc@mu + node = frank + enable-rawip = yes + hostname = 44.88.167.250 + router-priority = 20 + connect = always + + # nethype + node = rain + enable-rawip = yes + hostname = 145.253.105.130 + router-priority = 10 + connect = always + + # marco@home + node = marco + enable-rawip = yes + + # stefan@ka + node = wappla + connect = never + + # stefan@lap + node = stefan + udp-port = 408 + connect = never + + # paul@wg + node = n8geil + on ruth enable-icmp = yes + on n8geil enable-icmp = yes + enable-udp = no + + # paul@lap + node = syrr + + # paul@lu + node = donomos + + # marco@hn + node = core + + # elmex@home + node = elmex + enable-rawip = yes + hostname = 100.251.143.181 + + # stefan@kwc.at + node = fwkw + connect = never + on stefan connect = always + on wappla connect = always + hostname = 182.73.81.146 + + # elmex@home + node = jungfrau + enable-rawip = yes + + # uni main router + node = surfer + enable-rawip = yes + enable-tcp = no + enable-icmp = yes + hostname = 200.100.162.79 + connect = always + router-priority = 40 + + # jkneer@marvin + node = marvin + enable-rawip = yes + enable-udp = no + + # jkneer@entrophy + node = entrophy + enable-udp = no + enable-tcp = yes + + # mr. primitive + node = voyager + enable-udp = no + enable-tcp = no + on voyager enable-tcp = yes + on voyager enable-udp = yes + + # v-server (barbados.dn-systems.de) + #node = vserver + #enable-udp = yes + #hostname = 193.108.181.74 + + +File: gvpe.info, Node: complex/if-up, Next: complex/node-up, Prev: complex/gvpe.conf, Up: Complex Example + +11 complex/if-up +**************** + + #!/bin/bash + + # Some environment variables will be set: + # + # CONFBASE=/etc/vpe # the configuration directory prefix + # IFNAME=vpn0 # the network interface (ifname) + # MAC=fe:fd:80:00:00:01 # the mac-address to use for the interface + # NODENAME=cerebro # the selected nodename (-n switch) + # NODEID=1 # the numerical node id + # MTU=1436 # the tunnel packet overhead (set mtu to 1500-$OVERHEAD) + + # this if-up script is rather full-featured, and is used to + # generate a fully-routed (no arp traffic) vpn. the main portion + # consists of "ipn" calls (see below). + + # some hosts require additional specific configuration, this is handled + # using if statements near the end of the script. + + # with the --fw switch, outputs mac/net pairs for your firewall use: + # if-up --fw | while read mac net; do + # iptables -t filter -A INPUT -i vpn0 -p all -m mac --mac-source \! $mac -s $net -j DROP + # done + + ipn() { + local id="$1"; shift + local mac=fe:fd:80:00:00:$(printf "%02x" $id) + if [ -n "$FW" ]; then + for net in "$@"; do + echo "$mac $net" + done + else + local ip="$1"; shift + if [ "$id" == $NODEID ]; then + [ -n "$ADDR_ONLY" ] && ip addr add $ip broadcast 10.255.255.255 dev $IFNAME + elif [ -z "$ADDR_ONLY" ]; then + ip neighbour add $ip lladdr $mac nud permanent dev $IFNAME + for route in "$@"; do + ip route add $route via $ip dev vpn0 + done + fi + fi + } + + ipns() { + # this contains the generic routing information for the vpn + # each call to ipn has the following parameters: + # ipn [ ...] + # the second line (ipn 2) means: + # the second node (doom in the config file) has the ip address 10.0.0.5, + # which is the gateway for the 10.0/28 network and three additional ip + # addresses + + ipn 1 10.0.0.20 + ipn 2 10.0.0.5 10.0.0.0/28 #200.100.162.92 200.100.162.93 100.99.218.222 + ipn 3 10.0.0.17 + ipn 4 10.0.0.18 + ipn 5 10.0.0.19 10.3.0.0/16 + ipn 6 10.0.0.21 10.0.2.0/26 #200.100.162.17 + ipn 7 10.0.0.22 10.1.2.0/24 # wappla, off + ipn 8 10.0.0.23 # stefan, off + ipn 9 10.0.0.24 10.13.0.0/16 + ipn 10 10.0.0.25 + ipn 11 10.0.0.26 + ipn 12 10.0.0.27 10.0.2.64/26 + ipn 13 10.0.0.28 10.0.3.0/24 + ipn 14 10.0.0.29 10.1.1.0/24 # fwkw, off + # mind the gateway ip gap + ipn 15 10.9.0.30 10.0.4.0/24 + ipn 16 10.9.0.31 + ipn 17 10.9.0.32 10.42.0.0/16 + ipn 18 10.9.0.33 + ipn 19 10.9.0.34 + #ipn 20 10.9.0.35 + } + + if [ "$1" == "--fw" ]; then + FW=1 + + ipns + else + exec >/var/log/vpe.if-up 2>&1 + set -x + + [ $NODENAME = "ruth" ] && ip link set $IFNAME down # hack + + # first set the link up and initialize the interface ip + # address. + ip link set $IFNAME address $MAC + ip link set $IFNAME mtu $MTU up + ADDR_ONLY=1 ipns # set addr only + + # now initialize the main vpn routes (10.0/8) + # the second route is a hack to to reach some funnily-connected + # machines. + ip route add 10.0.0.0/8 dev $IFNAME + ip route add 10.0.0.0/27 dev $IFNAME + + ipns # set the interface routes + + # now for something completely different, ehr, something not + # easily doable with ipn, namely some extra specific highly complicated + # and non-regular setups for some machines. + if [ $NODENAME = doom ]; then + ip addr add 200.100.162.92 dev $IFNAME + ip route add 200.100.0.0/16 via 10.0.0.17 dev $IFNAME + ip route flush table 101 + ip route add table 101 default src 200.100.162.92 via 10.0.0.17 dev $IFNAME + + ip addr add 100.99.218.222 dev $IFNAME + ip route add 100.99.218.192/27 via 10.0.0.19 dev $IFNAME + ip route flush table 103 + ip route add table 103 default src 100.99.218.222 via 10.0.0.19 + + elif [ $NODENAME = marco ]; then + ip addr add 200.100.162.17 dev $IFNAME + + for addr in 79 89 90 91 92 93 94 95; do + ip route add 200.100.162.$addr dev ppp0 + done + ip route add 200.100.76.0/23 dev ppp0 + ip route add src 200.100.162.17 200.100.0.0/16 via 10.0.0.17 dev $IFNAME + + elif [ $NODENAME = ruth ]; then + ip route add 200.100.162.17 via 10.0.0.21 dev vpn0 + ip route add 200.100.162.92 via 10.0.0.5 dev vpn0 + ip route add 200.100.162.93 via 10.0.0.5 dev vpn0 + + fi + + # and this is the second part of the 10.0/27 hack. don't ask. + [ $NODENAME != fwkw ] && ip route add 10.0.0.0/24 via 10.0.0.29 dev $IFNAME + fi + + +File: gvpe.info, Node: complex/node-up, Next: Index, Prev: complex/if-up, Up: Complex Example + +12 complex/node-up +****************** + + #!/bin/sh + + # Some environment variables will be set (in addition the ones + # set in if-up, too): + # + # DESTNODE=doom # others nodename + # DESTID=5 # others node id + # DESTIP=188.13.66.8 # others ip + # DESTPORT=407 # others port + # STATE=up/down # node-up gets UP, node-down script gets DOWN + + if [ $STATE = up ]; then + { + echo update delete $DESTNODE.lowttl.example.com. a + echo update delete $DESTNODE-last.lowttl.example.com. a + echo update add $DESTNODE.lowttl.example.com. 1 in a $DESTIP + echo update add $DESTNODE-last.lowttl.example.com. 1 in a $DESTIP + echo + } | nsupdate -d -k $CONFBASE:marc.example.net. + else + { + echo update delete $DESTNODE.lowttl.example.com. a + echo update delete $DESTNODE-last.lowttl.example.com. a + echo update add $DESTNODE-last.lowttl.example.com. 1 in a $DESTIP + echo + } | nsupdate -d -k $CONFBASE:marc.example.net. + fi + + +File: gvpe.info, Node: Index, Prev: complex/node-up, Up: Top + +13 Index +******** + +[index] +* Menu: + +* allow-direct: gvpe.conf. (line 495) +* chgid: gvpe.conf. (line 129) +* chroot: gvpe.conf. (line 118) +* chuid: gvpe.conf. (line 127) +* chuser: gvpe.conf. (line 136) +* compress: gvpe.conf. (line 500) +* CONFBASE: gvpe.conf. (line 214) +* connect: gvpe.conf. (line 509) +* deny-direct: gvpe.conf. (line 520) +* DESTID: gvpe.conf. (line 390) +* DESTIP: gvpe.conf. (line 399) +* DESTNODE: gvpe.conf. (line 386) +* DESTPORT: gvpe.conf. (line 405) +* DESTSI: gvpe.conf. (line 394) +* dns-case-preserving: gvpe.conf. (line 152) +* dns-domain: gvpe.conf. (line 541) +* dns-forw-host: gvpe.conf. (line 142) +* dns-forw-port: gvpe.conf. (line 147) +* dns-hostname: gvpe.conf. (line 555) +* dns-max-outstanding: gvpe.conf. (line 160) +* dns-overlap-factor: gvpe.conf. (line 169) +* dns-port: gvpe.conf. (line 561) +* dns-send-interval: gvpe.conf. (line 183) +* dns-timeout-factor: gvpe.conf. (line 194) +* enable-dns: gvpe.conf. (line 566) +* enable-icmp: gvpe.conf. (line 574) +* enable-rawip: gvpe.conf. (line 580) +* enable-tcp: gvpe.conf. (line 586) +* enable-udp: gvpe.conf. (line 593) +* hostname: gvpe.conf. (line 599) +* http-proxy-auth: gvpe.conf. (line 333) +* http-proxy-host: gvpe.conf. (line 308) +* http-proxy-port: gvpe.conf. (line 329) +* icmp-type: gvpe.conf. (line 609) +* if-up: gvpe.conf. (line 207) +* if-up-data: gvpe.conf. (line 617) +* IFNAME: gvpe.conf. (line 218) +* ifname: gvpe.conf. (line 280) +* ifpersist: gvpe.conf. (line 285) +* IFSUBTYPE: gvpe.conf. (line 224) +* IFTYPE: gvpe.conf. (line 222) +* IFUPDATA: gvpe.conf. (line 244) +* inherit-tos: gvpe.conf. (line 622) +* ip-proto: gvpe.conf. (line 294) +* keepalive: gvpe.conf. (line 339) +* loglevel: gvpe.conf. (line 347) +* low-power: gvpe.conf. (line 629) +* MAC: gvpe.conf. (line 248) +* max-queue: gvpe.conf. (line 657) +* max-retry: gvpe.conf. (line 639) +* max-ttl: gvpe.conf. (line 649) +* MTU: gvpe.conf. (line 231) +* mtu: gvpe.conf. (line 353) +* nfmark: gvpe.conf. (line 363) +* node-change: gvpe.conf. (line 425) +* node-down: gvpe.conf. (line 430) +* node-up: gvpe.conf. (line 376) +* NODEID: gvpe.conf. (line 259) +* NODENAME: gvpe.conf. (line 255) +* NODES: gvpe.conf. (line 237) +* pid-file: gvpe.conf. (line 434) +* private-key: gvpe.conf. (line 440) +* rekey: gvpe.conf. (line 451) +* router-priority: gvpe.conf. (line 663) +* seed-device: gvpe.conf. (line 457) +* seed-interval: gvpe.conf. (line 467) +* serial: gvpe.conf. (line 473) +* STATE: gvpe.conf. (line 409) +* tcp-port: gvpe.conf. (line 685) +* udp-port: gvpe.conf. (line 689) + + + +Tag Table: +Node: Top740 +Node: Overview1761 +Node: OS Dependencies12687 +Node: gvpe.conf19812 +Node: gvpectrl49034 +Node: gvpe51331 +Node: gvpe.protocol55259 +Node: Simple Example67849 +Node: Complex Example69485 +Node: complex/gvpe.conf70543 +Node: complex/if-up74228 +Node: complex/node-up79299 +Node: Index80459 + +End Tag Table diff -Nru gvpe-3.0/doc/gvpe.osdep.5 gvpe-3.1/doc/gvpe.osdep.5 --- gvpe-3.0/doc/gvpe.osdep.5 2016-03-30 04:01:32.000000000 +0000 +++ gvpe-3.1/doc/gvpe.osdep.5 2018-10-25 06:22:53.000000000 +0000 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.30) +.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.29) .\" .\" Standard preamble: .\" ======================================================================== @@ -133,7 +133,7 @@ .\" ======================================================================== .\" .IX Title "GVPE.OSDEP 5" -.TH GVPE.OSDEP 5 "2015-10-31" "2.25" "GNU Virtual Private Ethernet" +.TH GVPE.OSDEP 5 "2018-10-25" "3.1" "GNU Virtual Private Ethernet" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -214,7 +214,7 @@ ARP-requests, so only IPv4 works with \s-1ARP\s0 on this platform. .SS "tincd/bsd" .IX Subsection "tincd/bsd" -TAP-device, maybe; migth work for many bsd variants. +TAP-device, maybe; might work for many bsd variants. .PP This driver is a newer version of the \f(CW\*(C`tincd/*bsd\*(C'\fR drivers. It \fImight\fR provide a \s-1TAP\s0 device, or might not work at all. You might try this diff -Nru gvpe-3.0/doc/gvpe.osdep.5.pod gvpe-3.1/doc/gvpe.osdep.5.pod --- gvpe-3.0/doc/gvpe.osdep.5.pod 2015-10-31 06:14:32.000000000 +0000 +++ gvpe-3.1/doc/gvpe.osdep.5.pod 2018-10-25 06:22:24.000000000 +0000 @@ -78,7 +78,7 @@ =head2 tincd/bsd -TAP-device, maybe; migth work for many bsd variants. +TAP-device, maybe; might work for many bsd variants. This driver is a newer version of the C drivers. It I provide a TAP device, or might not work at all. You might try this diff -Nru gvpe-3.0/doc/gvpe.texi gvpe-3.1/doc/gvpe.texi --- gvpe-3.0/doc/gvpe.texi 2016-11-10 14:40:47.000000000 +0000 +++ gvpe-3.1/doc/gvpe.texi 2018-10-25 09:32:50.000000000 +0000 @@ -453,7 +453,7 @@ @subsection tincd/bsd -TAP-device, maybe; migth work for many bsd variants. +TAP-device, maybe; might work for many bsd variants. @refill This driver is a newer version of the @t{tincd/*bsd} drivers. It @emph{might} provide a TAP device, or might not work at all. You might try this interface type first, and, if it doesn't work, try one of the OS-specific drivers. @refill @@ -1221,7 +1221,7 @@ serial = string @cindex serial -The configuration serial number. This can be any string up to 16 bytes length. Only when the serial matches on both sides of a conenction will the connection succeed. This is @emph{not} a security mechanism and eay to spoof, this mechanism exists to alert users that their config is outdated. +The configuration serial number. This can be any string up to 16 bytes length. Only when the serial matches on both sides of a connection will the connection succeed. This is @emph{not} a security mechanism and eay to spoof, this mechanism exists to alert users that their config is outdated. @refill It's recommended to specify this is a date string such as @t{2013-05-05} or @t{20121205084417}. @refill diff -Nru gvpe-3.0/doc/Makefile.in gvpe-3.1/doc/Makefile.in --- gvpe-3.0/doc/Makefile.in 2016-11-10 14:40:18.000000000 +0000 +++ gvpe-3.1/doc/Makefile.in 2018-10-25 07:30:09.000000000 +0000 @@ -45,6 +45,7 @@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ +AM_CPPFLAGS = @AM_CPPFLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -71,7 +72,6 @@ HAVE_TUNTAP = @HAVE_TUNTAP@ IFSUBTYPE = @IFSUBTYPE@ IFTYPE = @IFTYPE@ -INCLUDES = @INCLUDES@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -79,6 +79,8 @@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LDFLAGS_DAEMON = @LDFLAGS_DAEMON@ +LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ +LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ @@ -104,6 +106,9 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ ROHC_FALSE = @ROHC_FALSE@ @@ -182,10 +187,10 @@ CONFIG_CLEAN_FILES = DIST_SOURCES = am__TEXINFO_TEX_DIR = $(srcdir) -INFO_DEPS = -DVIS = -PDFS = -PSS = +INFO_DEPS = gvpe.info +DVIS = gvpe.dvi +PDFS = gvpe.pdf +PSS = gvpe.ps TEXINFOS = gvpe.texi NROFF = nroff @@ -194,12 +199,30 @@ all: all-am .SUFFIXES: -.SUFFIXES: .dvi .ps +.SUFFIXES: .dvi .info .pdf .ps .texi $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) + +.texi.info: + @rm -f $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9] + $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $@ `test -f '$<' || echo '$(srcdir)/'`$< + +.texi.dvi: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2DVI) `test -f '$<' || echo '$(srcdir)/'`$< + +.texi.pdf: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2PDF) `test -f '$<' || echo '$(srcdir)/'`$< +gvpe.info: gvpe.texi +gvpe.dvi: gvpe.texi +gvpe.pdf: gvpe.texi TEXI2DVI = texi2dvi TEXI2PDF = $(TEXI2DVI) --pdf --batch @@ -241,7 +264,9 @@ done mostlyclean-aminfo: - -rm -f + -rm -f gvpe.aux gvpe.cp gvpe.cps gvpe.fn gvpe.fns gvpe.ky gvpe.kys gvpe.log \ + gvpe.pg gvpe.pgs gvpe.tmp gvpe.toc gvpe.tp gvpe.tps gvpe.vr \ + gvpe.vrs gvpe.dvi gvpe.pdf gvpe.ps maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ diff -Nru gvpe-3.0/lib/getopt.c gvpe-3.1/lib/getopt.c --- gvpe-3.0/lib/getopt.c 2011-02-08 23:17:37.000000000 +0000 +++ gvpe-3.1/lib/getopt.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1046 +0,0 @@ -/* Getopt for GNU. - NOTE: getopt is now part of the C library, so if you don't know what - "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu - before changing it! - - Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 - Free Software Foundation, Inc. - -NOTE: The canonical source of this file is maintained with the GNU C Library. -Bugs can be reported to bug-glibc@prep.ai.mit.edu. - -This file is part of GVPE. - - GVPE 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, 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 gvpe; if not, write to the Free Software -Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -/* This tells Alpha OSF/1 not to define a getopt prototype in . - Ditto for AIX 3.2 and . */ -#ifndef _NO_PROTO -#define _NO_PROTO -#endif - -#ifdef HAVE_CONFIG_H -#include -#endif - -#if !defined (__STDC__) || !__STDC__ -/* This is a separate conditional since some stdc systems - reject `defined (const)'. */ -#ifndef const -#define const -#endif -#endif - -#include - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#define GETOPT_INTERFACE_VERSION 2 -#if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2 -#include -#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION -#define ELIDE_CODE -#endif -#endif - -#ifndef ELIDE_CODE - - -/* This needs to come after some library #include - to get __GNU_LIBRARY__ defined. */ -#ifdef __GNU_LIBRARY__ -/* Don't include stdlib.h for non-GNU C libraries because some of them - contain conflicting prototypes for getopt. */ -#include -#include -#endif /* GNU C library. */ - -#ifdef VMS -#include -#if HAVE_STRING_H - 0 -#include -#endif -#endif - -#if defined (WIN32) && !defined (__CYGWIN32__) -/* It's not Unix, really. See? Capital letters. */ -#include -#define getpid() GetCurrentProcessId() -#endif - -#include "gettext.h" - -/* This version of `getopt' appears to the caller like standard Unix `getopt' - but it behaves differently for the user, since it allows the user - to intersperse the options with the other arguments. - - As `getopt' works, it permutes the elements of ARGV so that, - when it is done, all the options precede everything else. Thus - all application programs are extended to handle flexible argument order. - - Setting the environment variable POSIXLY_CORRECT disables permutation. - Then the behavior is completely standard. - - GNU application programs can use a third alternative mode in which - they can distinguish the relative order of options and other arguments. */ - -#include "getopt.h" - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -char *optarg = NULL; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns -1, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -/* 1003.2 says this must be 1 before any call. */ -int optind = 1; - -/* Formerly, initialization of getopt depended on optind==0, which - causes problems with re-calling getopt as programs generally don't - know that. */ - -int __getopt_initialized = 0; - -/* The next char to be scanned in the option-element - in which the last option character we returned was found. - This allows us to pick up the scan where we left off. - - If this is zero, or a null string, it means resume the scan - by advancing to the next ARGV-element. */ - -static char *nextchar; - -/* Callers store zero here to inhibit the error message - for unrecognized options. */ - -int opterr = 1; - -/* Set to an option character which was unrecognized. - This must be initialized on some systems to avoid linking in the - system's own getopt implementation. */ - -int optopt = '?'; - -/* Describe how to deal with options that follow non-option ARGV-elements. - - If the caller did not specify anything, - the default is REQUIRE_ORDER if the environment variable - POSIXLY_CORRECT is defined, PERMUTE otherwise. - - REQUIRE_ORDER means don't recognize them as options; - stop option processing when the first non-option is seen. - This is what Unix does. - This mode of operation is selected by either setting the environment - variable POSIXLY_CORRECT, or using `+' as the first character - of the list of option characters. - - PERMUTE is the default. We permute the contents of ARGV as we scan, - so that eventually all the non-options are at the end. This allows options - to be given in any order, even with programs that were not written to - expect this. - - RETURN_IN_ORDER is an option available to programs that were written - to expect options and other ARGV-elements in any order and that care about - the ordering of the two. We describe each non-option ARGV-element - as if it were the argument of an option with character code 1. - Using `-' as the first character of the list of option characters - selects this mode of operation. - - The special argument `--' forces an end of option-scanning regardless - of the value of `ordering'. In the case of RETURN_IN_ORDER, only - `--' can cause `getopt' to return -1 with `optind' != ARGC. */ - -static enum -{ - REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER -} ordering; - -/* Value of POSIXLY_CORRECT environment variable. */ -static char *posixly_correct; - -#ifdef __GNU_LIBRARY__ -/* We want to avoid inclusion of string.h with non-GNU libraries - because there are many ways it can cause trouble. - On some systems, it contains special magic macros that don't work - in GCC. */ -#include -#define my_index strchr -#else - -/* Avoid depending on library functions or files - whose names are inconsistent. */ - -char *getenv (); - -static char * -my_index (str, chr) - const char *str; - int chr; -{ - while (*str) - { - if (*str == chr) - return (char *) str; - str++; - } - return 0; -} - -/* If using GCC, we can safely declare strlen this way. - If not using GCC, it is ok not to declare it. */ -#ifdef __GNUC__ -/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. - That was relevant to code that was here before. */ -#if !defined (__STDC__) || !__STDC__ -/* gcc with -traditional declares the built-in strlen to return int, - and has done so at least since version 2.4.5. -- rms. */ -extern int strlen (const char *); -#endif /* not __STDC__ */ -#endif /* __GNUC__ */ - -#endif /* not __GNU_LIBRARY__ */ - -/* Handle permutation of arguments. */ - -/* Describe the part of ARGV that contains non-options that have - been skipped. `first_nonopt' is the index in ARGV of the first of them; - `last_nonopt' is the index after the last of them. */ - -static int first_nonopt; -static int last_nonopt; - -#ifdef _LIBC -/* Bash 2.0 gives us an environment variable containing flags - indicating ARGV elements that should not be considered arguments. */ - -/* Defined in getopt_init.c */ -extern char *__getopt_nonoption_flags; - -static int nonoption_flags_max_len; -static int nonoption_flags_len; - -static int original_argc; -static char *const *original_argv; - -extern pid_t __libc_pid; - -/* Make sure the environment variable bash 2.0 puts in the environment - is valid for the getopt call we must make sure that the ARGV passed - to getopt is that one passed to the process. */ -static void -__attribute__ ((unused)) -store_args_and_env (int argc, char *const *argv) -{ - /* XXX This is no good solution. We should rather copy the args so - that we can compare them later. But we must not use malloc(3). */ - original_argc = argc; - original_argv = argv; -} -text_set_element (__libc_subinit, store_args_and_env); - -# define SWAP_FLAGS(ch1, ch2) \ - if (nonoption_flags_len > 0) \ - { \ - char __tmp = __getopt_nonoption_flags[ch1]; \ - __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ - __getopt_nonoption_flags[ch2] = __tmp; \ - } -#else /* !_LIBC */ -# define SWAP_FLAGS(ch1, ch2) -#endif /* _LIBC */ - -/* Exchange two adjacent subsequences of ARGV. - One subsequence is elements [first_nonopt,last_nonopt) - which contains all the non-options that have been skipped so far. - The other is elements [last_nonopt,optind), which contains all - the options processed since those non-options were skipped. - - `first_nonopt' and `last_nonopt' are relocated so that they describe - the new indices of the non-options in ARGV after they are moved. */ - -#if defined (__STDC__) && __STDC__ -static void exchange (char **); -#endif - -static void -exchange (argv) - char **argv; -{ - int bottom = first_nonopt; - int middle = last_nonopt; - int top = optind; - char *tem; - - /* Exchange the shorter segment with the far end of the longer segment. - That puts the shorter segment into the right place. - It leaves the longer segment in the right place overall, - but it consists of two parts that need to be swapped next. */ - -#ifdef _LIBC - /* First make sure the handling of the `__getopt_nonoption_flags' - string can work normally. Our top argument must be in the range - of the string. */ - if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) - { - /* We must extend the array. The user plays games with us and - presents new arguments. */ - char *new_str = malloc (top + 1); - if (new_str == NULL) - nonoption_flags_len = nonoption_flags_max_len = 0; - else - { - memcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len); - memset (&new_str[nonoption_flags_max_len], '\0', - top + 1 - nonoption_flags_max_len); - nonoption_flags_max_len = top + 1; - __getopt_nonoption_flags = new_str; - } - } -#endif - - while (top > middle && middle > bottom) - { - if (top - middle > middle - bottom) - { - /* Bottom segment is the short one. */ - int len = middle - bottom; - register int i; - - /* Swap it with the top part of the top segment. */ - for (i = 0; i < len; i++) - { - tem = argv[bottom + i]; - argv[bottom + i] = argv[top - (middle - bottom) + i]; - argv[top - (middle - bottom) + i] = tem; - SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); - } - /* Exclude the moved bottom segment from further swapping. */ - top -= len; - } - else - { - /* Top segment is the short one. */ - int len = top - middle; - register int i; - - /* Swap it with the bottom part of the bottom segment. */ - for (i = 0; i < len; i++) - { - tem = argv[bottom + i]; - argv[bottom + i] = argv[middle + i]; - argv[middle + i] = tem; - SWAP_FLAGS (bottom + i, middle + i); - } - /* Exclude the moved top segment from further swapping. */ - bottom += len; - } - } - - /* Update records for the slots the non-options now occupy. */ - - first_nonopt += (optind - last_nonopt); - last_nonopt = optind; -} - -/* Initialize the internal data when the first call is made. */ - -#if defined (__STDC__) && __STDC__ -static const char *_getopt_initialize (int, char *const *, const char *); -#endif -static const char * -_getopt_initialize (argc, argv, optstring) - int argc; - char *const *argv; - const char *optstring; -{ - /* Start processing options with ARGV-element 1 (since ARGV-element 0 - is the program name); the sequence of previously skipped - non-option ARGV-elements is empty. */ - - first_nonopt = last_nonopt = optind; - - nextchar = NULL; - - posixly_correct = getenv ("POSIXLY_CORRECT"); - - /* Determine how to handle the ordering of options and nonoptions. */ - - if (optstring[0] == '-') - { - ordering = RETURN_IN_ORDER; - ++optstring; - } - else if (optstring[0] == '+') - { - ordering = REQUIRE_ORDER; - ++optstring; - } - else if (posixly_correct != NULL) - ordering = REQUIRE_ORDER; - else - ordering = PERMUTE; - -#ifdef _LIBC - if (posixly_correct == NULL - && argc == original_argc && argv == original_argv) - { - if (nonoption_flags_max_len == 0) - { - if (__getopt_nonoption_flags == NULL - || __getopt_nonoption_flags[0] == '\0') - nonoption_flags_max_len = -1; - else - { - const char *orig_str = __getopt_nonoption_flags; - int len = nonoption_flags_max_len = strlen (orig_str); - if (nonoption_flags_max_len < argc) - nonoption_flags_max_len = argc; - __getopt_nonoption_flags = - (char *) malloc (nonoption_flags_max_len); - if (__getopt_nonoption_flags == NULL) - nonoption_flags_max_len = -1; - else - { - memcpy (__getopt_nonoption_flags, orig_str, len); - memset (&__getopt_nonoption_flags[len], '\0', - nonoption_flags_max_len - len); - } - } - } - nonoption_flags_len = nonoption_flags_max_len; - } - else - nonoption_flags_len = 0; -#endif - - return optstring; -} - -/* Scan elements of ARGV (whose length is ARGC) for option characters - given in OPTSTRING. - - If an element of ARGV starts with '-', and is not exactly "-" or "--", - then it is an option element. The characters of this element - (aside from the initial '-') are option characters. If `getopt' - is called repeatedly, it returns successively each of the option characters - from each of the option elements. - - If `getopt' finds another option character, it returns that character, - updating `optind' and `nextchar' so that the next call to `getopt' can - resume the scan with the following option character or ARGV-element. - - If there are no more option characters, `getopt' returns -1. - Then `optind' is the index in ARGV of the first ARGV-element - that is not an option. (The ARGV-elements have been permuted - so that those that are not options now come last.) - - OPTSTRING is a string containing the legitimate option characters. - If an option character is seen that is not listed in OPTSTRING, - return '?' after printing an error message. If you set `opterr' to - zero, the error message is suppressed but we still return '?'. - - If a char in OPTSTRING is followed by a colon, that means it wants an arg, - so the following text in the same ARGV-element, or the text of the following - ARGV-element, is returned in `optarg'. Two colons mean an option that - wants an optional arg; if there is text in the current ARGV-element, - it is returned in `optarg', otherwise `optarg' is set to zero. - - If OPTSTRING starts with `-' or `+', it requests different methods of - handling the non-option ARGV-elements. - See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. - - Long-named options begin with `--' instead of `-'. - Their names may be abbreviated as long as the abbreviation is unique - or is an exact match for some defined option. If they have an - argument, it follows the option name in the same ARGV-element, separated - from the option name by a `=', or else the in next ARGV-element. - When `getopt' finds a long-named option, it returns 0 if that option's - `flag' field is nonzero, the value of the option's `val' field - if the `flag' field is zero. - - The elements of ARGV aren't really const, because we permute them. - But we pretend they're const in the prototype to be compatible - with other systems. - - LONGOPTS is a vector of `struct option' terminated by an - element containing a name which is zero. - - LONGIND returns the index in LONGOPT of the long-named option found. - It is only valid when a long-named option has been found by the most - recent call. - - If LONG_ONLY is nonzero, '-' as well as '--' can introduce - long-named options. */ - -int -_getopt_internal (argc, argv, optstring, longopts, longind, long_only) - int argc; - char *const *argv; - const char *optstring; - const struct option *longopts; - int *longind; - int long_only; -{ - optarg = NULL; - - if (optind == 0 || !__getopt_initialized) - { - if (optind == 0) - optind = 1; /* Don't scan ARGV[0], the program name. */ - optstring = _getopt_initialize (argc, argv, optstring); - __getopt_initialized = 1; - } - - /* Test whether ARGV[optind] points to a non-option argument. - Either it does not have option syntax, or there is an environment flag - from the shell indicating it is not an option. The later information - is only used when the used in the GNU libc. */ -#ifdef _LIBC -#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ - || (optind < nonoption_flags_len \ - && __getopt_nonoption_flags[optind] == '1')) -#else -#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') -#endif - - if (nextchar == NULL || *nextchar == '\0') - { - /* Advance to the next ARGV-element. */ - - /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been - moved back by the user (who may also have changed the arguments). */ - if (last_nonopt > optind) - last_nonopt = optind; - if (first_nonopt > optind) - first_nonopt = optind; - - if (ordering == PERMUTE) - { - /* If we have just processed some options following some non-options, - exchange them so that the options come first. */ - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (last_nonopt != optind) - first_nonopt = optind; - - /* Skip any additional non-options - and extend the range of non-options previously skipped. */ - - while (optind < argc && NONOPTION_P) - optind++; - last_nonopt = optind; - } - - /* The special ARGV-element `--' means premature end of options. - Skip it like a null option, - then exchange with previous non-options as if it were an option, - then skip everything else like a non-option. */ - - if (optind != argc && !strcmp (argv[optind], "--")) - { - optind++; - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (first_nonopt == last_nonopt) - first_nonopt = optind; - last_nonopt = argc; - - optind = argc; - } - - /* If we have done all the ARGV-elements, stop the scan - and back over any non-options that we skipped and permuted. */ - - if (optind == argc) - { - /* Set the next-arg-index to point at the non-options - that we previously skipped, so the caller will digest them. */ - if (first_nonopt != last_nonopt) - optind = first_nonopt; - return -1; - } - - /* If we have come to a non-option and did not permute it, - either stop the scan or describe it to the caller and pass it by. */ - - if (NONOPTION_P) - { - if (ordering == REQUIRE_ORDER) - return -1; - optarg = argv[optind++]; - return 1; - } - - /* We have found another option-ARGV-element. - Skip the initial punctuation. */ - - nextchar = (argv[optind] + 1 - + (longopts != NULL && argv[optind][1] == '-')); - } - - /* Decode the current option-ARGV-element. */ - - /* Check whether the ARGV-element is a long option. - - If long_only and the ARGV-element has the form "-f", where f is - a valid short option, don't consider it an abbreviated form of - a long option that starts with f. Otherwise there would be no - way to give the -f short option. - - On the other hand, if there's a long option "fubar" and - the ARGV-element is "-fu", do consider that an abbreviation of - the long option, just like "--fu", and not "-f" with arg "u". - - This distinction seems to be the most useful approach. */ - - if (longopts != NULL - && (argv[optind][1] == '-' - || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) - { - char *nameend; - const struct option *p; - const struct option *pfound = NULL; - int exact = 0; - int ambig = 0; - int indfound = -1; - int option_index; - - for (nameend = nextchar; *nameend && *nameend != '='; nameend++) - /* Do nothing. */ ; - - /* Test all long options for either exact match - or abbreviated matches. */ - for (p = longopts, option_index = 0; p->name; p++, option_index++) - if (!strncmp (p->name, nextchar, nameend - nextchar)) - { - if ((unsigned int) (nameend - nextchar) - == (unsigned int) strlen (p->name)) - { - /* Exact match found. */ - pfound = p; - indfound = option_index; - exact = 1; - break; - } - else if (pfound == NULL) - { - /* First nonexact match found. */ - pfound = p; - indfound = option_index; - } - else - /* Second or later nonexact match found. */ - ambig = 1; - } - - if (ambig && !exact) - { - if (opterr) - fprintf (stderr, _("%s: option `%s' is ambiguous\n"), - argv[0], argv[optind]); - nextchar += strlen (nextchar); - optind++; - optopt = 0; - return '?'; - } - - if (pfound != NULL) - { - option_index = indfound; - optind++; - if (*nameend) - { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ - if (pfound->has_arg) - optarg = nameend + 1; - else - { - if (opterr) - if (argv[optind - 1][1] == '-') - /* --option */ - fprintf (stderr, - _("%s: option `--%s' doesn't allow an argument\n"), - argv[0], pfound->name); - else - /* +option or -option */ - fprintf (stderr, - _("%s: option `%c%s' doesn't allow an argument\n"), - argv[0], argv[optind - 1][0], pfound->name); - - nextchar += strlen (nextchar); - - optopt = pfound->val; - return '?'; - } - } - else if (pfound->has_arg == 1) - { - if (optind < argc) - optarg = argv[optind++]; - else - { - if (opterr) - fprintf (stderr, - _("%s: option `%s' requires an argument\n"), - argv[0], argv[optind - 1]); - nextchar += strlen (nextchar); - optopt = pfound->val; - return optstring[0] == ':' ? ':' : '?'; - } - } - nextchar += strlen (nextchar); - if (longind != NULL) - *longind = option_index; - if (pfound->flag) - { - *(pfound->flag) = pfound->val; - return 0; - } - return pfound->val; - } - - /* Can't find it as a long option. If this is not getopt_long_only, - or the option starts with '--' or is not a valid short - option, then it's an error. - Otherwise interpret it as a short option. */ - if (!long_only || argv[optind][1] == '-' - || my_index (optstring, *nextchar) == NULL) - { - if (opterr) - { - if (argv[optind][1] == '-') - /* --option */ - fprintf (stderr, _("%s: unrecognized option `--%s'\n"), - argv[0], nextchar); - else - /* +option or -option */ - fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), - argv[0], argv[optind][0], nextchar); - } - nextchar = (char *) ""; - optind++; - optopt = 0; - return '?'; - } - } - - /* Look at and handle the next short option-character. */ - - { - char c = *nextchar++; - char *temp = my_index (optstring, c); - - /* Increment `optind' when we start to process its last character. */ - if (*nextchar == '\0') - ++optind; - - if (temp == NULL || c == ':') - { - if (opterr) - { - if (posixly_correct) - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, _("%s: illegal option -- %c\n"), - argv[0], c); - else - fprintf (stderr, _("%s: invalid option -- %c\n"), - argv[0], c); - } - optopt = c; - return '?'; - } - /* Convenience. Treat POSIX -W foo same as long option --foo */ - if (temp[0] == 'W' && temp[1] == ';') - { - char *nameend; - const struct option *p; - const struct option *pfound = NULL; - int exact = 0; - int ambig = 0; - int indfound = 0; - int option_index; - - /* This is an option that requires an argument. */ - if (*nextchar != '\0') - { - optarg = nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - optind++; - } - else if (optind == argc) - { - if (opterr) - { - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, _("%s: option requires an argument -- %c\n"), - argv[0], c); - } - optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = '?'; - return c; - } - else - /* We already incremented `optind' once; - increment it again when taking next ARGV-elt as argument. */ - optarg = argv[optind++]; - - /* optarg is now the argument, see if it's in the - table of longopts. */ - - for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) - /* Do nothing. */ ; - - /* Test all long options for either exact match - or abbreviated matches. */ - for (p = longopts, option_index = 0; p->name; p++, option_index++) - if (!strncmp (p->name, nextchar, nameend - nextchar)) - { - if ((unsigned int) (nameend - nextchar) == strlen (p->name)) - { - /* Exact match found. */ - pfound = p; - indfound = option_index; - exact = 1; - break; - } - else if (pfound == NULL) - { - /* First nonexact match found. */ - pfound = p; - indfound = option_index; - } - else - /* Second or later nonexact match found. */ - ambig = 1; - } - if (ambig && !exact) - { - if (opterr) - fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), - argv[0], argv[optind]); - nextchar += strlen (nextchar); - optind++; - return '?'; - } - if (pfound != NULL) - { - option_index = indfound; - if (*nameend) - { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ - if (pfound->has_arg) - optarg = nameend + 1; - else - { - if (opterr) - fprintf (stderr, _("\ -%s: option `-W %s' doesn't allow an argument\n"), - argv[0], pfound->name); - - nextchar += strlen (nextchar); - return '?'; - } - } - else if (pfound->has_arg == 1) - { - if (optind < argc) - optarg = argv[optind++]; - else - { - if (opterr) - fprintf (stderr, - _("%s: option `%s' requires an argument\n"), - argv[0], argv[optind - 1]); - nextchar += strlen (nextchar); - return optstring[0] == ':' ? ':' : '?'; - } - } - nextchar += strlen (nextchar); - if (longind != NULL) - *longind = option_index; - if (pfound->flag) - { - *(pfound->flag) = pfound->val; - return 0; - } - return pfound->val; - } - nextchar = NULL; - return 'W'; /* Let the application handle it. */ - } - if (temp[1] == ':') - { - if (temp[2] == ':') - { - /* This is an option that accepts an argument optionally. */ - if (*nextchar != '\0') - { - optarg = nextchar; - optind++; - } - else - optarg = NULL; - nextchar = NULL; - } - else - { - /* This is an option that requires an argument. */ - if (*nextchar != '\0') - { - optarg = nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - optind++; - } - else if (optind == argc) - { - if (opterr) - { - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, - _("%s: option requires an argument -- %c\n"), - argv[0], c); - } - optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = '?'; - } - else - /* We already incremented `optind' once; - increment it again when taking next ARGV-elt as argument. */ - optarg = argv[optind++]; - nextchar = NULL; - } - } - return c; - } -} - -int -getopt (argc, argv, optstring) - int argc; - char *const *argv; - const char *optstring; -{ - return _getopt_internal (argc, argv, optstring, - (const struct option *) 0, - (int *) 0, - 0); -} - -#endif /* Not ELIDE_CODE. */ - -#ifdef TEST - -/* Compile with -DTEST to make an executable for use in testing - the above definition of `getopt'. */ - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - - c = getopt (argc, argv, "abc:d:0123456789"); - if (c == -1) - break; - - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value `%s'\n", optarg); - break; - - case '?': - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ diff -Nru gvpe-3.0/lib/getopt.h gvpe-3.1/lib/getopt.h --- gvpe-3.0/lib/getopt.h 2013-07-10 01:50:26.000000000 +0000 +++ gvpe-3.1/lib/getopt.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,133 +0,0 @@ -/* Declarations for getopt. - Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc. - -NOTE: The canonical source of this file is maintained with the GNU C Library. -Bugs can be reported to bug-glibc@prep.ai.mit.edu. - -This file is part of GVPE. - - GVPE 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, 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 gvpe; if not, write to the Free Software -Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef _GETOPT_H -#define _GETOPT_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns -1, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -struct option -{ -#if defined (__STDC__) && __STDC__ - const char *name; -#else - char *name; -#endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -#if defined (__STDC__) && __STDC__ -#ifdef __GNU_LIBRARY__ -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int argc, char *const *argv, const char *shortopts); -#else /* not __GNU_LIBRARY__ */ -#endif /* __GNU_LIBRARY__ */ -extern int getopt_long (int argc, char *const *argv, const char *shortopts, - const struct option *longopts, int *longind); -extern int getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -extern int _getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind, - int long_only); -#else /* not __STDC__ */ -extern int getopt_long (); -extern int getopt_long_only (); - -extern int _getopt_internal (); -#endif /* __STDC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* _GETOPT_H */ diff -Nru gvpe-3.0/lib/Makefile.am gvpe-3.1/lib/Makefile.am --- gvpe-3.0/lib/Makefile.am 2008-08-07 17:39:26.000000000 +0000 +++ gvpe-3.1/lib/Makefile.am 2018-10-25 07:28:28.000000000 +0000 @@ -1,11 +1,11 @@ noinst_LIBRARIES = libgvpe.a -INCLUDES = @INCLUDES@ -I. -I$(top_builddir) +AM_CPPFLAGS = @AM_CPPFLAGS@ -I. -I$(top_builddir) -libgvpe_a_SOURCES = pidfile.c getopt.c getopt1.c dropin.c +libgvpe_a_SOURCES = pidfile.c getopt1.c dropin.c libgvpe_a_LIBADD = @LIBOBJS@ @ALLOCA@ libgvpe_a_DEPENDENCIES = $(libgvpe_a_LIBADD) -noinst_HEADERS = pidfile.h getopt.h dropin.h gettext.h +noinst_HEADERS = pidfile.h dropin.h gettext.h diff -Nru gvpe-3.0/lib/Makefile.in gvpe-3.1/lib/Makefile.in --- gvpe-3.0/lib/Makefile.in 2016-11-10 14:40:18.000000000 +0000 +++ gvpe-3.1/lib/Makefile.in 2018-10-25 07:30:09.000000000 +0000 @@ -41,6 +41,8 @@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ + +AM_CPPFLAGS = @AM_CPPFLAGS@ -I. -I$(top_builddir) AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -67,8 +69,6 @@ HAVE_TUNTAP = @HAVE_TUNTAP@ IFSUBTYPE = @IFSUBTYPE@ IFTYPE = @IFTYPE@ - -INCLUDES = @INCLUDES@ -I. -I$(top_builddir) INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -76,6 +76,8 @@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LDFLAGS_DAEMON = @LDFLAGS_DAEMON@ +LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ +LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ @@ -101,6 +103,9 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ ROHC_FALSE = @ROHC_FALSE@ @@ -161,12 +166,12 @@ target_vendor = @target_vendor@ noinst_LIBRARIES = libgvpe.a -libgvpe_a_SOURCES = pidfile.c getopt.c getopt1.c dropin.c +libgvpe_a_SOURCES = pidfile.c getopt1.c dropin.c libgvpe_a_LIBADD = @LIBOBJS@ @ALLOCA@ libgvpe_a_DEPENDENCIES = $(libgvpe_a_LIBADD) -noinst_HEADERS = pidfile.h getopt.h dropin.h gettext.h +noinst_HEADERS = pidfile.h dropin.h gettext.h subdir = lib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs @@ -175,16 +180,15 @@ LIBRARIES = $(noinst_LIBRARIES) libgvpe_a_AR = $(AR) cru -am_libgvpe_a_OBJECTS = pidfile.$(OBJEXT) getopt.$(OBJEXT) \ - getopt1.$(OBJEXT) dropin.$(OBJEXT) +am_libgvpe_a_OBJECTS = pidfile.$(OBJEXT) getopt1.$(OBJEXT) \ + dropin.$(OBJEXT) libgvpe_a_OBJECTS = $(am_libgvpe_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/alloca.Po ./$(DEPDIR)/dropin.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/getopt.Po ./$(DEPDIR)/getopt1.Po \ -@AMDEP_TRUE@ ./$(DEPDIR)/pidfile.Po +@AMDEP_TRUE@ ./$(DEPDIR)/getopt1.Po ./$(DEPDIR)/pidfile.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) @@ -223,7 +227,6 @@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dropin.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pidfile.Po@am__quote@ diff -Nru gvpe-3.0/libev/ev.c gvpe-3.1/libev/ev.c --- gvpe-3.0/libev/ev.c 2016-02-18 04:47:57.000000000 +0000 +++ gvpe-3.1/libev/ev.c 2018-10-25 03:18:09.000000000 +0000 @@ -1,7 +1,7 @@ /* * libev event processing core, watcher management * - * Copyright (c) 2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann + * Copyright (c) 2007-2018 Marc Alexander Lehmann * All rights reserved. * * Redistribution and use in source and binary forms, with or without modifica- @@ -164,6 +164,16 @@ #endif +/* OS X, in its infinite idiocy, actually HARDCODES + * a limit of 1024 into their select. Where people have brains, + * OS X engineers apparently have a vacuum. Or maybe they were + * ordered to have a vacuum, or they do anything for money. + * This might help. Or not. + * Note that this must be defined early, as other include files + * will rely on this define as well. + */ +#define _DARWIN_UNLIMITED_SELECT 1 + #include #include #include @@ -211,14 +221,6 @@ # undef EV_AVOID_STDIO #endif -/* OS X, in its infinite idiocy, actually HARDCODES - * a limit of 1024 into their select. Where people have brains, - * OS X engineers apparently have a vacuum. Or maybe they were - * ordered to have a vacuum, or they do anything for money. - * This might help. Or not. - */ -#define _DARWIN_UNLIMITED_SELECT 1 - /* this block tries to deduce configuration from header-defined symbols and defaults */ /* try to deduce the maximum number of signals on this platform */ @@ -365,7 +367,7 @@ # define EV_HEAP_CACHE_AT EV_FEATURE_DATA #endif -#ifdef ANDROID +#ifdef __ANDROID__ /* supposedly, android doesn't typedef fd_mask */ # undef EV_USE_SELECT # define EV_USE_SELECT 0 @@ -1677,11 +1679,11 @@ } #endif -static void (*syserr_cb)(const char *msg) EV_THROW; +static void (*syserr_cb)(const char *msg) EV_NOEXCEPT; ecb_cold void -ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW +ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT { syserr_cb = cb; } @@ -1710,7 +1712,7 @@ } static void * -ev_realloc_emul (void *ptr, long size) EV_THROW +ev_realloc_emul (void *ptr, long size) EV_NOEXCEPT { /* some systems, notably openbsd and darwin, fail to properly * implement realloc (x, 0) (as required by both ansi c-89 and @@ -1726,11 +1728,11 @@ return 0; } -static void *(*alloc)(void *ptr, long size) EV_THROW = ev_realloc_emul; +static void *(*alloc)(void *ptr, long size) EV_NOEXCEPT = ev_realloc_emul; ecb_cold void -ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW +ev_set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT { alloc = cb; } @@ -1857,7 +1859,7 @@ #ifndef EV_HAVE_EV_TIME ev_tstamp -ev_time (void) EV_THROW +ev_time (void) EV_NOEXCEPT { #if EV_USE_REALTIME if (expect_true (have_realtime)) @@ -1891,14 +1893,14 @@ #if EV_MULTIPLICITY ev_tstamp -ev_now (EV_P) EV_THROW +ev_now (EV_P) EV_NOEXCEPT { return ev_rt_now; } #endif void -ev_sleep (ev_tstamp delay) EV_THROW +ev_sleep (ev_tstamp delay) EV_NOEXCEPT { if (delay > 0.) { @@ -1908,6 +1910,8 @@ EV_TS_SET (ts, delay); nanosleep (&ts, 0); #elif defined _WIN32 + /* maybe this should round up, as ms is very low resolution */ + /* compared to select (µs) or nanosleep (ns) */ Sleep ((unsigned long)(delay * 1e3)); #else struct timeval tv; @@ -1992,7 +1996,7 @@ noinline void -ev_feed_event (EV_P_ void *w, int revents) EV_THROW +ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT { W w_ = (W)w; int pri = ABSPRI (w_); @@ -2063,7 +2067,7 @@ } void -ev_feed_fd_event (EV_P_ int fd, int revents) EV_THROW +ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT { if (fd >= 0 && fd < anfdmax) fd_event_nocheck (EV_A_ fd, revents); @@ -2473,7 +2477,7 @@ #ifdef _WIN32 WSABUF buf; DWORD sent; - buf.buf = &buf; + buf.buf = (char *)&buf; buf.len = 1; WSASend (EV_FD_TO_WIN32_HANDLE (evpipe [1]), &buf, 1, &sent, 0, 0, 0); #else @@ -2555,7 +2559,7 @@ /*****************************************************************************/ void -ev_feed_signal (int signum) EV_THROW +ev_feed_signal (int signum) EV_NOEXCEPT { #if EV_MULTIPLICITY EV_P; @@ -2582,7 +2586,7 @@ noinline void -ev_feed_signal_event (EV_P_ int signum) EV_THROW +ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT { WL w; @@ -2709,13 +2713,13 @@ #endif ecb_cold int -ev_version_major (void) EV_THROW +ev_version_major (void) EV_NOEXCEPT { return EV_VERSION_MAJOR; } ecb_cold int -ev_version_minor (void) EV_THROW +ev_version_minor (void) EV_NOEXCEPT { return EV_VERSION_MINOR; } @@ -2734,7 +2738,7 @@ ecb_cold unsigned int -ev_supported_backends (void) EV_THROW +ev_supported_backends (void) EV_NOEXCEPT { unsigned int flags = 0; @@ -2749,7 +2753,7 @@ ecb_cold unsigned int -ev_recommended_backends (void) EV_THROW +ev_recommended_backends (void) EV_NOEXCEPT { unsigned int flags = ev_supported_backends (); @@ -2772,7 +2776,7 @@ ecb_cold unsigned int -ev_embeddable_backends (void) EV_THROW +ev_embeddable_backends (void) EV_NOEXCEPT { int flags = EVBACKEND_EPOLL | EVBACKEND_KQUEUE | EVBACKEND_PORT; @@ -2784,56 +2788,56 @@ } unsigned int -ev_backend (EV_P) EV_THROW +ev_backend (EV_P) EV_NOEXCEPT { return backend; } #if EV_FEATURE_API unsigned int -ev_iteration (EV_P) EV_THROW +ev_iteration (EV_P) EV_NOEXCEPT { return loop_count; } unsigned int -ev_depth (EV_P) EV_THROW +ev_depth (EV_P) EV_NOEXCEPT { return loop_depth; } void -ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_THROW +ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT { io_blocktime = interval; } void -ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_THROW +ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT { timeout_blocktime = interval; } void -ev_set_userdata (EV_P_ void *data) EV_THROW +ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT { userdata = data; } void * -ev_userdata (EV_P) EV_THROW +ev_userdata (EV_P) EV_NOEXCEPT { return userdata; } void -ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_THROW +ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT { invoke_cb = invoke_pending_cb; } void -ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_THROW, void (*acquire)(EV_P) EV_THROW) EV_THROW +ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT { release_cb = release; acquire_cb = acquire; @@ -2843,7 +2847,7 @@ /* initialise a loop structure, must be zero-initialised */ noinline ecb_cold static void -loop_init (EV_P_ unsigned int flags) EV_THROW +loop_init (EV_P_ unsigned int flags) EV_NOEXCEPT { if (!backend) { @@ -3094,7 +3098,7 @@ ecb_cold struct ev_loop * -ev_loop_new (unsigned int flags) EV_THROW +ev_loop_new (unsigned int flags) EV_NOEXCEPT { EV_P = (struct ev_loop *)ev_malloc (sizeof (struct ev_loop)); @@ -3151,7 +3155,7 @@ #if EV_FEATURE_API void ecb_cold -ev_verify (EV_P) EV_THROW +ev_verify (EV_P) EV_NOEXCEPT { #if EV_VERIFY int i; @@ -3242,7 +3246,7 @@ #else int #endif -ev_default_loop (unsigned int flags) EV_THROW +ev_default_loop (unsigned int flags) EV_NOEXCEPT { if (!ev_default_loop_ptr) { @@ -3271,7 +3275,7 @@ } void -ev_loop_fork (EV_P) EV_THROW +ev_loop_fork (EV_P) EV_NOEXCEPT { postfork = 1; } @@ -3285,7 +3289,7 @@ } unsigned int -ev_pending_count (EV_P) EV_THROW +ev_pending_count (EV_P) EV_NOEXCEPT { int pri; unsigned int count = 0; @@ -3302,10 +3306,11 @@ { pendingpri = NUMPRI; - while (pendingpri) /* pendingpri possibly gets modified in the inner loop */ + do { --pendingpri; + /* pendingpri possibly gets modified in the inner loop */ while (pendingcnt [pendingpri]) { ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri]; @@ -3315,6 +3320,7 @@ EV_FREQUENT_CHECK; } } + while (pendingpri); } #if EV_IDLE_ENABLE @@ -3733,37 +3739,37 @@ } void -ev_break (EV_P_ int how) EV_THROW +ev_break (EV_P_ int how) EV_NOEXCEPT { loop_done = how; } void -ev_ref (EV_P) EV_THROW +ev_ref (EV_P) EV_NOEXCEPT { ++activecnt; } void -ev_unref (EV_P) EV_THROW +ev_unref (EV_P) EV_NOEXCEPT { --activecnt; } void -ev_now_update (EV_P) EV_THROW +ev_now_update (EV_P) EV_NOEXCEPT { time_update (EV_A_ 1e100); } void -ev_suspend (EV_P) EV_THROW +ev_suspend (EV_P) EV_NOEXCEPT { ev_now_update (EV_A); } void -ev_resume (EV_P) EV_THROW +ev_resume (EV_P) EV_NOEXCEPT { ev_tstamp mn_prev = mn_now; @@ -3812,7 +3818,7 @@ } int -ev_clear_pending (EV_P_ void *w) EV_THROW +ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT { W w_ = (W)w; int pending = w_->pending; @@ -3856,7 +3862,7 @@ noinline void -ev_io_start (EV_P_ ev_io *w) EV_THROW +ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT { int fd = w->fd; @@ -3883,7 +3889,7 @@ noinline void -ev_io_stop (EV_P_ ev_io *w) EV_THROW +ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -3903,7 +3909,7 @@ noinline void -ev_timer_start (EV_P_ ev_timer *w) EV_THROW +ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT { if (expect_false (ev_is_active (w))) return; @@ -3928,7 +3934,7 @@ noinline void -ev_timer_stop (EV_P_ ev_timer *w) EV_THROW +ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -3959,7 +3965,7 @@ noinline void -ev_timer_again (EV_P_ ev_timer *w) EV_THROW +ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT { EV_FREQUENT_CHECK; @@ -3986,7 +3992,7 @@ } ev_tstamp -ev_timer_remaining (EV_P_ ev_timer *w) EV_THROW +ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT { return ev_at (w) - (ev_is_active (w) ? mn_now : 0.); } @@ -3994,7 +4000,7 @@ #if EV_PERIODIC_ENABLE noinline void -ev_periodic_start (EV_P_ ev_periodic *w) EV_THROW +ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT { if (expect_false (ev_is_active (w))) return; @@ -4025,7 +4031,7 @@ noinline void -ev_periodic_stop (EV_P_ ev_periodic *w) EV_THROW +ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -4054,7 +4060,7 @@ noinline void -ev_periodic_again (EV_P_ ev_periodic *w) EV_THROW +ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT { /* TODO: use adjustheap and recalculation */ ev_periodic_stop (EV_A_ w); @@ -4070,7 +4076,7 @@ noinline void -ev_signal_start (EV_P_ ev_signal *w) EV_THROW +ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT { if (expect_false (ev_is_active (w))) return; @@ -4153,7 +4159,7 @@ noinline void -ev_signal_stop (EV_P_ ev_signal *w) EV_THROW +ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -4194,7 +4200,7 @@ #if EV_CHILD_ENABLE void -ev_child_start (EV_P_ ev_child *w) EV_THROW +ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT { #if EV_MULTIPLICITY assert (("libev: child watchers are only supported in the default loop", loop == ev_default_loop_ptr)); @@ -4211,7 +4217,7 @@ } void -ev_child_stop (EV_P_ ev_child *w) EV_THROW +ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -4486,7 +4492,7 @@ #endif void -ev_stat_stat (EV_P_ ev_stat *w) EV_THROW +ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT { if (lstat (w->path, &w->attr) < 0) w->attr.st_nlink = 0; @@ -4536,7 +4542,7 @@ } void -ev_stat_start (EV_P_ ev_stat *w) EV_THROW +ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT { if (expect_false (ev_is_active (w))) return; @@ -4567,7 +4573,7 @@ } void -ev_stat_stop (EV_P_ ev_stat *w) EV_THROW +ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -4593,7 +4599,7 @@ #if EV_IDLE_ENABLE void -ev_idle_start (EV_P_ ev_idle *w) EV_THROW +ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT { if (expect_false (ev_is_active (w))) return; @@ -4616,7 +4622,7 @@ } void -ev_idle_stop (EV_P_ ev_idle *w) EV_THROW +ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -4640,7 +4646,7 @@ #if EV_PREPARE_ENABLE void -ev_prepare_start (EV_P_ ev_prepare *w) EV_THROW +ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT { if (expect_false (ev_is_active (w))) return; @@ -4655,7 +4661,7 @@ } void -ev_prepare_stop (EV_P_ ev_prepare *w) EV_THROW +ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -4678,7 +4684,7 @@ #if EV_CHECK_ENABLE void -ev_check_start (EV_P_ ev_check *w) EV_THROW +ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT { if (expect_false (ev_is_active (w))) return; @@ -4693,7 +4699,7 @@ } void -ev_check_stop (EV_P_ ev_check *w) EV_THROW +ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -4717,7 +4723,7 @@ #if EV_EMBED_ENABLE noinline void -ev_embed_sweep (EV_P_ ev_embed *w) EV_THROW +ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT { ev_run (w->other, EVRUN_NOWAIT); } @@ -4775,7 +4781,7 @@ #endif void -ev_embed_start (EV_P_ ev_embed *w) EV_THROW +ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT { if (expect_false (ev_is_active (w))) return; @@ -4806,7 +4812,7 @@ } void -ev_embed_stop (EV_P_ ev_embed *w) EV_THROW +ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -4826,7 +4832,7 @@ #if EV_FORK_ENABLE void -ev_fork_start (EV_P_ ev_fork *w) EV_THROW +ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT { if (expect_false (ev_is_active (w))) return; @@ -4841,7 +4847,7 @@ } void -ev_fork_stop (EV_P_ ev_fork *w) EV_THROW +ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -4864,7 +4870,7 @@ #if EV_CLEANUP_ENABLE void -ev_cleanup_start (EV_P_ ev_cleanup *w) EV_THROW +ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT { if (expect_false (ev_is_active (w))) return; @@ -4881,7 +4887,7 @@ } void -ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_THROW +ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -4905,7 +4911,7 @@ #if EV_ASYNC_ENABLE void -ev_async_start (EV_P_ ev_async *w) EV_THROW +ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT { if (expect_false (ev_is_active (w))) return; @@ -4924,7 +4930,7 @@ } void -ev_async_stop (EV_P_ ev_async *w) EV_THROW +ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT { clear_pending (EV_A_ (W)w); if (expect_false (!ev_is_active (w))) @@ -4945,7 +4951,7 @@ } void -ev_async_send (EV_P_ ev_async *w) EV_THROW +ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT { w->sent = 1; evpipe_write (EV_A_ &async_pending); @@ -4992,7 +4998,7 @@ } void -ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_THROW +ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT { struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once)); @@ -5025,7 +5031,7 @@ #if EV_WALK_ENABLE ecb_cold void -ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_THROW +ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT { int i, j; ev_watcher_list *wl, *wn; diff -Nru gvpe-3.0/libev/ev_epoll.c gvpe-3.1/libev/ev_epoll.c --- gvpe-3.0/libev/ev_epoll.c 2016-02-18 04:42:18.000000000 +0000 +++ gvpe-3.1/libev/ev_epoll.c 2018-10-25 03:10:51.000000000 +0000 @@ -239,7 +239,7 @@ int epoll_init (EV_P_ int flags) { -#ifdef EPOLL_CLOEXEC +#if defined EPOLL_CLOEXEC && !defined __ANDROID__ backend_fd = epoll_create1 (EPOLL_CLOEXEC); if (backend_fd < 0 && (errno == EINVAL || errno == ENOSYS)) diff -Nru gvpe-3.0/libev/ev.h gvpe-3.1/libev/ev.h --- gvpe-3.0/libev/ev.h 2016-06-07 04:32:29.000000000 +0000 +++ gvpe-3.1/libev/ev.h 2018-10-25 03:17:54.000000000 +0000 @@ -1,7 +1,7 @@ /* * libev native API header * - * Copyright (c) 2007,2008,2009,2010,2011,2012,2015 Marc Alexander Lehmann + * Copyright (c) 2007-2018 Marc Alexander Lehmann * All rights reserved. * * Redistribution and use in source and binary forms, with or without modifica- @@ -43,13 +43,13 @@ #ifdef __cplusplus # define EV_CPP(x) x # if __cplusplus >= 201103L -# define EV_THROW noexcept +# define EV_NOEXCEPT noexcept # else -# define EV_THROW throw () +# define EV_NOEXCEPT # endif #else # define EV_CPP(x) -# define EV_THROW +# define EV_NOEXCEPT #endif EV_CPP(extern "C" {) @@ -211,7 +211,7 @@ /*****************************************************************************/ #define EV_VERSION_MAJOR 4 -#define EV_VERSION_MINOR 22 +#define EV_VERSION_MINOR 24 /* eventmask, revents, events... */ enum { @@ -339,7 +339,7 @@ ev_tstamp offset; /* rw */ ev_tstamp interval; /* rw */ - ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_THROW; /* rw */ + ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_NOEXCEPT; /* rw */ } ev_periodic; /* invoked when the given signal has been received */ @@ -526,15 +526,15 @@ }; #if EV_PROTOTYPES -EV_API_DECL int ev_version_major (void) EV_THROW; -EV_API_DECL int ev_version_minor (void) EV_THROW; +EV_API_DECL int ev_version_major (void) EV_NOEXCEPT; +EV_API_DECL int ev_version_minor (void) EV_NOEXCEPT; -EV_API_DECL unsigned int ev_supported_backends (void) EV_THROW; -EV_API_DECL unsigned int ev_recommended_backends (void) EV_THROW; -EV_API_DECL unsigned int ev_embeddable_backends (void) EV_THROW; +EV_API_DECL unsigned int ev_supported_backends (void) EV_NOEXCEPT; +EV_API_DECL unsigned int ev_recommended_backends (void) EV_NOEXCEPT; +EV_API_DECL unsigned int ev_embeddable_backends (void) EV_NOEXCEPT; -EV_API_DECL ev_tstamp ev_time (void) EV_THROW; -EV_API_DECL void ev_sleep (ev_tstamp delay) EV_THROW; /* sleep for a while */ +EV_API_DECL ev_tstamp ev_time (void) EV_NOEXCEPT; +EV_API_DECL void ev_sleep (ev_tstamp delay) EV_NOEXCEPT; /* sleep for a while */ /* Sets the allocation function to use, works like realloc. * It is used to allocate and free memory. @@ -542,26 +542,26 @@ * or take some potentially destructive action. * The default is your system realloc function. */ -EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW; +EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT; /* set the callback function to call on a * retryable syscall error * (such as failed select, poll, epoll_wait) */ -EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW; +EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT; #if EV_MULTIPLICITY /* the default loop is the only one that handles signals and child watchers */ /* you can call this as often as you like */ -EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_THROW; +EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; #ifdef EV_API_STATIC EV_API_DECL struct ev_loop *ev_default_loop_ptr; #endif EV_INLINE struct ev_loop * -ev_default_loop_uc_ (void) EV_THROW +ev_default_loop_uc_ (void) EV_NOEXCEPT { extern struct ev_loop *ev_default_loop_ptr; @@ -569,31 +569,31 @@ } EV_INLINE int -ev_is_default_loop (EV_P) EV_THROW +ev_is_default_loop (EV_P) EV_NOEXCEPT { return EV_A == EV_DEFAULT_UC; } /* create and destroy alternative loops that don't handle signals */ -EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_THROW; +EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; -EV_API_DECL ev_tstamp ev_now (EV_P) EV_THROW; /* time w.r.t. timers and the eventloop, updated after each poll */ +EV_API_DECL ev_tstamp ev_now (EV_P) EV_NOEXCEPT; /* time w.r.t. timers and the eventloop, updated after each poll */ #else -EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_THROW; /* returns true when successful */ +EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; /* returns true when successful */ EV_API_DECL ev_tstamp ev_rt_now; EV_INLINE ev_tstamp -ev_now (void) EV_THROW +ev_now (void) EV_NOEXCEPT { return ev_rt_now; } /* looks weird, but ev_is_default_loop (EV_A) still works if this exists */ EV_INLINE int -ev_is_default_loop (void) EV_THROW +ev_is_default_loop (void) EV_NOEXCEPT { return 1; } @@ -607,17 +607,17 @@ /* when you want to re-use it in the child */ /* you can call it in either the parent or the child */ /* you can actually call it at any time, anywhere :) */ -EV_API_DECL void ev_loop_fork (EV_P) EV_THROW; +EV_API_DECL void ev_loop_fork (EV_P) EV_NOEXCEPT; -EV_API_DECL unsigned int ev_backend (EV_P) EV_THROW; /* backend in use by loop */ +EV_API_DECL unsigned int ev_backend (EV_P) EV_NOEXCEPT; /* backend in use by loop */ -EV_API_DECL void ev_now_update (EV_P) EV_THROW; /* update event loop time */ +EV_API_DECL void ev_now_update (EV_P) EV_NOEXCEPT; /* update event loop time */ #if EV_WALK_ENABLE /* walk (almost) all watchers in the loop of a given type, invoking the */ /* callback on every such watcher. The callback might stop the watcher, */ /* but do nothing else with the loop */ -EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_THROW; +EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT; #endif #endif /* prototypes */ @@ -637,46 +637,46 @@ #if EV_PROTOTYPES EV_API_DECL int ev_run (EV_P_ int flags EV_CPP (= 0)); -EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_THROW; /* break out of the loop */ +EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_NOEXCEPT; /* break out of the loop */ /* * ref/unref can be used to add or remove a refcount on the mainloop. every watcher * keeps one reference. if you have a long-running watcher you never unregister that * should not keep ev_loop from running, unref() after starting, and ref() before stopping. */ -EV_API_DECL void ev_ref (EV_P) EV_THROW; -EV_API_DECL void ev_unref (EV_P) EV_THROW; +EV_API_DECL void ev_ref (EV_P) EV_NOEXCEPT; +EV_API_DECL void ev_unref (EV_P) EV_NOEXCEPT; /* * convenience function, wait for a single event, without registering an event watcher * if timeout is < 0, do wait indefinitely */ -EV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_THROW; +EV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT; # if EV_FEATURE_API -EV_API_DECL unsigned int ev_iteration (EV_P) EV_THROW; /* number of loop iterations */ -EV_API_DECL unsigned int ev_depth (EV_P) EV_THROW; /* #ev_loop enters - #ev_loop leaves */ -EV_API_DECL void ev_verify (EV_P) EV_THROW; /* abort if loop data corrupted */ +EV_API_DECL unsigned int ev_iteration (EV_P) EV_NOEXCEPT; /* number of loop iterations */ +EV_API_DECL unsigned int ev_depth (EV_P) EV_NOEXCEPT; /* #ev_loop enters - #ev_loop leaves */ +EV_API_DECL void ev_verify (EV_P) EV_NOEXCEPT; /* abort if loop data corrupted */ -EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_THROW; /* sleep at least this time, default 0 */ -EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_THROW; /* sleep at least this time, default 0 */ +EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ +EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ /* advanced stuff for threading etc. support, see docs */ -EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_THROW; -EV_API_DECL void *ev_userdata (EV_P) EV_THROW; +EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT; +EV_API_DECL void *ev_userdata (EV_P) EV_NOEXCEPT; typedef void (*ev_loop_callback)(EV_P); -EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_THROW; +EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT; /* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */ -EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_THROW, void (*acquire)(EV_P) EV_THROW) EV_THROW; +EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT; -EV_API_DECL unsigned int ev_pending_count (EV_P) EV_THROW; /* number of pending events, if any */ +EV_API_DECL unsigned int ev_pending_count (EV_P) EV_NOEXCEPT; /* number of pending events, if any */ EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */ /* * stop/start the timer handling. */ -EV_API_DECL void ev_suspend (EV_P) EV_THROW; -EV_API_DECL void ev_resume (EV_P) EV_THROW; +EV_API_DECL void ev_suspend (EV_P) EV_NOEXCEPT; +EV_API_DECL void ev_resume (EV_P) EV_NOEXCEPT; #endif #endif @@ -744,85 +744,85 @@ /* feeds an event into a watcher as if the event actually occurred */ /* accepts any ev_watcher type */ -EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_THROW; -EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_THROW; +EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT; +EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT; #if EV_SIGNAL_ENABLE -EV_API_DECL void ev_feed_signal (int signum) EV_THROW; -EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_THROW; +EV_API_DECL void ev_feed_signal (int signum) EV_NOEXCEPT; +EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT; #endif EV_API_DECL void ev_invoke (EV_P_ void *w, int revents); -EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_THROW; +EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT; -EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_THROW; -EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_THROW; +EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT; +EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT; -EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_THROW; -EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_THROW; +EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT; +EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT; /* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */ -EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_THROW; +EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT; /* return remaining time */ -EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_THROW; +EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT; #if EV_PERIODIC_ENABLE -EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_THROW; -EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_THROW; -EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_THROW; +EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT; +EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT; +EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT; #endif /* only supported in the default loop */ #if EV_SIGNAL_ENABLE -EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_THROW; -EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_THROW; +EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT; +EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT; #endif /* only supported in the default loop */ # if EV_CHILD_ENABLE -EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_THROW; -EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_THROW; +EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT; +EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT; # endif # if EV_STAT_ENABLE -EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_THROW; -EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_THROW; -EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_THROW; +EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT; +EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT; +EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT; # endif # if EV_IDLE_ENABLE -EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_THROW; -EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_THROW; +EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT; +EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT; # endif #if EV_PREPARE_ENABLE -EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_THROW; -EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_THROW; +EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT; +EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT; #endif #if EV_CHECK_ENABLE -EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_THROW; -EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_THROW; +EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT; +EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT; #endif # if EV_FORK_ENABLE -EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_THROW; -EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_THROW; +EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT; +EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT; # endif # if EV_CLEANUP_ENABLE -EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_THROW; -EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_THROW; +EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT; +EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT; # endif # if EV_EMBED_ENABLE /* only supported when loop to be embedded is in fact embeddable */ -EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_THROW; -EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_THROW; -EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_THROW; +EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT; +EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT; +EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT; # endif # if EV_ASYNC_ENABLE -EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_THROW; -EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_THROW; -EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_THROW; +EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT; +EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT; +EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT; # endif #if EV_COMPAT3 diff -Nru gvpe-3.0/libev/ev++.h gvpe-3.1/libev/ev++.h --- gvpe-3.0/libev/ev++.h 2015-06-29 14:13:35.000000000 +0000 +++ gvpe-3.1/libev/ev++.h 2018-10-25 03:17:10.000000000 +0000 @@ -1,7 +1,7 @@ /* * libev simple C++ wrapper classes * - * Copyright (c) 2007,2008,2010 Marc Alexander Lehmann + * Copyright (c) 2007,2008,2010,2018 Marc Alexander Lehmann * All rights reserved. * * Redistribution and use in source and binary forms, with or without modifica- @@ -113,13 +113,13 @@ struct bad_loop #if EV_USE_STDEXCEPT - : std::runtime_error + : std::exception #endif { #if EV_USE_STDEXCEPT - bad_loop () - : std::runtime_error ("libev event loop cannot be initialized, bad value of LIBEV_FLAGS?") + const char *what () const EV_NOEXCEPT { + return "libev event loop cannot be initialized, bad value of LIBEV_FLAGS?"; } #endif }; @@ -142,14 +142,14 @@ struct loop_ref { - loop_ref (EV_P) throw () + loop_ref (EV_P) EV_NOEXCEPT #if EV_MULTIPLICITY : EV_AX (EV_A) #endif { } - bool operator == (const loop_ref &other) const throw () + bool operator == (const loop_ref &other) const EV_NOEXCEPT { #if EV_MULTIPLICITY return EV_AX == other.EV_AX; @@ -158,7 +158,7 @@ #endif } - bool operator != (const loop_ref &other) const throw () + bool operator != (const loop_ref &other) const EV_NOEXCEPT { #if EV_MULTIPLICITY return ! (*this == other); @@ -168,27 +168,27 @@ } #if EV_MULTIPLICITY - bool operator == (const EV_P) const throw () + bool operator == (const EV_P) const EV_NOEXCEPT { return this->EV_AX == EV_A; } - bool operator != (const EV_P) const throw () + bool operator != (const EV_P) const EV_NOEXCEPT { - return (*this == EV_A); + return ! (*this == EV_A); } - operator struct ev_loop * () const throw () + operator struct ev_loop * () const EV_NOEXCEPT { return EV_AX; } - operator const struct ev_loop * () const throw () + operator const struct ev_loop * () const EV_NOEXCEPT { return EV_AX; } - bool is_default () const throw () + bool is_default () const EV_NOEXCEPT { return EV_AX == ev_default_loop (0); } @@ -200,7 +200,7 @@ ev_run (EV_AX_ flags); } - void unloop (how_t how = ONE) throw () + void unloop (how_t how = ONE) EV_NOEXCEPT { ev_break (EV_AX_ how); } @@ -211,74 +211,74 @@ ev_run (EV_AX_ flags); } - void break_loop (how_t how = ONE) throw () + void break_loop (how_t how = ONE) EV_NOEXCEPT { ev_break (EV_AX_ how); } - void post_fork () throw () + void post_fork () EV_NOEXCEPT { ev_loop_fork (EV_AX); } - unsigned int backend () const throw () + unsigned int backend () const EV_NOEXCEPT { return ev_backend (EV_AX); } - tstamp now () const throw () + tstamp now () const EV_NOEXCEPT { return ev_now (EV_AX); } - void ref () throw () + void ref () EV_NOEXCEPT { ev_ref (EV_AX); } - void unref () throw () + void unref () EV_NOEXCEPT { ev_unref (EV_AX); } #if EV_FEATURE_API - unsigned int iteration () const throw () + unsigned int iteration () const EV_NOEXCEPT { return ev_iteration (EV_AX); } - unsigned int depth () const throw () + unsigned int depth () const EV_NOEXCEPT { return ev_depth (EV_AX); } - void set_io_collect_interval (tstamp interval) throw () + void set_io_collect_interval (tstamp interval) EV_NOEXCEPT { ev_set_io_collect_interval (EV_AX_ interval); } - void set_timeout_collect_interval (tstamp interval) throw () + void set_timeout_collect_interval (tstamp interval) EV_NOEXCEPT { ev_set_timeout_collect_interval (EV_AX_ interval); } #endif // function callback - void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void *arg = 0) throw () + void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void *arg = 0) EV_NOEXCEPT { ev_once (EV_AX_ fd, events, timeout, cb, arg); } // method callback template - void once (int fd, int events, tstamp timeout, K *object) throw () + void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT { once (fd, events, timeout, method_thunk, object); } // default method == operator () template - void once (int fd, int events, tstamp timeout, K *object) throw () + void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT { once (fd, events, timeout, method_thunk, object); } @@ -292,7 +292,7 @@ // no-argument method callback template - void once (int fd, int events, tstamp timeout, K *object) throw () + void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT { once (fd, events, timeout, method_noargs_thunk, object); } @@ -306,7 +306,7 @@ // simpler function callback template - void once (int fd, int events, tstamp timeout) throw () + void once (int fd, int events, tstamp timeout) EV_NOEXCEPT { once (fd, events, timeout, simpler_func_thunk); } @@ -320,7 +320,7 @@ // simplest function callback template - void once (int fd, int events, tstamp timeout) throw () + void once (int fd, int events, tstamp timeout) EV_NOEXCEPT { once (fd, events, timeout, simplest_func_thunk); } @@ -332,12 +332,12 @@ (); } - void feed_fd_event (int fd, int revents) throw () + void feed_fd_event (int fd, int revents) EV_NOEXCEPT { ev_feed_fd_event (EV_AX_ fd, revents); } - void feed_signal_event (int signum) throw () + void feed_signal_event (int signum) EV_NOEXCEPT { ev_feed_signal_event (EV_AX_ signum); } @@ -352,14 +352,14 @@ struct dynamic_loop : loop_ref { - dynamic_loop (unsigned int flags = AUTO) throw (bad_loop) + dynamic_loop (unsigned int flags = AUTO) : loop_ref (ev_loop_new (flags)) { if (!EV_AX) throw bad_loop (); } - ~dynamic_loop () throw () + ~dynamic_loop () EV_NOEXCEPT { ev_loop_destroy (EV_AX); EV_AX = 0; @@ -376,7 +376,7 @@ struct default_loop : loop_ref { - default_loop (unsigned int flags = AUTO) throw (bad_loop) + default_loop (unsigned int flags = AUTO) #if EV_MULTIPLICITY : loop_ref (ev_default_loop (flags)) #endif @@ -396,7 +396,7 @@ default_loop &operator = (const default_loop &); }; - inline loop_ref get_default_loop () throw () + inline loop_ref get_default_loop () EV_NOEXCEPT { #if EV_MULTIPLICITY return ev_default_loop (0); @@ -425,13 +425,13 @@ EV_PX; // loop set - void set (EV_P) throw () + void set (EV_P) EV_NOEXCEPT { this->EV_A = EV_A; } #endif - base (EV_PX) throw () + base (EV_PX) EV_NOEXCEPT #if EV_MULTIPLICITY : EV_A (EV_A) #endif @@ -439,7 +439,7 @@ ev_init (this, 0); } - void set_ (const void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) throw () + void set_ (const void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) EV_NOEXCEPT { this->data = (void *)data; ev_set_cb (static_cast(this), cb); @@ -447,7 +447,7 @@ // function callback template - void set (void *data = 0) throw () + void set (void *data = 0) EV_NOEXCEPT { set_ (data, function_thunk); } @@ -461,14 +461,14 @@ // method callback template - void set (K *object) throw () + void set (K *object) EV_NOEXCEPT { set_ (object, method_thunk); } // default method == operator () template - void set (K *object) throw () + void set (K *object) EV_NOEXCEPT { set_ (object, method_thunk); } @@ -482,7 +482,7 @@ // no-argument callback template - void set (K *object) throw () + void set (K *object) EV_NOEXCEPT { set_ (object, method_noargs_thunk); } @@ -501,76 +501,76 @@ (static_cast(this), events); } - bool is_active () const throw () + bool is_active () const EV_NOEXCEPT { return ev_is_active (static_cast(this)); } - bool is_pending () const throw () + bool is_pending () const EV_NOEXCEPT { return ev_is_pending (static_cast(this)); } - void feed_event (int revents) throw () + void feed_event (int revents) EV_NOEXCEPT { ev_feed_event (EV_A_ static_cast(this), revents); } }; - inline tstamp now (EV_P) throw () + inline tstamp now (EV_P) EV_NOEXCEPT { return ev_now (EV_A); } - inline void delay (tstamp interval) throw () + inline void delay (tstamp interval) EV_NOEXCEPT { ev_sleep (interval); } - inline int version_major () throw () + inline int version_major () EV_NOEXCEPT { return ev_version_major (); } - inline int version_minor () throw () + inline int version_minor () EV_NOEXCEPT { return ev_version_minor (); } - inline unsigned int supported_backends () throw () + inline unsigned int supported_backends () EV_NOEXCEPT { return ev_supported_backends (); } - inline unsigned int recommended_backends () throw () + inline unsigned int recommended_backends () EV_NOEXCEPT { return ev_recommended_backends (); } - inline unsigned int embeddable_backends () throw () + inline unsigned int embeddable_backends () EV_NOEXCEPT { return ev_embeddable_backends (); } - inline void set_allocator (void *(*cb)(void *ptr, long size) throw ()) throw () + inline void set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT { ev_set_allocator (cb); } - inline void set_syserr_cb (void (*cb)(const char *msg) throw ()) throw () + inline void set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT { ev_set_syserr_cb (cb); } #if EV_MULTIPLICITY #define EV_CONSTRUCT(cppstem,cstem) \ - (EV_PX = get_default_loop ()) throw () \ + (EV_PX = get_default_loop ()) EV_NOEXCEPT \ : base (EV_A) \ { \ } #else #define EV_CONSTRUCT(cppstem,cstem) \ - () throw () \ + () EV_NOEXCEPT \ { \ } #endif @@ -581,19 +581,19 @@ \ struct cppstem : base \ { \ - void start () throw () \ + void start () EV_NOEXCEPT \ { \ ev_ ## cstem ## _start (EV_A_ static_cast(this)); \ } \ \ - void stop () throw () \ + void stop () EV_NOEXCEPT \ { \ ev_ ## cstem ## _stop (EV_A_ static_cast(this)); \ } \ \ cppstem EV_CONSTRUCT(cppstem,cstem) \ \ - ~cppstem () throw () \ + ~cppstem () EV_NOEXCEPT \ { \ stop (); \ } \ @@ -612,7 +612,7 @@ }; EV_BEGIN_WATCHER (io, io) - void set (int fd, int events) throw () + void set (int fd, int events) EV_NOEXCEPT { int active = is_active (); if (active) stop (); @@ -620,7 +620,7 @@ if (active) start (); } - void set (int events) throw () + void set (int events) EV_NOEXCEPT { int active = is_active (); if (active) stop (); @@ -628,7 +628,7 @@ if (active) start (); } - void start (int fd, int events) throw () + void start (int fd, int events) EV_NOEXCEPT { set (fd, events); start (); @@ -636,7 +636,7 @@ EV_END_WATCHER (io, io) EV_BEGIN_WATCHER (timer, timer) - void set (ev_tstamp after, ev_tstamp repeat = 0.) throw () + void set (ev_tstamp after, ev_tstamp repeat = 0.) EV_NOEXCEPT { int active = is_active (); if (active) stop (); @@ -644,13 +644,13 @@ if (active) start (); } - void start (ev_tstamp after, ev_tstamp repeat = 0.) throw () + void start (ev_tstamp after, ev_tstamp repeat = 0.) EV_NOEXCEPT { set (after, repeat); start (); } - void again () throw () + void again () EV_NOEXCEPT { ev_timer_again (EV_A_ static_cast(this)); } @@ -663,7 +663,7 @@ #if EV_PERIODIC_ENABLE EV_BEGIN_WATCHER (periodic, periodic) - void set (ev_tstamp at, ev_tstamp interval = 0.) throw () + void set (ev_tstamp at, ev_tstamp interval = 0.) EV_NOEXCEPT { int active = is_active (); if (active) stop (); @@ -671,13 +671,13 @@ if (active) start (); } - void start (ev_tstamp at, ev_tstamp interval = 0.) throw () + void start (ev_tstamp at, ev_tstamp interval = 0.) EV_NOEXCEPT { set (at, interval); start (); } - void again () throw () + void again () EV_NOEXCEPT { ev_periodic_again (EV_A_ static_cast(this)); } @@ -686,7 +686,7 @@ #if EV_SIGNAL_ENABLE EV_BEGIN_WATCHER (sig, signal) - void set (int signum) throw () + void set (int signum) EV_NOEXCEPT { int active = is_active (); if (active) stop (); @@ -694,7 +694,7 @@ if (active) start (); } - void start (int signum) throw () + void start (int signum) EV_NOEXCEPT { set (signum); start (); @@ -704,7 +704,7 @@ #if EV_CHILD_ENABLE EV_BEGIN_WATCHER (child, child) - void set (int pid, int trace = 0) throw () + void set (int pid, int trace = 0) EV_NOEXCEPT { int active = is_active (); if (active) stop (); @@ -712,7 +712,7 @@ if (active) start (); } - void start (int pid, int trace = 0) throw () + void start (int pid, int trace = 0) EV_NOEXCEPT { set (pid, trace); start (); @@ -722,7 +722,7 @@ #if EV_STAT_ENABLE EV_BEGIN_WATCHER (stat, stat) - void set (const char *path, ev_tstamp interval = 0.) throw () + void set (const char *path, ev_tstamp interval = 0.) EV_NOEXCEPT { int active = is_active (); if (active) stop (); @@ -730,14 +730,14 @@ if (active) start (); } - void start (const char *path, ev_tstamp interval = 0.) throw () + void start (const char *path, ev_tstamp interval = 0.) EV_NOEXCEPT { stop (); set (path, interval); start (); } - void update () throw () + void update () EV_NOEXCEPT { ev_stat_stat (EV_A_ static_cast(this)); } @@ -746,25 +746,25 @@ #if EV_IDLE_ENABLE EV_BEGIN_WATCHER (idle, idle) - void set () throw () { } + void set () EV_NOEXCEPT { } EV_END_WATCHER (idle, idle) #endif #if EV_PREPARE_ENABLE EV_BEGIN_WATCHER (prepare, prepare) - void set () throw () { } + void set () EV_NOEXCEPT { } EV_END_WATCHER (prepare, prepare) #endif #if EV_CHECK_ENABLE EV_BEGIN_WATCHER (check, check) - void set () throw () { } + void set () EV_NOEXCEPT { } EV_END_WATCHER (check, check) #endif #if EV_EMBED_ENABLE EV_BEGIN_WATCHER (embed, embed) - void set_embed (struct ev_loop *embedded_loop) throw () + void set_embed (struct ev_loop *embedded_loop) EV_NOEXCEPT { int active = is_active (); if (active) stop (); @@ -772,7 +772,7 @@ if (active) start (); } - void start (struct ev_loop *embedded_loop) throw () + void start (struct ev_loop *embedded_loop) EV_NOEXCEPT { set (embedded_loop); start (); @@ -787,18 +787,18 @@ #if EV_FORK_ENABLE EV_BEGIN_WATCHER (fork, fork) - void set () throw () { } + void set () EV_NOEXCEPT { } EV_END_WATCHER (fork, fork) #endif #if EV_ASYNC_ENABLE EV_BEGIN_WATCHER (async, async) - void send () throw () + void send () EV_NOEXCEPT { ev_async_send (EV_A_ static_cast(this)); } - bool async_pending () throw () + bool async_pending () EV_NOEXCEPT { return ev_async_pending (static_cast(this)); } diff -Nru gvpe-3.0/libev/ev_vars.h gvpe-3.1/libev/ev_vars.h --- gvpe-3.0/libev/ev_vars.h 2014-09-09 21:49:57.000000000 +0000 +++ gvpe-3.1/libev/ev_vars.h 2018-10-25 03:10:51.000000000 +0000 @@ -195,8 +195,8 @@ VARx(void *, userdata) /* C++ doesn't support the ev_loop_callback typedef here. stinks. */ -VAR (release_cb, void (*release_cb)(EV_P) EV_THROW) -VAR (acquire_cb, void (*acquire_cb)(EV_P) EV_THROW) +VAR (release_cb, void (*release_cb)(EV_P) EV_NOEXCEPT) +VAR (acquire_cb, void (*acquire_cb)(EV_P) EV_NOEXCEPT) VAR (invoke_cb , ev_loop_callback invoke_cb) #endif diff -Nru gvpe-3.0/m4/Makefile.am gvpe-3.1/m4/Makefile.am --- gvpe-3.0/m4/Makefile.am 2008-08-07 17:39:27.000000000 +0000 +++ gvpe-3.1/m4/Makefile.am 2018-10-25 03:32:55.000000000 +0000 @@ -4,7 +4,7 @@ EXTRA_DIST = README Makefile.am.in aclocal-include.m4 codeset.m4 \ gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 inttypes-pri.m4 inttypes.m4 \ inttypes_h.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 \ -lib-prefix.m4 openssl.m4 progtest.m4 stdint_h.m4 tuntap.m4 uintmax_t.m4 \ +lib-prefix.m4 progtest.m4 stdint_h.m4 tuntap.m4 uintmax_t.m4 \ ulonglong.m4 ##m4-files-end diff -Nru gvpe-3.0/m4/Makefile.in gvpe-3.1/m4/Makefile.in --- gvpe-3.0/m4/Makefile.in 2016-11-10 14:40:18.000000000 +0000 +++ gvpe-3.1/m4/Makefile.in 2018-10-25 07:30:09.000000000 +0000 @@ -41,6 +41,7 @@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ +AM_CPPFLAGS = @AM_CPPFLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -67,7 +68,6 @@ HAVE_TUNTAP = @HAVE_TUNTAP@ IFSUBTYPE = @IFSUBTYPE@ IFTYPE = @IFTYPE@ -INCLUDES = @INCLUDES@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -75,6 +75,8 @@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LDFLAGS_DAEMON = @LDFLAGS_DAEMON@ +LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ +LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ @@ -100,6 +102,9 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ ROHC_FALSE = @ROHC_FALSE@ @@ -162,7 +167,7 @@ EXTRA_DIST = README Makefile.am.in aclocal-include.m4 codeset.m4 \ gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 inttypes-pri.m4 inttypes.m4 \ inttypes_h.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 \ -lib-prefix.m4 openssl.m4 progtest.m4 stdint_h.m4 tuntap.m4 uintmax_t.m4 \ +lib-prefix.m4 progtest.m4 stdint_h.m4 tuntap.m4 uintmax_t.m4 \ ulonglong.m4 subdir = m4 diff -Nru gvpe-3.0/m4/openssl.m4 gvpe-3.1/m4/openssl.m4 --- gvpe-3.0/m4/openssl.m4 2013-07-10 00:17:56.000000000 +0000 +++ gvpe-3.1/m4/openssl.m4 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -dnl Check to find the OpenSSL headers/libraries - -AC_DEFUN([tinc_OPENSSL], -[ - tinc_ac_save_CPPFLAGS="$CPPFLAGS" - - AC_ARG_WITH(openssl-include, - [ --with-openssl-include=DIR OpenSSL headers directory (without trailing /openssl)], - [openssl_include="$withval" - CFLAGS="$CFLAGS -I$withval" - CPPFLAGS="$CPPFLAGS -I$withval"] - ) - - AC_ARG_WITH(openssl-lib, - [ --with-openssl-lib=DIR OpenSSL library directory], - [openssl_lib="$withval" - LIBS="$LIBS -L$withval"] - ) - - AC_CHECK_HEADERS(openssl/evp.h openssl/rsa.h openssl/rand.h openssl/err.h openssl/sha.h openssl/pem.h, - [], - [AC_MSG_ERROR([OpenSSL header files not found.]); break] - ) - - CPPFLAGS="$tinc_ac_save_CPPFLAGS" - - AC_CHECK_LIB(crypto, SHA1_Init, - [LIBS="$LIBS -lcrypto"], - [AC_MSG_ERROR([OpenSSL libraries not found.])] - ) - - AC_CHECK_FUNCS([RAND_pseudo_bytes OPENSSL_add_all_algorithms_noconf OpenSSL_add_all_algorithms SSLeay_add_all_algorithms]) - - AC_CHECK_FUNC(dlopen, - [], - [AC_CHECK_LIB(dl, dlopen, - [LIBS="$LIBS -ldl"], - [AC_MSG_ERROR([OpenSSL depends on libdl.])] - )] - ) - - AC_CHECK_FUNC(inflate, - [], - [AC_CHECK_LIB(z, inflate, - [LIBS="$LIBS -lz"], - [AC_MSG_ERROR([OpenSSL depends on libz.])] - )] - ) -]) diff -Nru gvpe-3.0/Makefile.in gvpe-3.1/Makefile.in --- gvpe-3.0/Makefile.in 2016-11-10 14:40:18.000000000 +0000 +++ gvpe-3.1/Makefile.in 2018-10-25 07:30:09.000000000 +0000 @@ -41,6 +41,7 @@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ +AM_CPPFLAGS = @AM_CPPFLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -67,7 +68,6 @@ HAVE_TUNTAP = @HAVE_TUNTAP@ IFSUBTYPE = @IFSUBTYPE@ IFTYPE = @IFTYPE@ -INCLUDES = @INCLUDES@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -75,6 +75,8 @@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LDFLAGS_DAEMON = @LDFLAGS_DAEMON@ +LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ +LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ @@ -100,6 +102,9 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ ROHC_FALSE = @ROHC_FALSE@ @@ -191,7 +196,7 @@ check-recursive installcheck-recursive DIST_COMMON = README $(srcdir)/Makefile.in $(srcdir)/configure \ ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL Makefile.am NEWS \ - TODO aclocal.m4 config.guess config.h.in config.rpath \ + TODO aclocal.m4 compile config.guess config.h.in config.rpath \ config.sub configure configure.ac depcomp install-sh missing \ mkinstalldirs DIST_SUBDIRS = $(SUBDIRS) @@ -213,7 +218,7 @@ $(srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(srcdir)/configure.ac $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.ac m4/aclocal-include.m4 m4/codeset.m4 m4/gettext.m4 m4/glibc21.m4 m4/iconv.m4 m4/intdiv0.m4 m4/inttypes-pri.m4 m4/inttypes.m4 m4/inttypes_h.m4 m4/isc-posix.m4 m4/lcmessage.m4 m4/lib-ld.m4 m4/lib-link.m4 m4/lib-prefix.m4 m4/openssl.m4 m4/progtest.m4 m4/stdint_h.m4 m4/tuntap.m4 m4/uintmax_t.m4 m4/ulonglong.m4 +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.ac m4/aclocal-include.m4 m4/codeset.m4 m4/gettext.m4 m4/glibc21.m4 m4/iconv.m4 m4/intdiv0.m4 m4/inttypes-pri.m4 m4/inttypes.m4 m4/inttypes_h.m4 m4/isc-posix.m4 m4/lcmessage.m4 m4/lib-ld.m4 m4/lib-link.m4 m4/lib-prefix.m4 m4/progtest.m4 m4/stdint_h.m4 m4/tuntap.m4 m4/uintmax_t.m4 m4/ulonglong.m4 cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) config.h: stamp-h1 diff -Nru gvpe-3.0/NEWS gvpe-3.1/NEWS --- gvpe-3.0/NEWS 2016-11-10 14:40:05.000000000 +0000 +++ gvpe-3.1/NEWS 2018-10-25 04:32:23.000000000 +0000 @@ -1,5 +1,12 @@ GVPE NEWS +3.1 + - port to openssl 1.1 BUT SEE WARNING IN configure.ac. Do not use! + - tinc cruft tremoval: remove getopt.[ch], it's less portable to + have it then to not have it. + - tinc cruft removal: use pkg-config to detect libressl/openssl. + - minor cleanups. + 3.0 Thu Nov 10 15:39:58 CET 2016 - INCOMPATIBLE CHANGE: core protocol version 1.0. - INCOMPATIBLE CHANGE: node sections are now introduced diff -Nru gvpe-3.0/po/gvpe.pot gvpe-3.1/po/gvpe.pot --- gvpe-3.0/po/gvpe.pot 2016-11-10 14:40:47.000000000 +0000 +++ gvpe-3.1/po/gvpe.pot 2018-10-25 04:29:06.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-11-10 15:40+0100\n" +"POT-Creation-Date: 2018-10-25 06:29+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -382,22 +382,22 @@ msgid "local node ('%s') not found in config file, aborting." msgstr "" -#: src/conf.C:656 +#: src/conf.C:667 #, c-format msgid "private hostkey and public node key mismatch: is '%s' the correct node?" msgstr "" -#: src/conf.C:692 +#: src/conf.C:704 #, c-format msgid "command line option '%s' refers to unknown node, ignoring." msgstr "" -#: src/conf.C:702 +#: src/conf.C:714 #, c-format msgid "%s, while parsing command line option '%s'." msgstr "" -#: src/conf.C:746 +#: src/conf.C:758 #, c-format msgid "" "\n" @@ -405,71 +405,71 @@ "\n" msgstr "" -#: src/conf.C:747 +#: src/conf.C:759 #, c-format msgid "# of nodes: %d\n" msgstr "" -#: src/conf.C:748 +#: src/conf.C:760 #, c-format msgid "this node: %s\n" msgstr "" -#: src/conf.C:749 +#: src/conf.C:761 #, c-format msgid "MTU: %d\n" msgstr "" -#: src/conf.C:750 +#: src/conf.C:762 #, c-format msgid "rekeying interval: %d\n" msgstr "" -#: src/conf.C:751 +#: src/conf.C:763 #, c-format msgid "keepalive interval: %d\n" msgstr "" -#: src/conf.C:752 +#: src/conf.C:764 #, c-format msgid "interface: %s\n" msgstr "" -#: src/conf.C:753 +#: src/conf.C:765 #, c-format msgid "primary rsa key: %s\n" msgstr "" -#: src/conf.C:754 +#: src/conf.C:766 #, c-format msgid "rsa key size: %d\n" msgstr "" -#: src/conf.C:758 +#: src/conf.C:770 msgid "ID#" msgstr "" -#: src/conf.C:758 +#: src/conf.C:770 msgid "MAC" msgstr "" -#: src/conf.C:758 +#: src/conf.C:770 msgid "Com" msgstr "" -#: src/conf.C:758 +#: src/conf.C:770 msgid "Conmode" msgstr "" -#: src/conf.C:758 +#: src/conf.C:770 msgid "Node" msgstr "" -#: src/conf.C:758 +#: src/conf.C:770 msgid "Prot" msgstr "" -#: src/conf.C:758 +#: src/conf.C:770 msgid "Host:Port" msgstr "" @@ -755,12 +755,12 @@ msgid "unable to open seed device '%s': %s, exiting." msgstr "" -#: src/gvpe.C:290 src/gvpectrl.C:384 +#: src/gvpe.C:290 src/gvpectrl.C:386 #, c-format msgid "%s version %s (built %s %s, protocol version %d.%d)\n" msgstr "" -#: src/gvpe.C:292 src/gvpectrl.C:386 +#: src/gvpe.C:292 src/gvpectrl.C:388 #, c-format msgid "Built with kernel interface %s/%s.\n" msgstr "" @@ -844,7 +844,7 @@ msgid "'%s' keypair already exists, not generating key.\n" msgstr "" -#: src/gvpectrl.C:388 +#: src/gvpectrl.C:390 #, c-format msgid "" "Copyright (C) 2003-2013 Marc Lehmann and others.\n" diff -Nru gvpe-3.0/src/conf.C gvpe-3.1/src/conf.C --- gvpe-3.0/src/conf.C 2015-10-31 06:14:32.000000000 +0000 +++ gvpe-3.1/src/conf.C 2018-10-25 04:28:59.000000000 +0000 @@ -1,6 +1,6 @@ /* conf.C -- configuration code - Copyright (C) 2003-2008,2011 Marc Lehmann + Copyright (C) 2003-2008,2011,2018 Marc Lehmann This file is part of GVPE. @@ -650,12 +650,24 @@ } if (conf.rsa_key && conf.thisnode->rsa_key) - if (BN_cmp (conf.rsa_key->n, conf.thisnode->rsa_key->n) != 0 - || BN_cmp (conf.rsa_key->e, conf.thisnode->rsa_key->e) != 0) - { - slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode); - exit (EXIT_FAILURE); - } + { + const BIGNUM *conf_n, *conf_e, *thisnode_n, *thisnode_e; + +#if OPENSSL_VERSION_NUMBER >= 0x10100000 && !LIBRESSL_VERSION_NUMBER + RSA_get0_key (conf.rsa_key, &conf_n, &conf_e, 0); + RSA_get0_key (conf.thisnode->rsa_key, &thisnode_n, &thisnode_e, 0); +#else + conf_n = conf.thisnode->rsa_key->n; + conf_e = conf.thisnode->rsa_key->e; + thisnode_n = conf.rsa_key->n; + thisnode_e = conf.rsa_key->e; +#endif + if (BN_cmp (conf_n, thisnode_n) != 0 || BN_cmp (conf_e, thisnode_e) != 0) + { + slog (L_NOTICE, _("private hostkey and public node key mismatch: is '%s' the correct node?"), ::thisnode); + exit (EXIT_FAILURE); + } + } } } diff -Nru gvpe-3.0/src/gvpectrl.C gvpe-3.1/src/gvpectrl.C --- gvpe-3.0/src/gvpectrl.C 2016-11-02 06:55:43.000000000 +0000 +++ gvpe-3.1/src/gvpectrl.C 2018-10-25 03:11:46.000000000 +0000 @@ -364,7 +364,9 @@ exit (EXIT_FAILURE); } - free(privname); + free (privname); + + return 0; } int diff -Nru gvpe-3.0/src/Makefile.am gvpe-3.1/src/Makefile.am --- gvpe-3.0/src/Makefile.am 2016-06-30 11:15:44.000000000 +0000 +++ gvpe-3.1/src/Makefile.am 2018-10-25 07:28:11.000000000 +0000 @@ -14,9 +14,9 @@ ether_emu.C lzf/lzf_c.c lzf/lzf_d.c \ curve25519-donna.c curve25519-donna-c64.c -INCLUDES = -I$(top_builddir) -I$(top_srcdir)/lib -I$(top_srcdir)/libev @INCLUDES@ +AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/lib -I$(top_srcdir)/libev @AM_CPPFLAGS@ $(LIBCRYPTO_CFLAGS) -LIBS = @LIBS@ @LIBINTL@ +LIBS = @LIBS@ @LIBINTL@ $(LIBCRYPTO_LIBS) if ROHC ROHCLIB = rohc/librohc.a diff -Nru gvpe-3.0/src/Makefile.in gvpe-3.1/src/Makefile.in --- gvpe-3.0/src/Makefile.in 2016-11-10 14:40:18.000000000 +0000 +++ gvpe-3.1/src/Makefile.in 2018-10-25 07:30:09.000000000 +0000 @@ -43,6 +43,8 @@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ + +AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/lib -I$(top_srcdir)/libev @AM_CPPFLAGS@ $(LIBCRYPTO_CFLAGS) AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -69,8 +71,6 @@ HAVE_TUNTAP = @HAVE_TUNTAP@ IFSUBTYPE = @IFSUBTYPE@ IFTYPE = @IFTYPE@ - -INCLUDES = -I$(top_builddir) -I$(top_srcdir)/lib -I$(top_srcdir)/libev @INCLUDES@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -78,11 +78,13 @@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LDFLAGS_DAEMON = @LDFLAGS_DAEMON@ +LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ +LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ @LIBINTL@ +LIBS = @LIBS@ @LIBINTL@ $(LIBCRYPTO_LIBS) LINUX_IF_TUN_H = @LINUX_IF_TUN_H@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ @@ -104,6 +106,9 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ ROHC_FALSE = @ROHC_FALSE@ @@ -176,9 +181,9 @@ ether_emu.C lzf/lzf_c.c lzf/lzf_d.c \ curve25519-donna.c curve25519-donna-c64.c -@ROHC_FALSE@ROHCLIB = @ROHC_TRUE@ROHCLIB = rohc/librohc.a +@ROHC_FALSE@ROHCLIB = COMMON = global.h conf.h conf.C util.h util.C slog.h slog.C netcompat.h \ ev_cpp.h ev_cpp.C crypto.h crypto.C