Import dma 0.10
This commit is contained in:
parent
c48517e8d3
commit
21301f7354
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/dma/dist/; revision=289121 svn path=/vendor/dma/0.10/; revision=289122; tag=vendor/dma/0.10
28
BSDmakefile
28
BSDmakefile
@ -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>
|
4
LICENSE
4
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.
|
||||
|
||||
|
@ -15,8 +15,13 @@ incoming connections.
|
||||
Building
|
||||
--------
|
||||
|
||||
In Linux:
|
||||
|
||||
make
|
||||
|
||||
In BSD:
|
||||
|
||||
cd bsd && make
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
1
TODO
1
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
|
||||
|
@ -7,8 +7,6 @@
|
||||
|
||||
extern int yylineno;
|
||||
static void yyerror(const char *);
|
||||
int yywrap(void);
|
||||
int yylex(void);
|
||||
|
||||
static void
|
||||
yyerror(const char *msg)
|
||||
|
@ -1,11 +1,11 @@
|
||||
%{
|
||||
|
||||
#include <string.h>
|
||||
#include "dma.h"
|
||||
#include "aliases_parse.h"
|
||||
|
||||
#define YY_NO_INPUT
|
||||
|
||||
int yylex(void);
|
||||
%}
|
||||
|
||||
%option yylineno
|
||||
|
17
conf.c
17
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 */
|
||||
}
|
||||
|
||||
|
29
debian/NEWS
vendored
29
debian/NEWS
vendored
@ -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
|
||||
|
12
debian/README.Debian
vendored
12
debian/README.Debian
vendored
@ -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
|
297
debian/changelog
vendored
297
debian/changelog
vendored
@ -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
|
1
debian/compat
vendored
1
debian/compat
vendored
@ -1 +0,0 @@
|
||||
7
|
37
debian/control
vendored
37
debian/control
vendored
@ -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.
|
91
debian/copyright
vendored
91
debian/copyright
vendored
@ -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.
|
2
debian/dma-migrate.dirs
vendored
2
debian/dma-migrate.dirs
vendored
@ -1,2 +0,0 @@
|
||||
usr/sbin
|
||||
usr/share/man/man8
|
1
debian/dma-migrate.install
vendored
1
debian/dma-migrate.install
vendored
@ -1 +0,0 @@
|
||||
debian/migrate/dma-migrate usr/sbin
|
1
debian/dma-migrate.manpages
vendored
1
debian/dma-migrate.manpages
vendored
@ -1 +0,0 @@
|
||||
debian/migrate/dma-migrate.8
|
4
debian/dma.dirs
vendored
4
debian/dma.dirs
vendored
@ -1,4 +0,0 @@
|
||||
etc/dma
|
||||
usr/sbin
|
||||
usr/share/lintian/overrides
|
||||
usr/share/man/man8
|
6
debian/dma.links
vendored
6
debian/dma.links
vendored
@ -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
|
8
debian/dma.lintian-overrides
vendored
8
debian/dma.lintian-overrides
vendored
@ -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
|
4
debian/migrate/Makefile
vendored
4
debian/migrate/Makefile
vendored
@ -1,4 +0,0 @@
|
||||
all: dma-migrate
|
||||
|
||||
clean:
|
||||
rm -f dma-migrate dma-migrate.o
|
6
debian/migrate/NEWS
vendored
6
debian/migrate/NEWS
vendored
@ -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>
|
98
debian/migrate/dma-migrate.8
vendored
98
debian/migrate/dma-migrate.8
vendored
@ -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
|
413
debian/migrate/dma-migrate.c
vendored
413
debian/migrate/dma-migrate.c
vendored
@ -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
|
||||
}
|
49
debian/rules
vendored
49
debian/rules
vendored
@ -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 $@
|
1
debian/source/format
vendored
1
debian/source/format
vendored
@ -1 +0,0 @@
|
||||
3.0 (native)
|
2
debian/source/options
vendored
2
debian/source/options
vendored
@ -1,2 +0,0 @@
|
||||
compression = "bzip2"
|
||||
compression-level = 9
|
@ -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 */
|
||||
|
||||
|
1
dma.8
1
dma.8
@ -1,4 +1,5 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2008-2014, Simon Schubert <2@0x2c.org>.
|
||||
.\" Copyright (c) 2008
|
||||
.\" The DragonFly Project. All rights reserved.
|
||||
.\"
|
||||
|
59
dma.c
59
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 @@ go_background(struct queue *queue)
|
||||
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 @@ go_background(struct queue *queue)
|
||||
}
|
||||
|
||||
syslog(LOG_CRIT, "reached dead code");
|
||||
exit(1);
|
||||
exit(EX_SOFTWARE);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -331,12 +332,12 @@ deliver(struct qitem *it)
|
||||
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 @@ main(int argc, char **argv)
|
||||
|
||||
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 @@ main(int argc, char **argv)
|
||||
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. */
|
||||
|
||||
|
6
dma.h
6
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 */
|
||||
|
27
dns.c
27
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)) {
|
||||
|
@ -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}
|
||||
|
5
local.c
5
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 */
|
||||
|
19
mail.c
19
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 @@ parse_addrs(struct parse_state *ps, char *s, struct queue *queue)
|
||||
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 */
|
||||
}
|
||||
}
|
||||
|
1
net.c
1
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
|
||||
|
5
spool.c
5
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;
|
||||
|
3
util.c
3
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
|
||||
|
Loading…
Reference in New Issue
Block a user