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