Import Upstream version 1.1~pre2
This commit is contained in:
parent
a04a7bcd67
commit
02de1cd2f1
172 changed files with 32291 additions and 25994 deletions
2
COPYING
2
COPYING
|
@ -1,4 +1,4 @@
|
||||||
Copyright (C) 1998-2018 Ivo Timmermans, Guus Sliepen and others.
|
Copyright (C) 1998-2010 Ivo Timmermans, Guus Sliepen and others.
|
||||||
See the AUTHORS file for a complete list.
|
See the AUTHORS file for a complete list.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
|
|
317
INSTALL
317
INSTALL
|
@ -1,8 +1,8 @@
|
||||||
Installation Instructions
|
Installation Instructions
|
||||||
*************************
|
*************************
|
||||||
|
|
||||||
Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
|
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
|
||||||
Foundation, Inc.
|
2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Copying and distribution of this file, with or without modification,
|
Copying and distribution of this file, with or without modification,
|
||||||
are permitted in any medium without royalty provided the copyright
|
are permitted in any medium without royalty provided the copyright
|
||||||
|
@ -12,96 +12,97 @@ without warranty of any kind.
|
||||||
Basic Installation
|
Basic Installation
|
||||||
==================
|
==================
|
||||||
|
|
||||||
Briefly, the shell command './configure && make && make install'
|
Briefly, the shell commands `./configure; make; make install' should
|
||||||
should configure, build, and install this package. The following
|
configure, build, and install this package. The following
|
||||||
more-detailed instructions are generic; see the 'README' file for
|
more-detailed instructions are generic; see the `README' file for
|
||||||
instructions specific to this package. Some packages provide this
|
instructions specific to this package. Some packages provide this
|
||||||
'INSTALL' file but do not implement all of the features documented
|
`INSTALL' file but do not implement all of the features documented
|
||||||
below. The lack of an optional feature in a given package is not
|
below. The lack of an optional feature in a given package is not
|
||||||
necessarily a bug. More recommendations for GNU packages can be found
|
necessarily a bug. More recommendations for GNU packages can be found
|
||||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||||
|
|
||||||
The 'configure' shell script attempts to guess correct values for
|
The `configure' shell script attempts to guess correct values for
|
||||||
various system-dependent variables used during compilation. It uses
|
various system-dependent variables used during compilation. It uses
|
||||||
those values to create a 'Makefile' in each directory of the package.
|
those values to create a `Makefile' in each directory of the package.
|
||||||
It may also create one or more '.h' files containing system-dependent
|
It may also create one or more `.h' files containing system-dependent
|
||||||
definitions. Finally, it creates a shell script 'config.status' that
|
definitions. Finally, it creates a shell script `config.status' that
|
||||||
you can run in the future to recreate the current configuration, and a
|
you can run in the future to recreate the current configuration, and a
|
||||||
file 'config.log' containing compiler output (useful mainly for
|
file `config.log' containing compiler output (useful mainly for
|
||||||
debugging 'configure').
|
debugging `configure').
|
||||||
|
|
||||||
It can also use an optional file (typically called 'config.cache' and
|
It can also use an optional file (typically called `config.cache'
|
||||||
enabled with '--cache-file=config.cache' or simply '-C') that saves the
|
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||||
results of its tests to speed up reconfiguring. Caching is disabled by
|
the results of its tests to speed up reconfiguring. Caching is
|
||||||
default to prevent problems with accidental use of stale cache files.
|
disabled by default to prevent problems with accidental use of stale
|
||||||
|
cache files.
|
||||||
|
|
||||||
If you need to do unusual things to compile the package, please try
|
If you need to do unusual things to compile the package, please try
|
||||||
to figure out how 'configure' could check whether to do them, and mail
|
to figure out how `configure' could check whether to do them, and mail
|
||||||
diffs or instructions to the address given in the 'README' so they can
|
diffs or instructions to the address given in the `README' so they can
|
||||||
be considered for the next release. If you are using the cache, and at
|
be considered for the next release. If you are using the cache, and at
|
||||||
some point 'config.cache' contains results you don't want to keep, you
|
some point `config.cache' contains results you don't want to keep, you
|
||||||
may remove or edit it.
|
may remove or edit it.
|
||||||
|
|
||||||
The file 'configure.ac' (or 'configure.in') is used to create
|
The file `configure.ac' (or `configure.in') is used to create
|
||||||
'configure' by a program called 'autoconf'. You need 'configure.ac' if
|
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||||
you want to change it or regenerate 'configure' using a newer version of
|
you want to change it or regenerate `configure' using a newer version
|
||||||
'autoconf'.
|
of `autoconf'.
|
||||||
|
|
||||||
The simplest way to compile this package is:
|
The simplest way to compile this package is:
|
||||||
|
|
||||||
1. 'cd' to the directory containing the package's source code and type
|
1. `cd' to the directory containing the package's source code and type
|
||||||
'./configure' to configure the package for your system.
|
`./configure' to configure the package for your system.
|
||||||
|
|
||||||
Running 'configure' might take a while. While running, it prints
|
Running `configure' might take a while. While running, it prints
|
||||||
some messages telling which features it is checking for.
|
some messages telling which features it is checking for.
|
||||||
|
|
||||||
2. Type 'make' to compile the package.
|
2. Type `make' to compile the package.
|
||||||
|
|
||||||
3. Optionally, type 'make check' to run any self-tests that come with
|
3. Optionally, type `make check' to run any self-tests that come with
|
||||||
the package, generally using the just-built uninstalled binaries.
|
the package, generally using the just-built uninstalled binaries.
|
||||||
|
|
||||||
4. Type 'make install' to install the programs and any data files and
|
4. Type `make install' to install the programs and any data files and
|
||||||
documentation. When installing into a prefix owned by root, it is
|
documentation. When installing into a prefix owned by root, it is
|
||||||
recommended that the package be configured and built as a regular
|
recommended that the package be configured and built as a regular
|
||||||
user, and only the 'make install' phase executed with root
|
user, and only the `make install' phase executed with root
|
||||||
privileges.
|
privileges.
|
||||||
|
|
||||||
5. Optionally, type 'make installcheck' to repeat any self-tests, but
|
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||||
this time using the binaries in their final installed location.
|
this time using the binaries in their final installed location.
|
||||||
This target does not install anything. Running this target as a
|
This target does not install anything. Running this target as a
|
||||||
regular user, particularly if the prior 'make install' required
|
regular user, particularly if the prior `make install' required
|
||||||
root privileges, verifies that the installation completed
|
root privileges, verifies that the installation completed
|
||||||
correctly.
|
correctly.
|
||||||
|
|
||||||
6. You can remove the program binaries and object files from the
|
6. You can remove the program binaries and object files from the
|
||||||
source code directory by typing 'make clean'. To also remove the
|
source code directory by typing `make clean'. To also remove the
|
||||||
files that 'configure' created (so you can compile the package for
|
files that `configure' created (so you can compile the package for
|
||||||
a different kind of computer), type 'make distclean'. There is
|
a different kind of computer), type `make distclean'. There is
|
||||||
also a 'make maintainer-clean' target, but that is intended mainly
|
also a `make maintainer-clean' target, but that is intended mainly
|
||||||
for the package's developers. If you use it, you may have to get
|
for the package's developers. If you use it, you may have to get
|
||||||
all sorts of other programs in order to regenerate files that came
|
all sorts of other programs in order to regenerate files that came
|
||||||
with the distribution.
|
with the distribution.
|
||||||
|
|
||||||
7. Often, you can also type 'make uninstall' to remove the installed
|
7. Often, you can also type `make uninstall' to remove the installed
|
||||||
files again. In practice, not all packages have tested that
|
files again. In practice, not all packages have tested that
|
||||||
uninstallation works correctly, even though it is required by the
|
uninstallation works correctly, even though it is required by the
|
||||||
GNU Coding Standards.
|
GNU Coding Standards.
|
||||||
|
|
||||||
8. Some packages, particularly those that use Automake, provide 'make
|
8. Some packages, particularly those that use Automake, provide `make
|
||||||
distcheck', which can by used by developers to test that all other
|
distcheck', which can by used by developers to test that all other
|
||||||
targets like 'make install' and 'make uninstall' work correctly.
|
targets like `make install' and `make uninstall' work correctly.
|
||||||
This target is generally not run by end users.
|
This target is generally not run by end users.
|
||||||
|
|
||||||
Compilers and Options
|
Compilers and Options
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
Some systems require unusual options for compilation or linking that
|
Some systems require unusual options for compilation or linking that
|
||||||
the 'configure' script does not know about. Run './configure --help'
|
the `configure' script does not know about. Run `./configure --help'
|
||||||
for details on some of the pertinent environment variables.
|
for details on some of the pertinent environment variables.
|
||||||
|
|
||||||
You can give 'configure' initial values for configuration parameters
|
You can give `configure' initial values for configuration parameters
|
||||||
by setting variables in the command line or in the environment. Here is
|
by setting variables in the command line or in the environment. Here
|
||||||
an example:
|
is an example:
|
||||||
|
|
||||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||||
|
|
||||||
|
@ -112,21 +113,21 @@ Compiling For Multiple Architectures
|
||||||
|
|
||||||
You can compile the package for more than one kind of computer at the
|
You can compile the package for more than one kind of computer at the
|
||||||
same time, by placing the object files for each architecture in their
|
same time, by placing the object files for each architecture in their
|
||||||
own directory. To do this, you can use GNU 'make'. 'cd' to the
|
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||||
directory where you want the object files and executables to go and run
|
directory where you want the object files and executables to go and run
|
||||||
the 'configure' script. 'configure' automatically checks for the source
|
the `configure' script. `configure' automatically checks for the
|
||||||
code in the directory that 'configure' is in and in '..'. This is known
|
source code in the directory that `configure' is in and in `..'. This
|
||||||
as a "VPATH" build.
|
is known as a "VPATH" build.
|
||||||
|
|
||||||
With a non-GNU 'make', it is safer to compile the package for one
|
With a non-GNU `make', it is safer to compile the package for one
|
||||||
architecture at a time in the source code directory. After you have
|
architecture at a time in the source code directory. After you have
|
||||||
installed the package for one architecture, use 'make distclean' before
|
installed the package for one architecture, use `make distclean' before
|
||||||
reconfiguring for another architecture.
|
reconfiguring for another architecture.
|
||||||
|
|
||||||
On MacOS X 10.5 and later systems, you can create libraries and
|
On MacOS X 10.5 and later systems, you can create libraries and
|
||||||
executables that work on multiple system types--known as "fat" or
|
executables that work on multiple system types--known as "fat" or
|
||||||
"universal" binaries--by specifying multiple '-arch' options to the
|
"universal" binaries--by specifying multiple `-arch' options to the
|
||||||
compiler but only a single '-arch' option to the preprocessor. Like
|
compiler but only a single `-arch' option to the preprocessor. Like
|
||||||
this:
|
this:
|
||||||
|
|
||||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
@ -135,104 +136,100 @@ this:
|
||||||
|
|
||||||
This is not guaranteed to produce working output in all cases, you
|
This is not guaranteed to produce working output in all cases, you
|
||||||
may have to build one architecture at a time and combine the results
|
may have to build one architecture at a time and combine the results
|
||||||
using the 'lipo' tool if you have problems.
|
using the `lipo' tool if you have problems.
|
||||||
|
|
||||||
Installation Names
|
Installation Names
|
||||||
==================
|
==================
|
||||||
|
|
||||||
By default, 'make install' installs the package's commands under
|
By default, `make install' installs the package's commands under
|
||||||
'/usr/local/bin', include files under '/usr/local/include', etc. You
|
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||||
can specify an installation prefix other than '/usr/local' by giving
|
can specify an installation prefix other than `/usr/local' by giving
|
||||||
'configure' the option '--prefix=PREFIX', where PREFIX must be an
|
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||||
absolute file name.
|
absolute file name.
|
||||||
|
|
||||||
You can specify separate installation prefixes for
|
You can specify separate installation prefixes for
|
||||||
architecture-specific files and architecture-independent files. If you
|
architecture-specific files and architecture-independent files. If you
|
||||||
pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
|
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||||
PREFIX as the prefix for installing programs and libraries.
|
PREFIX as the prefix for installing programs and libraries.
|
||||||
Documentation and other data files still use the regular prefix.
|
Documentation and other data files still use the regular prefix.
|
||||||
|
|
||||||
In addition, if you use an unusual directory layout you can give
|
In addition, if you use an unusual directory layout you can give
|
||||||
options like '--bindir=DIR' to specify different values for particular
|
options like `--bindir=DIR' to specify different values for particular
|
||||||
kinds of files. Run 'configure --help' for a list of the directories
|
kinds of files. Run `configure --help' for a list of the directories
|
||||||
you can set and what kinds of files go in them. In general, the default
|
you can set and what kinds of files go in them. In general, the
|
||||||
for these options is expressed in terms of '${prefix}', so that
|
default for these options is expressed in terms of `${prefix}', so that
|
||||||
specifying just '--prefix' will affect all of the other directory
|
specifying just `--prefix' will affect all of the other directory
|
||||||
specifications that were not explicitly provided.
|
specifications that were not explicitly provided.
|
||||||
|
|
||||||
The most portable way to affect installation locations is to pass the
|
The most portable way to affect installation locations is to pass the
|
||||||
correct locations to 'configure'; however, many packages provide one or
|
correct locations to `configure'; however, many packages provide one or
|
||||||
both of the following shortcuts of passing variable assignments to the
|
both of the following shortcuts of passing variable assignments to the
|
||||||
'make install' command line to change installation locations without
|
`make install' command line to change installation locations without
|
||||||
having to reconfigure or recompile.
|
having to reconfigure or recompile.
|
||||||
|
|
||||||
The first method involves providing an override variable for each
|
The first method involves providing an override variable for each
|
||||||
affected directory. For example, 'make install
|
affected directory. For example, `make install
|
||||||
prefix=/alternate/directory' will choose an alternate location for all
|
prefix=/alternate/directory' will choose an alternate location for all
|
||||||
directory configuration variables that were expressed in terms of
|
directory configuration variables that were expressed in terms of
|
||||||
'${prefix}'. Any directories that were specified during 'configure',
|
`${prefix}'. Any directories that were specified during `configure',
|
||||||
but not in terms of '${prefix}', must each be overridden at install time
|
but not in terms of `${prefix}', must each be overridden at install
|
||||||
for the entire installation to be relocated. The approach of makefile
|
time for the entire installation to be relocated. The approach of
|
||||||
variable overrides for each directory variable is required by the GNU
|
makefile variable overrides for each directory variable is required by
|
||||||
Coding Standards, and ideally causes no recompilation. However, some
|
the GNU Coding Standards, and ideally causes no recompilation.
|
||||||
platforms have known limitations with the semantics of shared libraries
|
However, some platforms have known limitations with the semantics of
|
||||||
that end up requiring recompilation when using this method, particularly
|
shared libraries that end up requiring recompilation when using this
|
||||||
noticeable in packages that use GNU Libtool.
|
method, particularly noticeable in packages that use GNU Libtool.
|
||||||
|
|
||||||
The second method involves providing the 'DESTDIR' variable. For
|
The second method involves providing the `DESTDIR' variable. For
|
||||||
example, 'make install DESTDIR=/alternate/directory' will prepend
|
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||||
'/alternate/directory' before all installation names. The approach of
|
`/alternate/directory' before all installation names. The approach of
|
||||||
'DESTDIR' overrides is not required by the GNU Coding Standards, and
|
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||||
does not work on platforms that have drive letters. On the other hand,
|
does not work on platforms that have drive letters. On the other hand,
|
||||||
it does better at avoiding recompilation issues, and works well even
|
it does better at avoiding recompilation issues, and works well even
|
||||||
when some directory options were not specified in terms of '${prefix}'
|
when some directory options were not specified in terms of `${prefix}'
|
||||||
at 'configure' time.
|
at `configure' time.
|
||||||
|
|
||||||
Optional Features
|
Optional Features
|
||||||
=================
|
=================
|
||||||
|
|
||||||
If the package supports it, you can cause programs to be installed
|
If the package supports it, you can cause programs to be installed
|
||||||
with an extra prefix or suffix on their names by giving 'configure' the
|
with an extra prefix or suffix on their names by giving `configure' the
|
||||||
option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
|
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||||
|
|
||||||
Some packages pay attention to '--enable-FEATURE' options to
|
Some packages pay attention to `--enable-FEATURE' options to
|
||||||
'configure', where FEATURE indicates an optional part of the package.
|
`configure', where FEATURE indicates an optional part of the package.
|
||||||
They may also pay attention to '--with-PACKAGE' options, where PACKAGE
|
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||||
is something like 'gnu-as' or 'x' (for the X Window System). The
|
is something like `gnu-as' or `x' (for the X Window System). The
|
||||||
'README' should mention any '--enable-' and '--with-' options that the
|
`README' should mention any `--enable-' and `--with-' options that the
|
||||||
package recognizes.
|
package recognizes.
|
||||||
|
|
||||||
For packages that use the X Window System, 'configure' can usually
|
For packages that use the X Window System, `configure' can usually
|
||||||
find the X include and library files automatically, but if it doesn't,
|
find the X include and library files automatically, but if it doesn't,
|
||||||
you can use the 'configure' options '--x-includes=DIR' and
|
you can use the `configure' options `--x-includes=DIR' and
|
||||||
'--x-libraries=DIR' to specify their locations.
|
`--x-libraries=DIR' to specify their locations.
|
||||||
|
|
||||||
Some packages offer the ability to configure how verbose the
|
Some packages offer the ability to configure how verbose the
|
||||||
execution of 'make' will be. For these packages, running './configure
|
execution of `make' will be. For these packages, running `./configure
|
||||||
--enable-silent-rules' sets the default to minimal output, which can be
|
--enable-silent-rules' sets the default to minimal output, which can be
|
||||||
overridden with 'make V=1'; while running './configure
|
overridden with `make V=1'; while running `./configure
|
||||||
--disable-silent-rules' sets the default to verbose, which can be
|
--disable-silent-rules' sets the default to verbose, which can be
|
||||||
overridden with 'make V=0'.
|
overridden with `make V=0'.
|
||||||
|
|
||||||
Particular systems
|
Particular systems
|
||||||
==================
|
==================
|
||||||
|
|
||||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC
|
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||||
is not installed, it is recommended to use the following options in
|
CC is not installed, it is recommended to use the following options in
|
||||||
order to use an ANSI C compiler:
|
order to use an ANSI C compiler:
|
||||||
|
|
||||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||||
|
|
||||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||||
|
|
||||||
HP-UX 'make' updates targets which have the same time stamps as their
|
|
||||||
prerequisites, which makes it generally unusable when shipped generated
|
|
||||||
files such as 'configure' are involved. Use GNU 'make' instead.
|
|
||||||
|
|
||||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||||
parse its '<wchar.h>' header file. The option '-nodtk' can be used as a
|
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||||
workaround. If GNU CC is not installed, it is therefore recommended to
|
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||||
try
|
to try
|
||||||
|
|
||||||
./configure CC="cc"
|
./configure CC="cc"
|
||||||
|
|
||||||
|
@ -240,26 +237,26 @@ and if that doesn't work, try
|
||||||
|
|
||||||
./configure CC="cc -nodtk"
|
./configure CC="cc -nodtk"
|
||||||
|
|
||||||
On Solaris, don't put '/usr/ucb' early in your 'PATH'. This
|
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||||
directory contains several dysfunctional programs; working variants of
|
directory contains several dysfunctional programs; working variants of
|
||||||
these programs are available in '/usr/bin'. So, if you need '/usr/ucb'
|
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||||
in your 'PATH', put it _after_ '/usr/bin'.
|
in your `PATH', put it _after_ `/usr/bin'.
|
||||||
|
|
||||||
On Haiku, software installed for all users goes in '/boot/common',
|
On Haiku, software installed for all users goes in `/boot/common',
|
||||||
not '/usr/local'. It is recommended to use the following options:
|
not `/usr/local'. It is recommended to use the following options:
|
||||||
|
|
||||||
./configure --prefix=/boot/common
|
./configure --prefix=/boot/common
|
||||||
|
|
||||||
Specifying the System Type
|
Specifying the System Type
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
There may be some features 'configure' cannot figure out
|
There may be some features `configure' cannot figure out
|
||||||
automatically, but needs to determine by the type of machine the package
|
automatically, but needs to determine by the type of machine the package
|
||||||
will run on. Usually, assuming the package is built to be run on the
|
will run on. Usually, assuming the package is built to be run on the
|
||||||
_same_ architectures, 'configure' can figure that out, but if it prints
|
_same_ architectures, `configure' can figure that out, but if it prints
|
||||||
a message saying it cannot guess the machine type, give it the
|
a message saying it cannot guess the machine type, give it the
|
||||||
'--build=TYPE' option. TYPE can either be a short name for the system
|
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||||
type, such as 'sun4', or a canonical name which has the form:
|
type, such as `sun4', or a canonical name which has the form:
|
||||||
|
|
||||||
CPU-COMPANY-SYSTEM
|
CPU-COMPANY-SYSTEM
|
||||||
|
|
||||||
|
@ -268,101 +265,101 @@ where SYSTEM can have one of these forms:
|
||||||
OS
|
OS
|
||||||
KERNEL-OS
|
KERNEL-OS
|
||||||
|
|
||||||
See the file 'config.sub' for the possible values of each field. If
|
See the file `config.sub' for the possible values of each field. If
|
||||||
'config.sub' isn't included in this package, then this package doesn't
|
`config.sub' isn't included in this package, then this package doesn't
|
||||||
need to know the machine type.
|
need to know the machine type.
|
||||||
|
|
||||||
If you are _building_ compiler tools for cross-compiling, you should
|
If you are _building_ compiler tools for cross-compiling, you should
|
||||||
use the option '--target=TYPE' to select the type of system they will
|
use the option `--target=TYPE' to select the type of system they will
|
||||||
produce code for.
|
produce code for.
|
||||||
|
|
||||||
If you want to _use_ a cross compiler, that generates code for a
|
If you want to _use_ a cross compiler, that generates code for a
|
||||||
platform different from the build platform, you should specify the
|
platform different from the build platform, you should specify the
|
||||||
"host" platform (i.e., that on which the generated programs will
|
"host" platform (i.e., that on which the generated programs will
|
||||||
eventually be run) with '--host=TYPE'.
|
eventually be run) with `--host=TYPE'.
|
||||||
|
|
||||||
Sharing Defaults
|
Sharing Defaults
|
||||||
================
|
================
|
||||||
|
|
||||||
If you want to set default values for 'configure' scripts to share,
|
If you want to set default values for `configure' scripts to share,
|
||||||
you can create a site shell script called 'config.site' that gives
|
you can create a site shell script called `config.site' that gives
|
||||||
default values for variables like 'CC', 'cache_file', and 'prefix'.
|
default values for variables like `CC', `cache_file', and `prefix'.
|
||||||
'configure' looks for 'PREFIX/share/config.site' if it exists, then
|
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||||
'PREFIX/etc/config.site' if it exists. Or, you can set the
|
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||||
'CONFIG_SITE' environment variable to the location of the site script.
|
`CONFIG_SITE' environment variable to the location of the site script.
|
||||||
A warning: not all 'configure' scripts look for a site script.
|
A warning: not all `configure' scripts look for a site script.
|
||||||
|
|
||||||
Defining Variables
|
Defining Variables
|
||||||
==================
|
==================
|
||||||
|
|
||||||
Variables not defined in a site shell script can be set in the
|
Variables not defined in a site shell script can be set in the
|
||||||
environment passed to 'configure'. However, some packages may run
|
environment passed to `configure'. However, some packages may run
|
||||||
configure again during the build, and the customized values of these
|
configure again during the build, and the customized values of these
|
||||||
variables may be lost. In order to avoid this problem, you should set
|
variables may be lost. In order to avoid this problem, you should set
|
||||||
them in the 'configure' command line, using 'VAR=value'. For example:
|
them in the `configure' command line, using `VAR=value'. For example:
|
||||||
|
|
||||||
./configure CC=/usr/local2/bin/gcc
|
./configure CC=/usr/local2/bin/gcc
|
||||||
|
|
||||||
causes the specified 'gcc' to be used as the C compiler (unless it is
|
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||||
overridden in the site shell script).
|
overridden in the site shell script).
|
||||||
|
|
||||||
Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
|
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||||
Autoconf limitation. Until the limitation is lifted, you can use this
|
an Autoconf bug. Until the bug is fixed you can use this workaround:
|
||||||
workaround:
|
|
||||||
|
|
||||||
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||||
|
|
||||||
'configure' Invocation
|
`configure' Invocation
|
||||||
======================
|
======================
|
||||||
|
|
||||||
'configure' recognizes the following options to control how it
|
`configure' recognizes the following options to control how it
|
||||||
operates.
|
operates.
|
||||||
|
|
||||||
'--help'
|
`--help'
|
||||||
'-h'
|
`-h'
|
||||||
Print a summary of all of the options to 'configure', and exit.
|
Print a summary of all of the options to `configure', and exit.
|
||||||
|
|
||||||
'--help=short'
|
`--help=short'
|
||||||
'--help=recursive'
|
`--help=recursive'
|
||||||
Print a summary of the options unique to this package's
|
Print a summary of the options unique to this package's
|
||||||
'configure', and exit. The 'short' variant lists options used only
|
`configure', and exit. The `short' variant lists options used
|
||||||
in the top level, while the 'recursive' variant lists options also
|
only in the top level, while the `recursive' variant lists options
|
||||||
present in any nested packages.
|
also present in any nested packages.
|
||||||
|
|
||||||
'--version'
|
`--version'
|
||||||
'-V'
|
`-V'
|
||||||
Print the version of Autoconf used to generate the 'configure'
|
Print the version of Autoconf used to generate the `configure'
|
||||||
script, and exit.
|
script, and exit.
|
||||||
|
|
||||||
'--cache-file=FILE'
|
`--cache-file=FILE'
|
||||||
Enable the cache: use and save the results of the tests in FILE,
|
Enable the cache: use and save the results of the tests in FILE,
|
||||||
traditionally 'config.cache'. FILE defaults to '/dev/null' to
|
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||||
disable caching.
|
disable caching.
|
||||||
|
|
||||||
'--config-cache'
|
`--config-cache'
|
||||||
'-C'
|
`-C'
|
||||||
Alias for '--cache-file=config.cache'.
|
Alias for `--cache-file=config.cache'.
|
||||||
|
|
||||||
'--quiet'
|
`--quiet'
|
||||||
'--silent'
|
`--silent'
|
||||||
'-q'
|
`-q'
|
||||||
Do not print messages saying which checks are being made. To
|
Do not print messages saying which checks are being made. To
|
||||||
suppress all normal output, redirect it to '/dev/null' (any error
|
suppress all normal output, redirect it to `/dev/null' (any error
|
||||||
messages will still be shown).
|
messages will still be shown).
|
||||||
|
|
||||||
'--srcdir=DIR'
|
`--srcdir=DIR'
|
||||||
Look for the package's source code in directory DIR. Usually
|
Look for the package's source code in directory DIR. Usually
|
||||||
'configure' can determine that directory automatically.
|
`configure' can determine that directory automatically.
|
||||||
|
|
||||||
'--prefix=DIR'
|
`--prefix=DIR'
|
||||||
Use DIR as the installation prefix. *note Installation Names:: for
|
Use DIR as the installation prefix. *note Installation Names::
|
||||||
more details, including other options available for fine-tuning the
|
for more details, including other options available for fine-tuning
|
||||||
installation locations.
|
the installation locations.
|
||||||
|
|
||||||
'--no-create'
|
`--no-create'
|
||||||
'-n'
|
`-n'
|
||||||
Run the configure checks, but stop before creating any output
|
Run the configure checks, but stop before creating any output
|
||||||
files.
|
files.
|
||||||
|
|
||||||
'configure' also accepts some other, not widely useful, options. Run
|
`configure' also accepts some other, not widely useful, options. Run
|
||||||
'configure --help' for more details.
|
`configure --help' for more details.
|
||||||
|
|
||||||
|
|
20
Makefile.am
20
Makefile.am
|
@ -2,14 +2,26 @@
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = gnu
|
AUTOMAKE_OPTIONS = gnu
|
||||||
|
|
||||||
SUBDIRS = src doc systemd
|
SUBDIRS = m4 src doc gui
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
EXTRA_DIST = COPYING.README README.android
|
EXTRA_DIST = have.h system.h COPYING.README
|
||||||
|
|
||||||
ChangeLog:
|
ChangeLog:
|
||||||
git log > ChangeLog
|
git log > ChangeLog
|
||||||
|
|
||||||
astyle:
|
deb:
|
||||||
astyle --options=.astylerc -nQ src/*.[ch] src/*/*.[ch]
|
dpkg-buildpackage -rfakeroot
|
||||||
|
|
||||||
|
rpm: dist
|
||||||
|
cp $(distdir).tar.gz /usr/src/redhat/SOURCES/
|
||||||
|
cp redhat/tinc.spec /usr/src/redhat/SOURCES/
|
||||||
|
cd /usr/src/redhat/SOURCES/ && rpm -bb tinc.spec
|
||||||
|
|
||||||
|
release:
|
||||||
|
rm -f ChangeLog
|
||||||
|
$(MAKE) ChangeLog
|
||||||
|
echo "Please edit the NEWS file now..."
|
||||||
|
/usr/bin/editor NEWS
|
||||||
|
$(MAKE) dist
|
||||||
|
|
467
Makefile.in
467
Makefile.in
|
@ -1,8 +1,9 @@
|
||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
||||||
|
# Inc.
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
# with or without modifications, as long as this notice is preserved.
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
@ -14,61 +15,6 @@
|
||||||
|
|
||||||
@SET_MAKE@
|
@SET_MAKE@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
am__is_gnu_make = { \
|
|
||||||
if test -z '$(MAKELEVEL)'; then \
|
|
||||||
false; \
|
|
||||||
elif test -n '$(MAKE_HOST)'; then \
|
|
||||||
true; \
|
|
||||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
|
||||||
true; \
|
|
||||||
else \
|
|
||||||
false; \
|
|
||||||
fi; \
|
|
||||||
}
|
|
||||||
am__make_running_with_option = \
|
|
||||||
case $${target_option-} in \
|
|
||||||
?) ;; \
|
|
||||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
|
||||||
"target option '$${target_option-}' specified" >&2; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
has_opt=no; \
|
|
||||||
sane_makeflags=$$MAKEFLAGS; \
|
|
||||||
if $(am__is_gnu_make); then \
|
|
||||||
sane_makeflags=$$MFLAGS; \
|
|
||||||
else \
|
|
||||||
case $$MAKEFLAGS in \
|
|
||||||
*\\[\ \ ]*) \
|
|
||||||
bs=\\; \
|
|
||||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
|
||||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
|
||||||
esac; \
|
|
||||||
fi; \
|
|
||||||
skip_next=no; \
|
|
||||||
strip_trailopt () \
|
|
||||||
{ \
|
|
||||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
|
||||||
}; \
|
|
||||||
for flg in $$sane_makeflags; do \
|
|
||||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
|
||||||
case $$flg in \
|
|
||||||
*=*|--*) continue;; \
|
|
||||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
|
||||||
-*I?*) strip_trailopt 'I';; \
|
|
||||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
|
||||||
-*O?*) strip_trailopt 'O';; \
|
|
||||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
|
||||||
-*l?*) strip_trailopt 'l';; \
|
|
||||||
-[dEDm]) skip_next=yes;; \
|
|
||||||
-[JT]) skip_next=yes;; \
|
|
||||||
esac; \
|
|
||||||
case $$flg in \
|
|
||||||
*$$target_option*) has_opt=yes; break;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
test $$has_opt = yes
|
|
||||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
|
||||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
@ -88,95 +34,47 @@ POST_UNINSTALL = :
|
||||||
build_triplet = @build@
|
build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
subdir = .
|
subdir = .
|
||||||
|
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
|
||||||
|
$(srcdir)/Makefile.in $(srcdir)/config.h.in \
|
||||||
|
$(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
|
||||||
|
THANKS config.guess config.sub depcomp install-sh missing
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
||||||
$(top_srcdir)/m4/ax_append_flag.m4 \
|
$(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/libevent.m4 \
|
||||||
$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
|
$(top_srcdir)/m4/lzo.m4 $(top_srcdir)/m4/openssl.m4 \
|
||||||
$(top_srcdir)/m4/ax_check_compile_flag.m4 \
|
$(top_srcdir)/m4/zlib.m4 $(top_srcdir)/configure.in
|
||||||
$(top_srcdir)/m4/ax_check_link_flag.m4 \
|
|
||||||
$(top_srcdir)/m4/ax_require_defined.m4 $(top_srcdir)/m4/lzo.m4 \
|
|
||||||
$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/zlib.m4 \
|
|
||||||
$(top_srcdir)/configure.ac
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
|
|
||||||
$(am__configure_deps) $(am__DIST_COMMON)
|
|
||||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||||
configure.lineno config.status.lineno
|
configure.lineno config.status.lineno
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = config.h
|
CONFIG_HEADER = config.h
|
||||||
CONFIG_CLEAN_FILES =
|
CONFIG_CLEAN_FILES =
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
|
||||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
|
||||||
am__v_P_0 = false
|
|
||||||
am__v_P_1 = :
|
|
||||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
|
||||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
|
||||||
am__v_GEN_0 = @echo " GEN " $@;
|
|
||||||
am__v_GEN_1 =
|
|
||||||
AM_V_at = $(am__v_at_@AM_V@)
|
|
||||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
|
||||||
am__v_at_0 = @
|
|
||||||
am__v_at_1 =
|
|
||||||
SOURCES =
|
SOURCES =
|
||||||
DIST_SOURCES =
|
DIST_SOURCES =
|
||||||
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
|
||||||
ctags-recursive dvi-recursive html-recursive info-recursive \
|
html-recursive info-recursive install-data-recursive \
|
||||||
install-data-recursive install-dvi-recursive \
|
install-dvi-recursive install-exec-recursive \
|
||||||
install-exec-recursive install-html-recursive \
|
install-html-recursive install-info-recursive \
|
||||||
install-info-recursive install-pdf-recursive \
|
install-pdf-recursive install-ps-recursive install-recursive \
|
||||||
install-ps-recursive install-recursive installcheck-recursive \
|
installcheck-recursive installdirs-recursive pdf-recursive \
|
||||||
installdirs-recursive pdf-recursive ps-recursive \
|
ps-recursive uninstall-recursive
|
||||||
tags-recursive uninstall-recursive
|
|
||||||
am__can_run_installinfo = \
|
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
|
||||||
n|no|NO) false;; \
|
|
||||||
*) (install-info --version) >/dev/null 2>&1;; \
|
|
||||||
esac
|
|
||||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||||
distclean-recursive maintainer-clean-recursive
|
distclean-recursive maintainer-clean-recursive
|
||||||
am__recursive_targets = \
|
AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
|
||||||
$(RECURSIVE_TARGETS) \
|
$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
|
||||||
$(RECURSIVE_CLEAN_TARGETS) \
|
distdir dist dist-all distcheck
|
||||||
$(am__extra_recursive_targets)
|
|
||||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
|
||||||
cscope distdir distdir-am dist dist-all distcheck
|
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
|
|
||||||
$(LISP)config.h.in
|
|
||||||
# Read a list of newline-separated strings from the standard input,
|
|
||||||
# and print each of them once, without duplicates. Input order is
|
|
||||||
# *not* preserved.
|
|
||||||
am__uniquify_input = $(AWK) '\
|
|
||||||
BEGIN { nonempty = 0; } \
|
|
||||||
{ items[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in items) print i; }; } \
|
|
||||||
'
|
|
||||||
# Make sure the list of sources is unique. This is necessary because,
|
|
||||||
# e.g., the same source file might be shared among _SOURCES variables
|
|
||||||
# for different programs/libraries.
|
|
||||||
am__define_uniq_tagged_files = \
|
|
||||||
list='$(am__tagged_files)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | $(am__uniquify_input)`
|
|
||||||
ETAGS = etags
|
ETAGS = etags
|
||||||
CTAGS = ctags
|
CTAGS = ctags
|
||||||
CSCOPE = cscope
|
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
DIST_SUBDIRS = $(SUBDIRS)
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in AUTHORS \
|
|
||||||
COPYING ChangeLog INSTALL NEWS README THANKS compile \
|
|
||||||
config.guess config.sub install-sh missing
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
distdir = $(PACKAGE)-$(VERSION)
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
top_distdir = $(distdir)
|
top_distdir = $(distdir)
|
||||||
am__remove_distdir = \
|
am__remove_distdir = \
|
||||||
if test -d "$(distdir)"; then \
|
{ test ! -d "$(distdir)" \
|
||||||
find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
|
|| { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||||
&& rm -rf "$(distdir)" \
|
&& rm -fr "$(distdir)"; }; }
|
||||||
|| { sleep 5 && rm -rf "$(distdir)"; }; \
|
|
||||||
else :; fi
|
|
||||||
am__post_remove_distdir = $(am__remove_distdir)
|
|
||||||
am__relativize = \
|
am__relativize = \
|
||||||
dir0=`pwd`; \
|
dir0=`pwd`; \
|
||||||
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
||||||
|
@ -204,14 +102,10 @@ am__relativize = \
|
||||||
reldir="$$dir2"
|
reldir="$$dir2"
|
||||||
DIST_ARCHIVES = $(distdir).tar.gz
|
DIST_ARCHIVES = $(distdir).tar.gz
|
||||||
GZIP_ENV = --best
|
GZIP_ENV = --best
|
||||||
DIST_TARGETS = dist-gzip
|
|
||||||
distuninstallcheck_listfiles = find . -type f -print
|
distuninstallcheck_listfiles = find . -type f -print
|
||||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
|
||||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
|
||||||
distcleancheck_listfiles = find . -type f -print
|
distcleancheck_listfiles = find . -type f -print
|
||||||
ACLOCAL = @ACLOCAL@
|
ACLOCAL = @ACLOCAL@
|
||||||
AMTAR = @AMTAR@
|
AMTAR = @AMTAR@
|
||||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
AUTOCONF = @AUTOCONF@
|
||||||
AUTOHEADER = @AUTOHEADER@
|
AUTOHEADER = @AUTOHEADER@
|
||||||
AUTOMAKE = @AUTOMAKE@
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
@ -221,6 +115,7 @@ CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CURSES_LIBS = @CURSES_LIBS@
|
||||||
CYGPATH_W = @CYGPATH_W@
|
CYGPATH_W = @CYGPATH_W@
|
||||||
DEFS = @DEFS@
|
DEFS = @DEFS@
|
||||||
DEPDIR = @DEPDIR@
|
DEPDIR = @DEPDIR@
|
||||||
|
@ -230,15 +125,21 @@ ECHO_T = @ECHO_T@
|
||||||
EGREP = @EGREP@
|
EGREP = @EGREP@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
GREP = @GREP@
|
GREP = @GREP@
|
||||||
|
INCLUDES = @INCLUDES@
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
|
||||||
|
LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
|
||||||
|
LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
LN_S = @LN_S@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
OBJEXT = @OBJEXT@
|
OBJEXT = @OBJEXT@
|
||||||
|
@ -250,6 +151,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
SET_MAKE = @SET_MAKE@
|
SET_MAKE = @SET_MAKE@
|
||||||
SHELL = @SHELL@
|
SHELL = @SHELL@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
|
@ -296,27 +198,25 @@ pdfdir = @pdfdir@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
program_transform_name = @program_transform_name@
|
program_transform_name = @program_transform_name@
|
||||||
psdir = @psdir@
|
psdir = @psdir@
|
||||||
runstatedir = @runstatedir@
|
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
systemd_path = @systemd_path@
|
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
top_build_prefix = @top_build_prefix@
|
top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
AUTOMAKE_OPTIONS = gnu
|
AUTOMAKE_OPTIONS = gnu
|
||||||
SUBDIRS = src doc systemd
|
SUBDIRS = m4 src doc gui
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
EXTRA_DIST = COPYING.README README.android
|
EXTRA_DIST = have.h system.h COPYING.README
|
||||||
all: config.h
|
all: config.h
|
||||||
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
am--refresh: Makefile
|
am--refresh:
|
||||||
@:
|
@:
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
@for dep in $?; do \
|
@for dep in $?; do \
|
||||||
case '$(am__configure_deps)' in \
|
case '$(am__configure_deps)' in \
|
||||||
*$$dep*) \
|
*$$dep*) \
|
||||||
|
@ -329,33 +229,36 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
||||||
$(am__cd) $(top_srcdir) && \
|
$(am__cd) $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu Makefile
|
$(AUTOMAKE) --gnu Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
||||||
*config.status*) \
|
*config.status*) \
|
||||||
echo ' $(SHELL) ./config.status'; \
|
echo ' $(SHELL) ./config.status'; \
|
||||||
$(SHELL) ./config.status;; \
|
$(SHELL) ./config.status;; \
|
||||||
*) \
|
*) \
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
|
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
$(SHELL) ./config.status --recheck
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||||
$(am__cd) $(srcdir) && $(AUTOCONF)
|
$(am__cd) $(srcdir) && $(AUTOCONF)
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||||
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||||
$(am__aclocal_m4_deps):
|
$(am__aclocal_m4_deps):
|
||||||
|
|
||||||
config.h: stamp-h1
|
config.h: stamp-h1
|
||||||
@test -f $@ || rm -f stamp-h1
|
@if test ! -f $@; then \
|
||||||
@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
|
rm -f stamp-h1; \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
|
||||||
|
else :; fi
|
||||||
|
|
||||||
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
||||||
@rm -f stamp-h1
|
@rm -f stamp-h1
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
||||||
$(srcdir)/config.h.in: $(am__configure_deps)
|
$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||||
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
||||||
rm -f stamp-h1
|
rm -f stamp-h1
|
||||||
touch $@
|
touch $@
|
||||||
|
@ -364,25 +267,22 @@ distclean-hdr:
|
||||||
-rm -f config.h stamp-h1
|
-rm -f config.h stamp-h1
|
||||||
|
|
||||||
# This directory's subdirectories are mostly independent; you can cd
|
# This directory's subdirectories are mostly independent; you can cd
|
||||||
# into them and run 'make' without going through this Makefile.
|
# into them and run `make' without going through this Makefile.
|
||||||
# To change the values of 'make' variables: instead of editing Makefiles,
|
# To change the values of `make' variables: instead of editing Makefiles,
|
||||||
# (1) if the variable is set in 'config.status', edit 'config.status'
|
# (1) if the variable is set in `config.status', edit `config.status'
|
||||||
# (which will cause the Makefiles to be regenerated when you run 'make');
|
# (which will cause the Makefiles to be regenerated when you run `make');
|
||||||
# (2) otherwise, pass the desired values on the 'make' command line.
|
# (2) otherwise, pass the desired values on the `make' command line.
|
||||||
$(am__recursive_targets):
|
$(RECURSIVE_TARGETS):
|
||||||
@fail=; \
|
@fail= failcom='exit 1'; \
|
||||||
if $(am__make_keepgoing); then \
|
for f in x $$MAKEFLAGS; do \
|
||||||
failcom='fail=yes'; \
|
case $$f in \
|
||||||
else \
|
*=* | --[!k]*);; \
|
||||||
failcom='exit 1'; \
|
*k*) failcom='fail=yes';; \
|
||||||
fi; \
|
esac; \
|
||||||
|
done; \
|
||||||
dot_seen=no; \
|
dot_seen=no; \
|
||||||
target=`echo $@ | sed s/-recursive//`; \
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
case "$@" in \
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
|
||||||
*) list='$(SUBDIRS)' ;; \
|
|
||||||
esac; \
|
|
||||||
for subdir in $$list; do \
|
|
||||||
echo "Making $$target in $$subdir"; \
|
echo "Making $$target in $$subdir"; \
|
||||||
if test "$$subdir" = "."; then \
|
if test "$$subdir" = "."; then \
|
||||||
dot_seen=yes; \
|
dot_seen=yes; \
|
||||||
|
@ -397,12 +297,57 @@ $(am__recursive_targets):
|
||||||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||||
fi; test -z "$$fail"
|
fi; test -z "$$fail"
|
||||||
|
|
||||||
ID: $(am__tagged_files)
|
$(RECURSIVE_CLEAN_TARGETS):
|
||||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
@fail= failcom='exit 1'; \
|
||||||
tags: tags-recursive
|
for f in x $$MAKEFLAGS; do \
|
||||||
TAGS: tags
|
case $$f in \
|
||||||
|
*=* | --[!k]*);; \
|
||||||
|
*k*) failcom='fail=yes';; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
dot_seen=no; \
|
||||||
|
case "$@" in \
|
||||||
|
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||||
|
*) list='$(SUBDIRS)' ;; \
|
||||||
|
esac; \
|
||||||
|
rev=''; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = "."; then :; else \
|
||||||
|
rev="$$subdir $$rev"; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
rev="$$rev ."; \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
for subdir in $$rev; do \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
if test "$$subdir" = "."; then \
|
||||||
|
local_target="$$target-am"; \
|
||||||
|
else \
|
||||||
|
local_target="$$target"; \
|
||||||
|
fi; \
|
||||||
|
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||||
|
|| eval $$failcom; \
|
||||||
|
done && test -z "$$fail"
|
||||||
|
tags-recursive:
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
|
||||||
|
done
|
||||||
|
ctags-recursive:
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
|
||||||
|
done
|
||||||
|
|
||||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
mkid -fID $$unique
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
set x; \
|
set x; \
|
||||||
here=`pwd`; \
|
here=`pwd`; \
|
||||||
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
||||||
|
@ -418,7 +363,12 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
||||||
fi; \
|
fi; \
|
||||||
done; \
|
done; \
|
||||||
$(am__define_uniq_tagged_files); \
|
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
shift; \
|
shift; \
|
||||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||||
test -n "$$unique" || unique=$$empty_fix; \
|
test -n "$$unique" || unique=$$empty_fix; \
|
||||||
|
@ -430,11 +380,15 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
$$unique; \
|
$$unique; \
|
||||||
fi; \
|
fi; \
|
||||||
fi
|
fi
|
||||||
ctags: ctags-recursive
|
ctags: CTAGS
|
||||||
|
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||||
CTAGS: ctags
|
$(TAGS_FILES) $(LISP)
|
||||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
|
||||||
$(am__define_uniq_tagged_files); \
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
test -z "$(CTAGS_ARGS)$$unique" \
|
test -z "$(CTAGS_ARGS)$$unique" \
|
||||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||||
$$unique
|
$$unique
|
||||||
|
@ -443,42 +397,11 @@ GTAGS:
|
||||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||||
&& $(am__cd) $(top_srcdir) \
|
&& $(am__cd) $(top_srcdir) \
|
||||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||||
cscope: cscope.files
|
|
||||||
test ! -s cscope.files \
|
|
||||||
|| $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
|
|
||||||
clean-cscope:
|
|
||||||
-rm -f cscope.files
|
|
||||||
cscope.files: clean-cscope cscopelist
|
|
||||||
cscopelist: cscopelist-recursive
|
|
||||||
|
|
||||||
cscopelist-am: $(am__tagged_files)
|
|
||||||
list='$(am__tagged_files)'; \
|
|
||||||
case "$(srcdir)" in \
|
|
||||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
|
||||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
|
||||||
esac; \
|
|
||||||
for i in $$list; do \
|
|
||||||
if test -f "$$i"; then \
|
|
||||||
echo "$(subdir)/$$i"; \
|
|
||||||
else \
|
|
||||||
echo "$$sdir/$$i"; \
|
|
||||||
fi; \
|
|
||||||
done >> $(top_builddir)/cscope.files
|
|
||||||
|
|
||||||
distclean-tags:
|
distclean-tags:
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
|
||||||
|
|
||||||
distdir: $(BUILT_SOURCES)
|
distdir: $(DISTFILES)
|
||||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
|
||||||
|
|
||||||
distdir-am: $(DISTFILES)
|
|
||||||
@case `sed 15q $(srcdir)/NEWS` in \
|
|
||||||
*"$(VERSION)"*) : ;; \
|
|
||||||
*) \
|
|
||||||
echo "NEWS not updated; not releasing" 1>&2; \
|
|
||||||
exit 1;; \
|
|
||||||
esac
|
|
||||||
$(am__remove_distdir)
|
$(am__remove_distdir)
|
||||||
test -d "$(distdir)" || mkdir "$(distdir)"
|
test -d "$(distdir)" || mkdir "$(distdir)"
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
@ -512,10 +435,13 @@ distdir-am: $(DISTFILES)
|
||||||
done
|
done
|
||||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||||
if test "$$subdir" = .; then :; else \
|
if test "$$subdir" = .; then :; else \
|
||||||
$(am__make_dryrun) \
|
test -d "$(distdir)/$$subdir" \
|
||||||
|| test -d "$(distdir)/$$subdir" \
|
|
||||||
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
||||||
|| exit 1; \
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = .; then :; else \
|
||||||
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
||||||
$(am__relativize); \
|
$(am__relativize); \
|
||||||
new_distdir=$$reldir; \
|
new_distdir=$$reldir; \
|
||||||
|
@ -543,43 +469,37 @@ distdir-am: $(DISTFILES)
|
||||||
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||||
|| chmod -R a+r "$(distdir)"
|
|| chmod -R a+r "$(distdir)"
|
||||||
dist-gzip: distdir
|
dist-gzip: distdir
|
||||||
tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
|
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||||
$(am__post_remove_distdir)
|
$(am__remove_distdir)
|
||||||
|
|
||||||
dist-bzip2: distdir
|
dist-bzip2: distdir
|
||||||
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
|
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
|
||||||
$(am__post_remove_distdir)
|
$(am__remove_distdir)
|
||||||
|
|
||||||
dist-lzip: distdir
|
dist-lzma: distdir
|
||||||
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
|
tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
|
||||||
$(am__post_remove_distdir)
|
$(am__remove_distdir)
|
||||||
|
|
||||||
dist-xz: distdir
|
dist-xz: distdir
|
||||||
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
|
||||||
$(am__post_remove_distdir)
|
$(am__remove_distdir)
|
||||||
|
|
||||||
dist-tarZ: distdir
|
dist-tarZ: distdir
|
||||||
@echo WARNING: "Support for distribution archives compressed with" \
|
|
||||||
"legacy program 'compress' is deprecated." >&2
|
|
||||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
|
||||||
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||||
$(am__post_remove_distdir)
|
$(am__remove_distdir)
|
||||||
|
|
||||||
dist-shar: distdir
|
dist-shar: distdir
|
||||||
@echo WARNING: "Support for shar distribution archives is" \
|
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||||
"deprecated." >&2
|
$(am__remove_distdir)
|
||||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
|
||||||
shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
|
|
||||||
$(am__post_remove_distdir)
|
|
||||||
|
|
||||||
dist-zip: distdir
|
dist-zip: distdir
|
||||||
-rm -f $(distdir).zip
|
-rm -f $(distdir).zip
|
||||||
zip -rq $(distdir).zip $(distdir)
|
zip -rq $(distdir).zip $(distdir)
|
||||||
$(am__post_remove_distdir)
|
$(am__remove_distdir)
|
||||||
|
|
||||||
dist dist-all:
|
dist dist-all: distdir
|
||||||
$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
|
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||||
$(am__post_remove_distdir)
|
$(am__remove_distdir)
|
||||||
|
|
||||||
# This target untars the dist file and tries a VPATH configuration. Then
|
# This target untars the dist file and tries a VPATH configuration. Then
|
||||||
# it guarantees that the distribution is self-contained by making another
|
# it guarantees that the distribution is self-contained by making another
|
||||||
|
@ -587,33 +507,31 @@ dist dist-all:
|
||||||
distcheck: dist
|
distcheck: dist
|
||||||
case '$(DIST_ARCHIVES)' in \
|
case '$(DIST_ARCHIVES)' in \
|
||||||
*.tar.gz*) \
|
*.tar.gz*) \
|
||||||
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
|
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||||
*.tar.bz2*) \
|
*.tar.bz2*) \
|
||||||
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||||
*.tar.lz*) \
|
*.tar.lzma*) \
|
||||||
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
|
lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
|
||||||
*.tar.xz*) \
|
*.tar.xz*) \
|
||||||
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
|
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
|
||||||
*.tar.Z*) \
|
*.tar.Z*) \
|
||||||
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||||
*.shar.gz*) \
|
*.shar.gz*) \
|
||||||
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
|
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
|
||||||
*.zip*) \
|
*.zip*) \
|
||||||
unzip $(distdir).zip ;;\
|
unzip $(distdir).zip ;;\
|
||||||
esac
|
esac
|
||||||
chmod -R a-w $(distdir)
|
chmod -R a-w $(distdir); chmod a+w $(distdir)
|
||||||
chmod u+w $(distdir)
|
mkdir $(distdir)/_build
|
||||||
mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
|
mkdir $(distdir)/_inst
|
||||||
chmod a-w $(distdir)
|
chmod a-w $(distdir)
|
||||||
test -d $(distdir)/_build || exit 0; \
|
test -d $(distdir)/_build || exit 0; \
|
||||||
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||||
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||||
&& am__cwd=`pwd` \
|
&& am__cwd=`pwd` \
|
||||||
&& $(am__cd) $(distdir)/_build/sub \
|
&& $(am__cd) $(distdir)/_build \
|
||||||
&& ../../configure \
|
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
|
||||||
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
|
||||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
--srcdir=../.. --prefix="$$dc_install_base" \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||||
|
@ -636,21 +554,13 @@ distcheck: dist
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
||||||
&& cd "$$am__cwd" \
|
&& cd "$$am__cwd" \
|
||||||
|| exit 1
|
|| exit 1
|
||||||
$(am__post_remove_distdir)
|
$(am__remove_distdir)
|
||||||
@(echo "$(distdir) archives ready for distribution: "; \
|
@(echo "$(distdir) archives ready for distribution: "; \
|
||||||
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
||||||
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
||||||
distuninstallcheck:
|
distuninstallcheck:
|
||||||
@test -n '$(distuninstallcheck_dir)' || { \
|
@$(am__cd) '$(distuninstallcheck_dir)' \
|
||||||
echo 'ERROR: trying to run $@ with an empty' \
|
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|
||||||
'$$(distuninstallcheck_dir)' >&2; \
|
|
||||||
exit 1; \
|
|
||||||
}; \
|
|
||||||
$(am__cd) '$(distuninstallcheck_dir)' || { \
|
|
||||||
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
|
|
||||||
exit 1; \
|
|
||||||
}; \
|
|
||||||
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|
|
||||||
|| { echo "ERROR: files left after uninstall:" ; \
|
|| { echo "ERROR: files left after uninstall:" ; \
|
||||||
if test -n "$(DESTDIR)"; then \
|
if test -n "$(DESTDIR)"; then \
|
||||||
echo " (check DESTDIR support)"; \
|
echo " (check DESTDIR support)"; \
|
||||||
|
@ -681,15 +591,10 @@ install-am: all-am
|
||||||
|
|
||||||
installcheck: installcheck-recursive
|
installcheck: installcheck-recursive
|
||||||
install-strip:
|
install-strip:
|
||||||
if test -z '$(STRIP)'; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
install; \
|
`test -z '$(STRIP)' || \
|
||||||
else \
|
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
|
||||||
fi
|
|
||||||
mostlyclean-generic:
|
mostlyclean-generic:
|
||||||
|
|
||||||
clean-generic:
|
clean-generic:
|
||||||
|
@ -770,32 +675,42 @@ ps-am:
|
||||||
|
|
||||||
uninstall-am:
|
uninstall-am:
|
||||||
|
|
||||||
.MAKE: $(am__recursive_targets) all install-am install-strip
|
.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
|
||||||
|
ctags-recursive install-am install-strip tags-recursive
|
||||||
|
|
||||||
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
|
||||||
am--refresh check check-am clean clean-cscope clean-generic \
|
all all-am am--refresh check check-am clean clean-generic \
|
||||||
cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
|
ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
|
||||||
dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
|
dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \
|
||||||
distcheck distclean distclean-generic distclean-hdr \
|
distclean distclean-generic distclean-hdr distclean-tags \
|
||||||
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
distcleancheck distdir distuninstallcheck dvi dvi-am html \
|
||||||
dvi-am html html-am info info-am install install-am \
|
html-am info info-am install install-am install-data \
|
||||||
install-data install-data-am install-dvi install-dvi-am \
|
install-data-am install-dvi install-dvi-am install-exec \
|
||||||
install-exec install-exec-am install-html install-html-am \
|
install-exec-am install-html install-html-am install-info \
|
||||||
install-info install-info-am install-man install-pdf \
|
install-info-am install-man install-pdf install-pdf-am \
|
||||||
install-pdf-am install-ps install-ps-am install-strip \
|
install-ps install-ps-am install-strip installcheck \
|
||||||
installcheck installcheck-am installdirs installdirs-am \
|
installcheck-am installdirs installdirs-am maintainer-clean \
|
||||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
|
||||||
mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
|
pdf-am ps ps-am tags tags-recursive uninstall uninstall-am
|
||||||
uninstall-am
|
|
||||||
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
|
|
||||||
|
|
||||||
ChangeLog:
|
ChangeLog:
|
||||||
git log > ChangeLog
|
git log > ChangeLog
|
||||||
|
|
||||||
astyle:
|
deb:
|
||||||
astyle --options=.astylerc -nQ src/*.[ch] src/*/*.[ch]
|
dpkg-buildpackage -rfakeroot
|
||||||
|
|
||||||
|
rpm: dist
|
||||||
|
cp $(distdir).tar.gz /usr/src/redhat/SOURCES/
|
||||||
|
cp redhat/tinc.spec /usr/src/redhat/SOURCES/
|
||||||
|
cd /usr/src/redhat/SOURCES/ && rpm -bb tinc.spec
|
||||||
|
|
||||||
|
release:
|
||||||
|
rm -f ChangeLog
|
||||||
|
$(MAKE) ChangeLog
|
||||||
|
echo "Please edit the NEWS file now..."
|
||||||
|
/usr/bin/editor NEWS
|
||||||
|
$(MAKE) dist
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
|
258
NEWS
258
NEWS
|
@ -1,239 +1,33 @@
|
||||||
Version 1.0.35 October 5 2018
|
Version 1.1pre2 Juli 17 2011
|
||||||
|
|
||||||
* Prevent oracle attacks (CVE-2018-16737, CVE-2018-16738).
|
* .cookie files are renamed to .pid files, which are compatible with 1.0.x.
|
||||||
* Prevent a MITM from forcing a NULL cipher for UDP (CVE-2018-16758).
|
|
||||||
|
|
||||||
Version 1.0.34 June 12 2018
|
* Experimental protocol enhancements that can be enabled with the option
|
||||||
|
ExperimentalProtocol = yes:
|
||||||
|
|
||||||
* Fix a potential segmentation fault when connecting to an IPv6 peer via a
|
* Ephemeral ECDH key exchange will be used for both the meta protocol and
|
||||||
proxy.
|
UDP session keys.
|
||||||
* Minor improvements to the build system.
|
* Key exchanges are signed with ECDSA.
|
||||||
* Make the systemd service file identical to the one from the 1.1 branch.
|
* ECDSA public keys are automatically exchanged after RSA authentication if
|
||||||
* Fix a potential problem causing IPv4 sockets to not work on macOS.
|
nodes do not know each other's ECDSA public key yet.
|
||||||
|
|
||||||
Thanks to Maximilian Stein and Wang Liu Shuai for their contributions to this
|
Version 1.1pre1 June 25 2011
|
||||||
|
|
||||||
|
* Control interface allows control of a running tinc daemon. Used by:
|
||||||
|
* tincctl, a commandline utility
|
||||||
|
* tinc-gui, a preliminary GUI implemented in Python/wxWidgets
|
||||||
|
|
||||||
|
* Code cleanups and reorganization.
|
||||||
|
|
||||||
|
* Repleacable cryptography backend, currently supports OpenSSL and libgcrypt.
|
||||||
|
|
||||||
|
* Use libevent to handle I/O events and timeouts.
|
||||||
|
|
||||||
|
* Use splay trees instead of AVL trees to manage internal datastructures.
|
||||||
|
|
||||||
|
Thanks to Scott Lamb and Sven-Haegar Koch for their contributions to this
|
||||||
version of tinc.
|
version of tinc.
|
||||||
|
|
||||||
Version 1.0.33 November 4 2017
|
|
||||||
|
|
||||||
* Allow compilation from a build directory.
|
|
||||||
* Source code cleanups.
|
|
||||||
* Fix some options specified on the command line not surviving a HUP signal.
|
|
||||||
* Handle tun/tap device returning EPERM or EBUSY.
|
|
||||||
* Disable PMTUDiscovery when TCPOnly is used.
|
|
||||||
* Support the --runstatedir option of the autoconf 2.70.
|
|
||||||
|
|
||||||
Thanks to Rafael Sadowski and Pierre-Olivier Mercier for their contributions to
|
|
||||||
this version of tinc.
|
|
||||||
|
|
||||||
Version 1.0.32 September 2 2017
|
|
||||||
|
|
||||||
* Fix segmentation fault when using Cipher = none.
|
|
||||||
* Fix Proxy = exec.
|
|
||||||
* Support PriorityInheritance for IPv6 packets.
|
|
||||||
* Fixes for Solaris tun/tap support.
|
|
||||||
* Bind outgoing TCP sockets when ListenAddress is used.
|
|
||||||
|
|
||||||
Thanks to Vittorio Gambaletta for his contribution to this version of tinc.
|
|
||||||
|
|
||||||
Version 1.0.31 January 15 2017
|
|
||||||
|
|
||||||
* Remove ExecStop in tinc@.service.
|
|
||||||
|
|
||||||
Thanks to Élie Bouttier for his contribution to this version of tinc.
|
|
||||||
|
|
||||||
Version 1.0.30 October 30 2016
|
|
||||||
|
|
||||||
* Fix troubles connecting to some HTTP proxies.
|
|
||||||
|
|
||||||
* Add mitigations for the Sweet32 attack when using a 64-bit block cipher.
|
|
||||||
|
|
||||||
* Use AES256 and SHA256 as the default encryption and digest algorithms.
|
|
||||||
|
|
||||||
Version 1.0.29 October 9 2016
|
|
||||||
|
|
||||||
* Fix UDP communication with peers with link-local IPv6 addresses.
|
|
||||||
|
|
||||||
* Ensure compatibility with OpenSSL 1.1.0.
|
|
||||||
|
|
||||||
* Ensure autoreconf can be run without requiring autoconf-archive.
|
|
||||||
|
|
||||||
* Log warnings about dropped packets only at debug level 5.
|
|
||||||
|
|
||||||
Version 1.0.28 April 10 2016
|
|
||||||
|
|
||||||
* Fix compilation on BSD platforms.
|
|
||||||
|
|
||||||
* Add systemd service files.
|
|
||||||
|
|
||||||
Version 1.0.27 April 10 2016
|
|
||||||
|
|
||||||
* When using Proxy, let the proxy resolve hostnames if tinc can't.
|
|
||||||
|
|
||||||
* Fixes and improvements of the DecrementTTL option.
|
|
||||||
|
|
||||||
* Fixed the $NAME variable in subnet-up/down scripts for the local Subnets.
|
|
||||||
|
|
||||||
* Fixed potentially wrong checksum generation when clamping the MSS.
|
|
||||||
|
|
||||||
* Properly choose between the system's or our own copy of getopt.
|
|
||||||
|
|
||||||
* Fixed compiling tinc for Cygwin with MinGW installed.
|
|
||||||
|
|
||||||
* Added support for OS X utun interfaces.
|
|
||||||
|
|
||||||
* Documentation updates and minor fixes.
|
|
||||||
|
|
||||||
Thanks to Vittorio Gambaletta, LunarShaddow, Florian Weik and Nathan Stratton
|
|
||||||
Treadway for their contributions to this version of tinc.
|
|
||||||
|
|
||||||
Version 1.0.26 July 5 2015
|
|
||||||
|
|
||||||
* Tinc now forces glibc to reload /etc/resolv.conf for every hostname lookup.
|
|
||||||
|
|
||||||
* Fixed --logfile without a filename on Windows.
|
|
||||||
|
|
||||||
* Ensure tinc can be compiled when using musl libc.
|
|
||||||
|
|
||||||
Thanks to Jo-Philipp Wich for his contribution to this version of tinc.
|
|
||||||
|
|
||||||
Version 1.0.25 December 22 2014
|
|
||||||
|
|
||||||
* Documentation updates.
|
|
||||||
|
|
||||||
* Support linking against -lresolv on Mac OS X.
|
|
||||||
|
|
||||||
* Fix scripts on Windows when using the ScriptsInterpreter option.
|
|
||||||
|
|
||||||
* Allow a minimum reconnect timeout to be specified.
|
|
||||||
|
|
||||||
* Support PriorityInheritance on IPv6 sockets.
|
|
||||||
|
|
||||||
Thanks to David Pflug, Baptiste Jonglez, Alexis Hildebrandt, Borg, Jochen Voss,
|
|
||||||
Tomislav Čohar and VittGam for their contributions to this version of tinc.
|
|
||||||
|
|
||||||
Version 1.0.24 May 11 2014
|
|
||||||
|
|
||||||
* Various compiler hardening flags are enabled by default.
|
|
||||||
|
|
||||||
* Updated support for Solaris, allowing switch mode on Solaris 11.
|
|
||||||
|
|
||||||
* Configuration will now also be read from a conf.d directory.
|
|
||||||
|
|
||||||
* Various updates to the documentation.
|
|
||||||
|
|
||||||
* Tinc now forces glibc to reload /etc/resolv.conf after it receives SIGALRM.
|
|
||||||
|
|
||||||
* Fixed a potential routing loop when IndirectData or TCPOnly is used and
|
|
||||||
broadcast packets are being sent.
|
|
||||||
|
|
||||||
* Improved security with constant time memcmp and stricter use of OpenSSL's
|
|
||||||
RNG functions.
|
|
||||||
|
|
||||||
* Fixed all issues found by Coverity.
|
|
||||||
|
|
||||||
Thanks to Florent Clairambault, Vilbrekin, luckyhacky, Armin Fisslthaler, Loïc
|
|
||||||
Dachary and Steffan Karger for their contributions to this version of tinc.
|
|
||||||
|
|
||||||
Version 1.0.23 October 19 2013
|
|
||||||
|
|
||||||
* Start authentication immediately on outgoing connections (useful for sslh).
|
|
||||||
|
|
||||||
* Fixed segfault when Name = $HOST but $HOST is not set.
|
|
||||||
|
|
||||||
* Updated the build system and the documentation.
|
|
||||||
|
|
||||||
* Clean up child processes left over from Proxy = exec.
|
|
||||||
|
|
||||||
Version 1.0.22 August 13 2013
|
|
||||||
|
|
||||||
* Fixed the combination of Mode = router and DeviceType = tap.
|
|
||||||
|
|
||||||
* The $NAME variable is now set in subnet-up/down scripts.
|
|
||||||
|
|
||||||
* Tinc now gives an error when unknown options are given on the command line.
|
|
||||||
|
|
||||||
* Tinc now correctly handles a space between a short command line option and
|
|
||||||
an optional argument.
|
|
||||||
|
|
||||||
Thanks to Etienne Dechamps for his contribution to this version of tinc.
|
|
||||||
|
|
||||||
Version 1.0.21 April 22 2013
|
|
||||||
|
|
||||||
* Drop packets forwarded via TCP if they are too big (CVE-2013-1428).
|
|
||||||
|
|
||||||
Thanks to Martin Schobert for auditing tinc and reporting this vulnerability.
|
|
||||||
|
|
||||||
Version 1.0.20 March 03 2013
|
|
||||||
|
|
||||||
* Use /dev/tap0 by default on FreeBSD and NetBSD when using switch mode.
|
|
||||||
|
|
||||||
* Minor improvements and clarifications in the documentation.
|
|
||||||
|
|
||||||
* Allow tinc to be cross-compiled with Android's NDK.
|
|
||||||
|
|
||||||
* The discovered PMTU is now also applied to VLAN tagged traffic.
|
|
||||||
|
|
||||||
* The LocalDiscovery option now makes use of all addresses tinc is bound to.
|
|
||||||
|
|
||||||
* Fixed support for tunemu on iOS devices.
|
|
||||||
|
|
||||||
* The PriorityInheritance option now also works with switch mode.
|
|
||||||
|
|
||||||
* Fixed tinc crashing when using a SOCKS5 proxy.
|
|
||||||
|
|
||||||
Thanks to Mesar Hameed, Vilbrekin and Martin Schürrer for their contributions
|
|
||||||
to this version of tinc.
|
|
||||||
|
|
||||||
Version 1.0.19 June 25 2012
|
|
||||||
|
|
||||||
* Allow :: notation in IPv6 Subnets.
|
|
||||||
|
|
||||||
* Add support for systemd style socket activation.
|
|
||||||
|
|
||||||
* Allow environment variables to be used for the Name option.
|
|
||||||
|
|
||||||
* Add basic support for SOCKS proxies, HTTP proxies, and proxying through an
|
|
||||||
external command.
|
|
||||||
|
|
||||||
Thanks to Anthony G. Basile and Michael Tokarev for their contributions to
|
|
||||||
this version of tinc.
|
|
||||||
|
|
||||||
Version 1.0.18 March 25 2012
|
|
||||||
|
|
||||||
* Fixed IPv6 in switch mode by turning off DecrementTTL by default.
|
|
||||||
|
|
||||||
* Allow a port number to be specified in BindToAddress, which also allows tinc
|
|
||||||
to listen on multiple ports.
|
|
||||||
|
|
||||||
* Add support for multicast communication with UML/QEMU/KVM.
|
|
||||||
|
|
||||||
Version 1.0.17 March 10 2012
|
|
||||||
|
|
||||||
* The DeviceType option can now be used to select dummy, raw socket, UML and
|
|
||||||
VDE devices without needing to recompile tinc.
|
|
||||||
|
|
||||||
* Allow multiple BindToAddress statements.
|
|
||||||
|
|
||||||
* Decrement TTL value of IPv4 and IPv6 packets.
|
|
||||||
|
|
||||||
* Add LocalDiscovery option allowing tinc to detect peers that are behind the
|
|
||||||
same NAT.
|
|
||||||
|
|
||||||
* Accept Subnets passed with the -o option when StrictSubnets = yes.
|
|
||||||
|
|
||||||
* Disabling old RSA keys when generating new ones now also works properly on
|
|
||||||
Windows.
|
|
||||||
|
|
||||||
Thanks to Nick Hibma for his contribution to this version of tinc.
|
|
||||||
|
|
||||||
Version 1.0.16 July 23 2011
|
|
||||||
|
|
||||||
* Fixed a performance issue with TCP communication under Windows.
|
|
||||||
|
|
||||||
* Fixed code that, during network outages, would cause tinc to exit when it
|
|
||||||
thought two nodes with identical Names were on the VPN.
|
|
||||||
|
|
||||||
Version 1.0.15 June 24 2011
|
Version 1.0.15 June 24 2011
|
||||||
|
|
||||||
* Improved logging to file.
|
* Improved logging to file.
|
||||||
|
@ -242,6 +36,8 @@ Version 1.0.15 June 24 2011
|
||||||
|
|
||||||
* Fixed ProcessPriority option under Windows.
|
* Fixed ProcessPriority option under Windows.
|
||||||
|
|
||||||
|
Thanks to Loïc Grenié for his contribution to this version of tinc.
|
||||||
|
|
||||||
Version 1.0.14 May 8 2011
|
Version 1.0.14 May 8 2011
|
||||||
|
|
||||||
* Fixed reading configuration files that do not end with a newline. Again.
|
* Fixed reading configuration files that do not end with a newline. Again.
|
||||||
|
@ -357,7 +153,7 @@ Version 1.0.9 Dec 26 2008
|
||||||
|
|
||||||
* Enable path MTU discovery by default.
|
* Enable path MTU discovery by default.
|
||||||
|
|
||||||
* Fixed a memory leak that occurred when connections were closed.
|
* Fixed a memory leak that occured when connections were closed.
|
||||||
|
|
||||||
Thanks to Max Rijevski for his contributions to this version of tinc.
|
Thanks to Max Rijevski for his contributions to this version of tinc.
|
||||||
|
|
||||||
|
|
91
README
91
README
|
@ -1,7 +1,7 @@
|
||||||
This is the README file for tinc version 1.0.35. Installation
|
This is the README file for tinc version 1.1pre2. Installation
|
||||||
instructions may be found in the INSTALL file.
|
instructions may be found in the INSTALL file.
|
||||||
|
|
||||||
tinc is Copyright (C) 1998-2018 by:
|
tinc is Copyright (C) 1998-2011 by:
|
||||||
|
|
||||||
Ivo Timmermans,
|
Ivo Timmermans,
|
||||||
Guus Sliepen <guus@tinc-vpn.org>,
|
Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
|
@ -15,74 +15,51 @@ the Free Software Foundation; either version 2 of the License, or (at
|
||||||
your option) any later version. See the file COPYING for more details.
|
your option) any later version. See the file COPYING for more details.
|
||||||
|
|
||||||
|
|
||||||
|
This is a pre-release
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Please note that this is NOT a stable release. Until version 1.1.0 is released,
|
||||||
|
please use one of the 1.0.x versions if you need a stable version of tinc.
|
||||||
|
|
||||||
|
Although tinc 1.1 will be protocol compatible with tinc 1.0.x, the
|
||||||
|
functionality of the tincctl program may still change, and the control socket
|
||||||
|
protocol is not fixed yet.
|
||||||
|
|
||||||
|
|
||||||
Security statement
|
Security statement
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
In August 2000, we discovered the existence of a security hole in all versions
|
This version uses an experimental and unfinished cryptographic protocol. Use
|
||||||
of tinc up to and including 1.0pre2. This had to do with the way we exchanged
|
it at your own risk.
|
||||||
keys. Since then, we have been working on a new authentication scheme to make
|
|
||||||
tinc as secure as possible. The current version uses the OpenSSL library and
|
|
||||||
uses strong authentication with RSA keys.
|
|
||||||
|
|
||||||
On the 29th of December 2001, Jerome Etienne posted a security analysis of tinc
|
|
||||||
1.0pre4. Due to a lack of sequence numbers and a message authentication code
|
|
||||||
for each packet, an attacker could possibly disrupt certain network services or
|
|
||||||
launch a denial of service attack by replaying intercepted packets. The current
|
|
||||||
version adds sequence numbers and message authentication codes to prevent such
|
|
||||||
attacks.
|
|
||||||
|
|
||||||
On September the 15th of 2003, Peter Gutmann contacted us and showed us a
|
|
||||||
writeup describing various security issues in several VPN daemons. He showed
|
|
||||||
that tinc lacks perfect forward security, the connection authentication could
|
|
||||||
be done more properly, that the sequence number we use as an IV is not the best
|
|
||||||
practice and that the default length of the HMAC for packets is too short in
|
|
||||||
his opinion. We do not know of a way to exploit these weaknesses, but these
|
|
||||||
issues are being addressed in the tinc 1.1 branch.
|
|
||||||
|
|
||||||
The Sweet32 attack affects versions of tinc prior to 1.0.30.
|
|
||||||
|
|
||||||
On September 6th, 2018, Michael Yonly contacted us and provided
|
|
||||||
proof-of-concept code that allowed a remote attacker to create an
|
|
||||||
authenticated, one-way connection with a node, and also that there was a
|
|
||||||
possibility for a man-in-the-middle to force UDP packets from a node to be sent
|
|
||||||
in plaintext. The first issue was trivial to exploit on tinc versions prior to
|
|
||||||
1.0.30, but the changes in 1.0.30 to mitigate the Sweet32 attack made this
|
|
||||||
weakness much harder to exploit. These issues have been fixed in tinc 1.0.35.
|
|
||||||
The new protocol in the tinc 1.1 branch is not susceptible to these issues.
|
|
||||||
|
|
||||||
Cryptography is a hard thing to get right. We cannot make any
|
|
||||||
guarantees. Time, review and feedback are the only things that can
|
|
||||||
prove the security of any cryptographic product. If you wish to review
|
|
||||||
tinc or give us feedback, you are strongly encouraged to do so.
|
|
||||||
|
|
||||||
|
|
||||||
Compatibility
|
Compatibility
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
Version 1.0.35 is compatible with 1.0pre8, 1.0 and later, but not with older
|
Version 1.1pre2 is compatible with 1.0pre8, 1.0 and later, but not with older
|
||||||
versions of tinc. Note that since version 1.0.30, tinc requires all nodes in
|
versions of tinc.
|
||||||
the VPN to be compiled with a version of LibreSSL or OpenSSL that supports the
|
|
||||||
AES256 and SHA256 algorithms.
|
When the ExperimentalProtocol option is used, tinc is still compatible with
|
||||||
|
1.0.X and 1.1pre2 itself, but not with any other 1.1preX version.
|
||||||
|
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
|
|
||||||
The OpenSSL library is used for all cryptographic functions. You can find it at
|
Either OpenSSL (http://www.openssl.org/) or libgcrypt
|
||||||
https://www.openssl.org/. You will need version 1.0.1 or later with support for
|
(http://www.gnupg.org/download/#libgcrypt).
|
||||||
AES256 and SHA256 enabled. If this library is not installed on your system, the
|
|
||||||
configure script will fail. The manual in doc/tinc.texi contains more detailed
|
|
||||||
information on how to install this library. Alternatively, you may also use the
|
|
||||||
LibreSSL library.
|
|
||||||
|
|
||||||
The zlib library is used for optional compression. You can
|
The zlib library is used for optional compression. You can find it at
|
||||||
find it at https://zlib.net/. Because of a possible exploit in
|
http://www.gzip.org/zlib/.
|
||||||
earlier versions we recommend that you download version 1.1.4 or later.
|
|
||||||
|
|
||||||
The LZO library is also used for optional compression. You can
|
The lzo library is also used for optional compression. You can find it at
|
||||||
find it at https://www.oberhumer.com/opensource/lzo/.
|
http://www.oberhumer.com/opensource/lzo/.
|
||||||
|
|
||||||
In order to compile tinc, you will need a C99 compliant compiler.
|
Since 1.1, the libevent library is used for the main event loop. You can find
|
||||||
|
it at http://monkey.org/~provos/libevent/.
|
||||||
|
|
||||||
|
In order to compile tinc, you will need a GNU C compiler environment. Please
|
||||||
|
ensure you have the latest stable versions of all the required libraries.
|
||||||
|
|
||||||
|
|
||||||
Features
|
Features
|
||||||
|
@ -118,8 +95,8 @@ et cetera.
|
||||||
Support for routing IPv6 packets has been added. Just add Subnet lines with
|
Support for routing IPv6 packets has been added. Just add Subnet lines with
|
||||||
IPv6 addresses (without using :: abbreviations) and use ifconfig or ip (from
|
IPv6 addresses (without using :: abbreviations) and use ifconfig or ip (from
|
||||||
the iproute package) to give the virtual network interface corresponding IPv6
|
the iproute package) to give the virtual network interface corresponding IPv6
|
||||||
addresses. tinc does not provide autoconfiguration for IPv6 hosts. Consider
|
addresses. tinc does not provide autoconfiguration for IPv6 hosts, if you need
|
||||||
using radvd or zebra if you need it.
|
it use radvd or zebra.
|
||||||
|
|
||||||
It is also possible to make tunnels to other tinc daemons over IPv6 networks,
|
It is also possible to make tunnels to other tinc daemons over IPv6 networks,
|
||||||
if the operating system supports IPv6. tinc will automatically use both IPv6
|
if the operating system supports IPv6. tinc will automatically use both IPv6
|
||||||
|
@ -127,7 +104,7 @@ and IPv4 when available, but this can be changed by adding the option
|
||||||
"AddressFamily = ipv4" or "AddressFamily = ipv6" to the tinc.conf file.
|
"AddressFamily = ipv4" or "AddressFamily = ipv6" to the tinc.conf file.
|
||||||
|
|
||||||
Normally, when started tinc will detach and run in the background. In a native
|
Normally, when started tinc will detach and run in the background. In a native
|
||||||
Windows environment this means tinc will install itself as a service, which will
|
Windows environment this means tinc will intall itself as a service, which will
|
||||||
restart after reboots. To prevent tinc from detaching or running as a service,
|
restart after reboots. To prevent tinc from detaching or running as a service,
|
||||||
use the -D option.
|
use the -D option.
|
||||||
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
Quick how-to cross compile tinc for android (done from $HOME/android/):
|
|
||||||
|
|
||||||
- Download android NDK and setup local ARM toolchain:
|
|
||||||
wget http://dl.google.com/android/ndk/android-ndk-r9d-linux-x86.tar.bz2
|
|
||||||
tar xfj android-ndk-r9d-linux-x86.tar.bz2
|
|
||||||
./android-ndk-r9d/build/tools/make-standalone-toolchain.sh --platform=android-5 --install-dir=/tmp/my-android-toolchain
|
|
||||||
|
|
||||||
- Download and cross-compile openSSL for ARM:
|
|
||||||
wget http://www.openssl.org/source/openssl-1.0.1h.tar.gz
|
|
||||||
tar xfz openssl-1.0.1h.tar.gz
|
|
||||||
cd openssl-1.0.1h
|
|
||||||
./Configure dist
|
|
||||||
make CC=/tmp/my-android-toolchain/bin/arm-linux-androideabi-gcc AR="/tmp/my-android-toolchain/bin/arm-linux-androideabi-ar r" RANLIB=/tmp/my-android-toolchain/bin/arm-linux-androideabi-ranlib
|
|
||||||
cd -
|
|
||||||
|
|
||||||
- Clone and cross-compile tinc:
|
|
||||||
git clone git://tinc-vpn.org/tinc
|
|
||||||
cd tinc
|
|
||||||
autoreconf -fsi
|
|
||||||
CC=/tmp/my-android-toolchain/bin/arm-linux-androideabi-gcc ./configure --host=arm-linux --disable-lzo --with-openssl-lib=$HOME/android/openssl-1.0.1g --with-openssl-include=$HOME/android/openssl-1.0.1g/include/ --disable-hardening
|
|
||||||
make -j5
|
|
||||||
|
|
||||||
- Strip tincd binary to make it smaller
|
|
||||||
/tmp/my-android-toolchain/bin/arm-linux-androideabi-strip src/tincd
|
|
||||||
|
|
77
THANKS
77
THANKS
|
@ -1,120 +1,49 @@
|
||||||
We would like to thank the following people for their contributions to tinc:
|
We would like to thank the following people for their contributions to tinc:
|
||||||
|
|
||||||
* Alexander Reil and Gemeinde Berg
|
* Alexander Reil and Gemeinde Berg
|
||||||
* Alexander Ried
|
|
||||||
* Alexis Hildebrandt
|
|
||||||
* Allesandro Gatti
|
* Allesandro Gatti
|
||||||
* Andreas van Cranenburgh
|
* Andreas van Cranenburgh
|
||||||
* Andrew Hahn
|
|
||||||
* Anthony G. Basile
|
|
||||||
* Armijn Hemel
|
* Armijn Hemel
|
||||||
* Armin Fisslthaler
|
|
||||||
* Aron Cowan
|
|
||||||
* Ashish Bajaj
|
|
||||||
* Baptiste Jonglez
|
|
||||||
* Borg
|
|
||||||
* Brandon Black
|
* Brandon Black
|
||||||
* Cheng LI
|
|
||||||
* Cris van Pelt
|
* Cris van Pelt
|
||||||
* Darius Jahandarie
|
|
||||||
* Dato Simó
|
|
||||||
* David Pflug
|
|
||||||
* Delf Eldkraft
|
* Delf Eldkraft
|
||||||
* Dennis Joachimsthaler
|
|
||||||
* dnk
|
* dnk
|
||||||
* Élie Bouttier
|
|
||||||
* Enrique Zanardi
|
* Enrique Zanardi
|
||||||
* Erik Tews
|
|
||||||
* Etienne Dechamps
|
|
||||||
* Florent Clairambault
|
|
||||||
* Florian Forster
|
|
||||||
* Florian Klink
|
|
||||||
* Florian Weik
|
|
||||||
* Flynn Marquardt
|
* Flynn Marquardt
|
||||||
* Franz Pletz
|
|
||||||
* Gary Kessler and Claudia Gonzalez
|
|
||||||
* Grzegorz Dymarek
|
* Grzegorz Dymarek
|
||||||
* Gusariev Oleksandr
|
|
||||||
* Hans Bayle
|
* Hans Bayle
|
||||||
* Harvest
|
|
||||||
* Ivo van Dong
|
* Ivo van Dong
|
||||||
* Ivo Smits
|
|
||||||
* James Cook
|
|
||||||
* James MacLean
|
* James MacLean
|
||||||
* Jamie Briggs
|
* Jamie Briggs
|
||||||
* Jason Harper
|
* Jason Harper
|
||||||
* Jason Livesay
|
|
||||||
* Jasper Krijgsman
|
|
||||||
* Jelle de Jong
|
|
||||||
* Jeroen Domburg
|
|
||||||
* Jeroen Ubbink
|
* Jeroen Ubbink
|
||||||
* Jerome Etienne
|
* Jerome Etienne
|
||||||
* Jo-Philipp Wich
|
|
||||||
* Jochen Voss
|
|
||||||
* Julien Muchembled
|
* Julien Muchembled
|
||||||
* Lavrans Laading
|
|
||||||
* Loïc Dachary
|
|
||||||
* Loïc Grenié
|
* Loïc Grenié
|
||||||
* Lubomír Bulej
|
* Lubomír Bulej
|
||||||
* luckyhacky
|
|
||||||
* LunarShaddow
|
|
||||||
* Mads Kiilerich
|
* Mads Kiilerich
|
||||||
* Marc A. Lehmann
|
* Marc A. Lehmann
|
||||||
* Mark Glines
|
* Mark Glines
|
||||||
* Mark Petryk
|
|
||||||
* Markus Goetz
|
* Markus Goetz
|
||||||
* Martin Kihlgren
|
* Martin Kihlgren
|
||||||
* Martin Schobert
|
|
||||||
* Martin Schürrer
|
|
||||||
* Martin Weinelt
|
|
||||||
* Matias Carrasco
|
* Matias Carrasco
|
||||||
* Max Rijevski
|
* Max Rijevski
|
||||||
* Menno Smits
|
* Menno Smits
|
||||||
* Mesar Hameed
|
|
||||||
* Michael Tokarev
|
* Michael Tokarev
|
||||||
* Michael Yonli
|
|
||||||
* Miles Nordin
|
* Miles Nordin
|
||||||
* Nathan Stratton Treadway
|
|
||||||
* Murat Donmez
|
|
||||||
* Nick Hibma
|
|
||||||
* Nick Patavalis
|
* Nick Patavalis
|
||||||
* Paul Littlefield
|
* Paul Littlefield
|
||||||
* Philipp Babel
|
|
||||||
* Pierre Emeriaud
|
|
||||||
* Pierre-Olivier Mercier
|
|
||||||
* Rafael Sadowski
|
|
||||||
* Rafał Leśniak
|
|
||||||
* Rhosyn Celyn
|
|
||||||
* Robert van der Meulen
|
* Robert van der Meulen
|
||||||
* Rumko
|
* Rumko
|
||||||
* Ryan Miller
|
|
||||||
* Sam Bryan
|
|
||||||
* Samuel Thibault
|
|
||||||
* Saverio Proto
|
|
||||||
* Scott Lamb
|
* Scott Lamb
|
||||||
* Steffan Karger
|
|
||||||
* Stig Fagrell
|
|
||||||
* Sven-Haegar Koch
|
* Sven-Haegar Koch
|
||||||
* Teemu Kiviniemi
|
* Teemu Kiviniemi
|
||||||
* Thomas Tsiakalakis
|
|
||||||
* Timothy Redaelli
|
* Timothy Redaelli
|
||||||
* Tomasz Fortuna
|
|
||||||
* Tomislav Čohar
|
|
||||||
* Tommy Arnkværn
|
|
||||||
* Tonnerre Lombard
|
* Tonnerre Lombard
|
||||||
* Ulrich Seifert
|
|
||||||
* Vil Brekin
|
|
||||||
* Vittorio Gambaletta
|
|
||||||
* Wendy Willard
|
|
||||||
* Wessel Dankers
|
* Wessel Dankers
|
||||||
* William A. Kennington III
|
|
||||||
* William McArthur
|
|
||||||
* Wouter van Heyst
|
* Wouter van Heyst
|
||||||
* xentec
|
|
||||||
* 戴 鸣
|
|
||||||
|
|
||||||
And everyone we forgot (if we did, please let us know). Thank you!
|
And everyone we forgot. Thank you!
|
||||||
|
|
||||||
---
|
Ivo Timmermans
|
||||||
Ivo Timmermans,
|
Guus Sliepen
|
||||||
Guus Sliepen.
|
|
||||||
|
|
871
aclocal.m4
vendored
871
aclocal.m4
vendored
File diff suppressed because it is too large
Load diff
348
compile
348
compile
|
@ -1,348 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
|
|
||||||
scriptversion=2018-03-07.03; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
|
||||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# 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 <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
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 <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "compile $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
|
|
||||||
icl | *[/\\]icl | icl.exe | *[/\\]icl.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 'before-save-hook 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC0"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
911
config.guess
vendored
911
config.guess
vendored
File diff suppressed because it is too large
Load diff
119
config.h.in
119
config.h.in
|
@ -1,4 +1,4 @@
|
||||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
/* config.h.in. Generated from configure.in by autoheader. */
|
||||||
|
|
||||||
/* Support for jumbograms (packets up to 9000 bytes) */
|
/* Support for jumbograms (packets up to 9000 bytes) */
|
||||||
#undef ENABLE_JUMBOGRAMS
|
#undef ENABLE_JUMBOGRAMS
|
||||||
|
@ -6,27 +6,21 @@
|
||||||
/* Support for tunemu */
|
/* Support for tunemu */
|
||||||
#undef ENABLE_TUNEMU
|
#undef ENABLE_TUNEMU
|
||||||
|
|
||||||
/* Support for UML */
|
|
||||||
#undef ENABLE_UML
|
|
||||||
|
|
||||||
/* Support for VDE */
|
|
||||||
#undef ENABLE_VDE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||||
#undef HAVE_ARPA_INET_H
|
#undef HAVE_ARPA_INET_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <arpa/nameser.h> header file. */
|
|
||||||
#undef HAVE_ARPA_NAMESER_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `asprintf' function. */
|
/* Define to 1 if you have the `asprintf' function. */
|
||||||
#undef HAVE_ASPRINTF
|
#undef HAVE_ASPRINTF
|
||||||
|
|
||||||
/* Define to 1 if you have the `BN_GENCB_new' function. */
|
|
||||||
#undef HAVE_BN_GENCB_NEW
|
|
||||||
|
|
||||||
/* Unknown BSD variant */
|
/* Unknown BSD variant */
|
||||||
#undef HAVE_BSD
|
#undef HAVE_BSD
|
||||||
|
|
||||||
|
/* have curses support */
|
||||||
|
#undef HAVE_CURSES
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <curses.h> header file. */
|
||||||
|
#undef HAVE_CURSES_H
|
||||||
|
|
||||||
/* Cygwin */
|
/* Cygwin */
|
||||||
#undef HAVE_CYGWIN
|
#undef HAVE_CYGWIN
|
||||||
|
|
||||||
|
@ -36,10 +30,6 @@
|
||||||
/* Darwin (MacOS/X) */
|
/* Darwin (MacOS/X) */
|
||||||
#undef HAVE_DARWIN
|
#undef HAVE_DARWIN
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `EVP_aes_256_cfb', and to 0 if
|
|
||||||
you don't. */
|
|
||||||
#undef HAVE_DECL_EVP_AES_256_CFB
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `freeaddrinfo', and to 0 if you
|
/* Define to 1 if you have the declaration of `freeaddrinfo', and to 0 if you
|
||||||
don't. */
|
don't. */
|
||||||
#undef HAVE_DECL_FREEADDRINFO
|
#undef HAVE_DECL_FREEADDRINFO
|
||||||
|
@ -56,25 +46,14 @@
|
||||||
don't. */
|
don't. */
|
||||||
#undef HAVE_DECL_GETNAMEINFO
|
#undef HAVE_DECL_GETNAMEINFO
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `OpenSSL_add_all_algorithms',
|
|
||||||
and to 0 if you don't. */
|
|
||||||
#undef HAVE_DECL_OPENSSL_ADD_ALL_ALGORITHMS
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `res_init', and to 0 if you
|
|
||||||
don't. */
|
|
||||||
#undef HAVE_DECL_RES_INIT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `devname' function. */
|
|
||||||
#undef HAVE_DEVNAME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dirent.h> header file. */
|
/* Define to 1 if you have the <dirent.h> header file. */
|
||||||
#undef HAVE_DIRENT_H
|
#undef HAVE_DIRENT_H
|
||||||
|
|
||||||
/* DragonFly */
|
/* DragonFly */
|
||||||
#undef HAVE_DRAGONFLY
|
#undef HAVE_DRAGONFLY
|
||||||
|
|
||||||
/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */
|
/* Define to 1 if you have the <event.h> header file. */
|
||||||
#undef HAVE_EVP_CIPHER_CTX_NEW
|
#undef HAVE_EVENT_H
|
||||||
|
|
||||||
/* Define to 1 if you have the `EVP_EncryptInit_ex' function. */
|
/* Define to 1 if you have the `EVP_EncryptInit_ex' function. */
|
||||||
#undef HAVE_EVP_ENCRYPTINIT_EX
|
#undef HAVE_EVP_ENCRYPTINIT_EX
|
||||||
|
@ -82,9 +61,6 @@
|
||||||
/* Define to 1 if you have the `fchmod' function. */
|
/* Define to 1 if you have the `fchmod' function. */
|
||||||
#undef HAVE_FCHMOD
|
#undef HAVE_FCHMOD
|
||||||
|
|
||||||
/* Define to 1 if you have the `fdevname' function. */
|
|
||||||
#undef HAVE_FDEVNAME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `flock' function. */
|
/* Define to 1 if you have the `flock' function. */
|
||||||
#undef HAVE_FLOCK
|
#undef HAVE_FLOCK
|
||||||
|
|
||||||
|
@ -94,30 +70,24 @@
|
||||||
/* FreeBSD */
|
/* FreeBSD */
|
||||||
#undef HAVE_FREEBSD
|
#undef HAVE_FREEBSD
|
||||||
|
|
||||||
/* Define to 1 if you have the <getopt.h> header file. */
|
/* Define to 1 if you have the `ftime' function. */
|
||||||
#undef HAVE_GETOPT_H
|
#undef HAVE_FTIME
|
||||||
|
|
||||||
/* getopt_long() */
|
|
||||||
#undef HAVE_GETOPT_LONG
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `gettimeofday' function. */
|
/* Define to 1 if you have the `gettimeofday' function. */
|
||||||
#undef HAVE_GETTIMEOFDAY
|
#undef HAVE_GETTIMEOFDAY
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `get_current_dir_name' function. */
|
||||||
|
#undef HAVE_GET_CURRENT_DIR_NAME
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
#undef HAVE_INTTYPES_H
|
#undef HAVE_INTTYPES_H
|
||||||
|
|
||||||
/* Define to 1 if you have the `nsl' library (-lnsl). */
|
/* Define to 1 if you have the `nsl' library (-lnsl). */
|
||||||
#undef HAVE_LIBNSL
|
#undef HAVE_LIBNSL
|
||||||
|
|
||||||
/* Define to 1 if you have the `resolv' library (-lresolv). */
|
|
||||||
#undef HAVE_LIBRESOLV
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `socket' library (-lsocket). */
|
/* Define to 1 if you have the `socket' library (-lsocket). */
|
||||||
#undef HAVE_LIBSOCKET
|
#undef HAVE_LIBSOCKET
|
||||||
|
|
||||||
/* Define to 1 if you have the <libvdeplug_dyn.h> header file. */
|
|
||||||
#undef HAVE_LIBVDEPLUG_DYN_H
|
|
||||||
|
|
||||||
/* Linux */
|
/* Linux */
|
||||||
#undef HAVE_LINUX
|
#undef HAVE_LINUX
|
||||||
|
|
||||||
|
@ -178,9 +148,6 @@
|
||||||
/* Define to 1 if you have the <netinet/tcp.h> header file. */
|
/* Define to 1 if you have the <netinet/tcp.h> header file. */
|
||||||
#undef HAVE_NETINET_TCP_H
|
#undef HAVE_NETINET_TCP_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <netpacket/packet.h> header file. */
|
|
||||||
#undef HAVE_NETPACKET_PACKET_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <net/ethernet.h> header file. */
|
/* Define to 1 if you have the <net/ethernet.h> header file. */
|
||||||
#undef HAVE_NET_ETHERNET_H
|
#undef HAVE_NET_ETHERNET_H
|
||||||
|
|
||||||
|
@ -199,9 +166,6 @@
|
||||||
/* Define to 1 if you have the <net/if_types.h> header file. */
|
/* Define to 1 if you have the <net/if_types.h> header file. */
|
||||||
#undef HAVE_NET_IF_TYPES_H
|
#undef HAVE_NET_IF_TYPES_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <net/if_utun.h> header file. */
|
|
||||||
#undef HAVE_NET_IF_UTUN_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <net/tap/if_tap.h> header file. */
|
/* Define to 1 if you have the <net/tap/if_tap.h> header file. */
|
||||||
#undef HAVE_NET_TAP_IF_TAP_H
|
#undef HAVE_NET_TAP_IF_TAP_H
|
||||||
|
|
||||||
|
@ -232,20 +196,17 @@
|
||||||
/* Define to 1 if you have the <openssl/sha.h> header file. */
|
/* Define to 1 if you have the <openssl/sha.h> header file. */
|
||||||
#undef HAVE_OPENSSL_SHA_H
|
#undef HAVE_OPENSSL_SHA_H
|
||||||
|
|
||||||
/* Define to 1 if you have the `pselect' function. */
|
|
||||||
#undef HAVE_PSELECT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `putenv' function. */
|
/* Define to 1 if you have the `putenv' function. */
|
||||||
#undef HAVE_PUTENV
|
#undef HAVE_PUTENV
|
||||||
|
|
||||||
/* Define to 1 if you have the `RAND_bytes' function. */
|
/* Define to 1 if you have the `random' function. */
|
||||||
#undef HAVE_RAND_BYTES
|
#undef HAVE_RANDOM
|
||||||
|
|
||||||
/* Define to 1 if you have the <resolv.h> header file. */
|
/* Define to 1 if you have the `RAND_pseudo_bytes' function. */
|
||||||
#undef HAVE_RESOLV_H
|
#undef HAVE_RAND_PSEUDO_BYTES
|
||||||
|
|
||||||
/* Define to 1 if you have the `RSA_set0_key' function. */
|
/* Define to 1 if you have the `select' function. */
|
||||||
#undef HAVE_RSA_SET0_KEY
|
#undef HAVE_SELECT
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `socklen_t'. */
|
/* Define to 1 if the system has the type `socklen_t'. */
|
||||||
#undef HAVE_SOCKLEN_T
|
#undef HAVE_SOCKLEN_T
|
||||||
|
@ -253,12 +214,21 @@
|
||||||
/* Solaris/SunOS */
|
/* Solaris/SunOS */
|
||||||
#undef HAVE_SOLARIS
|
#undef HAVE_SOLARIS
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdbool.h> header file. */
|
||||||
|
#undef HAVE_STDBOOL_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
#undef HAVE_STDINT_H
|
#undef HAVE_STDINT_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
#undef HAVE_STDLIB_H
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strdup' function. */
|
||||||
|
#undef HAVE_STRDUP
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strerror' function. */
|
||||||
|
#undef HAVE_STRERROR
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
#undef HAVE_STRINGS_H
|
#undef HAVE_STRINGS_H
|
||||||
|
|
||||||
|
@ -268,6 +238,9 @@
|
||||||
/* Define to 1 if you have the `strsignal' function. */
|
/* Define to 1 if you have the `strsignal' function. */
|
||||||
#undef HAVE_STRSIGNAL
|
#undef HAVE_STRSIGNAL
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strtol' function. */
|
||||||
|
#undef HAVE_STRTOL
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `struct addrinfo'. */
|
/* Define to 1 if the system has the type `struct addrinfo'. */
|
||||||
#undef HAVE_STRUCT_ADDRINFO
|
#undef HAVE_STRUCT_ADDRINFO
|
||||||
|
|
||||||
|
@ -343,9 +316,18 @@
|
||||||
/* Define to 1 if you have the <sys/uio.h> header file. */
|
/* Define to 1 if you have the <sys/uio.h> header file. */
|
||||||
#undef HAVE_SYS_UIO_H
|
#undef HAVE_SYS_UIO_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/un.h> header file. */
|
||||||
|
#undef HAVE_SYS_UN_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/wait.h> header file. */
|
/* Define to 1 if you have the <sys/wait.h> header file. */
|
||||||
#undef HAVE_SYS_WAIT_H
|
#undef HAVE_SYS_WAIT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `time' function. */
|
||||||
|
#undef HAVE_TIME
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <time.h> header file. */
|
||||||
|
#undef HAVE_TIME_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
#undef HAVE_UNISTD_H
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
@ -358,6 +340,9 @@
|
||||||
/* Define to 1 if you have the `vsyslog' function. */
|
/* Define to 1 if you have the `vsyslog' function. */
|
||||||
#undef HAVE_VSYSLOG
|
#undef HAVE_VSYSLOG
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `writev' function. */
|
||||||
|
#undef HAVE_WRITEV
|
||||||
|
|
||||||
/* have zlib compression support */
|
/* have zlib compression support */
|
||||||
#undef HAVE_ZLIB
|
#undef HAVE_ZLIB
|
||||||
|
|
||||||
|
@ -394,6 +379,12 @@
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
#undef STDC_HEADERS
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
||||||
|
#undef TIME_WITH_SYS_TIME
|
||||||
|
|
||||||
|
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
||||||
|
#undef TM_IN_SYS_TIME
|
||||||
|
|
||||||
/* Enable extensions on AIX 3, Interix. */
|
/* Enable extensions on AIX 3, Interix. */
|
||||||
#ifndef _ALL_SOURCE
|
#ifndef _ALL_SOURCE
|
||||||
# undef _ALL_SOURCE
|
# undef _ALL_SOURCE
|
||||||
|
@ -438,5 +429,15 @@
|
||||||
/* Defined if the __malloc__ attribute is not supported. */
|
/* Defined if the __malloc__ attribute is not supported. */
|
||||||
#undef __malloc__
|
#undef __malloc__
|
||||||
|
|
||||||
|
/* Define to empty if `const' does not conform to ANSI C. */
|
||||||
|
#undef const
|
||||||
|
|
||||||
/* Define to `int' if <sys/types.h> does not define. */
|
/* Define to `int' if <sys/types.h> does not define. */
|
||||||
#undef pid_t
|
#undef pid_t
|
||||||
|
|
||||||
|
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||||
|
#undef size_t
|
||||||
|
|
||||||
|
/* Define to empty if the keyword `volatile' does not work. Warning: valid
|
||||||
|
code using `volatile' can become incorrect without. Disable with care. */
|
||||||
|
#undef volatile
|
||||||
|
|
457
config.sub
vendored
457
config.sub
vendored
File diff suppressed because it is too large
Load diff
247
configure.ac
247
configure.ac
|
@ -1,247 +0,0 @@
|
||||||
dnl Process this file with autoconf to produce a configure script.
|
|
||||||
|
|
||||||
AC_PREREQ(2.61)
|
|
||||||
AC_INIT([tinc], [1.0.35])
|
|
||||||
AC_CONFIG_SRCDIR([src/tincd.c])
|
|
||||||
AM_INIT_AUTOMAKE([1.11 check-news std-options subdir-objects nostdinc silent-rules -Wall])
|
|
||||||
AC_CONFIG_HEADERS([config.h])
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
|
||||||
AM_SILENT_RULES([yes])
|
|
||||||
|
|
||||||
# Enable GNU extensions.
|
|
||||||
# Define this here, not in acconfig's @TOP@ section, since definitions
|
|
||||||
# in the latter don't make it into the configure-time tests.
|
|
||||||
AC_GNU_SOURCE
|
|
||||||
AC_DEFINE([__USE_BSD], 1, [Enable BSD extensions])
|
|
||||||
|
|
||||||
dnl Checks for programs.
|
|
||||||
AC_PROG_CC_C99
|
|
||||||
AC_PROG_CPP
|
|
||||||
AC_PROG_INSTALL
|
|
||||||
|
|
||||||
AM_PROG_CC_C_O
|
|
||||||
|
|
||||||
dnl Check and set OS
|
|
||||||
|
|
||||||
AC_CANONICAL_HOST
|
|
||||||
|
|
||||||
case $host_os in
|
|
||||||
*linux*)
|
|
||||||
linux=true
|
|
||||||
AC_DEFINE(HAVE_LINUX, 1, [Linux])
|
|
||||||
;;
|
|
||||||
*freebsd*)
|
|
||||||
bsd=true
|
|
||||||
AC_DEFINE(HAVE_FREEBSD, 1, [FreeBSD])
|
|
||||||
;;
|
|
||||||
*darwin*)
|
|
||||||
bsd=true
|
|
||||||
AC_DEFINE(HAVE_DARWIN, 1, [Darwin (MacOS/X)])
|
|
||||||
;;
|
|
||||||
*solaris*)
|
|
||||||
solaris=true
|
|
||||||
AC_DEFINE(HAVE_SOLARIS, 1, [Solaris/SunOS])
|
|
||||||
;;
|
|
||||||
*openbsd*)
|
|
||||||
bsd=true
|
|
||||||
AC_DEFINE(HAVE_OPENBSD, 1, [OpenBSD])
|
|
||||||
;;
|
|
||||||
*netbsd*)
|
|
||||||
bsd=true
|
|
||||||
AC_DEFINE(HAVE_NETBSD, 1, [NetBSD])
|
|
||||||
;;
|
|
||||||
*dragonfly*)
|
|
||||||
bsd=true
|
|
||||||
AC_DEFINE(HAVE_DRAGONFLY, 1, [DragonFly])
|
|
||||||
;;
|
|
||||||
*bsd*)
|
|
||||||
bsd=true
|
|
||||||
AC_MSG_WARN("Unknown BSD variant, tinc might not compile or work!")
|
|
||||||
AC_DEFINE(HAVE_BSD, 1, [Unknown BSD variant])
|
|
||||||
;;
|
|
||||||
*cygwin*)
|
|
||||||
cygwin=true
|
|
||||||
AC_DEFINE(HAVE_CYGWIN, 1, [Cygwin])
|
|
||||||
;;
|
|
||||||
*mingw*)
|
|
||||||
mingw=true
|
|
||||||
AC_DEFINE(HAVE_MINGW, 1, [MinGW])
|
|
||||||
LIBS="$LIBS -lws2_32 -lgdi32 -lcrypt32"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AC_MSG_ERROR("Unknown operating system.")
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(uml,
|
|
||||||
AS_HELP_STRING([--enable-uml], [enable support for User Mode Linux]),
|
|
||||||
[ AS_IF([test "x$enable_uml" = "xyes"],
|
|
||||||
[ AC_DEFINE(ENABLE_UML, 1, [Support for UML])
|
|
||||||
uml=true
|
|
||||||
],
|
|
||||||
[uml=false])
|
|
||||||
],
|
|
||||||
[uml=false]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(vde,
|
|
||||||
AS_HELP_STRING([--enable-vde], [enable support for Virtual Distributed Ethernet]),
|
|
||||||
[ AS_IF([test "x$enable_vde" = "xyes"],
|
|
||||||
[ AC_CHECK_HEADERS(libvdeplug_dyn.h, [], [AC_MSG_ERROR([VDE plug header files not found.]); break])
|
|
||||||
AC_DEFINE(ENABLE_VDE, 1, [Support for VDE])
|
|
||||||
vde=true
|
|
||||||
],
|
|
||||||
[vde=false])
|
|
||||||
],
|
|
||||||
[vde=false]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(tunemu,
|
|
||||||
AS_HELP_STRING([--enable-tunemu], [enable support for the tunemu driver]),
|
|
||||||
[ AS_IF([test "x$enable_tunemu" = "xyes"],
|
|
||||||
[ AC_DEFINE(ENABLE_TUNEMU, 1, [Support for tunemu])
|
|
||||||
tunemu=true
|
|
||||||
],
|
|
||||||
[tunemu=false])
|
|
||||||
],
|
|
||||||
[tunemu=false]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_ARG_WITH(windows2000,
|
|
||||||
AS_HELP_STRING([--with-windows2000], [compile with support for Windows 2000. This disables support for tunneling over existing IPv6 networks.]),
|
|
||||||
[ AS_IF([test "x$with_windows2000" = "xyes"],
|
|
||||||
[AC_DEFINE(WITH_WINDOWS2000, 1, [Compile with support for Windows 2000])])
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_ARG_WITH(systemd,
|
|
||||||
AS_HELP_STRING([--with-systemd@<:@=DIR@:>@], [install systemd service files @<:@to DIR if specified@:>@]),
|
|
||||||
[ systemd=true; systemd_path="$with_systemd" ],
|
|
||||||
[ systemd=false ]
|
|
||||||
)
|
|
||||||
|
|
||||||
AS_IF([test "x$with_systemd" = "xyes"], [systemd_path="\${libdir}/systemd/system"],
|
|
||||||
[AS_IF([test "x$with_systemd" = "xno"], [systemd=false])])
|
|
||||||
|
|
||||||
AC_SUBST(systemd_path, $systemd_path)
|
|
||||||
|
|
||||||
AM_CONDITIONAL(LINUX, test "$linux" = true)
|
|
||||||
AM_CONDITIONAL(BSD, test "$bsd" = true)
|
|
||||||
AM_CONDITIONAL(SOLARIS, test "$solaris" = true)
|
|
||||||
AM_CONDITIONAL(MINGW, test "$mingw" = true)
|
|
||||||
AM_CONDITIONAL(CYGWIN, test "$cygwin" = true)
|
|
||||||
AM_CONDITIONAL(UML, test "$uml" = true)
|
|
||||||
AM_CONDITIONAL(VDE, test "$vde" = true)
|
|
||||||
AM_CONDITIONAL(TUNEMU, test "$tunemu" = true)
|
|
||||||
AM_CONDITIONAL(WITH_SYSTEMD, test "$systemd" = true)
|
|
||||||
|
|
||||||
AC_CACHE_SAVE
|
|
||||||
|
|
||||||
if test -d /sw/include ; then
|
|
||||||
CPPFLAGS="$CPPFLAGS -I/sw/include"
|
|
||||||
fi
|
|
||||||
if test -d /sw/lib ; then
|
|
||||||
LIBS="$LIBS -L/sw/lib"
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Compiler hardening flags
|
|
||||||
dnl No -fstack-protector-all because it doesn't work on all platforms or architectures.
|
|
||||||
|
|
||||||
AX_CFLAGS_WARN_ALL(CFLAGS)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE([hardening], AS_HELP_STRING([--disable-hardening], [disable compiler and linker hardening flags]))
|
|
||||||
AS_IF([test "x$enable_hardening" != "xno"],
|
|
||||||
[AX_CHECK_COMPILE_FLAG([-DFORTIFY_SOURCE=2], [CPPFLAGS="$CPPFLAGS -DFORTIFY_SOURCE=2"])
|
|
||||||
AX_CHECK_COMPILE_FLAG([-fwrapv], [CPPFLAGS="$CPPFLAGS -fwrapv"],
|
|
||||||
AX_CHECK_COMPILE_FLAG([-fno-strict-overflow], [CPPFLAGS="$CPPFLAGS -fno-strict-overflow"]))
|
|
||||||
case $host_os in
|
|
||||||
*mingw*)
|
|
||||||
AX_CHECK_LINK_FLAG([-Wl,--dynamicbase], [LDFLAGS="$LDFLAGS -Wl,--dynamicbase"])
|
|
||||||
AX_CHECK_LINK_FLAG([-Wl,--nxcompat], [LDFLAGS="$LDFLAGS -Wl,--nxcompat"])
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AX_CHECK_COMPILE_FLAG([-fPIE], [CPPFLAGS="$CPPFLAGS -fPIE"])
|
|
||||||
AX_CHECK_LINK_FLAG([-pie], [LDFLAGS="$LDFLAGS -pie"])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
AX_CHECK_LINK_FLAG([-Wl,-z,relro], [LDFLAGS="$LDFLAGS -Wl,-z,relro"])
|
|
||||||
AX_CHECK_LINK_FLAG([-Wl,-z,now], [LDFLAGS="$LDFLAGS -Wl,-z,now"])
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
dnl Checks for libraries.
|
|
||||||
|
|
||||||
dnl Checks for header files.
|
|
||||||
dnl We do this in multiple stages, because unlike Linux all the other operating systems really suck and don't include their own dependencies.
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([syslog.h sys/file.h sys/ioctl.h sys/mman.h sys/param.h sys/resource.h sys/socket.h sys/time.h sys/uio.h sys/wait.h netdb.h arpa/inet.h arpa/nameser.h dirent.h getopt.h])
|
|
||||||
AC_CHECK_HEADERS([net/if.h net/if_types.h linux/if_tun.h net/if_tun.h net/if_utun.h net/tun/if_tun.h net/if_tap.h net/tap/if_tap.h net/ethernet.h net/if_arp.h netinet/in_systm.h netinet/in.h netinet/in6.h netpacket/packet.h],
|
|
||||||
[], [], [#include "$srcdir/src/have.h"]
|
|
||||||
)
|
|
||||||
AC_CHECK_HEADERS([netinet/if_ether.h netinet/ip.h netinet/ip6.h resolv.h],
|
|
||||||
[], [], [#include "$srcdir/src/have.h"]
|
|
||||||
)
|
|
||||||
AC_CHECK_HEADERS([netinet/tcp.h netinet/ip_icmp.h netinet/icmp6.h],
|
|
||||||
[], [], [#include "$srcdir/src/have.h"]
|
|
||||||
)
|
|
||||||
|
|
||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
|
||||||
AC_TYPE_PID_T
|
|
||||||
|
|
||||||
tinc_ATTRIBUTE(__malloc__)
|
|
||||||
|
|
||||||
AC_CHECK_TYPES([socklen_t, struct ether_header, struct arphdr, struct ether_arp, struct in_addr, struct addrinfo, struct ip, struct icmp, struct in6_addr, struct sockaddr_in6, struct ip6_hdr, struct icmp6_hdr, struct nd_neighbor_solicit, struct nd_opt_hdr], , ,
|
|
||||||
[#include "$srcdir/src/have.h"]
|
|
||||||
)
|
|
||||||
|
|
||||||
dnl Checks for library functions.
|
|
||||||
AC_TYPE_SIGNAL
|
|
||||||
AC_CHECK_FUNCS([asprintf daemon fchmod flock fork gettimeofday mlockall pselect putenv strsignal system unsetenv usleep vsyslog devname fdevname],
|
|
||||||
[], [], [#include "$srcdir/src/have.h"]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_CHECK_FUNC(getopt_long, [getopt=true; AC_DEFINE(HAVE_GETOPT_LONG, 1, [getopt_long()])], [getopt=false])
|
|
||||||
AM_CONDITIONAL(GETOPT, test "$getopt" = true)
|
|
||||||
|
|
||||||
dnl Support for SunOS
|
|
||||||
|
|
||||||
AC_CHECK_FUNC(socket, [], [
|
|
||||||
AC_CHECK_LIB(socket, connect)
|
|
||||||
])
|
|
||||||
AC_CHECK_FUNC(gethostbyname, [], [
|
|
||||||
AC_CHECK_LIB(nsl, gethostbyname)
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_CHECK_DECLS([freeaddrinfo, gai_strerror, getaddrinfo, getnameinfo],
|
|
||||||
[], [], [#include "$srcdir/src/have.h"]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_CHECK_DECLS([res_init], [AC_CHECK_LIB(resolv, res_init)], [], [
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <resolv.h>
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_CACHE_SAVE
|
|
||||||
|
|
||||||
dnl These are defined in files in m4/
|
|
||||||
|
|
||||||
tinc_ZLIB
|
|
||||||
tinc_LZO
|
|
||||||
tinc_OPENSSL
|
|
||||||
|
|
||||||
dnl Check if support for jumbograms is requested
|
|
||||||
AC_ARG_ENABLE(jumbograms,
|
|
||||||
AS_HELP_STRING([--enable-jumbograms], [enable support for jumbograms (packets up to 9000 bytes)]),
|
|
||||||
[ AS_IF([test "x$enable_jumbograms" = "xyes"],
|
|
||||||
[ AC_DEFINE(ENABLE_JUMBOGRAMS, 1, [Support for jumbograms (packets up to 9000 bytes)]) ])
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
dnl Ensure runstatedir is set if we are using a version of autoconf that does not suppport it
|
|
||||||
if test "x$runstatedir" = "x"; then
|
|
||||||
AC_SUBST([runstatedir], ['${localstatedir}/run'])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile systemd/Makefile])
|
|
||||||
|
|
||||||
AC_OUTPUT
|
|
177
configure.in
Normal file
177
configure.in
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
|
AC_PREREQ(2.61)
|
||||||
|
AC_INIT
|
||||||
|
AC_CONFIG_SRCDIR([src/tincd.c])
|
||||||
|
AC_GNU_SOURCE
|
||||||
|
AM_INIT_AUTOMAKE(tinc, 1.1pre2)
|
||||||
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
AM_MAINTAINER_MODE
|
||||||
|
|
||||||
|
# Enable GNU extensions.
|
||||||
|
# Define this here, not in acconfig's @TOP@ section, since definitions
|
||||||
|
# in the latter don't make it into the configure-time tests.
|
||||||
|
AC_GNU_SOURCE
|
||||||
|
AC_DEFINE([__USE_BSD], 1, [Enable BSD extensions])
|
||||||
|
|
||||||
|
dnl Checks for programs.
|
||||||
|
AC_PROG_CC_C99
|
||||||
|
AC_PROG_CPP
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
AC_PROG_LN_S
|
||||||
|
AC_PROG_RANLIB
|
||||||
|
|
||||||
|
dnl Check and set OS
|
||||||
|
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
|
||||||
|
case $host_os in
|
||||||
|
*linux*)
|
||||||
|
AC_DEFINE(HAVE_LINUX, 1, [Linux])
|
||||||
|
[ rm -f src/device.c; ln -sf linux/device.c src/device.c ]
|
||||||
|
;;
|
||||||
|
*freebsd*)
|
||||||
|
AC_DEFINE(HAVE_FREEBSD, 1, [FreeBSD])
|
||||||
|
[ rm -f src/device.c; ln -sf bsd/device.c src/device.c ]
|
||||||
|
;;
|
||||||
|
*darwin*)
|
||||||
|
AC_DEFINE(HAVE_DARWIN, 1, [Darwin (MacOS/X)])
|
||||||
|
[ rm -f src/device.c; ln -sf bsd/device.c src/device.c ]
|
||||||
|
;;
|
||||||
|
*solaris*)
|
||||||
|
AC_DEFINE(HAVE_SOLARIS, 1, [Solaris/SunOS])
|
||||||
|
[ rm -f src/device.c; ln -sf solaris/device.c src/device.c ]
|
||||||
|
;;
|
||||||
|
*openbsd*)
|
||||||
|
AC_DEFINE(HAVE_OPENBSD, 1, [OpenBSD])
|
||||||
|
[ rm -f src/device.c; ln -sf bsd/device.c src/device.c ]
|
||||||
|
;;
|
||||||
|
*netbsd*)
|
||||||
|
AC_DEFINE(HAVE_NETBSD, 1, [NetBSD])
|
||||||
|
[ rm -f src/device.c; ln -sf bsd/device.c src/device.c ]
|
||||||
|
;;
|
||||||
|
*dragonfly*)
|
||||||
|
AC_DEFINE(HAVE_DRAGONFLY, 1, [DragonFly])
|
||||||
|
[ rm -f src/device.c; ln -sf bsd/device.c src/device.c ]
|
||||||
|
;;
|
||||||
|
*bsd*)
|
||||||
|
AC_MSG_WARN("Unknown BSD variant, tinc might not compile or work!")
|
||||||
|
AC_DEFINE(HAVE_BSD, 1, [Unknown BSD variant])
|
||||||
|
[ rm -f src/device.c; ln -sf bsd/device.c src/device.c ]
|
||||||
|
;;
|
||||||
|
*cygwin*)
|
||||||
|
AC_DEFINE(HAVE_CYGWIN, 1, [Cygwin])
|
||||||
|
[ rm -f src/device.c; ln -sf cygwin/device.c src/device.c ]
|
||||||
|
;;
|
||||||
|
*mingw*)
|
||||||
|
AC_DEFINE(HAVE_MINGW, 1, [MinGW])
|
||||||
|
[ rm -f src/device.c; cp -f src/mingw/device.c src/device.c ]
|
||||||
|
LIBS="$LIBS -lws2_32 -lgdi32 -lcrypt32"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
AC_MSG_ERROR("Unknown operating system.")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(tunemu,
|
||||||
|
AS_HELP_STRING([--enable-tunemu], [enable support for the tunemu driver]),
|
||||||
|
[ AC_DEFINE(ENABLE_TUNEMU, 1, [Support for tunemu])
|
||||||
|
tunemu=true
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_ARG_WITH(windows2000,
|
||||||
|
AS_HELP_STRING([--with-windows2000], [compile with support for Windows 2000. This disables support for tunneling over existing IPv6 networks.]),
|
||||||
|
[AC_DEFINE(WITH_WINDOWS2000, 1, [Compile with support for Windows 2000])]
|
||||||
|
)
|
||||||
|
|
||||||
|
AM_CONDITIONAL(TUNEMU, test "$tunemu" = true)
|
||||||
|
|
||||||
|
AC_CACHE_SAVE
|
||||||
|
|
||||||
|
if test -d /sw/include ; then
|
||||||
|
CPPFLAGS="$CPPFLAGS -I/sw/include"
|
||||||
|
fi
|
||||||
|
if test -d /sw/lib ; then
|
||||||
|
LIBS="$LIBS -L/sw/lib"
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Checks for header files.
|
||||||
|
dnl We do this in multiple stages, because unlike Linux all the other operating systems really suck and don't include their own dependencies.
|
||||||
|
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_HEADERS([stdbool.h syslog.h sys/file.h sys/ioctl.h sys/mman.h sys/param.h sys/resource.h sys/socket.h sys/time.h sys/uio.h sys/un.h sys/wait.h netdb.h arpa/inet.h dirent.h])
|
||||||
|
AC_CHECK_HEADERS([net/if.h net/if_types.h linux/if_tun.h net/if_tun.h net/tun/if_tun.h net/if_tap.h net/tap/if_tap.h net/ethernet.h net/if_arp.h netinet/in_systm.h netinet/in.h netinet/in6.h time.h],
|
||||||
|
[], [], [#include "have.h"]
|
||||||
|
)
|
||||||
|
AC_CHECK_HEADERS([netinet/if_ether.h netinet/ip.h netinet/ip6.h],
|
||||||
|
[], [], [#include "have.h"]
|
||||||
|
)
|
||||||
|
AC_CHECK_HEADERS([netinet/tcp.h netinet/ip_icmp.h netinet/icmp6.h],
|
||||||
|
[], [], [#include "have.h"]
|
||||||
|
)
|
||||||
|
|
||||||
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
AC_C_CONST
|
||||||
|
AC_C_VOLATILE
|
||||||
|
AC_TYPE_PID_T
|
||||||
|
AC_TYPE_SIZE_T
|
||||||
|
AC_HEADER_TIME
|
||||||
|
AC_STRUCT_TM
|
||||||
|
|
||||||
|
tinc_ATTRIBUTE(__malloc__)
|
||||||
|
|
||||||
|
AC_CHECK_TYPES([socklen_t, struct ether_header, struct arphdr, struct ether_arp, struct in_addr, struct addrinfo, struct ip, struct icmp, struct in6_addr, struct sockaddr_in6, struct ip6_hdr, struct icmp6_hdr, struct nd_neighbor_solicit, struct nd_opt_hdr], , ,
|
||||||
|
[#include "have.h"]
|
||||||
|
)
|
||||||
|
|
||||||
|
dnl Checks for library functions.
|
||||||
|
AC_TYPE_SIGNAL
|
||||||
|
AC_CHECK_FUNCS([asprintf daemon fchmod flock ftime fork get_current_dir_name gettimeofday mlockall putenv random select strdup strerror strsignal strtol system time usleep unsetenv vsyslog writev],
|
||||||
|
[], [], [#include "have.h"]
|
||||||
|
)
|
||||||
|
|
||||||
|
dnl Support for SunOS
|
||||||
|
|
||||||
|
AC_CHECK_FUNC(socket, [], [
|
||||||
|
AC_CHECK_LIB(socket, connect)
|
||||||
|
])
|
||||||
|
AC_CHECK_FUNC(gethostbyname, [], [
|
||||||
|
AC_CHECK_LIB(nsl, gethostbyname)
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_CHECK_DECLS([freeaddrinfo, gai_strerror, getaddrinfo, getnameinfo],
|
||||||
|
[], [], [#include "have.h"]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_CACHE_SAVE
|
||||||
|
|
||||||
|
dnl These are defined in files in m4/
|
||||||
|
|
||||||
|
AC_ARG_WITH(libgcrypt, AC_HELP_STRING([--with-libgcrypt], [enable use of libgcrypt instead of OpenSSL])], [])
|
||||||
|
|
||||||
|
tinc_CURSES
|
||||||
|
tinc_LIBEVENT
|
||||||
|
tinc_ZLIB
|
||||||
|
tinc_LZO
|
||||||
|
|
||||||
|
if test "$with_libgcrypt" = yes; then
|
||||||
|
AM_PATH_LIBGCRYPT([1.4.0], [], [])
|
||||||
|
ln -sf gcrypt/cipher.c gcrypt/cipher.h gcrypt/crypto.c gcrypt/crypto.h gcrypt/digest.c gcrypt/digest.h gcrypt/ecdh.c gcrypt/ecdh.h gcrypt/ecdsa.c gcrypt/ecdsa.h gcrypt/ecdsagen.c gcrypt/ecdsagen.h gcrypt/prf.c gcrypt/prf.h gcrypt/rsa.c gcrypt/rsa.h gcrypt/rsagen.c gcrypt/rsagen.h src/
|
||||||
|
else
|
||||||
|
tinc_OPENSSL
|
||||||
|
ln -sf openssl/cipher.c openssl/cipher.h openssl/crypto.c openssl/crypto.h openssl/digest.c openssl/digest.h openssl/ecdh.c openssl/ecdh.h openssl/ecdsa.c openssl/ecdsa.h openssl/ecdsagen.c openssl/ecdsagen.h openssl/prf.c openssl/prf.h openssl/rsa.c openssl/rsa.h openssl/rsagen.c openssl/rsagen.h src/
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
dnl Check if support for jumbograms is requested
|
||||||
|
AC_ARG_ENABLE(jumbograms,
|
||||||
|
AS_HELP_STRING([--enable-jumbograms], [enable support for jumbograms (packets up to 9000 bytes)]),
|
||||||
|
[ AC_DEFINE(ENABLE_JUMBOGRAMS, 1, [Support for jumbograms (packets up to 9000 bytes)]) ]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_SUBST(INCLUDES)
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile m4/Makefile gui/Makefile])
|
||||||
|
|
||||||
|
AC_OUTPUT
|
429
depcomp
429
depcomp
|
@ -1,9 +1,10 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# depcomp - compile a program generating dependencies as side-effects
|
# depcomp - compile a program generating dependencies as side-effects
|
||||||
|
|
||||||
scriptversion=2018-03-07.03; # UTC
|
scriptversion=2009-04-28.21; # UTC
|
||||||
|
|
||||||
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
|
||||||
|
# Software Foundation, Inc.
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -16,7 +17,7 @@ scriptversion=2018-03-07.03; # UTC
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
# As a special exception to the GNU General Public License, if you
|
||||||
# distribute this file as part of a program that contains a
|
# distribute this file as part of a program that contains a
|
||||||
|
@ -27,7 +28,7 @@ scriptversion=2018-03-07.03; # UTC
|
||||||
|
|
||||||
case $1 in
|
case $1 in
|
||||||
'')
|
'')
|
||||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
||||||
exit 1;
|
exit 1;
|
||||||
;;
|
;;
|
||||||
-h | --h*)
|
-h | --h*)
|
||||||
|
@ -39,11 +40,11 @@ as side-effects.
|
||||||
|
|
||||||
Environment variables:
|
Environment variables:
|
||||||
depmode Dependency tracking mode.
|
depmode Dependency tracking mode.
|
||||||
source Source file read by 'PROGRAMS ARGS'.
|
source Source file read by `PROGRAMS ARGS'.
|
||||||
object Object file output by 'PROGRAMS ARGS'.
|
object Object file output by `PROGRAMS ARGS'.
|
||||||
DEPDIR directory where to store dependencies.
|
DEPDIR directory where to store dependencies.
|
||||||
depfile Dependency file to output.
|
depfile Dependency file to output.
|
||||||
tmpdepfile Temporary file to use when outputting dependencies.
|
tmpdepfile Temporary file to use when outputing dependencies.
|
||||||
libtool Whether libtool is used (yes/no).
|
libtool Whether libtool is used (yes/no).
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
@ -56,66 +57,6 @@ EOF
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Get the directory component of the given path, and save it in the
|
|
||||||
# global variables '$dir'. Note that this directory component will
|
|
||||||
# be either empty or ending with a '/' character. This is deliberate.
|
|
||||||
set_dir_from ()
|
|
||||||
{
|
|
||||||
case $1 in
|
|
||||||
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
|
|
||||||
*) dir=;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# Get the suffix-stripped basename of the given path, and save it the
|
|
||||||
# global variable '$base'.
|
|
||||||
set_base_from ()
|
|
||||||
{
|
|
||||||
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
|
|
||||||
}
|
|
||||||
|
|
||||||
# If no dependency file was actually created by the compiler invocation,
|
|
||||||
# we still have to create a dummy depfile, to avoid errors with the
|
|
||||||
# Makefile "include basename.Plo" scheme.
|
|
||||||
make_dummy_depfile ()
|
|
||||||
{
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Factor out some common post-processing of the generated depfile.
|
|
||||||
# Requires the auxiliary global variable '$tmpdepfile' to be set.
|
|
||||||
aix_post_process_depfile ()
|
|
||||||
{
|
|
||||||
# If the compiler actually managed to produce a dependency file,
|
|
||||||
# post-process it.
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
# Each line is of the form 'foo.o: dependency.h'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# $object: dependency.h
|
|
||||||
# and one to simply output
|
|
||||||
# dependency.h:
|
|
||||||
# which is needed to avoid the deleted-header problem.
|
|
||||||
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
|
|
||||||
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
|
|
||||||
} > "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
else
|
|
||||||
make_dummy_depfile
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# A tabulation character.
|
|
||||||
tab=' '
|
|
||||||
# A newline character.
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
# Character ranges might be problematic outside the C locale.
|
|
||||||
# These definitions help.
|
|
||||||
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
|
||||||
lower=abcdefghijklmnopqrstuvwxyz
|
|
||||||
digits=0123456789
|
|
||||||
alpha=${upper}${lower}
|
|
||||||
|
|
||||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -128,9 +69,6 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||||
|
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
|
|
||||||
# Avoid interferences from the environment.
|
|
||||||
gccflag= dashmflag=
|
|
||||||
|
|
||||||
# Some modes work just like other modes, but use different flags. We
|
# Some modes work just like other modes, but use different flags. We
|
||||||
# parameterize here, but still list the modes in the big case below,
|
# parameterize here, but still list the modes in the big case below,
|
||||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||||
|
@ -152,24 +90,10 @@ if test "$depmode" = msvcmsys; then
|
||||||
# This is just like msvisualcpp but w/o cygpath translation.
|
# This is just like msvisualcpp but w/o cygpath translation.
|
||||||
# Just convert the backslash-escaped backslashes to single forward
|
# Just convert the backslash-escaped backslashes to single forward
|
||||||
# slashes to satisfy depend.m4
|
# slashes to satisfy depend.m4
|
||||||
cygpath_u='sed s,\\\\,/,g'
|
cygpath_u="sed s,\\\\\\\\,/,g"
|
||||||
depmode=msvisualcpp
|
depmode=msvisualcpp
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$depmode" = msvc7msys; then
|
|
||||||
# This is just like msvc7 but w/o cygpath translation.
|
|
||||||
# Just convert the backslash-escaped backslashes to single forward
|
|
||||||
# slashes to satisfy depend.m4
|
|
||||||
cygpath_u='sed s,\\\\,/,g'
|
|
||||||
depmode=msvc7
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = xlc; then
|
|
||||||
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
|
|
||||||
gccflag=-qmakedep=gcc,-MF
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$depmode" in
|
case "$depmode" in
|
||||||
gcc3)
|
gcc3)
|
||||||
## gcc 3 implements dependency tracking that does exactly what
|
## gcc 3 implements dependency tracking that does exactly what
|
||||||
|
@ -190,7 +114,8 @@ gcc3)
|
||||||
done
|
done
|
||||||
"$@"
|
"$@"
|
||||||
stat=$?
|
stat=$?
|
||||||
if test $stat -ne 0; then
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
exit $stat
|
exit $stat
|
||||||
fi
|
fi
|
||||||
|
@ -198,17 +123,13 @@ gcc3)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
gcc)
|
gcc)
|
||||||
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
|
|
||||||
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
|
|
||||||
## (see the conditional assignment to $gccflag above).
|
|
||||||
## There are various ways to get dependency output from gcc. Here's
|
## There are various ways to get dependency output from gcc. Here's
|
||||||
## why we pick this rather obscure method:
|
## why we pick this rather obscure method:
|
||||||
## - Don't want to use -MD because we'd like the dependencies to end
|
## - Don't want to use -MD because we'd like the dependencies to end
|
||||||
## up in a subdir. Having to rename by hand is ugly.
|
## up in a subdir. Having to rename by hand is ugly.
|
||||||
## (We might end up doing this anyway to support other compilers.)
|
## (We might end up doing this anyway to support other compilers.)
|
||||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||||
## -MM, not -M (despite what the docs say). Also, it might not be
|
## -MM, not -M (despite what the docs say).
|
||||||
## supported by the other compilers which use the 'gcc' depmode.
|
|
||||||
## - Using -M directly means running the compiler twice (even worse
|
## - Using -M directly means running the compiler twice (even worse
|
||||||
## than renaming).
|
## than renaming).
|
||||||
if test -z "$gccflag"; then
|
if test -z "$gccflag"; then
|
||||||
|
@ -216,31 +137,31 @@ gcc)
|
||||||
fi
|
fi
|
||||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||||
stat=$?
|
stat=$?
|
||||||
if test $stat -ne 0; then
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
exit $stat
|
exit $stat
|
||||||
fi
|
fi
|
||||||
rm -f "$depfile"
|
rm -f "$depfile"
|
||||||
echo "$object : \\" > "$depfile"
|
echo "$object : \\" > "$depfile"
|
||||||
# The second -e expression handles DOS-style file names with drive
|
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
||||||
# letters.
|
## The second -e expression handles DOS-style file names with drive letters.
|
||||||
sed -e 's/^[^:]*: / /' \
|
sed -e 's/^[^:]*: / /' \
|
||||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||||
## This next piece of magic avoids the "deleted header file" problem.
|
## This next piece of magic avoids the `deleted header file' problem.
|
||||||
## The problem is that when a header file which appears in a .P file
|
## The problem is that when a header file which appears in a .P file
|
||||||
## is deleted, the dependency causes make to die (because there is
|
## is deleted, the dependency causes make to die (because there is
|
||||||
## typically no way to rebuild the header). We avoid this by adding
|
## typically no way to rebuild the header). We avoid this by adding
|
||||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||||
## this for us directly.
|
## this for us directly.
|
||||||
## Some versions of gcc put a space before the ':'. On the theory
|
tr ' ' '
|
||||||
|
' < "$tmpdepfile" |
|
||||||
|
## Some versions of gcc put a space before the `:'. On the theory
|
||||||
## that the space means something, we add a space to the output as
|
## that the space means something, we add a space to the output as
|
||||||
## well. hp depmode also adds that space, but also prefixes the VPATH
|
## well.
|
||||||
## to the object. Take care to not repeat it in the output.
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
@ -258,7 +179,8 @@ sgi)
|
||||||
"$@" -MDupdate "$tmpdepfile"
|
"$@" -MDupdate "$tmpdepfile"
|
||||||
fi
|
fi
|
||||||
stat=$?
|
stat=$?
|
||||||
if test $stat -ne 0; then
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
exit $stat
|
exit $stat
|
||||||
fi
|
fi
|
||||||
|
@ -266,41 +188,43 @@ sgi)
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||||
echo "$object : \\" > "$depfile"
|
echo "$object : \\" > "$depfile"
|
||||||
|
|
||||||
# Clip off the initial element (the dependent). Don't try to be
|
# Clip off the initial element (the dependent). Don't try to be
|
||||||
# clever and replace this with sed code, as IRIX sed won't handle
|
# clever and replace this with sed code, as IRIX sed won't handle
|
||||||
# lines with more than a fixed number of characters (4096 in
|
# lines with more than a fixed number of characters (4096 in
|
||||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||||
# the IRIX cc adds comments like '#:fec' to the end of the
|
# the IRIX cc adds comments like `#:fec' to the end of the
|
||||||
# dependency line.
|
# dependency line.
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
tr ' ' '
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
' < "$tmpdepfile" \
|
||||||
| tr "$nl" ' ' >> "$depfile"
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
||||||
|
tr '
|
||||||
|
' ' ' >> "$depfile"
|
||||||
echo >> "$depfile"
|
echo >> "$depfile"
|
||||||
|
|
||||||
# The second pass generates a dummy entry for each header file.
|
# The second pass generates a dummy entry for each header file.
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
tr ' ' '
|
||||||
|
' < "$tmpdepfile" \
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||||
>> "$depfile"
|
>> "$depfile"
|
||||||
else
|
else
|
||||||
make_dummy_depfile
|
# The sourcefile does not contain any dependencies, so just
|
||||||
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
|
# "include basename.Plo" scheme.
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
fi
|
fi
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
xlc)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix)
|
aix)
|
||||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||||
# in a .u file. In older versions, this file always lives in the
|
# in a .u file. In older versions, this file always lives in the
|
||||||
# current directory. Also, the AIX compiler puts '$object:' at the
|
# current directory. Also, the AIX compiler puts `$object:' at the
|
||||||
# start of each line; $object doesn't have directory information.
|
# start of each line; $object doesn't have directory information.
|
||||||
# Version 6 uses the directory in both cases.
|
# Version 6 uses the directory in both cases.
|
||||||
set_dir_from "$object"
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
set_base_from "$object"
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
if test "$libtool" = yes; then
|
if test "$libtool" = yes; then
|
||||||
tmpdepfile1=$dir$base.u
|
tmpdepfile1=$dir$base.u
|
||||||
tmpdepfile2=$base.u
|
tmpdepfile2=$base.u
|
||||||
|
@ -313,7 +237,9 @@ aix)
|
||||||
"$@" -M
|
"$@" -M
|
||||||
fi
|
fi
|
||||||
stat=$?
|
stat=$?
|
||||||
if test $stat -ne 0; then
|
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
exit $stat
|
exit $stat
|
||||||
fi
|
fi
|
||||||
|
@ -322,100 +248,44 @@ aix)
|
||||||
do
|
do
|
||||||
test -f "$tmpdepfile" && break
|
test -f "$tmpdepfile" && break
|
||||||
done
|
done
|
||||||
aix_post_process_depfile
|
if test -f "$tmpdepfile"; then
|
||||||
;;
|
# Each line is of the form `foo.o: dependent.h'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
tcc)
|
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||||
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
# FIXME: That version still under development at the moment of writing.
|
# That's a tab and a space in the [].
|
||||||
# Make that this statement remains true also for stable, released
|
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
# versions.
|
else
|
||||||
# It will wrap lines (doesn't matter whether long or short) with a
|
# The sourcefile does not contain any dependencies, so just
|
||||||
# trailing '\', as in:
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
#
|
# "include basename.Plo" scheme.
|
||||||
# foo.o : \
|
echo "#dummy" > "$depfile"
|
||||||
# foo.c \
|
|
||||||
# foo.h \
|
|
||||||
#
|
|
||||||
# It will put a trailing '\' even on the last line, and will use leading
|
|
||||||
# spaces rather than leading tabs (at least since its commit 0394caf7
|
|
||||||
# "Emit spaces for -MD").
|
|
||||||
"$@" -MD -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
fi
|
||||||
rm -f "$depfile"
|
|
||||||
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
|
|
||||||
# We have to change lines of the first kind to '$object: \'.
|
|
||||||
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
|
|
||||||
# And for each line of the second kind, we have to emit a 'dep.h:'
|
|
||||||
# dummy dependency, to avoid the deleted-header problem.
|
|
||||||
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
## The order of this option in the case statement is important, since the
|
icc)
|
||||||
## shell code in configure will try each of these formats in the order
|
# Intel's C compiler understands `-MD -MF file'. However on
|
||||||
## listed in this file. A plain '-MD' option would be understood by many
|
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
||||||
## compilers, so we must ensure this comes after the gcc and icc options.
|
# ICC 7.0 will fill foo.d with something like
|
||||||
pgcc)
|
# foo.o: sub/foo.c
|
||||||
# Portland's C compiler understands '-MD'.
|
# foo.o: sub/foo.h
|
||||||
# Will always output deps to 'file.d' where file is the root name of the
|
# which is wrong. We want:
|
||||||
# source file under compilation, even if file resides in a subdirectory.
|
# sub/foo.o: sub/foo.c
|
||||||
# The object file name does not affect the name of the '.d' file.
|
# sub/foo.o: sub/foo.h
|
||||||
# pgcc 10.2 will output
|
# sub/foo.c:
|
||||||
|
# sub/foo.h:
|
||||||
|
# ICC 7.1 will output
|
||||||
# foo.o: sub/foo.c sub/foo.h
|
# foo.o: sub/foo.c sub/foo.h
|
||||||
# and will wrap long lines using '\' :
|
# and will wrap long lines using \ :
|
||||||
# foo.o: sub/foo.c ... \
|
# foo.o: sub/foo.c ... \
|
||||||
# sub/foo.h ... \
|
# sub/foo.h ... \
|
||||||
# ...
|
# ...
|
||||||
set_dir_from "$object"
|
|
||||||
# Use the source, not the object, to determine the base name, since
|
|
||||||
# that's sadly what pgcc will do too.
|
|
||||||
set_base_from "$source"
|
|
||||||
tmpdepfile=$base.d
|
|
||||||
|
|
||||||
# For projects that build the same source file twice into different object
|
"$@" -MD -MF "$tmpdepfile"
|
||||||
# files, the pgcc approach of using the *source* file root name can cause
|
|
||||||
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
|
||||||
# the same $tmpdepfile.
|
|
||||||
lockdir=$base.d-lock
|
|
||||||
trap "
|
|
||||||
echo '$0: caught signal, cleaning up...' >&2
|
|
||||||
rmdir '$lockdir'
|
|
||||||
exit 1
|
|
||||||
" 1 2 13 15
|
|
||||||
numtries=100
|
|
||||||
i=$numtries
|
|
||||||
while test $i -gt 0; do
|
|
||||||
# mkdir is a portable test-and-set.
|
|
||||||
if mkdir "$lockdir" 2>/dev/null; then
|
|
||||||
# This process acquired the lock.
|
|
||||||
"$@" -MD
|
|
||||||
stat=$?
|
stat=$?
|
||||||
# Release the lock.
|
if test $stat -eq 0; then :
|
||||||
rmdir "$lockdir"
|
|
||||||
break
|
|
||||||
else
|
else
|
||||||
# If the lock is being held by a different process, wait
|
|
||||||
# until the winning process is done or we timeout.
|
|
||||||
while test -d "$lockdir" && test $i -gt 0; do
|
|
||||||
sleep 1
|
|
||||||
i=`expr $i - 1`
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
i=`expr $i - 1`
|
|
||||||
done
|
|
||||||
trap - 1 2 13 15
|
|
||||||
if test $i -le 0; then
|
|
||||||
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
|
||||||
echo "$0: check lockdir '$lockdir'" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
exit $stat
|
exit $stat
|
||||||
fi
|
fi
|
||||||
|
@ -427,8 +297,8 @@ pgcc)
|
||||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
sed -e 's/$/ :/' >> "$depfile"
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
@ -439,8 +309,9 @@ hp2)
|
||||||
# 'foo.d', which lands next to the object file, wherever that
|
# 'foo.d', which lands next to the object file, wherever that
|
||||||
# happens to be.
|
# happens to be.
|
||||||
# Much of this is similar to the tru64 case; see comments there.
|
# Much of this is similar to the tru64 case; see comments there.
|
||||||
set_dir_from "$object"
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
set_base_from "$object"
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
if test "$libtool" = yes; then
|
if test "$libtool" = yes; then
|
||||||
tmpdepfile1=$dir$base.d
|
tmpdepfile1=$dir$base.d
|
||||||
tmpdepfile2=$dir.libs/$base.d
|
tmpdepfile2=$dir.libs/$base.d
|
||||||
|
@ -451,7 +322,8 @@ hp2)
|
||||||
"$@" +Maked
|
"$@" +Maked
|
||||||
fi
|
fi
|
||||||
stat=$?
|
stat=$?
|
||||||
if test $stat -ne 0; then
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||||
exit $stat
|
exit $stat
|
||||||
fi
|
fi
|
||||||
|
@ -461,8 +333,8 @@ hp2)
|
||||||
test -f "$tmpdepfile" && break
|
test -f "$tmpdepfile" && break
|
||||||
done
|
done
|
||||||
if test -f "$tmpdepfile"; then
|
if test -f "$tmpdepfile"; then
|
||||||
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||||
# Add 'dependent.h:' lines.
|
# Add `dependent.h:' lines.
|
||||||
sed -ne '2,${
|
sed -ne '2,${
|
||||||
s/^ *//
|
s/^ *//
|
||||||
s/ \\*$//
|
s/ \\*$//
|
||||||
|
@ -470,97 +342,67 @@ hp2)
|
||||||
p
|
p
|
||||||
}' "$tmpdepfile" >> "$depfile"
|
}' "$tmpdepfile" >> "$depfile"
|
||||||
else
|
else
|
||||||
make_dummy_depfile
|
echo "#dummy" > "$depfile"
|
||||||
fi
|
fi
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
tru64)
|
tru64)
|
||||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||||
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
|
||||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||||
# dependencies in 'foo.d' instead, so we check for that too.
|
# dependencies in `foo.d' instead, so we check for that too.
|
||||||
# Subdirectories are respected.
|
# Subdirectories are respected.
|
||||||
set_dir_from "$object"
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
set_base_from "$object"
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
|
||||||
if test "$libtool" = yes; then
|
if test "$libtool" = yes; then
|
||||||
# Libtool generates 2 separate objects for the 2 libraries. These
|
# With Tru64 cc, shared objects can also be used to make a
|
||||||
# two compilations output dependencies in $dir.libs/$base.o.d and
|
# static library. This mechanism is used in libtool 1.4 series to
|
||||||
|
# handle both shared and static libraries in a single compilation.
|
||||||
|
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
||||||
|
#
|
||||||
|
# With libtool 1.5 this exception was removed, and libtool now
|
||||||
|
# generates 2 separate objects for the 2 libraries. These two
|
||||||
|
# compilations output dependencies in $dir.libs/$base.o.d and
|
||||||
# in $dir$base.o.d. We have to check for both files, because
|
# in $dir$base.o.d. We have to check for both files, because
|
||||||
# one of the two compilations can be disabled. We should prefer
|
# one of the two compilations can be disabled. We should prefer
|
||||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||||
# the former would cause a distcleancheck panic.
|
# the former would cause a distcleancheck panic.
|
||||||
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
|
||||||
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
||||||
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||||
"$@" -Wc,-MD
|
"$@" -Wc,-MD
|
||||||
else
|
else
|
||||||
tmpdepfile1=$dir$base.d
|
tmpdepfile1=$dir$base.o.d
|
||||||
tmpdepfile2=$dir$base.d
|
tmpdepfile2=$dir$base.d
|
||||||
tmpdepfile3=$dir$base.d
|
tmpdepfile3=$dir$base.d
|
||||||
|
tmpdepfile4=$dir$base.d
|
||||||
"$@" -MD
|
"$@" -MD
|
||||||
fi
|
fi
|
||||||
|
|
||||||
stat=$?
|
stat=$?
|
||||||
if test $stat -ne 0; then
|
if test $stat -eq 0; then :
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
exit $stat
|
exit $stat
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
do
|
do
|
||||||
test -f "$tmpdepfile" && break
|
test -f "$tmpdepfile" && break
|
||||||
done
|
done
|
||||||
# Same post-processing that is required for AIX mode.
|
if test -f "$tmpdepfile"; then
|
||||||
aix_post_process_depfile
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
;;
|
# That's a tab and a space in the [].
|
||||||
|
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
msvc7)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
showIncludes=-Wc,-showIncludes
|
|
||||||
else
|
else
|
||||||
showIncludes=-showIncludes
|
echo "#dummy" > "$depfile"
|
||||||
fi
|
fi
|
||||||
"$@" $showIncludes > "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
grep -v '^Note: including file: ' "$tmpdepfile"
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
# The first sed program below extracts the file names and escapes
|
|
||||||
# backslashes for cygpath. The second sed program outputs the file
|
|
||||||
# name when reading, but also accumulates all include files in the
|
|
||||||
# hold buffer in order to output them again at the end. This only
|
|
||||||
# works with sed implementations that can handle large buffers.
|
|
||||||
sed < "$tmpdepfile" -n '
|
|
||||||
/^Note: including file: *\(.*\)/ {
|
|
||||||
s//\1/
|
|
||||||
s/\\/\\\\/g
|
|
||||||
p
|
|
||||||
}' | $cygpath_u | sort -u | sed -n '
|
|
||||||
s/ /\\ /g
|
|
||||||
s/\(.*\)/'"$tab"'\1 \\/p
|
|
||||||
s/.\(.*\) \\/\1:/
|
|
||||||
H
|
|
||||||
$ {
|
|
||||||
s/.*/'"$tab"'/
|
|
||||||
G
|
|
||||||
p
|
|
||||||
}' >> "$depfile"
|
|
||||||
echo >> "$depfile" # make sure the fragment doesn't end with a backslash
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvc7msys)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
#nosideeffect)
|
#nosideeffect)
|
||||||
|
@ -580,7 +422,7 @@ dashmstdout)
|
||||||
shift
|
shift
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Remove '-o $object'.
|
# Remove `-o $object'.
|
||||||
IFS=" "
|
IFS=" "
|
||||||
for arg
|
for arg
|
||||||
do
|
do
|
||||||
|
@ -600,18 +442,18 @@ dashmstdout)
|
||||||
done
|
done
|
||||||
|
|
||||||
test -z "$dashmflag" && dashmflag=-M
|
test -z "$dashmflag" && dashmflag=-M
|
||||||
# Require at least two characters before searching for ':'
|
# Require at least two characters before searching for `:'
|
||||||
# in the target name. This is to cope with DOS-style filenames:
|
# in the target name. This is to cope with DOS-style filenames:
|
||||||
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
|
||||||
"$@" $dashmflag |
|
"$@" $dashmflag |
|
||||||
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
|
||||||
rm -f "$depfile"
|
rm -f "$depfile"
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
cat < "$tmpdepfile" > "$depfile"
|
||||||
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
tr ' ' '
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
' < "$tmpdepfile" | \
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
@ -661,15 +503,12 @@ makedepend)
|
||||||
touch "$tmpdepfile"
|
touch "$tmpdepfile"
|
||||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||||
rm -f "$depfile"
|
rm -f "$depfile"
|
||||||
# makedepend may prepend the VPATH from the source file name to the object.
|
cat < "$tmpdepfile" > "$depfile"
|
||||||
# No need to regex-escape $object, excess matching of '.' is harmless.
|
sed '1,2d' "$tmpdepfile" | tr ' ' '
|
||||||
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
' | \
|
||||||
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
sed '1,2d' "$tmpdepfile" \
|
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||||
| tr ' ' "$nl" \
|
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
@ -686,7 +525,7 @@ cpp)
|
||||||
shift
|
shift
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Remove '-o $object'.
|
# Remove `-o $object'.
|
||||||
IFS=" "
|
IFS=" "
|
||||||
for arg
|
for arg
|
||||||
do
|
do
|
||||||
|
@ -705,10 +544,10 @@ cpp)
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
"$@" -E \
|
"$@" -E |
|
||||||
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
||||||
| sed '$ s: \\$::' > "$tmpdepfile"
|
sed '$ s: \\$::' > "$tmpdepfile"
|
||||||
rm -f "$depfile"
|
rm -f "$depfile"
|
||||||
echo "$object : \\" > "$depfile"
|
echo "$object : \\" > "$depfile"
|
||||||
cat < "$tmpdepfile" >> "$depfile"
|
cat < "$tmpdepfile" >> "$depfile"
|
||||||
|
@ -755,8 +594,8 @@ msvisualcpp)
|
||||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
||||||
rm -f "$depfile"
|
rm -f "$depfile"
|
||||||
echo "$object : \\" > "$depfile"
|
echo "$object : \\" > "$depfile"
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
|
||||||
echo "$tab" >> "$depfile"
|
echo " " >> "$depfile"
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||||
rm -f "$tmpdepfile"
|
rm -f "$tmpdepfile"
|
||||||
;;
|
;;
|
||||||
|
@ -783,9 +622,9 @@ exit 0
|
||||||
# Local Variables:
|
# Local Variables:
|
||||||
# mode: shell-script
|
# mode: shell-script
|
||||||
# sh-indentation: 2
|
# sh-indentation: 2
|
||||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
# time-stamp-start: "scriptversion="
|
# time-stamp-start: "scriptversion="
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
# time-stamp-time-zone: "UTC0"
|
# time-stamp-time-zone: "UTC"
|
||||||
# time-stamp-end: "; # UTC"
|
# time-stamp-end: "; # UTC"
|
||||||
# End:
|
# End:
|
||||||
|
|
|
@ -1,35 +1,58 @@
|
||||||
## Process this file with automake to get Makefile.in
|
## Process this file with automake to get Makefile.in
|
||||||
|
|
||||||
info_TEXINFOS = tinc.texi
|
info_TEXINFOS = tinc.texi
|
||||||
tinc_TEXINFOS = tincinclude.texi
|
|
||||||
|
|
||||||
man_MANS = tincd.8 tinc.conf.5
|
man_MANS = tincd.8 tincctl.8 tinc.conf.5 tinc-gui.8
|
||||||
|
|
||||||
EXTRA_DIST = tincinclude.texi.in tincd.8.in tinc.conf.5.in sample-config
|
EXTRA_DIST = tincinclude.texi.in tincd.8.in tincctl.8.in tinc.conf.5.in tinc-gui.8.in sample-config.tar.gz
|
||||||
|
|
||||||
CLEANFILES = *.html tincd.8 tinc.conf.5 tincinclude.texi
|
CLEANFILES = *.html tinc.info tincd.8 tincctl.8 tinc.conf.5 tinc-gui.8 tincinclude.texi
|
||||||
|
|
||||||
|
# Use `ginstall' in the definition of man_MANS to avoid
|
||||||
|
# confusion with the `install' target. The install rule transforms `ginstall'
|
||||||
|
# to install before applying any user-specified name transformations.
|
||||||
|
transform = s/ginstall/install/; @program_transform_name@
|
||||||
|
|
||||||
|
# For additional rules usually of interest only to the maintainer,
|
||||||
|
# see GNUmakefile and Makefile.maint.
|
||||||
|
|
||||||
|
sample-config.tar.gz: sample-config
|
||||||
|
GZIP=$(GZIP_ENV) $(AMTAR) chozf sample-config.tar.gz --exclude .svn sample-config
|
||||||
|
|
||||||
texi2html: tinc.texi
|
texi2html: tinc.texi
|
||||||
$(AM_V_GEN)texi2html -split=chapter $<
|
texi2html -split=chapter tinc.texi
|
||||||
|
|
||||||
tincd.8.html: tincd.8
|
tincd.8.html: tincd.8
|
||||||
$(AM_V_GEN)w3mman2html $< > $@
|
w3mman2html $< > $@
|
||||||
|
|
||||||
|
tincctl.8.html: tincctl.8
|
||||||
|
w3mman2html $< > $@
|
||||||
|
|
||||||
|
tinc-gui.8.html: tinc-gui.8
|
||||||
|
w3mman2html $< > $@
|
||||||
|
|
||||||
tinc.conf.5.html: tinc.conf.5
|
tinc.conf.5.html: tinc.conf.5
|
||||||
$(AM_V_GEN)w3mman2html $< > $@
|
w3mman2html $< > $@
|
||||||
|
|
||||||
substitute = sed \
|
substitute = sed \
|
||||||
-e s,'@PACKAGE\@',"$(PACKAGE)",g \
|
-e s,'@PACKAGE\@',"$(PACKAGE)",g \
|
||||||
-e s,'@VERSION\@',"$(VERSION)",g \
|
-e s,'@VERSION\@',"$(VERSION)",g \
|
||||||
-e s,'@sysconfdir\@',"$(sysconfdir)",g \
|
-e s,'@sysconfdir\@',"$(sysconfdir)",g \
|
||||||
-e s,'@runstatedir\@',"$(runstatedir)",g \
|
|
||||||
-e s,'@localstatedir\@',"$(localstatedir)",g
|
-e s,'@localstatedir\@',"$(localstatedir)",g
|
||||||
|
|
||||||
tincd.8: $(srcdir)/tincd.8.in
|
tincd.8: tincd.8.in
|
||||||
$(AM_V_GEN)$(substitute) $(srcdir)/tincd.8.in > $@
|
$(substitute) $< > $@
|
||||||
|
|
||||||
tinc.conf.5: $(srcdir)/tinc.conf.5.in
|
tincctl.8: tincctl.8.in
|
||||||
$(AM_V_GEN)$(substitute) $(srcdir)/tinc.conf.5.in > $@
|
$(substitute) $< > $@
|
||||||
|
|
||||||
tincinclude.texi: $(srcdir)/tincinclude.texi.in
|
tinc-gui.8: tinc-gui.8.in
|
||||||
$(AM_V_GEN)$(substitute) $(srcdir)/tincinclude.texi.in > $@
|
$(substitute) $< > $@
|
||||||
|
|
||||||
|
tinc.conf.5: tinc.conf.5.in
|
||||||
|
$(substitute) $< > $@
|
||||||
|
|
||||||
|
tincinclude.texi: tincinclude.texi.in
|
||||||
|
$(substitute) $< > $@
|
||||||
|
|
||||||
|
tinc.texi: tincinclude.texi
|
||||||
|
|
401
doc/Makefile.in
401
doc/Makefile.in
|
@ -1,8 +1,9 @@
|
||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
||||||
|
# Inc.
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
# with or without modifications, as long as this notice is preserved.
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
@ -14,61 +15,6 @@
|
||||||
|
|
||||||
@SET_MAKE@
|
@SET_MAKE@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
am__is_gnu_make = { \
|
|
||||||
if test -z '$(MAKELEVEL)'; then \
|
|
||||||
false; \
|
|
||||||
elif test -n '$(MAKE_HOST)'; then \
|
|
||||||
true; \
|
|
||||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
|
||||||
true; \
|
|
||||||
else \
|
|
||||||
false; \
|
|
||||||
fi; \
|
|
||||||
}
|
|
||||||
am__make_running_with_option = \
|
|
||||||
case $${target_option-} in \
|
|
||||||
?) ;; \
|
|
||||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
|
||||||
"target option '$${target_option-}' specified" >&2; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
has_opt=no; \
|
|
||||||
sane_makeflags=$$MAKEFLAGS; \
|
|
||||||
if $(am__is_gnu_make); then \
|
|
||||||
sane_makeflags=$$MFLAGS; \
|
|
||||||
else \
|
|
||||||
case $$MAKEFLAGS in \
|
|
||||||
*\\[\ \ ]*) \
|
|
||||||
bs=\\; \
|
|
||||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
|
||||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
|
||||||
esac; \
|
|
||||||
fi; \
|
|
||||||
skip_next=no; \
|
|
||||||
strip_trailopt () \
|
|
||||||
{ \
|
|
||||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
|
||||||
}; \
|
|
||||||
for flg in $$sane_makeflags; do \
|
|
||||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
|
||||||
case $$flg in \
|
|
||||||
*=*|--*) continue;; \
|
|
||||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
|
||||||
-*I?*) strip_trailopt 'I';; \
|
|
||||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
|
||||||
-*O?*) strip_trailopt 'O';; \
|
|
||||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
|
||||||
-*l?*) strip_trailopt 'l';; \
|
|
||||||
-[dEDm]) skip_next=yes;; \
|
|
||||||
-[JT]) skip_next=yes;; \
|
|
||||||
esac; \
|
|
||||||
case $$flg in \
|
|
||||||
*$$target_option*) has_opt=yes; break;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
test $$has_opt = yes
|
|
||||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
|
||||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
@ -78,7 +24,6 @@ install_sh_DATA = $(install_sh) -c -m 644
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
NORMAL_INSTALL = :
|
||||||
PRE_INSTALL = :
|
PRE_INSTALL = :
|
||||||
POST_INSTALL = :
|
POST_INSTALL = :
|
||||||
|
@ -88,65 +33,21 @@ POST_UNINSTALL = :
|
||||||
build_triplet = @build@
|
build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
subdir = doc
|
subdir = doc
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in texinfo.tex
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
||||||
$(top_srcdir)/m4/ax_append_flag.m4 \
|
$(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/libevent.m4 \
|
||||||
$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
|
$(top_srcdir)/m4/lzo.m4 $(top_srcdir)/m4/openssl.m4 \
|
||||||
$(top_srcdir)/m4/ax_check_compile_flag.m4 \
|
$(top_srcdir)/m4/zlib.m4 $(top_srcdir)/configure.in
|
||||||
$(top_srcdir)/m4/ax_check_link_flag.m4 \
|
|
||||||
$(top_srcdir)/m4/ax_require_defined.m4 $(top_srcdir)/m4/lzo.m4 \
|
|
||||||
$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/zlib.m4 \
|
|
||||||
$(top_srcdir)/configure.ac
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h
|
CONFIG_HEADER = $(top_builddir)/config.h
|
||||||
CONFIG_CLEAN_FILES =
|
CONFIG_CLEAN_FILES =
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
|
||||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
|
||||||
am__v_P_0 = false
|
|
||||||
am__v_P_1 = :
|
|
||||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
|
||||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
|
||||||
am__v_GEN_0 = @echo " GEN " $@;
|
|
||||||
am__v_GEN_1 =
|
|
||||||
AM_V_at = $(am__v_at_@AM_V@)
|
|
||||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
|
||||||
am__v_at_0 = @
|
|
||||||
am__v_at_1 =
|
|
||||||
SOURCES =
|
SOURCES =
|
||||||
DIST_SOURCES =
|
DIST_SOURCES =
|
||||||
AM_V_DVIPS = $(am__v_DVIPS_@AM_V@)
|
INFO_DEPS = tinc.info
|
||||||
am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@)
|
|
||||||
am__v_DVIPS_0 = @echo " DVIPS " $@;
|
|
||||||
am__v_DVIPS_1 =
|
|
||||||
AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@)
|
|
||||||
am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@)
|
|
||||||
am__v_MAKEINFO_0 = @echo " MAKEINFO" $@;
|
|
||||||
am__v_MAKEINFO_1 =
|
|
||||||
AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@)
|
|
||||||
am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@)
|
|
||||||
am__v_INFOHTML_0 = @echo " INFOHTML" $@;
|
|
||||||
am__v_INFOHTML_1 =
|
|
||||||
AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@)
|
|
||||||
am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@)
|
|
||||||
am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@;
|
|
||||||
am__v_TEXI2DVI_1 =
|
|
||||||
AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@)
|
|
||||||
am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@)
|
|
||||||
am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@;
|
|
||||||
am__v_TEXI2PDF_1 =
|
|
||||||
AM_V_texinfo = $(am__v_texinfo_@AM_V@)
|
|
||||||
am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@)
|
|
||||||
am__v_texinfo_0 = -q
|
|
||||||
am__v_texinfo_1 =
|
|
||||||
AM_V_texidevnull = $(am__v_texidevnull_@AM_V@)
|
|
||||||
am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@)
|
|
||||||
am__v_texidevnull_0 = > /dev/null
|
|
||||||
am__v_texidevnull_1 =
|
|
||||||
INFO_DEPS = $(srcdir)/tinc.info
|
|
||||||
am__TEXINFO_TEX_DIR = $(srcdir)
|
am__TEXINFO_TEX_DIR = $(srcdir)
|
||||||
DVIS = tinc.dvi
|
DVIS = tinc.dvi
|
||||||
PDFS = tinc.pdf
|
PDFS = tinc.pdf
|
||||||
|
@ -158,11 +59,6 @@ TEXI2PDF = $(TEXI2DVI) --pdf --batch
|
||||||
MAKEINFOHTML = $(MAKEINFO) --html
|
MAKEINFOHTML = $(MAKEINFO) --html
|
||||||
AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
|
AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
|
||||||
DVIPS = dvips
|
DVIPS = dvips
|
||||||
am__can_run_installinfo = \
|
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
|
||||||
n|no|NO) false;; \
|
|
||||||
*) (install-info --version) >/dev/null 2>&1;; \
|
|
||||||
esac
|
|
||||||
am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man5dir)" \
|
am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man5dir)" \
|
||||||
"$(DESTDIR)$(man8dir)"
|
"$(DESTDIR)$(man8dir)"
|
||||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||||
|
@ -186,22 +82,18 @@ am__nobase_list = $(am__nobase_strip_setup); \
|
||||||
am__base_list = \
|
am__base_list = \
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||||
am__uninstall_files_from_dir = { \
|
|
||||||
test -z "$$files" \
|
|
||||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
|
||||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
|
||||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
|
||||||
}
|
|
||||||
man5dir = $(mandir)/man5
|
man5dir = $(mandir)/man5
|
||||||
man8dir = $(mandir)/man8
|
man8dir = $(mandir)/man8
|
||||||
NROFF = nroff
|
NROFF = nroff
|
||||||
MANS = $(man_MANS)
|
MANS = $(man_MANS)
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(tinc_TEXINFOS) texinfo.tex
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
|
||||||
|
# Use `ginstall' in the definition of man_MANS to avoid
|
||||||
|
# confusion with the `install' target. The install rule transforms `ginstall'
|
||||||
|
# to install before applying any user-specified name transformations.
|
||||||
|
transform = s/ginstall/install/; @program_transform_name@
|
||||||
ACLOCAL = @ACLOCAL@
|
ACLOCAL = @ACLOCAL@
|
||||||
AMTAR = @AMTAR@
|
AMTAR = @AMTAR@
|
||||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
AUTOCONF = @AUTOCONF@
|
||||||
AUTOHEADER = @AUTOHEADER@
|
AUTOHEADER = @AUTOHEADER@
|
||||||
AUTOMAKE = @AUTOMAKE@
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
@ -211,6 +103,7 @@ CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CURSES_LIBS = @CURSES_LIBS@
|
||||||
CYGPATH_W = @CYGPATH_W@
|
CYGPATH_W = @CYGPATH_W@
|
||||||
DEFS = @DEFS@
|
DEFS = @DEFS@
|
||||||
DEPDIR = @DEPDIR@
|
DEPDIR = @DEPDIR@
|
||||||
|
@ -220,15 +113,21 @@ ECHO_T = @ECHO_T@
|
||||||
EGREP = @EGREP@
|
EGREP = @EGREP@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
GREP = @GREP@
|
GREP = @GREP@
|
||||||
|
INCLUDES = @INCLUDES@
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
|
||||||
|
LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
|
||||||
|
LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
LN_S = @LN_S@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
OBJEXT = @OBJEXT@
|
OBJEXT = @OBJEXT@
|
||||||
|
@ -240,6 +139,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
SET_MAKE = @SET_MAKE@
|
SET_MAKE = @SET_MAKE@
|
||||||
SHELL = @SHELL@
|
SHELL = @SHELL@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
|
@ -286,33 +186,29 @@ pdfdir = @pdfdir@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
program_transform_name = @program_transform_name@
|
program_transform_name = @program_transform_name@
|
||||||
psdir = @psdir@
|
psdir = @psdir@
|
||||||
runstatedir = @runstatedir@
|
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
systemd_path = @systemd_path@
|
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
top_build_prefix = @top_build_prefix@
|
top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
info_TEXINFOS = tinc.texi
|
info_TEXINFOS = tinc.texi
|
||||||
tinc_TEXINFOS = tincinclude.texi
|
man_MANS = tincd.8 tincctl.8 tinc.conf.5 tinc-gui.8
|
||||||
man_MANS = tincd.8 tinc.conf.5
|
EXTRA_DIST = tincinclude.texi.in tincd.8.in tincctl.8.in tinc.conf.5.in tinc-gui.8.in sample-config.tar.gz
|
||||||
EXTRA_DIST = tincinclude.texi.in tincd.8.in tinc.conf.5.in sample-config
|
CLEANFILES = *.html tinc.info tincd.8 tincctl.8 tinc.conf.5 tinc-gui.8 tincinclude.texi
|
||||||
CLEANFILES = *.html tincd.8 tinc.conf.5 tincinclude.texi
|
|
||||||
substitute = sed \
|
substitute = sed \
|
||||||
-e s,'@PACKAGE\@',"$(PACKAGE)",g \
|
-e s,'@PACKAGE\@',"$(PACKAGE)",g \
|
||||||
-e s,'@VERSION\@',"$(VERSION)",g \
|
-e s,'@VERSION\@',"$(VERSION)",g \
|
||||||
-e s,'@sysconfdir\@',"$(sysconfdir)",g \
|
-e s,'@sysconfdir\@',"$(sysconfdir)",g \
|
||||||
-e s,'@runstatedir\@',"$(runstatedir)",g \
|
|
||||||
-e s,'@localstatedir\@',"$(localstatedir)",g
|
-e s,'@localstatedir\@',"$(localstatedir)",g
|
||||||
|
|
||||||
all: all-am
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
.SUFFIXES: .dvi .html .info .pdf .ps .texi
|
.SUFFIXES: .dvi .ps
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
@for dep in $?; do \
|
@for dep in $?; do \
|
||||||
case '$(am__configure_deps)' in \
|
case '$(am__configure_deps)' in \
|
||||||
*$$dep*) \
|
*$$dep*) \
|
||||||
|
@ -324,74 +220,69 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
|
||||||
$(am__cd) $(top_srcdir) && \
|
$(am__cd) $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu doc/Makefile
|
$(AUTOMAKE) --gnu doc/Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
||||||
*config.status*) \
|
*config.status*) \
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
*) \
|
*) \
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
$(am__aclocal_m4_deps):
|
$(am__aclocal_m4_deps):
|
||||||
|
|
||||||
.texi.info:
|
tinc.info: tinc.texi
|
||||||
$(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \
|
restore=: && backupdir="$(am__leading_dot)am$$$$" && \
|
||||||
am__cwd=`pwd` && $(am__cd) $(srcdir) && \
|
|
||||||
rm -rf $$backupdir && mkdir $$backupdir && \
|
rm -rf $$backupdir && mkdir $$backupdir && \
|
||||||
if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
|
if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
|
||||||
for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
|
for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
|
||||||
if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
|
if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
|
||||||
done; \
|
done; \
|
||||||
else :; fi && \
|
else :; fi && \
|
||||||
cd "$$am__cwd"; \
|
|
||||||
if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
|
if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
|
||||||
-o $@ $<; \
|
-o $@ `test -f 'tinc.texi' || echo '$(srcdir)/'`tinc.texi; \
|
||||||
then \
|
then \
|
||||||
rc=0; \
|
rc=0; \
|
||||||
$(am__cd) $(srcdir); \
|
|
||||||
else \
|
else \
|
||||||
rc=$$?; \
|
rc=$$?; \
|
||||||
$(am__cd) $(srcdir) && \
|
|
||||||
$$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
|
$$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
|
||||||
fi; \
|
fi; \
|
||||||
rm -rf $$backupdir; exit $$rc
|
rm -rf $$backupdir; exit $$rc
|
||||||
|
|
||||||
.texi.dvi:
|
tinc.dvi: tinc.texi
|
||||||
$(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
|
TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
|
||||||
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
|
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
|
||||||
$(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \
|
$(TEXI2DVI) -o $@ `test -f 'tinc.texi' || echo '$(srcdir)/'`tinc.texi
|
||||||
$<
|
|
||||||
|
|
||||||
.texi.pdf:
|
tinc.pdf: tinc.texi
|
||||||
$(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
|
TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
|
||||||
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
|
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
|
||||||
$(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \
|
$(TEXI2PDF) -o $@ `test -f 'tinc.texi' || echo '$(srcdir)/'`tinc.texi
|
||||||
$<
|
|
||||||
|
|
||||||
.texi.html:
|
tinc.html: tinc.texi
|
||||||
$(AM_V_MAKEINFO)rm -rf $(@:.html=.htp)
|
rm -rf $(@:.html=.htp)
|
||||||
$(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
|
if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
|
||||||
-o $(@:.html=.htp) $<; \
|
-o $(@:.html=.htp) `test -f 'tinc.texi' || echo '$(srcdir)/'`tinc.texi; \
|
||||||
then \
|
then \
|
||||||
rm -rf $@ && mv $(@:.html=.htp) $@; \
|
rm -rf $@; \
|
||||||
|
if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
|
||||||
|
mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
|
||||||
else \
|
else \
|
||||||
rm -rf $(@:.html=.htp); exit 1; \
|
if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
|
||||||
|
rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
|
||||||
|
exit 1; \
|
||||||
fi
|
fi
|
||||||
$(srcdir)/tinc.info: tinc.texi $(tinc_TEXINFOS)
|
|
||||||
tinc.dvi: tinc.texi $(tinc_TEXINFOS)
|
|
||||||
tinc.pdf: tinc.texi $(tinc_TEXINFOS)
|
|
||||||
tinc.html: tinc.texi $(tinc_TEXINFOS)
|
|
||||||
.dvi.ps:
|
.dvi.ps:
|
||||||
$(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
|
TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
|
||||||
$(DVIPS) $(AM_V_texinfo) -o $@ $<
|
$(DVIPS) -o $@ $<
|
||||||
|
|
||||||
uninstall-dvi-am:
|
uninstall-dvi-am:
|
||||||
@$(NORMAL_UNINSTALL)
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@ -413,7 +304,9 @@ uninstall-html-am:
|
||||||
|
|
||||||
uninstall-info-am:
|
uninstall-info-am:
|
||||||
@$(PRE_UNINSTALL)
|
@$(PRE_UNINSTALL)
|
||||||
@if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \
|
@if test -d '$(DESTDIR)$(infodir)' && \
|
||||||
|
(install-info --version && \
|
||||||
|
install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
|
||||||
list='$(INFO_DEPS)'; \
|
list='$(INFO_DEPS)'; \
|
||||||
for file in $$list; do \
|
for file in $$list; do \
|
||||||
relfile=`echo "$$file" | sed 's|^.*/||'`; \
|
relfile=`echo "$$file" | sed 's|^.*/||'`; \
|
||||||
|
@ -470,7 +363,9 @@ dist-info: $(INFO_DEPS)
|
||||||
done
|
done
|
||||||
|
|
||||||
mostlyclean-aminfo:
|
mostlyclean-aminfo:
|
||||||
-rm -rf tinc.t2d tinc.t2p
|
-rm -rf tinc.aux tinc.cp tinc.cps tinc.fn tinc.fns tinc.ky tinc.kys \
|
||||||
|
tinc.log tinc.pg tinc.pgs tinc.tmp tinc.toc tinc.tp tinc.tps \
|
||||||
|
tinc.vr tinc.vrs
|
||||||
|
|
||||||
clean-aminfo:
|
clean-aminfo:
|
||||||
-test -z "tinc.dvi tinc.pdf tinc.ps tinc.html" \
|
-test -z "tinc.dvi tinc.pdf tinc.ps tinc.html" \
|
||||||
|
@ -484,18 +379,11 @@ maintainer-clean-aminfo:
|
||||||
done
|
done
|
||||||
install-man5: $(man_MANS)
|
install-man5: $(man_MANS)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
@list1=''; \
|
test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)"
|
||||||
list2='$(man_MANS)'; \
|
@list=''; test -n "$(man5dir)" || exit 0; \
|
||||||
test -n "$(man5dir)" \
|
{ for i in $$list; do echo "$$i"; done; \
|
||||||
&& test -n "`echo $$list1$$list2`" \
|
l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
|
||||||
|| exit 0; \
|
sed -n '/\.5[a-z]*$$/p'; \
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \
|
|
||||||
{ for i in $$list1; do echo "$$i"; done; \
|
|
||||||
if test -n "$$list2"; then \
|
|
||||||
for i in $$list2; do echo "$$i"; done \
|
|
||||||
| sed -n '/\.5[a-z]*$$/p'; \
|
|
||||||
fi; \
|
|
||||||
} | while read p; do \
|
} | while read p; do \
|
||||||
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
||||||
echo "$$d$$p"; echo "$$p"; \
|
echo "$$d$$p"; echo "$$p"; \
|
||||||
|
@ -524,21 +412,16 @@ uninstall-man5:
|
||||||
sed -n '/\.5[a-z]*$$/p'; \
|
sed -n '/\.5[a-z]*$$/p'; \
|
||||||
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
|
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \
|
||||||
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
|
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
|
||||||
dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir)
|
test -z "$$files" || { \
|
||||||
|
echo " ( cd '$(DESTDIR)$(man5dir)' && rm -f" $$files ")"; \
|
||||||
|
cd "$(DESTDIR)$(man5dir)" && rm -f $$files; }
|
||||||
install-man8: $(man_MANS)
|
install-man8: $(man_MANS)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
@list1=''; \
|
test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)"
|
||||||
list2='$(man_MANS)'; \
|
@list=''; test -n "$(man8dir)" || exit 0; \
|
||||||
test -n "$(man8dir)" \
|
{ for i in $$list; do echo "$$i"; done; \
|
||||||
&& test -n "`echo $$list1$$list2`" \
|
l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
|
||||||
|| exit 0; \
|
sed -n '/\.8[a-z]*$$/p'; \
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \
|
|
||||||
{ for i in $$list1; do echo "$$i"; done; \
|
|
||||||
if test -n "$$list2"; then \
|
|
||||||
for i in $$list2; do echo "$$i"; done \
|
|
||||||
| sed -n '/\.8[a-z]*$$/p'; \
|
|
||||||
fi; \
|
|
||||||
} | while read p; do \
|
} | while read p; do \
|
||||||
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
||||||
echo "$$d$$p"; echo "$$p"; \
|
echo "$$d$$p"; echo "$$p"; \
|
||||||
|
@ -567,18 +450,30 @@ uninstall-man8:
|
||||||
sed -n '/\.8[a-z]*$$/p'; \
|
sed -n '/\.8[a-z]*$$/p'; \
|
||||||
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
|
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \
|
||||||
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
|
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
|
||||||
dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir)
|
test -z "$$files" || { \
|
||||||
tags TAGS:
|
echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \
|
||||||
|
cd "$(DESTDIR)$(man8dir)" && rm -f $$files; }
|
||||||
|
tags: TAGS
|
||||||
|
TAGS:
|
||||||
|
|
||||||
ctags CTAGS:
|
ctags: CTAGS
|
||||||
|
CTAGS:
|
||||||
cscope cscopelist:
|
|
||||||
|
|
||||||
|
|
||||||
distdir: $(BUILT_SOURCES)
|
distdir: $(DISTFILES)
|
||||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
@list='$(MANS)'; if test -n "$$list"; then \
|
||||||
|
list=`for p in $$list; do \
|
||||||
distdir-am: $(DISTFILES)
|
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
|
||||||
|
if test -n "$$list" && \
|
||||||
|
grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
|
||||||
|
echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
|
||||||
|
grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \
|
||||||
|
echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \
|
||||||
|
echo " typically \`make maintainer-clean' will remove them" >&2; \
|
||||||
|
exit 1; \
|
||||||
|
else :; fi; \
|
||||||
|
else :; fi
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
list='$(DISTFILES)'; \
|
list='$(DISTFILES)'; \
|
||||||
|
@ -628,15 +523,10 @@ install-am: all-am
|
||||||
|
|
||||||
installcheck: installcheck-am
|
installcheck: installcheck-am
|
||||||
install-strip:
|
install-strip:
|
||||||
if test -z '$(STRIP)'; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
install; \
|
`test -z '$(STRIP)' || \
|
||||||
else \
|
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
|
||||||
fi
|
|
||||||
mostlyclean-generic:
|
mostlyclean-generic:
|
||||||
|
|
||||||
clean-generic:
|
clean-generic:
|
||||||
|
@ -675,11 +565,8 @@ install-dvi: install-dvi-am
|
||||||
|
|
||||||
install-dvi-am: $(DVIS)
|
install-dvi-am: $(DVIS)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)"
|
||||||
@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
|
@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do \
|
for p in $$list; do \
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
echo "$$d$$p"; \
|
echo "$$d$$p"; \
|
||||||
|
@ -694,22 +581,18 @@ install-html: install-html-am
|
||||||
|
|
||||||
install-html-am: $(HTMLS)
|
install-html-am: $(HTMLS)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
|
||||||
@list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
|
@list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do \
|
for p in $$list; do \
|
||||||
if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
$(am__strip_dir) \
|
$(am__strip_dir) \
|
||||||
d2=$$d$$p; \
|
if test -d "$$d$$p"; then \
|
||||||
if test -d "$$d2"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
|
echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
|
||||||
$(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
|
$(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
|
||||||
echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \
|
echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
|
||||||
$(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
|
$(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
|
||||||
else \
|
else \
|
||||||
list2="$$list2 $$d2"; \
|
list2="$$list2 $$d$$p"; \
|
||||||
fi; \
|
fi; \
|
||||||
done; \
|
done; \
|
||||||
test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
|
test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
|
||||||
|
@ -721,12 +604,9 @@ install-info: install-info-am
|
||||||
|
|
||||||
install-info-am: $(INFO_DEPS)
|
install-info-am: $(INFO_DEPS)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)"
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
|
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
|
||||||
list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
|
list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for file in $$list; do \
|
for file in $$list; do \
|
||||||
case $$file in \
|
case $$file in \
|
||||||
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
|
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
@ -744,7 +624,8 @@ install-info-am: $(INFO_DEPS)
|
||||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
|
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
|
||||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
|
$(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
|
||||||
@$(POST_INSTALL)
|
@$(POST_INSTALL)
|
||||||
@if $(am__can_run_installinfo); then \
|
@if (install-info --version && \
|
||||||
|
install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
|
||||||
list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
|
list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
|
||||||
for file in $$list; do \
|
for file in $$list; do \
|
||||||
relfile=`echo "$$file" | sed 's|^.*/||'`; \
|
relfile=`echo "$$file" | sed 's|^.*/||'`; \
|
||||||
|
@ -758,11 +639,8 @@ install-pdf: install-pdf-am
|
||||||
|
|
||||||
install-pdf-am: $(PDFS)
|
install-pdf-am: $(PDFS)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)"
|
||||||
@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
|
@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do \
|
for p in $$list; do \
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
echo "$$d$$p"; \
|
echo "$$d$$p"; \
|
||||||
|
@ -774,11 +652,8 @@ install-ps: install-ps-am
|
||||||
|
|
||||||
install-ps-am: $(PSS)
|
install-ps-am: $(PSS)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)"
|
||||||
@list='$(PSS)'; test -n "$(psdir)" || list=; \
|
@list='$(PSS)'; test -n "$(psdir)" || list=; \
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do \
|
for p in $$list; do \
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
echo "$$d$$p"; \
|
echo "$$d$$p"; \
|
||||||
|
@ -813,40 +688,58 @@ uninstall-man: uninstall-man5 uninstall-man8
|
||||||
.MAKE: install-am install-strip
|
.MAKE: install-am install-strip
|
||||||
|
|
||||||
.PHONY: all all-am check check-am clean clean-aminfo clean-generic \
|
.PHONY: all all-am check check-am clean clean-aminfo clean-generic \
|
||||||
cscopelist-am ctags-am dist-info distclean distclean-generic \
|
dist-info distclean distclean-generic distdir dvi dvi-am html \
|
||||||
distdir dvi dvi-am html html-am info info-am install \
|
html-am info info-am install install-am install-data \
|
||||||
install-am install-data install-data-am install-dvi \
|
install-data-am install-dvi install-dvi-am install-exec \
|
||||||
install-dvi-am install-exec install-exec-am install-html \
|
install-exec-am install-html install-html-am install-info \
|
||||||
install-html-am install-info install-info-am install-man \
|
install-info-am install-man install-man5 install-man8 \
|
||||||
install-man5 install-man8 install-pdf install-pdf-am \
|
install-pdf install-pdf-am install-ps install-ps-am \
|
||||||
install-ps install-ps-am install-strip installcheck \
|
install-strip installcheck installcheck-am installdirs \
|
||||||
installcheck-am installdirs maintainer-clean \
|
maintainer-clean maintainer-clean-aminfo \
|
||||||
maintainer-clean-aminfo maintainer-clean-generic mostlyclean \
|
maintainer-clean-generic mostlyclean mostlyclean-aminfo \
|
||||||
mostlyclean-aminfo mostlyclean-generic pdf pdf-am ps ps-am \
|
mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
|
||||||
tags-am uninstall uninstall-am uninstall-dvi-am \
|
uninstall-dvi-am uninstall-html-am uninstall-info-am \
|
||||||
uninstall-html-am uninstall-info-am uninstall-man \
|
uninstall-man uninstall-man5 uninstall-man8 uninstall-pdf-am \
|
||||||
uninstall-man5 uninstall-man8 uninstall-pdf-am uninstall-ps-am
|
uninstall-ps-am
|
||||||
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
|
|
||||||
|
# For additional rules usually of interest only to the maintainer,
|
||||||
|
# see GNUmakefile and Makefile.maint.
|
||||||
|
|
||||||
|
sample-config.tar.gz: sample-config
|
||||||
|
GZIP=$(GZIP_ENV) $(AMTAR) chozf sample-config.tar.gz --exclude .svn sample-config
|
||||||
|
|
||||||
texi2html: tinc.texi
|
texi2html: tinc.texi
|
||||||
$(AM_V_GEN)texi2html -split=chapter $<
|
texi2html -split=chapter tinc.texi
|
||||||
|
|
||||||
tincd.8.html: tincd.8
|
tincd.8.html: tincd.8
|
||||||
$(AM_V_GEN)w3mman2html $< > $@
|
w3mman2html $< > $@
|
||||||
|
|
||||||
|
tincctl.8.html: tincctl.8
|
||||||
|
w3mman2html $< > $@
|
||||||
|
|
||||||
|
tinc-gui.8.html: tinc-gui.8
|
||||||
|
w3mman2html $< > $@
|
||||||
|
|
||||||
tinc.conf.5.html: tinc.conf.5
|
tinc.conf.5.html: tinc.conf.5
|
||||||
$(AM_V_GEN)w3mman2html $< > $@
|
w3mman2html $< > $@
|
||||||
|
|
||||||
tincd.8: $(srcdir)/tincd.8.in
|
tincd.8: tincd.8.in
|
||||||
$(AM_V_GEN)$(substitute) $(srcdir)/tincd.8.in > $@
|
$(substitute) $< > $@
|
||||||
|
|
||||||
tinc.conf.5: $(srcdir)/tinc.conf.5.in
|
tincctl.8: tincctl.8.in
|
||||||
$(AM_V_GEN)$(substitute) $(srcdir)/tinc.conf.5.in > $@
|
$(substitute) $< > $@
|
||||||
|
|
||||||
tincinclude.texi: $(srcdir)/tincinclude.texi.in
|
tinc-gui.8: tinc-gui.8.in
|
||||||
$(AM_V_GEN)$(substitute) $(srcdir)/tincinclude.texi.in > $@
|
$(substitute) $< > $@
|
||||||
|
|
||||||
|
tinc.conf.5: tinc.conf.5.in
|
||||||
|
$(substitute) $< > $@
|
||||||
|
|
||||||
|
tincinclude.texi: tincinclude.texi.in
|
||||||
|
$(substitute) $< > $@
|
||||||
|
|
||||||
|
tinc.texi: tincinclude.texi
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
|
BIN
doc/sample-config.tar.gz
Normal file
BIN
doc/sample-config.tar.gz
Normal file
Binary file not shown.
|
@ -1,15 +0,0 @@
|
||||||
# Sample host configuration file
|
|
||||||
|
|
||||||
# The real IP address of this tinc host. Can be used by other tinc hosts.
|
|
||||||
Address = 123.234.35.67
|
|
||||||
|
|
||||||
# Portnumber for incoming connections. Default is 655.
|
|
||||||
Port = 655
|
|
||||||
|
|
||||||
# Subnet on the virtual private network that is local for this host.
|
|
||||||
Subnet = 192.168.1.0/24
|
|
||||||
|
|
||||||
# The public key generated by `tincd -n example -K' is stored here
|
|
||||||
-----BEGIN RSA PUBLIC KEY-----
|
|
||||||
...
|
|
||||||
-----END RSA PUBLIC KEY-----
|
|
|
@ -1,16 +0,0 @@
|
||||||
# Sample host configuration file
|
|
||||||
# This file was generated by host beta.
|
|
||||||
|
|
||||||
# The real IP address of this tinc host. Can be used by other tinc hosts.
|
|
||||||
Address = 123.45.67.189
|
|
||||||
|
|
||||||
# Portnumber for incoming connections. Default is 655.
|
|
||||||
Port = 6500
|
|
||||||
|
|
||||||
# Subnet on the virtual private network that is local for this host.
|
|
||||||
Subnet = 192.168.2.0/24
|
|
||||||
|
|
||||||
# The public key generated by `tincd -n example -K' is stored here
|
|
||||||
-----BEGIN RSA PUBLIC KEY-----
|
|
||||||
...
|
|
||||||
-----END RSA PUBLIC KEY-----
|
|
|
@ -1 +0,0 @@
|
||||||
# Generate this file with `tincd -n example -K`
|
|
|
@ -1,4 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# This file closes down the tap device.
|
|
||||||
|
|
||||||
ifconfig $INTERFACE down
|
|
|
@ -1,11 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# This file sets up the tap device.
|
|
||||||
# It gives you the freedom to do anything you want with it.
|
|
||||||
# Use the correct name for the tap device:
|
|
||||||
# The environment variable $INTERFACE is set to the right name
|
|
||||||
# on most platforms, but if it doesn't work try to set it manually.
|
|
||||||
|
|
||||||
# Give it the right ip and netmask. Remember, the subnet of the
|
|
||||||
# tap device must be larger than that of the individual Subnets
|
|
||||||
# as defined in the host configuration file!
|
|
||||||
ifconfig $INTERFACE 192.168.1.1 netmask 255.255.0.0
|
|
|
@ -1,22 +0,0 @@
|
||||||
# Sample tinc configuration file
|
|
||||||
|
|
||||||
# This is a comment.
|
|
||||||
# Spaces and tabs are eliminated.
|
|
||||||
# The = sign isn't strictly necessary any longer, though you may want
|
|
||||||
# to leave it in as it improves readability :)
|
|
||||||
# Variable names are treated case insensitive.
|
|
||||||
|
|
||||||
# The name of this tinc host. Required.
|
|
||||||
Name = alpha
|
|
||||||
|
|
||||||
# The internet host to connect with.
|
|
||||||
# Comment these out to make yourself a listen-only connection
|
|
||||||
# You must use the name of another tinc host.
|
|
||||||
# May be used multiple times for redundance.
|
|
||||||
ConnectTo = beta
|
|
||||||
|
|
||||||
# The tap device tinc will use.
|
|
||||||
# /dev/tap0 for ethertap, FreeBSD or OpenBSD
|
|
||||||
# /dev/tun0 for Solaris
|
|
||||||
# /dev/net/tun for Linux tun/tap
|
|
||||||
Device = /dev/net/tun
|
|
6942
doc/texinfo.tex
6942
doc/texinfo.tex
File diff suppressed because it is too large
Load diff
57
doc/tinc-gui.8.in
Normal file
57
doc/tinc-gui.8.in
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
.Dd 2011-06-26
|
||||||
|
.Dt TINC-GUI 8
|
||||||
|
.\" Manual page created by:
|
||||||
|
.\" Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
.Sh NAME
|
||||||
|
.Nm tinc-gui
|
||||||
|
.Nd tinc GUI
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm
|
||||||
|
.Op Fl n
|
||||||
|
.Op Fl -net Ns = Ns Ar NETNAME
|
||||||
|
.Op Fl -pidfile Ns = Ns Ar FILENAME
|
||||||
|
.Op Fl -help
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
This is a Python/wxWidgets based graphical user interface for tinc, a secure virtual private network (VPN) project.
|
||||||
|
.Nm
|
||||||
|
communicates with
|
||||||
|
.Xr tincd 8
|
||||||
|
to alter and inspect the running VPN's state.
|
||||||
|
It can show the current settings, the list of connections, nodes, subnets, and edges.
|
||||||
|
For now, the debug level can be changed from the GUI, and by right-clicking on a node in the list of connections,
|
||||||
|
a pop-up menu will appear that allows one to disconnect that node.
|
||||||
|
.Sh OPTIONS
|
||||||
|
.Bl -tag -width indent
|
||||||
|
.It Fl n, -net Ns = Ns Ar NETNAME
|
||||||
|
Communicate with tincd(8) connected with
|
||||||
|
.Ar NETNAME .
|
||||||
|
.It Fl -pidfile Ns = Ns Ar FILENAME
|
||||||
|
Use the cookie from
|
||||||
|
.Ar FILENAME
|
||||||
|
to authenticate with a running tinc daemon.
|
||||||
|
If unspecified, the default is
|
||||||
|
.Pa @localstatedir@/run/tinc. Ns Ar NETNAME Ns Pa .pid.
|
||||||
|
.It Fl -help
|
||||||
|
Display short list of options.
|
||||||
|
.El
|
||||||
|
.Sh BUGS
|
||||||
|
The GUI is not finished yet, the final version will have much more functionality.
|
||||||
|
If you find any bugs, report them to tinc@tinc-vpn.org.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr tincd 8 ,
|
||||||
|
.Pa http://www.tinc-vpn.org/ .
|
||||||
|
.Pp
|
||||||
|
The full documentation for tinc is maintained as a Texinfo manual.
|
||||||
|
If the info and tinc programs are properly installed at your site,
|
||||||
|
the command
|
||||||
|
.Ic info tinc
|
||||||
|
should give you access to the complete manual.
|
||||||
|
.Pp
|
||||||
|
tinc comes with ABSOLUTELY NO WARRANTY.
|
||||||
|
This is free software, and you are welcome to redistribute it under certain conditions;
|
||||||
|
see the file COPYING for details.
|
||||||
|
.Sh AUTHORS
|
||||||
|
.An "Ivo Timmermans"
|
||||||
|
.An "Guus Sliepen" Aq guus@tinc-vpn.org
|
||||||
|
.Pp
|
||||||
|
And thanks to many others for their contributions to tinc!
|
|
@ -1,21 +1,25 @@
|
||||||
.Dd 2016-10-29
|
.Dd 2010-01-16
|
||||||
.Dt TINC.CONF 5
|
.Dt TINC.CONF 5
|
||||||
.\" Manual page created by:
|
.\" Manual page created by:
|
||||||
.\" Ivo Timmermans
|
.\" Ivo Timmermans
|
||||||
.\" Guus Sliepen <guus@tinc-vpn.org>
|
.\" Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
.Nm tinc.conf
|
.Nm tinc.conf
|
||||||
.Nd tinc daemon configuration
|
.Nd tinc daemon configuration
|
||||||
|
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
The files in the
|
The files in the
|
||||||
.Pa @sysconfdir@/tinc/
|
.Pa @sysconfdir@/tinc/
|
||||||
directory contain runtime and security information for the tinc daemon.
|
directory contain runtime and security information for the tinc daemon.
|
||||||
|
|
||||||
.Sh NETWORKS
|
.Sh NETWORKS
|
||||||
It is perfectly ok for you to run more than one tinc daemon.
|
It is perfectly ok for you to run more than one tinc daemon.
|
||||||
However, in its default form,
|
However, in its default form,
|
||||||
you will soon notice that you can't use two different configuration files without the
|
you will soon notice that you can't use two different configuration files without the
|
||||||
.Fl c
|
.Fl c
|
||||||
option.
|
option.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
We have thought of another way of dealing with this: network names.
|
We have thought of another way of dealing with this: network names.
|
||||||
This means that you call
|
This means that you call
|
||||||
|
@ -23,6 +27,7 @@ This means that you call
|
||||||
with the
|
with the
|
||||||
.Fl n
|
.Fl n
|
||||||
option, which will assign a name to this daemon.
|
option, which will assign a name to this daemon.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
The effect of this is that the daemon will set its configuration root to
|
The effect of this is that the daemon will set its configuration root to
|
||||||
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa / ,
|
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa / ,
|
||||||
|
@ -33,6 +38,7 @@ is your argument to the
|
||||||
option.
|
option.
|
||||||
You'll notice that messages appear in syslog as coming from
|
You'll notice that messages appear in syslog as coming from
|
||||||
.Nm tincd. Ns Ar NETNAME .
|
.Nm tincd. Ns Ar NETNAME .
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
However, it is not strictly necessary that you call tinc with the
|
However, it is not strictly necessary that you call tinc with the
|
||||||
.Fl n
|
.Fl n
|
||||||
|
@ -48,21 +54,25 @@ the configuration file should be
|
||||||
.Pa @sysconfdir@/tinc/tinc.conf ,
|
.Pa @sysconfdir@/tinc/tinc.conf ,
|
||||||
and the host configuration files are now expected to be in
|
and the host configuration files are now expected to be in
|
||||||
.Pa @sysconfdir@/tinc/hosts/ .
|
.Pa @sysconfdir@/tinc/hosts/ .
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
But it is highly recommended that you use this feature of
|
But it is highly recommended that you use this feature of
|
||||||
.Nm tinc ,
|
.Nm tinc ,
|
||||||
because it will be so much clearer whom your daemon talks to.
|
because it will be so much clearer whom your daemon talks to.
|
||||||
Hence, we will assume that you use it.
|
Hence, we will assume that you use it.
|
||||||
|
|
||||||
.Sh NAMES
|
.Sh NAMES
|
||||||
Each tinc daemon must have a name that is unique in the network which it will be part of.
|
Each tinc daemon should have a name that is unique in the network which it will be part of.
|
||||||
The name will be used by other tinc daemons for identification.
|
The name will be used by other tinc daemons for identification.
|
||||||
The name has to be declared in the
|
The name has to be declared in the
|
||||||
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf
|
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf
|
||||||
file.
|
file.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
To make things easy,
|
To make things easy,
|
||||||
choose something that will give unique and easy to remember names to your tinc daemon(s).
|
choose something that will give unique and easy to remember names to your tinc daemon(s).
|
||||||
You could try things like hostnames, owner surnames or location names.
|
You could try things like hostnames, owner surnames or location names.
|
||||||
|
|
||||||
.Sh PUBLIC/PRIVATE KEYS
|
.Sh PUBLIC/PRIVATE KEYS
|
||||||
You should use
|
You should use
|
||||||
.Ic tincd -K
|
.Ic tincd -K
|
||||||
|
@ -81,14 +91,17 @@ The public key should be stored in the host configuration file
|
||||||
.Va NAME
|
.Va NAME
|
||||||
stands for the name of the local tinc daemon (see
|
stands for the name of the local tinc daemon (see
|
||||||
.Sx NAMES ) .
|
.Sx NAMES ) .
|
||||||
|
|
||||||
.Sh SERVER CONFIGURATION
|
.Sh SERVER CONFIGURATION
|
||||||
The server configuration of the daemon is done in the file
|
The server configuration of the daemon is done in the file
|
||||||
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf .
|
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf .
|
||||||
This file consists of comments (lines started with a
|
This file consists of comments (lines started with a
|
||||||
.Li # )
|
.Li # )
|
||||||
or assignments in the form of:
|
or assignments in the form of:
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
.Va Variable Li = Ar Value .
|
.Va Variable Li = Ar Value .
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
The variable names are case insensitive, and any spaces, tabs,
|
The variable names are case insensitive, and any spaces, tabs,
|
||||||
newlines and carriage returns are ignored.
|
newlines and carriage returns are ignored.
|
||||||
|
@ -96,67 +109,44 @@ Note: it is not required that you put in the
|
||||||
.Li =
|
.Li =
|
||||||
sign, but doing so improves readability.
|
sign, but doing so improves readability.
|
||||||
If you leave it out, remember to replace it with at least one space character.
|
If you leave it out, remember to replace it with at least one space character.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
The server configuration is complemented with host specific configuration (see the next section).
|
The server configuration is complemented with host specific configuration (see the next section).
|
||||||
Although all configuration options for the local host listed in this document can also be put in
|
Although all configuration options for the local host listed in this document can also be put in
|
||||||
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf ,
|
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf ,
|
||||||
it is recommended to put host specific configuration options in the host configuration file,
|
it is recommended to put host specific configuration options in the host configuration file,
|
||||||
as this makes it easy to exchange with other nodes.
|
as this makes it easy to exchange with other nodes.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
Here are all valid variables, listed in alphabetical order.
|
Here are all valid variables, listed in alphabetical order.
|
||||||
The default value is given between parentheses.
|
The default value is given between parentheses.
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
|
|
||||||
.It Va AddressFamily Li = ipv4 | ipv6 | any Pq any
|
.It Va AddressFamily Li = ipv4 | ipv6 | any Pq any
|
||||||
This option affects the address family of listening and outgoing sockets.
|
This option affects the address family of listening and outgoing sockets.
|
||||||
If
|
If
|
||||||
.Qq any
|
.Qq any
|
||||||
is selected, then depending on the operating system both IPv4 and IPv6 or just
|
is selected, then depending on the operating system both IPv4 and IPv6 or just
|
||||||
IPv6 listening sockets will be created.
|
IPv6 listening sockets will be created.
|
||||||
.It Va BindToAddress Li = Ar address Oo Ar port Oc Bq experimental
|
|
||||||
|
.It Va BindToAddress Li = Ar address Bq experimental
|
||||||
If your computer has more than one IPv4 or IPv6 address,
|
If your computer has more than one IPv4 or IPv6 address,
|
||||||
.Nm tinc
|
.Nm tinc
|
||||||
will by default listen on all of them for incoming connections.
|
will by default listen on all of them for incoming connections.
|
||||||
Multiple
|
It is possible to bind only to a single address with this variable.
|
||||||
.Va BindToAddress
|
|
||||||
variables may be specified,
|
|
||||||
in which case listening sockets for each specified address are made.
|
|
||||||
.Pp
|
|
||||||
If no
|
|
||||||
.Ar port
|
|
||||||
is specified, the socket will be bound to the port specified by the
|
|
||||||
.Va Port
|
|
||||||
option, or to port 655 if neither is given.
|
|
||||||
To only bind to a specific port but not to a specific address, use
|
|
||||||
.Li *
|
|
||||||
for the
|
|
||||||
.Ar address .
|
|
||||||
.Pp
|
.Pp
|
||||||
This option may not work on all platforms.
|
This option may not work on all platforms.
|
||||||
|
|
||||||
.It Va BindToInterface Li = Ar interface Bq experimental
|
.It Va BindToInterface Li = Ar interface Bq experimental
|
||||||
If your computer has more than one network interface,
|
If your computer has more than one network interface,
|
||||||
.Nm tinc
|
.Nm tinc
|
||||||
will by default listen on all of them for incoming connections.
|
will by default listen on all of them for incoming connections.
|
||||||
It is possible to bind only to a single interface with this variable.
|
It is possible to bind only to a single interface with this variable.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
This option may not work on all platforms.
|
This option may not work on all platforms.
|
||||||
Also, on some platforms it will not actually bind to an interface,
|
|
||||||
but rather to the address that the interface has at the moment a socket is created.
|
|
||||||
.It Va Broadcast Li = no | mst | direct Po mst Pc Bq experimental
|
|
||||||
This option selects the way broadcast packets are sent to other daemons.
|
|
||||||
NOTE: all nodes in a VPN must use the same
|
|
||||||
.Va Broadcast
|
|
||||||
mode, otherwise routing loops can form.
|
|
||||||
.Bl -tag -width indent
|
|
||||||
.It no
|
|
||||||
Broadcast packets are never sent to other nodes.
|
|
||||||
.It mst
|
|
||||||
Broadcast packets are sent and forwarded via the VPN's Minimum Spanning Tree.
|
|
||||||
This ensures broadcast packets reach all nodes.
|
|
||||||
.It direct
|
|
||||||
Broadcast packets are sent directly to all nodes that can be reached directly.
|
|
||||||
Broadcast packets received from other nodes are never forwarded.
|
|
||||||
If the IndirectData option is also set, broadcast packets will only be sent to nodes which we have a meta connection to.
|
|
||||||
.El
|
|
||||||
.It Va ConnectTo Li = Ar name
|
.It Va ConnectTo Li = Ar name
|
||||||
Specifies which other tinc daemon to connect to on startup.
|
Specifies which other tinc daemon to connect to on startup.
|
||||||
Multiple
|
Multiple
|
||||||
|
@ -167,21 +157,14 @@ The names should be known to this tinc daemon
|
||||||
(i.e., there should be a host configuration file for the name on the
|
(i.e., there should be a host configuration file for the name on the
|
||||||
.Va ConnectTo
|
.Va ConnectTo
|
||||||
line).
|
line).
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
If you don't specify a host with
|
If you don't specify a host with
|
||||||
.Va ConnectTo ,
|
.Va ConnectTo ,
|
||||||
.Nm tinc
|
.Nm tinc
|
||||||
won't try to connect to other daemons at all,
|
won't try to connect to other daemons at all,
|
||||||
and will instead just listen for incoming connections.
|
and will instead just listen for incoming connections.
|
||||||
.It Va DecrementTTL Li = yes | no Po no Pc Bq experimental
|
|
||||||
When enabled,
|
|
||||||
.Nm tinc
|
|
||||||
will decrement the Time To Live field in IPv4 packets, or the Hop Limit field in IPv6 packets,
|
|
||||||
before forwarding a received packet to the virtual network device or to another node,
|
|
||||||
and will drop packets that have a TTL value of zero,
|
|
||||||
in which case it will send an ICMP Time Exceeded packet back.
|
|
||||||
.Pp
|
|
||||||
Do not use this option if you use switch mode and want to use IPv6.
|
|
||||||
.It Va Device Li = Ar device Po Pa /dev/tap0 , Pa /dev/net/tun No or other depending on platform Pc
|
.It Va Device Li = Ar device Po Pa /dev/tap0 , Pa /dev/net/tun No or other depending on platform Pc
|
||||||
The virtual network device to use.
|
The virtual network device to use.
|
||||||
.Nm tinc
|
.Nm tinc
|
||||||
|
@ -193,92 +176,77 @@ instead of
|
||||||
.Va Device .
|
.Va Device .
|
||||||
The info pages of the tinc package contain more information
|
The info pages of the tinc package contain more information
|
||||||
about configuring the virtual network device.
|
about configuring the virtual network device.
|
||||||
.It Va DeviceType Li = Ar type Pq platform dependent
|
|
||||||
|
.It Va DeviceType Li = tun | tunnohead | tunifhead | tap Po only supported on BSD platforms Pc
|
||||||
The type of the virtual network device.
|
The type of the virtual network device.
|
||||||
Tinc will normally automatically select the right type of tun/tap interface, and this option should not be used.
|
Tinc will normally automatically select the right type, and this option should not be used.
|
||||||
However, this option can be used to select one of the special interface types, if support for them is compiled in.
|
However, in case tinc does not seem to correctly interpret packets received from the virtual network device,
|
||||||
|
using this option might help.
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
.It dummy
|
|
||||||
Use a dummy interface.
|
.It tun
|
||||||
No packets are ever read or written to a virtual network device.
|
|
||||||
Useful for testing, or when setting up a node that only forwards packets for other nodes.
|
|
||||||
.It raw_socket
|
|
||||||
Open a raw socket, and bind it to a pre-existing
|
|
||||||
.Va Interface
|
|
||||||
(eth0 by default).
|
|
||||||
All packets are read from this interface.
|
|
||||||
Packets received for the local node are written to the raw socket.
|
|
||||||
However, at least on Linux, the operating system does not process IP packets destined for the local host.
|
|
||||||
.It multicast
|
|
||||||
Open a multicast UDP socket and bind it to the address and port (separated by spaces) and optionally a TTL value specified using
|
|
||||||
.Va Device .
|
|
||||||
Packets are read from and written to this multicast socket.
|
|
||||||
This can be used to connect to UML, QEMU or KVM instances listening on the same multicast address.
|
|
||||||
Do NOT connect multiple
|
|
||||||
.Nm tinc
|
|
||||||
daemons to the same multicast address, this will very likely cause routing loops.
|
|
||||||
Also note that this can cause decrypted VPN packets to be sent out on a real network if misconfigured.
|
|
||||||
.It uml Pq not compiled in by default
|
|
||||||
Create a UNIX socket with the filename specified by
|
|
||||||
.Va Device ,
|
|
||||||
or
|
|
||||||
.Pa @runstatedir@/ Ns Ar NETNAME Ns Pa .umlsocket
|
|
||||||
if not specified.
|
|
||||||
.Nm tinc
|
|
||||||
will wait for a User Mode Linux instance to connect to this socket.
|
|
||||||
.It vde Pq not compiled in by default
|
|
||||||
Uses the libvdeplug library to connect to a Virtual Distributed Ethernet switch,
|
|
||||||
using the UNIX socket specified by
|
|
||||||
.Va Device ,
|
|
||||||
or
|
|
||||||
.Pa @runstatedir@/vde.ctl
|
|
||||||
if not specified.
|
|
||||||
.El
|
|
||||||
Also, in case tinc does not seem to correctly interpret packets received from the virtual network device,
|
|
||||||
it can be used to change the way packets are interpreted:
|
|
||||||
.Bl -tag -width indent
|
|
||||||
.It tun Pq BSD and Linux
|
|
||||||
Set type to tun.
|
Set type to tun.
|
||||||
Depending on the platform, this can either be with or without an address family header (see below).
|
Depending on the platform, this can either be with or without an address family header (see below).
|
||||||
.It tunnohead Pq BSD
|
|
||||||
|
.It tunnohead
|
||||||
Set type to tun without an address family header.
|
Set type to tun without an address family header.
|
||||||
Tinc will expect packets read from the virtual network device to start with an IP header.
|
Tinc will expect packets read from the virtual network device to start with an IP header.
|
||||||
On some platforms IPv6 packets cannot be read from or written to the device in this mode.
|
On some platforms IPv6 packets cannot be read from or written to the device in this mode.
|
||||||
.It tunifhead Pq BSD
|
|
||||||
|
.It tunifhead
|
||||||
Set type to tun with an address family header.
|
Set type to tun with an address family header.
|
||||||
Tinc will expect packets read from the virtual network device
|
Tinc will expect packets read from the virtual network device
|
||||||
to start with a four byte header containing the address family,
|
to start with a four byte header containing the address family,
|
||||||
followed by an IP header.
|
followed by an IP header.
|
||||||
This mode should support both IPv4 and IPv6 packets.
|
This mode should support both IPv4 and IPv6 packets.
|
||||||
.It utun Pq OS X
|
|
||||||
Set type to utun.
|
.It tap
|
||||||
This is only supported on OS X version 10.6.8 and higher, but doesn't require the tuntaposx module.
|
|
||||||
This mode should support both IPv4 and IPv6 packets.
|
|
||||||
.It tap Pq BSD and Linux
|
|
||||||
Set type to tap.
|
Set type to tap.
|
||||||
Tinc will expect packets read from the virtual network device
|
Tinc will expect packets read from the virtual network device
|
||||||
to start with an Ethernet header.
|
to start with an Ethernet header.
|
||||||
.El
|
.El
|
||||||
|
|
||||||
.It Va DirectOnly Li = yes | no Po no Pc Bq experimental
|
.It Va DirectOnly Li = yes | no Po no Pc Bq experimental
|
||||||
When this option is enabled, packets that cannot be sent directly to the destination node,
|
When this option is enabled, packets that cannot be sent directly to the destination node,
|
||||||
but which would have to be forwarded by an intermediate node, are dropped instead.
|
but which would have to be forwarded by an intermediate node, are dropped instead.
|
||||||
When combined with the IndirectData option,
|
When combined with the IndirectData option,
|
||||||
packets for nodes for which we do not have a meta connection with are also dropped.
|
packets for nodes for which we do not have a meta connection with are also dropped.
|
||||||
|
|
||||||
|
.It Va ECDSAPrivateKeyFile Li = Ar filename Po Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /ecdsa_key.priv Pc
|
||||||
|
The file in which the private ECDSA key of this tinc daemon resides.
|
||||||
|
This is only used if
|
||||||
|
.Va ExperimentalProtocol
|
||||||
|
is enabled.
|
||||||
|
|
||||||
|
.It Va ExperimentalProtocol Li = yes | no Po no Pc Bq experimental
|
||||||
|
When this option is enabled, experimental protocol enhancements will be used.
|
||||||
|
Ephemeral ECDH will be used for key exchanges,
|
||||||
|
and ECDSA will be used instead of RSA for authentication.
|
||||||
|
When enabled, an ECDSA key must have been generated before with
|
||||||
|
.Nm tincctl generate-ecdsa-keys .
|
||||||
|
The experimental protocol may change at any time,
|
||||||
|
and there is no guarantee that tinc will run stable when it is used.
|
||||||
|
|
||||||
.It Va Forwarding Li = off | internal | kernel Po internal Pc Bq experimental
|
.It Va Forwarding Li = off | internal | kernel Po internal Pc Bq experimental
|
||||||
This option selects the way indirect packets are forwarded.
|
This option selects the way indirect packets are forwarded.
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
|
|
||||||
.It off
|
.It off
|
||||||
Incoming packets that are not meant for the local node,
|
Incoming packets that are not meant for the local node,
|
||||||
but which should be forwarded to another node, are dropped.
|
but which should be forwarded to another node, are dropped.
|
||||||
|
|
||||||
.It internal
|
.It internal
|
||||||
Incoming packets that are meant for another node are forwarded by tinc internally.
|
Incoming packets that are meant for another node are forwarded by tinc internally.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
This is the default mode, and unless you really know you need another forwarding mode, don't change it.
|
This is the default mode, and unless you really know you need another forwarding mode, don't change it.
|
||||||
|
|
||||||
.It kernel
|
.It kernel
|
||||||
Incoming packets are always sent to the TUN/TAP device, even if the packets are not for the local node.
|
Incoming packets are always sent to the TUN/TAP device, even if the packets are not for the local node.
|
||||||
This is less efficient, but allows the kernel to apply its routing and firewall rules on them,
|
This is less efficient, but allows the kernel to apply its routing and firewall rules on them,
|
||||||
and can also help debugging.
|
and can also help debugging.
|
||||||
.El
|
.El
|
||||||
|
|
||||||
.It Va GraphDumpFile Li = Ar filename Bq experimental
|
.It Va GraphDumpFile Li = Ar filename Bq experimental
|
||||||
If this option is present,
|
If this option is present,
|
||||||
.Nm tinc
|
.Nm tinc
|
||||||
|
@ -291,16 +259,20 @@ If
|
||||||
starts with a pipe symbol |,
|
starts with a pipe symbol |,
|
||||||
then the rest of the filename is interpreted as a shell command
|
then the rest of the filename is interpreted as a shell command
|
||||||
that is executed, the graph is then sent to stdin.
|
that is executed, the graph is then sent to stdin.
|
||||||
|
|
||||||
.It Va Hostnames Li = yes | no Pq no
|
.It Va Hostnames Li = yes | no Pq no
|
||||||
This option selects whether IP addresses (both real and on the VPN) should
|
This option selects whether IP addresses (both real and on the VPN) should
|
||||||
be resolved. Since DNS lookups are blocking, it might affect tinc's
|
be resolved. Since DNS lookups are blocking, it might affect tinc's
|
||||||
efficiency, even stopping the daemon for a few seconds every time it does
|
efficiency, even stopping the daemon for a few seconds every time it does
|
||||||
a lookup if your DNS server is not responding.
|
a lookup if your DNS server is not responding.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
This does not affect resolving hostnames to IP addresses from the
|
This does not affect resolving hostnames to IP addresses from the
|
||||||
host configuration files, but whether hostnames should be resolved while logging.
|
host configuration files.
|
||||||
|
|
||||||
.It Va IffOneQueue Li = yes | no Po no Pc Bq experimental
|
.It Va IffOneQueue Li = yes | no Po no Pc Bq experimental
|
||||||
(Linux only) Set IFF_ONE_QUEUE flag on TUN/TAP devices.
|
(Linux only) Set IFF_ONE_QUEUE flag on TUN/TAP devices.
|
||||||
|
|
||||||
.It Va Interface Li = Ar interface
|
.It Va Interface Li = Ar interface
|
||||||
Defines the name of the interface corresponding to the virtual network device.
|
Defines the name of the interface corresponding to the virtual network device.
|
||||||
Depending on the operating system and the type of device this may or may not actually set the name of the interface.
|
Depending on the operating system and the type of device this may or may not actually set the name of the interface.
|
||||||
|
@ -308,117 +280,85 @@ Under Windows, this variable is used to select which network interface will be u
|
||||||
If you specified a
|
If you specified a
|
||||||
.Va Device ,
|
.Va Device ,
|
||||||
this variable is almost always already correctly set.
|
this variable is almost always already correctly set.
|
||||||
|
|
||||||
.It Va KeyExpire Li = Ar seconds Pq 3600
|
.It Va KeyExpire Li = Ar seconds Pq 3600
|
||||||
This option controls the period the encryption keys used to encrypt the data are valid.
|
This option controls the period the encryption keys used to encrypt the data are valid.
|
||||||
It is common practice to change keys at regular intervals to make it even harder for crackers,
|
It is common practice to change keys at regular intervals to make it even harder for crackers,
|
||||||
even though it is thought to be nearly impossible to crack a single key.
|
even though it is thought to be nearly impossible to crack a single key.
|
||||||
.It Va LocalDiscovery Li = yes | no Po no Pc Bq experimental
|
|
||||||
When enabled,
|
|
||||||
.Nm tinc
|
|
||||||
will try to detect peers that are on the same local network.
|
|
||||||
This will allow direct communication using LAN addresses, even if both peers are behind a NAT
|
|
||||||
and they only ConnectTo a third node outside the NAT,
|
|
||||||
which normally would prevent the peers from learning each other's LAN address.
|
|
||||||
.Pp
|
|
||||||
Currently, local discovery is implemented by sending broadcast packets to the LAN during path MTU discovery.
|
|
||||||
This feature may not work in all possible situations.
|
|
||||||
.It Va MACExpire Li = Ar seconds Pq 600
|
.It Va MACExpire Li = Ar seconds Pq 600
|
||||||
This option controls the amount of time MAC addresses are kept before they are removed.
|
This option controls the amount of time MAC addresses are kept before they are removed.
|
||||||
This only has effect when
|
This only has effect when
|
||||||
.Va Mode
|
.Va Mode
|
||||||
is set to
|
is set to
|
||||||
.Qq switch .
|
.Qq switch .
|
||||||
|
|
||||||
.It Va MaxTimeout Li = Ar seconds Pq 900
|
.It Va MaxTimeout Li = Ar seconds Pq 900
|
||||||
This is the maximum delay before trying to reconnect to other tinc daemons.
|
This is the maximum delay before trying to reconnect to other tinc daemons.
|
||||||
|
|
||||||
.It Va Mode Li = router | switch | hub Pq router
|
.It Va Mode Li = router | switch | hub Pq router
|
||||||
This option selects the way packets are routed to other daemons.
|
This option selects the way packets are routed to other daemons.
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
|
|
||||||
.It router
|
.It router
|
||||||
In this mode
|
In this mode
|
||||||
.Va Subnet
|
.Va Subnet
|
||||||
variables in the host configuration files will be used to form a routing table.
|
variables in the host configuration files will be used to form a routing table.
|
||||||
Only unicast packets of routable protocols (IPv4 and IPv6) are supported in this mode.
|
Only unicast packets of routable protocols (IPv4 and IPv6) are supported in this mode.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
This is the default mode, and unless you really know you need another mode, don't change it.
|
This is the default mode, and unless you really know you need another mode, don't change it.
|
||||||
|
|
||||||
.It switch
|
.It switch
|
||||||
In this mode the MAC addresses of the packets on the VPN will be used to
|
In this mode the MAC addresses of the packets on the VPN will be used to
|
||||||
dynamically create a routing table just like an Ethernet switch does.
|
dynamically create a routing table just like an Ethernet switch does.
|
||||||
Unicast, multicast and broadcast packets of every protocol that runs over Ethernet are supported in this mode
|
Unicast, multicast and broadcast packets of every protocol that runs over Ethernet are supported in this mode
|
||||||
at the cost of frequent broadcast ARP requests and routing table updates.
|
at the cost of frequent broadcast ARP requests and routing table updates.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
This mode is primarily useful if you want to bridge Ethernet segments.
|
This mode is primarily useful if you want to bridge Ethernet segments.
|
||||||
|
|
||||||
.It hub
|
.It hub
|
||||||
This mode is almost the same as the switch mode, but instead
|
This mode is almost the same as the switch mode, but instead
|
||||||
every packet will be broadcast to the other daemons
|
every packet will be broadcast to the other daemons
|
||||||
while no routing table is managed.
|
while no routing table is managed.
|
||||||
.El
|
.El
|
||||||
|
|
||||||
.It Va Name Li = Ar name Bq required
|
.It Va Name Li = Ar name Bq required
|
||||||
This is the name which identifies this tinc daemon.
|
This is the name which identifies this tinc daemon.
|
||||||
It must be unique for the virtual private network this daemon will connect to.
|
It must be unique for the virtual private network this daemon will connect to.
|
||||||
The Name may only consist of alphanumeric and underscore characters.
|
|
||||||
If
|
|
||||||
.Va Name
|
|
||||||
starts with a
|
|
||||||
.Li $ ,
|
|
||||||
then the contents of the environment variable that follows will be used.
|
|
||||||
In that case, invalid characters will be converted to underscores.
|
|
||||||
If
|
|
||||||
.Va Name
|
|
||||||
is
|
|
||||||
.Li $HOST ,
|
|
||||||
but no such environment variable exist, the hostname will be read using the gethostname() system call.
|
|
||||||
.It Va PingInterval Li = Ar seconds Pq 60
|
.It Va PingInterval Li = Ar seconds Pq 60
|
||||||
The number of seconds of inactivity that
|
The number of seconds of inactivity that
|
||||||
.Nm tinc
|
.Nm tinc
|
||||||
will wait before sending a probe to the other end.
|
will wait before sending a probe to the other end.
|
||||||
|
|
||||||
.It Va PingTimeout Li = Ar seconds Pq 5
|
.It Va PingTimeout Li = Ar seconds Pq 5
|
||||||
The number of seconds to wait for a response to pings or to allow meta
|
The number of seconds to wait for a response to pings or to allow meta
|
||||||
connections to block. If the other end doesn't respond within this time,
|
connections to block. If the other end doesn't respond within this time,
|
||||||
the connection is terminated,
|
the connection is terminated,
|
||||||
and the others will be notified of this.
|
and the others will be notified of this.
|
||||||
|
|
||||||
.It Va PriorityInheritance Li = yes | no Po no Pc Bq experimental
|
.It Va PriorityInheritance Li = yes | no Po no Pc Bq experimental
|
||||||
When this option is enabled the value of the TOS field of tunneled IPv4 packets
|
When this option is enabled the value of the TOS field of tunneled IPv4 packets
|
||||||
will be inherited by the UDP packets that are sent out.
|
will be inherited by the UDP packets that are sent out.
|
||||||
|
|
||||||
.It Va PrivateKey Li = Ar key Bq obsolete
|
.It Va PrivateKey Li = Ar key Bq obsolete
|
||||||
The private RSA key of this tinc daemon.
|
The private RSA key of this tinc daemon.
|
||||||
It will allow this tinc daemon to authenticate itself to other daemons.
|
It will allow this tinc daemon to authenticate itself to other daemons.
|
||||||
|
|
||||||
.It Va PrivateKeyFile Li = Ar filename Po Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /rsa_key.priv Pc
|
.It Va PrivateKeyFile Li = Ar filename Po Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /rsa_key.priv Pc
|
||||||
The file in which the private RSA key of this tinc daemon resides.
|
The file in which the private RSA key of this tinc daemon resides.
|
||||||
|
Note that there must be exactly one of
|
||||||
|
.Va PrivateKey
|
||||||
|
or
|
||||||
|
.Va PrivateKeyFile
|
||||||
|
specified in the configuration file.
|
||||||
|
|
||||||
.It Va ProcessPriority Li = low | normal | high
|
.It Va ProcessPriority Li = low | normal | high
|
||||||
When this option is used the priority of the tincd process will be adjusted.
|
When this option is used the priority of the tincd process will be adjusted.
|
||||||
Increasing the priority may help to reduce latency and packet loss on the VPN.
|
Increasing the priority may help to reduce latency and packet loss on the VPN.
|
||||||
.It Va Proxy Li = socks4 | socks5 | http | exec Ar ... Bq experimental
|
|
||||||
Use a proxy when making outgoing connections.
|
|
||||||
The following proxy types are currently supported:
|
|
||||||
.Bl -tag -width indent
|
|
||||||
.It socks4 Ar address Ar port Op Ar username
|
|
||||||
Connects to the proxy using the SOCKS version 4 protocol.
|
|
||||||
Optionally, a
|
|
||||||
.Ar username
|
|
||||||
can be supplied which will be passed on to the proxy server.
|
|
||||||
Only IPv4 connections can be proxied using SOCKS 4.
|
|
||||||
.It socks5 Ar address Ar port Op Ar username Ar password
|
|
||||||
Connect to the proxy using the SOCKS version 5 protocol.
|
|
||||||
If a
|
|
||||||
.Ar username
|
|
||||||
and
|
|
||||||
.Ar password
|
|
||||||
are given, basic username/password authentication will be used,
|
|
||||||
otherwise no authentication will be used.
|
|
||||||
.It http Ar address Ar port
|
|
||||||
Connects to the proxy and sends a HTTP CONNECT request.
|
|
||||||
.It exec Ar command
|
|
||||||
Executes the given
|
|
||||||
.Ar command
|
|
||||||
which should set up the outgoing connection.
|
|
||||||
The environment variables
|
|
||||||
.Ev NAME ,
|
|
||||||
.Ev NODE ,
|
|
||||||
.Ev REMOTEADDRES
|
|
||||||
and
|
|
||||||
.Ev REMOTEPORT
|
|
||||||
are available.
|
|
||||||
.El
|
|
||||||
.It Va ReplayWindow Li = Ar bytes Pq 16
|
.It Va ReplayWindow Li = Ar bytes Pq 16
|
||||||
This is the size of the replay tracking window for each remote node, in bytes.
|
This is the size of the replay tracking window for each remote node, in bytes.
|
||||||
The window is a bitfield which tracks 1 packet per bit, so for example
|
The window is a bitfield which tracks 1 packet per bit, so for example
|
||||||
|
@ -428,30 +368,35 @@ the interaction of replay tracking with underlying real packet loss and/or
|
||||||
reordering. Setting this to zero will disable replay tracking completely and
|
reordering. Setting this to zero will disable replay tracking completely and
|
||||||
pass all traffic, but leaves tinc vulnerable to replay-based attacks on your
|
pass all traffic, but leaves tinc vulnerable to replay-based attacks on your
|
||||||
traffic.
|
traffic.
|
||||||
|
|
||||||
.It Va StrictSubnets Li = yes | no Po no Pc Bq experimental
|
.It Va StrictSubnets Li = yes | no Po no Pc Bq experimental
|
||||||
When this option is enabled tinc will only use Subnet statements which are
|
When this option is enabled tinc will only use Subnet statements which are
|
||||||
present in the host config files in the local
|
present in the host config files in the local
|
||||||
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/
|
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/
|
||||||
directory. Subnets learned via connections to other nodes and which are not
|
directory.
|
||||||
present in the local host config files are ignored.
|
|
||||||
.It Va TunnelServer Li = yes | no Po no Pc Bq experimental
|
.It Va TunnelServer Li = yes | no Po no Pc Bq experimental
|
||||||
When this option is enabled tinc will no longer forward information between other tinc daemons,
|
When this option is enabled tinc will no longer forward information between other tinc daemons,
|
||||||
and will only allow connections with nodes for which host config files are present in the local
|
and will only allow connections with nodes for which host config files are present in the local
|
||||||
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/
|
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/
|
||||||
directory.
|
directory.
|
||||||
Setting this options also implicitly sets StrictSubnets.
|
Setting this options also implicitly sets StrictSubnets.
|
||||||
|
|
||||||
.It Va UDPRcvBuf Li = Ar bytes Pq OS default
|
.It Va UDPRcvBuf Li = Ar bytes Pq OS default
|
||||||
Sets the socket receive buffer size for the UDP socket, in bytes.
|
Sets the socket receive buffer size for the UDP socket, in bytes.
|
||||||
If unset, the default buffer size will be used by the operating system.
|
If unset, the default buffer size will be used by the operating system.
|
||||||
|
|
||||||
.It Va UDPSndBuf Li = Ar bytes Pq OS default
|
.It Va UDPSndBuf Li = Ar bytes Pq OS default
|
||||||
Sets the socket send buffer size for the UDP socket, in bytes.
|
Sets the socket send buffer size for the UDP socket, in bytes.
|
||||||
If unset, the default buffer size will be used by the operating system.
|
If unset, the default buffer size will be used by the operating system.
|
||||||
.El
|
.El
|
||||||
|
|
||||||
.Sh HOST CONFIGURATION FILES
|
.Sh HOST CONFIGURATION FILES
|
||||||
The host configuration files contain all information needed
|
The host configuration files contain all information needed
|
||||||
to establish a connection to those hosts.
|
to establish a connection to those hosts.
|
||||||
A host configuration file is also required for the local tinc daemon,
|
A host configuration file is also required for the local tinc daemon,
|
||||||
it will use it to read in it's listen port, public key and subnets.
|
it will use it to read in it's listen port, public key and subnets.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
The idea is that these files are portable.
|
The idea is that these files are portable.
|
||||||
You can safely mail your own host configuration file to someone else.
|
You can safely mail your own host configuration file to someone else.
|
||||||
|
@ -460,7 +405,8 @@ and now his tinc daemon will be able to connect to your tinc daemon.
|
||||||
Since host configuration files only contain public keys,
|
Since host configuration files only contain public keys,
|
||||||
no secrets are revealed by sending out this information.
|
no secrets are revealed by sending out this information.
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
.It Va Address Li = Ar address Oo Ar port Oc Bq recommended
|
|
||||||
|
.It Va Address Li = Ar address Oo port Oc Bq recommended
|
||||||
The IP address or hostname of this tinc daemon on the real network.
|
The IP address or hostname of this tinc daemon on the real network.
|
||||||
This will only be used when trying to make an outgoing connection to this tinc daemon.
|
This will only be used when trying to make an outgoing connection to this tinc daemon.
|
||||||
Optionally, a port can be specified to use for this address.
|
Optionally, a port can be specified to use for this address.
|
||||||
|
@ -468,51 +414,66 @@ Multiple
|
||||||
.Va Address
|
.Va Address
|
||||||
variables can be specified, in which case each address will be tried until a working
|
variables can be specified, in which case each address will be tried until a working
|
||||||
connection has been established.
|
connection has been established.
|
||||||
.It Va Cipher Li = Ar cipher Pq aes-256-cbc
|
|
||||||
|
.It Va Cipher Li = Ar cipher Pq blowfish
|
||||||
The symmetric cipher algorithm used to encrypt UDP packets.
|
The symmetric cipher algorithm used to encrypt UDP packets.
|
||||||
Any cipher supported by LibreSSL or OpenSSL is recognised.
|
Any cipher supported by OpenSSL is recognised.
|
||||||
Furthermore, specifying
|
Furthermore, specifying
|
||||||
.Qq none
|
.Qq none
|
||||||
will turn off packet encryption.
|
will turn off packet encryption.
|
||||||
It is best to use only those ciphers which support CBC mode.
|
It is best to use only those ciphers which support CBC mode.
|
||||||
|
|
||||||
.It Va ClampMSS Li = yes | no Pq yes
|
.It Va ClampMSS Li = yes | no Pq yes
|
||||||
This option specifies whether tinc should clamp the maximum segment size (MSS)
|
This option specifies whether tinc should clamp the maximum segment size (MSS)
|
||||||
of TCP packets to the path MTU. This helps in situations where ICMP
|
of TCP packets to the path MTU. This helps in situations where ICMP
|
||||||
Fragmentation Needed or Packet too Big messages are dropped by firewalls.
|
Fragmentation Needed or Packet too Big messages are dropped by firewalls.
|
||||||
|
|
||||||
.It Va Compression Li = Ar level Pq 0
|
.It Va Compression Li = Ar level Pq 0
|
||||||
This option sets the level of compression used for UDP packets.
|
This option sets the level of compression used for UDP packets.
|
||||||
Possible values are 0 (off), 1 (fast zlib) and any integer up to 9 (best zlib),
|
Possible values are 0 (off), 1 (fast zlib) and any integer up to 9 (best zlib),
|
||||||
10 (fast lzo) and 11 (best lzo).
|
10 (fast lzo) and 11 (best lzo).
|
||||||
.It Va Digest Li = Ar digest Pq sha256
|
|
||||||
|
.It Va Digest Li = Ar digest Pq sha1
|
||||||
The digest algorithm used to authenticate UDP packets.
|
The digest algorithm used to authenticate UDP packets.
|
||||||
Any digest supported by LibreSSL or OpenSSL is recognised.
|
Any digest supported by OpenSSL is recognised.
|
||||||
Furthermore, specifying
|
Furthermore, specifying
|
||||||
.Qq none
|
.Qq none
|
||||||
will turn off packet authentication.
|
will turn off packet authentication.
|
||||||
|
|
||||||
.It Va IndirectData Li = yes | no Pq no
|
.It Va IndirectData Li = yes | no Pq no
|
||||||
When set to yes, only nodes which already have a meta connection to you
|
This option specifies whether other tinc daemons besides the one you specified with
|
||||||
will try to establish direct communication with you.
|
.Va ConnectTo
|
||||||
It is best to leave this option out or set it to no.
|
can make a direct connection to you.
|
||||||
|
This is especially useful if you are behind a firewall
|
||||||
|
and it is impossible to make a connection from the outside to your tinc daemon.
|
||||||
|
Otherwise, it is best to leave this option out or set it to no.
|
||||||
|
|
||||||
.It Va MACLength Li = Ar length Pq 4
|
.It Va MACLength Li = Ar length Pq 4
|
||||||
The length of the message authentication code used to authenticate UDP packets.
|
The length of the message authentication code used to authenticate UDP packets.
|
||||||
Can be anything from
|
Can be anything from
|
||||||
.Qq 0
|
.Qq 0
|
||||||
up to the length of the digest produced by the digest algorithm.
|
up to the length of the digest produced by the digest algorithm.
|
||||||
|
|
||||||
.It Va PMTU Li = Ar mtu Po 1514 Pc
|
.It Va PMTU Li = Ar mtu Po 1514 Pc
|
||||||
This option controls the initial path MTU to this node.
|
This option controls the initial path MTU to this node.
|
||||||
|
|
||||||
.It Va PMTUDiscovery Li = yes | no Po yes Pc
|
.It Va PMTUDiscovery Li = yes | no Po yes Pc
|
||||||
When this option is enabled, tinc will try to discover the path MTU to this node.
|
When this option is enabled, tinc will try to discover the path MTU to this node.
|
||||||
After the path MTU has been discovered, it will be enforced on the VPN.
|
After the path MTU has been discovered, it will be enforced on the VPN.
|
||||||
|
|
||||||
.It Va Port Li = Ar port Pq 655
|
.It Va Port Li = Ar port Pq 655
|
||||||
The port number on which this tinc daemon is listening for incoming connections,
|
The port number on which this tinc daemon is listening for incoming connections,
|
||||||
which is used if no port number is specified in an
|
which is used if no port number is specified in an
|
||||||
.Va Address
|
.Va Address
|
||||||
statement.
|
statement.
|
||||||
|
|
||||||
.It Va PublicKey Li = Ar key Bq obsolete
|
.It Va PublicKey Li = Ar key Bq obsolete
|
||||||
The public RSA key of this tinc daemon.
|
The public RSA key of this tinc daemon.
|
||||||
It will be used to cryptographically verify it's identity and to set up a secure connection.
|
It will be used to cryptographically verify it's identity and to set up a secure connection.
|
||||||
|
|
||||||
.It Va PublicKeyFile Li = Ar filename Bq obsolete
|
.It Va PublicKeyFile Li = Ar filename Bq obsolete
|
||||||
The file in which the public RSA key of this tinc daemon resides.
|
The file in which the public RSA key of this tinc daemon resides.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
From version 1.0pre4 on
|
From version 1.0pre4 on
|
||||||
.Nm tinc
|
.Nm tinc
|
||||||
|
@ -521,6 +482,7 @@ the above two options then are not necessary.
|
||||||
Either the PEM format is used, or exactly one of the above two options must be specified
|
Either the PEM format is used, or exactly one of the above two options must be specified
|
||||||
in each host configuration file,
|
in each host configuration file,
|
||||||
if you want to be able to establish a connection with that host.
|
if you want to be able to establish a connection with that host.
|
||||||
|
|
||||||
.It Va Subnet Li = Ar address Ns Op Li / Ns Ar prefixlength Ns Op Li # Ns Ar weight
|
.It Va Subnet Li = Ar address Ns Op Li / Ns Ar prefixlength Ns Op Li # Ns Ar weight
|
||||||
The subnet which this tinc daemon will serve.
|
The subnet which this tinc daemon will serve.
|
||||||
.Nm tinc
|
.Nm tinc
|
||||||
|
@ -530,22 +492,26 @@ it will be sent to the daemon who has this subnet in his host configuration file
|
||||||
Multiple
|
Multiple
|
||||||
.Va Subnet
|
.Va Subnet
|
||||||
variables can be specified.
|
variables can be specified.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
Subnets can either be single MAC, IPv4 or IPv6 addresses,
|
Subnets can either be single MAC, IPv4 or IPv6 addresses,
|
||||||
in which case a subnet consisting of only that single address is assumed,
|
in which case a subnet consisting of only that single address is assumed,
|
||||||
or they can be a IPv4 or IPv6 network address with a prefixlength.
|
or they can be a IPv4 or IPv6 network address with a prefixlength.
|
||||||
|
Shorthand notations are not supported.
|
||||||
For example, IPv4 subnets must be in a form like 192.168.1.0/24,
|
For example, IPv4 subnets must be in a form like 192.168.1.0/24,
|
||||||
where 192.168.1.0 is the network address and 24 is the number of bits set in the netmask.
|
where 192.168.1.0 is the network address and 24 is the number of bits set in the netmask.
|
||||||
Note that subnets like 192.168.1.1/24 are invalid!
|
Note that subnets like 192.168.1.1/24 are invalid!
|
||||||
Read a networking HOWTO/FAQ/guide if you don't understand this.
|
Read a networking HOWTO/FAQ/guide if you don't understand this.
|
||||||
IPv6 subnets are notated like fec0:0:0:1::/64.
|
IPv6 subnets are notated like fec0:0:0:1:0:0:0:0/64.
|
||||||
MAC addresses are notated like 0:1a:2b:3c:4d:5e.
|
MAC addresses are notated like 0:1a:2b:3c:4d:5e.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
A Subnet can be given a weight to indicate its priority over identical Subnets
|
A Subnet can be given a weight to indicate its priority over identical Subnets
|
||||||
owned by different nodes. The default weight is 10. Lower values indicate
|
owned by different nodes. The default weight is 10. Lower values indicate
|
||||||
higher priority. Packets will be sent to the node with the highest priority,
|
higher priority. Packets will be sent to the node with the highest priority,
|
||||||
unless that node is not reachable, in which case the node with the next highest
|
unless that node is not reachable, in which case the node with the next highest
|
||||||
priority will be tried, and so on.
|
priority will be tried, and so on.
|
||||||
|
|
||||||
.It Va TCPOnly Li = yes | no Pq no Bq obsolete
|
.It Va TCPOnly Li = yes | no Pq no Bq obsolete
|
||||||
If this variable is set to yes,
|
If this variable is set to yes,
|
||||||
then the packets are tunnelled over the TCP connection instead of a UDP connection.
|
then the packets are tunnelled over the TCP connection instead of a UDP connection.
|
||||||
|
@ -553,51 +519,53 @@ This is especially useful for those who want to run a tinc daemon
|
||||||
from behind a masquerading firewall,
|
from behind a masquerading firewall,
|
||||||
or if UDP packet routing is disabled somehow.
|
or if UDP packet routing is disabled somehow.
|
||||||
Setting this options also implicitly sets IndirectData.
|
Setting this options also implicitly sets IndirectData.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
Since version 1.0.10, tinc will automatically detect whether communication via
|
Since version 1.0.10, tinc will automatically detect whether communication via
|
||||||
UDP is possible or not.
|
UDP is possible or not.
|
||||||
.El
|
.El
|
||||||
|
|
||||||
.Sh SCRIPTS
|
.Sh SCRIPTS
|
||||||
Apart from reading the server and host configuration files,
|
Apart from reading the server and host configuration files,
|
||||||
tinc can also run scripts at certain moments.
|
tinc can also run scripts at certain moments.
|
||||||
Below is a list of filenames of scripts and a description of when they are run.
|
Under Windows (not Cygwin), the scripts should have the extension
|
||||||
A script is only run if it exists and if it is executable.
|
|
||||||
.Pp
|
|
||||||
Scripts are run synchronously;
|
|
||||||
this means that tinc will temporarily stop processing packets until the called script finishes executing.
|
|
||||||
This guarantees that scripts will execute in the exact same order as the events that trigger them.
|
|
||||||
If you need to run commands asynchronously, you have to ensure yourself that they are being run in the background.
|
|
||||||
.Pp
|
|
||||||
Under Windows (not Cygwin), the scripts must have the extension
|
|
||||||
.Pa .bat .
|
.Pa .bat .
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc-up
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc-up
|
||||||
This is the most important script.
|
This is the most important script.
|
||||||
If it is present it will be executed right after the tinc daemon has been started and has connected to the virtual network device.
|
If it is present it will be executed right after the tinc daemon has been started and has connected to the virtual network device.
|
||||||
It should be used to set up the corresponding network interface,
|
It should be used to set up the corresponding network interface,
|
||||||
but can also be used to start other things.
|
but can also be used to start other things.
|
||||||
.Pp
|
|
||||||
Under Windows you can use the Network Connections control panel instead of creating this script.
|
Under Windows you can use the Network Connections control panel instead of creating this script.
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc-down
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc-down
|
||||||
This script is started right before the tinc daemon quits.
|
This script is started right before the tinc daemon quits.
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/ Ns Ar HOST Ns Pa -up
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/ Ns Ar HOST Ns Pa -up
|
||||||
This script is started when the tinc daemon with name
|
This script is started when the tinc daemon with name
|
||||||
.Ar HOST
|
.Ar HOST
|
||||||
becomes reachable.
|
becomes reachable.
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/ Ns Ar HOST Ns Pa -down
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/ Ns Ar HOST Ns Pa -down
|
||||||
This script is started when the tinc daemon with name
|
This script is started when the tinc daemon with name
|
||||||
.Ar HOST
|
.Ar HOST
|
||||||
becomes unreachable.
|
becomes unreachable.
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /host-up
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /host-up
|
||||||
This script is started when any host becomes reachable.
|
This script is started when any host becomes reachable.
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /host-down
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /host-down
|
||||||
This script is started when any host becomes unreachable.
|
This script is started when any host becomes unreachable.
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /subnet-up
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /subnet-up
|
||||||
This script is started when a Subnet becomes reachable.
|
This script is started when a Subnet becomes reachable.
|
||||||
The Subnet and the node it belongs to are passed in environment variables.
|
The Subnet and the node it belongs to are passed in environment variables.
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /subnet-down
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /subnet-down
|
||||||
This script is started when a Subnet becomes unreachable.
|
This script is started when a Subnet becomes unreachable.
|
||||||
.El
|
.El
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
The scripts are started without command line arguments, but can make use of certain environment variables.
|
The scripts are started without command line arguments, but can make use of certain environment variables.
|
||||||
Under UNIX like operating systems the names of environment variables must be preceded by a
|
Under UNIX like operating systems the names of environment variables must be preceded by a
|
||||||
|
@ -609,56 +577,68 @@ files, they have to be put between
|
||||||
.Li %
|
.Li %
|
||||||
signs.
|
signs.
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
|
|
||||||
.It Ev NETNAME
|
.It Ev NETNAME
|
||||||
If a netname was specified, this environment variable contains it.
|
If a netname was specified, this environment variable contains it.
|
||||||
|
|
||||||
.It Ev NAME
|
.It Ev NAME
|
||||||
Contains the name of this tinc daemon.
|
Contains the name of this tinc daemon.
|
||||||
|
|
||||||
.It Ev DEVICE
|
.It Ev DEVICE
|
||||||
Contains the name of the virtual network device that tinc uses.
|
Contains the name of the virtual network device that tinc uses.
|
||||||
|
|
||||||
.It Ev INTERFACE
|
.It Ev INTERFACE
|
||||||
Contains the name of the virtual network interface that tinc uses.
|
Contains the name of the virtual network interface that tinc uses.
|
||||||
This should be used for commands like
|
This should be used for commands like
|
||||||
.Pa ifconfig .
|
.Pa ifconfig .
|
||||||
|
|
||||||
.It Ev NODE
|
.It Ev NODE
|
||||||
When a host becomes (un)reachable, this is set to its name.
|
When a host becomes (un)reachable, this is set to its name.
|
||||||
If a subnet becomes (un)reachable, this is set to the owner of that subnet.
|
If a subnet becomes (un)reachable, this is set to the owner of that subnet.
|
||||||
|
|
||||||
.It Ev REMOTEADDRESS
|
.It Ev REMOTEADDRESS
|
||||||
When a host becomes (un)reachable, this is set to its real address.
|
When a host becomes (un)reachable, this is set to its real address.
|
||||||
|
|
||||||
.It Ev REMOTEPORT
|
.It Ev REMOTEPORT
|
||||||
When a host becomes (un)reachable, this is set to the port number it uses for communication with other tinc daemons.
|
When a host becomes (un)reachable, this is set to the port number it uses for communication with other tinc daemons.
|
||||||
|
|
||||||
.It Ev SUBNET
|
.It Ev SUBNET
|
||||||
When a subnet becomes (un)reachable, this is set to the subnet.
|
When a subnet becomes (un)reachable, this is set to the subnet.
|
||||||
|
|
||||||
.It Ev WEIGHT
|
.It Ev WEIGHT
|
||||||
When a subnet becomes (un)reachable, this is set to the subnet weight.
|
When a subnet becomes (un)reachable, this is set to the subnet weight.
|
||||||
.El
|
.El
|
||||||
.Pp
|
|
||||||
Do not forget that under UNIX operating systems, you have to make the scripts executable, using the command
|
|
||||||
.Nm chmod Li a+x Pa script .
|
|
||||||
.Sh FILES
|
.Sh FILES
|
||||||
The most important files are:
|
The most important files are:
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/
|
.It Pa @sysconfdir@/tinc/
|
||||||
The top directory for configuration files.
|
The top directory for configuration files.
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc.conf
|
||||||
The default name of the server configuration file for net
|
The default name of the server configuration file for net
|
||||||
.Ar NETNAME .
|
.Ar NETNAME .
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /conf.d/
|
|
||||||
Optional directory from which any *.conf file will be loaded
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/
|
||||||
Host configuration files are kept in this directory.
|
Host configuration files are kept in this directory.
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc-up
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc-up
|
||||||
If an executable file with this name exists,
|
If an executable file with this name exists,
|
||||||
it will be executed right after the tinc daemon has connected to the virtual network device.
|
it will be executed right after the tinc daemon has connected to the virtual network device.
|
||||||
It can be used to set up the corresponding network interface.
|
It can be used to set up the corresponding network interface.
|
||||||
|
|
||||||
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc-down
|
.It Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /tinc-down
|
||||||
If an executable file with this name exists,
|
If an executable file with this name exists,
|
||||||
it will be executed right before the tinc daemon is going to close
|
it will be executed right before the tinc daemon is going to close
|
||||||
its connection to the virtual network device.
|
its connection to the virtual network device.
|
||||||
.El
|
.El
|
||||||
|
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr tincd 8 ,
|
.Xr tincd 8 ,
|
||||||
.Pa https://www.tinc-vpn.org/ ,
|
.Pa http://www.tinc-vpn.org/ ,
|
||||||
.Pa http://www.tldp.org/LDP/nag2/ .
|
.Pa http://www.linuxdoc.org/LDP/nag2/ .
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
The full documentation for
|
The full documentation for
|
||||||
.Nm tinc
|
.Nm tinc
|
||||||
|
@ -666,6 +646,7 @@ is maintained as a Texinfo manual.
|
||||||
If the info and tinc programs are properly installed at your site, the command
|
If the info and tinc programs are properly installed at your site, the command
|
||||||
.Ic info tinc
|
.Ic info tinc
|
||||||
should give you access to the complete manual.
|
should give you access to the complete manual.
|
||||||
|
|
||||||
.Pp
|
.Pp
|
||||||
.Nm tinc
|
.Nm tinc
|
||||||
comes with ABSOLUTELY NO WARRANTY.
|
comes with ABSOLUTELY NO WARRANTY.
|
||||||
|
|
1909
doc/tinc.info
1909
doc/tinc.info
File diff suppressed because it is too large
Load diff
766
doc/tinc.texi
766
doc/tinc.texi
File diff suppressed because it is too large
Load diff
194
doc/tincctl.8.in
Normal file
194
doc/tincctl.8.in
Normal file
|
@ -0,0 +1,194 @@
|
||||||
|
.Dd 2011-06-25
|
||||||
|
.Dt TINCCTL 8
|
||||||
|
.\" Manual page created by:
|
||||||
|
.\" Scott Lamb
|
||||||
|
.Sh NAME
|
||||||
|
.Nm tincctl
|
||||||
|
.Nd tinc VPN control
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm
|
||||||
|
.Op Fl cn
|
||||||
|
.Op Fl -config Ns = Ns Ar DIR
|
||||||
|
.Op Fl -net Ns = Ns Ar NETNAME
|
||||||
|
.Op Fl -pidfile Ns = Ns Ar FILENAME
|
||||||
|
.Op Fl -help
|
||||||
|
.Op Fl -version
|
||||||
|
.Ar COMMAND
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
This is the control program of tinc, a secure virtual private network (VPN)
|
||||||
|
project.
|
||||||
|
.Nm
|
||||||
|
communicates with
|
||||||
|
.Xr tincd 8
|
||||||
|
to alter and inspect the running VPN's state.
|
||||||
|
.Sh OPTIONS
|
||||||
|
.Bl -tag -width indent
|
||||||
|
.It Fl n, -net Ns = Ns Ar NETNAME
|
||||||
|
Communicate with tincd(8) connected with
|
||||||
|
.Ar NETNAME .
|
||||||
|
.It Fl -pidfile Ns = Ns Ar FILENAME
|
||||||
|
Use the cookie from
|
||||||
|
.Ar FILENAME
|
||||||
|
to authenticate with a running tinc daemon.
|
||||||
|
If unspecified, the default is
|
||||||
|
.Pa @localstatedir@/run/tinc. Ns Ar NETNAME Ns Pa .pid.
|
||||||
|
.It Fl -help
|
||||||
|
Display short list of options.
|
||||||
|
.It Fl -version
|
||||||
|
Output version information and exit.
|
||||||
|
.El
|
||||||
|
.Sh COMMANDS
|
||||||
|
.zZ
|
||||||
|
.Bl -tag -width indent
|
||||||
|
.It start
|
||||||
|
Start
|
||||||
|
.Xr tincd 8 .
|
||||||
|
.It stop
|
||||||
|
Stop
|
||||||
|
.Xr tincd 8 .
|
||||||
|
.It restart
|
||||||
|
Restart
|
||||||
|
.Xr tincd 8 .
|
||||||
|
.It reload
|
||||||
|
Partially rereads configuration files. Connections to hosts whose host
|
||||||
|
config files are removed are closed. New outgoing connections specified
|
||||||
|
in
|
||||||
|
.Xr tinc.conf 5
|
||||||
|
will be made.
|
||||||
|
.It pid
|
||||||
|
Shows the PID of the currently running
|
||||||
|
.Xr tincd 8 .
|
||||||
|
.It generate-keys Op bits
|
||||||
|
Generate both RSA and ECDSA keypairs (see below) and exit.
|
||||||
|
.It generate-ecdsa-keys
|
||||||
|
Generate public/private ECDSA keypair and exit.
|
||||||
|
.It generate-rsa-keys Op bits
|
||||||
|
Generate public/private RSA keypair and exit.
|
||||||
|
If
|
||||||
|
.Ar bits
|
||||||
|
is omitted, the default length will be 2048 bits.
|
||||||
|
When saving keys to existing files, tinc will not delete the old keys;
|
||||||
|
you have to remove them manually.
|
||||||
|
.It dump nodes
|
||||||
|
Dump a list of all known nodes in the VPN.
|
||||||
|
.It dump edges
|
||||||
|
Dump a list of all known connections in the VPN.
|
||||||
|
.It dump subnets
|
||||||
|
Dump a list of all known subnets in the VPN.
|
||||||
|
.It dump connections
|
||||||
|
Dump a list of all meta connections with ourself.
|
||||||
|
.It dump graph
|
||||||
|
Dump a graph of the VPN in
|
||||||
|
.Xr dotty 1
|
||||||
|
format.
|
||||||
|
.It purge
|
||||||
|
Purges all information remembered about unreachable nodes.
|
||||||
|
.It debug Ar N
|
||||||
|
Sets debug level to
|
||||||
|
.Ar N .
|
||||||
|
.It retry
|
||||||
|
Forces
|
||||||
|
.Xr tincd 8
|
||||||
|
to try to connect to all uplinks immediately.
|
||||||
|
Usually
|
||||||
|
.Xr tincd 8
|
||||||
|
attempts to do this itself,
|
||||||
|
but increases the time it waits between the attempts each time it failed,
|
||||||
|
and if
|
||||||
|
.Xr tincd 8
|
||||||
|
didn't succeed to connect to an uplink the first time after it started,
|
||||||
|
it defaults to the maximum time of 15 minutes.
|
||||||
|
.It disconnect Ar NODE
|
||||||
|
Closes the meta connection with the given
|
||||||
|
.Ar NODE .
|
||||||
|
.It top
|
||||||
|
If
|
||||||
|
.Nm
|
||||||
|
is compiled with libcurses support, this will display live traffic statistics
|
||||||
|
for all the known nodes, similar to the UNIX
|
||||||
|
.Xr top 1
|
||||||
|
command.
|
||||||
|
See below for more information.
|
||||||
|
.It pcap
|
||||||
|
Dump VPN traffic going through the local tinc node in
|
||||||
|
.Xr pcap-savefile 5
|
||||||
|
format to standard output,
|
||||||
|
from where it can be redirected to a file or piped through a program that can parse it directly,
|
||||||
|
such as
|
||||||
|
.Xr tcpdump 8 .
|
||||||
|
.El
|
||||||
|
.Sh EXAMPLES
|
||||||
|
Examples of some commands:
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
tincctl -n vpn dump graph | circo -Txlib
|
||||||
|
tincctl -n vpn pcap | tcpdump -r -
|
||||||
|
tincctl -n vpn top
|
||||||
|
.Ed
|
||||||
|
.Sh TOP
|
||||||
|
The top command connects to a running tinc daemon and repeatedly queries its per-node traffic counters.
|
||||||
|
It displays a list of all the known nodes in the left-most column,
|
||||||
|
and the amount of bytes and packets read from and sent to each node in the other columns.
|
||||||
|
By default, the information is updated every second.
|
||||||
|
The behaviour of the top command can be changed using the following keys:
|
||||||
|
.Bl -tag
|
||||||
|
.It Ic s
|
||||||
|
Change the interval between updates.
|
||||||
|
After pressing the
|
||||||
|
.Ic s
|
||||||
|
key, enter the desired interval in seconds, followed by enter.
|
||||||
|
Fractional seconds are honored.
|
||||||
|
Intervals lower than 0.1 seconds are not allowed.
|
||||||
|
.It Ic c
|
||||||
|
Toggle between displaying current traffic rates (in packets and bytes per second)
|
||||||
|
and cummulative traffic (total packets and bytes since the tinc daemon started).
|
||||||
|
.It Ic n
|
||||||
|
Sort the list of nodes by name.
|
||||||
|
.It Ic i
|
||||||
|
Sort the list of nodes by incoming amount of bytes.
|
||||||
|
.It Ic I
|
||||||
|
Sort the list of nodes by incoming amount of packets.
|
||||||
|
.It Ic o
|
||||||
|
Sort the list of nodes by outgoing amount of bytes.
|
||||||
|
.It Ic O
|
||||||
|
Sort the list of nodes by outgoing amount of packets.
|
||||||
|
.It Ic t
|
||||||
|
Sort the list of nodes by sum of incoming and outgoing amount of bytes.
|
||||||
|
.It Ic T
|
||||||
|
Sort the list of nodes by sum of incoming and outgoing amount of packets.
|
||||||
|
.It Ic b
|
||||||
|
Show amount of traffic in bytes.
|
||||||
|
.It Ic k
|
||||||
|
Show amount of traffic in kilobytes.
|
||||||
|
.It Ic M
|
||||||
|
Show amount of traffic in megabytes.
|
||||||
|
.It Ic G
|
||||||
|
Show amount of traffic in gigabytes.
|
||||||
|
.It Ic q
|
||||||
|
Quit.
|
||||||
|
.El
|
||||||
|
.Sh BUGS
|
||||||
|
If you find any bugs, report them to tinc@tinc-vpn.org.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr tincd 8 ,
|
||||||
|
.Xr tinc.conf 5 ,
|
||||||
|
.Xr dotty 1 ,
|
||||||
|
.Xr pcap-savefile 7 ,
|
||||||
|
.Xr tcpdump 8 ,
|
||||||
|
.Xr top 1 ,
|
||||||
|
.Pa http://www.tinc-vpn.org/ ,
|
||||||
|
.Pa http://www.cabal.org/ .
|
||||||
|
.Pp
|
||||||
|
The full documentation for tinc is maintained as a Texinfo manual.
|
||||||
|
If the info and tinc programs are properly installed at your site,
|
||||||
|
the command
|
||||||
|
.Ic info tinc
|
||||||
|
should give you access to the complete manual.
|
||||||
|
.Pp
|
||||||
|
tinc comes with ABSOLUTELY NO WARRANTY.
|
||||||
|
This is free software, and you are welcome to redistribute it under certain conditions;
|
||||||
|
see the file COPYING for details.
|
||||||
|
.Sh AUTHORS
|
||||||
|
.An "Ivo Timmermans"
|
||||||
|
.An "Guus Sliepen" Aq guus@tinc-vpn.org
|
||||||
|
.Pp
|
||||||
|
And thanks to many others for their contributions to tinc!
|
|
@ -1,4 +1,4 @@
|
||||||
.Dd 2014-05-11
|
.Dd 2011-06-25
|
||||||
.Dt TINCD 8
|
.Dt TINCD 8
|
||||||
.\" Manual page created by:
|
.\" Manual page created by:
|
||||||
.\" Ivo Timmermans
|
.\" Ivo Timmermans
|
||||||
|
@ -8,17 +8,13 @@
|
||||||
.Nd tinc VPN daemon
|
.Nd tinc VPN daemon
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm
|
.Nm
|
||||||
.Op Fl cdDkKnoLRU
|
.Op Fl cdDKnLRU
|
||||||
.Op Fl -config Ns = Ns Ar DIR
|
.Op Fl -config Ns = Ns Ar DIR
|
||||||
.Op Fl -no-detach
|
.Op Fl -no-detach
|
||||||
.Op Fl -debug Ns Op = Ns Ar LEVEL
|
.Op Fl -debug Ns Op = Ns Ar LEVEL
|
||||||
.Op Fl -kill Ns Op = Ns Ar SIGNAL
|
|
||||||
.Op Fl -net Ns = Ns Ar NETNAME
|
.Op Fl -net Ns = Ns Ar NETNAME
|
||||||
.Op Fl -generate-keys Ns Op = Ns Ar BITS
|
|
||||||
.Op Fl -option Ns = Ns Ar [HOST.]KEY=VALUE
|
|
||||||
.Op Fl -mlock
|
.Op Fl -mlock
|
||||||
.Op Fl -logfile Ns Op = Ns Ar FILE
|
.Op Fl -logfile Ns Op = Ns Ar FILE
|
||||||
.Op Fl -pidfile Ns = Ns Ar FILE
|
|
||||||
.Op Fl -bypass-security
|
.Op Fl -bypass-security
|
||||||
.Op Fl -chroot
|
.Op Fl -chroot
|
||||||
.Op Fl -user Ns = Ns Ar USER
|
.Op Fl -user Ns = Ns Ar USER
|
||||||
|
@ -54,14 +50,6 @@ If not mentioned otherwise, this will show log messages on the standard error ou
|
||||||
Increase debug level or set it to
|
Increase debug level or set it to
|
||||||
.Ar LEVEL
|
.Ar LEVEL
|
||||||
(see below).
|
(see below).
|
||||||
.It Fl k, -kill Ns Op = Ns Ar SIGNAL
|
|
||||||
Attempt to kill a running
|
|
||||||
.Nm
|
|
||||||
(optionally with the specified
|
|
||||||
.Ar SIGNAL
|
|
||||||
instead of SIGTERM) and exit.
|
|
||||||
Under Windows (not Cygwin) the optional argument is ignored,
|
|
||||||
the service will always be stopped and removed.
|
|
||||||
.It Fl n, -net Ns = Ns Ar NETNAME
|
.It Fl n, -net Ns = Ns Ar NETNAME
|
||||||
Connect to net
|
Connect to net
|
||||||
.Ar NETNAME .
|
.Ar NETNAME .
|
||||||
|
@ -73,29 +61,6 @@ for
|
||||||
.Ar NETNAME
|
.Ar NETNAME
|
||||||
is the same as not specifying any
|
is the same as not specifying any
|
||||||
.Ar NETNAME .
|
.Ar NETNAME .
|
||||||
.It Fl K, -generate-keys Ns Op = Ns Ar BITS
|
|
||||||
Generate public/private RSA keypair and exit.
|
|
||||||
If
|
|
||||||
.Ar BITS
|
|
||||||
is omitted, the default length will be 2048 bits.
|
|
||||||
When saving keys to existing files, tinc will not delete the old keys,
|
|
||||||
you have to remove them manually.
|
|
||||||
.It Fl o, -option Ns = Ns Ar [HOST.]KEY=VALUE
|
|
||||||
Without specifying a
|
|
||||||
.Ar HOST ,
|
|
||||||
this will set server configuration variable
|
|
||||||
.Ar KEY
|
|
||||||
to
|
|
||||||
.Ar VALUE .
|
|
||||||
If specified as
|
|
||||||
.Ar HOST.KEY=VALUE ,
|
|
||||||
this will set the host configuration variable
|
|
||||||
.Ar KEY
|
|
||||||
of the host named
|
|
||||||
.Ar HOST
|
|
||||||
to
|
|
||||||
.Ar VALUE .
|
|
||||||
This option can be used more than once to specify multiple configuration variables.
|
|
||||||
.It Fl L, -mlock
|
.It Fl L, -mlock
|
||||||
Lock tinc into main memory.
|
Lock tinc into main memory.
|
||||||
This will prevent sensitive data like shared private keys to be written to the system swap files/partitions.
|
This will prevent sensitive data like shared private keys to be written to the system swap files/partitions.
|
||||||
|
@ -105,12 +70,16 @@ If
|
||||||
.Ar FILE
|
.Ar FILE
|
||||||
is omitted, the default is
|
is omitted, the default is
|
||||||
.Pa @localstatedir@/log/tinc. Ns Ar NETNAME Ns Pa .log.
|
.Pa @localstatedir@/log/tinc. Ns Ar NETNAME Ns Pa .log.
|
||||||
.It Fl -pidfile Ns = Ns Ar FILE
|
.It Fl -pidfile Ns = Ns Ar FILENAME
|
||||||
Write PID to
|
Store a cookie in
|
||||||
|
.Ar FILENAME
|
||||||
|
which allows
|
||||||
|
.Xr tincctl 8
|
||||||
|
to authenticate.
|
||||||
|
If
|
||||||
.Ar FILE
|
.Ar FILE
|
||||||
instead of
|
is omitted, the default is
|
||||||
.Pa @runstatedir@/tinc. Ns Ar NETNAME Ns Pa .pid.
|
.Pa @localstatedir@/run/tinc. Ns Ar NETNAME Ns Pa .pid.
|
||||||
Under Windows this option will be ignored.
|
|
||||||
.It Fl -bypass-security
|
.It Fl -bypass-security
|
||||||
Disables encryption and authentication of the meta protocol.
|
Disables encryption and authentication of the meta protocol.
|
||||||
Only useful for debugging.
|
Only useful for debugging.
|
||||||
|
@ -151,15 +120,6 @@ If the
|
||||||
.Fl -logfile
|
.Fl -logfile
|
||||||
option is used, this will also close and reopen the log file,
|
option is used, this will also close and reopen the log file,
|
||||||
useful when log rotation is used.
|
useful when log rotation is used.
|
||||||
.It INT
|
|
||||||
Temporarily increases debug level to 5.
|
|
||||||
Send this signal again to revert to the original level.
|
|
||||||
.It USR1
|
|
||||||
Dumps the connection list to syslog.
|
|
||||||
.It USR2
|
|
||||||
Dumps virtual network device statistics, all known nodes, edges and subnets to syslog.
|
|
||||||
.It WINCH
|
|
||||||
Purges all information remembered about unreachable nodes.
|
|
||||||
.El
|
.El
|
||||||
.Sh DEBUG LEVELS
|
.Sh DEBUG LEVELS
|
||||||
The tinc daemon can send a lot of messages to the syslog.
|
The tinc daemon can send a lot of messages to the syslog.
|
||||||
|
@ -190,7 +150,7 @@ This will log all network traffic over the virtual private network.
|
||||||
Directory containing the configuration files tinc uses.
|
Directory containing the configuration files tinc uses.
|
||||||
For more information, see
|
For more information, see
|
||||||
.Xr tinc.conf 5 .
|
.Xr tinc.conf 5 .
|
||||||
.It Pa @runstatedir@/tinc. Ns Ar NETNAME Ns Pa .pid
|
.It Pa @localstatedir@/run/tinc. Ns Ar NETNAME Ns Pa .pid
|
||||||
The PID of the currently running
|
The PID of the currently running
|
||||||
.Nm
|
.Nm
|
||||||
is stored in this file.
|
is stored in this file.
|
||||||
|
@ -206,8 +166,9 @@ If you find any bugs, report them to tinc@tinc-vpn.org.
|
||||||
.Sh TODO
|
.Sh TODO
|
||||||
A lot, especially security auditing.
|
A lot, especially security auditing.
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
|
.Xr tincctl 8 ,
|
||||||
.Xr tinc.conf 5 ,
|
.Xr tinc.conf 5 ,
|
||||||
.Pa https://www.tinc-vpn.org/ ,
|
.Pa http://www.tinc-vpn.org/ ,
|
||||||
.Pa http://www.cabal.org/ .
|
.Pa http://www.cabal.org/ .
|
||||||
.Pp
|
.Pp
|
||||||
The full documentation for tinc is maintained as a Texinfo manual.
|
The full documentation for tinc is maintained as a Texinfo manual.
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
@set VERSION 1.0.35
|
|
||||||
@set PACKAGE tinc
|
|
||||||
@set sysconfdir /etc
|
|
||||||
@set localstatedir /var
|
|
||||||
@set runstatedir /var/run
|
|
|
@ -2,4 +2,3 @@
|
||||||
@set PACKAGE @PACKAGE@
|
@set PACKAGE @PACKAGE@
|
||||||
@set sysconfdir @sysconfdir@
|
@set sysconfdir @sysconfdir@
|
||||||
@set localstatedir @localstatedir@
|
@set localstatedir @localstatedir@
|
||||||
@set runstatedir @runstatedir@
|
|
||||||
|
|
3
gui/Makefile.am
Normal file
3
gui/Makefile.am
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
dist_bin_SCRIPTS = tinc-gui
|
||||||
|
|
||||||
|
extra_DIST = README.gui
|
|
@ -1,8 +1,9 @@
|
||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
||||||
|
# Inc.
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
# with or without modifications, as long as this notice is preserved.
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
@ -15,61 +16,6 @@
|
||||||
@SET_MAKE@
|
@SET_MAKE@
|
||||||
|
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
am__is_gnu_make = { \
|
|
||||||
if test -z '$(MAKELEVEL)'; then \
|
|
||||||
false; \
|
|
||||||
elif test -n '$(MAKE_HOST)'; then \
|
|
||||||
true; \
|
|
||||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
|
||||||
true; \
|
|
||||||
else \
|
|
||||||
false; \
|
|
||||||
fi; \
|
|
||||||
}
|
|
||||||
am__make_running_with_option = \
|
|
||||||
case $${target_option-} in \
|
|
||||||
?) ;; \
|
|
||||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
|
||||||
"target option '$${target_option-}' specified" >&2; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
has_opt=no; \
|
|
||||||
sane_makeflags=$$MAKEFLAGS; \
|
|
||||||
if $(am__is_gnu_make); then \
|
|
||||||
sane_makeflags=$$MFLAGS; \
|
|
||||||
else \
|
|
||||||
case $$MAKEFLAGS in \
|
|
||||||
*\\[\ \ ]*) \
|
|
||||||
bs=\\; \
|
|
||||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
|
||||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
|
||||||
esac; \
|
|
||||||
fi; \
|
|
||||||
skip_next=no; \
|
|
||||||
strip_trailopt () \
|
|
||||||
{ \
|
|
||||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
|
||||||
}; \
|
|
||||||
for flg in $$sane_makeflags; do \
|
|
||||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
|
||||||
case $$flg in \
|
|
||||||
*=*|--*) continue;; \
|
|
||||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
|
||||||
-*I?*) strip_trailopt 'I';; \
|
|
||||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
|
||||||
-*O?*) strip_trailopt 'O';; \
|
|
||||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
|
||||||
-*l?*) strip_trailopt 'l';; \
|
|
||||||
-[dEDm]) skip_next=yes;; \
|
|
||||||
-[JT]) skip_next=yes;; \
|
|
||||||
esac; \
|
|
||||||
case $$flg in \
|
|
||||||
*$$target_option*) has_opt=yes; break;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
test $$has_opt = yes
|
|
||||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
|
||||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
@ -88,42 +34,20 @@ PRE_UNINSTALL = :
|
||||||
POST_UNINSTALL = :
|
POST_UNINSTALL = :
|
||||||
build_triplet = @build@
|
build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
subdir = systemd
|
subdir = gui
|
||||||
|
DIST_COMMON = $(dist_bin_SCRIPTS) $(srcdir)/Makefile.am \
|
||||||
|
$(srcdir)/Makefile.in
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
||||||
$(top_srcdir)/m4/ax_append_flag.m4 \
|
$(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/libevent.m4 \
|
||||||
$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
|
$(top_srcdir)/m4/lzo.m4 $(top_srcdir)/m4/openssl.m4 \
|
||||||
$(top_srcdir)/m4/ax_check_compile_flag.m4 \
|
$(top_srcdir)/m4/zlib.m4 $(top_srcdir)/configure.in
|
||||||
$(top_srcdir)/m4/ax_check_link_flag.m4 \
|
|
||||||
$(top_srcdir)/m4/ax_require_defined.m4 $(top_srcdir)/m4/lzo.m4 \
|
|
||||||
$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/zlib.m4 \
|
|
||||||
$(top_srcdir)/configure.ac
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h
|
CONFIG_HEADER = $(top_builddir)/config.h
|
||||||
CONFIG_CLEAN_FILES =
|
CONFIG_CLEAN_FILES =
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
|
||||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
|
||||||
am__v_P_0 = false
|
|
||||||
am__v_P_1 = :
|
|
||||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
|
||||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
|
||||||
am__v_GEN_0 = @echo " GEN " $@;
|
|
||||||
am__v_GEN_1 =
|
|
||||||
AM_V_at = $(am__v_at_@AM_V@)
|
|
||||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
|
||||||
am__v_at_0 = @
|
|
||||||
am__v_at_1 =
|
|
||||||
SOURCES =
|
|
||||||
DIST_SOURCES =
|
|
||||||
am__can_run_installinfo = \
|
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
|
||||||
n|no|NO) false;; \
|
|
||||||
*) (install-info --version) >/dev/null 2>&1;; \
|
|
||||||
esac
|
|
||||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||||
am__vpath_adj = case $$p in \
|
am__vpath_adj = case $$p in \
|
||||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
@ -145,20 +69,13 @@ am__nobase_list = $(am__nobase_strip_setup); \
|
||||||
am__base_list = \
|
am__base_list = \
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||||
am__uninstall_files_from_dir = { \
|
am__installdirs = "$(DESTDIR)$(bindir)"
|
||||||
test -z "$$files" \
|
SCRIPTS = $(dist_bin_SCRIPTS)
|
||||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
SOURCES =
|
||||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
DIST_SOURCES =
|
||||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
|
||||||
}
|
|
||||||
am__installdirs = "$(DESTDIR)$(systemddir)"
|
|
||||||
DATA = $(nodist_systemd_DATA)
|
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
ACLOCAL = @ACLOCAL@
|
ACLOCAL = @ACLOCAL@
|
||||||
AMTAR = @AMTAR@
|
AMTAR = @AMTAR@
|
||||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
AUTOCONF = @AUTOCONF@
|
||||||
AUTOHEADER = @AUTOHEADER@
|
AUTOHEADER = @AUTOHEADER@
|
||||||
AUTOMAKE = @AUTOMAKE@
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
@ -168,6 +85,7 @@ CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CURSES_LIBS = @CURSES_LIBS@
|
||||||
CYGPATH_W = @CYGPATH_W@
|
CYGPATH_W = @CYGPATH_W@
|
||||||
DEFS = @DEFS@
|
DEFS = @DEFS@
|
||||||
DEPDIR = @DEPDIR@
|
DEPDIR = @DEPDIR@
|
||||||
|
@ -177,15 +95,21 @@ ECHO_T = @ECHO_T@
|
||||||
EGREP = @EGREP@
|
EGREP = @EGREP@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
GREP = @GREP@
|
GREP = @GREP@
|
||||||
|
INCLUDES = @INCLUDES@
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
|
||||||
|
LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
|
||||||
|
LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
LN_S = @LN_S@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
OBJEXT = @OBJEXT@
|
OBJEXT = @OBJEXT@
|
||||||
|
@ -197,6 +121,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
SET_MAKE = @SET_MAKE@
|
SET_MAKE = @SET_MAKE@
|
||||||
SHELL = @SHELL@
|
SHELL = @SHELL@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
|
@ -243,28 +168,20 @@ pdfdir = @pdfdir@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
program_transform_name = @program_transform_name@
|
program_transform_name = @program_transform_name@
|
||||||
psdir = @psdir@
|
psdir = @psdir@
|
||||||
runstatedir = @runstatedir@
|
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
systemd_path = @systemd_path@
|
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
top_build_prefix = @top_build_prefix@
|
top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
EXTRA_DIST = tinc.service.in tinc@.service.in
|
dist_bin_SCRIPTS = tinc-gui
|
||||||
CLEANFILES = tinc.service tinc@.service
|
extra_DIST = README.gui
|
||||||
@WITH_SYSTEMD_TRUE@systemddir = @systemd_path@
|
|
||||||
@WITH_SYSTEMD_TRUE@nodist_systemd_DATA = tinc.service tinc@.service
|
|
||||||
substitute = sed \
|
|
||||||
-e s,'@sbindir\@',"$(sbindir)",g \
|
|
||||||
-e s,'@sysconfdir\@',"$(sysconfdir)",g
|
|
||||||
|
|
||||||
all: all-am
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
@for dep in $?; do \
|
@for dep in $?; do \
|
||||||
case '$(am__configure_deps)' in \
|
case '$(am__configure_deps)' in \
|
||||||
*$$dep*) \
|
*$$dep*) \
|
||||||
|
@ -273,58 +190,69 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
exit 1;; \
|
exit 1;; \
|
||||||
esac; \
|
esac; \
|
||||||
done; \
|
done; \
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu systemd/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gui/Makefile'; \
|
||||||
$(am__cd) $(top_srcdir) && \
|
$(am__cd) $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu systemd/Makefile
|
$(AUTOMAKE) --gnu gui/Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
||||||
*config.status*) \
|
*config.status*) \
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
*) \
|
*) \
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
$(am__aclocal_m4_deps):
|
$(am__aclocal_m4_deps):
|
||||||
install-nodist_systemdDATA: $(nodist_systemd_DATA)
|
install-dist_binSCRIPTS: $(dist_bin_SCRIPTS)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
@list='$(nodist_systemd_DATA)'; test -n "$(systemddir)" || list=; \
|
test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
|
||||||
if test -n "$$list"; then \
|
@list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(systemddir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(systemddir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do \
|
for p in $$list; do \
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
echo "$$d$$p"; \
|
if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
|
||||||
done | $(am__base_list) | \
|
done | \
|
||||||
while read files; do \
|
sed -e 'p;s,.*/,,;n' \
|
||||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(systemddir)'"; \
|
-e 'h;s|.*|.|' \
|
||||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(systemddir)" || exit $$?; \
|
-e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
|
||||||
done
|
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
|
||||||
|
{ d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
|
||||||
|
if ($$2 == $$4) { files[d] = files[d] " " $$1; \
|
||||||
|
if (++n[d] == $(am__install_max)) { \
|
||||||
|
print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
|
||||||
|
else { print "f", d "/" $$4, $$1 } } \
|
||||||
|
END { for (d in files) print "f", d, files[d] }' | \
|
||||||
|
while read type dir files; do \
|
||||||
|
if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
|
||||||
|
test -z "$$files" || { \
|
||||||
|
echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
|
||||||
|
$(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
|
||||||
|
} \
|
||||||
|
; done
|
||||||
|
|
||||||
uninstall-nodist_systemdDATA:
|
uninstall-dist_binSCRIPTS:
|
||||||
@$(NORMAL_UNINSTALL)
|
@$(NORMAL_UNINSTALL)
|
||||||
@list='$(nodist_systemd_DATA)'; test -n "$(systemddir)" || list=; \
|
@list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
|
||||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
files=`for p in $$list; do echo "$$p"; done | \
|
||||||
dir='$(DESTDIR)$(systemddir)'; $(am__uninstall_files_from_dir)
|
sed -e 's,.*/,,;$(transform)'`; \
|
||||||
tags TAGS:
|
test -n "$$list" || exit 0; \
|
||||||
|
echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
|
||||||
|
cd "$(DESTDIR)$(bindir)" && rm -f $$files
|
||||||
|
tags: TAGS
|
||||||
|
TAGS:
|
||||||
|
|
||||||
ctags CTAGS:
|
ctags: CTAGS
|
||||||
|
CTAGS:
|
||||||
cscope cscopelist:
|
|
||||||
|
|
||||||
|
|
||||||
distdir: $(BUILT_SOURCES)
|
distdir: $(DISTFILES)
|
||||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
|
||||||
|
|
||||||
distdir-am: $(DISTFILES)
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
list='$(DISTFILES)'; \
|
list='$(DISTFILES)'; \
|
||||||
|
@ -356,9 +284,9 @@ distdir-am: $(DISTFILES)
|
||||||
done
|
done
|
||||||
check-am: all-am
|
check-am: all-am
|
||||||
check: check-am
|
check: check-am
|
||||||
all-am: Makefile $(DATA)
|
all-am: Makefile $(SCRIPTS)
|
||||||
installdirs:
|
installdirs:
|
||||||
for dir in "$(DESTDIR)$(systemddir)"; do \
|
for dir in "$(DESTDIR)$(bindir)"; do \
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||||
done
|
done
|
||||||
install: install-am
|
install: install-am
|
||||||
|
@ -371,19 +299,13 @@ install-am: all-am
|
||||||
|
|
||||||
installcheck: installcheck-am
|
installcheck: installcheck-am
|
||||||
install-strip:
|
install-strip:
|
||||||
if test -z '$(STRIP)'; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
install; \
|
`test -z '$(STRIP)' || \
|
||||||
else \
|
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
|
||||||
fi
|
|
||||||
mostlyclean-generic:
|
mostlyclean-generic:
|
||||||
|
|
||||||
clean-generic:
|
clean-generic:
|
||||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
|
||||||
|
|
||||||
distclean-generic:
|
distclean-generic:
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
@ -412,13 +334,13 @@ info: info-am
|
||||||
|
|
||||||
info-am:
|
info-am:
|
||||||
|
|
||||||
install-data-am: install-nodist_systemdDATA
|
install-data-am:
|
||||||
|
|
||||||
install-dvi: install-dvi-am
|
install-dvi: install-dvi-am
|
||||||
|
|
||||||
install-dvi-am:
|
install-dvi-am:
|
||||||
|
|
||||||
install-exec-am:
|
install-exec-am: install-dist_binSCRIPTS
|
||||||
|
|
||||||
install-html: install-html-am
|
install-html: install-html-am
|
||||||
|
|
||||||
|
@ -456,30 +378,22 @@ ps: ps-am
|
||||||
|
|
||||||
ps-am:
|
ps-am:
|
||||||
|
|
||||||
uninstall-am: uninstall-nodist_systemdDATA
|
uninstall-am: uninstall-dist_binSCRIPTS
|
||||||
|
|
||||||
.MAKE: install-am install-strip
|
.MAKE: install-am install-strip
|
||||||
|
|
||||||
.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
|
.PHONY: all all-am check check-am clean clean-generic distclean \
|
||||||
ctags-am distclean distclean-generic distdir dvi dvi-am html \
|
distclean-generic distdir dvi dvi-am html html-am info info-am \
|
||||||
html-am info info-am install install-am install-data \
|
install install-am install-data install-data-am \
|
||||||
install-data-am install-dvi install-dvi-am install-exec \
|
install-dist_binSCRIPTS install-dvi install-dvi-am \
|
||||||
install-exec-am install-html install-html-am install-info \
|
install-exec install-exec-am install-html install-html-am \
|
||||||
install-info-am install-man install-nodist_systemdDATA \
|
install-info install-info-am install-man install-pdf \
|
||||||
install-pdf install-pdf-am install-ps install-ps-am \
|
install-pdf-am install-ps install-ps-am install-strip \
|
||||||
install-strip installcheck installcheck-am installdirs \
|
installcheck installcheck-am installdirs maintainer-clean \
|
||||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
|
||||||
mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \
|
pdf-am ps ps-am uninstall uninstall-am \
|
||||||
uninstall-am uninstall-nodist_systemdDATA
|
uninstall-dist_binSCRIPTS
|
||||||
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
|
|
||||||
|
|
||||||
tinc.service: $(srcdir)/tinc.service.in
|
|
||||||
$(AM_V_GEN)$(substitute) $(srcdir)/tinc.service.in > $@
|
|
||||||
|
|
||||||
tinc@.service: $(srcdir)/tinc@.service.in
|
|
||||||
$(AM_V_GEN)$(substitute) $(srcdir)/tinc@.service.in > $@
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
537
gui/tinc-gui
Executable file
537
gui/tinc-gui
Executable file
|
@ -0,0 +1,537 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import string
|
||||||
|
import socket
|
||||||
|
import wx
|
||||||
|
import sys
|
||||||
|
from wx.lib.mixins.listctrl import ColumnSorterMixin
|
||||||
|
from wx.lib.mixins.listctrl import ListCtrlAutoWidthMixin
|
||||||
|
|
||||||
|
# Classes to interface with a running tinc daemon
|
||||||
|
|
||||||
|
REQ_STOP = 0
|
||||||
|
REQ_RELOAD = 1
|
||||||
|
REQ_RESTART = 2
|
||||||
|
REQ_DUMP_NODES = 3
|
||||||
|
REQ_DUMP_EDGES = 4
|
||||||
|
REQ_DUMP_SUBNETS = 5
|
||||||
|
REQ_DUMP_CONNECTIONS = 6
|
||||||
|
REQ_DUMP_GRAPH = 7
|
||||||
|
REQ_PURGE = 8
|
||||||
|
REQ_SET_DEBUG = 9
|
||||||
|
REQ_RETRY = 10
|
||||||
|
REQ_CONNECT = 11
|
||||||
|
REQ_DISCONNECT = 12
|
||||||
|
|
||||||
|
ID = 0
|
||||||
|
ACK = 4
|
||||||
|
CONTROL = 18
|
||||||
|
|
||||||
|
class Node:
|
||||||
|
def parse(self, args):
|
||||||
|
self.name = args[0]
|
||||||
|
self.address = args[2]
|
||||||
|
if args[3] != 'port':
|
||||||
|
args.insert(3, 'port')
|
||||||
|
args.insert(4, '')
|
||||||
|
self.port = args[4]
|
||||||
|
self.cipher = int(args[6])
|
||||||
|
self.digest = int(args[8])
|
||||||
|
self.maclength = int(args[10])
|
||||||
|
self.compression = int(args[12])
|
||||||
|
self.options = int(args[14], 0x10)
|
||||||
|
self.status = int(args[16], 0x10)
|
||||||
|
self.nexthop = args[18]
|
||||||
|
self.via = args[20]
|
||||||
|
self.distance = int(args[22])
|
||||||
|
self.pmtu = int(args[24])
|
||||||
|
self.minmtu = int(args[26])
|
||||||
|
self.maxmtu = int(args[28][:-1])
|
||||||
|
|
||||||
|
self.subnets = {}
|
||||||
|
|
||||||
|
class Edge:
|
||||||
|
def parse(self, args):
|
||||||
|
self.fr = args[0]
|
||||||
|
self.to = args[2]
|
||||||
|
self.address = args[4]
|
||||||
|
self.port = args[6]
|
||||||
|
self.options = int(args[8], 16)
|
||||||
|
self.weight = int(args[10])
|
||||||
|
|
||||||
|
class Subnet:
|
||||||
|
def parse(self, args):
|
||||||
|
if args[0].find('#') >= 0:
|
||||||
|
(address, self.weight) = args[0].split('#', 1)
|
||||||
|
else:
|
||||||
|
self.weight = 10
|
||||||
|
address = args[0]
|
||||||
|
|
||||||
|
if address.find('/') >= 0:
|
||||||
|
(self.address, self.prefixlen) = address.split('/', 1)
|
||||||
|
else:
|
||||||
|
self.address = address
|
||||||
|
self.prefixlen = '48'
|
||||||
|
|
||||||
|
self.owner = args[2]
|
||||||
|
|
||||||
|
class Connection:
|
||||||
|
def parse(self, args):
|
||||||
|
self.name = args[0]
|
||||||
|
self.address = args[2]
|
||||||
|
if args[3] != 'port':
|
||||||
|
args.insert(3, 'port')
|
||||||
|
args.insert(4, '')
|
||||||
|
self.port = args[4]
|
||||||
|
self.options = int(args[6], 0x10)
|
||||||
|
self.socket = int(args[8])
|
||||||
|
self.status = int(args[10], 0x10)
|
||||||
|
self.weight = 123
|
||||||
|
|
||||||
|
class VPN:
|
||||||
|
confdir = '/etc/tinc'
|
||||||
|
piddir = '/var/run/'
|
||||||
|
|
||||||
|
def connect(self):
|
||||||
|
f = open(self.pidfile)
|
||||||
|
info = string.split(f.readline())
|
||||||
|
f.close()
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
s.connect((info[2], int(info[4])))
|
||||||
|
self.sf = s.makefile()
|
||||||
|
s.close()
|
||||||
|
hello = string.split(self.sf.readline())
|
||||||
|
self.name = hello[1]
|
||||||
|
self.sf.write('0 ^' + info[1] + ' 17\r\n')
|
||||||
|
self.sf.flush()
|
||||||
|
resp = string.split(self.sf.readline())
|
||||||
|
self.port = info[4]
|
||||||
|
self.nodes = {}
|
||||||
|
self.edges = {}
|
||||||
|
self.subnets = {}
|
||||||
|
self.connections = {}
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
|
def refresh(self):
|
||||||
|
self.sf.write('18 3\r\n18 4\r\n18 5\r\n18 6\r\n')
|
||||||
|
self.sf.flush()
|
||||||
|
|
||||||
|
for node in self.nodes.values():
|
||||||
|
node.visited = False
|
||||||
|
for edge in self.edges.values():
|
||||||
|
edge.visited = False
|
||||||
|
for subnet in self.subnets.values():
|
||||||
|
subnet.visited = False
|
||||||
|
for connections in self.connections.values():
|
||||||
|
connections.visited = False
|
||||||
|
|
||||||
|
while True:
|
||||||
|
resp = string.split(self.sf.readline())
|
||||||
|
if len(resp) < 2:
|
||||||
|
break
|
||||||
|
if resp[0] != '18':
|
||||||
|
break
|
||||||
|
if resp[1] == '3':
|
||||||
|
if len(resp) < 3:
|
||||||
|
continue
|
||||||
|
node = self.nodes.get(resp[2]) or Node()
|
||||||
|
node.parse(resp[2:])
|
||||||
|
node.visited = True
|
||||||
|
self.nodes[resp[2]] = node
|
||||||
|
elif resp[1] == '4':
|
||||||
|
if len(resp) < 5:
|
||||||
|
continue
|
||||||
|
edge = self.nodes.get((resp[2], resp[4])) or Edge()
|
||||||
|
edge.parse(resp[2:])
|
||||||
|
edge.visited = True
|
||||||
|
self.edges[(resp[2], resp[4])] = edge
|
||||||
|
elif resp[1] == '5':
|
||||||
|
if len(resp) < 5:
|
||||||
|
continue
|
||||||
|
subnet = self.subnets.get((resp[2], resp[4])) or Subnet()
|
||||||
|
subnet.parse(resp[2:])
|
||||||
|
subnet.visited = True
|
||||||
|
self.subnets[(resp[2], resp[4])] = subnet
|
||||||
|
self.nodes[subnet.owner].subnets[resp[2]] = subnet
|
||||||
|
elif resp[1] == '6':
|
||||||
|
if len(resp) < 5:
|
||||||
|
break
|
||||||
|
connection = self.connections.get((resp[2], resp[4])) or Connection()
|
||||||
|
connection.parse(resp[2:])
|
||||||
|
connection.visited = True
|
||||||
|
self.connections[(resp[2], resp[4])] = connection
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
for key, subnet in self.subnets.items():
|
||||||
|
if not subnet.visited:
|
||||||
|
del self.subnets[key]
|
||||||
|
|
||||||
|
for key, edge in self.edges.items():
|
||||||
|
if not edge.visited:
|
||||||
|
del self.edges[key]
|
||||||
|
|
||||||
|
for key, node in self.nodes.items():
|
||||||
|
if not node.visited:
|
||||||
|
del self.nodes[key]
|
||||||
|
else:
|
||||||
|
for key, subnet in node.subnets.items():
|
||||||
|
if not subnet.visited:
|
||||||
|
del node.subnets[key]
|
||||||
|
|
||||||
|
for key, connection in self.connections.items():
|
||||||
|
if not connection.visited:
|
||||||
|
del self.connections[key]
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
self.sf.close()
|
||||||
|
|
||||||
|
def disconnect(self, name):
|
||||||
|
self.sf.write('18 12 ' + name + '\r\n')
|
||||||
|
self.sf.flush()
|
||||||
|
resp = string.split(self.sf.readline())
|
||||||
|
|
||||||
|
def debug(self, level = -1):
|
||||||
|
self.sf.write('18 9 ' + str(level) + '\r\n')
|
||||||
|
self.sf.flush()
|
||||||
|
resp = string.split(self.sf.readline())
|
||||||
|
return int(resp[2])
|
||||||
|
|
||||||
|
def __init__(self, netname = None, pidfile = None):
|
||||||
|
self.tincconf = VPN.confdir + '/'
|
||||||
|
|
||||||
|
if netname:
|
||||||
|
self.netname = netname
|
||||||
|
self.tincconf += netname + '/'
|
||||||
|
|
||||||
|
self.tincconf += 'tinc.conf'
|
||||||
|
|
||||||
|
if pidfile is not None:
|
||||||
|
self.pidfile = pidfile
|
||||||
|
else:
|
||||||
|
self.pidfile = VPN.piddir + 'tinc.'
|
||||||
|
if netname:
|
||||||
|
self.pidfile += netname + '.'
|
||||||
|
self.pidfile += 'pid'
|
||||||
|
|
||||||
|
# GUI starts here
|
||||||
|
|
||||||
|
argv0 = sys.argv[0]
|
||||||
|
del sys.argv[0]
|
||||||
|
net = None
|
||||||
|
pidfile = None
|
||||||
|
|
||||||
|
def usage(exitcode = 0):
|
||||||
|
print('Usage: ' + argv0 + ' [options]')
|
||||||
|
print('\nValid options are:')
|
||||||
|
print(' -n, --net=NETNAME Connect to net NETNAME.')
|
||||||
|
print(' --pidfile=FILENAME Read control cookie from FILENAME.')
|
||||||
|
print(' --help Display this help and exit.')
|
||||||
|
print('\nReport bugs to tinc@tinc-vpn.org.')
|
||||||
|
sys.exit(exitcode)
|
||||||
|
|
||||||
|
while len(sys.argv):
|
||||||
|
if sys.argv[0] in ('-n', '--net'):
|
||||||
|
del sys.argv[0]
|
||||||
|
net = sys.argv[0]
|
||||||
|
elif sys.argv[0] in ('--pidfile'):
|
||||||
|
del sys.argv[0]
|
||||||
|
pidfile = sys.argv[0]
|
||||||
|
elif sys.argv[0] in ('--help'):
|
||||||
|
usage(0)
|
||||||
|
else:
|
||||||
|
print(argv0 + ': unrecognized option \'' + sys.argv[0] + '\'')
|
||||||
|
usage(1)
|
||||||
|
|
||||||
|
del sys.argv[0]
|
||||||
|
|
||||||
|
vpn = VPN(net, pidfile)
|
||||||
|
vpn.connect()
|
||||||
|
|
||||||
|
class SuperListCtrl(wx.ListCtrl, ColumnSorterMixin, ListCtrlAutoWidthMixin):
|
||||||
|
def __init__(self, parent, style):
|
||||||
|
wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES)
|
||||||
|
ListCtrlAutoWidthMixin.__init__(self)
|
||||||
|
ColumnSorterMixin.__init__(self, 14)
|
||||||
|
|
||||||
|
def GetListCtrl(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
|
class SettingsPage(wx.Panel):
|
||||||
|
def OnDebugLevel(self, event):
|
||||||
|
vpn.debug(self.debug.GetValue())
|
||||||
|
|
||||||
|
def __init__(self, parent, id):
|
||||||
|
wx.Panel.__init__(self, parent, id)
|
||||||
|
grid = wx.FlexGridSizer(cols = 2)
|
||||||
|
grid.AddGrowableCol(0, 1)
|
||||||
|
|
||||||
|
namelabel = wx.StaticText(self, -1, 'Name:')
|
||||||
|
self.name = wx.TextCtrl(self, -1, vpn.name)
|
||||||
|
grid.Add(namelabel)
|
||||||
|
grid.Add(self.name)
|
||||||
|
|
||||||
|
portlabel = wx.StaticText(self, -1, 'Port:')
|
||||||
|
self.port = wx.TextCtrl(self, -1, vpn.port)
|
||||||
|
grid.Add(portlabel)
|
||||||
|
grid.Add(self.port)
|
||||||
|
|
||||||
|
debuglabel = wx.StaticText(self, -1, 'Debug level:')
|
||||||
|
self.debug = wx.SpinCtrl(self, min = 0, max = 5, initial = vpn.debug())
|
||||||
|
self.debug.Bind(wx.EVT_SPINCTRL, self.OnDebugLevel)
|
||||||
|
grid.Add(debuglabel)
|
||||||
|
grid.Add(self.debug)
|
||||||
|
|
||||||
|
modelabel = wx.StaticText(self, -1, 'Mode:')
|
||||||
|
self.mode = wx.ComboBox(self, -1, style = wx.CB_READONLY, value = 'Router', choices = ['Router', 'Switch', 'Hub'])
|
||||||
|
grid.Add(modelabel)
|
||||||
|
grid.Add(self.mode)
|
||||||
|
|
||||||
|
self.SetSizer(grid)
|
||||||
|
|
||||||
|
class ConnectionsPage(wx.Panel):
|
||||||
|
def __init__(self, parent, id):
|
||||||
|
wx.Panel.__init__(self, parent, id)
|
||||||
|
self.list = wx.ListCtrl(self, id, style=wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES)
|
||||||
|
self.list.InsertColumn(0, 'Name')
|
||||||
|
self.list.InsertColumn(1, 'Address')
|
||||||
|
self.list.InsertColumn(2, 'Port')
|
||||||
|
self.list.InsertColumn(3, 'Options')
|
||||||
|
self.list.InsertColumn(4, 'Weight')
|
||||||
|
|
||||||
|
hbox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
hbox.Add(self.list, 1, wx.EXPAND)
|
||||||
|
self.SetSizer(hbox)
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
|
class ContextMenu(wx.Menu):
|
||||||
|
def __init__(self, item):
|
||||||
|
wx.Menu.__init__(self)
|
||||||
|
|
||||||
|
self.item = item
|
||||||
|
|
||||||
|
disconnect = wx.MenuItem(self, -1, 'Disconnect')
|
||||||
|
self.AppendItem(disconnect)
|
||||||
|
self.Bind(wx.EVT_MENU, self.OnDisconnect, id=disconnect.GetId())
|
||||||
|
|
||||||
|
def OnDisconnect(self, event):
|
||||||
|
vpn.disconnect(self.item[0])
|
||||||
|
|
||||||
|
def OnContext(self, event):
|
||||||
|
i = event.GetIndex()
|
||||||
|
self.PopupMenu(self.ContextMenu(self.list.itemDataMap[event.GetIndex()]), event.GetPosition())
|
||||||
|
|
||||||
|
def refresh(self):
|
||||||
|
self.list.itemDataMap = {}
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
for key, connection in vpn.connections.items():
|
||||||
|
if self.list.GetItemCount() <= i:
|
||||||
|
self.list.InsertStringItem(i, connection.name)
|
||||||
|
else:
|
||||||
|
self.list.SetStringItem(i, 0, connection.name)
|
||||||
|
self.list.SetStringItem(i, 1, connection.address)
|
||||||
|
self.list.SetStringItem(i, 2, connection.port)
|
||||||
|
self.list.SetStringItem(i, 3, str(connection.options))
|
||||||
|
self.list.SetStringItem(i, 4, str(connection.weight))
|
||||||
|
self.list.itemDataMap[i] = (connection.name, connection.address, connection.port, connection.options, connection.weight)
|
||||||
|
self.list.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.OnContext)
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
while self.list.GetItemCount() > i:
|
||||||
|
self.list.DeleteItem(self.list.GetItemCount() - 1)
|
||||||
|
|
||||||
|
|
||||||
|
class NodesPage(wx.Panel):
|
||||||
|
def __init__(self, parent, id):
|
||||||
|
wx.Panel.__init__(self, parent, id)
|
||||||
|
self.list = SuperListCtrl(self, id)
|
||||||
|
self.list.InsertColumn( 0, 'Name')
|
||||||
|
self.list.InsertColumn( 1, 'Address')
|
||||||
|
self.list.InsertColumn( 2, 'Port')
|
||||||
|
self.list.InsertColumn( 3, 'Cipher')
|
||||||
|
self.list.InsertColumn( 4, 'Digest')
|
||||||
|
self.list.InsertColumn( 5, 'MACLength')
|
||||||
|
self.list.InsertColumn( 6, 'Compression')
|
||||||
|
self.list.InsertColumn( 7, 'Options')
|
||||||
|
self.list.InsertColumn( 8, 'Status')
|
||||||
|
self.list.InsertColumn( 9, 'Nexthop')
|
||||||
|
self.list.InsertColumn(10, 'Via')
|
||||||
|
self.list.InsertColumn(11, 'Distance')
|
||||||
|
self.list.InsertColumn(12, 'PMTU')
|
||||||
|
self.list.InsertColumn(13, 'Min MTU')
|
||||||
|
self.list.InsertColumn(14, 'Max MTU')
|
||||||
|
|
||||||
|
hbox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
hbox.Add(self.list, 1, wx.EXPAND)
|
||||||
|
self.SetSizer(hbox)
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
|
def refresh(self):
|
||||||
|
self.list.itemDataMap = {}
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
for key, node in vpn.nodes.items():
|
||||||
|
if self.list.GetItemCount() <= i:
|
||||||
|
self.list.InsertStringItem(i, node.name)
|
||||||
|
else:
|
||||||
|
self.list.SetStringItem(i, 0, node.name)
|
||||||
|
self.list.SetStringItem(i, 1, node.address)
|
||||||
|
self.list.SetStringItem(i, 2, node.port)
|
||||||
|
self.list.SetStringItem(i, 3, str(node.cipher))
|
||||||
|
self.list.SetStringItem(i, 4, str(node.digest))
|
||||||
|
self.list.SetStringItem(i, 5, str(node.maclength))
|
||||||
|
self.list.SetStringItem(i, 6, str(node.compression))
|
||||||
|
self.list.SetStringItem(i, 7, str(node.options))
|
||||||
|
self.list.SetStringItem(i, 8, str(node.status))
|
||||||
|
self.list.SetStringItem(i, 9, node.nexthop)
|
||||||
|
self.list.SetStringItem(i, 10, node.via)
|
||||||
|
self.list.SetStringItem(i, 11, str(node.distance))
|
||||||
|
self.list.SetStringItem(i, 12, str(node.pmtu))
|
||||||
|
self.list.SetStringItem(i, 13, str(node.minmtu))
|
||||||
|
self.list.SetStringItem(i, 14, str(node.maxmtu))
|
||||||
|
self.list.itemDataMap[i] = (node.name, node.address, node.port, node.cipher, node.digest, node.maclength, node.compression, node.options, node.status, node.nexthop, node.via, node.distance, node.pmtu, node.minmtu, node.maxmtu)
|
||||||
|
self.list.SetItemData(i, i)
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
while self.list.GetItemCount() > i:
|
||||||
|
self.list.DeleteItem(self.list.GetItemCount() - 1)
|
||||||
|
|
||||||
|
class EdgesPage(wx.Panel):
|
||||||
|
def __init__(self, parent, id):
|
||||||
|
wx.Panel.__init__(self, parent, id)
|
||||||
|
self.list = wx.ListCtrl(self, id, style=wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES)
|
||||||
|
self.list.InsertColumn(0, 'From')
|
||||||
|
self.list.InsertColumn(1, 'To')
|
||||||
|
self.list.InsertColumn(2, 'Address')
|
||||||
|
self.list.InsertColumn(3, 'Port')
|
||||||
|
self.list.InsertColumn(4, 'Options')
|
||||||
|
self.list.InsertColumn(5, 'Weight')
|
||||||
|
|
||||||
|
hbox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
hbox.Add(self.list, 1, wx.EXPAND)
|
||||||
|
self.SetSizer(hbox)
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
|
def refresh(self):
|
||||||
|
self.list.itemDataMap = {}
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
for key, edge in vpn.edges.items():
|
||||||
|
if self.list.GetItemCount() <= i:
|
||||||
|
self.list.InsertStringItem(i, edge.fr)
|
||||||
|
else:
|
||||||
|
self.list.SetStringItem(i, 0, edge.fr)
|
||||||
|
self.list.SetStringItem(i, 1, edge.to)
|
||||||
|
self.list.SetStringItem(i, 2, edge.address)
|
||||||
|
self.list.SetStringItem(i, 3, edge.port)
|
||||||
|
self.list.SetStringItem(i, 4, str(edge.options))
|
||||||
|
self.list.SetStringItem(i, 5, str(edge.weight))
|
||||||
|
self.list.itemDataMap[i] = (edge.fr, edge.to, edge.address, edge.port, edge.options, edge.weight)
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
while self.list.GetItemCount() > i:
|
||||||
|
self.list.DeleteItem(self.list.GetItemCount() - 1)
|
||||||
|
|
||||||
|
class SubnetsPage(wx.Panel):
|
||||||
|
def __init__(self, parent, id):
|
||||||
|
wx.Panel.__init__(self, parent, id)
|
||||||
|
self.list = SuperListCtrl(self, id)
|
||||||
|
self.list.InsertColumn(0, 'Subnet', wx.LIST_FORMAT_RIGHT)
|
||||||
|
self.list.InsertColumn(1, 'Weight', wx.LIST_FORMAT_RIGHT)
|
||||||
|
self.list.InsertColumn(2, 'Owner')
|
||||||
|
hbox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
hbox.Add(self.list, 1, wx.EXPAND)
|
||||||
|
self.SetSizer(hbox)
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
|
def refresh(self):
|
||||||
|
self.list.itemDataMap = {}
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
for key, subnet in vpn.subnets.items():
|
||||||
|
if self.list.GetItemCount() <= i:
|
||||||
|
self.list.InsertStringItem(i, subnet.address + '/' + subnet.prefixlen)
|
||||||
|
else:
|
||||||
|
self.list.SetStringItem(i, 0, subnet.address + '/' + subnet.prefixlen)
|
||||||
|
self.list.SetStringItem(i, 1, subnet.weight)
|
||||||
|
self.list.SetStringItem(i, 2, subnet.owner)
|
||||||
|
self.list.itemDataMap[i] = (subnet.address + '/' + subnet.prefixlen, subnet.weight, subnet.owner)
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
while self.list.GetItemCount() > i:
|
||||||
|
self.list.DeleteItem(self.list.GetItemCount() - 1)
|
||||||
|
|
||||||
|
class StatusPage(wx.Panel):
|
||||||
|
def __init__(self, parent, id):
|
||||||
|
wx.Panel.__init__(self, parent, id)
|
||||||
|
|
||||||
|
class GraphPage(wx.Window):
|
||||||
|
def __init__(self, parent, id):
|
||||||
|
wx.Window.__init__(self, parent, id)
|
||||||
|
|
||||||
|
class NetPage(wx.Notebook):
|
||||||
|
def __init__(self, parent, id):
|
||||||
|
wx.Notebook.__init__(self, parent)
|
||||||
|
self.settings = SettingsPage(self, id)
|
||||||
|
self.connections = ConnectionsPage(self, id)
|
||||||
|
self.nodes = NodesPage(self, id)
|
||||||
|
self.edges = EdgesPage(self, id)
|
||||||
|
self.subnets = SubnetsPage(self, id)
|
||||||
|
self.graph = GraphPage(self, id)
|
||||||
|
self.status = StatusPage(self, id)
|
||||||
|
|
||||||
|
self.AddPage(self.settings, 'Settings')
|
||||||
|
#self.AddPage(self.status, 'Status')
|
||||||
|
self.AddPage(self.connections, 'Connections')
|
||||||
|
self.AddPage(self.nodes, 'Nodes')
|
||||||
|
self.AddPage(self.edges, 'Edges')
|
||||||
|
self.AddPage(self.subnets, 'Subnets')
|
||||||
|
#self.AddPage(self.graph, 'Graph')
|
||||||
|
|
||||||
|
|
||||||
|
class MainWindow(wx.Frame):
|
||||||
|
def OnQuit(self, event):
|
||||||
|
self.Close(True)
|
||||||
|
|
||||||
|
def OnTimer(self, event):
|
||||||
|
vpn.refresh()
|
||||||
|
self.np.nodes.refresh()
|
||||||
|
self.np.subnets.refresh()
|
||||||
|
self.np.edges.refresh()
|
||||||
|
self.np.connections.refresh()
|
||||||
|
|
||||||
|
def __init__(self, parent, id, title):
|
||||||
|
wx.Frame.__init__(self, parent, id, title)
|
||||||
|
|
||||||
|
menubar = wx.MenuBar()
|
||||||
|
file = wx.Menu()
|
||||||
|
file.Append(1, '&Quit\tCtrl-X', 'Quit tinc GUI')
|
||||||
|
menubar.Append(file, '&File')
|
||||||
|
|
||||||
|
#nb = wx.Notebook(self, -1)
|
||||||
|
#nb.SetPadding((0, 0))
|
||||||
|
self.np = NetPage(self, -1)
|
||||||
|
#nb.AddPage(np, 'VPN')
|
||||||
|
|
||||||
|
self.timer = wx.Timer(self, -1)
|
||||||
|
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
|
||||||
|
self.timer.Start(1000)
|
||||||
|
self.Bind(wx.EVT_MENU, self.OnQuit, id=1)
|
||||||
|
self.SetMenuBar(menubar)
|
||||||
|
self.Show()
|
||||||
|
|
||||||
|
app = wx.App()
|
||||||
|
mw = MainWindow(None, -1, 'Tinc GUI')
|
||||||
|
|
||||||
|
#def OnTaskBarIcon(event):
|
||||||
|
# mw.Raise()
|
||||||
|
#
|
||||||
|
#icon = wx.Icon("tincgui.ico", wx.BITMAP_TYPE_PNG)
|
||||||
|
#taskbaricon = wx.TaskBarIcon()
|
||||||
|
#taskbaricon.SetIcon(icon, 'Tinc GUI')
|
||||||
|
#wx.EVT_TASKBAR_RIGHT_UP(taskbaricon, OnTaskBarIcon)
|
||||||
|
|
||||||
|
app.MainLoop()
|
||||||
|
vpn.close()
|
|
@ -1,10 +1,7 @@
|
||||||
#ifndef TINC_HAVE_H
|
|
||||||
#define TINC_HAVE_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
have.h -- include headers which are known to exist
|
have.h -- include headers which are known to exist
|
||||||
Copyright (C) 1998-2005 Ivo Timmermans
|
Copyright (C) 1998-2005 Ivo Timmermans
|
||||||
2003-2015 Guus Sliepen <guus@tinc-vpn.org>
|
2003-2011 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -21,32 +18,30 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_HAVE_H__
|
||||||
|
#define __TINC_HAVE_H__
|
||||||
|
|
||||||
#ifdef HAVE_MINGW
|
#ifdef HAVE_MINGW
|
||||||
#ifdef WITH_WINDOWS2000
|
#ifdef WITH_WINDOWS2000
|
||||||
#define WINVER Windows2000
|
#define WINVER Windows2000
|
||||||
#else
|
#else
|
||||||
#define WINVER WindowsXP
|
#define WINVER WindowsXP
|
||||||
#endif
|
#endif
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_MINGW
|
#ifdef HAVE_MINGW
|
||||||
#include <w32api.h>
|
#include <w32api.h>
|
||||||
#include <winsock2.h>
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ws2tcpip.h>
|
#include <ws2tcpip.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -59,8 +54,8 @@
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_ALLOCA_H
|
#ifdef HAVE_INTTYPES_H
|
||||||
#include <alloca.h>
|
#include <inttypes.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Include system specific headers */
|
/* Include system specific headers */
|
||||||
|
@ -109,6 +104,10 @@
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_UN_H
|
||||||
|
#include <sys/un.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_DIRENT_H
|
#ifdef HAVE_DIRENT_H
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -196,19 +195,8 @@
|
||||||
#include <netinet/if_ether.h>
|
#include <netinet/if_ether.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_ARPA_NAMESER_H
|
#ifdef HAVE_EVENT_H
|
||||||
#include <arpa/nameser.h>
|
#include <event.h>
|
||||||
#ifdef STATUS
|
|
||||||
#undef STATUS
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_RESOLV_H
|
#endif /* __TINC_SYSTEM_H__ */
|
||||||
#include <resolv.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_LINUX_IF_TUN_H
|
|
||||||
#include <linux/if_tun.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
178
install-sh
178
install-sh
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# install - install a program, script, or datafile
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
scriptversion=2018-03-11.20; # UTC
|
scriptversion=2009-04-28.21; # UTC
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
|
@ -35,21 +35,25 @@ scriptversion=2018-03-11.20; # UTC
|
||||||
# FSF changes to this file are in the public domain.
|
# FSF changes to this file are in the public domain.
|
||||||
#
|
#
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
# 'make' implicit rules from creating a file called install from it
|
# `make' implicit rules from creating a file called install from it
|
||||||
# when there is no Makefile.
|
# when there is no Makefile.
|
||||||
#
|
#
|
||||||
# This script is compatible with the BSD install script, but was written
|
# This script is compatible with the BSD install script, but was written
|
||||||
# from scratch.
|
# from scratch.
|
||||||
|
|
||||||
tab=' '
|
|
||||||
nl='
|
nl='
|
||||||
'
|
'
|
||||||
IFS=" $tab$nl"
|
IFS=" "" $nl"
|
||||||
|
|
||||||
# Set DOITPROG to "echo" to test this script.
|
# set DOITPROG to echo to test this script
|
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||||
doit=${DOITPROG-}
|
doit=${DOITPROG-}
|
||||||
doit_exec=${doit:-exec}
|
if test -z "$doit"; then
|
||||||
|
doit_exec=exec
|
||||||
|
else
|
||||||
|
doit_exec=$doit
|
||||||
|
fi
|
||||||
|
|
||||||
# Put in absolute file names if you don't have them in your path;
|
# Put in absolute file names if you don't have them in your path;
|
||||||
# or use environment vars.
|
# or use environment vars.
|
||||||
|
@ -64,6 +68,17 @@ mvprog=${MVPROG-mv}
|
||||||
rmprog=${RMPROG-rm}
|
rmprog=${RMPROG-rm}
|
||||||
stripprog=${STRIPPROG-strip}
|
stripprog=${STRIPPROG-strip}
|
||||||
|
|
||||||
|
posix_glob='?'
|
||||||
|
initialize_posix_glob='
|
||||||
|
test "$posix_glob" != "?" || {
|
||||||
|
if (set -f) 2>/dev/null; then
|
||||||
|
posix_glob=
|
||||||
|
else
|
||||||
|
posix_glob=:
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
'
|
||||||
|
|
||||||
posix_mkdir=
|
posix_mkdir=
|
||||||
|
|
||||||
# Desired mode of installed file.
|
# Desired mode of installed file.
|
||||||
|
@ -82,7 +97,7 @@ dir_arg=
|
||||||
dst_arg=
|
dst_arg=
|
||||||
|
|
||||||
copy_on_change=false
|
copy_on_change=false
|
||||||
is_target_a_directory=possibly
|
no_target_directory=
|
||||||
|
|
||||||
usage="\
|
usage="\
|
||||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||||
|
@ -128,7 +143,8 @@ while test $# -ne 0; do
|
||||||
|
|
||||||
-m) mode=$2
|
-m) mode=$2
|
||||||
case $mode in
|
case $mode in
|
||||||
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
*' '* | *' '* | *'
|
||||||
|
'* | *'*'* | *'?'* | *'['*)
|
||||||
echo "$0: invalid mode: $mode" >&2
|
echo "$0: invalid mode: $mode" >&2
|
||||||
exit 1;;
|
exit 1;;
|
||||||
esac
|
esac
|
||||||
|
@ -139,16 +155,10 @@ while test $# -ne 0; do
|
||||||
|
|
||||||
-s) stripcmd=$stripprog;;
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
-t)
|
-t) dst_arg=$2
|
||||||
is_target_a_directory=always
|
|
||||||
dst_arg=$2
|
|
||||||
# Protect names problematic for 'test' and other utilities.
|
|
||||||
case $dst_arg in
|
|
||||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
|
||||||
esac
|
|
||||||
shift;;
|
shift;;
|
||||||
|
|
||||||
-T) is_target_a_directory=never;;
|
-T) no_target_directory=true;;
|
||||||
|
|
||||||
--version) echo "$0 $scriptversion"; exit $?;;
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
@ -163,16 +173,6 @@ while test $# -ne 0; do
|
||||||
shift
|
shift
|
||||||
done
|
done
|
||||||
|
|
||||||
# We allow the use of options -d and -T together, by making -d
|
|
||||||
# take the precedence; this is for compatibility with GNU install.
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
if test -n "$dst_arg"; then
|
|
||||||
echo "$0: target directory not allowed when installing a directory." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
# When -d is used, all remaining arguments are directories to create.
|
# When -d is used, all remaining arguments are directories to create.
|
||||||
# When -t is used, the destination is already specified.
|
# When -t is used, the destination is already specified.
|
||||||
|
@ -186,10 +186,6 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
fi
|
fi
|
||||||
shift # arg
|
shift # arg
|
||||||
dst_arg=$arg
|
dst_arg=$arg
|
||||||
# Protect names problematic for 'test' and other utilities.
|
|
||||||
case $dst_arg in
|
|
||||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
|
||||||
esac
|
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -198,26 +194,13 @@ if test $# -eq 0; then
|
||||||
echo "$0: no input file specified." >&2
|
echo "$0: no input file specified." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
# It's OK to call 'install-sh -d' without argument.
|
# It's OK to call `install-sh -d' without argument.
|
||||||
# This can happen when creating conditional directories.
|
# This can happen when creating conditional directories.
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
if test -z "$dir_arg"; then
|
||||||
if test $# -gt 1 || test "$is_target_a_directory" = always; then
|
trap '(exit $?); exit' 1 2 13 15
|
||||||
if test ! -d "$dst_arg"; then
|
|
||||||
echo "$0: $dst_arg: Is not a directory." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
do_exit='(exit $ret); exit $ret'
|
|
||||||
trap "ret=129; $do_exit" 1
|
|
||||||
trap "ret=130; $do_exit" 2
|
|
||||||
trap "ret=141; $do_exit" 13
|
|
||||||
trap "ret=143; $do_exit" 15
|
|
||||||
|
|
||||||
# Set umask so as not to create temps with too-generous modes.
|
# Set umask so as not to create temps with too-generous modes.
|
||||||
# However, 'strip' requires both read and write access to temps.
|
# However, 'strip' requires both read and write access to temps.
|
||||||
|
@ -245,9 +228,9 @@ fi
|
||||||
|
|
||||||
for src
|
for src
|
||||||
do
|
do
|
||||||
# Protect names problematic for 'test' and other utilities.
|
# Protect names starting with `-'.
|
||||||
case $src in
|
case $src in
|
||||||
-* | [=\(\)!]) src=./$src;;
|
-*) src=./$src;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
if test -n "$dir_arg"; then
|
||||||
|
@ -269,33 +252,56 @@ do
|
||||||
echo "$0: no destination specified." >&2
|
echo "$0: no destination specified." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
dst=$dst_arg
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename.
|
dst=$dst_arg
|
||||||
|
# Protect names starting with `-'.
|
||||||
|
case $dst in
|
||||||
|
-*) dst=./$dst;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; won't work
|
||||||
|
# if double slashes aren't ignored.
|
||||||
if test -d "$dst"; then
|
if test -d "$dst"; then
|
||||||
if test "$is_target_a_directory" = never; then
|
if test -n "$no_target_directory"; then
|
||||||
echo "$0: $dst_arg: Is a directory" >&2
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
dstdir=$dst
|
dstdir=$dst
|
||||||
dstbase=`basename "$src"`
|
dst=$dstdir/`basename "$src"`
|
||||||
case $dst in
|
|
||||||
*/) dst=$dst$dstbase;;
|
|
||||||
*) dst=$dst/$dstbase;;
|
|
||||||
esac
|
|
||||||
dstdir_status=0
|
dstdir_status=0
|
||||||
else
|
else
|
||||||
dstdir=`dirname "$dst"`
|
# Prefer dirname, but fall back on a substitute if dirname fails.
|
||||||
|
dstdir=`
|
||||||
|
(dirname "$dst") 2>/dev/null ||
|
||||||
|
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||||
|
X"$dst" : 'X\(//\)[^/]' \| \
|
||||||
|
X"$dst" : 'X\(//\)$' \| \
|
||||||
|
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
||||||
|
echo X"$dst" |
|
||||||
|
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)[^/].*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\/\)$/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
/^X\(\/\).*/{
|
||||||
|
s//\1/
|
||||||
|
q
|
||||||
|
}
|
||||||
|
s/.*/./; q'
|
||||||
|
`
|
||||||
|
|
||||||
test -d "$dstdir"
|
test -d "$dstdir"
|
||||||
dstdir_status=$?
|
dstdir_status=$?
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case $dstdir in
|
|
||||||
*/) dstdirslash=$dstdir;;
|
|
||||||
*) dstdirslash=$dstdir/;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
obsolete_mkdir_used=false
|
obsolete_mkdir_used=false
|
||||||
|
|
||||||
if test $dstdir_status != 0; then
|
if test $dstdir_status != 0; then
|
||||||
|
@ -332,43 +338,34 @@ do
|
||||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
# Note that $RANDOM variable is not portable (e.g. dash); Use it
|
|
||||||
# here however when possible just to lower collision chance.
|
|
||||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||||
|
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||||
|
|
||||||
trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
|
|
||||||
|
|
||||||
# Because "mkdir -p" follows existing symlinks and we likely work
|
|
||||||
# directly in world-writeable /tmp, make sure that the '$tmpdir'
|
|
||||||
# directory is successfully created first before we actually test
|
|
||||||
# 'mkdir -p' feature.
|
|
||||||
if (umask $mkdir_umask &&
|
if (umask $mkdir_umask &&
|
||||||
$mkdirprog $mkdir_mode "$tmpdir" &&
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
||||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
|
|
||||||
then
|
then
|
||||||
if test -z "$dir_arg" || {
|
if test -z "$dir_arg" || {
|
||||||
# Check for POSIX incompatibilities with -m.
|
# Check for POSIX incompatibilities with -m.
|
||||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||||
# other-writable bit of parent directory when it shouldn't.
|
# other-writeable bit of parent directory when it shouldn't.
|
||||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||||
test_tmpdir="$tmpdir/a"
|
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
||||||
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
|
|
||||||
case $ls_ld_tmpdir in
|
case $ls_ld_tmpdir in
|
||||||
d????-?r-*) different_mode=700;;
|
d????-?r-*) different_mode=700;;
|
||||||
d????-?--*) different_mode=755;;
|
d????-?--*) different_mode=755;;
|
||||||
*) false;;
|
*) false;;
|
||||||
esac &&
|
esac &&
|
||||||
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
|
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
||||||
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
|
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
||||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
then posix_mkdir=:
|
then posix_mkdir=:
|
||||||
fi
|
fi
|
||||||
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
|
rmdir "$tmpdir/d" "$tmpdir"
|
||||||
else
|
else
|
||||||
# Remove any dirs left behind by ancient mkdir implementations.
|
# Remove any dirs left behind by ancient mkdir implementations.
|
||||||
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
|
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
||||||
fi
|
fi
|
||||||
trap '' 0;;
|
trap '' 0;;
|
||||||
esac;;
|
esac;;
|
||||||
|
@ -388,23 +385,25 @@ do
|
||||||
|
|
||||||
case $dstdir in
|
case $dstdir in
|
||||||
/*) prefix='/';;
|
/*) prefix='/';;
|
||||||
[-=\(\)!]*) prefix='./';;
|
-*) prefix='./';;
|
||||||
*) prefix='';;
|
*) prefix='';;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
eval "$initialize_posix_glob"
|
||||||
|
|
||||||
oIFS=$IFS
|
oIFS=$IFS
|
||||||
IFS=/
|
IFS=/
|
||||||
set -f
|
$posix_glob set -f
|
||||||
set fnord $dstdir
|
set fnord $dstdir
|
||||||
shift
|
shift
|
||||||
set +f
|
$posix_glob set +f
|
||||||
IFS=$oIFS
|
IFS=$oIFS
|
||||||
|
|
||||||
prefixes=
|
prefixes=
|
||||||
|
|
||||||
for d
|
for d
|
||||||
do
|
do
|
||||||
test X"$d" = X && continue
|
test -z "$d" && continue
|
||||||
|
|
||||||
prefix=$prefix$d
|
prefix=$prefix$d
|
||||||
if test -d "$prefix"; then
|
if test -d "$prefix"; then
|
||||||
|
@ -444,8 +443,8 @@ do
|
||||||
else
|
else
|
||||||
|
|
||||||
# Make a couple of temp file names in the proper directory.
|
# Make a couple of temp file names in the proper directory.
|
||||||
dsttmp=${dstdirslash}_inst.$$_
|
dsttmp=$dstdir/_inst.$$_
|
||||||
rmtmp=${dstdirslash}_rm.$$_
|
rmtmp=$dstdir/_rm.$$_
|
||||||
|
|
||||||
# Trap to clean up those temp files at exit.
|
# Trap to clean up those temp files at exit.
|
||||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
@ -468,10 +467,13 @@ do
|
||||||
if $copy_on_change &&
|
if $copy_on_change &&
|
||||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||||
set -f &&
|
|
||||||
|
eval "$initialize_posix_glob" &&
|
||||||
|
$posix_glob set -f &&
|
||||||
set X $old && old=:$2:$4:$5:$6 &&
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
set X $new && new=:$2:$4:$5:$6 &&
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
set +f &&
|
$posix_glob set +f &&
|
||||||
|
|
||||||
test "$old" = "$new" &&
|
test "$old" = "$new" &&
|
||||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||||
then
|
then
|
||||||
|
@ -510,9 +512,9 @@ do
|
||||||
done
|
done
|
||||||
|
|
||||||
# Local variables:
|
# Local variables:
|
||||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
# time-stamp-start: "scriptversion="
|
# time-stamp-start: "scriptversion="
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
# time-stamp-time-zone: "UTC0"
|
# time-stamp-time-zone: "UTC"
|
||||||
# time-stamp-end: "; # UTC"
|
# time-stamp-end: "; # UTC"
|
||||||
# End:
|
# End:
|
||||||
|
|
4
m4/Makefile.am
Normal file
4
m4/Makefile.am
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
## Process this file with automake to produce Makefile.in -*-Makefile-*-
|
||||||
|
|
||||||
|
EXTRA_DIST = README *.m4
|
||||||
|
|
335
m4/Makefile.in
Normal file
335
m4/Makefile.in
Normal file
|
@ -0,0 +1,335 @@
|
||||||
|
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
||||||
|
# Inc.
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
build_triplet = @build@
|
||||||
|
host_triplet = @host@
|
||||||
|
subdir = m4
|
||||||
|
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
||||||
|
$(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/libevent.m4 \
|
||||||
|
$(top_srcdir)/m4/lzo.m4 $(top_srcdir)/m4/openssl.m4 \
|
||||||
|
$(top_srcdir)/m4/zlib.m4 $(top_srcdir)/configure.in
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = $(top_builddir)/config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
SOURCES =
|
||||||
|
DIST_SOURCES =
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CURSES_LIBS = @CURSES_LIBS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
GREP = @GREP@
|
||||||
|
INCLUDES = @INCLUDES@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
|
||||||
|
LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
|
||||||
|
LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAINT = @MAINT@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
abs_builddir = @abs_builddir@
|
||||||
|
abs_srcdir = @abs_srcdir@
|
||||||
|
abs_top_builddir = @abs_top_builddir@
|
||||||
|
abs_top_srcdir = @abs_top_srcdir@
|
||||||
|
ac_ct_CC = @ac_ct_CC@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build = @build@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
build_cpu = @build_cpu@
|
||||||
|
build_os = @build_os@
|
||||||
|
build_vendor = @build_vendor@
|
||||||
|
builddir = @builddir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host = @host@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_cpu = @host_cpu@
|
||||||
|
host_os = @host_os@
|
||||||
|
host_vendor = @host_vendor@
|
||||||
|
htmldir = @htmldir@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
top_build_prefix = @top_build_prefix@
|
||||||
|
top_builddir = @top_builddir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
EXTRA_DIST = README *.m4
|
||||||
|
all: all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||||
|
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --gnu m4/Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||||
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
$(am__aclocal_m4_deps):
|
||||||
|
tags: TAGS
|
||||||
|
TAGS:
|
||||||
|
|
||||||
|
ctags: CTAGS
|
||||||
|
CTAGS:
|
||||||
|
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
list='$(DISTFILES)'; \
|
||||||
|
dist_files=`for file in $$list; do echo $$file; done | \
|
||||||
|
sed -e "s|^$$srcdirstrip/||;t" \
|
||||||
|
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||||
|
case $$dist_files in \
|
||||||
|
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||||
|
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||||
|
sort -u` ;; \
|
||||||
|
esac; \
|
||||||
|
for file in $$dist_files; do \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test -d "$(distdir)/$$file"; then \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f "$(distdir)/$$file" \
|
||||||
|
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
check-am: all-am
|
||||||
|
check: check-am
|
||||||
|
all-am: Makefile
|
||||||
|
installdirs:
|
||||||
|
install: install-am
|
||||||
|
install-exec: install-exec-am
|
||||||
|
install-data: install-data-am
|
||||||
|
uninstall: uninstall-am
|
||||||
|
|
||||||
|
install-am: all-am
|
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-am
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
`test -z '$(STRIP)' || \
|
||||||
|
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||||
|
mostlyclean-generic:
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
clean: clean-am
|
||||||
|
|
||||||
|
clean-am: clean-generic mostlyclean-am
|
||||||
|
|
||||||
|
distclean: distclean-am
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-generic
|
||||||
|
|
||||||
|
dvi: dvi-am
|
||||||
|
|
||||||
|
dvi-am:
|
||||||
|
|
||||||
|
html: html-am
|
||||||
|
|
||||||
|
html-am:
|
||||||
|
|
||||||
|
info: info-am
|
||||||
|
|
||||||
|
info-am:
|
||||||
|
|
||||||
|
install-data-am:
|
||||||
|
|
||||||
|
install-dvi: install-dvi-am
|
||||||
|
|
||||||
|
install-dvi-am:
|
||||||
|
|
||||||
|
install-exec-am:
|
||||||
|
|
||||||
|
install-html: install-html-am
|
||||||
|
|
||||||
|
install-html-am:
|
||||||
|
|
||||||
|
install-info: install-info-am
|
||||||
|
|
||||||
|
install-info-am:
|
||||||
|
|
||||||
|
install-man:
|
||||||
|
|
||||||
|
install-pdf: install-pdf-am
|
||||||
|
|
||||||
|
install-pdf-am:
|
||||||
|
|
||||||
|
install-ps: install-ps-am
|
||||||
|
|
||||||
|
install-ps-am:
|
||||||
|
|
||||||
|
installcheck-am:
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-am
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-am
|
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-generic
|
||||||
|
|
||||||
|
pdf: pdf-am
|
||||||
|
|
||||||
|
pdf-am:
|
||||||
|
|
||||||
|
ps: ps-am
|
||||||
|
|
||||||
|
ps-am:
|
||||||
|
|
||||||
|
uninstall-am:
|
||||||
|
|
||||||
|
.MAKE: install-am install-strip
|
||||||
|
|
||||||
|
.PHONY: all all-am check check-am clean clean-generic distclean \
|
||||||
|
distclean-generic distdir dvi dvi-am html html-am info info-am \
|
||||||
|
install install-am install-data install-data-am install-dvi \
|
||||||
|
install-dvi-am install-exec install-exec-am install-html \
|
||||||
|
install-html-am install-info install-info-am install-man \
|
||||||
|
install-pdf install-pdf-am install-ps install-ps-am \
|
||||||
|
install-strip installcheck installcheck-am installdirs \
|
||||||
|
maintainer-clean maintainer-clean-generic mostlyclean \
|
||||||
|
mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am
|
||||||
|
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
8
m4/README
Normal file
8
m4/README
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
These files are used by a program called aclocal (part of the GNU automake
|
||||||
|
package). aclocal uses these files to create aclocal.m4 which is in turn
|
||||||
|
used by autoconf to create the configure script at the the top level in
|
||||||
|
this distribution.
|
||||||
|
|
||||||
|
The Makefile.am file in this directory is automatically generated
|
||||||
|
from the template file, Makefile.am.in. The generation will fail
|
||||||
|
if you don't have all the right tools.
|
|
@ -9,8 +9,8 @@ AC_DEFUN([tinc_ATTRIBUTE],
|
||||||
CFLAGS="$CFLAGS -Wall -Werror"
|
CFLAGS="$CFLAGS -Wall -Werror"
|
||||||
AC_COMPILE_IFELSE(
|
AC_COMPILE_IFELSE(
|
||||||
[AC_LANG_SOURCE(
|
[AC_LANG_SOURCE(
|
||||||
[void *test(void) __attribute__ (($1));
|
[void test(void) __attribute__ (($1));
|
||||||
void *test(void) { return (void *)0; }
|
void test(void) { return; }
|
||||||
],
|
],
|
||||||
)],
|
)],
|
||||||
[tinc_cv_attribute_$1=yes],
|
[tinc_cv_attribute_$1=yes],
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
# ===========================================================================
|
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html
|
|
||||||
# ===========================================================================
|
|
||||||
#
|
|
||||||
# SYNOPSIS
|
|
||||||
#
|
|
||||||
# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
|
|
||||||
#
|
|
||||||
# DESCRIPTION
|
|
||||||
#
|
|
||||||
# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space
|
|
||||||
# added in between.
|
|
||||||
#
|
|
||||||
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g.
|
|
||||||
# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains
|
|
||||||
# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly
|
|
||||||
# FLAG.
|
|
||||||
#
|
|
||||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.
|
|
||||||
#
|
|
||||||
# LICENSE
|
|
||||||
#
|
|
||||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
|
||||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
|
||||||
#
|
|
||||||
# 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 3 of the License, or (at your
|
|
||||||
# option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful, but
|
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
||||||
# Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
|
||||||
# gives unlimited permission to copy, distribute and modify the configure
|
|
||||||
# scripts that are the output of Autoconf when processing the Macro. You
|
|
||||||
# need not follow the terms of the GNU General Public License when using
|
|
||||||
# or distributing such scripts, even though portions of the text of the
|
|
||||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
|
||||||
# all other use of the material that constitutes the Autoconf Macro.
|
|
||||||
#
|
|
||||||
# This special exception to the GPL applies to versions of the Autoconf
|
|
||||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
|
||||||
# modified version of the Autoconf Macro, you may extend this special
|
|
||||||
# exception to the GPL to apply to your modified version as well.
|
|
||||||
|
|
||||||
#serial 2
|
|
||||||
|
|
||||||
AC_DEFUN([AX_APPEND_FLAG],
|
|
||||||
[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX
|
|
||||||
AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl
|
|
||||||
AS_VAR_SET_IF(FLAGS,
|
|
||||||
[case " AS_VAR_GET(FLAGS) " in
|
|
||||||
*" $1 "*)
|
|
||||||
AC_RUN_LOG([: FLAGS already contains $1])
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AC_RUN_LOG([: FLAGS="$FLAGS $1"])
|
|
||||||
AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"])
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[AS_VAR_SET(FLAGS,["$1"])])
|
|
||||||
AS_VAR_POPDEF([FLAGS])dnl
|
|
||||||
])dnl AX_APPEND_FLAG
|
|
|
@ -1,122 +0,0 @@
|
||||||
# ===========================================================================
|
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html
|
|
||||||
# ===========================================================================
|
|
||||||
#
|
|
||||||
# SYNOPSIS
|
|
||||||
#
|
|
||||||
# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
|
|
||||||
# AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
|
|
||||||
# AX_FCFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
|
|
||||||
#
|
|
||||||
# DESCRIPTION
|
|
||||||
#
|
|
||||||
# Try to find a compiler option that enables most reasonable warnings.
|
|
||||||
#
|
|
||||||
# For the GNU compiler it will be -Wall (and -ansi -pedantic) The result
|
|
||||||
# is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default.
|
|
||||||
#
|
|
||||||
# Currently this macro knows about the GCC, Solaris, Digital Unix, AIX,
|
|
||||||
# HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and
|
|
||||||
# Intel compilers. For a given compiler, the Fortran flags are much more
|
|
||||||
# experimental than their C equivalents.
|
|
||||||
#
|
|
||||||
# - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS
|
|
||||||
# - $2 add-value-if-not-found : nothing
|
|
||||||
# - $3 action-if-found : add value to shellvariable
|
|
||||||
# - $4 action-if-not-found : nothing
|
|
||||||
#
|
|
||||||
# NOTE: These macros depend on AX_APPEND_FLAG.
|
|
||||||
#
|
|
||||||
# LICENSE
|
|
||||||
#
|
|
||||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
|
||||||
# Copyright (c) 2010 Rhys Ulerich <rhys.ulerich@gmail.com>
|
|
||||||
#
|
|
||||||
# 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 3 of the License, or (at your
|
|
||||||
# option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful, but
|
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
||||||
# Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
|
||||||
# gives unlimited permission to copy, distribute and modify the configure
|
|
||||||
# scripts that are the output of Autoconf when processing the Macro. You
|
|
||||||
# need not follow the terms of the GNU General Public License when using
|
|
||||||
# or distributing such scripts, even though portions of the text of the
|
|
||||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
|
||||||
# all other use of the material that constitutes the Autoconf Macro.
|
|
||||||
#
|
|
||||||
# This special exception to the GPL applies to versions of the Autoconf
|
|
||||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
|
||||||
# modified version of the Autoconf Macro, you may extend this special
|
|
||||||
# exception to the GPL to apply to your modified version as well.
|
|
||||||
|
|
||||||
#serial 15
|
|
||||||
|
|
||||||
AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl
|
|
||||||
AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl
|
|
||||||
AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl
|
|
||||||
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
|
|
||||||
VAR,[VAR="no, unknown"
|
|
||||||
ac_save_[]FLAGS="$[]FLAGS"
|
|
||||||
for ac_arg dnl
|
|
||||||
in "-warn all % -warn all" dnl Intel
|
|
||||||
"-pedantic % -Wall" dnl GCC
|
|
||||||
"-xstrconst % -v" dnl Solaris C
|
|
||||||
"-std1 % -verbose -w0 -warnprotos" dnl Digital Unix
|
|
||||||
"-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
|
|
||||||
"-ansi -ansiE % -fullwarn" dnl IRIX
|
|
||||||
"+ESlit % +w1" dnl HP-UX C
|
|
||||||
"-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10)
|
|
||||||
"-h conform % -h msglevel 2" dnl Cray C (Unicos)
|
|
||||||
#
|
|
||||||
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
|
|
||||||
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
|
|
||||||
done
|
|
||||||
FLAGS="$ac_save_[]FLAGS"
|
|
||||||
])
|
|
||||||
AS_VAR_POPDEF([FLAGS])dnl
|
|
||||||
AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
|
|
||||||
case ".$VAR" in
|
|
||||||
.ok|.ok,*) m4_ifvaln($3,$3) ;;
|
|
||||||
.|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;;
|
|
||||||
*) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;;
|
|
||||||
esac
|
|
||||||
AS_VAR_POPDEF([VAR])dnl
|
|
||||||
])dnl AX_FLAGS_WARN_ALL
|
|
||||||
dnl implementation tactics:
|
|
||||||
dnl the for-argument contains a list of options. The first part of
|
|
||||||
dnl these does only exist to detect the compiler - usually it is
|
|
||||||
dnl a global option to enable -ansi or -extrawarnings. All other
|
|
||||||
dnl compilers will fail about it. That was needed since a lot of
|
|
||||||
dnl compilers will give false positives for some option-syntax
|
|
||||||
dnl like -Woption or -Xoption as they think of it is a pass-through
|
|
||||||
dnl to later compile stages or something. The "%" is used as a
|
|
||||||
dnl delimiter. A non-option comment can be given after "%%" marks
|
|
||||||
dnl which will be shown but not added to the respective C/CXXFLAGS.
|
|
||||||
|
|
||||||
AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl
|
|
||||||
AC_LANG_PUSH([C])
|
|
||||||
AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4])
|
|
||||||
AC_LANG_POP([C])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl
|
|
||||||
AC_LANG_PUSH([C++])
|
|
||||||
AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4])
|
|
||||||
AC_LANG_POP([C++])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl
|
|
||||||
AC_LANG_PUSH([Fortran])
|
|
||||||
AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4])
|
|
||||||
AC_LANG_POP([Fortran])
|
|
||||||
])
|
|
|
@ -1,72 +0,0 @@
|
||||||
# ===========================================================================
|
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
|
|
||||||
# ===========================================================================
|
|
||||||
#
|
|
||||||
# SYNOPSIS
|
|
||||||
#
|
|
||||||
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
|
|
||||||
#
|
|
||||||
# DESCRIPTION
|
|
||||||
#
|
|
||||||
# Check whether the given FLAG works with the current language's compiler
|
|
||||||
# or gives an error. (Warnings, however, are ignored)
|
|
||||||
#
|
|
||||||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
|
|
||||||
# success/failure.
|
|
||||||
#
|
|
||||||
# If EXTRA-FLAGS is defined, it is added to the current language's default
|
|
||||||
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
|
|
||||||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
|
|
||||||
# force the compiler to issue an error when a bad flag is given.
|
|
||||||
#
|
|
||||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
|
||||||
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
|
|
||||||
#
|
|
||||||
# LICENSE
|
|
||||||
#
|
|
||||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
|
||||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
|
||||||
#
|
|
||||||
# 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 3 of the License, or (at your
|
|
||||||
# option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful, but
|
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
||||||
# Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
|
||||||
# gives unlimited permission to copy, distribute and modify the configure
|
|
||||||
# scripts that are the output of Autoconf when processing the Macro. You
|
|
||||||
# need not follow the terms of the GNU General Public License when using
|
|
||||||
# or distributing such scripts, even though portions of the text of the
|
|
||||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
|
||||||
# all other use of the material that constitutes the Autoconf Macro.
|
|
||||||
#
|
|
||||||
# This special exception to the GPL applies to versions of the Autoconf
|
|
||||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
|
||||||
# modified version of the Autoconf Macro, you may extend this special
|
|
||||||
# exception to the GPL to apply to your modified version as well.
|
|
||||||
|
|
||||||
#serial 2
|
|
||||||
|
|
||||||
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
|
|
||||||
[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX
|
|
||||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
|
|
||||||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
|
|
||||||
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
|
|
||||||
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
|
|
||||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
|
||||||
[AS_VAR_SET(CACHEVAR,[no])])
|
|
||||||
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
|
|
||||||
AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes],
|
|
||||||
[m4_default([$2], :)],
|
|
||||||
[m4_default([$3], :)])
|
|
||||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
|
||||||
])dnl AX_CHECK_COMPILE_FLAGS
|
|
|
@ -1,71 +0,0 @@
|
||||||
# ===========================================================================
|
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html
|
|
||||||
# ===========================================================================
|
|
||||||
#
|
|
||||||
# SYNOPSIS
|
|
||||||
#
|
|
||||||
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
|
|
||||||
#
|
|
||||||
# DESCRIPTION
|
|
||||||
#
|
|
||||||
# Check whether the given FLAG works with the linker or gives an error.
|
|
||||||
# (Warnings, however, are ignored)
|
|
||||||
#
|
|
||||||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
|
|
||||||
# success/failure.
|
|
||||||
#
|
|
||||||
# If EXTRA-FLAGS is defined, it is added to the linker's default flags
|
|
||||||
# when the check is done. The check is thus made with the flags: "LDFLAGS
|
|
||||||
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
|
|
||||||
# issue an error when a bad flag is given.
|
|
||||||
#
|
|
||||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
|
||||||
# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.
|
|
||||||
#
|
|
||||||
# LICENSE
|
|
||||||
#
|
|
||||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
|
|
||||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
|
|
||||||
#
|
|
||||||
# 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 3 of the License, or (at your
|
|
||||||
# option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful, but
|
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
||||||
# Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
|
||||||
# gives unlimited permission to copy, distribute and modify the configure
|
|
||||||
# scripts that are the output of Autoconf when processing the Macro. You
|
|
||||||
# need not follow the terms of the GNU General Public License when using
|
|
||||||
# or distributing such scripts, even though portions of the text of the
|
|
||||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
|
||||||
# all other use of the material that constitutes the Autoconf Macro.
|
|
||||||
#
|
|
||||||
# This special exception to the GPL applies to versions of the Autoconf
|
|
||||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
|
||||||
# modified version of the Autoconf Macro, you may extend this special
|
|
||||||
# exception to the GPL to apply to your modified version as well.
|
|
||||||
|
|
||||||
#serial 2
|
|
||||||
|
|
||||||
AC_DEFUN([AX_CHECK_LINK_FLAG],
|
|
||||||
[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
|
|
||||||
AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
|
|
||||||
ax_check_save_flags=$LDFLAGS
|
|
||||||
LDFLAGS="$LDFLAGS $4 $1"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM()],
|
|
||||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
|
||||||
[AS_VAR_SET(CACHEVAR,[no])])
|
|
||||||
LDFLAGS=$ax_check_save_flags])
|
|
||||||
AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes],
|
|
||||||
[m4_default([$2], :)],
|
|
||||||
[m4_default([$3], :)])
|
|
||||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
|
||||||
])dnl AX_CHECK_LINK_FLAGS
|
|
|
@ -1,37 +0,0 @@
|
||||||
# ===========================================================================
|
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_require_defined.html
|
|
||||||
# ===========================================================================
|
|
||||||
#
|
|
||||||
# SYNOPSIS
|
|
||||||
#
|
|
||||||
# AX_REQUIRE_DEFINED(MACRO)
|
|
||||||
#
|
|
||||||
# DESCRIPTION
|
|
||||||
#
|
|
||||||
# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have
|
|
||||||
# been defined and thus are available for use. This avoids random issues
|
|
||||||
# where a macro isn't expanded. Instead the configure script emits a
|
|
||||||
# non-fatal:
|
|
||||||
#
|
|
||||||
# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found
|
|
||||||
#
|
|
||||||
# It's like AC_REQUIRE except it doesn't expand the required macro.
|
|
||||||
#
|
|
||||||
# Here's an example:
|
|
||||||
#
|
|
||||||
# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
|
|
||||||
#
|
|
||||||
# LICENSE
|
|
||||||
#
|
|
||||||
# Copyright (c) 2014 Mike Frysinger <vapier@gentoo.org>
|
|
||||||
#
|
|
||||||
# Copying and distribution of this file, with or without modification, are
|
|
||||||
# permitted in any medium without royalty provided the copyright notice
|
|
||||||
# and this notice are preserved. This file is offered as-is, without any
|
|
||||||
# warranty.
|
|
||||||
|
|
||||||
#serial 1
|
|
||||||
|
|
||||||
AC_DEFUN([AX_REQUIRE_DEFINED], [dnl
|
|
||||||
m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])])
|
|
||||||
])dnl AX_REQUIRE_DEFINED
|
|
41
m4/curses.m4
Normal file
41
m4/curses.m4
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
dnl Check to find the curses headers/libraries
|
||||||
|
|
||||||
|
AC_DEFUN([tinc_CURSES],
|
||||||
|
[
|
||||||
|
AC_ARG_ENABLE([curses],
|
||||||
|
AS_HELP_STRING([--disable-curses], [disable curses support]))
|
||||||
|
AS_IF([test "x$enable_curses" != "xno"], [
|
||||||
|
AC_DEFINE(HAVE_CURSES, 1, [have curses support])
|
||||||
|
curses=true
|
||||||
|
AC_ARG_WITH(curses,
|
||||||
|
AS_HELP_STRING([--with-curses=DIR], [curses base directory, or:]),
|
||||||
|
[curses="$withval"
|
||||||
|
CPPFLAGS="$CPPFLAGS -I$withval/include"
|
||||||
|
LDFLAGS="$LDFLAGS -L$withval/lib"]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_ARG_WITH(curses-include,
|
||||||
|
AS_HELP_STRING([--with-curses-include=DIR], [curses headers directory]),
|
||||||
|
[curses_include="$withval"
|
||||||
|
CPPFLAGS="$CPPFLAGS -I$withval"]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_ARG_WITH(curses-lib,
|
||||||
|
AS_HELP_STRING([--with-curses-lib=DIR], [curses library directory]),
|
||||||
|
[curses_lib="$withval"
|
||||||
|
LDFLAGS="$LDFLAGS -L$withval"]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS(curses.h,
|
||||||
|
[],
|
||||||
|
[AC_MSG_ERROR("curses header files not found."); break]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_CHECK_LIB(curses, initscr,
|
||||||
|
[CURSES_LIBS="-lcurses"],
|
||||||
|
[AC_MSG_ERROR("curses libraries not found.")]
|
||||||
|
)
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_SUBST(CURSES_LIBS)
|
||||||
|
])
|
33
m4/libevent.m4
Normal file
33
m4/libevent.m4
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
dnl Check to find the libevent headers/libraries
|
||||||
|
|
||||||
|
AC_DEFUN([tinc_LIBEVENT],
|
||||||
|
[
|
||||||
|
AC_ARG_WITH(libevent,
|
||||||
|
AS_HELP_STRING([--with-libevent=DIR], [libevent base directory, or:]),
|
||||||
|
[libevent="$withval"
|
||||||
|
CPPFLAGS="$CPPFLAGS -I$withval/include"
|
||||||
|
LDFLAGS="$LDFLAGS -L$withval/lib"]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_ARG_WITH(libevent-include,
|
||||||
|
AS_HELP_STRING([--with-libevent-include=DIR], [libevent headers directory]),
|
||||||
|
[libevent_include="$withval"
|
||||||
|
CPPFLAGS="$CPPFLAGS -I$withval"]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_ARG_WITH(libevent-lib,
|
||||||
|
AS_HELP_STRING([--with-libevent-lib=DIR], [libevent library directory]),
|
||||||
|
[libevent_lib="$withval"
|
||||||
|
LDFLAGS="$LDFLAGS -L$withval"]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS(event.h,
|
||||||
|
[],
|
||||||
|
[AC_MSG_ERROR("libevent header files not found."); break]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_CHECK_LIB(event, event_init,
|
||||||
|
[LIBS="-levent $LIBS"],
|
||||||
|
[AC_MSG_ERROR("libevent libraries not found.")]
|
||||||
|
)
|
||||||
|
])
|
|
@ -1,4 +1,4 @@
|
||||||
dnl Check to find the LibreSSL/OpenSSL headers/libraries
|
dnl Check to find the OpenSSL headers/libraries
|
||||||
|
|
||||||
AC_DEFUN([tinc_OPENSSL],
|
AC_DEFUN([tinc_OPENSSL],
|
||||||
[
|
[
|
||||||
|
@ -10,49 +10,47 @@ AC_DEFUN([tinc_OPENSSL],
|
||||||
[],
|
[],
|
||||||
[AC_CHECK_LIB(dl, dlopen,
|
[AC_CHECK_LIB(dl, dlopen,
|
||||||
[LIBS="$LIBS -ldl"],
|
[LIBS="$LIBS -ldl"],
|
||||||
[AC_MSG_ERROR([LibreSSL/OpenSSL depends on libdl.]); break]
|
[AC_MSG_ERROR([OpenSSL depends on libdl.]); break]
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
AC_ARG_WITH(openssl,
|
AC_ARG_WITH(openssl,
|
||||||
AS_HELP_STRING([--with-openssl=DIR], [LibreSSL/OpenSSL base directory, or:]),
|
AS_HELP_STRING([--with-openssl=DIR], [OpenSSL base directory, or:]),
|
||||||
[openssl="$withval"
|
[openssl="$withval"
|
||||||
CPPFLAGS="$CPPFLAGS -I$withval/include"
|
CPPFLAGS="$CPPFLAGS -I$withval/include"
|
||||||
LDFLAGS="$LDFLAGS -L$withval/lib"]
|
LDFLAGS="$LDFLAGS -L$withval/lib"]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_ARG_WITH(openssl-include,
|
AC_ARG_WITH(openssl-include,
|
||||||
AS_HELP_STRING([--with-openssl-include=DIR], [LibreSSL/OpenSSL headers directory (without trailing /openssl)]),
|
AS_HELP_STRING([--with-openssl-include=DIR], [OpenSSL headers directory (without trailing /openssl)]),
|
||||||
[openssl_include="$withval"
|
[openssl_include="$withval"
|
||||||
CPPFLAGS="$CPPFLAGS -I$withval"]
|
CPPFLAGS="$CPPFLAGS -I$withval"]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_ARG_WITH(openssl-lib,
|
AC_ARG_WITH(openssl-lib,
|
||||||
AS_HELP_STRING([--with-openssl-lib=DIR], [LibreSSL/OpenSSL library directory]),
|
AS_HELP_STRING([--with-openssl-lib=DIR], [OpenSSL library directory]),
|
||||||
[openssl_lib="$withval"
|
[openssl_lib="$withval"
|
||||||
LDFLAGS="$LDFLAGS -L$withval"]
|
LDFLAGS="$LDFLAGS -L$withval"]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_CHECK_HEADERS(openssl/evp.h openssl/rsa.h openssl/rand.h openssl/err.h openssl/sha.h openssl/pem.h openssl/engine.h,
|
AC_CHECK_HEADERS(openssl/evp.h openssl/rsa.h openssl/rand.h openssl/err.h openssl/sha.h openssl/pem.h openssl/engine.h,
|
||||||
[],
|
[],
|
||||||
[AC_MSG_ERROR([LibreSSL/OpenSSL header files not found.]); break]
|
[AC_MSG_ERROR([OpenSSL header files not found.]); break]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_CHECK_LIB(crypto, EVP_EncryptInit_ex,
|
AC_CHECK_LIB(crypto, EVP_EncryptInit_ex,
|
||||||
[LIBS="-lcrypto $LIBS"],
|
[LIBS="-lcrypto $LIBS"],
|
||||||
[AC_MSG_ERROR([LibreSSL/OpenSSL libraries not found.])]
|
[AC_MSG_ERROR([OpenSSL libraries not found.])]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_CHECK_FUNCS([RAND_bytes EVP_EncryptInit_ex EVP_CIPHER_CTX_new], ,
|
AC_CHECK_FUNCS([RAND_pseudo_bytes EVP_EncryptInit_ex], ,
|
||||||
[AC_MSG_ERROR([Missing LibreSSL/OpenSSL functionality, make sure you have installed the latest version.]); break],
|
[AC_MSG_ERROR([Missing OpenSSL functionality, make sure you have installed the latest version.]); break],
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_CHECK_DECLS([OpenSSL_add_all_algorithms, EVP_aes_256_cfb], ,
|
AC_CHECK_DECL([OpenSSL_add_all_algorithms], ,
|
||||||
[AC_MSG_ERROR([Missing LibreSSL/OpenSSL functionality, make sure you have installed the latest version.]); break],
|
[AC_MSG_ERROR([Missing OpenSSL functionality, make sure you have installed the latest version.]); break],
|
||||||
[#include <openssl/evp.h>]
|
[#include <openssl/evp.h>]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_CHECK_FUNCS([BN_GENCB_new RSA_set0_key], , , [#include <openssl/rsa.h>])
|
|
||||||
])
|
])
|
||||||
|
|
443
missing
443
missing
|
@ -1,10 +1,11 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Common wrapper for a few potentially missing GNU programs.
|
# Common stub for a few missing GNU programs while installing.
|
||||||
|
|
||||||
scriptversion=2018-03-07.03; # UTC
|
scriptversion=2009-04-28.21; # UTC
|
||||||
|
|
||||||
# Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
|
||||||
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
# 2008, 2009 Free Software Foundation, Inc.
|
||||||
|
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -17,7 +18,7 @@ scriptversion=2018-03-07.03; # UTC
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
# As a special exception to the GNU General Public License, if you
|
||||||
# distribute this file as part of a program that contains a
|
# distribute this file as part of a program that contains a
|
||||||
|
@ -25,40 +26,69 @@ scriptversion=2018-03-07.03; # UTC
|
||||||
# the same distribution terms that you use for the rest of that program.
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
if test $# -eq 0; then
|
if test $# -eq 0; then
|
||||||
echo 1>&2 "Try '$0 --help' for more information"
|
echo 1>&2 "Try \`$0 --help' for more information"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
run=:
|
||||||
|
sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
|
||||||
|
sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
|
||||||
|
|
||||||
|
# In the cases where this matters, `missing' is being run in the
|
||||||
|
# srcdir already.
|
||||||
|
if test -f configure.ac; then
|
||||||
|
configure_ac=configure.ac
|
||||||
|
else
|
||||||
|
configure_ac=configure.in
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg="missing on your system"
|
||||||
|
|
||||||
case $1 in
|
case $1 in
|
||||||
|
|
||||||
--is-lightweight)
|
|
||||||
# Used by our autoconf macros to check whether the available missing
|
|
||||||
# script is modern enough.
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
|
|
||||||
--run)
|
--run)
|
||||||
# Back-compat with the calling convention used by older automake.
|
# Try to run requested program, and just exit if it succeeds.
|
||||||
|
run=
|
||||||
shift
|
shift
|
||||||
|
"$@" && exit 0
|
||||||
|
# Exit code 63 means version mismatch. This often happens
|
||||||
|
# when the user try to use an ancient version of a tool on
|
||||||
|
# a file that requires a minimum version. In this case we
|
||||||
|
# we should proceed has if the program had been absent, or
|
||||||
|
# if --run hadn't been passed.
|
||||||
|
if test $? = 63; then
|
||||||
|
run=:
|
||||||
|
msg="probably too old"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
-h|--h|--he|--hel|--help)
|
-h|--h|--he|--hel|--help)
|
||||||
echo "\
|
echo "\
|
||||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||||
|
|
||||||
Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
|
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
||||||
to PROGRAM being missing or too old.
|
error status if there is no known handling for PROGRAM.
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
-h, --help display this help and exit
|
-h, --help display this help and exit
|
||||||
-v, --version output version information and exit
|
-v, --version output version information and exit
|
||||||
|
--run try to run the given command, and emulate it if it fails
|
||||||
|
|
||||||
Supported PROGRAM values:
|
Supported PROGRAM values:
|
||||||
aclocal autoconf autoheader autom4te automake makeinfo
|
aclocal touch file \`aclocal.m4'
|
||||||
bison yacc flex lex help2man
|
autoconf touch file \`configure'
|
||||||
|
autoheader touch file \`config.h.in'
|
||||||
|
autom4te touch the output file, or create a stub one
|
||||||
|
automake touch all \`Makefile.in' files
|
||||||
|
bison create \`y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
flex create \`lex.yy.c', if possible, from existing .c
|
||||||
|
help2man touch the output file
|
||||||
|
lex create \`lex.yy.c', if possible, from existing .c
|
||||||
|
makeinfo touch the output file
|
||||||
|
tar try tar, gnutar, gtar, then tar without non-portable flags
|
||||||
|
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
|
||||||
|
|
||||||
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
|
Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
|
||||||
'g' are ignored when checking the name.
|
\`g' are ignored when checking the name.
|
||||||
|
|
||||||
Send bug reports to <bug-automake@gnu.org>."
|
Send bug reports to <bug-automake@gnu.org>."
|
||||||
exit $?
|
exit $?
|
||||||
|
@ -70,146 +100,277 @@ Send bug reports to <bug-automake@gnu.org>."
|
||||||
;;
|
;;
|
||||||
|
|
||||||
-*)
|
-*)
|
||||||
echo 1>&2 "$0: unknown '$1' option"
|
echo 1>&2 "$0: Unknown \`$1' option"
|
||||||
echo 1>&2 "Try '$0 --help' for more information"
|
echo 1>&2 "Try \`$0 --help' for more information"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Run the given program, remember its exit status.
|
# normalize program name to check for.
|
||||||
"$@"; st=$?
|
program=`echo "$1" | sed '
|
||||||
|
|
||||||
# If it succeeded, we are done.
|
|
||||||
test $st -eq 0 && exit 0
|
|
||||||
|
|
||||||
# Also exit now if we it failed (or wasn't found), and '--version' was
|
|
||||||
# passed; such an option is passed most likely to detect whether the
|
|
||||||
# program is present and works.
|
|
||||||
case $2 in --version|--help) exit $st;; esac
|
|
||||||
|
|
||||||
# Exit code 63 means version mismatch. This often happens when the user
|
|
||||||
# tries to use an ancient version of a tool on a file that requires a
|
|
||||||
# minimum version.
|
|
||||||
if test $st -eq 63; then
|
|
||||||
msg="probably too old"
|
|
||||||
elif test $st -eq 127; then
|
|
||||||
# Program was missing.
|
|
||||||
msg="missing on your system"
|
|
||||||
else
|
|
||||||
# Program was found and executed, but failed. Give up.
|
|
||||||
exit $st
|
|
||||||
fi
|
|
||||||
|
|
||||||
perl_URL=https://www.perl.org/
|
|
||||||
flex_URL=https://github.com/westes/flex
|
|
||||||
gnu_software_URL=https://www.gnu.org/software
|
|
||||||
|
|
||||||
program_details ()
|
|
||||||
{
|
|
||||||
case $1 in
|
|
||||||
aclocal|automake)
|
|
||||||
echo "The '$1' program is part of the GNU Automake package:"
|
|
||||||
echo "<$gnu_software_URL/automake>"
|
|
||||||
echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
|
|
||||||
echo "<$gnu_software_URL/autoconf>"
|
|
||||||
echo "<$gnu_software_URL/m4/>"
|
|
||||||
echo "<$perl_URL>"
|
|
||||||
;;
|
|
||||||
autoconf|autom4te|autoheader)
|
|
||||||
echo "The '$1' program is part of the GNU Autoconf package:"
|
|
||||||
echo "<$gnu_software_URL/autoconf/>"
|
|
||||||
echo "It also requires GNU m4 and Perl in order to run:"
|
|
||||||
echo "<$gnu_software_URL/m4/>"
|
|
||||||
echo "<$perl_URL>"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
give_advice ()
|
|
||||||
{
|
|
||||||
# Normalize program name to check for.
|
|
||||||
normalized_program=`echo "$1" | sed '
|
|
||||||
s/^gnu-//; t
|
s/^gnu-//; t
|
||||||
s/^gnu//; t
|
s/^gnu//; t
|
||||||
s/^g//; t'`
|
s/^g//; t'`
|
||||||
|
|
||||||
printf '%s\n' "'$1' is $msg."
|
# Now exit if we have it, but it failed. Also exit now if we
|
||||||
|
# don't have it and --version was passed (most likely to detect
|
||||||
|
# the program). This is about non-GNU programs, so use $1 not
|
||||||
|
# $program.
|
||||||
|
case $1 in
|
||||||
|
lex*|yacc*)
|
||||||
|
# Not GNU programs, they don't have --version.
|
||||||
|
;;
|
||||||
|
|
||||||
configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
|
tar*)
|
||||||
case $normalized_program in
|
if test -n "$run"; then
|
||||||
autoconf*)
|
echo 1>&2 "ERROR: \`tar' requires --run"
|
||||||
echo "You should only need it if you modified 'configure.ac',"
|
exit 1
|
||||||
echo "or m4 files included by it."
|
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||||
program_details 'autoconf'
|
exit 1
|
||||||
;;
|
fi
|
||||||
autoheader*)
|
|
||||||
echo "You should only need it if you modified 'acconfig.h' or"
|
|
||||||
echo "$configure_deps."
|
|
||||||
program_details 'autoheader'
|
|
||||||
;;
|
|
||||||
automake*)
|
|
||||||
echo "You should only need it if you modified 'Makefile.am' or"
|
|
||||||
echo "$configure_deps."
|
|
||||||
program_details 'automake'
|
|
||||||
;;
|
|
||||||
aclocal*)
|
|
||||||
echo "You should only need it if you modified 'acinclude.m4' or"
|
|
||||||
echo "$configure_deps."
|
|
||||||
program_details 'aclocal'
|
|
||||||
;;
|
|
||||||
autom4te*)
|
|
||||||
echo "You might have modified some maintainer files that require"
|
|
||||||
echo "the 'autom4te' program to be rebuilt."
|
|
||||||
program_details 'autom4te'
|
|
||||||
;;
|
|
||||||
bison*|yacc*)
|
|
||||||
echo "You should only need it if you modified a '.y' file."
|
|
||||||
echo "You may want to install the GNU Bison package:"
|
|
||||||
echo "<$gnu_software_URL/bison/>"
|
|
||||||
;;
|
|
||||||
lex*|flex*)
|
|
||||||
echo "You should only need it if you modified a '.l' file."
|
|
||||||
echo "You may want to install the Fast Lexical Analyzer package:"
|
|
||||||
echo "<$flex_URL>"
|
|
||||||
;;
|
|
||||||
help2man*)
|
|
||||||
echo "You should only need it if you modified a dependency" \
|
|
||||||
"of a man page."
|
|
||||||
echo "You may want to install the GNU Help2man package:"
|
|
||||||
echo "<$gnu_software_URL/help2man/>"
|
|
||||||
;;
|
|
||||||
makeinfo*)
|
|
||||||
echo "You should only need it if you modified a '.texi' file, or"
|
|
||||||
echo "any other file indirectly affecting the aspect of the manual."
|
|
||||||
echo "You might want to install the Texinfo package:"
|
|
||||||
echo "<$gnu_software_URL/texinfo/>"
|
|
||||||
echo "The spurious makeinfo call might also be the consequence of"
|
|
||||||
echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
|
|
||||||
echo "want to install GNU make:"
|
|
||||||
echo "<$gnu_software_URL/make/>"
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
echo "You might have modified some files without having the proper"
|
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
||||||
echo "tools for further handling them. Check the 'README' file, it"
|
# We have it, but it failed.
|
||||||
echo "often tells you about the needed prerequisites for installing"
|
exit 1
|
||||||
echo "this package. You may also peek at any GNU archive site, in"
|
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||||
echo "case some other package contains this missing '$1' program."
|
# Could not run --version or --help. This is probably someone
|
||||||
|
# running `$TOOL --version' or `$TOOL --help' to check whether
|
||||||
|
# $TOOL exists and not knowing $TOOL uses missing.
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
|
||||||
|
|
||||||
give_advice "$1" | sed -e '1s/^/WARNING: /' \
|
# If it does not exist, or fails to run (possibly an outdated version),
|
||||||
-e '2,$s/^/ /' >&2
|
# try to emulate it.
|
||||||
|
case $program in
|
||||||
|
aclocal*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
|
||||||
|
to install the \`Automake' and \`Perl' packages. Grab them from
|
||||||
|
any GNU archive site."
|
||||||
|
touch aclocal.m4
|
||||||
|
;;
|
||||||
|
|
||||||
# Propagate the correct exit status (expected to be 127 for a program
|
autoconf*)
|
||||||
# not found, 63 for a program that failed due to version mismatch).
|
echo 1>&2 "\
|
||||||
exit $st
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`${configure_ac}'. You might want to install the
|
||||||
|
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
||||||
|
archive site."
|
||||||
|
touch configure
|
||||||
|
;;
|
||||||
|
|
||||||
|
autoheader*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`acconfig.h' or \`${configure_ac}'. You might want
|
||||||
|
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
||||||
|
from any GNU archive site."
|
||||||
|
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
||||||
|
test -z "$files" && files="config.h"
|
||||||
|
touch_files=
|
||||||
|
for f in $files; do
|
||||||
|
case $f in
|
||||||
|
*:*) touch_files="$touch_files "`echo "$f" |
|
||||||
|
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
||||||
|
*) touch_files="$touch_files $f.in";;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
touch $touch_files
|
||||||
|
;;
|
||||||
|
|
||||||
|
automake*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
|
||||||
|
You might want to install the \`Automake' and \`Perl' packages.
|
||||||
|
Grab them from any GNU archive site."
|
||||||
|
find . -type f -name Makefile.am -print |
|
||||||
|
sed 's/\.am$/.in/' |
|
||||||
|
while read f; do touch "$f"; done
|
||||||
|
;;
|
||||||
|
|
||||||
|
autom4te*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is needed, but is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them.
|
||||||
|
You can get \`$1' as part of \`Autoconf' from any GNU
|
||||||
|
archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -f "$file"; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo "#! /bin/sh"
|
||||||
|
echo "# Created by GNU Automake missing as a replacement of"
|
||||||
|
echo "# $ $@"
|
||||||
|
echo "exit 0"
|
||||||
|
chmod +x $file
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
bison*|yacc*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' $msg. You should only need it if
|
||||||
|
you modified a \`.y' file. You may need the \`Bison' package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
\`Bison' from any GNU archive site."
|
||||||
|
rm -f y.tab.c y.tab.h
|
||||||
|
if test $# -ne 1; then
|
||||||
|
eval LASTARG="\${$#}"
|
||||||
|
case $LASTARG in
|
||||||
|
*.y)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" y.tab.c
|
||||||
|
fi
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" y.tab.h
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test ! -f y.tab.h; then
|
||||||
|
echo >y.tab.h
|
||||||
|
fi
|
||||||
|
if test ! -f y.tab.c; then
|
||||||
|
echo 'main() { return 0; }' >y.tab.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
lex*|flex*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a \`.l' file. You may need the \`Flex' package
|
||||||
|
in order for those modifications to take effect. You can get
|
||||||
|
\`Flex' from any GNU archive site."
|
||||||
|
rm -f lex.yy.c
|
||||||
|
if test $# -ne 1; then
|
||||||
|
eval LASTARG="\${$#}"
|
||||||
|
case $LASTARG in
|
||||||
|
*.l)
|
||||||
|
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
||||||
|
if test -f "$SRCFILE"; then
|
||||||
|
cp "$SRCFILE" lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test ! -f lex.yy.c; then
|
||||||
|
echo 'main() { return 0; }' >lex.yy.c
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
help2man*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a dependency of a manual page. You may need the
|
||||||
|
\`Help2man' package in order for those modifications to take
|
||||||
|
effect. You can get \`Help2man' from any GNU archive site."
|
||||||
|
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -f "$file"; then
|
||||||
|
touch $file
|
||||||
|
else
|
||||||
|
test -z "$file" || exec >$file
|
||||||
|
echo ".ab help2man is required to generate this page"
|
||||||
|
exit $?
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
makeinfo*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is $msg. You should only need it if
|
||||||
|
you modified a \`.texi' or \`.texinfo' file, or any other file
|
||||||
|
indirectly affecting the aspect of the manual. The spurious
|
||||||
|
call might also be the consequence of using a buggy \`make' (AIX,
|
||||||
|
DU, IRIX). You might want to install the \`Texinfo' package or
|
||||||
|
the \`GNU make' package. Grab either from any GNU archive site."
|
||||||
|
# The file to touch is that specified with -o ...
|
||||||
|
file=`echo "$*" | sed -n "$sed_output"`
|
||||||
|
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
||||||
|
if test -z "$file"; then
|
||||||
|
# ... or it is the one specified with @setfilename ...
|
||||||
|
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
||||||
|
file=`sed -n '
|
||||||
|
/^@setfilename/{
|
||||||
|
s/.* \([^ ]*\) *$/\1/
|
||||||
|
p
|
||||||
|
q
|
||||||
|
}' $infile`
|
||||||
|
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
||||||
|
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
||||||
|
fi
|
||||||
|
# If the file does not exist, the user really needs makeinfo;
|
||||||
|
# let's fail without touching anything.
|
||||||
|
test -f $file || exit 1
|
||||||
|
touch $file
|
||||||
|
;;
|
||||||
|
|
||||||
|
tar*)
|
||||||
|
shift
|
||||||
|
|
||||||
|
# We have already tried tar in the generic part.
|
||||||
|
# Look for gnutar/gtar before invocation to avoid ugly error
|
||||||
|
# messages.
|
||||||
|
if (gnutar --version > /dev/null 2>&1); then
|
||||||
|
gnutar "$@" && exit 0
|
||||||
|
fi
|
||||||
|
if (gtar --version > /dev/null 2>&1); then
|
||||||
|
gtar "$@" && exit 0
|
||||||
|
fi
|
||||||
|
firstarg="$1"
|
||||||
|
if shift; then
|
||||||
|
case $firstarg in
|
||||||
|
*o*)
|
||||||
|
firstarg=`echo "$firstarg" | sed s/o//`
|
||||||
|
tar "$firstarg" "$@" && exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case $firstarg in
|
||||||
|
*h*)
|
||||||
|
firstarg=`echo "$firstarg" | sed s/h//`
|
||||||
|
tar "$firstarg" "$@" && exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: I can't seem to be able to run \`tar' with the given arguments.
|
||||||
|
You may want to install GNU tar or Free paxutils, or check the
|
||||||
|
command line arguments."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo 1>&2 "\
|
||||||
|
WARNING: \`$1' is needed, and is $msg.
|
||||||
|
You might have modified some files without having the
|
||||||
|
proper tools for further handling them. Check the \`README' file,
|
||||||
|
it often tells you about the needed prerequisites for installing
|
||||||
|
this package. You may also peek at any GNU archive site, in case
|
||||||
|
some other package would contain this missing \`$1' program."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
# Local variables:
|
# Local variables:
|
||||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
# time-stamp-start: "scriptversion="
|
# time-stamp-start: "scriptversion="
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
# time-stamp-time-zone: "UTC0"
|
# time-stamp-time-zone: "UTC"
|
||||||
# time-stamp-end: "; # UTC"
|
# time-stamp-end: "; # UTC"
|
||||||
# End:
|
# End:
|
||||||
|
|
101
src/Makefile.am
101
src/Makefile.am
|
@ -1,89 +1,50 @@
|
||||||
## Produce this file with automake to get Makefile.in
|
## Produce this file with automake to get Makefile.in
|
||||||
|
|
||||||
sbin_PROGRAMS = tincd
|
sbin_PROGRAMS = tincd tincctl
|
||||||
|
|
||||||
|
EXTRA_DIST = linux bsd solaris cygwin mingw raw_socket uml_socket openssl gcrypt
|
||||||
|
|
||||||
tincd_SOURCES = \
|
tincd_SOURCES = \
|
||||||
have.h \
|
utils.c getopt.c getopt1.c list.c splay_tree.c dropin.c fake-getaddrinfo.c fake-getnameinfo.c \
|
||||||
system.h \
|
buffer.c conf.c connection.c control.c edge.c graph.c logger.c meta.c net.c net_packet.c net_setup.c \
|
||||||
avl_tree.c avl_tree.h \
|
net_socket.c netutl.c node.c process.c protocol.c protocol_auth.c protocol_edge.c protocol_misc.c \
|
||||||
conf.c conf.h \
|
protocol_key.c protocol_subnet.c route.c subnet.c tincd.c
|
||||||
connection.c connection.h \
|
|
||||||
device.h \
|
|
||||||
dropin.c dropin.h \
|
|
||||||
dummy_device.c \
|
|
||||||
edge.c edge.h \
|
|
||||||
ethernet.h \
|
|
||||||
event.c event.h \
|
|
||||||
fake-getaddrinfo.c fake-getaddrinfo.h \
|
|
||||||
fake-getnameinfo.c fake-getnameinfo.h \
|
|
||||||
graph.c graph.h \
|
|
||||||
ipv4.h \
|
|
||||||
ipv6.h \
|
|
||||||
list.c list.h \
|
|
||||||
logger.c logger.h \
|
|
||||||
meta.c meta.h \
|
|
||||||
multicast_device.c \
|
|
||||||
net.c net.h \
|
|
||||||
net_packet.c \
|
|
||||||
net_setup.c \
|
|
||||||
net_socket.c \
|
|
||||||
netutl.c netutl.h \
|
|
||||||
node.c node.h \
|
|
||||||
pidfile.c pidfile.h \
|
|
||||||
process.c process.h \
|
|
||||||
protocol.c protocol.h \
|
|
||||||
protocol_auth.c \
|
|
||||||
protocol_edge.c \
|
|
||||||
protocol_misc.c \
|
|
||||||
protocol_key.c \
|
|
||||||
protocol_subnet.c \
|
|
||||||
proxy.c proxy.h \
|
|
||||||
raw_socket_device.c \
|
|
||||||
route.c route.h \
|
|
||||||
subnet.c subnet.h \
|
|
||||||
tincd.c \
|
|
||||||
utils.c utils.h \
|
|
||||||
xalloc.h
|
|
||||||
|
|
||||||
if !GETOPT
|
nodist_tincd_SOURCES = \
|
||||||
tincd_SOURCES += \
|
device.c cipher.c crypto.c ecdh.c ecdsa.c digest.c prf.c rsa.c
|
||||||
getopt.c getopt.h \
|
|
||||||
getopt1.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
if LINUX
|
tincctl_SOURCES = \
|
||||||
tincd_SOURCES += linux/device.c
|
utils.c getopt.c getopt1.c dropin.c \
|
||||||
endif
|
list.c tincctl.c top.c
|
||||||
|
|
||||||
|
nodist_tincctl_SOURCES = \
|
||||||
|
ecdsagen.c rsagen.c
|
||||||
|
|
||||||
if BSD
|
|
||||||
tincd_SOURCES += bsd/device.c
|
|
||||||
if TUNEMU
|
if TUNEMU
|
||||||
tincd_SOURCES += bsd/tunemu.c bsd/tunemu.h
|
tincd_SOURCES += bsd/tunemu.c
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if SOLARIS
|
tincctl_LDADD = $(CURSES_LIBS)
|
||||||
tincd_SOURCES += solaris/device.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
if MINGW
|
DEFAULT_INCLUDES =
|
||||||
tincd_SOURCES += mingw/device.c mingw/common.h
|
|
||||||
endif
|
|
||||||
|
|
||||||
if CYGWIN
|
INCLUDES = @INCLUDES@ -I$(top_builddir)
|
||||||
tincd_SOURCES += cygwin/device.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
if UML
|
noinst_HEADERS = \
|
||||||
tincd_SOURCES += uml_device.c
|
xalloc.h utils.h getopt.h list.h splay_tree.h dropin.h fake-getaddrinfo.h fake-getnameinfo.h fake-gai-errnos.h ipv6.h ipv4.h ethernet.h \
|
||||||
endif
|
buffer.h conf.h connection.h control.h control_common.h device.h edge.h graph.h logger.h meta.h net.h netutl.h node.h process.h \
|
||||||
|
protocol.h route.h subnet.h tincctl.h top.h bsd/tunemu.h
|
||||||
|
|
||||||
if VDE
|
nodist_noinst_HEADERS = \
|
||||||
tincd_SOURCES += vde_device.c
|
cipher.h crypto.h ecdh.h ecdsa.h digest.h prf.h rsa.h ecdsagen.h rsagen.h
|
||||||
endif
|
|
||||||
|
LIBS = @LIBS@ @LIBGCRYPT_LIBS@
|
||||||
|
|
||||||
if TUNEMU
|
if TUNEMU
|
||||||
LIBS += -lpcap
|
LIBS += -lpcap
|
||||||
endif
|
endif
|
||||||
|
|
||||||
AM_CPPFLAGS = -DCONFDIR=\"$(sysconfdir)\" -DRUNSTATEDIR=\"$(runstatedir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -I $(abs_top_builddir)/
|
AM_CFLAGS = -DCONFDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -DSBINDIR=\"$(sbindir)\"
|
||||||
|
|
||||||
|
dist-hook:
|
||||||
|
rm -f `find . -type l`
|
||||||
|
|
724
src/Makefile.in
724
src/Makefile.in
|
@ -1,8 +1,9 @@
|
||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||||
|
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
||||||
|
# Inc.
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
# with or without modifications, as long as this notice is preserved.
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
@ -14,62 +15,8 @@
|
||||||
|
|
||||||
@SET_MAKE@
|
@SET_MAKE@
|
||||||
|
|
||||||
|
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
am__is_gnu_make = { \
|
|
||||||
if test -z '$(MAKELEVEL)'; then \
|
|
||||||
false; \
|
|
||||||
elif test -n '$(MAKE_HOST)'; then \
|
|
||||||
true; \
|
|
||||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
|
||||||
true; \
|
|
||||||
else \
|
|
||||||
false; \
|
|
||||||
fi; \
|
|
||||||
}
|
|
||||||
am__make_running_with_option = \
|
|
||||||
case $${target_option-} in \
|
|
||||||
?) ;; \
|
|
||||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
|
||||||
"target option '$${target_option-}' specified" >&2; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
has_opt=no; \
|
|
||||||
sane_makeflags=$$MAKEFLAGS; \
|
|
||||||
if $(am__is_gnu_make); then \
|
|
||||||
sane_makeflags=$$MFLAGS; \
|
|
||||||
else \
|
|
||||||
case $$MAKEFLAGS in \
|
|
||||||
*\\[\ \ ]*) \
|
|
||||||
bs=\\; \
|
|
||||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
|
||||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
|
||||||
esac; \
|
|
||||||
fi; \
|
|
||||||
skip_next=no; \
|
|
||||||
strip_trailopt () \
|
|
||||||
{ \
|
|
||||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
|
||||||
}; \
|
|
||||||
for flg in $$sane_makeflags; do \
|
|
||||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
|
||||||
case $$flg in \
|
|
||||||
*=*|--*) continue;; \
|
|
||||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
|
||||||
-*I?*) strip_trailopt 'I';; \
|
|
||||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
|
||||||
-*O?*) strip_trailopt 'O';; \
|
|
||||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
|
||||||
-*l?*) strip_trailopt 'l';; \
|
|
||||||
-[dEDm]) skip_next=yes;; \
|
|
||||||
-[JT]) skip_next=yes;; \
|
|
||||||
esac; \
|
|
||||||
case $$flg in \
|
|
||||||
*$$target_option*) has_opt=yes; break;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
test $$has_opt = yes
|
|
||||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
|
||||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
@ -88,163 +35,74 @@ PRE_UNINSTALL = :
|
||||||
POST_UNINSTALL = :
|
POST_UNINSTALL = :
|
||||||
build_triplet = @build@
|
build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
sbin_PROGRAMS = tincd$(EXEEXT)
|
sbin_PROGRAMS = tincd$(EXEEXT) tincctl$(EXEEXT)
|
||||||
@GETOPT_FALSE@am__append_1 = \
|
@TUNEMU_TRUE@am__append_1 = bsd/tunemu.c
|
||||||
@GETOPT_FALSE@ getopt.c getopt.h \
|
@TUNEMU_TRUE@am__append_2 = -lpcap
|
||||||
@GETOPT_FALSE@ getopt1.c
|
|
||||||
|
|
||||||
@LINUX_TRUE@am__append_2 = linux/device.c
|
|
||||||
@BSD_TRUE@am__append_3 = bsd/device.c
|
|
||||||
@BSD_TRUE@@TUNEMU_TRUE@am__append_4 = bsd/tunemu.c bsd/tunemu.h
|
|
||||||
@SOLARIS_TRUE@am__append_5 = solaris/device.c
|
|
||||||
@MINGW_TRUE@am__append_6 = mingw/device.c mingw/common.h
|
|
||||||
@CYGWIN_TRUE@am__append_7 = cygwin/device.c
|
|
||||||
@UML_TRUE@am__append_8 = uml_device.c
|
|
||||||
@VDE_TRUE@am__append_9 = vde_device.c
|
|
||||||
@TUNEMU_TRUE@am__append_10 = -lpcap
|
|
||||||
subdir = src
|
subdir = src
|
||||||
|
DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
|
||||||
|
$(srcdir)/Makefile.in
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
am__aclocal_m4_deps = $(top_srcdir)/m4/attribute.m4 \
|
||||||
$(top_srcdir)/m4/ax_append_flag.m4 \
|
$(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/libevent.m4 \
|
||||||
$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
|
$(top_srcdir)/m4/lzo.m4 $(top_srcdir)/m4/openssl.m4 \
|
||||||
$(top_srcdir)/m4/ax_check_compile_flag.m4 \
|
$(top_srcdir)/m4/zlib.m4 $(top_srcdir)/configure.in
|
||||||
$(top_srcdir)/m4/ax_check_link_flag.m4 \
|
|
||||||
$(top_srcdir)/m4/ax_require_defined.m4 $(top_srcdir)/m4/lzo.m4 \
|
|
||||||
$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/zlib.m4 \
|
|
||||||
$(top_srcdir)/configure.ac
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h
|
CONFIG_HEADER = $(top_builddir)/config.h
|
||||||
CONFIG_CLEAN_FILES =
|
CONFIG_CLEAN_FILES =
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
am__installdirs = "$(DESTDIR)$(sbindir)"
|
am__installdirs = "$(DESTDIR)$(sbindir)"
|
||||||
PROGRAMS = $(sbin_PROGRAMS)
|
PROGRAMS = $(sbin_PROGRAMS)
|
||||||
am__tincd_SOURCES_DIST = have.h system.h avl_tree.c avl_tree.h conf.c \
|
am_tincctl_OBJECTS = utils.$(OBJEXT) getopt.$(OBJEXT) \
|
||||||
conf.h connection.c connection.h device.h dropin.c dropin.h \
|
getopt1.$(OBJEXT) dropin.$(OBJEXT) list.$(OBJEXT) \
|
||||||
dummy_device.c edge.c edge.h ethernet.h event.c event.h \
|
tincctl.$(OBJEXT) top.$(OBJEXT)
|
||||||
fake-getaddrinfo.c fake-getaddrinfo.h fake-getnameinfo.c \
|
nodist_tincctl_OBJECTS = ecdsagen.$(OBJEXT) rsagen.$(OBJEXT)
|
||||||
fake-getnameinfo.h graph.c graph.h ipv4.h ipv6.h list.c list.h \
|
tincctl_OBJECTS = $(am_tincctl_OBJECTS) $(nodist_tincctl_OBJECTS)
|
||||||
logger.c logger.h meta.c meta.h multicast_device.c net.c net.h \
|
am__DEPENDENCIES_1 =
|
||||||
net_packet.c net_setup.c net_socket.c netutl.c netutl.h node.c \
|
tincctl_DEPENDENCIES = $(am__DEPENDENCIES_1)
|
||||||
node.h pidfile.c pidfile.h process.c process.h protocol.c \
|
am__tincd_SOURCES_DIST = utils.c getopt.c getopt1.c list.c \
|
||||||
protocol.h protocol_auth.c protocol_edge.c protocol_misc.c \
|
splay_tree.c dropin.c fake-getaddrinfo.c fake-getnameinfo.c \
|
||||||
protocol_key.c protocol_subnet.c proxy.c proxy.h \
|
buffer.c conf.c connection.c control.c edge.c graph.c logger.c \
|
||||||
raw_socket_device.c route.c route.h subnet.c subnet.h tincd.c \
|
meta.c net.c net_packet.c net_setup.c net_socket.c netutl.c \
|
||||||
utils.c utils.h xalloc.h getopt.c getopt.h getopt1.c \
|
node.c process.c protocol.c protocol_auth.c protocol_edge.c \
|
||||||
linux/device.c bsd/device.c bsd/tunemu.c bsd/tunemu.h \
|
protocol_misc.c protocol_key.c protocol_subnet.c route.c \
|
||||||
solaris/device.c mingw/device.c mingw/common.h cygwin/device.c \
|
subnet.c tincd.c bsd/tunemu.c
|
||||||
uml_device.c vde_device.c
|
@TUNEMU_TRUE@am__objects_1 = tunemu.$(OBJEXT)
|
||||||
@GETOPT_FALSE@am__objects_1 = getopt.$(OBJEXT) getopt1.$(OBJEXT)
|
am_tincd_OBJECTS = utils.$(OBJEXT) getopt.$(OBJEXT) getopt1.$(OBJEXT) \
|
||||||
am__dirstamp = $(am__leading_dot)dirstamp
|
list.$(OBJEXT) splay_tree.$(OBJEXT) dropin.$(OBJEXT) \
|
||||||
@LINUX_TRUE@am__objects_2 = linux/device.$(OBJEXT)
|
fake-getaddrinfo.$(OBJEXT) fake-getnameinfo.$(OBJEXT) \
|
||||||
@BSD_TRUE@am__objects_3 = bsd/device.$(OBJEXT)
|
buffer.$(OBJEXT) conf.$(OBJEXT) connection.$(OBJEXT) \
|
||||||
@BSD_TRUE@@TUNEMU_TRUE@am__objects_4 = bsd/tunemu.$(OBJEXT)
|
control.$(OBJEXT) edge.$(OBJEXT) graph.$(OBJEXT) \
|
||||||
@SOLARIS_TRUE@am__objects_5 = solaris/device.$(OBJEXT)
|
logger.$(OBJEXT) meta.$(OBJEXT) net.$(OBJEXT) \
|
||||||
@MINGW_TRUE@am__objects_6 = mingw/device.$(OBJEXT)
|
net_packet.$(OBJEXT) net_setup.$(OBJEXT) net_socket.$(OBJEXT) \
|
||||||
@CYGWIN_TRUE@am__objects_7 = cygwin/device.$(OBJEXT)
|
netutl.$(OBJEXT) node.$(OBJEXT) process.$(OBJEXT) \
|
||||||
@UML_TRUE@am__objects_8 = uml_device.$(OBJEXT)
|
protocol.$(OBJEXT) protocol_auth.$(OBJEXT) \
|
||||||
@VDE_TRUE@am__objects_9 = vde_device.$(OBJEXT)
|
protocol_edge.$(OBJEXT) protocol_misc.$(OBJEXT) \
|
||||||
am_tincd_OBJECTS = avl_tree.$(OBJEXT) conf.$(OBJEXT) \
|
protocol_key.$(OBJEXT) protocol_subnet.$(OBJEXT) \
|
||||||
connection.$(OBJEXT) dropin.$(OBJEXT) dummy_device.$(OBJEXT) \
|
route.$(OBJEXT) subnet.$(OBJEXT) tincd.$(OBJEXT) \
|
||||||
edge.$(OBJEXT) event.$(OBJEXT) fake-getaddrinfo.$(OBJEXT) \
|
$(am__objects_1)
|
||||||
fake-getnameinfo.$(OBJEXT) graph.$(OBJEXT) list.$(OBJEXT) \
|
nodist_tincd_OBJECTS = device.$(OBJEXT) cipher.$(OBJEXT) \
|
||||||
logger.$(OBJEXT) meta.$(OBJEXT) multicast_device.$(OBJEXT) \
|
crypto.$(OBJEXT) ecdh.$(OBJEXT) ecdsa.$(OBJEXT) \
|
||||||
net.$(OBJEXT) net_packet.$(OBJEXT) net_setup.$(OBJEXT) \
|
digest.$(OBJEXT) prf.$(OBJEXT) rsa.$(OBJEXT)
|
||||||
net_socket.$(OBJEXT) netutl.$(OBJEXT) node.$(OBJEXT) \
|
tincd_OBJECTS = $(am_tincd_OBJECTS) $(nodist_tincd_OBJECTS)
|
||||||
pidfile.$(OBJEXT) process.$(OBJEXT) protocol.$(OBJEXT) \
|
|
||||||
protocol_auth.$(OBJEXT) protocol_edge.$(OBJEXT) \
|
|
||||||
protocol_misc.$(OBJEXT) protocol_key.$(OBJEXT) \
|
|
||||||
protocol_subnet.$(OBJEXT) proxy.$(OBJEXT) \
|
|
||||||
raw_socket_device.$(OBJEXT) route.$(OBJEXT) subnet.$(OBJEXT) \
|
|
||||||
tincd.$(OBJEXT) utils.$(OBJEXT) $(am__objects_1) \
|
|
||||||
$(am__objects_2) $(am__objects_3) $(am__objects_4) \
|
|
||||||
$(am__objects_5) $(am__objects_6) $(am__objects_7) \
|
|
||||||
$(am__objects_8) $(am__objects_9)
|
|
||||||
tincd_OBJECTS = $(am_tincd_OBJECTS)
|
|
||||||
tincd_LDADD = $(LDADD)
|
tincd_LDADD = $(LDADD)
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
|
||||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
|
||||||
am__v_P_0 = false
|
|
||||||
am__v_P_1 = :
|
|
||||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
|
||||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
|
||||||
am__v_GEN_0 = @echo " GEN " $@;
|
|
||||||
am__v_GEN_1 =
|
|
||||||
AM_V_at = $(am__v_at_@AM_V@)
|
|
||||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
|
||||||
am__v_at_0 = @
|
|
||||||
am__v_at_1 =
|
|
||||||
DEFAULT_INCLUDES =
|
|
||||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||||
am__maybe_remake_depfiles = depfiles
|
am__depfiles_maybe = depfiles
|
||||||
am__depfiles_remade = ./$(DEPDIR)/avl_tree.Po ./$(DEPDIR)/conf.Po \
|
|
||||||
./$(DEPDIR)/connection.Po ./$(DEPDIR)/dropin.Po \
|
|
||||||
./$(DEPDIR)/dummy_device.Po ./$(DEPDIR)/edge.Po \
|
|
||||||
./$(DEPDIR)/event.Po ./$(DEPDIR)/fake-getaddrinfo.Po \
|
|
||||||
./$(DEPDIR)/fake-getnameinfo.Po ./$(DEPDIR)/getopt.Po \
|
|
||||||
./$(DEPDIR)/getopt1.Po ./$(DEPDIR)/graph.Po \
|
|
||||||
./$(DEPDIR)/list.Po ./$(DEPDIR)/logger.Po ./$(DEPDIR)/meta.Po \
|
|
||||||
./$(DEPDIR)/multicast_device.Po ./$(DEPDIR)/net.Po \
|
|
||||||
./$(DEPDIR)/net_packet.Po ./$(DEPDIR)/net_setup.Po \
|
|
||||||
./$(DEPDIR)/net_socket.Po ./$(DEPDIR)/netutl.Po \
|
|
||||||
./$(DEPDIR)/node.Po ./$(DEPDIR)/pidfile.Po \
|
|
||||||
./$(DEPDIR)/process.Po ./$(DEPDIR)/protocol.Po \
|
|
||||||
./$(DEPDIR)/protocol_auth.Po ./$(DEPDIR)/protocol_edge.Po \
|
|
||||||
./$(DEPDIR)/protocol_key.Po ./$(DEPDIR)/protocol_misc.Po \
|
|
||||||
./$(DEPDIR)/protocol_subnet.Po ./$(DEPDIR)/proxy.Po \
|
|
||||||
./$(DEPDIR)/raw_socket_device.Po ./$(DEPDIR)/route.Po \
|
|
||||||
./$(DEPDIR)/subnet.Po ./$(DEPDIR)/tincd.Po \
|
|
||||||
./$(DEPDIR)/uml_device.Po ./$(DEPDIR)/utils.Po \
|
|
||||||
./$(DEPDIR)/vde_device.Po bsd/$(DEPDIR)/device.Po \
|
|
||||||
bsd/$(DEPDIR)/tunemu.Po cygwin/$(DEPDIR)/device.Po \
|
|
||||||
linux/$(DEPDIR)/device.Po mingw/$(DEPDIR)/device.Po \
|
|
||||||
solaris/$(DEPDIR)/device.Po
|
|
||||||
am__mv = mv -f
|
am__mv = mv -f
|
||||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
AM_V_CC = $(am__v_CC_@AM_V@)
|
|
||||||
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
|
|
||||||
am__v_CC_0 = @echo " CC " $@;
|
|
||||||
am__v_CC_1 =
|
|
||||||
CCLD = $(CC)
|
CCLD = $(CC)
|
||||||
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||||
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
SOURCES = $(tincctl_SOURCES) $(nodist_tincctl_SOURCES) \
|
||||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
$(tincd_SOURCES) $(nodist_tincd_SOURCES)
|
||||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
DIST_SOURCES = $(tincctl_SOURCES) $(am__tincd_SOURCES_DIST)
|
||||||
am__v_CCLD_1 =
|
HEADERS = $(nodist_noinst_HEADERS) $(noinst_HEADERS)
|
||||||
SOURCES = $(tincd_SOURCES)
|
|
||||||
DIST_SOURCES = $(am__tincd_SOURCES_DIST)
|
|
||||||
am__can_run_installinfo = \
|
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
|
||||||
n|no|NO) false;; \
|
|
||||||
*) (install-info --version) >/dev/null 2>&1;; \
|
|
||||||
esac
|
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
|
||||||
# Read a list of newline-separated strings from the standard input,
|
|
||||||
# and print each of them once, without duplicates. Input order is
|
|
||||||
# *not* preserved.
|
|
||||||
am__uniquify_input = $(AWK) '\
|
|
||||||
BEGIN { nonempty = 0; } \
|
|
||||||
{ items[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in items) print i; }; } \
|
|
||||||
'
|
|
||||||
# Make sure the list of sources is unique. This is necessary because,
|
|
||||||
# e.g., the same source file might be shared among _SOURCES variables
|
|
||||||
# for different programs/libraries.
|
|
||||||
am__define_uniq_tagged_files = \
|
|
||||||
list='$(am__tagged_files)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | $(am__uniquify_input)`
|
|
||||||
ETAGS = etags
|
ETAGS = etags
|
||||||
CTAGS = ctags
|
CTAGS = ctags
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
ACLOCAL = @ACLOCAL@
|
ACLOCAL = @ACLOCAL@
|
||||||
AMTAR = @AMTAR@
|
AMTAR = @AMTAR@
|
||||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
AUTOCONF = @AUTOCONF@
|
||||||
AUTOHEADER = @AUTOHEADER@
|
AUTOHEADER = @AUTOHEADER@
|
||||||
AUTOMAKE = @AUTOMAKE@
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
@ -254,6 +112,7 @@ CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CURSES_LIBS = @CURSES_LIBS@
|
||||||
CYGPATH_W = @CYGPATH_W@
|
CYGPATH_W = @CYGPATH_W@
|
||||||
DEFS = @DEFS@
|
DEFS = @DEFS@
|
||||||
DEPDIR = @DEPDIR@
|
DEPDIR = @DEPDIR@
|
||||||
|
@ -263,15 +122,21 @@ ECHO_T = @ECHO_T@
|
||||||
EGREP = @EGREP@
|
EGREP = @EGREP@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
GREP = @GREP@
|
GREP = @GREP@
|
||||||
|
INCLUDES = @INCLUDES@ -I$(top_builddir)
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
|
||||||
|
LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
|
||||||
|
LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
|
||||||
LIBOBJS = @LIBOBJS@
|
LIBOBJS = @LIBOBJS@
|
||||||
LIBS = @LIBS@ $(am__append_10)
|
LIBS = @LIBS@ @LIBGCRYPT_LIBS@ $(am__append_2)
|
||||||
|
LN_S = @LN_S@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
OBJEXT = @OBJEXT@
|
OBJEXT = @OBJEXT@
|
||||||
|
@ -283,6 +148,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
SET_MAKE = @SET_MAKE@
|
SET_MAKE = @SET_MAKE@
|
||||||
SHELL = @SHELL@
|
SHELL = @SHELL@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
|
@ -329,37 +195,48 @@ pdfdir = @pdfdir@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
program_transform_name = @program_transform_name@
|
program_transform_name = @program_transform_name@
|
||||||
psdir = @psdir@
|
psdir = @psdir@
|
||||||
runstatedir = @runstatedir@
|
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
systemd_path = @systemd_path@
|
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
top_build_prefix = @top_build_prefix@
|
top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
tincd_SOURCES = have.h system.h avl_tree.c avl_tree.h conf.c conf.h \
|
EXTRA_DIST = linux bsd solaris cygwin mingw raw_socket uml_socket openssl gcrypt
|
||||||
connection.c connection.h device.h dropin.c dropin.h \
|
tincd_SOURCES = utils.c getopt.c getopt1.c list.c splay_tree.c \
|
||||||
dummy_device.c edge.c edge.h ethernet.h event.c event.h \
|
dropin.c fake-getaddrinfo.c fake-getnameinfo.c buffer.c conf.c \
|
||||||
fake-getaddrinfo.c fake-getaddrinfo.h fake-getnameinfo.c \
|
connection.c control.c edge.c graph.c logger.c meta.c net.c \
|
||||||
fake-getnameinfo.h graph.c graph.h ipv4.h ipv6.h list.c list.h \
|
net_packet.c net_setup.c net_socket.c netutl.c node.c \
|
||||||
logger.c logger.h meta.c meta.h multicast_device.c net.c net.h \
|
process.c protocol.c protocol_auth.c protocol_edge.c \
|
||||||
net_packet.c net_setup.c net_socket.c netutl.c netutl.h node.c \
|
protocol_misc.c protocol_key.c protocol_subnet.c route.c \
|
||||||
node.h pidfile.c pidfile.h process.c process.h protocol.c \
|
subnet.c tincd.c $(am__append_1)
|
||||||
protocol.h protocol_auth.c protocol_edge.c protocol_misc.c \
|
nodist_tincd_SOURCES = \
|
||||||
protocol_key.c protocol_subnet.c proxy.c proxy.h \
|
device.c cipher.c crypto.c ecdh.c ecdsa.c digest.c prf.c rsa.c
|
||||||
raw_socket_device.c route.c route.h subnet.c subnet.h tincd.c \
|
|
||||||
utils.c utils.h xalloc.h $(am__append_1) $(am__append_2) \
|
tincctl_SOURCES = \
|
||||||
$(am__append_3) $(am__append_4) $(am__append_5) \
|
utils.c getopt.c getopt1.c dropin.c \
|
||||||
$(am__append_6) $(am__append_7) $(am__append_8) \
|
list.c tincctl.c top.c
|
||||||
$(am__append_9)
|
|
||||||
AM_CPPFLAGS = -DCONFDIR=\"$(sysconfdir)\" -DRUNSTATEDIR=\"$(runstatedir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -I $(abs_top_builddir)/
|
nodist_tincctl_SOURCES = \
|
||||||
|
ecdsagen.c rsagen.c
|
||||||
|
|
||||||
|
tincctl_LDADD = $(CURSES_LIBS)
|
||||||
|
DEFAULT_INCLUDES =
|
||||||
|
noinst_HEADERS = \
|
||||||
|
xalloc.h utils.h getopt.h list.h splay_tree.h dropin.h fake-getaddrinfo.h fake-getnameinfo.h fake-gai-errnos.h ipv6.h ipv4.h ethernet.h \
|
||||||
|
buffer.h conf.h connection.h control.h control_common.h device.h edge.h graph.h logger.h meta.h net.h netutl.h node.h process.h \
|
||||||
|
protocol.h route.h subnet.h tincctl.h top.h bsd/tunemu.h
|
||||||
|
|
||||||
|
nodist_noinst_HEADERS = \
|
||||||
|
cipher.h crypto.h ecdh.h ecdsa.h digest.h prf.h rsa.h ecdsagen.h rsagen.h
|
||||||
|
|
||||||
|
AM_CFLAGS = -DCONFDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -DSBINDIR=\"$(sbindir)\"
|
||||||
all: all-am
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
.SUFFIXES: .c .o .obj
|
.SUFFIXES: .c .o .obj
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
@for dep in $?; do \
|
@for dep in $?; do \
|
||||||
case '$(am__configure_deps)' in \
|
case '$(am__configure_deps)' in \
|
||||||
*$$dep*) \
|
*$$dep*) \
|
||||||
|
@ -371,37 +248,34 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
|
||||||
$(am__cd) $(top_srcdir) && \
|
$(am__cd) $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu src/Makefile
|
$(AUTOMAKE) --gnu src/Makefile
|
||||||
|
.PRECIOUS: Makefile
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
||||||
*config.status*) \
|
*config.status*) \
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
*) \
|
*) \
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
$(am__aclocal_m4_deps):
|
$(am__aclocal_m4_deps):
|
||||||
install-sbinPROGRAMS: $(sbin_PROGRAMS)
|
install-sbinPROGRAMS: $(sbin_PROGRAMS)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
|
test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)"
|
||||||
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
|
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do echo "$$p $$p"; done | \
|
for p in $$list; do echo "$$p $$p"; done | \
|
||||||
sed 's/$(EXEEXT)$$//' | \
|
sed 's/$(EXEEXT)$$//' | \
|
||||||
while read p p1; do if test -f $$p \
|
while read p p1; do if test -f $$p; \
|
||||||
; then echo "$$p"; echo "$$p"; else :; fi; \
|
then echo "$$p"; echo "$$p"; else :; fi; \
|
||||||
done | \
|
done | \
|
||||||
sed -e 'p;s,.*/,,;n;h' \
|
sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
|
||||||
-e 's|.*|.|' \
|
|
||||||
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
|
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
|
||||||
sed 'N;N;N;s,\n, ,g' | \
|
sed 'N;N;N;s,\n, ,g' | \
|
||||||
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
|
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
|
||||||
|
@ -422,164 +296,120 @@ uninstall-sbinPROGRAMS:
|
||||||
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
|
@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
|
||||||
files=`for p in $$list; do echo "$$p"; done | \
|
files=`for p in $$list; do echo "$$p"; done | \
|
||||||
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
|
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
|
||||||
-e 's/$$/$(EXEEXT)/' \
|
-e 's/$$/$(EXEEXT)/' `; \
|
||||||
`; \
|
|
||||||
test -n "$$list" || exit 0; \
|
test -n "$$list" || exit 0; \
|
||||||
echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \
|
echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \
|
||||||
cd "$(DESTDIR)$(sbindir)" && rm -f $$files
|
cd "$(DESTDIR)$(sbindir)" && rm -f $$files
|
||||||
|
|
||||||
clean-sbinPROGRAMS:
|
clean-sbinPROGRAMS:
|
||||||
-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
|
-test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
|
||||||
|
tincctl$(EXEEXT): $(tincctl_OBJECTS) $(tincctl_DEPENDENCIES)
|
||||||
installcheck-sbinPROGRAMS: $(sbin_PROGRAMS)
|
@rm -f tincctl$(EXEEXT)
|
||||||
bad=0; pid=$$$$; list="$(sbin_PROGRAMS)"; for p in $$list; do \
|
$(LINK) $(tincctl_OBJECTS) $(tincctl_LDADD) $(LIBS)
|
||||||
case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
|
tincd$(EXEEXT): $(tincd_OBJECTS) $(tincd_DEPENDENCIES)
|
||||||
*" $$p "* | *" $(srcdir)/$$p "*) continue;; \
|
|
||||||
esac; \
|
|
||||||
f=`echo "$$p" | \
|
|
||||||
sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
|
|
||||||
for opt in --help --version; do \
|
|
||||||
if "$(DESTDIR)$(sbindir)/$$f" $$opt >c$${pid}_.out \
|
|
||||||
2>c$${pid}_.err </dev/null \
|
|
||||||
&& test -n "`cat c$${pid}_.out`" \
|
|
||||||
&& test -z "`cat c$${pid}_.err`"; then :; \
|
|
||||||
else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
|
|
||||||
done; \
|
|
||||||
done; rm -f c$${pid}_.???; exit $$bad
|
|
||||||
linux/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) linux
|
|
||||||
@: > linux/$(am__dirstamp)
|
|
||||||
linux/$(DEPDIR)/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) linux/$(DEPDIR)
|
|
||||||
@: > linux/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
linux/device.$(OBJEXT): linux/$(am__dirstamp) \
|
|
||||||
linux/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
bsd/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) bsd
|
|
||||||
@: > bsd/$(am__dirstamp)
|
|
||||||
bsd/$(DEPDIR)/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) bsd/$(DEPDIR)
|
|
||||||
@: > bsd/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
bsd/device.$(OBJEXT): bsd/$(am__dirstamp) \
|
|
||||||
bsd/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
bsd/tunemu.$(OBJEXT): bsd/$(am__dirstamp) \
|
|
||||||
bsd/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
solaris/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) solaris
|
|
||||||
@: > solaris/$(am__dirstamp)
|
|
||||||
solaris/$(DEPDIR)/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) solaris/$(DEPDIR)
|
|
||||||
@: > solaris/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
solaris/device.$(OBJEXT): solaris/$(am__dirstamp) \
|
|
||||||
solaris/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
mingw/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) mingw
|
|
||||||
@: > mingw/$(am__dirstamp)
|
|
||||||
mingw/$(DEPDIR)/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) mingw/$(DEPDIR)
|
|
||||||
@: > mingw/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
mingw/device.$(OBJEXT): mingw/$(am__dirstamp) \
|
|
||||||
mingw/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
cygwin/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) cygwin
|
|
||||||
@: > cygwin/$(am__dirstamp)
|
|
||||||
cygwin/$(DEPDIR)/$(am__dirstamp):
|
|
||||||
@$(MKDIR_P) cygwin/$(DEPDIR)
|
|
||||||
@: > cygwin/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
cygwin/device.$(OBJEXT): cygwin/$(am__dirstamp) \
|
|
||||||
cygwin/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
|
|
||||||
tincd$(EXEEXT): $(tincd_OBJECTS) $(tincd_DEPENDENCIES) $(EXTRA_tincd_DEPENDENCIES)
|
|
||||||
@rm -f tincd$(EXEEXT)
|
@rm -f tincd$(EXEEXT)
|
||||||
$(AM_V_CCLD)$(LINK) $(tincd_OBJECTS) $(tincd_LDADD) $(LIBS)
|
$(LINK) $(tincd_OBJECTS) $(tincd_LDADD) $(LIBS)
|
||||||
|
|
||||||
mostlyclean-compile:
|
mostlyclean-compile:
|
||||||
-rm -f *.$(OBJEXT)
|
-rm -f *.$(OBJEXT)
|
||||||
-rm -f bsd/*.$(OBJEXT)
|
|
||||||
-rm -f cygwin/*.$(OBJEXT)
|
|
||||||
-rm -f linux/*.$(OBJEXT)
|
|
||||||
-rm -f mingw/*.$(OBJEXT)
|
|
||||||
-rm -f solaris/*.$(OBJEXT)
|
|
||||||
|
|
||||||
distclean-compile:
|
distclean-compile:
|
||||||
-rm -f *.tab.c
|
-rm -f *.tab.c
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl_tree.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffer.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conf.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connection.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conf.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dropin.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connection.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy_device.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/control.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edge.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/device.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake-getaddrinfo.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/digest.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake-getnameinfo.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dropin.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecdh.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecdsa.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graph.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecdsagen.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edge.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logger.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake-getaddrinfo.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meta.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fake-getnameinfo.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multicast_device.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net_packet.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graph.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net_setup.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net_socket.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logger.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netutl.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/meta.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/node.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pidfile.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net_packet.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net_setup.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net_socket.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol_auth.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netutl.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol_edge.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/node.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol_key.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prf.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol_misc.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol_subnet.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proxy.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol_auth.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/raw_socket_device.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol_edge.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/route.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol_key.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subnet.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol_misc.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tincd.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol_subnet.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uml_device.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/route.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsa.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vde_device.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsagen.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@bsd/$(DEPDIR)/device.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/splay_tree.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@bsd/$(DEPDIR)/tunemu.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subnet.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@cygwin/$(DEPDIR)/device.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tincctl.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@linux/$(DEPDIR)/device.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tincd.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@mingw/$(DEPDIR)/device.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/top.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@solaris/$(DEPDIR)/device.Po@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tunemu.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@
|
||||||
$(am__depfiles_remade):
|
|
||||||
@$(MKDIR_P) $(@D)
|
|
||||||
@echo '# dummy' >$@-t && $(am__mv) $@-t $@
|
|
||||||
|
|
||||||
am--depfiles: $(am__depfiles_remade)
|
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
|
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
|
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
||||||
|
|
||||||
.c.obj:
|
.c.obj:
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
|
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||||
|
|
||||||
ID: $(am__tagged_files)
|
tunemu.o: bsd/tunemu.c
|
||||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tunemu.o -MD -MP -MF $(DEPDIR)/tunemu.Tpo -c -o tunemu.o `test -f 'bsd/tunemu.c' || echo '$(srcdir)/'`bsd/tunemu.c
|
||||||
tags: tags-am
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tunemu.Tpo $(DEPDIR)/tunemu.Po
|
||||||
TAGS: tags
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bsd/tunemu.c' object='tunemu.o' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tunemu.o `test -f 'bsd/tunemu.c' || echo '$(srcdir)/'`bsd/tunemu.c
|
||||||
|
|
||||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
tunemu.obj: bsd/tunemu.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tunemu.obj -MD -MP -MF $(DEPDIR)/tunemu.Tpo -c -o tunemu.obj `if test -f 'bsd/tunemu.c'; then $(CYGPATH_W) 'bsd/tunemu.c'; else $(CYGPATH_W) '$(srcdir)/bsd/tunemu.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tunemu.Tpo $(DEPDIR)/tunemu.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bsd/tunemu.c' object='tunemu.obj' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tunemu.obj `if test -f 'bsd/tunemu.c'; then $(CYGPATH_W) 'bsd/tunemu.c'; else $(CYGPATH_W) '$(srcdir)/bsd/tunemu.c'; fi`
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||||
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
|
mkid -fID $$unique
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
|
$(TAGS_FILES) $(LISP)
|
||||||
set x; \
|
set x; \
|
||||||
here=`pwd`; \
|
here=`pwd`; \
|
||||||
$(am__define_uniq_tagged_files); \
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
shift; \
|
shift; \
|
||||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||||
test -n "$$unique" || unique=$$empty_fix; \
|
test -n "$$unique" || unique=$$empty_fix; \
|
||||||
|
@ -591,11 +421,15 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||||
$$unique; \
|
$$unique; \
|
||||||
fi; \
|
fi; \
|
||||||
fi
|
fi
|
||||||
ctags: ctags-am
|
ctags: CTAGS
|
||||||
|
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||||
CTAGS: ctags
|
$(TAGS_FILES) $(LISP)
|
||||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||||
$(am__define_uniq_tagged_files); \
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | \
|
||||||
|
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||||
test -z "$(CTAGS_ARGS)$$unique" \
|
test -z "$(CTAGS_ARGS)$$unique" \
|
||||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||||
$$unique
|
$$unique
|
||||||
|
@ -604,29 +438,11 @@ GTAGS:
|
||||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||||
&& $(am__cd) $(top_srcdir) \
|
&& $(am__cd) $(top_srcdir) \
|
||||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||||
cscopelist: cscopelist-am
|
|
||||||
|
|
||||||
cscopelist-am: $(am__tagged_files)
|
|
||||||
list='$(am__tagged_files)'; \
|
|
||||||
case "$(srcdir)" in \
|
|
||||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
|
||||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
|
||||||
esac; \
|
|
||||||
for i in $$list; do \
|
|
||||||
if test -f "$$i"; then \
|
|
||||||
echo "$(subdir)/$$i"; \
|
|
||||||
else \
|
|
||||||
echo "$$sdir/$$i"; \
|
|
||||||
fi; \
|
|
||||||
done >> $(top_builddir)/cscope.files
|
|
||||||
|
|
||||||
distclean-tags:
|
distclean-tags:
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
|
||||||
distdir: $(BUILT_SOURCES)
|
distdir: $(DISTFILES)
|
||||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
|
||||||
|
|
||||||
distdir-am: $(DISTFILES)
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
list='$(DISTFILES)'; \
|
list='$(DISTFILES)'; \
|
||||||
|
@ -656,9 +472,12 @@ distdir-am: $(DISTFILES)
|
||||||
|| exit 1; \
|
|| exit 1; \
|
||||||
fi; \
|
fi; \
|
||||||
done
|
done
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) \
|
||||||
|
top_distdir="$(top_distdir)" distdir="$(distdir)" \
|
||||||
|
dist-hook
|
||||||
check-am: all-am
|
check-am: all-am
|
||||||
check: check-am
|
check: check-am
|
||||||
all-am: Makefile $(PROGRAMS)
|
all-am: Makefile $(PROGRAMS) $(HEADERS)
|
||||||
installdirs:
|
installdirs:
|
||||||
for dir in "$(DESTDIR)$(sbindir)"; do \
|
for dir in "$(DESTDIR)$(sbindir)"; do \
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||||
|
@ -673,15 +492,10 @@ install-am: all-am
|
||||||
|
|
||||||
installcheck: installcheck-am
|
installcheck: installcheck-am
|
||||||
install-strip:
|
install-strip:
|
||||||
if test -z '$(STRIP)'; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
install; \
|
`test -z '$(STRIP)' || \
|
||||||
else \
|
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
|
||||||
fi
|
|
||||||
mostlyclean-generic:
|
mostlyclean-generic:
|
||||||
|
|
||||||
clean-generic:
|
clean-generic:
|
||||||
|
@ -689,16 +503,6 @@ clean-generic:
|
||||||
distclean-generic:
|
distclean-generic:
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||||
-rm -f bsd/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
-rm -f bsd/$(am__dirstamp)
|
|
||||||
-rm -f cygwin/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
-rm -f cygwin/$(am__dirstamp)
|
|
||||||
-rm -f linux/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
-rm -f linux/$(am__dirstamp)
|
|
||||||
-rm -f mingw/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
-rm -f mingw/$(am__dirstamp)
|
|
||||||
-rm -f solaris/$(DEPDIR)/$(am__dirstamp)
|
|
||||||
-rm -f solaris/$(am__dirstamp)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
maintainer-clean-generic:
|
||||||
@echo "This command is intended for maintainers to use"
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@ -708,50 +512,7 @@ clean: clean-am
|
||||||
clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
|
clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am
|
||||||
|
|
||||||
distclean: distclean-am
|
distclean: distclean-am
|
||||||
-rm -f ./$(DEPDIR)/avl_tree.Po
|
-rm -rf ./$(DEPDIR)
|
||||||
-rm -f ./$(DEPDIR)/conf.Po
|
|
||||||
-rm -f ./$(DEPDIR)/connection.Po
|
|
||||||
-rm -f ./$(DEPDIR)/dropin.Po
|
|
||||||
-rm -f ./$(DEPDIR)/dummy_device.Po
|
|
||||||
-rm -f ./$(DEPDIR)/edge.Po
|
|
||||||
-rm -f ./$(DEPDIR)/event.Po
|
|
||||||
-rm -f ./$(DEPDIR)/fake-getaddrinfo.Po
|
|
||||||
-rm -f ./$(DEPDIR)/fake-getnameinfo.Po
|
|
||||||
-rm -f ./$(DEPDIR)/getopt.Po
|
|
||||||
-rm -f ./$(DEPDIR)/getopt1.Po
|
|
||||||
-rm -f ./$(DEPDIR)/graph.Po
|
|
||||||
-rm -f ./$(DEPDIR)/list.Po
|
|
||||||
-rm -f ./$(DEPDIR)/logger.Po
|
|
||||||
-rm -f ./$(DEPDIR)/meta.Po
|
|
||||||
-rm -f ./$(DEPDIR)/multicast_device.Po
|
|
||||||
-rm -f ./$(DEPDIR)/net.Po
|
|
||||||
-rm -f ./$(DEPDIR)/net_packet.Po
|
|
||||||
-rm -f ./$(DEPDIR)/net_setup.Po
|
|
||||||
-rm -f ./$(DEPDIR)/net_socket.Po
|
|
||||||
-rm -f ./$(DEPDIR)/netutl.Po
|
|
||||||
-rm -f ./$(DEPDIR)/node.Po
|
|
||||||
-rm -f ./$(DEPDIR)/pidfile.Po
|
|
||||||
-rm -f ./$(DEPDIR)/process.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol_auth.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol_edge.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol_key.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol_misc.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol_subnet.Po
|
|
||||||
-rm -f ./$(DEPDIR)/proxy.Po
|
|
||||||
-rm -f ./$(DEPDIR)/raw_socket_device.Po
|
|
||||||
-rm -f ./$(DEPDIR)/route.Po
|
|
||||||
-rm -f ./$(DEPDIR)/subnet.Po
|
|
||||||
-rm -f ./$(DEPDIR)/tincd.Po
|
|
||||||
-rm -f ./$(DEPDIR)/uml_device.Po
|
|
||||||
-rm -f ./$(DEPDIR)/utils.Po
|
|
||||||
-rm -f ./$(DEPDIR)/vde_device.Po
|
|
||||||
-rm -f bsd/$(DEPDIR)/device.Po
|
|
||||||
-rm -f bsd/$(DEPDIR)/tunemu.Po
|
|
||||||
-rm -f cygwin/$(DEPDIR)/device.Po
|
|
||||||
-rm -f linux/$(DEPDIR)/device.Po
|
|
||||||
-rm -f mingw/$(DEPDIR)/device.Po
|
|
||||||
-rm -f solaris/$(DEPDIR)/device.Po
|
|
||||||
-rm -f Makefile
|
-rm -f Makefile
|
||||||
distclean-am: clean-am distclean-compile distclean-generic \
|
distclean-am: clean-am distclean-compile distclean-generic \
|
||||||
distclean-tags
|
distclean-tags
|
||||||
|
@ -794,53 +555,10 @@ install-ps: install-ps-am
|
||||||
|
|
||||||
install-ps-am:
|
install-ps-am:
|
||||||
|
|
||||||
installcheck-am: installcheck-sbinPROGRAMS
|
installcheck-am:
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-am
|
maintainer-clean: maintainer-clean-am
|
||||||
-rm -f ./$(DEPDIR)/avl_tree.Po
|
-rm -rf ./$(DEPDIR)
|
||||||
-rm -f ./$(DEPDIR)/conf.Po
|
|
||||||
-rm -f ./$(DEPDIR)/connection.Po
|
|
||||||
-rm -f ./$(DEPDIR)/dropin.Po
|
|
||||||
-rm -f ./$(DEPDIR)/dummy_device.Po
|
|
||||||
-rm -f ./$(DEPDIR)/edge.Po
|
|
||||||
-rm -f ./$(DEPDIR)/event.Po
|
|
||||||
-rm -f ./$(DEPDIR)/fake-getaddrinfo.Po
|
|
||||||
-rm -f ./$(DEPDIR)/fake-getnameinfo.Po
|
|
||||||
-rm -f ./$(DEPDIR)/getopt.Po
|
|
||||||
-rm -f ./$(DEPDIR)/getopt1.Po
|
|
||||||
-rm -f ./$(DEPDIR)/graph.Po
|
|
||||||
-rm -f ./$(DEPDIR)/list.Po
|
|
||||||
-rm -f ./$(DEPDIR)/logger.Po
|
|
||||||
-rm -f ./$(DEPDIR)/meta.Po
|
|
||||||
-rm -f ./$(DEPDIR)/multicast_device.Po
|
|
||||||
-rm -f ./$(DEPDIR)/net.Po
|
|
||||||
-rm -f ./$(DEPDIR)/net_packet.Po
|
|
||||||
-rm -f ./$(DEPDIR)/net_setup.Po
|
|
||||||
-rm -f ./$(DEPDIR)/net_socket.Po
|
|
||||||
-rm -f ./$(DEPDIR)/netutl.Po
|
|
||||||
-rm -f ./$(DEPDIR)/node.Po
|
|
||||||
-rm -f ./$(DEPDIR)/pidfile.Po
|
|
||||||
-rm -f ./$(DEPDIR)/process.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol_auth.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol_edge.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol_key.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol_misc.Po
|
|
||||||
-rm -f ./$(DEPDIR)/protocol_subnet.Po
|
|
||||||
-rm -f ./$(DEPDIR)/proxy.Po
|
|
||||||
-rm -f ./$(DEPDIR)/raw_socket_device.Po
|
|
||||||
-rm -f ./$(DEPDIR)/route.Po
|
|
||||||
-rm -f ./$(DEPDIR)/subnet.Po
|
|
||||||
-rm -f ./$(DEPDIR)/tincd.Po
|
|
||||||
-rm -f ./$(DEPDIR)/uml_device.Po
|
|
||||||
-rm -f ./$(DEPDIR)/utils.Po
|
|
||||||
-rm -f ./$(DEPDIR)/vde_device.Po
|
|
||||||
-rm -f bsd/$(DEPDIR)/device.Po
|
|
||||||
-rm -f bsd/$(DEPDIR)/tunemu.Po
|
|
||||||
-rm -f cygwin/$(DEPDIR)/device.Po
|
|
||||||
-rm -f linux/$(DEPDIR)/device.Po
|
|
||||||
-rm -f mingw/$(DEPDIR)/device.Po
|
|
||||||
-rm -f solaris/$(DEPDIR)/device.Po
|
|
||||||
-rm -f Makefile
|
-rm -f Makefile
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
@ -860,22 +578,22 @@ uninstall-am: uninstall-sbinPROGRAMS
|
||||||
|
|
||||||
.MAKE: install-am install-strip
|
.MAKE: install-am install-strip
|
||||||
|
|
||||||
.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
|
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
|
||||||
clean-generic clean-sbinPROGRAMS cscopelist-am ctags ctags-am \
|
clean-sbinPROGRAMS ctags dist-hook distclean distclean-compile \
|
||||||
distclean distclean-compile distclean-generic distclean-tags \
|
distclean-generic distclean-tags distdir dvi dvi-am html \
|
||||||
distdir dvi dvi-am html html-am info info-am install \
|
html-am info info-am install install-am install-data \
|
||||||
install-am install-data install-data-am install-dvi \
|
install-data-am install-dvi install-dvi-am install-exec \
|
||||||
install-dvi-am install-exec install-exec-am install-html \
|
install-exec-am install-html install-html-am install-info \
|
||||||
install-html-am install-info install-info-am install-man \
|
install-info-am install-man install-pdf install-pdf-am \
|
||||||
install-pdf install-pdf-am install-ps install-ps-am \
|
install-ps install-ps-am install-sbinPROGRAMS install-strip \
|
||||||
install-sbinPROGRAMS install-strip installcheck \
|
installcheck installcheck-am installdirs maintainer-clean \
|
||||||
installcheck-am installcheck-sbinPROGRAMS installdirs \
|
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
|
||||||
mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
|
uninstall-am uninstall-sbinPROGRAMS
|
||||||
tags tags-am uninstall uninstall-am uninstall-sbinPROGRAMS
|
|
||||||
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
|
|
||||||
|
dist-hook:
|
||||||
|
rm -f `find . -type l`
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
|
757
src/avl_tree.c
757
src/avl_tree.c
|
@ -1,757 +0,0 @@
|
||||||
/*
|
|
||||||
avl_tree.c -- avl_ tree and linked list convenience
|
|
||||||
Copyright (C) 1998 Michael H. Buselli
|
|
||||||
2000-2005 Ivo Timmermans,
|
|
||||||
2000-2015 Guus Sliepen <guus@tinc-vpn.org>
|
|
||||||
2000-2005 Wessel Dankers <wsl@tinc-vpn.org>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
|
|
||||||
Original AVL tree library by Michael H. Buselli <cosine@cosine.org>.
|
|
||||||
|
|
||||||
Modified 2000-11-28 by Wessel Dankers <wsl@tinc-vpn.org> to use counts
|
|
||||||
instead of depths, to add the ->next and ->prev and to generally obfuscate
|
|
||||||
the code. Mail me if you found a bug.
|
|
||||||
|
|
||||||
Cleaned up and incorporated some of the ideas from the red-black tree
|
|
||||||
library for inclusion into tinc (https://www.tinc-vpn.org/) by
|
|
||||||
Guus Sliepen <guus@tinc-vpn.org>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "system.h"
|
|
||||||
|
|
||||||
#include "avl_tree.h"
|
|
||||||
#include "xalloc.h"
|
|
||||||
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
#define AVL_NODE_COUNT(n) ((n) ? (n)->count : 0)
|
|
||||||
#define AVL_L_COUNT(n) (AVL_NODE_COUNT((n)->left))
|
|
||||||
#define AVL_R_COUNT(n) (AVL_NODE_COUNT((n)->right))
|
|
||||||
#define AVL_CALC_COUNT(n) (AVL_L_COUNT(n) + AVL_R_COUNT(n) + 1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
#define AVL_NODE_DEPTH(n) ((n) ? (n)->depth : 0)
|
|
||||||
#define L_AVL_DEPTH(n) (AVL_NODE_DEPTH((n)->left))
|
|
||||||
#define R_AVL_DEPTH(n) (AVL_NODE_DEPTH((n)->right))
|
|
||||||
#define AVL_CALC_DEPTH(n) ((L_AVL_DEPTH(n)>R_AVL_DEPTH(n)?L_AVL_DEPTH(n):R_AVL_DEPTH(n)) + 1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AVL_DEPTH
|
|
||||||
static int lg(unsigned int u) __attribute__((__const__));
|
|
||||||
|
|
||||||
static int lg(unsigned int u) {
|
|
||||||
int r = 1;
|
|
||||||
|
|
||||||
if(!u) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(u & 0xffff0000) {
|
|
||||||
u >>= 16;
|
|
||||||
r += 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(u & 0x0000ff00) {
|
|
||||||
u >>= 8;
|
|
||||||
r += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(u & 0x000000f0) {
|
|
||||||
u >>= 4;
|
|
||||||
r += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(u & 0x0000000c) {
|
|
||||||
u >>= 2;
|
|
||||||
r += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(u & 0x00000002) {
|
|
||||||
r++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Internal helper functions */
|
|
||||||
|
|
||||||
static int avl_check_balance(const avl_node_t *node) {
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
int d;
|
|
||||||
|
|
||||||
d = R_AVL_DEPTH(node) - L_AVL_DEPTH(node);
|
|
||||||
|
|
||||||
return d < -1 ? -1 : d > 1 ? 1 : 0;
|
|
||||||
#else
|
|
||||||
/* int d;
|
|
||||||
* d = lg(AVL_R_COUNT(node)) - lg(AVL_L_COUNT(node));
|
|
||||||
* d = d<-1?-1:d>1?1:0;
|
|
||||||
*/
|
|
||||||
int pl, r;
|
|
||||||
|
|
||||||
pl = lg(AVL_L_COUNT(node));
|
|
||||||
r = AVL_R_COUNT(node);
|
|
||||||
|
|
||||||
if(r >> pl + 1) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(pl < 2 || r >> pl - 2) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void avl_rebalance(avl_tree_t *tree, avl_node_t *node) {
|
|
||||||
avl_node_t *child;
|
|
||||||
avl_node_t *gchild;
|
|
||||||
avl_node_t *parent;
|
|
||||||
avl_node_t **superparent;
|
|
||||||
|
|
||||||
while(node) {
|
|
||||||
parent = node->parent;
|
|
||||||
|
|
||||||
superparent =
|
|
||||||
parent ? node ==
|
|
||||||
parent->left ? &parent->left : &parent->right : &tree->root;
|
|
||||||
|
|
||||||
switch(avl_check_balance(node)) {
|
|
||||||
case -1:
|
|
||||||
child = node->left;
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
|
|
||||||
if(L_AVL_DEPTH(child) >= R_AVL_DEPTH(child)) {
|
|
||||||
#else
|
|
||||||
|
|
||||||
if(AVL_L_COUNT(child) >= AVL_R_COUNT(child)) {
|
|
||||||
#endif
|
|
||||||
node->left = child->right;
|
|
||||||
|
|
||||||
if(node->left) {
|
|
||||||
node->left->parent = node;
|
|
||||||
}
|
|
||||||
|
|
||||||
child->right = node;
|
|
||||||
node->parent = child;
|
|
||||||
*superparent = child;
|
|
||||||
child->parent = parent;
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
node->count = AVL_CALC_COUNT(node);
|
|
||||||
child->count = AVL_CALC_COUNT(child);
|
|
||||||
#endif
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
node->depth = AVL_CALC_DEPTH(node);
|
|
||||||
child->depth = AVL_CALC_DEPTH(child);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
gchild = child->right;
|
|
||||||
node->left = gchild->right;
|
|
||||||
|
|
||||||
if(node->left) {
|
|
||||||
node->left->parent = node;
|
|
||||||
}
|
|
||||||
|
|
||||||
child->right = gchild->left;
|
|
||||||
|
|
||||||
if(child->right) {
|
|
||||||
child->right->parent = child;
|
|
||||||
}
|
|
||||||
|
|
||||||
gchild->right = node;
|
|
||||||
|
|
||||||
gchild->right->parent = gchild;
|
|
||||||
gchild->left = child;
|
|
||||||
|
|
||||||
gchild->left->parent = gchild;
|
|
||||||
|
|
||||||
*superparent = gchild;
|
|
||||||
gchild->parent = parent;
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
node->count = AVL_CALC_COUNT(node);
|
|
||||||
child->count = AVL_CALC_COUNT(child);
|
|
||||||
gchild->count = AVL_CALC_COUNT(gchild);
|
|
||||||
#endif
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
node->depth = AVL_CALC_DEPTH(node);
|
|
||||||
child->depth = AVL_CALC_DEPTH(child);
|
|
||||||
gchild->depth = AVL_CALC_DEPTH(gchild);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
child = node->right;
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
|
|
||||||
if(R_AVL_DEPTH(child) >= L_AVL_DEPTH(child)) {
|
|
||||||
#else
|
|
||||||
|
|
||||||
if(AVL_R_COUNT(child) >= AVL_L_COUNT(child)) {
|
|
||||||
#endif
|
|
||||||
node->right = child->left;
|
|
||||||
|
|
||||||
if(node->right) {
|
|
||||||
node->right->parent = node;
|
|
||||||
}
|
|
||||||
|
|
||||||
child->left = node;
|
|
||||||
node->parent = child;
|
|
||||||
*superparent = child;
|
|
||||||
child->parent = parent;
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
node->count = AVL_CALC_COUNT(node);
|
|
||||||
child->count = AVL_CALC_COUNT(child);
|
|
||||||
#endif
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
node->depth = AVL_CALC_DEPTH(node);
|
|
||||||
child->depth = AVL_CALC_DEPTH(child);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
gchild = child->left;
|
|
||||||
node->right = gchild->left;
|
|
||||||
|
|
||||||
if(node->right) {
|
|
||||||
node->right->parent = node;
|
|
||||||
}
|
|
||||||
|
|
||||||
child->left = gchild->right;
|
|
||||||
|
|
||||||
if(child->left) {
|
|
||||||
child->left->parent = child;
|
|
||||||
}
|
|
||||||
|
|
||||||
gchild->left = node;
|
|
||||||
|
|
||||||
gchild->left->parent = gchild;
|
|
||||||
gchild->right = child;
|
|
||||||
|
|
||||||
gchild->right->parent = gchild;
|
|
||||||
|
|
||||||
*superparent = gchild;
|
|
||||||
gchild->parent = parent;
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
node->count = AVL_CALC_COUNT(node);
|
|
||||||
child->count = AVL_CALC_COUNT(child);
|
|
||||||
gchild->count = AVL_CALC_COUNT(gchild);
|
|
||||||
#endif
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
node->depth = AVL_CALC_DEPTH(node);
|
|
||||||
child->depth = AVL_CALC_DEPTH(child);
|
|
||||||
gchild->depth = AVL_CALC_DEPTH(gchild);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
node->count = AVL_CALC_COUNT(node);
|
|
||||||
#endif
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
node->depth = AVL_CALC_DEPTH(node);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
node = parent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (De)constructors */
|
|
||||||
|
|
||||||
avl_tree_t *avl_alloc_tree(avl_compare_t compare, avl_action_t delete) {
|
|
||||||
avl_tree_t *tree;
|
|
||||||
|
|
||||||
tree = xmalloc_and_zero(sizeof(avl_tree_t));
|
|
||||||
tree->compare = compare;
|
|
||||||
tree->delete = delete;
|
|
||||||
|
|
||||||
return tree;
|
|
||||||
}
|
|
||||||
|
|
||||||
void avl_free_tree(avl_tree_t *tree) {
|
|
||||||
free(tree);
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_node_t *avl_alloc_node(void) {
|
|
||||||
return xmalloc_and_zero(sizeof(avl_node_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
void avl_free_node(avl_tree_t *tree, avl_node_t *node) {
|
|
||||||
if(node->data && tree->delete) {
|
|
||||||
tree->delete(node->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Searching */
|
|
||||||
|
|
||||||
void *avl_search(const avl_tree_t *tree, const void *data) {
|
|
||||||
avl_node_t *node;
|
|
||||||
|
|
||||||
node = avl_search_node(tree, data);
|
|
||||||
|
|
||||||
return node ? node->data : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *avl_search_closest(const avl_tree_t *tree, const void *data, int *result) {
|
|
||||||
avl_node_t *node;
|
|
||||||
|
|
||||||
node = avl_search_closest_node(tree, data, result);
|
|
||||||
|
|
||||||
return node ? node->data : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *avl_search_closest_smaller(const avl_tree_t *tree, const void *data) {
|
|
||||||
avl_node_t *node;
|
|
||||||
|
|
||||||
node = avl_search_closest_smaller_node(tree, data);
|
|
||||||
|
|
||||||
return node ? node->data : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *avl_search_closest_greater(const avl_tree_t *tree, const void *data) {
|
|
||||||
avl_node_t *node;
|
|
||||||
|
|
||||||
node = avl_search_closest_greater_node(tree, data);
|
|
||||||
|
|
||||||
return node ? node->data : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_node_t *avl_search_node(const avl_tree_t *tree, const void *data) {
|
|
||||||
avl_node_t *node;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
node = avl_search_closest_node(tree, data, &result);
|
|
||||||
|
|
||||||
return result ? NULL : node;
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_node_t *avl_search_closest_node(const avl_tree_t *tree, const void *data,
|
|
||||||
int *result) {
|
|
||||||
avl_node_t *node;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
node = tree->root;
|
|
||||||
|
|
||||||
if(!node) {
|
|
||||||
if(result) {
|
|
||||||
*result = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(;;) {
|
|
||||||
c = tree->compare(data, node->data);
|
|
||||||
|
|
||||||
if(c < 0) {
|
|
||||||
if(node->left) {
|
|
||||||
node = node->left;
|
|
||||||
} else {
|
|
||||||
if(result) {
|
|
||||||
*result = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if(c > 0) {
|
|
||||||
if(node->right) {
|
|
||||||
node = node->right;
|
|
||||||
} else {
|
|
||||||
if(result) {
|
|
||||||
*result = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(result) {
|
|
||||||
*result = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_node_t *avl_search_closest_smaller_node(const avl_tree_t *tree,
|
|
||||||
const void *data) {
|
|
||||||
avl_node_t *node;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
node = avl_search_closest_node(tree, data, &result);
|
|
||||||
|
|
||||||
if(result < 0) {
|
|
||||||
node = node->prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_node_t *avl_search_closest_greater_node(const avl_tree_t *tree,
|
|
||||||
const void *data) {
|
|
||||||
avl_node_t *node;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
node = avl_search_closest_node(tree, data, &result);
|
|
||||||
|
|
||||||
if(result > 0) {
|
|
||||||
node = node->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Insertion and deletion */
|
|
||||||
|
|
||||||
avl_node_t *avl_insert(avl_tree_t *tree, void *data) {
|
|
||||||
avl_node_t *closest, *new;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
if(!tree->root) {
|
|
||||||
new = avl_alloc_node();
|
|
||||||
new->data = data;
|
|
||||||
avl_insert_top(tree, new);
|
|
||||||
} else {
|
|
||||||
closest = avl_search_closest_node(tree, data, &result);
|
|
||||||
|
|
||||||
switch(result) {
|
|
||||||
case -1:
|
|
||||||
new = avl_alloc_node();
|
|
||||||
new->data = data;
|
|
||||||
avl_insert_before(tree, closest, new);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
new = avl_alloc_node();
|
|
||||||
new->data = data;
|
|
||||||
avl_insert_after(tree, closest, new);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
new->count = 1;
|
|
||||||
#endif
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
new->depth = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_node_t *avl_insert_node(avl_tree_t *tree, avl_node_t *node) {
|
|
||||||
avl_node_t *closest;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
if(!tree->root) {
|
|
||||||
avl_insert_top(tree, node);
|
|
||||||
} else {
|
|
||||||
closest = avl_search_closest_node(tree, node->data, &result);
|
|
||||||
|
|
||||||
switch(result) {
|
|
||||||
case -1:
|
|
||||||
avl_insert_before(tree, closest, node);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
avl_insert_after(tree, closest, node);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0:
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
node->count = 1;
|
|
||||||
#endif
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
node->depth = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
void avl_insert_top(avl_tree_t *tree, avl_node_t *node) {
|
|
||||||
node->prev = node->next = node->parent = NULL;
|
|
||||||
tree->head = tree->tail = tree->root = node;
|
|
||||||
}
|
|
||||||
|
|
||||||
void avl_insert_before(avl_tree_t *tree, avl_node_t *before,
|
|
||||||
avl_node_t *node) {
|
|
||||||
if(!before) {
|
|
||||||
if(tree->tail) {
|
|
||||||
avl_insert_after(tree, tree->tail, node);
|
|
||||||
} else {
|
|
||||||
avl_insert_top(tree, node);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
node->next = before;
|
|
||||||
node->parent = before;
|
|
||||||
node->prev = before->prev;
|
|
||||||
|
|
||||||
if(before->left) {
|
|
||||||
avl_insert_after(tree, before->prev, node);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(before->prev) {
|
|
||||||
before->prev->next = node;
|
|
||||||
} else {
|
|
||||||
tree->head = node;
|
|
||||||
}
|
|
||||||
|
|
||||||
before->prev = node;
|
|
||||||
before->left = node;
|
|
||||||
|
|
||||||
avl_rebalance(tree, before);
|
|
||||||
}
|
|
||||||
|
|
||||||
void avl_insert_after(avl_tree_t *tree, avl_node_t *after, avl_node_t *node) {
|
|
||||||
if(!after) {
|
|
||||||
if(tree->head) {
|
|
||||||
avl_insert_before(tree, tree->head, node);
|
|
||||||
} else {
|
|
||||||
avl_insert_top(tree, node);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(after->right) {
|
|
||||||
avl_insert_before(tree, after->next, node);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
node->prev = after;
|
|
||||||
node->parent = after;
|
|
||||||
node->next = after->next;
|
|
||||||
|
|
||||||
if(after->next) {
|
|
||||||
after->next->prev = node;
|
|
||||||
} else {
|
|
||||||
tree->tail = node;
|
|
||||||
}
|
|
||||||
|
|
||||||
after->next = node;
|
|
||||||
after->right = node;
|
|
||||||
|
|
||||||
avl_rebalance(tree, after);
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_node_t *avl_unlink(avl_tree_t *tree, void *data) {
|
|
||||||
avl_node_t *node;
|
|
||||||
|
|
||||||
node = avl_search_node(tree, data);
|
|
||||||
|
|
||||||
if(node) {
|
|
||||||
avl_unlink_node(tree, node);
|
|
||||||
}
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
void avl_unlink_node(avl_tree_t *tree, avl_node_t *node) {
|
|
||||||
avl_node_t *parent;
|
|
||||||
avl_node_t **superparent;
|
|
||||||
avl_node_t *subst, *left, *right;
|
|
||||||
avl_node_t *balnode;
|
|
||||||
|
|
||||||
if(node->prev) {
|
|
||||||
node->prev->next = node->next;
|
|
||||||
} else {
|
|
||||||
tree->head = node->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(node->next) {
|
|
||||||
node->next->prev = node->prev;
|
|
||||||
} else {
|
|
||||||
tree->tail = node->prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
parent = node->parent;
|
|
||||||
|
|
||||||
superparent =
|
|
||||||
parent ? node ==
|
|
||||||
parent->left ? &parent->left : &parent->right : &tree->root;
|
|
||||||
|
|
||||||
left = node->left;
|
|
||||||
right = node->right;
|
|
||||||
|
|
||||||
if(!left) {
|
|
||||||
*superparent = right;
|
|
||||||
|
|
||||||
if(right) {
|
|
||||||
right->parent = parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
balnode = parent;
|
|
||||||
} else if(!right) {
|
|
||||||
*superparent = left;
|
|
||||||
left->parent = parent;
|
|
||||||
balnode = parent;
|
|
||||||
} else {
|
|
||||||
subst = node->prev;
|
|
||||||
|
|
||||||
if(!subst) { // This only happens if node is not actually in a tree at all.
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(subst == left) {
|
|
||||||
balnode = subst;
|
|
||||||
} else {
|
|
||||||
balnode = subst->parent;
|
|
||||||
balnode->right = subst->left;
|
|
||||||
|
|
||||||
if(balnode->right) {
|
|
||||||
balnode->right->parent = balnode;
|
|
||||||
}
|
|
||||||
|
|
||||||
subst->left = left;
|
|
||||||
left->parent = subst;
|
|
||||||
}
|
|
||||||
|
|
||||||
subst->right = right;
|
|
||||||
subst->parent = parent;
|
|
||||||
right->parent = subst;
|
|
||||||
*superparent = subst;
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_rebalance(tree, balnode);
|
|
||||||
|
|
||||||
node->next = node->prev = node->parent = node->left = node->right = NULL;
|
|
||||||
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
node->count = 0;
|
|
||||||
#endif
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
node->depth = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void avl_delete_node(avl_tree_t *tree, avl_node_t *node) {
|
|
||||||
avl_unlink_node(tree, node);
|
|
||||||
avl_free_node(tree, node);
|
|
||||||
}
|
|
||||||
|
|
||||||
void avl_delete(avl_tree_t *tree, void *data) {
|
|
||||||
avl_node_t *node;
|
|
||||||
|
|
||||||
node = avl_search_node(tree, data);
|
|
||||||
|
|
||||||
if(node) {
|
|
||||||
avl_delete_node(tree, node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fast tree cleanup */
|
|
||||||
|
|
||||||
void avl_delete_tree(avl_tree_t *tree) {
|
|
||||||
avl_node_t *node, *next;
|
|
||||||
|
|
||||||
for(node = tree->head; node; node = next) {
|
|
||||||
next = node->next;
|
|
||||||
avl_free_node(tree, node);
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_free_tree(tree);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Tree walking */
|
|
||||||
|
|
||||||
void avl_foreach(const avl_tree_t *tree, avl_action_t action) {
|
|
||||||
avl_node_t *node, *next;
|
|
||||||
|
|
||||||
for(node = tree->head; node; node = next) {
|
|
||||||
next = node->next;
|
|
||||||
action(node->data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void avl_foreach_node(const avl_tree_t *tree, avl_action_t action) {
|
|
||||||
avl_node_t *node, *next;
|
|
||||||
|
|
||||||
for(node = tree->head; node; node = next) {
|
|
||||||
next = node->next;
|
|
||||||
action(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Indexing */
|
|
||||||
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
unsigned int avl_count(const avl_tree_t *tree) {
|
|
||||||
return AVL_NODE_COUNT(tree->root);
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_node_t *avl_get_node(const avl_tree_t *tree, unsigned int index) {
|
|
||||||
avl_node_t *node;
|
|
||||||
unsigned int c;
|
|
||||||
|
|
||||||
node = tree->root;
|
|
||||||
|
|
||||||
while(node) {
|
|
||||||
c = AVL_L_COUNT(node);
|
|
||||||
|
|
||||||
if(index < c) {
|
|
||||||
node = node->left;
|
|
||||||
} else if(index > c) {
|
|
||||||
node = node->right;
|
|
||||||
index -= c + 1;
|
|
||||||
} else {
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int avl_index(const avl_node_t *node) {
|
|
||||||
avl_node_t *next;
|
|
||||||
unsigned int index;
|
|
||||||
|
|
||||||
index = AVL_L_COUNT(node);
|
|
||||||
|
|
||||||
while((next = node->parent)) {
|
|
||||||
if(node == next->right) {
|
|
||||||
index += AVL_L_COUNT(next) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
node = next;
|
|
||||||
}
|
|
||||||
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
unsigned int avl_depth(const avl_tree_t *tree) {
|
|
||||||
return AVL_NODE_DEPTH(tree->root);
|
|
||||||
}
|
|
||||||
#endif
|
|
142
src/avl_tree.h
142
src/avl_tree.h
|
@ -1,142 +0,0 @@
|
||||||
#ifndef TINC_AVL_TREE_H
|
|
||||||
#define TINC_AVL_TREE_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
avl_tree.h -- header file for avl_tree.c
|
|
||||||
Copyright (C) 1998 Michael H. Buselli
|
|
||||||
2000-2005 Ivo Timmermans,
|
|
||||||
2000-2006 Guus Sliepen <guus@tinc-vpn.org>
|
|
||||||
2000-2005 Wessel Dankers <wsl@tinc-vpn.org>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
|
|
||||||
Original AVL tree library by Michael H. Buselli <cosine@cosine.org>.
|
|
||||||
|
|
||||||
Modified 2000-11-28 by Wessel Dankers <wsl@tinc-vpn.org> to use counts
|
|
||||||
instead of depths, to add the ->next and ->prev and to generally obfuscate
|
|
||||||
the code. Mail me if you found a bug.
|
|
||||||
|
|
||||||
Cleaned up and incorporated some of the ideas from the red-black tree
|
|
||||||
library for inclusion into tinc (https://www.tinc-vpn.org/) by
|
|
||||||
Guus Sliepen <guus@tinc-vpn.org>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef AVL_DEPTH
|
|
||||||
#ifndef AVL_COUNT
|
|
||||||
#define AVL_DEPTH
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct avl_node_t {
|
|
||||||
|
|
||||||
/* Linked list part */
|
|
||||||
|
|
||||||
struct avl_node_t *next;
|
|
||||||
struct avl_node_t *prev;
|
|
||||||
|
|
||||||
/* Tree part */
|
|
||||||
|
|
||||||
struct avl_node_t *parent;
|
|
||||||
struct avl_node_t *left;
|
|
||||||
struct avl_node_t *right;
|
|
||||||
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
unsigned int count;
|
|
||||||
#endif
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
unsigned char depth;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Payload */
|
|
||||||
|
|
||||||
void *data;
|
|
||||||
|
|
||||||
} avl_node_t;
|
|
||||||
|
|
||||||
typedef int (*avl_compare_t)(const void *data1, const void *data2);
|
|
||||||
typedef void (*avl_action_t)(const void *data);
|
|
||||||
typedef void (*avl_action_node_t)(const avl_node_t *node);
|
|
||||||
|
|
||||||
typedef struct avl_tree_t {
|
|
||||||
|
|
||||||
/* Linked list part */
|
|
||||||
|
|
||||||
avl_node_t *head;
|
|
||||||
avl_node_t *tail;
|
|
||||||
|
|
||||||
/* Tree part */
|
|
||||||
|
|
||||||
avl_node_t *root;
|
|
||||||
|
|
||||||
avl_compare_t compare;
|
|
||||||
avl_action_t delete;
|
|
||||||
|
|
||||||
} avl_tree_t;
|
|
||||||
|
|
||||||
/* (De)constructors */
|
|
||||||
|
|
||||||
extern avl_tree_t *avl_alloc_tree(avl_compare_t compare, avl_action_t delete);
|
|
||||||
extern void avl_free_tree(avl_tree_t *tree);
|
|
||||||
|
|
||||||
extern avl_node_t *avl_alloc_node(void);
|
|
||||||
extern void avl_free_node(avl_tree_t *tree, avl_node_t *node);
|
|
||||||
|
|
||||||
/* Insertion and deletion */
|
|
||||||
|
|
||||||
extern avl_node_t *avl_insert(avl_tree_t *tree, void *data);
|
|
||||||
extern avl_node_t *avl_insert_node(avl_tree_t *tree, avl_node_t *node);
|
|
||||||
|
|
||||||
extern void avl_insert_top(avl_tree_t *tree, avl_node_t *node);
|
|
||||||
extern void avl_insert_before(avl_tree_t *tree, avl_node_t *before, avl_node_t *node);
|
|
||||||
extern void avl_insert_after(avl_tree_t *tree, avl_node_t *after, avl_node_t *node);
|
|
||||||
|
|
||||||
extern avl_node_t *avl_unlink(avl_tree_t *tree, void *data);
|
|
||||||
extern void avl_unlink_node(avl_tree_t *tree, avl_node_t *node);
|
|
||||||
extern void avl_delete(avl_tree_t *tree, void *data);
|
|
||||||
extern void avl_delete_node(avl_tree_t *tree, avl_node_t *node);
|
|
||||||
|
|
||||||
/* Fast tree cleanup */
|
|
||||||
|
|
||||||
extern void avl_delete_tree(avl_tree_t *tree);
|
|
||||||
|
|
||||||
/* Searching */
|
|
||||||
|
|
||||||
extern void *avl_search(const avl_tree_t *tree, const void *data);
|
|
||||||
extern void *avl_search_closest(const avl_tree_t *tree, const void *data, int *result);
|
|
||||||
extern void *avl_search_closest_smaller(const avl_tree_t *tree, const void *data);
|
|
||||||
extern void *avl_search_closest_greater(const avl_tree_t *tree, const void *data);
|
|
||||||
|
|
||||||
extern avl_node_t *avl_search_node(const avl_tree_t *tree, const void *data);
|
|
||||||
extern avl_node_t *avl_search_closest_node(const avl_tree_t *tree, const void *data, int *result);
|
|
||||||
extern avl_node_t *avl_search_closest_smaller_node(const avl_tree_t *tree, const void *data);
|
|
||||||
extern avl_node_t *avl_search_closest_greater_node(const avl_tree_t *tree, const void *data);
|
|
||||||
|
|
||||||
/* Tree walking */
|
|
||||||
|
|
||||||
extern void avl_foreach(const avl_tree_t *tree, avl_action_t action);
|
|
||||||
extern void avl_foreach_node(const avl_tree_t *tree, avl_action_t action);
|
|
||||||
|
|
||||||
/* Indexing */
|
|
||||||
|
|
||||||
#ifdef AVL_COUNT
|
|
||||||
extern unsigned int avl_count(const avl_tree_t *tree);
|
|
||||||
extern avl_node_t *avl_get_node(const avl_tree_t *tree, unsigned int index);
|
|
||||||
extern unsigned int avl_index(const avl_node_t *node);
|
|
||||||
#endif
|
|
||||||
#ifdef AVL_DEPTH
|
|
||||||
extern unsigned int avl_depth(const avl_tree_t *tree);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
310
src/bsd/device.c
310
src/bsd/device.c
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
device.c -- Interaction BSD tun/tap device
|
device.c -- Interaction BSD tun/tap device
|
||||||
Copyright (C) 2001-2005 Ivo Timmermans,
|
Copyright (C) 2001-2005 Ivo Timmermans,
|
||||||
2001-2016 Guus Sliepen <guus@tinc-vpn.org>
|
2001-2011 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
2009 Grzegorz Dymarek <gregd72002@googlemail.com>
|
2009 Grzegorz Dymarek <gregd72002@googlemail.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -19,46 +19,38 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../system.h"
|
#include "system.h"
|
||||||
|
|
||||||
#include "../conf.h"
|
#include "conf.h"
|
||||||
#include "../device.h"
|
#include "device.h"
|
||||||
#include "../logger.h"
|
#include "logger.h"
|
||||||
#include "../net.h"
|
#include "net.h"
|
||||||
#include "../route.h"
|
#include "route.h"
|
||||||
#include "../utils.h"
|
#include "utils.h"
|
||||||
#include "../xalloc.h"
|
#include "xalloc.h"
|
||||||
|
|
||||||
#ifdef ENABLE_TUNEMU
|
#ifdef HAVE_TUNEMU
|
||||||
#include "tunemu.h"
|
#include "bsd/tunemu.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_NET_IF_UTUN_H
|
#define DEFAULT_DEVICE "/dev/tun0"
|
||||||
#include <sys/sys_domain.h>
|
|
||||||
#include <sys/kern_control.h>
|
|
||||||
#include <net/if_utun.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define DEFAULT_TUN_DEVICE "/dev/tun0"
|
|
||||||
#define DEFAULT_TAP_DEVICE "/dev/tap0"
|
|
||||||
|
|
||||||
typedef enum device_type {
|
typedef enum device_type {
|
||||||
DEVICE_TYPE_TUN,
|
DEVICE_TYPE_TUN,
|
||||||
DEVICE_TYPE_TUNIFHEAD,
|
DEVICE_TYPE_TUNIFHEAD,
|
||||||
DEVICE_TYPE_TAP,
|
DEVICE_TYPE_TAP,
|
||||||
#ifdef ENABLE_TUNEMU
|
#ifdef HAVE_TUNEMU
|
||||||
DEVICE_TYPE_TUNEMU,
|
DEVICE_TYPE_TUNEMU,
|
||||||
#endif
|
#endif
|
||||||
DEVICE_TYPE_UTUN,
|
|
||||||
} device_type_t;
|
} device_type_t;
|
||||||
|
|
||||||
int device_fd = -1;
|
int device_fd = -1;
|
||||||
char *device = NULL;
|
char *device = NULL;
|
||||||
char *iface = NULL;
|
char *iface = NULL;
|
||||||
static const char *device_info = "OS X utun device";
|
static char *device_info = NULL;
|
||||||
static uint64_t device_total_in = 0;
|
static uint64_t device_total_in = 0;
|
||||||
static uint64_t device_total_out = 0;
|
static uint64_t device_total_out = 0;
|
||||||
#if defined(ENABLE_TUNEMU)
|
#if defined(TUNEMU)
|
||||||
static device_type_t device_type = DEVICE_TYPE_TUNEMU;
|
static device_type_t device_type = DEVICE_TYPE_TUNEMU;
|
||||||
#elif defined(HAVE_OPENBSD) || defined(HAVE_FREEBSD) || defined(HAVE_DRAGONFLY)
|
#elif defined(HAVE_OPENBSD) || defined(HAVE_FREEBSD) || defined(HAVE_DRAGONFLY)
|
||||||
static device_type_t device_type = DEVICE_TYPE_TUNIFHEAD;
|
static device_type_t device_type = DEVICE_TYPE_TUNIFHEAD;
|
||||||
|
@ -66,138 +58,45 @@ static device_type_t device_type = DEVICE_TYPE_TUNIFHEAD;
|
||||||
static device_type_t device_type = DEVICE_TYPE_TUN;
|
static device_type_t device_type = DEVICE_TYPE_TUN;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_NET_IF_UTUN_H
|
bool setup_device(void) {
|
||||||
static bool setup_utun(void) {
|
|
||||||
device_fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL);
|
|
||||||
|
|
||||||
if(device_fd == -1) {
|
|
||||||
logger(LOG_ERR, "Could not open PF_SYSTEM socket: %s\n", strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ctl_info info = {};
|
|
||||||
|
|
||||||
strlcpy(info.ctl_name, UTUN_CONTROL_NAME, sizeof(info.ctl_name));
|
|
||||||
|
|
||||||
if(ioctl(device_fd, CTLIOCGINFO, &info) == -1) {
|
|
||||||
logger(LOG_ERR, "ioctl(CTLIOCGINFO) failed: %s", strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int unit = -1;
|
|
||||||
char *p = strstr(device, "utun"), *e = NULL;
|
|
||||||
|
|
||||||
if(p) {
|
|
||||||
unit = strtol(p + 4, &e, 10);
|
|
||||||
|
|
||||||
if(!e) {
|
|
||||||
unit = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sockaddr_ctl sc = {
|
|
||||||
.sc_id = info.ctl_id,
|
|
||||||
.sc_len = sizeof(sc),
|
|
||||||
.sc_family = AF_SYSTEM,
|
|
||||||
.ss_sysaddr = AF_SYS_CONTROL,
|
|
||||||
.sc_unit = unit + 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
if(connect(device_fd, (struct sockaddr *)&sc, sizeof(sc)) == -1) {
|
|
||||||
logger(LOG_ERR, "Could not connect utun socket: %s\n", strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
char name[64] = "";
|
|
||||||
socklen_t len = sizeof(name);
|
|
||||||
|
|
||||||
if(getsockopt(device_fd, SYSPROTO_CONTROL, UTUN_OPT_IFNAME, name, &len)) {
|
|
||||||
iface = xstrdup(device);
|
|
||||||
} else {
|
|
||||||
iface = xstrdup(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger(LOG_INFO, "%s is a %s", device, device_info);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static bool setup_device(void) {
|
|
||||||
// Find out which device file to open
|
|
||||||
|
|
||||||
if(!get_config_string(lookup_config(config_tree, "Device"), &device)) {
|
|
||||||
if(routing_mode == RMODE_ROUTER) {
|
|
||||||
device = xstrdup(DEFAULT_TUN_DEVICE);
|
|
||||||
} else {
|
|
||||||
device = xstrdup(DEFAULT_TAP_DEVICE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find out if it's supposed to be a tun or a tap device
|
|
||||||
|
|
||||||
char *type;
|
char *type;
|
||||||
|
|
||||||
|
if(!get_config_string(lookup_config(config_tree, "Device"), &device))
|
||||||
|
device = xstrdup(DEFAULT_DEVICE);
|
||||||
|
|
||||||
|
if(!get_config_string(lookup_config(config_tree, "Interface"), &iface))
|
||||||
|
iface = xstrdup(strrchr(device, '/') ? strrchr(device, '/') + 1 : device);
|
||||||
|
|
||||||
if(get_config_string(lookup_config(config_tree, "DeviceType"), &type)) {
|
if(get_config_string(lookup_config(config_tree, "DeviceType"), &type)) {
|
||||||
if(!strcasecmp(type, "tun"))
|
if(!strcasecmp(type, "tun"))
|
||||||
/* use default */;
|
/* use default */;
|
||||||
|
#ifdef HAVE_TUNEMU
|
||||||
#ifdef ENABLE_TUNEMU
|
else if(!strcasecmp(type, "tunemu"))
|
||||||
else if(!strcasecmp(type, "tunemu")) {
|
|
||||||
device_type = DEVICE_TYPE_TUNEMU;
|
device_type = DEVICE_TYPE_TUNEMU;
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_NET_IF_UTUN_H
|
else if(!strcasecmp(type, "tunnohead"))
|
||||||
else if(!strcasecmp(type, "utun")) {
|
|
||||||
device_type = DEVICE_TYPE_UTUN;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
else if(!strcasecmp(type, "tunnohead")) {
|
|
||||||
device_type = DEVICE_TYPE_TUN;
|
device_type = DEVICE_TYPE_TUN;
|
||||||
} else if(!strcasecmp(type, "tunifhead")) {
|
else if(!strcasecmp(type, "tunifhead"))
|
||||||
device_type = DEVICE_TYPE_TUNIFHEAD;
|
device_type = DEVICE_TYPE_TUNIFHEAD;
|
||||||
} else if(!strcasecmp(type, "tap")) {
|
else if(!strcasecmp(type, "tap"))
|
||||||
device_type = DEVICE_TYPE_TAP;
|
device_type = DEVICE_TYPE_TAP;
|
||||||
} else {
|
else {
|
||||||
logger(LOG_ERR, "Unknown device type %s!", type);
|
logger(LOG_ERR, "Unknown device type %s!", type);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#ifdef HAVE_NET_IF_UTUN_H
|
if(strstr(device, "tap") || routing_mode != RMODE_ROUTER)
|
||||||
|
|
||||||
if(strncmp(device, "utun", 4) == 0 || strncmp(device, "/dev/utun", 9) == 0) {
|
|
||||||
device_type = DEVICE_TYPE_UTUN;
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
if(strstr(device, "tap") || routing_mode != RMODE_ROUTER) {
|
|
||||||
device_type = DEVICE_TYPE_TAP;
|
device_type = DEVICE_TYPE_TAP;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if(routing_mode == RMODE_SWITCH && device_type != DEVICE_TYPE_TAP) {
|
|
||||||
logger(LOG_ERR, "Only tap devices support switch mode!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open the device
|
|
||||||
|
|
||||||
switch(device_type) {
|
switch(device_type) {
|
||||||
#ifdef ENABLE_TUNEMU
|
#ifdef HAVE_TUNEMU
|
||||||
|
|
||||||
case DEVICE_TYPE_TUNEMU: {
|
case DEVICE_TYPE_TUNEMU: {
|
||||||
char dynamic_name[256] = "";
|
char dynamic_name[256] = "";
|
||||||
device_fd = tunemu_open(dynamic_name);
|
device_fd = tunemu_open(dynamic_name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_NET_IF_UTUN_H
|
|
||||||
|
|
||||||
case DEVICE_TYPE_UTUN:
|
|
||||||
return setup_utun();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
device_fd = open(device, O_RDWR | O_NONBLOCK);
|
device_fd = open(device, O_RDWR | O_NONBLOCK);
|
||||||
}
|
}
|
||||||
|
@ -207,136 +106,82 @@ static bool setup_device(void) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FD_CLOEXEC
|
|
||||||
fcntl(device_fd, F_SETFD, FD_CLOEXEC);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Guess what the corresponding interface is called
|
|
||||||
|
|
||||||
char *realname = NULL;
|
|
||||||
|
|
||||||
#if defined(HAVE_FDEVNAME)
|
|
||||||
realname = fdevname(device_fd);
|
|
||||||
#elif defined(HAVE_DEVNAME)
|
|
||||||
struct stat buf;
|
|
||||||
|
|
||||||
if(!fstat(device_fd, &buf)) {
|
|
||||||
realname = devname(buf.st_rdev, S_IFCHR);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(!realname) {
|
|
||||||
realname = device;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!get_config_string(lookup_config(config_tree, "Interface"), &iface)) {
|
|
||||||
iface = xstrdup(strrchr(realname, '/') ? strrchr(realname, '/') + 1 : realname);
|
|
||||||
} else if(strcmp(iface, strrchr(realname, '/') ? strrchr(realname, '/') + 1 : realname)) {
|
|
||||||
logger(LOG_WARNING, "Warning: Interface does not match Device. $INTERFACE might be set incorrectly.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure the device as best as we can
|
|
||||||
|
|
||||||
switch(device_type) {
|
switch(device_type) {
|
||||||
default:
|
default:
|
||||||
device_type = DEVICE_TYPE_TUN;
|
device_type = DEVICE_TYPE_TUN;
|
||||||
|
|
||||||
case DEVICE_TYPE_TUN:
|
case DEVICE_TYPE_TUN:
|
||||||
#ifdef TUNSIFHEAD
|
#ifdef TUNSIFHEAD
|
||||||
{
|
{
|
||||||
const int zero = 0;
|
const int zero = 0;
|
||||||
|
if(ioctl(device_fd, TUNSIFHEAD, &zero, sizeof zero) == -1) {
|
||||||
if(ioctl(device_fd, TUNSIFHEAD, &zero, sizeof(zero)) == -1) {
|
|
||||||
logger(LOG_ERR, "System call `%s' failed: %s", "ioctl", strerror(errno));
|
logger(LOG_ERR, "System call `%s' failed: %s", "ioctl", strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#if defined(TUNSIFMODE) && defined(IFF_BROADCAST) && defined(IFF_MULTICAST)
|
#if defined(TUNSIFMODE) && defined(IFF_BROADCAST) && defined(IFF_MULTICAST)
|
||||||
{
|
{
|
||||||
const int mode = IFF_BROADCAST | IFF_MULTICAST;
|
const int mode = IFF_BROADCAST | IFF_MULTICAST;
|
||||||
ioctl(device_fd, TUNSIFMODE, &mode, sizeof(mode));
|
ioctl(device_fd, TUNSIFMODE, &mode, sizeof mode);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
device_info = "Generic BSD tun device";
|
device_info = "Generic BSD tun device";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DEVICE_TYPE_TUNIFHEAD:
|
case DEVICE_TYPE_TUNIFHEAD:
|
||||||
#ifdef TUNSIFHEAD
|
#ifdef TUNSIFHEAD
|
||||||
{
|
{
|
||||||
const int one = 1;
|
const int one = 1;
|
||||||
|
if(ioctl(device_fd, TUNSIFHEAD, &one, sizeof one) == -1) {
|
||||||
if(ioctl(device_fd, TUNSIFHEAD, &one, sizeof(one)) == -1) {
|
|
||||||
logger(LOG_ERR, "System call `%s' failed: %s", "ioctl", strerror(errno));
|
logger(LOG_ERR, "System call `%s' failed: %s", "ioctl", strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#if defined(TUNSIFMODE) && defined(IFF_BROADCAST) && defined(IFF_MULTICAST)
|
#if defined(TUNSIFMODE) && defined(IFF_BROADCAST) && defined(IFF_MULTICAST)
|
||||||
{
|
{
|
||||||
const int mode = IFF_BROADCAST | IFF_MULTICAST;
|
const int mode = IFF_BROADCAST | IFF_MULTICAST;
|
||||||
ioctl(device_fd, TUNSIFMODE, &mode, sizeof(mode));
|
ioctl(device_fd, TUNSIFMODE, &mode, sizeof mode);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
device_info = "Generic BSD tun device";
|
device_info = "Generic BSD tun device";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DEVICE_TYPE_TAP:
|
case DEVICE_TYPE_TAP:
|
||||||
if(routing_mode == RMODE_ROUTER) {
|
if(routing_mode == RMODE_ROUTER)
|
||||||
overwrite_mac = true;
|
overwrite_mac = true;
|
||||||
}
|
|
||||||
|
|
||||||
device_info = "Generic BSD tap device";
|
device_info = "Generic BSD tap device";
|
||||||
#ifdef TAPGIFNAME
|
#ifdef TAPGIFNAME
|
||||||
{
|
{
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
|
|
||||||
if(ioctl(device_fd, TAPGIFNAME, (void*)&ifr) == 0) {
|
if(ioctl(device_fd, TAPGIFNAME, (void*)&ifr) == 0) {
|
||||||
if(iface) {
|
if(iface)
|
||||||
free(iface);
|
free(iface);
|
||||||
}
|
|
||||||
|
|
||||||
iface = xstrdup(ifr.ifr_name);
|
iface = xstrdup(ifr.ifr_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
#ifdef ENABLE_TUNEMU
|
#ifdef HAVE_TUNEMU
|
||||||
|
|
||||||
case DEVICE_TYPE_TUNEMU:
|
case DEVICE_TYPE_TUNEMU:
|
||||||
device_info = "BSD tunemu device";
|
device_info = "BSD tunemu device";
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SIOCGIFADDR
|
|
||||||
|
|
||||||
if(overwrite_mac) {
|
|
||||||
ioctl(device_fd, SIOCGIFADDR, mymac.x);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
logger(LOG_INFO, "%s is a %s", device, device_info);
|
logger(LOG_INFO, "%s is a %s", device, device_info);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void close_device(void) {
|
void close_device(void) {
|
||||||
switch(device_type) {
|
switch(device_type) {
|
||||||
#ifdef ENABLE_TUNEMU
|
#ifdef HAVE_TUNEMU
|
||||||
|
|
||||||
case DEVICE_TYPE_TUNEMU:
|
case DEVICE_TYPE_TUNEMU:
|
||||||
tunemu_close(device_fd);
|
tunemu_close(device_fd);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
close(device_fd);
|
close(device_fd);
|
||||||
}
|
}
|
||||||
|
@ -345,20 +190,20 @@ static void close_device(void) {
|
||||||
free(iface);
|
free(iface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool read_packet(vpn_packet_t *packet) {
|
bool read_packet(vpn_packet_t *packet) {
|
||||||
int lenin;
|
int inlen;
|
||||||
|
|
||||||
switch(device_type) {
|
switch(device_type) {
|
||||||
case DEVICE_TYPE_TUN:
|
case DEVICE_TYPE_TUN:
|
||||||
#ifdef ENABLE_TUNEMU
|
#ifdef HAVE_TUNEMU
|
||||||
case DEVICE_TYPE_TUNEMU:
|
case DEVICE_TYPE_TUNEMU:
|
||||||
if(device_type == DEVICE_TYPE_TUNEMU) {
|
if(device_type == DEVICE_TYPE_TUNEMU)
|
||||||
lenin = tunemu_read(device_fd, packet->data + 14, MTU - 14);
|
inlen = tunemu_read(device_fd, packet->data + 14, MTU - 14);
|
||||||
} else
|
else
|
||||||
#endif
|
#endif
|
||||||
lenin = read(device_fd, packet->data + 14, MTU - 14);
|
inlen = read(device_fd, packet->data + 14, MTU - 14);
|
||||||
|
|
||||||
if(lenin <= 0) {
|
if(inlen <= 0) {
|
||||||
logger(LOG_ERR, "Error while reading from %s %s: %s", device_info,
|
logger(LOG_ERR, "Error while reading from %s %s: %s", device_info,
|
||||||
device, strerror(errno));
|
device, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
|
@ -369,12 +214,10 @@ static bool read_packet(vpn_packet_t *packet) {
|
||||||
packet->data[12] = 0x08;
|
packet->data[12] = 0x08;
|
||||||
packet->data[13] = 0x00;
|
packet->data[13] = 0x00;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
packet->data[12] = 0x86;
|
packet->data[12] = 0x86;
|
||||||
packet->data[13] = 0xDD;
|
packet->data[13] = 0xDD;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ifdebug(TRAFFIC) logger(LOG_ERR,
|
ifdebug(TRAFFIC) logger(LOG_ERR,
|
||||||
"Unknown IP version %d while reading packet from %s %s",
|
"Unknown IP version %d while reading packet from %s %s",
|
||||||
|
@ -382,49 +225,49 @@ static bool read_packet(vpn_packet_t *packet) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(packet->data, 0, 12);
|
packet->len = inlen + 14;
|
||||||
packet->len = lenin + 14;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DEVICE_TYPE_UTUN:
|
|
||||||
case DEVICE_TYPE_TUNIFHEAD: {
|
case DEVICE_TYPE_TUNIFHEAD: {
|
||||||
if((lenin = read(device_fd, packet->data + 10, MTU - 10)) <= 0) {
|
u_int32_t type;
|
||||||
|
struct iovec vector[2] = {{&type, sizeof type}, {packet->data + 14, MTU - 14}};
|
||||||
|
|
||||||
|
if((inlen = readv(device_fd, vector, 2)) <= 0) {
|
||||||
logger(LOG_ERR, "Error while reading from %s %s: %s", device_info,
|
logger(LOG_ERR, "Error while reading from %s %s: %s", device_info,
|
||||||
device, strerror(errno));
|
device, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(packet->data[14] >> 4) {
|
switch (ntohl(type)) {
|
||||||
case 4:
|
case AF_INET:
|
||||||
packet->data[12] = 0x08;
|
packet->data[12] = 0x08;
|
||||||
packet->data[13] = 0x00;
|
packet->data[13] = 0x00;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case AF_INET6:
|
||||||
packet->data[12] = 0x86;
|
packet->data[12] = 0x86;
|
||||||
packet->data[13] = 0xDD;
|
packet->data[13] = 0xDD;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ifdebug(TRAFFIC) logger(LOG_ERR,
|
ifdebug(TRAFFIC) logger(LOG_ERR,
|
||||||
"Unknown IP version %d while reading packet from %s %s",
|
"Unknown address family %x while reading packet from %s %s",
|
||||||
packet->data[14] >> 4, device_info, device);
|
ntohl(type), device_info, device);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(packet->data, 0, 12);
|
packet->len = inlen + 10;
|
||||||
packet->len = lenin + 10;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case DEVICE_TYPE_TAP:
|
case DEVICE_TYPE_TAP:
|
||||||
if((lenin = read(device_fd, packet->data, MTU)) <= 0) {
|
if((inlen = read(device_fd, packet->data, MTU)) <= 0) {
|
||||||
logger(LOG_ERR, "Error while reading from %s %s: %s", device_info,
|
logger(LOG_ERR, "Error while reading from %s %s: %s", device_info,
|
||||||
device, strerror(errno));
|
device, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
packet->len = lenin;
|
packet->len = inlen;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -439,7 +282,7 @@ static bool read_packet(vpn_packet_t *packet) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool write_packet(vpn_packet_t *packet) {
|
bool write_packet(vpn_packet_t *packet) {
|
||||||
ifdebug(TRAFFIC) logger(LOG_DEBUG, "Writing packet of %d bytes to %s",
|
ifdebug(TRAFFIC) logger(LOG_DEBUG, "Writing packet of %d bytes to %s",
|
||||||
packet->len, device_info);
|
packet->len, device_info);
|
||||||
|
|
||||||
|
@ -450,23 +293,22 @@ static bool write_packet(vpn_packet_t *packet) {
|
||||||
device, strerror(errno));
|
device, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DEVICE_TYPE_UTUN:
|
|
||||||
case DEVICE_TYPE_TUNIFHEAD: {
|
case DEVICE_TYPE_TUNIFHEAD: {
|
||||||
int af = (packet->data[12] << 8) + packet->data[13];
|
u_int32_t type;
|
||||||
uint32_t type;
|
struct iovec vector[2] = {{&type, sizeof type}, {packet->data + 14, packet->len - 14}};
|
||||||
|
int af;
|
||||||
|
|
||||||
|
af = (packet->data[12] << 8) + packet->data[13];
|
||||||
|
|
||||||
switch (af) {
|
switch (af) {
|
||||||
case 0x0800:
|
case 0x0800:
|
||||||
type = htonl(AF_INET);
|
type = htonl(AF_INET);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x86DD:
|
case 0x86DD:
|
||||||
type = htonl(AF_INET6);
|
type = htonl(AF_INET6);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ifdebug(TRAFFIC) logger(LOG_ERR,
|
ifdebug(TRAFFIC) logger(LOG_ERR,
|
||||||
"Unknown address family %x while writing packet to %s %s",
|
"Unknown address family %x while writing packet to %s %s",
|
||||||
|
@ -474,14 +316,11 @@ static bool write_packet(vpn_packet_t *packet) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(packet->data + 10, &type, sizeof(type));
|
if(writev(device_fd, vector, 2) < 0) {
|
||||||
|
|
||||||
if(write(device_fd, packet->data + 10, packet->len - 10) < 0) {
|
|
||||||
logger(LOG_ERR, "Can't write to %s %s: %s", device_info, device,
|
logger(LOG_ERR, "Can't write to %s %s: %s", device_info, device,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -491,18 +330,15 @@ static bool write_packet(vpn_packet_t *packet) {
|
||||||
device, strerror(errno));
|
device, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef ENABLE_TUNEMU
|
#ifdef HAVE_TUNEMU
|
||||||
|
|
||||||
case DEVICE_TYPE_TUNEMU:
|
case DEVICE_TYPE_TUNEMU:
|
||||||
if(tunemu_write(device_fd, packet->data + 14, packet->len - 14) < 0) {
|
if(tunemu_write(device_fd, packet->data + 14, packet->len - 14) < 0) {
|
||||||
logger(LOG_ERR, "Error while writing to %s %s: %s", device_info,
|
logger(LOG_ERR, "Error while writing to %s %s: %s", device_info,
|
||||||
device, strerror(errno));
|
device, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -515,16 +351,8 @@ static bool write_packet(vpn_packet_t *packet) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_device_stats(void) {
|
void dump_device_stats(void) {
|
||||||
logger(LOG_DEBUG, "Statistics for %s %s:", device_info, device);
|
logger(LOG_DEBUG, "Statistics for %s %s:", device_info, device);
|
||||||
logger(LOG_DEBUG, " total bytes in: %10"PRIu64, device_total_in);
|
logger(LOG_DEBUG, " total bytes in: %10"PRIu64, device_total_in);
|
||||||
logger(LOG_DEBUG, " total bytes out: %10"PRIu64, device_total_out);
|
logger(LOG_DEBUG, " total bytes out: %10"PRIu64, device_total_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
const devops_t os_devops = {
|
|
||||||
.setup = setup_device,
|
|
||||||
.close = close_device,
|
|
||||||
.read = read_packet,
|
|
||||||
.write = write_packet,
|
|
||||||
.dump_stats = dump_device_stats,
|
|
||||||
};
|
|
||||||
|
|
175
src/bsd/tunemu.c
175
src/bsd/tunemu.c
|
@ -49,21 +49,24 @@
|
||||||
#define PPPIOCCONNECT _IOW('t', 58, int)
|
#define PPPIOCCONNECT _IOW('t', 58, int)
|
||||||
#define PPPIOCGUNIT _IOR('t', 86, int)
|
#define PPPIOCGUNIT _IOR('t', 86, int)
|
||||||
|
|
||||||
struct sockaddr_ppp {
|
struct sockaddr_ppp
|
||||||
|
{
|
||||||
u_int8_t ppp_len;
|
u_int8_t ppp_len;
|
||||||
u_int8_t ppp_family;
|
u_int8_t ppp_family;
|
||||||
u_int16_t ppp_proto;
|
u_int16_t ppp_proto;
|
||||||
u_int32_t ppp_cookie;
|
u_int32_t ppp_cookie;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum NPmode {
|
enum NPmode
|
||||||
|
{
|
||||||
NPMODE_PASS,
|
NPMODE_PASS,
|
||||||
NPMODE_DROP,
|
NPMODE_DROP,
|
||||||
NPMODE_ERROR,
|
NPMODE_ERROR,
|
||||||
NPMODE_QUEUE
|
NPMODE_QUEUE
|
||||||
};
|
};
|
||||||
|
|
||||||
struct npioctl {
|
struct npioctl
|
||||||
|
{
|
||||||
int protocol;
|
int protocol;
|
||||||
enum NPmode mode;
|
enum NPmode mode;
|
||||||
};
|
};
|
||||||
|
@ -80,55 +83,58 @@ static pcap_t *pcap = NULL;
|
||||||
static int data_buffer_length = 0;
|
static int data_buffer_length = 0;
|
||||||
static char *data_buffer = NULL;
|
static char *data_buffer = NULL;
|
||||||
|
|
||||||
static void tun_error(char *format, ...) {
|
static void tun_error(char *format, ...)
|
||||||
|
{
|
||||||
va_list vl;
|
va_list vl;
|
||||||
va_start(vl, format);
|
va_start(vl, format);
|
||||||
vsnprintf(tunemu_error, ERROR_BUFFER_SIZE, format, vl);
|
vsnprintf(tunemu_error, ERROR_BUFFER_SIZE, format, vl);
|
||||||
va_end(vl);
|
va_end(vl);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tun_noerror() {
|
static void tun_noerror()
|
||||||
|
{
|
||||||
*tunemu_error = 0;
|
*tunemu_error = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void closeall() {
|
static void closeall()
|
||||||
|
{
|
||||||
int fd = getdtablesize();
|
int fd = getdtablesize();
|
||||||
|
while (fd--)
|
||||||
while(fd--) {
|
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
|
||||||
|
|
||||||
open("/dev/null", O_RDWR, 0);
|
open("/dev/null", O_RDWR, 0);
|
||||||
dup(0);
|
dup(0);
|
||||||
dup(0);
|
dup(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ppp_load_kext() {
|
static int ppp_load_kext()
|
||||||
|
{
|
||||||
int pid = fork();
|
int pid = fork();
|
||||||
|
if (pid < 0)
|
||||||
if(pid < 0) {
|
{
|
||||||
tun_error("fork for ppp kext: %s", strerror(errno));
|
tun_error("fork for ppp kext: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pid == 0) {
|
if (pid == 0)
|
||||||
|
{
|
||||||
closeall();
|
closeall();
|
||||||
execle("/sbin/kextload", "kextload", PPP_KEXT_PATH, NULL, NULL);
|
execle("/sbin/kextload", "kextload", PPP_KEXT_PATH, NULL, NULL);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int status;
|
int status;
|
||||||
|
while (waitpid(pid, &status, 0) < 0)
|
||||||
while(waitpid(pid, &status, 0) < 0) {
|
{
|
||||||
if(errno == EINTR) {
|
if (errno == EINTR)
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
tun_error("waitpid for ppp kext: %s", strerror(errno));
|
tun_error("waitpid for ppp kext: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(WEXITSTATUS(status) != 0) {
|
if (WEXITSTATUS(status) != 0)
|
||||||
|
{
|
||||||
tun_error("could not load ppp kext \"%s\"", PPP_KEXT_PATH);
|
tun_error("could not load ppp kext \"%s\"", PPP_KEXT_PATH);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -137,18 +143,18 @@ static int ppp_load_kext() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ppp_new_instance() {
|
static int ppp_new_instance()
|
||||||
|
{
|
||||||
// create ppp socket
|
// create ppp socket
|
||||||
int ppp_sockfd = socket(PF_PPP, SOCK_RAW, PPPPROTO_CTL);
|
int ppp_sockfd = socket(PF_PPP, SOCK_RAW, PPPPROTO_CTL);
|
||||||
|
if (ppp_sockfd < 0)
|
||||||
if(ppp_sockfd < 0) {
|
{
|
||||||
if(ppp_load_kext() < 0) {
|
if (ppp_load_kext() < 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
ppp_sockfd = socket(PF_PPP, SOCK_RAW, PPPPROTO_CTL);
|
ppp_sockfd = socket(PF_PPP, SOCK_RAW, PPPPROTO_CTL);
|
||||||
|
if (ppp_sockfd < 0)
|
||||||
if(ppp_sockfd < 0) {
|
{
|
||||||
tun_error("creating ppp socket: %s", strerror(errno));
|
tun_error("creating ppp socket: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -160,8 +166,8 @@ static int ppp_new_instance() {
|
||||||
pppaddr.ppp_family = AF_PPP;
|
pppaddr.ppp_family = AF_PPP;
|
||||||
pppaddr.ppp_proto = PPPPROTO_CTL;
|
pppaddr.ppp_proto = PPPPROTO_CTL;
|
||||||
pppaddr.ppp_cookie = 0;
|
pppaddr.ppp_cookie = 0;
|
||||||
|
if (connect(ppp_sockfd, (struct sockaddr *)&pppaddr, sizeof(struct sockaddr_ppp)) < 0)
|
||||||
if(connect(ppp_sockfd, (struct sockaddr *)&pppaddr, sizeof(struct sockaddr_ppp)) < 0) {
|
{
|
||||||
tun_error("connecting ppp socket: %s", strerror(errno));
|
tun_error("connecting ppp socket: %s", strerror(errno));
|
||||||
close(ppp_sockfd);
|
close(ppp_sockfd);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -171,15 +177,15 @@ static int ppp_new_instance() {
|
||||||
return ppp_sockfd;
|
return ppp_sockfd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ppp_new_unit(int *unit_number) {
|
static int ppp_new_unit(int *unit_number)
|
||||||
|
{
|
||||||
int fd = ppp_new_instance();
|
int fd = ppp_new_instance();
|
||||||
|
if (fd < 0)
|
||||||
if(fd < 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
// create ppp unit
|
// create ppp unit
|
||||||
if(ioctl(fd, PPPIOCNEWUNIT, unit_number) < 0) {
|
if (ioctl(fd, PPPIOCNEWUNIT, unit_number) < 0)
|
||||||
|
{
|
||||||
tun_error("creating ppp unit: %s", strerror(errno));
|
tun_error("creating ppp unit: %s", strerror(errno));
|
||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -189,11 +195,12 @@ static int ppp_new_unit(int *unit_number) {
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ppp_setup_unit(int unit_fd) {
|
static int ppp_setup_unit(int unit_fd)
|
||||||
|
{
|
||||||
// send traffic to program
|
// send traffic to program
|
||||||
int flags = SC_LOOP_TRAFFIC;
|
int flags = SC_LOOP_TRAFFIC;
|
||||||
|
if (ioctl(unit_fd, PPPIOCSFLAGS, &flags) < 0)
|
||||||
if(ioctl(unit_fd, PPPIOCSFLAGS, &flags) < 0) {
|
{
|
||||||
tun_error("setting ppp loopback mode: %s", strerror(errno));
|
tun_error("setting ppp loopback mode: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -202,8 +209,8 @@ static int ppp_setup_unit(int unit_fd) {
|
||||||
struct npioctl npi;
|
struct npioctl npi;
|
||||||
npi.protocol = PPP_IP;
|
npi.protocol = PPP_IP;
|
||||||
npi.mode = NPMODE_PASS;
|
npi.mode = NPMODE_PASS;
|
||||||
|
if (ioctl(unit_fd, PPPIOCSNPMODE, &npi) < 0)
|
||||||
if(ioctl(unit_fd, PPPIOCSNPMODE, &npi) < 0) {
|
{
|
||||||
tun_error("starting ppp unit: %s", strerror(errno));
|
tun_error("starting ppp unit: %s", strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -212,8 +219,10 @@ static int ppp_setup_unit(int unit_fd) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int open_pcap() {
|
static int open_pcap()
|
||||||
if(pcap != NULL) {
|
{
|
||||||
|
if (pcap != NULL)
|
||||||
|
{
|
||||||
pcap_use_count++;
|
pcap_use_count++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -222,7 +231,8 @@ static int open_pcap() {
|
||||||
pcap = pcap_open_live("lo0", BUFSIZ, 0, 1, errbuf);
|
pcap = pcap_open_live("lo0", BUFSIZ, 0, 1, errbuf);
|
||||||
pcap_use_count = 1;
|
pcap_use_count = 1;
|
||||||
|
|
||||||
if(pcap == NULL) {
|
if (pcap == NULL)
|
||||||
|
{
|
||||||
tun_error("opening pcap: %s", errbuf);
|
tun_error("opening pcap: %s", errbuf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -231,57 +241,59 @@ static int open_pcap() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void close_pcap() {
|
static void close_pcap()
|
||||||
if(pcap == NULL) {
|
{
|
||||||
|
if (pcap == NULL)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
pcap_use_count--;
|
pcap_use_count--;
|
||||||
|
if (pcap_use_count == 0)
|
||||||
if(pcap_use_count == 0) {
|
{
|
||||||
pcap_close(pcap);
|
pcap_close(pcap);
|
||||||
pcap = NULL;
|
pcap = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void allocate_data_buffer(int size) {
|
static void allocate_data_buffer(int size)
|
||||||
if(data_buffer_length < size) {
|
{
|
||||||
|
if (data_buffer_length < size)
|
||||||
|
{
|
||||||
free(data_buffer);
|
free(data_buffer);
|
||||||
data_buffer_length = size;
|
data_buffer_length = size;
|
||||||
data_buffer = malloc(data_buffer_length);
|
data_buffer = malloc(data_buffer_length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void make_device_name(tunemu_device device, int unit_number) {
|
static void make_device_name(tunemu_device device, int unit_number)
|
||||||
|
{
|
||||||
snprintf(device, sizeof(tunemu_device), "ppp%d", unit_number);
|
snprintf(device, sizeof(tunemu_device), "ppp%d", unit_number);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int check_device_name(tunemu_device device) {
|
static int check_device_name(tunemu_device device)
|
||||||
if(strlen(device) < 4) {
|
{
|
||||||
|
if (strlen(device) < 4)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
int unit_number = atoi(device + 3);
|
int unit_number = atoi(device + 3);
|
||||||
|
if (unit_number < 0 || unit_number > 999)
|
||||||
if(unit_number < 0 || unit_number > 999) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
tunemu_device compare;
|
tunemu_device compare;
|
||||||
make_device_name(compare, unit_number);
|
make_device_name(compare, unit_number);
|
||||||
|
|
||||||
if(strcmp(device, compare) != 0) {
|
if (strcmp(device, compare) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tunemu_open(tunemu_device device) {
|
int tunemu_open(tunemu_device device)
|
||||||
|
{
|
||||||
int ppp_unit_number = -1;
|
int ppp_unit_number = -1;
|
||||||
|
if (device[0] != 0)
|
||||||
if(device[0] != 0) {
|
{
|
||||||
if(check_device_name(device) < 0) {
|
if (check_device_name(device) < 0)
|
||||||
|
{
|
||||||
tun_error("invalid device name \"%s\"", device);
|
tun_error("invalid device name \"%s\"", device);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -290,17 +302,17 @@ int tunemu_open(tunemu_device device) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int ppp_unit_fd = ppp_new_unit(&ppp_unit_number);
|
int ppp_unit_fd = ppp_new_unit(&ppp_unit_number);
|
||||||
|
if (ppp_unit_fd < 0)
|
||||||
if(ppp_unit_fd < 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
if(ppp_setup_unit(ppp_unit_fd) < 0) {
|
if (ppp_setup_unit(ppp_unit_fd) < 0)
|
||||||
|
{
|
||||||
close(ppp_unit_fd);
|
close(ppp_unit_fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(open_pcap() < 0) {
|
if (open_pcap() < 0)
|
||||||
|
{
|
||||||
close(ppp_unit_fd);
|
close(ppp_unit_fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -310,40 +322,39 @@ int tunemu_open(tunemu_device device) {
|
||||||
return ppp_unit_fd;
|
return ppp_unit_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tunemu_close(int ppp_sockfd) {
|
int tunemu_close(int ppp_sockfd)
|
||||||
|
{
|
||||||
int ret = close(ppp_sockfd);
|
int ret = close(ppp_sockfd);
|
||||||
|
|
||||||
if(ret == 0) {
|
if (ret == 0)
|
||||||
close_pcap();
|
close_pcap();
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tunemu_read(int ppp_sockfd, char *buffer, int length) {
|
int tunemu_read(int ppp_sockfd, char *buffer, int length)
|
||||||
|
{
|
||||||
allocate_data_buffer(length + 2);
|
allocate_data_buffer(length + 2);
|
||||||
|
|
||||||
length = read(ppp_sockfd, data_buffer, length + 2);
|
length = read(ppp_sockfd, data_buffer, length + 2);
|
||||||
|
if (length < 0)
|
||||||
if(length < 0) {
|
{
|
||||||
tun_error("reading packet: %s", strerror(errno));
|
tun_error("reading packet: %s", strerror(errno));
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
tun_noerror();
|
tun_noerror();
|
||||||
|
|
||||||
length -= 2;
|
length -= 2;
|
||||||
|
if (length < 0)
|
||||||
if(length < 0) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(buffer, data_buffer + 2, length);
|
memcpy(buffer, data_buffer + 2, length);
|
||||||
|
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tunemu_write(int ppp_sockfd, char *buffer, int length) {
|
int tunemu_write(int ppp_sockfd, char *buffer, int length)
|
||||||
|
{
|
||||||
allocate_data_buffer(length + 4);
|
allocate_data_buffer(length + 4);
|
||||||
|
|
||||||
data_buffer[0] = 0x02;
|
data_buffer[0] = 0x02;
|
||||||
|
@ -353,25 +364,23 @@ int tunemu_write(int ppp_sockfd, char *buffer, int length) {
|
||||||
|
|
||||||
memcpy(data_buffer + 4, buffer, length);
|
memcpy(data_buffer + 4, buffer, length);
|
||||||
|
|
||||||
if(pcap == NULL) {
|
if (pcap == NULL)
|
||||||
|
{
|
||||||
tun_error("pcap not open");
|
tun_error("pcap not open");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
length = pcap_inject(pcap, data_buffer, length + 4);
|
length = pcap_inject(pcap, data_buffer, length + 4);
|
||||||
|
if (length < 0)
|
||||||
if(length < 0) {
|
{
|
||||||
tun_error("injecting packet: %s", pcap_geterr(pcap));
|
tun_error("injecting packet: %s", pcap_geterr(pcap));
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
tun_noerror();
|
tun_noerror();
|
||||||
|
|
||||||
length -= 4;
|
length -= 4;
|
||||||
|
if (length < 0)
|
||||||
if(length < 0) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
108
src/buffer.c
Normal file
108
src/buffer.c
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
/*
|
||||||
|
buffer.c -- buffer management
|
||||||
|
Copyright (C) 2011 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
|
|
||||||
|
#include "buffer.h"
|
||||||
|
#include "xalloc.h"
|
||||||
|
|
||||||
|
void buffer_compact(buffer_t *buffer, int maxsize) {
|
||||||
|
if(buffer->len >= maxsize || buffer->offset / 7 > buffer->len / 8) {
|
||||||
|
memmove(buffer->data, buffer->data + buffer->offset, buffer->len - buffer->offset);
|
||||||
|
buffer->len -= buffer->offset;
|
||||||
|
buffer->offset = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure we can add size bytes to the buffer, and return a pointer to the start of those bytes.
|
||||||
|
|
||||||
|
char *buffer_prepare(buffer_t *buffer, int size) {
|
||||||
|
if(!buffer->data) {
|
||||||
|
buffer->maxlen = size;
|
||||||
|
buffer->data = xmalloc(size);
|
||||||
|
} else {
|
||||||
|
if(buffer->offset && buffer->len + size > buffer->maxlen) {
|
||||||
|
memmove(buffer->data, buffer->data + buffer->offset, buffer->len - buffer->offset);
|
||||||
|
buffer->len -= buffer->offset;
|
||||||
|
buffer->offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(buffer->len + size > buffer->maxlen) {
|
||||||
|
buffer->maxlen = buffer->len + size;
|
||||||
|
buffer->data = xrealloc(buffer->data, buffer->maxlen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char *start = buffer->data + buffer->len;
|
||||||
|
|
||||||
|
buffer->len += size;
|
||||||
|
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy data into the buffer.
|
||||||
|
|
||||||
|
void buffer_add(buffer_t *buffer, const char *data, int size) {
|
||||||
|
memcpy(buffer_prepare(buffer, size), data, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove given number of bytes from the buffer, return a pointer to the start of them.
|
||||||
|
|
||||||
|
static char *buffer_consume(buffer_t *buffer, int size) {
|
||||||
|
char *start = buffer->data + buffer->offset;
|
||||||
|
|
||||||
|
buffer->offset += size;
|
||||||
|
|
||||||
|
if(buffer->offset >= buffer->len) {
|
||||||
|
buffer->offset = 0;
|
||||||
|
buffer->len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if there is a complete line in the buffer, and if so, return it NULL-terminated.
|
||||||
|
|
||||||
|
char *buffer_readline(buffer_t *buffer) {
|
||||||
|
char *newline = memchr(buffer->data + buffer->offset, '\n', buffer->len - buffer->offset);
|
||||||
|
|
||||||
|
if(!newline)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
int len = newline + 1 - (buffer->data + buffer->offset);
|
||||||
|
*newline = 0;
|
||||||
|
return buffer_consume(buffer, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we have enough bytes in the buffer, and if so, return a pointer to the start of them.
|
||||||
|
|
||||||
|
char *buffer_read(buffer_t *buffer, int size) {
|
||||||
|
if(buffer->len - buffer->offset < size)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return buffer_consume(buffer, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void buffer_clear(buffer_t *buffer) {
|
||||||
|
free(buffer->data);
|
||||||
|
buffer->data = NULL;
|
||||||
|
buffer->maxlen = 0;
|
||||||
|
buffer->len = 0;
|
||||||
|
buffer->offset = 0;
|
||||||
|
}
|
18
src/buffer.h
Normal file
18
src/buffer.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef __TINC_BUFFER_H__
|
||||||
|
#define __TINC_BUFFER_H__
|
||||||
|
|
||||||
|
typedef struct buffer_t {
|
||||||
|
char *data;
|
||||||
|
int maxlen;
|
||||||
|
int len;
|
||||||
|
int offset;
|
||||||
|
} buffer_t;
|
||||||
|
|
||||||
|
extern void buffer_compact(buffer_t *buffer, int maxsize);
|
||||||
|
extern char *buffer_prepare(buffer_t *buffer, int size);
|
||||||
|
extern void buffer_add(buffer_t *buffer, const char *data, int size);
|
||||||
|
extern char *buffer_readline(buffer_t *buffer);
|
||||||
|
extern char *buffer_read(buffer_t *buffer, int size);
|
||||||
|
extern void buffer_clear(buffer_t *buffer);
|
||||||
|
|
||||||
|
#endif
|
364
src/conf.c
364
src/conf.c
|
@ -2,7 +2,7 @@
|
||||||
conf.c -- configuration code
|
conf.c -- configuration code
|
||||||
Copyright (C) 1998 Robert van der Meulen
|
Copyright (C) 1998 Robert van der Meulen
|
||||||
1998-2005 Ivo Timmermans
|
1998-2005 Ivo Timmermans
|
||||||
2000-2014 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2010 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
2010-2011 Julien Muchembled <jm@jmuchemb.eu>
|
2010-2011 Julien Muchembled <jm@jmuchemb.eu>
|
||||||
2000 Cris van Pelt
|
2000 Cris van Pelt
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
|
||||||
#include "avl_tree.h"
|
#include "splay_tree.h"
|
||||||
#include "connection.h"
|
#include "connection.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
#include "utils.h" /* for cp */
|
#include "utils.h" /* for cp */
|
||||||
#include "xalloc.h"
|
#include "xalloc.h"
|
||||||
|
|
||||||
avl_tree_t *config_tree;
|
splay_tree_t *config_tree;
|
||||||
|
|
||||||
int pinginterval = 0; /* seconds between pings */
|
int pinginterval = 0; /* seconds between pings */
|
||||||
int pingtimeout = 0; /* seconds to wait for response */
|
int pingtimeout = 0; /* seconds to wait for response */
|
||||||
|
@ -47,32 +47,28 @@ static int config_compare(const config_t *a, const config_t *b) {
|
||||||
|
|
||||||
result = strcasecmp(a->variable, b->variable);
|
result = strcasecmp(a->variable, b->variable);
|
||||||
|
|
||||||
if(result) {
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
|
||||||
|
|
||||||
/* give priority to command line options */
|
/* give priority to command line options */
|
||||||
result = !b->file - !a->file;
|
result = !b->file - !a->file;
|
||||||
|
if (result)
|
||||||
if(result) {
|
|
||||||
return result;
|
return result;
|
||||||
}
|
|
||||||
|
|
||||||
result = a->line - b->line;
|
result = a->line - b->line;
|
||||||
|
|
||||||
if(result) {
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
} else {
|
else
|
||||||
return a->file ? strcmp(a->file, b->file) : 0;
|
return a->file ? strcmp(a->file, b->file) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void init_configuration(splay_tree_t ** config_tree) {
|
||||||
|
*config_tree = splay_alloc_tree((splay_compare_t) config_compare, (splay_action_t) free_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_configuration(avl_tree_t **config_tree) {
|
void exit_configuration(splay_tree_t ** config_tree) {
|
||||||
*config_tree = avl_alloc_tree((avl_compare_t) config_compare, (avl_action_t) free_config);
|
splay_delete_tree(*config_tree);
|
||||||
}
|
|
||||||
|
|
||||||
void exit_configuration(avl_tree_t **config_tree) {
|
|
||||||
avl_delete_tree(*config_tree);
|
|
||||||
*config_tree = NULL;
|
*config_tree = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,59 +77,61 @@ config_t *new_config(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_config(config_t *cfg) {
|
void free_config(config_t *cfg) {
|
||||||
|
if(cfg->variable)
|
||||||
free(cfg->variable);
|
free(cfg->variable);
|
||||||
|
|
||||||
|
if(cfg->value)
|
||||||
free(cfg->value);
|
free(cfg->value);
|
||||||
|
|
||||||
|
if(cfg->file)
|
||||||
free(cfg->file);
|
free(cfg->file);
|
||||||
|
|
||||||
free(cfg);
|
free(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void config_add(avl_tree_t *config_tree, config_t *cfg) {
|
void config_add(splay_tree_t *config_tree, config_t *cfg) {
|
||||||
avl_insert(config_tree, cfg);
|
splay_insert(config_tree, cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
config_t *lookup_config(const avl_tree_t *config_tree, char *variable) {
|
config_t *lookup_config(splay_tree_t *config_tree, char *variable) {
|
||||||
config_t cfg, *found;
|
config_t cfg, *found;
|
||||||
|
|
||||||
cfg.variable = variable;
|
cfg.variable = variable;
|
||||||
cfg.file = NULL;
|
cfg.file = NULL;
|
||||||
cfg.line = 0;
|
cfg.line = 0;
|
||||||
|
|
||||||
found = avl_search_closest_greater(config_tree, &cfg);
|
found = splay_search_closest_greater(config_tree, &cfg);
|
||||||
|
|
||||||
if(!found) {
|
if(!found)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
if(strcasecmp(found->variable, variable)) {
|
if(strcasecmp(found->variable, variable))
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
config_t *lookup_config_next(const avl_tree_t *config_tree, const config_t *cfg) {
|
config_t *lookup_config_next(splay_tree_t *config_tree, const config_t *cfg) {
|
||||||
avl_node_t *node;
|
splay_node_t *node;
|
||||||
config_t *found;
|
config_t *found;
|
||||||
|
|
||||||
node = avl_search_node(config_tree, cfg);
|
node = splay_search_node(config_tree, cfg);
|
||||||
|
|
||||||
if(node) {
|
if(node) {
|
||||||
if(node->next) {
|
if(node->next) {
|
||||||
found = node->next->data;
|
found = node->next->data;
|
||||||
|
|
||||||
if(!strcasecmp(found->variable, cfg->variable)) {
|
if(!strcasecmp(found->variable, cfg->variable))
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get_config_bool(const config_t *cfg, bool *result) {
|
bool get_config_bool(const config_t *cfg, bool *result) {
|
||||||
if(!cfg) {
|
if(!cfg)
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
if(!strcasecmp(cfg->value, "yes")) {
|
if(!strcasecmp(cfg->value, "yes")) {
|
||||||
*result = true;
|
*result = true;
|
||||||
|
@ -150,13 +148,11 @@ bool get_config_bool(const config_t *cfg, bool *result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get_config_int(const config_t *cfg, int *result) {
|
bool get_config_int(const config_t *cfg, int *result) {
|
||||||
if(!cfg) {
|
if(!cfg)
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
if(sscanf(cfg->value, "%d", result) == 1) {
|
if(sscanf(cfg->value, "%d", result) == 1)
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
logger(LOG_ERR, "Integer expected for configuration variable %s in %s line %d",
|
logger(LOG_ERR, "Integer expected for configuration variable %s in %s line %d",
|
||||||
cfg->variable, cfg->file, cfg->line);
|
cfg->variable, cfg->file, cfg->line);
|
||||||
|
@ -165,9 +161,8 @@ bool get_config_int(const config_t *cfg, int *result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get_config_string(const config_t *cfg, char **result) {
|
bool get_config_string(const config_t *cfg, char **result) {
|
||||||
if(!cfg) {
|
if(!cfg)
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
*result = xstrdup(cfg->value);
|
*result = xstrdup(cfg->value);
|
||||||
|
|
||||||
|
@ -177,9 +172,8 @@ bool get_config_string(const config_t *cfg, char **result) {
|
||||||
bool get_config_address(const config_t *cfg, struct addrinfo **result) {
|
bool get_config_address(const config_t *cfg, struct addrinfo **result) {
|
||||||
struct addrinfo *ai;
|
struct addrinfo *ai;
|
||||||
|
|
||||||
if(!cfg) {
|
if(!cfg)
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
ai = str2addrinfo(cfg->value, NULL, 0);
|
ai = str2addrinfo(cfg->value, NULL, 0);
|
||||||
|
|
||||||
|
@ -195,11 +189,10 @@ bool get_config_address(const config_t *cfg, struct addrinfo **result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get_config_subnet(const config_t *cfg, subnet_t ** result) {
|
bool get_config_subnet(const config_t *cfg, subnet_t ** result) {
|
||||||
subnet_t subnet = {0};
|
subnet_t subnet = {NULL};
|
||||||
|
|
||||||
if(!cfg) {
|
if(!cfg)
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
if(!str2net(&subnet, cfg->value)) {
|
if(!str2net(&subnet, cfg->value)) {
|
||||||
logger(LOG_ERR, "Subnet expected for configuration variable %s in %s line %d",
|
logger(LOG_ERR, "Subnet expected for configuration variable %s in %s line %d",
|
||||||
|
@ -210,9 +203,9 @@ bool get_config_subnet(const config_t *cfg, subnet_t **result) {
|
||||||
/* Teach newbies what subnets are... */
|
/* Teach newbies what subnets are... */
|
||||||
|
|
||||||
if(((subnet.type == SUBNET_IPV4)
|
if(((subnet.type == SUBNET_IPV4)
|
||||||
&& !maskcheck(&subnet.net.ipv4.address, subnet.net.ipv4.prefixlength, sizeof(ipv4_t)))
|
&& !maskcheck(&subnet.net.ipv4.address, subnet.net.ipv4.prefixlength, sizeof subnet.net.ipv4.address))
|
||||||
|| ((subnet.type == SUBNET_IPV6)
|
|| ((subnet.type == SUBNET_IPV6)
|
||||||
&& !maskcheck(&subnet.net.ipv6.address, subnet.net.ipv6.prefixlength, sizeof(ipv6_t)))) {
|
&& !maskcheck(&subnet.net.ipv6.address, subnet.net.ipv6.prefixlength, sizeof subnet.net.ipv6.address))) {
|
||||||
logger(LOG_ERR, "Network address and prefix length do not match for configuration variable %s in %s line %d",
|
logger(LOG_ERR, "Network address and prefix length do not match for configuration variable %s in %s line %d",
|
||||||
cfg->variable, cfg->file, cfg->line);
|
cfg->variable, cfg->file, cfg->line);
|
||||||
return false;
|
return false;
|
||||||
|
@ -230,27 +223,22 @@ static char *readline(FILE *fp, char *buf, size_t buflen) {
|
||||||
char *newline = NULL;
|
char *newline = NULL;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
if(feof(fp)) {
|
if(feof(fp))
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
p = fgets(buf, buflen, fp);
|
p = fgets(buf, buflen, fp);
|
||||||
|
|
||||||
if(!p) {
|
if(!p)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
newline = strchr(p, '\n');
|
newline = strchr(p, '\n');
|
||||||
|
|
||||||
if(!newline) {
|
if(!newline)
|
||||||
return buf;
|
return buf;
|
||||||
}
|
|
||||||
|
|
||||||
*newline = '\0'; /* kill newline */
|
*newline = '\0'; /* kill newline */
|
||||||
|
if(newline > p && newline[-1] == '\r') /* and carriage return if necessary */
|
||||||
if(newline > p && newline[-1] == '\r') { /* and carriage return if necessary */
|
|
||||||
newline[-1] = '\0';
|
newline[-1] = '\0';
|
||||||
}
|
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
@ -262,32 +250,26 @@ config_t *parse_config_line(char *line, const char *fname, int lineno) {
|
||||||
variable = value = line;
|
variable = value = line;
|
||||||
|
|
||||||
eol = line + strlen(line);
|
eol = line + strlen(line);
|
||||||
|
while(strchr("\t ", *--eol))
|
||||||
while(strchr("\t ", *--eol)) {
|
|
||||||
*eol = '\0';
|
*eol = '\0';
|
||||||
}
|
|
||||||
|
|
||||||
len = strcspn(value, "\t =");
|
len = strcspn(value, "\t =");
|
||||||
value += len;
|
value += len;
|
||||||
value += strspn(value, "\t ");
|
value += strspn(value, "\t ");
|
||||||
|
|
||||||
if(*value == '=') {
|
if(*value == '=') {
|
||||||
value++;
|
value++;
|
||||||
value += strspn(value, "\t ");
|
value += strspn(value, "\t ");
|
||||||
}
|
}
|
||||||
|
|
||||||
variable[len] = '\0';
|
variable[len] = '\0';
|
||||||
|
|
||||||
if(!*value) {
|
if(!*value) {
|
||||||
const char err[] = "No value for variable";
|
const char err[] = "No value for variable";
|
||||||
|
|
||||||
if (fname)
|
if (fname)
|
||||||
logger(LOG_ERR, "%s `%s' on line %d while reading config file %s",
|
logger(LOG_ERR, "%s `%s' on line %d while reading config file %s",
|
||||||
err, variable, lineno, fname);
|
err, variable, lineno, fname);
|
||||||
else
|
else
|
||||||
logger(LOG_ERR, "%s `%s' in command line option %d",
|
logger(LOG_ERR, "%s `%s' in command line option %d",
|
||||||
err, variable, lineno);
|
err, variable, lineno);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -304,7 +286,7 @@ config_t *parse_config_line(char *line, const char *fname, int lineno) {
|
||||||
Parse a configuration file and put the results in the configuration tree
|
Parse a configuration file and put the results in the configuration tree
|
||||||
starting at *base.
|
starting at *base.
|
||||||
*/
|
*/
|
||||||
bool read_config_file(avl_tree_t *config_tree, const char *fname) {
|
bool read_config_file(splay_tree_t *config_tree, const char *fname) {
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
char buffer[MAX_STRING_SIZE];
|
char buffer[MAX_STRING_SIZE];
|
||||||
char *line;
|
char *line;
|
||||||
|
@ -321,27 +303,22 @@ bool read_config_file(avl_tree_t *config_tree, const char *fname) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
line = readline(fp, buffer, sizeof(buffer));
|
line = readline(fp, buffer, sizeof buffer);
|
||||||
|
|
||||||
if(!line) {
|
if(!line) {
|
||||||
if(feof(fp)) {
|
if(feof(fp))
|
||||||
result = true;
|
result = true;
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
lineno++;
|
lineno++;
|
||||||
|
|
||||||
if(!*line || *line == '#') {
|
if(!*line || *line == '#')
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
if(ignore) {
|
if(ignore) {
|
||||||
if(!strncmp(line, "-----END", 8)) {
|
if(!strncmp(line, "-----END", 8))
|
||||||
ignore = false;
|
ignore = false;
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,11 +328,8 @@ bool read_config_file(avl_tree_t *config_tree, const char *fname) {
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg = parse_config_line(line, fname, lineno);
|
cfg = parse_config_line(line, fname, lineno);
|
||||||
|
if (!cfg)
|
||||||
if(!cfg) {
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
config_add(config_tree, cfg);
|
config_add(config_tree, cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -364,234 +338,122 @@ bool read_config_file(avl_tree_t *config_tree, const char *fname) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void read_config_options(avl_tree_t *config_tree, const char *prefix) {
|
void read_config_options(splay_tree_t *config_tree, const char *prefix) {
|
||||||
|
list_node_t *node, *next;
|
||||||
size_t prefix_len = prefix ? strlen(prefix) : 0;
|
size_t prefix_len = prefix ? strlen(prefix) : 0;
|
||||||
|
|
||||||
for(const list_node_t *node = cmdline_conf->tail; node; node = node->prev) {
|
for(node = cmdline_conf->tail; node; node = next) {
|
||||||
const config_t *cfg = node->data;
|
config_t *orig_cfg, *cfg = (config_t *)node->data;
|
||||||
|
next = node->prev;
|
||||||
|
|
||||||
if(!prefix) {
|
if(!prefix) {
|
||||||
if(strchr(cfg->variable, '.')) {
|
if(strchr(cfg->variable, '.'))
|
||||||
continue;
|
continue;
|
||||||
}
|
node->data = NULL;
|
||||||
|
list_unlink_node(cmdline_conf, node);
|
||||||
} else {
|
} else {
|
||||||
if(strncmp(prefix, cfg->variable, prefix_len) ||
|
if(strncmp(prefix, cfg->variable, prefix_len) ||
|
||||||
cfg->variable[prefix_len] != '.') {
|
cfg->variable[prefix_len] != '.')
|
||||||
continue;
|
continue;
|
||||||
|
/* Because host configuration is parsed again when
|
||||||
|
reconnecting, nodes must not be freed when a prefix
|
||||||
|
is given. */
|
||||||
|
orig_cfg = cfg;
|
||||||
|
cfg = new_config();
|
||||||
|
cfg->variable = xstrdup(orig_cfg->variable + prefix_len + 1);
|
||||||
|
cfg->value = xstrdup(orig_cfg->value);
|
||||||
|
cfg->file = NULL;
|
||||||
|
cfg->line = orig_cfg->line;
|
||||||
}
|
}
|
||||||
}
|
config_add(config_tree, cfg);
|
||||||
|
|
||||||
config_t *new = new_config();
|
|
||||||
|
|
||||||
if(prefix) {
|
|
||||||
new->variable = xstrdup(cfg->variable + prefix_len + 1);
|
|
||||||
} else {
|
|
||||||
new->variable = xstrdup(cfg->variable);
|
|
||||||
}
|
|
||||||
|
|
||||||
new->value = xstrdup(cfg->value);
|
|
||||||
new->file = NULL;
|
|
||||||
new->line = cfg->line;
|
|
||||||
|
|
||||||
config_add(config_tree, new);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool read_server_config(void) {
|
bool read_server_config(void) {
|
||||||
char fname[PATH_MAX];
|
char *fname;
|
||||||
bool x;
|
bool x;
|
||||||
|
|
||||||
read_config_options(config_tree, NULL);
|
read_config_options(config_tree, NULL);
|
||||||
|
|
||||||
snprintf(fname, sizeof(fname), "%s/tinc.conf", confbase);
|
xasprintf(&fname, "%s/tinc.conf", confbase);
|
||||||
errno = 0;
|
|
||||||
x = read_config_file(config_tree, fname);
|
x = read_config_file(config_tree, fname);
|
||||||
|
|
||||||
// We will try to read the conf files in the "conf.d" dir
|
if(!x) { /* System error: complain */
|
||||||
if(x) {
|
|
||||||
char dname[PATH_MAX];
|
|
||||||
snprintf(dname, sizeof(dname), "%s/conf.d", confbase);
|
|
||||||
DIR *dir = opendir(dname);
|
|
||||||
|
|
||||||
// If we can find this dir
|
|
||||||
if(dir) {
|
|
||||||
struct dirent *ep;
|
|
||||||
|
|
||||||
// We list all the files in it
|
|
||||||
while(x && (ep = readdir(dir))) {
|
|
||||||
size_t l = strlen(ep->d_name);
|
|
||||||
|
|
||||||
// And we try to read the ones that end with ".conf"
|
|
||||||
if(l > 5 && !strcmp(".conf", & ep->d_name[ l - 5 ])) {
|
|
||||||
if((size_t)snprintf(fname, sizeof(fname), "%s/%s", dname, ep->d_name) >= sizeof(fname)) {
|
|
||||||
logger(LOG_ERR, "Pathname too long: %s/%s", dname, ep->d_name);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
x = read_config_file(config_tree, fname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
closedir(dir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!x && errno) {
|
|
||||||
logger(LOG_ERR, "Failed to read `%s': %s", fname, strerror(errno));
|
logger(LOG_ERR, "Failed to read `%s': %s", fname, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(fname);
|
||||||
|
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool read_connection_config(connection_t *c) {
|
bool read_connection_config(connection_t *c) {
|
||||||
char fname[PATH_MAX];
|
char *fname;
|
||||||
bool x;
|
bool x;
|
||||||
|
|
||||||
read_config_options(c->config_tree, c->name);
|
read_config_options(c->config_tree, c->name);
|
||||||
|
|
||||||
snprintf(fname, sizeof(fname), "%s/hosts/%s", confbase, c->name);
|
xasprintf(&fname, "%s/hosts/%s", confbase, c->name);
|
||||||
x = read_config_file(c->config_tree, fname);
|
x = read_config_file(c->config_tree, fname);
|
||||||
|
free(fname);
|
||||||
|
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void disable_old_keys(const char *filename) {
|
bool append_config_file(const char *name, const char *key, const char *value) {
|
||||||
char tmpfile[PATH_MAX] = "";
|
char *fname;
|
||||||
char buf[1024];
|
xasprintf(&fname, "%s/hosts/%s", confbase, name);
|
||||||
bool disabled = false;
|
|
||||||
FILE *r, *w;
|
|
||||||
|
|
||||||
r = fopen(filename, "r");
|
FILE *fp = fopen(fname, "a");
|
||||||
|
|
||||||
if(!r) {
|
if(!fp) {
|
||||||
return;
|
logger(LOG_ERR, "Cannot open config file %s: %s", fname, strerror(errno));
|
||||||
|
} else {
|
||||||
|
fprintf(fp, "\n# The following line was automatically added by tinc\n%s = %s\n", key, value);
|
||||||
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(tmpfile, sizeof(tmpfile), "%s.tmp", filename);
|
free(fname);
|
||||||
|
|
||||||
w = fopen(tmpfile, "w");
|
return fp;
|
||||||
|
}
|
||||||
|
|
||||||
while(fgets(buf, sizeof(buf), r)) {
|
bool disable_old_keys(FILE *f) {
|
||||||
|
char buf[100];
|
||||||
|
long pos;
|
||||||
|
bool disabled = false;
|
||||||
|
|
||||||
|
rewind(f);
|
||||||
|
pos = ftell(f);
|
||||||
|
|
||||||
|
if(pos < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
while(fgets(buf, sizeof buf, f)) {
|
||||||
if(!strncmp(buf, "-----BEGIN RSA", 14)) {
|
if(!strncmp(buf, "-----BEGIN RSA", 14)) {
|
||||||
buf[11] = 'O';
|
buf[11] = 'O';
|
||||||
buf[12] = 'L';
|
buf[12] = 'L';
|
||||||
buf[13] = 'D';
|
buf[13] = 'D';
|
||||||
|
if(fseek(f, pos, SEEK_SET))
|
||||||
|
break;
|
||||||
|
if(fputs(buf, f) <= 0)
|
||||||
|
break;
|
||||||
disabled = true;
|
disabled = true;
|
||||||
} else if(!strncmp(buf, "-----END RSA", 12)) {
|
}
|
||||||
|
else if(!strncmp(buf, "-----END RSA", 12)) {
|
||||||
buf[ 9] = 'O';
|
buf[ 9] = 'O';
|
||||||
buf[10] = 'L';
|
buf[10] = 'L';
|
||||||
buf[11] = 'D';
|
buf[11] = 'D';
|
||||||
|
if(fseek(f, pos, SEEK_SET))
|
||||||
|
break;
|
||||||
|
if(fputs(buf, f) <= 0)
|
||||||
|
break;
|
||||||
disabled = true;
|
disabled = true;
|
||||||
}
|
}
|
||||||
|
pos = ftell(f);
|
||||||
if(w && fputs(buf, w) < 0) {
|
if(pos < 0)
|
||||||
disabled = false;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return disabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(w) {
|
|
||||||
fclose(w);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(r);
|
|
||||||
|
|
||||||
if(!w && disabled) {
|
|
||||||
fprintf(stderr, "Warning: old key(s) found, remove them by hand!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(disabled) {
|
|
||||||
#ifdef HAVE_MINGW
|
|
||||||
// We cannot atomically replace files on Windows.
|
|
||||||
char bakfile[PATH_MAX] = "";
|
|
||||||
snprintf(bakfile, sizeof(bakfile), "%s.bak", filename);
|
|
||||||
|
|
||||||
if(rename(filename, bakfile) || rename(tmpfile, filename)) {
|
|
||||||
rename(bakfile, filename);
|
|
||||||
#else
|
|
||||||
|
|
||||||
if(rename(tmpfile, filename)) {
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, "Warning: old key(s) found, remove them by hand!\n");
|
|
||||||
} else {
|
|
||||||
#ifdef HAVE_MINGW
|
|
||||||
unlink(bakfile);
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, "Warning: old key(s) found and disabled.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unlink(tmpfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE *ask_and_open(const char *filename, const char *what) {
|
|
||||||
FILE *r;
|
|
||||||
char directory[PATH_MAX];
|
|
||||||
char line[PATH_MAX];
|
|
||||||
char abspath[PATH_MAX];
|
|
||||||
const char *fn;
|
|
||||||
|
|
||||||
/* Check stdin and stdout */
|
|
||||||
if(!isatty(0) || !isatty(1)) {
|
|
||||||
/* Argh, they are running us from a script or something. Write
|
|
||||||
the files to the current directory and let them burn in hell
|
|
||||||
for ever. */
|
|
||||||
fn = filename;
|
|
||||||
} else {
|
|
||||||
/* Ask for a file and/or directory name. */
|
|
||||||
fprintf(stdout, "Please enter a file to save %s to [%s]: ",
|
|
||||||
what, filename);
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
fn = readline(stdin, line, sizeof(line));
|
|
||||||
|
|
||||||
if(!fn) {
|
|
||||||
fprintf(stderr, "Error while reading stdin: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!strlen(fn))
|
|
||||||
/* User just pressed enter. */
|
|
||||||
{
|
|
||||||
fn = filename;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_MINGW
|
|
||||||
|
|
||||||
if(fn[0] != '\\' && fn[0] != '/' && !strchr(fn, ':')) {
|
|
||||||
#else
|
|
||||||
|
|
||||||
if(fn[0] != '/') {
|
|
||||||
#endif
|
|
||||||
/* The directory is a relative path or a filename. */
|
|
||||||
getcwd(directory, sizeof(directory));
|
|
||||||
|
|
||||||
if((size_t)snprintf(abspath, sizeof(abspath), "%s/%s", directory, fn) >= sizeof(abspath)) {
|
|
||||||
fprintf(stderr, "Pathname too long: %s/%s\n", directory, fn);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn = abspath;
|
|
||||||
}
|
|
||||||
|
|
||||||
umask(0077); /* Disallow everything for group and other */
|
|
||||||
|
|
||||||
disable_old_keys(fn);
|
|
||||||
|
|
||||||
/* Open it first to keep the inode busy */
|
|
||||||
|
|
||||||
r = fopen(fn, "a");
|
|
||||||
|
|
||||||
if(!r) {
|
|
||||||
fprintf(stderr, "Error opening file `%s': %s\n",
|
|
||||||
fn, strerror(errno));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
50
src/conf.h
50
src/conf.h
|
@ -1,10 +1,7 @@
|
||||||
#ifndef TINC_CONF_H
|
|
||||||
#define TINC_CONF_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
conf.h -- header for conf.c
|
conf.h -- header for conf.c
|
||||||
Copyright (C) 1998-2005 Ivo Timmermans
|
Copyright (C) 1998-2005 Ivo Timmermans
|
||||||
2000-2012 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2009 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -21,7 +18,10 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "avl_tree.h"
|
#ifndef __TINC_CONF_H__
|
||||||
|
#define __TINC_CONF_H__
|
||||||
|
|
||||||
|
#include "splay_tree.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
|
||||||
typedef struct config_t {
|
typedef struct config_t {
|
||||||
|
@ -33,35 +33,37 @@ typedef struct config_t {
|
||||||
|
|
||||||
#include "subnet.h"
|
#include "subnet.h"
|
||||||
|
|
||||||
extern avl_tree_t *config_tree;
|
extern splay_tree_t *config_tree;
|
||||||
|
|
||||||
extern int pinginterval;
|
extern int pinginterval;
|
||||||
extern int pingtimeout;
|
extern int pingtimeout;
|
||||||
extern int maxtimeout;
|
extern int maxtimeout;
|
||||||
extern int mintimeout;
|
|
||||||
extern bool bypass_security;
|
extern bool bypass_security;
|
||||||
extern char *confbase;
|
extern char *confbase;
|
||||||
extern char *netname;
|
extern char *netname;
|
||||||
extern list_t *cmdline_conf;
|
extern list_t *cmdline_conf;
|
||||||
|
|
||||||
extern void init_configuration(avl_tree_t **config_tree);
|
extern void init_configuration(splay_tree_t **);
|
||||||
extern void exit_configuration(avl_tree_t **config_tree);
|
extern void exit_configuration(splay_tree_t **);
|
||||||
extern config_t *new_config(void) __attribute__ ((__malloc__));
|
extern config_t *new_config(void) __attribute__ ((__malloc__));
|
||||||
extern void free_config(config_t *cfg);
|
extern void free_config(config_t *);
|
||||||
extern void config_add(avl_tree_t *config_tree, config_t *cfg);
|
extern void config_add(splay_tree_t *, config_t *);
|
||||||
extern config_t *lookup_config(const avl_tree_t *config_tree, char *variable);
|
extern config_t *lookup_config(splay_tree_t *, char *);
|
||||||
extern config_t *lookup_config_next(const avl_tree_t *config_tree, const config_t *cfg);
|
extern config_t *lookup_config_next(splay_tree_t *, const config_t *);
|
||||||
extern bool get_config_bool(const config_t *cfg, bool *result);
|
extern bool get_config_bool(const config_t *, bool *);
|
||||||
extern bool get_config_int(const config_t *cfg, int *result);
|
extern bool get_config_int(const config_t *, int *);
|
||||||
extern bool get_config_string(const config_t *cfg, char **result);
|
extern bool get_config_string(const config_t *, char **);
|
||||||
extern bool get_config_address(const config_t *cfg, struct addrinfo **result);
|
extern bool get_config_address(const config_t *, struct addrinfo **);
|
||||||
extern bool get_config_subnet(const config_t *cfg, struct subnet_t **result);
|
extern bool get_config_subnet(const config_t *, struct subnet_t **);
|
||||||
|
|
||||||
extern config_t *parse_config_line(char *line, const char *fname, int lineno);
|
extern config_t *parse_config_line(char *, const char *, int);
|
||||||
extern bool read_config_file(avl_tree_t *config_tree, const char *fname);
|
extern bool read_config_file(splay_tree_t *, const char *);
|
||||||
extern void read_config_options(avl_tree_t *config_tree, const char *prefix);
|
extern void read_config_options(splay_tree_t *, const char *);
|
||||||
extern bool read_server_config(void);
|
extern bool read_server_config(void);
|
||||||
extern bool read_connection_config(struct connection_t *c);
|
extern bool read_connection_config(struct connection_t *);
|
||||||
extern FILE *ask_and_open(const char *fname, const char *what);
|
extern bool append_config_file(const char *, const char *, const char *);
|
||||||
|
extern FILE *ask_and_open(const char *, const char *, const char *);
|
||||||
|
extern bool is_safe_path(const char *);
|
||||||
|
extern bool disable_old_keys(FILE *);
|
||||||
|
|
||||||
#endif
|
#endif /* __TINC_CONF_H__ */
|
||||||
|
|
139
src/connection.c
139
src/connection.c
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
connection.c -- connection list management
|
connection.c -- connection list management
|
||||||
Copyright (C) 2000-2016 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2000-2009 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
2000-2005 Ivo Timmermans
|
2000-2005 Ivo Timmermans
|
||||||
2008 Max Rijevski <maksuf@gmail.com>
|
2008 Max Rijevski <maksuf@gmail.com>
|
||||||
|
|
||||||
|
@ -21,131 +21,98 @@
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
|
||||||
#include "avl_tree.h"
|
#include "splay_tree.h"
|
||||||
|
#include "cipher.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
#include "control_common.h"
|
||||||
|
#include "list.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "subnet.h"
|
#include "subnet.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "xalloc.h"
|
#include "xalloc.h"
|
||||||
|
|
||||||
avl_tree_t *connection_tree; /* Meta connections */
|
splay_tree_t *connection_tree; /* Meta connections */
|
||||||
connection_t *everyone;
|
connection_t *broadcast;
|
||||||
|
|
||||||
static int connection_compare(const connection_t *a, const connection_t *b) {
|
static int connection_compare(const connection_t *a, const connection_t *b) {
|
||||||
return a < b ? -1 : a == b ? 0 : 1;
|
return a < b ? -1 : a == b ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_connections(void) {
|
void init_connections(void) {
|
||||||
connection_tree = avl_alloc_tree((avl_compare_t) connection_compare, (avl_action_t) free_connection);
|
connection_tree = splay_alloc_tree((splay_compare_t) connection_compare, (splay_action_t) free_connection);
|
||||||
everyone = new_connection();
|
broadcast = new_connection();
|
||||||
everyone->name = xstrdup("everyone");
|
broadcast->name = xstrdup("everyone");
|
||||||
everyone->hostname = xstrdup("BROADCAST");
|
broadcast->hostname = xstrdup("BROADCAST");
|
||||||
}
|
}
|
||||||
|
|
||||||
void exit_connections(void) {
|
void exit_connections(void) {
|
||||||
avl_delete_tree(connection_tree);
|
splay_delete_tree(connection_tree);
|
||||||
free_connection(everyone);
|
free_connection(broadcast);
|
||||||
}
|
}
|
||||||
|
|
||||||
connection_t *new_connection(void) {
|
connection_t *new_connection(void) {
|
||||||
connection_t *c;
|
return xmalloc_and_zero(sizeof(connection_t));
|
||||||
|
|
||||||
c = xmalloc_and_zero(sizeof(connection_t));
|
|
||||||
|
|
||||||
if(!c) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
gettimeofday(&c->start, NULL);
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_connection_partially(connection_t *c) {
|
|
||||||
free(c->inkey);
|
|
||||||
free(c->outkey);
|
|
||||||
free(c->mychallenge);
|
|
||||||
free(c->hischallenge);
|
|
||||||
free(c->outbuf);
|
|
||||||
|
|
||||||
c->inkey = NULL;
|
|
||||||
c->outkey = NULL;
|
|
||||||
c->mychallenge = NULL;
|
|
||||||
c->hischallenge = NULL;
|
|
||||||
c->outbuf = NULL;
|
|
||||||
|
|
||||||
c->status.pinged = false;
|
|
||||||
c->status.active = false;
|
|
||||||
c->status.connecting = false;
|
|
||||||
c->status.timeout = false;
|
|
||||||
c->status.encryptout = false;
|
|
||||||
c->status.decryptin = false;
|
|
||||||
c->status.mst = false;
|
|
||||||
|
|
||||||
c->options = 0;
|
|
||||||
c->buflen = 0;
|
|
||||||
c->reqlen = 0;
|
|
||||||
c->tcplen = 0;
|
|
||||||
c->allow_request = 0;
|
|
||||||
c->outbuflen = 0;
|
|
||||||
c->outbufsize = 0;
|
|
||||||
c->outbufstart = 0;
|
|
||||||
c->last_ping_time = 0;
|
|
||||||
c->last_flushed_time = 0;
|
|
||||||
c->inbudget = 0;
|
|
||||||
c->outbudget = 0;
|
|
||||||
|
|
||||||
if(c->inctx) {
|
|
||||||
EVP_CIPHER_CTX_cleanup(c->inctx);
|
|
||||||
free(c->inctx);
|
|
||||||
c->inctx = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(c->outctx) {
|
|
||||||
EVP_CIPHER_CTX_cleanup(c->outctx);
|
|
||||||
free(c->outctx);
|
|
||||||
c->outctx = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(c->rsa_key) {
|
|
||||||
RSA_free(c->rsa_key);
|
|
||||||
c->rsa_key = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_connection(connection_t *c) {
|
void free_connection(connection_t *c) {
|
||||||
free_connection_partially(c);
|
if(!c)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(c->name)
|
||||||
free(c->name);
|
free(c->name);
|
||||||
|
|
||||||
|
if(c->hostname)
|
||||||
free(c->hostname);
|
free(c->hostname);
|
||||||
|
|
||||||
if(c->config_tree) {
|
cipher_close(&c->incipher);
|
||||||
|
digest_close(&c->indigest);
|
||||||
|
cipher_close(&c->outcipher);
|
||||||
|
digest_close(&c->outdigest);
|
||||||
|
|
||||||
|
ecdh_free(&c->ecdh);
|
||||||
|
ecdsa_free(&c->ecdsa);
|
||||||
|
rsa_free(&c->rsa);
|
||||||
|
|
||||||
|
if(c->hischallenge)
|
||||||
|
free(c->hischallenge);
|
||||||
|
|
||||||
|
if(c->config_tree)
|
||||||
exit_configuration(&c->config_tree);
|
exit_configuration(&c->config_tree);
|
||||||
}
|
|
||||||
|
buffer_clear(&c->inbuf);
|
||||||
|
buffer_clear(&c->outbuf);
|
||||||
|
|
||||||
|
if(event_initialized(&c->inevent))
|
||||||
|
event_del(&c->inevent);
|
||||||
|
|
||||||
|
if(event_initialized(&c->outevent))
|
||||||
|
event_del(&c->outevent);
|
||||||
|
|
||||||
|
if(c->socket > 0)
|
||||||
|
closesocket(c->socket);
|
||||||
|
|
||||||
free(c);
|
free(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
void connection_add(connection_t *c) {
|
void connection_add(connection_t *c) {
|
||||||
avl_insert(connection_tree, c);
|
splay_insert(connection_tree, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
void connection_del(connection_t *c) {
|
void connection_del(connection_t *c) {
|
||||||
avl_delete(connection_tree, c);
|
splay_delete(connection_tree, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_connections(void) {
|
bool dump_connections(connection_t *cdump) {
|
||||||
avl_node_t *node;
|
splay_node_t *node;
|
||||||
connection_t *c;
|
connection_t *c;
|
||||||
|
|
||||||
logger(LOG_DEBUG, "Connections:");
|
|
||||||
|
|
||||||
for(node = connection_tree->head; node; node = node->next) {
|
for(node = connection_tree->head; node; node = node->next) {
|
||||||
c = node->data;
|
c = node->data;
|
||||||
logger(LOG_DEBUG, " %s at %s options %x socket %d status %04x outbuf %d/%d/%d",
|
send_request(cdump, "%d %d %s at %s options %x socket %d status %04x",
|
||||||
c->name, c->hostname, c->options, c->socket, bitfield_to_int(&c->status, sizeof(c->status)),
|
CONTROL, REQ_DUMP_CONNECTIONS,
|
||||||
c->outbufsize, c->outbufstart, c->outbuflen);
|
c->name, c->hostname, c->options, c->socket,
|
||||||
|
bitfield_to_int(&c->status, sizeof c->status));
|
||||||
}
|
}
|
||||||
|
|
||||||
logger(LOG_DEBUG, "End of connections.");
|
return send_request(cdump, "%d %d", CONTROL, REQ_DUMP_CONNECTIONS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
#ifndef TINC_CONNECTION_H
|
|
||||||
#define TINC_CONNECTION_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
connection.h -- header for connection.c
|
connection.h -- header for connection.c
|
||||||
Copyright (C) 2000-2016 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2000-2010 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
2000-2005 Ivo Timmermans
|
2000-2005 Ivo Timmermans
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -21,10 +18,14 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <openssl/rsa.h>
|
#ifndef __TINC_CONNECTION_H__
|
||||||
#include <openssl/evp.h>
|
#define __TINC_CONNECTION_H__
|
||||||
|
|
||||||
#include "avl_tree.h"
|
#include "buffer.h"
|
||||||
|
#include "cipher.h"
|
||||||
|
#include "digest.h"
|
||||||
|
#include "rsa.h"
|
||||||
|
#include "splay_tree.h"
|
||||||
|
|
||||||
#define OPTION_INDIRECT 0x0001
|
#define OPTION_INDIRECT 0x0001
|
||||||
#define OPTION_TCPONLY 0x0002
|
#define OPTION_TCPONLY 0x0002
|
||||||
|
@ -35,17 +36,19 @@ typedef struct connection_status_t {
|
||||||
unsigned int pinged:1; /* sent ping */
|
unsigned int pinged:1; /* sent ping */
|
||||||
unsigned int active:1; /* 1 if active.. */
|
unsigned int active:1; /* 1 if active.. */
|
||||||
unsigned int connecting:1; /* 1 if we are waiting for a non-blocking connect() to finish */
|
unsigned int connecting:1; /* 1 if we are waiting for a non-blocking connect() to finish */
|
||||||
unsigned int unused_termreq: 1; /* the termination of this connection was requested */
|
unsigned int termreq:1; /* the termination of this connection was requested */
|
||||||
unsigned int remove: 1; /* Set to 1 if you want this connection removed */
|
unsigned int remove_unused:1; /* Set to 1 if you want this connection removed */
|
||||||
unsigned int timeout: 1; /* 1 if gotten timeout */
|
unsigned int timeout_unused:1; /* 1 if gotten timeout */
|
||||||
unsigned int encryptout:1; /* 1 if we can encrypt outgoing traffic */
|
unsigned int encryptout:1; /* 1 if we can encrypt outgoing traffic */
|
||||||
unsigned int decryptin:1; /* 1 if we have to decrypt incoming traffic */
|
unsigned int decryptin:1; /* 1 if we have to decrypt incoming traffic */
|
||||||
unsigned int mst:1; /* 1 if this connection is part of a minimum spanning tree */
|
unsigned int mst:1; /* 1 if this connection is part of a minimum spanning tree */
|
||||||
unsigned int proxy_passed: 1; /* 1 if we are connecting via a proxy and we have finished talking with it */
|
unsigned int control:1;
|
||||||
unsigned int tarpit: 1; /* 1 if the connection should be added to the tarpit */
|
unsigned int pcap:1;
|
||||||
unsigned int unused:21;
|
unsigned int unused:21;
|
||||||
} connection_status_t;
|
} connection_status_t;
|
||||||
|
|
||||||
|
#include "ecdh.h"
|
||||||
|
#include "ecdsa.h"
|
||||||
#include "edge.h"
|
#include "edge.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
|
@ -55,7 +58,8 @@ typedef struct connection_t {
|
||||||
|
|
||||||
union sockaddr_t address; /* his real (internet) ip */
|
union sockaddr_t address; /* his real (internet) ip */
|
||||||
char *hostname; /* the hostname of its real ip */
|
char *hostname; /* the hostname of its real ip */
|
||||||
int protocol_version; /* used protocol */
|
int protocol_major; /* used protocol */
|
||||||
|
int protocol_minor; /* used protocol */
|
||||||
|
|
||||||
int socket; /* socket used for this connection */
|
int socket; /* socket used for this connection */
|
||||||
uint32_t options; /* options for this connection */
|
uint32_t options; /* options for this connection */
|
||||||
|
@ -67,53 +71,42 @@ typedef struct connection_t {
|
||||||
struct node_t *node; /* node associated with the other end */
|
struct node_t *node; /* node associated with the other end */
|
||||||
struct edge_t *edge; /* edge associated with this connection */
|
struct edge_t *edge; /* edge associated with this connection */
|
||||||
|
|
||||||
RSA *rsa_key; /* his public/private key */
|
rsa_t rsa; /* his public RSA key */
|
||||||
const EVP_CIPHER *incipher; /* Cipher he will use to send data to us */
|
ecdsa_t ecdsa; /* his public ECDSA key */
|
||||||
const EVP_CIPHER *outcipher; /* Cipher we will use to send data to him */
|
ecdsa_t ecdh; /* state for ECDH key exchange */
|
||||||
EVP_CIPHER_CTX *inctx; /* Context of encrypted meta data that will come from him to us */
|
cipher_t incipher; /* Cipher he will use to send data to us */
|
||||||
EVP_CIPHER_CTX *outctx; /* Context of encrypted meta data that will be sent from us to him */
|
cipher_t outcipher; /* Cipher we will use to send data to him */
|
||||||
uint64_t inbudget; /* Encrypted bytes send budget */
|
digest_t indigest;
|
||||||
uint64_t outbudget; /* Encrypted bytes receive budget */
|
digest_t outdigest;
|
||||||
char *inkey; /* His symmetric meta key + iv */
|
|
||||||
char *outkey; /* Our symmetric meta key + iv */
|
|
||||||
int inkeylength; /* Length of his key + iv */
|
|
||||||
int outkeylength; /* Length of our key + iv */
|
|
||||||
const EVP_MD *indigest;
|
|
||||||
const EVP_MD *outdigest;
|
|
||||||
int inmaclength;
|
int inmaclength;
|
||||||
int outmaclength;
|
int outmaclength;
|
||||||
int incompression;
|
int incompression;
|
||||||
int outcompression;
|
int outcompression;
|
||||||
char *mychallenge; /* challenge we received from him */
|
|
||||||
char *hischallenge; /* challenge we sent to him */
|
|
||||||
|
|
||||||
char buffer[MAXBUFSIZE]; /* metadata input buffer */
|
char *hischallenge; /* The challenge we sent to him */
|
||||||
int buflen; /* bytes read into buffer */
|
|
||||||
int reqlen; /* length of incoming request */
|
struct buffer_t inbuf;
|
||||||
length_t tcplen; /* length of incoming TCPpacket */
|
struct buffer_t outbuf;
|
||||||
|
struct event inevent; /* input event on this metadata connection */
|
||||||
|
struct event outevent; /* output event on this metadata connection */
|
||||||
|
int tcplen; /* length of incoming TCPpacket */
|
||||||
int allow_request; /* defined if there's only one request possible */
|
int allow_request; /* defined if there's only one request possible */
|
||||||
|
|
||||||
char *outbuf; /* metadata output buffer */
|
|
||||||
int outbufstart; /* index of first meaningful byte in output buffer */
|
|
||||||
int outbuflen; /* number of meaningful bytes in output buffer */
|
|
||||||
int outbufsize; /* number of bytes allocated to output buffer */
|
|
||||||
|
|
||||||
time_t last_ping_time; /* last time we saw some activity from the other end or pinged them */
|
time_t last_ping_time; /* last time we saw some activity from the other end or pinged them */
|
||||||
time_t last_flushed_time; /* last time buffer was empty. Only meaningful if outbuflen > 0 */
|
|
||||||
|
|
||||||
avl_tree_t *config_tree; /* Pointer to configuration tree belonging to him */
|
splay_tree_t *config_tree; /* Pointer to configuration tree belonging to him */
|
||||||
} connection_t;
|
} connection_t;
|
||||||
|
|
||||||
extern avl_tree_t *connection_tree;
|
extern splay_tree_t *connection_tree;
|
||||||
extern connection_t *everyone;
|
extern connection_t *broadcast;
|
||||||
|
|
||||||
extern void init_connections(void);
|
extern void init_connections(void);
|
||||||
extern void exit_connections(void);
|
extern void exit_connections(void);
|
||||||
extern connection_t *new_connection(void) __attribute__ ((__malloc__));
|
extern connection_t *new_connection(void) __attribute__ ((__malloc__));
|
||||||
extern void free_connection(connection_t *c);
|
extern void free_connection(connection_t *);
|
||||||
extern void free_connection_partially(connection_t *c);
|
extern void connection_add(connection_t *);
|
||||||
extern void connection_add(connection_t *c);
|
extern void connection_del(connection_t *);
|
||||||
extern void connection_del(connection_t *c);
|
extern bool dump_connections(struct connection_t *);
|
||||||
extern void dump_connections(void);
|
|
||||||
|
|
||||||
#endif
|
#endif /* __TINC_CONNECTION_H__ */
|
||||||
|
|
182
src/control.c
Normal file
182
src/control.c
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
/*
|
||||||
|
control.c -- Control socket handling.
|
||||||
|
Copyright (C) 2007 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
|
#include "crypto.h"
|
||||||
|
#include "conf.h"
|
||||||
|
#include "control.h"
|
||||||
|
#include "control_common.h"
|
||||||
|
#include "graph.h"
|
||||||
|
#include "logger.h"
|
||||||
|
#include "meta.h"
|
||||||
|
#include "net.h"
|
||||||
|
#include "netutl.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
#include "route.h"
|
||||||
|
#include "splay_tree.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "xalloc.h"
|
||||||
|
|
||||||
|
char controlcookie[65];
|
||||||
|
extern char *pidfilename;
|
||||||
|
|
||||||
|
static bool control_return(connection_t *c, int type, int error) {
|
||||||
|
return send_request(c, "%d %d %d", CONTROL, type, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool control_ok(connection_t *c, int type) {
|
||||||
|
return control_return(c, type, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool control_h(connection_t *c, char *request) {
|
||||||
|
int type;
|
||||||
|
|
||||||
|
if(!c->status.control || c->allow_request != CONTROL) {
|
||||||
|
logger(LOG_ERR, "Unauthorized control request from %s (%s)", c->name, c->hostname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(sscanf(request, "%*d %d", &type) != 1) {
|
||||||
|
logger(LOG_ERR, "Got bad %s from %s (%s)", "CONTROL", c->name, c->hostname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case REQ_STOP:
|
||||||
|
event_loopexit(NULL);
|
||||||
|
return control_ok(c, REQ_STOP);
|
||||||
|
|
||||||
|
case REQ_DUMP_NODES:
|
||||||
|
return dump_nodes(c);
|
||||||
|
|
||||||
|
case REQ_DUMP_EDGES:
|
||||||
|
return dump_edges(c);
|
||||||
|
|
||||||
|
case REQ_DUMP_SUBNETS:
|
||||||
|
return dump_subnets(c);
|
||||||
|
|
||||||
|
case REQ_DUMP_CONNECTIONS:
|
||||||
|
return dump_connections(c);
|
||||||
|
|
||||||
|
case REQ_PURGE:
|
||||||
|
purge();
|
||||||
|
return control_ok(c, REQ_PURGE);
|
||||||
|
|
||||||
|
case REQ_SET_DEBUG: {
|
||||||
|
int new_level;
|
||||||
|
if(sscanf(request, "%*d %*d %d", &new_level) != 1)
|
||||||
|
return false;
|
||||||
|
send_request(c, "%d %d %d", CONTROL, REQ_SET_DEBUG, debug_level);
|
||||||
|
if(new_level >= 0)
|
||||||
|
debug_level = new_level;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case REQ_RETRY:
|
||||||
|
retry();
|
||||||
|
return control_ok(c, REQ_RETRY);
|
||||||
|
|
||||||
|
case REQ_RELOAD:
|
||||||
|
logger(LOG_NOTICE, "Got '%s' command", "reload");
|
||||||
|
int result = reload_configuration();
|
||||||
|
return control_return(c, REQ_RELOAD, result);
|
||||||
|
|
||||||
|
case REQ_DISCONNECT: {
|
||||||
|
char name[MAX_STRING_SIZE];
|
||||||
|
connection_t *other;
|
||||||
|
splay_node_t *node, *next;
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
if(sscanf(request, "%*d %*d " MAX_STRING, name) != 1)
|
||||||
|
return control_return(c, REQ_DISCONNECT, -1);
|
||||||
|
|
||||||
|
for(node = connection_tree->head; node; node = next) {
|
||||||
|
next = node->next;
|
||||||
|
other = node->data;
|
||||||
|
if(strcmp(other->name, name))
|
||||||
|
continue;
|
||||||
|
terminate_connection(other, other->status.active);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return control_return(c, REQ_DISCONNECT, found ? 0 : -2);
|
||||||
|
}
|
||||||
|
|
||||||
|
case REQ_DUMP_TRAFFIC:
|
||||||
|
return dump_traffic(c);
|
||||||
|
|
||||||
|
case REQ_PCAP:
|
||||||
|
c->status.pcap = true;
|
||||||
|
pcap = true;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return send_request(c, "%d %d", CONTROL, REQ_INVALID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool init_control(void) {
|
||||||
|
randomize(controlcookie, sizeof controlcookie / 2);
|
||||||
|
bin2hex(controlcookie, controlcookie, sizeof controlcookie / 2);
|
||||||
|
|
||||||
|
FILE *f = fopen(pidfilename, "w");
|
||||||
|
if(!f) {
|
||||||
|
logger(LOG_ERR, "Cannot write control socket cookie file %s: %s", pidfilename, strerror(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_FCHMOD
|
||||||
|
fchmod(fileno(f), 0600);
|
||||||
|
#else
|
||||||
|
chmod(pidfilename, 0600);
|
||||||
|
#endif
|
||||||
|
// Get the address and port of the first listening socket
|
||||||
|
|
||||||
|
char *localhost = NULL;
|
||||||
|
sockaddr_t sa;
|
||||||
|
socklen_t len = sizeof sa;
|
||||||
|
|
||||||
|
// Make sure we have a valid address, and map 0.0.0.0 and :: to 127.0.0.1 and ::1.
|
||||||
|
|
||||||
|
if(getsockname(listen_socket[0].tcp, (struct sockaddr *)&sa, &len)) {
|
||||||
|
xasprintf(&localhost, "127.0.0.1 port %d", myport);
|
||||||
|
} else {
|
||||||
|
if(sa.sa.sa_family == AF_INET) {
|
||||||
|
if(sa.in.sin_addr.s_addr == 0)
|
||||||
|
sa.in.sin_addr.s_addr = htonl(0x7f000001);
|
||||||
|
} else if(sa.sa.sa_family == AF_INET6) {
|
||||||
|
static const uint8_t zero[16] = {0};
|
||||||
|
if(!memcmp(sa.in6.sin6_addr.s6_addr, zero, sizeof zero))
|
||||||
|
sa.in6.sin6_addr.s6_addr[15] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
localhost = sockaddr2hostname(&sa);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(f, "%d %s %s\n", (int)getpid(), controlcookie, localhost);
|
||||||
|
|
||||||
|
free(localhost);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void exit_control(void) {
|
||||||
|
unlink(pidfilename);
|
||||||
|
}
|
27
src/control.h
Normal file
27
src/control.h
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
control.h -- header for control.c.
|
||||||
|
Copyright (C) 2007 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_CONTROL_H__
|
||||||
|
#define __TINC_CONTROL_H__
|
||||||
|
|
||||||
|
extern bool init_control();
|
||||||
|
extern void exit_control();
|
||||||
|
extern char controlcookie[];
|
||||||
|
|
||||||
|
#endif
|
46
src/control_common.h
Normal file
46
src/control_common.h
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
control_protocol.h -- control socket protocol.
|
||||||
|
Copyright (C) 2007 Scott Lamb <slamb@slamb.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_CONTROL_PROTOCOL_H__
|
||||||
|
#define __TINC_CONTROL_PROTOCOL_H__
|
||||||
|
|
||||||
|
#include "protocol.h"
|
||||||
|
|
||||||
|
enum request_type {
|
||||||
|
REQ_INVALID = -1,
|
||||||
|
REQ_STOP = 0,
|
||||||
|
REQ_RELOAD,
|
||||||
|
REQ_RESTART,
|
||||||
|
REQ_DUMP_NODES,
|
||||||
|
REQ_DUMP_EDGES,
|
||||||
|
REQ_DUMP_SUBNETS,
|
||||||
|
REQ_DUMP_CONNECTIONS,
|
||||||
|
REQ_DUMP_GRAPH,
|
||||||
|
REQ_PURGE,
|
||||||
|
REQ_SET_DEBUG,
|
||||||
|
REQ_RETRY,
|
||||||
|
REQ_CONNECT,
|
||||||
|
REQ_DISCONNECT,
|
||||||
|
REQ_DUMP_TRAFFIC,
|
||||||
|
REQ_PCAP,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TINC_CTL_VERSION_CURRENT 0
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
device.c -- Interaction with Windows tap driver in a Cygwin environment
|
device.c -- Interaction with Windows tap driver in a Cygwin environment
|
||||||
Copyright (C) 2002-2005 Ivo Timmermans,
|
Copyright (C) 2002-2005 Ivo Timmermans,
|
||||||
2002-2016 Guus Sliepen <guus@tinc-vpn.org>
|
2002-2009 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -18,26 +18,26 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../system.h"
|
#include "system.h"
|
||||||
#include "../net.h"
|
|
||||||
|
|
||||||
#include <w32api/windows.h>
|
#include <w32api/windows.h>
|
||||||
#include <w32api/winioctl.h>
|
#include <w32api/winioctl.h>
|
||||||
|
|
||||||
#include "../conf.h"
|
#include "conf.h"
|
||||||
#include "../device.h"
|
#include "device.h"
|
||||||
#include "../logger.h"
|
#include "logger.h"
|
||||||
#include "../route.h"
|
#include "net.h"
|
||||||
#include "../utils.h"
|
#include "route.h"
|
||||||
#include "../xalloc.h"
|
#include "utils.h"
|
||||||
|
#include "xalloc.h"
|
||||||
|
|
||||||
#include "../mingw/common.h"
|
#include "mingw/common.h"
|
||||||
|
|
||||||
int device_fd = -1;
|
int device_fd = -1;
|
||||||
static HANDLE device_handle = INVALID_HANDLE_VALUE;
|
static HANDLE device_handle = INVALID_HANDLE_VALUE;
|
||||||
char *device = NULL;
|
char *device = NULL;
|
||||||
char *iface = NULL;
|
char *iface = NULL;
|
||||||
static const char *device_info = "Windows tap device";
|
static char *device_info = NULL;
|
||||||
|
|
||||||
static uint64_t device_total_in = 0;
|
static uint64_t device_total_in = 0;
|
||||||
static uint64_t device_total_out = 0;
|
static uint64_t device_total_out = 0;
|
||||||
|
@ -45,7 +45,7 @@ static uint64_t device_total_out = 0;
|
||||||
static pid_t reader_pid;
|
static pid_t reader_pid;
|
||||||
static int sp[2];
|
static int sp[2];
|
||||||
|
|
||||||
static bool setup_device(void) {
|
bool setup_device(void) {
|
||||||
HKEY key, key2;
|
HKEY key, key2;
|
||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
|
@ -61,10 +61,6 @@ static bool setup_device(void) {
|
||||||
get_config_string(lookup_config(config_tree, "Device"), &device);
|
get_config_string(lookup_config(config_tree, "Device"), &device);
|
||||||
get_config_string(lookup_config(config_tree, "Interface"), &iface);
|
get_config_string(lookup_config(config_tree, "Interface"), &iface);
|
||||||
|
|
||||||
if(device && iface) {
|
|
||||||
logger(LOG_WARNING, "Warning: both Device and Interface specified, results may not be as expected");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open registry and look for network adapters */
|
/* Open registry and look for network adapters */
|
||||||
|
|
||||||
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, NETWORK_CONNECTIONS_KEY, 0, KEY_READ, &key)) {
|
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, NETWORK_CONNECTIONS_KEY, 0, KEY_READ, &key)) {
|
||||||
|
@ -73,50 +69,43 @@ static bool setup_device(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; ; i++) {
|
for (i = 0; ; i++) {
|
||||||
len = sizeof(adapterid);
|
len = sizeof adapterid;
|
||||||
|
if(RegEnumKeyEx(key, i, adapterid, &len, 0, 0, 0, NULL))
|
||||||
if(RegEnumKeyEx(key, i, adapterid, &len, 0, 0, 0, NULL)) {
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
/* Find out more about this adapter */
|
/* Find out more about this adapter */
|
||||||
|
|
||||||
snprintf(regpath, sizeof(regpath), "%s\\%s\\Connection", NETWORK_CONNECTIONS_KEY, adapterid);
|
snprintf(regpath, sizeof regpath, "%s\\%s\\Connection", NETWORK_CONNECTIONS_KEY, adapterid);
|
||||||
|
|
||||||
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, regpath, 0, KEY_READ, &key2)) {
|
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, regpath, 0, KEY_READ, &key2))
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
len = sizeof(adaptername);
|
len = sizeof adaptername;
|
||||||
err = RegQueryValueEx(key2, "Name", 0, 0, adaptername, &len);
|
err = RegQueryValueEx(key2, "Name", 0, 0, adaptername, &len);
|
||||||
|
|
||||||
RegCloseKey(key2);
|
RegCloseKey(key2);
|
||||||
|
|
||||||
if(err) {
|
if(err)
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
if(device) {
|
if(device) {
|
||||||
if(!strcmp(device, adapterid)) {
|
if(!strcmp(device, adapterid)) {
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if(iface) {
|
if(iface) {
|
||||||
if(!strcmp(iface, adaptername)) {
|
if(!strcmp(iface, adaptername)) {
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(tapname, sizeof(tapname), USERMODEDEVICEDIR "%s" TAPSUFFIX, adapterid);
|
snprintf(tapname, sizeof tapname, USERMODEDEVICEDIR "%s" TAPSUFFIX, adapterid);
|
||||||
device_handle = CreateFile(tapname, GENERIC_WRITE | GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
|
device_handle = CreateFile(tapname, GENERIC_WRITE | GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
|
||||||
|
|
||||||
if(device_handle != INVALID_HANDLE_VALUE) {
|
if(device_handle != INVALID_HANDLE_VALUE) {
|
||||||
CloseHandle(device_handle);
|
CloseHandle(device_handle);
|
||||||
found = true;
|
found = true;
|
||||||
|
@ -131,15 +120,13 @@ static bool setup_device(void) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!device) {
|
if(!device)
|
||||||
device = xstrdup(adapterid);
|
device = xstrdup(adapterid);
|
||||||
}
|
|
||||||
|
|
||||||
if(!iface) {
|
if(!iface)
|
||||||
iface = xstrdup(adaptername);
|
iface = xstrdup(adaptername);
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(tapname, sizeof(tapname), USERMODEDEVICEDIR "%s" TAPSUFFIX, device);
|
snprintf(tapname, sizeof tapname, USERMODEDEVICEDIR "%s" TAPSUFFIX, device);
|
||||||
|
|
||||||
/* Now we are going to open this device twice: once for reading and once for writing.
|
/* Now we are going to open this device twice: once for reading and once for writing.
|
||||||
We do this because apparently it isn't possible to check for activity in the select() loop.
|
We do this because apparently it isn't possible to check for activity in the select() loop.
|
||||||
|
@ -163,7 +150,7 @@ static bool setup_device(void) {
|
||||||
|
|
||||||
/* Get MAC address from tap device */
|
/* Get MAC address from tap device */
|
||||||
|
|
||||||
if(!DeviceIoControl(device_handle, TAP_IOCTL_GET_MAC, mymac.x, sizeof(mymac.x), mymac.x, sizeof(mymac.x), &len, 0)) {
|
if(!DeviceIoControl(device_handle, TAP_IOCTL_GET_MAC, mymac.x, sizeof mymac.x, mymac.x, sizeof mymac.x, &len, 0)) {
|
||||||
logger(LOG_ERR, "Could not get MAC address from Windows tap device %s (%s): %s", device, iface, winerror(GetLastError()));
|
logger(LOG_ERR, "Could not get MAC address from Windows tap device %s (%s): %s", device, iface, winerror(GetLastError()));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -186,7 +173,7 @@ static bool setup_device(void) {
|
||||||
It passes everything it reads to the socket. */
|
It passes everything it reads to the socket. */
|
||||||
|
|
||||||
char buf[MTU];
|
char buf[MTU];
|
||||||
long lenin;
|
long inlen;
|
||||||
|
|
||||||
CloseHandle(device_handle);
|
CloseHandle(device_handle);
|
||||||
|
|
||||||
|
@ -209,24 +196,25 @@ static bool setup_device(void) {
|
||||||
/* Pass packets */
|
/* Pass packets */
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
ReadFile(device_handle, buf, MTU, &lenin, NULL);
|
ReadFile(device_handle, buf, MTU, &inlen, NULL);
|
||||||
write(sp[1], buf, lenin);
|
write(sp[1], buf, inlen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
read(device_fd, &gelukt, 1);
|
read(device_fd, &gelukt, 1);
|
||||||
|
|
||||||
if(gelukt != 1) {
|
if(gelukt != 1) {
|
||||||
logger(LOG_DEBUG, "Tap reader failed!");
|
logger(LOG_DEBUG, "Tap reader failed!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
device_info = "Windows tap device";
|
||||||
|
|
||||||
logger(LOG_INFO, "%s (%s) is a %s", device, iface, device_info);
|
logger(LOG_INFO, "%s (%s) is a %s", device, iface, device_info);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void close_device(void) {
|
void close_device(void) {
|
||||||
close(sp[0]);
|
close(sp[0]);
|
||||||
close(sp[1]);
|
close(sp[1]);
|
||||||
CloseHandle(device_handle);
|
CloseHandle(device_handle);
|
||||||
|
@ -237,16 +225,16 @@ static void close_device(void) {
|
||||||
free(iface);
|
free(iface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool read_packet(vpn_packet_t *packet) {
|
bool read_packet(vpn_packet_t *packet) {
|
||||||
int lenin;
|
int inlen;
|
||||||
|
|
||||||
if((lenin = read(sp[0], packet->data, MTU)) <= 0) {
|
if((inlen = read(sp[0], packet->data, MTU)) <= 0) {
|
||||||
logger(LOG_ERR, "Error while reading from %s %s: %s", device_info,
|
logger(LOG_ERR, "Error while reading from %s %s: %s", device_info,
|
||||||
device, strerror(errno));
|
device, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
packet->len = lenin;
|
packet->len = inlen;
|
||||||
|
|
||||||
device_total_in += packet->len;
|
device_total_in += packet->len;
|
||||||
|
|
||||||
|
@ -256,13 +244,13 @@ static bool read_packet(vpn_packet_t *packet) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool write_packet(vpn_packet_t *packet) {
|
bool write_packet(vpn_packet_t *packet) {
|
||||||
long lenout;
|
long outlen;
|
||||||
|
|
||||||
ifdebug(TRAFFIC) logger(LOG_DEBUG, "Writing packet of %d bytes to %s",
|
ifdebug(TRAFFIC) logger(LOG_DEBUG, "Writing packet of %d bytes to %s",
|
||||||
packet->len, device_info);
|
packet->len, device_info);
|
||||||
|
|
||||||
if(!WriteFile(device_handle, packet->data, packet->len, &lenout, NULL)) {
|
if(!WriteFile (device_handle, packet->data, packet->len, &outlen, NULL)) {
|
||||||
logger(LOG_ERR, "Error while writing to %s %s: %s", device_info, device, winerror(GetLastError()));
|
logger(LOG_ERR, "Error while writing to %s %s: %s", device_info, device, winerror(GetLastError()));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -272,16 +260,8 @@ static bool write_packet(vpn_packet_t *packet) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_device_stats(void) {
|
void dump_device_stats(void) {
|
||||||
logger(LOG_DEBUG, "Statistics for %s %s:", device_info, device);
|
logger(LOG_DEBUG, "Statistics for %s %s:", device_info, device);
|
||||||
logger(LOG_DEBUG, " total bytes in: %10"PRIu64, device_total_in);
|
logger(LOG_DEBUG, " total bytes in: %10"PRIu64, device_total_in);
|
||||||
logger(LOG_DEBUG, " total bytes out: %10"PRIu64, device_total_out);
|
logger(LOG_DEBUG, " total bytes out: %10"PRIu64, device_total_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
const devops_t os_devops = {
|
|
||||||
.setup = setup_device,
|
|
||||||
.close = close_device,
|
|
||||||
.read = read_packet,
|
|
||||||
.write = write_packet,
|
|
||||||
.dump_stats = dump_device_stats,
|
|
||||||
};
|
|
||||||
|
|
36
src/device.h
36
src/device.h
|
@ -1,10 +1,7 @@
|
||||||
#ifndef TINC_DEVICE_H
|
|
||||||
#define TINC_DEVICE_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
device.h -- generic header for device.c
|
net.h -- generic header for device.c
|
||||||
Copyright (C) 2001-2005 Ivo Timmermans
|
Copyright (C) 2001-2005 Ivo Timmermans
|
||||||
2001-2012 Guus Sliepen <guus@tinc-vpn.org>
|
2001-2006 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -21,27 +18,24 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_DEVICE_H__
|
||||||
|
#define __TINC_DEVICE_H__
|
||||||
|
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
|
|
||||||
extern int device_fd;
|
extern int device_fd;
|
||||||
extern char *device;
|
extern char *device;
|
||||||
|
|
||||||
extern char *iface;
|
extern char *iface;
|
||||||
|
|
||||||
typedef struct devops_t {
|
extern uint64_t device_in_packets;
|
||||||
bool (*setup)(void);
|
extern uint64_t device_in_bytes;
|
||||||
void (*close)(void);
|
extern uint64_t device_out_packets;
|
||||||
bool (*read)(struct vpn_packet_t *packet);
|
extern uint64_t device_out_bytes;
|
||||||
bool (*write)(struct vpn_packet_t *packet);
|
|
||||||
void (*dump_stats)(void);
|
|
||||||
} devops_t;
|
|
||||||
|
|
||||||
extern const devops_t os_devops;
|
extern bool setup_device(void);
|
||||||
extern const devops_t dummy_devops;
|
extern void close_device(void);
|
||||||
extern const devops_t raw_socket_devops;
|
extern bool read_packet(struct vpn_packet_t *);
|
||||||
extern const devops_t multicast_devops;
|
extern bool write_packet(struct vpn_packet_t *);
|
||||||
extern const devops_t uml_devops;
|
extern void dump_device_stats(void);
|
||||||
extern const devops_t vde_devops;
|
|
||||||
extern devops_t devops;
|
|
||||||
|
|
||||||
#endif
|
#endif /* __TINC_DEVICE_H__ */
|
||||||
|
|
43
src/dropin.c
43
src/dropin.c
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
dropin.c -- a set of drop-in replacements for libc functions
|
dropin.c -- a set of drop-in replacements for libc functions
|
||||||
Copyright (C) 2000-2005 Ivo Timmermans,
|
Copyright (C) 2000-2005 Ivo Timmermans,
|
||||||
2000-2016 Guus Sliepen <guus@tinc-vpn.org>
|
2000-2011 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -50,9 +50,8 @@ int daemon(int nochdir, int noclose) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we are the parent, terminate */
|
/* If we are the parent, terminate */
|
||||||
if(pid) {
|
if(pid)
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
|
||||||
|
|
||||||
/* Detach by becoming the new process group leader */
|
/* Detach by becoming the new process group leader */
|
||||||
if(setsid() < 0) {
|
if(setsid() < 0) {
|
||||||
|
@ -87,6 +86,40 @@ int daemon(int nochdir, int noclose) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_GET_CURRENT_DIR_NAME
|
||||||
|
/*
|
||||||
|
Replacement for the GNU get_current_dir_name function:
|
||||||
|
|
||||||
|
get_current_dir_name will malloc(3) an array big enough to hold the
|
||||||
|
current directory name. If the environment variable PWD is set, and
|
||||||
|
its value is correct, then that value will be returned.
|
||||||
|
*/
|
||||||
|
char *get_current_dir_name(void) {
|
||||||
|
size_t size;
|
||||||
|
char *buf;
|
||||||
|
char *r;
|
||||||
|
|
||||||
|
/* Start with 100 bytes. If this turns out to be insufficient to
|
||||||
|
contain the working directory, double the size. */
|
||||||
|
size = 100;
|
||||||
|
buf = xmalloc(size);
|
||||||
|
|
||||||
|
errno = 0; /* Success */
|
||||||
|
r = getcwd(buf, size);
|
||||||
|
|
||||||
|
/* getcwd returns NULL and sets errno to ERANGE if the bufferspace
|
||||||
|
is insufficient to contain the entire working directory. */
|
||||||
|
while(r == NULL && errno == ERANGE) {
|
||||||
|
free(buf);
|
||||||
|
size <<= 1; /* double the size */
|
||||||
|
buf = xmalloc(size);
|
||||||
|
r = getcwd(buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_ASPRINTF
|
#ifndef HAVE_ASPRINTF
|
||||||
int asprintf(char **buf, const char *fmt, ...) {
|
int asprintf(char **buf, const char *fmt, ...) {
|
||||||
int result;
|
int result;
|
||||||
|
@ -107,12 +140,10 @@ int vasprintf(char **buf, const char *fmt, va_list ap) {
|
||||||
|
|
||||||
va_copy(aq, ap);
|
va_copy(aq, ap);
|
||||||
status = vsnprintf(*buf, len, fmt, aq);
|
status = vsnprintf(*buf, len, fmt, aq);
|
||||||
buf[len - 1] = 0;
|
|
||||||
va_end(aq);
|
va_end(aq);
|
||||||
|
|
||||||
if(status >= 0) {
|
if(status >= 0)
|
||||||
*buf = xrealloc(*buf, status + 1);
|
*buf = xrealloc(*buf, status + 1);
|
||||||
}
|
|
||||||
|
|
||||||
if(status > len - 1) {
|
if(status > len - 1) {
|
||||||
len = status;
|
len = status;
|
||||||
|
|
16
src/dropin.h
16
src/dropin.h
|
@ -1,6 +1,3 @@
|
||||||
#ifndef TINC_DROPIN_H
|
|
||||||
#define TINC_DROPIN_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dropin.h -- header file for dropin.c
|
dropin.h -- header file for dropin.c
|
||||||
Copyright (C) 2000-2005 Ivo Timmermans,
|
Copyright (C) 2000-2005 Ivo Timmermans,
|
||||||
|
@ -21,11 +18,14 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __DROPIN_H__
|
||||||
|
#define __DROPIN_H__
|
||||||
|
|
||||||
#include "fake-getaddrinfo.h"
|
#include "fake-getaddrinfo.h"
|
||||||
#include "fake-getnameinfo.h"
|
#include "fake-getnameinfo.h"
|
||||||
|
|
||||||
#ifndef HAVE_DAEMON
|
#ifndef HAVE_DAEMON
|
||||||
extern int daemon(int nochdir, int noclose);
|
extern int daemon(int, int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_GET_CURRENT_DIR_NAME
|
#ifndef HAVE_GET_CURRENT_DIR_NAME
|
||||||
|
@ -33,16 +33,16 @@ extern char *get_current_dir_name(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_ASPRINTF
|
#ifndef HAVE_ASPRINTF
|
||||||
extern int asprintf(char **buf, const char *fmt, ...);
|
extern int asprintf(char **, const char *, ...);
|
||||||
extern int vasprintf(char **buf, const char *fmt, va_list ap);
|
extern int vasprintf(char **, const char *, va_list ap);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_GETTIMEOFDAY
|
#ifndef HAVE_GETTIMEOFDAY
|
||||||
extern int gettimeofday(struct timeval *tv, void *tz);
|
extern int gettimeofday(struct timeval *, void *);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_USLEEP
|
#ifndef HAVE_USLEEP
|
||||||
extern int usleep(long long usec);
|
extern int usleep(long long usec);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif /* __DROPIN_H__ */
|
||||||
|
|
|
@ -1,66 +0,0 @@
|
||||||
/*
|
|
||||||
device.c -- Dummy device
|
|
||||||
Copyright (C) 2011 Guus Sliepen <guus@tinc-vpn.org>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "system.h"
|
|
||||||
|
|
||||||
#include "device.h"
|
|
||||||
#include "logger.h"
|
|
||||||
#include "net.h"
|
|
||||||
#include "xalloc.h"
|
|
||||||
|
|
||||||
static const char *device_info = "dummy device";
|
|
||||||
|
|
||||||
static uint64_t device_total_in = 0;
|
|
||||||
static uint64_t device_total_out = 0;
|
|
||||||
|
|
||||||
static bool setup_device(void) {
|
|
||||||
device = xstrdup("dummy");
|
|
||||||
iface = xstrdup("dummy");
|
|
||||||
logger(LOG_INFO, "%s (%s) is a %s", device, iface, device_info);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void close_device(void) {
|
|
||||||
free(device);
|
|
||||||
free(iface);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool read_packet(vpn_packet_t *packet) {
|
|
||||||
(void)packet;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool write_packet(vpn_packet_t *packet) {
|
|
||||||
device_total_out += packet->len;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dump_device_stats(void) {
|
|
||||||
logger(LOG_DEBUG, "Statistics for %s %s:", device_info, device);
|
|
||||||
logger(LOG_DEBUG, " total bytes in: %10"PRIu64, device_total_in);
|
|
||||||
logger(LOG_DEBUG, " total bytes out: %10"PRIu64, device_total_out);
|
|
||||||
}
|
|
||||||
|
|
||||||
const devops_t dummy_devops = {
|
|
||||||
.setup = setup_device,
|
|
||||||
.close = close_device,
|
|
||||||
.read = read_packet,
|
|
||||||
.write = write_packet,
|
|
||||||
.dump_stats = dump_device_stats,
|
|
||||||
};
|
|
54
src/edge.c
54
src/edge.c
|
@ -20,7 +20,8 @@
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
|
||||||
#include "avl_tree.h"
|
#include "splay_tree.h"
|
||||||
|
#include "control_common.h"
|
||||||
#include "edge.h"
|
#include "edge.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "netutl.h"
|
#include "netutl.h"
|
||||||
|
@ -28,7 +29,7 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "xalloc.h"
|
#include "xalloc.h"
|
||||||
|
|
||||||
avl_tree_t *edge_weight_tree; /* Tree with all edges, sorted on weight */
|
splay_tree_t *edge_weight_tree; /* Tree with all edges, sorted on weight */
|
||||||
|
|
||||||
static int edge_compare(const edge_t *a, const edge_t *b) {
|
static int edge_compare(const edge_t *a, const edge_t *b) {
|
||||||
return strcmp(a->to->name, b->to->name);
|
return strcmp(a->to->name, b->to->name);
|
||||||
|
@ -39,33 +40,31 @@ static int edge_weight_compare(const edge_t *a, const edge_t *b) {
|
||||||
|
|
||||||
result = a->weight - b->weight;
|
result = a->weight - b->weight;
|
||||||
|
|
||||||
if(result) {
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
|
||||||
|
|
||||||
result = strcmp(a->from->name, b->from->name);
|
result = strcmp(a->from->name, b->from->name);
|
||||||
|
|
||||||
if(result) {
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
|
||||||
|
|
||||||
return strcmp(a->to->name, b->to->name);
|
return strcmp(a->to->name, b->to->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_edges(void) {
|
void init_edges(void) {
|
||||||
edge_weight_tree = avl_alloc_tree((avl_compare_t) edge_weight_compare, NULL);
|
edge_weight_tree = splay_alloc_tree((splay_compare_t) edge_weight_compare, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
avl_tree_t *new_edge_tree(void) {
|
splay_tree_t *new_edge_tree(void) {
|
||||||
return avl_alloc_tree((avl_compare_t) edge_compare, (avl_action_t) free_edge);
|
return splay_alloc_tree((splay_compare_t) edge_compare, (splay_action_t) free_edge);
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_edge_tree(avl_tree_t *edge_tree) {
|
void free_edge_tree(splay_tree_t *edge_tree) {
|
||||||
avl_delete_tree(edge_tree);
|
splay_delete_tree(edge_tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
void exit_edges(void) {
|
void exit_edges(void) {
|
||||||
avl_delete_tree(edge_weight_tree);
|
splay_delete_tree(edge_weight_tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Creation and deletion of connection elements */
|
/* Creation and deletion of connection elements */
|
||||||
|
@ -81,23 +80,21 @@ void free_edge(edge_t *e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void edge_add(edge_t *e) {
|
void edge_add(edge_t *e) {
|
||||||
avl_insert(edge_weight_tree, e);
|
splay_insert(edge_weight_tree, e);
|
||||||
avl_insert(e->from->edge_tree, e);
|
splay_insert(e->from->edge_tree, e);
|
||||||
|
|
||||||
e->reverse = lookup_edge(e->to, e->from);
|
e->reverse = lookup_edge(e->to, e->from);
|
||||||
|
|
||||||
if(e->reverse) {
|
if(e->reverse)
|
||||||
e->reverse->reverse = e;
|
e->reverse->reverse = e;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void edge_del(edge_t *e) {
|
void edge_del(edge_t *e) {
|
||||||
if(e->reverse) {
|
if(e->reverse)
|
||||||
e->reverse->reverse = NULL;
|
e->reverse->reverse = NULL;
|
||||||
}
|
|
||||||
|
|
||||||
avl_delete(edge_weight_tree, e);
|
splay_delete(edge_weight_tree, e);
|
||||||
avl_delete(e->from->edge_tree, e);
|
splay_delete(e->from->edge_tree, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
edge_t *lookup_edge(node_t *from, node_t *to) {
|
edge_t *lookup_edge(node_t *from, node_t *to) {
|
||||||
|
@ -106,28 +103,27 @@ edge_t *lookup_edge(node_t *from, node_t *to) {
|
||||||
v.from = from;
|
v.from = from;
|
||||||
v.to = to;
|
v.to = to;
|
||||||
|
|
||||||
return avl_search(from->edge_tree, &v);
|
return splay_search(from->edge_tree, &v);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_edges(void) {
|
bool dump_edges(connection_t *c) {
|
||||||
avl_node_t *node, *node2;
|
splay_node_t *node, *node2;
|
||||||
node_t *n;
|
node_t *n;
|
||||||
edge_t *e;
|
edge_t *e;
|
||||||
char *address;
|
char *address;
|
||||||
|
|
||||||
logger(LOG_DEBUG, "Edges:");
|
|
||||||
|
|
||||||
for(node = node_tree->head; node; node = node->next) {
|
for(node = node_tree->head; node; node = node->next) {
|
||||||
n = node->data;
|
n = node->data;
|
||||||
|
|
||||||
for(node2 = n->edge_tree->head; node2; node2 = node2->next) {
|
for(node2 = n->edge_tree->head; node2; node2 = node2->next) {
|
||||||
e = node2->data;
|
e = node2->data;
|
||||||
address = sockaddr2hostname(&e->address);
|
address = sockaddr2hostname(&e->address);
|
||||||
logger(LOG_DEBUG, " %s to %s at %s options %x weight %d",
|
send_request(c, "%d %d %s to %s at %s options %x weight %d",
|
||||||
e->from->name, e->to->name, address, e->options, e->weight);
|
CONTROL, REQ_DUMP_EDGES,
|
||||||
|
e->from->name, e->to->name, address,
|
||||||
|
e->options, e->weight);
|
||||||
free(address);
|
free(address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logger(LOG_DEBUG, "End of edges.");
|
return send_request(c, "%d %d", CONTROL, REQ_DUMP_EDGES);
|
||||||
}
|
}
|
||||||
|
|
26
src/edge.h
26
src/edge.h
|
@ -1,6 +1,3 @@
|
||||||
#ifndef TINC_EDGE_H
|
|
||||||
#define TINC_EDGE_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
edge.h -- header for edge.c
|
edge.h -- header for edge.c
|
||||||
Copyright (C) 2001-2006 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2001-2006 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
|
@ -21,7 +18,10 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "avl_tree.h"
|
#ifndef __TINC_EDGE_H__
|
||||||
|
#define __TINC_EDGE_H__
|
||||||
|
|
||||||
|
#include "splay_tree.h"
|
||||||
#include "connection.h"
|
#include "connection.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
|
@ -38,17 +38,17 @@ typedef struct edge_t {
|
||||||
struct edge_t *reverse; /* edge in the opposite direction, if available */
|
struct edge_t *reverse; /* edge in the opposite direction, if available */
|
||||||
} edge_t;
|
} edge_t;
|
||||||
|
|
||||||
extern avl_tree_t *edge_weight_tree; /* Tree with all known edges sorted on weight */
|
extern splay_tree_t *edge_weight_tree; /* Tree with all known edges sorted on weight */
|
||||||
|
|
||||||
extern void init_edges(void);
|
extern void init_edges(void);
|
||||||
extern void exit_edges(void);
|
extern void exit_edges(void);
|
||||||
extern edge_t *new_edge(void) __attribute__ ((__malloc__));
|
extern edge_t *new_edge(void) __attribute__ ((__malloc__));
|
||||||
extern void free_edge(edge_t *e);
|
extern void free_edge(edge_t *);
|
||||||
extern avl_tree_t *new_edge_tree(void) __attribute__((__malloc__));
|
extern splay_tree_t *new_edge_tree(void) __attribute__ ((__malloc__));
|
||||||
extern void free_edge_tree(avl_tree_t *edge_tree);
|
extern void free_edge_tree(splay_tree_t *);
|
||||||
extern void edge_add(edge_t *e);
|
extern void edge_add(edge_t *);
|
||||||
extern void edge_del(edge_t *e);
|
extern void edge_del(edge_t *);
|
||||||
extern edge_t *lookup_edge(struct node_t *from, struct node_t *to);
|
extern edge_t *lookup_edge(struct node_t *, struct node_t *);
|
||||||
extern void dump_edges(void);
|
extern bool dump_edges(struct connection_t *);
|
||||||
|
|
||||||
#endif
|
#endif /* __TINC_EDGE_H__ */
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
#ifndef TINC_ETHERNET_H
|
|
||||||
#define TINC_ETHERNET_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ethernet.h -- missing Ethernet related definitions
|
ethernet.h -- missing Ethernet related definitions
|
||||||
Copyright (C) 2005 Ivo Timmermans
|
Copyright (C) 2005 Ivo Timmermans
|
||||||
|
@ -21,6 +18,9 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_ETHERNET_H__
|
||||||
|
#define __TINC_ETHERNET_H__
|
||||||
|
|
||||||
#ifndef ETH_ALEN
|
#ifndef ETH_ALEN
|
||||||
#define ETH_ALEN 6
|
#define ETH_ALEN 6
|
||||||
#endif
|
#endif
|
||||||
|
@ -41,10 +41,6 @@
|
||||||
#define ETH_P_IPV6 0x86DD
|
#define ETH_P_IPV6 0x86DD
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ETH_P_8021Q
|
|
||||||
#define ETH_P_8021Q 0x8100
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_STRUCT_ETHER_HEADER
|
#ifndef HAVE_STRUCT_ETHER_HEADER
|
||||||
struct ether_header {
|
struct ether_header {
|
||||||
uint8_t ether_dhost[ETH_ALEN];
|
uint8_t ether_dhost[ETH_ALEN];
|
||||||
|
@ -86,4 +82,4 @@ struct ether_arp {
|
||||||
#define arp_op ea_hdr.ar_op
|
#define arp_op ea_hdr.ar_op
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif /* __TINC_ETHERNET_H__ */
|
||||||
|
|
121
src/event.c
121
src/event.c
|
@ -1,121 +0,0 @@
|
||||||
/*
|
|
||||||
event.c -- event queue
|
|
||||||
Copyright (C) 2002-2009 Guus Sliepen <guus@tinc-vpn.org>,
|
|
||||||
2002-2005 Ivo Timmermans
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "system.h"
|
|
||||||
|
|
||||||
#include "avl_tree.h"
|
|
||||||
#include "event.h"
|
|
||||||
#include "utils.h"
|
|
||||||
#include "xalloc.h"
|
|
||||||
|
|
||||||
avl_tree_t *event_tree;
|
|
||||||
extern time_t now;
|
|
||||||
|
|
||||||
static int id;
|
|
||||||
|
|
||||||
static int event_compare(const event_t *a, const event_t *b) {
|
|
||||||
if(a->time > b->time) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(a->time < b->time) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return a->id - b->id;
|
|
||||||
}
|
|
||||||
|
|
||||||
void init_events(void) {
|
|
||||||
event_tree = avl_alloc_tree((avl_compare_t) event_compare, (avl_action_t) free_event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void exit_events(void) {
|
|
||||||
avl_delete_tree(event_tree);
|
|
||||||
}
|
|
||||||
|
|
||||||
void expire_events(void) {
|
|
||||||
avl_node_t *node;
|
|
||||||
event_t *event;
|
|
||||||
time_t diff;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make all events appear expired by subtracting the difference between
|
|
||||||
* the expiration time of the last event and the current time.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if(!event_tree->tail) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
event = event_tree->tail->data;
|
|
||||||
|
|
||||||
if(event->time <= now) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff = event->time - now;
|
|
||||||
|
|
||||||
for(node = event_tree->head; node; node = node->next) {
|
|
||||||
event = node->data;
|
|
||||||
event->time -= diff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
event_t *new_event(void) {
|
|
||||||
return xmalloc_and_zero(sizeof(event_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_event(event_t *event) {
|
|
||||||
free(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void event_add(event_t *event) {
|
|
||||||
event->id = ++id;
|
|
||||||
avl_insert(event_tree, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void event_del(event_t *event) {
|
|
||||||
avl_delete(event_tree, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
event_t *get_expired_event(void) {
|
|
||||||
event_t *event;
|
|
||||||
|
|
||||||
if(event_tree->head) {
|
|
||||||
event = event_tree->head->data;
|
|
||||||
|
|
||||||
if(event->time <= now) {
|
|
||||||
avl_node_t *node = event_tree->head;
|
|
||||||
avl_unlink_node(event_tree, node);
|
|
||||||
free(node);
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
event_t *peek_next_event(void) {
|
|
||||||
if(event_tree->head) {
|
|
||||||
return event_tree->head->data;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
19
src/fake-gai-errnos.h
Normal file
19
src/fake-gai-errnos.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* fake library for ssh
|
||||||
|
*
|
||||||
|
* This file is included in getaddrinfo.c and getnameinfo.c.
|
||||||
|
* See getaddrinfo.c and getnameinfo.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* for old netdb.h */
|
||||||
|
#ifndef EAI_NODATA
|
||||||
|
#define EAI_NODATA 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EAI_MEMORY
|
||||||
|
#define EAI_MEMORY 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EAI_FAMILY
|
||||||
|
#define EAI_FAMILY 3
|
||||||
|
#endif
|
|
@ -2,10 +2,10 @@
|
||||||
* fake library for ssh
|
* fake library for ssh
|
||||||
*
|
*
|
||||||
* This file includes getaddrinfo(), freeaddrinfo() and gai_strerror().
|
* This file includes getaddrinfo(), freeaddrinfo() and gai_strerror().
|
||||||
* These functions are defined in rfc2133.
|
* These funtions are defined in rfc2133.
|
||||||
*
|
*
|
||||||
* But these functions are not implemented correctly. The minimum subset
|
* But these functions are not implemented correctly. The minimum subset
|
||||||
* is implemented for ssh use only. For example, this routine assumes
|
* is implemented for ssh use only. For exapmle, this routine assumes
|
||||||
* that ai_family is AF_INET. Don't use it for another purpose.
|
* that ai_family is AF_INET. Don't use it for another purpose.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -16,18 +16,16 @@
|
||||||
#include "fake-getaddrinfo.h"
|
#include "fake-getaddrinfo.h"
|
||||||
#include "xalloc.h"
|
#include "xalloc.h"
|
||||||
|
|
||||||
|
|
||||||
#if !HAVE_DECL_GAI_STRERROR
|
#if !HAVE_DECL_GAI_STRERROR
|
||||||
char *gai_strerror(int ecode) {
|
char *gai_strerror(int ecode) {
|
||||||
switch (ecode) {
|
switch (ecode) {
|
||||||
case EAI_NODATA:
|
case EAI_NODATA:
|
||||||
return "No address associated with hostname";
|
return "No address associated with hostname";
|
||||||
|
|
||||||
case EAI_MEMORY:
|
case EAI_MEMORY:
|
||||||
return "Memory allocation failure";
|
return "Memory allocation failure";
|
||||||
|
|
||||||
case EAI_FAMILY:
|
case EAI_FAMILY:
|
||||||
return "Address family not supported";
|
return "Address family not supported";
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return "Unknown error";
|
return "Unknown error";
|
||||||
}
|
}
|
||||||
|
@ -69,13 +67,11 @@ int getaddrinfo(const char *hostname, const char *servname, const struct addrinf
|
||||||
int i;
|
int i;
|
||||||
uint16_t port = 0;
|
uint16_t port = 0;
|
||||||
|
|
||||||
if(hints && hints->ai_family != AF_INET && hints->ai_family != AF_UNSPEC) {
|
if(hints && hints->ai_family != AF_INET && hints->ai_family != AF_UNSPEC)
|
||||||
return EAI_FAMILY;
|
return EAI_FAMILY;
|
||||||
}
|
|
||||||
|
|
||||||
if(servname) {
|
if (servname)
|
||||||
port = htons(atoi(servname));
|
port = htons(atoi(servname));
|
||||||
}
|
|
||||||
|
|
||||||
if (hints && hints->ai_flags & AI_PASSIVE) {
|
if (hints && hints->ai_flags & AI_PASSIVE) {
|
||||||
*res = malloc_ai(port, htonl(0x00000000));
|
*res = malloc_ai(port, htonl(0x00000000));
|
||||||
|
@ -89,16 +85,14 @@ int getaddrinfo(const char *hostname, const char *servname, const struct addrinf
|
||||||
|
|
||||||
hp = gethostbyname(hostname);
|
hp = gethostbyname(hostname);
|
||||||
|
|
||||||
if(!hp || !hp->h_addr_list || !hp->h_addr_list[0]) {
|
if(!hp || !hp->h_addr_list || !hp->h_addr_list[0])
|
||||||
return EAI_NODATA;
|
return EAI_NODATA;
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; hp->h_addr_list[i]; i++) {
|
for (i = 0; hp->h_addr_list[i]; i++) {
|
||||||
*res = malloc_ai(port, ((struct in_addr *)hp->h_addr_list[i])->s_addr);
|
*res = malloc_ai(port, ((struct in_addr *)hp->h_addr_list[i])->s_addr);
|
||||||
|
|
||||||
if(prev) {
|
if(prev)
|
||||||
prev->ai_next = *res;
|
prev->ai_next = *res;
|
||||||
}
|
|
||||||
|
|
||||||
prev = *res;
|
prev = *res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,17 +1,7 @@
|
||||||
#ifndef TINC_FAKE_GETADDRINFO_H
|
#ifndef _FAKE_GETADDRINFO_H
|
||||||
#define TINC_FAKE_GETADDRINFO_H
|
#define _FAKE_GETADDRINFO_H
|
||||||
|
|
||||||
#ifndef EAI_NODATA
|
#include "fake-gai-errnos.h"
|
||||||
#define EAI_NODATA 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EAI_MEMORY
|
|
||||||
#define EAI_MEMORY 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EAI_FAMILY
|
|
||||||
#define EAI_FAMILY 3
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef AI_PASSIVE
|
#ifndef AI_PASSIVE
|
||||||
# define AI_PASSIVE 1
|
# define AI_PASSIVE 1
|
||||||
|
@ -54,4 +44,4 @@ char *gai_strerror(int ecode);
|
||||||
void freeaddrinfo(struct addrinfo *ai);
|
void freeaddrinfo(struct addrinfo *ai);
|
||||||
#endif /* !HAVE_FREEADDRINFO */
|
#endif /* !HAVE_FREEADDRINFO */
|
||||||
|
|
||||||
#endif
|
#endif /* _FAKE_GETADDRINFO_H */
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
* fake library for ssh
|
* fake library for ssh
|
||||||
*
|
*
|
||||||
* This file includes getnameinfo().
|
* This file includes getnameinfo().
|
||||||
* These functions are defined in rfc2133.
|
* These funtions are defined in rfc2133.
|
||||||
*
|
*
|
||||||
* But these functions are not implemented correctly. The minimum subset
|
* But these functions are not implemented correctly. The minimum subset
|
||||||
* is implemented for ssh use only. For example, this routine assumes
|
* is implemented for ssh use only. For exapmle, this routine assumes
|
||||||
* that ai_family is AF_INET. Don't use it for another purpose.
|
* that ai_family is AF_INET. Don't use it for another purpose.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -21,43 +21,33 @@ int getnameinfo(const struct sockaddr *sa, size_t salen, char *host, size_t host
|
||||||
struct hostent *hp;
|
struct hostent *hp;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if(sa->sa_family != AF_INET) {
|
if(sa->sa_family != AF_INET)
|
||||||
return EAI_FAMILY;
|
return EAI_FAMILY;
|
||||||
}
|
|
||||||
|
|
||||||
if(serv && servlen) {
|
if(serv && servlen) {
|
||||||
len = snprintf(serv, servlen, "%d", ntohs(sin->sin_port));
|
len = snprintf(serv, servlen, "%d", ntohs(sin->sin_port));
|
||||||
|
if(len < 0 || len >= servlen)
|
||||||
if(len < 0 || len >= servlen) {
|
|
||||||
return EAI_MEMORY;
|
return EAI_MEMORY;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if(!host || !hostlen) {
|
if(!host || !hostlen)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
if(flags & NI_NUMERICHOST) {
|
if(flags & NI_NUMERICHOST) {
|
||||||
len = snprintf(host, hostlen, "%s", inet_ntoa(sin->sin_addr));
|
len = snprintf(host, hostlen, "%s", inet_ntoa(sin->sin_addr));
|
||||||
|
if(len < 0 || len >= hostlen)
|
||||||
if(len < 0 || len >= hostlen) {
|
|
||||||
return EAI_MEMORY;
|
return EAI_MEMORY;
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
hp = gethostbyaddr((char *)&sin->sin_addr, sizeof(struct in_addr), AF_INET);
|
hp = gethostbyaddr((char *)&sin->sin_addr, sizeof(struct in_addr), AF_INET);
|
||||||
|
|
||||||
if(!hp || !hp->h_name || !hp->h_name[0]) {
|
if(!hp || !hp->h_name || !hp->h_name[0])
|
||||||
return EAI_NODATA;
|
return EAI_NODATA;
|
||||||
}
|
|
||||||
|
|
||||||
len = snprintf(host, hostlen, "%s", hp->h_name);
|
len = snprintf(host, hostlen, "%s", hp->h_name);
|
||||||
|
if(len < 0 || len >= hostlen)
|
||||||
if(len < 0 || len >= hostlen) {
|
|
||||||
return EAI_MEMORY;
|
return EAI_MEMORY;
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef TINC_FAKE_GETNAMEINFO_H
|
#ifndef _FAKE_GETNAMEINFO_H
|
||||||
#define TINC_FAKE_GETNAMEINFO_H
|
#define _FAKE_GETNAMEINFO_H
|
||||||
|
|
||||||
#if !HAVE_DECL_GETNAMEINFO
|
#if !HAVE_DECL_GETNAMEINFO
|
||||||
int getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
|
int getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
|
||||||
|
@ -13,4 +13,4 @@ int getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
|
||||||
# define NI_MAXHOST 1025
|
# define NI_MAXHOST 1025
|
||||||
#endif /* !NI_MAXHOST */
|
#endif /* !NI_MAXHOST */
|
||||||
|
|
||||||
#endif
|
#endif /* _FAKE_GETNAMEINFO_H */
|
||||||
|
|
280
src/gcrypt/cipher.c
Normal file
280
src/gcrypt/cipher.c
Normal file
|
@ -0,0 +1,280 @@
|
||||||
|
/*
|
||||||
|
cipher.c -- Symmetric block cipher handling
|
||||||
|
Copyright (C) 2007 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
|
|
||||||
|
#include "cipher.h"
|
||||||
|
#include "logger.h"
|
||||||
|
#include "xalloc.h"
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
const char *name;
|
||||||
|
int algo;
|
||||||
|
int mode;
|
||||||
|
int nid;
|
||||||
|
} ciphertable[] = {
|
||||||
|
{"none", GCRY_CIPHER_NONE, GCRY_CIPHER_MODE_NONE, 0},
|
||||||
|
|
||||||
|
{NULL, GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_ECB, 92},
|
||||||
|
{"blowfish", GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CBC, 91},
|
||||||
|
{NULL, GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CFB, 93},
|
||||||
|
{NULL, GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_OFB, 94},
|
||||||
|
|
||||||
|
{NULL, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_ECB, 418},
|
||||||
|
{"aes", GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CBC, 419},
|
||||||
|
{NULL, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CFB, 421},
|
||||||
|
{NULL, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_OFB, 420},
|
||||||
|
|
||||||
|
{NULL, GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_ECB, 422},
|
||||||
|
{"aes192", GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CBC, 423},
|
||||||
|
{NULL, GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_CFB, 425},
|
||||||
|
{NULL, GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_OFB, 424},
|
||||||
|
|
||||||
|
{NULL, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_ECB, 426},
|
||||||
|
{"aes256", GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC, 427},
|
||||||
|
{NULL, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CFB, 429},
|
||||||
|
{NULL, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_OFB, 428},
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool nametocipher(const char *name, int *algo, int *mode) {
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for(i = 0; i < sizeof ciphertable / sizeof *ciphertable; i++) {
|
||||||
|
if(ciphertable[i].name && !strcasecmp(name, ciphertable[i].name)) {
|
||||||
|
*algo = ciphertable[i].algo;
|
||||||
|
*mode = ciphertable[i].mode;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool nidtocipher(int nid, int *algo, int *mode) {
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for(i = 0; i < sizeof ciphertable / sizeof *ciphertable; i++) {
|
||||||
|
if(nid == ciphertable[i].nid) {
|
||||||
|
*algo = ciphertable[i].algo;
|
||||||
|
*mode = ciphertable[i].mode;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ciphertonid(int algo, int mode, int *nid) {
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for(i = 0; i < sizeof ciphertable / sizeof *ciphertable; i++) {
|
||||||
|
if(algo == ciphertable[i].algo && mode == ciphertable[i].mode) {
|
||||||
|
*nid = ciphertable[i].nid;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool cipher_open(cipher_t *cipher, int algo, int mode) {
|
||||||
|
gcry_error_t err;
|
||||||
|
|
||||||
|
if(!ciphertonid(algo, mode, &cipher->nid)) {
|
||||||
|
logger(LOG_DEBUG, "Cipher %d mode %d has no corresponding nid!", algo, mode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((err = gcry_cipher_open(&cipher->handle, algo, mode, 0))) {
|
||||||
|
logger(LOG_DEBUG, "Unable to intialise cipher %d mode %d: %s", algo, mode, gcry_strerror(err));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
cipher->keylen = gcry_cipher_get_algo_keylen(algo);
|
||||||
|
cipher->blklen = gcry_cipher_get_algo_blklen(algo);
|
||||||
|
cipher->key = xmalloc(cipher->keylen + cipher->blklen);
|
||||||
|
cipher->padding = mode == GCRY_CIPHER_MODE_ECB || mode == GCRY_CIPHER_MODE_CBC;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cipher_open_by_name(cipher_t *cipher, const char *name) {
|
||||||
|
int algo, mode;
|
||||||
|
|
||||||
|
if(!nametocipher(name, &algo, &mode)) {
|
||||||
|
logger(LOG_DEBUG, "Unknown cipher name '%s'!", name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cipher_open(cipher, algo, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cipher_open_by_nid(cipher_t *cipher, int nid) {
|
||||||
|
int algo, mode;
|
||||||
|
|
||||||
|
if(!nidtocipher(nid, &algo, &mode)) {
|
||||||
|
logger(LOG_DEBUG, "Unknown cipher ID %d!", nid);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cipher_open(cipher, algo, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cipher_open_blowfish_ofb(cipher_t *cipher) {
|
||||||
|
return cipher_open(cipher, GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_OFB);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cipher_close(cipher_t *cipher) {
|
||||||
|
if(cipher->handle) {
|
||||||
|
gcry_cipher_close(cipher->handle);
|
||||||
|
cipher->handle = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cipher->key) {
|
||||||
|
free(cipher->key);
|
||||||
|
cipher->key = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t cipher_keylength(const cipher_t *cipher) {
|
||||||
|
return cipher->keylen + cipher->blklen;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cipher_get_key(const cipher_t *cipher, void *key) {
|
||||||
|
memcpy(key, cipher->key, cipher->keylen + cipher->blklen);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cipher_set_key(cipher_t *cipher, void *key, bool encrypt) {
|
||||||
|
memcpy(cipher->key, key, cipher->keylen + cipher->blklen);
|
||||||
|
|
||||||
|
gcry_cipher_setkey(cipher->handle, cipher->key, cipher->keylen);
|
||||||
|
gcry_cipher_setiv(cipher->handle, cipher->key + cipher->keylen, cipher->blklen);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cipher_set_key_from_rsa(cipher_t *cipher, void *key, size_t len, bool encrypt) {
|
||||||
|
memcpy(cipher->key, key + len - cipher->keylen, cipher->keylen + cipher->blklen);
|
||||||
|
memcpy(cipher->key + cipher->keylen, key + len - cipher->keylen - cipher->blklen, cipher->blklen);
|
||||||
|
|
||||||
|
gcry_cipher_setkey(cipher->handle, cipher->key, cipher->keylen);
|
||||||
|
gcry_cipher_setiv(cipher->handle, cipher->key + cipher->keylen, cipher->blklen);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cipher_regenerate_key(cipher_t *cipher, bool encrypt) {
|
||||||
|
gcry_create_nonce(cipher->key, cipher->keylen + cipher->blklen);
|
||||||
|
|
||||||
|
gcry_cipher_setkey(cipher->handle, cipher->key, cipher->keylen);
|
||||||
|
gcry_cipher_setiv(cipher->handle, cipher->key + cipher->keylen, cipher->blklen);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cipher_encrypt(cipher_t *cipher, const void *indata, size_t inlen, void *outdata, size_t *outlen, bool oneshot) {
|
||||||
|
gcry_error_t err;
|
||||||
|
uint8_t pad[cipher->blklen];
|
||||||
|
|
||||||
|
if(cipher->padding) {
|
||||||
|
if(!oneshot)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
size_t reqlen = ((inlen + cipher->blklen) / cipher->blklen) * cipher->blklen;
|
||||||
|
|
||||||
|
if(*outlen < reqlen) {
|
||||||
|
logger(LOG_ERR, "Error while encrypting: not enough room for padding");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t padbyte = reqlen - inlen;
|
||||||
|
inlen = reqlen - cipher->blklen;
|
||||||
|
|
||||||
|
for(int i = 0; i < cipher->blklen; i++)
|
||||||
|
if(i < cipher->blklen - padbyte)
|
||||||
|
pad[i] = ((uint8_t *)indata)[inlen + i];
|
||||||
|
else
|
||||||
|
pad[i] = padbyte;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(oneshot)
|
||||||
|
gcry_cipher_setiv(cipher->handle, cipher->key + cipher->keylen, cipher->blklen);
|
||||||
|
|
||||||
|
if((err = gcry_cipher_encrypt(cipher->handle, outdata, *outlen, indata, inlen))) {
|
||||||
|
logger(LOG_ERR, "Error while encrypting: %s", gcry_strerror(err));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cipher->padding) {
|
||||||
|
if((err = gcry_cipher_encrypt(cipher->handle, outdata + inlen, cipher->blklen, pad, cipher->blklen))) {
|
||||||
|
logger(LOG_ERR, "Error while encrypting: %s", gcry_strerror(err));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inlen += cipher->blklen;
|
||||||
|
}
|
||||||
|
|
||||||
|
*outlen = inlen;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cipher_decrypt(cipher_t *cipher, const void *indata, size_t inlen, void *outdata, size_t *outlen, bool oneshot) {
|
||||||
|
gcry_error_t err;
|
||||||
|
|
||||||
|
if(oneshot)
|
||||||
|
gcry_cipher_setiv(cipher->handle, cipher->key + cipher->keylen, cipher->blklen);
|
||||||
|
|
||||||
|
if((err = gcry_cipher_decrypt(cipher->handle, outdata, *outlen, indata, inlen))) {
|
||||||
|
logger(LOG_ERR, "Error while decrypting: %s", gcry_strerror(err));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cipher->padding) {
|
||||||
|
if(!oneshot)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uint8_t padbyte = ((uint8_t *)outdata)[inlen - 1];
|
||||||
|
|
||||||
|
if(padbyte == 0 || padbyte > cipher->blklen || padbyte > inlen) {
|
||||||
|
logger(LOG_ERR, "Error while decrypting: invalid padding");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t origlen = inlen - padbyte;
|
||||||
|
|
||||||
|
for(int i = inlen - 1; i >= origlen; i--)
|
||||||
|
if(((uint8_t *)outdata)[i] != padbyte) {
|
||||||
|
logger(LOG_ERR, "Error while decrypting: invalid padding");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
*outlen = origlen;
|
||||||
|
} else
|
||||||
|
*outlen = inlen;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cipher_get_nid(const cipher_t *cipher) {
|
||||||
|
return cipher->nid;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cipher_active(const cipher_t *cipher) {
|
||||||
|
return cipher->nid != 0;
|
||||||
|
}
|
52
src/gcrypt/cipher.h
Normal file
52
src/gcrypt/cipher.h
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
cipher.h -- header file cipher.c
|
||||||
|
Copyright (C) 2007 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_CIPHER_H__
|
||||||
|
#define __TINC_CIPHER_H__
|
||||||
|
|
||||||
|
#include <gcrypt.h>
|
||||||
|
|
||||||
|
#define CIPHER_MAX_BLOCK_SIZE 32
|
||||||
|
#define CIPHER_MAX_IV_SIZE 16
|
||||||
|
#define CIPHER_MAX_KEY_SIZE 32
|
||||||
|
|
||||||
|
typedef struct cipher {
|
||||||
|
gcry_cipher_hd_t handle;
|
||||||
|
char *key;
|
||||||
|
int nid;
|
||||||
|
uint16_t keylen;
|
||||||
|
uint16_t blklen;
|
||||||
|
bool padding;
|
||||||
|
} cipher_t;
|
||||||
|
|
||||||
|
extern bool cipher_open_by_name(struct cipher *, const char *);
|
||||||
|
extern bool cipher_open_by_nid(struct cipher *, int);
|
||||||
|
extern bool cipher_open_blowfish_ofb(struct cipher *);
|
||||||
|
extern void cipher_close(struct cipher *);
|
||||||
|
extern size_t cipher_keylength(const struct cipher *);
|
||||||
|
extern void cipher_get_key(const struct cipher *, void *);
|
||||||
|
extern bool cipher_set_key(struct cipher *, void *, bool);
|
||||||
|
extern bool cipher_set_key_from_rsa(struct cipher *, void *, size_t, bool);
|
||||||
|
extern bool cipher_regenerate_key(struct cipher *, bool);
|
||||||
|
extern bool cipher_encrypt(struct cipher *, const void *indata, size_t inlen, void *outdata, size_t *outlen, bool oneshot);
|
||||||
|
extern bool cipher_decrypt(struct cipher *, const void *indata, size_t inlen, void *outdata, size_t *outlen, bool oneshot);
|
||||||
|
extern int cipher_get_nid(const struct cipher *);
|
||||||
|
extern bool cipher_active(const struct cipher *);
|
||||||
|
|
||||||
|
#endif
|
34
src/gcrypt/crypto.c
Normal file
34
src/gcrypt/crypto.c
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
crypto.c -- Cryptographic miscellaneous functions and initialisation
|
||||||
|
Copyright (C) 2007 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
|
|
||||||
|
#include <gcrypt.h>
|
||||||
|
|
||||||
|
#include "crypto.h"
|
||||||
|
|
||||||
|
void crypto_init() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void crypto_exit() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void randomize(void *out, size_t outlen) {
|
||||||
|
gcry_create_nonce(out, outlen);
|
||||||
|
}
|
27
src/gcrypt/crypto.h
Normal file
27
src/gcrypt/crypto.h
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
crypto.h -- header for crypto.c
|
||||||
|
Copyright (C) 2007 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_CRYPTO_H__
|
||||||
|
#define __TINC_CRYPTO_H__
|
||||||
|
|
||||||
|
extern void crypto_init();
|
||||||
|
extern void crypto_exit();
|
||||||
|
extern void randomize(void *, size_t);
|
||||||
|
|
||||||
|
#endif
|
173
src/gcrypt/digest.c
Normal file
173
src/gcrypt/digest.c
Normal file
|
@ -0,0 +1,173 @@
|
||||||
|
/*
|
||||||
|
digest.c -- Digest handling
|
||||||
|
Copyright (C) 2007 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
|
|
||||||
|
#include "digest.h"
|
||||||
|
#include "logger.h"
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
const char *name;
|
||||||
|
int algo;
|
||||||
|
int nid;
|
||||||
|
} digesttable[] = {
|
||||||
|
{"none", GCRY_MD_NONE, 0},
|
||||||
|
{"sha1", GCRY_MD_SHA1, 64},
|
||||||
|
{"sha256", GCRY_MD_SHA256, 672},
|
||||||
|
{"sha384", GCRY_MD_SHA384, 673},
|
||||||
|
{"sha512", GCRY_MD_SHA512, 674},
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool nametodigest(const char *name, int *algo) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 0; i < sizeof digesttable / sizeof *digesttable; i++) {
|
||||||
|
if(digesttable[i].name && !strcasecmp(name, digesttable[i].name)) {
|
||||||
|
*algo = digesttable[i].algo;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool nidtodigest(int nid, int *algo) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 0; i < sizeof digesttable / sizeof *digesttable; i++) {
|
||||||
|
if(nid == digesttable[i].nid) {
|
||||||
|
*algo = digesttable[i].algo;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool digesttonid(int algo, int *nid) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 0; i < sizeof digesttable / sizeof *digesttable; i++) {
|
||||||
|
if(algo == digesttable[i].algo) {
|
||||||
|
*nid = digesttable[i].nid;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool digest_open(digest_t *digest, int algo, int maclength) {
|
||||||
|
if(!digesttonid(algo, &digest->nid)) {
|
||||||
|
logger(LOG_DEBUG, "Digest %d has no corresponding nid!", algo);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int len = gcry_md_get_algo_dlen(algo);
|
||||||
|
|
||||||
|
if(maclength > len || maclength < 0)
|
||||||
|
digest->maclength = len;
|
||||||
|
else
|
||||||
|
digest->maclength = maclength;
|
||||||
|
|
||||||
|
digest->algo = algo;
|
||||||
|
digest->hmac = NULL;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool digest_open_by_name(digest_t *digest, const char *name, int maclength) {
|
||||||
|
int algo;
|
||||||
|
|
||||||
|
if(!nametodigest(name, &algo)) {
|
||||||
|
logger(LOG_DEBUG, "Unknown digest name '%s'!", name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return digest_open(digest, algo, maclength);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool digest_open_by_nid(digest_t *digest, int nid, int maclength) {
|
||||||
|
int algo;
|
||||||
|
|
||||||
|
if(!nidtodigest(nid, &algo)) {
|
||||||
|
logger(LOG_DEBUG, "Unknown digest ID %d!", nid);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return digest_open(digest, algo, maclength);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool digest_open_sha1(digest_t *digest, int maclength) {
|
||||||
|
return digest_open(digest, GCRY_MD_SHA1, maclength);
|
||||||
|
}
|
||||||
|
|
||||||
|
void digest_close(digest_t *digest) {
|
||||||
|
if(digest->hmac)
|
||||||
|
gcry_md_close(digest->hmac);
|
||||||
|
digest->hmac = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool digest_set_key(digest_t *digest, const void *key, size_t len) {
|
||||||
|
if(!digest->hmac)
|
||||||
|
gcry_md_open(&digest->hmac, digest->algo, GCRY_MD_FLAG_HMAC);
|
||||||
|
if(!digest->hmac)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return !gcry_md_setkey(digest->hmac, key, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool digest_create(digest_t *digest, const void *indata, size_t inlen, void *outdata) {
|
||||||
|
unsigned int len = gcry_md_get_algo_dlen(digest->algo);
|
||||||
|
|
||||||
|
if(digest->hmac) {
|
||||||
|
char *tmpdata;
|
||||||
|
gcry_md_reset(digest->hmac);
|
||||||
|
gcry_md_write(digest->hmac, indata, inlen);
|
||||||
|
tmpdata = gcry_md_read(digest->hmac, digest->algo);
|
||||||
|
if(!tmpdata)
|
||||||
|
return false;
|
||||||
|
memcpy(outdata, tmpdata, digest->maclength);
|
||||||
|
} else {
|
||||||
|
char tmpdata[len];
|
||||||
|
gcry_md_hash_buffer(digest->algo, tmpdata, indata, inlen);
|
||||||
|
memcpy(outdata, tmpdata, digest->maclength);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool digest_verify(digest_t *digest, const void *indata, size_t inlen, const void *cmpdata) {
|
||||||
|
unsigned int len = digest->maclength;
|
||||||
|
char outdata[len];
|
||||||
|
|
||||||
|
return digest_create(digest, indata, inlen, outdata) && !memcmp(cmpdata, outdata, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
int digest_get_nid(const digest_t *digest) {
|
||||||
|
return digest->nid;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t digest_length(const digest_t *digest) {
|
||||||
|
return digest->maclength;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool digest_active(const digest_t *digest) {
|
||||||
|
return digest->algo != GCRY_MD_NONE;
|
||||||
|
}
|
45
src/gcrypt/digest.h
Normal file
45
src/gcrypt/digest.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
digest.h -- header file digest.c
|
||||||
|
Copyright (C) 2007 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_DIGEST_H__
|
||||||
|
#define __TINC_DIGEST_H__
|
||||||
|
|
||||||
|
#include <gcrypt.h>
|
||||||
|
|
||||||
|
#define DIGEST_MAX_SIZE 64
|
||||||
|
|
||||||
|
typedef struct digest {
|
||||||
|
int algo;
|
||||||
|
int nid;
|
||||||
|
int maclength;
|
||||||
|
gcry_md_hd_t hmac;
|
||||||
|
} digest_t;
|
||||||
|
|
||||||
|
extern bool digest_open_by_name(struct digest *, const char *name, int maclength);
|
||||||
|
extern bool digest_open_by_nid(struct digest *, int nid, int maclength);
|
||||||
|
extern bool digest_open_sha1(struct digest *, int maclength);
|
||||||
|
extern void digest_close(struct digest *);
|
||||||
|
extern bool digest_create(struct digest *, const void *indata, size_t inlen, void *outdata);
|
||||||
|
extern bool digest_verify(struct digest *, const void *indata, size_t inlen, const void *digestdata);
|
||||||
|
extern bool digest_set_key(struct digest *, const void *key, size_t len);
|
||||||
|
extern int digest_get_nid(const struct digest *);
|
||||||
|
extern size_t digest_length(const struct digest *);
|
||||||
|
extern bool digest_active(const struct digest *);
|
||||||
|
|
||||||
|
#endif
|
302
src/gcrypt/rsa.c
Normal file
302
src/gcrypt/rsa.c
Normal file
|
@ -0,0 +1,302 @@
|
||||||
|
/*
|
||||||
|
rsa.c -- RSA key handling
|
||||||
|
Copyright (C) 2007 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
|
|
||||||
|
#include <gcrypt.h>
|
||||||
|
|
||||||
|
#include "logger.h"
|
||||||
|
#include "rsa.h"
|
||||||
|
|
||||||
|
// Base64 decoding table
|
||||||
|
|
||||||
|
static const uint8_t b64d[128] = {
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f,
|
||||||
|
0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
|
||||||
|
0x3a, 0x3b, 0x3c, 0x3d, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
|
||||||
|
0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
|
||||||
|
0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
|
||||||
|
0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
|
||||||
|
0x19, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e,
|
||||||
|
0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
|
||||||
|
0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
|
||||||
|
0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
|
||||||
|
0x31, 0x32, 0x33, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff
|
||||||
|
};
|
||||||
|
|
||||||
|
// PEM encoding/decoding functions
|
||||||
|
|
||||||
|
static bool pem_decode(FILE *fp, const char *header, uint8_t *buf, size_t size, size_t *outsize) {
|
||||||
|
bool decode = false;
|
||||||
|
char line[1024];
|
||||||
|
uint16_t word = 0;
|
||||||
|
int shift = 10;
|
||||||
|
size_t i, j = 0;
|
||||||
|
|
||||||
|
while(!feof(fp)) {
|
||||||
|
if(!fgets(line, sizeof line, fp))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(!decode && !strncmp(line, "-----BEGIN ", 11)) {
|
||||||
|
if(!strncmp(line + 11, header, strlen(header)))
|
||||||
|
decode = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(decode && !strncmp(line, "-----END", 8)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!decode)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for(i = 0; line[i] >= ' '; i++) {
|
||||||
|
if((signed char)line[i] < 0 || b64d[(int)line[i]] == 0xff)
|
||||||
|
break;
|
||||||
|
word |= b64d[(int)line[i]] << shift;
|
||||||
|
shift -= 6;
|
||||||
|
if(shift <= 2) {
|
||||||
|
if(j > size) {
|
||||||
|
errno = ENOMEM;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[j++] = word >> 8;
|
||||||
|
word <<= 8;
|
||||||
|
shift += 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(outsize)
|
||||||
|
*outsize = j;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// BER decoding functions
|
||||||
|
|
||||||
|
static int ber_read_id(unsigned char **p, size_t *buflen) {
|
||||||
|
if(*buflen <= 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if((**p & 0x1f) == 0x1f) {
|
||||||
|
int id = 0;
|
||||||
|
bool more;
|
||||||
|
while(*buflen > 0) {
|
||||||
|
id <<= 7;
|
||||||
|
id |= **p & 0x7f;
|
||||||
|
more = *(*p)++ & 0x80;
|
||||||
|
(*buflen)--;
|
||||||
|
if(!more)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return id;
|
||||||
|
} else {
|
||||||
|
(*buflen)--;
|
||||||
|
return *(*p)++ & 0x1f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t ber_read_len(unsigned char **p, size_t *buflen) {
|
||||||
|
if(*buflen <= 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if(**p & 0x80) {
|
||||||
|
size_t result = 0;
|
||||||
|
int len = *(*p)++ & 0x7f;
|
||||||
|
(*buflen)--;
|
||||||
|
if(len > *buflen)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while(len--) {
|
||||||
|
result <<= 8;
|
||||||
|
result |= *(*p)++;
|
||||||
|
(*buflen)--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
(*buflen)--;
|
||||||
|
return *(*p)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool ber_read_sequence(unsigned char **p, size_t *buflen, size_t *result) {
|
||||||
|
int tag = ber_read_id(p, buflen);
|
||||||
|
size_t len = ber_read_len(p, buflen);
|
||||||
|
|
||||||
|
if(tag == 0x10) {
|
||||||
|
if(result)
|
||||||
|
*result = len;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ber_read_mpi(unsigned char **p, size_t *buflen, gcry_mpi_t *mpi) {
|
||||||
|
int tag = ber_read_id(p, buflen);
|
||||||
|
size_t len = ber_read_len(p, buflen);
|
||||||
|
gcry_error_t err = 0;
|
||||||
|
|
||||||
|
if(tag != 0x02 || len > *buflen)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(mpi)
|
||||||
|
err = gcry_mpi_scan(mpi, GCRYMPI_FMT_USG, *p, len, NULL);
|
||||||
|
|
||||||
|
*p += len;
|
||||||
|
*buflen -= len;
|
||||||
|
|
||||||
|
return mpi ? !err : true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rsa_set_hex_public_key(rsa_t *rsa, char *n, char *e) {
|
||||||
|
gcry_error_t err = 0;
|
||||||
|
|
||||||
|
err = gcry_mpi_scan(&rsa->n, GCRYMPI_FMT_HEX, n, 0, NULL)
|
||||||
|
?: gcry_mpi_scan(&rsa->e, GCRYMPI_FMT_HEX, e, 0, NULL);
|
||||||
|
|
||||||
|
if(err) {
|
||||||
|
logger(LOG_ERR, "Error while reading RSA public key: %s", gcry_strerror(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rsa_set_hex_private_key(rsa_t *rsa, char *n, char *e, char *d) {
|
||||||
|
gcry_error_t err = 0;
|
||||||
|
|
||||||
|
err = gcry_mpi_scan(&rsa->n, GCRYMPI_FMT_HEX, n, 0, NULL)
|
||||||
|
?: gcry_mpi_scan(&rsa->e, GCRYMPI_FMT_HEX, e, 0, NULL)
|
||||||
|
?: gcry_mpi_scan(&rsa->d, GCRYMPI_FMT_HEX, d, 0, NULL);
|
||||||
|
|
||||||
|
if(err) {
|
||||||
|
logger(LOG_ERR, "Error while reading RSA public key: %s", gcry_strerror(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read PEM RSA keys
|
||||||
|
|
||||||
|
bool rsa_read_pem_public_key(rsa_t *rsa, FILE *fp) {
|
||||||
|
uint8_t derbuf[8096], *derp = derbuf;
|
||||||
|
size_t derlen;
|
||||||
|
|
||||||
|
if(!pem_decode(fp, "RSA PUBLIC KEY", derbuf, sizeof derbuf, &derlen)) {
|
||||||
|
logger(LOG_ERR, "Unable to read RSA public key: %s", strerror(errno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!ber_read_sequence(&derp, &derlen, NULL)
|
||||||
|
|| !ber_read_mpi(&derp, &derlen, &rsa->n)
|
||||||
|
|| !ber_read_mpi(&derp, &derlen, &rsa->e)
|
||||||
|
|| derlen) {
|
||||||
|
logger(LOG_ERR, "Error while decoding RSA public key");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rsa_read_pem_private_key(rsa_t *rsa, FILE *fp) {
|
||||||
|
uint8_t derbuf[8096], *derp = derbuf;
|
||||||
|
size_t derlen;
|
||||||
|
|
||||||
|
if(!pem_decode(fp, "RSA PRIVATE KEY", derbuf, sizeof derbuf, &derlen)) {
|
||||||
|
logger(LOG_ERR, "Unable to read RSA private key: %s", strerror(errno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!ber_read_sequence(&derp, &derlen, NULL)
|
||||||
|
|| !ber_read_mpi(&derp, &derlen, NULL)
|
||||||
|
|| !ber_read_mpi(&derp, &derlen, &rsa->n)
|
||||||
|
|| !ber_read_mpi(&derp, &derlen, &rsa->e)
|
||||||
|
|| !ber_read_mpi(&derp, &derlen, &rsa->d)
|
||||||
|
|| !ber_read_mpi(&derp, &derlen, NULL) // p
|
||||||
|
|| !ber_read_mpi(&derp, &derlen, NULL) // q
|
||||||
|
|| !ber_read_mpi(&derp, &derlen, NULL)
|
||||||
|
|| !ber_read_mpi(&derp, &derlen, NULL)
|
||||||
|
|| !ber_read_mpi(&derp, &derlen, NULL) // u
|
||||||
|
|| derlen) {
|
||||||
|
logger(LOG_ERR, "Error while decoding RSA private key");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t rsa_size(rsa_t *rsa) {
|
||||||
|
return (gcry_mpi_get_nbits(rsa->n) + 7) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Well, libgcrypt has functions to handle RSA keys, but they suck.
|
||||||
|
* So we just use libgcrypt's mpi functions, and do the math ourselves.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TODO: get rid of this macro, properly clean up gcry_ structures after use
|
||||||
|
#define check(foo) { gcry_error_t err = (foo); if(err) {logger(LOG_ERR, "gcrypt error %s/%s at %s:%d", gcry_strsource(err), gcry_strerror(err), __FILE__, __LINE__); return false; }}
|
||||||
|
|
||||||
|
bool rsa_public_encrypt(rsa_t *rsa, void *in, size_t len, void *out) {
|
||||||
|
gcry_mpi_t inmpi;
|
||||||
|
check(gcry_mpi_scan(&inmpi, GCRYMPI_FMT_USG, in, len, NULL));
|
||||||
|
|
||||||
|
gcry_mpi_t outmpi = gcry_mpi_new(len * 8);
|
||||||
|
gcry_mpi_powm(outmpi, inmpi, rsa->e, rsa->n);
|
||||||
|
|
||||||
|
int pad = len - (gcry_mpi_get_nbits(outmpi) + 7) / 8;
|
||||||
|
while(pad--)
|
||||||
|
*(char *)out++ = 0;
|
||||||
|
|
||||||
|
check(gcry_mpi_print(GCRYMPI_FMT_USG, out,len, NULL, outmpi));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rsa_private_decrypt(rsa_t *rsa, void *in, size_t len, void *out) {
|
||||||
|
gcry_mpi_t inmpi;
|
||||||
|
check(gcry_mpi_scan(&inmpi, GCRYMPI_FMT_USG, in, len, NULL));
|
||||||
|
|
||||||
|
gcry_mpi_t outmpi = gcry_mpi_new(len * 8);
|
||||||
|
gcry_mpi_powm(outmpi, inmpi, rsa->d, rsa->n);
|
||||||
|
|
||||||
|
int pad = len - (gcry_mpi_get_nbits(outmpi) + 7) / 8;
|
||||||
|
while(pad--)
|
||||||
|
*(char *)out++ = 0;
|
||||||
|
|
||||||
|
check(gcry_mpi_print(GCRYMPI_FMT_USG, out,len, NULL, outmpi));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
39
src/gcrypt/rsa.h
Normal file
39
src/gcrypt/rsa.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
rsa.h -- RSA key handling
|
||||||
|
Copyright (C) 2007 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_RSA_H__
|
||||||
|
#define __TINC_RSA_H__
|
||||||
|
|
||||||
|
#include <gcrypt.h>
|
||||||
|
|
||||||
|
typedef struct rsa {
|
||||||
|
gcry_mpi_t n;
|
||||||
|
gcry_mpi_t e;
|
||||||
|
gcry_mpi_t d;
|
||||||
|
} rsa_t;
|
||||||
|
|
||||||
|
extern bool rsa_set_hex_public_key(rsa_t *rsa, char *n, char *e);
|
||||||
|
extern bool rsa_set_hex_private_key(rsa_t *rsa, char *n, char *e, char *d);
|
||||||
|
extern bool rsa_read_pem_public_key(rsa_t *rsa, FILE *fp);
|
||||||
|
extern bool rsa_read_pem_private_key(rsa_t *rsa, FILE *fp);
|
||||||
|
extern size_t rsa_size(rsa_t *rsa);
|
||||||
|
extern bool rsa_public_encrypt(rsa_t *rsa, void *in, size_t len, void *out);
|
||||||
|
extern bool rsa_private_decrypt(rsa_t *rsa, void *in, size_t len, void *out);
|
||||||
|
|
||||||
|
#endif
|
220
src/gcrypt/rsagen.c
Normal file
220
src/gcrypt/rsagen.c
Normal file
|
@ -0,0 +1,220 @@
|
||||||
|
/*
|
||||||
|
rsagen.c -- RSA key generation and export
|
||||||
|
Copyright (C) 2008 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
|
|
||||||
|
#include <gcrypt.h>
|
||||||
|
|
||||||
|
#include "rsagen.h"
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// Base64 encoding table
|
||||||
|
|
||||||
|
static const char b64e[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
|
|
||||||
|
// PEM encoding
|
||||||
|
|
||||||
|
static bool pem_encode(FILE *fp, const char *header, uint8_t *buf, size_t size) {
|
||||||
|
bool decode = false;
|
||||||
|
char line[1024];
|
||||||
|
uint32_t word = 0;
|
||||||
|
int shift = 0;
|
||||||
|
size_t i, j = 0;
|
||||||
|
|
||||||
|
fprintf(fp, "-----BEGIN %s-----\n", header);
|
||||||
|
|
||||||
|
for(i = 0; i < size; i += 3) {
|
||||||
|
if(i <= size - 3) {
|
||||||
|
word = buf[i] << 16 | buf[i + 1] << 8 | buf[i + 2];
|
||||||
|
} else {
|
||||||
|
word = buf[i] << 16;
|
||||||
|
if(i == size - 2)
|
||||||
|
word |= buf[i + 1] << 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
line[j++] = b64e[(word >> 18) ];
|
||||||
|
line[j++] = b64e[(word >> 12) & 0x3f];
|
||||||
|
line[j++] = b64e[(word >> 6) & 0x3f];
|
||||||
|
line[j++] = b64e[(word ) & 0x3f];
|
||||||
|
|
||||||
|
if(j >= 64) {
|
||||||
|
line[j++] = '\n';
|
||||||
|
line[j] = 0;
|
||||||
|
fputs(line, fp);
|
||||||
|
j = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(size % 3 > 0) {
|
||||||
|
if(size % 3 > 1)
|
||||||
|
line[j++] = '=';
|
||||||
|
line[j++] = '=';
|
||||||
|
}
|
||||||
|
|
||||||
|
if(j) {
|
||||||
|
line[j++] = '\n';
|
||||||
|
line[j] = 0;
|
||||||
|
fputs(line, fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fp, "-----END %s-----\n", header);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// BER encoding functions
|
||||||
|
|
||||||
|
static bool ber_write_id(uint8_t **p, size_t *buflen, int id) {
|
||||||
|
if(*buflen <= 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(id >= 0x1f) {
|
||||||
|
while(id) {
|
||||||
|
if(*buflen <= 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
(*buflen)--;
|
||||||
|
**p = id & 0x7f;
|
||||||
|
id >>= 7;
|
||||||
|
if(id)
|
||||||
|
**p |= 0x80;
|
||||||
|
(*p)++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
(*buflen)--;
|
||||||
|
*(*p)++ = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ber_write_len(uint8_t **p, size_t *buflen, size_t len) {
|
||||||
|
do {
|
||||||
|
if(*buflen <= 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
(*buflen)--;
|
||||||
|
**p = len & 0x7f;
|
||||||
|
len >>= 7;
|
||||||
|
if(len)
|
||||||
|
**p |= 0x80;
|
||||||
|
(*p)++;
|
||||||
|
} while(len);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ber_write_sequence(uint8_t **p, size_t *buflen, uint8_t *seqbuf, size_t seqlen) {
|
||||||
|
if(!ber_write_id(p, buflen, 0x10) || !ber_write_len(p, buflen, seqlen) || *buflen < seqlen)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
memcpy(*p, seqbuf, seqlen);
|
||||||
|
*p += seqlen;
|
||||||
|
*buflen -= seqlen;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ber_write_mpi(uint8_t **p, size_t *buflen, gcry_mpi_t mpi) {
|
||||||
|
uint8_t tmpbuf[1024];
|
||||||
|
size_t tmplen = sizeof tmpbuf;
|
||||||
|
gcry_error_t err;
|
||||||
|
|
||||||
|
err = gcry_mpi_aprint(GCRYMPI_FMT_USG, &tmpbuf, &tmplen, mpi);
|
||||||
|
if(err)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(!ber_write_id(p, buflen, 0x02) || !ber_write_len(p, buflen, tmplen) || *buflen < tmplen)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
memcpy(*p, tmpbuf, tmplen);
|
||||||
|
*p += tmplen;
|
||||||
|
*buflen -= tmplen;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write PEM RSA keys
|
||||||
|
|
||||||
|
bool rsa_write_pem_public_key(rsa_t *rsa, FILE *fp) {
|
||||||
|
uint8_t derbuf1[8096];
|
||||||
|
uint8_t derbuf2[8096];
|
||||||
|
uint8_t *derp1 = derbuf1;
|
||||||
|
uint8_t *derp2 = derbuf2;
|
||||||
|
size_t derlen1 = sizeof derbuf1;
|
||||||
|
size_t derlen2 = sizeof derbuf2;
|
||||||
|
|
||||||
|
if(!ber_write_mpi(&derp1, &derlen1, &rsa->n)
|
||||||
|
|| !ber_write_mpi(&derp1, &derlen1, &rsa->e)
|
||||||
|
|| !ber_write_sequence(&derp2, &derlen2, derbuf1, derlen1)) {
|
||||||
|
logger(LOG_ERR, "Error while encoding RSA public key");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!pem_encode(fp, "RSA PUBLIC KEY", derbuf2, derlen2)) {
|
||||||
|
logger(LOG_ERR, "Unable to write RSA public key: %s", strerror(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rsa_write_pem_private_key(rsa_t *rsa, FILE *fp) {
|
||||||
|
uint8_t derbuf1[8096];
|
||||||
|
uint8_t derbuf2[8096];
|
||||||
|
uint8_t *derp1 = derbuf1;
|
||||||
|
uint8_t *derp2 = derbuf2;
|
||||||
|
size_t derlen1 = sizeof derbuf1;
|
||||||
|
size_t derlen2 = sizeof derbuf2;
|
||||||
|
|
||||||
|
if(!ber_write_mpi(&derp1, &derlen1, &bits)
|
||||||
|
|| ber_write_mpi(&derp1, &derlen1, &rsa->n) // modulus
|
||||||
|
|| ber_write_mpi(&derp1, &derlen1, &rsa->e) // public exponent
|
||||||
|
|| ber_write_mpi(&derp1, &derlen1, &rsa->d) // private exponent
|
||||||
|
|| ber_write_mpi(&derp1, &derlen1, &p)
|
||||||
|
|| ber_write_mpi(&derp1, &derlen1, &q)
|
||||||
|
|| ber_write_mpi(&derp1, &derlen1, &exp1)
|
||||||
|
|| ber_write_mpi(&derp1, &derlen1, &exp2)
|
||||||
|
|| ber_write_mpi(&derp1, &derlen1, &coeff))
|
||||||
|
logger(LOG_ERR, "Error while encoding RSA private key");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!pem_encode(fp, "RSA PRIVATE KEY", derbuf2, derlen2)) {
|
||||||
|
logger(LOG_ERR, "Unable to write RSA private key: %s", strerror(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool rsa_write_pem_public_key(rsa_t *rsa, FILE *fp) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rsa_write_pem_private_key(rsa_t *rsa, FILE *fp) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rsa_generate(rsa_t *rsa, size_t bits, unsigned long exponent) {
|
||||||
|
fprintf(stderr, "Generating RSA keys with libgcrypt not implemented yet\n");
|
||||||
|
return false;
|
||||||
|
}
|
29
src/gcrypt/rsagen.h
Normal file
29
src/gcrypt/rsagen.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
rsagen.h -- RSA key generation and export
|
||||||
|
Copyright (C) 2008 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_RSAGEN_H__
|
||||||
|
#define __TINC_RSAGEN_H__
|
||||||
|
|
||||||
|
#include "rsa.h"
|
||||||
|
|
||||||
|
extern bool rsa_generate(rsa_t *rsa, size_t bits, unsigned long exponent);
|
||||||
|
extern bool rsa_write_pem_public_key(rsa_t *rsa, FILE *fp);
|
||||||
|
extern bool rsa_write_pem_private_key(rsa_t *rsa, FILE *fp);
|
||||||
|
|
||||||
|
#endif
|
393
src/getopt.c
393
src/getopt.c
|
@ -31,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include "../config.h"
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined (__STDC__) || !__STDC__
|
#if !defined (__STDC__) || !__STDC__
|
||||||
|
@ -132,7 +132,7 @@ int optind = 1;
|
||||||
causes problems with re-calling getopt as programs generally don't
|
causes problems with re-calling getopt as programs generally don't
|
||||||
know that. */
|
know that. */
|
||||||
|
|
||||||
int getopt_initialized = 0;
|
int __getopt_initialized = 0;
|
||||||
|
|
||||||
/* The next char to be scanned in the option-element
|
/* The next char to be scanned in the option-element
|
||||||
in which the last option character we returned was found.
|
in which the last option character we returned was found.
|
||||||
|
@ -183,7 +183,8 @@ int optopt = '?';
|
||||||
of the value of `ordering'. In the case of RETURN_IN_ORDER, only
|
of the value of `ordering'. In the case of RETURN_IN_ORDER, only
|
||||||
`--' can cause `getopt' to return -1 with `optind' != ARGC. */
|
`--' can cause `getopt' to return -1 with `optind' != ARGC. */
|
||||||
|
|
||||||
static enum {
|
static enum
|
||||||
|
{
|
||||||
REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
|
REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
|
||||||
} ordering;
|
} ordering;
|
||||||
|
|
||||||
|
@ -209,14 +210,12 @@ my_index(str, chr)
|
||||||
const char *str;
|
const char *str;
|
||||||
int chr;
|
int chr;
|
||||||
{
|
{
|
||||||
while(*str) {
|
while (*str)
|
||||||
if(*str == chr) {
|
{
|
||||||
|
if (*str == chr)
|
||||||
return (char *) str;
|
return (char *) str;
|
||||||
}
|
|
||||||
|
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -248,7 +247,7 @@ static int last_nonopt;
|
||||||
indicating ARGV elements that should not be considered arguments. */
|
indicating ARGV elements that should not be considered arguments. */
|
||||||
|
|
||||||
/* Defined in getopt_init.c */
|
/* Defined in getopt_init.c */
|
||||||
extern char *getopt_nonoption_flags;
|
extern char *__getopt_nonoption_flags;
|
||||||
|
|
||||||
static int nonoption_flags_max_len;
|
static int nonoption_flags_max_len;
|
||||||
static int nonoption_flags_len;
|
static int nonoption_flags_len;
|
||||||
|
@ -256,27 +255,28 @@ static int nonoption_flags_len;
|
||||||
static int original_argc;
|
static int original_argc;
|
||||||
static char *const *original_argv;
|
static char *const *original_argv;
|
||||||
|
|
||||||
extern pid_t libc_pid;
|
extern pid_t __libc_pid;
|
||||||
|
|
||||||
/* Make sure the environment variable bash 2.0 puts in the environment
|
/* 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
|
is valid for the getopt call we must make sure that the ARGV passed
|
||||||
to getopt is that one passed to the process. */
|
to getopt is that one passed to the process. */
|
||||||
static void
|
static void
|
||||||
__attribute__ ((__unused__))
|
__attribute__ ((__unused__))
|
||||||
store_args_and_env(int argc, char *const *argv) {
|
store_args_and_env (int argc, char *const *argv)
|
||||||
|
{
|
||||||
/* XXX This is no good solution. We should rather copy the args so
|
/* 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). */
|
that we can compare them later. But we must not use malloc(3). */
|
||||||
original_argc = argc;
|
original_argc = argc;
|
||||||
original_argv = argv;
|
original_argv = argv;
|
||||||
}
|
}
|
||||||
text_set_element(libc_subinit, store_args_and_env);
|
text_set_element (__libc_subinit, store_args_and_env);
|
||||||
|
|
||||||
# define SWAP_FLAGS(ch1, ch2) \
|
# define SWAP_FLAGS(ch1, ch2) \
|
||||||
if (nonoption_flags_len > 0) \
|
if (nonoption_flags_len > 0) \
|
||||||
{ \
|
{ \
|
||||||
char tmp = getopt_nonoption_flags[ch1]; \
|
char __tmp = __getopt_nonoption_flags[ch1]; \
|
||||||
getopt_nonoption_flags[ch1] = getopt_nonoption_flags[ch2]; \
|
__getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
|
||||||
getopt_nonoption_flags[ch2] = tmp; \
|
__getopt_nonoption_flags[ch2] = __tmp; \
|
||||||
}
|
}
|
||||||
#else /* !_LIBC */
|
#else /* !_LIBC */
|
||||||
# define SWAP_FLAGS(ch1, ch2)
|
# define SWAP_FLAGS(ch1, ch2)
|
||||||
|
@ -310,57 +310,60 @@ char **argv;
|
||||||
but it consists of two parts that need to be swapped next. */
|
but it consists of two parts that need to be swapped next. */
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
|
/* First make sure the handling of the `__getopt_nonoption_flags'
|
||||||
/* First make sure the handling of the `getopt_nonoption_flags'
|
|
||||||
string can work normally. Our top argument must be in the range
|
string can work normally. Our top argument must be in the range
|
||||||
of the string. */
|
of the string. */
|
||||||
if(nonoption_flags_len > 0 && top >= nonoption_flags_max_len) {
|
if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
|
||||||
|
{
|
||||||
/* We must extend the array. The user plays games with us and
|
/* We must extend the array. The user plays games with us and
|
||||||
presents new arguments. */
|
presents new arguments. */
|
||||||
char *new_str = malloc (top + 1);
|
char *new_str = malloc (top + 1);
|
||||||
|
if (new_str == NULL)
|
||||||
if(new_str == NULL) {
|
|
||||||
nonoption_flags_len = nonoption_flags_max_len = 0;
|
nonoption_flags_len = nonoption_flags_max_len = 0;
|
||||||
} else {
|
else
|
||||||
memcpy(new_str, getopt_nonoption_flags, nonoption_flags_max_len);
|
{
|
||||||
|
memcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len);
|
||||||
memset (&new_str[nonoption_flags_max_len], '\0',
|
memset (&new_str[nonoption_flags_max_len], '\0',
|
||||||
top + 1 - nonoption_flags_max_len);
|
top + 1 - nonoption_flags_max_len);
|
||||||
nonoption_flags_max_len = top + 1;
|
nonoption_flags_max_len = top + 1;
|
||||||
getopt_nonoption_flags = new_str;
|
__getopt_nonoption_flags = new_str;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while(top > middle && middle > bottom) {
|
while (top > middle && middle > bottom)
|
||||||
if(top - middle > middle - bottom) {
|
{
|
||||||
|
if (top - middle > middle - bottom)
|
||||||
|
{
|
||||||
/* Bottom segment is the short one. */
|
/* Bottom segment is the short one. */
|
||||||
int len = middle - bottom;
|
int len = middle - bottom;
|
||||||
register int i;
|
register int i;
|
||||||
|
|
||||||
/* Swap it with the top part of the top segment. */
|
/* Swap it with the top part of the top segment. */
|
||||||
for(i = 0; i < len; i++) {
|
for (i = 0; i < len; i++)
|
||||||
|
{
|
||||||
tem = argv[bottom + i];
|
tem = argv[bottom + i];
|
||||||
argv[bottom + i] = argv[top - (middle - bottom) + i];
|
argv[bottom + i] = argv[top - (middle - bottom) + i];
|
||||||
argv[top - (middle - bottom) + i] = tem;
|
argv[top - (middle - bottom) + i] = tem;
|
||||||
SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
|
SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Exclude the moved bottom segment from further swapping. */
|
/* Exclude the moved bottom segment from further swapping. */
|
||||||
top -= len;
|
top -= len;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
/* Top segment is the short one. */
|
/* Top segment is the short one. */
|
||||||
int len = top - middle;
|
int len = top - middle;
|
||||||
register int i;
|
register int i;
|
||||||
|
|
||||||
/* Swap it with the bottom part of the bottom segment. */
|
/* Swap it with the bottom part of the bottom segment. */
|
||||||
for(i = 0; i < len; i++) {
|
for (i = 0; i < len; i++)
|
||||||
|
{
|
||||||
tem = argv[bottom + i];
|
tem = argv[bottom + i];
|
||||||
argv[bottom + i] = argv[middle + i];
|
argv[bottom + i] = argv[middle + i];
|
||||||
argv[middle + i] = tem;
|
argv[middle + i] = tem;
|
||||||
SWAP_FLAGS (bottom + i, middle + i);
|
SWAP_FLAGS (bottom + i, middle + i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Exclude the moved top segment from further swapping. */
|
/* Exclude the moved top segment from further swapping. */
|
||||||
bottom += len;
|
bottom += len;
|
||||||
}
|
}
|
||||||
|
@ -395,52 +398,52 @@ const char *optstring;
|
||||||
|
|
||||||
/* Determine how to handle the ordering of options and nonoptions. */
|
/* Determine how to handle the ordering of options and nonoptions. */
|
||||||
|
|
||||||
if(optstring[0] == '-') {
|
if (optstring[0] == '-')
|
||||||
|
{
|
||||||
ordering = RETURN_IN_ORDER;
|
ordering = RETURN_IN_ORDER;
|
||||||
++optstring;
|
++optstring;
|
||||||
} else if(optstring[0] == '+') {
|
}
|
||||||
|
else if (optstring[0] == '+')
|
||||||
|
{
|
||||||
ordering = REQUIRE_ORDER;
|
ordering = REQUIRE_ORDER;
|
||||||
++optstring;
|
++optstring;
|
||||||
} else if(posixly_correct != NULL) {
|
|
||||||
ordering = REQUIRE_ORDER;
|
|
||||||
} else {
|
|
||||||
ordering = PERMUTE;
|
|
||||||
}
|
}
|
||||||
|
else if (posixly_correct != NULL)
|
||||||
|
ordering = REQUIRE_ORDER;
|
||||||
|
else
|
||||||
|
ordering = PERMUTE;
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
|
|
||||||
if (posixly_correct == NULL
|
if (posixly_correct == NULL
|
||||||
&& argc == original_argc && argv == original_argv) {
|
&& argc == original_argc && argv == original_argv)
|
||||||
if(nonoption_flags_max_len == 0) {
|
{
|
||||||
if(getopt_nonoption_flags == NULL
|
if (nonoption_flags_max_len == 0)
|
||||||
|| getopt_nonoption_flags[0] == '\0') {
|
{
|
||||||
|
if (__getopt_nonoption_flags == NULL
|
||||||
|
|| __getopt_nonoption_flags[0] == '\0')
|
||||||
nonoption_flags_max_len = -1;
|
nonoption_flags_max_len = -1;
|
||||||
} else {
|
else
|
||||||
const char *orig_str = getopt_nonoption_flags;
|
{
|
||||||
|
const char *orig_str = __getopt_nonoption_flags;
|
||||||
int len = nonoption_flags_max_len = strlen (orig_str);
|
int len = nonoption_flags_max_len = strlen (orig_str);
|
||||||
|
if (nonoption_flags_max_len < argc)
|
||||||
if(nonoption_flags_max_len < argc) {
|
|
||||||
nonoption_flags_max_len = argc;
|
nonoption_flags_max_len = argc;
|
||||||
}
|
__getopt_nonoption_flags =
|
||||||
|
|
||||||
getopt_nonoption_flags =
|
|
||||||
(char *) malloc (nonoption_flags_max_len);
|
(char *) malloc (nonoption_flags_max_len);
|
||||||
|
if (__getopt_nonoption_flags == NULL)
|
||||||
if(getopt_nonoption_flags == NULL) {
|
|
||||||
nonoption_flags_max_len = -1;
|
nonoption_flags_max_len = -1;
|
||||||
} else {
|
else
|
||||||
memcpy(getopt_nonoption_flags, orig_str, len);
|
{
|
||||||
memset(&getopt_nonoption_flags[len], '\0',
|
memcpy (__getopt_nonoption_flags, orig_str, len);
|
||||||
|
memset (&__getopt_nonoption_flags[len], '\0',
|
||||||
nonoption_flags_max_len - len);
|
nonoption_flags_max_len - len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nonoption_flags_len = nonoption_flags_max_len;
|
nonoption_flags_len = nonoption_flags_max_len;
|
||||||
} else {
|
|
||||||
nonoption_flags_len = 0;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
nonoption_flags_len = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return optstring;
|
return optstring;
|
||||||
|
@ -513,13 +516,12 @@ int long_only;
|
||||||
{
|
{
|
||||||
optarg = NULL;
|
optarg = NULL;
|
||||||
|
|
||||||
if(optind == 0 || !getopt_initialized) {
|
if (optind == 0 || !__getopt_initialized)
|
||||||
if(optind == 0) {
|
{
|
||||||
|
if (optind == 0)
|
||||||
optind = 1; /* Don't scan ARGV[0], the program name. */
|
optind = 1; /* Don't scan ARGV[0], the program name. */
|
||||||
}
|
|
||||||
|
|
||||||
optstring = _getopt_initialize (argc, argv, optstring);
|
optstring = _getopt_initialize (argc, argv, optstring);
|
||||||
getopt_initialized = 1;
|
__getopt_initialized = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Test whether ARGV[optind] points to a non-option argument.
|
/* Test whether ARGV[optind] points to a non-option argument.
|
||||||
|
@ -529,41 +531,37 @@ int long_only;
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \
|
#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \
|
||||||
|| (optind < nonoption_flags_len \
|
|| (optind < nonoption_flags_len \
|
||||||
&& getopt_nonoption_flags[optind] == '1'))
|
&& __getopt_nonoption_flags[optind] == '1'))
|
||||||
#else
|
#else
|
||||||
#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
|
#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(nextchar == NULL || *nextchar == '\0') {
|
if (nextchar == NULL || *nextchar == '\0')
|
||||||
|
{
|
||||||
/* Advance to the next ARGV-element. */
|
/* Advance to the next ARGV-element. */
|
||||||
|
|
||||||
/* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
|
/* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
|
||||||
moved back by the user (who may also have changed the arguments). */
|
moved back by the user (who may also have changed the arguments). */
|
||||||
if(last_nonopt > optind) {
|
if (last_nonopt > optind)
|
||||||
last_nonopt = optind;
|
last_nonopt = optind;
|
||||||
}
|
if (first_nonopt > optind)
|
||||||
|
|
||||||
if(first_nonopt > optind) {
|
|
||||||
first_nonopt = optind;
|
first_nonopt = optind;
|
||||||
}
|
|
||||||
|
|
||||||
if(ordering == PERMUTE) {
|
if (ordering == PERMUTE)
|
||||||
|
{
|
||||||
/* If we have just processed some options following some non-options,
|
/* If we have just processed some options following some non-options,
|
||||||
exchange them so that the options come first. */
|
exchange them so that the options come first. */
|
||||||
|
|
||||||
if(first_nonopt != last_nonopt && last_nonopt != optind) {
|
if (first_nonopt != last_nonopt && last_nonopt != optind)
|
||||||
exchange ((char **) argv);
|
exchange ((char **) argv);
|
||||||
} else if(last_nonopt != optind) {
|
else if (last_nonopt != optind)
|
||||||
first_nonopt = optind;
|
first_nonopt = optind;
|
||||||
}
|
|
||||||
|
|
||||||
/* Skip any additional non-options
|
/* Skip any additional non-options
|
||||||
and extend the range of non-options previously skipped. */
|
and extend the range of non-options previously skipped. */
|
||||||
|
|
||||||
while(optind < argc && NONOPTION_P) {
|
while (optind < argc && NONOPTION_P)
|
||||||
optind++;
|
optind++;
|
||||||
}
|
|
||||||
|
|
||||||
last_nonopt = optind;
|
last_nonopt = optind;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -572,15 +570,14 @@ int long_only;
|
||||||
then exchange with previous non-options as if it were an option,
|
then exchange with previous non-options as if it were an option,
|
||||||
then skip everything else like a non-option. */
|
then skip everything else like a non-option. */
|
||||||
|
|
||||||
if(optind != argc && !strcmp(argv[optind], "--")) {
|
if (optind != argc && !strcmp (argv[optind], "--"))
|
||||||
|
{
|
||||||
optind++;
|
optind++;
|
||||||
|
|
||||||
if(first_nonopt != last_nonopt && last_nonopt != optind) {
|
if (first_nonopt != last_nonopt && last_nonopt != optind)
|
||||||
exchange ((char **) argv);
|
exchange ((char **) argv);
|
||||||
} else if(first_nonopt == last_nonopt) {
|
else if (first_nonopt == last_nonopt)
|
||||||
first_nonopt = optind;
|
first_nonopt = optind;
|
||||||
}
|
|
||||||
|
|
||||||
last_nonopt = argc;
|
last_nonopt = argc;
|
||||||
|
|
||||||
optind = argc;
|
optind = argc;
|
||||||
|
@ -589,24 +586,22 @@ int long_only;
|
||||||
/* If we have done all the ARGV-elements, stop the scan
|
/* If we have done all the ARGV-elements, stop the scan
|
||||||
and back over any non-options that we skipped and permuted. */
|
and back over any non-options that we skipped and permuted. */
|
||||||
|
|
||||||
if(optind == argc) {
|
if (optind == argc)
|
||||||
|
{
|
||||||
/* Set the next-arg-index to point at the non-options
|
/* Set the next-arg-index to point at the non-options
|
||||||
that we previously skipped, so the caller will digest them. */
|
that we previously skipped, so the caller will digest them. */
|
||||||
if(first_nonopt != last_nonopt) {
|
if (first_nonopt != last_nonopt)
|
||||||
optind = first_nonopt;
|
optind = first_nonopt;
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we have come to a non-option and did not permute it,
|
/* 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. */
|
either stop the scan or describe it to the caller and pass it by. */
|
||||||
|
|
||||||
if(NONOPTION_P) {
|
if (NONOPTION_P)
|
||||||
if(ordering == REQUIRE_ORDER) {
|
{
|
||||||
|
if (ordering == REQUIRE_ORDER)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
optarg = argv[optind++];
|
optarg = argv[optind++];
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -635,7 +630,8 @@ int long_only;
|
||||||
|
|
||||||
if (longopts != NULL
|
if (longopts != NULL
|
||||||
&& (argv[optind][1] == '-'
|
&& (argv[optind][1] == '-'
|
||||||
|| (long_only && (argv[optind][2] || !my_index(optstring, argv[optind][1]))))) {
|
|| (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
|
||||||
|
{
|
||||||
char *nameend;
|
char *nameend;
|
||||||
const struct option *p;
|
const struct option *p;
|
||||||
const struct option *pfound = NULL;
|
const struct option *pfound = NULL;
|
||||||
|
@ -650,47 +646,53 @@ int long_only;
|
||||||
/* Test all long options for either exact match
|
/* Test all long options for either exact match
|
||||||
or abbreviated matches. */
|
or abbreviated matches. */
|
||||||
for (p = longopts, option_index = 0; p->name; p++, option_index++)
|
for (p = longopts, option_index = 0; p->name; p++, option_index++)
|
||||||
if(!strncmp(p->name, nextchar, nameend - nextchar)) {
|
if (!strncmp (p->name, nextchar, nameend - nextchar))
|
||||||
|
{
|
||||||
if ((unsigned int) (nameend - nextchar)
|
if ((unsigned int) (nameend - nextchar)
|
||||||
== (unsigned int) strlen(p->name)) {
|
== (unsigned int) strlen (p->name))
|
||||||
|
{
|
||||||
/* Exact match found. */
|
/* Exact match found. */
|
||||||
pfound = p;
|
pfound = p;
|
||||||
indfound = option_index;
|
indfound = option_index;
|
||||||
exact = 1;
|
exact = 1;
|
||||||
break;
|
break;
|
||||||
} else if(pfound == NULL) {
|
}
|
||||||
|
else if (pfound == NULL)
|
||||||
|
{
|
||||||
/* First nonexact match found. */
|
/* First nonexact match found. */
|
||||||
pfound = p;
|
pfound = p;
|
||||||
indfound = option_index;
|
indfound = option_index;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
/* Second or later nonexact match found. */
|
/* Second or later nonexact match found. */
|
||||||
{
|
|
||||||
ambig = 1;
|
ambig = 1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if(ambig && !exact) {
|
if (ambig && !exact)
|
||||||
|
{
|
||||||
if (opterr)
|
if (opterr)
|
||||||
fprintf (stderr, "%s: option `%s' is ambiguous\n",
|
fprintf (stderr, "%s: option `%s' is ambiguous\n",
|
||||||
argv[0], argv[optind]);
|
argv[0], argv[optind]);
|
||||||
|
|
||||||
nextchar += strlen (nextchar);
|
nextchar += strlen (nextchar);
|
||||||
optind++;
|
optind++;
|
||||||
optopt = 0;
|
optopt = 0;
|
||||||
return '?';
|
return '?';
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pfound != NULL) {
|
if (pfound != NULL)
|
||||||
|
{
|
||||||
option_index = indfound;
|
option_index = indfound;
|
||||||
optind++;
|
optind++;
|
||||||
|
if (*nameend)
|
||||||
if(*nameend) {
|
{
|
||||||
/* Don't test has_arg with >, because some C compilers don't
|
/* Don't test has_arg with >, because some C compilers don't
|
||||||
allow it to be used on enums. */
|
allow it to be used on enums. */
|
||||||
if(pfound->has_arg) {
|
if (pfound->has_arg)
|
||||||
optarg = nameend + 1;
|
optarg = nameend + 1;
|
||||||
} else {
|
else
|
||||||
if(opterr) {
|
{
|
||||||
|
if (opterr)
|
||||||
|
{
|
||||||
if (argv[optind - 1][1] == '-')
|
if (argv[optind - 1][1] == '-')
|
||||||
/* --option */
|
/* --option */
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
|
@ -708,32 +710,30 @@ int long_only;
|
||||||
optopt = pfound->val;
|
optopt = pfound->val;
|
||||||
return '?';
|
return '?';
|
||||||
}
|
}
|
||||||
} else if(pfound->has_arg == 1) {
|
}
|
||||||
if(optind < argc) {
|
else if (pfound->has_arg == 1)
|
||||||
|
{
|
||||||
|
if (optind < argc)
|
||||||
optarg = argv[optind++];
|
optarg = argv[optind++];
|
||||||
} else {
|
else
|
||||||
|
{
|
||||||
if (opterr)
|
if (opterr)
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"%s: option `%s' requires an argument\n",
|
"%s: option `%s' requires an argument\n",
|
||||||
argv[0], argv[optind - 1]);
|
argv[0], argv[optind - 1]);
|
||||||
|
|
||||||
nextchar += strlen (nextchar);
|
nextchar += strlen (nextchar);
|
||||||
optopt = pfound->val;
|
optopt = pfound->val;
|
||||||
return optstring[0] == ':' ? ':' : '?';
|
return optstring[0] == ':' ? ':' : '?';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nextchar += strlen (nextchar);
|
nextchar += strlen (nextchar);
|
||||||
|
if (longind != NULL)
|
||||||
if(longind != NULL) {
|
|
||||||
*longind = option_index;
|
*longind = option_index;
|
||||||
}
|
if (pfound->flag)
|
||||||
|
{
|
||||||
if(pfound->flag) {
|
|
||||||
*(pfound->flag) = pfound->val;
|
*(pfound->flag) = pfound->val;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pfound->val;
|
return pfound->val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -742,8 +742,10 @@ int long_only;
|
||||||
option, then it's an error.
|
option, then it's an error.
|
||||||
Otherwise interpret it as a short option. */
|
Otherwise interpret it as a short option. */
|
||||||
if (!long_only || argv[optind][1] == '-'
|
if (!long_only || argv[optind][1] == '-'
|
||||||
|| my_index(optstring, *nextchar) == NULL) {
|
|| my_index (optstring, *nextchar) == NULL)
|
||||||
if(opterr) {
|
{
|
||||||
|
if (opterr)
|
||||||
|
{
|
||||||
if (argv[optind][1] == '-')
|
if (argv[optind][1] == '-')
|
||||||
/* --option */
|
/* --option */
|
||||||
fprintf (stderr, "%s: unrecognized option `--%s'\n",
|
fprintf (stderr, "%s: unrecognized option `--%s'\n",
|
||||||
|
@ -753,7 +755,6 @@ int long_only;
|
||||||
fprintf (stderr, "%s: unrecognized option `%c%s'\n",
|
fprintf (stderr, "%s: unrecognized option `%c%s'\n",
|
||||||
argv[0], argv[optind][0], nextchar);
|
argv[0], argv[optind][0], nextchar);
|
||||||
}
|
}
|
||||||
|
|
||||||
nextchar = (char *) "";
|
nextchar = (char *) "";
|
||||||
optind++;
|
optind++;
|
||||||
optopt = 0;
|
optopt = 0;
|
||||||
|
@ -768,12 +769,13 @@ int long_only;
|
||||||
char *temp = my_index (optstring, c);
|
char *temp = my_index (optstring, c);
|
||||||
|
|
||||||
/* Increment `optind' when we start to process its last character. */
|
/* Increment `optind' when we start to process its last character. */
|
||||||
if(*nextchar == '\0') {
|
if (*nextchar == '\0')
|
||||||
++optind;
|
++optind;
|
||||||
}
|
|
||||||
|
|
||||||
if(temp == NULL || c == ':') {
|
if (temp == NULL || c == ':')
|
||||||
if(opterr) {
|
{
|
||||||
|
if (opterr)
|
||||||
|
{
|
||||||
if (posixly_correct)
|
if (posixly_correct)
|
||||||
/* 1003.2 specifies the format of this message. */
|
/* 1003.2 specifies the format of this message. */
|
||||||
fprintf (stderr, "%s: illegal option -- %c\n",
|
fprintf (stderr, "%s: illegal option -- %c\n",
|
||||||
|
@ -782,13 +784,12 @@ int long_only;
|
||||||
fprintf (stderr, "%s: invalid option -- %c\n",
|
fprintf (stderr, "%s: invalid option -- %c\n",
|
||||||
argv[0], c);
|
argv[0], c);
|
||||||
}
|
}
|
||||||
|
|
||||||
optopt = c;
|
optopt = c;
|
||||||
return '?';
|
return '?';
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convenience. Treat POSIX -W foo same as long option --foo */
|
/* Convenience. Treat POSIX -W foo same as long option --foo */
|
||||||
if(temp[0] == 'W' && temp[1] == ';') {
|
if (temp[0] == 'W' && temp[1] == ';')
|
||||||
|
{
|
||||||
char *nameend;
|
char *nameend;
|
||||||
const struct option *p;
|
const struct option *p;
|
||||||
const struct option *pfound = NULL;
|
const struct option *pfound = NULL;
|
||||||
|
@ -798,33 +799,32 @@ int long_only;
|
||||||
int option_index;
|
int option_index;
|
||||||
|
|
||||||
/* This is an option that requires an argument. */
|
/* This is an option that requires an argument. */
|
||||||
if(*nextchar != '\0') {
|
if (*nextchar != '\0')
|
||||||
|
{
|
||||||
optarg = nextchar;
|
optarg = nextchar;
|
||||||
/* If we end this ARGV-element by taking the rest as an arg,
|
/* If we end this ARGV-element by taking the rest as an arg,
|
||||||
we must advance to the next element now. */
|
we must advance to the next element now. */
|
||||||
optind++;
|
optind++;
|
||||||
} else if(optind == argc) {
|
}
|
||||||
if(opterr) {
|
else if (optind == argc)
|
||||||
|
{
|
||||||
|
if (opterr)
|
||||||
|
{
|
||||||
/* 1003.2 specifies the format of this message. */
|
/* 1003.2 specifies the format of this message. */
|
||||||
fprintf (stderr, "%s: option requires an argument -- %c\n",
|
fprintf (stderr, "%s: option requires an argument -- %c\n",
|
||||||
argv[0], c);
|
argv[0], c);
|
||||||
}
|
}
|
||||||
|
|
||||||
optopt = c;
|
optopt = c;
|
||||||
|
if (optstring[0] == ':')
|
||||||
if(optstring[0] == ':') {
|
|
||||||
c = ':';
|
c = ':';
|
||||||
} else {
|
else
|
||||||
c = '?';
|
c = '?';
|
||||||
}
|
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
/* We already incremented `optind' once;
|
/* We already incremented `optind' once;
|
||||||
increment it again when taking next ARGV-elt as argument. */
|
increment it again when taking next ARGV-elt as argument. */
|
||||||
{
|
|
||||||
optarg = argv[optind++];
|
optarg = argv[optind++];
|
||||||
}
|
|
||||||
|
|
||||||
/* optarg is now the argument, see if it's in the
|
/* optarg is now the argument, see if it's in the
|
||||||
table of longopts. */
|
table of longopts. */
|
||||||
|
@ -835,43 +835,46 @@ int long_only;
|
||||||
/* Test all long options for either exact match
|
/* Test all long options for either exact match
|
||||||
or abbreviated matches. */
|
or abbreviated matches. */
|
||||||
for (p = longopts, option_index = 0; p->name; p++, option_index++)
|
for (p = longopts, option_index = 0; p->name; p++, option_index++)
|
||||||
if(!strncmp(p->name, nextchar, nameend - nextchar)) {
|
if (!strncmp (p->name, nextchar, nameend - nextchar))
|
||||||
if((unsigned int)(nameend - nextchar) == strlen(p->name)) {
|
{
|
||||||
|
if ((unsigned int) (nameend - nextchar) == strlen (p->name))
|
||||||
|
{
|
||||||
/* Exact match found. */
|
/* Exact match found. */
|
||||||
pfound = p;
|
pfound = p;
|
||||||
indfound = option_index;
|
indfound = option_index;
|
||||||
exact = 1;
|
exact = 1;
|
||||||
break;
|
break;
|
||||||
} else if(pfound == NULL) {
|
}
|
||||||
|
else if (pfound == NULL)
|
||||||
|
{
|
||||||
/* First nonexact match found. */
|
/* First nonexact match found. */
|
||||||
pfound = p;
|
pfound = p;
|
||||||
indfound = option_index;
|
indfound = option_index;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
/* Second or later nonexact match found. */
|
/* Second or later nonexact match found. */
|
||||||
{
|
|
||||||
ambig = 1;
|
ambig = 1;
|
||||||
}
|
}
|
||||||
}
|
if (ambig && !exact)
|
||||||
|
{
|
||||||
if(ambig && !exact) {
|
|
||||||
if (opterr)
|
if (opterr)
|
||||||
fprintf (stderr, "%s: option `-W %s' is ambiguous\n",
|
fprintf (stderr, "%s: option `-W %s' is ambiguous\n",
|
||||||
argv[0], argv[optind]);
|
argv[0], argv[optind]);
|
||||||
|
|
||||||
nextchar += strlen (nextchar);
|
nextchar += strlen (nextchar);
|
||||||
optind++;
|
optind++;
|
||||||
return '?';
|
return '?';
|
||||||
}
|
}
|
||||||
|
if (pfound != NULL)
|
||||||
if(pfound != NULL) {
|
{
|
||||||
option_index = indfound;
|
option_index = indfound;
|
||||||
|
if (*nameend)
|
||||||
if(*nameend) {
|
{
|
||||||
/* Don't test has_arg with >, because some C compilers don't
|
/* Don't test has_arg with >, because some C compilers don't
|
||||||
allow it to be used on enums. */
|
allow it to be used on enums. */
|
||||||
if(pfound->has_arg) {
|
if (pfound->has_arg)
|
||||||
optarg = nameend + 1;
|
optarg = nameend + 1;
|
||||||
} else {
|
else
|
||||||
|
{
|
||||||
if (opterr)
|
if (opterr)
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"%s: option `-W %s' doesn't allow an argument\n",
|
"%s: option `-W %s' doesn't allow an argument\n",
|
||||||
|
@ -880,82 +883,80 @@ int long_only;
|
||||||
nextchar += strlen (nextchar);
|
nextchar += strlen (nextchar);
|
||||||
return '?';
|
return '?';
|
||||||
}
|
}
|
||||||
} else if(pfound->has_arg == 1) {
|
}
|
||||||
if(optind < argc) {
|
else if (pfound->has_arg == 1)
|
||||||
|
{
|
||||||
|
if (optind < argc)
|
||||||
optarg = argv[optind++];
|
optarg = argv[optind++];
|
||||||
} else {
|
else
|
||||||
|
{
|
||||||
if (opterr)
|
if (opterr)
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"%s: option `%s' requires an argument\n",
|
"%s: option `%s' requires an argument\n",
|
||||||
argv[0], argv[optind - 1]);
|
argv[0], argv[optind - 1]);
|
||||||
|
|
||||||
nextchar += strlen (nextchar);
|
nextchar += strlen (nextchar);
|
||||||
return optstring[0] == ':' ? ':' : '?';
|
return optstring[0] == ':' ? ':' : '?';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nextchar += strlen (nextchar);
|
nextchar += strlen (nextchar);
|
||||||
|
if (longind != NULL)
|
||||||
if(longind != NULL) {
|
|
||||||
*longind = option_index;
|
*longind = option_index;
|
||||||
}
|
if (pfound->flag)
|
||||||
|
{
|
||||||
if(pfound->flag) {
|
|
||||||
*(pfound->flag) = pfound->val;
|
*(pfound->flag) = pfound->val;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pfound->val;
|
return pfound->val;
|
||||||
}
|
}
|
||||||
|
|
||||||
nextchar = NULL;
|
nextchar = NULL;
|
||||||
return 'W'; /* Let the application handle it. */
|
return 'W'; /* Let the application handle it. */
|
||||||
}
|
}
|
||||||
|
if (temp[1] == ':')
|
||||||
if(temp[1] == ':') {
|
{
|
||||||
if(temp[2] == ':') {
|
if (temp[2] == ':')
|
||||||
|
{
|
||||||
/* This is an option that accepts an argument optionally. */
|
/* This is an option that accepts an argument optionally. */
|
||||||
if(*nextchar != '\0') {
|
if (*nextchar != '\0')
|
||||||
|
{
|
||||||
optarg = nextchar;
|
optarg = nextchar;
|
||||||
optind++;
|
optind++;
|
||||||
} else {
|
|
||||||
optarg = NULL;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
optarg = NULL;
|
||||||
nextchar = NULL;
|
nextchar = NULL;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
/* This is an option that requires an argument. */
|
/* This is an option that requires an argument. */
|
||||||
if(*nextchar != '\0') {
|
if (*nextchar != '\0')
|
||||||
|
{
|
||||||
optarg = nextchar;
|
optarg = nextchar;
|
||||||
/* If we end this ARGV-element by taking the rest as an arg,
|
/* If we end this ARGV-element by taking the rest as an arg,
|
||||||
we must advance to the next element now. */
|
we must advance to the next element now. */
|
||||||
optind++;
|
optind++;
|
||||||
} else if(optind == argc) {
|
}
|
||||||
if(opterr) {
|
else if (optind == argc)
|
||||||
|
{
|
||||||
|
if (opterr)
|
||||||
|
{
|
||||||
/* 1003.2 specifies the format of this message. */
|
/* 1003.2 specifies the format of this message. */
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"%s: option requires an argument -- %c\n",
|
"%s: option requires an argument -- %c\n",
|
||||||
argv[0], c);
|
argv[0], c);
|
||||||
}
|
}
|
||||||
|
|
||||||
optopt = c;
|
optopt = c;
|
||||||
|
if (optstring[0] == ':')
|
||||||
if(optstring[0] == ':') {
|
|
||||||
c = ':';
|
c = ':';
|
||||||
} else {
|
else
|
||||||
c = '?';
|
c = '?';
|
||||||
}
|
}
|
||||||
} else
|
else
|
||||||
/* We already incremented `optind' once;
|
/* We already incremented `optind' once;
|
||||||
increment it again when taking next ARGV-elt as argument. */
|
increment it again when taking next ARGV-elt as argument. */
|
||||||
{
|
|
||||||
optarg = argv[optind++];
|
optarg = argv[optind++];
|
||||||
}
|
|
||||||
|
|
||||||
nextchar = NULL;
|
nextchar = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -987,16 +988,16 @@ char **argv;
|
||||||
int c;
|
int c;
|
||||||
int digit_optind = 0;
|
int digit_optind = 0;
|
||||||
|
|
||||||
while(1) {
|
while (1)
|
||||||
|
{
|
||||||
int this_option_optind = optind ? optind : 1;
|
int this_option_optind = optind ? optind : 1;
|
||||||
|
|
||||||
c = getopt (argc, argv, "abc:d:0123456789");
|
c = getopt (argc, argv, "abc:d:0123456789");
|
||||||
|
if (c == -1)
|
||||||
if(c == -1) {
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
switch(c) {
|
switch (c)
|
||||||
|
{
|
||||||
case '0':
|
case '0':
|
||||||
case '1':
|
case '1':
|
||||||
case '2':
|
case '2':
|
||||||
|
@ -1007,10 +1008,8 @@ char **argv;
|
||||||
case '7':
|
case '7':
|
||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
if(digit_optind != 0 && digit_optind != this_option_optind) {
|
if (digit_optind != 0 && digit_optind != this_option_optind)
|
||||||
printf ("digits occur in two different argv-elements.\n");
|
printf ("digits occur in two different argv-elements.\n");
|
||||||
}
|
|
||||||
|
|
||||||
digit_optind = this_option_optind;
|
digit_optind = this_option_optind;
|
||||||
printf ("option %c\n", c);
|
printf ("option %c\n", c);
|
||||||
break;
|
break;
|
||||||
|
@ -1035,13 +1034,11 @@ char **argv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(optind < argc) {
|
if (optind < argc)
|
||||||
|
{
|
||||||
printf ("non-option ARGV-elements: ");
|
printf ("non-option ARGV-elements: ");
|
||||||
|
while (optind < argc)
|
||||||
while(optind < argc) {
|
|
||||||
printf ("%s ", argv[optind++]);
|
printf ("%s ", argv[optind++]);
|
||||||
}
|
|
||||||
|
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
15
src/getopt.h
15
src/getopt.h
|
@ -1,6 +1,3 @@
|
||||||
#ifndef TINC_GETOPT_H
|
|
||||||
#define TINC_GETOPT_H
|
|
||||||
|
|
||||||
/* Declarations for getopt.
|
/* Declarations for getopt.
|
||||||
Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
|
Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
@ -22,7 +19,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef cplusplus
|
#ifndef _GETOPT_H
|
||||||
|
#define _GETOPT_H 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -78,7 +78,8 @@ extern "C" {
|
||||||
one). For long options that have a zero `flag' field, `getopt'
|
one). For long options that have a zero `flag' field, `getopt'
|
||||||
returns the contents of the `val' field. */
|
returns the contents of the `val' field. */
|
||||||
|
|
||||||
struct option {
|
struct option
|
||||||
|
{
|
||||||
#if defined (__STDC__) && __STDC__
|
#if defined (__STDC__) && __STDC__
|
||||||
const char *name;
|
const char *name;
|
||||||
#else
|
#else
|
||||||
|
@ -125,8 +126,8 @@ extern "C" {
|
||||||
extern int _getopt_internal ();
|
extern int _getopt_internal ();
|
||||||
#endif /* __STDC__ */
|
#endif /* __STDC__ */
|
||||||
|
|
||||||
#ifdef cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif /* _GETOPT_H */
|
||||||
|
|
|
@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include "../config.h"
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "getopt.h"
|
#include "getopt.h"
|
||||||
|
@ -106,10 +106,12 @@ char **argv;
|
||||||
int c;
|
int c;
|
||||||
int digit_optind = 0;
|
int digit_optind = 0;
|
||||||
|
|
||||||
while(1) {
|
while (1)
|
||||||
|
{
|
||||||
int this_option_optind = optind ? optind : 1;
|
int this_option_optind = optind ? optind : 1;
|
||||||
int option_index = 0;
|
int option_index = 0;
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] =
|
||||||
|
{
|
||||||
{"add", 1, 0, 0},
|
{"add", 1, 0, 0},
|
||||||
{"append", 0, 0, 0},
|
{"append", 0, 0, 0},
|
||||||
{"delete", 1, 0, 0},
|
{"delete", 1, 0, 0},
|
||||||
|
@ -121,19 +123,15 @@ char **argv;
|
||||||
|
|
||||||
c = getopt_long (argc, argv, "abc:d:0123456789",
|
c = getopt_long (argc, argv, "abc:d:0123456789",
|
||||||
long_options, &option_index);
|
long_options, &option_index);
|
||||||
|
if (c == -1)
|
||||||
if(c == -1) {
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
switch(c) {
|
switch (c)
|
||||||
|
{
|
||||||
case 0:
|
case 0:
|
||||||
printf ("option %s", long_options[option_index].name);
|
printf ("option %s", long_options[option_index].name);
|
||||||
|
if (optarg)
|
||||||
if(optarg) {
|
|
||||||
printf (" with arg %s", optarg);
|
printf (" with arg %s", optarg);
|
||||||
}
|
|
||||||
|
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -147,10 +145,8 @@ char **argv;
|
||||||
case '7':
|
case '7':
|
||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
if(digit_optind != 0 && digit_optind != this_option_optind) {
|
if (digit_optind != 0 && digit_optind != this_option_optind)
|
||||||
printf ("digits occur in two different argv-elements.\n");
|
printf ("digits occur in two different argv-elements.\n");
|
||||||
}
|
|
||||||
|
|
||||||
digit_optind = this_option_optind;
|
digit_optind = this_option_optind;
|
||||||
printf ("option %c\n", c);
|
printf ("option %c\n", c);
|
||||||
break;
|
break;
|
||||||
|
@ -179,13 +175,11 @@ char **argv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(optind < argc) {
|
if (optind < argc)
|
||||||
|
{
|
||||||
printf ("non-option ARGV-elements: ");
|
printf ("non-option ARGV-elements: ");
|
||||||
|
while (optind < argc)
|
||||||
while(optind < argc) {
|
|
||||||
printf ("%s ", argv[optind++]);
|
printf ("%s ", argv[optind++]);
|
||||||
}
|
|
||||||
|
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
287
src/graph.c
287
src/graph.c
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
graph.c -- graph algorithms
|
graph.c -- graph algorithms
|
||||||
Copyright (C) 2001-2014 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2001-2011 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
2001-2005 Ivo Timmermans
|
2001-2005 Ivo Timmermans
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -44,8 +44,8 @@
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
|
||||||
#include "avl_tree.h"
|
#include "splay_tree.h"
|
||||||
#include "conf.h"
|
#include "config.h"
|
||||||
#include "connection.h"
|
#include "connection.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "edge.h"
|
#include "edge.h"
|
||||||
|
@ -58,22 +58,18 @@
|
||||||
#include "subnet.h"
|
#include "subnet.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "xalloc.h"
|
#include "xalloc.h"
|
||||||
|
#include "graph.h"
|
||||||
static bool graph_changed = true;
|
|
||||||
|
|
||||||
/* Implementation of Kruskal's algorithm.
|
/* Implementation of Kruskal's algorithm.
|
||||||
Running time: O(EN)
|
Running time: O(E)
|
||||||
Please note that sorting on weight is already done by add_edge().
|
Please note that sorting on weight is already done by add_edge().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void mst_kruskal(void) {
|
void mst_kruskal(void) {
|
||||||
avl_node_t *node, *next;
|
splay_node_t *node, *next;
|
||||||
edge_t *e;
|
edge_t *e;
|
||||||
node_t *n;
|
node_t *n;
|
||||||
connection_t *c;
|
connection_t *c;
|
||||||
int nodes = 0;
|
|
||||||
int safe_edges = 0;
|
|
||||||
bool skipped;
|
|
||||||
|
|
||||||
/* Clear MST status on connections */
|
/* Clear MST status on connections */
|
||||||
|
|
||||||
|
@ -82,12 +78,6 @@ static void mst_kruskal(void) {
|
||||||
c->status.mst = false;
|
c->status.mst = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do we have something to do at all? */
|
|
||||||
|
|
||||||
if(!edge_weight_tree->head) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ifdebug(SCARY_THINGS) logger(LOG_DEBUG, "Running Kruskal's algorithm:");
|
ifdebug(SCARY_THINGS) logger(LOG_DEBUG, "Running Kruskal's algorithm:");
|
||||||
|
|
||||||
/* Clear visited status on nodes */
|
/* Clear visited status on nodes */
|
||||||
|
@ -95,73 +85,144 @@ static void mst_kruskal(void) {
|
||||||
for(node = node_tree->head; node; node = node->next) {
|
for(node = node_tree->head; node; node = node->next) {
|
||||||
n = node->data;
|
n = node->data;
|
||||||
n->status.visited = false;
|
n->status.visited = false;
|
||||||
nodes++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Starting point */
|
|
||||||
|
|
||||||
for(node = edge_weight_tree->head; node; node = node->next) {
|
|
||||||
e = node->data;
|
|
||||||
|
|
||||||
if(e->from->status.reachable) {
|
|
||||||
e->from->status.visited = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add safe edges */
|
/* Add safe edges */
|
||||||
|
|
||||||
for(skipped = false, node = edge_weight_tree->head; node; node = next) {
|
for(node = edge_weight_tree->head; node; node = next) {
|
||||||
next = node->next;
|
next = node->next;
|
||||||
e = node->data;
|
e = node->data;
|
||||||
|
|
||||||
if(!e->reverse || e->from->status.visited == e->to->status.visited) {
|
if(!e->reverse || (e->from->status.visited && e->to->status.visited))
|
||||||
skipped = true;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
e->from->status.visited = true;
|
e->from->status.visited = true;
|
||||||
e->to->status.visited = true;
|
e->to->status.visited = true;
|
||||||
|
|
||||||
if(e->connection) {
|
if(e->connection)
|
||||||
e->connection->status.mst = true;
|
e->connection->status.mst = true;
|
||||||
}
|
|
||||||
|
|
||||||
if(e->reverse->connection) {
|
if(e->reverse->connection)
|
||||||
e->reverse->connection->status.mst = true;
|
e->reverse->connection->status.mst = true;
|
||||||
}
|
|
||||||
|
|
||||||
safe_edges++;
|
|
||||||
|
|
||||||
ifdebug(SCARY_THINGS) logger(LOG_DEBUG, " Adding edge %s - %s weight %d", e->from->name,
|
ifdebug(SCARY_THINGS) logger(LOG_DEBUG, " Adding edge %s - %s weight %d", e->from->name,
|
||||||
e->to->name, e->weight);
|
e->to->name, e->weight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(skipped) {
|
/* Implementation of Dijkstra's algorithm.
|
||||||
skipped = false;
|
Running time: O(N^2)
|
||||||
next = edge_weight_tree->head;
|
*/
|
||||||
|
|
||||||
|
static void sssp_dijkstra(void) {
|
||||||
|
splay_node_t *node, *to;
|
||||||
|
edge_t *e;
|
||||||
|
node_t *n, *m;
|
||||||
|
list_t *todo_list;
|
||||||
|
list_node_t *lnode, *nnode;
|
||||||
|
bool indirect;
|
||||||
|
|
||||||
|
todo_list = list_alloc(NULL);
|
||||||
|
|
||||||
|
ifdebug(SCARY_THINGS) logger(LOG_DEBUG, "Running Dijkstra's algorithm:");
|
||||||
|
|
||||||
|
/* Clear visited status on nodes */
|
||||||
|
|
||||||
|
for(node = node_tree->head; node; node = node->next) {
|
||||||
|
n = node->data;
|
||||||
|
n->status.visited = false;
|
||||||
|
n->status.indirect = true;
|
||||||
|
n->distance = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Begin with myself */
|
||||||
|
|
||||||
|
myself->status.indirect = false;
|
||||||
|
myself->nexthop = myself;
|
||||||
|
myself->via = myself;
|
||||||
|
myself->distance = 0;
|
||||||
|
list_insert_head(todo_list, myself);
|
||||||
|
|
||||||
|
/* Loop while todo_list is filled */
|
||||||
|
|
||||||
|
while(todo_list->head) {
|
||||||
|
n = NULL;
|
||||||
|
nnode = NULL;
|
||||||
|
|
||||||
|
/* Select node from todo_list with smallest distance */
|
||||||
|
|
||||||
|
for(lnode = todo_list->head; lnode; lnode = lnode->next) {
|
||||||
|
m = lnode->data;
|
||||||
|
if(!n || m->status.indirect < n->status.indirect || m->distance < n->distance) {
|
||||||
|
n = m;
|
||||||
|
nnode = lnode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mark this node as visited and remove it from the todo_list */
|
||||||
|
|
||||||
|
n->status.visited = true;
|
||||||
|
list_unlink_node(todo_list, nnode);
|
||||||
|
|
||||||
|
/* Update distance of neighbours and add them to the todo_list */
|
||||||
|
|
||||||
|
for(to = n->edge_tree->head; to; to = to->next) { /* "to" is the edge connected to "from" */
|
||||||
|
e = to->data;
|
||||||
|
|
||||||
|
if(e->to->status.visited || !e->reverse)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* Situation:
|
||||||
|
|
||||||
|
/
|
||||||
|
/
|
||||||
|
----->(n)---e-->(e->to)
|
||||||
|
\
|
||||||
|
\
|
||||||
|
|
||||||
|
Where e is an edge, (n) and (e->to) are nodes.
|
||||||
|
n->address is set to the e->address of the edge left of n to n.
|
||||||
|
We are currently examining the edge e right of n from n:
|
||||||
|
|
||||||
|
- If edge e provides for better reachability of e->to, update e->to.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(e->to->distance < 0)
|
||||||
|
list_insert_tail(todo_list, e->to);
|
||||||
|
|
||||||
|
indirect = n->status.indirect || e->options & OPTION_INDIRECT || ((n != myself) && sockaddrcmp(&n->address, &e->reverse->address));
|
||||||
|
|
||||||
|
if(e->to->distance >= 0 && (!e->to->status.indirect || indirect) && e->to->distance <= n->distance + e->weight)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
e->to->distance = n->distance + e->weight;
|
||||||
|
e->to->status.indirect = indirect;
|
||||||
|
e->to->nexthop = (n->nexthop == myself) ? e->to : n->nexthop;
|
||||||
|
e->to->via = indirect ? n->via : e->to;
|
||||||
|
e->to->options = e->options;
|
||||||
|
|
||||||
|
if(e->to->address.sa.sa_family == AF_UNSPEC && e->address.sa.sa_family != AF_UNKNOWN)
|
||||||
|
update_node_udp(e->to, &e->address);
|
||||||
|
|
||||||
|
ifdebug(SCARY_THINGS) logger(LOG_DEBUG, " Updating edge %s - %s weight %d distance %d", e->from->name,
|
||||||
|
e->to->name, e->weight, e->to->distance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ifdebug(SCARY_THINGS) logger(LOG_DEBUG, "Done, counted %d nodes and %d safe edges.", nodes,
|
list_free(todo_list);
|
||||||
safe_edges);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Implementation of a simple breadth-first search algorithm.
|
/* Implementation of a simple breadth-first search algorithm.
|
||||||
Running time: O(E)
|
Running time: O(E)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void sssp_bfs(void) {
|
void sssp_bfs(void) {
|
||||||
avl_node_t *node, *next, *to;
|
splay_node_t *node, *to;
|
||||||
edge_t *e;
|
edge_t *e;
|
||||||
node_t *n;
|
node_t *n;
|
||||||
list_t *todo_list;
|
list_t *todo_list;
|
||||||
list_node_t *from, *todonext;
|
list_node_t *from, *todonext;
|
||||||
bool indirect;
|
bool indirect;
|
||||||
char *name;
|
|
||||||
char *address, *port;
|
|
||||||
char *envp[8] = {NULL};
|
|
||||||
int i;
|
|
||||||
|
|
||||||
todo_list = list_alloc(NULL);
|
todo_list = list_alloc(NULL);
|
||||||
|
|
||||||
|
@ -178,7 +239,6 @@ static void sssp_bfs(void) {
|
||||||
myself->status.visited = true;
|
myself->status.visited = true;
|
||||||
myself->status.indirect = false;
|
myself->status.indirect = false;
|
||||||
myself->nexthop = myself;
|
myself->nexthop = myself;
|
||||||
myself->prevedge = NULL;
|
|
||||||
myself->via = myself;
|
myself->via = myself;
|
||||||
list_insert_head(todo_list, myself);
|
list_insert_head(todo_list, myself);
|
||||||
|
|
||||||
|
@ -190,9 +250,8 @@ static void sssp_bfs(void) {
|
||||||
for(to = n->edge_tree->head; to; to = to->next) { /* "to" is the edge connected to "from" */
|
for(to = n->edge_tree->head; to; to = to->next) { /* "to" is the edge connected to "from" */
|
||||||
e = to->data;
|
e = to->data;
|
||||||
|
|
||||||
if(!e->reverse) {
|
if(!e->reverse)
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
/* Situation:
|
/* Situation:
|
||||||
|
|
||||||
|
@ -214,25 +273,17 @@ static void sssp_bfs(void) {
|
||||||
indirect = n->status.indirect || e->options & OPTION_INDIRECT;
|
indirect = n->status.indirect || e->options & OPTION_INDIRECT;
|
||||||
|
|
||||||
if(e->to->status.visited
|
if(e->to->status.visited
|
||||||
&& (!e->to->status.indirect || indirect)) {
|
&& (!e->to->status.indirect || indirect))
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
// Only update nexthop the first time we visit this node.
|
|
||||||
|
|
||||||
if(!e->to->status.visited) {
|
|
||||||
e->to->nexthop = (n->nexthop == myself) ? e->to : n->nexthop;
|
|
||||||
}
|
|
||||||
|
|
||||||
e->to->status.visited = true;
|
e->to->status.visited = true;
|
||||||
e->to->status.indirect = indirect;
|
e->to->status.indirect = indirect;
|
||||||
e->to->prevedge = e;
|
e->to->nexthop = (n->nexthop == myself) ? e->to : n->nexthop;
|
||||||
e->to->via = indirect ? n->via : e->to;
|
e->to->via = indirect ? n->via : e->to;
|
||||||
e->to->options = e->options;
|
e->to->options = e->options;
|
||||||
|
|
||||||
if(e->to->address.sa.sa_family == AF_UNSPEC && e->address.sa.sa_family != AF_UNKNOWN) {
|
if(e->to->address.sa.sa_family == AF_UNSPEC && e->address.sa.sa_family != AF_UNKNOWN)
|
||||||
update_node_udp(e->to, &e->address);
|
update_node_udp(e->to, &e->address);
|
||||||
}
|
|
||||||
|
|
||||||
list_insert_tail(todo_list, e->to);
|
list_insert_tail(todo_list, e->to);
|
||||||
}
|
}
|
||||||
|
@ -242,6 +293,15 @@ static void sssp_bfs(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
list_free(todo_list);
|
list_free(todo_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void check_reachability(void) {
|
||||||
|
splay_node_t *node, *next;
|
||||||
|
node_t *n;
|
||||||
|
char *name;
|
||||||
|
char *address, *port;
|
||||||
|
char *envp[7];
|
||||||
|
int i;
|
||||||
|
|
||||||
/* Check reachability status. */
|
/* Check reachability status. */
|
||||||
|
|
||||||
|
@ -269,19 +329,17 @@ static void sssp_bfs(void) {
|
||||||
n->minmtu = 0;
|
n->minmtu = 0;
|
||||||
n->mtuprobes = 0;
|
n->mtuprobes = 0;
|
||||||
|
|
||||||
if(n->mtuevent) {
|
if(timeout_initialized(&n->mtuevent))
|
||||||
event_del(n->mtuevent);
|
event_del(&n->mtuevent);
|
||||||
n->mtuevent = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
xasprintf(&envp[0], "NETNAME=%s", netname ? netname : "");
|
xasprintf(&envp[0], "NETNAME=%s", netname ? : "");
|
||||||
xasprintf(&envp[1], "DEVICE=%s", device ? device : "");
|
xasprintf(&envp[1], "DEVICE=%s", device ? : "");
|
||||||
xasprintf(&envp[2], "INTERFACE=%s", iface ? iface : "");
|
xasprintf(&envp[2], "INTERFACE=%s", iface ? : "");
|
||||||
xasprintf(&envp[3], "NODE=%s", n->name);
|
xasprintf(&envp[3], "NODE=%s", n->name);
|
||||||
sockaddr2str(&n->address, &address, &port);
|
sockaddr2str(&n->address, &address, &port);
|
||||||
xasprintf(&envp[4], "REMOTEADDRESS=%s", address);
|
xasprintf(&envp[4], "REMOTEADDRESS=%s", address);
|
||||||
xasprintf(&envp[5], "REMOTEPORT=%s", port);
|
xasprintf(&envp[5], "REMOTEPORT=%s", port);
|
||||||
xasprintf(&envp[6], "NAME=%s", myself->name);
|
envp[6] = NULL;
|
||||||
|
|
||||||
execute_script(n->status.reachable ? "host-up" : "host-down", envp);
|
execute_script(n->status.reachable ? "host-up" : "host-down", envp);
|
||||||
|
|
||||||
|
@ -294,97 +352,22 @@ static void sssp_bfs(void) {
|
||||||
free(address);
|
free(address);
|
||||||
free(port);
|
free(port);
|
||||||
|
|
||||||
for(i = 0; i < 7; i++) {
|
for(i = 0; i < 6; i++)
|
||||||
free(envp[i]);
|
free(envp[i]);
|
||||||
}
|
|
||||||
|
|
||||||
subnet_update(n, NULL, n->status.reachable);
|
subnet_update(n, NULL, n->status.reachable);
|
||||||
|
|
||||||
if(!n->status.reachable) {
|
if(!n->status.reachable)
|
||||||
update_node_udp(n, NULL);
|
update_node_udp(n, NULL);
|
||||||
memset(&n->status, 0, sizeof(n->status));
|
else if(n->connection)
|
||||||
n->options = 0;
|
|
||||||
} else if(n->connection) {
|
|
||||||
send_ans_key(n);
|
send_ans_key(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void graph(void) {
|
void graph(void) {
|
||||||
subnet_cache_flush();
|
subnet_cache_flush();
|
||||||
sssp_bfs();
|
sssp_dijkstra();
|
||||||
|
check_reachability();
|
||||||
mst_kruskal();
|
mst_kruskal();
|
||||||
graph_changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Dump nodes and edges to a graphviz file.
|
|
||||||
|
|
||||||
The file can be converted to an image with
|
|
||||||
dot -Tpng graph_filename -o image_filename.png -Gconcentrate=true
|
|
||||||
*/
|
|
||||||
|
|
||||||
void dump_graph(void) {
|
|
||||||
avl_node_t *node;
|
|
||||||
node_t *n;
|
|
||||||
edge_t *e;
|
|
||||||
char *filename = NULL, *tmpname = NULL;
|
|
||||||
FILE *file, *pipe = NULL;
|
|
||||||
|
|
||||||
if(!graph_changed || !get_config_string(lookup_config(config_tree, "GraphDumpFile"), &filename)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
graph_changed = false;
|
|
||||||
|
|
||||||
ifdebug(PROTOCOL) logger(LOG_NOTICE, "Dumping graph");
|
|
||||||
|
|
||||||
if(filename[0] == '|') {
|
|
||||||
file = pipe = popen(filename + 1, "w");
|
|
||||||
} else {
|
|
||||||
xasprintf(&tmpname, "%s.new", filename);
|
|
||||||
file = fopen(tmpname, "w");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!file) {
|
|
||||||
logger(LOG_ERR, "Unable to open graph dump file %s: %s", filename, strerror(errno));
|
|
||||||
free(filename);
|
|
||||||
free(tmpname);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(file, "digraph {\n");
|
|
||||||
|
|
||||||
/* dump all nodes first */
|
|
||||||
for(node = node_tree->head; node; node = node->next) {
|
|
||||||
n = node->data;
|
|
||||||
fprintf(file, " %s [label = \"%s\"];\n", n->name, n->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* now dump all edges */
|
|
||||||
for(node = edge_weight_tree->head; node; node = node->next) {
|
|
||||||
e = node->data;
|
|
||||||
fprintf(file, " %s -> %s;\n", e->from->name, e->to->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(file, "}\n");
|
|
||||||
|
|
||||||
if(pipe) {
|
|
||||||
pclose(pipe);
|
|
||||||
} else {
|
|
||||||
fclose(file);
|
|
||||||
#ifdef HAVE_MINGW
|
|
||||||
unlink(filename);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(rename(tmpname, filename)) {
|
|
||||||
logger(LOG_ERR, "Could not rename %s to %s: %s\n", tmpname, filename, strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
free(tmpname);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(filename);
|
|
||||||
}
|
}
|
||||||
|
|
10
src/graph.h
10
src/graph.h
|
@ -1,9 +1,6 @@
|
||||||
#ifndef TINC_GRAPH_H
|
|
||||||
#define TINC_GRAPH_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
graph.h -- header for graph.c
|
graph.h -- header for graph.c
|
||||||
Copyright (C) 2001-2012 Guus Sliepen <guus@tinc-vpn.org>,
|
Copyright (C) 2001-2006 Guus Sliepen <guus@tinc-vpn.org>,
|
||||||
2001-2005 Ivo Timmermans
|
2001-2005 Ivo Timmermans
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -21,7 +18,10 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_GRAPH_H__
|
||||||
|
#define __TINC_GRAPH_H__
|
||||||
|
|
||||||
extern void graph(void);
|
extern void graph(void);
|
||||||
extern void dump_graph(void);
|
extern void dump_graph(void);
|
||||||
|
|
||||||
#endif
|
#endif /* __TINC_GRAPH_H__ */
|
||||||
|
|
18
src/ipv4.h
18
src/ipv4.h
|
@ -1,10 +1,7 @@
|
||||||
#ifndef TINC_IPV4_H
|
|
||||||
#define TINC_IPV4_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ipv4.h -- missing IPv4 related definitions
|
ipv4.h -- missing IPv4 related definitions
|
||||||
Copyright (C) 2005 Ivo Timmermans
|
Copyright (C) 2005 Ivo Timmermans
|
||||||
2006-2012 Guus Sliepen <guus@tinc-vpn.org>
|
2006 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -21,6 +18,9 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_IPV4_H__
|
||||||
|
#define __TINC_IPV4_H__
|
||||||
|
|
||||||
#ifndef AF_INET
|
#ifndef AF_INET
|
||||||
#define AF_INET 2
|
#define AF_INET 2
|
||||||
#endif
|
#endif
|
||||||
|
@ -41,14 +41,6 @@
|
||||||
#define ICMP_NET_UNKNOWN 6
|
#define ICMP_NET_UNKNOWN 6
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ICMP_TIME_EXCEEDED
|
|
||||||
#define ICMP_TIME_EXCEEDED 11
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ICMP_EXC_TTL
|
|
||||||
#define ICMP_EXC_TTL 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ICMP_NET_UNREACH
|
#ifndef ICMP_NET_UNREACH
|
||||||
#define ICMP_NET_UNREACH 0
|
#define ICMP_NET_UNREACH 0
|
||||||
#endif
|
#endif
|
||||||
|
@ -146,4 +138,4 @@ struct icmp {
|
||||||
} __attribute__ ((__packed__));
|
} __attribute__ ((__packed__));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif /* __TINC_IPV4_H__ */
|
||||||
|
|
18
src/ipv6.h
18
src/ipv6.h
|
@ -1,10 +1,7 @@
|
||||||
#ifndef TINC_IPV6_H
|
|
||||||
#define TINC_IPV6_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ipv6.h -- missing IPv6 related definitions
|
ipv6.h -- missing IPv6 related definitions
|
||||||
Copyright (C) 2005 Ivo Timmermans
|
Copyright (C) 2005 Ivo Timmermans
|
||||||
2006-2012 Guus Sliepen <guus@tinc-vpn.org>
|
2006 Guus Sliepen <guus@tinc-vpn.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -21,6 +18,9 @@
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __TINC_IPV6_H__
|
||||||
|
#define __TINC_IPV6_H__
|
||||||
|
|
||||||
#ifndef AF_INET6
|
#ifndef AF_INET6
|
||||||
#define AF_INET6 10
|
#define AF_INET6 10
|
||||||
#endif
|
#endif
|
||||||
|
@ -54,9 +54,9 @@ struct sockaddr_in6 {
|
||||||
|
|
||||||
#ifndef IN6_IS_ADDR_V4MAPPED
|
#ifndef IN6_IS_ADDR_V4MAPPED
|
||||||
#define IN6_IS_ADDR_V4MAPPED(a) \
|
#define IN6_IS_ADDR_V4MAPPED(a) \
|
||||||
((((const uint32_t *) (a))[0] == 0) \
|
((((__const uint32_t *) (a))[0] == 0) \
|
||||||
&& (((const uint32_t *) (a))[1] == 0) \
|
&& (((__const uint32_t *) (a))[1] == 0) \
|
||||||
&& (((const uint32_t *) (a))[2] == htonl (0xffff)))
|
&& (((__const uint32_t *) (a))[2] == htonl (0xffff)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_STRUCT_IP6_HDR
|
#ifndef HAVE_STRUCT_IP6_HDR
|
||||||
|
@ -95,10 +95,8 @@ struct icmp6_hdr {
|
||||||
#define ICMP6_DST_UNREACH_NOROUTE 0
|
#define ICMP6_DST_UNREACH_NOROUTE 0
|
||||||
#define ICMP6_DST_UNREACH 1
|
#define ICMP6_DST_UNREACH 1
|
||||||
#define ICMP6_PACKET_TOO_BIG 2
|
#define ICMP6_PACKET_TOO_BIG 2
|
||||||
#define ICMP6_TIME_EXCEEDED 3
|
|
||||||
#define ICMP6_DST_UNREACH_ADMIN 1
|
#define ICMP6_DST_UNREACH_ADMIN 1
|
||||||
#define ICMP6_DST_UNREACH_ADDR 3
|
#define ICMP6_DST_UNREACH_ADDR 3
|
||||||
#define ICMP6_TIME_EXCEED_TRANSIT 0
|
|
||||||
#define ND_NEIGHBOR_SOLICIT 135
|
#define ND_NEIGHBOR_SOLICIT 135
|
||||||
#define ND_NEIGHBOR_ADVERT 136
|
#define ND_NEIGHBOR_ADVERT 136
|
||||||
#define icmp6_data32 icmp6_dataun.icmp6_un_data32
|
#define icmp6_data32 icmp6_dataun.icmp6_un_data32
|
||||||
|
@ -127,4 +125,4 @@ struct nd_opt_hdr {
|
||||||
} __attribute__ ((__packed__));
|
} __attribute__ ((__packed__));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif /* __TINC_IPV6_H__ */
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue