aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2015-10-10 23:22:05 +0000
committerBaptiste Daroussin <bapt@FreeBSD.org>2015-10-10 23:22:05 +0000
commit21301f73549aa63885352c5d33eadf82484c4bf7 (patch)
tree237affd556bb957b95eebf7bba47cc1d6cf3f88e
parentc48517e8d3cc4e8abc200d7d5dffc340fc4f01c7 (diff)
downloadsrc-21301f73549aa63885352c5d33eadf82484c4bf7.tar.gz
src-21301f73549aa63885352c5d33eadf82484c4bf7.zip
Import dma 0.10vendor/dma/0.10
Notes
Notes: svn path=/vendor/dma/dist/; revision=289121 svn path=/vendor/dma/0.10/; revision=289122; tag=vendor/dma/0.10
-rw-r--r--BSDmakefile28
-rw-r--r--LICENSE4
-rw-r--r--README.markdown5
-rw-r--r--TODO1
-rw-r--r--VERSION2
-rw-r--r--aliases_parse.y2
-rw-r--r--aliases_scan.l2
-rw-r--r--conf.c17
-rw-r--r--debian/NEWS29
-rw-r--r--debian/README.Debian12
-rw-r--r--debian/changelog297
-rw-r--r--debian/compat1
-rw-r--r--debian/control37
-rw-r--r--debian/copyright91
-rw-r--r--debian/dma-migrate.dirs2
-rw-r--r--debian/dma-migrate.install1
-rw-r--r--debian/dma-migrate.manpages1
-rw-r--r--debian/dma.dirs4
-rw-r--r--debian/dma.links6
-rw-r--r--debian/dma.lintian-overrides8
-rw-r--r--debian/migrate/Makefile4
-rw-r--r--debian/migrate/NEWS6
-rw-r--r--debian/migrate/dma-migrate.898
-rw-r--r--debian/migrate/dma-migrate.c413
-rwxr-xr-xdebian/rules49
-rw-r--r--debian/source/format1
-rw-r--r--debian/source/options2
-rw-r--r--dma-mbox-create.c30
-rw-r--r--dma.81
-rw-r--r--dma.c59
-rw-r--r--dma.h6
-rw-r--r--dns.c27
-rwxr-xr-xget-version.sh4
-rw-r--r--local.c5
-rw-r--r--mail.c19
-rw-r--r--net.c1
-rw-r--r--spool.c5
-rw-r--r--util.c3
38 files changed, 113 insertions, 1170 deletions
diff --git a/BSDmakefile b/BSDmakefile
deleted file mode 100644
index af3a0ac7c34f..000000000000
--- a/BSDmakefile
+++ /dev/null
@@ -1,28 +0,0 @@
-# $DragonFly: src/libexec/dma/Makefile,v 1.5 2008/09/19 00:36:57 corecode Exp $
-#
-
-version!= sh get-version.sh
-
-CFLAGS+= -I${.CURDIR}
-CFLAGS+= -DHAVE_REALLOCF -DHAVE_STRLCPY -DHAVE_GETPROGNAME
-CFLAGS+= -DLIBEXEC_PATH='"${LIBEXEC}"' -DDMA_VERSION='"${version}"'
-CFLAGS+= -DCONF_PATH='"${CONFDIR}"'
-
-DPADD= ${LIBSSL} ${LIBCRYPTO}
-LDADD= -lssl -lcrypto
-
-PROG= dma
-SRCS= aliases_parse.y aliases_scan.l base64.c conf.c crypto.c
-SRCS+= dma.c dns.c local.c mail.c net.c spool.c util.c
-MAN= dma.8
-
-PREFIX?= /usr/local
-LIBEXEC?= ${PREFIX}/libexec
-CONFDIR?= ${PREFIX}/etc/dma
-
-BINOWN= root
-BINGRP= mail
-BINMODE=2555
-WARNS?= 6
-
-.include <bsd.prog.mk>
diff --git a/LICENSE b/LICENSE
index b89e5bcd16f3..277b3e4e8be3 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,5 +1,5 @@
+Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
Copyright (c) 2008 The DragonFly Project.
-Copyright (c) 2008-2011, Simon Schubert <2@0x2c.org>.
All rights reserved.
This code is derived from software contributed to The DragonFly Project
@@ -37,7 +37,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
-Copyright (c) 1995-2001 Kungliga Tekniska Högskolan
+Copyright (c) 1995-2001 Kungliga Tekniska Högskolan
(Royal Institute of Technology, Stockholm, Sweden).
All rights reserved.
diff --git a/README.markdown b/README.markdown
index 13ff20c9aa41..3e043de33df9 100644
--- a/README.markdown
+++ b/README.markdown
@@ -15,8 +15,13 @@ incoming connections.
Building
--------
+In Linux:
+
make
+In BSD:
+
+ cd bsd && make
Installation
------------
diff --git a/TODO b/TODO
index 01de465d66af..e70814cf6127 100644
--- a/TODO
+++ b/TODO
@@ -1,5 +1,4 @@
- unquote/handle quoted local recipients
-- use proper sysexit codes
- handle/use ESMTP extensions
- .forward support
- suggest way to run a queue flush on boot
diff --git a/VERSION b/VERSION
index 490a0cdcc139..9097bf9dbe5f 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-v0.9
+v0.10
diff --git a/aliases_parse.y b/aliases_parse.y
index a5a9e7b32f07..46728e6f205d 100644
--- a/aliases_parse.y
+++ b/aliases_parse.y
@@ -7,8 +7,6 @@
extern int yylineno;
static void yyerror(const char *);
-int yywrap(void);
-int yylex(void);
static void
yyerror(const char *msg)
diff --git a/aliases_scan.l b/aliases_scan.l
index 809d1e168731..8130c3e43098 100644
--- a/aliases_scan.l
+++ b/aliases_scan.l
@@ -1,11 +1,11 @@
%{
#include <string.h>
+#include "dma.h"
#include "aliases_parse.h"
#define YY_NO_INPUT
-int yylex(void);
%}
%option yylineno
diff --git a/conf.c b/conf.c
index 919ab7c4d77e..3e3c7d3d8bd2 100644
--- a/conf.c
+++ b/conf.c
@@ -64,7 +64,7 @@ trim_line(char *line)
if (line[0] == '.') {
if ((linelen + 2) > 1000) {
syslog(LOG_CRIT, "Cannot escape leading dot. Buffer overflow");
- exit(1);
+ exit(EX_DATAERR);
}
memmove((line + 1), line, (linelen + 1));
line[0] = '.';
@@ -101,7 +101,7 @@ parse_authfile(const char *path)
a = fopen(path, "r");
if (a == NULL) {
- errlog(1, "can not open auth file `%s'", path);
+ errlog(EX_NOINPUT, "can not open auth file `%s'", path);
/* NOTREACHED */
}
@@ -121,7 +121,7 @@ parse_authfile(const char *path)
au = calloc(1, sizeof(*au));
if (au == NULL)
- errlog(1, NULL);
+ errlog(EX_OSERR, NULL);
data = strdup(line);
au->login = strsep(&data, "|");
@@ -131,8 +131,7 @@ parse_authfile(const char *path)
if (au->login == NULL ||
au->host == NULL ||
au->password == NULL) {
- errlogx(1, "syntax error in authfile %s:%d",
- path, lineno);
+ errlogx(EX_CONFIG, "syntax error in authfile %s:%d", path, lineno);
/* NOTREACHED */
}
@@ -160,7 +159,7 @@ parse_conf(const char *config_path)
/* Don't treat a non-existing config file as error */
if (errno == ENOENT)
return;
- errlog(1, "can not open config `%s'", config_path);
+ errlog(EX_NOINPUT, "can not open config `%s'", config_path);
/* NOTREACHED */
}
@@ -211,7 +210,7 @@ parse_conf(const char *config_path)
} else {
host = data;
}
- if (host && *host == 0)
+ if (host && *host == 0)
host = NULL;
if (user && *user == 0)
user = NULL;
@@ -232,13 +231,13 @@ parse_conf(const char *config_path)
else if (strcmp(word, "NULLCLIENT") == 0 && data == NULL)
config.features |= NULLCLIENT;
else {
- errlogx(1, "syntax error in %s:%d", config_path, lineno);
+ errlogx(EX_CONFIG, "syntax error in %s:%d", config_path, lineno);
/* NOTREACHED */
}
}
if ((config.features & NULLCLIENT) && config.smarthost == NULL) {
- errlogx(1, "%s: NULLCLIENT requires SMARTHOST", config_path);
+ errlogx(EX_CONFIG, "%s: NULLCLIENT requires SMARTHOST", config_path);
/* NOTREACHED */
}
diff --git a/debian/NEWS b/debian/NEWS
deleted file mode 100644
index 36ed11a44026..000000000000
--- a/debian/NEWS
+++ /dev/null
@@ -1,29 +0,0 @@
-dma (0.0.2010.06.17-3) unstable; urgency=low
-
- The default delivery mode has been changed to immediate, as it is in
- the upstream version of dma; the DEFER keyword is now disabled by default
- in dma.conf.
-
- -- Peter Pentchev <roam@ringlet.net> Tue, 27 Jul 2010 13:26:48 +0300
-
-dma (0.0.2010.06.17-1) unstable; urgency=low
-
- The dma spool directory format has changed. The Debian package of dma now
- recommends a separate package containing the dma-migrate utility; if it is
- present, it will be invoked at each periodic dma queue flush and attempt to
- convert the existing old-style queued messages to the new format. In most
- cases, this should not incur any performance penalties in normal operation,
- since dma-migrate will scan the spool directory and ignore any new messages
- (they should already be in the new format); however, if it appears that
- the periodic queue flush runs take longer than usual to start up, you may
- remove the dma-migrate package once you have ascertained that your queue
- directory (/var/spool/dma) only contains files with names beginning with
- the letters M or Q.
-
- This version of dma knows how to perform MX lookups, so remote delivery is
- now possible directly, not through a smarthost. However, a smarthost setup
- might still be preferred on many systems for various reasons - e.g. dynamic
- address assignment, a central outgoing mailserver, a roaming laptop, etc.
-
- -- Peter Pentchev <roam@ringlet.net> Mon, 21 Jun 2010 11:03:57 +0300
-
diff --git a/debian/README.Debian b/debian/README.Debian
deleted file mode 100644
index 564aaa75be70..000000000000
--- a/debian/README.Debian
+++ /dev/null
@@ -1,12 +0,0 @@
-dma for Debian
---------------
-
-Smarthost operation by default - needs to be configured!
-
-After first installing dma, you need to configure it for proper operation -
-whether it should deliver all outgoing e-mail messages through a single
-smarthost or attempt to contact the remote mail servers directly. This should
-be configured through the debconf questions, but you may change the setting
-using the SMARTHOST directive in the /etc/dma/dma.conf file.
-
- -- Simon Schubert <2@0x2c.org> Fri, 29 Oct 2010 00:25:48 +0200
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index 4d5530043529..000000000000
--- a/debian/changelog
+++ /dev/null
@@ -1,297 +0,0 @@
-dma (0.9) unstable; urgency=low
-
- [ Ed Maste ]
- * Be explicit about missing user.
- * Allow DMA_ROOT_USER & DMA_GROUP to be overridden.
- * Add compat #ifdef for older OpenSSL
- * Add CONF_DIR, as in Makefile
- * More detailed error message for tmp file failure.
-
- [ Simon Schubert ]
- * spool.c: bzero contents of pointer
-
- -- Simon Schubert <2@0x2c.org> Mon, 03 Jun 2013 15:58:44 +0200
-
-dma (0.8) unstable; urgency=low
-
- [ Gert van den Berg ]
- * Added some more documentation on compiling
- * Make Makefile and README consistent with INSTALL
-
- [ Sascha Wildner ]
- * dma.8: Fix a few small issues.
-
- [ Simon Schubert ]
- * dma.8: we only have 2 config files at the moment
- * Merge pull request #2 from mohag/master
- * don't treat -options following -q as argument to it
- * deliver_remote: propagate back DNS errors
- * don't complain when we can't lock a queue file during flush
- * implement queue flushing prod
-
- -- Simon Schubert <2@0x2c.org> Fri, 30 Mar 2012 12:03:54 +0200
-
-dma (0.7) unstable; urgency=low
-
- [ Simon Schubert ]
- * add semicolon before date in Received: header
- * parse_conf: fix bug with masqueraded domains
- * clear up warnings found by clang static analysis
- * mark printf-alike functions
-
- -- Simon Schubert <2@0x2c.org> Tue, 03 Jan 2012 14:53:43 +0100
-
-dma (0.6) unstable; urgency=low
-
- [ Simon Schubert ]
- * deliver_local: quote "From " more liberally
-
- -- Simon Schubert <2@0x2c.org> Wed, 07 Dec 2011 12:42:22 +0100
-
-dma (0.5) unstable; urgency=low
-
- [ Simon Schubert ]
- * implement masquerading using the MASQUERADE config option
- * access config files at CONF_PATH, add makefile target to install conf files
- * implement the "*" catch-all alias
-
- -- Simon Schubert <2@0x2c.org> Wed, 16 Nov 2011 13:34:43 +0100
-
-dma (0.4) unstable; urgency=low
-
- [ Simon Schubert ]
- * Makefile: put libraries at the end when linking
- * LICENSE: add
- * Merge commit 'refs/merge-requests/3' of git://gitorious.org/dma/dma
- * Merge commit 'refs/merge-requests/4' of git://gitorious.org/dma/dma
- * Add symlink for sendmail which is expected by many packages
- * Makefile: create spool directories in a separate target
- * Makefile: add symlink for mailq
- * README: elaborate, use markdown
-
- [ Peter Pentchev ]
- * Fix straight SSL/TLS delivery to remote MX's.
- * Fix a minor memory leak discovered by cppcheck.
-
- -- Simon Schubert <2@0x2c.org> Wed, 16 Nov 2011 00:08:28 +0100
-
-dma (0.3) unstable; urgency=low
-
- [ Simon Schubert ]
- * todo: we create mboxes properly now
- * dma-mbox-create: group mail only needs to write to mboxes
- * errlog: preserve errno
- * dma-mbox-create: add error/status logging
- * dns_get_mx_list: handle errors properly
-
- [ Peter Pentchev ]
- * Make add_host() really return an error code.
-
- [ Simon Schubert ]
- * readmail: accept mail without newline at the end
-
- [ Peter Pentchev ]
- * In OpenSSL 1.0, TLSv1_client_method() returns a const pointer.
-
- [ Simon Schubert ]
- * make dma compile again on DragonFly
- * parse_addrs: fix parsing for multiple <addresses>
-
- -- Simon Schubert <2@0x2c.org> Sat, 09 Jul 2011 02:38:05 +0200
-
-dma (0.2) unstable; urgency=low
-
- * Update to dma 0.2
- - debian: better mark as UNRELEASED
- - add ppa makefile recipe
- - TODO: suggest way to run a queue flush on boot
- - partially adopt 34-manpage-defaults.patch: AUTHPATH is not set by default
- - Revert "debian: better mark as UNRELEASED"
- - setlogident: openlog() wants a static variable
- - writequeuef: create files with g+rw
- - drop privileges when run by root
- - implement mbox creation via setuid helper
- - debian: build with consistent flags
- - debian: remove unused files
- - debian: fix lintian warnings and errors
- - make ppa: force lower version number
- - make ppa: proper name
-
- -- Simon Schubert <2@0x2c.org> Sun, 31 Oct 2010 23:57:50 +0100
-
-dma (0.1) unstable; urgency=low
-
- * Update dma to 0.1
-
- -- Simon Schubert <2@0x2c.org> Fri, 29 Oct 2010 00:57:26 +0200
-
-dma (0.0.2010.06.17-6) unstable; urgency=low
-
- * Add the 37-gnu-hurd patch to really fix the FTBFS on GNU/Hurd.
- * Convert several shell output assignments from = to :=
- * Switch to bzip2 compression for the Debian tarball.
-
- -- Peter Pentchev <roam@ringlet.net> Sun, 17 Oct 2010 00:08:33 +0300
-
-dma (0.0.2010.06.17-5) unstable; urgency=low
-
- * Only use SA_NOCLDWAIT if available to fix the Hurd FTBFS.
-
- -- Peter Pentchev <roam@ringlet.net> Thu, 07 Oct 2010 11:42:23 +0300
-
-dma (0.0.2010.06.17-4) unstable; urgency=low
-
- * Fix an infinite loop in dma-migrate if char is unsigned.
- Closes: #599172
- * Switch to Git and point the Vcs-* fields to Gitorious.
-
- -- Peter Pentchev <roam@ringlet.net> Wed, 06 Oct 2010 17:30:29 +0300
-
-dma (0.0.2010.06.17-3) unstable; urgency=low
-
- * Update the debconf translations:
- - French by Steve Petruzzello; Closes: #587883
- * Bump Standards-Version to 3.9.1 with no changes.
- * Disable deferred delivery by default, as in the upstream version:
- - in the 03-debian-locations patch, comment the DEFER keyword in dma.conf,
- as it is upstream
- - refresh the 11-double-bounce.patch
- - reword the README.Debian section on deferred delivery a bit
- - add a news blurb
-
- -- Peter Pentchev <roam@ringlet.net> Tue, 27 Jul 2010 13:34:27 +0300
-
-dma (0.0.2010.06.17-2) unstable; urgency=low
-
- * Quick on the heels of -1 to fix a momentary lapse of reason on my part:
- in the 03-debian-locations patch, revert part of the 0.0.2010.06.17-1
- change: do not set a un-overrideable default for the deferred delivery!
- Closes: #587593
- * Update the debconf translations:
- - Japanese by Hideki Yamane; Closes: #587543
-
- -- Peter Pentchev <roam@ringlet.net> Wed, 30 Jun 2010 11:59:46 +0300
-
-dma (0.0.2010.06.17-1) unstable; urgency=low
-
- * New upstream version:
- - no longer reports the remote port number; Closes: #544820
- - fixes some queue locking problems; Closes: #582593
- - adapt the rules file to use the GNU Makefile instead of the BSD one
- - drop pmake from Build-Depends
- - remove the 01-debian-build patch, overtaken by upstream changes
- - in the 03-debian-locations patch, make the Debian defaults actual
- defaults for the dma binary, not just in the dma.conf file
- - adapt the 04-debian-setgid patch for the GNU Makefile
- - in the 10-liblockfile patch, change the GNU Makefile, too
- - enhance the 11-double-bounce patch a bit:
- - use dma's own delqueue() function instead of a naive unlink() so
- all the queue files are cleaned up
- - document the Debian default for DBOUNCEPROG in the manual page
- - resurrect the 13-hardening patch, correcting a couple of
- unchecked asprintf(3) and vasprintf(3) invocations
- - the functionality of the 20-parse-recipient patch was implemented
- upstream in a different way, so replace it with a small bugfix
- - remove the 22-openfiles patch, overtaken by upstream changes
- - in the 24-random-message-id patch, change the GNU Makefile, too
- - add the 27-int-size patch to cast a variable to the correct type
- - add the 28-valid-recipient patch to fix parsing recipients out of
- the message body
- - add the 29-double-free patch to fix a double-free error
- - add the 30-ldflags patch to honor LDFLAGS if specified
- - refresh the 09-typos, 17-mailname, 23-dirent-d_type, and
- 25-unsupported-starttls patches
- - teach the dbounce-simple-safecat handler about the M*/Q* spool
- files scheme
- * Bump Standards-Version to 3.9.0 with no changes.
- * Update the copyright file:
- - bring it up to the latest revision of the DEP 5
- - update the upstream copyright notices
- - bump the year on my copyright notice
- * Remove the diffsrc rules target which was intended for my own
- internal use, but has outlived its time.
- * Use dpkg-buildflags from dpkg-dev >= 1.15.7~ to get the default
- values for CFLAGS, CPPFLAGS, and LDFLAGS; no longer rely on
- dpkg-buildpackage to set them by default.
- * Add the dma-migrate utility (in a separate binary package) to convert
- spool files to the new queue format (M* and Q* files for each message)
- * Add a dma-migrate invocation to dma.cron.d
- * Shorten the Vcs-Browser URL.
- * Add the 31-sigalrm-backoff patch to force a delivery attempt on SIGALRM.
- * Properly substitute the debconf-supplied values for DBOUNCEPROG and
- SMARTHOST into dma.conf even if they are empty without generating
- an invalid dma.conf file.
- * Remove the smarthost default; dma does MX lookups now, so it doesn't
- really *need* one anymore.
- * Reword the debconf relayhost question - dma does not really need
- a smarthost anymore.
- * Update the debconf translations:
- - Bulgarian
- - Portuguese by Américo Monteiro
- - German by Helge Kreutzmann; Closes: #586531
- - Russian by Yuri Kozlov; Closes: #586579
- - Czech by Michal Simunek; Closes: #586791
- - Swedish by Martin Bagge; Closes: #586825
- - Spanish by Francisco Javier Cuadrado; Closes: #587088
- * Update the smarthost configuration information in README.Debian.
- * Add the 32-comment-uncomment patch to correct the manual page wording.
- * Add the 33-opportunistic-tls patch to allow remote connections to proceed
- even if the STARTTLS negotiation fails.
- * Fix the 25-unsupported-starttls patch to actually error out if the SSL
- negotiation fails.
- * Forward all the non-Debian-specific patches upstream to Simon Schubert.
- * Add the 34-manpage-defaults patch to properly document what dma will use
- as default values if not specified in the config file instead of what
- the default config file specifies. Closes: #544748
- * Add the 35-delivery-retry patch to try local deliveries a bit more often
- and to randomize the delivery timeout to avoid locking issues.
-
- -- Peter Pentchev <roam@ringlet.net> Mon, 28 Jun 2010 23:26:36 +0300
-
-dma (0.0.2009.07.17-3) unstable; urgency=low
-
- * Really install the files in /etc/dma/ as root/mail/640 and
- change the ownership of the existing files in the postinst script
- when upgrading from older versions. Closes: #544664
- * Install the /usr/bin/mailq and /usr/bin/newaliases symlinks.
- Closes: #558421
- * Switch to the 3.0 (quilt) source format.
- * Update the debconf translations:
- - add German. Closes: #552754
- - add Japanese. Closes: #554515
- - remove a double space and unfuzzy the translations. Closes: #552586
- * Fix a crash when the SMTP server does not support STARTTLS.
- Closes: #547594
- * Always use the user-supplied value from the debconf query for
- the smarthost and the double-bounce program. This may result in
- debconf overriding a manually-edited config file, so add a note to
- dma.conf stating that these values are handled via debconf.
- Closes: #544663
- * Fix a misspelling of dma/dbounceprog as dma/defer in the debconf
- configuration script. Oops.
-
- -- Peter Pentchev <roam@ringlet.net> Sat, 19 Dec 2009 14:35:10 +0200
-
-dma (0.0.2009.07.17-2) unstable; urgency=low
-
- * Allow the spool directory to live on a filesystem that does not
- set the d_type member of the dirent structure, like XFS.
- Closes: #544357
- * Randomize the Message-Id a bit more. Closes: #544475
- * Bump Standards-Version to 3.8.3 with no changes.
- * Only enable the build hardening wrapper if the "hardening" build
- option is specified.
- * Switch the copyright file header from the Wiki to DEP 5.
- * Remove the manual page ".Dx" patch - the groff version in Squeeze
- knows about the .Dx mdoc macro. Add a lintian override for
- the "Unknown DragonFly version" error.
- * Convert the patch file headers to the DEP 3 format.
-
- -- Peter Pentchev <roam@ringlet.net> Tue, 01 Sep 2009 13:36:33 +0300
-
-dma (0.0.2009.07.17-1) unstable; urgency=low
-
- * Initial release
- (Closes: #511410, #533458, #533614, #533890, #534101, #534860)
-
- -- Peter Pentchev <roam@ringlet.net> Tue, 11 Aug 2009 16:08:41 +0300
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index 7f8f011eb73d..000000000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-7
diff --git a/debian/control b/debian/control
deleted file mode 100644
index 6eeea08aa7c0..000000000000
--- a/debian/control
+++ /dev/null
@@ -1,37 +0,0 @@
-Source: dma
-Section: mail
-Priority: optional
-Maintainer: Peter Pentchev <roam@ringlet.net>
-DM-Upload-Allowed: yes
-Build-Depends: debhelper (>= 7.0.50), byacc, dpkg-dev (>= 1.15.7~), flex, hardening-wrapper, libssl-dev, po-debconf
-Standards-Version: 3.9.1
-Homepage: http://devel.ringlet.net/mail/dma/
-Vcs-Git: git://gitorious.org/dma-roam/pkg-debian.git
-Vcs-Browser: http://gitorious.org/dma-roam/pkg-debian
-
-Package: dma
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}
-Provides: mail-transport-agent
-Conflicts: mail-transport-agent
-Replaces: mail-transport-agent
-Recommends: dma-migrate
-Description: lightweight mail transport agent
- The DragonFly Mail Agent is a small Mail Transport Agent (MTA),
- designed for home and office use. It accepts mails from local Mail
- User Agents (MUA) and delivers them either to local mailboxes or
- remote SMTP servers. Remote delivery includes support for features
- such as TLS/SSL and SMTP authentication.
- .
- dma is not intended as a replacement for full-featured MTAs like
- Sendmail, Postfix, or Exim. Consequently, dma does not listen on
- port 25 for incoming connections.
-
-Package: dma-migrate
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}
-Enhances: dma
-Description: migration utility for the DragonFly Mail Agent's spool files
- The dma-migrate utility examines the DragonFly Mail Agent's mail queue
- and performs any conversions from old message file formats to the most
- recent one as needed.
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index 4ad8fbb7a80f..000000000000
--- a/debian/copyright
+++ /dev/null
@@ -1,91 +0,0 @@
-Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=135
-Name: dma
-
-Files: base64.c
-Copyright: Copyright (c) 1995-2001 Kungliga Tekniska Högskolan
- (Royal Institute of Technology, Stockholm, Sweden).
- All rights reserved.
-License: BSD-3
-
-Files: conf.c crypto.c net.c
-Copyright: Copyright (c) 2008 The DragonFly Project. All rights reserved.
- This code is derived from software contributed to The DragonFly Project
- by Matthias Schmidt <matthias@dragonflybsd.org>, University of Marburg,
- Germany.
-License: BSD-3
-
-Files: dfcompat.c
-Copyright: Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
- Copyright (c) 1998, M. Warner Losh <imp@freebsd.org> All rights reserved.
-License: BSD-1 BSD-2
-
-Files: dma.8
-Copyright: Copyright (c) 2008 The DragonFly Project. All rights reserved.
-License: BSD-3
-
-Files: dma.c dns.c mail.c spool.c util.c
-Copyright: Copyright (c) 2008 The DragonFly Project. All rights reserved.
- This code is derived from software contributed to The DragonFly Project
- by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
-License: BSD-3
-
-Files: dma.h
-Copyright: Copyright (c) 2008 The DragonFly Project. All rights reserved.
- This code is derived from software contributed to The DragonFly Project
- by Simon 'corecode' Schubert <corecode@fs.ei.tum.de> and
- Matthias Schmidt <matthias@dragonflybsd.org>.
-License: BSD-3
-
-Files: debian/*
-Copyright: Copyright (c) 2009, 2010 Peter Pentchev.
-License: BSD-3
-
-License: BSD-3
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- .
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- 3. Neither the name of The DragonFly Project nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific, prior written permission.
-
-License: BSD-1
- Permission to use, copy, modify, and distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
- copyright notice and this permission notice appear in all copies.
- .
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-License: BSD-2
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- .
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
diff --git a/debian/dma-migrate.dirs b/debian/dma-migrate.dirs
deleted file mode 100644
index b174b445af42..000000000000
--- a/debian/dma-migrate.dirs
+++ /dev/null
@@ -1,2 +0,0 @@
-usr/sbin
-usr/share/man/man8
diff --git a/debian/dma-migrate.install b/debian/dma-migrate.install
deleted file mode 100644
index 1c35b0afb178..000000000000
--- a/debian/dma-migrate.install
+++ /dev/null
@@ -1 +0,0 @@
-debian/migrate/dma-migrate usr/sbin
diff --git a/debian/dma-migrate.manpages b/debian/dma-migrate.manpages
deleted file mode 100644
index 3629dbe3a288..000000000000
--- a/debian/dma-migrate.manpages
+++ /dev/null
@@ -1 +0,0 @@
-debian/migrate/dma-migrate.8
diff --git a/debian/dma.dirs b/debian/dma.dirs
deleted file mode 100644
index f10c0054ee33..000000000000
--- a/debian/dma.dirs
+++ /dev/null
@@ -1,4 +0,0 @@
-etc/dma
-usr/sbin
-usr/share/lintian/overrides
-usr/share/man/man8
diff --git a/debian/dma.links b/debian/dma.links
deleted file mode 100644
index d9ac22a2cdc2..000000000000
--- a/debian/dma.links
+++ /dev/null
@@ -1,6 +0,0 @@
-usr/sbin/dma usr/bin/mailq
-usr/sbin/dma usr/bin/newaliases
-usr/sbin/dma usr/sbin/sendmail
-usr/share/man/man8/dma.8 usr/share/man/man8/mailq.8
-usr/share/man/man8/dma.8 usr/share/man/man8/newaliases.8
-usr/share/man/man8/dma.8 usr/share/man/man8/sendmail.8
diff --git a/debian/dma.lintian-overrides b/debian/dma.lintian-overrides
deleted file mode 100644
index 03f5d6eb8369..000000000000
--- a/debian/dma.lintian-overrides
+++ /dev/null
@@ -1,8 +0,0 @@
-dma: manpage-has-errors-from-man *Unknown DragonFly version*
-dma: non-standard-dir-in-var var/mail/
-dma: non-standard-dir-perm var/spool/dma/ 0770 != 0755
-dma: non-standard-dir-perm var/spool/dma/ 2775 != 0755
-dma: non-standard-file-perm etc/dma/auth.conf 0640 != 0644
-dma: no-upstream-changelog
-dma: setgid-binary usr/sbin/dma 2755 root/mail
-dma: setuid-binary usr/lib/dma-mbox-create 4754 root/mail
diff --git a/debian/migrate/Makefile b/debian/migrate/Makefile
deleted file mode 100644
index cc7d3476c008..000000000000
--- a/debian/migrate/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-all: dma-migrate
-
-clean:
- rm -f dma-migrate dma-migrate.o
diff --git a/debian/migrate/NEWS b/debian/migrate/NEWS
deleted file mode 100644
index 29dca0dd335b..000000000000
--- a/debian/migrate/NEWS
+++ /dev/null
@@ -1,6 +0,0 @@
-Change log for dma-migrate, the DragonFly Mail Agent queue migration utility.
-
-0.01 not yet ;)
- - first public release
-
-Comments: Peter Pentchev <roam@ringlet.net>
diff --git a/debian/migrate/dma-migrate.8 b/debian/migrate/dma-migrate.8
deleted file mode 100644
index e40acef5b13d..000000000000
--- a/debian/migrate/dma-migrate.8
+++ /dev/null
@@ -1,98 +0,0 @@
-.\" Copyright (c) 2010 Peter Pentchev
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.Dd May 11, 2009
-.Dt dma-migrate 8
-.Os
-.Sh NAME
-.Nm dma-migrate
-.Nd convert the DragonFly Mail Agent's queue files
-.Sh SYNOPSIS
-.Nm
-.Op Fl v
-.Op Fl d Ar spooldir
-.Nm
-.Op Fl h | Fl V
-.Sh DESCRIPTION
-The
-.Nm
-utility is used to convert the mail queue files in the
-.Xr dma 8
-spool directory to the latest spool directory format supported by
-the installed version of
-.Xr dma 8 .
-Currently it only handles the conversion from a single file containing
-both message and delivery metadata to the M/Q format.
-.Pp
-The following command-line options are available:
-.Bl -tag -width indent
-.It Fl d
-Specify the location of the
-.Xr dma 8
-spool directory, default
-.Pa /var/spool/dma .
-.It Fl h
-Display usage information and exit.
-.It Fl V
-Display program version information and exit.
-.It Fl v
-Verbose output - display diagnostic messages.
-.El
-.Sh ENVIRONMENT
-The operation of the
-.Nm
-utility is currently not influenced by environment variables.
-.Sh FILES
-The
-.Nm
-utility looks for the
-.Xr dma 8
-mail queue files in the
-.Pa /var/spool/dma
-directory, unless another location is specified by the
-.Fl d
-command-line option.
-.Sh EXIT STATUS
-The
-.Nm
-utility will scan the whole spool directory and attempt to convert all
-suitable files there.
-If there are no files to be converted, or if all the conversions are
-successful, it will complete with an exit code of zero.
-If any conversion errors are encountered, a message will be displayed
-to the standard error stream and
-.Nm
-will exit with an exit code of 1 after attempting to convert the rest of
-the suitable files in the spool directory.
-.Sh SEE ALSO
-.Xr dma 8
-.Sh STANDARDS
-No standards documentation was harmed in the process of creating
-.Nm .
-.Sh BUGS
-Please report any bugs in
-.Nm
-to the author.
-.Sh AUTHOR
-.An Peter Pentchev Aq roam@ringlet.net
diff --git a/debian/migrate/dma-migrate.c b/debian/migrate/dma-migrate.c
deleted file mode 100644
index 56bfa2adbf87..000000000000
--- a/debian/migrate/dma-migrate.c
+++ /dev/null
@@ -1,413 +0,0 @@
-/*-
- * Copyright (c) 2010 Peter Pentchev
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#define _GNU_SOURCE
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-
-#include <dirent.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <regex.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#ifndef __printflike
-#ifdef __GNUC__
-#define __printflike(fmtarg, firstvararg) \
- __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
-#else
-#define __printflike(fmtarg, firstvararg)
-#endif
-#endif
-
-#define DEFAULT_SPOOLDIR "/var/spool/dma"
-
-static int verbose = 0;
-static char copybuf[BUFSIZ];
-
-static int dma_migrate(int, const char *);
-
-static int open_locked(const char *, int, ...);
-static void cleanup_file(int, char *);
-
-static void usage(int);
-static void version(void);
-static void debug(const char *, ...) __printflike(1, 2);
-
-int
-main(int argc, char **argv)
-{
- const char *spooldir;
- int hflag, Vflag, errs, fd, res;
- int ch;
- DIR *d;
- struct dirent *e;
- struct stat sb;
-
- srandom((unsigned long)((time(NULL) ^ getpid()) + ((uintptr_t)argv)));
-
- hflag = Vflag = 0;
- spooldir = DEFAULT_SPOOLDIR;
- while (ch = getopt(argc, argv, "d:hVv"), ch != -1)
- switch (ch) {
- case 'd':
- spooldir = optarg;
- break;
-
- case 'h':
- hflag = 1;
- break;
-
- case 'V':
- Vflag = 1;
- break;
-
- case 'v':
- verbose = 1;
- break;
-
- case '?':
- default:
- usage(1);
- /* NOTREACHED */
- }
- if (Vflag)
- version();
- if (hflag)
- usage(0);
- if (hflag || Vflag)
- exit(0);
-
- argc -= optind;
- argv += optind;
-
- /* Let's roll! */
- if (chdir(spooldir) == -1)
- err(1, "Could not change into spool directory %s", spooldir);
- if (d = opendir("."), d == NULL)
- err(1, "Could not read spool directory %s", spooldir);
- errs = 0;
- while (e = readdir(d), e != NULL) {
- /* Do we care about this entry? */
- debug("Read a directory entry: %s\n", e->d_name);
- if (strncmp(e->d_name, "tmp_", 4) == 0 ||
- e->d_name[0] == 'M' || e->d_name[0] == 'Q' ||
- (e->d_type != DT_REG && e->d_type != DT_UNKNOWN))
- continue;
- if (e->d_type == DT_UNKNOWN)
- if (stat(e->d_name, &sb) == -1 || !S_ISREG(sb.st_mode))
- continue;
- debug("- want to process it\n");
-
- /* Try to lock it - skip it if dma is delivering the message */
- if (fd = open_locked(e->d_name, O_RDONLY|O_NDELAY), fd == -1) {
- debug("- seems to be locked, skipping\n");
- continue;
- }
-
- /* Okay, convert it to the M/Q schema */
- res = dma_migrate(fd, e->d_name);
- close(fd);
- if (res == -1)
- errs++;
- }
- if (errs)
- debug("Finished, %d conversion errors\n", errs);
- else
- debug("Everything seems to be all right\n");
- return (errs && 1);
-}
-
-static int
-dma_migrate(int fd, const char *fname)
-{
- const char *id;
- char *mname, *qname, *tempname, *sender, *recp, *line, *recpline;
- int mfd, qfd, tempfd;
- struct stat sb;
- FILE *fp, *qfp, *mfp;
- size_t sz, len;
- static regex_t *qidreg = NULL;
-
- mfd = tempfd = qfd = -1;
- mname = qname = sender = recp = line = NULL;
- fp = qfp = NULL;
-
- if (fstat(fd, &sb) == -1) {
- warn("Could not fstat(%s)", fname);
- return (-1);
- }
- /*
- * Let's just blithely assume that the queue ID *is* the filename,
- * since that's the way dma did things so far.
- * Well, okay, let's check it.
- */
- if (qidreg == NULL) {
- regex_t *nreg;
-
- if ((nreg = malloc(sizeof(*qidreg))) == NULL) {
- warn("Could not allocate memory for a regex");
- return (-1);
- }
- if (regcomp(nreg, "^[a-fA-F0-9]\\+\\.[a-fA-F0-9]\\+$", 0)
- != 0) {
- warnx("Could not compile a dma queue ID regex");
- free(nreg);
- return (-1);
- }
- qidreg = nreg;
- }
- if (regexec(qidreg, fname, 0, NULL, 0) != 0) {
- warnx("The name '%s' is not a valid dma queue ID", fname);
- return (-1);
- }
- id = fname;
- debug(" - queue ID %s\n", id);
- if (asprintf(&mname, "M%s", id) == -1 ||
- asprintf(&tempname, "tmp_%s", id) == -1 ||
- asprintf(&qname, "Q%s", id) == -1 ||
- mname == NULL || tempname == NULL || qname == NULL)
- goto fail;
-
- /* Create the message placeholder early to avoid races */
- mfd = open_locked(mname, O_CREAT | O_EXCL | O_RDWR, 0600);
- if (mfd == -1) {
- warn("Could not create temporary file %s", mname);
- goto fail;
- }
- if (stat(qname, &sb) != -1 || errno != ENOENT ||
- stat(tempname, &sb) != -1 || errno != ENOENT) {
- warnx("Some of the queue files for %s already exist", fname);
- goto fail;
- }
- debug(" - mfd %d names %s, %s, %s\n", mfd, mname, tempname, qname);
-
- fp = fdopen(fd, "r");
- if (fp == NULL) {
- warn("Could not reopen the descriptor for %s", fname);
- goto fail;
- }
-
- /* Parse the header of the old-format message file */
- /* ...sender... */
- if (getline(&sender, &sz, fp) == -1) {
- warn("Could not read the initial line from %s", fname);
- goto fail;
- }
- sz = strlen(sender);
- while (sz > 0 && (sender[sz - 1] == '\n' || sender[sz - 1] == '\r'))
- sender[--sz] = '\0';
- if (sz == 0) {
- warnx("Empty sender line in %s", fname);
- goto fail;
- }
- debug(" - sender %s\n", sender);
- /* ...recipient(s)... */
- len = strlen(fname);
- recpline = NULL;
- while (1) {
- if (getline(&line, &sz, fp) == -1) {
- warn("Could not read a recipient line from %s", fname);
- goto fail;
- }
- sz = strlen(line);
- while (sz > 0 &&
- (line[sz - 1] == '\n' || line[sz - 1] == '\r'))
- line[--sz] = '\0';
- if (sz == 0) {
- free(line);
- line = NULL;
- break;
- }
- if (recp == NULL &&
- strncmp(line, fname, len) == 0 && line[len] == ' ') {
- recp = line + len + 1;
- recpline = line;
- } else {
- free(line);
- }
- line = NULL;
- }
- if (recp == NULL) {
- warnx("Could not find its own recipient line in %s", fname);
- goto fail;
- }
- /* ..phew, finished with the header. */
-
- tempfd = open_locked(tempname, O_CREAT | O_EXCL | O_RDWR, 0600);
- if (tempfd == -1) {
- warn("Could not create a queue file for %s", fname);
- goto fail;
- }
- qfp = fdopen(tempfd, "w");
- if (qfp == NULL) {
- warn("Could not fdopen(%s) for %s", tempname, fname);
- goto fail;
- }
- mfp = fdopen(mfd, "w");
- if (mfp == NULL) {
- warn("Could not fdopen(%s) for %s", mname, fname);
- goto fail;
- }
- fprintf(qfp, "ID: %s\nSender: %s\nRecipient: %s\n", id, sender, recp);
- fflush(qfp);
- fsync(tempfd);
-
- /* Copy the message file over to mname */
- while ((sz = fread(copybuf, 1, sizeof(copybuf), fp)) > 0)
- if (fwrite(copybuf, 1, sz, mfp) != sz) {
- warn("Could not copy the message from %s to %s",
- fname, mname);
- goto fail;
- }
- if (ferror(fp)) {
- warn("Could not read the full message from %s", fname);
- goto fail;
- }
- fflush(mfp);
- fsync(mfd);
-
- if (rename(tempname, qname) == -1) {
- warn("Could not rename the queue file for %s", fname);
- goto fail;
- }
- qfd = tempfd;
- tempfd = -1;
- if (unlink(fname) == -1) {
- warn("Could not remove the old converted file %s", fname);
- goto fail;
- }
-
- fclose(fp);
- fclose(qfp);
- free(sender);
- free(line);
- free(recpline);
- free(mname);
- free(qname);
- free(tempname);
- return (0);
-
-fail:
- if (fp != NULL)
- fclose(fp);
- if (qfp != NULL)
- fclose(qfp);
- if (sender != NULL)
- free(sender);
- if (line != NULL)
- free(line);
- if (recpline != NULL)
- free(recpline);
- cleanup_file(mfd, mname);
- cleanup_file(qfd, qname);
- cleanup_file(tempfd, tempname);
- return (-1);
-}
-
-static void
-cleanup_file(int fd, char *fname)
-{
- if (fd != -1) {
- close(fd);
- unlink(fname);
- }
- if (fname != NULL)
- free(fname);
-}
-
-static void
-usage(int ferr)
-{
- const char *s =
- "Usage:\tdma-migrate [-hVv] [-d spooldir]\n"
- "\t-d\tspecify the spool directory (" DEFAULT_SPOOLDIR ")\n"
- "\t-h\tdisplay program usage information and exit\n"
- "\t-V\tdisplay program version information and exit\n"
- "\t-v\tverbose operation - display diagnostic messages";
-
- if (ferr)
- errx(1, "%s", s);
- puts(s);
-}
-
-static void
-version(void)
-{
- printf("dma-migrate 0.01 (dma 0.0.2010.06.17)\n");
-}
-
-static void
-debug(const char *fmt, ...)
-{
- va_list v;
-
- if (verbose < 1)
- return;
- va_start(v, fmt);
- vfprintf(stderr, fmt, v);
- va_end(v);
-}
-
-static int
-open_locked(const char *fname, int flags, ...)
-{
- int mode = 0;
-#ifndef O_EXLOCK
- int fd, save_errno;
-#endif
-
- if (flags & O_CREAT) {
- va_list ap;
- va_start(ap, flags);
- mode = va_arg(ap, int);
- va_end(ap);
- }
-
-#ifndef O_EXLOCK
- fd = open(fname, flags, mode);
- if (fd < 0)
- return(fd);
- if (flock(fd, LOCK_EX|((flags & O_NONBLOCK)? LOCK_NB: 0)) < 0) {
- save_errno = errno;
- close(fd);
- errno = save_errno;
- return(-1);
- }
- return(fd);
-#else
- return(open(fname, flags|O_EXLOCK, mode));
-#endif
-}
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index 461a0a8503f6..000000000000
--- a/debian/rules
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/make -f
-# -*- makefile -*-
-# Debian build rules for dma, the DragonFly mail agent
-
-DDIR= $(CURDIR)/debian
-D= $(DDIR)/dma
-
-BUILDDEFS= DESTDIR=$D PREFIX=/usr
-
-CFLAGS:= $(shell dpkg-buildflags --get CFLAGS)
-CPPFLAGS:= $(shell dpkg-buildflags --get CPPFLAGS)
-LDFLAGS:= $(shell dpkg-buildflags --get LDFLAGS)
-
-CONFFILES= dma.conf auth.conf
-
-ifneq (,$(filter werror,$(DEB_BUILD_OPTIONS)))
- CFLAGS+= -Werror
-endif
-ifneq (,$(filter nostrip,$(DEB_BUILD_OPTIONS)))
- export STRIPFLAG=
-endif
-ifneq (,$(filter hardening,$(DEB_BUILD_OPTIONS)))
-export DEB_BUILD_HARDENING=1
-else
-export DEB_BUILD_HARDENING=0
-endif
-
-export CFLAGS CPPFLAGS LDFLAGS
-
-override_dh_auto_build:
- $(MAKE) -f Makefile ${BUILDDEFS}
- $(MAKE) -C $(DDIR)/migrate
-
-override_dh_auto_clean:
- $(MAKE) -f Makefile clean
- $(MAKE) -C $(DDIR)/migrate clean
-
-override_dh_auto_install:
- $(MAKE) -f Makefile ${BUILDDEFS} install sendmail-link mailq-link install-spool-dirs install-etc
-
-override_dh_fixperms:
- dh_fixperms -Xusr/sbin/dma -Xusr/lib/dma-mbox-create -Xvar/spool/dma -Xetc/dma
-
-override_dh_installchangelogs:
- dh_installchangelogs -p dma
- dh_installchangelogs -p dma-migrate debian/migrate/NEWS
-
-%:
- dh $@
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644
index 89ae9db8f88b..000000000000
--- a/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (native)
diff --git a/debian/source/options b/debian/source/options
deleted file mode 100644
index 779dbfd0ca3a..000000000000
--- a/debian/source/options
+++ /dev/null
@@ -1,2 +0,0 @@
-compression = "bzip2"
-compression-level = 9
diff --git a/dma-mbox-create.c b/dma-mbox-create.c
index c84652b74d47..532a7afbe0b5 100644
--- a/dma-mbox-create.c
+++ b/dma-mbox-create.c
@@ -1,9 +1,9 @@
/*
- * Copyright (c) 2010 Simon Schubert <2@0x2c.org>
+ * Copyright (c) 2010-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -54,7 +54,7 @@
static void
-logfail(const char *fmt, ...)
+logfail(int exitcode, const char *fmt, ...)
{
int oerrno = errno;
va_list ap;
@@ -73,7 +73,7 @@ logfail(const char *fmt, ...)
else
syslog(LOG_ERR, errno ? "%m" : "unknown error");
- exit(1);
+ exit(exitcode);
}
/*
@@ -98,21 +98,21 @@ main(int argc, char **argv)
errno = 0;
gr = getgrnam(DMA_GROUP);
if (!gr)
- logfail("cannot find dma group `%s'", DMA_GROUP);
+ logfail(EX_CONFIG, "cannot find dma group `%s'", DMA_GROUP);
mail_gid = gr->gr_gid;
if (setgid(mail_gid) != 0)
- logfail("cannot set gid to %d (%s)", mail_gid, DMA_GROUP);
+ logfail(EX_NOPERM, "cannot set gid to %d (%s)", mail_gid, DMA_GROUP);
if (getegid() != mail_gid)
- logfail("cannot set gid to %d (%s), still at %d", mail_gid, DMA_GROUP, getegid());
+ logfail(EX_NOPERM, "cannot set gid to %d (%s), still at %d", mail_gid, DMA_GROUP, getegid());
/*
* We take exactly one argument: the username.
*/
if (argc != 2) {
errno = 0;
- logfail("no arguments");
+ logfail(EX_USAGE, "no arguments");
}
user = argv[1];
@@ -121,7 +121,7 @@ main(int argc, char **argv)
/* the username may not contain a pathname separator */
if (strchr(user, '/')) {
errno = 0;
- logfail("path separator in username `%s'", user);
+ logfail(EX_DATAERR, "path separator in username `%s'", user);
exit(1);
}
@@ -129,7 +129,7 @@ main(int argc, char **argv)
errno = 0;
pw = getpwnam(user);
if (!pw)
- logfail("cannot find user `%s'", user);
+ logfail(EX_NOUSER, "cannot find user `%s'", user);
user_uid = pw->pw_uid;
@@ -137,20 +137,20 @@ main(int argc, char **argv)
if (error < 0 || (size_t)error >= sizeof(fn)) {
if (error >= 0) {
errno = 0;
- logfail("mbox path too long");
+ logfail(EX_USAGE, "mbox path too long");
}
- logfail("cannot build mbox path for `%s/%s'", _PATH_MAILDIR, user);
+ logfail(EX_CANTCREAT, "cannot build mbox path for `%s/%s'", _PATH_MAILDIR, user);
}
f = open(fn, O_RDONLY|O_CREAT, 0600);
if (f < 0)
- logfail("cannot open mbox `%s'", fn);
+ logfail(EX_NOINPUT, "cannt open mbox `%s'", fn);
if (fchown(f, user_uid, mail_gid))
- logfail("cannot change owner of mbox `%s'", fn);
+ logfail(EX_OSERR, "cannot change owner of mbox `%s'", fn);
if (fchmod(f, 0620))
- logfail("cannot change permissions of mbox `%s'", fn);
+ logfail(EX_OSERR, "cannot change permissions of mbox `%s'", fn);
/* file should be present with the right owner and permissions */
diff --git a/dma.8 b/dma.8
index 5d786c6be2ca..76ab174fe590 100644
--- a/dma.8
+++ b/dma.8
@@ -1,4 +1,5 @@
.\"
+.\" Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
.\" Copyright (c) 2008
.\" The DragonFly Project. All rights reserved.
.\"
diff --git a/dma.c b/dma.c
index e6462f22544c..94fc3316f7db 100644
--- a/dma.c
+++ b/dma.c
@@ -1,8 +1,9 @@
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -247,7 +248,7 @@ go_background(struct queue *queue)
if (daemonize && daemon(0, 0) != 0) {
syslog(LOG_ERR, "can not daemonize: %m");
- exit(1);
+ exit(EX_OSERR);
}
daemonize = 0;
@@ -264,7 +265,7 @@ go_background(struct queue *queue)
switch (pid) {
case -1:
syslog(LOG_ERR, "can not fork: %m");
- exit(1);
+ exit(EX_OSERR);
break;
case 0:
@@ -286,11 +287,11 @@ retit:
break;
case 1:
if (doqueue)
- exit(0);
+ exit(EX_OK);
syslog(LOG_WARNING, "could not lock queue file");
- exit(1);
+ exit(EX_SOFTWARE);
default:
- exit(1);
+ exit(EX_SOFTWARE);
}
dropspool(queue, it);
return (it);
@@ -306,7 +307,7 @@ retit:
}
syslog(LOG_CRIT, "reached dead code");
- exit(1);
+ exit(EX_SOFTWARE);
}
static void
@@ -331,12 +332,12 @@ retry:
case 0:
delqueue(it);
syslog(LOG_INFO, "delivery successful");
- exit(0);
+ exit(EX_OK);
case 1:
if (stat(it->queuefn, &st) != 0) {
syslog(LOG_ERR, "lost queue file `%s'", it->queuefn);
- exit(1);
+ exit(EX_SOFTWARE);
}
if (gettimeofday(&now, NULL) == 0 &&
(now.tv_sec - st.st_mtim.tv_sec > MAX_TIMEOUT)) {
@@ -438,16 +439,16 @@ main(int argc, char **argv)
pw = getpwnam(DMA_ROOT_USER);
if (pw == NULL) {
if (errno == 0)
- errx(1, "user '%s' not found", DMA_ROOT_USER);
+ errx(EX_CONFIG, "user '%s' not found", DMA_ROOT_USER);
else
- err(1, "cannot drop root privileges");
+ err(EX_OSERR, "cannot drop root privileges");
}
if (setuid(pw->pw_uid) != 0)
- err(1, "cannot drop root privileges");
+ err(EX_OSERR, "cannot drop root privileges");
if (geteuid() == 0 || getuid() == 0)
- errx(1, "cannot drop root privileges");
+ errx(EX_OSERR, "cannot drop root privileges");
}
atexit(deltmp);
@@ -460,15 +461,15 @@ main(int argc, char **argv)
argv++; argc--;
showq = 1;
if (argc != 0)
- errx(1, "invalid arguments");
+ errx(EX_USAGE, "invalid arguments");
goto skipopts;
} else if (strcmp(argv[0], "newaliases") == 0) {
logident_base = "dma";
setlogident(NULL);
if (read_aliases() != 0)
- errx(1, "could not parse aliases file `%s'", config.aliases);
- exit(0);
+ errx(EX_SOFTWARE, "could not parse aliases file `%s'", config.aliases);
+ exit(EX_OK);
}
opterr = 0;
@@ -547,7 +548,7 @@ main(int argc, char **argv)
default:
fprintf(stderr, "invalid argument: `-%c'\n", optopt);
- exit(1);
+ exit(EX_USAGE);
}
}
argc -= optind;
@@ -555,10 +556,10 @@ main(int argc, char **argv)
opterr = 1;
if (argc != 0 && (showq || doqueue))
- errx(1, "sending mail and queue operations are mutually exclusive");
+ errx(EX_USAGE, "sending mail and queue operations are mutually exclusive");
if (showq + doqueue > 1)
- errx(1, "conflicting queue operations");
+ errx(EX_USAGE, "conflicting queue operations");
skipopts:
if (logident_base == NULL)
@@ -578,7 +579,7 @@ skipopts:
if (showq) {
if (load_queue(&queue) < 0)
- errlog(1, "can not load queue");
+ errlog(EX_NOINPUT, "can not load queue");
show_queue(&queue);
return (0);
}
@@ -586,38 +587,38 @@ skipopts:
if (doqueue) {
flushqueue_signal();
if (load_queue(&queue) < 0)
- errlog(1, "can not load queue");
+ errlog(EX_NOINPUT, "can not load queue");
run_queue(&queue);
return (0);
}
if (read_aliases() != 0)
- errlog(1, "could not parse aliases file `%s'", config.aliases);
+ errlog(EX_SOFTWARE, "could not parse aliases file `%s'", config.aliases);
if ((sender = set_from(&queue, sender)) == NULL)
- errlog(1, NULL);
+ errlog(EX_SOFTWARE, NULL);
if (newspoolf(&queue) != 0)
- errlog(1, "can not create temp file in `%s'", config.spooldir);
+ errlog(EX_CANTCREAT, "can not create temp file in `%s'", config.spooldir);
setlogident("%s", queue.id);
for (i = 0; i < argc; i++) {
if (add_recp(&queue, argv[i], EXPAND_WILDCARD) != 0)
- errlogx(1, "invalid recipient `%s'", argv[i]);
+ errlogx(EX_DATAERR, "invalid recipient `%s'", argv[i]);
}
if (LIST_EMPTY(&queue.queue) && !recp_from_header)
- errlogx(1, "no recipients");
+ errlogx(EX_NOINPUT, "no recipients");
if (readmail(&queue, nodot, recp_from_header) != 0)
- errlog(1, "can not read mail");
+ errlog(EX_NOINPUT, "can not read mail");
if (LIST_EMPTY(&queue.queue))
- errlogx(1, "no recipients");
+ errlogx(EX_NOINPUT, "no recipients");
if (linkspool(&queue) != 0)
- errlog(1, "can not create spools");
+ errlog(EX_CANTCREAT, "can not create spools");
/* From here on the mail is safe. */
diff --git a/dma.h b/dma.h
index 4ce00944a5ee..acf5e44d07bc 100644
--- a/dma.h
+++ b/dma.h
@@ -1,8 +1,9 @@
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de> and
+ * by Simon Schubert <2@0x2c.org> and
* Matthias Schmidt <matthias@dragonflybsd.org>.
*
* Redistribution and use in source and binary forms, with or without
@@ -43,6 +44,7 @@
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <netdb.h>
+#include <sysexits.h>
#define VERSION "DragonFly Mail Agent " DMA_VERSION
@@ -173,6 +175,8 @@ extern char errmsg[ERRMSG_SIZE];
/* aliases_parse.y */
int yyparse(void);
+int yywrap(void);
+int yylex(void);
extern FILE *yyin;
/* conf.c */
diff --git a/dns.c b/dns.c
index fc5213f1ca60..dd9ebfca8d82 100644
--- a/dns.c
+++ b/dns.c
@@ -1,8 +1,9 @@
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -67,7 +68,6 @@ add_host(int pref, const char *host, int port, struct mx_hostentry **he, size_t
char servname[10];
struct mx_hostentry *p;
const int count_inc = 10;
- int err;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
@@ -75,9 +75,26 @@ add_host(int pref, const char *host, int port, struct mx_hostentry **he, size_t
hints.ai_protocol = IPPROTO_TCP;
snprintf(servname, sizeof(servname), "%d", port);
- err = getaddrinfo(host, servname, &hints, &res0);
- if (err)
- return (err == EAI_AGAIN ? 1 : -1);
+ switch (getaddrinfo(host, servname, &hints, &res0)) {
+ case 0:
+ break;
+ case EAI_AGAIN:
+ case EAI_NONAME:
+ /*
+ * EAI_NONAME gets returned for:
+ * SMARTHOST set but DNS server not reachable -> defer
+ * SMARTHOST set but DNS server returns "host does not exist"
+ * -> buggy configuration
+ * -> either defer or bounce would be ok -> defer
+ * MX entry was returned by DNS server but name doesn't resolve
+ * -> hopefully transient situation -> defer
+ * all other DNS problems should have been caught earlier
+ * in dns_get_mx_list().
+ */
+ goto out;
+ default:
+ return(-1);
+ }
for (res = res0; res != NULL; res = res->ai_next) {
if (*ps + 1 >= roundup(*ps, count_inc)) {
diff --git a/get-version.sh b/get-version.sh
index aecc3331f446..d9691ac37c95 100755
--- a/get-version.sh
+++ b/get-version.sh
@@ -1,7 +1,9 @@
#!/bin/sh
+tmp=$1
+file=${tmp:=VERSION}
gitver=$(git describe 2>/dev/null | tr - .)
-filever=$(cat VERSION)
+filever=$(cat ${file} 2>/dev/null)
version=${gitver}
: ${version:=$filever}
diff --git a/local.c b/local.c
index 6a6407ef8652..e3e015217fea 100644
--- a/local.c
+++ b/local.c
@@ -1,8 +1,9 @@
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -81,7 +82,7 @@ create_mbox(const char *name)
execl(LIBEXEC_PATH "/dma-mbox-create", "dma-mbox-create", name, NULL);
syslog(LOG_ERR, "cannot execute "LIBEXEC_PATH"/dma-mbox-create: %m");
- exit(1);
+ exit(EX_SOFTWARE);
default:
/* parent */
diff --git a/mail.c b/mail.c
index 9cbde41d98f1..a6d11fcae685 100644
--- a/mail.c
+++ b/mail.c
@@ -1,8 +1,9 @@
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -51,7 +52,7 @@ bounce(struct qitem *it, const char *reason)
/* Don't bounce bounced mails */
if (it->sender[0] == 0) {
syslog(LOG_INFO, "can not bounce a bounce message, discarding");
- exit(1);
+ exit(EX_SOFTWARE);
}
bzero(&bounceq, sizeof(bounceq));
@@ -132,7 +133,7 @@ bounce(struct qitem *it, const char *reason)
fail:
syslog(LOG_CRIT, "error creating bounce: %m");
delqueue(it);
- exit(1);
+ exit(EX_IOERR);
}
struct parse_state {
@@ -332,10 +333,10 @@ newaddr:
ps->pos = 0;
addr = strdup(ps->addr);
if (addr == NULL)
- errlog(1, NULL);
+ errlog(EX_SOFTWARE, NULL);
if (add_recp(queue, addr, EXPAND_WILDCARD) != 0)
- errlogx(1, "invalid recipient `%s'", addr);
+ errlogx(EX_DATAERR, "invalid recipient `%s'", addr);
goto again;
}
@@ -374,7 +375,9 @@ readmail(struct queue *queue, int nodot, int recp_from_header)
if (fgets(line, sizeof(line) - 1, stdin) == NULL)
break;
if (had_last_line)
- errlogx(1, "bad mail input format");
+ errlogx(EX_DATAERR, "bad mail input format:"
+ " from %s (uid %d) (envelope-from %s)",
+ username, useruid, queue->sender);
linelen = strlen(line);
if (linelen == 0 || line[linelen - 1] != '\n') {
/*
@@ -405,7 +408,7 @@ readmail(struct queue *queue, int nodot, int recp_from_header)
if (parse_state.state != NONE) {
if (parse_addrs(&parse_state, line, queue) < 0) {
- errlogx(1, "invalid address in header\n");
+ errlogx(EX_DATAERR, "invalid address in header\n");
/* NOTREACHED */
}
}
@@ -416,7 +419,7 @@ readmail(struct queue *queue, int nodot, int recp_from_header)
strprefixcmp(line, "Bcc:") == 0)) {
parse_state.state = START;
if (parse_addrs(&parse_state, line, queue) < 0) {
- errlogx(1, "invalid address in header\n");
+ errlogx(EX_DATAERR, "invalid address in header\n");
/* NOTREACHED */
}
}
diff --git a/net.c b/net.c
index d95a7884b87e..26935a8feec8 100644
--- a/net.c
+++ b/net.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
diff --git a/spool.c b/spool.c
index 416b5fa8f0ee..e9c9c4355ab4 100644
--- a/spool.c
+++ b/spool.c
@@ -1,8 +1,9 @@
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -289,7 +290,7 @@ load_queue(struct queue *queue)
spooldir = opendir(config.spooldir);
if (spooldir == NULL)
- err(1, "reading queue");
+ err(EX_NOINPUT, "reading queue");
while ((de = readdir(spooldir)) != NULL) {
queuefn = NULL;
diff --git a/util.c b/util.c
index a139b20d3831..d528f313d091 100644
--- a/util.c
+++ b/util.c
@@ -1,8 +1,9 @@
/*
+ * Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
* Copyright (c) 2008 The DragonFly Project. All rights reserved.
*
* This code is derived from software contributed to The DragonFly Project
- * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
+ * by Simon Schubert <2@0x2c.org>.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions