v2.0
This commit is contained in:
parent
6d9b04341c
commit
c957ef5cf5
AUTHORSChangeLogINSTALLLICENSEMakefile.amMakefile.inNEWSREADMEREADME.embeddedREADME.macREADME.mdREADME.rstREADME.windowsVERSIONacinclude.m4aclocal.m4autogen.sh
bin
Makefile.amMakefile.inconfigure-dev.shconfigure-fhs.shconfigure-mac.shdoxygen.shdoxygen.sh_doxygen_fixup.pl_emailrelay-bcc-check.plemailrelay-deliver.sh.inemailrelay-edit-content.jsemailrelay-edit-envelope.jsemailrelay-multicast.shemailrelay-notify.sh.inemailrelay-process.shemailrelay-resubmit.jsemailrelay-resubmit.sh.inemailrelay-runperl.jsemailrelay-sendmail.plemailrelay-service-install.jsemailrelay-submit.sh.inemailrelay.sh.inemailrelay.sh_expand.sh_make-bundle.sh_make-manifest.shmake-qt-enabled.sh_make-setup.shmake-setup.sh_mu2docbook.sh_mu2html.sh_startup-mac.plisttxt2html.sh_txt2mu.sh_
bootstrapbsd
compileconfig.h.inconfigureconfigure.acconfigure.shdebian
depcompdoc
Makefile.amMakefile.inauth.png_authentication.pngauthentication.svgchangelog.htmlchangelog.mdchangelog.rstchangelog.txtconf.pydeveloper.htmldeveloper.mddeveloper.rstdeveloper.txtdiagram-1.pngdiagram-2.pngdownload-button.pngdoxygen-header.htmldoxygen-missing.htmldoxygen.cfgdoxygen.cfg.inemailrelay-doxygen.cssemailrelay-doxygen.css_emailrelay-filter-copy.1emailrelay-man.htmlemailrelay-passwd.1emailrelay-poke.1emailrelay-submit.1emailrelay.1emailrelay.cssemailrelay.css_
19
AUTHORS
19
AUTHORS
@ -1,16 +1,23 @@
|
||||
AUTHORS
|
||||
=======
|
||||
Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
|
||||
Source files
|
||||
------------
|
||||
* Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
|
||||
except where stated otherwise
|
||||
|
||||
Binary distributions
|
||||
--------------------
|
||||
Binary distributions of E-MailRelay may include copyrighted code from:
|
||||
Binary distributions of E-MailRelay might include copyrighted code from:
|
||||
* OpenSSL Toolkit (http://www.openssl.org)
|
||||
* MinGW (http://www.mingw.org)
|
||||
* Trolltech Qt (http://trolltech.com)
|
||||
* mbedTLS (http://tls.mbed.org)
|
||||
* Qt (http://qt.io)
|
||||
* Microsoft (http://microsoft.com)
|
||||
* Free Software Foundation (fsf.org)
|
||||
|
||||
These are distributed under licenses compatible with the GPLv3. Please
|
||||
refer to their websites for further details.
|
||||
These parts are distributed under license; please refer to their
|
||||
websites for further details.
|
||||
|
||||
This product includes software developed by the OpenSSL Project
|
||||
for use in the OpenSSL Toolkit (http://www.openssl.org/).
|
||||
|
53
ChangeLog
53
ChangeLog
@ -1,11 +1,62 @@
|
||||
E-MailRelay Change Log
|
||||
======================
|
||||
|
||||
1.9.2 -> 2.0
|
||||
------------
|
||||
* Improved IPv6 support, with IPv4 and IPv6 used independently at run-time (see "--interface").
|
||||
* Server process is not blocked during "--filter" or "--address-verifier" execution, if multi-threaded.
|
||||
* Support for the "mbedTLS" TLS library as an alternative to OpenSSL ("configure --with-mbedtls").
|
||||
* TLS server certificates specified with new "--server-tls-certificate" option, not "--server-tls".
|
||||
* TLS servers enable client certificate verification with "--server-tls-verify", not "--tls-config".
|
||||
* TLS clients can verify server certificates with "--client-tls-verify" and "--client-tls-verify-name".
|
||||
* The "--tls-config" option works differently (see NEWS file).
|
||||
* New "--client-tls-server-name" option for server name identification (SNI).
|
||||
* New "--client-tls-required" option to force client connections to use TLS.
|
||||
* New "--server-tls-required" option to force remote SMTP clients to use STARTTLS.
|
||||
* New "--forward-on-disconnect" option replaces "--poll=0".
|
||||
* The "--anonymous" option now suppresses the "Received" line, whatever the "--domain".
|
||||
* The second field in the secrets file indicates the password encoding, not AUTH mechanism.
|
||||
* The "--verifier" option is now "--address-verifier", with simplified command-line parameters.
|
||||
* Command-line file paths can use "@app" as a prefix to be relative to the executable directory.
|
||||
* Command-line file paths can be relative to the startup cwd even when daemonised.
|
||||
* Filter exit codes between 104 and 107 are interpreted differently (see NEWS file).
|
||||
* Message rejection reasons passed back to the submitting SMTP client are much less verbose.
|
||||
* Forwarding events are queued up if the forwarding client is still busy from last time.
|
||||
* The bind address for outgoing connections is no longer taken from first unqualified "--interface" address [bug-id #27].
|
||||
* The SMTP client protocol tries more than one authentication mechanism.
|
||||
* Some support for XOAUTH2 client-side authentication.
|
||||
* Client protocol sends QUIT with a socket shutdown().
|
||||
* The Windows commdlg list-view widget is used for the server status pages.
|
||||
* The Windows connection-lookup feature is withdrawn ("--peer-lookup").
|
||||
* Several build-time configure options like "--disable-pop" are withdrawn.
|
||||
* C++ 2011 is preferred, and required for multi-threading.
|
||||
* Support for very old versions of Windows is dropped.
|
||||
|
||||
1.9.1 -> 1.9.2
|
||||
--------------
|
||||
* Fixed a leak in the event-loop garbage collection.
|
||||
* A local hostname that fails to resolve is not an error.
|
||||
* A warning is emitted if there is more than one client authentication secret.
|
||||
* Multiple "--interface" options are allowed separately on the command-line.
|
||||
* Added a new "--client-interface" option.
|
||||
* The "Received" line is formatted as per RFC-3848 ("with ESMTPSA").
|
||||
* The LOGIN and PLAIN mechanisms in the secrets file are now equivalent.
|
||||
* The Windows service wrapper can use a configuration file to locate the startup batch file.
|
||||
* Simplified the implementation of the GUI installation program.
|
||||
* Reworded the "read error: disconnected" log message.
|
||||
* Less verbose logging of "no more messages to send".
|
||||
* Qt4 or Qt5 selected by the "configure" script.
|
||||
* Improved the RPM spec file.
|
||||
|
||||
1.9 -> 1.9.1
|
||||
------------
|
||||
* Updated OpenSSL from 1.0.1e to 1.0.1g in the Windows build.
|
||||
|
||||
1.8.2 -> 1.9
|
||||
------------
|
||||
* Added negotiated TLS/SSL for POP (ie. "STLS").
|
||||
* The first two fields in the secrets files are reordered (with backwards compatibility).
|
||||
* Added Linux-PAM authentication ("configure --with-pam" and then "--server-auth=/pam").
|
||||
* Added Linux PAM authentication ("configure --with-pam" and then "--server-auth=/pam").
|
||||
* Optional protocol-specific "--interface" qualifiers, eg. "--interface smtp=127.0.0.1,pop=192.168.1.1".
|
||||
* Outgoing client connection bound with the first "--interface" or "--interface client=..." address.
|
||||
* Support for SMTP-over-TLS on outgoing client connection ("--client-tls-connection") (cf. "STARTTLS")
|
||||
|
361
INSTALL
361
INSTALL
@ -1,83 +1,80 @@
|
||||
Introduction
|
||||
============
|
||||
Installation Instructions
|
||||
*************************
|
||||
|
||||
This document is the standard one for doing a GNU-style build and
|
||||
install, except for this introduction, which is specific to E-MailRelay.
|
||||
|
||||
As usual, you should use "./configure; make; sudo make install" to
|
||||
install from source under most operating systems (as described below),
|
||||
but for Windows you should refer to a separate document,
|
||||
"doc/windows.txt".
|
||||
|
||||
The E-MailRelay "configure" script provides some extra configuration
|
||||
options, as shown in the output of "./configure --help". Some of these
|
||||
are used to control all the installation directories in addition to
|
||||
the more standard ones like "--sbindir" and "--libexecdir".
|
||||
|
||||
For example, this configure command will result in installation
|
||||
directories that are close to the Linux File Hieriarchy Standard (FHS):
|
||||
|
||||
./configure --prefix=/usr --localstatedir=/var --libexecdir=/usr/lib --sysconfdir=/etc e_initdir=/etc/init.d
|
||||
|
||||
For more information refer to the E-MailRelay reference document under
|
||||
the "Files and directories" heading.
|
||||
|
||||
If compiling with something other than "gcc" then check for any
|
||||
compiler-specific help in the relevant "lib/<compiler>" directory.
|
||||
|
||||
If you want to install via a package rather than installing with
|
||||
"make install" you could try building an RPM pacakge with "make rpm"
|
||||
or a Debian package with "make deb", although there are lots of moving
|
||||
parts here, so it may not be easy to get working.
|
||||
|
||||
You may also find the E-MailRelay configuration GUI program
|
||||
"emailrelay-gui" useful to help with with the initial configuration,
|
||||
if it is available.
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
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 warranty of any kind.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell command `./configure && make && make install'
|
||||
should configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package. Some packages provide this
|
||||
`INSTALL' file but do not implement all of the features documented
|
||||
below. The lack of an optional feature in a given package is not
|
||||
necessarily a bug. More recommendations for GNU packages can be found
|
||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, a file
|
||||
`config.cache' that saves the results of its tests to speed up
|
||||
reconfiguring, and a file `config.log' containing compiler output
|
||||
(useful mainly for debugging `configure').
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
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
|
||||
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
|
||||
be considered for the next release. If at some point `config.cache'
|
||||
contains results you don't want to keep, you may remove or edit it.
|
||||
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
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.in' is used to create `configure' by a program
|
||||
called `autoconf'. You only need `configure.in' if you want to change
|
||||
it or regenerate `configure' using a newer version of `autoconf'.
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
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
|
||||
`./configure' to configure the package for your system. If you're
|
||||
using `csh' on an old version of System V, you might need to type
|
||||
`sh ./configure' instead to prevent `csh' from trying to execute
|
||||
`configure' itself.
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' takes awhile. While running, it prints some
|
||||
messages telling which features it is checking for.
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package.
|
||||
the package, generally using the just-built uninstalled binaries.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation.
|
||||
documentation. When installing into a prefix owned by root, it is
|
||||
recommended that the package be configured and built as a regular
|
||||
user, and only the `make install' phase executed with root
|
||||
privileges.
|
||||
|
||||
5. You can remove the program binaries and object files from the
|
||||
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||
this time using the binaries in their final installed location.
|
||||
This target does not install anything. Running this target as a
|
||||
regular user, particularly if the prior `make install' required
|
||||
root privileges, verifies that the installation completed
|
||||
correctly.
|
||||
|
||||
6. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
@ -86,62 +83,119 @@ The simplest way to compile this package is:
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
7. Often, you can also type `make uninstall' to remove the installed
|
||||
files again. In practice, not all packages have tested that
|
||||
uninstallation works correctly, even though it is required by the
|
||||
GNU Coding Standards.
|
||||
|
||||
8. Some packages, particularly those that use Automake, provide `make
|
||||
distcheck', which can by used by developers to test that all other
|
||||
targets like `make install' and `make uninstall' work correctly.
|
||||
This target is generally not run by end users.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. You can give `configure'
|
||||
initial values for variables by setting them in the environment. Using
|
||||
a Bourne-compatible shell, you can do that on the command line like
|
||||
this:
|
||||
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
|
||||
the `configure' script does not know about. Run `./configure --help'
|
||||
for details on some of the pertinent environment variables.
|
||||
|
||||
Or on systems that have the `env' program, you can do it like this:
|
||||
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
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
|
||||
own directory. To do this, you must use a version of `make' that
|
||||
supports the `VPATH' variable, such as 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
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'.
|
||||
source code in the directory that `configure' is in and in `..'. This
|
||||
is known as a "VPATH" build.
|
||||
|
||||
If you have to use a `make' that does not supports the `VPATH'
|
||||
variable, you have to compile the package for one architecture at a time
|
||||
in the source code directory. After you have installed the package for
|
||||
one architecture, use `make distclean' before reconfiguring for another
|
||||
architecture.
|
||||
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
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
On MacOS X 10.5 and later systems, you can create libraries and
|
||||
executables that work on multiple system types--known as "fat" or
|
||||
"universal" binaries--by specifying multiple `-arch' options to the
|
||||
compiler but only a single `-arch' option to the preprocessor. Like
|
||||
this:
|
||||
|
||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CPP="gcc -E" CXXCPP="g++ -E"
|
||||
|
||||
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
|
||||
using the `lipo' tool if you have problems.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' will install the package's files in
|
||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an
|
||||
installation prefix other than `/usr/local' by giving `configure' the
|
||||
option `--prefix=PATH'.
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||
absolute file name.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
||||
PATH as the prefix for installing programs and libraries.
|
||||
Documentation and other data files will still use the regular prefix.
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=PATH' 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
|
||||
you can set and what kinds of files go in them.
|
||||
you can set and what kinds of files go in them. In general, the
|
||||
default for these options is expressed in terms of `${prefix}', so that
|
||||
specifying just `--prefix' will affect all of the other directory
|
||||
specifications that were not explicitly provided.
|
||||
|
||||
The most portable way to affect installation locations is to pass the
|
||||
correct locations to `configure'; however, many packages provide one or
|
||||
both of the following shortcuts of passing variable assignments to the
|
||||
`make install' command line to change installation locations without
|
||||
having to reconfigure or recompile.
|
||||
|
||||
The first method involves providing an override variable for each
|
||||
affected directory. For example, `make install
|
||||
prefix=/alternate/directory' will choose an alternate location for all
|
||||
directory configuration variables that were expressed in terms of
|
||||
`${prefix}'. Any directories that were specified during `configure',
|
||||
but not in terms of `${prefix}', must each be overridden at install
|
||||
time for the entire installation to be relocated. The approach of
|
||||
makefile variable overrides for each directory variable is required by
|
||||
the GNU Coding Standards, and ideally causes no recompilation.
|
||||
However, some platforms have known limitations with the semantics of
|
||||
shared libraries that end up requiring recompilation when using this
|
||||
method, particularly noticeable in packages that use GNU Libtool.
|
||||
|
||||
The second method involves providing the `DESTDIR' variable. For
|
||||
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||
`/alternate/directory' before all installation names. The approach of
|
||||
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||
does not work on platforms that have drive letters. On the other hand,
|
||||
it does better at avoiding recompilation issues, and works well even
|
||||
when some directory options were not specified in terms of `${prefix}'
|
||||
at `configure' time.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
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
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
@ -154,25 +208,80 @@ find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Some packages offer the ability to configure how verbose the
|
||||
execution of `make' will be. For these packages, running `./configure
|
||||
--enable-silent-rules' sets the default to minimal output, which can be
|
||||
overridden with `make V=1'; while running `./configure
|
||||
--disable-silent-rules' sets the default to verbose, which can be
|
||||
overridden with `make V=0'.
|
||||
|
||||
Particular systems
|
||||
==================
|
||||
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||
CC is not installed, it is recommended to use the following options in
|
||||
order to use an ANSI C compiler:
|
||||
|
||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||
|
||||
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
|
||||
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||
to try
|
||||
|
||||
./configure CC="cc"
|
||||
|
||||
and if that doesn't work, try
|
||||
|
||||
./configure CC="cc -nodtk"
|
||||
|
||||
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||
directory contains several dysfunctional programs; working variants of
|
||||
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||
in your `PATH', put it _after_ `/usr/bin'.
|
||||
|
||||
On Haiku, software installed for all users goes in `/boot/common',
|
||||
not `/usr/local'. It is recommended to use the following options:
|
||||
|
||||
./configure --prefix=/boot/common
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' can not figure out
|
||||
automatically, but needs to determine by the type of host the package
|
||||
will run on. Usually `configure' can figure that out, but if it prints
|
||||
a message saying it can not guess the host type, give it the
|
||||
`--host=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name with three fields:
|
||||
There may be some features `configure' cannot figure out
|
||||
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
|
||||
_same_ architectures, `configure' can figure that out, but if it prints
|
||||
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
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
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
|
||||
need to know the host type.
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
If you are building compiler tools for cross-compiling, you can also
|
||||
use the `--target=TYPE' option to select the type of system they will
|
||||
produce code for and the `--build=TYPE' option to select the type of
|
||||
system on which you are compiling the package.
|
||||
OS
|
||||
KERNEL-OS
|
||||
|
||||
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
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
@ -185,19 +294,56 @@ default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Operation Controls
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf limitation. Until the limitation is lifted, you can use
|
||||
this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Use and save the results of the tests in FILE instead of
|
||||
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
|
||||
debugging `configure'.
|
||||
|
||||
`--help'
|
||||
Print a summary of the options to `configure', and exit.
|
||||
`-h'
|
||||
Print a summary of all of the options to `configure', and exit.
|
||||
|
||||
`--help=short'
|
||||
`--help=recursive'
|
||||
Print a summary of the options unique to this package's
|
||||
`configure', and exit. The `short' variant lists options used
|
||||
only in the top level, while the `recursive' variant lists options
|
||||
also present in any nested packages.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
@ -210,8 +356,15 @@ operates.
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`--version'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
`--prefix=DIR'
|
||||
Use DIR as the installation prefix. *note Installation Names::
|
||||
for more details, including other options available for fine-tuning
|
||||
the installation locations.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options.
|
||||
`--no-create'
|
||||
`-n'
|
||||
Run the configure checks, but stop before creating any output
|
||||
files.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
|
3
LICENSE
3
LICENSE
@ -1,3 +1,4 @@
|
||||
Licenses
|
||||
========
|
||||
See AUTHORS and COPYING.
|
||||
GPLv3 is used for E-MailRelay source code (see COPYING), but relicensing
|
||||
requests will be considered. See also AUTHORS.
|
||||
|
34
Makefile.am
34
Makefile.am
@ -1,16 +1,16 @@
|
||||
#
|
||||
## Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
##
|
||||
## Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
##
|
||||
## 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/>.
|
||||
#
|
||||
@ -28,23 +28,29 @@
|
||||
|
||||
EXTRA_DIST = \
|
||||
emailrelay.spec \
|
||||
configure.sh \
|
||||
ChangeLog \
|
||||
README.windows \
|
||||
README.embedded \
|
||||
README.mac \
|
||||
LICENSE \
|
||||
VERSION \
|
||||
README.md \
|
||||
README.rst \
|
||||
bootstrap \
|
||||
autogen.sh \
|
||||
emailrelay-gui.xcodeproj/project.pbxproj \
|
||||
emailrelay.xcodeproj/project.pbxproj
|
||||
winbuild.bat \
|
||||
winbuild.pl \
|
||||
winbuild.pm \
|
||||
winbuild-parser.pm \
|
||||
runperl.bat
|
||||
|
||||
SUBDIRS = bin src lib etc doc debian test extra
|
||||
SUBDIRS = bin src etc doc debian test m4 bsd
|
||||
|
||||
e_doc_DATA = COPYING AUTHORS INSTALL NEWS README README.windows README.mac README.embedded ChangeLog
|
||||
# work-round PKG_CHECK_MODULES if no pkg-config
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
e_doc_DATA = COPYING AUTHORS INSTALL NEWS README ChangeLog
|
||||
|
||||
uninstall-local:
|
||||
-for try in 1 2 3 4 ; do echo "$(DESTDIR)$(e_pamdir)" "$(DESTDIR)$(e_initdir)" "$(DESTDIR)$(e_sysconfdir)" "$(DESTDIR)$(e_examplesdir)" "$(DESTDIR)$(e_libexecdir)" "$(DESTDIR)$(e_spooldir)" "$(DESTDIR)$(e_docdir)" "$(DESTDIR)$(pkgdatadir)" | tr ' ' '\n' | grep -i "mailrelay" | while read d ; do rmdir "$$d" 2>/dev/null ; done ; done
|
||||
-for try in 1 2 3 4 ; do echo "$(e_pamdir)" "$(e_initdir)" "$(e_sysconfdir)" "$(e_examplesdir)" "$(e_libexecdir)" "$(e_spooldir)" "$(e_docdir)" "$(pkgdatadir)" | tr ' ' '\n' | grep "emailrelay$" | while read d ; do rmdir "$(DESTDIR)/$$d" 2>/dev/null ; done ; done
|
||||
|
||||
RPM_ROOT ?= ${HOME}/rpmbuild
|
||||
#RPM_ARCH ?= $(shell arch)
|
||||
@ -62,13 +68,15 @@ $(RPM): dist
|
||||
cp $(TAR) $(RPM_ROOT)/SOURCES/emailrelay-$(VERSION)-src.tar.gz
|
||||
cp $(top_srcdir)/emailrelay.spec $(RPM_ROOT)/SPECS/
|
||||
chown root:root $(RPM_ROOT)/SPECS/emailrelay.spec
|
||||
-rm -f $(RPM) || true
|
||||
rpmbuild -ba $(RPM_ROOT)/SPECS/emailrelay.spec
|
||||
test -f $(RPM)
|
||||
|
||||
.PHONY: deb
|
||||
deb: $(DEB)
|
||||
|
||||
$(DEB): $(RPM)
|
||||
-mv emailrelay-$(VERSION) emailrelay-$(VERSION).old.$$$$
|
||||
-mv emailrelay-$(VERSION) emailrelay-$(VERSION).old.$$$$ || true
|
||||
alien --to-deb --generate --single --keep-version $(RPM)
|
||||
sed -i 's/^Section:.*/Section: mail/' emailrelay-$(VERSION)/debian/control
|
||||
sed -i 's/^Maintainer:.*/Maintainer: Graeme Walker <graeme_walker@users.sourceforge.net>/' emailrelay-$(VERSION)/debian/control
|
||||
|
428
Makefile.in
428
Makefile.in
@ -1,9 +1,8 @@
|
||||
# Makefile.in generated by automake 1.11.3 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.15.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
|
||||
# Foundation, Inc.
|
||||
# Copyright (C) 1994-2017 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.
|
||||
@ -30,6 +29,61 @@
|
||||
#
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
@ -47,30 +101,48 @@ NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
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 \
|
||||
depcomp install-sh missing
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/m4_ax_cxx_compile_stdcxx.m4 \
|
||||
$(top_srcdir)/m4/m4_ax_cxx_compile_stdcxx_11.m4 \
|
||||
$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(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 \
|
||||
configure.lineno config.status.lineno
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = config.h
|
||||
CONFIG_HEADER = gconfig_defs.h
|
||||
CONFIG_CLEAN_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 =
|
||||
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
|
||||
html-recursive info-recursive install-data-recursive \
|
||||
install-dvi-recursive install-exec-recursive \
|
||||
install-html-recursive install-info-recursive \
|
||||
install-pdf-recursive install-ps-recursive install-recursive \
|
||||
installcheck-recursive installdirs-recursive pdf-recursive \
|
||||
ps-recursive uninstall-recursive
|
||||
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
||||
ctags-recursive dvi-recursive html-recursive info-recursive \
|
||||
install-data-recursive install-dvi-recursive \
|
||||
install-exec-recursive install-html-recursive \
|
||||
install-info-recursive install-pdf-recursive \
|
||||
install-ps-recursive install-recursive installcheck-recursive \
|
||||
installdirs-recursive pdf-recursive ps-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
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
@ -102,12 +174,37 @@ am__installdirs = "$(DESTDIR)$(e_docdir)"
|
||||
DATA = $(e_doc_DATA)
|
||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||
distclean-recursive maintainer-clean-recursive
|
||||
AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
|
||||
$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
|
||||
distdir dist dist-all distcheck
|
||||
am__recursive_targets = \
|
||||
$(RECURSIVE_TARGETS) \
|
||||
$(RECURSIVE_CLEAN_TARGETS) \
|
||||
$(am__extra_recursive_targets)
|
||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||
cscope distdir dist dist-all distcheck
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
|
||||
$(LISP)gconfig_defs.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
|
||||
CTAGS = ctags
|
||||
CSCOPE = cscope
|
||||
DIST_SUBDIRS = $(SUBDIRS)
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/gconfig_defs.h.in \
|
||||
AUTHORS COPYING ChangeLog INSTALL NEWS README compile depcomp \
|
||||
install-sh missing
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
distdir = $(PACKAGE)-$(VERSION)
|
||||
top_distdir = $(distdir)
|
||||
@ -117,6 +214,7 @@ am__remove_distdir = \
|
||||
&& rm -rf "$(distdir)" \
|
||||
|| { sleep 5 && rm -rf "$(distdir)"; }; \
|
||||
else :; fi
|
||||
am__post_remove_distdir = $(am__remove_distdir)
|
||||
am__relativize = \
|
||||
dir0=`pwd`; \
|
||||
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
||||
@ -144,12 +242,14 @@ am__relativize = \
|
||||
reldir="$$dir2"
|
||||
DIST_ARCHIVES = $(distdir).tar.gz
|
||||
GZIP_ENV = --best
|
||||
DIST_TARGETS = dist-gzip
|
||||
distuninstallcheck_listfiles = find . -type f -print
|
||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||
distcleancheck_listfiles = find . -type f -print
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
@ -158,8 +258,6 @@ AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
COMPILER_VERSION = @COMPILER_VERSION@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
@ -170,13 +268,21 @@ DEPDIR = @DEPDIR@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
GCONFIG_CONFIGURATION = @GCONFIG_CONFIGURATION@
|
||||
GCONFIG_HAVE_DOXYGEN = @GCONFIG_HAVE_DOXYGEN@
|
||||
GCONFIG_HAVE_MAN2HTML = @GCONFIG_HAVE_MAN2HTML@
|
||||
GCONFIG_QT_CFLAGS = @GCONFIG_QT_CFLAGS@
|
||||
GCONFIG_QT_LIBS = @GCONFIG_QT_LIBS@
|
||||
GCONFIG_QT_MOC = @GCONFIG_QT_MOC@
|
||||
GCONFIG_STATIC_END = @GCONFIG_STATIC_END@
|
||||
GCONFIG_STATIC_START = @GCONFIG_STATIC_START@
|
||||
GCONFIG_TLS_LIBS = @GCONFIG_TLS_LIBS@
|
||||
GCONFIG_WINDMC = @GCONFIG_WINDMC@
|
||||
GCONFIG_WINDRES = @GCONFIG_WINDRES@
|
||||
GREP = @GREP@
|
||||
GZIP = @GZIP@
|
||||
G_CAPABILITIES = @G_CAPABILITIES@
|
||||
HAVE_DOXYGEN = @HAVE_DOXYGEN@
|
||||
HAVE_MAN2HTML = @HAVE_MAN2HTML@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@ -190,7 +296,6 @@ MAINT = @MAINT@
|
||||
MAKE = @MAKE@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
MOC = @MOC@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
@ -199,23 +304,19 @@ PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PAM_INCLUDE = @PAM_INCLUDE@
|
||||
PAM_LIBS = @PAM_LIBS@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
QT_CFLAGS = @QT_CFLAGS@
|
||||
QT_LIBS = @QT_LIBS@
|
||||
QT_MOC = @QT_MOC@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SSL_LIBS = @SSL_LIBS@
|
||||
STATIC_END = @STATIC_END@
|
||||
STATIC_START = @STATIC_START@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
ZLIB_LIBS = @ZLIB_LIBS@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
@ -234,13 +335,13 @@ datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
e_bsdinitdir = @e_bsdinitdir@
|
||||
e_docdir = @e_docdir@
|
||||
e_examplesdir = @e_examplesdir@
|
||||
e_icondir = @e_icondir@
|
||||
e_initdir = @e_initdir@
|
||||
e_libexecdir = @e_libexecdir@
|
||||
e_pamdir = @e_pamdir@
|
||||
e_qtmoc = @e_qtmoc@
|
||||
e_spooldir = @e_spooldir@
|
||||
e_sysconfdir = @e_sysconfdir@
|
||||
exec_prefix = @exec_prefix@
|
||||
@ -260,6 +361,7 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -270,23 +372,29 @@ top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
EXTRA_DIST = \
|
||||
emailrelay.spec \
|
||||
configure.sh \
|
||||
ChangeLog \
|
||||
README.windows \
|
||||
README.embedded \
|
||||
README.mac \
|
||||
LICENSE \
|
||||
VERSION \
|
||||
README.md \
|
||||
README.rst \
|
||||
bootstrap \
|
||||
autogen.sh \
|
||||
emailrelay-gui.xcodeproj/project.pbxproj \
|
||||
emailrelay.xcodeproj/project.pbxproj
|
||||
winbuild.bat \
|
||||
winbuild.pl \
|
||||
winbuild.pm \
|
||||
winbuild-parser.pm \
|
||||
runperl.bat
|
||||
|
||||
SUBDIRS = bin src lib etc doc debian test extra
|
||||
e_doc_DATA = COPYING AUTHORS INSTALL NEWS README README.windows README.mac README.embedded ChangeLog
|
||||
SUBDIRS = bin src etc doc debian test m4 bsd
|
||||
|
||||
# work-round PKG_CHECK_MODULES if no pkg-config
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
e_doc_DATA = COPYING AUTHORS INSTALL NEWS README ChangeLog
|
||||
RPM = $(RPM_ROOT)/RPMS/$(RPM_ARCH)/emailrelay-$(VERSION)-1.$(RPM_ARCH).rpm
|
||||
DEB = emailrelay_$(VERSION)-1_$(RPM_ARCH).deb
|
||||
TAR = emailrelay-$(VERSION).tar.gz
|
||||
all: config.h
|
||||
all: gconfig_defs.h
|
||||
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
||||
|
||||
.SUFFIXES:
|
||||
@ -305,7 +413,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
@ -325,24 +432,27 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
config.h: stamp-h1
|
||||
@if test ! -f $@; then rm -f stamp-h1; else :; fi
|
||||
@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
|
||||
gconfig_defs.h: stamp-h1
|
||||
@test -f $@ || rm -f stamp-h1
|
||||
@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
|
||||
|
||||
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
||||
stamp-h1: $(srcdir)/gconfig_defs.h.in $(top_builddir)/config.status
|
||||
@rm -f stamp-h1
|
||||
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
||||
$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(SHELL) ./config.status gconfig_defs.h
|
||||
$(srcdir)/gconfig_defs.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
||||
rm -f stamp-h1
|
||||
touch $@
|
||||
|
||||
distclean-hdr:
|
||||
-rm -f config.h stamp-h1
|
||||
-rm -f gconfig_defs.h stamp-h1
|
||||
install-e_docDATA: $(e_doc_DATA)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(e_docdir)" || $(MKDIR_P) "$(DESTDIR)$(e_docdir)"
|
||||
@list='$(e_doc_DATA)'; test -n "$(e_docdir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(e_docdir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(e_docdir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; \
|
||||
@ -359,22 +469,25 @@ uninstall-e_docDATA:
|
||||
dir='$(DESTDIR)$(e_docdir)'; $(am__uninstall_files_from_dir)
|
||||
|
||||
# This directory's subdirectories are mostly independent; you can cd
|
||||
# into them and run `make' without going through this Makefile.
|
||||
# To change the values of `make' variables: instead of editing Makefiles,
|
||||
# (1) if the variable is set in `config.status', edit `config.status'
|
||||
# (which will cause the Makefiles to be regenerated when you run `make');
|
||||
# (2) otherwise, pass the desired values on the `make' command line.
|
||||
$(RECURSIVE_TARGETS):
|
||||
@fail= failcom='exit 1'; \
|
||||
for f in x $$MAKEFLAGS; do \
|
||||
case $$f in \
|
||||
*=* | --[!k]*);; \
|
||||
*k*) failcom='fail=yes';; \
|
||||
esac; \
|
||||
done; \
|
||||
# into them and run 'make' without going through this Makefile.
|
||||
# To change the values of 'make' variables: instead of editing Makefiles,
|
||||
# (1) if the variable is set in 'config.status', edit 'config.status'
|
||||
# (which will cause the Makefiles to be regenerated when you run 'make');
|
||||
# (2) otherwise, pass the desired values on the 'make' command line.
|
||||
$(am__recursive_targets):
|
||||
@fail=; \
|
||||
if $(am__make_keepgoing); then \
|
||||
failcom='fail=yes'; \
|
||||
else \
|
||||
failcom='exit 1'; \
|
||||
fi; \
|
||||
dot_seen=no; \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
case "$@" in \
|
||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||
*) list='$(SUBDIRS)' ;; \
|
||||
esac; \
|
||||
for subdir in $$list; do \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
if test "$$subdir" = "."; then \
|
||||
dot_seen=yes; \
|
||||
@ -389,57 +502,12 @@ $(RECURSIVE_TARGETS):
|
||||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||
fi; test -z "$$fail"
|
||||
|
||||
$(RECURSIVE_CLEAN_TARGETS):
|
||||
@fail= failcom='exit 1'; \
|
||||
for f in x $$MAKEFLAGS; do \
|
||||
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
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-recursive
|
||||
TAGS: tags
|
||||
|
||||
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)
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
||||
@ -455,12 +523,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
||||
fi; \
|
||||
done; \
|
||||
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; }; }'`; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
@ -472,15 +535,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: CTAGS
|
||||
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
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; }; }'`; \
|
||||
ctags: ctags-recursive
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
@ -489,9 +548,31 @@ GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& 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:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
$(am__remove_distdir)
|
||||
@ -527,13 +608,10 @@ distdir: $(DISTFILES)
|
||||
done
|
||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
test -d "$(distdir)/$$subdir" \
|
||||
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
$(am__make_dryrun) \
|
||||
|| test -d "$(distdir)/$$subdir" \
|
||||
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
||||
|| exit 1; \
|
||||
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
||||
$(am__relativize); \
|
||||
new_distdir=$$reldir; \
|
||||
@ -561,41 +639,43 @@ distdir: $(DISTFILES)
|
||||
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||
|| chmod -R a+r "$(distdir)"
|
||||
dist-gzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||
$(am__remove_distdir)
|
||||
tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-bzip2: distdir
|
||||
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
|
||||
$(am__remove_distdir)
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-lzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
|
||||
$(am__remove_distdir)
|
||||
|
||||
dist-lzma: distdir
|
||||
tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
|
||||
$(am__remove_distdir)
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-xz: distdir
|
||||
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
||||
$(am__remove_distdir)
|
||||
$(am__post_remove_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
|
||||
$(am__remove_distdir)
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-shar: distdir
|
||||
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||
$(am__remove_distdir)
|
||||
@echo WARNING: "Support for shar distribution archives is" \
|
||||
"deprecated." >&2
|
||||
@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
|
||||
-rm -f $(distdir).zip
|
||||
zip -rq $(distdir).zip $(distdir)
|
||||
$(am__remove_distdir)
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist dist-all: distdir
|
||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||
$(am__remove_distdir)
|
||||
dist dist-all:
|
||||
$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
# This target untars the dist file and tries a VPATH configuration. Then
|
||||
# it guarantees that the distribution is self-contained by making another
|
||||
@ -603,11 +683,9 @@ dist dist-all: distdir
|
||||
distcheck: dist
|
||||
case '$(DIST_ARCHIVES)' in \
|
||||
*.tar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||
*.tar.bz2*) \
|
||||
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||
*.tar.lzma*) \
|
||||
lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
|
||||
*.tar.lz*) \
|
||||
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
|
||||
*.tar.xz*) \
|
||||
@ -615,22 +693,23 @@ distcheck: dist
|
||||
*.tar.Z*) \
|
||||
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||
*.shar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
|
||||
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
|
||||
*.zip*) \
|
||||
unzip $(distdir).zip ;;\
|
||||
esac
|
||||
chmod -R a-w $(distdir); chmod a+w $(distdir)
|
||||
mkdir $(distdir)/_build
|
||||
mkdir $(distdir)/_inst
|
||||
chmod -R a-w $(distdir)
|
||||
chmod u+w $(distdir)
|
||||
mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
|
||||
chmod a-w $(distdir)
|
||||
test -d $(distdir)/_build || exit 0; \
|
||||
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||
&& am__cwd=`pwd` \
|
||||
&& $(am__cd) $(distdir)/_build \
|
||||
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
|
||||
&& $(am__cd) $(distdir)/_build/sub \
|
||||
&& ../../configure \
|
||||
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||
--srcdir=../.. --prefix="$$dc_install_base" \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||
@ -653,7 +732,7 @@ distcheck: dist
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
||||
&& cd "$$am__cwd" \
|
||||
|| exit 1
|
||||
$(am__remove_distdir)
|
||||
$(am__post_remove_distdir)
|
||||
@(echo "$(distdir) archives ready for distribution: "; \
|
||||
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'
|
||||
@ -685,7 +764,7 @@ distcleancheck: distclean
|
||||
exit 1; } >&2
|
||||
check-am: all-am
|
||||
check: check-recursive
|
||||
all-am: Makefile $(DATA) config.h
|
||||
all-am: Makefile $(DATA) gconfig_defs.h
|
||||
installdirs: installdirs-recursive
|
||||
installdirs-am:
|
||||
for dir in "$(DESTDIR)$(e_docdir)"; do \
|
||||
@ -790,13 +869,12 @@ ps-am:
|
||||
|
||||
uninstall-am: uninstall-e_docDATA uninstall-local
|
||||
|
||||
.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
|
||||
ctags-recursive install-am install-strip tags-recursive
|
||||
.MAKE: $(am__recursive_targets) all install-am install-strip
|
||||
|
||||
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
|
||||
all all-am am--refresh check check-am clean clean-generic \
|
||||
ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
|
||||
dist-lzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
|
||||
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
||||
am--refresh check check-am clean clean-cscope clean-generic \
|
||||
cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
|
||||
dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
|
||||
distcheck distclean distclean-generic distclean-hdr \
|
||||
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
@ -807,12 +885,14 @@ uninstall-am: uninstall-e_docDATA uninstall-local
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
installdirs-am maintainer-clean maintainer-clean-generic \
|
||||
mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \
|
||||
tags-recursive uninstall uninstall-am uninstall-e_docDATA \
|
||||
tags-am uninstall uninstall-am uninstall-e_docDATA \
|
||||
uninstall-local
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
uninstall-local:
|
||||
-for try in 1 2 3 4 ; do echo "$(DESTDIR)$(e_pamdir)" "$(DESTDIR)$(e_initdir)" "$(DESTDIR)$(e_sysconfdir)" "$(DESTDIR)$(e_examplesdir)" "$(DESTDIR)$(e_libexecdir)" "$(DESTDIR)$(e_spooldir)" "$(DESTDIR)$(e_docdir)" "$(DESTDIR)$(pkgdatadir)" | tr ' ' '\n' | grep -i "mailrelay" | while read d ; do rmdir "$$d" 2>/dev/null ; done ; done
|
||||
-for try in 1 2 3 4 ; do echo "$(e_pamdir)" "$(e_initdir)" "$(e_sysconfdir)" "$(e_examplesdir)" "$(e_libexecdir)" "$(e_spooldir)" "$(e_docdir)" "$(pkgdatadir)" | tr ' ' '\n' | grep "emailrelay$" | while read d ; do rmdir "$(DESTDIR)/$$d" 2>/dev/null ; done ; done
|
||||
|
||||
RPM_ROOT ?= ${HOME}/rpmbuild
|
||||
#RPM_ARCH ?= $(shell arch)
|
||||
@ -827,13 +907,15 @@ $(RPM): dist
|
||||
cp $(TAR) $(RPM_ROOT)/SOURCES/emailrelay-$(VERSION)-src.tar.gz
|
||||
cp $(top_srcdir)/emailrelay.spec $(RPM_ROOT)/SPECS/
|
||||
chown root:root $(RPM_ROOT)/SPECS/emailrelay.spec
|
||||
-rm -f $(RPM) || true
|
||||
rpmbuild -ba $(RPM_ROOT)/SPECS/emailrelay.spec
|
||||
test -f $(RPM)
|
||||
|
||||
.PHONY: deb
|
||||
deb: $(DEB)
|
||||
|
||||
$(DEB): $(RPM)
|
||||
-mv emailrelay-$(VERSION) emailrelay-$(VERSION).old.$$$$
|
||||
-mv emailrelay-$(VERSION) emailrelay-$(VERSION).old.$$$$ || true
|
||||
alien --to-deb --generate --single --keep-version $(RPM)
|
||||
sed -i 's/^Section:.*/Section: mail/' emailrelay-$(VERSION)/debian/control
|
||||
sed -i 's/^Maintainer:.*/Maintainer: Graeme Walker <graeme_walker@users.sourceforge.net>/' emailrelay-$(VERSION)/debian/control
|
||||
|
126
NEWS
126
NEWS
@ -1 +1,125 @@
|
||||
no news is good news
|
||||
News
|
||||
----
|
||||
E-MailRelay Version 2.0 is a major release, with more complete support for IPv6
|
||||
and TLS, a reworked Windows core, and non-blocking execution of external filters
|
||||
and address verifiers.
|
||||
|
||||
Compatibility
|
||||
-------------
|
||||
There are some breaks in compatibility with earlier versions, althought most
|
||||
have backwards-compatibility mitigations built into the 2.0 code:
|
||||
|
||||
# TLS command-line options have changed
|
||||
|
||||
The "--server-tls" options no longer takes a value; the certificate file
|
||||
is given by a separate "--server-tls-certificate" option. A temporary
|
||||
backwards-compatibility fix inserts "--server-tls-certificate" between
|
||||
"--server-tls" and the filename, with a deprecation warning.
|
||||
|
||||
The "--tls-config" options have changed. The certificate-verification
|
||||
tweaks have become command-line options in their own right (such as
|
||||
"--server-tls-verify") and the protocol version options are spelt out
|
||||
as "tlsv1.1" etc. For example, "--tls-config=mbedtls,tlsv1.1,-tlsv1.2".
|
||||
|
||||
# Reserved exit codes from filters are handled differently
|
||||
|
||||
The reserved "--filter" exit codes are handled as shown below. The
|
||||
ones that were explicitly documented behave in the same way, although
|
||||
the 'rescan' feature (103) is no longer tied to "--poll".
|
||||
|
||||
# The admin command-line has cosmetic changes
|
||||
|
||||
The "--admin" command-line usage is a bit tidier, although the "flush"
|
||||
command is unchanged. Users of the "notify" command should re-test.
|
||||
|
||||
# Address verifier command-line is simpler
|
||||
|
||||
The command-line passed to the external address verifier script is
|
||||
simplified. Backwards compatibility is preserved by using a new
|
||||
command-line option "--address-verifier" to replace "--verifier". For
|
||||
forwards compatibility there requirement to supply an interface version
|
||||
number.
|
||||
|
||||
# The secrets file format has changed
|
||||
|
||||
See below.
|
||||
|
||||
# The message envelope format is updated
|
||||
|
||||
The message envelope file format has changed, with full backwards
|
||||
compatibility. The ClientName fields is removed, and the MailFromAuthIn
|
||||
and MailFromAuthOut fields are added.
|
||||
|
||||
Secrets file
|
||||
------------
|
||||
The second field of the secrets file is now the password encoding rather than
|
||||
the authentication mechanism. This can be made backwards compatible since in
|
||||
earlier releases there was an unambiguous mapping of mechanism to format.
|
||||
|
||||
In 2.0 the mechanism is not fixed; the client side protocol will try all of
|
||||
the server's mechanisms for which it has compatible secrets, with plaintext
|
||||
passwords being compatible with any mechanism.
|
||||
|
||||
On the server side the server advertises all mechanisms, regardless of the
|
||||
available secrets, since the client is expected to go through the list of
|
||||
advertised mechanisms until it gets to one where there is an available server
|
||||
secret. This is unlikely to cause a regression since only MD5 passwords can
|
||||
result in an authentication mismatch and CRAM-MD5 is the first and most secure
|
||||
mechanism advertised; to get a regression failure a CRAM-MD5 capable client
|
||||
would see (eg.) LOGIN appear as an additional mechanism, and then perversely
|
||||
choose LOGIN in preference to CRAM-MD5, and then give up before trying
|
||||
CRAM-MD5.
|
||||
|
||||
Filter exit codes
|
||||
-----------------
|
||||
For completeness, this is the filter exit code handling, showing how the
|
||||
changes for 2.0 affect documented and undocumented exit codes in the
|
||||
range 104 to 107:
|
||||
|
||||
Server v1.9:
|
||||
* 0 ok (commit of .new)
|
||||
* 1..99 fail (rename .bad)
|
||||
* 100 abandon (try to commit but ignore errors) (documented)
|
||||
* 101 ok
|
||||
* 102 abandon, re-scan (by expiring --poll timer)
|
||||
* 103 ok, re-scan (documented)
|
||||
* 104 abandon
|
||||
* 105 ok
|
||||
* 106 abandon, re-scan
|
||||
* 107 ok, re-scan
|
||||
* 108.. fail
|
||||
|
||||
Server v2.0:
|
||||
* 0 ok (commit of .new)
|
||||
* 1..99 fail (rename .bad)
|
||||
* 100 abandon (try to commit but ignore errors) (documented)
|
||||
* 101 ok
|
||||
* 102 abandon, re-scan (independent of --poll)
|
||||
* 103 ok, re-scan (documented)
|
||||
* 104 fail, re-scan
|
||||
* 105.. fail
|
||||
|
||||
Client v1.9:
|
||||
* 0 ok (send, delete)
|
||||
* 1..99 fail (dont send, rename .bad)
|
||||
* 100 ignore (dont send, dont delete or rename) (documented)
|
||||
* 101 ok
|
||||
* 102 ok, stop scanning (documented)
|
||||
* 103 ok
|
||||
* 104 ignore
|
||||
* 105 ok
|
||||
* 106 ok, stop scanning
|
||||
* 107 ok
|
||||
* 108.. fail
|
||||
|
||||
Client v2.0:
|
||||
* 0 ok (send, delete)
|
||||
* 1..99 fail (dont send, rename .bad)
|
||||
* 100 ignore (dont send, dont delete or rename) (documented)
|
||||
* 101 ok
|
||||
* 102 ok, stop scanning (documented)
|
||||
* 103 ok
|
||||
* 104 ignore, stop scanning
|
||||
* 105 fail, stop scanning
|
||||
* 105.. fail
|
||||
|
||||
|
125
README
125
README
@ -3,53 +3,59 @@ E-MailRelay Readme
|
||||
|
||||
Abstract
|
||||
--------
|
||||
E-MailRelay is a simple SMTP proxy and store-and-forward message transfer agent
|
||||
(MTA). When running as a proxy all e-mail messages can be passed through a
|
||||
user-defined program, such as a spam filter, which can drop, re-address or edit
|
||||
messages as they pass through. When running as a store-and-forward MTA incoming
|
||||
messages are stored in a local spool directory, and then forwarded to the next
|
||||
SMTP server on request.
|
||||
E-MailRelay is an e-mail store-and-forward message transfer agent and proxy
|
||||
server. It runs on Unix-like operating systems (including Linux and Mac OS X),
|
||||
and on Windows.
|
||||
|
||||
E-MailRelay can also run as a POP3 server. Messages received over SMTP can be
|
||||
automatically dropped into several independent POP3 mailboxes.
|
||||
E-MailRelay does three things: it stores any incoming e-mail messages that
|
||||
it receives, it forwards e-mail messages on to another remote e-mail server,
|
||||
and it serves up stored e-mail messages to local e-mail reader programs. More
|
||||
technically, it acts as a SMTP storage daemon, a SMTP forwarding agent, and
|
||||
a POP3 server.
|
||||
|
||||
E-MailRelay uses the same non-blocking i/o model as Squid and Nginx giving
|
||||
Whenever an e-mail message is received it can be passed through a user-defined
|
||||
program, such as a spam filter, which can drop, re-address or edit messages as
|
||||
they pass through.
|
||||
|
||||
E-MailRelay uses the same non-blocking i/o model as Squid and nginx giving
|
||||
excellent scalability and resource usage.
|
||||
|
||||
C++ source code is available for Linux, FreeBSD, MacOS X etc, and Windows.
|
||||
Distribution is under the GNU General Public License V3.
|
||||
C++ source code is available and distribution is permitted under the GNU
|
||||
General Public License V3.
|
||||
|
||||
Quick start
|
||||
-----------
|
||||
To use E-MailRelay in store-and-forward mode use the "--as-server" option to
|
||||
start the storage daemon in the background, and then trigger delivery of spooled
|
||||
messages by running with the "--as-client" option and the address of the target
|
||||
host.
|
||||
start the storage daemon in the background, and then do delivery of spooled
|
||||
messages by running with the "--as-client" option.
|
||||
|
||||
For example, to start a storage daemon listening on port 10025 use a command
|
||||
For example, to start a storage daemon listening on port 587 use a command
|
||||
like this:
|
||||
|
||||
emailrelay --as-server --port 10025 --spool-dir /tmp
|
||||
emailrelay --as-server --port 587 --spool-dir /tmp
|
||||
|
||||
And then to forward the spooled mail to "smarthost" run something like this:
|
||||
And then to forward the spooled mail to "smtp.example.com" run something
|
||||
like this:
|
||||
|
||||
emailrelay --as-client smarthost:25 --spool-dir /tmp
|
||||
emailrelay --as-client smtp.example.com:25 --spool-dir /tmp
|
||||
|
||||
To get behaviour more like a proxy you can add the "--poll" option so that
|
||||
messages are forwarded continuously rather than on-demand. This example starts a
|
||||
store-and-forward server that forwards spooled-up e-mail every hour:
|
||||
To get behaviour more like a proxy you can add the "--poll" and "--forward-to"
|
||||
options so that messages are forwarded continuously rather than on-demand.
|
||||
|
||||
emailrelay --as-server --poll 3600 --forward-to smarthost:25
|
||||
This example starts a store-and-forward server that forwards spooled-up e-mail
|
||||
every minute:
|
||||
|
||||
For a proxy server that forwards each message as it is being received, without
|
||||
any delay, you can use the "--as-proxy" mode:
|
||||
emailrelay --as-server --poll 60 --forward-to smtp.example.com:25
|
||||
|
||||
emailrelay --as-proxy smarthost:25
|
||||
Or for a proxy server that forwards each message soon after it has been
|
||||
received, you can use "--as-proxy" or add "--forward-on-disconnect":
|
||||
|
||||
If you want to edit or filter e-mail as it passes through the proxy then specify
|
||||
your pre-processor program with the "--filter" option, something like this:
|
||||
emailrelay --as-server --forward-on-disconnect --forward-to smtp.example.com:25
|
||||
|
||||
emailrelay --as-proxy smarthost:25 --filter /usr/local/bin/addsig
|
||||
To edit or filter e-mail as it passes through the proxy specify your filter
|
||||
program with the "--filter" option, something like this:
|
||||
|
||||
emailrelay --as-proxy smtp.example.com:25 --filter addsig.js
|
||||
|
||||
To run E-MailRelay as a POP server without SMTP use "--pop" and "--no-smtp":
|
||||
|
||||
@ -62,9 +68,6 @@ By default E-MailRelay will always reject connections from remote machines. To
|
||||
allow connections from anywhere use the "--remote-clients" option, but please
|
||||
check your firewall settings to make sure this cannot be exploited by spammers.
|
||||
|
||||
On Windows add "--hidden" to suppress message boxes and also add "--no-daemon"
|
||||
if running as a service.
|
||||
|
||||
For more information on the command-line options refer to the reference guide
|
||||
or run:
|
||||
|
||||
@ -73,62 +76,18 @@ or run:
|
||||
Documentation
|
||||
-------------
|
||||
The following documentation is provided:
|
||||
* README -- this document
|
||||
* COPYING -- the GNU General Public License
|
||||
* INSTALL -- build & install instructions (including the GNU text)
|
||||
* AUTHORS -- authors, credits and additional copyrights
|
||||
* userguide.txt -- user guide
|
||||
* reference.txt -- reference document
|
||||
* ChangeLog -- change log for releases
|
||||
* README -- this document
|
||||
* COPYING -- the GNU General Public License
|
||||
* INSTALL -- generic build & install instructions
|
||||
* AUTHORS -- authors, credits and additional copyrights
|
||||
* userguide.txt -- user guide
|
||||
* reference.txt -- reference document
|
||||
* ChangeLog -- change log for releases
|
||||
|
||||
Source code documentation will be generated when building from source if
|
||||
"doxygen" is available.
|
||||
|
||||
Configurations
|
||||
--------------
|
||||
Recent releases were developed on Ubuntu Linux 12.04 using:
|
||||
* linux 3.2.0
|
||||
* gcc 4.6.3
|
||||
* autoconf 2.68
|
||||
|
||||
and on Windows 7 using:
|
||||
* MSVC 2012
|
||||
* MinGW 20120426
|
||||
* OpenSSL 1.0.1c
|
||||
|
||||
The code was originally developed on SuSE Linux 7.1 using:
|
||||
* linux 2.4.10
|
||||
* gcc 2.95.3
|
||||
* glibc 2.2.4 (libc.so.6)
|
||||
* autoconf 2.52
|
||||
|
||||
and on Windows 98 using:
|
||||
* MSVC 6.0
|
||||
|
||||
Versions of the code have also been built successfully on:
|
||||
* MacOS X 10.3.9
|
||||
* MacOS X 10.5.1 using gcc 4.0.1 on G4 PPC hardware
|
||||
* FreeBSD 9.2 on Intel hardware
|
||||
* Linux on Alpha hardware (Debian 2.2)
|
||||
* Linux on Sparc hardware
|
||||
* Linux on ARM 11 (Raspberry Pi) hardware
|
||||
* Linux on RS6000 PPC hardware
|
||||
* Linux on MIPS embedded hardware using gcc 3.4.6
|
||||
* Linux using clang++ 3.0
|
||||
* Linux using intel c++ 6.0
|
||||
* Linux using intel c++ 10.1
|
||||
* Solaris 8 using gcc on Sparc hardware
|
||||
* Solaris 8 using WorkShop 5.0
|
||||
* Solaris 10
|
||||
* Windows NT 4.0 using MSVC 6.0
|
||||
* Windows NT 4.0 using Cygwin (DLL 1.3.22) and gcc 3.2
|
||||
* Windows NT 4.0 using MinGW 2.0.0 and gcc 3.2
|
||||
* Windows XP using MinGW 3.1.0 gcc 3.4.2
|
||||
* Windows Vista
|
||||
|
||||
Feedback
|
||||
--------
|
||||
Please feel free to e-mail the author at
|
||||
"mailto:graeme_walker@users.sourceforge.net" or the SourceForge mailing list
|
||||
"mailto:emailrelay-help@lists.sourceforge.net".
|
||||
Please feel free to e-mail the author at "mailto:graeme_walker@users.sourceforge.net".
|
||||
|
||||
|
@ -1,10 +0,0 @@
|
||||
E-MailRelay on embedded systems
|
||||
===============================
|
||||
|
||||
OpenWRT
|
||||
-------
|
||||
The OpenWRT system provides an excellent framework for cross-compiling
|
||||
E-MailRelay to run on embedded systems.
|
||||
|
||||
An OpenWRT Makefile for E-MailRelay can be found in the "extra/openwrt"
|
||||
directory. Install it in the OpenWrt tree as package/emailrelay/Makefile.
|
30
README.mac
30
README.mac
@ -1,30 +0,0 @@
|
||||
E-MailRelay on Mac OS X
|
||||
=======================
|
||||
|
||||
Building from source
|
||||
--------------------
|
||||
E-MailRelay can be built from source on Mac OS X using the standard
|
||||
"configure; make; sudo make install" procedure, although for best results you
|
||||
should use the "bin/configure-mac.sh" script to run "configure" with directory
|
||||
paths that are more Mac-like (see below).
|
||||
|
||||
The "make image" command in the "src/gui" directory can be used to build a
|
||||
self-extracting disk image for the native architecture. Project files fox Xcode
|
||||
are also provided to help with building universal binaries.
|
||||
|
||||
Refer to "doc/developer.txt" for more information on Mac packaging.
|
||||
|
||||
Directories
|
||||
-----------
|
||||
The preferred installation directories specified by "bin/configure-mac.sh" are:
|
||||
* "/Applications/E-MailRelay" for the application
|
||||
* "/Applications/E-MailRelay/Documentation" for the documentation
|
||||
* "/Applications/E-MailRelay" for the configuration (not "/Library/Preferences/E-MailRelay")
|
||||
* "/Library/Mail/Spool" for the spool directory
|
||||
* "/Library/StartupItems/E-MailRelay" for the boot-time startup script
|
||||
|
||||
Moving the system after installation is not guaranteed to work perfectly
|
||||
so it is best run configure with the correct directories to start with.
|
||||
Having said that, a disk image built with the standard directories should work
|
||||
reasonably well when installed to the "User" domain with
|
||||
"make DESTDIR=~ install".
|
104
README.md
Normal file
104
README.md
Normal file
@ -0,0 +1,104 @@
|
||||
E-MailRelay Readme
|
||||
==================
|
||||
|
||||
Abstract
|
||||
--------
|
||||
E-MailRelay is an e-mail store-and-forward message transfer agent and proxy
|
||||
server. It runs on Unix-like operating systems (including Linux and Mac OS X),
|
||||
and on Windows.
|
||||
|
||||
E-MailRelay does three things: it stores any incoming e-mail messages that
|
||||
it receives, it forwards e-mail messages on to another remote e-mail server,
|
||||
and it serves up stored e-mail messages to local e-mail reader programs. More
|
||||
technically, it acts as a [SMTP][] storage daemon, a SMTP forwarding agent, and
|
||||
a POP3 server.
|
||||
|
||||
Whenever an e-mail message is received it can be passed through a user-defined
|
||||
program, such as a spam filter, which can drop, re-address or edit messages as
|
||||
they pass through.
|
||||
|
||||

|
||||
|
||||
E-MailRelay uses the same non-blocking i/o model as Squid and nginx giving
|
||||
excellent scalability and resource usage.
|
||||
|
||||
C++ source code is available and distribution is permitted under the GNU
|
||||
General Public License V3.
|
||||
|
||||
Quick start
|
||||
-----------
|
||||
To use E-MailRelay in store-and-forward mode use the `--as-server` option to
|
||||
start the storage daemon in the background, and then do delivery of spooled
|
||||
messages by running with the `--as-client` option.
|
||||
|
||||

|
||||
|
||||
For example, to start a storage daemon listening on port 587 use a command
|
||||
like this:
|
||||
|
||||
emailrelay --as-server --port 587 --spool-dir /tmp
|
||||
|
||||
And then to forward the spooled mail to `smtp.example.com` run something
|
||||
like this:
|
||||
|
||||
emailrelay --as-client smtp.example.com:25 --spool-dir /tmp
|
||||
|
||||
To get behaviour more like a proxy you can add the `--poll` and `--forward-to`
|
||||
options so that messages are forwarded continuously rather than on-demand.
|
||||
|
||||

|
||||
|
||||
This example starts a store-and-forward server that forwards spooled-up e-mail
|
||||
every minute:
|
||||
|
||||
emailrelay --as-server --poll 60 --forward-to smtp.example.com:25
|
||||
|
||||
Or for a proxy server that forwards each message soon after it has been
|
||||
received, you can use `--as-proxy` or add `--forward-on-disconnect`:
|
||||
|
||||
emailrelay --as-server --forward-on-disconnect --forward-to smtp.example.com:25
|
||||
|
||||
To edit or filter e-mail as it passes through the proxy specify your filter
|
||||
program with the `--filter` option, something like this:
|
||||
|
||||
emailrelay --as-proxy smtp.example.com:25 --filter addsig.js
|
||||
|
||||
To run E-MailRelay as a [POP][] server without SMTP use `--pop` and `--no-smtp`:
|
||||
|
||||
emailrelay --pop --no-smtp --log --close-stderr
|
||||
|
||||
The `emailrelay-submit` utility can be used to put messages straight into the
|
||||
spool directory so that the POP clients can fetch them.
|
||||
|
||||
By default E-MailRelay will always reject connections from remote machines. To
|
||||
allow connections from anywhere use the `--remote-clients` option, but please
|
||||
check your firewall settings to make sure this cannot be exploited by spammers.
|
||||
|
||||
For more information on the command-line options refer to the reference guide
|
||||
or run:
|
||||
|
||||
emailrelay --help --verbose
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
The following documentation is provided:
|
||||
|
||||
* README \-\- this document
|
||||
* COPYING \-\- the GNU General Public License
|
||||
* INSTALL \-\- generic build & install instructions
|
||||
* AUTHORS \-\- authors, credits and additional copyrights
|
||||
* userguide.txt \-\- user guide
|
||||
* reference.txt \-\- reference document
|
||||
* ChangeLog \-\- change log for releases
|
||||
|
||||
Source code documentation will be generated when building from source if
|
||||
`doxygen` is available.
|
||||
|
||||
Feedback
|
||||
--------
|
||||
Please feel free to e-mail the author at `mailto:graeme_walker@users.sourceforge.net`.
|
||||
|
||||
|
||||
[POP]: https://en.wikipedia.org/wiki/Post_Office_Protocol
|
||||
[SMTP]: https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
|
||||
|
125
README.rst
Normal file
125
README.rst
Normal file
@ -0,0 +1,125 @@
|
||||
******************
|
||||
E-MailRelay Readme
|
||||
******************
|
||||
|
||||
Abstract
|
||||
========
|
||||
E-MailRelay is an e-mail store-and-forward message transfer agent and proxy
|
||||
server. It runs on Unix-like operating systems (including Linux and Mac OS X),
|
||||
and on Windows.
|
||||
|
||||
E-MailRelay does three things: it stores any incoming e-mail messages that
|
||||
it receives, it forwards e-mail messages on to another remote e-mail server,
|
||||
and it serves up stored e-mail messages to local e-mail reader programs. More
|
||||
technically, it acts as a SMTP_ storage daemon, a SMTP forwarding agent, and
|
||||
a POP3 server.
|
||||
|
||||
Whenever an e-mail message is received it can be passed through a user-defined
|
||||
program, such as a spam filter, which can drop, re-address or edit messages as
|
||||
they pass through.
|
||||
|
||||
.. image:: whatisit.png
|
||||
:alt: whatisit.png
|
||||
|
||||
|
||||
E-MailRelay uses the same non-blocking i/o model as Squid and nginx giving
|
||||
excellent scalability and resource usage.
|
||||
|
||||
C++ source code is available and distribution is permitted under the GNU
|
||||
General Public License V3.
|
||||
|
||||
Quick start
|
||||
===========
|
||||
To use E-MailRelay in store-and-forward mode use the *--as-server* option to
|
||||
start the storage daemon in the background, and then do delivery of spooled
|
||||
messages by running with the *--as-client* option.
|
||||
|
||||
.. image:: serverclient.png
|
||||
:alt: serverclient.png
|
||||
|
||||
|
||||
For example, to start a storage daemon listening on port 587 use a command
|
||||
like this:
|
||||
|
||||
::
|
||||
|
||||
emailrelay --as-server --port 587 --spool-dir /tmp
|
||||
|
||||
And then to forward the spooled mail to *smtp.example.com* run something
|
||||
like this:
|
||||
|
||||
::
|
||||
|
||||
emailrelay --as-client smtp.example.com:25 --spool-dir /tmp
|
||||
|
||||
To get behaviour more like a proxy you can add the *--poll* and *--forward-to*
|
||||
options so that messages are forwarded continuously rather than on-demand.
|
||||
|
||||
.. image:: forwardto.png
|
||||
:alt: forwardto.png
|
||||
|
||||
|
||||
This example starts a store-and-forward server that forwards spooled-up e-mail
|
||||
every minute:
|
||||
|
||||
::
|
||||
|
||||
emailrelay --as-server --poll 60 --forward-to smtp.example.com:25
|
||||
|
||||
Or for a proxy server that forwards each message soon after it has been
|
||||
received, you can use *--as-proxy* or add *--forward-on-disconnect*:
|
||||
|
||||
::
|
||||
|
||||
emailrelay --as-server --forward-on-disconnect --forward-to smtp.example.com:25
|
||||
|
||||
To edit or filter e-mail as it passes through the proxy specify your filter
|
||||
program with the *--filter* option, something like this:
|
||||
|
||||
::
|
||||
|
||||
emailrelay --as-proxy smtp.example.com:25 --filter addsig.js
|
||||
|
||||
To run E-MailRelay as a POP_ server without SMTP use *--pop* and *--no-smtp*:
|
||||
|
||||
::
|
||||
|
||||
emailrelay --pop --no-smtp --log --close-stderr
|
||||
|
||||
The *emailrelay-submit* utility can be used to put messages straight into the
|
||||
spool directory so that the POP clients can fetch them.
|
||||
|
||||
By default E-MailRelay will always reject connections from remote machines. To
|
||||
allow connections from anywhere use the *--remote-clients* option, but please
|
||||
check your firewall settings to make sure this cannot be exploited by spammers.
|
||||
|
||||
For more information on the command-line options refer to the reference guide
|
||||
or run:
|
||||
|
||||
::
|
||||
|
||||
emailrelay --help --verbose
|
||||
|
||||
Documentation
|
||||
=============
|
||||
The following documentation is provided:
|
||||
|
||||
* README -- this document
|
||||
* COPYING -- the GNU General Public License
|
||||
* INSTALL -- generic build & install instructions
|
||||
* AUTHORS -- authors, credits and additional copyrights
|
||||
* userguide.txt -- user guide
|
||||
* reference.txt -- reference document
|
||||
* ChangeLog -- change log for releases
|
||||
|
||||
Source code documentation will be generated when building from source if
|
||||
*doxygen* is available.
|
||||
|
||||
Feedback
|
||||
========
|
||||
Please feel free to e-mail the author at *mailto:graeme_walker@users.sourceforge.net*.
|
||||
|
||||
|
||||
.. _POP: https://en.wikipedia.org/wiki/Post_Office_Protocol
|
||||
.. _SMTP: https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
|
||||
|
104
README.windows
104
README.windows
@ -1,104 +0,0 @@
|
||||
E-MailRelay Windows
|
||||
===================
|
||||
|
||||
Command-line options
|
||||
--------------------
|
||||
There are some differences in the command-line options when running the
|
||||
E-MailRelay server on Windows. These include:
|
||||
* The "--syslog" option refers to the Windows Event Viewer's Application log.
|
||||
* The "--no-daemon" option is used to disable the icon in the system tray.
|
||||
* The "--hidden" option hides all windows and suppresses message boxes (requires "--no-deamon").
|
||||
* The "--peer-lookup" option can be used to add extra information to envelope files for local clients.
|
||||
|
||||
Setup program
|
||||
-------------
|
||||
Installing E-MailRelay on Windows should be straightforward if you have the
|
||||
setup program "emailrelay-setup.exe" and its associated "payload" data file.
|
||||
|
||||
Run "emailrelay-setup.exe" as an administrator if you are going to be installing
|
||||
into sensitive directories like "Program Files". If you don't want to run it as
|
||||
an administrator then you will have to rename to (eg.) "emailrelay-gui.exe" to
|
||||
avoid triggering the UAC mechanism.
|
||||
|
||||
The setup GUI will take you through the installation options and then install
|
||||
the run-time files into your chosen locations.
|
||||
|
||||
Manual installation
|
||||
-------------------
|
||||
In summary, the manual installation process for Windows for when you do not have
|
||||
the self-extracting setup program, is as follows:
|
||||
* Create a new program directory "c:\Program Files\emailrelay"
|
||||
* Copy the packaged files into "Program Files\emailrelay"
|
||||
* Create a new spool directory "c:\windows\system32\spool\emailrelay"
|
||||
* Create a new text file, eg. "c:\emailrelay.auth", to contain account details
|
||||
* Add your account details to "emailrelay.auth" with a line like "client login myaccount mypassword"
|
||||
* Drag "emailrelay.exe" onto the desktop to create a shortcut for the server.
|
||||
* Add "--as-server --verbose" to the server shortcut properties in the "target" box.
|
||||
* Drag again to create a shortcut for the forwarding client.
|
||||
* Add "--as-client myisp.net:smtp --hidden --client-auth c:\emailrelay.auth" to the client shortcut.
|
||||
|
||||
Move shortcuts to "Startup" folders as necessary.
|
||||
|
||||
Running as a service
|
||||
--------------------
|
||||
If you are installing manually you can set up E-MailRelay as a service so that
|
||||
it starts up automatically at boot-time. You must first have a one-line batch
|
||||
file called "emailrelay-start.bat" in the main E-MailRelay directory containing
|
||||
the full E-MailRelay server command-line. Then just run
|
||||
"emailrelay-service --install" to install the service.
|
||||
|
||||
When the E-MailRelay server is run in this way the "--no-daemon" and "--hidden"
|
||||
options are added automatically to whatever is in the "emailrelay-start" batch
|
||||
file so that there is no user interface. (The "--no-daemon" option changes the
|
||||
interface from using the system-tray to using a normal window, and the
|
||||
"--hidden" option suppresses the window and any message boxes.)
|
||||
|
||||
Note that the batch file and the main E-MailRelay executable must be in the same
|
||||
directory; the service wrapper reads the batch file in order to assemble the
|
||||
correct command-line for running the E-MailRelay server, so it needs to know
|
||||
where to find it.
|
||||
|
||||
If you need to run multiple E-MailRelay services then pass a unique service name
|
||||
and display name on the "emailrelay-service --install <name> <display-name>"
|
||||
command-line.
|
||||
|
||||
The service name you give is used to derive the name of the "<name>-start.bat"
|
||||
batch file that contains the E-MailRelay server's command-line options, so you
|
||||
will need to create that first.
|
||||
|
||||
For example:
|
||||
copy emailrelay-start.bat emailrelay-client-start.bat
|
||||
edit emailrelay-client-start.bat
|
||||
emailrelay-service --install emailrelay-client "E-MailRelay Client"
|
||||
copy emailrelay-start.bat emailrelay-server-start.bat
|
||||
edit emailrelay-server-start.bat
|
||||
emailrelay-service --install emailrelay-server "E-MailRelay Server"
|
||||
|
||||
Diagnostics
|
||||
-----------
|
||||
E-MailRelay normally writes errors and warnings into the Windows Event Log,
|
||||
which you can view by running "eventvwr.exe" or going to
|
||||
"ControlPanel"->"SystemAndSecurity"->"AdministrativeTools"->"EventViewer"; from
|
||||
there look under "Windows Logs" and "Application".
|
||||
|
||||
You can increase the verbosity of the logging by adding the "--verbose" option
|
||||
to the E-MailRelay command-line, typically by editing the "emailrelay-start.bat"
|
||||
batch script.
|
||||
|
||||
Telnet
|
||||
------
|
||||
If you want to test E-MailRelay using telnet (as described elsewhere) then you
|
||||
might need to enable the Windows telnet client using
|
||||
"ControlPanel"->"ProgramsAndFeatures"->"TurnWindowsFeaturesOnAndOff".
|
||||
|
||||
Building from source
|
||||
--------------------
|
||||
E-MailRelay can be compiled using various versions of Microsoft Visual Studio
|
||||
C++ (MSVC) or MinGW.
|
||||
|
||||
A Visual Studio "solution" for MSVC 2012 is provided in the "src" directory to
|
||||
build the main E-MailRelay executable, although it does not include a project
|
||||
for the Qt-based installation/configuration GUI.
|
||||
|
||||
For a complete build that includes the E-MailRelay GUI use MinGW, following the
|
||||
instructions in "src/mingw-common.mak" and "doc/developer.txt".
|
2
VERSION
2
VERSION
@ -1 +1 @@
|
||||
1.9
|
||||
2.0
|
||||
|
2746
acinclude.m4
2746
acinclude.m4
File diff suppressed because it is too large
Load Diff
896
aclocal.m4
vendored
896
aclocal.m4
vendored
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@
|
||||
#
|
||||
# Autogenerates stuff.
|
||||
#
|
||||
aclocal
|
||||
aclocal -I .
|
||||
autoconf
|
||||
autoheader
|
||||
automake -a -Woverride -Wportability
|
||||
automake -ac -Woverride -Wportability
|
||||
|
145
bin/Makefile.am
145
bin/Makefile.am
@ -1,113 +1,96 @@
|
||||
#
|
||||
## Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
##
|
||||
## Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
##
|
||||
## 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/>.
|
||||
#
|
||||
|
||||
if MAC
|
||||
e_init_SCRIPTS = E-MailRelay
|
||||
e_init_DATA = StartupParameters.plist
|
||||
else
|
||||
e_init_SCRIPTS = emailrelay
|
||||
e_init_DATA =
|
||||
endif
|
||||
example_scripts = \
|
||||
emailrelay-bcc-check.pl \
|
||||
emailrelay-multicast.sh \
|
||||
emailrelay-process.sh \
|
||||
emailrelay-sendmail.pl
|
||||
|
||||
EXTRA_DIST = \
|
||||
emailrelay.sh_ \
|
||||
doxygen.sh_ \
|
||||
doxygen_fixup.pl_ \
|
||||
txt2html.sh_ \
|
||||
txt2mu.sh_ \
|
||||
mu2html.sh_ \
|
||||
mu2docbook.sh_ \
|
||||
expand.sh_ \
|
||||
emailrelay-notify.sh_ \
|
||||
emailrelay-resubmit.sh_ \
|
||||
emailrelay-deliver.sh_ \
|
||||
emailrelay-process.sh_ \
|
||||
emailrelay-runperl.js \
|
||||
emailrelay-resubmit.js \
|
||||
emailrelay-edit-content.js \
|
||||
emailrelay-edit-envelope.js \
|
||||
emailrelay-submit.sh_ \
|
||||
emailrelay-multicast.sh_ \
|
||||
make-setup.sh_ \
|
||||
make-qt-enabled.sh_ \
|
||||
make-bundle.sh_ \
|
||||
configure-dev.sh \
|
||||
configure-fhs.sh \
|
||||
configure-mac.sh \
|
||||
startup-mac.plist
|
||||
example_scripts_in = \
|
||||
emailrelay-deliver.sh.in \
|
||||
emailrelay-notify.sh.in \
|
||||
emailrelay-resubmit.sh.in \
|
||||
emailrelay-submit.sh.in \
|
||||
emailrelay.sh.in
|
||||
|
||||
example_scripts_out = \
|
||||
emailrelay-deliver.sh \
|
||||
emailrelay-notify.sh \
|
||||
emailrelay-resubmit.sh \
|
||||
emailrelay-submit.sh \
|
||||
emailrelay
|
||||
|
||||
init_scripts = \
|
||||
emailrelay
|
||||
|
||||
work_scripts = \
|
||||
doxygen.sh \
|
||||
doxygen_fixup.pl \
|
||||
txt2mu.sh \
|
||||
mu2html.sh \
|
||||
mu2docbook.sh \
|
||||
expand.sh \
|
||||
txt2html.sh \
|
||||
emailrelay.sh \
|
||||
make-setup.sh \
|
||||
make-qt-enabled.sh \
|
||||
make-bundle.sh
|
||||
make-manifest.sh \
|
||||
make-setup.sh
|
||||
|
||||
noinst_SCRIPTS = \
|
||||
emailrelay-runperl.js \
|
||||
emailrelay-resubmit.js \
|
||||
js_scripts = \
|
||||
emailrelay-edit-content.js \
|
||||
emailrelay-edit-envelope.js \
|
||||
$(work_scripts)
|
||||
emailrelay-resubmit.js \
|
||||
emailrelay-service-install.js
|
||||
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(example_scripts) \
|
||||
$(example_scripts_in) \
|
||||
$(work_scripts) \
|
||||
$(js_scripts)
|
||||
|
||||
noinst_SCRIPTS = \
|
||||
$(work_scripts) \
|
||||
$(js_scripts)
|
||||
|
||||
e_examples_DATA = \
|
||||
emailrelay-process.sh \
|
||||
emailrelay-notify.sh \
|
||||
emailrelay-deliver.sh \
|
||||
emailrelay-resubmit.sh \
|
||||
emailrelay-submit.sh \
|
||||
emailrelay-multicast.sh
|
||||
$(example_scripts)
|
||||
|
||||
CLEANFILES = $(e_init_SCRIPTS) $(e_examples_DATA) $(work_scripts)
|
||||
e_examples_SCRIPTS = \
|
||||
$(example_scripts_out)
|
||||
|
||||
SUFFIXES = .sh_ .sh .pl_ .pl
|
||||
e_init_SCRIPTS = \
|
||||
$(init_scripts)
|
||||
|
||||
.sh_.sh:
|
||||
cat "$(top_srcdir)/bin/$*.sh_" | sed "s%__SPOOL_DIR__%${e_spooldir}%g;s%__SBIN_DIR__%${sbindir}%g;s%__SYSCONF_DIR__%${e_sysconfdir}%g;"'s/\[:digit:\]/0-9/g;s/\[:space:\]/ \\t/g' > "$*.tmp" && mv "$*.tmp" "$*.sh"
|
||||
chmod ugo+x "$*.sh"
|
||||
CLEANFILES = \
|
||||
$(example_scripts_out)
|
||||
|
||||
.pl_.pl:
|
||||
cp "$(top_srcdir)/bin/$*.pl_" "$*.pl"
|
||||
chmod ugo+x "$*.pl"
|
||||
do_sed = sed -e "s%__SPOOL_DIR__%${e_spooldir}%g" -e "s%__SBIN_DIR__%${sbindir}%g" -e "s%__SYSCONF_DIR__%${e_sysconfdir}%g"
|
||||
|
||||
emailrelay: emailrelay.sh
|
||||
cp emailrelay.sh emailrelay
|
||||
chmod ugo+x emailrelay
|
||||
emailrelay-deliver.sh: emailrelay-deliver.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay-deliver.sh.in > emailrelay-deliver.sh
|
||||
chmod +x emailrelay-deliver.sh
|
||||
|
||||
E-MailRelay: emailrelay.sh
|
||||
cp emailrelay.sh $@
|
||||
emailrelay-notify.sh: emailrelay-notify.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay-notify.sh.in > emailrelay-notify.sh
|
||||
chmod +x emailrelay-notify.sh
|
||||
|
||||
StartupParameters.plist: startup-mac.plist
|
||||
cp $(top_srcdir)/bin/startup-mac.plist $@
|
||||
emailrelay-resubmit.sh: emailrelay-resubmit.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay-resubmit.sh.in > emailrelay-resubmit.sh
|
||||
chmod +x emailrelay-resubmit.sh
|
||||
|
||||
install-data-local: install-e_examplesDATA install-e_initSCRIPTS
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-process.sh"
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-notify.sh"
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-deliver.sh"
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-resubmit.sh"
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-submit.sh"
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-multicast.sh"
|
||||
emailrelay-submit.sh: emailrelay-submit.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay-submit.sh.in > emailrelay-submit.sh
|
||||
chmod +x emailrelay-submit.sh
|
||||
|
||||
uninstall-local:
|
||||
-rmdir "$(DESTDIR)$(e_examplesdir)" 2>/dev/null
|
||||
emailrelay: emailrelay.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay.sh.in > emailrelay
|
||||
chmod +x emailrelay
|
||||
|
||||
|
366
bin/Makefile.in
366
bin/Makefile.in
@ -1,9 +1,8 @@
|
||||
# Makefile.in generated by automake 1.11.3 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.15.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
|
||||
# Foundation, Inc.
|
||||
# Copyright (C) 1994-2017 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.
|
||||
@ -20,6 +19,61 @@
|
||||
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
@ -37,14 +91,16 @@ NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
subdir = bin
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/m4_ax_cxx_compile_stdcxx.m4 \
|
||||
$(top_srcdir)/m4/m4_ax_cxx_compile_stdcxx_11.m4 \
|
||||
$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/config.h
|
||||
CONFIG_HEADER = $(top_builddir)/gconfig_defs.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
@ -74,15 +130,35 @@ am__uninstall_files_from_dir = { \
|
||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||
}
|
||||
am__installdirs = "$(DESTDIR)$(e_initdir)" \
|
||||
"$(DESTDIR)$(e_examplesdir)" "$(DESTDIR)$(e_initdir)"
|
||||
SCRIPTS = $(e_init_SCRIPTS) $(noinst_SCRIPTS)
|
||||
am__installdirs = "$(DESTDIR)$(e_examplesdir)" \
|
||||
"$(DESTDIR)$(e_initdir)" "$(DESTDIR)$(e_examplesdir)"
|
||||
SCRIPTS = $(e_examples_SCRIPTS) $(e_init_SCRIPTS) $(noinst_SCRIPTS)
|
||||
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 =
|
||||
DATA = $(e_examples_DATA) $(e_init_DATA)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
DATA = $(e_examples_DATA)
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
@ -91,8 +167,6 @@ AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
COMPILER_VERSION = @COMPILER_VERSION@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
@ -103,13 +177,21 @@ DEPDIR = @DEPDIR@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
GCONFIG_CONFIGURATION = @GCONFIG_CONFIGURATION@
|
||||
GCONFIG_HAVE_DOXYGEN = @GCONFIG_HAVE_DOXYGEN@
|
||||
GCONFIG_HAVE_MAN2HTML = @GCONFIG_HAVE_MAN2HTML@
|
||||
GCONFIG_QT_CFLAGS = @GCONFIG_QT_CFLAGS@
|
||||
GCONFIG_QT_LIBS = @GCONFIG_QT_LIBS@
|
||||
GCONFIG_QT_MOC = @GCONFIG_QT_MOC@
|
||||
GCONFIG_STATIC_END = @GCONFIG_STATIC_END@
|
||||
GCONFIG_STATIC_START = @GCONFIG_STATIC_START@
|
||||
GCONFIG_TLS_LIBS = @GCONFIG_TLS_LIBS@
|
||||
GCONFIG_WINDMC = @GCONFIG_WINDMC@
|
||||
GCONFIG_WINDRES = @GCONFIG_WINDRES@
|
||||
GREP = @GREP@
|
||||
GZIP = @GZIP@
|
||||
G_CAPABILITIES = @G_CAPABILITIES@
|
||||
HAVE_DOXYGEN = @HAVE_DOXYGEN@
|
||||
HAVE_MAN2HTML = @HAVE_MAN2HTML@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@ -123,7 +205,6 @@ MAINT = @MAINT@
|
||||
MAKE = @MAKE@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
MOC = @MOC@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
@ -132,23 +213,19 @@ PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PAM_INCLUDE = @PAM_INCLUDE@
|
||||
PAM_LIBS = @PAM_LIBS@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
QT_CFLAGS = @QT_CFLAGS@
|
||||
QT_LIBS = @QT_LIBS@
|
||||
QT_MOC = @QT_MOC@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SSL_LIBS = @SSL_LIBS@
|
||||
STATIC_END = @STATIC_END@
|
||||
STATIC_START = @STATIC_START@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
ZLIB_LIBS = @ZLIB_LIBS@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
@ -167,13 +244,13 @@ datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
e_bsdinitdir = @e_bsdinitdir@
|
||||
e_docdir = @e_docdir@
|
||||
e_examplesdir = @e_examplesdir@
|
||||
e_icondir = @e_icondir@
|
||||
e_initdir = @e_initdir@
|
||||
e_libexecdir = @e_libexecdir@
|
||||
e_pamdir = @e_pamdir@
|
||||
e_qtmoc = @e_qtmoc@
|
||||
e_spooldir = @e_spooldir@
|
||||
e_sysconfdir = @e_sysconfdir@
|
||||
exec_prefix = @exec_prefix@
|
||||
@ -193,6 +270,7 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -201,71 +279,66 @@ target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
@MAC_FALSE@e_init_SCRIPTS = emailrelay
|
||||
@MAC_TRUE@e_init_SCRIPTS = E-MailRelay
|
||||
@MAC_FALSE@e_init_DATA =
|
||||
@MAC_TRUE@e_init_DATA = StartupParameters.plist
|
||||
EXTRA_DIST = \
|
||||
emailrelay.sh_ \
|
||||
doxygen.sh_ \
|
||||
doxygen_fixup.pl_ \
|
||||
txt2html.sh_ \
|
||||
txt2mu.sh_ \
|
||||
mu2html.sh_ \
|
||||
mu2docbook.sh_ \
|
||||
expand.sh_ \
|
||||
emailrelay-notify.sh_ \
|
||||
emailrelay-resubmit.sh_ \
|
||||
emailrelay-deliver.sh_ \
|
||||
emailrelay-process.sh_ \
|
||||
emailrelay-runperl.js \
|
||||
emailrelay-resubmit.js \
|
||||
emailrelay-edit-content.js \
|
||||
emailrelay-edit-envelope.js \
|
||||
emailrelay-submit.sh_ \
|
||||
emailrelay-multicast.sh_ \
|
||||
make-setup.sh_ \
|
||||
make-qt-enabled.sh_ \
|
||||
make-bundle.sh_ \
|
||||
configure-dev.sh \
|
||||
configure-fhs.sh \
|
||||
configure-mac.sh \
|
||||
startup-mac.plist
|
||||
example_scripts = \
|
||||
emailrelay-bcc-check.pl \
|
||||
emailrelay-multicast.sh \
|
||||
emailrelay-process.sh \
|
||||
emailrelay-sendmail.pl
|
||||
|
||||
example_scripts_in = \
|
||||
emailrelay-deliver.sh.in \
|
||||
emailrelay-notify.sh.in \
|
||||
emailrelay-resubmit.sh.in \
|
||||
emailrelay-submit.sh.in \
|
||||
emailrelay.sh.in
|
||||
|
||||
example_scripts_out = \
|
||||
emailrelay-deliver.sh \
|
||||
emailrelay-notify.sh \
|
||||
emailrelay-resubmit.sh \
|
||||
emailrelay-submit.sh \
|
||||
emailrelay
|
||||
|
||||
init_scripts = \
|
||||
emailrelay
|
||||
|
||||
work_scripts = \
|
||||
doxygen.sh \
|
||||
doxygen_fixup.pl \
|
||||
txt2mu.sh \
|
||||
mu2html.sh \
|
||||
mu2docbook.sh \
|
||||
expand.sh \
|
||||
txt2html.sh \
|
||||
emailrelay.sh \
|
||||
make-setup.sh \
|
||||
make-qt-enabled.sh \
|
||||
make-bundle.sh
|
||||
make-manifest.sh \
|
||||
make-setup.sh
|
||||
|
||||
noinst_SCRIPTS = \
|
||||
emailrelay-runperl.js \
|
||||
emailrelay-resubmit.js \
|
||||
js_scripts = \
|
||||
emailrelay-edit-content.js \
|
||||
emailrelay-edit-envelope.js \
|
||||
$(work_scripts)
|
||||
emailrelay-resubmit.js \
|
||||
emailrelay-service-install.js
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(example_scripts) \
|
||||
$(example_scripts_in) \
|
||||
$(work_scripts) \
|
||||
$(js_scripts)
|
||||
|
||||
noinst_SCRIPTS = \
|
||||
$(work_scripts) \
|
||||
$(js_scripts)
|
||||
|
||||
e_examples_DATA = \
|
||||
emailrelay-process.sh \
|
||||
emailrelay-notify.sh \
|
||||
emailrelay-deliver.sh \
|
||||
emailrelay-resubmit.sh \
|
||||
emailrelay-submit.sh \
|
||||
emailrelay-multicast.sh
|
||||
$(example_scripts)
|
||||
|
||||
CLEANFILES = $(e_init_SCRIPTS) $(e_examples_DATA) $(work_scripts)
|
||||
SUFFIXES = .sh_ .sh .pl_ .pl
|
||||
e_examples_SCRIPTS = \
|
||||
$(example_scripts_out)
|
||||
|
||||
e_init_SCRIPTS = \
|
||||
$(init_scripts)
|
||||
|
||||
CLEANFILES = \
|
||||
$(example_scripts_out)
|
||||
|
||||
do_sed = sed -e "s%__SPOOL_DIR__%${e_spooldir}%g" -e "s%__SBIN_DIR__%${sbindir}%g" -e "s%__SYSCONF_DIR__%${e_sysconfdir}%g"
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .sh_ .sh .pl_ .pl
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
@ -278,7 +351,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu bin/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu bin/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
@ -296,10 +368,48 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
install-e_examplesSCRIPTS: $(e_examples_SCRIPTS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(e_examples_SCRIPTS)'; test -n "$(e_examplesdir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(e_examplesdir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(e_examplesdir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
|
||||
done | \
|
||||
sed -e 'p;s,.*/,,;n' \
|
||||
-e 'h;s|.*|.|' \
|
||||
-e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
|
||||
$(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)$(e_examplesdir)$$dir'"; \
|
||||
$(INSTALL_SCRIPT) $$files "$(DESTDIR)$(e_examplesdir)$$dir" || exit $$?; \
|
||||
} \
|
||||
; done
|
||||
|
||||
uninstall-e_examplesSCRIPTS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(e_examples_SCRIPTS)'; test -n "$(e_examplesdir)" || exit 0; \
|
||||
files=`for p in $$list; do echo "$$p"; done | \
|
||||
sed -e 's,.*/,,;$(transform)'`; \
|
||||
dir='$(DESTDIR)$(e_examplesdir)'; $(am__uninstall_files_from_dir)
|
||||
install-e_initSCRIPTS: $(e_init_SCRIPTS)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(e_initdir)" || $(MKDIR_P) "$(DESTDIR)$(e_initdir)"
|
||||
@list='$(e_init_SCRIPTS)'; test -n "$(e_initdir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(e_initdir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(e_initdir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
|
||||
@ -330,8 +440,11 @@ uninstall-e_initSCRIPTS:
|
||||
dir='$(DESTDIR)$(e_initdir)'; $(am__uninstall_files_from_dir)
|
||||
install-e_examplesDATA: $(e_examples_DATA)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(e_examplesdir)" || $(MKDIR_P) "$(DESTDIR)$(e_examplesdir)"
|
||||
@list='$(e_examples_DATA)'; test -n "$(e_examplesdir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(e_examplesdir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(e_examplesdir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; \
|
||||
@ -346,29 +459,11 @@ uninstall-e_examplesDATA:
|
||||
@list='$(e_examples_DATA)'; test -n "$(e_examplesdir)" || list=; \
|
||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||
dir='$(DESTDIR)$(e_examplesdir)'; $(am__uninstall_files_from_dir)
|
||||
install-e_initDATA: $(e_init_DATA)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(e_initdir)" || $(MKDIR_P) "$(DESTDIR)$(e_initdir)"
|
||||
@list='$(e_init_DATA)'; test -n "$(e_initdir)" || list=; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; \
|
||||
done | $(am__base_list) | \
|
||||
while read files; do \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(e_initdir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(e_initdir)" || exit $$?; \
|
||||
done
|
||||
tags TAGS:
|
||||
|
||||
uninstall-e_initDATA:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(e_init_DATA)'; test -n "$(e_initdir)" || list=; \
|
||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||
dir='$(DESTDIR)$(e_initdir)'; $(am__uninstall_files_from_dir)
|
||||
tags: TAGS
|
||||
TAGS:
|
||||
ctags CTAGS:
|
||||
|
||||
ctags: CTAGS
|
||||
CTAGS:
|
||||
cscope cscopelist:
|
||||
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@ -405,7 +500,7 @@ check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(SCRIPTS) $(DATA)
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(e_initdir)" "$(DESTDIR)$(e_examplesdir)" "$(DESTDIR)$(e_initdir)"; do \
|
||||
for dir in "$(DESTDIR)$(e_examplesdir)" "$(DESTDIR)$(e_initdir)" "$(DESTDIR)$(e_examplesdir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
@ -459,8 +554,8 @@ info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am: install-data-local install-e_examplesDATA \
|
||||
install-e_initDATA install-e_initSCRIPTS
|
||||
install-data-am: install-e_examplesDATA install-e_examplesSCRIPTS \
|
||||
install-e_initSCRIPTS
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
@ -504,54 +599,47 @@ ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-e_examplesDATA uninstall-e_initDATA \
|
||||
uninstall-e_initSCRIPTS uninstall-local
|
||||
uninstall-am: uninstall-e_examplesDATA uninstall-e_examplesSCRIPTS \
|
||||
uninstall-e_initSCRIPTS
|
||||
|
||||
.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-data-local install-dvi install-dvi-am \
|
||||
install-e_examplesDATA install-e_initDATA \
|
||||
.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
|
||||
ctags-am 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-e_examplesDATA install-e_examplesSCRIPTS \
|
||||
install-e_initSCRIPTS 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 uninstall-e_examplesDATA uninstall-e_initDATA \
|
||||
uninstall-e_initSCRIPTS uninstall-local
|
||||
mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags-am \
|
||||
uninstall uninstall-am uninstall-e_examplesDATA \
|
||||
uninstall-e_examplesSCRIPTS uninstall-e_initSCRIPTS
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
.sh_.sh:
|
||||
cat "$(top_srcdir)/bin/$*.sh_" | sed "s%__SPOOL_DIR__%${e_spooldir}%g;s%__SBIN_DIR__%${sbindir}%g;s%__SYSCONF_DIR__%${e_sysconfdir}%g;"'s/\[:digit:\]/0-9/g;s/\[:space:\]/ \\t/g' > "$*.tmp" && mv "$*.tmp" "$*.sh"
|
||||
chmod ugo+x "$*.sh"
|
||||
emailrelay-deliver.sh: emailrelay-deliver.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay-deliver.sh.in > emailrelay-deliver.sh
|
||||
chmod +x emailrelay-deliver.sh
|
||||
|
||||
.pl_.pl:
|
||||
cp "$(top_srcdir)/bin/$*.pl_" "$*.pl"
|
||||
chmod ugo+x "$*.pl"
|
||||
emailrelay-notify.sh: emailrelay-notify.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay-notify.sh.in > emailrelay-notify.sh
|
||||
chmod +x emailrelay-notify.sh
|
||||
|
||||
emailrelay: emailrelay.sh
|
||||
cp emailrelay.sh emailrelay
|
||||
chmod ugo+x emailrelay
|
||||
emailrelay-resubmit.sh: emailrelay-resubmit.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay-resubmit.sh.in > emailrelay-resubmit.sh
|
||||
chmod +x emailrelay-resubmit.sh
|
||||
|
||||
E-MailRelay: emailrelay.sh
|
||||
cp emailrelay.sh $@
|
||||
emailrelay-submit.sh: emailrelay-submit.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay-submit.sh.in > emailrelay-submit.sh
|
||||
chmod +x emailrelay-submit.sh
|
||||
|
||||
StartupParameters.plist: startup-mac.plist
|
||||
cp $(top_srcdir)/bin/startup-mac.plist $@
|
||||
|
||||
install-data-local: install-e_examplesDATA install-e_initSCRIPTS
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-process.sh"
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-notify.sh"
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-deliver.sh"
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-resubmit.sh"
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-submit.sh"
|
||||
chmod ugo+x "$(DESTDIR)$(e_examplesdir)/emailrelay-multicast.sh"
|
||||
|
||||
uninstall-local:
|
||||
-rmdir "$(DESTDIR)$(e_examplesdir)" 2>/dev/null
|
||||
emailrelay: emailrelay.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay.sh.in > emailrelay
|
||||
chmod +x emailrelay
|
||||
|
||||
# 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.
|
||||
|
@ -1,72 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# configure-dev.sh
|
||||
#
|
||||
# A convenience script that runs the emailrelay "../configure" script
|
||||
# for developers.
|
||||
#
|
||||
|
||||
configure="./configure"
|
||||
if test ! -f "${configure}" ; then configure="../configure" ; fi
|
||||
if test ! -f "${configure}" ; then configure="../../configure" ; fi
|
||||
chmod +x "${configure}" 2> /dev/null
|
||||
|
||||
gnu()
|
||||
{
|
||||
env \
|
||||
CPPFLAGS="-D_FORTIFY_SOURCE=2" \
|
||||
CXXFLAGS="-Wall -Wextra -pedantic -g -O0 -fno-omit-frame-pointer -fstack-protector" \
|
||||
CFLAGS="-Wall -Wextra -pedantic -g -O0 -fstack-protector" \
|
||||
LDFLAGS="-g" \
|
||||
"$@"
|
||||
}
|
||||
|
||||
llvm()
|
||||
{
|
||||
w_on="-Wall -Wextra -Weverything -pedantic"
|
||||
w_off="-Wno-weak-vtables -Wno-padded -Wno-exit-time-destructors -Wno-missing-noreturn -Wno-global-constructors"
|
||||
#sanity="-fsanitize=address -fsanitize=init-order -fsanitize=integer -fsanitize=undefined -fsanitize=dataflow"
|
||||
env \
|
||||
CC=clang \
|
||||
CXX=clang++ \
|
||||
CPP="clang -E" \
|
||||
LD=clang++ \
|
||||
CPPFLAGS="-D_FORTIFY_SOURCE=2" \
|
||||
CXXFLAGS="$w_on $w_off -g -O0 -fno-omit-frame-pointer -fstack-protector $sanity" \
|
||||
CFLAGS="$w_on -g -O0 -fstack-protector" \
|
||||
LDFLAGS="-g" \
|
||||
"$@"
|
||||
}
|
||||
|
||||
args()
|
||||
{
|
||||
echo \
|
||||
--enable-debug \
|
||||
--prefix=$HOME/tmp/usr \
|
||||
--exec-prefix=$HOME/tmp/usr \
|
||||
--datadir=$HOME/tmp/usr/share \
|
||||
--localstatedir=$HOME/tmp/var \
|
||||
--libexecdir=$HOME/tmp/usr/lib \
|
||||
--sysconfdir=$HOME/etc \
|
||||
e_initdir=$HOME/etc/init.d
|
||||
}
|
||||
|
||||
#gnu ${configure} `args` "$@"
|
||||
llvm ${configure} `args` "$@"
|
||||
|
@ -1,44 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# configure-fhs.sh
|
||||
#
|
||||
# A convenience script that runs the emailrelay "../configure" script with
|
||||
# directory options that are more FHS-like.
|
||||
#
|
||||
# $ cd src/emailrelay-1.99
|
||||
# $ mkdir build
|
||||
# $ cd build
|
||||
# $ sh ../bin/configure-fhs.sh
|
||||
# $ make
|
||||
# $ sudo make install
|
||||
#
|
||||
|
||||
configure="./configure"
|
||||
if test ! -f "${configure}" ; then configure="../configure" ; fi
|
||||
if test ! -f "${configure}" ; then configure="../../configure" ; fi
|
||||
chmod +x "${configure}" 2> /dev/null
|
||||
|
||||
${configure} \
|
||||
--prefix=/usr \
|
||||
--exec-prefix=/usr \
|
||||
--datadir=/usr/share \
|
||||
--localstatedir=/var \
|
||||
--libexecdir=/usr/lib \
|
||||
--sysconfdir=/etc \
|
||||
e_initdir=/etc/init.d "$@"
|
@ -1,59 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# configure-mac.sh
|
||||
#
|
||||
# A convenience script that runs the emailrelay "../configure" script for
|
||||
# Mac OS X.
|
||||
#
|
||||
# $ cd src/emailrelay-1.99
|
||||
# $ mkdir build
|
||||
# $ cd build
|
||||
# $ sh ../bin/configure-mac.sh
|
||||
# $ make
|
||||
#
|
||||
# After configuring with this script the installation can be done
|
||||
# with "make install" for a system-wide installation, or with
|
||||
# "make install DESTDIR=~" for a private installation.
|
||||
#
|
||||
# The default definition of "e_initdir" ensures that the server starts
|
||||
# up automatically at boot time.
|
||||
#
|
||||
|
||||
app="/Applications/E-MailRelay"
|
||||
lib="/Library"
|
||||
|
||||
configure="./configure"
|
||||
if test ! -f "${configure}" ; then configure="../configure" ; fi
|
||||
if test ! -f "${configure}" ; then configure="../../configure" ; fi
|
||||
chmod +x "${configure}" 2> /dev/null
|
||||
|
||||
${configure} \
|
||||
--enable-mac \
|
||||
--sbindir="${app}" \
|
||||
e_qtmoc=/usr/bin/moc \
|
||||
e_libexecdir="${app}" \
|
||||
e_examplesdir="${app}/Documentation/examples" \
|
||||
e_sysconfdir="${app}" \
|
||||
--mandir="${app}/Documentation/man" \
|
||||
e_icondir="${app}" \
|
||||
e_docdir="${app}/Documentation" \
|
||||
e_spooldir="${lib}/Mail/Spool" \
|
||||
e_pamdir="/etc/pam.d" \
|
||||
e_initdir="${lib}/StartupItems/E-MailRelay" "$@"
|
||||
|
56
bin/doxygen.sh
Executable file
56
bin/doxygen.sh
Executable file
@ -0,0 +1,56 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# doxygen.sh
|
||||
#
|
||||
# Used from doc/Makefile to run doxygen. Works correctly in a vpath build by
|
||||
# creating a doxygen configuration file on the fly. Copies a dummy html
|
||||
# file if doxygen is not installed.
|
||||
#
|
||||
# The ephemeral doxygen config file ("doxygen.cfg") is created from the
|
||||
# template file ("doxygen.cfg.in"), with variable substitution for the
|
||||
# root directories.
|
||||
#
|
||||
# usage: doxygen.sh <have-doxygen> <top-srcdir> <top-builddir> <out-sub-dir> [<doxyfile-in> [<doxyfile-out> [<missing-html>]]]
|
||||
#
|
||||
# eg: doxygen "$(GCONFIG_HAVE_DOXYGEN)" "$(top_srcdir)" "$(top_builddir)" doxygen.cfg.in doxygen.cfg doxygen-missing.html
|
||||
#
|
||||
#
|
||||
|
||||
HAVE_DOXYGEN="$1"
|
||||
top_srcdir="$2"
|
||||
top_builddir="$3"
|
||||
subdir="${4-doxygen}"
|
||||
doxyfile_in="${5-doxygen.cfg.in}"
|
||||
doxyfile_out="${6-doxygen.cfg}"
|
||||
missing_html="${7-doxygen-missing.html}"
|
||||
|
||||
if test "$HAVE_DOXYGEN" = "yes"
|
||||
then
|
||||
cat "${top_srcdir}/doc/${doxyfile_in}" | \
|
||||
sed "s:__TOP_SRC__:${top_srcdir}:g" | \
|
||||
sed "s:__TOP_BUILD__:${top_builddir}:g" | \
|
||||
cat > "${doxyfile_out}"
|
||||
rm -f doxygen.out html/index.html 2>/dev/null
|
||||
cat "${doxyfile_out}" | doxygen - > doxygen.out 2>&1
|
||||
test -f "${subdir}/index.html"
|
||||
else
|
||||
mkdir "${subdir}" 2>/dev/null
|
||||
cp -f "${top_srcdir}/doc/${missing_html}" "${subdir}/index.html"
|
||||
fi
|
||||
|
@ -1,48 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# doxygen.sh
|
||||
#
|
||||
# Used by doc/Makefile to run doxygen with a bit of config-file pre-processing.
|
||||
#
|
||||
# usage: doxygen <have-doxygen> <top-srcdir> <top-builddir> [<doxyfile-out>]
|
||||
#
|
||||
|
||||
HAVE_DOXYGEN="$1"
|
||||
top_srcdir="$2"
|
||||
top_builddir="$3"
|
||||
doxyfile_out="$4"
|
||||
|
||||
if test "$HAVE_DOXYGEN" = "yes"
|
||||
then
|
||||
if test "${doxyfile_out}" != ""
|
||||
then
|
||||
cat "${top_srcdir}/doc/doxygen.cfg" | \
|
||||
sed "s:__TOP_SRC__:${top_srcdir}:g" | \
|
||||
sed "s:__TOP_BUILD__:${top_builddir}:g" | \
|
||||
cat > "${doxyfile_out}"
|
||||
fi
|
||||
cat "${top_srcdir}/doc/doxygen.cfg" | \
|
||||
sed "s:__TOP_SRC__:${top_srcdir}:g" | \
|
||||
sed "s:__TOP_BUILD__:${top_builddir}:g" | \
|
||||
doxygen -
|
||||
else
|
||||
mkdir doxygen 2>/dev/null
|
||||
cp -f "${top_srcdir}/doc/doxygen-missing.html" doxygen/index.html
|
||||
fi
|
||||
|
@ -1,96 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# doxygen_fixup.pl
|
||||
#
|
||||
# usage: doxygen_fixup.pl [<doc-doxygen-directory>]
|
||||
#
|
||||
# Does fixups on the doxygen-generated html files by adding
|
||||
# css styles that emailrelay-doxygen.css can operate on.
|
||||
#
|
||||
# Note that the html header file speficied in doc/doxygen.cfg
|
||||
# (typically doc/doxygen-header.html) should include the
|
||||
# emailrelay-doxygen.css stylesheet after including doxygen.css.
|
||||
#
|
||||
# Designed for doxygen 1.6.x/1.7.x and does nothing (with an exit
|
||||
# code of 1) if there is no suitable version marker in the html files.
|
||||
#
|
||||
# Typically run by the emailrelay/doc makefile after it has run
|
||||
# doxygen.
|
||||
#
|
||||
|
||||
use strict ;
|
||||
use FileHandle ;
|
||||
|
||||
my $dir = @ARGV ? $ARGV[0] : "." ;
|
||||
|
||||
my $any_file_changed = 0 ;
|
||||
my $marker = 'edited by doxygen_fixup.pl' ;
|
||||
my $comment = '<!-- '.$marker.' -->' ;
|
||||
for my $f ( <$dir/*> )
|
||||
{
|
||||
if( $f =~ m/\.html$/ )
|
||||
{
|
||||
my $input = new FileHandle( $f , "r" ) or die "cannot open $f" ;
|
||||
my $output = new FileHandle( "$f.tmp" , "w" ) or die "cannot create $f.tmp" ;
|
||||
my $seen_marker = undef ;
|
||||
my $file_changed = undef ;
|
||||
while ( <$input> )
|
||||
{
|
||||
chomp( my $line = $_ ) ;
|
||||
$seen_marker ||= ( $line =~ m/Generated by Doxygen 1\.6/ ) ;
|
||||
$seen_marker ||= ( $line =~ m/Generated by Doxygen 1\.7/ ) ;
|
||||
my $old_line = $line ;
|
||||
$line =~ s/p>References/p class="references">References/g ;
|
||||
$line =~ s/p>Referenced by/p class="referencedby">Referenced by/g ;
|
||||
$line =~ s/p>Definition at/p class="definitionat">Definition at/g ;
|
||||
$line =~ s/p>Implements /p class="implements">Implements /g ;
|
||||
if( $line =~ m/<td class="memname".* <\/td> *$/ )
|
||||
{
|
||||
$line =~ s/>/> /g ;
|
||||
$line =~ s/</ </g ;
|
||||
my @word = split( ' ' , $line ) ;
|
||||
if( scalar(@word) > 2 )
|
||||
{
|
||||
my $n = scalar(@word) - 2 ;
|
||||
if( $n =~ m/^[A-Za-z0-9&;:_]+$/ )
|
||||
{
|
||||
$word[$n] = '<span class="realmemname">' . $word[$n] . "</span>" ;
|
||||
$line = join( " " , @word ) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
my $line_changed = ( $line ne $old_line ) ;
|
||||
my $line_has_comment = ( $line =~ m/$marker/ ) ;
|
||||
print $output $line , ( ( $line_changed && !$line_has_comment ) ? "" : $comment ) , "\n" ;
|
||||
$file_changed ||= $line_changed ;
|
||||
}
|
||||
$output->close() or die "cannot write $f.tmp" ;
|
||||
$input->close() ;
|
||||
if( $file_changed && $seen_marker )
|
||||
{
|
||||
rename( "$f.tmp" , $f ) or die "cannot rename $f.tmp to $f" ;
|
||||
$any_file_changed = 1 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
unlink( "$f.tmp" ) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
exit( $any_file_changed ? 0 : 1 ) ;
|
139
bin/emailrelay-bcc-check.pl
Executable file
139
bin/emailrelay-bcc-check.pl
Executable file
@ -0,0 +1,139 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# emailrelay-bcc-check.pl
|
||||
#
|
||||
# An example emailrelay filter script that rejects messages
|
||||
# that have a non-empty "Bcc:" recipient list unless the "Bcc:"
|
||||
# recipient list contains a single addressee that matches
|
||||
# envelope recipient.
|
||||
#
|
||||
# Bcc handling is generally only a concern for e-mail user agent
|
||||
# programs and not relays and proxies. User agents should
|
||||
# normally submit a message separately for each Bcc recipient
|
||||
# with either no "Bcc:" field or with the "Bcc:" field
|
||||
# containing that one recipient (see RFC-5322).
|
||||
#
|
||||
# Note that correct parsing of content files is beyond the
|
||||
# scope of a simple example script like this, and incorrect
|
||||
# Bcc handling can have a serious privacy implications.
|
||||
#
|
||||
|
||||
use strict ;
|
||||
use FileHandle ;
|
||||
$SIG{__DIE__} = sub { (my $e = join(" ",@_)) =~ s/\n/ /g ; print "<<error: $e>>\n" ; exit 99 } ;
|
||||
|
||||
my $content = @ARGV[0] or die "usage error\n" ;
|
||||
my $verbose = 1 ;
|
||||
|
||||
# read the bcc list from the content file
|
||||
my %c = headers( $content ) ;
|
||||
my @bcc = split( /,/ , $c{Bcc} ) ; # todo -- allow for commas in quoted strings
|
||||
map { print "BCC=[$_]\n" } @bcc if $verbose ;
|
||||
|
||||
# allow if there is no bcc list or it's empty
|
||||
exit 0 if scalar(@bcc) == 0 ;
|
||||
my $bcc = $bcc[0] =~ s/^\s*"?//r =~ s/"?\s*$//r ;
|
||||
exit 0 if( $bcc =~ m/^\s*$/ ) ;
|
||||
|
||||
# read the recipient list from the envelope file
|
||||
my @rcp = read_fields( find_envelope($content) , qr/^X-MailRelay-To-Remote:\s*(.*)/ ) ;
|
||||
map { print "RECIPIENT=[$_]\n" } @rcp if $verbose ;
|
||||
|
||||
# allow if there are no (remote) recipients at all
|
||||
exit 0 if scalar(@rcp) == 0 ;
|
||||
my $rcp = $rcp[0] ;
|
||||
|
||||
# allow if one recipient matching one bcc
|
||||
exit 0 if( scalar(@rcp) == 1 && scalar(@bcc) == 1 && $bcc =~ m/\Q$rcp\E/ ) ;
|
||||
|
||||
# deny otherwise
|
||||
print "<<bcc error>>\n" ;
|
||||
exit 1 ;
|
||||
|
||||
sub headers
|
||||
{
|
||||
my ( $file ) = @_ ;
|
||||
my $fh = open_file( $file ) ;
|
||||
my %h = read_headers( $fh ) ;
|
||||
$fh->close() or die ;
|
||||
return %h ;
|
||||
}
|
||||
|
||||
sub read_headers
|
||||
{
|
||||
my ( $fh ) = @_ ;
|
||||
my %h = () ;
|
||||
my $k ;
|
||||
while(<$fh>)
|
||||
{
|
||||
chomp( my $line = $_ ) ;
|
||||
$line =~ s/\r$// ;
|
||||
last if ( $line eq "" ) ;
|
||||
my ( $a , $b , $c , $d ) = ( $line =~ m/^(\S*):\s*(.*)|^(\s)(.*)/ ) ;
|
||||
if( $a ) { $h{$a} = $b ; $k = $a }
|
||||
if( $k && $d ) { $h{$k} .= "$c$d" }
|
||||
}
|
||||
return %h ;
|
||||
}
|
||||
|
||||
sub open_file
|
||||
{
|
||||
my ( $file ) = @_ ;
|
||||
my $fh = new FileHandle( $file , "r" ) or die "cannot open [$file]: $!\n" ;
|
||||
return $fh ;
|
||||
}
|
||||
|
||||
sub envelope
|
||||
{
|
||||
my ( $content , $ext ) = @_ ;
|
||||
$ext = "" if !defined($ext) ;
|
||||
$content =~ m/\.content$/ or die "invalid content filename [$content]\n" ;
|
||||
( my $envelope = $content ) =~ s/\.content$/.envelope/ ;
|
||||
$envelope .= $ext ;
|
||||
return $envelope ;
|
||||
}
|
||||
|
||||
sub find_envelope
|
||||
{
|
||||
my ( $content ) = @_ ;
|
||||
map { return $_ if -f $_ } map { envelope($content,$_) } ( "" , ".new" , ".busy" ) ;
|
||||
die "no envelope for [$content]\n" ;
|
||||
}
|
||||
|
||||
sub read_fields
|
||||
{
|
||||
my ( $file , $re ) = @_ ;
|
||||
return map { s/$re/$1/ ; $_ } grep { m/$re/ } read_all( $file ) ;
|
||||
}
|
||||
|
||||
sub read_all
|
||||
{
|
||||
my ( $file ) = @_ ;
|
||||
my $fh = open_file( $file ) ;
|
||||
my @lines = () ;
|
||||
while(<$fh>)
|
||||
{
|
||||
chomp( my $line = $_ ) ;
|
||||
$line =~ s/\r$// ;
|
||||
push @lines , $line ;
|
||||
}
|
||||
$fh->close() or die ;
|
||||
return @lines ;
|
||||
}
|
||||
|
@ -1,17 +1,17 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
@ -24,7 +24,7 @@
|
||||
# usage: emailrelay-deliver.sh [<spool-dir>]
|
||||
#
|
||||
# This illustrates how delivery to local "postmaster" mailboxes could be done,
|
||||
# although it is not likely to be a useful feature for a typical mail relay
|
||||
# although it is not likely to be a useful feature for a typical mail relay
|
||||
# setup.
|
||||
#
|
||||
|
||||
@ -57,8 +57,8 @@ do
|
||||
content="`echo \"${file}\" | sed 's/envelope/content/'`"
|
||||
|
||||
deliver_to="`fgrep X-MailRelay-To-Local ${file} | sed 's/X-MailRelay-To-Local: //' | tr -d '\015' | sed \"s/postmaster/${postmaster}/g\"`"
|
||||
if test "${deliver_to}" = ""
|
||||
then
|
||||
if test "${deliver_to}" = ""
|
||||
then
|
||||
deliver_to="${postmaster}"
|
||||
fi
|
||||
|
@ -1,28 +1,28 @@
|
||||
//
|
||||
// Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
//
|
||||
// Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
//
|
||||
// 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/>.
|
||||
// ===
|
||||
//
|
||||
// emailrelay-edit-content.js
|
||||
//
|
||||
// An example "--filter" script for Windows that edits the message's content
|
||||
// An example "--filter" script for Windows that edits the message's content
|
||||
// file.
|
||||
//
|
||||
// In this example every "teh" is changed to "the".
|
||||
//
|
||||
try
|
||||
try
|
||||
{
|
||||
// parse the command-line to get the content filename
|
||||
var content = WScript.Arguments(0) ;
|
||||
@ -39,7 +39,7 @@ try
|
||||
{
|
||||
var line = in_.ReadLine() ;
|
||||
out_.WriteLine( line ) ;
|
||||
if( line == "" )
|
||||
if( line === "" )
|
||||
break ;
|
||||
}
|
||||
|
||||
@ -55,12 +55,13 @@ try
|
||||
// replace the content file
|
||||
in_.Close() ;
|
||||
out_.Close() ;
|
||||
fs.DeleteFile( content ) ;
|
||||
fs.MoveFile( content + ".tmp" , content ) ;
|
||||
|
||||
// successful exit
|
||||
WScript.Quit( 0 ) ;
|
||||
}
|
||||
catch( e )
|
||||
}
|
||||
catch( e )
|
||||
{
|
||||
// report errors using the special <<...>> markers
|
||||
WScript.StdOut.WriteLine( "<<" + e + ">>" ) ;
|
||||
|
@ -1,30 +1,34 @@
|
||||
//
|
||||
// Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
//
|
||||
// Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
//
|
||||
// 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/>.
|
||||
// ===
|
||||
//
|
||||
// emailrelay-edit-envelope.js
|
||||
//
|
||||
// An example "--filter" script for Windows that edits the message's envelope
|
||||
// An example "--filter" script for Windows that edits the message's envelope
|
||||
// file.
|
||||
//
|
||||
// In this example the "Authentication" field in the envelope file is modified.
|
||||
// This field is used as the AUTH parameter when the emailrelay server forwards
|
||||
// the message to the downstream server.
|
||||
// In this example the "MailFromAuthOut" field in the envelope file is
|
||||
// modified; this is used as the MAIL FROM AUTH parameter when the emailrelay
|
||||
// server forwards the message to the downstream server. In principle
|
||||
// (RFC-2554) when relaying the outgoing MAIL FROM AUTH value should be the
|
||||
// same as the incoming value iff the submitting client was authenticated
|
||||
// and trusted; or it can be the the submitting client's authentication id
|
||||
// if there was no incoming value; or it can be "<>".
|
||||
//
|
||||
try
|
||||
try
|
||||
{
|
||||
// parse the command-line to get the envelope filename
|
||||
var content = WScript.Arguments(0) ;
|
||||
@ -38,12 +42,25 @@ try
|
||||
var txt = ts.ReadAll() ;
|
||||
ts.Close() ;
|
||||
|
||||
// configuration -- this is what we are putting into the envelope file
|
||||
var auth = "secret" ;
|
||||
// read the incoming values
|
||||
var re_auth_in = new RegExp( "^X-MailRelay-MailFromAuthIn: *(\\S*)" , "m" ) ;
|
||||
txt.match( re_auth_in ) ;
|
||||
var auth_in = RegExp.lastParen ;
|
||||
var re_authentication = new RegExp( "^X-MailRelay-Authentication: *(\\S*)" , "m" ) ;
|
||||
txt.match( re_authentication ) ;
|
||||
var authentication = RegExp.lastParen ;
|
||||
|
||||
// make the change
|
||||
var re = new RegExp( "X-MailRelay-Authentication: *\\w*" ) ;
|
||||
txt = txt.replace( re , "X-MailRelay-Authentication: " + auth ) ;
|
||||
// choose the auth-out value
|
||||
var auth_out = "<>" ;
|
||||
if( authentication )
|
||||
{
|
||||
function xtext( x ) { return x } // todo
|
||||
auth_out = auth_in ? auth_in : xtext(authentication) ;
|
||||
}
|
||||
|
||||
// set the auth-out
|
||||
var re = new RegExp( "X-MailRelay-MailFromAuthOut: *\\S*" ) ;
|
||||
txt = txt.replace( re , "X-MailRelay-MailFromAuthOut: " + auth_out ) ;
|
||||
|
||||
// write the envelope file back out
|
||||
ts = fs.OpenTextFile( envelope , 2 , false ) ;
|
||||
@ -52,8 +69,8 @@ try
|
||||
|
||||
// successful exit
|
||||
WScript.Quit( 0 ) ;
|
||||
}
|
||||
catch( e )
|
||||
}
|
||||
catch( e )
|
||||
{
|
||||
// report errors using the special <<...>> markers
|
||||
WScript.StdOut.WriteLine( "<<" + e + ">>" ) ;
|
||||
|
22
bin/emailrelay-multicast.sh_ → bin/emailrelay-multicast.sh
Normal file → Executable file
22
bin/emailrelay-multicast.sh_ → bin/emailrelay-multicast.sh
Normal file → Executable file
@ -1,29 +1,29 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# emailrelay-multicast.sh
|
||||
#
|
||||
# An example "--filter" script that copies/links each new message into all
|
||||
# avaliable sub-directories of the main spool directory. The original message
|
||||
# files are deleted if they were successfully copied/linked into all
|
||||
# An example "--filter" script that copies/links each new message into all
|
||||
# avaliable sub-directories of the main spool directory. The original message
|
||||
# files are deleted if they were successfully copied/linked into all
|
||||
# sub-directories.
|
||||
#
|
||||
# This can be used for doing SMTP multicast by having an emailrelay forwarding
|
||||
# This can be used for doing SMTP multicast by having an emailrelay forwarding
|
||||
# process polling each sub-directory. (For POP multicasting use the
|
||||
# "emailrelay-filter-copy" program with the "pop-by-name" feature so that
|
||||
# there is no need to copy or link content files.)
|
||||
@ -32,8 +32,8 @@
|
||||
# entries are written into the base envelope file to help with error recovery.
|
||||
#
|
||||
# The remote SMTP client which is submitting the message will be notified of any
|
||||
# failures in this script via SMTP error responses. Alternatively an "exit 0"
|
||||
# can be used to silently leave the message in the main spool directory (see
|
||||
# failures in this script via SMTP error responses. Alternatively an "exit 0"
|
||||
# can be used to silently leave the message in the main spool directory (see
|
||||
# below).
|
||||
#
|
||||
|
||||
@ -82,7 +82,7 @@ then
|
||||
rm -f "${content}" "${envelope}"
|
||||
exit 100
|
||||
else
|
||||
# something failed -- tell the submitting smtp client
|
||||
# something failed -- tell the submitting smtp client
|
||||
# replace these two lines with "exit 0" if the client should not know...
|
||||
echo "<<`basename $0`: `basename "${content}"`: failed to copy message into${error_list}>>"
|
||||
exit 1
|
@ -1,30 +1,30 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
#
|
||||
# emailrelay-notify.sh
|
||||
#
|
||||
# Looks for failed mail in the E-MailRelay spool directory and sends failure
|
||||
# Looks for failed mail in the E-MailRelay spool directory and sends failure
|
||||
# notification messages using 'procmail'.
|
||||
#
|
||||
# usage: emailrelay-notify.sh [<spool-dir>]
|
||||
#
|
||||
# Notification of failed e-mail by means of e-mail messages is a requirement
|
||||
# imposed by the SMTP specification. However, a simpler approach might be more
|
||||
# Notification of failed e-mail by means of e-mail messages is a requirement
|
||||
# imposed by the SMTP specification. However, a simpler approach might be more
|
||||
# appropriate -- for example, a line like this in a ".profile" script:
|
||||
#
|
||||
# if test -f /var/spool/emailrelay/*.envelope.bad ; then echo Failed mail >&2 ; fi
|
||||
@ -66,8 +66,8 @@ do
|
||||
reason="`fgrep MailRelay-Reason \"${file}\" | sed 's/X-[^ ]*Reason: //' | tr -d '\015'`"
|
||||
from="`fgrep MailRelay-From \"${file}\" | sed 's/X-MailRelay-From: //' | tr -d '\015'`"
|
||||
deliver_to="${from}"
|
||||
if test "${deliver_to}" = ""
|
||||
then
|
||||
if test "${deliver_to}" = ""
|
||||
then
|
||||
deliver_to="root"
|
||||
fi
|
||||
|
12
bin/emailrelay-process.sh_ → bin/emailrelay-process.sh
Normal file → Executable file
12
bin/emailrelay-process.sh_ → bin/emailrelay-process.sh
Normal file → Executable file
@ -1,24 +1,24 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# emailrelay-process.sh
|
||||
#
|
||||
# An example "--filter" script for the E-MailRelay SMTP server which does
|
||||
# An example "--filter" script for the E-MailRelay SMTP server which does
|
||||
# rot-13 masking.
|
||||
#
|
||||
|
||||
@ -63,7 +63,7 @@ ProcessContent()
|
||||
is_blank = match($0,"^[[:space:]]*$")
|
||||
if( in_header && is_blank )
|
||||
in_header = 0
|
||||
|
||||
|
||||
if( in_header )
|
||||
print
|
||||
else
|
@ -1,24 +1,24 @@
|
||||
//
|
||||
// Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
//
|
||||
// Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
//
|
||||
// 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/>.
|
||||
// ===
|
||||
//
|
||||
// emailrelay-resubmit.js
|
||||
//
|
||||
// A utility script for Windows that looks for all failed e-mails in the
|
||||
// E-MailRelay spool directory and resubmits them. However, if an e-mail has
|
||||
// A utility script for Windows that looks for all failed e-mails in the
|
||||
// E-MailRelay spool directory and resubmits them. However, if an e-mail has
|
||||
// been retried five times already then it is not submitted again.
|
||||
//
|
||||
// usage: cscript //nologo emailrelay-resubmit.js [<spool-dir>]
|
||||
@ -26,7 +26,7 @@
|
||||
|
||||
// configuration
|
||||
//
|
||||
var cfg_store = "c:/windows/spool/emailrelay" ;
|
||||
var cfg_store = "C:/ProgramData/E-MailRelay/spool" ;
|
||||
var cfg_retry_limit = 5 ;
|
||||
var cfg_debug = false ;
|
||||
|
||||
@ -53,7 +53,7 @@ function debug( line )
|
||||
var fso = WScript.CreateObject( "Scripting.FileSystemObject" ) ;
|
||||
if( ! fso.FolderExists( cfg_store ) )
|
||||
{
|
||||
WScript.StdOut.WriteLine( "invalid spool directory: \"" + cfg_store + "\"" ) ;
|
||||
WScript.Echo( "invalid spool directory: \"" + cfg_store + "\"" ) ;
|
||||
WScript.Quit( 1 ) ;
|
||||
}
|
||||
|
||||
|
@ -1,24 +1,24 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# emailrelay-resubmit.sh
|
||||
#
|
||||
# Looks for all failed e-mails in the E-MailRelay spool directory and resubmits
|
||||
# Looks for all failed e-mails in the E-MailRelay spool directory and resubmits
|
||||
# them. However, if an e-mail has been retried five times already then it is not
|
||||
# resubmitted again.
|
||||
#
|
||||
@ -34,12 +34,12 @@ retry_limit="5"
|
||||
#
|
||||
if test $# -ge 1
|
||||
then
|
||||
store="${1}"
|
||||
store="$1"
|
||||
fi
|
||||
|
||||
# check the spool directory is valid
|
||||
#
|
||||
if test \! -d "${store}"
|
||||
if test \! -d "$store"
|
||||
then
|
||||
echo `basename $0`: invalid spool directory >&2
|
||||
exit 1
|
||||
@ -47,15 +47,15 @@ fi
|
||||
|
||||
# for each failed e-mail...
|
||||
#
|
||||
for file in "${store}"/emailrelay.*.envelope.bad ""
|
||||
ls -1 "$store/emailrelay.*.envelope.bad" | while read file
|
||||
do
|
||||
if test -f "${file}"
|
||||
if test -f "$file"
|
||||
then
|
||||
failures="`fgrep MailRelay-Reason: < \"${file}\" | wc -l`"
|
||||
if test "${failures}" -lt "${retry_limit}"
|
||||
if test "$failures" -lt "$retry_limit"
|
||||
then
|
||||
good_file="`echo \"${file}\" | sed 's/\.bad$//'`"
|
||||
mv -f "${file}" "${good_file}"
|
||||
mv -f "$file" "$good_file"
|
||||
fi
|
||||
fi
|
||||
done
|
@ -1,96 +0,0 @@
|
||||
//
|
||||
// Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
//
|
||||
// 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/>.
|
||||
// ===
|
||||
//
|
||||
// emailrelay-runperl.js
|
||||
//
|
||||
// An example "--filter" script for Windows that runs a perl script
|
||||
// to process e-mails.
|
||||
//
|
||||
// The perl script is expected to read the e-mail content on its
|
||||
// standard input and write it out again on standard output, with
|
||||
// a zero exit code on success (like spamassassin, for example).
|
||||
//
|
||||
// The E-MailRelay command-line should look something like this:
|
||||
//
|
||||
// emailrelay --as-server --filter "c:/program\ files/emailrelay/emailrelay-runperl.js"
|
||||
//
|
||||
// Note the backslash to escape the space in the path.
|
||||
//
|
||||
|
||||
var rc = 1 ;
|
||||
try
|
||||
{
|
||||
// configuration -- edit these lines as necessary, but avoid spaces in paths
|
||||
var cfg_perl = "perl -S -T -w" ;
|
||||
var cfg_perl_script = "spamassassin" ;
|
||||
|
||||
// parse our command line
|
||||
var args = WScript.Arguments ;
|
||||
var filename = args(0) ;
|
||||
|
||||
// prepare a perl commandline with quotes and redirection etc
|
||||
var cmd_in = "\"" + filename + "\"" ;
|
||||
var cmd_out = "\"" + filename + ".tmp\"" ;
|
||||
var cmd_err = "\"" + filename + ".err\"" ;
|
||||
var cmd_perl = "cmd /c " + cfg_perl + " " + cfg_perl_script ;
|
||||
var cmd = cmd_perl + " < " + cmd_in + " > " + cmd_out + " 2> " + cmd_err ;
|
||||
|
||||
// run the perl command
|
||||
var sh = WScript.CreateObject("WScript.Shell") ;
|
||||
rc = sh.Run( cmd , 0 , true ) ;
|
||||
|
||||
// check the file redirection worked
|
||||
var fs = WScript.CreateObject("Scripting.FileSystemObject") ;
|
||||
if( !fs.FileExists(filename+".tmp") || !fs.FileExists(filename+".err") )
|
||||
{
|
||||
throw "file redirection error" ;
|
||||
}
|
||||
|
||||
// check for perl script errors
|
||||
if( rc != 0 )
|
||||
{
|
||||
// read one line of the perl script's standard error
|
||||
var reason = "non-zero exit" ;
|
||||
var errorstream = fs.OpenTextFile( filename + ".err" , 1 )
|
||||
if( ! errorstream.AtEndOfStream )
|
||||
reason = errorstream.ReadLine() ;
|
||||
errorstream.Close() ;
|
||||
|
||||
// clean up
|
||||
fs.DeleteFile( filename + ".err" ) ;
|
||||
fs.DeleteFile( filename + ".tmp" ) ;
|
||||
|
||||
throw reason ;
|
||||
}
|
||||
|
||||
// clean up
|
||||
fs.DeleteFile( filename ) ;
|
||||
fs.DeleteFile( filename + ".err" ) ;
|
||||
|
||||
// install the perl script output as the new content file
|
||||
fs.MoveFile( filename + ".tmp" , filename ) ;
|
||||
|
||||
// successful exit
|
||||
WScript.Quit( 0 ) ;
|
||||
}
|
||||
catch( e )
|
||||
{
|
||||
// report errors using the special <<...>> markers
|
||||
WScript.StdOut.WriteLine( "<<" + e + ">>" ) ;
|
||||
WScript.Quit( rc ) ;
|
||||
}
|
||||
|
34
bin/emailrelay-sendmail.pl
Executable file
34
bin/emailrelay-sendmail.pl
Executable file
@ -0,0 +1,34 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# emailrelay-sendmail.pl
|
||||
#
|
||||
# A sendmail/emailrelay shim. Typically installed as /usr/sbin/sendmail or /usr/lib/sendmail.
|
||||
#
|
||||
use strict ;
|
||||
use Getopt::Std ;
|
||||
use FileHandle ;
|
||||
|
||||
my $usage = "usage: emailrelay-sendmail [-intUv] [-BbCdFhNOopqRrVX <arg>] [-f <from>]" ;
|
||||
my %opt = () ;
|
||||
getopts( 'B:b:C:d:F:f:h:iN:nO:o:p:q:R:r:tUV:vX:' , \%opt ) or die "$usage\n" ;
|
||||
|
||||
my $from = defined($opt{f}) ? $opt{f} : $ENV{USER} ;
|
||||
my @args = ( "-f" , $from ) ;
|
||||
my $exe = "/usr/sbin/emailrelay-submit" ;
|
||||
exec { $exe } @args ;
|
111
bin/emailrelay-service-install.js
Normal file
111
bin/emailrelay-service-install.js
Normal file
@ -0,0 +1,111 @@
|
||||
//
|
||||
// Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
//
|
||||
// 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/>.
|
||||
// ===
|
||||
//
|
||||
// emailrelay-service-install.js
|
||||
//
|
||||
// Runs "emailrelay-service --install" and then opens the service control panel.
|
||||
//
|
||||
|
||||
try
|
||||
{
|
||||
var title = "E-MailRelay Service Install" ;
|
||||
var shell = WScript.CreateObject( "WScript.Shell" ) ;
|
||||
var fs = WScript.CreateObject( "Scripting.FileSystemObject" ) ;
|
||||
var this_dir = fs.GetParentFolderName(WScript.ScriptFullName) ;
|
||||
|
||||
// find the installation program's configuration file
|
||||
var config_file_1 = this_dir + "\\emailrelay-service.cfg" ;
|
||||
var config_file_2 = fs.GetParentFolderName(this_dir) + "\\emailrelay-service.cfg" ;
|
||||
var config_file = fs.FileExists(config_file_1) ? config_file_1 : config_file_2 ;
|
||||
if( !fs.FileExists(config_file) )
|
||||
throw "No installation config file [" + config_file_1 + "] or [" + config_file_2 + "]" ;
|
||||
var dir_install = fs.GetParentFolderName( config_file ) ;
|
||||
|
||||
// read and parse the config file
|
||||
var dir_config = "" ;
|
||||
{
|
||||
var f = fs.OpenTextFile( config_file ) ;
|
||||
var config_text = f.ReadAll() ;
|
||||
f.Close() ;
|
||||
|
||||
var re_config = new RegExp( "^dir.config=([ \\S]*)" , "m" ) ;
|
||||
var re_dequote = new RegExp( "\"?([^\"]*)" ) ;
|
||||
|
||||
config_text.match( re_config ) ;
|
||||
dir_config = RegExp.lastParen ;
|
||||
dir_config.match( re_dequote ) ;
|
||||
dir_config = RegExp.lastParen ;
|
||||
}
|
||||
if( !dir_config )
|
||||
throw "Cannot parse the config file [" + config_file + "]" ;
|
||||
|
||||
// check for the startup batch file containing the server configuration
|
||||
var startup_batch_file = dir_config + "\\emailrelay-start.bat" ;
|
||||
if( !fs.FileExists(startup_batch_file) )
|
||||
throw "No startup batch file [" + startup_batch_file + "]" ;
|
||||
|
||||
// check for the service wrapper
|
||||
var service_wrapper = dir_install + "\\emailrelay-service.exe" ;
|
||||
if( !fs.FileExists(startup_batch_file) )
|
||||
throw "No service wrapper [" + service_wrapper + "]" ;
|
||||
|
||||
var ok = shell.Popup( "About to run [" + service_wrapper + " --install]" , 0 , title , 1 ) ;
|
||||
if( ok === 1 )
|
||||
{
|
||||
// do the service wrapper installation
|
||||
var exec = shell.exec( "cmd.exe /c \"" + service_wrapper + "\" --install" ) ;
|
||||
//var exec = shell.exec( service_wrapper + " --install" ) ;
|
||||
while( exec.Status === 0 )
|
||||
{
|
||||
WScript.Sleep( 100 ) ;
|
||||
}
|
||||
|
||||
// report the results
|
||||
var stdout_text = exec.StdOut.ReadAll() ;
|
||||
var stderr_text = exec.StdErr.ReadAll() ;
|
||||
var success = !stderr_text && ( exec.ExitCode === 0 ) ;
|
||||
var text = (success?"Service installed":"Service installation failed") + ": " +
|
||||
"exit " + exec.ExitCode + "\n" +
|
||||
stdout_text + "\n" +
|
||||
stderr_text ;
|
||||
var topmost = 262144 ;
|
||||
var foreground = 65536 ;
|
||||
var icon_info = 0 ;
|
||||
var icon_hand = 16 ;
|
||||
var icon_question = 1 ;
|
||||
shell.Popup( text , 0 , title , topmost+foreground+(success?icon_info:icon_hand) ) ;
|
||||
|
||||
// optionally open the services control panel
|
||||
if( success )
|
||||
{
|
||||
if( 1 === shell.Popup( "Open the services control panel?" , 0 , title , topmost+foreground+icon_question ) )
|
||||
shell.exec( "cmd.exe /c %windir%\\system32\\services.msc" ) ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw "Cancelled" ;
|
||||
}
|
||||
|
||||
WScript.Quit( 0 ) ;
|
||||
}
|
||||
catch( e )
|
||||
{
|
||||
shell.Popup( "Error: " + e , 0 , "E-MailRelay Service Install" , 16 ) ;
|
||||
WScript.Quit( 1 ) ;
|
||||
}
|
||||
|
@ -1,17 +1,17 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
187
bin/emailrelay.sh.in
Normal file
187
bin/emailrelay.sh.in
Normal file
@ -0,0 +1,187 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# emailrelay
|
||||
#
|
||||
# A shell-script wrapper for E-MailRelay for use in the SysV-init system.
|
||||
#
|
||||
# usage: emailrelay { start | stop | restart | force-reload | status }
|
||||
#
|
||||
# See also: install_initd, remove_initd
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: emailrelay
|
||||
# Required-Start: $local_fs $network $syslog
|
||||
# Required-Stop: $local_fs $network $syslog
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: E-MailRelay store-and-forward MTA.
|
||||
### END INIT INFO
|
||||
##
|
||||
|
||||
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||
NAME=emailrelay
|
||||
DESC=$NAME
|
||||
CONFIG=__SYSCONF_DIR__/emailrelay.conf
|
||||
RUNDIR=/var/run/$NAME
|
||||
PIDFILE=$RUNDIR/$NAME.pid
|
||||
GROUP=daemon
|
||||
DAEMON=__SBIN_DIR__/$NAME
|
||||
SUBMIT=__SBIN_DIR__/$NAME-submit
|
||||
|
||||
test -f /etc/default/$NAME && . /etc/default/$NAME
|
||||
test -f /etc/rc.conf.d/$NAME && . /etc/rc.conf.d/$NAME
|
||||
test -f /etc/default/rcS && . /etc/default/rcS
|
||||
|
||||
log_success_msg() {
|
||||
echo "$@"
|
||||
}
|
||||
log_failure_msg() {
|
||||
echo "$@"
|
||||
}
|
||||
log_warning_msg() {
|
||||
echo "$@"
|
||||
}
|
||||
start_daemon() {
|
||||
if test "`cat \"$2\" 2>/dev/null`" -gt 0 2>/dev/null && kill -0 "`cat \"$2\"`"
|
||||
then
|
||||
: # running already
|
||||
else
|
||||
shift ; shift ; shift
|
||||
"$@"
|
||||
fi
|
||||
}
|
||||
killproc() {
|
||||
shift
|
||||
kill `cat "$1" 2>/dev/null` 2>/dev/null
|
||||
}
|
||||
pidofproc() {
|
||||
shift
|
||||
kill -0 `cat "$1" 2>/dev/null` 2>/dev/null
|
||||
}
|
||||
log_daemon_msg() {
|
||||
log_success_msg "$@"
|
||||
}
|
||||
log_progress_msg() {
|
||||
:;
|
||||
}
|
||||
log_end_msg() {
|
||||
if test "$1" -eq 0 ; then log_success_msg "...ok" ; else log_failure_msg "...failed!" ; fi
|
||||
}
|
||||
|
||||
setup_config()
|
||||
{
|
||||
if test ! -f "$CONFIG" -a -f "$CONFIG.template"
|
||||
then
|
||||
cp -p "$CONFIG.template" "$CONFIG"
|
||||
fi
|
||||
}
|
||||
|
||||
setup_rundir()
|
||||
{
|
||||
if test ! -d "$1"
|
||||
then
|
||||
mkdir -p "$1" && chgrp "$GROUP" "$1" && chmod 770 "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
spooldir()
|
||||
{
|
||||
cat "$CONFIG" | tr '\t' ' ' | sed 's/ */ /g' | grep '^spool-dir [^ ]' | tail -1 | cut -d' ' -f 2
|
||||
}
|
||||
|
||||
setup_spooldir()
|
||||
{
|
||||
if test "$1" != ""
|
||||
then
|
||||
if test ! -d "$1"
|
||||
then
|
||||
mkdir -p "$1" && chgrp "$GROUP" "$1" && chmod 775 "$1" && chmod g+s "$1"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# do some setup steps -- these should have been done by
|
||||
# make-install or by the packaging scripts, but the /etc/default
|
||||
# file could have been changed or something -- do this before
|
||||
# the potential init-functions redirect to systemd
|
||||
if test "$1" = "start"
|
||||
then
|
||||
setup_config
|
||||
setup_rundir "`dirname \"$PIDFILE\"`" 2>/dev/null
|
||||
setup_spooldir "`spooldir`" 2>/dev/null
|
||||
fi
|
||||
|
||||
test -f /lib/lsb/init-functions && . /lib/lsb/init-functions
|
||||
|
||||
case "$1" in
|
||||
|
||||
restart|force-reload)
|
||||
$0 stop
|
||||
$0 start
|
||||
;;
|
||||
|
||||
*start)
|
||||
log_daemon_msg "Starting $DESC"
|
||||
log_progress_msg "$NAME"
|
||||
start_daemon -p "$PIDFILE" -- "$DAEMON" --syslog --pid-file "$PIDFILE" "$CONFIG"
|
||||
log_end_msg $?
|
||||
;;
|
||||
|
||||
stop)
|
||||
log_daemon_msg "Stopping $DESC"
|
||||
log_progress_msg "$NAME"
|
||||
killproc -p "$PIDFILE" "$DAEMON"
|
||||
log_end_msg $?
|
||||
;;
|
||||
|
||||
try-restart|reload|force-reload)
|
||||
echo `basename $0`: $1 not implemented >&2
|
||||
exit 3
|
||||
;;
|
||||
|
||||
status)
|
||||
if pidofproc -p "$PIDFILE" "$DAEMON" >/dev/null
|
||||
then
|
||||
log_success_msg "$NAME is running"
|
||||
true
|
||||
else
|
||||
log_failure_msg "$NAME is not running"
|
||||
false
|
||||
fi
|
||||
;;
|
||||
|
||||
setup)
|
||||
setup_rundir "`dirname \"$PIDFILE\"`"
|
||||
setup_spooldir "`spooldir`"
|
||||
|
||||
chmod 550 "$DAEMON"
|
||||
chgrp "$GROUP" "$DAEMON"
|
||||
chmod g+s "$DAEMON"
|
||||
|
||||
chmod 555 "$SUBMIT"
|
||||
chgrp "$GROUP" "$SUBMIT"
|
||||
chmod g+s "$SUBMIT"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo usage: `basename $0` "{start|stop|restart|status}" >&2
|
||||
exit 2
|
||||
;;
|
||||
|
||||
esac
|
@ -1,225 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# emailrelay
|
||||
#
|
||||
# A shell-script wrapper for E-MailRelay for use in the SysV-init system.
|
||||
#
|
||||
# Additional command-line options for the emailrelay daemon are sourced from
|
||||
# the file "/etc/emailrelay.conf" if it exists. Uncommented lines in this
|
||||
# file have "--" prepended to them and then they are pasted onto the command
|
||||
# line.
|
||||
#
|
||||
# usage: emailrelay { start | stop | restart | force-reload | status }
|
||||
#
|
||||
|
||||
##
|
||||
# LSB comment block...
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: emailrelay
|
||||
# Required-Start: $network
|
||||
# Required-Stop: $network
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: E-MailRelay SMTP proxy and store-and-forward MTA.
|
||||
### END INIT INFO
|
||||
##
|
||||
|
||||
# initialise
|
||||
#
|
||||
PATH="$PATH:/sbin:/bin:/usr/bin"
|
||||
ECHO="echo" ; if test -x /bin/echo ; then ECHO="/bin/echo" ; fi
|
||||
var_run="/var/run" ; if test -d "$var_run" -a -w "$var_run" ; then : ; else var_run="/tmp" ; fi
|
||||
pid_file="$var_run/emailrelay.pid"
|
||||
config_file="__SYSCONF_DIR__/emailrelay.conf"
|
||||
config_file_template="__SYSCONF_DIR__/emailrelay.conf.template"
|
||||
emailrelay="__SBIN_DIR__/emailrelay" # (absolute path required in some environments)
|
||||
if test \! -x "$emailrelay" ; then emailrelay="`pwd`/emailrelay" ; fi
|
||||
local_errno=0
|
||||
|
||||
# check the command line
|
||||
#
|
||||
usage="{ start | stop | restart | force-reload | status }"
|
||||
if test $# -eq 0
|
||||
then
|
||||
echo usage: `basename $0` "$usage" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# choose an infrastructure -- linux-standard-base (lsb) or not
|
||||
#
|
||||
if test -f /lib/lsb/init-functions
|
||||
then
|
||||
. /lib/lsb/init-functions
|
||||
do_cmd_start()
|
||||
{
|
||||
lsb_text="$1"
|
||||
shift
|
||||
start_daemon -p "$pid_file" "$@"
|
||||
local_errno=$?
|
||||
if test "$local_errno" -eq 0
|
||||
then
|
||||
log_success_msg "$lsb_text"
|
||||
else
|
||||
log_failure_msg "$lsb_text"
|
||||
fi
|
||||
}
|
||||
do_cmd_stop()
|
||||
{
|
||||
lsb_text="$1"
|
||||
killproc -p "$pid_file" "`basename \"$2\"`"
|
||||
local_errno=$?
|
||||
if test "$local_errno" -eq 0
|
||||
then
|
||||
log_success_msg "$lsb_text"
|
||||
else
|
||||
log_failure_msg "$lsb_text"
|
||||
fi
|
||||
}
|
||||
do_cmd_restarted()
|
||||
{
|
||||
local_errno="$?"
|
||||
}
|
||||
do_cmd_status()
|
||||
{
|
||||
lsb_text="$1"
|
||||
base="`basename \"$2\"`"
|
||||
pids="`pidofproc -p \"$pid_file\" \"$base\" | sed 's/ *$//'`"
|
||||
if test "$pids" != ""
|
||||
then
|
||||
local_errno="0"
|
||||
log_success_msg "$lsb_text"
|
||||
else
|
||||
local_errno="1"
|
||||
log_failure_msg "$lsb_text"
|
||||
fi
|
||||
}
|
||||
do_exit()
|
||||
{
|
||||
exit "$local_errno"
|
||||
}
|
||||
else
|
||||
do_cmd_start()
|
||||
{
|
||||
$ECHO -n "$1"
|
||||
shift
|
||||
"$@"
|
||||
local_errno="$?"
|
||||
if test "$local_errno" -eq 0
|
||||
then
|
||||
$ECHO " ... done"
|
||||
else
|
||||
$ECHO " ... failed"
|
||||
fi
|
||||
}
|
||||
do_cmd_stop()
|
||||
{
|
||||
$ECHO -n "$1"
|
||||
if test -f "$pid_file" && test "`cat \"$pid_file\"`" != ""
|
||||
then
|
||||
kill "`cat $pid_file`"
|
||||
rm -f "$pid_file" 2>/dev/null
|
||||
fi
|
||||
$ECHO " ... done"
|
||||
local_errno="0" # (could do better)
|
||||
}
|
||||
do_cmd_restarted()
|
||||
{
|
||||
local_errno="$?"
|
||||
}
|
||||
do_cmd_status()
|
||||
{
|
||||
$ECHO -n "$1"
|
||||
if test -f "$pid_file" && test "`cat \"$pid_file\"`" != "" && kill -0 "`cat \"$pid_file\"`" 2>/dev/null
|
||||
then
|
||||
$ECHO " ... running"
|
||||
local_errno="0"
|
||||
elif test -f "$pid_file"
|
||||
then
|
||||
$ECHO " ... failed"
|
||||
local_errno="1"
|
||||
else
|
||||
$ECHO " ... not running"
|
||||
local_errno="3"
|
||||
fi
|
||||
}
|
||||
do_exit()
|
||||
{
|
||||
exit "$local_errno"
|
||||
}
|
||||
fi
|
||||
|
||||
install_on_first_run()
|
||||
{
|
||||
# create a default config file if necessary and if possible
|
||||
if test -f "$config_file_template" -a ! -f "$config_file"
|
||||
then
|
||||
cp -p "$config_file_template" "$config_file"
|
||||
fi
|
||||
}
|
||||
|
||||
config_options()
|
||||
{
|
||||
# echo --options from the config file
|
||||
cat "$config_file" 2>/dev/null | egrep -v '^#|^gui-|^ *$' | sed 's/^/--/'
|
||||
}
|
||||
|
||||
start_options()
|
||||
{
|
||||
# echo start command tail
|
||||
echo --as-server --pid-file "$pid_file" `config_options`
|
||||
}
|
||||
|
||||
# process the command line
|
||||
#
|
||||
install_on_first_run
|
||||
case "$1" in
|
||||
|
||||
start)
|
||||
shift
|
||||
do_cmd_start "Starting E-MailRelay server" "$emailrelay" `start_options` "$@"
|
||||
;;
|
||||
|
||||
stop)
|
||||
do_cmd_stop "Shutting down E-MailRelay" "$emailrelay"
|
||||
;;
|
||||
|
||||
restart|force-reload)
|
||||
shift
|
||||
$0 stop
|
||||
$0 start "$@"
|
||||
do_cmd_restarted
|
||||
;;
|
||||
|
||||
try-restart|reload|force-reload)
|
||||
echo `basename $0`: $1 not implemented >&2
|
||||
exit 3
|
||||
;;
|
||||
|
||||
status)
|
||||
do_cmd_status "Checking for E-MailRelay" "$emailrelay"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo usage: `basename $0` "$usage" >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
do_exit
|
||||
|
118
bin/expand.sh_
118
bin/expand.sh_
@ -1,118 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# expand.sh
|
||||
#
|
||||
# Expands "#include#<file>#" directives.
|
||||
#
|
||||
# Only does one sustitution per line. Directives which start the line are
|
||||
# multi-line. Those within a line are one-line, expanded in-place.
|
||||
#
|
||||
# The "-t" switch can be used to suppress expansion where the included
|
||||
# file has an extension of ".html".
|
||||
#
|
||||
# In edit mode (--edit) the specified file is modified in-place. With this
|
||||
# switch the exit value is 0 (shell true) if the file is modified in any
|
||||
# way. This allows for recursive expansion using a shell while loop.
|
||||
#
|
||||
# usage: expand.sh [-a <awk>] [-t] { --edit <file> | [<file> ...] }
|
||||
#
|
||||
|
||||
Usage()
|
||||
{
|
||||
echo usage: `basename $0` '[-a <awk>] [-t] { --edit <file> | [<file> ...] }' >&2
|
||||
}
|
||||
|
||||
tmp="/tmp/`basename $0`.$$.tmp"
|
||||
|
||||
awk=`( gawk 'END {print "gawk"}' ; nawk 'END {print "nawk"}' ; echo awk ) 2>/dev/null < /dev/null | head -1`
|
||||
if test "${1}" = "-a"
|
||||
then
|
||||
shift
|
||||
awk="${1}"
|
||||
shift
|
||||
fi
|
||||
|
||||
expand_html="1"
|
||||
if test "${1}" = "-t"
|
||||
then
|
||||
shift
|
||||
expand_html="0"
|
||||
fi
|
||||
|
||||
edit="0"
|
||||
if test "${1}" = "--edit"
|
||||
then
|
||||
shift
|
||||
edit="1"
|
||||
if test $# -ne 1 ; then Usage ; exit 1 ; fi
|
||||
fi
|
||||
|
||||
Expand()
|
||||
{
|
||||
${awk} -v expand_html="${expand_html}" -v cat="${awk} '{print}'" '
|
||||
BEGIN { modified = 0 }
|
||||
{
|
||||
line = $0
|
||||
if( match(line,"#include#[^#]*#") )
|
||||
{
|
||||
rstart = RSTART
|
||||
directive = substr(line,RSTART,RLENGTH)
|
||||
path = substr(line,RSTART+9,RLENGTH-10)
|
||||
|
||||
if( !expand_html && match(path,".html$") )
|
||||
{
|
||||
print line
|
||||
}
|
||||
else
|
||||
{
|
||||
modified = 1
|
||||
head = substr(line,1,rstart-1)
|
||||
if( match(head,"^[\t ]*$") )
|
||||
{
|
||||
system( cat " " path )
|
||||
}
|
||||
else
|
||||
{
|
||||
getline text <path
|
||||
if( length(text) == 0 )
|
||||
printf( "expand.sh: warning: line %d: empty text sustitution for %s\n" , NR , path ) >"/dev/fd/2"
|
||||
sub( directive , text , line )
|
||||
print line
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
print line
|
||||
}
|
||||
}
|
||||
END { exit ! modified }
|
||||
' $@
|
||||
}
|
||||
|
||||
if test "${edit}" -eq 1
|
||||
then
|
||||
# (use cp rather than mv here to protect read-only files)
|
||||
Expand $@ > "${tmp}" && cp "${tmp}" "${1}"
|
||||
rc=$? ; rm -f "${tmp}" 2>/dev/null ; exit "${rc}"
|
||||
else
|
||||
Expand $@
|
||||
true
|
||||
fi
|
||||
|
@ -1,89 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# make-bundle.sh
|
||||
#
|
||||
# Makes a Mac OS X application bundle. Called from make.
|
||||
#
|
||||
# usage: make-bundle.sh [-f] <name> <exe> <icon> [<version>]
|
||||
# -f : force running on non-Mac systems
|
||||
#
|
||||
# Silently does nothing on non-Mac systems (unless forced).
|
||||
#
|
||||
|
||||
force="0" ; if test "$1" = "-f" ; then force="1" ; shift ; fi
|
||||
name="$1"
|
||||
exe="$2"
|
||||
icon="$3"
|
||||
version="$4" ; if test "${version}" = "" ; then version="1.9.0" ; fi
|
||||
|
||||
if test "${name}" = ""
|
||||
then
|
||||
echo usage: `basename $0` '[-f] <name> <exe> <icon> [<version>]' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test "`uname`" != "Darwin" -a "$force" -eq 0
|
||||
then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if test ! -x "${exe}"
|
||||
then
|
||||
echo `basename $0`: invalid exe >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
yyyy="`date -u +'%Y'`"
|
||||
copyright="Copyright (c) 2001-${yyyy} Graeme Walker <graeme_walker@users.sourceforge.net>>"
|
||||
bundle_version="`date -u +'%Y.%m.%d.%H.%M.%S'`"
|
||||
key="`basename \"${exe}\" | sed 's/\..*//'`"
|
||||
|
||||
if test -d "${name}.app"
|
||||
then
|
||||
rm -rf "${name}.app"
|
||||
fi
|
||||
|
||||
dir="${name}.app/Contents"
|
||||
mkdir -p "${dir}/MacOS" 2>/dev/null
|
||||
mkdir -p "${dir}/Resources" 2>/dev/null
|
||||
|
||||
# hard-link the binary and copy the icon
|
||||
ln -f "${exe}" "${dir}/MacOS/${name}"
|
||||
cp "${icon}" "${dir}/Resources/${name}.icns"
|
||||
|
||||
cat > "${dir}/Info.plist" <<EOF
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDisplayName</key> <string>${name}</string>
|
||||
<key>CFBundleIconFile</key> <string>${name}.icns</string>
|
||||
<key>CFBundleIdentifier</key> <string>net.sourceforge.emailrelay.${key}</string>
|
||||
<key>CFBundleName</key> <string>${name}</string>
|
||||
<key>CFBundlePackageType</key> <string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key> <string>${version}</string>
|
||||
<key>CFBundleSignature</key> <string>gwgw</string>
|
||||
<key>CFBundleVersion</key> <string>${bundle_version}</string>
|
||||
<key>LSHasLocalizedDisplayName</key> <false/>
|
||||
<key>NSHumanReadableCopyright</key> <string>${copyright}</string>
|
||||
<key>NSAppleScriptEnabled</key> <false/>
|
||||
</dict>
|
||||
</plist>
|
||||
EOF
|
||||
|
82
bin/make-manifest.sh
Executable file
82
bin/make-manifest.sh
Executable file
@ -0,0 +1,82 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# make-manifest.sh
|
||||
#
|
||||
# Creates a windows manifest file, typically for a mingw build where
|
||||
# the linker does not support /MANIFEST etc.
|
||||
#
|
||||
# usage: make-manifest.sh [<level> [<name> [<description> [<version>]]]]
|
||||
# level := {asInvoker|highestAvailable|requireAdministrator}
|
||||
#
|
||||
# See also:
|
||||
# * https://msdn.microsoft.com/en-us/library/bb756929.aspx
|
||||
# * https://msdn.microsoft.com/en-us/library/aa374191.aspx
|
||||
#
|
||||
|
||||
level="$1"
|
||||
name="$2"
|
||||
description="$3"
|
||||
version="$4"
|
||||
if test "$level" = "" ; then level="asInvoker" ; fi
|
||||
if test "$version" = "" ; then version="1.0.0.0" ; fi
|
||||
|
||||
Manifest()
|
||||
{
|
||||
_level="$1"
|
||||
_name="$2"
|
||||
_description="$3"
|
||||
_version="$4"
|
||||
|
||||
cat <<EOF
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
EOF
|
||||
if test "$_name" != ""
|
||||
then
|
||||
cat <<EOF
|
||||
<assemblyIdentity version="$_version" name="$_name" type="win32" />
|
||||
EOF
|
||||
fi
|
||||
if test "$_description" != ""
|
||||
then
|
||||
cat <<EOF
|
||||
<description>$_description</description>
|
||||
EOF
|
||||
fi
|
||||
if test "$_level" != ""
|
||||
then
|
||||
cat <<EOF
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||
<security>
|
||||
<requestedPrivileges>
|
||||
<requestedExecutionLevel
|
||||
level="$_level"
|
||||
uiAccess="false" />
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
EOF
|
||||
fi
|
||||
cat <<EOF
|
||||
</assembly>
|
||||
EOF
|
||||
}
|
||||
|
||||
Manifest "$level" "$name" "$description" "$version" | sed 's/$/\r/'
|
||||
|
@ -1,122 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# make-qt-enabled.sh
|
||||
#
|
||||
# Adds Qt frameworks to a Mac OS X application bundle. Called from make.
|
||||
#
|
||||
# usage: make-qt-enabled.sh [-f] <exe> <frameworks-sub-dir>
|
||||
#
|
||||
# eg. make-qt-enabled.sh Foo.app/Contents/MacOS ../Frameworks
|
||||
# eg. make-qt-enabled.sh foo.real Frameworks
|
||||
#
|
||||
# Silently does nothing on non-Mac systems.
|
||||
#
|
||||
# See "http://qt-project.org/doc/qt-4.8/deployment-mac.html".
|
||||
#
|
||||
|
||||
force="0" ; if test "$1" = "-f" ; then force="1" ; shift ; fi
|
||||
exe="$1"
|
||||
fdir="$2"
|
||||
|
||||
echo="echo"
|
||||
do=""
|
||||
|
||||
if test "`uname`" != "Darwin" -a "$force" -eq 0
|
||||
then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if test "$fdir" = ""
|
||||
then
|
||||
fdir="../Frameworks"
|
||||
fi
|
||||
|
||||
if test ! -x "$exe"
|
||||
then
|
||||
echo `basename $0`: no such exe >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
base="`dirname \"$1\"`"
|
||||
src="/Library/Frameworks"
|
||||
|
||||
rm -rf "$base/$fdir" 2>/dev/null
|
||||
mkdir -p "$base/$fdir" 2>/dev/null
|
||||
|
||||
$echo cp -f -R \"$src/QtCore.framework\" \"$base/$fdir\"
|
||||
$do cp -f -R "$src/QtCore.framework" "$base/$fdir"
|
||||
|
||||
$echo cp -f -R \"$src/QtGui.framework\" \"$base/$fdir\"
|
||||
$do cp -f -R "$src/QtGui.framework" "$base/$fdir"
|
||||
|
||||
Id()
|
||||
{
|
||||
fk_="$1"
|
||||
name_="$2"
|
||||
if test "$name_" = "" ; then name_="`basename \"$fk_\" .framework`" ; fi
|
||||
otool -D "$fk_/Versions/Current/$name_" | tail -1
|
||||
}
|
||||
|
||||
SetId()
|
||||
{
|
||||
base_="$1"
|
||||
fdir_="$2"
|
||||
id_="$3"
|
||||
$echo install_name_tool -id \"@executable_path/$fdir_/$id_\" \"$base_/$fdir_/$id_\"
|
||||
$do install_name_tool -id "@executable_path/$fdir_/$id_" "$base_/$fdir_/$id_"
|
||||
}
|
||||
|
||||
Path()
|
||||
{
|
||||
exe_="$1"
|
||||
key_="$2"
|
||||
otool -L "$exe_" | fgrep "$key_" | tr '\t' ' ' | sed 's/^ *//' | sed 's/ .*//'
|
||||
}
|
||||
|
||||
SetPath()
|
||||
{
|
||||
lib_or_exe_="$1"
|
||||
fdir_="$2"
|
||||
path_="$3"
|
||||
if test "`echo \"$path_\" | fgrep @executable_path | wc -l`" -eq 0
|
||||
then
|
||||
$echo install_name_tool -change \"$path_\" \"@executable_path/$fdir_/$path_\" \"$lib_or_exe_\"
|
||||
$do install_name_tool -change "$path_" "@executable_path/$fdir_/$path_" "$lib_or_exe_"
|
||||
else
|
||||
true
|
||||
fi
|
||||
}
|
||||
|
||||
id_core="`Id \"$base/$fdir/QtCore.framework\"`"
|
||||
id_gui="`Id \"$base/$fdir/QtGui.framework\"`"
|
||||
|
||||
SetId "$base" "$fdir" "$id_core"
|
||||
SetId "$base" "$fdir" "$id_gui"
|
||||
|
||||
core_lib="$base/$fdir/QtCore.framework/Versions/Current/QtCore"
|
||||
gui_lib="$base/$fdir/QtGui.framework/Versions/Current/QtGui"
|
||||
|
||||
gui_path_in_exe="`Path \"$exe\" QtGui`"
|
||||
core_path_in_exe="`Path \"$exe\" QtCore`"
|
||||
core_path_in_gui="`Path \"$gui_lib\" QtCore`"
|
||||
|
||||
SetPath "$exe" "$fdir" "$gui_path_in_exe" && \
|
||||
SetPath "$exe" "$fdir" "$core_path_in_exe" && \
|
||||
SetPath "$gui_lib" "$fdir" "$core_path_in_gui"
|
||||
|
77
bin/make-setup.sh
Executable file
77
bin/make-setup.sh
Executable file
@ -0,0 +1,77 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# make-setup.sh
|
||||
#
|
||||
# Builds a gui payload tree by running "make install" into it and adding
|
||||
# a config file. The payload is processed by the gui installer.
|
||||
#
|
||||
# For windows this is now done elsewhere.
|
||||
#
|
||||
# usage: make-setup.sh [-d] <payload> <icon>
|
||||
# -d : debug
|
||||
#
|
||||
# Normally run by "make payload" in the "src/gui" directory.
|
||||
#
|
||||
|
||||
# parse the command line
|
||||
debug="0" ; if test "$1" = "-d" ; then shift ; debug="1" ; fi
|
||||
payload="$1"
|
||||
icon="$2"
|
||||
|
||||
# check the command-line
|
||||
if test "$payload" = ""
|
||||
then
|
||||
echo usage: `basename $0` '<payload> [<icon>]' >&2
|
||||
exit 2
|
||||
fi
|
||||
if test ! -d "$payload" -o -f "$payload/*"
|
||||
then
|
||||
echo error: payload "[$payload]" is not an empty directory >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# run "make install" into the payload directory
|
||||
echo `basename $0`: running make install into $payload
|
||||
payload_path="`cd $payload && pwd`"
|
||||
( cd ../.. && make install GCONFIG_HAVE_DOXYGEN=no DESTDIR=$payload_path ) > /dev/null 2>&1
|
||||
rm -rf $payload/usr/share/doc/emailrelay/doxygen
|
||||
|
||||
# check the "./configure" was done by "bin/configure-fhs.sh" (even on a mac)
|
||||
if test ! -d "$payload/usr/lib/emailrelay"
|
||||
then
|
||||
echo `basename $0`: cannot see expected directories: configure with \"configure.sh\" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# add the icon
|
||||
cp "$icon" $payload/usr/lib/emailrelay/ 2>/dev/null
|
||||
|
||||
# create the payload config file
|
||||
cat <<EOF >$payload/payload.cfg
|
||||
etc/emailrelay.conf=%dir-config%/emailrelay.conf
|
||||
etc/emailrelay.conf.template=%dir-config%/emailrelay.conf.template
|
||||
etc/emailrelay.auth.template=%dir-config%/emailrelay.auth.template
|
||||
etc/init.d/emailrelay=%dir-install%/lib/emailrelay/emailrelay-startstop.sh
|
||||
usr/lib/=%dir-install%/lib/
|
||||
usr/share/=%dir-install%/share/
|
||||
usr/sbin/=%dir-install%/sbin/
|
||||
+%dir-spool% group daemon 770 g+s
|
||||
+%dir-install%/sbin/emailrelay-submit group daemon 775 g+s
|
||||
EOF
|
||||
|
@ -1,108 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# make-setup.sh
|
||||
#
|
||||
# Builds a "setup" self-extracting archive -- or a payload file for
|
||||
# one -- derived from running "make install" into a temporary directory.
|
||||
#
|
||||
# usage: make-setup.sh [-d] <output> {<stub>|NONE} <pack-utility> <icon>
|
||||
#
|
||||
# Normally run by "make setup" in the "src/gui".
|
||||
#
|
||||
# The packed files are those that appear under "/usr", which
|
||||
# matches the default installation directory presented in the
|
||||
# gui (see Dir::os_install()).
|
||||
#
|
||||
# There is only one level of packing, so the gui executable
|
||||
# should be statically linked or repacked with its shared
|
||||
# libraries if targeting other machines.
|
||||
#
|
||||
|
||||
# parse the command line
|
||||
debug="0" ; if test "$1" = "-d" ; then shift ; debug="1" ; fi
|
||||
setup="$1"
|
||||
stub="$2"
|
||||
pack="$3"
|
||||
icon="$4"
|
||||
|
||||
# define temporary directories and cleanup code
|
||||
tmp="/tmp/`basename $0 .sh`.$$.tmp"
|
||||
install="$tmp/install"
|
||||
list="$tmp/list"
|
||||
trap Cleanup 0
|
||||
trap Fail 1 2 3 13 15
|
||||
Cleanup()
|
||||
{
|
||||
if test "$debug" -eq 0
|
||||
then
|
||||
rm -rf "$tmp"
|
||||
fi
|
||||
}
|
||||
Fail()
|
||||
{
|
||||
Cleanup
|
||||
exit 1
|
||||
}
|
||||
|
||||
# check the command-line
|
||||
if test "$setup" = "" -o \( "$stub" != "NONE" -a ! -f "$stub" \) -o ! -x "$pack"
|
||||
then
|
||||
echo usage: `basename $0` '<setup> <stub> <pack>' >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# run "make install"
|
||||
echo `basename $0`: running make install into $install
|
||||
mkdir -p $install
|
||||
( cd ../.. && make install HAVE_DOXYGEN=no DESTDIR=$install ) > /dev/null 2>&1
|
||||
|
||||
# check the "./configure" directories were sane (see bin/configure-fhs.sh)
|
||||
if test ! -d "$install/usr/lib/emailrelay" -a ! -d "$install/Applications/E-MailRelay"
|
||||
then
|
||||
echo `basename $0`: cannot see expected directories in the install tree >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# add some extras into the install
|
||||
if test -d "$install/usr/lib/emailrelay/"
|
||||
then
|
||||
cp "$icon" $install/usr/lib/emailrelay/
|
||||
else
|
||||
cp "$icon" $install/Applications/E-MailRelay/
|
||||
fi
|
||||
|
||||
# build a file list
|
||||
Filter()
|
||||
{
|
||||
fgrep -v /doxygen/ | fgrep -v /emailrelay-gui
|
||||
}
|
||||
Edit()
|
||||
{
|
||||
sed 's: \./: :'
|
||||
}
|
||||
echo `basename $0`: building a file list
|
||||
find $install -type f | Filter | grep -n . | sed 's/:/1 /' > $list
|
||||
( cd $install && find . -type f ) | Filter | grep -n . | sed 's/:/2 /' | Edit >> $list
|
||||
sort -n $list | sed 's/^[0-9][0-9]* //' > $list.tmp && mv $list.tmp $list
|
||||
|
||||
# create the packed file - dont bother compressing any more (-p)
|
||||
echo `basename $0`: packing
|
||||
PATH=".:$PATH"
|
||||
"$pack" -p -q -f "$list" "$setup" "$stub"
|
||||
|
@ -1,312 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# mu2docbook.sh
|
||||
#
|
||||
# Mark-up to docbook converter. Converts the output of "txt2mu.sh"
|
||||
# into docbook markup.
|
||||
#
|
||||
# Does some in-line formatting independently of the line-based
|
||||
# mark-up in the input. For example, it converts quoted words into
|
||||
# "<em></em>" tags, and it converts "*foo* [bar]" text into
|
||||
# hypertext links.
|
||||
#
|
||||
# The "-x" flag suppresses the output of the xml header. This is
|
||||
# useful when the output is to be spliced into another document.
|
||||
#
|
||||
# usage: mu2docbook.sh [-a <awk>] [{-x|--head|--tail}] [<title>]
|
||||
#
|
||||
# (If the title is not supplied then the input is copied
|
||||
# to a temporary file in order to extract the H1 header
|
||||
# text for the title.)
|
||||
#
|
||||
|
||||
awk=`( gawk 'END {print "gawk"}' ; nawk 'END {print "nawk"}' ; echo awk ) 2>/dev/null < /dev/null | head -1`
|
||||
if test "${1}" = "-a"
|
||||
then
|
||||
shift
|
||||
if test "${1}" != "" ; then awk="${1}" ; fi
|
||||
shift
|
||||
fi
|
||||
|
||||
full="1"
|
||||
if test "${1}" = "-x"
|
||||
then
|
||||
full="0"
|
||||
shift
|
||||
fi
|
||||
|
||||
op=""
|
||||
if test "${1}" = "--head"
|
||||
then
|
||||
shift
|
||||
op="head"
|
||||
elif test "${1}" = "--tail"
|
||||
then
|
||||
shift
|
||||
op="tail"
|
||||
fi
|
||||
|
||||
title="${1}"
|
||||
|
||||
Head()
|
||||
{
|
||||
echo '' | ${awk} -v prefix="`basename $0`" -v title="${1}" -v full="${2}" '
|
||||
BEGIN {
|
||||
if( full )
|
||||
{
|
||||
dtd_name="-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||
dtd_ref="http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"
|
||||
qq="\""
|
||||
printf( "%s\n" , "<?xml version=\"1.0\"?>" )
|
||||
printf( "<!DOCTYPE article PUBLIC \"%s\" \"%s\">\n" , dtd_name , dtd_ref )
|
||||
|
||||
printf( "<article>\n" )
|
||||
printf( " <articleinfo>\n" ) ;
|
||||
printf( " <title>%s</title>\n" , title )
|
||||
printf( " </articleinfo>\n" )
|
||||
}
|
||||
} '
|
||||
}
|
||||
|
||||
Tail()
|
||||
{
|
||||
echo '' | ${awk} -v prefix="`basename $0`" -v title="${1}" -v full="${2}" '
|
||||
BEGIN {
|
||||
if( full )
|
||||
{
|
||||
printf( "</article>\n" )
|
||||
}
|
||||
} '
|
||||
}
|
||||
|
||||
Body()
|
||||
{
|
||||
${awk} -v prefix="`basename $0`" -v title="${1}" -v full="${2}" '
|
||||
function arg1( type )
|
||||
{
|
||||
sub( "[^,]*," , "" , type )
|
||||
sub( ",.*" , "" , type )
|
||||
return type
|
||||
}
|
||||
function arg2( type )
|
||||
{
|
||||
sub( "[^,]*," , "" , type )
|
||||
sub( "[^,]*," , "" , type )
|
||||
sub( ",.*" , "" , type )
|
||||
return type
|
||||
}
|
||||
function escape( line )
|
||||
{
|
||||
gsub( "&" , "\\&" , line )
|
||||
gsub( "<" , "\\<" , line )
|
||||
gsub( ">" , "\\>" , line )
|
||||
return line
|
||||
}
|
||||
function dequote( line )
|
||||
{
|
||||
quote = "\""
|
||||
not_quote = "[^" quote "]"
|
||||
start_tag="<emphasis>"
|
||||
end_tag="</emphasis>"
|
||||
gsub( quote not_quote "*" quote , start_tag "&" end_tag , line )
|
||||
gsub( start_tag quote , start_tag , line )
|
||||
gsub( quote end_tag , end_tag , line )
|
||||
return line
|
||||
}
|
||||
function fn( line )
|
||||
{
|
||||
gsub( "[^[:space:]][^[:space:]]*\\(\\)" , "<literal>&</literal>" , line )
|
||||
return line
|
||||
}
|
||||
{
|
||||
pos = index( $0 , ":" )
|
||||
type = substr( $0 , 1 , pos )
|
||||
tail = substr( $0 , pos+1 )
|
||||
etail_raw = escape(tail)
|
||||
etail = fn(dequote(escape(tail)))
|
||||
|
||||
# h1
|
||||
if( match(type,"^h1[:,]") )
|
||||
{
|
||||
if( done_h2 )
|
||||
printf( " </section>\n" )
|
||||
if( done_h1 )
|
||||
printf( " </section>\n" )
|
||||
printf( " <section><title>%s</title>\n" , etail )
|
||||
done_h1 = 1
|
||||
done_h2 = 0
|
||||
}
|
||||
|
||||
# h2
|
||||
else if( match(type,"^h2[:,]") )
|
||||
{
|
||||
if( done_h2 )
|
||||
printf( " </section>\n" , etail )
|
||||
printf( " <section><title>%s</title>\n" , etail )
|
||||
done_h2 = 1
|
||||
}
|
||||
|
||||
# item
|
||||
else if( match(type,"^item,1[:,]") )
|
||||
printf( " <itemizedlist>\n <listitem><para>%s</para></listitem>\n" , etail )
|
||||
else if( match(type,"^item[:,]") )
|
||||
printf( " <listitem><para>%s</para></listitem>\n" , etail )
|
||||
else if( match(type,"^item-end[:,]") )
|
||||
printf( " </itemizedlist>\n" , etail )
|
||||
|
||||
# item-numbered
|
||||
else if( match(type,"^item-numbered,1[:,]") )
|
||||
printf( " <orderedlist>\n <listitem><para>%s</para></listitem>\n" , etail )
|
||||
else if( match(type,"^item-numbered[:,]") )
|
||||
printf( " <listitem><para>%s</para></listitem>\n" , etail )
|
||||
else if( match(type,"^item-numbered-end[:,]") )
|
||||
printf( " </orderedlist>\n" , etail )
|
||||
|
||||
# item-outer
|
||||
else if( match(type,"^item-outer,1[:,]") )
|
||||
printf( " <itemizedlist>\n <listitem><para>%s\n" , etail )
|
||||
else if( match(type,"^item-outer[:,]") )
|
||||
printf( " </para></listitem>\n <listitem><para>%s\n" , etail )
|
||||
else if( match(type,"^item-outer-end[:,]") )
|
||||
printf( " </para></listitem>\n </itemizedlist>\n" , etail )
|
||||
|
||||
# item-inner
|
||||
else if( match(type,"^item-inner,1[:,]") )
|
||||
printf( " <itemizedlist>\n <listitem><para>%s</para></listitem>\n" , etail )
|
||||
else if( match(type,"^item-inner[:,]") )
|
||||
printf( " <listitem><para>%s</para></listitem>\n" , etail )
|
||||
else if( match(type,"^item-inner-end[:,]") )
|
||||
printf( " </itemizedlist>\n" , etail )
|
||||
|
||||
# item-name
|
||||
else if( match(type,"^item-name,1[:,]") )
|
||||
printf( " <variablelist>\n <varlistentry><term>%s</term>\n" , etail )
|
||||
else if( match(type,"^item-name[:,]") )
|
||||
printf( " </varlistentry>\n <varlistentry><term>%s</term>\n" , etail )
|
||||
else if( match(type,"^item-name-end[:,]") )
|
||||
printf( " </varlistentry>\n </variablelist>\n" , etail )
|
||||
|
||||
# item-detail
|
||||
else if( match(type,"^item-detail,1[:,]") )
|
||||
printf( " <listitem><para>\n %s\n" , etail )
|
||||
else if( match(type,"^item-detail[:,]") )
|
||||
printf( " %s\n" , etail )
|
||||
else if( match(type,"^item-detail-end[:,]") )
|
||||
printf( " </para></listitem>\n" )
|
||||
else if( match(type,"^item-detail-blank[:,]") )
|
||||
printf( " </para><para>\n" )
|
||||
|
||||
# code
|
||||
else if( match(type,"^code,1[:,]") )
|
||||
printf( " <programlisting>%s" , etail_raw )
|
||||
else if( match(type,"^code[:,]") )
|
||||
printf( "\n%s" , etail_raw )
|
||||
else if( match(type,"^code-end[:,]") )
|
||||
printf( "</programlisting>\n" )
|
||||
|
||||
# text
|
||||
else if( match(type,"^text,1[:,]") )
|
||||
printf( " <para>\n %s\n" , etail )
|
||||
else if( match(type,"^text[:,]") )
|
||||
printf( " %s\n" , etail )
|
||||
else if( match(type,"^text-end[:,]") )
|
||||
printf( " </para>\n" )
|
||||
|
||||
# footer-text
|
||||
else if( match(type,"^footer,1[:,]") )
|
||||
printf( " <para>\n %s\n" , etail )
|
||||
else if( match(type,"^footer[:,]") )
|
||||
printf( " %s\n" , etail )
|
||||
else if( match(type,"^footer-end[:,]") )
|
||||
printf( " </para>\n" )
|
||||
|
||||
# citation-text
|
||||
else if( match(type,"^citation,1[:,]") )
|
||||
printf( " <p class=\"citation\">\n %s\n" , etail )
|
||||
else if( match(type,"^citation[:,]") )
|
||||
printf( " %s\n" , etail )
|
||||
else if( match(type,"^citation-end[:,]") )
|
||||
printf( " </p>\n" )
|
||||
|
||||
# author-text
|
||||
else if( match(type,"^author,1[:,]") )
|
||||
printf( " <para>\n %s\n" , etail )
|
||||
else if( match(type,"^author[:,]") )
|
||||
printf( " %s\n" , etail )
|
||||
else if( match(type,"^author-end[:,]") )
|
||||
printf( " </para>\n" )
|
||||
|
||||
# html
|
||||
else if( match(type,"^html[:,]") )
|
||||
printf( "%s\n" , tail )
|
||||
|
||||
# image
|
||||
else if( match(type,"^image[:,]") )
|
||||
printf( "<graphic fileref=\"%s\"/>\n" , tail )
|
||||
|
||||
# blank
|
||||
else if( match(type,"^blank[:,]") )
|
||||
printf( "\n" )
|
||||
|
||||
# ignore
|
||||
else if( match(type,"^ignore") )
|
||||
printf( "" )
|
||||
|
||||
else if( match(type,"[^[:space:]]") )
|
||||
printf( "%s: unrecognised mark-up tag on line %d: \"%s\"\n" , prefix , NR , type )>"/dev/fd/2"
|
||||
}
|
||||
END {
|
||||
if( done_h2 )
|
||||
printf( " </section>\n" )
|
||||
if( done_h1 )
|
||||
printf( " </section>\n" )
|
||||
} '
|
||||
|
||||
Tail
|
||||
}
|
||||
|
||||
Main()
|
||||
{
|
||||
Head "${title}" "${full}"
|
||||
Body "${title}" "${full}"
|
||||
Tail "${title}" "${full}"
|
||||
}
|
||||
|
||||
Anchorise()
|
||||
{
|
||||
sed 's/\*\([^\*]*\)\* \[\([^]]*\)\]/<ulink url="\2">\1<\/ulink>/g'
|
||||
}
|
||||
|
||||
if test "${op}" = "head"
|
||||
then
|
||||
Head "${title}" "${full}"
|
||||
elif test "${op}" = "tail"
|
||||
then
|
||||
Tail "${title}" "${full}"
|
||||
elif test "${title}" = ""
|
||||
then
|
||||
tmp="/tmp/`basename $0`.$$.tmp"
|
||||
${awk} '{print}' > "${tmp}"
|
||||
title="`${awk} '/^h1/ { sub(\"[^:]*:\",\"\") ; print ; exit }' \"${tmp}\"`"
|
||||
${awk} '{print}' "${tmp}" | Main "${title}" "${full}" | Anchorise
|
||||
rm -f "${tmp}"
|
||||
else
|
||||
Main "${title}" "${full}" | Anchorise
|
||||
fi
|
||||
|
298
bin/mu2html.sh_
298
bin/mu2html.sh_
@ -1,298 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# mu2html.sh
|
||||
#
|
||||
# Mark-up to html converter. Converts the output of "txt2mu.sh"
|
||||
# into html. (Also see "index.sh".)
|
||||
#
|
||||
# Does some in-line formatting independently of the line-based
|
||||
# mark-up in the input. For example, it converts quoted words into
|
||||
# "<em></em>" tags, and it converts "*foo* [bar]" text into
|
||||
# hypertext links.
|
||||
#
|
||||
# usage: mu2html.sh [-a <awk>] [-x] [-i] [<title> [<stylesheet>]]
|
||||
#
|
||||
# The "-x" flag suppresses the output of html header and
|
||||
# footer sections. This is useful when the output is to be
|
||||
# spliced into another html document.
|
||||
#
|
||||
# The "-i" flag makes the stylesheet inline, in the <header>
|
||||
# section.
|
||||
#
|
||||
# (If the title is not supplied then the input is copied
|
||||
# to a temporary file in order to extract the H1 header
|
||||
# text for the title.)
|
||||
#
|
||||
|
||||
awk=`( gawk 'END {print "gawk"}' ; nawk 'END {print "nawk"}' ; echo awk ) 2>/dev/null < /dev/null | head -1`
|
||||
if test "${1}" = "-a"
|
||||
then
|
||||
shift
|
||||
if test "${1}" != "" ; then awk="${1}" ; fi
|
||||
shift
|
||||
fi
|
||||
|
||||
full="1"
|
||||
if test "${1}" = "-x"
|
||||
then
|
||||
full="0"
|
||||
shift
|
||||
fi
|
||||
|
||||
inline="0"
|
||||
if test "${1}" = "-i"
|
||||
then
|
||||
inline="1"
|
||||
shift
|
||||
fi
|
||||
|
||||
title="${1}"
|
||||
stylesheet="${2}"
|
||||
|
||||
|
||||
if test "${stylesheet}" != "" -a \! -f "${stylesheet}"
|
||||
then
|
||||
: # echo `basename $0`: warning: missing stylesheet: ${stylesheet} >&2
|
||||
fi
|
||||
|
||||
Main()
|
||||
{
|
||||
${awk} -v prefix="`basename $0`" -v title="${1}" -v stylesheet="${2}" -v full="${3}" -v inline="${4}" '
|
||||
BEGIN {
|
||||
if( full )
|
||||
{
|
||||
dtd_name = "-//W3C//DTD HTML 4.01//EN"
|
||||
dtd_ref = "http://www.w3.org/TR/html4/strict.dtd"
|
||||
printf( "<!DOCTYPE HTML PUBLIC \"%s\" \"%s\">\n" , dtd_name , dtd_ref )
|
||||
printf( "<html>\n" )
|
||||
printf( " <head>\n" )
|
||||
printf( " <title>%s</title>\n" , title )
|
||||
printf( " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\n" )
|
||||
if( length(stylesheet) )
|
||||
{
|
||||
if(inline)
|
||||
{
|
||||
printf( " <style>\n" )
|
||||
system( "cat " stylesheet )
|
||||
printf( " </style>\n" )
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( " <link rel=\"stylesheet\" href=\"%s\" type=\"text/css\">\n" , stylesheet )
|
||||
}
|
||||
}
|
||||
printf( " </head>\n" )
|
||||
printf( " <body>\n" )
|
||||
printf( " <!-- index:0::::%s -->\n" , title )
|
||||
printf( " <div class=\"div-main\">\n" )
|
||||
}
|
||||
}
|
||||
function arg1( type )
|
||||
{
|
||||
sub( "[^,]*," , "" , type )
|
||||
sub( ",.*" , "" , type )
|
||||
return type
|
||||
}
|
||||
function arg2( type )
|
||||
{
|
||||
sub( "[^,]*," , "" , type )
|
||||
sub( "[^,]*," , "" , type )
|
||||
sub( ",.*" , "" , type )
|
||||
return type
|
||||
}
|
||||
function escape( line )
|
||||
{
|
||||
gsub( "&" , "\\&" , line )
|
||||
gsub( "<" , "\\<" , line )
|
||||
gsub( ">" , "\\>" , line )
|
||||
return line
|
||||
}
|
||||
function dequote( line )
|
||||
{
|
||||
quote = "\""
|
||||
not_quote = "[^" quote "]"
|
||||
start_tag="<em class=\"quote\">"
|
||||
end_tag="</em>"
|
||||
gsub( quote not_quote "*" quote , start_tag "&" end_tag , line )
|
||||
gsub( start_tag quote , start_tag , line )
|
||||
gsub( quote end_tag , end_tag , line )
|
||||
return line
|
||||
}
|
||||
function fn( line )
|
||||
{
|
||||
gsub( "[^[:space:]][^[:space:]]*\\(\\)" , "<em class=\"fn\">&</em>" , line )
|
||||
return line
|
||||
}
|
||||
{
|
||||
pos = index( $0 , ":" )
|
||||
type = substr( $0 , 1 , pos )
|
||||
tail = substr( $0 , pos+1 )
|
||||
etail_raw = escape(tail)
|
||||
etail = fn(dequote(escape(tail)))
|
||||
|
||||
# h1
|
||||
if( match(type,"^h1[:,]") )
|
||||
{
|
||||
printf( " <h1><a class=\"a-header\" name=\"H_%d\">%s</a></h1> " , arg1(type) , etail )
|
||||
printf( "<!-- index:1:H:%d::%s -->\n" , arg1(type) , etail )
|
||||
}
|
||||
|
||||
# h2
|
||||
else if( match(type,"^h2[:,]") )
|
||||
{
|
||||
printf( " <h2><a class=\"a-header\" name=\"SH_%d_%d\">%s</a></h2> " , arg1(type) , arg2(type) , etail )
|
||||
printf( "<!-- index:2:SH:%d:%d:%s -->\n" , arg1(type) , arg2(type) , etail )
|
||||
}
|
||||
|
||||
# item
|
||||
else if( match(type,"^item,1[:,]") )
|
||||
printf( " <ul>\n <li>%s</li>\n" , etail )
|
||||
else if( match(type,"^item[:,]") )
|
||||
printf( " <li>%s</li>\n" , etail )
|
||||
else if( match(type,"^item-end[:,]") )
|
||||
printf( " </ul>\n" , etail )
|
||||
|
||||
# item-numbered
|
||||
else if( match(type,"^item-numbered,1[:,]") )
|
||||
printf( " <ol>\n <li>%s</li>\n" , etail )
|
||||
else if( match(type,"^item-numbered[:,]") )
|
||||
printf( " <li>%s</li>\n" , etail )
|
||||
else if( match(type,"^item-numbered-end[:,]") )
|
||||
printf( " </ol>\n" , etail )
|
||||
|
||||
# item-outer
|
||||
else if( match(type,"^item-outer,1[:,]") )
|
||||
printf( " <ul>\n <li>%s\n" , etail )
|
||||
else if( match(type,"^item-outer[:,]") )
|
||||
printf( " </li>\n <li>%s\n" , etail )
|
||||
else if( match(type,"^item-outer-end[:,]") )
|
||||
printf( " </li>\n </ul>\n" , etail )
|
||||
|
||||
# item-inner
|
||||
else if( match(type,"^item-inner,1[:,]") )
|
||||
printf( " <ul>\n <li>%s</li>\n" , etail )
|
||||
else if( match(type,"^item-inner[:,]") )
|
||||
printf( " <li>%s</li>\n" , etail )
|
||||
else if( match(type,"^item-inner-end[:,]") )
|
||||
printf( " </ul>\n" , etail )
|
||||
|
||||
# item-name
|
||||
else if( match(type,"^item-name,1[:,]") )
|
||||
printf( " <dl>\n <dt>%s</dt>\n" , etail )
|
||||
else if( match(type,"^item-name[:,]") )
|
||||
printf( " <dt>%s</dt>\n" , etail )
|
||||
else if( match(type,"^item-name-end[:,]") )
|
||||
printf( " </dl>\n" , etail )
|
||||
|
||||
# item-detail
|
||||
else if( match(type,"^item-detail,1[:,]") )
|
||||
printf( " <dd>\n %s\n" , etail )
|
||||
else if( match(type,"^item-detail[:,]") )
|
||||
printf( " %s\n" , etail )
|
||||
else if( match(type,"^item-detail-end[:,]") )
|
||||
printf( " </dd>\n" )
|
||||
else if( match(type,"^item-detail-blank[:,]") )
|
||||
printf( " <p class=\"p-break\"></p>\n" )
|
||||
|
||||
# code
|
||||
else if( match(type,"^code,1[:,]") )
|
||||
printf( " <div class=\"div-pre\">\n <pre>%s" , etail_raw )
|
||||
else if( match(type,"^code[:,]") )
|
||||
printf( "\n%s" , etail_raw )
|
||||
else if( match(type,"^code-end[:,]") )
|
||||
printf( "</pre>\n </div><!-- div-pre -->\n" )
|
||||
|
||||
# text
|
||||
else if( match(type,"^text,1[:,]") )
|
||||
printf( " <p>\n %s\n" , etail )
|
||||
else if( match(type,"^text[:,]") )
|
||||
printf( " %s\n" , etail )
|
||||
else if( match(type,"^text-end[:,]") )
|
||||
printf( " </p>\n" , etail )
|
||||
|
||||
# footer-text
|
||||
else if( match(type,"^footer,1[:,]") )
|
||||
printf( " <div class=\"div-footer\">\n <p>\n %s\n" , etail )
|
||||
else if( match(type,"^footer[:,]") )
|
||||
printf( " %s\n" , etail )
|
||||
else if( match(type,"^footer-end[:,]") )
|
||||
printf( " </p>\n </div><!-- div-footer -->\n" , etail )
|
||||
|
||||
# citation-text
|
||||
else if( match(type,"^citation,1[:,]") )
|
||||
printf( " <p class=\"citation\">\n %s\n" , etail )
|
||||
else if( match(type,"^citation[:,]") )
|
||||
printf( " %s\n" , etail )
|
||||
else if( match(type,"^citation-end[:,]") )
|
||||
printf( " </p>\n" , etail )
|
||||
|
||||
# author-text
|
||||
else if( match(type,"^author,1[:,]") )
|
||||
printf( " <p class=\"author\">\n %s\n" , etail )
|
||||
else if( match(type,"^author[:,]") )
|
||||
printf( " %s\n" , etail )
|
||||
else if( match(type,"^author-end[:,]") )
|
||||
printf( " </p>\n" , etail )
|
||||
|
||||
# html
|
||||
else if( match(type,"^html[:,]") )
|
||||
printf( "%s\n" , tail )
|
||||
|
||||
# image
|
||||
else if( match(type,"^image[:,]") )
|
||||
printf( "<img src=\"%s\" alt=\"%s\">\n" , tail , "image" )
|
||||
|
||||
# blank
|
||||
else if( match(type,"^blank[:,]") )
|
||||
printf( "\n" )
|
||||
|
||||
# ignore
|
||||
else if( match(type,"^ignore") )
|
||||
printf( "" )
|
||||
|
||||
else if( match(type,"[^[:space:]]") )
|
||||
printf( "%s: unrecognised mark-up tag on line %d: \"%s\"\n" , prefix , NR , type )>"/dev/fd/2"
|
||||
}
|
||||
END {
|
||||
if( full )
|
||||
{
|
||||
printf( " </div> <!-- div-main -->\n" )
|
||||
printf( " </body>\n" )
|
||||
printf( "</html>\n" )
|
||||
}
|
||||
} '
|
||||
}
|
||||
|
||||
Anchorise()
|
||||
{
|
||||
sed 's/\*\([^\*]*\)\* \[\([^]]*\)\]/<a class=\"a-href\" href="\2">\1<\/a>/g'
|
||||
}
|
||||
|
||||
if test "${title}" = ""
|
||||
then
|
||||
tmp="/tmp/`basename $0`.$$.tmp"
|
||||
${awk} '{print}' > "${tmp}"
|
||||
touch "${tmp}"
|
||||
title="`${awk} '/^h1/ { sub(\"[^:]*:\",\"\") ; print ; exit }' \"${tmp}\"`"
|
||||
${awk} '{print}' "${tmp}" | Main "${title}" "${stylesheet}" "${full}" "${inline}" | Anchorise
|
||||
rm -f "${tmp}"
|
||||
else
|
||||
Main "${title}" "${stylesheet}" "${full}" "${inline}" | Anchorise
|
||||
fi
|
||||
|
@ -1,12 +0,0 @@
|
||||
{
|
||||
Description = "E-MailRelay server";
|
||||
Provides = ("E-MailRelay");
|
||||
Requires = ("Network");
|
||||
Uses = ("Network");
|
||||
OrderPreference = "Late";
|
||||
Messages =
|
||||
{
|
||||
start = "Starting E-MailRelay";
|
||||
stop = "Stopping E-MailRelay";
|
||||
};
|
||||
}
|
@ -1,93 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# txt2html.sh
|
||||
#
|
||||
# Converts specially-formatted plain-text to html.
|
||||
# Uses "expand.sh", "txt2mu.sh" and "mu2html.sh".
|
||||
# See also "index.sh".
|
||||
#
|
||||
# The "-t" (text-mode) switch can be used for
|
||||
# non-technical input text.
|
||||
#
|
||||
# The "-x" (exclude) switch excludes html header
|
||||
# and footer from the output.
|
||||
#
|
||||
# usage: txt2html.sh [-a <awk-binary>] [-v] [-x] [-t] [<input-file> [<stylesheet> [<graphics-dir> [<title>]]]]
|
||||
#
|
||||
|
||||
awk=`( gawk 'END {print "gawk"}' ; nawk 'END {print "nawk"}' ; echo awk ) 2>/dev/null < /dev/null | head -1`
|
||||
if test "${1}" = "-a"
|
||||
then
|
||||
shift
|
||||
if test "${1}" != "" ; then awk="${1}" ; fi
|
||||
shift
|
||||
fi
|
||||
|
||||
v=""
|
||||
if test "${1}" = "-v"
|
||||
then
|
||||
shift
|
||||
v="-v"
|
||||
fi
|
||||
|
||||
x=""
|
||||
if test "${1}" = "-x"
|
||||
then
|
||||
x="-x"
|
||||
shift
|
||||
fi
|
||||
|
||||
t=""
|
||||
if test "${1}" = "-t"
|
||||
then
|
||||
t="-t"
|
||||
shift
|
||||
fi
|
||||
|
||||
file="${1}"
|
||||
stylesheet="${2}"
|
||||
graphics_dir="${3}"
|
||||
title="${4}"
|
||||
|
||||
if test "${v}" != "" -a "${file}" != ""
|
||||
then
|
||||
echo `basename $0`: processing ${file} >&2
|
||||
fi
|
||||
|
||||
if test "${file}" != "" -a \! -f "${file}"
|
||||
then
|
||||
echo `basename $0`: no such file: ${file} >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test "${stylesheet}" != "" -a \! -f "${stylesheet}"
|
||||
then
|
||||
: # echo `basename $0`: warning: missing stylesheet: "${stylesheet}" >&2
|
||||
fi
|
||||
|
||||
if test "${graphics_dir}" = ""
|
||||
then
|
||||
graphics_dir="graphics"
|
||||
fi
|
||||
|
||||
txt2mu="`dirname $0`/txt2mu.sh"
|
||||
mu2html="`dirname $0`/mu2html.sh"
|
||||
expand="`dirname $0`/expand.sh"
|
||||
cat "${file}" | "${expand}" -a "${awk}" "${t}" | "${txt2mu}" -a "${awk}" "${t}" | "${mu2html}" -a "${awk}" ${x} "${title}" "${stylesheet}" | "${expand}" -a "${awk}"
|
||||
|
342
bin/txt2mu.sh_
342
bin/txt2mu.sh_
@ -1,342 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# txt2mu.sh
|
||||
#
|
||||
# Converts specially-formatted plain-text to marked-up text.
|
||||
# The mark-up process works on complete lines; inline
|
||||
# markup is handled by later processing (eg. "mu2html.sh").
|
||||
#
|
||||
# The "-t" (text-mode) switch modifies the set
|
||||
# of available styles to suit non-technical texts.
|
||||
#
|
||||
# usage: txt2mu.sh [-a <awk-binary>] [-t] [<input-file>]
|
||||
#
|
||||
|
||||
awk=`( gawk 'END {print "gawk"}' ; nawk 'END {print "nawk"}' ; echo awk ) 2>/dev/null < /dev/null | head -1`
|
||||
if test "${1}" = "-a"
|
||||
then
|
||||
shift
|
||||
if test "${1}" != "" ; then awk="${1}" ; fi
|
||||
shift
|
||||
fi
|
||||
|
||||
text_mode="0"
|
||||
if test "${1}" = "-t"
|
||||
then
|
||||
shift
|
||||
text_mode="1"
|
||||
fi
|
||||
|
||||
file="${1}"
|
||||
|
||||
# ===
|
||||
# Main()
|
||||
#
|
||||
# Does most of the processing.
|
||||
#
|
||||
Main()
|
||||
{
|
||||
${awk} -v text_mode="${1}" '
|
||||
|
||||
BEGIN { in_footer = 0 }
|
||||
|
||||
function output( line )
|
||||
{
|
||||
printf( "%s\n" , line )
|
||||
}
|
||||
|
||||
function tagOutput( line , tag )
|
||||
{
|
||||
printf( "%s:%s\n" , tag , line )
|
||||
}
|
||||
|
||||
function tagOutputRaw( line , tag )
|
||||
{
|
||||
printf( "%s:%s\n" , tag , line )
|
||||
}
|
||||
|
||||
function process( line , next_ )
|
||||
{
|
||||
tab = " "
|
||||
is_blank = match( line , "^[\t ]*$" )
|
||||
is_heading = match( next_ , "^==*[\t ]*$" )
|
||||
is_footer = match( line , "^____*[\t ]*$" )
|
||||
is_sub_heading = match( next_ , "^--*[\t ]*$" )
|
||||
is_item = match( line , "^\\* " )
|
||||
is_item_name = match( line , "^\\# " )
|
||||
is_item_detail = match( line , "^ [^- ]" )
|
||||
is_item_numbered = match( line , "^\\([0123456789][0123456789]*\\)" )
|
||||
is_heading_line = match( line , "^==*[\t ]*$" )
|
||||
is_sub_heading_line = match( line , "^--*[\t ]*$" )
|
||||
is_image = match( line , "^[\t ]*<<.*>>[\t ]*$" )
|
||||
|
||||
if( text_mode )
|
||||
{
|
||||
is_citation = match( line , "^" tab "[^" tab "]" )
|
||||
is_author = match( line , "^" tab tab )
|
||||
is_html = match( line , "^<.*>[\t ]*$" )
|
||||
is_code = 0
|
||||
is_item_outer = 0
|
||||
is_item_inner = 0
|
||||
}
|
||||
else
|
||||
{
|
||||
is_citation = 0
|
||||
is_author = 0
|
||||
is_html = 0
|
||||
is_code = match( line , "^" tab )
|
||||
is_item_outer = match( line , "^\\+ " )
|
||||
is_item_inner = match( line , "^ - " )
|
||||
}
|
||||
|
||||
if( is_footer )
|
||||
{
|
||||
in_footer = 1
|
||||
}
|
||||
else if( is_code )
|
||||
{
|
||||
sub( "^" tab , "" , line )
|
||||
tagOutputRaw( line , "code" )
|
||||
}
|
||||
else if( is_image )
|
||||
{
|
||||
sub( "^[\t ]*<<" , "" , line )
|
||||
sub( ">>[\t ]*$" , "" , line )
|
||||
tagOutputRaw( line , "image" )
|
||||
}
|
||||
else if( is_html )
|
||||
{
|
||||
tagOutputRaw( line , "html" )
|
||||
}
|
||||
else if( is_blank )
|
||||
{
|
||||
tagOutput( "" , "blank" )
|
||||
}
|
||||
else if( is_item_name )
|
||||
{
|
||||
sub( "^# " , "" , line )
|
||||
tagOutput( line , "item-name" )
|
||||
}
|
||||
else if( is_item_detail )
|
||||
{
|
||||
sub( "^ " , "" , line )
|
||||
tagOutput( line , "item-detail" )
|
||||
}
|
||||
else if( is_item )
|
||||
{
|
||||
sub( "^\\* " , "" , line )
|
||||
tagOutput( line , "item" )
|
||||
}
|
||||
else if( is_item_outer )
|
||||
{
|
||||
sub( "^\\+ " , "" , line )
|
||||
tagOutput( line , "item-outer" )
|
||||
}
|
||||
else if( is_item_inner )
|
||||
{
|
||||
sub( "^ - " , "" , line )
|
||||
tagOutput( line , "item-inner" )
|
||||
}
|
||||
else if( is_item_numbered )
|
||||
{
|
||||
gsub( "^\\([0123456789][0123456789]*\\) " , "" , line )
|
||||
tagOutput( line , "item-numbered" )
|
||||
}
|
||||
else if( is_citation )
|
||||
{
|
||||
sub( "^" tab , "" , line )
|
||||
tagOutput( line , "citation" )
|
||||
}
|
||||
else if( is_author )
|
||||
{
|
||||
sub( "^" tab tab , "" , line )
|
||||
tagOutput( line , "author" )
|
||||
}
|
||||
else if( is_heading )
|
||||
{
|
||||
major += 1
|
||||
minor = 0
|
||||
h1_tag = "h1" "," major "," minor
|
||||
tagOutput( line , h1_tag )
|
||||
}
|
||||
else if( is_sub_heading )
|
||||
{
|
||||
minor += 1
|
||||
h2_tag = "h2" "," major "," minor
|
||||
tagOutput( line , h2_tag )
|
||||
}
|
||||
else if( !is_heading_line && !is_sub_heading_line )
|
||||
{
|
||||
tagOutput( line , in_footer ? "footer" : "text" )
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
if( NR != 1 )
|
||||
process( previous , $0 )
|
||||
previous = $0
|
||||
}
|
||||
|
||||
END {
|
||||
process( previous , "" )
|
||||
} '
|
||||
}
|
||||
|
||||
# ===
|
||||
# Number()
|
||||
#
|
||||
# Numbers a set of commonly-tagged lines, and inserts an end
|
||||
# marker line at the end of the sequence.
|
||||
#
|
||||
# The 'ignore' parameters can be used to make sure that
|
||||
# item lines separated with 'ignore' patterns are
|
||||
# treated as being contiguous.
|
||||
#
|
||||
# Eg: Number foo bar
|
||||
# foo,1: first line
|
||||
# ignore,bar:
|
||||
# foo,2: second line
|
||||
# foo-end:
|
||||
#
|
||||
Number()
|
||||
{
|
||||
${awk} -v item_tag="${1}" -v ignore_1="${2}" -v ignore_2="${3}" -v ignore_3="${4}" -v ignore_4="${5}" '
|
||||
function ignore_line( line )
|
||||
{
|
||||
i_0 = match( line , "^ignore" )
|
||||
i_1 = length(ignore_1) && match( line , "^" ignore_1 "[:,]" )
|
||||
i_2 = length(ignore_2) && match( line , "^" ignore_2 "[:,]" )
|
||||
i_3 = length(ignore_3) && match( line , "^" ignore_3 "[:,]" )
|
||||
i_4 = length(ignore_3) && match( line , "^" ignore_4 "[:,]" )
|
||||
return i_0 || i_1 || i_2 || i_3 || i_4
|
||||
}
|
||||
BEGIN {
|
||||
n = 1
|
||||
}
|
||||
{
|
||||
if( match( $0 , "^" item_tag "[:,]" ) )
|
||||
{
|
||||
sub( "^" item_tag , "" )
|
||||
printf( "%s,%d%s\n" , item_tag , n++ , $0 )
|
||||
}
|
||||
else
|
||||
{
|
||||
if( !ignore_line($0) )
|
||||
{
|
||||
if( n > 1 )
|
||||
printf( "%s-end:\n" , item_tag )
|
||||
n = 1
|
||||
}
|
||||
print
|
||||
}
|
||||
} '
|
||||
}
|
||||
|
||||
# ===
|
||||
# Compress()
|
||||
#
|
||||
# Removes blank lines near to headings (etc) by changing
|
||||
# the "blank" tag to "ignore,blank".
|
||||
#
|
||||
# As a special case, converts single blank lines within an
|
||||
# "item-detail" block to have a tag of "item-detail-blank"
|
||||
# rather than "blank".
|
||||
#
|
||||
Compress()
|
||||
{
|
||||
${awk} '
|
||||
function process( previous , line , next_ )
|
||||
{
|
||||
re_blank = "^blank:"
|
||||
re_heading = "^h[0123456789][:,]"
|
||||
re_detail = "^item-detail:"
|
||||
re_pre_start = "^code,1[:,]"
|
||||
|
||||
this_is_blank = match(line,re_blank)
|
||||
next_is_heading = match(next_,re_heading)
|
||||
previous_is_heading = match(previous,re_heading)
|
||||
next_is_detail = match(next_,re_detail)
|
||||
previous_is_detail = match(previous,re_detail)
|
||||
next_is_pre_start = match(next_,re_pre_start)
|
||||
|
||||
if( this_is_blank && ( next_is_heading || previous_is_heading ) )
|
||||
{
|
||||
print "ignore," line
|
||||
}
|
||||
else if( this_is_blank && !previous_is_detail && next_is_detail )
|
||||
{
|
||||
print "ignore," line
|
||||
}
|
||||
else if( this_is_blank && previous_is_detail && !next_is_detail )
|
||||
{
|
||||
print "ignore," line
|
||||
}
|
||||
else if( this_is_blank && next_is_detail && previous_is_detail )
|
||||
{
|
||||
print "item-detail-" line
|
||||
}
|
||||
else if( this_is_blank && next_is_pre_start )
|
||||
{
|
||||
print "ignore," line
|
||||
}
|
||||
else
|
||||
{
|
||||
print line
|
||||
}
|
||||
}
|
||||
{
|
||||
if( NR >= 2 )
|
||||
process( l2 , l1 , $0 )
|
||||
l2 = l1
|
||||
l1 = $0
|
||||
}
|
||||
END {
|
||||
process( l2 , l1 , "" )
|
||||
process( l1 , "" , "" )
|
||||
} '
|
||||
}
|
||||
|
||||
# ===
|
||||
# Cat()
|
||||
#
|
||||
# An awk version of "cat".
|
||||
#
|
||||
Cat()
|
||||
{
|
||||
${awk} '{print}' $@ | tr -d '\015'
|
||||
}
|
||||
|
||||
# ==
|
||||
|
||||
Cat "${file}" | \
|
||||
Main "${text_mode}" | \
|
||||
Compress | \
|
||||
Number "item" | \
|
||||
Number "item-outer" "item-inner" "blank" | \
|
||||
Number "item-inner" "blank" | \
|
||||
Number "item-numbered" | \
|
||||
Number "item-name" "item-detail" "blank" "item-detail-blank" "code" | \
|
||||
Number "item-detail" "item-detail-blank" "code" | \
|
||||
Number "code" "blank" "image" | \
|
||||
Number "footer" "blank" "image" | \
|
||||
Number "citation" "blank" | \
|
||||
Number "author" | \
|
||||
Number "text" "image"
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
#
|
||||
# Autogenerates stuff.
|
||||
#
|
||||
aclocal
|
||||
aclocal -I .
|
||||
autoconf
|
||||
autoheader
|
||||
automake -a -Woverride -Wportability
|
||||
automake -ac -Woverride -Wportability
|
||||
|
@ -1,37 +1,33 @@
|
||||
#
|
||||
## Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
##
|
||||
## Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
##
|
||||
## 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/>.
|
||||
#
|
||||
#
|
||||
# mingw.mak
|
||||
#
|
||||
|
||||
mk_sources=\
|
||||
gpopauth.cpp \
|
||||
gpopsecrets.cpp \
|
||||
gpopsecrets_win32.cpp \
|
||||
gpopserver.cpp \
|
||||
gpopstore.cpp \
|
||||
gpopserverprotocol.cpp
|
||||
if GCONFIG_BSD
|
||||
EXTRA_DIST = emailrelay-bsd.sh.in
|
||||
e_bsdinit_SCRIPTS = emailrelay
|
||||
CLEANFILES = emailrelay
|
||||
else
|
||||
EXTRA_DIST = emailrelay-bsd.sh.in
|
||||
e_bsdinit_SCRIPTS =
|
||||
CLEANFILES =
|
||||
endif
|
||||
|
||||
mk_target=gpop.a
|
||||
do_sed = sed -e "s%__SBIN_DIR__%${sbindir}%g" -e "s%__INIT_DIR__%${e_initdir}%g"
|
||||
|
||||
all: $(mk_target)
|
||||
|
||||
include ../mingw-common.mak
|
||||
|
||||
$(mk_target): $(mk_objects)
|
||||
$(mk_ar) $(mk_target) $(mk_objects)
|
||||
emailrelay: emailrelay-bsd.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay-bsd.sh.in > emailrelay
|
||||
chmod +x emailrelay
|
||||
|
517
bsd/Makefile.in
Normal file
517
bsd/Makefile.in
Normal file
@ -0,0 +1,517 @@
|
||||
# Makefile.in generated by automake 1.15.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2017 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
#
|
||||
#
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
subdir = bsd
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/m4_ax_cxx_compile_stdcxx.m4 \
|
||||
$(top_srcdir)/m4/m4_ax_cxx_compile_stdcxx_11.m4 \
|
||||
$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/gconfig_defs.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
*) f=$$p;; \
|
||||
esac;
|
||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||
am__install_max = 40
|
||||
am__nobase_strip_setup = \
|
||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||
am__nobase_strip = \
|
||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||
am__nobase_list = $(am__nobase_strip_setup); \
|
||||
for p in $$list; do echo "$$p $$p"; done | \
|
||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||
if (++n[$$2] == $(am__install_max)) \
|
||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||
END { for (dir in files) print dir, files[dir] }'
|
||||
am__base_list = \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||
am__uninstall_files_from_dir = { \
|
||||
test -z "$$files" \
|
||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||
}
|
||||
am__installdirs = "$(DESTDIR)$(e_bsdinitdir)"
|
||||
SCRIPTS = $(e_bsdinit_SCRIPTS)
|
||||
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__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EXEEXT = @EXEEXT@
|
||||
GCONFIG_CONFIGURATION = @GCONFIG_CONFIGURATION@
|
||||
GCONFIG_HAVE_DOXYGEN = @GCONFIG_HAVE_DOXYGEN@
|
||||
GCONFIG_HAVE_MAN2HTML = @GCONFIG_HAVE_MAN2HTML@
|
||||
GCONFIG_QT_CFLAGS = @GCONFIG_QT_CFLAGS@
|
||||
GCONFIG_QT_LIBS = @GCONFIG_QT_LIBS@
|
||||
GCONFIG_QT_MOC = @GCONFIG_QT_MOC@
|
||||
GCONFIG_STATIC_END = @GCONFIG_STATIC_END@
|
||||
GCONFIG_STATIC_START = @GCONFIG_STATIC_START@
|
||||
GCONFIG_TLS_LIBS = @GCONFIG_TLS_LIBS@
|
||||
GCONFIG_WINDMC = @GCONFIG_WINDMC@
|
||||
GCONFIG_WINDRES = @GCONFIG_WINDRES@
|
||||
GREP = @GREP@
|
||||
GZIP = @GZIP@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAKE = @MAKE@
|
||||
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@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
QT_CFLAGS = @QT_CFLAGS@
|
||||
QT_LIBS = @QT_LIBS@
|
||||
QT_MOC = @QT_MOC@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
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_alias = @build_alias@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
e_bsdinitdir = @e_bsdinitdir@
|
||||
e_docdir = @e_docdir@
|
||||
e_examplesdir = @e_examplesdir@
|
||||
e_icondir = @e_icondir@
|
||||
e_initdir = @e_initdir@
|
||||
e_libexecdir = @e_libexecdir@
|
||||
e_pamdir = @e_pamdir@
|
||||
e_spooldir = @e_spooldir@
|
||||
e_sysconfdir = @e_sysconfdir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host_alias = @host_alias@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
@GCONFIG_BSD_FALSE@EXTRA_DIST = emailrelay-bsd.sh.in
|
||||
@GCONFIG_BSD_TRUE@EXTRA_DIST = emailrelay-bsd.sh.in
|
||||
@GCONFIG_BSD_FALSE@e_bsdinit_SCRIPTS =
|
||||
@GCONFIG_BSD_TRUE@e_bsdinit_SCRIPTS = emailrelay
|
||||
@GCONFIG_BSD_FALSE@CLEANFILES =
|
||||
@GCONFIG_BSD_TRUE@CLEANFILES = emailrelay
|
||||
do_sed = sed -e "s%__SBIN_DIR__%${sbindir}%g" -e "s%__INIT_DIR__%${e_initdir}%g"
|
||||
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 bsd/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu bsd/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):
|
||||
install-e_bsdinitSCRIPTS: $(e_bsdinit_SCRIPTS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(e_bsdinit_SCRIPTS)'; test -n "$(e_bsdinitdir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(e_bsdinitdir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(e_bsdinitdir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
|
||||
done | \
|
||||
sed -e 'p;s,.*/,,;n' \
|
||||
-e 'h;s|.*|.|' \
|
||||
-e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
|
||||
$(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)$(e_bsdinitdir)$$dir'"; \
|
||||
$(INSTALL_SCRIPT) $$files "$(DESTDIR)$(e_bsdinitdir)$$dir" || exit $$?; \
|
||||
} \
|
||||
; done
|
||||
|
||||
uninstall-e_bsdinitSCRIPTS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(e_bsdinit_SCRIPTS)'; test -n "$(e_bsdinitdir)" || exit 0; \
|
||||
files=`for p in $$list; do echo "$$p"; done | \
|
||||
sed -e 's,.*/,,;$(transform)'`; \
|
||||
dir='$(DESTDIR)$(e_bsdinitdir)'; $(am__uninstall_files_from_dir)
|
||||
tags TAGS:
|
||||
|
||||
ctags CTAGS:
|
||||
|
||||
cscope cscopelist:
|
||||
|
||||
|
||||
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 $(SCRIPTS)
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(e_bsdinitdir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
|
||||
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-e_bsdinitSCRIPTS
|
||||
|
||||
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: uninstall-e_bsdinitSCRIPTS
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
|
||||
ctags-am 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-e_bsdinitSCRIPTS 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 tags-am \
|
||||
uninstall uninstall-am uninstall-e_bsdinitSCRIPTS
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
emailrelay: emailrelay-bsd.sh.in
|
||||
$(do_sed) < $(srcdir)/emailrelay-bsd.sh.in > emailrelay
|
||||
chmod +x emailrelay
|
||||
|
||||
# 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:
|
47
bsd/emailrelay-bsd.sh.in
Executable file
47
bsd/emailrelay-bsd.sh.in
Executable file
@ -0,0 +1,47 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# emailrelay-bsd.sh
|
||||
#
|
||||
# Start/stop wrapper for E-MailRelay on FreeBSD, installed as
|
||||
# "/etc/rc.d/emailrelay" or "/usr/local/etc/rc.d/emailrelay".
|
||||
#
|
||||
# Requires the following line to be added to "/etc/rc.conf":
|
||||
#
|
||||
# emailrelay_enable="YES"
|
||||
#
|
||||
# Delegates to the linux start/stop script, which reads default directories
|
||||
# etc. from "/etc/rc.conf.d/emailrelay" and the server command-line options
|
||||
# from "/usr/local/etc/emailrelay.conf".
|
||||
#
|
||||
# See also man rc(8).
|
||||
#
|
||||
# PROVIDE: emailrelay
|
||||
# REQUIRE: DAEMON
|
||||
#
|
||||
|
||||
. /etc/rc.subr
|
||||
emailrelay_enable=${emailrelay_enable:-"NO"}
|
||||
name=emailrelay
|
||||
procname=__SBIN_DIR__/emailrelay
|
||||
rcvar=emailrelay_enable
|
||||
command=__INIT_DIR__/emailrelay
|
||||
command_args="$1"
|
||||
load_rc_config $name
|
||||
run_rc_command "$1"
|
||||
|
347
compile
Executable file
347
compile
Executable file
@ -0,0 +1,347 @@
|
||||
#! /bin/sh
|
||||
# Wrapper for compilers which do not understand '-c -o'.
|
||||
|
||||
scriptversion=2012-10-14.11; # UTC
|
||||
|
||||
# Copyright (C) 1999-2013 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 <http://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 )
|
||||
func_cl_wrapper "$@" # Doesn't return...
|
||||
;;
|
||||
esac
|
||||
|
||||
ofile=
|
||||
cfile=
|
||||
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
# So we strip '-o arg' only if arg is an object.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.obj)
|
||||
ofile=$2
|
||||
;;
|
||||
*)
|
||||
set x "$@" -o "$2"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*.c)
|
||||
cfile=$1
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
if test -z "$ofile" || test -z "$cfile"; then
|
||||
# If no '-o' option was seen then we might have been invoked from a
|
||||
# pattern rule where we don't need one. That is ok -- this is a
|
||||
# normal compilation that the losing compiler can handle. If no
|
||||
# '.c' file was seen then we are probably linking. That is also
|
||||
# ok.
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
# Name of file we expect compiler to create.
|
||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
||||
|
||||
# Create the lock directory.
|
||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
||||
# that we are using for the .o file. Also, base the name on the expected
|
||||
# object file name, since that is what matters with a parallel build.
|
||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
||||
while true; do
|
||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
# FIXME: race condition here if user kills between mkdir and trap.
|
||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||
|
||||
# Run the compile.
|
||||
"$@"
|
||||
ret=$?
|
||||
|
||||
if test -f "$cofile"; then
|
||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
||||
elif test -f "${cofile}bj"; then
|
||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
||||
fi
|
||||
|
||||
rmdir "$lockdir"
|
||||
exit $ret
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
136
config.h.in
136
config.h.in
@ -1,136 +0,0 @@
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define for a mac build */
|
||||
#undef G_MAC
|
||||
|
||||
/* Define to disable the G_LOG macro */
|
||||
#undef G_NO_LOG
|
||||
|
||||
/* Define to 1 if <ctime> requires <time.h> */
|
||||
#undef HAVE_BUGGY_CTIME
|
||||
|
||||
/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
|
||||
*/
|
||||
#undef HAVE_DIRENT_H
|
||||
|
||||
/* Define to 1 if getipnodebyname() is available */
|
||||
#undef HAVE_GETIPNODEBYNAME
|
||||
|
||||
/* Define to 1 if getpwnam_r in pwd.h */
|
||||
#undef HAVE_GETPWNAM_R
|
||||
|
||||
/* Define to 1 if you have the `glob' function. */
|
||||
#undef HAVE_GLOB
|
||||
|
||||
/* Define to 1 if gmtime_r in time.h */
|
||||
#undef HAVE_GMTIME_R
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if ipv6 is available */
|
||||
#undef HAVE_IPV6
|
||||
|
||||
/* Define to 1 if localtime_r in time.h */
|
||||
#undef HAVE_LOCALTIME_R
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
|
||||
#undef HAVE_NDIR_H
|
||||
|
||||
/* Define to 1 if setgroups is available */
|
||||
#undef HAVE_SETGROUPS
|
||||
|
||||
/* Define to 1 if sockaddr_in6 has a sin6_len member */
|
||||
#undef HAVE_SIN6_LEN
|
||||
|
||||
/* Define to 1 if socklen_t type definition in sys/socket.h */
|
||||
#undef HAVE_SOCKLEN_T
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
|
||||
*/
|
||||
#undef HAVE_SYS_DIR_H
|
||||
|
||||
/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
|
||||
*/
|
||||
#undef HAVE_SYS_NDIR_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#undef HAVE_SYS_TIME_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Define to enable use of zlib */
|
||||
#undef HAVE_ZLIB
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#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 use IPv6 */
|
||||
#undef USE_IPV6
|
||||
|
||||
/* Define to eliminate unused admin interface code as a size optimisation */
|
||||
#undef USE_NO_ADMIN
|
||||
|
||||
/* Define to eliminate unused authentication code as a size optimisation */
|
||||
#undef USE_NO_AUTH
|
||||
|
||||
/* Define to eliminate unused exec-ing code as a size optimisation */
|
||||
#undef USE_NO_EXEC
|
||||
|
||||
/* Define to eliminate unused pop code as a size optimisation */
|
||||
#undef USE_NO_POP
|
||||
|
||||
/* Define to eliminate proxying code as a size optimisation */
|
||||
#undef USE_NO_PROXY
|
||||
|
||||
/* Define to eliminate unused config code as a size optimisation */
|
||||
#undef USE_SMALL_CONFIG
|
||||
|
||||
/* Define to have exception types as functions as a size optimisation */
|
||||
#undef USE_SMALL_EXCEPTIONS
|
||||
|
||||
/* Define to enable extra debug messages at compile-time */
|
||||
#undef _DEBUG
|
218
configure.ac
218
configure.ac
@ -1,15 +1,15 @@
|
||||
dnl Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
dnl
|
||||
dnl Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
dnl
|
||||
dnl This program is free software: you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation, either version 3 of the License, or
|
||||
dnl (at your option) any later version.
|
||||
dnl
|
||||
dnl
|
||||
dnl This program is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
dnl GNU General Public License for more details.
|
||||
dnl
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License
|
||||
dnl along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
dnl ===
|
||||
@ -17,202 +17,178 @@ dnl
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
dnl
|
||||
|
||||
AC_INIT([E-MailRelay],[1.9],[],[emailrelay])
|
||||
AC_CONFIG_SRCDIR(src/gsmtp/gsmtp.h)
|
||||
AC_INIT([E-MailRelay],[2.0],[],[emailrelay])
|
||||
AC_CONFIG_SRCDIR([src/gsmtp/gsmtp.h])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AM_INIT_AUTOMAKE([no-define])
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
AC_CONFIG_HEADERS([gconfig_defs.h])
|
||||
AM_MAINTAINER_MODE
|
||||
AC_DISABLE_OPTION_CHECKING
|
||||
|
||||
dnl ===
|
||||
dnl check for programs...
|
||||
dnl
|
||||
AC_PROG_CC
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CC([cc gcc clang])
|
||||
AC_PROG_CXX([c++ g++ clang++])
|
||||
AX_CXX_COMPILE_STDCXX_11([],[optional])
|
||||
AC_PROG_RANLIB
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_AWK
|
||||
AC_PROG_SED
|
||||
AC_PROG_GREP
|
||||
AC_CHECK_PROGS(MAKE,make gmake)
|
||||
AC_CHECK_PROGS(AR,ar gar)
|
||||
AC_CHECK_PROGS(GZIP,gzip)
|
||||
AC_CHECK_PROG(HAVE_DOXYGEN,doxygen,yes)
|
||||
AC_CHECK_PROG(HAVE_MAN2HTML,man2html,yes)
|
||||
ACLOCAL_COMPILER_VERSION
|
||||
ACLOCAL_CAPABILITIES
|
||||
AC_CHECK_PROG(GCONFIG_HAVE_DOXYGEN,doxygen,yes)
|
||||
AC_CHECK_PROG(GCONFIG_HAVE_MAN2HTML,man2html,yes)
|
||||
GCONFIG_FN_PROG_WINDRES
|
||||
GCONFIG_FN_PROG_WINDMC
|
||||
GCONFIG_FN_CONFIGURATION
|
||||
|
||||
dnl ===
|
||||
dnl check for libraries...
|
||||
dnl
|
||||
AC_LANG([C])
|
||||
AC_SEARCH_LIBS(gethostbyname,nsl)
|
||||
AC_SEARCH_LIBS(connect,socket)
|
||||
GCONFIG_FN_SEARCHLIBS_POSIX
|
||||
GCONFIG_FN_SEARCHLIBS_PAM
|
||||
|
||||
dnl ===
|
||||
dnl check for header files, functions and typedefs...
|
||||
dnl
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_DIRENT
|
||||
AC_HEADER_TIME
|
||||
AC_CHECK_HEADERS(unistd.h)
|
||||
AC_CHECK_HEADERS(sys/time.h)
|
||||
AC_CHECK_FUNCS(glob)
|
||||
AC_LANG([C++])
|
||||
ACLOCAL_TYPE_SOCKLEN_T
|
||||
ACLOCAL_CHECK_IPV6
|
||||
ACLOCAL_CHECK_GETIPNODEBYNAME
|
||||
ACLOCAL_CHECK_SIN6_LEN
|
||||
ACLOCAL_CHECK_BUGGY_CTIME
|
||||
ACLOCAL_CHECK_PAM_HEADERS
|
||||
ACLOCAL_CHECK_PAM
|
||||
ACLOCAL_CHECK_GETPWNAM_R
|
||||
ACLOCAL_CHECK_GMTIME_R
|
||||
ACLOCAL_CHECK_LOCALTIME_R
|
||||
ACLOCAL_CHECK_SETGROUPS
|
||||
ACLOCAL_CHECK_QT4
|
||||
GCONFIG_FN_TYPE_SOCKLEN_T
|
||||
GCONFIG_FN_TYPE_ERRNO_T
|
||||
GCONFIG_FN_TYPE_SSIZE_T
|
||||
GCONFIG_FN_CXX_NULLPTR
|
||||
GCONFIG_FN_CXX_CONSTEXPR
|
||||
GCONFIG_FN_CXX_NOEXCEPT
|
||||
GCONFIG_FN_CXX_OVERRIDE
|
||||
GCONFIG_FN_CXX_FINAL
|
||||
GCONFIG_FN_CXX_TYPE_TRAITS
|
||||
GCONFIG_FN_CXX_EMPLACE
|
||||
GCONFIG_FN_CXX_ALIGNMENT
|
||||
GCONFIG_FN_CXX_SHARED_PTR
|
||||
GCONFIG_FN_CXX_STD_THREAD
|
||||
GCONFIG_FN_CXX_STD_WSTRING
|
||||
GCONFIG_FN_IPV6
|
||||
GCONFIG_FN_SIN6_LEN
|
||||
GCONFIG_FN_STATBUF_NSEC
|
||||
GCONFIG_FN_INET_NTOP
|
||||
GCONFIG_FN_INET_PTON
|
||||
GCONFIG_FN_GETPWNAM
|
||||
GCONFIG_FN_GETPWNAM_R
|
||||
GCONFIG_FN_GMTIME_R
|
||||
GCONFIG_FN_GMTIME_S
|
||||
GCONFIG_FN_LOCALTIME_R
|
||||
GCONFIG_FN_LOCALTIME_S
|
||||
GCONFIG_FN_STRNCPY_S
|
||||
GCONFIG_FN_SETPGRP_BSD
|
||||
GCONFIG_FN_SETGROUPS
|
||||
GCONFIG_FN_GETENV_S
|
||||
GCONFIG_FN_READLINK
|
||||
GCONFIG_FN_ICONV
|
||||
GCONFIG_FN_PROC_PIDPATH
|
||||
GCONFIG_FN_QT
|
||||
GCONFIG_FN_TLS_OPENSSL
|
||||
GCONFIG_FN_TLS_MBEDTLS
|
||||
|
||||
dnl ===
|
||||
dnl initialise aclocal/pkg.m4...
|
||||
dnl
|
||||
# if the configure script fails in this area then you are probably missing pkg.m4
|
||||
PKG_PROG_PKG_CONFIG(0.9.0)
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-std-thread"
|
||||
dnl
|
||||
AC_ARG_ENABLE(std-thread,AS_HELP_STRING([--enable-std-thread],[use std::thread or not (default auto)]))
|
||||
GCONFIG_FN_ENABLE_STD_THREAD
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-debug"
|
||||
dnl
|
||||
AC_ARG_ENABLE(debug,AS_HELP_STRING([--enable-debug],[enable extra debug messages at compile-time (default no)]))
|
||||
ENABLE_DEBUG
|
||||
GCONFIG_FN_ENABLE_DEBUG
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-ipv6"
|
||||
dnl
|
||||
AC_ARG_ENABLE(ipv6,AS_HELP_STRING([--enable-ipv6],[enable ipv6 (default no)]))
|
||||
ENABLE_IPV6
|
||||
AC_ARG_ENABLE(ipv6,AS_HELP_STRING([--enable-ipv6],[enable ipv6 (default auto)]))
|
||||
GCONFIG_FN_ENABLE_IPV6
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-gui"
|
||||
dnl
|
||||
AC_ARG_ENABLE(gui,AS_HELP_STRING([--enable-gui],[enable configuration gui (requires Qt4) (default auto)]))
|
||||
ENABLE_GUI
|
||||
AC_ARG_ENABLE(gui,AS_HELP_STRING([--enable-gui],[enable configuration gui (requires Qt) (default auto)]))
|
||||
GCONFIG_FN_ENABLE_GUI
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-verbose"
|
||||
dnl
|
||||
AC_ARG_ENABLE(verbose,AS_HELP_STRING([--enable-verbose],[enable verbose logging (default yes)]))
|
||||
ENABLE_VERBOSE
|
||||
GCONFIG_FN_ENABLE_VERBOSE
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-pop"
|
||||
dnl "--enable-bsd"
|
||||
dnl
|
||||
AC_ARG_ENABLE(pop,AS_HELP_STRING([--enable-pop],[enable pop3 server protocol (default yes)]))
|
||||
ENABLE_POP
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-exec"
|
||||
dnl
|
||||
AC_ARG_ENABLE(exec,AS_HELP_STRING([--enable-exec],[enable running of external programs (disable-exec requires disable-gui) (default yes)]))
|
||||
ENABLE_EXEC
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-admin"
|
||||
dnl
|
||||
AC_ARG_ENABLE(exec,AS_HELP_STRING([--enable-admin],[enable admin interface (default yes)]))
|
||||
ENABLE_ADMIN
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-auth"
|
||||
dnl
|
||||
AC_ARG_ENABLE(exec,AS_HELP_STRING([--enable-auth],[enable authentication (disable-auth requires disable-pop) (default yes)]))
|
||||
ENABLE_AUTH
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-dns"
|
||||
dnl
|
||||
AC_ARG_ENABLE(exec,AS_HELP_STRING([--enable-dns],[enable dns lookup (default yes)]))
|
||||
ENABLE_DNS
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-identity"
|
||||
dnl
|
||||
AC_ARG_ENABLE(exec,AS_HELP_STRING([--enable-identity],[enable process userid switching (default yes)]))
|
||||
ENABLE_IDENTITY
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-small-config"
|
||||
dnl
|
||||
AC_ARG_ENABLE(exec,AS_HELP_STRING([--enable-small-config],[enable simplified confuration code for smaller binaries (rtfm) (default no)]))
|
||||
ENABLE_SMALL_CONFIG
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-small-exceptions"
|
||||
dnl
|
||||
AC_ARG_ENABLE(small_exceptions,AS_HELP_STRING([--enable-small-exceptions],[optimise exception classes for smaller binaries (default no)]))
|
||||
ENABLE_SMALL_EXCEPTIONS
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-proxy"
|
||||
dnl
|
||||
AC_ARG_ENABLE(proxy,AS_HELP_STRING([--enable-proxy],[enable proxying (default yes)]))
|
||||
ENABLE_PROXY
|
||||
AC_ARG_ENABLE(bsd,AS_HELP_STRING([--enable-bsd],[enable building for bsd (default auto)]))
|
||||
GCONFIG_FN_ENABLE_BSD
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-mac"
|
||||
dnl
|
||||
AC_ARG_ENABLE(mac,AS_HELP_STRING([--enable-mac],[enable building for a mac os x target (default auto)]))
|
||||
ENABLE_MAC
|
||||
AC_ARG_ENABLE(mac,AS_HELP_STRING([--enable-mac],[enable building for mac os x (default auto)]))
|
||||
GCONFIG_FN_ENABLE_MAC
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-windows"
|
||||
dnl
|
||||
AC_ARG_ENABLE(windows,AS_HELP_STRING([--enable-windows],[enable building for windows (default auto)]))
|
||||
GCONFIG_FN_ENABLE_WINDOWS
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-testing"
|
||||
dnl
|
||||
AC_ARG_ENABLE(testing,AS_HELP_STRING([--enable-testing],[enable make-check tests (default yes)]))
|
||||
ENABLE_TESTING
|
||||
|
||||
dnl ===
|
||||
dnl "--with-zlib"
|
||||
dnl
|
||||
AC_ARG_WITH(zlib,AS_HELP_STRING([--with-zlib],[use zlib for compressed installation packages (default auto)]))
|
||||
WITH_ZLIB
|
||||
AC_ARG_ENABLE(testing,AS_HELP_STRING([--enable-testing],[enable make check tests (default yes)]))
|
||||
GCONFIG_FN_ENABLE_TESTING
|
||||
|
||||
dnl ===
|
||||
dnl "--with-doxygen"
|
||||
dnl
|
||||
AC_ARG_WITH(doxygen,AS_HELP_STRING([--with-doxygen],[generate source code documentation with doxygen (default auto)]))
|
||||
WITH_DOXYGEN
|
||||
GCONFIG_FN_WITH_DOXYGEN
|
||||
|
||||
dnl ===
|
||||
dnl "--with-man2html"
|
||||
dnl
|
||||
AC_ARG_WITH(man2html,AS_HELP_STRING([--with-man2html],[convert man pages to html using man2html (default auto)]))
|
||||
WITH_MAN2HTML
|
||||
GCONFIG_FN_WITH_MAN2HTML
|
||||
|
||||
dnl ===
|
||||
dnl "--with-openssl"
|
||||
dnl "--with-openssl"/"--with-mbedtls"
|
||||
dnl
|
||||
AC_ARG_WITH(openssl,AS_HELP_STRING([--with-openssl],[use openssl for tls/ssl encryption (default auto)]))
|
||||
WITH_OPENSSL
|
||||
|
||||
dnl ===
|
||||
dnl "--with-glob"
|
||||
dnl
|
||||
AC_ARG_WITH(glob,AS_HELP_STRING([--with-glob],[use glob() for reading directories (default auto)]))
|
||||
WITH_GLOB
|
||||
AC_ARG_WITH(openssl,AS_HELP_STRING([--with-openssl],[use openssl for tls layer (default auto)]))
|
||||
AC_ARG_WITH(mbedtls,AS_HELP_STRING([--with-mbedtls],[use mbedtls for tls layer (default auto)]))
|
||||
GCONFIG_FN_TLS
|
||||
|
||||
dnl ===
|
||||
dnl "--with-pam"
|
||||
dnl
|
||||
AC_ARG_WITH(pam,AS_HELP_STRING([--with-pam],[use linux pam for authentication (default auto)]))
|
||||
WITH_PAM
|
||||
GCONFIG_FN_PAM
|
||||
GCONFIG_FN_WITH_PAM
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-static-linking"
|
||||
dnl
|
||||
AC_ARG_ENABLE(static-linking,AS_HELP_STRING([--enable-static-linking],[prefer static linking for some libraries (default no)]))
|
||||
ENABLE_STATIC_LINKING
|
||||
GCONFIG_FN_ENABLE_STATIC_LINKING
|
||||
|
||||
dnl ===
|
||||
dnl "--enable-install-hook"
|
||||
dnl
|
||||
AC_ARG_ENABLE(install-hook,AS_HELP_STRING([--enable-install-hook],[enable fixing up the start/stop configuration file at install time (default yes)]))
|
||||
ENABLE_INSTALL_HOOK
|
||||
GCONFIG_FN_ENABLE_INSTALL_HOOK
|
||||
|
||||
dnl ===
|
||||
dnl directory tweaking ...
|
||||
@ -220,21 +196,11 @@ dnl
|
||||
dnl define e_ prefixed directory variables
|
||||
dnl
|
||||
dnl not AC_PREFIX_DEFAULT([/usr])
|
||||
SET_DIRECTORIES
|
||||
AC_SUBST(e_docdir)
|
||||
AC_SUBST(e_initdir)
|
||||
AC_SUBST(e_icondir)
|
||||
AC_SUBST(e_spooldir)
|
||||
AC_SUBST(e_examplesdir)
|
||||
AC_SUBST(e_libexecdir)
|
||||
AC_SUBST(e_pamdir)
|
||||
AC_SUBST(e_sysconfdir)
|
||||
AC_SUBST(e_qtmoc)
|
||||
if test "$e_qtmoc" = "" ; then e_qtmoc="moc" ; fi
|
||||
GCONFIG_FN_SET_DIRECTORIES
|
||||
|
||||
dnl ===
|
||||
dnl generate files...
|
||||
dnl
|
||||
AC_CONFIG_FILES([Makefile src/Makefile src/glib/Makefile src/gssl/Makefile src/gnet/Makefile src/gauth/Makefile src/gsmtp/Makefile src/gpop/Makefile src/main/Makefile src/win32/Makefile src/gui/Makefile lib/Makefile lib/gcc2.95/Makefile lib/msvc6.0/Makefile bin/Makefile doc/Makefile etc/Makefile test/Makefile extra/Makefile debian/Makefile])
|
||||
AC_CONFIG_FILES([Makefile src/Makefile src/glib/Makefile src/gssl/Makefile src/gnet/Makefile src/gauth/Makefile src/gsmtp/Makefile src/gpop/Makefile src/main/Makefile src/main/icon/Makefile src/win32/Makefile src/gui/Makefile bin/Makefile doc/Makefile etc/Makefile test/Makefile test/certificates/Makefile m4/Makefile bsd/Makefile debian/Makefile])
|
||||
AC_OUTPUT
|
||||
|
||||
|
96
configure.sh
Executable file
96
configure.sh
Executable file
@ -0,0 +1,96 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
#
|
||||
# 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/>.
|
||||
# ===
|
||||
#
|
||||
# configure.sh
|
||||
#
|
||||
# A simple wrapper for the configure script.
|
||||
#
|
||||
# usage: configure.sh [-d] [-m] [<configure-options>]
|
||||
# -d debug compiler flags (see also --enable-debug)
|
||||
# -m mingw-w64
|
||||
#
|
||||
|
||||
thisdir="`cd \`dirname $0\` && pwd`"
|
||||
|
||||
if test ! -e "$thisdir/configure"
|
||||
then
|
||||
echo error: no autoconf configure script: try running \'bootstrap\' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test "$1" = "-d"
|
||||
then
|
||||
shift
|
||||
export CFLAGS="-O0 -g"
|
||||
export CXXFLAGS="-O0 -g"
|
||||
:
|
||||
elif expr "$*" : '.*enable.debug' >/dev/null
|
||||
then
|
||||
if test "$CFLAGS$CXXFLAGS" = ""
|
||||
then
|
||||
export CFLAGS="-O0 -g"
|
||||
export CXXFLAGS="-O0 -g"
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$1" = "-m"
|
||||
then
|
||||
shift
|
||||
export CXX="i686-w64-mingw32-g++"
|
||||
export CC="i686-w64-mingw32-gcc"
|
||||
export CXXFLAGS="-std=c++11 -pthread"
|
||||
export LDFLAGS="-pthread"
|
||||
$thisdir/configure --host i686-w64-mingw32 --enable-windows --disable-gui --disable-pam \
|
||||
--prefix=/usr --libexecdir=/usr/lib --docdir=/usr/share/doc --mandir=/usr/share/man "$@"
|
||||
:
|
||||
elif test "`uname`" = "NetBSD"
|
||||
then
|
||||
export CPPFLAGS="$CPPFLAGS -I/usr/X11R7/include"
|
||||
export LDFLAGS="$LDFLAGS -L/usr/X11R7/lib"
|
||||
$thisdir/configure --prefix=/usr --libexecdir=/usr/lib --docdir=/usr/share/doc --mandir=/usr/share/man --sysconfdir=/etc e_bsdinitdir=/etc/rc.d "$@"
|
||||
:
|
||||
elif test "`uname`" = "FreeBSD"
|
||||
then
|
||||
export CPPFLAGS="$CPPFLAGS -I/usr/local/include -I/usr/local/include/libav"
|
||||
export LDFLAGS="$LDFLAGS -L/usr/local/lib -L/usr/local/lib/libav"
|
||||
$thisdir/configure --prefix=/usr/local --mandir=/usr/local/man e_bsdinitdir=/usr/local/etc/rc.d "$@"
|
||||
:
|
||||
elif test "`uname`" = "OpenBSD"
|
||||
then
|
||||
export CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include"
|
||||
export LDFLAGS="$LDFLAGS -L/usr/X11R6/lib"
|
||||
$thisdir/configure --prefix=/usr/local --mandir=/usr/local/man e_bsdinitdir=/usr/local/etc/rc.d "$@"
|
||||
:
|
||||
elif test "`uname`" = "Darwin"
|
||||
then
|
||||
export CPPFLAGS="$CPPFLAGS -I/opt/local/include -I/opt/X11/include"
|
||||
export LDFLAGS="$LDFLAGS -L/opt/local/lib -L/opt/X11/lib"
|
||||
$thisdir/configure --prefix=/opt/local --mandir=/opt/local/man "$@"
|
||||
:
|
||||
elif test "`uname`" = "Linux"
|
||||
then
|
||||
export CPPFLAGS
|
||||
export LDFLAGS
|
||||
$thisdir/configure --prefix=/usr --libexecdir=/usr/lib --sysconfdir=/etc e_initdir=/etc/init.d e_spooldir=/var/spool/emailrelay "$@"
|
||||
:
|
||||
else
|
||||
export CPPFLAGS="$CPPFLAGS -I/usr/X11R7/include -I/usr/X11R6/include -I/usr/local/include -I/opt/local/include -I/opt/X11/include"
|
||||
export LDFLAGS="$LDFLAGS -L/usr/X11R7/lib -L/usr/X11R6/lib -L/usr/local/lib -L/opt/local/lib -L/opt/X11/lib"
|
||||
$thisdir/configure "$@"
|
||||
fi
|
||||
|
8
debian/Makefile.am
vendored
8
debian/Makefile.am
vendored
@ -1,16 +1,16 @@
|
||||
#
|
||||
## Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
##
|
||||
## Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
##
|
||||
## 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/>.
|
||||
#
|
||||
|
150
debian/Makefile.in
vendored
150
debian/Makefile.in
vendored
@ -1,9 +1,8 @@
|
||||
# Makefile.in generated by automake 1.11.3 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.15.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
|
||||
# Foundation, Inc.
|
||||
# Copyright (C) 1994-2017 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.
|
||||
@ -15,6 +14,61 @@
|
||||
|
||||
@SET_MAKE@
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
@ -32,21 +86,43 @@ NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
subdir = debian
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/m4_ax_cxx_compile_stdcxx.m4 \
|
||||
$(top_srcdir)/m4/m4_ax_cxx_compile_stdcxx_11.m4 \
|
||||
$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/config.h
|
||||
CONFIG_HEADER = $(top_builddir)/gconfig_defs.h
|
||||
CONFIG_CLEAN_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__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
@ -55,8 +131,6 @@ AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
COMPILER_VERSION = @COMPILER_VERSION@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
@ -67,13 +141,21 @@ DEPDIR = @DEPDIR@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
GCONFIG_CONFIGURATION = @GCONFIG_CONFIGURATION@
|
||||
GCONFIG_HAVE_DOXYGEN = @GCONFIG_HAVE_DOXYGEN@
|
||||
GCONFIG_HAVE_MAN2HTML = @GCONFIG_HAVE_MAN2HTML@
|
||||
GCONFIG_QT_CFLAGS = @GCONFIG_QT_CFLAGS@
|
||||
GCONFIG_QT_LIBS = @GCONFIG_QT_LIBS@
|
||||
GCONFIG_QT_MOC = @GCONFIG_QT_MOC@
|
||||
GCONFIG_STATIC_END = @GCONFIG_STATIC_END@
|
||||
GCONFIG_STATIC_START = @GCONFIG_STATIC_START@
|
||||
GCONFIG_TLS_LIBS = @GCONFIG_TLS_LIBS@
|
||||
GCONFIG_WINDMC = @GCONFIG_WINDMC@
|
||||
GCONFIG_WINDRES = @GCONFIG_WINDRES@
|
||||
GREP = @GREP@
|
||||
GZIP = @GZIP@
|
||||
G_CAPABILITIES = @G_CAPABILITIES@
|
||||
HAVE_DOXYGEN = @HAVE_DOXYGEN@
|
||||
HAVE_MAN2HTML = @HAVE_MAN2HTML@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@ -87,7 +169,6 @@ MAINT = @MAINT@
|
||||
MAKE = @MAKE@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
MOC = @MOC@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
@ -96,23 +177,19 @@ PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PAM_INCLUDE = @PAM_INCLUDE@
|
||||
PAM_LIBS = @PAM_LIBS@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
QT_CFLAGS = @QT_CFLAGS@
|
||||
QT_LIBS = @QT_LIBS@
|
||||
QT_MOC = @QT_MOC@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SSL_LIBS = @SSL_LIBS@
|
||||
STATIC_END = @STATIC_END@
|
||||
STATIC_START = @STATIC_START@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
ZLIB_LIBS = @ZLIB_LIBS@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
@ -131,13 +208,13 @@ datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
e_bsdinitdir = @e_bsdinitdir@
|
||||
e_docdir = @e_docdir@
|
||||
e_examplesdir = @e_examplesdir@
|
||||
e_icondir = @e_icondir@
|
||||
e_initdir = @e_initdir@
|
||||
e_libexecdir = @e_libexecdir@
|
||||
e_pamdir = @e_pamdir@
|
||||
e_qtmoc = @e_qtmoc@
|
||||
e_spooldir = @e_spooldir@
|
||||
e_sysconfdir = @e_sysconfdir@
|
||||
exec_prefix = @exec_prefix@
|
||||
@ -157,6 +234,7 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -184,7 +262,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu debian/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu debian/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
@ -202,11 +279,11 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
tags: TAGS
|
||||
TAGS:
|
||||
tags TAGS:
|
||||
|
||||
ctags: CTAGS
|
||||
CTAGS:
|
||||
ctags CTAGS:
|
||||
|
||||
cscope cscopelist:
|
||||
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@ -341,15 +418,18 @@ 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
|
||||
.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
|
||||
ctags-am 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 tags-am uninstall uninstall-am
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
|
55
debian/changelog
vendored
55
debian/changelog
vendored
@ -1,7 +1,58 @@
|
||||
emailrelay (2.0) unstable; urgency=low
|
||||
* Improved IPv6 support, with IPv4 and IPv6 used independently at run-time (see "--interface").
|
||||
* Server process is not blocked during "--filter" or "--address-verifier" execution, if multi-threaded.
|
||||
* Support for the "mbedTLS" TLS library as an alternative to OpenSSL ("configure --with-mbedtls").
|
||||
* TLS server certificates specified with new "--server-tls-certificate" option, not "--server-tls".
|
||||
* TLS servers enable client certificate verification with "--server-tls-verify", not "--tls-config".
|
||||
* TLS clients can verify server certificates with "--client-tls-verify" and "--client-tls-verify-name".
|
||||
* The "--tls-config" option works differently (see NEWS file).
|
||||
* New "--client-tls-server-name" option for server name identification (SNI).
|
||||
* New "--client-tls-required" option to force client connections to use TLS.
|
||||
* New "--server-tls-required" option to force remote SMTP clients to use STARTTLS.
|
||||
* New "--forward-on-disconnect" option replaces "--poll=0".
|
||||
* The "--anonymous" option now suppresses the "Received" line, whatever the "--domain".
|
||||
* The second field in the secrets file indicates the password encoding, not AUTH mechanism.
|
||||
* The "--verifier" option is now "--address-verifier", with simplified command-line parameters.
|
||||
* Command-line file paths can use "@app" as a prefix to be relative to the executable directory.
|
||||
* Command-line file paths can be relative to the startup cwd even when daemonised.
|
||||
* Filter exit codes between 104 and 107 are interpreted differently (see NEWS file).
|
||||
* Message rejection reasons passed back to the submitting SMTP client are much less verbose.
|
||||
* Forwarding events are queued up if the forwarding client is still busy from last time.
|
||||
* The bind address for outgoing connections is no longer taken from first unqualified "--interface" address [bug-id #27].
|
||||
* The SMTP client protocol tries more than one authentication mechanism.
|
||||
* Some support for XOAUTH2 client-side authentication.
|
||||
* Client protocol sends QUIT with a socket shutdown().
|
||||
* The Windows commdlg list-view widget is used for the server status pages.
|
||||
* The Windows connection-lookup feature is withdrawn ("--peer-lookup").
|
||||
* Several build-time configure options like "--disable-pop" are withdrawn.
|
||||
* C++ 2011 is preferred, and required for multi-threading.
|
||||
* Support for very old versions of Windows is dropped.
|
||||
-- maintainer graeme_walker <graeme_walker@users.sourceforge.net> Sun, 10 Jun 2018 16:17:54 +0000
|
||||
|
||||
emailrelay (1.9.2) unstable; urgency=low
|
||||
* Fixed a leak in the event-loop garbage collection.
|
||||
* A local hostname that fails to resolve is not an error.
|
||||
* A warning is emitted if there is more than one client authentication secret.
|
||||
* Multiple "--interface" options are allowed separately on the command-line.
|
||||
* Added a new "--client-interface" option.
|
||||
* The "Received" line is formatted as per RFC-3848 ("with ESMTPSA").
|
||||
* The LOGIN and PLAIN mechanisms in the secrets file are now equivalent.
|
||||
* The Windows service wrapper can use a configuration file to locate the startup batch file.
|
||||
* Simplified the implementation of the GUI installation program.
|
||||
* Reworded the "read error: disconnected" log message.
|
||||
* Less verbose logging of "no more messages to send".
|
||||
* Qt4 or Qt5 selected by the "configure" script.
|
||||
* Improved the RPM spec file.
|
||||
-- maintainer graeme_walker <graeme_walker@users.sourceforge.net> Sun, 10 Jun 2018 16:17:54 +0000
|
||||
|
||||
emailrelay (1.9.1) unstable; urgency=low
|
||||
* Updated OpenSSL from 1.0.1e to 1.0.1g in the Windows build.
|
||||
-- maintainer graeme_walker <graeme_walker@users.sourceforge.net> Sat, 12 Apr 2014 00:00:00 +0000
|
||||
|
||||
emailrelay (1.9) unstable; urgency=low
|
||||
* Added negotiated TLS/SSL for POP (ie. "STLS").
|
||||
* The first two fields in the secrets files are reordered (with backwards compatibility).
|
||||
* Added Linux-PAM authentication ("configure --with-pam" and then "--server-auth=/pam").
|
||||
* Added Linux PAM authentication ("configure --with-pam" and then "--server-auth=/pam").
|
||||
* Optional protocol-specific "--interface" qualifiers, eg. "--interface smtp=127.0.0.1,pop=192.168.1.1".
|
||||
* Outgoing client connection bound with the first "--interface" or "--interface client=..." address.
|
||||
* Support for SMTP-over-TLS on outgoing client connection ("--client-tls-connection") (cf. "STARTTLS")
|
||||
@ -21,7 +72,7 @@ emailrelay (1.9) unstable; urgency=low
|
||||
* Added "--log-file" option to redirect stderr.
|
||||
* Added Windows "--peer-lookup" option.
|
||||
* Fix for MD5 code in 64-bit builds.
|
||||
-- maintainer graeme_walker <graeme_walker@users.sourceforge.net> Sat, 7 Dec 2013 22:55:40 +0000
|
||||
-- maintainer graeme_walker <graeme_walker@users.sourceforge.net> Sun, 01 Dec 2013 00:00:00 +0000
|
||||
|
||||
emailrelay (1.8.2) unstable; urgency=low
|
||||
* Fix namespaces for gcc 3.4.
|
||||
|
14
debian/copyright
vendored
14
debian/copyright
vendored
@ -1,19 +1,21 @@
|
||||
Copyright
|
||||
=========
|
||||
Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
|
||||
Refer to the file COPYING (included), /usr/share/common-licenses/GPL-3, or
|
||||
<http://www.gnu.org/licenses/> for the terms of the GNU General Public License.
|
||||
|
||||
Binary distributions
|
||||
--------------------
|
||||
Binary distributions of E-MailRelay may include copyrighted code from:
|
||||
Binary distributions of E-MailRelay might include copyrighted code from:
|
||||
* OpenSSL Toolkit (http://www.openssl.org)
|
||||
* MinGW (http://www.mingw.org)
|
||||
* Trolltech Qt (http://trolltech.com)
|
||||
* mbedTLS (http://tls.mbed.org)
|
||||
* Qt (http://qt.io)
|
||||
* Microsoft (http://microsoft.com)
|
||||
* Free Software Foundation (fsf.org)
|
||||
|
||||
These are distributed under licenses compatible with the GPLv3. Please
|
||||
refer to their websites for further details.
|
||||
These parts are distributed under license; please refer to their
|
||||
websites for further details.
|
||||
|
||||
This product includes software developed by the OpenSSL Project
|
||||
for use in the OpenSSL Toolkit (http://www.openssl.org/).
|
||||
|
33
debian/postinst
vendored
Normal file → Executable file
33
debian/postinst
vendored
Normal file → Executable file
@ -5,31 +5,41 @@
|
||||
|
||||
spool="/var/spool/emailrelay"
|
||||
submit="/usr/sbin/emailrelay-submit"
|
||||
init="/etc/init.d/emailrelay"
|
||||
rundir="/var/run/emailrelay"
|
||||
|
||||
create_spool()
|
||||
emailrelay_setup()
|
||||
{
|
||||
test -d "$spool" || mkdir "$spool"
|
||||
}
|
||||
|
||||
fix_permissions()
|
||||
{
|
||||
if ls -nd "$spool" | cut -d' ' --fields=3,4 | grep -q '^0 0$'
|
||||
then
|
||||
chgrp daemon "$spool" && chmod 775 "$spool"
|
||||
chgrp daemon "$spool" && chmod 775 "$spool" && chmod g+s "$spool"
|
||||
fi
|
||||
|
||||
test -d "$rundir" || mkdir "$rundir"
|
||||
if ls -nd "$rundir" | cut -d' ' --fields=3,4 | grep -q '^0 0$'
|
||||
then
|
||||
chgrp daemon "$rundir" && chmod 770 "$rundir"
|
||||
fi
|
||||
|
||||
if ls -n "$submit" | cut -d' ' --fields=3,4 | grep -q '^0 0$'
|
||||
then
|
||||
chgrp daemon "$submit" && chmod g+s "$submit"
|
||||
fi
|
||||
|
||||
if test -f "$init" -a ! -x "$init"
|
||||
then
|
||||
chmod +x "$init"
|
||||
fi
|
||||
}
|
||||
|
||||
fix_html()
|
||||
emailrelay_fix_html()
|
||||
{
|
||||
# index.html refers to changelog.html, not changelog.html.gz
|
||||
cd /usr/share/doc/emailrelay && gzip -d -c changelog.html.gz > changelog.html
|
||||
}
|
||||
|
||||
create_config()
|
||||
emailrelay_create_config()
|
||||
{
|
||||
if test ! -f /etc/emailrelay.conf -a -f /etc/emailrelay.conf.template
|
||||
then
|
||||
@ -39,8 +49,7 @@ create_config()
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
create_config
|
||||
create_spool
|
||||
fix_permissions
|
||||
fix_html
|
||||
emailrelay_setup
|
||||
emailrelay_fix_html
|
||||
emailrelay_create_config
|
||||
|
||||
|
6
debian/postrm
vendored
Normal file → Executable file
6
debian/postrm
vendored
Normal file → Executable file
@ -4,12 +4,14 @@
|
||||
#
|
||||
|
||||
spool="/var/spool/emailrelay"
|
||||
rundir="/var/run/emailrelay"
|
||||
|
||||
rm -f /usr/share/doc/emailrelay/changelog.html || true
|
||||
if test "$1" = "purge"
|
||||
then
|
||||
rmdir "$spool" || true
|
||||
rm /etc/emailrelay.conf || true
|
||||
rmdir "$spool" 2>/dev/null || true
|
||||
rmdir "$rundir" 2>/dev/null || true
|
||||
rm /etc/emailrelay.conf 2>/dev/null || true
|
||||
fi
|
||||
|
||||
#DEBHELPER#
|
||||
|
0
debian/preinst
vendored
Normal file → Executable file
0
debian/preinst
vendored
Normal file → Executable file
0
debian/prerm
vendored
Normal file → Executable file
0
debian/prerm
vendored
Normal file → Executable file
481
depcomp
481
depcomp
@ -1,10 +1,9 @@
|
||||
#! /bin/sh
|
||||
# depcomp - compile a program generating dependencies as side-effects
|
||||
|
||||
scriptversion=2011-12-04.11; # UTC
|
||||
scriptversion=2013-05-30.07; # UTC
|
||||
|
||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
|
||||
# 2011 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
||||
|
||||
# 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
|
||||
@ -28,9 +27,9 @@ scriptversion=2011-12-04.11; # UTC
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
||||
@ -40,8 +39,8 @@ as side-effects.
|
||||
|
||||
Environment variables:
|
||||
depmode Dependency tracking mode.
|
||||
source Source file read by `PROGRAMS ARGS'.
|
||||
object Object file output by `PROGRAMS ARGS'.
|
||||
source Source file read by 'PROGRAMS ARGS'.
|
||||
object Object file output by 'PROGRAMS ARGS'.
|
||||
DEPDIR directory where to store dependencies.
|
||||
depfile Dependency file to output.
|
||||
tmpdepfile Temporary file to use when outputting dependencies.
|
||||
@ -57,6 +56,66 @@ EOF
|
||||
;;
|
||||
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
|
||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||
exit 1
|
||||
@ -69,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||
|
||||
rm -f "$tmpdepfile"
|
||||
|
||||
# Avoid interferences from the environment.
|
||||
gccflag= dashmflag=
|
||||
|
||||
# Some modes work just like other modes, but use different flags. We
|
||||
# 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
|
||||
@ -80,26 +142,32 @@ if test "$depmode" = hp; then
|
||||
fi
|
||||
|
||||
if test "$depmode" = dashXmstdout; then
|
||||
# This is just like dashmstdout with a different argument.
|
||||
dashmflag=-xM
|
||||
depmode=dashmstdout
|
||||
# This is just like dashmstdout with a different argument.
|
||||
dashmflag=-xM
|
||||
depmode=dashmstdout
|
||||
fi
|
||||
|
||||
cygpath_u="cygpath -u -f -"
|
||||
if test "$depmode" = msvcmsys; then
|
||||
# This is just like msvisualcpp 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=msvisualcpp
|
||||
# This is just like msvisualcpp 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=msvisualcpp
|
||||
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
|
||||
# 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
|
||||
@ -122,8 +190,7 @@ gcc3)
|
||||
done
|
||||
"$@"
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
@ -131,13 +198,17 @@ gcc3)
|
||||
;;
|
||||
|
||||
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
|
||||
## why we pick this rather obscure method:
|
||||
## - 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.
|
||||
## (We might end up doing this anyway to support other compilers.)
|
||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||
## -MM, not -M (despite what the docs say).
|
||||
## -MM, not -M (despite what the docs say). Also, it might not be
|
||||
## supported by the other compilers which use the 'gcc' depmode.
|
||||
## - Using -M directly means running the compiler twice (even worse
|
||||
## than renaming).
|
||||
if test -z "$gccflag"; then
|
||||
@ -145,33 +216,31 @@ gcc)
|
||||
fi
|
||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
||||
## The second -e expression handles DOS-style file names with drive letters.
|
||||
# The second -e expression handles DOS-style file names with drive
|
||||
# letters.
|
||||
sed -e 's/^[^:]*: / /' \
|
||||
-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
|
||||
## is deleted, the dependency causes make to die (because there is
|
||||
## typically no way to rebuild the header). We avoid this by adding
|
||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||
## this for us directly.
|
||||
tr ' ' '
|
||||
' < "$tmpdepfile" |
|
||||
## Some versions of gcc put a space before the `:'. On the theory
|
||||
## 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
|
||||
## well. hp depmode also adds that space, but also prefixes the VPATH
|
||||
## 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
|
||||
## correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
@ -189,8 +258,7 @@ sgi)
|
||||
"$@" -MDupdate "$tmpdepfile"
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
@ -198,43 +266,41 @@ sgi)
|
||||
|
||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||
echo "$object : \\" > "$depfile"
|
||||
|
||||
# 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
|
||||
# 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;
|
||||
# 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.
|
||||
tr ' ' '
|
||||
' < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
||||
tr '
|
||||
' ' ' >> "$depfile"
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
||||
| tr "$nl" ' ' >> "$depfile"
|
||||
echo >> "$depfile"
|
||||
|
||||
# The second pass generates a dummy entry for each header file.
|
||||
tr ' ' '
|
||||
' < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||
>> "$depfile"
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||
>> "$depfile"
|
||||
else
|
||||
# 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"
|
||||
make_dummy_depfile
|
||||
fi
|
||||
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)
|
||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||
# 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.
|
||||
# Version 6 uses the directory in both cases.
|
||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||
test "x$dir" = "x$object" && dir=
|
||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1=$dir$base.u
|
||||
tmpdepfile2=$base.u
|
||||
@ -247,9 +313,7 @@ aix)
|
||||
"$@" -M
|
||||
fi
|
||||
stat=$?
|
||||
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
exit $stat
|
||||
fi
|
||||
@ -258,44 +322,100 @@ aix)
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
if test -f "$tmpdepfile"; then
|
||||
# Each line is of the form `foo.o: dependent.h'.
|
||||
# Do two passes, one to just change these to
|
||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||
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"
|
||||
else
|
||||
# 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"
|
||||
aix_post_process_depfile
|
||||
;;
|
||||
|
||||
tcc)
|
||||
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
||||
# FIXME: That version still under development at the moment of writing.
|
||||
# Make that this statement remains true also for stable, released
|
||||
# versions.
|
||||
# It will wrap lines (doesn't matter whether long or short) with a
|
||||
# trailing '\', as in:
|
||||
#
|
||||
# foo.o : \
|
||||
# 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
|
||||
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"
|
||||
;;
|
||||
|
||||
icc)
|
||||
# Intel's C compiler understands `-MD -MF file'. However on
|
||||
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
||||
# ICC 7.0 will fill foo.d with something like
|
||||
# foo.o: sub/foo.c
|
||||
# foo.o: sub/foo.h
|
||||
# which is wrong. We want:
|
||||
# sub/foo.o: sub/foo.c
|
||||
# sub/foo.o: sub/foo.h
|
||||
# sub/foo.c:
|
||||
# sub/foo.h:
|
||||
# ICC 7.1 will output
|
||||
## The order of this option in the case statement is important, since the
|
||||
## shell code in configure will try each of these formats in the order
|
||||
## listed in this file. A plain '-MD' option would be understood by many
|
||||
## compilers, so we must ensure this comes after the gcc and icc options.
|
||||
pgcc)
|
||||
# Portland's C compiler understands '-MD'.
|
||||
# Will always output deps to 'file.d' where file is the root name of the
|
||||
# source file under compilation, even if file resides in a subdirectory.
|
||||
# The object file name does not affect the name of the '.d' file.
|
||||
# pgcc 10.2 will output
|
||||
# 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 ... \
|
||||
# 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
|
||||
|
||||
"$@" -MD -MF "$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
# For projects that build the same source file twice into different object
|
||||
# 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=$?
|
||||
# Release the lock.
|
||||
rmdir "$lockdir"
|
||||
break
|
||||
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"
|
||||
exit $stat
|
||||
fi
|
||||
@ -307,8 +427,8 @@ icc)
|
||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
|
||||
sed -e 's/$/ :/' >> "$depfile"
|
||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
@ -319,9 +439,8 @@ hp2)
|
||||
# 'foo.d', which lands next to the object file, wherever that
|
||||
# happens to be.
|
||||
# Much of this is similar to the tru64 case; see comments there.
|
||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||
test "x$dir" = "x$object" && dir=
|
||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir.libs/$base.d
|
||||
@ -332,8 +451,7 @@ hp2)
|
||||
"$@" +Maked
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||
exit $stat
|
||||
fi
|
||||
@ -343,77 +461,61 @@ hp2)
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
if test -f "$tmpdepfile"; then
|
||||
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||
# Add `dependent.h:' lines.
|
||||
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||
# Add 'dependent.h:' lines.
|
||||
sed -ne '2,${
|
||||
s/^ *//
|
||||
s/ \\*$//
|
||||
s/$/:/
|
||||
p
|
||||
}' "$tmpdepfile" >> "$depfile"
|
||||
s/^ *//
|
||||
s/ \\*$//
|
||||
s/$/:/
|
||||
p
|
||||
}' "$tmpdepfile" >> "$depfile"
|
||||
else
|
||||
echo "#dummy" > "$depfile"
|
||||
make_dummy_depfile
|
||||
fi
|
||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||
;;
|
||||
|
||||
tru64)
|
||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||
# 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
|
||||
# dependencies in `foo.d' instead, so we check for that too.
|
||||
# Subdirectories are respected.
|
||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||
test "x$dir" = "x$object" && dir=
|
||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||
# 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
|
||||
# dependencies in 'foo.d' instead, so we check for that too.
|
||||
# Subdirectories are respected.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
|
||||
if test "$libtool" = yes; then
|
||||
# With Tru64 cc, shared objects can also be used to make a
|
||||
# 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
|
||||
# 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
|
||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||
# the former would cause a distcleancheck panic.
|
||||
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
|
||||
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
||||
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
||||
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||
"$@" -Wc,-MD
|
||||
else
|
||||
tmpdepfile1=$dir$base.o.d
|
||||
tmpdepfile2=$dir$base.d
|
||||
tmpdepfile3=$dir$base.d
|
||||
tmpdepfile4=$dir$base.d
|
||||
"$@" -MD
|
||||
fi
|
||||
if test "$libtool" = yes; then
|
||||
# Libtool 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
|
||||
# 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
|
||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||
# the former would cause a distcleancheck panic.
|
||||
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
||||
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
||||
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||
"$@" -Wc,-MD
|
||||
else
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir$base.d
|
||||
tmpdepfile3=$dir$base.d
|
||||
"$@" -MD
|
||||
fi
|
||||
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||
exit $stat
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
if test -f "$tmpdepfile"; then
|
||||
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"
|
||||
else
|
||||
echo "#dummy" > "$depfile"
|
||||
fi
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
# Same post-processing that is required for AIX mode.
|
||||
aix_post_process_depfile
|
||||
;;
|
||||
|
||||
msvc7)
|
||||
if test "$libtool" = yes; then
|
||||
@ -424,8 +526,7 @@ msvc7)
|
||||
"$@" $showIncludes > "$tmpdepfile"
|
||||
stat=$?
|
||||
grep -v '^Note: including file: ' "$tmpdepfile"
|
||||
if test "$stat" = 0; then :
|
||||
else
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
@ -443,14 +544,15 @@ msvc7)
|
||||
p
|
||||
}' | $cygpath_u | sort -u | sed -n '
|
||||
s/ /\\ /g
|
||||
s/\(.*\)/ \1 \\/p
|
||||
s/\(.*\)/'"$tab"'\1 \\/p
|
||||
s/.\(.*\) \\/\1:/
|
||||
H
|
||||
$ {
|
||||
s/.*/ /
|
||||
s/.*/'"$tab"'/
|
||||
G
|
||||
p
|
||||
}' >> "$depfile"
|
||||
echo >> "$depfile" # make sure the fragment doesn't end with a backslash
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
@ -478,7 +580,7 @@ dashmstdout)
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove `-o $object'.
|
||||
# Remove '-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
@ -498,18 +600,18 @@ dashmstdout)
|
||||
done
|
||||
|
||||
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:
|
||||
# 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 |
|
||||
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
|
||||
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
cat < "$tmpdepfile" > "$depfile"
|
||||
tr ' ' '
|
||||
' < "$tmpdepfile" | \
|
||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
## correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
@ -562,11 +664,12 @@ makedepend)
|
||||
# makedepend may prepend the VPATH from the source file name to the object.
|
||||
# No need to regex-escape $object, excess matching of '.' is harmless.
|
||||
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
||||
sed '1,2d' "$tmpdepfile" | tr ' ' '
|
||||
' | \
|
||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
## correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed '1,2d' "$tmpdepfile" \
|
||||
| tr ' ' "$nl" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||
;;
|
||||
|
||||
@ -583,7 +686,7 @@ cpp)
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove `-o $object'.
|
||||
# Remove '-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
@ -602,10 +705,10 @@ cpp)
|
||||
esac
|
||||
done
|
||||
|
||||
"$@" -E |
|
||||
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
||||
sed '$ s: \\$::' > "$tmpdepfile"
|
||||
"$@" -E \
|
||||
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
| sed '$ s: \\$::' > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
cat < "$tmpdepfile" >> "$depfile"
|
||||
@ -637,23 +740,23 @@ msvisualcpp)
|
||||
shift
|
||||
;;
|
||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||
set fnord "$@"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
set fnord "$@"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
set fnord "$@" "$arg"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
"$@" -E 2>/dev/null |
|
||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
|
||||
echo " " >> "$depfile"
|
||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
||||
echo "$tab" >> "$depfile"
|
||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
175
doc/Makefile.am
175
doc/Makefile.am
@ -1,113 +1,98 @@
|
||||
#
|
||||
## Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
##
|
||||
## Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
##
|
||||
## 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/>.
|
||||
#
|
||||
|
||||
txt_files=developer.txt reference.txt userguide.txt windows.txt
|
||||
man_files_in=emailrelay.1 emailrelay-passwd.1 emailrelay-poke.1 emailrelay-submit.1 emailrelay-filter-copy.1
|
||||
man_files_out=emailrelay.1.gz emailrelay-passwd.1.gz emailrelay-poke.1.gz emailrelay-submit.1.gz emailrelay-filter-copy.1.gz
|
||||
html_files_in=doxygen-header.html doxygen-missing.html doxygen.cfg
|
||||
html_files_thru=index.html emailrelay-man.html
|
||||
html_files_out=readme.html developer.html reference.html userguide.html windows.html changelog.html
|
||||
docbook_files_out=emailrelay.docbook
|
||||
css_files_in=\
|
||||
emailrelay.css_ \
|
||||
emailrelay-doxygen.css_
|
||||
css_files_out=\
|
||||
txt_files_install=\
|
||||
readme.txt readme.md readme.rst \
|
||||
developer.txt developer.md developer.rst \
|
||||
reference.txt reference.md reference.rst \
|
||||
userguide.txt userguide.md userguide.rst \
|
||||
windows.txt windows.md windows.rst \
|
||||
changelog.txt changelog.md changelog.rst \
|
||||
doxygen.cfg.in \
|
||||
index.rst conf.py
|
||||
|
||||
man_files_install=\
|
||||
emailrelay.1 \
|
||||
emailrelay-passwd.1 \
|
||||
emailrelay-submit.1 \
|
||||
emailrelay-filter-copy.1
|
||||
|
||||
man_files_clean=\
|
||||
emailrelay.1.gz \
|
||||
emailrelay-passwd.1.gz \
|
||||
emailrelay-submit.1.gz \
|
||||
emailrelay-filter-copy.1.gz
|
||||
|
||||
html_files_noinstall=\
|
||||
doxygen-missing.html
|
||||
|
||||
html_files_install=\
|
||||
index.html \
|
||||
emailrelay-man.html \
|
||||
readme.html \
|
||||
developer.html \
|
||||
reference.html \
|
||||
userguide.html \
|
||||
windows.html \
|
||||
changelog.html
|
||||
|
||||
css_files_install=\
|
||||
emailrelay.css \
|
||||
emailrelay-doxygen.css
|
||||
png_files_thru=\
|
||||
valid-html401.png \
|
||||
diagram-1.png \
|
||||
diagram-2.png
|
||||
png_files_in=\
|
||||
gsmtp-classes.png_ \
|
||||
gnet-classes.png_ \
|
||||
sequence-3.png_ \
|
||||
gnet-client.png_ \
|
||||
gsmtp-serverprotocol.png_ \
|
||||
auth.png_
|
||||
png_files_out=\
|
||||
gsmtp-classes.png \
|
||||
gnet-classes.png \
|
||||
sequence-3.png \
|
||||
gnet-client.png \
|
||||
gsmtp-serverprotocol.png \
|
||||
auth.png
|
||||
|
||||
EXTRA_DIST = $(man_files_in) $(txt_files) $(html_files_in) $(css_files_in) $(png_files_in) $(png_files_thru) $(html_files_thru) mingw.mak
|
||||
noinst_SCRIPTS = .dox .docbook
|
||||
man1_MANS = $(man_files_in)
|
||||
e_doc_DATA = $(txt_files) $(html_files_out) $(html_files_thru) $(css_files_out) $(png_files_out) $(png_files_thru) $(docbook_files_out)
|
||||
CLEANFILES = $(noinst_SCRIPTS) $(man_files_out) $(html_files_out) $(docbook_files_out) $(png_files_out) $(css_files_out) Doxyfile *.db *.mu doxygen/* docbook/*
|
||||
svg_files_noinstall=\
|
||||
authentication.svg \
|
||||
forwardto.svg \
|
||||
serverclient.svg \
|
||||
whatisit.svg
|
||||
|
||||
SUFFIXES = .txt .html .db .mu
|
||||
png_files_install=\
|
||||
authentication.png \
|
||||
forwardto.png \
|
||||
serverclient.png \
|
||||
whatisit.png \
|
||||
download-button.png
|
||||
|
||||
converter_html=$(top_builddir)/bin/txt2html.sh
|
||||
converter_txt2mu=$(top_builddir)/bin/txt2mu.sh
|
||||
converter_mu2html=$(top_builddir)/bin/mu2html.sh
|
||||
converter_expand=$(top_builddir)/bin/expand.sh
|
||||
converter_mu2docbook=$(top_builddir)/bin/mu2docbook.sh
|
||||
run_doxygen=$(top_builddir)/bin/doxygen.sh
|
||||
run_doxygen_fixup=$(top_builddir)/bin/doxygen_fixup.pl
|
||||
css=emailrelay.css
|
||||
|
||||
.txt.html:
|
||||
$(converter_html) -a "$(AWK)" "$(top_srcdir)/doc/$*.txt" "$(css)" > "$*.html"
|
||||
EXTRA_DIST = \
|
||||
$(man_files_install) \
|
||||
$(txt_files_install) \
|
||||
$(css_files_install) \
|
||||
$(png_files_install) \
|
||||
$(svg_files_noinstall) \
|
||||
$(html_files_install) \
|
||||
$(html_files_noinstall) \
|
||||
make-website
|
||||
|
||||
.txt.mu:
|
||||
$(converter_txt2mu) -a "$(AWK)" "$(top_srcdir)/doc/$*.txt" > "$*.mu"
|
||||
noinst_SCRIPTS = .dox
|
||||
man1_MANS = $(man_files_install)
|
||||
e_doc_DATA = $(txt_files_install) $(html_files_install) $(css_files_install) $(png_files_install)
|
||||
CLEANFILES = $(noinst_SCRIPTS) $(man_files_clean) doxygen.out doxygen.cfg doxygen/search/* doxygen/*
|
||||
|
||||
.mu.db:
|
||||
$(converter_mu2docbook) -a "$(AWK)" -x < "$(top_builddir)/doc/$*.mu" > "$*.db"
|
||||
SUFFIXES = .txt .html .mu
|
||||
|
||||
.css_.css:
|
||||
cp "$(top_srcdir)/doc/$*.css_" $*.css
|
||||
|
||||
.png_.png:
|
||||
cp "$(top_srcdir)/doc/$*.png_" $*.png
|
||||
|
||||
head.db: $(converter_mu2docbook)
|
||||
$(converter_mu2docbook) -a "$(AWK)" --head "E-MailRelay" > head.db.tmp && mv -f head.db.tmp head.db
|
||||
|
||||
tail.db: $(converter_mu2docbook)
|
||||
$(converter_mu2docbook) -a "$(AWK)" --tail > tail.db.tmp && mv -f tail.db.tmp tail.db
|
||||
|
||||
emailrelay.docbook: head.db tail.db userguide.db reference.db developer.db
|
||||
cat head.db userguide.db reference.db developer.db tail.db > emailrelay.docbook
|
||||
|
||||
.docbook: emailrelay.docbook $(png_files_out)
|
||||
-xmlto -o docbook html emailrelay.docbook && touch .docbook && cp "$(top_srcdir)/doc/"*.png docbook/
|
||||
run_doxygen=$(top_srcdir)/bin/doxygen.sh
|
||||
|
||||
.dox:
|
||||
$(run_doxygen) "$(HAVE_DOXYGEN)" "$(top_srcdir)" "$(top_builddir)" Doxyfile && touch .dox
|
||||
-$(run_doxygen_fixup) "$(top_builddir)/doc/doxygen"
|
||||
-cp "$(top_srcdir)/doc/emailrelay-doxygen.css_" "$(top_builddir)/doc/doxygen/emailrelay-doxygen.css"
|
||||
-@chmod +x $(run_doxygen)
|
||||
$(run_doxygen) "$(GCONFIG_HAVE_DOXYGEN)" "$(top_srcdir)" "$(top_builddir)" doxygen doxygen.cfg.in && touch .dox
|
||||
|
||||
emailrelay-man.html: emailrelay.1
|
||||
if test "$(HAVE_MAN2HTML)" = "yes" ; then man2html -r -L. emailrelay.1 < /dev/null > emailrelay-man.html.tmp && mv emailrelay-man.html.tmp emailrelay-man.html ; grep -v '^Content-type:' < emailrelay-man.html | grep -v '^Time:' > emailrelay-man.html.tmp ; mv emailrelay-man.html.tmp emailrelay-man.html ; fi
|
||||
|
||||
developer.html reference.html userguide.html: $(converter_html)
|
||||
|
||||
developer.mu reference.mu userguide.mu: $(converter_txt2mu)
|
||||
|
||||
readme.html: $(top_srcdir)/README $(converter_html)
|
||||
$(converter_html) -a "$(AWK)" "$(top_srcdir)/README" "$(css)" > readme.html
|
||||
|
||||
changelog.html: $(top_srcdir)/ChangeLog $(converter_html)
|
||||
$(converter_html) -a "$(AWK)" "$(top_srcdir)/ChangeLog" "$(css)" > changelog.html
|
||||
if test "$(GCONFIG_HAVE_MAN2HTML)" = "yes" ; then man2html -r -L. emailrelay.1 < /dev/null > emailrelay-man.html.tmp && mv emailrelay-man.html.tmp emailrelay-man.html ; grep -v '^Content-type:' < emailrelay-man.html | grep -v '^Time:' > emailrelay-man.html.tmp ; mv emailrelay-man.html.tmp emailrelay-man.html ; fi
|
||||
|
||||
emailrelay.1.gz : emailrelay.1
|
||||
if test -n "$(GZIP)" ; then $(GZIP) -c "$(top_srcdir)/doc/emailrelay.1" > emailrelay.1.gz ; fi
|
||||
@ -121,15 +106,29 @@ emailrelay-submit.1.gz : emailrelay-submit.1
|
||||
emailrelay-filter-copy.1.gz : emailrelay-filter-copy.1
|
||||
if test -n "$(GZIP)" ; then $(GZIP) -c "$(top_srcdir)/doc/emailrelay-filter-copy.1" > emailrelay-filter-copy.1.gz ; fi
|
||||
|
||||
emailrelay-poke.1.gz: emailrelay-poke.1
|
||||
if test -n "$(GZIP)" ; then $(GZIP) -c "$(top_srcdir)/doc/emailrelay-poke.1" > emailrelay-poke.1.gz ; fi
|
||||
|
||||
install-data-local: install-e_docDATA
|
||||
$(mkinstalldirs) "$(DESTDIR)$(e_docdir)/doxygen"
|
||||
for file in doxygen/* ; do $(INSTALL) -m 644 "$$file" "$(DESTDIR)$(e_docdir)/$$file" ; done
|
||||
if test -d doxygen ; then for file in doxygen/* ; do $(INSTALL) -m 644 "$$file" "$(DESTDIR)$(e_docdir)/$$file" || true ; done ; else true ; fi
|
||||
|
||||
uninstall-local:
|
||||
-find "$(DESTDIR)$(e_docdir)/doxygen" -type f | xargs rm -f
|
||||
-rmdir "$(DESTDIR)$(e_docdir)/doxygen" 2>/dev/null
|
||||
-rmdir "$(DESTDIR)$(e_docdir)" 2>/dev/null
|
||||
|
||||
.PHONY: rst
|
||||
rst:
|
||||
ls -1 *.rst | grep -v index.rst | sed 's/.rst$$//' | xargs -i__ rst2html.py __.rst __.html
|
||||
|
||||
.PHONY: md
|
||||
md:
|
||||
for f in *.md ; do markdown $$f > "`basename $$f .md`".html ; done
|
||||
|
||||
.PHONY: sphinx
|
||||
sphinx:
|
||||
sphinx-build -b html . ./_build
|
||||
|
||||
.PHONY: website
|
||||
website:
|
||||
@chmod +x make-website || true
|
||||
./make-website 2.0
|
||||
|
||||
|
348
doc/Makefile.in
348
doc/Makefile.in
@ -1,9 +1,8 @@
|
||||
# Makefile.in generated by automake 1.11.3 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.15.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
|
||||
# Foundation, Inc.
|
||||
# Copyright (C) 1994-2017 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.
|
||||
@ -20,6 +19,61 @@
|
||||
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
@ -37,19 +91,38 @@ NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
subdir = doc
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/m4_ax_cxx_compile_stdcxx.m4 \
|
||||
$(top_srcdir)/m4/m4_ax_cxx_compile_stdcxx_11.m4 \
|
||||
$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/config.h
|
||||
CONFIG_HEADER = $(top_builddir)/gconfig_defs.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
SCRIPTS = $(noinst_SCRIPTS)
|
||||
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 = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
@ -82,9 +155,12 @@ am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(e_docdir)"
|
||||
NROFF = nroff
|
||||
MANS = $(man1_MANS)
|
||||
DATA = $(e_doc_DATA)
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
@ -93,8 +169,6 @@ AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
COMPILER_VERSION = @COMPILER_VERSION@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
@ -105,13 +179,21 @@ DEPDIR = @DEPDIR@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
GCONFIG_CONFIGURATION = @GCONFIG_CONFIGURATION@
|
||||
GCONFIG_HAVE_DOXYGEN = @GCONFIG_HAVE_DOXYGEN@
|
||||
GCONFIG_HAVE_MAN2HTML = @GCONFIG_HAVE_MAN2HTML@
|
||||
GCONFIG_QT_CFLAGS = @GCONFIG_QT_CFLAGS@
|
||||
GCONFIG_QT_LIBS = @GCONFIG_QT_LIBS@
|
||||
GCONFIG_QT_MOC = @GCONFIG_QT_MOC@
|
||||
GCONFIG_STATIC_END = @GCONFIG_STATIC_END@
|
||||
GCONFIG_STATIC_START = @GCONFIG_STATIC_START@
|
||||
GCONFIG_TLS_LIBS = @GCONFIG_TLS_LIBS@
|
||||
GCONFIG_WINDMC = @GCONFIG_WINDMC@
|
||||
GCONFIG_WINDRES = @GCONFIG_WINDRES@
|
||||
GREP = @GREP@
|
||||
GZIP = @GZIP@
|
||||
G_CAPABILITIES = @G_CAPABILITIES@
|
||||
HAVE_DOXYGEN = @HAVE_DOXYGEN@
|
||||
HAVE_MAN2HTML = @HAVE_MAN2HTML@
|
||||
HAVE_CXX11 = @HAVE_CXX11@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@ -125,7 +207,6 @@ MAINT = @MAINT@
|
||||
MAKE = @MAKE@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
MOC = @MOC@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
@ -134,23 +215,19 @@ PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PAM_INCLUDE = @PAM_INCLUDE@
|
||||
PAM_LIBS = @PAM_LIBS@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
QT_CFLAGS = @QT_CFLAGS@
|
||||
QT_LIBS = @QT_LIBS@
|
||||
QT_MOC = @QT_MOC@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SSL_LIBS = @SSL_LIBS@
|
||||
STATIC_END = @STATIC_END@
|
||||
STATIC_START = @STATIC_START@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
ZLIB_LIBS = @ZLIB_LIBS@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
@ -169,13 +246,13 @@ datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
e_bsdinitdir = @e_bsdinitdir@
|
||||
e_docdir = @e_docdir@
|
||||
e_examplesdir = @e_examplesdir@
|
||||
e_icondir = @e_icondir@
|
||||
e_initdir = @e_initdir@
|
||||
e_libexecdir = @e_libexecdir@
|
||||
e_pamdir = @e_pamdir@
|
||||
e_qtmoc = @e_qtmoc@
|
||||
e_spooldir = @e_spooldir@
|
||||
e_sysconfdir = @e_sysconfdir@
|
||||
exec_prefix = @exec_prefix@
|
||||
@ -195,6 +272,7 @@ pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
@ -203,60 +281,78 @@ target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
txt_files = developer.txt reference.txt userguide.txt windows.txt
|
||||
man_files_in = emailrelay.1 emailrelay-passwd.1 emailrelay-poke.1 emailrelay-submit.1 emailrelay-filter-copy.1
|
||||
man_files_out = emailrelay.1.gz emailrelay-passwd.1.gz emailrelay-poke.1.gz emailrelay-submit.1.gz emailrelay-filter-copy.1.gz
|
||||
html_files_in = doxygen-header.html doxygen-missing.html doxygen.cfg
|
||||
html_files_thru = index.html emailrelay-man.html
|
||||
html_files_out = readme.html developer.html reference.html userguide.html windows.html changelog.html
|
||||
docbook_files_out = emailrelay.docbook
|
||||
css_files_in = \
|
||||
emailrelay.css_ \
|
||||
emailrelay-doxygen.css_
|
||||
txt_files_install = \
|
||||
readme.txt readme.md readme.rst \
|
||||
developer.txt developer.md developer.rst \
|
||||
reference.txt reference.md reference.rst \
|
||||
userguide.txt userguide.md userguide.rst \
|
||||
windows.txt windows.md windows.rst \
|
||||
changelog.txt changelog.md changelog.rst \
|
||||
doxygen.cfg.in \
|
||||
index.rst conf.py
|
||||
|
||||
css_files_out = \
|
||||
man_files_install = \
|
||||
emailrelay.1 \
|
||||
emailrelay-passwd.1 \
|
||||
emailrelay-submit.1 \
|
||||
emailrelay-filter-copy.1
|
||||
|
||||
man_files_clean = \
|
||||
emailrelay.1.gz \
|
||||
emailrelay-passwd.1.gz \
|
||||
emailrelay-submit.1.gz \
|
||||
emailrelay-filter-copy.1.gz
|
||||
|
||||
html_files_noinstall = \
|
||||
doxygen-missing.html
|
||||
|
||||
html_files_install = \
|
||||
index.html \
|
||||
emailrelay-man.html \
|
||||
readme.html \
|
||||
developer.html \
|
||||
reference.html \
|
||||
userguide.html \
|
||||
windows.html \
|
||||
changelog.html
|
||||
|
||||
css_files_install = \
|
||||
emailrelay.css \
|
||||
emailrelay-doxygen.css
|
||||
|
||||
png_files_thru = \
|
||||
valid-html401.png \
|
||||
diagram-1.png \
|
||||
diagram-2.png
|
||||
svg_files_noinstall = \
|
||||
authentication.svg \
|
||||
forwardto.svg \
|
||||
serverclient.svg \
|
||||
whatisit.svg
|
||||
|
||||
png_files_in = \
|
||||
gsmtp-classes.png_ \
|
||||
gnet-classes.png_ \
|
||||
sequence-3.png_ \
|
||||
gnet-client.png_ \
|
||||
gsmtp-serverprotocol.png_ \
|
||||
auth.png_
|
||||
png_files_install = \
|
||||
authentication.png \
|
||||
forwardto.png \
|
||||
serverclient.png \
|
||||
whatisit.png \
|
||||
download-button.png
|
||||
|
||||
png_files_out = \
|
||||
gsmtp-classes.png \
|
||||
gnet-classes.png \
|
||||
sequence-3.png \
|
||||
gnet-client.png \
|
||||
gsmtp-serverprotocol.png \
|
||||
auth.png
|
||||
EXTRA_DIST = \
|
||||
$(man_files_install) \
|
||||
$(txt_files_install) \
|
||||
$(css_files_install) \
|
||||
$(png_files_install) \
|
||||
$(svg_files_noinstall) \
|
||||
$(html_files_install) \
|
||||
$(html_files_noinstall) \
|
||||
make-website
|
||||
|
||||
EXTRA_DIST = $(man_files_in) $(txt_files) $(html_files_in) $(css_files_in) $(png_files_in) $(png_files_thru) $(html_files_thru) mingw.mak
|
||||
noinst_SCRIPTS = .dox .docbook
|
||||
man1_MANS = $(man_files_in)
|
||||
e_doc_DATA = $(txt_files) $(html_files_out) $(html_files_thru) $(css_files_out) $(png_files_out) $(png_files_thru) $(docbook_files_out)
|
||||
CLEANFILES = $(noinst_SCRIPTS) $(man_files_out) $(html_files_out) $(docbook_files_out) $(png_files_out) $(css_files_out) Doxyfile *.db *.mu doxygen/* docbook/*
|
||||
SUFFIXES = .txt .html .db .mu
|
||||
converter_html = $(top_builddir)/bin/txt2html.sh
|
||||
converter_txt2mu = $(top_builddir)/bin/txt2mu.sh
|
||||
converter_mu2html = $(top_builddir)/bin/mu2html.sh
|
||||
converter_expand = $(top_builddir)/bin/expand.sh
|
||||
converter_mu2docbook = $(top_builddir)/bin/mu2docbook.sh
|
||||
run_doxygen = $(top_builddir)/bin/doxygen.sh
|
||||
run_doxygen_fixup = $(top_builddir)/bin/doxygen_fixup.pl
|
||||
css = emailrelay.css
|
||||
noinst_SCRIPTS = .dox
|
||||
man1_MANS = $(man_files_install)
|
||||
e_doc_DATA = $(txt_files_install) $(html_files_install) $(css_files_install) $(png_files_install)
|
||||
CLEANFILES = $(noinst_SCRIPTS) $(man_files_clean) doxygen.out doxygen.cfg doxygen/search/* doxygen/*
|
||||
SUFFIXES = .txt .html .mu
|
||||
run_doxygen = $(top_srcdir)/bin/doxygen.sh
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .txt .html .db .mu .css .css_ .png .png_
|
||||
.SUFFIXES: .txt .html .mu
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
@ -269,7 +365,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu doc/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
@ -289,9 +384,18 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
$(am__aclocal_m4_deps):
|
||||
install-man1: $(man1_MANS)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
|
||||
@list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \
|
||||
{ for i in $$list; do echo "$$i"; done; \
|
||||
@list1='$(man1_MANS)'; \
|
||||
list2=''; \
|
||||
test -n "$(man1dir)" \
|
||||
&& test -n "`echo $$list1$$list2`" \
|
||||
|| exit 0; \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(man1dir)" || 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 '/\.1[a-z]*$$/p'; \
|
||||
fi; \
|
||||
} | while read p; do \
|
||||
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; echo "$$p"; \
|
||||
@ -321,8 +425,11 @@ uninstall-man1:
|
||||
dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
|
||||
install-e_docDATA: $(e_doc_DATA)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(e_docdir)" || $(MKDIR_P) "$(DESTDIR)$(e_docdir)"
|
||||
@list='$(e_doc_DATA)'; test -n "$(e_docdir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(e_docdir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(e_docdir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; \
|
||||
@ -337,27 +444,14 @@ uninstall-e_docDATA:
|
||||
@list='$(e_doc_DATA)'; test -n "$(e_docdir)" || list=; \
|
||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||
dir='$(DESTDIR)$(e_docdir)'; $(am__uninstall_files_from_dir)
|
||||
tags: TAGS
|
||||
TAGS:
|
||||
tags TAGS:
|
||||
|
||||
ctags: CTAGS
|
||||
CTAGS:
|
||||
ctags CTAGS:
|
||||
|
||||
cscope cscopelist:
|
||||
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@list='$(MANS)'; if test -n "$$list"; then \
|
||||
list=`for p in $$list; do \
|
||||
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'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
@ -495,64 +589,28 @@ uninstall-man: uninstall-man1
|
||||
|
||||
.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-data-local install-dvi install-dvi-am \
|
||||
.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
|
||||
ctags-am distclean distclean-generic distdir dvi dvi-am html \
|
||||
html-am info info-am install install-am install-data \
|
||||
install-data-am install-data-local install-dvi install-dvi-am \
|
||||
install-e_docDATA install-exec install-exec-am install-html \
|
||||
install-html-am install-info install-info-am install-man \
|
||||
install-man1 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 uninstall-e_docDATA uninstall-local uninstall-man \
|
||||
uninstall-man1
|
||||
mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags-am \
|
||||
uninstall uninstall-am uninstall-e_docDATA uninstall-local \
|
||||
uninstall-man uninstall-man1
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
.txt.html:
|
||||
$(converter_html) -a "$(AWK)" "$(top_srcdir)/doc/$*.txt" "$(css)" > "$*.html"
|
||||
|
||||
.txt.mu:
|
||||
$(converter_txt2mu) -a "$(AWK)" "$(top_srcdir)/doc/$*.txt" > "$*.mu"
|
||||
|
||||
.mu.db:
|
||||
$(converter_mu2docbook) -a "$(AWK)" -x < "$(top_builddir)/doc/$*.mu" > "$*.db"
|
||||
|
||||
.css_.css:
|
||||
cp "$(top_srcdir)/doc/$*.css_" $*.css
|
||||
|
||||
.png_.png:
|
||||
cp "$(top_srcdir)/doc/$*.png_" $*.png
|
||||
|
||||
head.db: $(converter_mu2docbook)
|
||||
$(converter_mu2docbook) -a "$(AWK)" --head "E-MailRelay" > head.db.tmp && mv -f head.db.tmp head.db
|
||||
|
||||
tail.db: $(converter_mu2docbook)
|
||||
$(converter_mu2docbook) -a "$(AWK)" --tail > tail.db.tmp && mv -f tail.db.tmp tail.db
|
||||
|
||||
emailrelay.docbook: head.db tail.db userguide.db reference.db developer.db
|
||||
cat head.db userguide.db reference.db developer.db tail.db > emailrelay.docbook
|
||||
|
||||
.docbook: emailrelay.docbook $(png_files_out)
|
||||
-xmlto -o docbook html emailrelay.docbook && touch .docbook && cp "$(top_srcdir)/doc/"*.png docbook/
|
||||
|
||||
.dox:
|
||||
$(run_doxygen) "$(HAVE_DOXYGEN)" "$(top_srcdir)" "$(top_builddir)" Doxyfile && touch .dox
|
||||
-$(run_doxygen_fixup) "$(top_builddir)/doc/doxygen"
|
||||
-cp "$(top_srcdir)/doc/emailrelay-doxygen.css_" "$(top_builddir)/doc/doxygen/emailrelay-doxygen.css"
|
||||
-@chmod +x $(run_doxygen)
|
||||
$(run_doxygen) "$(GCONFIG_HAVE_DOXYGEN)" "$(top_srcdir)" "$(top_builddir)" doxygen doxygen.cfg.in && touch .dox
|
||||
|
||||
emailrelay-man.html: emailrelay.1
|
||||
if test "$(HAVE_MAN2HTML)" = "yes" ; then man2html -r -L. emailrelay.1 < /dev/null > emailrelay-man.html.tmp && mv emailrelay-man.html.tmp emailrelay-man.html ; grep -v '^Content-type:' < emailrelay-man.html | grep -v '^Time:' > emailrelay-man.html.tmp ; mv emailrelay-man.html.tmp emailrelay-man.html ; fi
|
||||
|
||||
developer.html reference.html userguide.html: $(converter_html)
|
||||
|
||||
developer.mu reference.mu userguide.mu: $(converter_txt2mu)
|
||||
|
||||
readme.html: $(top_srcdir)/README $(converter_html)
|
||||
$(converter_html) -a "$(AWK)" "$(top_srcdir)/README" "$(css)" > readme.html
|
||||
|
||||
changelog.html: $(top_srcdir)/ChangeLog $(converter_html)
|
||||
$(converter_html) -a "$(AWK)" "$(top_srcdir)/ChangeLog" "$(css)" > changelog.html
|
||||
if test "$(GCONFIG_HAVE_MAN2HTML)" = "yes" ; then man2html -r -L. emailrelay.1 < /dev/null > emailrelay-man.html.tmp && mv emailrelay-man.html.tmp emailrelay-man.html ; grep -v '^Content-type:' < emailrelay-man.html | grep -v '^Time:' > emailrelay-man.html.tmp ; mv emailrelay-man.html.tmp emailrelay-man.html ; fi
|
||||
|
||||
emailrelay.1.gz : emailrelay.1
|
||||
if test -n "$(GZIP)" ; then $(GZIP) -c "$(top_srcdir)/doc/emailrelay.1" > emailrelay.1.gz ; fi
|
||||
@ -566,18 +624,32 @@ emailrelay-submit.1.gz : emailrelay-submit.1
|
||||
emailrelay-filter-copy.1.gz : emailrelay-filter-copy.1
|
||||
if test -n "$(GZIP)" ; then $(GZIP) -c "$(top_srcdir)/doc/emailrelay-filter-copy.1" > emailrelay-filter-copy.1.gz ; fi
|
||||
|
||||
emailrelay-poke.1.gz: emailrelay-poke.1
|
||||
if test -n "$(GZIP)" ; then $(GZIP) -c "$(top_srcdir)/doc/emailrelay-poke.1" > emailrelay-poke.1.gz ; fi
|
||||
|
||||
install-data-local: install-e_docDATA
|
||||
$(mkinstalldirs) "$(DESTDIR)$(e_docdir)/doxygen"
|
||||
for file in doxygen/* ; do $(INSTALL) -m 644 "$$file" "$(DESTDIR)$(e_docdir)/$$file" ; done
|
||||
if test -d doxygen ; then for file in doxygen/* ; do $(INSTALL) -m 644 "$$file" "$(DESTDIR)$(e_docdir)/$$file" || true ; done ; else true ; fi
|
||||
|
||||
uninstall-local:
|
||||
-find "$(DESTDIR)$(e_docdir)/doxygen" -type f | xargs rm -f
|
||||
-rmdir "$(DESTDIR)$(e_docdir)/doxygen" 2>/dev/null
|
||||
-rmdir "$(DESTDIR)$(e_docdir)" 2>/dev/null
|
||||
|
||||
.PHONY: rst
|
||||
rst:
|
||||
ls -1 *.rst | grep -v index.rst | sed 's/.rst$$//' | xargs -i__ rst2html.py __.rst __.html
|
||||
|
||||
.PHONY: md
|
||||
md:
|
||||
for f in *.md ; do markdown $$f > "`basename $$f .md`".html ; done
|
||||
|
||||
.PHONY: sphinx
|
||||
sphinx:
|
||||
sphinx-build -b html . ./_build
|
||||
|
||||
.PHONY: website
|
||||
website:
|
||||
@chmod +x make-website || true
|
||||
./make-website 2.0
|
||||
|
||||
# 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:
|
||||
|
BIN
doc/auth.png_
BIN
doc/auth.png_
Binary file not shown.
Before (image error) Size: 7.3 KiB |
BIN
doc/authentication.png
Normal file
BIN
doc/authentication.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 18 KiB |
247
doc/authentication.svg
Normal file
247
doc/authentication.svg
Normal file
@ -0,0 +1,247 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<!-- Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>. All rights reserved. -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg3036"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
width="1650"
|
||||
height="1023"
|
||||
sodipodi:docname="authentication.svg"
|
||||
inkscape:export-filename="/home/graeme/src/gnetapps/emailrelay/doc/graphics/authentication.png"
|
||||
inkscape:export-xdpi="18"
|
||||
inkscape:export-ydpi="18">
|
||||
<metadata
|
||||
id="metadata3042">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs3040" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1536"
|
||||
inkscape:window-height="943"
|
||||
id="namedview3038"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.41425821"
|
||||
inkscape:cx="699.63064"
|
||||
inkscape:cy="362.80329"
|
||||
inkscape:window-x="-12"
|
||||
inkscape:window-y="150"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="layer4" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer6"
|
||||
inkscape:label="colour"
|
||||
style="display:inline" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="shapes"
|
||||
style="display:inline">
|
||||
<g
|
||||
id="g3401"
|
||||
transform="translate(-91.993978,-3.4071843)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7860"
|
||||
d="m 809.83225,449.90435 c -75.21714,-9.37864 -141.10301,-48.21472 -165.49853,-97.5523 -12.16037,-24.59314 -14.91307,-37.10424 -13.36523,-60.7455 2.83502,-43.30151 25.87459,-86.11586 70.69643,-131.37492 35.78606,-36.13513 64.67414,-55.66718 107.95002,-72.988042 20.00723,-8.007756 27.06735,-12.945778 19.01164,-13.29721 -8.19547,-0.357528 23.83022,-10.32233 51.07725,-15.8927 27.73809,-5.670761 34.51142,-6.171832 68.38466,-5.058892 30.95125,1.016936 41.65196,2.386243 60.53611,7.746461 91.2608,25.904136 149.1482,94.538613 154.4554,183.130973 6.1079,101.95624 -77.0761,174.58867 -230.75806,201.48742 -33.24747,5.81926 -94.14629,8.07877 -122.48969,4.54471 l 0,0 z"
|
||||
style="fill:#ddffdd;fill-opacity:1;stroke:none;display:inline" />
|
||||
<path
|
||||
sodipodi:nodetypes="csscscsssccsscsssscccssssssscsccsccssssssssssccsscssscsssssssccsccsscsssscsscscssccssssccccscssc"
|
||||
style="fill:#161616"
|
||||
d="m 737.19034,432.52548 c 15.97401,6.391 17.99931,6.9368 41.00961,13.2088 1.925,0.5247 6.2,1.3483 9.5,1.8302 3.3,0.4819 9.825,1.5796 14.5,2.4392 17.83747,3.28 56.54521,4.4905 83.63111,2.6152 19.5949,-1.3566 48.1731,-5.2192 59.3689,-8.0242 1.925,-0.4822 5.627,-1.1465 8.2267,-1.476 2.5997,-0.3295 4.9887,-1.0232 5.309,-1.5414 0.3203,-0.5182 1.9863,-0.9422 3.7023,-0.9422 1.716,0 4.502,-0.4155 6.191,-0.9233 1.6891,-0.5078 5.546,-1.4777 8.571,-2.1554 3.025,-0.6776 8.875,-2.3516 13,-3.7199 4.125,-1.3683 9.075,-2.8431 11.00004,-3.2773 5.3321,-1.2027 16.6146,-5.3717 25.3054,-9.3506 4.293,-1.9654 8.4985,-3.5735 9.3457,-3.5735 0.8472,0 2.7347,-0.6123 4.1946,-1.3607 1.4599,-0.7484 7.6043,-3.729 13.6543,-6.6236 15.903,-7.6089 31.0245,-16.4939 43.8243,-25.7501 13.6987,-9.9064 35.6511,-32.5881 41.7134,-43.0994 0.8458,-1.4664 2.681,-4.4662 4.0783,-6.6662 4.0531,-6.3817 10.4319,-19.4825 12.6593,-26 7.4046,-21.6652 9.2579,-33.5212 8.8056,-56.3298 -0.5545,-27.9635 -3.0912,-41.6208 -12.8472,-69.1702 -12.4462,-35.146 -38.334,-68.37969 -70.2337,-90.162894 -19.7598,-13.4933 -45.5209,-25.7893 -64,-30.548 -3.3,-0.8498 -9.825,-2.6122 -14.5,-3.9165 -19.73684,-5.5063 -37.65074,-7.579 -66.50004,-7.6941 -20.805,-0.083 -24.5747,0.1742 -39.5,2.6948 -16.6511,2.8122 -37.5958,7.4185 -46.1342,10.1462 -2.5488,0.8143 -5.1808,1.4805 -5.8489,1.4805 -0.6681,0 -2.6327,0.6379 -4.3658,1.4176 -1.7331,0.7796 -6.0761,2.4123 -9.65111,3.6281 -3.575,1.2157 -7.4,2.6922 -8.5,3.281 -1.76298,0.9437 -1.47997,1.1621 2.3881,1.8433 4.89608,0.8623 5.58547,1.2547 4.70551,2.6785 -0.59258,0.9589 -4.78106,2.6321 -23.09246,9.2254 -4.94937,1.7821 -13.94937,5.6049 -20,8.4951 -10.02655,4.7893 -13.66541,6.800004 -28.91174,15.975704 -7.36301,4.4312 -26.94189,19.1179 -34.08941,25.5713 -1.1,0.9932 -4.23798,3.73589 -6.97328,6.09489 -10.58231,9.1265 -32.29146,31.7526 -39.02672,40.6752 -2.2,2.9145 -5.59107,7.1699 -7.53572,9.4565 -8.12985,9.5593 -15.86194,22.0848 -25.00502,40.5063 -17.24179,34.7388 -21.21508,68.6397 -11.54015,98.463 3.88903,11.988 11.95767,28.5452 18.36622,37.6881 18.11851,25.8493 47.76836,47.9125 83.71467,62.2942 m -0.81538,8.4516 c -35.55321,-14.6977 -61.63316,-33.5314 -81.60544,-57.9645 -13.88533,-16.9867 -18.78696,-25.1602 -25.05631,-41.7813 -1.76337,-4.675 -3.8399,-9.9778 -4.6145,-11.7839 -0.7746,-1.8062 -1.40837,-4.5894 -1.40837,-6.1849 0,-1.5956 -0.49266,-4.1678 -1.09481,-5.7161 -1.51337,-3.8914 -2.19029,-27.2119 -1.05412,-36.3151 1.34654,-10.7888 4.16023,-25.3075 5.13336,-26.4884 0.45852,-0.5564 1.79409,-3.9366 2.96793,-7.5116 1.17383,-3.575 3.51454,-9.425 5.20156,-13 7.93762,-16.8208 8.52886,-17.8653 18.54657,-32.7651 2.86027,-4.2542 6.46027,-9.6918 8,-12.0835 4.2959,-6.673 23.35565,-28.3363 36.23671,-41.1866 32.32046,-32.24309 57.53908,-49.361494 97.0628,-65.885894 4.44028,-1.8564 8.92787,-4.5997 11,-6.7243 3.84614,-3.9435 7.17902,-5.6069 9.4718,-4.727 0.83531,0.3205 3.58332,-0.9597 6.25868,-2.9158 6.17055,-4.5115 15.18643,-8.5345 28.26953,-12.6144 5.775,-1.8009 11.85,-3.8838 13.5,-4.6286 3.292,-1.4861 26.9165,-6.5352 32.5,-6.9461 1.925,-0.1416 6.65,-0.8343 10.5,-1.5393 10.3175,-1.8894 54.2348,-1.6505 66.5,0.3617 5.225,0.8572 12.425,2.0415 16,2.6318 12.4944,2.0632 30.66524,7.385 47.00004,13.7651 50.4688,19.7124 88.0026,51.695504 113.1983,96.457794 5.8626,10.4154 13.6377,28.0067 16.707,37.8002 4.3293,13.8135 5.0947,16.5219 5.0947,18.0278 0,0.9336 0.8805,5.2468 1.9567,9.5848 2.5122,10.1268 4.27,34.7721 3.4868,48.8874 -1.0134,18.2659 -6.2292,40.5191 -12.7737,54.4988 -1.509,3.2234 -11.991,21.2673 -15.4804,26.6485 -9.1235,14.0694 -27.2624,32.4805 -41.3219,41.9418 -2.8287,1.9036 -6.7686,4.7071 -8.7553,6.2299 -1.9867,1.5229 -4.7372,3.3099 -6.1122,3.9712 -1.375,0.6613 -5.2,2.9871 -8.5,5.1685 -3.3,2.1814 -7.125,4.4328 -8.5,5.0031 -1.375,0.5704 -3.175,1.4686 -4,1.9962 -1.9517,1.248 -13.8635,7.042 -14.4776,7.042 -0.2598,0 -3.5211,1.4069 -7.2474,3.1265 -3.7262,1.7196 -9.7,4.1751 -13.275,5.4568 -3.575,1.2817 -8.975,3.2999 -12,4.4849 -3.025,1.185 -7.525,2.7454 -10,3.4677 -2.475,0.7222 -7.2,2.1976 -10.5,3.2785 -3.30004,1.081 -8.47504,2.5244 -11.50004,3.2076 -3.025,0.6833 -6.3958,1.7066 -7.4907,2.2741 -2.0349,1.0548 -15.878,4.1736 -25.2028,5.6781 -2.8565,0.4609 -5.5827,1.0784 -6.0582,1.3724 -3.6903,2.2807 -78.4885,10.1442 -89.7483,9.4352 -1.65,-0.1039 -6.825,-0.3049 -11.5,-0.4467 -42.75848,-1.2969 -82.19252,-8.9163 -113.825,-21.9931"
|
||||
id="path3257"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3237"
|
||||
d="m 468.89325,209.04327 c -1.31585,-1.144 -1.20126,-2.6234 0.53745,-6.9392 2.39819,-5.9527 5.49124,-8.1216 16.67164,-11.6903 3.46347,-1.1055 6.29639,-2.3264 6.29539,-2.7132 -0.003,-0.8314 -22.35133,-7.3615 -33.25814,-9.7176 -4.19214,-0.9055 -8.93573,-2.0212 -10.5413,-2.4792 -4.0213,-1.1471 -34.4214,-7.6813 -49.66451,-10.6749 -13.46267,-2.6439 -21.27117,-3.9512 -43.03864,-7.2057 -7.62208,-1.1396 -18.32299,-2.7566 -23.77979,-3.5933 -23.17844,-3.5541 -90.10952,-5.8316 -100.25214,-3.4113 -2.66773,0.6365 -7.65672,1.2938 -11.08666,1.4605 -15.18289,0.7382 -29.41703,2.9999 -37.87621,6.0183 -7.69838,2.747 -11.1649,1.4899 -12.31617,-4.4663 -0.59719,-3.0896 -0.24145,-3.4881 4.32985,-4.8495 2.73928,-0.8159 5.91594,-2.0668 7.05925,-2.7798 2.68193,-1.6725 15.74058,-3.5731 22.86622,-3.3279 7.80147,0.2684 25.11022,-1.0802 29.53994,-2.3017 5.09959,-1.4062 26.99746,-1.7936 36.28706,-0.6419 4.19214,0.5197 14.21094,1.0611 22.264,1.203 8.05306,0.142 15.75281,0.7068 17.11055,1.255 1.35774,0.5483 5.55449,0.783 9.32611,0.5215 4.48322,-0.3109 8.63516,0.071 11.99191,1.1027 2.82393,0.8679 10.31825,2.0463 16.65401,2.6185 6.33577,0.5722 12.84945,1.7125 14.47485,2.5341 1.95868,0.9899 4.64103,1.2991 7.95414,0.9168 3.12927,-0.3611 6.97884,0.02 10.2929,1.0194 2.91172,0.8778 6.46982,1.5961 7.9069,1.5961 3.17903,0 43.82844,8.1204 51.09609,10.2073 1.90551,0.5472 7.51813,1.7946 12.47248,2.772 10.43387,2.0585 25.93172,5.4915 29.44892,6.5232 1.46684,0.4303 2.42521,0.2616 2.42521,-0.4269 0,-0.6261 -1.09134,-1.4314 -2.42521,-1.7895 -3.00839,-0.8076 -10.38786,-4.4395 -11.75666,-5.7861 -1.43923,-1.4159 0.27562,-7.7171 2.57859,-9.4751 1.70008,-1.2977 2.38863,-1.2641 5.72845,0.2802 2.08783,0.9654 9.4087,3.8166 16.26856,6.336 17.91725,6.5803 35.30031,14.1659 40.68932,17.756 4.53569,3.0216 8.50154,8.3024 10.38633,13.8299 0.81177,2.3807 0.2443,3.0544 -4.46848,5.3049 -4.93809,2.358 -7.21408,2.6529 -26.69566,3.4581 -24.21907,1.001 -29.25256,1.8302 -36.56564,6.0238 -5.95022,3.4122 -6.63374,3.5294 -8.93091,1.5321 z"
|
||||
style="fill:#161616" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3235"
|
||||
d="m 1080.9768,180.45936 c -1.9182,-2.6689 -2.0996,-8.1501 -0.3147,-9.5093 3.1189,-2.3749 20.8492,-10.3099 36.6848,-16.4176 4.2328,-1.6327 8.498,-3.3919 9.4779,-3.9095 0.98,-0.5176 2.4859,-0.9411 3.3462,-0.9411 0.8604,0 3.5218,-0.8585 5.9143,-1.9077 2.3924,-1.0493 5.5043,-2.1378 6.9153,-2.4191 2.4111,-0.4806 10.3027,-3.0192 14.8791,-4.7864 3.3718,-1.3021 16.1177,-4.6431 20.5229,-5.3795 2.2576,-0.3775 4.6769,-1.1471 5.3763,-1.7103 0.6995,-0.5633 4.1627,-1.1275 7.6961,-1.2538 4.1752,-0.1493 7.9385,-0.9856 10.7491,-2.3887 2.3786,-1.1874 5.8417,-2.115 7.6961,-2.0614 1.8543,0.054 6.142,-0.6133 9.5283,-1.4822 3.3863,-0.8688 7.688,-1.5867 9.5593,-1.5953 1.8714,-0.01 4.323,-0.4957 5.4482,-1.0826 6.9618,-3.6309 89.9032,-6.6163 129.1662,-4.6492 11.0054,0.5514 22.2838,1.0506 25.0631,1.1094 l 5.0532,0.1068 -0.246,-6.6506 c -0.1483,-4.0056 0.2021,-6.9206 0.8808,-7.3294 0.6198,-0.3733 2.6125,0.1603 4.4281,1.1858 1.8157,1.0254 5.3792,2.4644 7.9189,3.1978 13.2776,3.8339 29.4804,10.5812 34.8318,14.505 1.9439,1.4253 4.1863,2.5914 4.9831,2.5914 0.7969,0 3.2467,1.3878 5.4445,3.084 3.9373,3.0391 3.9956,3.1826 3.9956,9.845 0,9.1369 -0.7701,9.6913 -18.8779,13.5875 -3.8925,0.8376 -9.8219,2.9485 -13.1765,4.6909 -7.4877,3.8892 -9.3585,3.2337 -9.8121,-3.4381 -0.2978,-4.3798 -0.1487,-4.6373 4.6177,-7.9813 4.2265,-2.9653 10.2752,-5.7018 18.1907,-8.2298 1.7027,-0.5438 1.7741,-0.8189 0.5132,-1.9769 -1.7771,-1.632 -33.9292,-4.8032 -51.3,-5.0597 -6.5273,-0.096 -12.4101,-0.502 -13.0731,-0.9013 -1.2981,-0.7818 -74.0035,-0.9391 -85.8831,-0.1859 -3.9506,0.2506 -12.2624,0.7397 -18.4706,1.087 -6.2082,0.3473 -14.5201,1.1056 -18.4707,1.6851 -3.9506,0.5795 -9.03,1.1879 -11.2876,1.3519 -4.8154,0.3499 -20.9957,2.977 -23.935,3.8861 -1.1182,0.3459 -4.5021,1.0529 -7.5197,1.5711 -13.2174,2.27 -41.3884,9.5065 -48.5848,12.4803 -1.6931,0.6997 -5.1563,1.8159 -7.696,2.4805 -10.8361,2.8353 -50.574,18.8745 -60.6013,24.4599 -5.616,3.1284 -7.5785,3.1979 -9.6317,0.3412 z"
|
||||
style="fill:#161616" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:48px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
|
||||
x="1066.4489"
|
||||
y="380.74576"
|
||||
id="text3324"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3326"
|
||||
x="1066.4489"
|
||||
y="380.74576">--client-auth</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:48px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
|
||||
x="176.8667"
|
||||
y="385.01154"
|
||||
id="text3324-9"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3326-1"
|
||||
x="176.8667"
|
||||
y="385.01154">--server-auth</tspan></text>
|
||||
<g
|
||||
id="g3384"
|
||||
transform="translate(-155.02689,-30.664659)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path8377"
|
||||
d="m 1661.9361,118.9409 c -1.771,-3.3091 -1.6446,-6.39842 0.4329,-10.58363 2.4886,-5.01311 4.9505,-6.02558 16.216,-6.66877 18.5597,-1.05965 29.5411,1.28198 28.5934,6.09719 -1.4666,7.45155 -13.4826,13.712 -28.3874,14.79011 -12.3126,0.89062 -14.7096,0.37369 -16.8549,-3.6349 z"
|
||||
style="fill:#fbdeb2;fill-opacity:1;stroke:none;display:inline" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3239"
|
||||
d="m 1654.2227,237.16914 c -2.154,-2.2928 -2.2798,-3.0697 -1.7838,-11.0193 0.558,-8.9437 3.3281,-16.3433 8.0954,-21.6244 1.1864,-1.3143 3.3402,-3.9646 4.7861,-5.8896 1.446,-1.925 4.0263,-5.075 5.7341,-7 3.2914,-3.7102 3.3422,-3.8329 3.5216,-8.5 0.097,-2.5285 0.5082,-2.9859 2.6153,-2.9103 1.375,0.049 3.175,0.2743 4,0.5 1.0035,0.2745 1.4438,-0.2517 1.3303,-1.5897 -0.2702,-3.1859 -2.5316,-10.8828 -3.5992,-12.25 -1.2121,-1.55241 -8.9685,-1.61551 -17.4309,-0.14181 -4.7845,0.83321 -7.068,0.81641 -9.2022,-0.068 -3.1033,-1.2854 -5.3823,-5.1362 -4.4609,-7.5374 0.7469,-1.9462 2.2502,-2.223 17.3629,-3.1973 l 12.5,-0.8059 0.5,-9 c 0.4551,-8.1922 0.6885,-9.0269 2.6001,-9.2999 1.3402,-0.1914 3.3961,0.9961 5.6819,3.2819 3.1076,3.1076 3.5075,4.04 3.0205,7.0415 -0.8789,5.416 0.7005,6.4765 9.6456,6.4765 6.7592,0 7.9697,0.2837 9.8776,2.3144 4.5646,4.8589 1.8972,7.624 -7.51,7.7853 -9.2541,0.1586 -10.7644,0.8649 -11.1269,5.20381 -0.1712,2.0485 0.6631,7.6558 1.854,12.4605 l 2.1652,8.736 8.979,9.1999 c 9.4407,9.673 10.6653,12.5254 5.6285,13.1094 -3.4107,0.3954 -8.9308,-3.1513 -15.0799,-9.6889 -6.5015,-6.9122 -7.908,-7.5592 -11.0539,-5.0847 -3.9039,3.0708 -15.0491,16.9481 -17.5586,21.863 -1.2353,2.4192 -2.7028,6.9192 -3.2612,10 -0.9998,5.5157 -3.1382,10.1013 -4.7106,10.1013 -0.4415,0 -1.8455,-1.11 -3.12,-2.4667 z"
|
||||
style="fill:#161616" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccsscscsscccccscssssc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3066"
|
||||
d="m 1680.1083,124.22703 c 7.0818,-0.2751 10.2071,-1.0243 14.2901,-2.5674 l 0,-2e-4 c 7.0507,-2.6646 11.1812,-6.0188 13.8472,-11.2445 1.9056,-3.7354 1.9254,-4.0795 0.3352,-5.8366 -3.0633,-3.3849 -8.2846,-4.43 -20.9479,-4.1932 -6.8882,0.1288 -13.6023,-0.2658 -15.7613,-0.926202 -3.4318,-1.0499 -3.9877,-0.9393 -6.3473,1.263102 -3.0038,2.8037 -5.8546,8.0568 -6.8328,12.5908 -0.9266,4.2944 1.6041,9.1015 5.2095,9.896 1.5025,0.3311 3.1819,0.783 3.7319,1.0042 0.55,0.2212 5.5,0.2275 11,0.014 m -0.3448,10.1672 c -0.39,-0.075 -0.7802,-0.1993 -2.1552,-0.4052 -12.019,-1.8001 -14.4349,-2.7238 -18.7581,-7.1721 -2.3812,-2.45 -4.9847,-6.023 -5.7857,-7.94 -4.7123,-11.2783 1.6556,-23.835002 15.8795,-31.312402 9.2319,-4.8531 12.0541,-4.7682 20.1517,0.6068 3.5494,2.3559 6.6277,3.5194 10.2516,3.8745 6.4828,0.6353 11.9926,3.4083 17.7688,8.942902 3.6122,3.4611 4.4922,4.9758 4.4922,7.7323 0,13.5694 -10.6345,21.7402 -32.2909,24.8103 -4.285,0.6075 -8.11,1.0432 -8.5,0.9683"
|
||||
style="fill:#161616" />
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="text3379"
|
||||
y="288.75177"
|
||||
x="1633.7449"
|
||||
style="font-size:48px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
|
||||
xml:space="preserve"><tspan
|
||||
y="288.75177"
|
||||
x="1633.7449"
|
||||
id="tspan3381"
|
||||
sodipodi:role="line">bob</tspan></text>
|
||||
</g>
|
||||
<path
|
||||
style="fill:#161616;display:inline"
|
||||
d="m 311.95448,476.78664 c 24.58022,-0.4873 42.77494,-0.9269 45.45641,-0.9767 2.68148,-0.05 8.89763,-0.2859 13.81367,-0.5246 4.91606,-0.2386 20.63927,-0.7058 34.94048,-1.038 14.30122,-0.3323 29.33033,-0.8366 33.39806,-1.1206 12.42628,-0.8679 81.80619,-2.0079 114.13509,-1.8754 27.9904,0.1147 78.5421,2.7498 81.8676,4.2675 7.0635,3.2237 8.904,6.0438 9.9447,15.2381 0.5833,5.1531 1.0373,10.9443 1.0091,12.8693 -0.062,4.1586 -4.7443,29.1768 -7.5808,40.5 -1.4465,5.7738 -1.9156,24.1011 -1.6859,65.8615 0.3544,64.4154 -0.1495,61.6385 11.2037,61.6385 7.8853,0 5.2544,-1.20564 9.4039,2.38016 2.7897,2.4107 0.853,6.28274 -0.4039,7.50144 -1.3723,1.3308 5.93,1.5563 -5.2986,1.2691 l -13.6549,-0.3493 -2.7894,3.5993 c -2.8607,3.6914 -6.2908,4.5598 -9.2791,2.3493 -0.9292,-0.6875 -3.0364,-2.3361 -4.6821,-3.6636 -2.6687,-2.1525 -4.4708,-2.4515 -16.6571,-2.7639 -7.5156,-0.1926 -30.1191,0.1098 -50.2302,0.6719 -20.1111,0.5622 -44.6101,1.2489 -54.4421,1.5261 -9.83212,0.2773 -21.53311,0.7153 -26.00224,0.9734 -26.6222,1.5379 -133.39053,3.4824 -161.70125,2.945 -53.94127,-1.0239 -84.94478,-2.9391 -91.17945,-6.9251 -4.90207,-3.134 -7.82651,-8.5054 -5.88772,-10.8143 0.97671,-1.1632 0.5922,-6.119 -1.08639,-14 -1.42899,-6.7097 -1.65543,-20.2995 -2.94774,-30.1995 -2.80971,-21.5241 -4.64015,-44.5512 -6.89959,-53.5 -4.48895,-17.7787 -4.55992,-47.49 -5.04762,-66.0309 -0.29692,-11.292 -1.02238,-21.3045 -1.61198,-22.25 -3.01869,-4.8405 1.34317,-5.5332 39.09156,-6.2079 14.30121,-0.2556 46.11329,-0.8634 70.69351,-1.3508 m -7.36074,10.8144 c -15.64196,0.53 -35.29914,1.2175 -48.70653,1.5277 -13.40739,0.3102 -27.4684,0.8235 -31.24669,1.1407 l -6.86962,0.5768 0.8883,18.1399 c 1.06772,21.804 -2.91279,21.9841 0.54617,42.1399 1.51007,8.8 1.44804,17.382 2.30628,19.071 0.8584,1.689 1.56078,5.0927 1.56078,7.5636 0,2.4709 1.59875,9.55628 2.59129,15.929 1.1216,7.20139 1.65562,13.45001 1.99707,17.02501 0.34143,3.575 0.20667,8.76139 0.6596,10.41139 0.45293,1.65 1.96219,10.875 3.35396,20.5 3.59805,24.8838 4.80294,30.0601 7.20993,30.9754 11.03566,4.1968 80.28241,5.4772 169.76592,3.3817 l 0,2e-4 c 18.77035,-0.4395 35.22487,-0.7068 36.56561,-0.594 1.34074,0.1129 15.60133,-0.4571 31.6902,-1.2666 33.12808,-1.6668 99.51048,-3.4798 127.78058,-3.4898 14.302,-0.01 19.3606,-0.3508 20.8055,-1.4221 1.402,-1.0396 1.6563,-7.4785 0.9577,-24.25 -2.872,-68.9384 -2.2018,-91.939 3.3315,-114.3346 1.291,-5.225 2.8188,-16.9688 3.3952,-26.0973 0.8625,-13.6582 0.6447,-16.757 -1.2297,-17.4994 -2.3828,-0.9438 -20.7022,-3.1881 -27.1349,-3.3243 -56.518,-3.26162 -107.62546,-1.67151 -157.15837,-0.2613 -14.30122,0.6344 -45.01633,1.6125 -68.25581,2.1734 -23.23947,0.561 -55.05154,1.4536 -70.69351,1.9837"
|
||||
id="path3255-3-2"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccsssssssccscssscsccsscssssssccsccssssssssccccscsssscccsc" />
|
||||
<path
|
||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
||||
d="m 1011.6284,387.35747 c -5.0743,5.05658 2.2532,9.37808 8.4237,11.75071 31.7564,17.83841 58.0478,43.73861 92.3449,56.99351 14.9653,6.74659 28.0431,11.81756 43.0194,18.53707 4.8155,-3.79198 4.9285,-7.14478 -1.7635,-9.69948 -20.1954,-8.63561 -35.188,-11.25388 -58.3955,-24.06174 -23.2075,-12.80786 -53.6574,-37.82502 -79.6525,-54.46677 -2.9805,-2.19336 -2.1639,-2.3389 -3.9765,0.9467 z"
|
||||
id="path3439"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccczcc" />
|
||||
<path
|
||||
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
|
||||
d="m 431.96386,477.5158 c -5.0743,-5.05658 2.2532,-9.37808 8.4237,-11.75071 31.7564,-17.83841 58.0478,-43.73861 92.3449,-56.99351 14.9653,-6.74659 28.0431,-11.81756 43.0194,-18.53707 4.8155,3.79198 4.9285,7.14478 -1.7635,9.69948 -20.1954,8.63561 -35.188,11.25388 -58.3955,24.06174 -23.2075,12.80786 -53.6574,37.82502 -79.6525,54.46677 -2.9805,2.19336 -2.1639,2.3389 -3.9765,-0.9467 z"
|
||||
id="path3439-0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccczcc" />
|
||||
<path
|
||||
style="fill:#161616;display:inline"
|
||||
d="m 1021.3328,474.27836 c 24.5803,-0.4873 42.775,-0.9269 45.4564,-0.9767 2.6815,-0.05 8.8977,-0.2859 13.8137,-0.5246 4.9161,-0.2386 20.6393,-0.7058 34.9405,-1.038 14.3012,-0.3323 29.3303,-0.8366 33.398,-1.1206 12.4263,-0.8679 81.8062,-2.0079 114.1351,-1.8754 27.9904,0.1147 78.5421,2.7498 81.8676,4.2675 7.0635,3.2237 8.904,6.0438 9.9447,15.2381 0.5833,5.1531 1.0373,10.9443 1.0091,12.8693 -0.062,4.1586 -4.7443,29.1768 -7.5808,40.5 -1.4465,5.7738 -1.9156,24.1011 -1.6859,65.8615 0.3544,64.4154 -0.1495,61.6385 11.2037,61.6385 7.8853,0 5.2544,-1.20564 9.4039,2.38016 2.7897,2.4107 0.853,6.28274 -0.4039,7.50144 -1.3723,1.3308 5.93,1.5563 -5.2986,1.2691 l -13.6549,-0.3493 -2.7894,3.5993 c -2.8607,3.6914 -6.2908,4.5598 -9.2791,2.3493 -0.9292,-0.6875 -3.0364,-2.3361 -4.6821,-3.6636 -2.6687,-2.1525 -4.4708,-2.4515 -16.6571,-2.7639 -7.5156,-0.1926 -30.1191,0.1098 -50.2302,0.6719 -20.1111,0.5622 -44.6101,1.2489 -54.4421,1.5261 -9.8321,0.2773 -21.5331,0.7153 -26.0022,0.9734 -26.6222,1.5379 -133.3905,3.4824 -161.7012,2.945 -53.94131,-1.0239 -84.94482,-2.9391 -91.17949,-6.9251 -4.90207,-3.134 -7.82651,-8.5054 -5.88772,-10.8143 0.97671,-1.1632 0.5922,-6.119 -1.08639,-14 -1.42899,-6.7097 -1.65543,-20.2995 -2.94774,-30.1995 -2.80971,-21.5241 -4.64015,-44.5512 -6.89959,-53.5 -4.48895,-17.7787 -4.55992,-47.49 -5.04762,-66.0309 -0.29692,-11.292 -1.02238,-21.3045 -1.61198,-22.25 -3.01869,-4.8405 1.34317,-5.5332 39.09156,-6.2079 14.30121,-0.2556 46.11329,-0.8634 70.69347,-1.3508 m -7.3607,10.8144 c -15.64196,0.53 -35.29914,1.2175 -48.70653,1.5277 -13.40739,0.3102 -27.4684,0.8235 -31.24669,1.1407 l -6.86962,0.5768 0.8883,18.1399 c 1.06772,21.804 -2.91279,21.9841 0.54617,42.1399 1.51007,8.8 1.44804,17.382 2.30628,19.071 0.8584,1.689 1.56078,5.0927 1.56078,7.5636 0,2.4709 1.59875,9.55628 2.59129,15.929 1.1216,7.20139 1.65562,13.45001 1.99707,17.02501 0.34143,3.575 0.20667,8.76139 0.6596,10.41139 0.45293,1.65 1.96219,10.875 3.35396,20.5 3.59805,24.8838 4.80294,30.0601 7.20993,30.9754 11.03566,4.1968 80.28246,5.4772 169.76586,3.3817 l 0,2e-4 c 18.7704,-0.4395 35.2249,-0.7068 36.5657,-0.594 1.3407,0.1129 15.6013,-0.4571 31.6902,-1.2666 33.128,-1.6668 99.5104,-3.4798 127.7805,-3.4898 14.302,-0.01 19.3606,-0.3508 20.8055,-1.4221 1.402,-1.0396 1.6563,-7.4785 0.9577,-24.25 -2.872,-68.9384 -2.2018,-91.939 3.3315,-114.3346 1.291,-5.225 2.8188,-16.9688 3.3952,-26.0973 0.8625,-13.6582 0.6447,-16.757 -1.2297,-17.4994 -2.3828,-0.9438 -20.7022,-3.1881 -27.1349,-3.3243 -56.518,-3.26162 -107.6254,-1.67151 -157.1583,-0.2613 -14.3013,0.6344 -45.0164,1.6125 -68.2558,2.1734 -23.2395,0.561 -55.0516,1.4536 -70.6935,1.9837"
|
||||
id="path3255-3-2-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccsssssssccscssscsccsscssssssccsccssssssssccccscsssscccsc" />
|
||||
<path
|
||||
style="fill:#fff6d5;stroke:none"
|
||||
d="m 241.02081,672.36506 c -7.17795,-1.7118 -7.35326,-2.13464 -11.297,-27.24711 -9.6652,-61.54492 -14.28972,-102.65603 -14.257,-126.74218 l 0.0352,-25.89255 24.91124,-1.43226 c 13.70118,-0.78775 67.01731,-2.52796 118.48028,-3.86713 51.46297,-1.33917 114.34866,-3.07693 139.74597,-3.86169 48.76938,-1.50693 124.42585,2.12252 128.46621,6.16289 1.57306,1.57306 0.79182,13.05247 -2.27649,33.44986 -3.59488,23.89791 -4.67148,44.21739 -4.67148,88.16846 l 0,57.11357 -35.24029,1.5381 c -55.3579,2.41615 -335.78506,4.54449 -343.89661,2.61004 z"
|
||||
id="path3088"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#fff6d5;stroke:none"
|
||||
d="m 950.71481,669.92649 c -6.7719,-1.62947 -7.46902,-2.88127 -10.29836,-18.4923 -1.66912,-9.20948 -4.66724,-29.43367 -6.66248,-44.94264 -1.99524,-15.50897 -4.72122,-35.30695 -6.05773,-43.9955 -1.33652,-8.68855 -2.45201,-28.54586 -2.47889,-44.12734 l -0.0489,-28.32998 22.48088,-1.4083 c 12.36448,-0.77457 64.58694,-2.51393 116.04994,-3.86523 51.4629,-1.35131 115.9891,-3.11198 143.3915,-3.91261 51.0226,-1.49074 125.5025,2.02317 129.5935,6.11414 1.3848,1.38479 0.1708,17.08301 -3.1485,40.71432 -4.5092,32.10264 -5.2625,46.69669 -4.5569,88.28302 l 0.8453,49.82248 -36.4555,1.52842 c -57.9773,2.43073 -334.64218,4.53932 -342.65389,2.61152 z"
|
||||
id="path3090"
|
||||
inkscape:connector-curvature="0" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans Mono;-inkscape-font-specification:DejaVu Sans Mono Bold"
|
||||
x="218.47667"
|
||||
y="514.90009"
|
||||
id="text3405"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3407"
|
||||
x="218.47667"
|
||||
y="514.90009">server plain alice ...</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="218.47667"
|
||||
y="549.90009"
|
||||
id="tspan3409">server plain carol ...</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="218.47667"
|
||||
y="584.90009"
|
||||
id="tspan3411">server plain dave ...</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans Mono;-inkscape-font-specification:DejaVu Sans Mono Bold"
|
||||
x="928.94977"
|
||||
y="521.77808"
|
||||
id="text3413"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3415"
|
||||
x="928.94977"
|
||||
y="521.77808">client plain bob ...</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer5"
|
||||
inkscape:label="text"
|
||||
style="display:inline">
|
||||
<g
|
||||
id="g3393"
|
||||
transform="translate(-52.811358,-27.257475)">
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="text3375"
|
||||
y="283.64099"
|
||||
x="95.401161"
|
||||
style="font-size:48px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
|
||||
xml:space="preserve"><tspan
|
||||
y="283.64099"
|
||||
x="95.401161"
|
||||
id="tspan3377"
|
||||
sodipodi:role="line">alice</tspan></text>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path8377-5"
|
||||
d="m 129.84106,124.82785 c -1.771,-3.3091 -1.6446,-6.39842 0.4329,-10.58363 2.4886,-5.01311 4.9505,-6.02558 16.216,-6.66877 18.5597,-1.05965 29.5411,1.28198 28.5934,6.09719 -1.4666,7.45155 -13.4826,13.712 -28.3874,14.79011 -12.3126,0.89062 -14.7096,0.37369 -16.8549,-3.6349 z"
|
||||
style="fill:#fbdeb2;fill-opacity:1;stroke:none;display:inline" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3239-6"
|
||||
d="m 122.12766,243.05609 c -2.154,-2.2928 -2.2798,-3.0697 -1.7838,-11.0193 0.558,-8.9437 3.3281,-16.3433 8.0954,-21.6244 1.1864,-1.3143 3.3402,-3.9646 4.7861,-5.8896 1.446,-1.925 4.0263,-5.075 5.7341,-7 3.2914,-3.7102 3.3422,-3.8329 3.5216,-8.5 0.097,-2.5285 0.5082,-2.9859 2.6153,-2.9103 1.375,0.049 3.175,0.2743 4,0.5 1.0035,0.2745 1.4438,-0.2517 1.3303,-1.5897 -0.2702,-3.1859 -2.5316,-10.8828 -3.5992,-12.25 -1.2121,-1.55241 -8.9685,-1.61551 -17.4309,-0.14181 -4.7845,0.83321 -7.068,0.81641 -9.2022,-0.068 -3.1033,-1.2854 -5.3823,-5.1362 -4.4609,-7.5374 0.7469,-1.9462 2.2502,-2.223 17.3629,-3.1973 l 12.5,-0.8059 0.5,-9 c 0.4551,-8.1922 0.6885,-9.0269 2.6001,-9.2999 1.3402,-0.1914 3.3961,0.9961 5.6819,3.2819 3.1076,3.1076 3.5075,4.04 3.0205,7.0415 -0.8789,5.416 0.7005,6.4765 9.6456,6.4765 6.7592,0 7.9697,0.2837 9.8776,2.3144 4.5646,4.8589 1.8972,7.624 -7.51,7.7853 -9.2541,0.1586 -10.7644,0.8649 -11.1269,5.20381 -0.1712,2.0485 0.6631,7.6558 1.854,12.4605 l 2.1652,8.736 8.979,9.1999 c 9.4407,9.673 10.6653,12.5254 5.6285,13.1094 -3.4107,0.3954 -8.9308,-3.1513 -15.0799,-9.6889 -6.5015,-6.9122 -7.908,-7.5592 -11.0539,-5.0847 -3.9039,3.0708 -15.0491,16.9481 -17.5586,21.863 -1.2353,2.4192 -2.7028,6.9192 -3.2612,10 -0.9998,5.5157 -3.1382,10.1013 -4.7106,10.1013 -0.4415,0 -1.8455,-1.11 -3.12,-2.4667 z"
|
||||
style="fill:#161616;display:inline" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccsscscsscccccscssssc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3066-2"
|
||||
d="m 148.01326,130.11398 c 7.0818,-0.2751 10.2071,-1.0243 14.2901,-2.5674 l 0,-2e-4 c 7.0507,-2.6646 11.1812,-6.0188 13.8472,-11.2445 1.9056,-3.7354 1.9254,-4.0795 0.3352,-5.8366 -3.0633,-3.3849 -8.2846,-4.43 -20.9479,-4.1932 -6.8882,0.1288 -13.6023,-0.2658 -15.7613,-0.9262 -3.4318,-1.0499 -3.9877,-0.9393 -6.3473,1.2631 -3.0038,2.8037 -5.8546,8.0568 -6.8328,12.5908 -0.9266,4.2944 1.6041,9.1015 5.2095,9.896 1.5025,0.3311 3.1819,0.783 3.7319,1.0042 0.55,0.2212 5.5,0.2275 11,0.014 m -0.3448,10.1672 c -0.39,-0.075 -0.7802,-0.1993 -2.1552,-0.4052 -12.019,-1.8001 -14.4349,-2.7238 -18.7581,-7.1721 -2.3812,-2.45 -4.9847,-6.023 -5.7857,-7.94 -4.7123,-11.2783 1.6556,-23.835 15.8795,-31.312398 9.2319,-4.8531 12.0541,-4.7682 20.1517,0.6068 3.5494,2.3559 6.6277,3.5194 10.2516,3.8745 6.4828,0.6353 11.9926,3.408298 17.7688,8.942898 3.6122,3.4611 4.4922,4.9758 4.4922,7.7323 0,13.5694 -10.6345,21.7402 -32.2909,24.8103 -4.285,0.6075 -8.11,1.0432 -8.5,0.9683"
|
||||
style="fill:#161616;display:inline" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After (image error) Size: 30 KiB |
375
doc/changelog.html
Normal file
375
doc/changelog.html
Normal file
@ -0,0 +1,375 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>E-MailRelay Change Log</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<link rel="stylesheet" href="emailrelay.css" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<!-- index:0::::E-MailRelay Change Log -->
|
||||
<div class="div-main">
|
||||
<h1><a class="a-header" name="H_1">E-MailRelay Change Log</a></h1> <!-- index:1:H:1::E-MailRelay Change Log -->
|
||||
<h2><a class="a-header" name="SH_1_1">1.9.2 -> 2.0</a></h2> <!-- index:2:SH:1:1:1.9.2 -> 2.0 -->
|
||||
<ul>
|
||||
<li>Improved IPv6 support, with IPv4 and IPv6 used independently at run-time (see <em class="quote">--interface</em>).</li>
|
||||
<li>Server process is not blocked during <em class="quote">--filter</em> or <em class="quote">--address-verifier</em> execution, if multi-threaded.</li>
|
||||
<li>Support for the <em class="quote">mbedTLS</em> TLS library as an alternative to OpenSSL (<em class="quote">configure --with-mbedtls</em>).</li>
|
||||
<li>TLS server certificates specified with new <em class="quote">--server-tls-certificate</em> option, not <em class="quote">--server-tls</em>.</li>
|
||||
<li>TLS servers enable client certificate verification with <em class="quote">--server-tls-verify</em>, not <em class="quote">--tls-config</em>.</li>
|
||||
<li>TLS clients can verify server certificates with <em class="quote">--client-tls-verify</em> and <em class="quote">--client-tls-verify-name</em>.</li>
|
||||
<li>The <em class="quote">--tls-config</em> option works differently (see NEWS file).</li>
|
||||
<li>New <em class="quote">--client-tls-server-name</em> option for server name identification (SNI).</li>
|
||||
<li>New <em class="quote">--client-tls-required</em> option to force client connections to use TLS.</li>
|
||||
<li>New <em class="quote">--server-tls-required</em> option to force remote SMTP clients to use STARTTLS.</li>
|
||||
<li>New <em class="quote">--forward-on-disconnect</em> option replaces <em class="quote">--poll=0</em>.</li>
|
||||
<li>The <em class="quote">--anonymous</em> option now suppresses the <em class="quote">Received</em> line, whatever the <em class="quote">--domain</em>.</li>
|
||||
<li>The second field in the secrets file indicates the password encoding, not AUTH mechanism.</li>
|
||||
<li>The <em class="quote">--verifier</em> option is now <em class="quote">--address-verifier</em>, with simplified command-line parameters.</li>
|
||||
<li>Command-line file paths can use <em class="quote">@app</em> as a prefix to be relative to the executable directory.</li>
|
||||
<li>Command-line file paths can be relative to the startup cwd even when daemonised.</li>
|
||||
<li>Filter exit codes between 104 and 107 are interpreted differently (see NEWS file).</li>
|
||||
<li>Message rejection reasons passed back to the submitting SMTP client are much less verbose.</li>
|
||||
<li>Forwarding events are queued up if the forwarding client is still busy from last time.</li>
|
||||
<li>The bind address for outgoing connections is no longer taken from first unqualified <em class="quote">--interface</em> address [bug-id #27].</li>
|
||||
<li>The SMTP client protocol tries more than one authentication mechanism.</li>
|
||||
<li>Some support for XOAUTH2 client-side authentication.</li>
|
||||
<li>Client protocol sends QUIT with a socket shutdown().</li>
|
||||
<li>The Windows commdlg list-view widget is used for the server status pages.</li>
|
||||
<li>The Windows connection-lookup feature is withdrawn (<em class="quote">--peer-lookup</em>).</li>
|
||||
<li>Several build-time configure options like <em class="quote">--disable-pop</em> are withdrawn.</li>
|
||||
<li>C++ 2011 is preferred, and required for multi-threading.</li>
|
||||
<li>Support for very old versions of Windows is dropped.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_2">1.9.1 -> 1.9.2</a></h2> <!-- index:2:SH:1:2:1.9.1 -> 1.9.2 -->
|
||||
<ul>
|
||||
<li>Fixed a leak in the event-loop garbage collection.</li>
|
||||
<li>A local hostname that fails to resolve is not an error.</li>
|
||||
<li>A warning is emitted if there is more than one client authentication secret.</li>
|
||||
<li>Multiple <em class="quote">--interface</em> options are allowed separately on the command-line.</li>
|
||||
<li>Added a new <em class="quote">--client-interface</em> option.</li>
|
||||
<li>The <em class="quote">Received</em> line is formatted as per RFC-3848 (<em class="quote">with ESMTPSA</em>).</li>
|
||||
<li>The LOGIN and PLAIN mechanisms in the secrets file are now equivalent.</li>
|
||||
<li>The Windows service wrapper can use a configuration file to locate the startup batch file.</li>
|
||||
<li>Simplified the implementation of the GUI installation program.</li>
|
||||
<li>Reworded the <em class="quote">read error: disconnected</em> log message.</li>
|
||||
<li>Less verbose logging of <em class="quote">no more messages to send</em>.</li>
|
||||
<li>Qt4 or Qt5 selected by the <em class="quote">configure</em> script.</li>
|
||||
<li>Improved the RPM spec file.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_3">1.9 -> 1.9.1</a></h2> <!-- index:2:SH:1:3:1.9 -> 1.9.1 -->
|
||||
<ul>
|
||||
<li>Updated OpenSSL from 1.0.1e to 1.0.1g in the Windows build.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_4">1.8.2 -> 1.9</a></h2> <!-- index:2:SH:1:4:1.8.2 -> 1.9 -->
|
||||
<ul>
|
||||
<li>Added negotiated TLS/SSL for POP (ie. <em class="quote">STLS</em>).</li>
|
||||
<li>The first two fields in the secrets files are reordered (with backwards compatibility).</li>
|
||||
<li>Added Linux PAM authentication (<em class="quote">configure --with-pam</em> and then <em class="quote">--server-auth=/pam</em>).</li>
|
||||
<li>Optional protocol-specific <em class="quote">--interface</em> qualifiers, eg. <em class="quote">--interface smtp=127.0.0.1,pop=192.168.1.1</em>.</li>
|
||||
<li>Outgoing client connection bound with the first <em class="quote">--interface</em> or <em class="quote">--interface client=...</em> address.</li>
|
||||
<li>Support for SMTP-over-TLS on outgoing client connection (<em class="quote">--client-tls-connection</em>) (cf. <em class="quote">STARTTLS</em>)</li>
|
||||
<li>Support for SOCKS 4a on outgoing client connection, eg. <em class="quote">--forward-to example.com:25@127.0.0.1:9050</em>.</li>
|
||||
<li>TLS configuration options (<em class="quote">--tls-config=...</em>) for SSLv2/3 fallback etc.</li>
|
||||
<li>No <em class="quote">Received</em> line added if <em class="quote">--anonymous</em> and an empty <em class="quote">--domain</em> name.</li>
|
||||
<li>Error text for <em class="quote">all recipients rejected</em> is now more accurately <em class="quote">one or more recipients rejected</em>.</li>
|
||||
<li>New behaviour for <em class="quote">--client-filter</em> exit values of 100 and over.</li>
|
||||
<li>New commands on the admin interface, <em class="quote">failures</em> and <em class="quote">unfail-all</em>.</li>
|
||||
<li>Shorter descriptions in the usage help unless <em class="quote">--verbose</em>.</li>
|
||||
<li>New default spool directory location on windows, now under <em class="quote">system32</em>.</li>
|
||||
<li>Windows project files for MSVC 2012 included.</li>
|
||||
<li>Removed support for Windows NT and Windows 9x.</li>
|
||||
<li>Better support for Windows Vista and Windows 7.</li>
|
||||
<li>Removed Windows <em class="quote">--icon</em> option.</li>
|
||||
<li>Removed <em class="quote">--enable-fhs</em> option for <em class="quote">configure</em> (see INSTALL document for equivalent usage).</li>
|
||||
<li>Added <em class="quote">--log-file</em> option to redirect stderr.</li>
|
||||
<li>Added Windows <em class="quote">--peer-lookup</em> option.</li>
|
||||
<li>Fix for MD5 code in 64-bit builds.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_5">1.8.1 -> 1.8.2</a></h2> <!-- index:2:SH:1:5:1.8.1 -> 1.8.2 -->
|
||||
<ul>
|
||||
<li>Fix namespaces for gcc 3.4.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_6">1.8 -> 1.8.1</a></h2> <!-- index:2:SH:1:6:1.8 -> 1.8.1 -->
|
||||
<ul>
|
||||
<li>Changed the definition of <em class="quote">--as-proxy</em> to use <em class="quote">--poll 0</em> rather than <em class="quote">--immediate</em> [bug-id 1961652].</li>
|
||||
<li>Fixed stalling bug when using server-side TLS/SSL (<em class="quote">--server-tls</em>) [bug-id 1961655].</li>
|
||||
<li>Improved Debian packaging for Linux (<em class="quote">make deb</em>).</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_7">1.7 -> 1.8</a></h2> <!-- index:2:SH:1:7:1.7 -> 1.8 -->
|
||||
<ul>
|
||||
<li>Speed optimisations (as identified by KCachegrind/valgrind in KDevelop).</li>
|
||||
<li>Build-time size optimisations (eg. <em class="quote">./configure --disable-exec --enable-small-exceptions ...</em>).</li>
|
||||
<li>Build-time options to reduce runtime library dependencies (eg. <em class="quote">./configure --disable-dns --disable-identity</em>).</li>
|
||||
<li>New switch to limit the size of submitted messages (<em class="quote">--size</em>).</li>
|
||||
<li>New semantics for <em class="quote">--poll 0</em>, providing a good alternative to <em class="quote">--immediate</em> when proxying.</li>
|
||||
<li>SMTP client protocol emits a RSET after a rejected recipient as a workround for broken server protocols.</li>
|
||||
<li>SMTP client protocol continues if the server advertises AUTH but the client has no authentication secrets.</li>
|
||||
<li>When a message cannot be forwarded the offending SMTP protocol response number, if any, is put in the envelope file.</li>
|
||||
<li>A warning is printed if logging is requested but both stderr and syslog are disabled.</li>
|
||||
<li>A cross-compiling toolchain builder script added for running on mips-based routers (<em class="quote">extra/mips</em>).</li>
|
||||
<li>New example scripts for SMTP multicasting and editing envelope files.</li>
|
||||
<li>Improved native support for Mac OS X (10.5) with graphical installation from disk image.</li>
|
||||
<li>Compatibility with gcc 2.95 restored.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_8">1.6 -> 1.7</a></h2> <!-- index:2:SH:1:8:1.6 -> 1.7 -->
|
||||
<ul>
|
||||
<li>TLS/SSL support for SMTP using OpenSSL (<em class="quote">./configure --with-openssl</em> with <em class="quote">--client-tls</em> and <em class="quote">--server-tls</em>).</li>
|
||||
<li>Authentication mechanism <em class="quote">PLAIN</em> added.</li>
|
||||
<li>Some tightening up of the SMTP server protocol.</li>
|
||||
<li>Windows service wrapper has an <em class="quote">--uninstall</em> option.</li>
|
||||
<li>Windows installation GUI uninstalls the service before reinstalling it.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_9">1.5 -> 1.6</a></h2> <!-- index:2:SH:1:9:1.5 -> 1.6 -->
|
||||
<ul>
|
||||
<li>GPLv3 licence (see <em class="quote">http://gplv3.fsf.org</em>).</li>
|
||||
<li>New <em class="quote">--prompt-timeout</em> switch for the timeout when waiting for the initial 220 prompt from the SMTP server.</li>
|
||||
<li>Fix for flow-control assertion error when the POP server sends a very long list of spooled messages.</li>
|
||||
<li>Wildcard matching for trusted IP addresses in the authentication secrets file can now use CIDR notation.</li>
|
||||
<li>More fine-grained switching of effective user-id to read files and directories when running as root.</li>
|
||||
<li>Fewer new client connections when proxying.</li>
|
||||
<li>The server drops the connection if a remote SMTP client causes too many protocol errors.</li>
|
||||
<li>More complete implementation of <em class="quote">--hidden</em> on Windows.</li>
|
||||
<li>Scanner switch (<em class="quote">--scanner</em>) replaced by a more general <em class="quote">--filter</em> and <em class="quote">--client-filter</em> switch syntax.</li>
|
||||
<li>Support for address verification (<em class="quote">--verifier</em>) over the network.</li>
|
||||
<li>Better support for running as a Windows service (<em class="quote">emailrelay-service --install</em>).</li>
|
||||
<li>Utility filter program <em class="quote">emailrelay-filter-copy</em> exits with 100 if it deletes the envelope file.</li>
|
||||
<li>Windows <em class="quote">cscript.exe</em> wrapper is added automatically to non-bat/exe <em class="quote">--filter</em> command-lines.</li>
|
||||
<li>Installation GUI makes backups of the files it edits and preserves authentication secrets.</li>
|
||||
<li>Installation GUI can install <em class="quote">init.d</em> links.</li>
|
||||
<li>Experimental SpamAssassin spamc/spamd protocol support.</li>
|
||||
<li>Acceptance tests added to the distribution.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_10">1.4 -> 1.5</a></h2> <!-- index:2:SH:1:10:1.4 -> 1.5 -->
|
||||
<ul>
|
||||
<li>New installation and configuration GUI using TrollTech Qt 4.x (<em class="quote">./configure --enable-gui</em>)</li>
|
||||
<li>Default address verifier accepts all addresses as valid and never treats them as local mailboxes.</li>
|
||||
<li>Fix for server exit bug when failing to send data down a newly accepted connection.</li>
|
||||
<li>Spooled content files can be left in the parent directory to save diskspace when using <em class="quote">--pop-by-name</em>.</li>
|
||||
<li>Client protocol improved for the case where there are no valid recipients.</li>
|
||||
<li>New <em class="quote">--syslog</em> switch to override <em class="quote">--no-syslog</em>.</li>
|
||||
<li>New <em class="quote">--filter-timeout</em> switch added.</li>
|
||||
<li>Support for <em class="quote">--foo=bar</em> switch syntax (ie. with <em class="quote">=</em>).</li>
|
||||
<li>Multiple listening interfaces allowed with a comma-separated <em class="quote">--interface</em> list.</li>
|
||||
<li>New <em class="quote">--filter</em> utility called <em class="quote">emailrelay-filter-copy</em> to support <em class="quote">--pop-by-name</em>.</li>
|
||||
<li>Documentation also created in docbook format (requires xmlto).</li>
|
||||
<li>Windows installation document revised.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_11">1.3.3 -> 1.4</a></h2> <!-- index:2:SH:1:11:1.3.3 -> 1.4 -->
|
||||
<ul>
|
||||
<li>POP3 server (enable with <em class="quote">--pop</em>, disable at build-time with <em class="quote">./configure --disable-pop</em>).</li>
|
||||
<li>Fix for logging reentrancy bug (affects <em class="quote">./configure --enable-debug</em> with <em class="quote">--debug</em>).</li>
|
||||
<li>Fix to ensure sockets are always non-blocking (affects <em class="quote">--scanner</em>).</li>
|
||||
<li>Allow <em class="quote">--verifier</em> scripts to reject addresses with a temporary <em class="quote">4xx</em> error code.</li>
|
||||
<li>Automatic re-reading of secrets files.</li>
|
||||
<li>Write to the Windows event log even if no write access to the registry.</li>
|
||||
<li>Modification of set-group-id policy if not started as root.</li>
|
||||
<li>Better checking of spool directory access on startup.</li>
|
||||
<li>New <em class="quote">emailrelay-submit.sh</em> example script for submitting messages for <em class="quote">--pop-by-name</em>.</li>
|
||||
<li>The <em class="quote">--dont-listen</em> switch is now <em class="quote">--no-smtp</em>.</li>
|
||||
<li>Better IPv6 support (Linux only).</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_12">1.3.2 -> 1.3.3</a></h2> <!-- index:2:SH:1:12:1.3.2 -> 1.3.3 -->
|
||||
<ul>
|
||||
<li>No bind() for outgoing connections [bug-id 1051689].</li>
|
||||
<li>Updated rpm spec file [bug-id 1224850].</li>
|
||||
<li>Fix for gcc3.4 compilation error in <em class="quote">md5.cpp</em>.</li>
|
||||
<li>Fix for glob()/size_t compilation warning.</li>
|
||||
<li>Documentation of <em class="quote">auth</em> switches corrected.</li>
|
||||
<li>State-machine template type declaration modernised, possibly breaking older compilers.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_13">1.3.1 -> 1.3.2</a></h2> <!-- index:2:SH:1:13:1.3.1 -> 1.3.2 -->
|
||||
<ul>
|
||||
<li>Fix for core dump when <em class="quote">--client-filter</em> pre-processing fails.</li>
|
||||
<li>Revised code structure to prepare for asynchronous pre-processing.</li>
|
||||
<li>Better diagnostics when pre-processor exec() fails.</li>
|
||||
<li>Better cleanup of empty and orphaned files.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_14">1.3 -> 1.3.1</a></h2> <!-- index:2:SH:1:14:1.3 -> 1.3.1 -->
|
||||
<ul>
|
||||
<li>Windows resource leak from CreateProcess() fixed.</li>
|
||||
<li>Windows dialog box double-close fix.</li>
|
||||
<li>Some documentation for the <em class="quote">--scanner</em> switch.</li>
|
||||
<li>New usage patterns section in the user guide.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_15">1.2 -> 1.3</a></h2> <!-- index:2:SH:1:15:1.2 -> 1.3 -->
|
||||
<ul>
|
||||
<li>Client protocol waits for a greeting from the server on startup [bug-id 842156].</li>
|
||||
<li>Fix for incorrect backslash normalisation on <em class="quote">--verifier</em> command-lines containing spaces [bug-id 890646].</li>
|
||||
<li>Verifier programs can now summarily abort a connection using an exit value of 100.</li>
|
||||
<li>New <em class="quote">--anonymous</em> switch that reduces information leakage to the SMTP client and disables <em class="quote">VRFY</em>.</li>
|
||||
<li>Better validation of <em class="quote">MAIL-FROM</em> and <em class="quote">RCPT-TO</em> formatting.</li>
|
||||
<li>Rewrite of low-level MD5 code.</li>
|
||||
<li>Performance tuning.</li>
|
||||
<li>Template <em class="quote">emailrelay.conf</em> gets installed in <em class="quote">/etc</em>.</li>
|
||||
<li>New switches for the <em class="quote">configure</em> script.</li>
|
||||
<li>More JavaScript example scripts.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_16">1.1.2 -> 1.2</a></h2> <!-- index:2:SH:1:16:1.1.2 -> 1.2 -->
|
||||
<ul>
|
||||
<li>The <em class="quote">--filter</em> and <em class="quote">--verifier</em> arguments interpreted as command-lines; spaces in executable paths now need escaping.</li>
|
||||
<li>The <em class="quote">--interface</em> switch applies to outgoing connections too.</li>
|
||||
<li>New <em class="quote">--client-filter</em> switch to do synchronous message processing before sending.</li>
|
||||
<li>Keeps authentication after a <em class="quote">rset</em> command.</li>
|
||||
<li>Fix for dangling reference bug, seen after <em class="quote">quit</em> command on Windows.</li>
|
||||
<li>JavaScript examples in the documentation.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_17">1.1.1 -> 1.1.2</a></h2> <!-- index:2:SH:1:17:1.1.1 -> 1.1.2 -->
|
||||
<ul>
|
||||
<li>Earlier check for un-bindable ports on startup, and later fork()ing [bug-id 776972].</li>
|
||||
<li>Resolved the file-descriptor kludge for <em class="quote">--verifier</em> on Windows.</li>
|
||||
<li>Less strict about failing eight bit messages sent to servers with no <em class="quote">8BITMIME</em> extension.</li>
|
||||
<li>Supplementary group memberships revoked at startup if root or suid.</li>
|
||||
<li>Pre-processor (<em class="quote">--filter</em>) program's standard output searched for a failure reason string.</li>
|
||||
<li>Undocumented <em class="quote">--scanner</em> switch added for asynchronous processing by a separate network server.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_18">1.1.0 -> 1.1.1</a></h2> <!-- index:2:SH:1:18:1.1.0 -> 1.1.1 -->
|
||||
<ul>
|
||||
<li>Restored the fix for building with gcc2.96.</li>
|
||||
<li>Support for MinGW builds on Windows.</li>
|
||||
<li>More reasonable size of the <em class="quote">--help --verbose</em> message box on Windows.</li>
|
||||
<li>Windows <em class="quote">--icon</em> switch changed from <em class="quote">-i</em> to <em class="quote">-c</em> to avoid conflicting with <em class="quote">--interface</em>.</li>
|
||||
<li>Shows <em class="quote">next server address</em> correctly in the configuration report when using <em class="quote">--forward-to</em>.</li>
|
||||
<li>Fix for <em class="quote">make install</em> when <em class="quote">man2html</em> is not available.</li>
|
||||
<li>Updated init script.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_19">1.0.2 -> 1.1.0</a></h2> <!-- index:2:SH:1:19:1.0.2 -> 1.1.0 -->
|
||||
<ul>
|
||||
<li>In proxy mode unexpected client-side disconnects and timeouts do not leave <em class="quote">.bad</em> files [see also bug-id 659039].</li>
|
||||
<li>By default proxy mode does not interpret addresses for local delivery (<em class="quote">--postmaster</em>).</li>
|
||||
<li>Polling option added (<em class="quote">--poll</em>) to rescan the spool directory periodically.</li>
|
||||
<li>New special exit code (103) for the pre-processor to trigger immediate polling; 100 to 107 now reserved.</li>
|
||||
<li>Orphaned zero-length content files are deleted properly if the server-side dialogue is cut short.</li>
|
||||
<li>The <em class="quote">--interface</em> switch applies to the <em class="quote">--admin</em> interface too.</li>
|
||||
<li>Improved internal event architecture using slot/signal design pattern, and fewer singleton classes.</li>
|
||||
<li>Event notification available through the administration interface.</li>
|
||||
<li>New <em class="quote">--hidden</em> switch for Windows.</li>
|
||||
<li>Syslog output includes process-id.</li>
|
||||
<li>Support for Sun WorkShop 5.0 added.</li>
|
||||
<li>Documentation overhaul.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_20">1.0.0 -> 1.0.2</a></h2> <!-- index:2:SH:1:20:1.0.0 -> 1.0.2 -->
|
||||
<ul>
|
||||
<li>Support for trusted IP addresses, allowing certain clients to avoid authentication.</li>
|
||||
<li>Address verifier interface extended to include authentication information.</li>
|
||||
<li>New public mail relay section added to the user guide.</li>
|
||||
<li>Example verifier scripts etc. added to the reference guide.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_21">1.0.0 -> 1.0.1</a></h2> <!-- index:2:SH:1:21:1.0.0 -> 1.0.1 -->
|
||||
<ul>
|
||||
<li>In proxy mode unexpected client-side disconnects and timeouts result in <em class="quote">.bad</em> files [bug-id 659039].</li>
|
||||
<li>Require successful <em class="quote">AUTH</em> before <em class="quote">MAIL FROM</em> when using <em class="quote">--server-auth</em>.</li>
|
||||
<li>Better word-wrap on <em class="quote">--help</em> output.</li>
|
||||
<li>Use of RedHat's <em class="quote">functions</em> code, and support for <em class="quote">chkconfig</em>, added to the <em class="quote">init.d</em> script.</li>
|
||||
<li>Builds with gcc3.2 (1.0.0-pl5).</li>
|
||||
<li>Fix for files left as <em class="quote">busy</em> after a connection failure in proxy mode [bug-id 631032] (1.0.0-pl3/4/5).</li>
|
||||
<li>Trivial documentation fixes (1.0.0-pl3).</li>
|
||||
<li>Fix for the double-dot escape bug in the client protocol [bug-id 611624] (1.0.0-pl2).</li>
|
||||
<li>Fix build when using gcc2.96 rather than gcc2.95 (1.0.0-pl1).</li>
|
||||
<li>Fix default spool directory in example scripts (1.0.0-pl1).</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_22">0.9.9 -> 1.0.0</a></h2> <!-- index:2:SH:1:22:0.9.9 -> 1.0.0 -->
|
||||
<ul>
|
||||
<li>Briefer <em class="quote">--help</em> output; works with <em class="quote">--verbose</em>.</li>
|
||||
<li>Option to listen on a specific network interface (<em class="quote">--interface</em>).</li>
|
||||
<li>Option for an external address verifier program (<em class="quote">--verifier</em>).</li>
|
||||
<li>Some Linux Standard Base stuff added to the <em class="quote">init.d</em> script.</li>
|
||||
<li>Pid files world-readable and deleted on abnormal termination.</li>
|
||||
<li>Compiles with gcc 3.0 and intel 6.0.</li>
|
||||
<li>Autoconf tweak for MacOS X.</li>
|
||||
<li>Corrected the <em class="quote">Received:</em> typo [bug-id 572236].</li>
|
||||
<li>EHLO response parsing is now case-insensitive [bug-id 561522].</li>
|
||||
<li>Fewer missing-secrets warnings [bug-id 564987].</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_23">0.9.8 -> 0.9.9</a></h2> <!-- index:2:SH:1:23:0.9.8 -> 0.9.9 -->
|
||||
<ul>
|
||||
<li>More flexible logging options (<em class="quote">--verbose</em> and <em class="quote">--debug</em> work better).</li>
|
||||
<li>File Hierarchy Standard (FHS) option for <em class="quote">configure</em> (<em class="quote">--enable-fhs</em>).</li>
|
||||
<li>FHS-compatible RPMs.</li>
|
||||
<li>Spool files writeable by pre-processor when server started as root.</li>
|
||||
<li>Default directories in executables and scripts come from <em class="quote">configure</em>.</li>
|
||||
<li>The <em class="quote">init.d</em> script is renamed <em class="quote">emailrelay</em> (was <em class="quote">emailrelay.sh</em>).</li>
|
||||
<li>Man pages are gzipped when installed.</li>
|
||||
<li>Fix for access violation under Windows NT when client disconnects.</li>
|
||||
<li>Use of event log when compiled on Windows NT.</li>
|
||||
<li>Fix for info-after-flush bug when using the administration interface. [rc2]</li>
|
||||
<li>New <em class="quote">resubmit</em> script. [rc2]</li>
|
||||
<li>Submit utility works under Windows. [rc2]</li>
|
||||
<li>Improved Windows project files. [rc2]</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_24">0.9.7 -> 0.9.8</a></h2> <!-- index:2:SH:1:24:0.9.7 -> 0.9.8 -->
|
||||
<ul>
|
||||
<li>Fix for running pre-processor (<em class="quote">--filter</em>) as root.</li>
|
||||
<li>Ignore bogus <em class="quote">AUTH=LOGIN</em> lines in EHLO response.</li>
|
||||
<li>Submit utility improved to work with mutt.</li>
|
||||
<li>Installation of submit man page.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_25">0.9.6 -> 0.9.7</a></h2> <!-- index:2:SH:1:25:0.9.6 -> 0.9.7 -->
|
||||
<ul>
|
||||
<li>CRAM-MD5 authentication mechanism added.</li>
|
||||
<li>Revoke root permissions at start up, and reclaim them when needed.</li>
|
||||
<li>Allow mail pre-processing (<em class="quote">--filter</em>) when started as root.</li>
|
||||
<li>Domain-override switch (<em class="quote">--domain</em>) added.</li>
|
||||
<li>Non-privileged user switch (<em class="quote">--user</em>) added.</li>
|
||||
<li>Better handling of NarrowPipe exception (ie. 8-bit message to 7-bit server).</li>
|
||||
<li>Allow null return path in MAIL-FROM.</li>
|
||||
<li>Reject recipients which look like <em class="quote"><user>@localhost</em> (as used by fetchmail for local delivery).</li>
|
||||
<li>Treat recipients which look like <em class="quote">postmaster@localhost</em> or <em class="quote">postmaster@<fqdn></em> as local postmaster.</li>
|
||||
<li>Optional timestamps on log output (<em class="quote">--log-time</em>).</li>
|
||||
<li>Fix EHLO to HELO fallback for 501/502 responses in client protocol.</li>
|
||||
<li>Submission utility <em class="quote">emailrelay-submit</em> added.</li>
|
||||
<li>HTML4.0 compliant HTML documentation, using CSS.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_26">0.9.5 -> 0.9.6</a></h2> <!-- index:2:SH:1:26:0.9.5 -> 0.9.6 -->
|
||||
<ul>
|
||||
<li>SMTP AUTHentication extension -- LOGIN mechanism only.</li>
|
||||
<li>Client-side protocol timeout.</li>
|
||||
<li>Client-side connection timeout.</li>
|
||||
<li>Preprocessor can cancel further message processing.</li>
|
||||
<li>Client's IP address recorded in envelope files.</li>
|
||||
<li>Multiple hard-coded listening addresses supported at compile-time.</li>
|
||||
<li>Fix for automatic reopening of stderr stream.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_27">0.9.4 -> 0.9.5</a></h2> <!-- index:2:SH:1:27:0.9.4 -> 0.9.5 -->
|
||||
<p>
|
||||
Windows fixes and improvements...
|
||||
</p>
|
||||
<ul>
|
||||
<li>system-tray + dialog-box user interface</li>
|
||||
<li>fix for dropped connections</li>
|
||||
<li>fix for content file deletion</li>
|
||||
<li>fix for directory iterator</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_28">0.9.3 -> 0.9.4</a></h2> <!-- index:2:SH:1:28:0.9.3 -> 0.9.4 -->
|
||||
<ul>
|
||||
<li>Fixed memory leak when no <em class="quote">--log</em> switch.</li>
|
||||
<li>Windows build is more <em class="quote">gui</em> and less <em class="quote">command-line</em>.</li>
|
||||
<li><em class="quote">Info</em> command added to the administration interface.</li>
|
||||
<li>Doxygen files removed from binary RPM.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_29">0.9.2 -> 0.9.3</a></h2> <!-- index:2:SH:1:29:0.9.2 -> 0.9.3 -->
|
||||
<ul>
|
||||
<li>Proxy mode (<em class="quote">--immediate</em> and <em class="quote">--as-proxy</em>).</li>
|
||||
<li>Message pre-processing (<em class="quote">--filter</em>).</li>
|
||||
<li>Message store classes better separated using abstract interfaces.</li>
|
||||
<li>Improved notification script, with MIME encoding.</li>
|
||||
<li>Builds with old 2.91 version of gcc.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_30">0.9.1 -> 0.9.2</a></h2> <!-- index:2:SH:1:30:0.9.1 -> 0.9.2 -->
|
||||
<ul>
|
||||
<li>Better autoconf detection.</li>
|
||||
<li>Workround for FreeBSD uname() feature.</li>
|
||||
<li>Added missing <em class="quote">.sh_</em> files to the distribution.</li>
|
||||
<li>Fixed a benign directory iterator bug.</li>
|
||||
<li>Use of gcc's <em class="quote">exception</em> header.</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_31">0.9 -> 0.9.1</a></h2> <!-- index:2:SH:1:31:0.9 -> 0.9.1 -->
|
||||
<ul>
|
||||
<li>Improved documentation from doxygen.</li>
|
||||
<li>More complete use of namespaces.</li>
|
||||
<li>Experimental compile-time support for IPv6.</li>
|
||||
</ul>
|
||||
|
||||
</div> <!-- div-main -->
|
||||
</body>
|
||||
</html>
|
||||
<!-- Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>. All rights reserved. -->
|
399
doc/changelog.md
Normal file
399
doc/changelog.md
Normal file
@ -0,0 +1,399 @@
|
||||
E-MailRelay Change Log
|
||||
======================
|
||||
|
||||
1.9.2 -> 2.0
|
||||
------------
|
||||
|
||||
* Improved IPv6 support, with IPv4 and IPv6 used independently at run-time (see `--interface`).
|
||||
* Server process is not blocked during `--filter` or `--address-verifier` execution, if multi-threaded.
|
||||
* Support for the `mbedTLS` [TLS][] library as an alternative to OpenSSL (`configure --with-mbedtls`).
|
||||
* TLS server certificates specified with new `--server-tls-certificate` option, not `--server-tls`.
|
||||
* TLS servers enable client certificate verification with `--server-tls-verify`, not `--tls-config`.
|
||||
* TLS clients can verify server certificates with `--client-tls-verify` and `--client-tls-verify-name`.
|
||||
* The `--tls-config` option works differently (see NEWS file).
|
||||
* New `--client-tls-server-name` option for server name identification (SNI).
|
||||
* New `--client-tls-required` option to force client connections to use TLS.
|
||||
* New `--server-tls-required` option to force remote [SMTP][] clients to use STARTTLS.
|
||||
* New `--forward-on-disconnect` option replaces `--poll=0`.
|
||||
* The `--anonymous` option now suppresses the `Received` line, whatever the `--domain`.
|
||||
* The second field in the secrets file indicates the password encoding, not AUTH mechanism.
|
||||
* The `--verifier` option is now `--address-verifier`, with simplified command-line parameters.
|
||||
* Command-line file paths can use `@app` as a prefix to be relative to the executable directory.
|
||||
* Command-line file paths can be relative to the startup cwd even when daemonised.
|
||||
* Filter exit codes between 104 and 107 are interpreted differently (see NEWS file).
|
||||
* Message rejection reasons passed back to the submitting SMTP client are much less verbose.
|
||||
* Forwarding events are queued up if the forwarding client is still busy from last time.
|
||||
* The bind address for outgoing connections is no longer taken from first unqualified `--interface` address [bug-id #27].
|
||||
* The SMTP client protocol tries more than one authentication mechanism.
|
||||
* Some support for XOAUTH2 client-side authentication.
|
||||
* Client protocol sends QUIT with a socket shutdown().
|
||||
* The Windows commdlg list-view widget is used for the server status pages.
|
||||
* The Windows connection-lookup feature is withdrawn (`--peer-lookup`).
|
||||
* Several build-time configure options like `--disable-pop` are withdrawn.
|
||||
* C++ 2011 is preferred, and required for multi-threading.
|
||||
* Support for very old versions of Windows is dropped.
|
||||
|
||||
1.9.1 -> 1.9.2
|
||||
--------------
|
||||
|
||||
* Fixed a leak in the event-loop garbage collection.
|
||||
* A local hostname that fails to resolve is not an error.
|
||||
* A warning is emitted if there is more than one client authentication secret.
|
||||
* Multiple `--interface` options are allowed separately on the command-line.
|
||||
* Added a new `--client-interface` option.
|
||||
* The `Received` line is formatted as per RFC-3848 (`with ESMTPSA`).
|
||||
* The LOGIN and PLAIN mechanisms in the secrets file are now equivalent.
|
||||
* The Windows service wrapper can use a configuration file to locate the startup batch file.
|
||||
* Simplified the implementation of the GUI installation program.
|
||||
* Reworded the `read error: disconnected` log message.
|
||||
* Less verbose logging of `no more messages to send`.
|
||||
* Qt4 or Qt5 selected by the `configure` script.
|
||||
* Improved the RPM spec file.
|
||||
|
||||
1.9 -> 1.9.1
|
||||
------------
|
||||
|
||||
* Updated OpenSSL from 1.0.1e to 1.0.1g in the Windows build.
|
||||
|
||||
1.8.2 -> 1.9
|
||||
------------
|
||||
|
||||
* Added negotiated TLS/SSL for [POP][] (ie. `STLS`).
|
||||
* The first two fields in the secrets files are reordered (with backwards compatibility).
|
||||
* Added Linux [PAM][] authentication (`configure --with-pam` and then `--server-auth=/pam`).
|
||||
* Optional protocol-specific `--interface` qualifiers, eg. `--interface smtp=127.0.0.1,pop=192.168.1.1`.
|
||||
* Outgoing client connection bound with the first `--interface` or `--interface client=...` address.
|
||||
* Support for SMTP-over-TLS on outgoing client connection (`--client-tls-connection`) (cf. `STARTTLS`)
|
||||
* Support for [SOCKS][] 4a on outgoing client connection, eg. `--forward-to example.com:25@127.0.0.1:9050`.
|
||||
* TLS configuration options (`--tls-config=...`) for SSLv2/3 fallback etc.
|
||||
* No `Received` line added if `--anonymous` and an empty `--domain` name.
|
||||
* Error text for `all recipients rejected` is now more accurately `one or more recipients rejected`.
|
||||
* New behaviour for `--client-filter` exit values of 100 and over.
|
||||
* New commands on the admin interface, `failures` and `unfail-all`.
|
||||
* Shorter descriptions in the usage help unless `--verbose`.
|
||||
* New default spool directory location on windows, now under `system32`.
|
||||
* Windows project files for MSVC 2012 included.
|
||||
* Removed support for Windows NT and Windows 9x.
|
||||
* Better support for Windows Vista and Windows 7.
|
||||
* Removed Windows `--icon` option.
|
||||
* Removed `--enable-fhs` option for `configure` (see INSTALL document for equivalent usage).
|
||||
* Added `--log-file` option to redirect stderr.
|
||||
* Added Windows `--peer-lookup` option.
|
||||
* Fix for MD5 code in 64-bit builds.
|
||||
|
||||
1.8.1 -> 1.8.2
|
||||
--------------
|
||||
|
||||
* Fix namespaces for gcc 3.4.
|
||||
|
||||
1.8 -> 1.8.1
|
||||
------------
|
||||
|
||||
* Changed the definition of `--as-proxy` to use `--poll 0` rather than `--immediate` [bug-id 1961652].
|
||||
* Fixed stalling bug when using server-side TLS/SSL (`--server-tls`) [bug-id 1961655].
|
||||
* Improved Debian packaging for Linux (`make deb`).
|
||||
|
||||
1.7 -> 1.8
|
||||
----------
|
||||
|
||||
* Speed optimisations (as identified by KCachegrind/valgrind in KDevelop).
|
||||
* Build-time size optimisations (eg. `./configure --disable-exec --enable-small-exceptions ...`).
|
||||
* Build-time options to reduce runtime library dependencies (eg. `./configure --disable-dns --disable-identity`).
|
||||
* New switch to limit the size of submitted messages (`--size`).
|
||||
* New semantics for `--poll 0`, providing a good alternative to `--immediate` when proxying.
|
||||
* SMTP client protocol emits a RSET after a rejected recipient as a workround for broken server protocols.
|
||||
* SMTP client protocol continues if the server advertises AUTH but the client has no authentication secrets.
|
||||
* When a message cannot be forwarded the offending SMTP protocol response number, if any, is put in the envelope file.
|
||||
* A warning is printed if logging is requested but both stderr and syslog are disabled.
|
||||
* A cross-compiling toolchain builder script added for running on mips-based routers (`extra/mips`).
|
||||
* New example scripts for SMTP multicasting and editing envelope files.
|
||||
* Improved native support for Mac OS X (10.5) with graphical installation from disk image.
|
||||
* Compatibility with gcc 2.95 restored.
|
||||
|
||||
1.6 -> 1.7
|
||||
----------
|
||||
|
||||
* TLS/SSL support for SMTP using OpenSSL (`./configure --with-openssl` with `--client-tls` and `--server-tls`).
|
||||
* Authentication mechanism `PLAIN` added.
|
||||
* Some tightening up of the SMTP server protocol.
|
||||
* Windows service wrapper has an `--uninstall` option.
|
||||
* Windows installation GUI uninstalls the service before reinstalling it.
|
||||
|
||||
1.5 -> 1.6
|
||||
----------
|
||||
|
||||
* GPLv3 licence (see `http://gplv3.fsf.org`).
|
||||
* New `--prompt-timeout` switch for the timeout when waiting for the initial 220 prompt from the SMTP server.
|
||||
* Fix for flow-control assertion error when the POP server sends a very long list of spooled messages.
|
||||
* Wildcard matching for trusted IP addresses in the authentication secrets file can now use CIDR notation.
|
||||
* More fine-grained switching of effective user-id to read files and directories when running as root.
|
||||
* Fewer new client connections when proxying.
|
||||
* The server drops the connection if a remote SMTP client causes too many protocol errors.
|
||||
* More complete implementation of `--hidden` on Windows.
|
||||
* Scanner switch (`--scanner`) replaced by a more general `--filter` and `--client-filter` switch syntax.
|
||||
* Support for address verification (`--verifier`) over the network.
|
||||
* Better support for running as a Windows service (`emailrelay-service --install`).
|
||||
* Utility filter program `emailrelay-filter-copy` exits with 100 if it deletes the envelope file.
|
||||
* Windows `cscript.exe` wrapper is added automatically to non-bat/exe `--filter` command-lines.
|
||||
* Installation GUI makes backups of the files it edits and preserves authentication secrets.
|
||||
* Installation GUI can install `init.d` links.
|
||||
* Experimental SpamAssassin spamc/spamd protocol support.
|
||||
* Acceptance tests added to the distribution.
|
||||
|
||||
1.4 -> 1.5
|
||||
----------
|
||||
|
||||
* New installation and configuration GUI using TrollTech Qt 4.x (`./configure --enable-gui`)
|
||||
* Default address verifier accepts all addresses as valid and never treats them as local mailboxes.
|
||||
* Fix for server exit bug when failing to send data down a newly accepted connection.
|
||||
* Spooled content files can be left in the parent directory to save diskspace when using `--pop-by-name`.
|
||||
* Client protocol improved for the case where there are no valid recipients.
|
||||
* New `--syslog` switch to override `--no-syslog`.
|
||||
* New `--filter-timeout` switch added.
|
||||
* Support for `--foo=bar` switch syntax (ie. with `=`).
|
||||
* Multiple listening interfaces allowed with a comma-separated `--interface` list.
|
||||
* New `--filter` utility called `emailrelay-filter-copy` to support `--pop-by-name`.
|
||||
* Documentation also created in docbook format (requires xmlto).
|
||||
* Windows installation document revised.
|
||||
|
||||
1.3.3 -> 1.4
|
||||
------------
|
||||
|
||||
* POP3 server (enable with `--pop`, disable at build-time with `./configure --disable-pop`).
|
||||
* Fix for logging reentrancy bug (affects `./configure --enable-debug` with `--debug`).
|
||||
* Fix to ensure sockets are always non-blocking (affects `--scanner`).
|
||||
* Allow `--verifier` scripts to reject addresses with a temporary `4xx` error code.
|
||||
* Automatic re-reading of secrets files.
|
||||
* Write to the Windows event log even if no write access to the registry.
|
||||
* Modification of set-group-id policy if not started as root.
|
||||
* Better checking of spool directory access on startup.
|
||||
* New `emailrelay-submit.sh` example script for submitting messages for `--pop-by-name`.
|
||||
* The `--dont-listen` switch is now `--no-smtp`.
|
||||
* Better IPv6 support (Linux only).
|
||||
|
||||
1.3.2 -> 1.3.3
|
||||
--------------
|
||||
|
||||
* No bind() for outgoing connections [bug-id 1051689].
|
||||
* Updated rpm spec file [bug-id 1224850].
|
||||
* Fix for gcc3.4 compilation error in `md5.cpp`.
|
||||
* Fix for glob()/size_t compilation warning.
|
||||
* Documentation of `auth` switches corrected.
|
||||
* State-machine template type declaration modernised, possibly breaking older compilers.
|
||||
|
||||
1.3.1 -> 1.3.2
|
||||
--------------
|
||||
|
||||
* Fix for core dump when `--client-filter` pre-processing fails.
|
||||
* Revised code structure to prepare for asynchronous pre-processing.
|
||||
* Better diagnostics when pre-processor exec() fails.
|
||||
* Better cleanup of empty and orphaned files.
|
||||
|
||||
1.3 -> 1.3.1
|
||||
------------
|
||||
|
||||
* Windows resource leak from CreateProcess() fixed.
|
||||
* Windows dialog box double-close fix.
|
||||
* Some documentation for the `--scanner` switch.
|
||||
* New usage patterns section in the user guide.
|
||||
|
||||
1.2 -> 1.3
|
||||
----------
|
||||
|
||||
* Client protocol waits for a greeting from the server on startup [bug-id 842156].
|
||||
* Fix for incorrect backslash normalisation on `--verifier` command-lines containing spaces [bug-id 890646].
|
||||
* Verifier programs can now summarily abort a connection using an exit value of 100.
|
||||
* New `--anonymous` switch that reduces information leakage to the SMTP client and disables `VRFY`.
|
||||
* Better validation of `MAIL-FROM` and `RCPT-TO` formatting.
|
||||
* Rewrite of low-level MD5 code.
|
||||
* Performance tuning.
|
||||
* Template `emailrelay.conf` gets installed in `/etc`.
|
||||
* New switches for the `configure` script.
|
||||
* More JavaScript example scripts.
|
||||
|
||||
1.1.2 -> 1.2
|
||||
------------
|
||||
|
||||
* The `--filter` and `--verifier` arguments interpreted as command-lines; spaces in executable paths now need escaping.
|
||||
* The `--interface` switch applies to outgoing connections too.
|
||||
* New `--client-filter` switch to do synchronous message processing before sending.
|
||||
* Keeps authentication after a `rset` command.
|
||||
* Fix for dangling reference bug, seen after `quit` command on Windows.
|
||||
* JavaScript examples in the documentation.
|
||||
|
||||
1.1.1 -> 1.1.2
|
||||
--------------
|
||||
|
||||
* Earlier check for un-bindable ports on startup, and later fork()ing [bug-id 776972].
|
||||
* Resolved the file-descriptor kludge for `--verifier` on Windows.
|
||||
* Less strict about failing eight bit messages sent to servers with no `8BITMIME` extension.
|
||||
* Supplementary group memberships revoked at startup if root or suid.
|
||||
* Pre-processor (`--filter`) program's standard output searched for a failure reason string.
|
||||
* Undocumented `--scanner` switch added for asynchronous processing by a separate network server.
|
||||
|
||||
1.1.0 -> 1.1.1
|
||||
--------------
|
||||
|
||||
* Restored the fix for building with gcc2.96.
|
||||
* Support for MinGW builds on Windows.
|
||||
* More reasonable size of the `--help --verbose` message box on Windows.
|
||||
* Windows `--icon` switch changed from `-i` to `-c` to avoid conflicting with `--interface`.
|
||||
* Shows `next server address` correctly in the configuration report when using `--forward-to`.
|
||||
* Fix for `make install` when `man2html` is not available.
|
||||
* Updated init script.
|
||||
|
||||
1.0.2 -> 1.1.0
|
||||
--------------
|
||||
|
||||
* In proxy mode unexpected client-side disconnects and timeouts do not leave `.bad` files [see also bug-id 659039].
|
||||
* By default proxy mode does not interpret addresses for local delivery (`--postmaster`).
|
||||
* Polling option added (`--poll`) to rescan the spool directory periodically.
|
||||
* New special exit code (103) for the pre-processor to trigger immediate polling; 100 to 107 now reserved.
|
||||
* Orphaned zero-length content files are deleted properly if the server-side dialogue is cut short.
|
||||
* The `--interface` switch applies to the `--admin` interface too.
|
||||
* Improved internal event architecture using slot/signal design pattern, and fewer singleton classes.
|
||||
* Event notification available through the administration interface.
|
||||
* New `--hidden` switch for Windows.
|
||||
* Syslog output includes process-id.
|
||||
* Support for Sun WorkShop 5.0 added.
|
||||
* Documentation overhaul.
|
||||
|
||||
1.0.0 -> 1.0.2
|
||||
--------------
|
||||
|
||||
* Support for trusted IP addresses, allowing certain clients to avoid authentication.
|
||||
* Address verifier interface extended to include authentication information.
|
||||
* New public mail relay section added to the user guide.
|
||||
* Example verifier scripts etc. added to the reference guide.
|
||||
|
||||
1.0.0 -> 1.0.1
|
||||
--------------
|
||||
|
||||
* In proxy mode unexpected client-side disconnects and timeouts result in `.bad` files [bug-id 659039].
|
||||
* Require successful `AUTH` before `MAIL FROM` when using `--server-auth`.
|
||||
* Better word-wrap on `--help` output.
|
||||
* Use of RedHat's `functions` code, and support for `chkconfig`, added to the `init.d` script.
|
||||
* Builds with gcc3.2 (1.0.0-pl5).
|
||||
* Fix for files left as `busy` after a connection failure in proxy mode [bug-id 631032] (1.0.0-pl3/4/5).
|
||||
* Trivial documentation fixes (1.0.0-pl3).
|
||||
* Fix for the double-dot escape bug in the client protocol [bug-id 611624] (1.0.0-pl2).
|
||||
* Fix build when using gcc2.96 rather than gcc2.95 (1.0.0-pl1).
|
||||
* Fix default spool directory in example scripts (1.0.0-pl1).
|
||||
|
||||
0.9.9 -> 1.0.0
|
||||
--------------
|
||||
|
||||
* Briefer `--help` output; works with `--verbose`.
|
||||
* Option to listen on a specific network interface (`--interface`).
|
||||
* Option for an external address verifier program (`--verifier`).
|
||||
* Some Linux Standard Base stuff added to the `init.d` script.
|
||||
* Pid files world-readable and deleted on abnormal termination.
|
||||
* Compiles with gcc 3.0 and intel 6.0.
|
||||
* Autoconf tweak for MacOS X.
|
||||
* Corrected the `Received:` typo [bug-id 572236].
|
||||
* EHLO response parsing is now case-insensitive [bug-id 561522].
|
||||
* Fewer missing-secrets warnings [bug-id 564987].
|
||||
|
||||
0.9.8 -> 0.9.9
|
||||
--------------
|
||||
|
||||
* More flexible logging options (`--verbose` and `--debug` work better).
|
||||
* File Hierarchy Standard ([FHS][]) option for `configure` (`--enable-fhs`).
|
||||
* FHS-compatible RPMs.
|
||||
* Spool files writeable by pre-processor when server started as root.
|
||||
* Default directories in executables and scripts come from `configure`.
|
||||
* The `init.d` script is renamed `emailrelay` (was `emailrelay.sh`).
|
||||
* Man pages are gzipped when installed.
|
||||
* Fix for access violation under Windows NT when client disconnects.
|
||||
* Use of event log when compiled on Windows NT.
|
||||
* Fix for info-after-flush bug when using the administration interface. [rc2]
|
||||
* New `resubmit` script. [rc2]
|
||||
* Submit utility works under Windows. [rc2]
|
||||
* Improved Windows project files. [rc2]
|
||||
|
||||
0.9.7 -> 0.9.8
|
||||
--------------
|
||||
|
||||
* Fix for running pre-processor (`--filter`) as root.
|
||||
* Ignore bogus `AUTH=LOGIN` lines in EHLO response.
|
||||
* Submit utility improved to work with mutt.
|
||||
* Installation of submit man page.
|
||||
|
||||
0.9.6 -> 0.9.7
|
||||
--------------
|
||||
|
||||
* CRAM-MD5 authentication mechanism added.
|
||||
* Revoke root permissions at start up, and reclaim them when needed.
|
||||
* Allow mail pre-processing (`--filter`) when started as root.
|
||||
* Domain-override switch (`--domain`) added.
|
||||
* Non-privileged user switch (`--user`) added.
|
||||
* Better handling of NarrowPipe exception (ie. 8-bit message to 7-bit server).
|
||||
* Allow null return path in MAIL-FROM.
|
||||
* Reject recipients which look like `<user>@localhost` (as used by fetchmail for local delivery).
|
||||
* Treat recipients which look like `postmaster@localhost` or `postmaster@<fqdn>` as local postmaster.
|
||||
* Optional timestamps on log output (`--log-time`).
|
||||
* Fix EHLO to HELO fallback for 501/502 responses in client protocol.
|
||||
* Submission utility `emailrelay-submit` added.
|
||||
* HTML4.0 compliant HTML documentation, using CSS.
|
||||
|
||||
0.9.5 -> 0.9.6
|
||||
--------------
|
||||
|
||||
* SMTP AUTHentication extension \-\- LOGIN mechanism only.
|
||||
* Client-side protocol timeout.
|
||||
* Client-side connection timeout.
|
||||
* Preprocessor can cancel further message processing.
|
||||
* Client's IP address recorded in envelope files.
|
||||
* Multiple hard-coded listening addresses supported at compile-time.
|
||||
* Fix for automatic reopening of stderr stream.
|
||||
|
||||
0.9.4 -> 0.9.5
|
||||
--------------
|
||||
Windows fixes and improvements...
|
||||
|
||||
* system-tray + dialog-box user interface
|
||||
* fix for dropped connections
|
||||
* fix for content file deletion
|
||||
* fix for directory iterator
|
||||
|
||||
0.9.3 -> 0.9.4
|
||||
--------------
|
||||
|
||||
* Fixed memory leak when no `--log` switch.
|
||||
* Windows build is more `gui` and less `command-line`.
|
||||
* `Info` command added to the administration interface.
|
||||
* Doxygen files removed from binary RPM.
|
||||
|
||||
0.9.2 -> 0.9.3
|
||||
--------------
|
||||
|
||||
* Proxy mode (`--immediate` and `--as-proxy`).
|
||||
* Message pre-processing (`--filter`).
|
||||
* Message store classes better separated using abstract interfaces.
|
||||
* Improved notification script, with MIME encoding.
|
||||
* Builds with old 2.91 version of gcc.
|
||||
|
||||
0.9.1 -> 0.9.2
|
||||
--------------
|
||||
|
||||
* Better autoconf detection.
|
||||
* Workround for FreeBSD uname() feature.
|
||||
* Added missing `.sh_` files to the distribution.
|
||||
* Fixed a benign directory iterator bug.
|
||||
* Use of gcc's `exception` header.
|
||||
|
||||
0.9 -> 0.9.1
|
||||
------------
|
||||
|
||||
* Improved documentation from doxygen.
|
||||
* More complete use of namespaces.
|
||||
* Experimental compile-time support for IPv6.
|
||||
|
||||
|
||||
[FHS]: https://wiki.linuxfoundation.org/lsb/fhs
|
||||
[PAM]: https://en.wikipedia.org/wiki/Linux_PAM
|
||||
[POP]: https://en.wikipedia.org/wiki/Post_Office_Protocol
|
||||
[SMTP]: https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
|
||||
[SOCKS]: https://en.wikipedia.org/wiki/SOCKS
|
||||
[TLS]: https://en.wikipedia.org/wiki/Transport_Layer_Security
|
||||
|
400
doc/changelog.rst
Normal file
400
doc/changelog.rst
Normal file
@ -0,0 +1,400 @@
|
||||
**********************
|
||||
E-MailRelay Change Log
|
||||
**********************
|
||||
|
||||
1.9.2 -> 2.0
|
||||
============
|
||||
|
||||
* Improved IPv6 support, with IPv4 and IPv6 used independently at run-time (see *--interface*).
|
||||
* Server process is not blocked during *--filter* or *--address-verifier* execution, if multi-threaded.
|
||||
* Support for the *mbedTLS* TLS_ library as an alternative to OpenSSL (\ *configure --with-mbedtls*\ ).
|
||||
* TLS server certificates specified with new *--server-tls-certificate* option, not *--server-tls*.
|
||||
* TLS servers enable client certificate verification with *--server-tls-verify*, not *--tls-config*.
|
||||
* TLS clients can verify server certificates with *--client-tls-verify* and *--client-tls-verify-name*.
|
||||
* The *--tls-config* option works differently (see NEWS file).
|
||||
* New *--client-tls-server-name* option for server name identification (SNI).
|
||||
* New *--client-tls-required* option to force client connections to use TLS.
|
||||
* New *--server-tls-required* option to force remote SMTP_ clients to use STARTTLS.
|
||||
* New *--forward-on-disconnect* option replaces *--poll=0*.
|
||||
* The *--anonymous* option now suppresses the *Received* line, whatever the *--domain*.
|
||||
* The second field in the secrets file indicates the password encoding, not AUTH mechanism.
|
||||
* The *--verifier* option is now *--address-verifier*, with simplified command-line parameters.
|
||||
* Command-line file paths can use *@app* as a prefix to be relative to the executable directory.
|
||||
* Command-line file paths can be relative to the startup cwd even when daemonised.
|
||||
* Filter exit codes between 104 and 107 are interpreted differently (see NEWS file).
|
||||
* Message rejection reasons passed back to the submitting SMTP client are much less verbose.
|
||||
* Forwarding events are queued up if the forwarding client is still busy from last time.
|
||||
* The bind address for outgoing connections is no longer taken from first unqualified *--interface* address [bug-id #27].
|
||||
* The SMTP client protocol tries more than one authentication mechanism.
|
||||
* Some support for XOAUTH2 client-side authentication.
|
||||
* Client protocol sends QUIT with a socket shutdown().
|
||||
* The Windows commdlg list-view widget is used for the server status pages.
|
||||
* The Windows connection-lookup feature is withdrawn (\ *--peer-lookup*\ ).
|
||||
* Several build-time configure options like *--disable-pop* are withdrawn.
|
||||
* C++ 2011 is preferred, and required for multi-threading.
|
||||
* Support for very old versions of Windows is dropped.
|
||||
|
||||
1.9.1 -> 1.9.2
|
||||
==============
|
||||
|
||||
* Fixed a leak in the event-loop garbage collection.
|
||||
* A local hostname that fails to resolve is not an error.
|
||||
* A warning is emitted if there is more than one client authentication secret.
|
||||
* Multiple *--interface* options are allowed separately on the command-line.
|
||||
* Added a new *--client-interface* option.
|
||||
* The *Received* line is formatted as per RFC-3848 (\ *with ESMTPSA*\ ).
|
||||
* The LOGIN and PLAIN mechanisms in the secrets file are now equivalent.
|
||||
* The Windows service wrapper can use a configuration file to locate the startup batch file.
|
||||
* Simplified the implementation of the GUI installation program.
|
||||
* Reworded the *read error: disconnected* log message.
|
||||
* Less verbose logging of *no more messages to send*.
|
||||
* Qt4 or Qt5 selected by the *configure* script.
|
||||
* Improved the RPM spec file.
|
||||
|
||||
1.9 -> 1.9.1
|
||||
============
|
||||
|
||||
* Updated OpenSSL from 1.0.1e to 1.0.1g in the Windows build.
|
||||
|
||||
1.8.2 -> 1.9
|
||||
============
|
||||
|
||||
* Added negotiated TLS/SSL for POP_ (ie. *STLS*).
|
||||
* The first two fields in the secrets files are reordered (with backwards compatibility).
|
||||
* Added Linux PAM_ authentication (*configure --with-pam* and then *--server-auth=/pam*).
|
||||
* Optional protocol-specific *--interface* qualifiers, eg. *--interface smtp=127.0.0.1,pop=192.168.1.1*.
|
||||
* Outgoing client connection bound with the first *--interface* or *--interface client=...* address.
|
||||
* Support for SMTP-over-TLS on outgoing client connection (\ *--client-tls-connection*\ ) (cf. *STARTTLS*)
|
||||
* Support for SOCKS_ 4a on outgoing client connection, eg. *--forward-to example.com:25@127.0.0.1:9050*.
|
||||
* TLS configuration options (\ *--tls-config=...*\ ) for SSLv2/3 fallback etc.
|
||||
* No *Received* line added if *--anonymous* and an empty *--domain* name.
|
||||
* Error text for *all recipients rejected* is now more accurately *one or more recipients rejected*.
|
||||
* New behaviour for *--client-filter* exit values of 100 and over.
|
||||
* New commands on the admin interface, *failures* and *unfail-all*.
|
||||
* Shorter descriptions in the usage help unless *--verbose*.
|
||||
* New default spool directory location on windows, now under *system32*.
|
||||
* Windows project files for MSVC 2012 included.
|
||||
* Removed support for Windows NT and Windows 9x.
|
||||
* Better support for Windows Vista and Windows 7.
|
||||
* Removed Windows *--icon* option.
|
||||
* Removed *--enable-fhs* option for *configure* (see INSTALL document for equivalent usage).
|
||||
* Added *--log-file* option to redirect stderr.
|
||||
* Added Windows *--peer-lookup* option.
|
||||
* Fix for MD5 code in 64-bit builds.
|
||||
|
||||
1.8.1 -> 1.8.2
|
||||
==============
|
||||
|
||||
* Fix namespaces for gcc 3.4.
|
||||
|
||||
1.8 -> 1.8.1
|
||||
============
|
||||
|
||||
* Changed the definition of *--as-proxy* to use *--poll 0* rather than *--immediate* [bug-id 1961652].
|
||||
* Fixed stalling bug when using server-side TLS/SSL (\ *--server-tls*\ ) [bug-id 1961655].
|
||||
* Improved Debian packaging for Linux (\ *make deb*\ ).
|
||||
|
||||
1.7 -> 1.8
|
||||
==========
|
||||
|
||||
* Speed optimisations (as identified by KCachegrind/valgrind in KDevelop).
|
||||
* Build-time size optimisations (eg. *./configure --disable-exec --enable-small-exceptions ...*).
|
||||
* Build-time options to reduce runtime library dependencies (eg. *./configure --disable-dns --disable-identity*).
|
||||
* New switch to limit the size of submitted messages (\ *--size*\ ).
|
||||
* New semantics for *--poll 0*, providing a good alternative to *--immediate* when proxying.
|
||||
* SMTP client protocol emits a RSET after a rejected recipient as a workround for broken server protocols.
|
||||
* SMTP client protocol continues if the server advertises AUTH but the client has no authentication secrets.
|
||||
* When a message cannot be forwarded the offending SMTP protocol response number, if any, is put in the envelope file.
|
||||
* A warning is printed if logging is requested but both stderr and syslog are disabled.
|
||||
* A cross-compiling toolchain builder script added for running on mips-based routers (\ *extra/mips*\ ).
|
||||
* New example scripts for SMTP multicasting and editing envelope files.
|
||||
* Improved native support for Mac OS X (10.5) with graphical installation from disk image.
|
||||
* Compatibility with gcc 2.95 restored.
|
||||
|
||||
1.6 -> 1.7
|
||||
==========
|
||||
|
||||
* TLS/SSL support for SMTP using OpenSSL (*./configure --with-openssl* with *--client-tls* and *--server-tls*).
|
||||
* Authentication mechanism *PLAIN* added.
|
||||
* Some tightening up of the SMTP server protocol.
|
||||
* Windows service wrapper has an *--uninstall* option.
|
||||
* Windows installation GUI uninstalls the service before reinstalling it.
|
||||
|
||||
1.5 -> 1.6
|
||||
==========
|
||||
|
||||
* GPLv3 licence (see *http://gplv3.fsf.org*).
|
||||
* New *--prompt-timeout* switch for the timeout when waiting for the initial 220 prompt from the SMTP server.
|
||||
* Fix for flow-control assertion error when the POP server sends a very long list of spooled messages.
|
||||
* Wildcard matching for trusted IP addresses in the authentication secrets file can now use CIDR notation.
|
||||
* More fine-grained switching of effective user-id to read files and directories when running as root.
|
||||
* Fewer new client connections when proxying.
|
||||
* The server drops the connection if a remote SMTP client causes too many protocol errors.
|
||||
* More complete implementation of *--hidden* on Windows.
|
||||
* Scanner switch (\ *--scanner*\ ) replaced by a more general *--filter* and *--client-filter* switch syntax.
|
||||
* Support for address verification (\ *--verifier*\ ) over the network.
|
||||
* Better support for running as a Windows service (\ *emailrelay-service --install*\ ).
|
||||
* Utility filter program *emailrelay-filter-copy* exits with 100 if it deletes the envelope file.
|
||||
* Windows *cscript.exe* wrapper is added automatically to non-bat/exe *--filter* command-lines.
|
||||
* Installation GUI makes backups of the files it edits and preserves authentication secrets.
|
||||
* Installation GUI can install *init.d* links.
|
||||
* Experimental SpamAssassin spamc/spamd protocol support.
|
||||
* Acceptance tests added to the distribution.
|
||||
|
||||
1.4 -> 1.5
|
||||
==========
|
||||
|
||||
* New installation and configuration GUI using TrollTech Qt 4.x (\ *./configure --enable-gui*\ )
|
||||
* Default address verifier accepts all addresses as valid and never treats them as local mailboxes.
|
||||
* Fix for server exit bug when failing to send data down a newly accepted connection.
|
||||
* Spooled content files can be left in the parent directory to save diskspace when using *--pop-by-name*.
|
||||
* Client protocol improved for the case where there are no valid recipients.
|
||||
* New *--syslog* switch to override *--no-syslog*.
|
||||
* New *--filter-timeout* switch added.
|
||||
* Support for *--foo=bar* switch syntax (ie. with *=*).
|
||||
* Multiple listening interfaces allowed with a comma-separated *--interface* list.
|
||||
* New *--filter* utility called *emailrelay-filter-copy* to support *--pop-by-name*.
|
||||
* Documentation also created in docbook format (requires xmlto).
|
||||
* Windows installation document revised.
|
||||
|
||||
1.3.3 -> 1.4
|
||||
============
|
||||
|
||||
* POP3 server (enable with *--pop*, disable at build-time with *./configure --disable-pop*).
|
||||
* Fix for logging reentrancy bug (affects *./configure --enable-debug* with *--debug*).
|
||||
* Fix to ensure sockets are always non-blocking (affects *--scanner*).
|
||||
* Allow *--verifier* scripts to reject addresses with a temporary *4xx* error code.
|
||||
* Automatic re-reading of secrets files.
|
||||
* Write to the Windows event log even if no write access to the registry.
|
||||
* Modification of set-group-id policy if not started as root.
|
||||
* Better checking of spool directory access on startup.
|
||||
* New *emailrelay-submit.sh* example script for submitting messages for *--pop-by-name*.
|
||||
* The *--dont-listen* switch is now *--no-smtp*.
|
||||
* Better IPv6 support (Linux only).
|
||||
|
||||
1.3.2 -> 1.3.3
|
||||
==============
|
||||
|
||||
* No bind() for outgoing connections [bug-id 1051689].
|
||||
* Updated rpm spec file [bug-id 1224850].
|
||||
* Fix for gcc3.4 compilation error in *md5.cpp*.
|
||||
* Fix for glob()/size_t compilation warning.
|
||||
* Documentation of *auth* switches corrected.
|
||||
* State-machine template type declaration modernised, possibly breaking older compilers.
|
||||
|
||||
1.3.1 -> 1.3.2
|
||||
==============
|
||||
|
||||
* Fix for core dump when *--client-filter* pre-processing fails.
|
||||
* Revised code structure to prepare for asynchronous pre-processing.
|
||||
* Better diagnostics when pre-processor exec() fails.
|
||||
* Better cleanup of empty and orphaned files.
|
||||
|
||||
1.3 -> 1.3.1
|
||||
============
|
||||
|
||||
* Windows resource leak from CreateProcess() fixed.
|
||||
* Windows dialog box double-close fix.
|
||||
* Some documentation for the *--scanner* switch.
|
||||
* New usage patterns section in the user guide.
|
||||
|
||||
1.2 -> 1.3
|
||||
==========
|
||||
|
||||
* Client protocol waits for a greeting from the server on startup [bug-id 842156].
|
||||
* Fix for incorrect backslash normalisation on *--verifier* command-lines containing spaces [bug-id 890646].
|
||||
* Verifier programs can now summarily abort a connection using an exit value of 100.
|
||||
* New *--anonymous* switch that reduces information leakage to the SMTP client and disables *VRFY*.
|
||||
* Better validation of *MAIL-FROM* and *RCPT-TO* formatting.
|
||||
* Rewrite of low-level MD5 code.
|
||||
* Performance tuning.
|
||||
* Template *emailrelay.conf* gets installed in */etc*.
|
||||
* New switches for the *configure* script.
|
||||
* More JavaScript example scripts.
|
||||
|
||||
1.1.2 -> 1.2
|
||||
============
|
||||
|
||||
* The *--filter* and *--verifier* arguments interpreted as command-lines; spaces in executable paths now need escaping.
|
||||
* The *--interface* switch applies to outgoing connections too.
|
||||
* New *--client-filter* switch to do synchronous message processing before sending.
|
||||
* Keeps authentication after a *rset* command.
|
||||
* Fix for dangling reference bug, seen after *quit* command on Windows.
|
||||
* JavaScript examples in the documentation.
|
||||
|
||||
1.1.1 -> 1.1.2
|
||||
==============
|
||||
|
||||
* Earlier check for un-bindable ports on startup, and later fork()ing [bug-id 776972].
|
||||
* Resolved the file-descriptor kludge for *--verifier* on Windows.
|
||||
* Less strict about failing eight bit messages sent to servers with no *8BITMIME* extension.
|
||||
* Supplementary group memberships revoked at startup if root or suid.
|
||||
* Pre-processor (\ *--filter*\ ) program's standard output searched for a failure reason string.
|
||||
* Undocumented *--scanner* switch added for asynchronous processing by a separate network server.
|
||||
|
||||
1.1.0 -> 1.1.1
|
||||
==============
|
||||
|
||||
* Restored the fix for building with gcc2.96.
|
||||
* Support for MinGW builds on Windows.
|
||||
* More reasonable size of the *--help --verbose* message box on Windows.
|
||||
* Windows *--icon* switch changed from *-i* to *-c* to avoid conflicting with *--interface*.
|
||||
* Shows *next server address* correctly in the configuration report when using *--forward-to*.
|
||||
* Fix for *make install* when *man2html* is not available.
|
||||
* Updated init script.
|
||||
|
||||
1.0.2 -> 1.1.0
|
||||
==============
|
||||
|
||||
* In proxy mode unexpected client-side disconnects and timeouts do not leave *.bad* files [see also bug-id 659039].
|
||||
* By default proxy mode does not interpret addresses for local delivery (\ *--postmaster*\ ).
|
||||
* Polling option added (\ *--poll*\ ) to rescan the spool directory periodically.
|
||||
* New special exit code (103) for the pre-processor to trigger immediate polling; 100 to 107 now reserved.
|
||||
* Orphaned zero-length content files are deleted properly if the server-side dialogue is cut short.
|
||||
* The *--interface* switch applies to the *--admin* interface too.
|
||||
* Improved internal event architecture using slot/signal design pattern, and fewer singleton classes.
|
||||
* Event notification available through the administration interface.
|
||||
* New *--hidden* switch for Windows.
|
||||
* Syslog output includes process-id.
|
||||
* Support for Sun WorkShop 5.0 added.
|
||||
* Documentation overhaul.
|
||||
|
||||
1.0.0 -> 1.0.2
|
||||
==============
|
||||
|
||||
* Support for trusted IP addresses, allowing certain clients to avoid authentication.
|
||||
* Address verifier interface extended to include authentication information.
|
||||
* New public mail relay section added to the user guide.
|
||||
* Example verifier scripts etc. added to the reference guide.
|
||||
|
||||
1.0.0 -> 1.0.1
|
||||
==============
|
||||
|
||||
* In proxy mode unexpected client-side disconnects and timeouts result in *.bad* files [bug-id 659039].
|
||||
* Require successful *AUTH* before *MAIL FROM* when using *--server-auth*.
|
||||
* Better word-wrap on *--help* output.
|
||||
* Use of RedHat's *functions* code, and support for *chkconfig*, added to the *init.d* script.
|
||||
* Builds with gcc3.2 (1.0.0-pl5).
|
||||
* Fix for files left as *busy* after a connection failure in proxy mode [bug-id 631032] (1.0.0-pl3/4/5).
|
||||
* Trivial documentation fixes (1.0.0-pl3).
|
||||
* Fix for the double-dot escape bug in the client protocol [bug-id 611624] (1.0.0-pl2).
|
||||
* Fix build when using gcc2.96 rather than gcc2.95 (1.0.0-pl1).
|
||||
* Fix default spool directory in example scripts (1.0.0-pl1).
|
||||
|
||||
0.9.9 -> 1.0.0
|
||||
==============
|
||||
|
||||
* Briefer *--help* output; works with *--verbose*.
|
||||
* Option to listen on a specific network interface (\ *--interface*\ ).
|
||||
* Option for an external address verifier program (\ *--verifier*\ ).
|
||||
* Some Linux Standard Base stuff added to the *init.d* script.
|
||||
* Pid files world-readable and deleted on abnormal termination.
|
||||
* Compiles with gcc 3.0 and intel 6.0.
|
||||
* Autoconf tweak for MacOS X.
|
||||
* Corrected the *Received:* typo [bug-id 572236].
|
||||
* EHLO response parsing is now case-insensitive [bug-id 561522].
|
||||
* Fewer missing-secrets warnings [bug-id 564987].
|
||||
|
||||
0.9.8 -> 0.9.9
|
||||
==============
|
||||
|
||||
* More flexible logging options (*--verbose* and *--debug* work better).
|
||||
* File Hierarchy Standard (FHS_) option for *configure* (\ *--enable-fhs*\ ).
|
||||
* FHS-compatible RPMs.
|
||||
* Spool files writeable by pre-processor when server started as root.
|
||||
* Default directories in executables and scripts come from *configure*.
|
||||
* The *init.d* script is renamed *emailrelay* (was *emailrelay.sh*).
|
||||
* Man pages are gzipped when installed.
|
||||
* Fix for access violation under Windows NT when client disconnects.
|
||||
* Use of event log when compiled on Windows NT.
|
||||
* Fix for info-after-flush bug when using the administration interface. [rc2]
|
||||
* New *resubmit* script. [rc2]
|
||||
* Submit utility works under Windows. [rc2]
|
||||
* Improved Windows project files. [rc2]
|
||||
|
||||
0.9.7 -> 0.9.8
|
||||
==============
|
||||
|
||||
* Fix for running pre-processor (\ *--filter*\ ) as root.
|
||||
* Ignore bogus *AUTH=LOGIN* lines in EHLO response.
|
||||
* Submit utility improved to work with mutt.
|
||||
* Installation of submit man page.
|
||||
|
||||
0.9.6 -> 0.9.7
|
||||
==============
|
||||
|
||||
* CRAM-MD5 authentication mechanism added.
|
||||
* Revoke root permissions at start up, and reclaim them when needed.
|
||||
* Allow mail pre-processing (\ *--filter*\ ) when started as root.
|
||||
* Domain-override switch (\ *--domain*\ ) added.
|
||||
* Non-privileged user switch (\ *--user*\ ) added.
|
||||
* Better handling of NarrowPipe exception (ie. 8-bit message to 7-bit server).
|
||||
* Allow null return path in MAIL-FROM.
|
||||
* Reject recipients which look like *<user>@localhost* (as used by fetchmail for local delivery).
|
||||
* Treat recipients which look like *postmaster@localhost* or *postmaster@<fqdn>* as local postmaster.
|
||||
* Optional timestamps on log output (\ *--log-time*\ ).
|
||||
* Fix EHLO to HELO fallback for 501/502 responses in client protocol.
|
||||
* Submission utility *emailrelay-submit* added.
|
||||
* HTML4.0 compliant HTML documentation, using CSS.
|
||||
|
||||
0.9.5 -> 0.9.6
|
||||
==============
|
||||
|
||||
* SMTP AUTHentication extension -- LOGIN mechanism only.
|
||||
* Client-side protocol timeout.
|
||||
* Client-side connection timeout.
|
||||
* Preprocessor can cancel further message processing.
|
||||
* Client's IP address recorded in envelope files.
|
||||
* Multiple hard-coded listening addresses supported at compile-time.
|
||||
* Fix for automatic reopening of stderr stream.
|
||||
|
||||
0.9.4 -> 0.9.5
|
||||
==============
|
||||
Windows fixes and improvements...
|
||||
|
||||
* system-tray + dialog-box user interface
|
||||
* fix for dropped connections
|
||||
* fix for content file deletion
|
||||
* fix for directory iterator
|
||||
|
||||
0.9.3 -> 0.9.4
|
||||
==============
|
||||
|
||||
* Fixed memory leak when no *--log* switch.
|
||||
* Windows build is more *gui* and less *command-line*.
|
||||
* *Info* command added to the administration interface.
|
||||
* Doxygen files removed from binary RPM.
|
||||
|
||||
0.9.2 -> 0.9.3
|
||||
==============
|
||||
|
||||
* Proxy mode (*--immediate* and *--as-proxy*).
|
||||
* Message pre-processing (\ *--filter*\ ).
|
||||
* Message store classes better separated using abstract interfaces.
|
||||
* Improved notification script, with MIME encoding.
|
||||
* Builds with old 2.91 version of gcc.
|
||||
|
||||
0.9.1 -> 0.9.2
|
||||
==============
|
||||
|
||||
* Better autoconf detection.
|
||||
* Workround for FreeBSD uname() feature.
|
||||
* Added missing *.sh_* files to the distribution.
|
||||
* Fixed a benign directory iterator bug.
|
||||
* Use of gcc's *exception* header.
|
||||
|
||||
0.9 -> 0.9.1
|
||||
============
|
||||
|
||||
* Improved documentation from doxygen.
|
||||
* More complete use of namespaces.
|
||||
* Experimental compile-time support for IPv6.
|
||||
|
||||
|
||||
.. _FHS: https://wiki.linuxfoundation.org/lsb/fhs
|
||||
.. _PAM: https://en.wikipedia.org/wiki/Linux_PAM
|
||||
.. _POP: https://en.wikipedia.org/wiki/Post_Office_Protocol
|
||||
.. _SMTP: https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
|
||||
.. _SOCKS: https://en.wikipedia.org/wiki/SOCKS
|
||||
.. _TLS: https://en.wikipedia.org/wiki/Transport_Layer_Security
|
||||
|
360
doc/changelog.txt
Normal file
360
doc/changelog.txt
Normal file
@ -0,0 +1,360 @@
|
||||
E-MailRelay Change Log
|
||||
======================
|
||||
|
||||
1.9.2 -> 2.0
|
||||
------------
|
||||
* Improved IPv6 support, with IPv4 and IPv6 used independently at run-time (see "--interface").
|
||||
* Server process is not blocked during "--filter" or "--address-verifier" execution, if multi-threaded.
|
||||
* Support for the "mbedTLS" TLS library as an alternative to OpenSSL ("configure --with-mbedtls").
|
||||
* TLS server certificates specified with new "--server-tls-certificate" option, not "--server-tls".
|
||||
* TLS servers enable client certificate verification with "--server-tls-verify", not "--tls-config".
|
||||
* TLS clients can verify server certificates with "--client-tls-verify" and "--client-tls-verify-name".
|
||||
* The "--tls-config" option works differently (see NEWS file).
|
||||
* New "--client-tls-server-name" option for server name identification (SNI).
|
||||
* New "--client-tls-required" option to force client connections to use TLS.
|
||||
* New "--server-tls-required" option to force remote SMTP clients to use STARTTLS.
|
||||
* New "--forward-on-disconnect" option replaces "--poll=0".
|
||||
* The "--anonymous" option now suppresses the "Received" line, whatever the "--domain".
|
||||
* The second field in the secrets file indicates the password encoding, not AUTH mechanism.
|
||||
* The "--verifier" option is now "--address-verifier", with simplified command-line parameters.
|
||||
* Command-line file paths can use "@app" as a prefix to be relative to the executable directory.
|
||||
* Command-line file paths can be relative to the startup cwd even when daemonised.
|
||||
* Filter exit codes between 104 and 107 are interpreted differently (see NEWS file).
|
||||
* Message rejection reasons passed back to the submitting SMTP client are much less verbose.
|
||||
* Forwarding events are queued up if the forwarding client is still busy from last time.
|
||||
* The bind address for outgoing connections is no longer taken from first unqualified "--interface" address [bug-id #27].
|
||||
* The SMTP client protocol tries more than one authentication mechanism.
|
||||
* Some support for XOAUTH2 client-side authentication.
|
||||
* Client protocol sends QUIT with a socket shutdown().
|
||||
* The Windows commdlg list-view widget is used for the server status pages.
|
||||
* The Windows connection-lookup feature is withdrawn ("--peer-lookup").
|
||||
* Several build-time configure options like "--disable-pop" are withdrawn.
|
||||
* C++ 2011 is preferred, and required for multi-threading.
|
||||
* Support for very old versions of Windows is dropped.
|
||||
|
||||
1.9.1 -> 1.9.2
|
||||
--------------
|
||||
* Fixed a leak in the event-loop garbage collection.
|
||||
* A local hostname that fails to resolve is not an error.
|
||||
* A warning is emitted if there is more than one client authentication secret.
|
||||
* Multiple "--interface" options are allowed separately on the command-line.
|
||||
* Added a new "--client-interface" option.
|
||||
* The "Received" line is formatted as per RFC-3848 ("with ESMTPSA").
|
||||
* The LOGIN and PLAIN mechanisms in the secrets file are now equivalent.
|
||||
* The Windows service wrapper can use a configuration file to locate the startup batch file.
|
||||
* Simplified the implementation of the GUI installation program.
|
||||
* Reworded the "read error: disconnected" log message.
|
||||
* Less verbose logging of "no more messages to send".
|
||||
* Qt4 or Qt5 selected by the "configure" script.
|
||||
* Improved the RPM spec file.
|
||||
|
||||
1.9 -> 1.9.1
|
||||
------------
|
||||
* Updated OpenSSL from 1.0.1e to 1.0.1g in the Windows build.
|
||||
|
||||
1.8.2 -> 1.9
|
||||
------------
|
||||
* Added negotiated TLS/SSL for POP (ie. "STLS").
|
||||
* The first two fields in the secrets files are reordered (with backwards compatibility).
|
||||
* Added Linux PAM authentication ("configure --with-pam" and then "--server-auth=/pam").
|
||||
* Optional protocol-specific "--interface" qualifiers, eg. "--interface smtp=127.0.0.1,pop=192.168.1.1".
|
||||
* Outgoing client connection bound with the first "--interface" or "--interface client=..." address.
|
||||
* Support for SMTP-over-TLS on outgoing client connection ("--client-tls-connection") (cf. "STARTTLS")
|
||||
* Support for SOCKS 4a on outgoing client connection, eg. "--forward-to example.com:25@127.0.0.1:9050".
|
||||
* TLS configuration options ("--tls-config=...") for SSLv2/3 fallback etc.
|
||||
* No "Received" line added if "--anonymous" and an empty "--domain" name.
|
||||
* Error text for "all recipients rejected" is now more accurately "one or more recipients rejected".
|
||||
* New behaviour for "--client-filter" exit values of 100 and over.
|
||||
* New commands on the admin interface, "failures" and "unfail-all".
|
||||
* Shorter descriptions in the usage help unless "--verbose".
|
||||
* New default spool directory location on windows, now under "system32".
|
||||
* Windows project files for MSVC 2012 included.
|
||||
* Removed support for Windows NT and Windows 9x.
|
||||
* Better support for Windows Vista and Windows 7.
|
||||
* Removed Windows "--icon" option.
|
||||
* Removed "--enable-fhs" option for "configure" (see INSTALL document for equivalent usage).
|
||||
* Added "--log-file" option to redirect stderr.
|
||||
* Added Windows "--peer-lookup" option.
|
||||
* Fix for MD5 code in 64-bit builds.
|
||||
|
||||
1.8.1 -> 1.8.2
|
||||
--------------
|
||||
* Fix namespaces for gcc 3.4.
|
||||
|
||||
1.8 -> 1.8.1
|
||||
------------
|
||||
* Changed the definition of "--as-proxy" to use "--poll 0" rather than "--immediate" [bug-id 1961652].
|
||||
* Fixed stalling bug when using server-side TLS/SSL ("--server-tls") [bug-id 1961655].
|
||||
* Improved Debian packaging for Linux ("make deb").
|
||||
|
||||
1.7 -> 1.8
|
||||
----------
|
||||
* Speed optimisations (as identified by KCachegrind/valgrind in KDevelop).
|
||||
* Build-time size optimisations (eg. "./configure --disable-exec --enable-small-exceptions ...").
|
||||
* Build-time options to reduce runtime library dependencies (eg. "./configure --disable-dns --disable-identity").
|
||||
* New switch to limit the size of submitted messages ("--size").
|
||||
* New semantics for "--poll 0", providing a good alternative to "--immediate" when proxying.
|
||||
* SMTP client protocol emits a RSET after a rejected recipient as a workround for broken server protocols.
|
||||
* SMTP client protocol continues if the server advertises AUTH but the client has no authentication secrets.
|
||||
* When a message cannot be forwarded the offending SMTP protocol response number, if any, is put in the envelope file.
|
||||
* A warning is printed if logging is requested but both stderr and syslog are disabled.
|
||||
* A cross-compiling toolchain builder script added for running on mips-based routers ("extra/mips").
|
||||
* New example scripts for SMTP multicasting and editing envelope files.
|
||||
* Improved native support for Mac OS X (10.5) with graphical installation from disk image.
|
||||
* Compatibility with gcc 2.95 restored.
|
||||
|
||||
1.6 -> 1.7
|
||||
----------
|
||||
* TLS/SSL support for SMTP using OpenSSL ("./configure --with-openssl" with "--client-tls" and "--server-tls").
|
||||
* Authentication mechanism "PLAIN" added.
|
||||
* Some tightening up of the SMTP server protocol.
|
||||
* Windows service wrapper has an "--uninstall" option.
|
||||
* Windows installation GUI uninstalls the service before reinstalling it.
|
||||
|
||||
1.5 -> 1.6
|
||||
----------
|
||||
* GPLv3 licence (see "http://gplv3.fsf.org").
|
||||
* New "--prompt-timeout" switch for the timeout when waiting for the initial 220 prompt from the SMTP server.
|
||||
* Fix for flow-control assertion error when the POP server sends a very long list of spooled messages.
|
||||
* Wildcard matching for trusted IP addresses in the authentication secrets file can now use CIDR notation.
|
||||
* More fine-grained switching of effective user-id to read files and directories when running as root.
|
||||
* Fewer new client connections when proxying.
|
||||
* The server drops the connection if a remote SMTP client causes too many protocol errors.
|
||||
* More complete implementation of "--hidden" on Windows.
|
||||
* Scanner switch ("--scanner") replaced by a more general "--filter" and "--client-filter" switch syntax.
|
||||
* Support for address verification ("--verifier") over the network.
|
||||
* Better support for running as a Windows service ("emailrelay-service --install").
|
||||
* Utility filter program "emailrelay-filter-copy" exits with 100 if it deletes the envelope file.
|
||||
* Windows "cscript.exe" wrapper is added automatically to non-bat/exe "--filter" command-lines.
|
||||
* Installation GUI makes backups of the files it edits and preserves authentication secrets.
|
||||
* Installation GUI can install "init.d" links.
|
||||
* Experimental SpamAssassin spamc/spamd protocol support.
|
||||
* Acceptance tests added to the distribution.
|
||||
|
||||
1.4 -> 1.5
|
||||
----------
|
||||
* New installation and configuration GUI using TrollTech Qt 4.x ("./configure --enable-gui")
|
||||
* Default address verifier accepts all addresses as valid and never treats them as local mailboxes.
|
||||
* Fix for server exit bug when failing to send data down a newly accepted connection.
|
||||
* Spooled content files can be left in the parent directory to save diskspace when using "--pop-by-name".
|
||||
* Client protocol improved for the case where there are no valid recipients.
|
||||
* New "--syslog" switch to override "--no-syslog".
|
||||
* New "--filter-timeout" switch added.
|
||||
* Support for "--foo=bar" switch syntax (ie. with "=").
|
||||
* Multiple listening interfaces allowed with a comma-separated "--interface" list.
|
||||
* New "--filter" utility called "emailrelay-filter-copy" to support "--pop-by-name".
|
||||
* Documentation also created in docbook format (requires xmlto).
|
||||
* Windows installation document revised.
|
||||
|
||||
1.3.3 -> 1.4
|
||||
------------
|
||||
* POP3 server (enable with "--pop", disable at build-time with "./configure --disable-pop").
|
||||
* Fix for logging reentrancy bug (affects "./configure --enable-debug" with "--debug").
|
||||
* Fix to ensure sockets are always non-blocking (affects "--scanner").
|
||||
* Allow "--verifier" scripts to reject addresses with a temporary "4xx" error code.
|
||||
* Automatic re-reading of secrets files.
|
||||
* Write to the Windows event log even if no write access to the registry.
|
||||
* Modification of set-group-id policy if not started as root.
|
||||
* Better checking of spool directory access on startup.
|
||||
* New "emailrelay-submit.sh" example script for submitting messages for "--pop-by-name".
|
||||
* The "--dont-listen" switch is now "--no-smtp".
|
||||
* Better IPv6 support (Linux only).
|
||||
|
||||
1.3.2 -> 1.3.3
|
||||
--------------
|
||||
* No bind() for outgoing connections [bug-id 1051689].
|
||||
* Updated rpm spec file [bug-id 1224850].
|
||||
* Fix for gcc3.4 compilation error in "md5.cpp".
|
||||
* Fix for glob()/size_t compilation warning.
|
||||
* Documentation of "auth" switches corrected.
|
||||
* State-machine template type declaration modernised, possibly breaking older compilers.
|
||||
|
||||
1.3.1 -> 1.3.2
|
||||
--------------
|
||||
* Fix for core dump when "--client-filter" pre-processing fails.
|
||||
* Revised code structure to prepare for asynchronous pre-processing.
|
||||
* Better diagnostics when pre-processor exec() fails.
|
||||
* Better cleanup of empty and orphaned files.
|
||||
|
||||
1.3 -> 1.3.1
|
||||
------------
|
||||
* Windows resource leak from CreateProcess() fixed.
|
||||
* Windows dialog box double-close fix.
|
||||
* Some documentation for the "--scanner" switch.
|
||||
* New usage patterns section in the user guide.
|
||||
|
||||
1.2 -> 1.3
|
||||
----------
|
||||
* Client protocol waits for a greeting from the server on startup [bug-id 842156].
|
||||
* Fix for incorrect backslash normalisation on "--verifier" command-lines containing spaces [bug-id 890646].
|
||||
* Verifier programs can now summarily abort a connection using an exit value of 100.
|
||||
* New "--anonymous" switch that reduces information leakage to the SMTP client and disables "VRFY".
|
||||
* Better validation of "MAIL-FROM" and "RCPT-TO" formatting.
|
||||
* Rewrite of low-level MD5 code.
|
||||
* Performance tuning.
|
||||
* Template "emailrelay.conf" gets installed in "/etc".
|
||||
* New switches for the "configure" script.
|
||||
* More JavaScript example scripts.
|
||||
|
||||
1.1.2 -> 1.2
|
||||
------------
|
||||
* The "--filter" and "--verifier" arguments interpreted as command-lines; spaces in executable paths now need escaping.
|
||||
* The "--interface" switch applies to outgoing connections too.
|
||||
* New "--client-filter" switch to do synchronous message processing before sending.
|
||||
* Keeps authentication after a "rset" command.
|
||||
* Fix for dangling reference bug, seen after "quit" command on Windows.
|
||||
* JavaScript examples in the documentation.
|
||||
|
||||
1.1.1 -> 1.1.2
|
||||
--------------
|
||||
* Earlier check for un-bindable ports on startup, and later fork()ing [bug-id 776972].
|
||||
* Resolved the file-descriptor kludge for "--verifier" on Windows.
|
||||
* Less strict about failing eight bit messages sent to servers with no "8BITMIME" extension.
|
||||
* Supplementary group memberships revoked at startup if root or suid.
|
||||
* Pre-processor ("--filter") program's standard output searched for a failure reason string.
|
||||
* Undocumented "--scanner" switch added for asynchronous processing by a separate network server.
|
||||
|
||||
1.1.0 -> 1.1.1
|
||||
--------------
|
||||
* Restored the fix for building with gcc2.96.
|
||||
* Support for MinGW builds on Windows.
|
||||
* More reasonable size of the "--help --verbose" message box on Windows.
|
||||
* Windows "--icon" switch changed from "-i" to "-c" to avoid conflicting with "--interface".
|
||||
* Shows "next server address" correctly in the configuration report when using "--forward-to".
|
||||
* Fix for "make install" when "man2html" is not available.
|
||||
* Updated init script.
|
||||
|
||||
1.0.2 -> 1.1.0
|
||||
--------------
|
||||
* In proxy mode unexpected client-side disconnects and timeouts do not leave ".bad" files [see also bug-id 659039].
|
||||
* By default proxy mode does not interpret addresses for local delivery ("--postmaster").
|
||||
* Polling option added ("--poll") to rescan the spool directory periodically.
|
||||
* New special exit code (103) for the pre-processor to trigger immediate polling; 100 to 107 now reserved.
|
||||
* Orphaned zero-length content files are deleted properly if the server-side dialogue is cut short.
|
||||
* The "--interface" switch applies to the "--admin" interface too.
|
||||
* Improved internal event architecture using slot/signal design pattern, and fewer singleton classes.
|
||||
* Event notification available through the administration interface.
|
||||
* New "--hidden" switch for Windows.
|
||||
* Syslog output includes process-id.
|
||||
* Support for Sun WorkShop 5.0 added.
|
||||
* Documentation overhaul.
|
||||
|
||||
1.0.0 -> 1.0.2
|
||||
--------------
|
||||
* Support for trusted IP addresses, allowing certain clients to avoid authentication.
|
||||
* Address verifier interface extended to include authentication information.
|
||||
* New public mail relay section added to the user guide.
|
||||
* Example verifier scripts etc. added to the reference guide.
|
||||
|
||||
1.0.0 -> 1.0.1
|
||||
--------------
|
||||
* In proxy mode unexpected client-side disconnects and timeouts result in ".bad" files [bug-id 659039].
|
||||
* Require successful "AUTH" before "MAIL FROM" when using "--server-auth".
|
||||
* Better word-wrap on "--help" output.
|
||||
* Use of RedHat's "functions" code, and support for "chkconfig", added to the "init.d" script.
|
||||
* Builds with gcc3.2 (1.0.0-pl5).
|
||||
* Fix for files left as "busy" after a connection failure in proxy mode [bug-id 631032] (1.0.0-pl3/4/5).
|
||||
* Trivial documentation fixes (1.0.0-pl3).
|
||||
* Fix for the double-dot escape bug in the client protocol [bug-id 611624] (1.0.0-pl2).
|
||||
* Fix build when using gcc2.96 rather than gcc2.95 (1.0.0-pl1).
|
||||
* Fix default spool directory in example scripts (1.0.0-pl1).
|
||||
|
||||
0.9.9 -> 1.0.0
|
||||
--------------
|
||||
* Briefer "--help" output; works with "--verbose".
|
||||
* Option to listen on a specific network interface ("--interface").
|
||||
* Option for an external address verifier program ("--verifier").
|
||||
* Some Linux Standard Base stuff added to the "init.d" script.
|
||||
* Pid files world-readable and deleted on abnormal termination.
|
||||
* Compiles with gcc 3.0 and intel 6.0.
|
||||
* Autoconf tweak for MacOS X.
|
||||
* Corrected the "Received:" typo [bug-id 572236].
|
||||
* EHLO response parsing is now case-insensitive [bug-id 561522].
|
||||
* Fewer missing-secrets warnings [bug-id 564987].
|
||||
|
||||
0.9.8 -> 0.9.9
|
||||
--------------
|
||||
* More flexible logging options ("--verbose" and "--debug" work better).
|
||||
* File Hierarchy Standard (FHS) option for "configure" ("--enable-fhs").
|
||||
* FHS-compatible RPMs.
|
||||
* Spool files writeable by pre-processor when server started as root.
|
||||
* Default directories in executables and scripts come from "configure".
|
||||
* The "init.d" script is renamed "emailrelay" (was "emailrelay.sh").
|
||||
* Man pages are gzipped when installed.
|
||||
* Fix for access violation under Windows NT when client disconnects.
|
||||
* Use of event log when compiled on Windows NT.
|
||||
* Fix for info-after-flush bug when using the administration interface. [rc2]
|
||||
* New "resubmit" script. [rc2]
|
||||
* Submit utility works under Windows. [rc2]
|
||||
* Improved Windows project files. [rc2]
|
||||
|
||||
0.9.7 -> 0.9.8
|
||||
--------------
|
||||
* Fix for running pre-processor ("--filter") as root.
|
||||
* Ignore bogus "AUTH=LOGIN" lines in EHLO response.
|
||||
* Submit utility improved to work with mutt.
|
||||
* Installation of submit man page.
|
||||
|
||||
0.9.6 -> 0.9.7
|
||||
--------------
|
||||
* CRAM-MD5 authentication mechanism added.
|
||||
* Revoke root permissions at start up, and reclaim them when needed.
|
||||
* Allow mail pre-processing ("--filter") when started as root.
|
||||
* Domain-override switch ("--domain") added.
|
||||
* Non-privileged user switch ("--user") added.
|
||||
* Better handling of NarrowPipe exception (ie. 8-bit message to 7-bit server).
|
||||
* Allow null return path in MAIL-FROM.
|
||||
* Reject recipients which look like "<user>@localhost" (as used by fetchmail for local delivery).
|
||||
* Treat recipients which look like "postmaster@localhost" or "postmaster@<fqdn>" as local postmaster.
|
||||
* Optional timestamps on log output ("--log-time").
|
||||
* Fix EHLO to HELO fallback for 501/502 responses in client protocol.
|
||||
* Submission utility "emailrelay-submit" added.
|
||||
* HTML4.0 compliant HTML documentation, using CSS.
|
||||
|
||||
0.9.5 -> 0.9.6
|
||||
--------------
|
||||
* SMTP AUTHentication extension -- LOGIN mechanism only.
|
||||
* Client-side protocol timeout.
|
||||
* Client-side connection timeout.
|
||||
* Preprocessor can cancel further message processing.
|
||||
* Client's IP address recorded in envelope files.
|
||||
* Multiple hard-coded listening addresses supported at compile-time.
|
||||
* Fix for automatic reopening of stderr stream.
|
||||
|
||||
0.9.4 -> 0.9.5
|
||||
--------------
|
||||
Windows fixes and improvements...
|
||||
* system-tray + dialog-box user interface
|
||||
* fix for dropped connections
|
||||
* fix for content file deletion
|
||||
* fix for directory iterator
|
||||
|
||||
0.9.3 -> 0.9.4
|
||||
--------------
|
||||
* Fixed memory leak when no "--log" switch.
|
||||
* Windows build is more "gui" and less "command-line".
|
||||
* "Info" command added to the administration interface.
|
||||
* Doxygen files removed from binary RPM.
|
||||
|
||||
0.9.2 -> 0.9.3
|
||||
--------------
|
||||
* Proxy mode ("--immediate" and "--as-proxy").
|
||||
* Message pre-processing ("--filter").
|
||||
* Message store classes better separated using abstract interfaces.
|
||||
* Improved notification script, with MIME encoding.
|
||||
* Builds with old 2.91 version of gcc.
|
||||
|
||||
0.9.1 -> 0.9.2
|
||||
--------------
|
||||
* Better autoconf detection.
|
||||
* Workround for FreeBSD uname() feature.
|
||||
* Added missing ".sh_" files to the distribution.
|
||||
* Fixed a benign directory iterator bug.
|
||||
* Use of gcc's "exception" header.
|
||||
|
||||
0.9 -> 0.9.1
|
||||
------------
|
||||
* Improved documentation from doxygen.
|
||||
* More complete use of namespaces.
|
||||
* Experimental compile-time support for IPv6.
|
||||
|
30
doc/conf.py
Normal file
30
doc/conf.py
Normal file
@ -0,0 +1,30 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
import os
|
||||
|
||||
extensions = []
|
||||
templates_path = ['_templates']
|
||||
source_suffix = '.rst'
|
||||
master_doc = 'index'
|
||||
project = u'E-MailRelay'
|
||||
copyright = u'2018, Graeme Walker'
|
||||
author = u'Graeme Walker'
|
||||
version = u'2.0'
|
||||
release = u'2.0'
|
||||
language = None
|
||||
today_fmt = '%Y-%m-%d'
|
||||
exclude_patterns = []
|
||||
pygments_style = 'sphinx'
|
||||
todo_include_todos = False
|
||||
html_theme = 'alabaster'
|
||||
#html_logo = None
|
||||
#html_favicon = None
|
||||
html_static_path = ['_static']
|
||||
html_last_updated_fmt = ''
|
||||
html_show_sphinx = True
|
||||
html_show_copyright = True
|
||||
htmlhelp_basename = 'emailrelaydoc'
|
||||
latex_elements = {}
|
||||
latex_documents = []
|
||||
man_pages = []
|
||||
texinfo_documents = []
|
316
doc/developer.html
Normal file
316
doc/developer.html
Normal file
@ -0,0 +1,316 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>E-MailRelay Developer Guide</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<link rel="stylesheet" href="emailrelay.css" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<!-- index:0::::E-MailRelay Developer Guide -->
|
||||
<div class="div-main">
|
||||
<h1><a class="a-header" name="H_1">E-MailRelay Developer Guide</a></h1> <!-- index:1:H:1::E-MailRelay Developer Guide -->
|
||||
<h2><a class="a-header" name="SH_1_1">Principles</a></h2> <!-- index:2:SH:1:1:Principles -->
|
||||
<p>
|
||||
The main principles in the design of E-MailRelay can be summarised as:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Minimal third-party dependencies</li>
|
||||
<li>Windows/Unix portability without #ifdefs</li>
|
||||
<li>Event-driven, non-blocking, single-threaded networking code</li>
|
||||
<li>Functionality without imposing policy</li>
|
||||
</ul>
|
||||
<h2><a class="a-header" name="SH_1_2">Dependencies</a></h2> <!-- index:2:SH:1:2:Dependencies -->
|
||||
<p>
|
||||
E-MailRelay started life at a time when Linux had no decent package manager and
|
||||
Windows was in the grip of DLL hell. As a result, a key principle is that it
|
||||
has no dependencies other than a decent C++ runtime. Since that time OpenSSL
|
||||
has been introduced as a dependency to support TLS encryption, and the optional
|
||||
configuration and installation GUI has been developed using the Qt toolkit.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
In those early years multi-threading support in C++ libraries was poor, so up
|
||||
until version 2.0 the code was single-threaded throughout.
|
||||
</p>
|
||||
<h2><a class="a-header" name="SH_1_3">Portability</a></h2> <!-- index:2:SH:1:3:Portability -->
|
||||
<p>
|
||||
The E-MailRelay code is mostly written in C++-1998, but using some features of
|
||||
C++-2011. A C++-1998 compiler can be used, but multi-threading will be disabled.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The header files <em class="quote">gdef.h</em> in <em class="quote">src/glib</em> is used to fix up some compiler
|
||||
portability issues such as missing standard types, non-standard system headers
|
||||
etc. Conditional compilation directives (<em class="quote">#ifdef</em> etc.) are largely confined
|
||||
this file in order to improve readability.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Windows/Unix portability is generally addressed by providing a common class
|
||||
declaration with two implementations. The implementations are put into separate
|
||||
source files with a <em class="quote">_unix</em> or <em class="quote">_win32</em> suffix, and if necessary a 'pimple' (or
|
||||
'Bridge') pattern is used to keep the o/s-specific details out of the header.
|
||||
If only small parts of the implementation are o/s-specific then there can be
|
||||
three source files per header. For example, <em class="quote">gsocket.cpp</em>, <em class="quote">gsocket_win32.cpp</em>
|
||||
and <em class="quote">gsocket_unix.cpp</em> in the <em class="quote">src/gnet</em> directory.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Underscores in source file names are used exclusively to indicate build-time
|
||||
alternatives.
|
||||
</p>
|
||||
<h2><a class="a-header" name="SH_1_4">Event model</a></h2> <!-- index:2:SH:1:4:Event model -->
|
||||
<p>
|
||||
The E-MailRelay server uses non-blocking socket i/o, with a select() event loop.
|
||||
This event model means that the server can handle multiple network connections
|
||||
simultaneously from a single thread, and even if multi-threading is disabled at
|
||||
build-time the only blocking occurs when external programs are executed (see
|
||||
<em class="quote">--filter</em> and <em class="quote">--address-verifier</em>).
|
||||
</p>
|
||||
|
||||
<p>
|
||||
This event model can make the code more complicated than the equivalent
|
||||
multi-threaded approach since (for example) it is not possible to wait for a
|
||||
complete line of input to be received from a remote SMTP client because there
|
||||
might be other connections that need servicing half way through.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The advantages of a non-blocking event model are discussed in the well-known
|
||||
<a class="a-href" href="http://www.kegel.com/c10k.html">C10K Problem</a> document.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
At higher levels the C++ slot/signal design pattern is used to propagate events
|
||||
between objects (not to be confused with operating system signals). The
|
||||
slot/signal implementation has been simplified compared to Qt or boost by not
|
||||
supporting signal multicasting, so each signal connects to no more than one
|
||||
slot.
|
||||
</p>
|
||||
<h2><a class="a-header" name="SH_1_5">Module structure</a></h2> <!-- index:2:SH:1:5:Module structure -->
|
||||
<p>
|
||||
The main C++ libraries in the E-MailRelay code base are as follows:
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><em class="quote">glib</em></dt>
|
||||
<dd>
|
||||
Low-level classes for file-system abstraction, date and time representation,
|
||||
string utility functions, logging, command line parsing etc.
|
||||
</dd>
|
||||
<dt><em class="quote">gssl</em></dt>
|
||||
<dd>
|
||||
A thin layer over the third-party TLS libraries.
|
||||
</dd>
|
||||
<dt><em class="quote">gnet</em></dt>
|
||||
<dd>
|
||||
Network and event-loop classes.
|
||||
</dd>
|
||||
<dt><em class="quote">gauth</em></dt>
|
||||
<dd>
|
||||
Implements various authentication mechanisms.
|
||||
</dd>
|
||||
<dt><em class="quote">gsmtp</em></dt>
|
||||
<dd>
|
||||
SMTP protocol and message-store classes.
|
||||
</dd>
|
||||
<dt><em class="quote">gpop</em></dt>
|
||||
<dd>
|
||||
POP3 protocol classes.
|
||||
</dd>
|
||||
</dl>
|
||||
<p>
|
||||
All of these libraries are portable between Unix-like systems and Windows.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Under Windows there is an additional library <em class="quote">win32</em> for the user interface.
|
||||
</p>
|
||||
<h2><a class="a-header" name="SH_1_6">SMTP class structure</a></h2> <!-- index:2:SH:1:6:SMTP class structure -->
|
||||
<p>
|
||||
The message-store functionality uses three abstract interfaces: <em class="quote">MessageStore</em>,
|
||||
<em class="quote">NewMessage</em> and <em class="quote">StoredMessage</em>. The <em class="quote">NewMessage</em> interface is used to create
|
||||
messages within the store, and the <em class="quote">StoredMessage</em> interface is used for
|
||||
reading and extracting messages from the store. The concrete implementation
|
||||
classes based on these interfaces are respectively <em class="quote">FileStore</em>, <em class="quote">NewFile</em> and
|
||||
<em class="quote">StoredFile</em>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Protocol classes such as <em class="quote">GSmtp::ServerProtocol</em> receive network and timer
|
||||
events from their container and use an abstract <em class="quote">Sender</em> interface to send
|
||||
network data. This means that the protocols can be independent of the network
|
||||
and event loop framework.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The interaction between the SMTP server protocol class and the message store is
|
||||
mediated by the <em class="quote">ProtocolMessage</em> interface. Two main implementations of this
|
||||
interface are available: one for normal spooling (<em class="quote">ProtocolMessageStore</em>), and
|
||||
another for immediate forwarding (<em class="quote">ProtocolMessageForward</em>). The <em class="quote">Decorator</em>
|
||||
pattern is used whereby the forwarding class uses an instance of the storage
|
||||
class to do the message storing and filtering, while adding in an instance
|
||||
of the <em class="quote">GSmtp::Client</em> class to do the forwarding.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Message filtering (<em class="quote">--filter</em>) is implemented via an abstract <em class="quote">Filter</em>
|
||||
interface. Concrete implementations are provided for doing nothing, running an
|
||||
external executable program and talking to an external network server.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The protocol, processor and message-store interfaces are brought together by the
|
||||
high-level <em class="quote">GSmtp::Server</em> and <em class="quote">GSmtp::Client</em> classes. Dependency injection is
|
||||
used to create the concrete instances of the <em class="quote">ProtocolMessage</em> and <em class="quote">Filter</em>
|
||||
interfaces.
|
||||
</p>
|
||||
<h2><a class="a-header" name="SH_1_7">Event handling and exceptions</a></h2> <!-- index:2:SH:1:7:Event handling and exceptions -->
|
||||
<p>
|
||||
The use of non-blocking i/o in the network library means that most processing
|
||||
operates within the context of an i/o event or timeout callback, so the top
|
||||
level of the call stack is nearly always the event loop code. This can make
|
||||
catching C++ exceptions a bit awkward compared to a multi-threaded approach
|
||||
because it is not possible to put a single catch block around a particular
|
||||
high-level feature.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The event loop delivers asynchronous socket events to the <em class="quote">EventHandler</em>
|
||||
interface, timer events to the <em class="quote">TimerBase</em> interface, and 'future' events to the
|
||||
<em class="quote">FutureEventCallback</em> interface. If any of the these event handlers throws an
|
||||
exception then the event loop will catch it and deliver it back to an exception
|
||||
handler through the <em class="quote">onException()</em> method of an associated <em class="quote">ExceptionHandler</em>
|
||||
interface. If an exception is thrown out of _this_ callback then the event loop
|
||||
code lets it propagate back to <em class="quote">main()</em>, typically terminating the program.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Every pointer to an event callback interface is associated with an
|
||||
<em class="quote">ExceptionHandler</em>. The default <em class="quote">ExceptionHandler</em> is the <em class="quote">EventLoop</em>
|
||||
singleton, and a call to its <em class="quote">onException()</em> method terminates the event loop.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
This leads to a programming model where key objects are instantiated on the
|
||||
heap and these objects delete themselves when they receive certain events from
|
||||
the event loop. In the <em class="quote">GNet</em> library it is the <em class="quote">ServerPeer</em> and <em class="quote">HeapClient</em>
|
||||
classes that do this lifetime management; instances of these classes delete
|
||||
themselves when the associated network connection goes away and they
|
||||
implement the <em class="quote">ExceptionHandler</em> interface so that they schedule their own
|
||||
deletion when an exception is thrown.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Special smart pointers are sometimes used for these self-deleting classes; the
|
||||
smart pointer does not delete the contained object when it is reset, it just
|
||||
tells the object to delete itself with a zero-length timer and then releases it
|
||||
for garbage collection.
|
||||
</p>
|
||||
<h2><a class="a-header" name="SH_1_8">Multi-threading</a></h2> <!-- index:2:SH:1:8:Multi-threading -->
|
||||
<p>
|
||||
Multi-threading can be used as a build-time option to make DNS lookup and the
|
||||
execution of helper programs asynchronous; if std::thread is available then it
|
||||
is used in a future/promise pattern to wrap up <em class="quote">getaddrinfo()</em> and <em class="quote">waitpid()</em>
|
||||
system calls. The shared state comprises only the parameters and return results
|
||||
from these system calls, and synchronisation back to the main thread uses the
|
||||
event loop (see <em class="quote">GNet::FutureEvent</em>).
|
||||
</p>
|
||||
<h2><a class="a-header" name="SH_1_9">E-MailRelay GUI</a></h2> <!-- index:2:SH:1:9:E-MailRelay GUI -->
|
||||
<p>
|
||||
The optional GUI program <em class="quote">emailrelay-gui</em> uses the Qt toolkit for its user
|
||||
interface components. The GUI can run as an installer or as a configuration
|
||||
helper, depending on whether it can find an installation <em class="quote">payload</em>. Refer to
|
||||
the comments in <em class="quote">src/gui/guimain.cpp</em> for more details.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The user interface runs as a stack of dialog-box pages with forward and back
|
||||
buttons at the bottom. Once the stack has been completed by the user then each
|
||||
page is asked to dump out its state as a set of key-value pairs (see
|
||||
<em class="quote">src/gui/pages.cpp</em>). These key-value pairs are processed by an installer class
|
||||
into a list of action objects (in the <em class="quote">Command</em> design pattern) and then the
|
||||
action objects are run in turn. In order to display the progress of the
|
||||
installation each action object is run within a timer callback so that the Qt
|
||||
framework gets a chance to update the display between each one.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
During development the user interface pages and the installer can be tested
|
||||
separately since the interface between them is a simple text stream containing
|
||||
key-value pairs.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
When run in configure mode the GUI normally ends up simply editing the
|
||||
<em class="quote">emailrelay.conf</em> file (or <em class="quote">emailrelay-start.bat</em> on Windows) and/or the
|
||||
<em class="quote">emailrelay.auth</em> secrets file.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
When run in install mode the GUI expects to unpack all the E-MailRelay files
|
||||
from the payload into target directories. (The payload used to be a single
|
||||
archive file appended to the executable, but it is now simple directory
|
||||
tree that lives alongside the GUI exectuable or inside the Mac application
|
||||
bundle.)
|
||||
</p>
|
||||
<h2><a class="a-header" name="SH_1_10">Windows packaging</a></h2> <!-- index:2:SH:1:10:Windows packaging -->
|
||||
<p>
|
||||
On Windows E-MailRelay is packaged as a zip file containing the executables
|
||||
(including the emailrelay GUI as <em class="quote">emailrelay-setup.exe</em>), documentation, and a
|
||||
<em class="quote">payload</em> directory tree. The payload contains many of the same files all over
|
||||
again, and while this duplication is not ideal it is at least straightforward.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The Qt tool <em class="quote">windeployqt</em> is used to add run-time dependencies, such as the
|
||||
Qt DLLs.
|
||||
</p>
|
||||
<h2><a class="a-header" name="SH_1_11">Unix packaging</a></h2> <!-- index:2:SH:1:11:Unix packaging -->
|
||||
<p>
|
||||
On Unix-like operating systems it is more natural to use some sort of package
|
||||
derived from the <em class="quote">make install</em> process rather than an installer program, so
|
||||
the emailrelay GUI is not normally used.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Top-level makefile targets <em class="quote">dist</em>, <em class="quote">deb</em> and <em class="quote">rpm</em> can be used to create a
|
||||
binary tarball, a debian package, and an RPM package respectively.
|
||||
</p>
|
||||
<h2><a class="a-header" name="SH_1_12">Source control</a></h2> <!-- index:2:SH:1:12:Source control -->
|
||||
<p>
|
||||
The source code is stored in the SourceForge <em class="quote">svn</em> repository. A working
|
||||
copy can be checked out as follows:
|
||||
</p>
|
||||
|
||||
<div class="div-pre">
|
||||
<pre>$ svn co https://svn.code.sf.net/p/emailrelay/code/trunk emailrelay</pre>
|
||||
</div><!-- div-pre -->
|
||||
<h2><a class="a-header" name="SH_1_13">Compile-time features</a></h2> <!-- index:2:SH:1:13:Compile-time features -->
|
||||
<p>
|
||||
Compile-time features can be selected with options passed to the <em class="quote">configure</em>
|
||||
script. These include the following:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Debug-level logging (<em class="quote">--enable-debug</em>)</li>
|
||||
<li>Configuration GUI (<em class="quote">--enable-gui</em>)</li>
|
||||
<li>PAM support (<em class="quote">--with-pam</em>)</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
Use <em class="quote">./configure --help</em> to see a complete list of options and refer to
|
||||
<em class="quote">acinclude.m4</em> for more detailed comments.
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<div class="div-footer">
|
||||
<p>
|
||||
Copyright (C) 2001-2018 Graeme Walker
|
||||
</p>
|
||||
</div><!-- div-footer -->
|
||||
</div> <!-- div-main -->
|
||||
</body>
|
||||
</html>
|
||||
<!-- Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>. All rights reserved. -->
|
250
doc/developer.md
Normal file
250
doc/developer.md
Normal file
@ -0,0 +1,250 @@
|
||||
E-MailRelay Developer Guide
|
||||
===========================
|
||||
|
||||
Principles
|
||||
----------
|
||||
The main principles in the design of E-MailRelay can be summarised as:
|
||||
|
||||
* Minimal third-party dependencies
|
||||
* Windows/Unix portability without #ifdefs
|
||||
* Event-driven, non-blocking, single-threaded networking code
|
||||
* Functionality without imposing policy
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
E-MailRelay started life at a time when Linux had no decent package manager and
|
||||
Windows was in the grip of DLL hell. As a result, a key principle is that it
|
||||
has no dependencies other than a decent C++ runtime. Since that time OpenSSL
|
||||
has been introduced as a dependency to support [TLS][] encryption, and the optional
|
||||
configuration and installation GUI has been developed using the Qt toolkit.
|
||||
|
||||
In those early years multi-threading support in C++ libraries was poor, so up
|
||||
until version 2.0 the code was single-threaded throughout.
|
||||
|
||||
Portability
|
||||
-----------
|
||||
The E-MailRelay code is mostly written in C++-1998, but using some features of
|
||||
C++-2011. A C++-1998 compiler can be used, but multi-threading will be disabled.
|
||||
|
||||
The header files `gdef.h` in `src/glib` is used to fix up some compiler
|
||||
portability issues such as missing standard types, non-standard system headers
|
||||
etc. Conditional compilation directives (`#ifdef` etc.) are largely confined
|
||||
this file in order to improve readability.
|
||||
|
||||
Windows/Unix portability is generally addressed by providing a common class
|
||||
declaration with two implementations. The implementations are put into separate
|
||||
source files with a `_unix` or `_win32` suffix, and if necessary a 'pimple' (or
|
||||
'Bridge') pattern is used to keep the o/s-specific details out of the header.
|
||||
If only small parts of the implementation are o/s-specific then there can be
|
||||
three source files per header. For example, `gsocket.cpp`, `gsocket_win32.cpp`
|
||||
and `gsocket_unix.cpp` in the `src/gnet` directory.
|
||||
|
||||
Underscores in source file names are used exclusively to indicate build-time
|
||||
alternatives.
|
||||
|
||||
Event model
|
||||
-----------
|
||||
The E-MailRelay server uses non-blocking socket i/o, with a select() event loop.
|
||||
This event model means that the server can handle multiple network connections
|
||||
simultaneously from a single thread, and even if multi-threading is disabled at
|
||||
build-time the only blocking occurs when external programs are executed (see
|
||||
`--filter` and `--address-verifier`).
|
||||
|
||||
This event model can make the code more complicated than the equivalent
|
||||
multi-threaded approach since (for example) it is not possible to wait for a
|
||||
complete line of input to be received from a remote [SMTP][] client because there
|
||||
might be other connections that need servicing half way through.
|
||||
|
||||
The advantages of a non-blocking event model are discussed in the well-known
|
||||
[C10K Problem](http://www.kegel.com/c10k.html) document.
|
||||
|
||||
At higher levels the C++ slot/signal design pattern is used to propagate events
|
||||
between objects (not to be confused with operating system signals). The
|
||||
slot/signal implementation has been simplified compared to Qt or boost by not
|
||||
supporting signal multicasting, so each signal connects to no more than one
|
||||
slot.
|
||||
|
||||
Module structure
|
||||
----------------
|
||||
The main C++ libraries in the E-MailRelay code base are as follows:
|
||||
|
||||
* `glib`
|
||||
|
||||
Low-level classes for file-system abstraction, date and time representation,
|
||||
string utility functions, logging, command line parsing etc.
|
||||
|
||||
* `gssl`
|
||||
|
||||
A thin layer over the third-party TLS libraries.
|
||||
|
||||
* `gnet`
|
||||
|
||||
Network and event-loop classes.
|
||||
|
||||
* `gauth`
|
||||
|
||||
Implements various authentication mechanisms.
|
||||
|
||||
* `gsmtp`
|
||||
|
||||
SMTP protocol and message-store classes.
|
||||
|
||||
* `gpop`
|
||||
|
||||
POP3 protocol classes.
|
||||
|
||||
All of these libraries are portable between Unix-like systems and Windows.
|
||||
|
||||
Under Windows there is an additional library `win32` for the user interface.
|
||||
|
||||
SMTP class structure
|
||||
--------------------
|
||||
The message-store functionality uses three abstract interfaces: `MessageStore`,
|
||||
`NewMessage` and `StoredMessage`. The `NewMessage` interface is used to create
|
||||
messages within the store, and the `StoredMessage` interface is used for
|
||||
reading and extracting messages from the store. The concrete implementation
|
||||
classes based on these interfaces are respectively `FileStore`, `NewFile` and
|
||||
`StoredFile`.
|
||||
|
||||
Protocol classes such as `GSmtp::ServerProtocol` receive network and timer
|
||||
events from their container and use an abstract `Sender` interface to send
|
||||
network data. This means that the protocols can be independent of the network
|
||||
and event loop framework.
|
||||
|
||||
The interaction between the SMTP server protocol class and the message store is
|
||||
mediated by the `ProtocolMessage` interface. Two main implementations of this
|
||||
interface are available: one for normal spooling (`ProtocolMessageStore`), and
|
||||
another for immediate forwarding (`ProtocolMessageForward`). The `Decorator`
|
||||
pattern is used whereby the forwarding class uses an instance of the storage
|
||||
class to do the message storing and filtering, while adding in an instance
|
||||
of the `GSmtp::Client` class to do the forwarding.
|
||||
|
||||
Message filtering (`--filter`) is implemented via an abstract `Filter`
|
||||
interface. Concrete implementations are provided for doing nothing, running an
|
||||
external executable program and talking to an external network server.
|
||||
|
||||
The protocol, processor and message-store interfaces are brought together by the
|
||||
high-level `GSmtp::Server` and `GSmtp::Client` classes. Dependency injection is
|
||||
used to create the concrete instances of the `ProtocolMessage` and `Filter`
|
||||
interfaces.
|
||||
|
||||
Event handling and exceptions
|
||||
-----------------------------
|
||||
The use of non-blocking i/o in the network library means that most processing
|
||||
operates within the context of an i/o event or timeout callback, so the top
|
||||
level of the call stack is nearly always the event loop code. This can make
|
||||
catching C++ exceptions a bit awkward compared to a multi-threaded approach
|
||||
because it is not possible to put a single catch block around a particular
|
||||
high-level feature.
|
||||
|
||||
The event loop delivers asynchronous socket events to the `EventHandler`
|
||||
interface, timer events to the `TimerBase` interface, and 'future' events to the
|
||||
`FutureEventCallback` interface. If any of the these event handlers throws an
|
||||
exception then the event loop will catch it and deliver it back to an exception
|
||||
handler through the `onException()` method of an associated `ExceptionHandler`
|
||||
interface. If an exception is thrown out of _this_ callback then the event loop
|
||||
code lets it propagate back to `main()`, typically terminating the program.
|
||||
|
||||
Every pointer to an event callback interface is associated with an
|
||||
`ExceptionHandler`. The default `ExceptionHandler` is the `EventLoop`
|
||||
singleton, and a call to its `onException()` method terminates the event loop.
|
||||
|
||||
This leads to a programming model where key objects are instantiated on the
|
||||
heap and these objects delete themselves when they receive certain events from
|
||||
the event loop. In the `GNet` library it is the `ServerPeer` and `HeapClient`
|
||||
classes that do this lifetime management; instances of these classes delete
|
||||
themselves when the associated network connection goes away and they
|
||||
implement the `ExceptionHandler` interface so that they schedule their own
|
||||
deletion when an exception is thrown.
|
||||
|
||||
Special smart pointers are sometimes used for these self-deleting classes; the
|
||||
smart pointer does not delete the contained object when it is reset, it just
|
||||
tells the object to delete itself with a zero-length timer and then releases it
|
||||
for garbage collection.
|
||||
|
||||
Multi-threading
|
||||
---------------
|
||||
Multi-threading can be used as a build-time option to make DNS lookup and the
|
||||
execution of helper programs asynchronous; if std::thread is available then it
|
||||
is used in a future/promise pattern to wrap up `getaddrinfo()` and `waitpid()`
|
||||
system calls. The shared state comprises only the parameters and return results
|
||||
from these system calls, and synchronisation back to the main thread uses the
|
||||
event loop (see `GNet::FutureEvent`).
|
||||
|
||||
E-MailRelay GUI
|
||||
---------------
|
||||
The optional GUI program `emailrelay-gui` uses the Qt toolkit for its user
|
||||
interface components. The GUI can run as an installer or as a configuration
|
||||
helper, depending on whether it can find an installation `payload`. Refer to
|
||||
the comments in `src/gui/guimain.cpp` for more details.
|
||||
|
||||
The user interface runs as a stack of dialog-box pages with forward and back
|
||||
buttons at the bottom. Once the stack has been completed by the user then each
|
||||
page is asked to dump out its state as a set of key-value pairs (see
|
||||
`src/gui/pages.cpp`). These key-value pairs are processed by an installer class
|
||||
into a list of action objects (in the `Command` design pattern) and then the
|
||||
action objects are run in turn. In order to display the progress of the
|
||||
installation each action object is run within a timer callback so that the Qt
|
||||
framework gets a chance to update the display between each one.
|
||||
|
||||
During development the user interface pages and the installer can be tested
|
||||
separately since the interface between them is a simple text stream containing
|
||||
key-value pairs.
|
||||
|
||||
When run in configure mode the GUI normally ends up simply editing the
|
||||
`emailrelay.conf` file (or `emailrelay-start.bat` on Windows) and/or the
|
||||
`emailrelay.auth` secrets file.
|
||||
|
||||
When run in install mode the GUI expects to unpack all the E-MailRelay files
|
||||
from the payload into target directories. (The payload used to be a single
|
||||
archive file appended to the executable, but it is now simple directory
|
||||
tree that lives alongside the GUI exectuable or inside the Mac application
|
||||
bundle.)
|
||||
|
||||
Windows packaging
|
||||
-----------------
|
||||
On Windows E-MailRelay is packaged as a zip file containing the executables
|
||||
(including the emailrelay GUI as `emailrelay-setup.exe`), documentation, and a
|
||||
`payload` directory tree. The payload contains many of the same files all over
|
||||
again, and while this duplication is not ideal it is at least straightforward.
|
||||
|
||||
The Qt tool `windeployqt` is used to add run-time dependencies, such as the
|
||||
Qt DLLs.
|
||||
|
||||
Unix packaging
|
||||
--------------
|
||||
On Unix-like operating systems it is more natural to use some sort of package
|
||||
derived from the `make install` process rather than an installer program, so
|
||||
the emailrelay GUI is not normally used.
|
||||
|
||||
Top-level makefile targets `dist`, `deb` and `rpm` can be used to create a
|
||||
binary tarball, a debian package, and an RPM package respectively.
|
||||
|
||||
Source control
|
||||
--------------
|
||||
The source code is stored in the SourceForge `svn` repository. A working
|
||||
copy can be checked out as follows:
|
||||
|
||||
$ svn co https://svn.code.sf.net/p/emailrelay/code/trunk emailrelay
|
||||
|
||||
Compile-time features
|
||||
---------------------
|
||||
Compile-time features can be selected with options passed to the `configure`
|
||||
script. These include the following:
|
||||
|
||||
* Debug-level logging (`--enable-debug`)
|
||||
* Configuration GUI (`--enable-gui`)
|
||||
* [PAM][] support (`--with-pam`)
|
||||
|
||||
Use `./configure --help` to see a complete list of options and refer to
|
||||
`acinclude.m4` for more detailed comments.
|
||||
|
||||
|
||||
|
||||
|
||||
[PAM]: https://en.wikipedia.org/wiki/Linux_PAM
|
||||
[SMTP]: https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
|
||||
[TLS]: https://en.wikipedia.org/wiki/Transport_Layer_Security
|
||||
|
||||
_____________________________________
|
||||
Copyright (C) 2001-2018 Graeme Walker
|
253
doc/developer.rst
Normal file
253
doc/developer.rst
Normal file
@ -0,0 +1,253 @@
|
||||
***************************
|
||||
E-MailRelay Developer Guide
|
||||
***************************
|
||||
|
||||
Principles
|
||||
==========
|
||||
The main principles in the design of E-MailRelay can be summarised as:
|
||||
|
||||
* Minimal third-party dependencies
|
||||
* Windows/Unix portability without #ifdefs
|
||||
* Event-driven, non-blocking, single-threaded networking code
|
||||
* Functionality without imposing policy
|
||||
|
||||
Dependencies
|
||||
============
|
||||
E-MailRelay started life at a time when Linux had no decent package manager and
|
||||
Windows was in the grip of DLL hell. As a result, a key principle is that it
|
||||
has no dependencies other than a decent C++ runtime. Since that time OpenSSL
|
||||
has been introduced as a dependency to support TLS_ encryption, and the optional
|
||||
configuration and installation GUI has been developed using the Qt toolkit.
|
||||
|
||||
In those early years multi-threading support in C++ libraries was poor, so up
|
||||
until version 2.0 the code was single-threaded throughout.
|
||||
|
||||
Portability
|
||||
===========
|
||||
The E-MailRelay code is mostly written in C++-1998, but using some features of
|
||||
C++-2011. A C++-1998 compiler can be used, but multi-threading will be disabled.
|
||||
|
||||
The header files *gdef.h* in *src/glib* is used to fix up some compiler
|
||||
portability issues such as missing standard types, non-standard system headers
|
||||
etc. Conditional compilation directives (*#ifdef* etc.) are largely confined
|
||||
this file in order to improve readability.
|
||||
|
||||
Windows/Unix portability is generally addressed by providing a common class
|
||||
declaration with two implementations. The implementations are put into separate
|
||||
source files with a *_unix* or *_win32* suffix, and if necessary a 'pimple' (or
|
||||
'Bridge') pattern is used to keep the o/s-specific details out of the header.
|
||||
If only small parts of the implementation are o/s-specific then there can be
|
||||
three source files per header. For example, *gsocket.cpp*, *gsocket_win32.cpp*
|
||||
and *gsocket_unix.cpp* in the *src/gnet* directory.
|
||||
|
||||
Underscores in source file names are used exclusively to indicate build-time
|
||||
alternatives.
|
||||
|
||||
Event model
|
||||
===========
|
||||
The E-MailRelay server uses non-blocking socket i/o, with a select() event loop.
|
||||
This event model means that the server can handle multiple network connections
|
||||
simultaneously from a single thread, and even if multi-threading is disabled at
|
||||
build-time the only blocking occurs when external programs are executed (see
|
||||
*--filter* and *--address-verifier*).
|
||||
|
||||
This event model can make the code more complicated than the equivalent
|
||||
multi-threaded approach since (for example) it is not possible to wait for a
|
||||
complete line of input to be received from a remote SMTP_ client because there
|
||||
might be other connections that need servicing half way through.
|
||||
|
||||
The advantages of a non-blocking event model are discussed in the well-known
|
||||
`C10K Problem <http://www.kegel.com/c10k.html>`_ document.
|
||||
|
||||
At higher levels the C++ slot/signal design pattern is used to propagate events
|
||||
between objects (not to be confused with operating system signals). The
|
||||
slot/signal implementation has been simplified compared to Qt or boost by not
|
||||
supporting signal multicasting, so each signal connects to no more than one
|
||||
slot.
|
||||
|
||||
Module structure
|
||||
================
|
||||
The main C++ libraries in the E-MailRelay code base are as follows:
|
||||
|
||||
* \ *glib*\
|
||||
|
||||
Low-level classes for file-system abstraction, date and time representation,
|
||||
string utility functions, logging, command line parsing etc.
|
||||
|
||||
* \ *gssl*\
|
||||
|
||||
A thin layer over the third-party TLS libraries.
|
||||
|
||||
* \ *gnet*\
|
||||
|
||||
Network and event-loop classes.
|
||||
|
||||
* \ *gauth*\
|
||||
|
||||
Implements various authentication mechanisms.
|
||||
|
||||
* \ *gsmtp*\
|
||||
|
||||
SMTP protocol and message-store classes.
|
||||
|
||||
* \ *gpop*\
|
||||
|
||||
POP3 protocol classes.
|
||||
|
||||
All of these libraries are portable between Unix-like systems and Windows.
|
||||
|
||||
Under Windows there is an additional library *win32* for the user interface.
|
||||
|
||||
SMTP class structure
|
||||
====================
|
||||
The message-store functionality uses three abstract interfaces: *MessageStore*,
|
||||
*NewMessage* and *StoredMessage*. The *NewMessage* interface is used to create
|
||||
messages within the store, and the *StoredMessage* interface is used for
|
||||
reading and extracting messages from the store. The concrete implementation
|
||||
classes based on these interfaces are respectively *FileStore*, *NewFile* and
|
||||
\ *StoredFile*\ .
|
||||
|
||||
Protocol classes such as *GSmtp::ServerProtocol* receive network and timer
|
||||
events from their container and use an abstract *Sender* interface to send
|
||||
network data. This means that the protocols can be independent of the network
|
||||
and event loop framework.
|
||||
|
||||
The interaction between the SMTP server protocol class and the message store is
|
||||
mediated by the *ProtocolMessage* interface. Two main implementations of this
|
||||
interface are available: one for normal spooling (\ *ProtocolMessageStore*\ ), and
|
||||
another for immediate forwarding (\ *ProtocolMessageForward*\ ). The *Decorator*
|
||||
pattern is used whereby the forwarding class uses an instance of the storage
|
||||
class to do the message storing and filtering, while adding in an instance
|
||||
of the *GSmtp::Client* class to do the forwarding.
|
||||
|
||||
Message filtering (\ *--filter*\ ) is implemented via an abstract *Filter*
|
||||
interface. Concrete implementations are provided for doing nothing, running an
|
||||
external executable program and talking to an external network server.
|
||||
|
||||
The protocol, processor and message-store interfaces are brought together by the
|
||||
high-level *GSmtp::Server* and *GSmtp::Client* classes. Dependency injection is
|
||||
used to create the concrete instances of the *ProtocolMessage* and *Filter*
|
||||
interfaces.
|
||||
|
||||
Event handling and exceptions
|
||||
=============================
|
||||
The use of non-blocking i/o in the network library means that most processing
|
||||
operates within the context of an i/o event or timeout callback, so the top
|
||||
level of the call stack is nearly always the event loop code. This can make
|
||||
catching C++ exceptions a bit awkward compared to a multi-threaded approach
|
||||
because it is not possible to put a single catch block around a particular
|
||||
high-level feature.
|
||||
|
||||
The event loop delivers asynchronous socket events to the *EventHandler*
|
||||
interface, timer events to the *TimerBase* interface, and 'future' events to the
|
||||
*FutureEventCallback* interface. If any of the these event handlers throws an
|
||||
exception then the event loop will catch it and deliver it back to an exception
|
||||
handler through the *onException()* method of an associated *ExceptionHandler*
|
||||
interface. If an exception is thrown out of _this_ callback then the event loop
|
||||
code lets it propagate back to *main()*, typically terminating the program.
|
||||
|
||||
Every pointer to an event callback interface is associated with an
|
||||
\ *ExceptionHandler*\ . The default *ExceptionHandler* is the *EventLoop*
|
||||
singleton, and a call to its *onException()* method terminates the event loop.
|
||||
|
||||
This leads to a programming model where key objects are instantiated on the
|
||||
heap and these objects delete themselves when they receive certain events from
|
||||
the event loop. In the *GNet* library it is the *ServerPeer* and *HeapClient*
|
||||
classes that do this lifetime management; instances of these classes delete
|
||||
themselves when the associated network connection goes away and they
|
||||
implement the *ExceptionHandler* interface so that they schedule their own
|
||||
deletion when an exception is thrown.
|
||||
|
||||
Special smart pointers are sometimes used for these self-deleting classes; the
|
||||
smart pointer does not delete the contained object when it is reset, it just
|
||||
tells the object to delete itself with a zero-length timer and then releases it
|
||||
for garbage collection.
|
||||
|
||||
Multi-threading
|
||||
===============
|
||||
Multi-threading can be used as a build-time option to make DNS lookup and the
|
||||
execution of helper programs asynchronous; if std::thread is available then it
|
||||
is used in a future/promise pattern to wrap up *getaddrinfo()* and *waitpid()*
|
||||
system calls. The shared state comprises only the parameters and return results
|
||||
from these system calls, and synchronisation back to the main thread uses the
|
||||
event loop (see *GNet::FutureEvent*).
|
||||
|
||||
E-MailRelay GUI
|
||||
===============
|
||||
The optional GUI program *emailrelay-gui* uses the Qt toolkit for its user
|
||||
interface components. The GUI can run as an installer or as a configuration
|
||||
helper, depending on whether it can find an installation *payload*. Refer to
|
||||
the comments in *src/gui/guimain.cpp* for more details.
|
||||
|
||||
The user interface runs as a stack of dialog-box pages with forward and back
|
||||
buttons at the bottom. Once the stack has been completed by the user then each
|
||||
page is asked to dump out its state as a set of key-value pairs (see
|
||||
\ *src/gui/pages.cpp*\ ). These key-value pairs are processed by an installer class
|
||||
into a list of action objects (in the *Command* design pattern) and then the
|
||||
action objects are run in turn. In order to display the progress of the
|
||||
installation each action object is run within a timer callback so that the Qt
|
||||
framework gets a chance to update the display between each one.
|
||||
|
||||
During development the user interface pages and the installer can be tested
|
||||
separately since the interface between them is a simple text stream containing
|
||||
key-value pairs.
|
||||
|
||||
When run in configure mode the GUI normally ends up simply editing the
|
||||
*emailrelay.conf* file (or *emailrelay-start.bat* on Windows) and/or the
|
||||
*emailrelay.auth* secrets file.
|
||||
|
||||
When run in install mode the GUI expects to unpack all the E-MailRelay files
|
||||
from the payload into target directories. (The payload used to be a single
|
||||
archive file appended to the executable, but it is now simple directory
|
||||
tree that lives alongside the GUI exectuable or inside the Mac application
|
||||
bundle.)
|
||||
|
||||
Windows packaging
|
||||
=================
|
||||
On Windows E-MailRelay is packaged as a zip file containing the executables
|
||||
(including the emailrelay GUI as *emailrelay-setup.exe*), documentation, and a
|
||||
*payload* directory tree. The payload contains many of the same files all over
|
||||
again, and while this duplication is not ideal it is at least straightforward.
|
||||
|
||||
The Qt tool *windeployqt* is used to add run-time dependencies, such as the
|
||||
Qt DLLs.
|
||||
|
||||
Unix packaging
|
||||
==============
|
||||
On Unix-like operating systems it is more natural to use some sort of package
|
||||
derived from the *make install* process rather than an installer program, so
|
||||
the emailrelay GUI is not normally used.
|
||||
|
||||
Top-level makefile targets *dist*, *deb* and *rpm* can be used to create a
|
||||
binary tarball, a debian package, and an RPM package respectively.
|
||||
|
||||
Source control
|
||||
==============
|
||||
The source code is stored in the SourceForge *svn* repository. A working
|
||||
copy can be checked out as follows:
|
||||
|
||||
::
|
||||
|
||||
$ svn co https://svn.code.sf.net/p/emailrelay/code/trunk emailrelay
|
||||
|
||||
Compile-time features
|
||||
=====================
|
||||
Compile-time features can be selected with options passed to the *configure*
|
||||
script. These include the following:
|
||||
|
||||
* Debug-level logging (\ *--enable-debug*\ )
|
||||
* Configuration GUI (\ *--enable-gui*\ )
|
||||
* PAM_ support (\ *--with-pam*\ )
|
||||
|
||||
Use *./configure --help* to see a complete list of options and refer to
|
||||
*acinclude.m4* for more detailed comments.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.. _PAM: https://en.wikipedia.org/wiki/Linux_PAM
|
||||
.. _SMTP: https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
|
||||
.. _TLS: https://en.wikipedia.org/wiki/Transport_Layer_Security
|
||||
|
||||
.. footer:: Copyright (C) 2001-2018 Graeme Walker
|
@ -1,78 +1,96 @@
|
||||
E-MailRelay Internals
|
||||
=====================
|
||||
E-MailRelay Developer Guide
|
||||
===========================
|
||||
|
||||
Module structure
|
||||
----------------
|
||||
The main C++ libraries in the E-MailRelay code are: "glib", providing low-level
|
||||
classes for file-system abstraction, date and time representation, string
|
||||
utility functions, logging, command line parsing etc.; "gssl", which is a thin
|
||||
abstraction over OpenSSL; "gnet", which provides network classes using the
|
||||
Berkley socket and Winsock APIs; "gauth", which implements various
|
||||
authentication mechanisms; "gsmtp", containing SMTP and message-store classes;
|
||||
and "gpop", which contains POP3 classes. All of these libraries are portable
|
||||
between POSIX-like systems (eg. Linux) and Windows.
|
||||
Principles
|
||||
----------
|
||||
The main principles in the design of E-MailRelay can be summarised as:
|
||||
* Minimal third-party dependencies
|
||||
* Windows/Unix portability without #ifdefs
|
||||
* Event-driven, non-blocking, single-threaded networking code
|
||||
* Functionality without imposing policy
|
||||
|
||||
Under Windows there is an additional library for event handling. Windows has
|
||||
historically built network event processing on top of the GUI event system which
|
||||
means that the "gnet" library has to be able to create GUI windows in order to
|
||||
process network events. The extra GUI and event classes are put into a separate
|
||||
library in the "src/win32" directory, using the namespace "GGui".
|
||||
Dependencies
|
||||
------------
|
||||
E-MailRelay started life at a time when Linux had no decent package manager and
|
||||
Windows was in the grip of DLL hell. As a result, a key principle is that it
|
||||
has no dependencies other than a decent C++ runtime. Since that time OpenSSL
|
||||
has been introduced as a dependency to support TLS encryption, and the optional
|
||||
configuration and installation GUI has been developed using the Qt toolkit.
|
||||
|
||||
There is also a separate configuration GUI program which uses the "glib" library
|
||||
together with TrollTech's Qt.
|
||||
In those early years multi-threading support in C++ libraries was poor, so up
|
||||
until version 2.0 the code was single-threaded throughout.
|
||||
|
||||
Portability
|
||||
-----------
|
||||
The E-MailRelay code is mostly written in C++-1998, but using some features of
|
||||
C++-2011. A C++-1998 compiler can be used, but multi-threading will be disabled.
|
||||
|
||||
The header files "gdef.h" in "src/glib" is used to fix up some compiler
|
||||
portability issues such as missing standard types, non-standard system headers
|
||||
etc. Conditional compilation directives ("#ifdef" etc.) are largely confined
|
||||
this file in order to improve readability.
|
||||
|
||||
Windows/Unix portability is generally addressed by providing a common class
|
||||
declaration with two implementations. The implementations are put into separate
|
||||
source files with a "_unix" or "_win32" suffix, and if necessary a 'pimple' (or
|
||||
'Bridge') pattern is used to keep the o/s-specific details out of the header.
|
||||
If only small parts of the implementation are o/s-specific then there can be
|
||||
three source files per header. For example, "gsocket.cpp", "gsocket_win32.cpp"
|
||||
and "gsocket_unix.cpp" in the "src/gnet" directory.
|
||||
|
||||
Underscores in source file names are used exclusively to indicate build-time
|
||||
alternatives.
|
||||
|
||||
Event model
|
||||
-----------
|
||||
The E-MailRelay server uses non-blocking socket i/o, with a select() event loop.
|
||||
This event model means that the server can handle multiple clients
|
||||
simultaneously from a single thread and the only significant blocking occurs
|
||||
when external programs are executed (see "--filter" and "--verifier").
|
||||
This event model means that the server can handle multiple network connections
|
||||
simultaneously from a single thread, and even if multi-threading is disabled at
|
||||
build-time the only blocking occurs when external programs are executed (see
|
||||
"--filter" and "--address-verifier").
|
||||
|
||||
In some ways this makes the implementation more complicated than the equivalent
|
||||
This event model can make the code more complicated than the equivalent
|
||||
multi-threaded approach since (for example) it is not possible to wait for a
|
||||
complete line of input to be received from a remote SMTP client because there
|
||||
might be other connection that need servicing.
|
||||
might be other connections that need servicing half way through.
|
||||
|
||||
See *C10K Problem* [http://www.kegel.com/c10k.html] for a discussion of
|
||||
different network event models.
|
||||
The advantages of a non-blocking event model are discussed in the well-known
|
||||
*C10K Problem* [http://www.kegel.com/c10k.html] document.
|
||||
|
||||
At higher levels the C++ slot/signal design pattern is used to propagate events
|
||||
between objects (not to be confused with operating system signals). The
|
||||
slot/signal implementation has been simplified compared to Qt or boost by not
|
||||
supporting signal multicasting, so each signal connects to no more than one
|
||||
slot. For historical reasons the slot/signal pattern is not used in the lowest
|
||||
layers of the network library.
|
||||
slot.
|
||||
|
||||
Event handling and exceptions
|
||||
-----------------------------
|
||||
The use of non-blocking i/o in the network library means that most processing
|
||||
operates within the context of an i/o event or timeout callback so the top level
|
||||
of the call stack is nearly always the event loop code. This can make using C++
|
||||
exceptions a bit awkward compared to a multi-threaded approach because it is not
|
||||
possible to put a single catch block around a particular high-level feature.
|
||||
Module structure
|
||||
----------------
|
||||
The main C++ libraries in the E-MailRelay code base are as follows:
|
||||
|
||||
The event loop delivers all asynchronous events to the abstract "EventHandler"
|
||||
and "AbstractTimer" interfaces. If these callbacks throw exceptions then the
|
||||
event loop will catch them and deliver them back to the same interface through
|
||||
the virtual functions onException() and onTimerException() respectively. If
|
||||
exceptions are thrown out of _these_ callbacks then the event loop code lets
|
||||
them propagate back to main(), typically terminating the program.
|
||||
# "glib"
|
||||
Low-level classes for file-system abstraction, date and time representation,
|
||||
string utility functions, logging, command line parsing etc.
|
||||
|
||||
The two callback interfaces are brought together by having a concrete "Timer"
|
||||
class that requires an "EventHandler" object to be associated with each timer.
|
||||
The "Timer" class routes any exceptions thrown out of the timeout callback to
|
||||
the designated "EventHandler" interface so that both i/o and timeout exceptions
|
||||
are delivered to the same place.
|
||||
# "gssl"
|
||||
A thin layer over the third-party TLS libraries.
|
||||
|
||||
In common with other event-driven frameworks this leads to a programming
|
||||
model where objects are instantiated on the heap and the objects delete
|
||||
themselves when they receive certain events from the framework. In the
|
||||
"gnet" library the "ServerPeer" and "HeapClient" classes do this lifetime
|
||||
management; instances of these classes delete themselves when the associated
|
||||
network connection goes away or when an exception is thrown out their
|
||||
event-handling code.
|
||||
# "gnet"
|
||||
Network and event-loop classes.
|
||||
|
||||
Core class structure
|
||||
# "gauth"
|
||||
Implements various authentication mechanisms.
|
||||
|
||||
# "gsmtp"
|
||||
SMTP protocol and message-store classes.
|
||||
|
||||
# "gpop"
|
||||
POP3 protocol classes.
|
||||
|
||||
All of these libraries are portable between Unix-like systems and Windows.
|
||||
|
||||
Under Windows there is an additional library "win32" for the user interface.
|
||||
|
||||
SMTP class structure
|
||||
--------------------
|
||||
The message-store functionality uses three abstract interfaces: "MessageStore",
|
||||
"NewMessage" and "StoredMessage". The "NewMessage" interface is used to create
|
||||
@ -83,334 +101,124 @@ classes based on these interfaces are respectively "FileStore", "NewFile" and
|
||||
|
||||
Protocol classes such as "GSmtp::ServerProtocol" receive network and timer
|
||||
events from their container and use an abstract "Sender" interface to send
|
||||
network data. This means that the protocols can be largely independent of the
|
||||
network and event loop framework.
|
||||
network data. This means that the protocols can be independent of the network
|
||||
and event loop framework.
|
||||
|
||||
The interaction between the SMTP server protocol class and the message store is
|
||||
mediated by the "ProtocolMessage" interface. Two main implementations of this
|
||||
interface are available: one for normal spooling ("ProtocolMessageStore"), and
|
||||
another for immediate forwarding ("ProtocolMessageForward"). The "Decorator"
|
||||
pattern is used whereby the forwarding class uses an instance of the storage
|
||||
class to do the message storing and pre-processing, while adding in an instance
|
||||
class to do the message storing and filtering, while adding in an instance
|
||||
of the "GSmtp::Client" class to do the forwarding.
|
||||
|
||||
Message pre-processing (see "--filter") is implemented via an abstract
|
||||
"Processor" interface. Concrete implementations are provided for doing nothing,
|
||||
running an external executable program and talking to an external network server.
|
||||
Message filtering ("--filter") is implemented via an abstract "Filter"
|
||||
interface. Concrete implementations are provided for doing nothing, running an
|
||||
external executable program and talking to an external network server.
|
||||
|
||||
The protocol, processor and message-store interfaces are brought together by the
|
||||
high-level "GSmtp::Server" and "GSmtp::Client" classes. Dependency injection is
|
||||
used to create the concrete instances of the "ProtocolMessage" and "Processor"
|
||||
used to create the concrete instances of the "ProtocolMessage" and "Filter"
|
||||
interfaces.
|
||||
|
||||
Simplified class diagrams for the *GNet* [gnet-classes.png] and
|
||||
*GSmtp* [gsmtp-classes.png] namespaces are available.
|
||||
Event handling and exceptions
|
||||
-----------------------------
|
||||
The use of non-blocking i/o in the network library means that most processing
|
||||
operates within the context of an i/o event or timeout callback, so the top
|
||||
level of the call stack is nearly always the event loop code. This can make
|
||||
catching C++ exceptions a bit awkward compared to a multi-threaded approach
|
||||
because it is not possible to put a single catch block around a particular
|
||||
high-level feature.
|
||||
|
||||
Windows service
|
||||
The event loop delivers asynchronous socket events to the "EventHandler"
|
||||
interface, timer events to the "TimerBase" interface, and 'future' events to the
|
||||
"FutureEventCallback" interface. If any of the these event handlers throws an
|
||||
exception then the event loop will catch it and deliver it back to an exception
|
||||
handler through the "onException()" method of an associated "ExceptionHandler"
|
||||
interface. If an exception is thrown out of _this_ callback then the event loop
|
||||
code lets it propagate back to "main()", typically terminating the program.
|
||||
|
||||
Every pointer to an event callback interface is associated with an
|
||||
"ExceptionHandler". The default "ExceptionHandler" is the "EventLoop"
|
||||
singleton, and a call to its "onException()" method terminates the event loop.
|
||||
|
||||
This leads to a programming model where key objects are instantiated on the
|
||||
heap and these objects delete themselves when they receive certain events from
|
||||
the event loop. In the "GNet" library it is the "ServerPeer" and "HeapClient"
|
||||
classes that do this lifetime management; instances of these classes delete
|
||||
themselves when the associated network connection goes away and they
|
||||
implement the "ExceptionHandler" interface so that they schedule their own
|
||||
deletion when an exception is thrown.
|
||||
|
||||
Special smart pointers are sometimes used for these self-deleting classes; the
|
||||
smart pointer does not delete the contained object when it is reset, it just
|
||||
tells the object to delete itself with a zero-length timer and then releases it
|
||||
for garbage collection.
|
||||
|
||||
Multi-threading
|
||||
---------------
|
||||
To get E-MailRelay to run as a Windows service there is a service wrapper
|
||||
program called "emailrelay-service.exe". This program registers itself as
|
||||
a service when run with the "--install" commandline option. When the service
|
||||
runs the wrapper starts the actual E-MailRelay server by looking for a batch
|
||||
file called "emailrelay-start.bat" in the same directory as service wrapper
|
||||
executable. It reads the contents of this batch file in order to construct the
|
||||
E-MailRelay command-line, adding "--no-daemon" and "--hidden" options if they
|
||||
are not there already.
|
||||
|
||||
The service name and display name can be added to the wrapper's "--install"
|
||||
command-line, and it is the service name that is used to derive the name of the
|
||||
"start" batch file. This allows more than one server to be run as services,
|
||||
using different server command-line options on each one.
|
||||
|
||||
Diagrams
|
||||
--------
|
||||
Class diagrams:
|
||||
* *GNet namespace* [gnet-classes.png]
|
||||
* *GSmtp namespace* [gsmtp-classes.png]
|
||||
|
||||
State transition diagrams:
|
||||
* *GNet::Client* [gnet-client.png]
|
||||
* *GSmtp::ServerProtocol* [gsmtp-serverprotocol.png]
|
||||
|
||||
Sequence diagrams:
|
||||
* *Proxy mode forwarding* [sequence-3.png]
|
||||
Multi-threading can be used as a build-time option to make DNS lookup and the
|
||||
execution of helper programs asynchronous; if std::thread is available then it
|
||||
is used in a future/promise pattern to wrap up "getaddrinfo()" and "waitpid()"
|
||||
system calls. The shared state comprises only the parameters and return results
|
||||
from these system calls, and synchronisation back to the main thread uses the
|
||||
event loop (see "GNet::FutureEvent").
|
||||
|
||||
E-MailRelay GUI
|
||||
---------------
|
||||
The optional GUI program "emailrelay-gui" uses TrollTech Qt v4 for its user
|
||||
interface components. The GUI can run as a stand-alone configuration helper
|
||||
("--as-configure") or as part of a self-extracting installation
|
||||
("--as-install"). When it runs it checks whether it has a payload of packed
|
||||
files. If it has then it runs as an installer; if it does not then it runs as a
|
||||
configuration helper. Refer to the comments in "src/gui/guimain.cpp" for more
|
||||
details.
|
||||
The optional GUI program "emailrelay-gui" uses the Qt toolkit for its user
|
||||
interface components. The GUI can run as an installer or as a configuration
|
||||
helper, depending on whether it can find an installation "payload". Refer to
|
||||
the comments in "src/gui/guimain.cpp" for more details.
|
||||
|
||||
The user interface is structured as a "wizard" having a dialog box with the
|
||||
forward and back buttons at the bottom and a single Qt layout object for the
|
||||
main area. A stack of Qt widgets representing the various pages of the wizard
|
||||
are installed into the main layout object in turn as the user navigates from
|
||||
one page to the next.
|
||||
|
||||
Once the wizard is completed it asks each page to dump its state as a set of
|
||||
key-value pairs into a stringstream (see "src/gui/pages.cpp"). These key-value
|
||||
pairs are processed by an installer class into a list of action objects (in the
|
||||
"Command" design pattern) and then the action objects are run in turn. In order
|
||||
to display the progress of the installation each action object is run within a
|
||||
timer callback so that the Qt framework gets a chance to update the GUI between
|
||||
each one.
|
||||
The user interface runs as a stack of dialog-box pages with forward and back
|
||||
buttons at the bottom. Once the stack has been completed by the user then each
|
||||
page is asked to dump out its state as a set of key-value pairs (see
|
||||
"src/gui/pages.cpp"). These key-value pairs are processed by an installer class
|
||||
into a list of action objects (in the "Command" design pattern) and then the
|
||||
action objects are run in turn. In order to display the progress of the
|
||||
installation each action object is run within a timer callback so that the Qt
|
||||
framework gets a chance to update the display between each one.
|
||||
|
||||
During development the user interface pages and the installer can be tested
|
||||
separately since the interface between them is a simple text stream containing
|
||||
key-value pairs.
|
||||
|
||||
When run in "--as-configure" mode the GUI normally ends up simply editing
|
||||
the "emailrelay.conf" file and/or the "emailrelay.auth" secrets file.
|
||||
When run in configure mode the GUI normally ends up simply editing the
|
||||
"emailrelay.conf" file (or "emailrelay-start.bat" on Windows) and/or the
|
||||
"emailrelay.auth" secrets file.
|
||||
|
||||
When run in "--as-install" mode the GUI expects to unpack all the E-MailRelay
|
||||
files from a "payload" archive into target directories.
|
||||
When run in install mode the GUI expects to unpack all the E-MailRelay files
|
||||
from the payload into target directories. (The payload used to be a single
|
||||
archive file appended to the executable, but it is now simple directory
|
||||
tree that lives alongside the GUI exectuable or inside the Mac application
|
||||
bundle.)
|
||||
|
||||
The packing scheme used for a payload archive is a simple concatenation of the
|
||||
"stub" executable followed by a table of contents for the payload files,
|
||||
followed by the payload files themselves (possibly compressed by "zlib"), and
|
||||
ending with an twelve-byte ascii representation of the offset of the table of
|
||||
contents.
|
||||
Windows packaging
|
||||
-----------------
|
||||
On Windows E-MailRelay is packaged as a zip file containing the executables
|
||||
(including the emailrelay GUI as "emailrelay-setup.exe"), documentation, and a
|
||||
"payload" directory tree. The payload contains many of the same files all over
|
||||
again, and while this duplication is not ideal it is at least straightforward.
|
||||
|
||||
The payload may be appended to the GUI executable to make a self-extracting
|
||||
installer, usually then called "emailrelay-setup".
|
||||
The Qt tool "windeployqt" is used to add run-time dependencies, such as the
|
||||
Qt DLLs.
|
||||
|
||||
However, on Windows two levels of packing are required: the "emailrelay-setup"
|
||||
program has a stub executable written in "C" that prints an "extracting..."
|
||||
message to the standard output, with a payload comprising another packed
|
||||
executable and a small number of "C++" runtime library files. The inner packed
|
||||
executable has the emailrelay GUI program as its stub and all the other
|
||||
installable files, including the main emailrelay executable, as its payload.
|
||||
|
||||
On unix-like operating systems it is more natural to use some sort of package
|
||||
Unix packaging
|
||||
--------------
|
||||
On Unix-like operating systems it is more natural to use some sort of package
|
||||
derived from the "make install" process rather than an installer program, so
|
||||
"emailrelay-setup" ia typically never built.
|
||||
the emailrelay GUI is not normally used.
|
||||
|
||||
On Mac OS X the payload is better stored in the installer's application
|
||||
bundle rather than simply appended to the binary. This is desribed in the next
|
||||
section.
|
||||
|
||||
Windows build
|
||||
-------------
|
||||
On Windows E-MailRelay can be built using MinGW or Visual Studio. Makefiles and
|
||||
Visual Studio 2012 project files are provided in the "src" directory.
|
||||
|
||||
For a MinGW build of the E-MailRelay server without TLS/SSL support it should
|
||||
be sufficient to run make from the "src" directory:
|
||||
|
||||
C:\emailrelay\src> PATH=c:\mingw\bin;%PATH%
|
||||
C:\emailrelay\src> mingw32-make -f mingw.mak
|
||||
|
||||
To add TLS/SSL support first install ActiveState perl and make sure that your
|
||||
MinGW installation contains the MSYS subsystem. Unpack the OpenSSL tarball and
|
||||
build it as follows:
|
||||
|
||||
C:\openssl> PATH=c:\perl\bin;c:\mingw\msys\1.0\bin;c:\mingw\bin;%PATH%
|
||||
C:\openssl> bash -l
|
||||
$ ./config
|
||||
$ mingw32-make
|
||||
|
||||
Then edit the E-MailRelay "src/mingw-common.mak" file to enable openssl and run
|
||||
"mingw32-make" as above.
|
||||
|
||||
If building the E-MailRelay GUI then it is best to use MinGW with Qt 5 static
|
||||
libraries. Start by installing zlib source (eg. to c:/zlib) and then build Qt
|
||||
using the following "configure" options:
|
||||
|
||||
-prefix /c/qt/qt5-static
|
||||
-I c:/zlib
|
||||
-L c:/zlib
|
||||
-static
|
||||
-release
|
||||
-force-debug-info
|
||||
-separate-debug-info
|
||||
-opensource
|
||||
-confirm-license
|
||||
-no-c++11
|
||||
-fully-process
|
||||
-no-largefile
|
||||
-accessibility
|
||||
-no-sql-sqlite
|
||||
-no-sql-sqlite2
|
||||
-no-javascript-jit
|
||||
-no-qml-debug
|
||||
-platform win32-g++
|
||||
-no-sse2
|
||||
-no-sse3
|
||||
-no-ssse3
|
||||
-no-sse4.1
|
||||
-no-sse4.2
|
||||
-no-avx
|
||||
-no-avx2
|
||||
-no-neon
|
||||
-no-mips_dsp
|
||||
-no-mips_dspr2
|
||||
-no-pkg-config
|
||||
-system-zlib
|
||||
-no-gif
|
||||
-qt-libpng
|
||||
-no-libjpeg
|
||||
-no-openssl
|
||||
-qt-pcre
|
||||
-qt-xcb
|
||||
-qt-xkbcommon
|
||||
-gui
|
||||
-widgets
|
||||
-no-rpath
|
||||
-no-optimized-qmake
|
||||
-no-nis
|
||||
-no-cups
|
||||
-no-iconv
|
||||
-no-icu
|
||||
-strip
|
||||
-no-pch
|
||||
-no-dbus
|
||||
-no-xcb
|
||||
-no-eglfs
|
||||
-no-directfb
|
||||
-no-linuxfb
|
||||
-no-kms
|
||||
-no-opengl
|
||||
-no-system-proxies
|
||||
-no-glib
|
||||
|
||||
Start the Qt build by running "mingw32-make" from the "qtbase" directory and
|
||||
finish off with "mingw32-make install".
|
||||
|
||||
Edit the E-MailRelay GUI makefile "src/gui/mingw.mak" so that the E-MailRelay
|
||||
build uses similar compiler options to the Qt examples and then then build with:
|
||||
|
||||
$ mingw32-make -f mingw.mak
|
||||
|
||||
Mac OS X packaging
|
||||
------------------
|
||||
On Mac OS X the standard "configure ; make ; make install" procedure works best
|
||||
if the "configure" script is given Mac-like directories on its command-line. The
|
||||
script "bin/configure-mac.sh" can be used to do this.
|
||||
|
||||
The "make" step in "src/main" on Mac OS X additionally builds a simple wrapper
|
||||
program "emailrelay-start" from "start.cpp" that runs the E-MailRelay server
|
||||
using a command-line assembled from the "emailrelay.conf" file. This is then
|
||||
used from the "E-MailRelay-Start" application bundle to provide a Mac-friendly
|
||||
way of running the server.
|
||||
|
||||
Similary the "make" in "src/gui" builds a wrapper program "emailrelay-start-gui"
|
||||
from "guistart.cpp" that runs "emailrelay-gui.real" and this is used from the
|
||||
"E-MailRelay-Configure" application bundle.
|
||||
|
||||
The self-extracting installer scheme (described above) does work on Mac OS X,
|
||||
but it is more sensible to use a Mac application bundle (E-MailRelay-Install) to
|
||||
hold the payload and then wrap the whold thing up in a ".dmg" disk image. The
|
||||
GUI code supports this by looking for a separate file called "payload" and using
|
||||
that in preference to any payload archive it finds appended to its own executable.
|
||||
|
||||
The format of the "payload" file in the application bundle is the same as is used
|
||||
in a self-extracting installer.
|
||||
|
||||
The makefile in the "src/gui" directory provides the "image" target to create
|
||||
the E-MailRelay-Install application bundle and the disk image.
|
||||
Top-level makefile targets "dist", "deb" and "rpm" can be used to create a
|
||||
binary tarball, a debian package, and an RPM package respectively.
|
||||
|
||||
Source control
|
||||
--------------
|
||||
The source code is stored in the SourceForge "svn" repository. A working
|
||||
copy can be checked out as follows:
|
||||
|
||||
$ svn co https://svn.code.sf.net/p/emailrelay/code/trunk
|
||||
|
||||
Directory structure
|
||||
-------------------
|
||||
|
||||
# src
|
||||
|
||||
Parent directory for source code.
|
||||
|
||||
# src/glib
|
||||
|
||||
A low-level class library, including classes for file-system abstraction,
|
||||
date and time, string utility functions, logging, command line parsing etc.
|
||||
|
||||
# src/gnet
|
||||
|
||||
A network library using Berkley sockets or Winsock.
|
||||
|
||||
# src/gssl
|
||||
|
||||
A library for using OpenSSL.
|
||||
|
||||
# src/gauth
|
||||
|
||||
A library for SASL and PAM authentication.
|
||||
|
||||
# src/gsmtp
|
||||
|
||||
An SMTP library.
|
||||
|
||||
# src/gpop
|
||||
|
||||
A POP3 library.
|
||||
|
||||
# src/win32
|
||||
|
||||
Additional classes for windows event processing.
|
||||
|
||||
# src/main
|
||||
|
||||
Application-level classes for E-MailRelay.
|
||||
|
||||
# src/gui
|
||||
|
||||
Installation and configuration GUI program using Qt v4.
|
||||
|
||||
# lib
|
||||
|
||||
Parent directory for ISO C++ fixups for various older compilers.
|
||||
|
||||
# test
|
||||
|
||||
Test scripts and utilities.
|
||||
|
||||
Source file names
|
||||
-----------------
|
||||
Generally the source file names are follow the name of the principal class,
|
||||
(often including the namespace) but all in lowercase. Any underscores in the
|
||||
name indicate a choice of implementation, so class "G::Foo" might have two
|
||||
implementations in the files "gfoo_main.cpp" and "gfoo_alternate.cpp".
|
||||
The choice is normally made by the makefile.
|
||||
|
||||
Portability
|
||||
-----------
|
||||
The E-MailRelay code is written in ISO C++, although avoiding less-widely
|
||||
supported language features such as "mutable", templated methods and "export".
|
||||
|
||||
The header files "gdef.h" in "src/glib", and "gnet.h" in "src/gnet" are intended
|
||||
to be used to fix up compiler portability issues such as missing standard types,
|
||||
non-standard system headers etc. Conditional compilation directives ("#if"
|
||||
etc.) are confined to these headers as far as possible in order to improve
|
||||
readability.
|
||||
|
||||
Deficiencies in the standard headers files provided by older compilers are fixed
|
||||
up by files in the "lib" directory tree. For example, the msvc6.0 compiler
|
||||
sometimes does not put its names into the "std" namespace, even though the
|
||||
std-namespace headers are used. This can be worked round by additional "using"
|
||||
declarations in the "lib/msvc6.0" headers. These work-rounds are kept out of
|
||||
the "src" tree because they are not necessary for more modern compilers.
|
||||
|
||||
Windows/unix portability is generally addressed by providing a common class
|
||||
declaration with two implementations. Where necessary a "pimple" (or "Bridge")
|
||||
pattern is used to hide the system-specific parts of the declaration.
|
||||
|
||||
A good example is the "G::Directory" class used for iterating through files in
|
||||
a directory. The header file "src/glib/gdirectory.h" is common to both systems,
|
||||
but two implementations are provided in "gdirectory_unix.cpp" and
|
||||
"gdirectory_win32.cpp". The unix implementation uses opendir() and glob(),
|
||||
while the windows implementation uses FindFirstFile().
|
||||
|
||||
Sometimes only small parts of the implementation are system-specific. In
|
||||
these cases there are three source files per header. For example, "gsocket.cpp",
|
||||
"gsocket_win32.cpp" and "gsocket_unix.cpp" in the "src/gnet" directory.
|
||||
$ svn co https://svn.code.sf.net/p/emailrelay/code/trunk emailrelay
|
||||
|
||||
Compile-time features
|
||||
---------------------
|
||||
@ -418,33 +226,13 @@ Compile-time features can be selected with options passed to the "configure"
|
||||
script. These include the following:
|
||||
|
||||
* Debug-level logging ("--enable-debug")
|
||||
* IPv6 (Linux only) ("--enable-ipv6")
|
||||
* Configuration GUI ("--enable-gui")
|
||||
* PAM support ("--with-pam")
|
||||
|
||||
Some functionality can be disabled at compile-time in order to reduce the size
|
||||
of the executable, typically when building for embedded systems:
|
||||
|
||||
* Disable POP3 protocol, "--disable-pop"
|
||||
* Disable authentication, "--disable-auth" (requires "--disable-pop")
|
||||
* Disable administration interface, "--disable-admin"
|
||||
* Disable execution of external programs, "--disable-exec"
|
||||
|
||||
The "--enable-small-config" option can be used to change the command-line
|
||||
parsing code to use a configuration file instead, resulting in a smaller
|
||||
executable. This also removes a lot of the configuration checking code, so it is
|
||||
not recommended unless size is critical. (The format of the configuration file
|
||||
is similar to the command-line using the long-form options without the
|
||||
double-dash and using '=' to separate the option from the option value.)
|
||||
|
||||
Use "./configure --help" to see a complete list of options and refer to
|
||||
"acinclude.m4" for more detailed comments.
|
||||
|
||||
Idioms
|
||||
------
|
||||
The "<<=" operator defined in "src/glib/gmemory.h" is used idiomatically
|
||||
to reassign a std::auto_ptr<> since reset() is not always available.
|
||||
|
||||
|
||||
|
||||
Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>. All rights reserved.
|
||||
_____________________________________
|
||||
Copyright (C) 2001-2018 Graeme Walker
|
||||
|
Binary file not shown.
Before ![]() (image error) Size: 22 KiB |
Binary file not shown.
Before ![]() (image error) Size: 26 KiB |
BIN
doc/download-button.png
Normal file
BIN
doc/download-button.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 5.0 KiB |
@ -1,13 +0,0 @@
|
||||
<!-- This comment will put IE 6, 7 and 8 in quirks mode -->
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||
<title>$title</title>
|
||||
<link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="$relpath$search/search.css" rel="stylesheet" type="text/css"/>
|
||||
<script type="text/javaScript" src="$relpath$search/search.js"></script>
|
||||
<link href="$relpath$doxygen.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="$relpath$emailrelay-doxygen.css" rel="stylesheet" type="text/css"/>
|
||||
</head>
|
||||
<body onload='searchBox.OnSelectItem(0);'>
|
@ -7,8 +7,8 @@
|
||||
<body>
|
||||
<div class="div-main">
|
||||
<h1>E-MailRelay Source Code</h1>
|
||||
<p>No <a class="a-href" href="http://www.doxygen.org">doxygen</a> documentation available locally, try <a class="a-href" href="http://emailrelay.sourceforge.net/doxygen/index.html">online</a>.</p>
|
||||
<p>No <a class="a-href" href="http://www.doxygen.org">doxygen</a> documentation available locally, try <a class="a-href" href="http://emailrelay.sourceforge.net/doxygen/namespaces.html">online</a>.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
<!-- Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>. All rights reserved. -->
|
||||
<!-- Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>. All rights reserved. -->
|
||||
|
1552
doc/doxygen.cfg
1552
doc/doxygen.cfg
File diff suppressed because it is too large
Load Diff
2494
doc/doxygen.cfg.in
Normal file
2494
doc/doxygen.cfg.in
Normal file
File diff suppressed because it is too large
Load Diff
51
doc/emailrelay-doxygen.css
Normal file
51
doc/emailrelay-doxygen.css
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
/*
|
||||
emailrelay-doxygen.css
|
||||
*/
|
||||
|
||||
div#titlearea
|
||||
{
|
||||
visibility: hidden ;
|
||||
display: none ;
|
||||
}
|
||||
|
||||
h1
|
||||
{
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
h2
|
||||
{
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
.title
|
||||
{
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
div#projectname
|
||||
{
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
pre.fragment
|
||||
{
|
||||
}
|
||||
|
||||
code
|
||||
{
|
||||
/* font-weight: bold ; */
|
||||
background-color: #eee ;
|
||||
}
|
||||
|
||||
p.startli
|
||||
{
|
||||
}
|
||||
|
||||
li.footer
|
||||
{
|
||||
}
|
@ -1,148 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
/*
|
||||
emailrelay-doxygen.css
|
||||
|
||||
This stylesheet is included by the customised html header
|
||||
after doxygen.css. It repeats those stanzas of doxygen.css
|
||||
that it needs to change and the include order makes sure
|
||||
that this stylesheet takes precedence.
|
||||
|
||||
This file is only installed into the doxygen directory by
|
||||
the makefile if the "doxygen-fixup" post-processing perl
|
||||
script succeeds. If that script decides to do nothing then
|
||||
the standard doxygen stylesheet operates on its own without
|
||||
any interference from here. Specifically, the perl script
|
||||
will fail silently if there is no "Doxygen 1.6/7" marker in
|
||||
the generated html files, so with any version of doxygen
|
||||
before 1.6 or after 1.7 the output will have the standard
|
||||
doxygen style.
|
||||
|
||||
The ".memItemRight a:first-child" stanza is used to operate
|
||||
on the member function name in the list of member functions,
|
||||
but not the subsequent function parameters.
|
||||
|
||||
The "implements", "realmemname", "referencedby", etc class
|
||||
names are added to the html by the "doxygen-fixup" script.
|
||||
|
||||
The #09c colour is the emailrelay heading colour, with #068
|
||||
being a darker variant used within doxygen's blue-shaded
|
||||
tables.
|
||||
|
||||
*/
|
||||
|
||||
body, table, div, p, dl
|
||||
{
|
||||
font-family: verdana, arial, helvetica, sans-serif ;
|
||||
}
|
||||
|
||||
div.tabs a:link, div.tabs a:visited, div.tabs a:active, div.tabs A:hover
|
||||
{
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
h1, h2, h3
|
||||
{
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
a
|
||||
{
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
a:visited
|
||||
{
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
a:hover
|
||||
{
|
||||
color: black;
|
||||
text-decoration: underline;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.contents a, .contents a:visited
|
||||
{
|
||||
color: #09c ;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
a.el
|
||||
{
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
a.el:visited
|
||||
{
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.memItemRight a:first-child
|
||||
{
|
||||
color: black ;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.definitionat, .definitionat a:visited, .definitionat a
|
||||
{
|
||||
color: grey;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.references, .references a:visited, .references a
|
||||
{
|
||||
color: grey;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.referencedby, .referencedby a:visited, .referencedby a
|
||||
{
|
||||
color: grey;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.implements, .implements a:visited, .implements a
|
||||
{
|
||||
color: grey;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
table.memname, td.memname
|
||||
{
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
td.paramname em, td.paramname code
|
||||
{
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.realmemname
|
||||
{
|
||||
color: #068 ;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
@ -1,20 +1,20 @@
|
||||
.\" Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
.\"
|
||||
.\" Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
.\"
|
||||
.\" 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/>.
|
||||
.TH EMAILRELAY-FILTER-COPY 1 local
|
||||
.SH NAME
|
||||
emailrelay-filter-copy \- an E-MailRelay filter for pop-by-name
|
||||
emailrelay-filter-copy \- an emailrelay filter program for pop-by-name
|
||||
.SH SYNOPSIS
|
||||
.B emailrelay-filter-copy
|
||||
.I <emailrelay-content-file>
|
||||
@ -27,15 +27,18 @@ The
|
||||
utility can be used as an
|
||||
.B E-MailRelay
|
||||
.I "--filter"
|
||||
pre-processor program to copy e-mail messages from the main spool
|
||||
directory into all available sub-directories. When using the
|
||||
program to copy e-mail messages from the main spool directory into
|
||||
all available sub-directories. When using the
|
||||
.I "--pop-by-name"
|
||||
feature of the
|
||||
.B E-MailRelay
|
||||
server this results in messages being copied to all POP clients.
|
||||
.LP
|
||||
Only the message envelope is copied; the content file stays in
|
||||
the main directory.
|
||||
the main directory. If the envelope is successfully copied to
|
||||
one or more sub-directories then it is removed from the main
|
||||
spool directory and it will therefore not be available for SMTP
|
||||
forwarding.
|
||||
.SH SEE ALSO
|
||||
.BR emailrelay (1),
|
||||
.SH AUTHOR
|
||||
|
@ -61,320 +61,262 @@ SMTP server in the chain.
|
||||
It can also run in a third mode, as a proxy server
|
||||
(<I>--as-proxy</I>).
|
||||
|
||||
In this mode all messages are forwarded immediately to the next-hop
|
||||
server. Messages are only fully accepted from the sender once they
|
||||
have been successfully delivered to the next-hop server.
|
||||
In this mode all e-mail messages are spooled temporarily while the
|
||||
client is connected and forwarded as soon as the client
|
||||
disconnects.
|
||||
<A NAME="lbAE"> </A>
|
||||
<H2>OPTIONS</H2>
|
||||
|
||||
<DL COMPACT>
|
||||
<DT><B>--address-verifier </B><I><program></I>
|
||||
|
||||
<DD>
|
||||
Runs the specified external program to verify a message recipent's e-mail address. A network verifier can be specified as <I>net:<transport-address></I>.
|
||||
<DT><B>-a, --admin </B><I><admin-port></I>
|
||||
|
||||
<DD>
|
||||
Enables the administration interface and specifies its listening port number.
|
||||
<DT><B>-Q, --admin-terminate </B>
|
||||
Enables an administration interface on the specified listening port number. Use telnet or something similar to connect. The administration interface can be used to trigger forwarding of spooled mail messages if the <I>--forward-to</I> option is used.
|
||||
<DT><B>-Q, --admin-terminate</B>
|
||||
|
||||
<DD>
|
||||
Enables the terminate command on the admin interface.
|
||||
<DT><B>-A, --anonymous </B>
|
||||
Enables the <I>terminate</I> command in the administration interface.
|
||||
<DT><B>-A, --anonymous</B>
|
||||
|
||||
<DD>
|
||||
Disables the smtp vrfy command and sends less verbose smtp responses.
|
||||
Disables the server's SMTP VRFY command, sends less verbose SMTP responses and SMTP greeting, and stops <I>Received</I> lines being added to mail message content files.
|
||||
<DT><B>-q, --as-client </B><I><host:port></I>
|
||||
|
||||
<DD>
|
||||
Runs as a client, forwarding all spooled mail to <host>: equivalent to <I>--log</I> <I>--no-syslog</I> <I>--no-daemon</I> <I>--dont-serve</I> <I>--forward</I> <I>--forward-to</I>.
|
||||
This is equivalent to <I>--log</I>, <I>--no-syslog</I>, <I>--no-daemon</I>, <I>--dont-serve</I>, <I>--forward</I> and <I>--forward-to</I>. It is a convenient way of running a forwarding agent that forwards spooled mail messages and then terminates.
|
||||
<DT><B>-y, --as-proxy </B><I><host:port></I>
|
||||
|
||||
<DD>
|
||||
Runs as a proxy server, forwarding each mail immediately to <host>: equivalent to <I>--log</I> <I>--close-stderr</I> <I>--poll</I>=0 <I>--forward-to</I>.
|
||||
<DT><B>-d, --as-server </B>
|
||||
This is equivalent to <I>--log</I>, <I>--close-stderr</I>, <I>--forward-on-disconnect</I> and <I>--forward-to</I>. It is a convenient way of running a store-and-forward daemon. Use <I>--log</I>, <I>--forward-on-disconnect</I> and <I>--forward-to</I> instead of <I>--as-proxy</I> to keep the standard error stream open.
|
||||
<DT><B>-d, --as-server</B>
|
||||
|
||||
<DD>
|
||||
Runs as a server, storing mail in the spool directory: equivalent to <I>--log</I> <I>--close-stderr</I>.
|
||||
This is equivalent to <I>--log</I> and <I>--close-stderr</I>. It is a convenient way of running a background storage daemon that accepts mail messages and spools them. Use <I>--log</I> instead of <I>--as-server</I> to keep standard error stream open.
|
||||
<DT><B>-C, --client-auth </B><I><file></I>
|
||||
|
||||
<DD>
|
||||
Enables smtp authentication with the remote server, using the given secrets file.
|
||||
Enables SMTP client authentication with the remote server, using the client account details taken from the specified secrets file. The secrets file should normally contain one line that starts with <I>client</I> and that line should have between four and five space-separated fields; the second field is the password encoding (<I>plain</I> or <I>md5</I>), the third is the user-id and the fourth is the password. The user-id is RFC-1891 xtext encoded, and the password is either xtext encoded or generated by <I>emailrelay-passwd</I>. If the remote server does not support SMTP authentication then the SMTP connection will fail.
|
||||
<DT><B>-Y, --client-filter </B><I><program></I>
|
||||
|
||||
<DD>
|
||||
Specifies an external program to process messages when they are forwarded.
|
||||
<DT><B>-j, --client-tls </B>
|
||||
Runs the specified external filter program whenever a mail message is forwarded. The filter is passed the name of the message file in the spool directory so that it can edit it as required. A network filter can be specified as <I>net:<transport-address></I> and prefixes of <I>spam:</I> and <I>exit:</I> are also allowed. The <I>--filter</I> option is normally more useful than <I>--client-filter</I>.
|
||||
<DT><B>-6, --client-interface </B><I><ip-address></I>
|
||||
|
||||
<DD>
|
||||
Enables negotiated tls/ssl for smtp client (if openssl built in).
|
||||
<DT><B>-b, --client-tls-connection </B>
|
||||
Specifies the IP network address to be used to bind the local end of outgoing SMTP connections. By default the address will depend on the routing tables in the normal way. Use <I>0.0.0.0</I> to use only IPv4 addresses returned from DNS lookups of the <I>--forward-to</I> address, or <I>::</I> for IPv6.
|
||||
<DT><B>-j, --client-tls</B>
|
||||
|
||||
<DD>
|
||||
Enables smtp over tls/ssl for smtp client (if openssl built in).
|
||||
<DT><B>-e, --close-stderr </B>
|
||||
Enables negotiated TLS for outgoing SMTP connections; the SMTP STARTTLS command will be issued if the remote server supports it.
|
||||
<DT><B>--client-tls-certificate </B><I><pem-file></I>
|
||||
|
||||
<DD>
|
||||
Closes the standard error stream soon after start-up.
|
||||
Defines the TLS certificate file when acting as a SMTP client. This file must contain the client's private key and certificate chain using the PEM file format. Keep the file permissions tight to avoid accidental exposure of the private key.
|
||||
<DT><B>-b, --client-tls-connection</B>
|
||||
|
||||
<DD>
|
||||
Enables the use of a TLS tunnel for outgoing SMTP connections. This is for SMTP over TLS (SMTPS), not TLS negotiated within SMTP using STARTTLS.
|
||||
<DT><B>--client-tls-required</B>
|
||||
|
||||
<DD>
|
||||
Makes the use of TLS mandatory for outgoing SMTP connections. The SMTP STARTTLS command will be used before mail messages are sent out. If the remote server does not allow STARTTLS then the SMTP connection will fail.
|
||||
<DT><B>--client-tls-server-name </B><I><hostname></I>
|
||||
|
||||
<DD>
|
||||
Defines the target server hostname in the TLS handshake. With <I>--client-tls-connection</I> this can be used for SNI, allowing the remote server to adopt an appropriate identity.
|
||||
<DT><B>--client-tls-verify </B><I><ca-list></I>
|
||||
|
||||
<DD>
|
||||
Enables verification of the remote SMTP server's certificate against any of the trusted CA certificates in the specified file or directory. In many use cases this should be a file containing just your self-signed root certificate.
|
||||
<DT><B>--client-tls-verify-name </B><I><cname></I>
|
||||
|
||||
<DD>
|
||||
Enables verification of the CNAME within the remote SMTP server's certificate.
|
||||
<DT><B>-e, --close-stderr</B>
|
||||
|
||||
<DD>
|
||||
Causes the standard error stream to be closed soon after start-up. This is useful when operating as a backgroud daemon and it is therefore implied by <I>--as-server</I> and <I>--as-proxy</I>.
|
||||
<DT><B>-U, --connection-timeout </B><I><time></I>
|
||||
|
||||
<DD>
|
||||
Sets the timeout (in seconds) when connecting to a remote server (default is 40).
|
||||
<DT><B>-g, --debug </B>
|
||||
Specifies a timeout (in seconds) for establishing a TCP connection to remote SMTP servers. The default is 40 seconds.
|
||||
<DT><B>-g, --debug</B>
|
||||
|
||||
<DD>
|
||||
Generates debug-level logging if built in.
|
||||
Enables debug level logging, if built in. Debug messages are usually only useful when cross-referenced with the source code and they may expose plaintext passwords and mail message content.
|
||||
<DT><B>-D, --domain </B><I><fqdn></I>
|
||||
|
||||
<DD>
|
||||
Sets an override for the host's fully qualified domain name.
|
||||
<DT><B>-x, --dont-serve </B>
|
||||
Specifies the network name that is used in SMTP EHLO commands, <I>Received</I> lines, and for generating authentication challenges. The default network name it derived from a DNS lookup of the local hostname.
|
||||
<DT><B>-x, --dont-serve</B>
|
||||
|
||||
<DD>
|
||||
Disables acting as a server on any port (part of <I>--as-client</I> and usually used with <I>--forward</I>).
|
||||
Disables all network serving, including SMTP, POP and administration interfaces. The program will terminate as soon as any initial forwarding is complete.
|
||||
<DT><B>-z, --filter </B><I><program></I>
|
||||
|
||||
<DD>
|
||||
Specifies an external program to process messages as they are stored.
|
||||
Runs the specified external filter program whenever a mail message is stored. The filter is passed the name of the message file in the spool directory so that it can edit it as required. The mail message is rejected if the filter program terminates with an exit code between 1 and 99. Use <I>net:<transport-address></I> to communicate with a filter daemon over the network, or <I>spam:<transport-address></I> to talk to a spamassassin spamd daemon, or <I>exit:<number></I> to emulate a filter program that just exits.
|
||||
<DT><B>-W, --filter-timeout </B><I><time></I>
|
||||
|
||||
<DD>
|
||||
Sets the timeout (in seconds) for running the <I>--filter</I> processor (default is 300).
|
||||
<DT><B>-f, --forward </B>
|
||||
Specifies a timeout (in seconds) for running a <I>--filter</I> program. The default is 300 seconds.
|
||||
<DT><B>-f, --forward</B>
|
||||
|
||||
<DD>
|
||||
Forwards stored mail on startup (requires <I>--forward-to</I>).
|
||||
Causes spooled mail messages to be forwarded when the program first starts.
|
||||
<DT><B>-1, --forward-on-disconnect</B>
|
||||
|
||||
<DD>
|
||||
Causes spooled mail messages to be forwarded whenever a SMTP client connection disconnects.
|
||||
<DT><B>-o, --forward-to </B><I><host:port></I>
|
||||
|
||||
<DD>
|
||||
Specifies the remote smtp server (required by <I>--forward</I>, <I>--poll</I>, <I>--immediate</I> and <I>--admin</I>).
|
||||
<DT><B>-h, --help </B>
|
||||
Specifies the transport address of the remote SMTP server that is use for mail message forwarding.
|
||||
<DT><B>-h, --help</B>
|
||||
|
||||
<DD>
|
||||
Displays help text and exits.
|
||||
<DT><B>-m, --immediate </B>
|
||||
Displays help text and then exits. Use with <I>--verbose</I> for more complete output.
|
||||
<DT><B>-H, --hidden</B>
|
||||
|
||||
<DD>
|
||||
Enables immediate forwarding of messages as soon as they are received (requires <I>--forward-to</I>).
|
||||
<DT><B>-I, --interface </B><I><ip-list></I>
|
||||
Windows only. Hides the application window and disables all message boxes. This is useful when running as a windows service.
|
||||
<DT><B>-m, --immediate</B>
|
||||
|
||||
<DD>
|
||||
Defines the listening interface(s) for incoming connections (comma-separated list with optional smtp=,pop=,admin= qualifiers).
|
||||
<DT><B>-l, --log </B>
|
||||
Causes mail messages to be forwarded as soon as they are submitted, even before they are accepted. This can be used to do proxying without store-and-forward, but in practice clients tend to to time out while waiting for their mail message to be accepted.
|
||||
<DT><B>-I, --interface </B><I><ip-address-list></I>
|
||||
|
||||
<DD>
|
||||
Writes log information on standard error and syslog (but see <I>--close-stderr</I> and <I>--no-syslog</I>).
|
||||
<DT><B>-L, --log-time </B>
|
||||
Specifies the IP network addresses used to bind listening ports. By default listening ports for incoming SMTP, POP and administration connections will bind the 'any' address for IPv4 and for IPv6, ie. <I>0.0.0.0</I> and <I>::</I>. Use this option to limit listening to particular addresses (and by implication to particular network interfaces). Multiple addresses can be specified by using the option more than once or by using a comma-separated list. Use a prefix of <I>smtp=</I>, <I>pop=</I> or <I>admin=</I> on addresses that should apply only to those types of listening port.
|
||||
<DT><B>-l, --log</B>
|
||||
|
||||
<DD>
|
||||
Adds a timestamp to the logging output.
|
||||
<DT><B>-t, --no-daemon </B>
|
||||
Enables logging to the standard error stream and to the syslog. The <I>--close-stderr</I> and <I>--no-syslog</I> options can be used to disable output to standard error stream and the syslog separately. Note that <I>--as-server</I>, <I>--as-client</I> and <I>--as-proxy</I> imply <I>--log</I>, and <I>--as-server</I> and <I>--as-proxy</I> also imply <I>--close-stderr</I>.
|
||||
<DT><B>-N, --log-file </B><I><file></I>
|
||||
|
||||
<DD>
|
||||
Does not detach from the terminal.
|
||||
<DT><B>-X, --no-smtp </B>
|
||||
Redirects standard-error logging to the specified file. Logging to the log file is not affected by <I>--close-stderr</I>. The filename can include <I>%d</I> to get daily log files; the <I>%d</I> is replaced by the current date in the local timezone using a <I>YYYYMMDD</I> format.
|
||||
<DT><B>-L, --log-time</B>
|
||||
|
||||
<DD>
|
||||
Disables listening for smtp connections (usually used with <I>--admin</I> or <I>--pop</I>).
|
||||
<DT><B>-n, --no-syslog </B>
|
||||
Adds a timestamp to the logging output using the local timezone.
|
||||
<DT><B>-t, --no-daemon</B>
|
||||
|
||||
<DD>
|
||||
Disables syslog output (always overridden by <I>--syslog</I>).
|
||||
Disables the normal backgrounding at startup so that the program runs in the foreground, without forking or detaching from the terminal. On Windows this disables the system tray icon so the program uses a normal window; when the window is closed the program terminates.
|
||||
<DT><B>-X, --no-smtp</B>
|
||||
|
||||
<DD>
|
||||
Disables listening for incoming SMTP connections.
|
||||
<DT><B>-n, --no-syslog</B>
|
||||
|
||||
<DD>
|
||||
Disables logging to the syslog. Note that <I>--as-client</I> implies <I>--no-syslog</I>.
|
||||
<DT><B>-i, --pid-file </B><I><pid-file></I>
|
||||
|
||||
<DD>
|
||||
Defines a file for storing the daemon process-id.
|
||||
Causes the process-id to be written into the specified file when the program starts up, typically after it has become a backgroud daemon.
|
||||
<DT><B>-O, --poll </B><I><period></I>
|
||||
|
||||
<DD>
|
||||
Enables polling of the spool directory for messages to be forwarded with the specified period (zero means on client disconnection) (requires <I>--forward-to</I>).
|
||||
<DT><B>-B, --pop </B>
|
||||
Causes forwarding of spooled mail messages to happen at regular intervals (with the time given in seconds).
|
||||
<DT><B>-B, --pop</B>
|
||||
|
||||
<DD>
|
||||
Enables the pop server.
|
||||
Enables the POP server listening, by default on port 110, providing access to spooled mail messages. Negotiated TLS using the POP3 <I>STLS</I> command will be enabled if the <I>--server-tls</I> option is also given.
|
||||
<DT><B>-F, --pop-auth </B><I><file></I>
|
||||
|
||||
<DD>
|
||||
Defines the pop server secrets file (default is <I>/etc/emailrelay.auth</I>).
|
||||
<DT><B>-J, --pop-by-name </B>
|
||||
Specifies a file containing valid POP account details. The file format is the same as for the SMTP server secrets file, ie. lines starting with <I>server</I>, with user-id and password in the third and fourth fields. A special value of <I>/pam</I> can be used for authentication using linux PAM.
|
||||
<DT><B>-J, --pop-by-name</B>
|
||||
|
||||
<DD>
|
||||
Modifies the pop spool directory according to the pop user name (requires <I>--pop</I>).
|
||||
<DT><B>-G, --pop-no-delete </B>
|
||||
Modifies the spool directory used by the POP server to be a sub-directory with the same name as the POP authentication user-id. This allows multiple POP clients to read the spooled messages without interfering with each other. Content files can stay in the main spool directory with the envelope files copied into user-specific sub-directories. The <I>emailrelay-filter-copy</I> program is a convenient way of doing this when run via <I>--filter</I>.
|
||||
<DT><B>-G, --pop-no-delete</B>
|
||||
|
||||
<DD>
|
||||
Disables message deletion via pop (requires <I>--pop</I>).
|
||||
Disables the POP DELE command so that the command appears to succeed but mail messages are not deleted from the spool directory.
|
||||
<DT><B>-E, --pop-port </B><I><port></I>
|
||||
|
||||
<DD>
|
||||
Specifies the pop listening port number (default is 110) (requires <I>--pop</I>).
|
||||
Sets the POP server's listening port number.
|
||||
<DT><B>-p, --port </B><I><port></I>
|
||||
|
||||
<DD>
|
||||
Specifies the smtp listening port number (default is 25).
|
||||
Sets the port number used for listening for incoming SMTP connections.
|
||||
<DT><B>-w, --prompt-timeout </B><I><time></I>
|
||||
|
||||
<DD>
|
||||
Sets the timeout (in seconds) for getting an initial prompt from the server (default is 20).
|
||||
<DT><B>-r, --remote-clients </B>
|
||||
Specifies a timeout (in seconds) for getting the initial prompt from a remote SMTP server. If no prompt is received after this time then the SMTP dialog goes ahead without it.
|
||||
<DT><B>-r, --remote-clients</B>
|
||||
|
||||
<DD>
|
||||
Allows remote clients to connect.
|
||||
Allows incoming connections from addresses that are not local. The default behaviour is to ignore connections that are not local in order to prevent accidental exposure to the public internet, but a firewall should also be used. The definition of 'local' is different for IPv4 and IPv6.
|
||||
<DT><B>-T, --response-timeout </B><I><time></I>
|
||||
|
||||
<DD>
|
||||
Sets the response timeout (in seconds) when talking to a remote server (default is 1800).
|
||||
Specifies a timeout (in seconds) for getting responses from remote SMTP servers. The default is 1800 seconds.
|
||||
<DT><B>-S, --server-auth </B><I><file></I>
|
||||
|
||||
<DD>
|
||||
Enables authentication of remote clients, using the given secrets file.
|
||||
<DT><B>-K, --server-tls </B><I><pem-file></I>
|
||||
Enables SMTP server authentication of remote SMTP clients. Account names and passwords are taken from the specified secrets file. The secrets file should contain lines that have four space-separated fields, starting with <I>server</I> in the first field; the second field is the password encoding (<I>plain</I> or <I>md5</I>), the third is the client user-id and the fourth is the password. The user-id is RFC-1891 xtext encoded, and the password is either xtext encoded or generated by <I>emailrelay-passwd</I>. A special value of <I>/pam</I> can be used for authentication using linux PAM.
|
||||
<DT><B>-K, --server-tls</B>
|
||||
|
||||
<DD>
|
||||
Enables negotiated tls/ssl for smtp server using the given openssl certificate file (which must be in the directory trusted by openssl).
|
||||
Enables TLS for incoming SMTP and POP connections. SMTP clients can then request TLS encryption by issuing the STARTTLS command. The <I>--server-tls-certificate</I> option must be used to define the server certificate.
|
||||
<DT><B>--server-tls-certificate </B><I><pem-file></I>
|
||||
|
||||
<DD>
|
||||
Defines the TLS certificate file when acting as a SMTP or POP server. This file must contain the server's private key and certificate chain using the PEM file format. Keep the file permissions tight to avoid accidental exposure of the private key.
|
||||
<DT><B>--server-tls-required</B>
|
||||
|
||||
<DD>
|
||||
Makes the use of TLS mandatory for any incoming SMTP and POP connections. SMTP clients must use the STARTTLS command to establish a TLS session before they can issue SMTP AUTH or SMTP MAIL-TO commands.
|
||||
<DT><B>--server-tls-verify </B><I><ca-list></I>
|
||||
|
||||
<DD>
|
||||
Enables verification of remote SMTP and POP clients' certificates against any of the trusted CA certificates in the specified file or directory. In many use cases this should be a file containing just your self-signed root certificate.
|
||||
<DT><B>-M, --size </B><I><bytes></I>
|
||||
|
||||
<DD>
|
||||
Limits the size of submitted messages.
|
||||
Limits the size of mail messages that can be submitted over SMTP.
|
||||
<DT><B>-s, --spool-dir </B><I><dir></I>
|
||||
|
||||
<DD>
|
||||
Specifies the spool directory (default is <I>/var/spool/emailrelay</I>).
|
||||
<DT><B>-k, --syslog </B>
|
||||
Specifies the directory used for holding mail messages that have been received but not yet forwarded.
|
||||
<DT><B>-k, --syslog</B>
|
||||
|
||||
<DD>
|
||||
Forces syslog output if logging is enabled (overrides <I>--no-syslog</I>).
|
||||
<DT><B>-0, --tls-config </B><I><flags></I>
|
||||
When used with <I>--log</I> this option enables logging to the syslog even if the <I>--no-syslog</I> option is also used. This is typically used as a convenient override when using <I>--as-client</I>.
|
||||
<DT><B>-9, --tls-config </B><I><options></I>
|
||||
|
||||
<DD>
|
||||
Sets tls configuration flags (eg. 2 for SSLv2 support).
|
||||
Selects and configures the low-level TLS library, using a comma-separated list of keywords. If OpenSSL and mbedTLS are both built in then keywords of <I>openssl</I> and <I>mbedtls</I> will select one or the other. Keywords like <I>tlsv1.0</I> can be used to set a minimum TLS protocol version, or <I>-tlsv1.2</I> to set a maximum version.
|
||||
<DT><B>-u, --user </B><I><username></I>
|
||||
|
||||
<DD>
|
||||
Names the effective user to switch to if started as root (default is <I>daemon</I>).
|
||||
<DT><B>-v, --verbose </B>
|
||||
When started as root the program switches to an non-privileged effective user-id when idle. This option can be used to define which user-id is used. Ignored on Windows.
|
||||
<DT><B>-v, --verbose</B>
|
||||
|
||||
<DD>
|
||||
Generates more verbose output (works with <I>--help</I> and <I>--log</I>).
|
||||
<DT><B>-Z, --verifier </B><I><program></I>
|
||||
Enables more verbose logging when used with <I>--log</I>, and more verbose help when used with <I>--help</I>.
|
||||
<DT><B>-V, --version</B>
|
||||
|
||||
<DD>
|
||||
Specifies an external program for address verification.
|
||||
<DT><B>-V, --version </B>
|
||||
|
||||
<DD>
|
||||
Displays version information and exits.
|
||||
Displays version information and then exits.
|
||||
</DL>
|
||||
<A NAME="lbAF"> </A>
|
||||
<H2>FILES</H2>
|
||||
|
||||
GNU style...
|
||||
<BR>
|
||||
|
||||
/usr/local/etc/emailrelay.conf
|
||||
<BR>
|
||||
|
||||
/usr/local/etc/emailrelay.conf.template
|
||||
<BR>
|
||||
|
||||
/usr/local/etc/pam.d/emailrelay
|
||||
<BR>
|
||||
|
||||
/usr/local/libexec/emailrelay/emailrelay-filter-copy
|
||||
<BR>
|
||||
|
||||
/usr/local/libexec/emailrelay/emailrelay-poke
|
||||
<BR>
|
||||
|
||||
/usr/local/libexec/emailrelay/examples/*
|
||||
<BR>
|
||||
|
||||
/usr/local/libexec/emailrelay/init/emailrelay
|
||||
<BR>
|
||||
|
||||
/usr/local/man/man1/emailrelay*.1.gz
|
||||
<BR>
|
||||
|
||||
/usr/local/sbin/emailrelay
|
||||
<BR>
|
||||
|
||||
/usr/local/sbin/emailrelay-passwd
|
||||
<BR>
|
||||
|
||||
/usr/local/sbin/emailrelay-submit
|
||||
<BR>
|
||||
|
||||
/usr/local/share/emailrelay/doc/*
|
||||
<BR>
|
||||
|
||||
/usr/local/share/emailrelay/doc/index.html
|
||||
<BR>
|
||||
|
||||
/usr/local/share/emailrelay/doc/README
|
||||
<BR>
|
||||
|
||||
/usr/local/var/spool/emailrelay/emailrelay.*.content
|
||||
<BR>
|
||||
|
||||
/usr/local/var/spool/emailrelay/emailrelay.*.envelope
|
||||
<P>
|
||||
|
||||
FHS style...
|
||||
<BR>
|
||||
|
||||
/etc/emailrelay.conf
|
||||
<BR>
|
||||
|
||||
/etc/init.d/emailrelay
|
||||
<BR>
|
||||
|
||||
/etc/pam.d/emailrelay
|
||||
<BR>
|
||||
|
||||
/usr/lib/emailrelay/emailrelay-filter-copy
|
||||
<BR>
|
||||
|
||||
/usr/lib/emailrelay/emailrelay-poke
|
||||
<BR>
|
||||
|
||||
/usr/lib/emailrelay/examples/*
|
||||
<BR>
|
||||
|
||||
/usr/sbin/emailrelay
|
||||
<BR>
|
||||
|
||||
/usr/sbin/emailrelay-passwd
|
||||
<BR>
|
||||
|
||||
/usr/sbin/emailrelay-submit
|
||||
<BR>
|
||||
|
||||
/usr/share/doc/emailrelay/*
|
||||
<BR>
|
||||
|
||||
/usr/share/doc/emailrelay/index.html
|
||||
<BR>
|
||||
|
||||
/usr/share/doc/emailrelay/README
|
||||
<BR>
|
||||
|
||||
/usr/share/man/man1/emailrelay*.1.gz
|
||||
<BR>
|
||||
|
||||
/var/spool/emailrelay/emailrelay.*.content
|
||||
<BR>
|
||||
|
||||
/var/spool/emailrelay/emailrelay.*.envelope
|
||||
<A NAME="lbAG"> </A>
|
||||
<H2>SEE ALSO</H2>
|
||||
|
||||
E-MailRelay user guide, <A HREF="http://emailrelay.sourceforge.net/userguide.html">http://emailrelay.sourceforge.net/userguide.html</A> .
|
||||
<BR>
|
||||
|
||||
E-MailRelay reference, <A HREF="http://emailrelay.sourceforge.net/reference.html">http://emailrelay.sourceforge.net/reference.html</A> .
|
||||
<BR>
|
||||
|
||||
<B><A HREF="../man1/emailrelay-submit.1.html">emailrelay-submit</A></B>(1),
|
||||
|
||||
<B><A HREF="../man1/emailrelay-passwd.1.html">emailrelay-passwd</A></B>(1),
|
||||
|
||||
<A NAME="lbAH"> </A>
|
||||
<A NAME="lbAG"> </A>
|
||||
<H2>AUTHOR</H2>
|
||||
|
||||
Graeme Walker, mailto:<A HREF="mailto:graeme_walker@users.sourceforge.net">graeme_walker@users.sourceforge.net</A>
|
||||
@ -387,9 +329,8 @@ Graeme Walker, mailto:<A HREF="mailto:graeme_walker@users.sourceforge.net">graem
|
||||
<DT><A HREF="#lbAC">SYNOPSIS</A><DD>
|
||||
<DT><A HREF="#lbAD">DESCRIPTION</A><DD>
|
||||
<DT><A HREF="#lbAE">OPTIONS</A><DD>
|
||||
<DT><A HREF="#lbAF">FILES</A><DD>
|
||||
<DT><A HREF="#lbAG">SEE ALSO</A><DD>
|
||||
<DT><A HREF="#lbAH">AUTHOR</A><DD>
|
||||
<DT><A HREF="#lbAF">SEE ALSO</A><DD>
|
||||
<DT><A HREF="#lbAG">AUTHOR</A><DD>
|
||||
</DL>
|
||||
<HR>
|
||||
This document was created by
|
||||
@ -397,4 +338,4 @@ This document was created by
|
||||
using the manual pages.<BR>
|
||||
</BODY>
|
||||
</HTML>
|
||||
<!-- Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>. All rights reserved. -->
|
||||
<!-- Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>. All rights reserved. -->
|
||||
|
@ -1,20 +1,20 @@
|
||||
.\" Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
.\"
|
||||
.\" Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
.\"
|
||||
.\" 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/>.
|
||||
.TH EMAILRELAY-PASSWD 1 local
|
||||
.SH NAME
|
||||
emailrelay-passwd \- a password encoding utility for E-MailRelay
|
||||
emailrelay-passwd \- a password encoding utility for emailrelay
|
||||
.SH SYNOPSIS
|
||||
.B emailrelay-passwd
|
||||
.SH DESCRIPTION
|
||||
@ -35,17 +35,17 @@ this:
|
||||
.br
|
||||
#
|
||||
.br
|
||||
server cram-md5 bob 1465267825.1002706143.2005162520.2739353706.4126076156.3423185672.2674269368.3056934447
|
||||
server md5 alice Oqng9/H7wAyKgbuqw5VzG1bNO6feqtblyiNEi6QuN5dH
|
||||
.br
|
||||
server cram-md5 alice 4039336516.3719314525.4148590512.4209236927.1897255360.1012201638.2279588408.1076355329
|
||||
server md5 bob Ot6SDdGj23eWjdEuKICgN8Nj9z/Vx9IV3ISz9VvmnaUB
|
||||
.br
|
||||
.SH SEE ALSO
|
||||
.BR emailrelay (1),
|
||||
.BR emailrelay-submit (1),
|
||||
.BR emailrelay-poke (1)
|
||||
.br
|
||||
.B RFC2104
|
||||
.B RFC-2104
|
||||
.br
|
||||
.B RFC2195
|
||||
.B RFC-2195
|
||||
.SH AUTHOR
|
||||
Graeme Walker, mailto:graeme_walker@users.sourceforge.net
|
||||
|
@ -1,33 +0,0 @@
|
||||
.\" Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
.\"
|
||||
.\" 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/>.
|
||||
.TH EMAILRELAY-POKE 1 local
|
||||
.SH NAME
|
||||
emailrelay-poke \- forces an E-MailRelay server to deliver spooled mail
|
||||
.SH SYNOPSIS
|
||||
.B emailrelay-poke
|
||||
[ admin-port [ admin-command ] ]
|
||||
.SH DESCRIPTION
|
||||
.I emailrelay-poke
|
||||
is a lightweight utility which connects to the
|
||||
.I emailrelay
|
||||
administration interface and executes the
|
||||
.B flush
|
||||
command.
|
||||
.SH SEE ALSO
|
||||
.BR emailrelay (1),
|
||||
.BR emailrelay-submit (1),
|
||||
.BR emailrelay-passwd (1)
|
||||
.SH AUTHOR
|
||||
Graeme Walker, mailto:graeme_walker@users.sourceforge.net
|
@ -1,20 +1,20 @@
|
||||
.\" Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
.\"
|
||||
.\" Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
.\"
|
||||
.\" 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/>.
|
||||
.TH EMAILRELAY-SUBMIT 1 local
|
||||
.SH NAME
|
||||
emailrelay-submit \- a submission utility for E-MailRelay
|
||||
emailrelay-submit \- a submission utility for emailrelay
|
||||
.SH SYNOPSIS
|
||||
.B emailrelay-submit
|
||||
[--help] [--verbose] [--spool-dir
|
||||
@ -25,7 +25,7 @@ emailrelay-submit \- a submission utility for E-MailRelay
|
||||
.RI [ to-address \ ...]
|
||||
.SH DESCRIPTION
|
||||
.I emailrelay-submit
|
||||
is a utility which reads an RFC822 e-mail message from the standard
|
||||
is a utility which reads an RFC-822 e-mail message from the standard
|
||||
input, with SMTP envelope recipient addresses passed on the
|
||||
command-line, and writes it into the
|
||||
.B E-MailRelay
|
||||
|
272
doc/emailrelay.1
272
doc/emailrelay.1
@ -1,15 +1,15 @@
|
||||
.\" Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
.\"
|
||||
.\" Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
.\"
|
||||
.\" 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/>.
|
||||
.TH EMAILRELAY 1 local
|
||||
@ -47,225 +47,191 @@ SMTP server in the chain.
|
||||
.LP
|
||||
It can also run in a third mode, as a proxy server
|
||||
.RI ( --as-proxy ).
|
||||
In this mode all messages are forwarded immediately to the next-hop
|
||||
server. Messages are only fully accepted from the sender once they
|
||||
have been successfully delivered to the next-hop server.
|
||||
In this mode all e-mail messages are spooled temporarily while the
|
||||
client is connected and forwarded as soon as the client
|
||||
disconnects.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B --address-verifier \fI<program>\fR
|
||||
Runs the specified external program to verify a message recipent's e-mail address. A network verifier can be specified as \fInet:<transport-address>\fR.
|
||||
.TP
|
||||
.B \-a, --admin \fI<admin-port>\fR
|
||||
Enables the administration interface and specifies its listening port number.
|
||||
Enables an administration interface on the specified listening port number. Use telnet or something similar to connect. The administration interface can be used to trigger forwarding of spooled mail messages if the \fI--forward-to\fR option is used.
|
||||
.TP
|
||||
.B \-Q, --admin-terminate
|
||||
Enables the terminate command on the admin interface.
|
||||
.B \-Q, --admin-terminate
|
||||
Enables the \fIterminate\fR command in the administration interface.
|
||||
.TP
|
||||
.B \-A, --anonymous
|
||||
Disables the smtp vrfy command and sends less verbose smtp responses.
|
||||
.B \-A, --anonymous
|
||||
Disables the server's SMTP VRFY command, sends less verbose SMTP responses and SMTP greeting, and stops \fIReceived\fR lines being added to mail message content files.
|
||||
.TP
|
||||
.B \-q, --as-client \fI<host:port>\fR
|
||||
Runs as a client, forwarding all spooled mail to <host>: equivalent to \fI--log\fR \fI--no-syslog\fR \fI--no-daemon\fR \fI--dont-serve\fR \fI--forward\fR \fI--forward-to\fR.
|
||||
This is equivalent to \fI--log\fR, \fI--no-syslog\fR, \fI--no-daemon\fR, \fI--dont-serve\fR, \fI--forward\fR and \fI--forward-to\fR. It is a convenient way of running a forwarding agent that forwards spooled mail messages and then terminates.
|
||||
.TP
|
||||
.B \-y, --as-proxy \fI<host:port>\fR
|
||||
Runs as a proxy server, forwarding each mail immediately to <host>: equivalent to \fI--log\fR \fI--close-stderr\fR \fI--poll\fR=0 \fI--forward-to\fR.
|
||||
This is equivalent to \fI--log\fR, \fI--close-stderr\fR, \fI--forward-on-disconnect\fR and \fI--forward-to\fR. It is a convenient way of running a store-and-forward daemon. Use \fI--log\fR, \fI--forward-on-disconnect\fR and \fI--forward-to\fR instead of \fI--as-proxy\fR to keep the standard error stream open.
|
||||
.TP
|
||||
.B \-d, --as-server
|
||||
Runs as a server, storing mail in the spool directory: equivalent to \fI--log\fR \fI--close-stderr\fR.
|
||||
.B \-d, --as-server
|
||||
This is equivalent to \fI--log\fR and \fI--close-stderr\fR. It is a convenient way of running a background storage daemon that accepts mail messages and spools them. Use \fI--log\fR instead of \fI--as-server\fR to keep standard error stream open.
|
||||
.TP
|
||||
.B \-C, --client-auth \fI<file>\fR
|
||||
Enables smtp authentication with the remote server, using the given secrets file.
|
||||
Enables SMTP client authentication with the remote server, using the client account details taken from the specified secrets file. The secrets file should normally contain one line that starts with \fIclient\fR and that line should have between four and five space-separated fields; the second field is the password encoding (\fIplain\fR or \fImd5\fR), the third is the user-id and the fourth is the password. The user-id is RFC-1891 xtext encoded, and the password is either xtext encoded or generated by \fIemailrelay-passwd\fR. If the remote server does not support SMTP authentication then the SMTP connection will fail.
|
||||
.TP
|
||||
.B \-Y, --client-filter \fI<program>\fR
|
||||
Specifies an external program to process messages when they are forwarded.
|
||||
Runs the specified external filter program whenever a mail message is forwarded. The filter is passed the name of the message file in the spool directory so that it can edit it as required. A network filter can be specified as \fInet:<transport-address>\fR and prefixes of \fIspam:\fR and \fIexit:\fR are also allowed. The \fI--filter\fR option is normally more useful than \fI--client-filter\fR.
|
||||
.TP
|
||||
.B \-j, --client-tls
|
||||
Enables negotiated tls/ssl for smtp client (if openssl built in).
|
||||
.B \-6, --client-interface \fI<ip-address>\fR
|
||||
Specifies the IP network address to be used to bind the local end of outgoing SMTP connections. By default the address will depend on the routing tables in the normal way. Use \fI0.0.0.0\fR to use only IPv4 addresses returned from DNS lookups of the \fI--forward-to\fR address, or \fI::\fR for IPv6.
|
||||
.TP
|
||||
.B \-b, --client-tls-connection
|
||||
Enables smtp over tls/ssl for smtp client (if openssl built in).
|
||||
.B \-j, --client-tls
|
||||
Enables negotiated TLS for outgoing SMTP connections; the SMTP STARTTLS command will be issued if the remote server supports it.
|
||||
.TP
|
||||
.B \-e, --close-stderr
|
||||
Closes the standard error stream soon after start-up.
|
||||
.B --client-tls-certificate \fI<pem-file>\fR
|
||||
Defines the TLS certificate file when acting as a SMTP client. This file must contain the client's private key and certificate chain using the PEM file format. Keep the file permissions tight to avoid accidental exposure of the private key.
|
||||
.TP
|
||||
.B \-b, --client-tls-connection
|
||||
Enables the use of a TLS tunnel for outgoing SMTP connections. This is for SMTP over TLS (SMTPS), not TLS negotiated within SMTP using STARTTLS.
|
||||
.TP
|
||||
.B --client-tls-required
|
||||
Makes the use of TLS mandatory for outgoing SMTP connections. The SMTP STARTTLS command will be used before mail messages are sent out. If the remote server does not allow STARTTLS then the SMTP connection will fail.
|
||||
.TP
|
||||
.B --client-tls-server-name \fI<hostname>\fR
|
||||
Defines the target server hostname in the TLS handshake. With \fI--client-tls-connection\fR this can be used for SNI, allowing the remote server to adopt an appropriate identity.
|
||||
.TP
|
||||
.B --client-tls-verify \fI<ca-list>\fR
|
||||
Enables verification of the remote SMTP server's certificate against any of the trusted CA certificates in the specified file or directory. In many use cases this should be a file containing just your self-signed root certificate.
|
||||
.TP
|
||||
.B --client-tls-verify-name \fI<cname>\fR
|
||||
Enables verification of the CNAME within the remote SMTP server's certificate.
|
||||
.TP
|
||||
.B \-e, --close-stderr
|
||||
Causes the standard error stream to be closed soon after start-up. This is useful when operating as a backgroud daemon and it is therefore implied by \fI--as-server\fR and \fI--as-proxy\fR.
|
||||
.TP
|
||||
.B \-U, --connection-timeout \fI<time>\fR
|
||||
Sets the timeout (in seconds) when connecting to a remote server (default is 40).
|
||||
Specifies a timeout (in seconds) for establishing a TCP connection to remote SMTP servers. The default is 40 seconds.
|
||||
.TP
|
||||
.B \-g, --debug
|
||||
Generates debug-level logging if built in.
|
||||
.B \-g, --debug
|
||||
Enables debug level logging, if built in. Debug messages are usually only useful when cross-referenced with the source code and they may expose plaintext passwords and mail message content.
|
||||
.TP
|
||||
.B \-D, --domain \fI<fqdn>\fR
|
||||
Sets an override for the host's fully qualified domain name.
|
||||
Specifies the network name that is used in SMTP EHLO commands, \fIReceived\fR lines, and for generating authentication challenges. The default network name it derived from a DNS lookup of the local hostname.
|
||||
.TP
|
||||
.B \-x, --dont-serve
|
||||
Disables acting as a server on any port (part of \fI--as-client\fR and usually used with \fI--forward\fR).
|
||||
.B \-x, --dont-serve
|
||||
Disables all network serving, including SMTP, POP and administration interfaces. The program will terminate as soon as any initial forwarding is complete.
|
||||
.TP
|
||||
.B \-z, --filter \fI<program>\fR
|
||||
Specifies an external program to process messages as they are stored.
|
||||
Runs the specified external filter program whenever a mail message is stored. The filter is passed the name of the message file in the spool directory so that it can edit it as required. The mail message is rejected if the filter program terminates with an exit code between 1 and 99. Use \fInet:<transport-address>\fR to communicate with a filter daemon over the network, or \fIspam:<transport-address>\fR to talk to a spamassassin spamd daemon, or \fIexit:<number>\fR to emulate a filter program that just exits.
|
||||
.TP
|
||||
.B \-W, --filter-timeout \fI<time>\fR
|
||||
Sets the timeout (in seconds) for running the \fI--filter\fR processor (default is 300).
|
||||
Specifies a timeout (in seconds) for running a \fI--filter\fR program. The default is 300 seconds.
|
||||
.TP
|
||||
.B \-f, --forward
|
||||
Forwards stored mail on startup (requires \fI--forward-to\fR).
|
||||
.B \-f, --forward
|
||||
Causes spooled mail messages to be forwarded when the program first starts.
|
||||
.TP
|
||||
.B \-1, --forward-on-disconnect
|
||||
Causes spooled mail messages to be forwarded whenever a SMTP client connection disconnects.
|
||||
.TP
|
||||
.B \-o, --forward-to \fI<host:port>\fR
|
||||
Specifies the remote smtp server (required by \fI--forward\fR, \fI--poll\fR, \fI--immediate\fR and \fI--admin\fR).
|
||||
Specifies the transport address of the remote SMTP server that is use for mail message forwarding.
|
||||
.TP
|
||||
.B \-h, --help
|
||||
Displays help text and exits.
|
||||
.B \-h, --help
|
||||
Displays help text and then exits. Use with \fI--verbose\fR for more complete output.
|
||||
.TP
|
||||
.B \-m, --immediate
|
||||
Enables immediate forwarding of messages as soon as they are received (requires \fI--forward-to\fR).
|
||||
.B \-H, --hidden
|
||||
Windows only. Hides the application window and disables all message boxes. This is useful when running as a windows service.
|
||||
.TP
|
||||
.B \-I, --interface \fI<ip-list>\fR
|
||||
Defines the listening interface(s) for incoming connections (comma-separated list with optional smtp=,pop=,admin= qualifiers).
|
||||
.B \-m, --immediate
|
||||
Causes mail messages to be forwarded as soon as they are submitted, even before they are accepted. This can be used to do proxying without store-and-forward, but in practice clients tend to to time out while waiting for their mail message to be accepted.
|
||||
.TP
|
||||
.B \-l, --log
|
||||
Writes log information on standard error and syslog (but see \fI--close-stderr\fR and \fI--no-syslog\fR).
|
||||
.B \-I, --interface \fI<ip-address-list>\fR
|
||||
Specifies the IP network addresses used to bind listening ports. By default listening ports for incoming SMTP, POP and administration connections will bind the 'any' address for IPv4 and for IPv6, ie. \fI0.0.0.0\fR and \fI::\fR. Use this option to limit listening to particular addresses (and by implication to particular network interfaces). Multiple addresses can be specified by using the option more than once or by using a comma-separated list. Use a prefix of \fIsmtp=\fR, \fIpop=\fR or \fIadmin=\fR on addresses that should apply only to those types of listening port.
|
||||
.TP
|
||||
.B \-L, --log-time
|
||||
Adds a timestamp to the logging output.
|
||||
.B \-l, --log
|
||||
Enables logging to the standard error stream and to the syslog. The \fI--close-stderr\fR and \fI--no-syslog\fR options can be used to disable output to standard error stream and the syslog separately. Note that \fI--as-server\fR, \fI--as-client\fR and \fI--as-proxy\fR imply \fI--log\fR, and \fI--as-server\fR and \fI--as-proxy\fR also imply \fI--close-stderr\fR.
|
||||
.TP
|
||||
.B \-t, --no-daemon
|
||||
Does not detach from the terminal.
|
||||
.B \-N, --log-file \fI<file>\fR
|
||||
Redirects standard-error logging to the specified file. Logging to the log file is not affected by \fI--close-stderr\fR. The filename can include \fI%d\fR to get daily log files; the \fI%d\fR is replaced by the current date in the local timezone using a \fIYYYYMMDD\fR format.
|
||||
.TP
|
||||
.B \-X, --no-smtp
|
||||
Disables listening for smtp connections (usually used with \fI--admin\fR or \fI--pop\fR).
|
||||
.B \-L, --log-time
|
||||
Adds a timestamp to the logging output using the local timezone.
|
||||
.TP
|
||||
.B \-n, --no-syslog
|
||||
Disables syslog output (always overridden by \fI--syslog\fR).
|
||||
.B \-t, --no-daemon
|
||||
Disables the normal backgrounding at startup so that the program runs in the foreground, without forking or detaching from the terminal. On Windows this disables the system tray icon so the program uses a normal window; when the window is closed the program terminates.
|
||||
.TP
|
||||
.B \-X, --no-smtp
|
||||
Disables listening for incoming SMTP connections.
|
||||
.TP
|
||||
.B \-n, --no-syslog
|
||||
Disables logging to the syslog. Note that \fI--as-client\fR implies \fI--no-syslog\fR.
|
||||
.TP
|
||||
.B \-i, --pid-file \fI<pid-file>\fR
|
||||
Defines a file for storing the daemon process-id.
|
||||
Causes the process-id to be written into the specified file when the program starts up, typically after it has become a backgroud daemon.
|
||||
.TP
|
||||
.B \-O, --poll \fI<period>\fR
|
||||
Enables polling of the spool directory for messages to be forwarded with the specified period (zero means on client disconnection) (requires \fI--forward-to\fR).
|
||||
Causes forwarding of spooled mail messages to happen at regular intervals (with the time given in seconds).
|
||||
.TP
|
||||
.B \-B, --pop
|
||||
Enables the pop server.
|
||||
.B \-B, --pop
|
||||
Enables the POP server listening, by default on port 110, providing access to spooled mail messages. Negotiated TLS using the POP3 \fISTLS\fR command will be enabled if the \fI--server-tls\fR option is also given.
|
||||
.TP
|
||||
.B \-F, --pop-auth \fI<file>\fR
|
||||
Defines the pop server secrets file (default is \fI/etc/emailrelay.auth\fR).
|
||||
Specifies a file containing valid POP account details. The file format is the same as for the SMTP server secrets file, ie. lines starting with \fIserver\fR, with user-id and password in the third and fourth fields. A special value of \fI/pam\fR can be used for authentication using linux PAM.
|
||||
.TP
|
||||
.B \-J, --pop-by-name
|
||||
Modifies the pop spool directory according to the pop user name (requires \fI--pop\fR).
|
||||
.B \-J, --pop-by-name
|
||||
Modifies the spool directory used by the POP server to be a sub-directory with the same name as the POP authentication user-id. This allows multiple POP clients to read the spooled messages without interfering with each other. Content files can stay in the main spool directory with the envelope files copied into user-specific sub-directories. The \fIemailrelay-filter-copy\fR program is a convenient way of doing this when run via \fI--filter\fR.
|
||||
.TP
|
||||
.B \-G, --pop-no-delete
|
||||
Disables message deletion via pop (requires \fI--pop\fR).
|
||||
.B \-G, --pop-no-delete
|
||||
Disables the POP DELE command so that the command appears to succeed but mail messages are not deleted from the spool directory.
|
||||
.TP
|
||||
.B \-E, --pop-port \fI<port>\fR
|
||||
Specifies the pop listening port number (default is 110) (requires \fI--pop\fR).
|
||||
Sets the POP server's listening port number.
|
||||
.TP
|
||||
.B \-p, --port \fI<port>\fR
|
||||
Specifies the smtp listening port number (default is 25).
|
||||
Sets the port number used for listening for incoming SMTP connections.
|
||||
.TP
|
||||
.B \-w, --prompt-timeout \fI<time>\fR
|
||||
Sets the timeout (in seconds) for getting an initial prompt from the server (default is 20).
|
||||
Specifies a timeout (in seconds) for getting the initial prompt from a remote SMTP server. If no prompt is received after this time then the SMTP dialog goes ahead without it.
|
||||
.TP
|
||||
.B \-r, --remote-clients
|
||||
Allows remote clients to connect.
|
||||
.B \-r, --remote-clients
|
||||
Allows incoming connections from addresses that are not local. The default behaviour is to ignore connections that are not local in order to prevent accidental exposure to the public internet, but a firewall should also be used. The definition of 'local' is different for IPv4 and IPv6.
|
||||
.TP
|
||||
.B \-T, --response-timeout \fI<time>\fR
|
||||
Sets the response timeout (in seconds) when talking to a remote server (default is 1800).
|
||||
Specifies a timeout (in seconds) for getting responses from remote SMTP servers. The default is 1800 seconds.
|
||||
.TP
|
||||
.B \-S, --server-auth \fI<file>\fR
|
||||
Enables authentication of remote clients, using the given secrets file.
|
||||
Enables SMTP server authentication of remote SMTP clients. Account names and passwords are taken from the specified secrets file. The secrets file should contain lines that have four space-separated fields, starting with \fIserver\fR in the first field; the second field is the password encoding (\fIplain\fR or \fImd5\fR), the third is the client user-id and the fourth is the password. The user-id is RFC-1891 xtext encoded, and the password is either xtext encoded or generated by \fIemailrelay-passwd\fR. A special value of \fI/pam\fR can be used for authentication using linux PAM.
|
||||
.TP
|
||||
.B \-K, --server-tls \fI<pem-file>\fR
|
||||
Enables negotiated tls/ssl for smtp server using the given openssl certificate file (which must be in the directory trusted by openssl).
|
||||
.B \-K, --server-tls
|
||||
Enables TLS for incoming SMTP and POP connections. SMTP clients can then request TLS encryption by issuing the STARTTLS command. The \fI--server-tls-certificate\fR option must be used to define the server certificate.
|
||||
.TP
|
||||
.B --server-tls-certificate \fI<pem-file>\fR
|
||||
Defines the TLS certificate file when acting as a SMTP or POP server. This file must contain the server's private key and certificate chain using the PEM file format. Keep the file permissions tight to avoid accidental exposure of the private key.
|
||||
.TP
|
||||
.B --server-tls-required
|
||||
Makes the use of TLS mandatory for any incoming SMTP and POP connections. SMTP clients must use the STARTTLS command to establish a TLS session before they can issue SMTP AUTH or SMTP MAIL-TO commands.
|
||||
.TP
|
||||
.B --server-tls-verify \fI<ca-list>\fR
|
||||
Enables verification of remote SMTP and POP clients' certificates against any of the trusted CA certificates in the specified file or directory. In many use cases this should be a file containing just your self-signed root certificate.
|
||||
.TP
|
||||
.B \-M, --size \fI<bytes>\fR
|
||||
Limits the size of submitted messages.
|
||||
Limits the size of mail messages that can be submitted over SMTP.
|
||||
.TP
|
||||
.B \-s, --spool-dir \fI<dir>\fR
|
||||
Specifies the spool directory (default is \fI/var/spool/emailrelay\fR).
|
||||
Specifies the directory used for holding mail messages that have been received but not yet forwarded.
|
||||
.TP
|
||||
.B \-k, --syslog
|
||||
Forces syslog output if logging is enabled (overrides \fI--no-syslog\fR).
|
||||
.B \-k, --syslog
|
||||
When used with \fI--log\fR this option enables logging to the syslog even if the \fI--no-syslog\fR option is also used. This is typically used as a convenient override when using \fI--as-client\fR.
|
||||
.TP
|
||||
.B \-0, --tls-config \fI<flags>\fR
|
||||
Sets tls configuration flags (eg. 2 for SSLv2 support).
|
||||
.B \-9, --tls-config \fI<options>\fR
|
||||
Selects and configures the low-level TLS library, using a comma-separated list of keywords. If OpenSSL and mbedTLS are both built in then keywords of \fIopenssl\fR and \fImbedtls\fR will select one or the other. Keywords like \fItlsv1.0\fR can be used to set a minimum TLS protocol version, or \fI-tlsv1.2\fR to set a maximum version.
|
||||
.TP
|
||||
.B \-u, --user \fI<username>\fR
|
||||
Names the effective user to switch to if started as root (default is \fIdaemon\fR).
|
||||
When started as root the program switches to an non-privileged effective user-id when idle. This option can be used to define which user-id is used. Ignored on Windows.
|
||||
.TP
|
||||
.B \-v, --verbose
|
||||
Generates more verbose output (works with \fI--help\fR and \fI--log\fR).
|
||||
.B \-v, --verbose
|
||||
Enables more verbose logging when used with \fI--log\fR, and more verbose help when used with \fI--help\fR.
|
||||
.TP
|
||||
.B \-Z, --verifier \fI<program>\fR
|
||||
Specifies an external program for address verification.
|
||||
.TP
|
||||
.B \-V, --version
|
||||
Displays version information and exits.
|
||||
.SH FILES
|
||||
GNU style...
|
||||
.br
|
||||
/usr/local/etc/emailrelay.conf
|
||||
.br
|
||||
/usr/local/etc/emailrelay.conf.template
|
||||
.br
|
||||
/usr/local/etc/pam.d/emailrelay
|
||||
.br
|
||||
/usr/local/libexec/emailrelay/emailrelay-filter-copy
|
||||
.br
|
||||
/usr/local/libexec/emailrelay/emailrelay-poke
|
||||
.br
|
||||
/usr/local/libexec/emailrelay/examples/*
|
||||
.br
|
||||
/usr/local/libexec/emailrelay/init/emailrelay
|
||||
.br
|
||||
/usr/local/man/man1/emailrelay*.1.gz
|
||||
.br
|
||||
/usr/local/sbin/emailrelay
|
||||
.br
|
||||
/usr/local/sbin/emailrelay-passwd
|
||||
.br
|
||||
/usr/local/sbin/emailrelay-submit
|
||||
.br
|
||||
/usr/local/share/emailrelay/doc/*
|
||||
.br
|
||||
/usr/local/share/emailrelay/doc/index.html
|
||||
.br
|
||||
/usr/local/share/emailrelay/doc/README
|
||||
.br
|
||||
/usr/local/var/spool/emailrelay/emailrelay.*.content
|
||||
.br
|
||||
/usr/local/var/spool/emailrelay/emailrelay.*.envelope
|
||||
.LP
|
||||
FHS style...
|
||||
.br
|
||||
/etc/emailrelay.conf
|
||||
.br
|
||||
/etc/init.d/emailrelay
|
||||
.br
|
||||
/etc/pam.d/emailrelay
|
||||
.br
|
||||
/usr/lib/emailrelay/emailrelay-filter-copy
|
||||
.br
|
||||
/usr/lib/emailrelay/emailrelay-poke
|
||||
.br
|
||||
/usr/lib/emailrelay/examples/*
|
||||
.br
|
||||
/usr/sbin/emailrelay
|
||||
.br
|
||||
/usr/sbin/emailrelay-passwd
|
||||
.br
|
||||
/usr/sbin/emailrelay-submit
|
||||
.br
|
||||
/usr/share/doc/emailrelay/*
|
||||
.br
|
||||
/usr/share/doc/emailrelay/index.html
|
||||
.br
|
||||
/usr/share/doc/emailrelay/README
|
||||
.br
|
||||
/usr/share/man/man1/emailrelay*.1.gz
|
||||
.br
|
||||
/var/spool/emailrelay/emailrelay.*.content
|
||||
.br
|
||||
/var/spool/emailrelay/emailrelay.*.envelope
|
||||
.B \-V, --version
|
||||
Displays version information and then exits.
|
||||
.SH SEE ALSO
|
||||
E-MailRelay user guide, http://emailrelay.sourceforge.net/userguide.html .
|
||||
.br
|
||||
E-MailRelay reference, http://emailrelay.sourceforge.net/reference.html .
|
||||
.br
|
||||
.BR emailrelay-submit (1),
|
||||
.BR emailrelay-passwd (1),
|
||||
.SH AUTHOR
|
||||
|
115
doc/emailrelay.css
Normal file
115
doc/emailrelay.css
Normal file
@ -0,0 +1,115 @@
|
||||
/*
|
||||
Copyright (C) 2001-2018 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
/*
|
||||
emailrelay.css
|
||||
*/
|
||||
|
||||
body
|
||||
{
|
||||
font-family: verdana, arial, helvetica, sans-serif ;
|
||||
color: #000 ;
|
||||
background-color: #fff ;
|
||||
margin: 0px ;
|
||||
padding: 0px ;
|
||||
}
|
||||
|
||||
h1
|
||||
{
|
||||
text-align: center ;
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
h2
|
||||
{
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
div.div-main
|
||||
{
|
||||
margin-left: 10% ;
|
||||
margin-right: 10% ;
|
||||
}
|
||||
|
||||
div.div-footer
|
||||
{
|
||||
}
|
||||
|
||||
div.div-pre
|
||||
{
|
||||
margin-left: 3% ;
|
||||
background-color: #ddd ;
|
||||
padding: 0.5em ;
|
||||
border: none ;
|
||||
}
|
||||
|
||||
p
|
||||
{
|
||||
font-family: verdana, arial, helvetica, sans-serif ;
|
||||
text-align: justify ;
|
||||
}
|
||||
|
||||
img
|
||||
{
|
||||
border-width: 0px ;
|
||||
border-style: none ; /* check */
|
||||
margin-left: 8% ;
|
||||
}
|
||||
|
||||
a.a-header
|
||||
{
|
||||
text-decoration:none ;
|
||||
}
|
||||
|
||||
a.a-href
|
||||
{
|
||||
text-decoration: none ;
|
||||
font-weight: bold ;
|
||||
}
|
||||
|
||||
a.a-href:link
|
||||
{
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
a.a-href:visited
|
||||
{
|
||||
color: #07a ;
|
||||
}
|
||||
|
||||
a.a-href:hover
|
||||
{
|
||||
color: #09c ;
|
||||
background-color: #ddd ;
|
||||
}
|
||||
|
||||
em.quote
|
||||
{
|
||||
font-weight: bold ;
|
||||
}
|
||||
|
||||
em.fn
|
||||
{
|
||||
font-weight: bold ;
|
||||
}
|
||||
|
||||
li em.fn
|
||||
{
|
||||
font-weight: normal ;
|
||||
font-style: normal ;
|
||||
}
|
||||
|
||||
dt
|
||||
{
|
||||
font-weight: bold ;
|
||||
margin-left: 3% ;
|
||||
}
|
||||
|
||||
dd
|
||||
{
|
||||
font-size: smaller ;
|
||||
margin-left: 6% ;
|
||||
padding-bottom: 8px ;
|
||||
}
|
||||
|
@ -1,229 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2001-2013 Graeme Walker <graeme_walker@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
/*
|
||||
emailrelay.css
|
||||
*/
|
||||
|
||||
body
|
||||
{
|
||||
font-family: verdana, arial, helvetica, sans-serif ;
|
||||
|
||||
color: #000 ;
|
||||
background-color: #fff ;
|
||||
|
||||
margin: 0px ;
|
||||
padding: 0px ;
|
||||
}
|
||||
|
||||
div.Header
|
||||
{
|
||||
background-color: #ddd ;
|
||||
|
||||
padding-top: 10px ;
|
||||
border-bottom: 1px #999 solid ;
|
||||
height: 80px ;
|
||||
width: 100% ;
|
||||
}
|
||||
|
||||
h1
|
||||
{
|
||||
text-align: center ;
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
div.Header h1
|
||||
{
|
||||
margin: 0px ;
|
||||
}
|
||||
|
||||
div.Content
|
||||
{
|
||||
margin-left: 230px ;
|
||||
padding-left: 5px ;
|
||||
padding-top: 5px ;
|
||||
padding-bottom: 5px ;
|
||||
padding-right: 40px ;
|
||||
}
|
||||
|
||||
div.Menu
|
||||
{
|
||||
background-color: #ddd ;
|
||||
|
||||
float: left ;
|
||||
width: 180px ;
|
||||
margin-left: 25px ;
|
||||
margin-right: 0px ;
|
||||
margin-top: 100px ;
|
||||
margin-bottom: 10px ;
|
||||
|
||||
border-style: dashed ;
|
||||
border-width: 1px ;
|
||||
border-color: #999 ;
|
||||
|
||||
padding: 3px ;
|
||||
}
|
||||
|
||||
div.Footer
|
||||
{
|
||||
}
|
||||
|
||||
div.div-main
|
||||
{
|
||||
margin-left: 10% ;
|
||||
margin-right: 10% ;
|
||||
}
|
||||
|
||||
div.div-toc
|
||||
{
|
||||
background-color: #ddd ;
|
||||
}
|
||||
|
||||
div.div-pre
|
||||
{
|
||||
margin-left: 3% ;
|
||||
background-color: #ddd ;
|
||||
padding: 0.5em ;
|
||||
border: none ;
|
||||
}
|
||||
|
||||
img
|
||||
{
|
||||
border-width: 0px ;
|
||||
border-style: none ; /* check */
|
||||
margin-left: 8% ;
|
||||
}
|
||||
|
||||
h2
|
||||
{
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
p
|
||||
{
|
||||
font-family: verdana, arial, helvetica, sans-serif ;
|
||||
text-align: justify ;
|
||||
}
|
||||
|
||||
h3.h3-toc
|
||||
{
|
||||
display: block ;
|
||||
margin: 0px ;
|
||||
padding: 0px ;
|
||||
width: 100% ;
|
||||
border-bottom: 1px #999 dashed ;
|
||||
text-decoration: none ;
|
||||
}
|
||||
|
||||
h3.h3-toc-last
|
||||
{
|
||||
display: block ;
|
||||
margin: 0px ;
|
||||
padding: 0px ;
|
||||
width: 100% ;
|
||||
text-decoration: none ;
|
||||
}
|
||||
|
||||
p.p-toc
|
||||
{
|
||||
padding-top: 0px ;
|
||||
padding-bottom: 0px ;
|
||||
padding-left: 15px ;
|
||||
margin: 0px ;
|
||||
border-bottom: 1px #999 dashed ;
|
||||
text-align: left ;
|
||||
}
|
||||
|
||||
a.a-toc
|
||||
{
|
||||
color: #09c ;
|
||||
text-decoration: none ;
|
||||
padding: 0px ;
|
||||
margin: 0px ;
|
||||
}
|
||||
|
||||
a.a-toc:hover
|
||||
{
|
||||
color: #09c ;
|
||||
background-color: #ccc ;
|
||||
}
|
||||
|
||||
a.a-toc-expander
|
||||
{
|
||||
color: #09c ;
|
||||
text-decoration: none ;
|
||||
font-size: smaller ;
|
||||
}
|
||||
|
||||
a.a-toc-expander:hover
|
||||
{
|
||||
color: #09c ;
|
||||
background-color: #ccc ;
|
||||
}
|
||||
|
||||
a.a-header
|
||||
{
|
||||
text-decoration:none ;
|
||||
}
|
||||
|
||||
a.a-href
|
||||
{
|
||||
text-decoration: none ;
|
||||
font-weight: bold ;
|
||||
}
|
||||
|
||||
a.a-href:link
|
||||
{
|
||||
color: #09c ;
|
||||
}
|
||||
|
||||
a.a-href:visited
|
||||
{
|
||||
color: #07a ;
|
||||
}
|
||||
|
||||
a.a-href:hover
|
||||
{
|
||||
color: #09c ;
|
||||
background-color: #ddd ;
|
||||
}
|
||||
|
||||
em.quote
|
||||
{
|
||||
font-weight: bold ;
|
||||
}
|
||||
|
||||
em.fn
|
||||
{
|
||||
font-weight: bold ;
|
||||
}
|
||||
|
||||
li em.fn
|
||||
{
|
||||
font-weight: normal ;
|
||||
font-style: normal ;
|
||||
}
|
||||
|
||||
dt
|
||||
{
|
||||
font-weight: bold ;
|
||||
margin-left: 3% ;
|
||||
}
|
||||
|
||||
dd
|
||||
{
|
||||
font-size: smaller ;
|
||||
margin-left: 6% ;
|
||||
padding-bottom: 4px ; /* for konqueror */
|
||||
}
|
||||
|
||||
span.span-mailto
|
||||
{
|
||||
font-size: smaller ;
|
||||
}
|
||||
|
||||
#img-sourceforge
|
||||
{
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user