Import dma 0.10

This commit is contained in:
Baptiste Daroussin 2015-10-10 23:22:05 +00:00
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
38 changed files with 113 additions and 1170 deletions

View File

@ -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>

View File

@ -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.

View File

@ -15,8 +15,13 @@ incoming connections.
Building
--------
In Linux:
make
In BSD:
cd bsd && make
Installation
------------

1
TODO
View File

@ -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

View File

@ -1 +1 @@
v0.9
v0.10

View File

@ -7,8 +7,6 @@
extern int yylineno;
static void yyerror(const char *);
int yywrap(void);
int yylex(void);
static void
yyerror(const char *msg)

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -1 +0,0 @@
7

37
debian/control vendored
View File

@ -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
View File

@ -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.

View File

@ -1,2 +0,0 @@
usr/sbin
usr/share/man/man8

View File

@ -1 +0,0 @@
debian/migrate/dma-migrate usr/sbin

View File

@ -1 +0,0 @@
debian/migrate/dma-migrate.8

4
debian/dma.dirs vendored
View File

@ -1,4 +0,0 @@
etc/dma
usr/sbin
usr/share/lintian/overrides
usr/share/man/man8

6
debian/dma.links vendored
View File

@ -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

View File

@ -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

View File

@ -1,4 +0,0 @@
all: dma-migrate
clean:
rm -f dma-migrate dma-migrate.o

6
debian/migrate/NEWS vendored
View File

@ -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>

View File

@ -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

View File

@ -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
View File

@ -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 $@

View File

@ -1 +0,0 @@
3.0 (native)

View File

@ -1,2 +0,0 @@
compression = "bzip2"
compression-level = 9

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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)) {

View File

@ -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}

View File

@ -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
View File

@ -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
View File

@ -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

View File

@ -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
View File

@ -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