diff options
author | ngie <ngie@FreeBSD.org> | 2015-10-11 08:26:48 +0000 |
---|---|---|
committer | ngie <ngie@FreeBSD.org> | 2015-10-11 08:26:48 +0000 |
commit | f5532a14fee5732f99496a00146658ec19c0fa63 (patch) | |
tree | 5de639b2d62549f868026c30efa7c4fbf8038a0b /contrib | |
parent | 33c7bf8e7b5beff5a1eb3e2ccf6a661c52360ec6 (diff) | |
download | FreeBSD-src-f5532a14fee5732f99496a00146658ec19c0fa63.zip FreeBSD-src-f5532a14fee5732f99496a00146658ec19c0fa63.tar.gz |
Revert r289133; retry the merge
Diffstat (limited to 'contrib')
38 files changed, 1170 insertions, 113 deletions
diff --git a/contrib/dma/BSDmakefile b/contrib/dma/BSDmakefile new file mode 100644 index 0000000..af3a0ac --- /dev/null +++ b/contrib/dma/BSDmakefile @@ -0,0 +1,28 @@ +# $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 277b3e4..b89e5bc 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 3e043de..13ff20c 100644 --- a/contrib/dma/README.markdown +++ b/contrib/dma/README.markdown @@ -15,13 +15,8 @@ incoming connections. Building -------- -In Linux: - make -In BSD: - - cd bsd && make Installation ------------ diff --git a/contrib/dma/TODO b/contrib/dma/TODO index e70814c..01de465 100644 --- a/contrib/dma/TODO +++ b/contrib/dma/TODO @@ -1,4 +1,5 @@ - 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 9097bf9..490a0cd 100644 --- a/contrib/dma/VERSION +++ b/contrib/dma/VERSION @@ -1 +1 @@ -v0.10 +v0.9 diff --git a/contrib/dma/aliases_parse.y b/contrib/dma/aliases_parse.y index 46728e6..a5a9e7b 100644 --- a/contrib/dma/aliases_parse.y +++ b/contrib/dma/aliases_parse.y @@ -7,6 +7,8 @@ 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 8130c3e..809d1e1 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 3e3c7d3..86d72f7 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(EX_DATAERR); + exit(1); } 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(EX_NOINPUT, "can not open auth file `%s'", path); + errlog(1, "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(EX_OSERR, NULL); + errlog(1, "calloc failed"); data = strdup(line); au->login = strsep(&data, "|"); @@ -131,7 +131,8 @@ parse_authfile(const char *path) if (au->login == NULL || au->host == NULL || au->password == NULL) { - errlogx(EX_CONFIG, "syntax error in authfile %s:%d", path, lineno); + errlogx(1, "syntax error in authfile %s:%d", + path, lineno); /* NOTREACHED */ } @@ -159,7 +160,7 @@ parse_conf(const char *config_path) /* Don't treat a non-existing config file as error */ if (errno == ENOENT) return; - errlog(EX_NOINPUT, "can not open config `%s'", config_path); + errlog(1, "can not open config `%s'", config_path); /* NOTREACHED */ } @@ -210,7 +211,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; @@ -231,13 +232,13 @@ parse_conf(const char *config_path) else if (strcmp(word, "NULLCLIENT") == 0 && data == NULL) config.features |= NULLCLIENT; else { - errlogx(EX_CONFIG, "syntax error in %s:%d", config_path, lineno); + errlogx(1, "syntax error in %s:%d", config_path, lineno); /* NOTREACHED */ } } if ((config.features & NULLCLIENT) && config.smarthost == NULL) { - errlogx(EX_CONFIG, "%s: NULLCLIENT requires SMARTHOST", config_path); + errlogx(1, "%s: NULLCLIENT requires SMARTHOST", config_path); /* NOTREACHED */ } diff --git a/contrib/dma/debian/NEWS b/contrib/dma/debian/NEWS new file mode 100644 index 0000000..36ed11a --- /dev/null +++ b/contrib/dma/debian/NEWS @@ -0,0 +1,29 @@ +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 new file mode 100644 index 0000000..564aaa7 --- /dev/null +++ b/contrib/dma/debian/README.Debian @@ -0,0 +1,12 @@ +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 new file mode 100644 index 0000000..4d55300 --- /dev/null +++ b/contrib/dma/debian/changelog @@ -0,0 +1,297 @@ +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 new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/contrib/dma/debian/compat @@ -0,0 +1 @@ +7 diff --git a/contrib/dma/debian/control b/contrib/dma/debian/control new file mode 100644 index 0000000..6eeea08 --- /dev/null +++ b/contrib/dma/debian/control @@ -0,0 +1,37 @@ +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 new file mode 100644 index 0000000..4ad8fbb --- /dev/null +++ b/contrib/dma/debian/copyright @@ -0,0 +1,91 @@ +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 new file mode 100644 index 0000000..b174b44 --- /dev/null +++ b/contrib/dma/debian/dma-migrate.dirs @@ -0,0 +1,2 @@ +usr/sbin +usr/share/man/man8 diff --git a/contrib/dma/debian/dma-migrate.install b/contrib/dma/debian/dma-migrate.install new file mode 100644 index 0000000..1c35b0a --- /dev/null +++ b/contrib/dma/debian/dma-migrate.install @@ -0,0 +1 @@ +debian/migrate/dma-migrate usr/sbin diff --git a/contrib/dma/debian/dma-migrate.manpages b/contrib/dma/debian/dma-migrate.manpages new file mode 100644 index 0000000..3629dbe --- /dev/null +++ b/contrib/dma/debian/dma-migrate.manpages @@ -0,0 +1 @@ +debian/migrate/dma-migrate.8 diff --git a/contrib/dma/debian/dma.dirs b/contrib/dma/debian/dma.dirs new file mode 100644 index 0000000..f10c005 --- /dev/null +++ b/contrib/dma/debian/dma.dirs @@ -0,0 +1,4 @@ +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 new file mode 100644 index 0000000..d9ac22a --- /dev/null +++ b/contrib/dma/debian/dma.links @@ -0,0 +1,6 @@ +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 new file mode 100644 index 0000000..03f5d6e --- /dev/null +++ b/contrib/dma/debian/dma.lintian-overrides @@ -0,0 +1,8 @@ +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 new file mode 100644 index 0000000..cc7d347 --- /dev/null +++ b/contrib/dma/debian/migrate/Makefile @@ -0,0 +1,4 @@ +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 new file mode 100644 index 0000000..29dca0dd --- /dev/null +++ b/contrib/dma/debian/migrate/NEWS @@ -0,0 +1,6 @@ +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 new file mode 100644 index 0000000..e40acef --- /dev/null +++ b/contrib/dma/debian/migrate/dma-migrate.8 @@ -0,0 +1,98 @@ +.\" 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 new file mode 100644 index 0000000..56bfa2a --- /dev/null +++ b/contrib/dma/debian/migrate/dma-migrate.c @@ -0,0 +1,413 @@ +/*- + * 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 new file mode 100755 index 0000000..461a0a85 --- /dev/null +++ b/contrib/dma/debian/rules @@ -0,0 +1,49 @@ +#!/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 new file mode 100644 index 0000000..89ae9db --- /dev/null +++ b/contrib/dma/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/contrib/dma/debian/source/options b/contrib/dma/debian/source/options new file mode 100644 index 0000000..779dbfd --- /dev/null +++ b/contrib/dma/debian/source/options @@ -0,0 +1,2 @@ +compression = "bzip2" +compression-level = 9 diff --git a/contrib/dma/dma-mbox-create.c b/contrib/dma/dma-mbox-create.c index 532a7af..c84652b 100644 --- a/contrib/dma/dma-mbox-create.c +++ b/contrib/dma/dma-mbox-create.c @@ -1,9 +1,9 @@ /* - * Copyright (c) 2010-2014, Simon Schubert <2@0x2c.org>. + * Copyright (c) 2010 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 Schubert <2@0x2c.org>. + * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>. * * 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(int exitcode, const char *fmt, ...) +logfail(const char *fmt, ...) { int oerrno = errno; va_list ap; @@ -73,7 +73,7 @@ logfail(int exitcode, const char *fmt, ...) else syslog(LOG_ERR, errno ? "%m" : "unknown error"); - exit(exitcode); + exit(1); } /* @@ -98,21 +98,21 @@ main(int argc, char **argv) errno = 0; gr = getgrnam(DMA_GROUP); if (!gr) - logfail(EX_CONFIG, "cannot find dma group `%s'", DMA_GROUP); + logfail("cannot find dma group `%s'", DMA_GROUP); mail_gid = gr->gr_gid; if (setgid(mail_gid) != 0) - logfail(EX_NOPERM, "cannot set gid to %d (%s)", mail_gid, DMA_GROUP); + logfail("cannot set gid to %d (%s)", mail_gid, DMA_GROUP); if (getegid() != mail_gid) - logfail(EX_NOPERM, "cannot set gid to %d (%s), still at %d", mail_gid, DMA_GROUP, getegid()); + logfail("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(EX_USAGE, "no arguments"); + logfail("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(EX_DATAERR, "path separator in username `%s'", user); + logfail("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(EX_NOUSER, "cannot find user `%s'", user); + logfail("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(EX_USAGE, "mbox path too long"); + logfail("mbox path too long"); } - logfail(EX_CANTCREAT, "cannot build mbox path for `%s/%s'", _PATH_MAILDIR, user); + logfail("cannot build mbox path for `%s/%s'", _PATH_MAILDIR, user); } f = open(fn, O_RDONLY|O_CREAT, 0600); if (f < 0) - logfail(EX_NOINPUT, "cannt open mbox `%s'", fn); + logfail("cannot open mbox `%s'", fn); if (fchown(f, user_uid, mail_gid)) - logfail(EX_OSERR, "cannot change owner of mbox `%s'", fn); + logfail("cannot change owner of mbox `%s'", fn); if (fchmod(f, 0620)) - logfail(EX_OSERR, "cannot change permissions of mbox `%s'", fn); + logfail("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 76ab174..5d786c6 100644 --- a/contrib/dma/dma.8 +++ b/contrib/dma/dma.8 @@ -1,5 +1,4 @@ .\" -.\" 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 0d1dba2..a3a62c9 100644 --- a/contrib/dma/dma.c +++ b/contrib/dma/dma.c @@ -1,9 +1,8 @@ /* - * 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 Schubert <2@0x2c.org>. + * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -248,7 +247,7 @@ go_background(struct queue *queue) if (daemonize && daemon(0, 0) != 0) { syslog(LOG_ERR, "can not daemonize: %m"); - exit(EX_OSERR); + exit(1); } daemonize = 0; @@ -265,7 +264,7 @@ go_background(struct queue *queue) switch (pid) { case -1: syslog(LOG_ERR, "can not fork: %m"); - exit(EX_OSERR); + exit(1); break; case 0: @@ -287,11 +286,11 @@ retit: break; case 1: if (doqueue) - exit(EX_OK); + exit(0); syslog(LOG_WARNING, "could not lock queue file"); - exit(EX_SOFTWARE); + exit(1); default: - exit(EX_SOFTWARE); + exit(1); } dropspool(queue, it); return (it); @@ -307,7 +306,7 @@ retit: } syslog(LOG_CRIT, "reached dead code"); - exit(EX_SOFTWARE); + exit(1); } static void @@ -332,12 +331,12 @@ retry: case 0: delqueue(it); syslog(LOG_INFO, "delivery successful"); - exit(EX_OK); + exit(0); case 1: if (stat(it->queuefn, &st) != 0) { syslog(LOG_ERR, "lost queue file `%s'", it->queuefn); - exit(EX_SOFTWARE); + exit(1); } if (gettimeofday(&now, NULL) == 0 && (now.tv_sec - st.st_mtim.tv_sec > MAX_TIMEOUT)) { @@ -439,16 +438,16 @@ main(int argc, char **argv) pw = getpwnam(DMA_ROOT_USER); if (pw == NULL) { if (errno == 0) - errx(EX_CONFIG, "user '%s' not found", DMA_ROOT_USER); + errx(1, "user '%s' not found", DMA_ROOT_USER); else - err(EX_OSERR, "cannot drop root privileges"); + err(1, "cannot drop root privileges"); } if (setuid(pw->pw_uid) != 0) - err(EX_OSERR, "cannot drop root privileges"); + err(1, "cannot drop root privileges"); if (geteuid() == 0 || getuid() == 0) - errx(EX_OSERR, "cannot drop root privileges"); + errx(1, "cannot drop root privileges"); } atexit(deltmp); @@ -461,15 +460,15 @@ main(int argc, char **argv) argv++; argc--; showq = 1; if (argc != 0) - errx(EX_USAGE, "invalid arguments"); + errx(1, "invalid arguments"); goto skipopts; } else if (strcmp(argv[0], "newaliases") == 0) { logident_base = "dma"; setlogident("%s", logident_base); if (read_aliases() != 0) - errx(EX_SOFTWARE, "could not parse aliases file `%s'", config.aliases); - exit(EX_OK); + errx(1, "could not parse aliases file `%s'", config.aliases); + exit(0); } opterr = 0; @@ -548,7 +547,7 @@ main(int argc, char **argv) default: fprintf(stderr, "invalid argument: `-%c'\n", optopt); - exit(EX_USAGE); + exit(1); } } argc -= optind; @@ -556,10 +555,10 @@ main(int argc, char **argv) opterr = 1; if (argc != 0 && (showq || doqueue)) - errx(EX_USAGE, "sending mail and queue operations are mutually exclusive"); + errx(1, "sending mail and queue operations are mutually exclusive"); if (showq + doqueue > 1) - errx(EX_USAGE, "conflicting queue operations"); + errx(1, "conflicting queue operations"); skipopts: if (logident_base == NULL) @@ -579,7 +578,7 @@ skipopts: if (showq) { if (load_queue(&queue) < 0) - errlog(EX_NOINPUT, "can not load queue"); + errlog(1, "can not load queue"); show_queue(&queue); return (0); } @@ -587,38 +586,38 @@ skipopts: if (doqueue) { flushqueue_signal(); if (load_queue(&queue) < 0) - errlog(EX_NOINPUT, "can not load queue"); + errlog(1, "can not load queue"); run_queue(&queue); return (0); } if (read_aliases() != 0) - errlog(EX_SOFTWARE, "could not parse aliases file `%s'", config.aliases); + errlog(1, "could not parse aliases file `%s'", config.aliases); if ((sender = set_from(&queue, sender)) == NULL) - errlog(EX_SOFTWARE, NULL); + errlog(1, "set_from failed"); if (newspoolf(&queue) != 0) - errlog(EX_CANTCREAT, "can not create temp file in `%s'", config.spooldir); + errlog(1, "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(EX_DATAERR, "invalid recipient `%s'", argv[i]); + errlogx(1, "invalid recipient `%s'", argv[i]); } if (LIST_EMPTY(&queue.queue) && !recp_from_header) - errlogx(EX_NOINPUT, "no recipients"); + errlogx(1, "no recipients"); if (readmail(&queue, nodot, recp_from_header) != 0) - errlog(EX_NOINPUT, "can not read mail"); + errlog(1, "can not read mail"); if (LIST_EMPTY(&queue.queue)) - errlogx(EX_NOINPUT, "no recipients"); + errlogx(1, "no recipients"); if (linkspool(&queue) != 0) - errlog(EX_CANTCREAT, "can not create spools"); + errlog(1, "can not create spools"); /* From here on the mail is safe. */ diff --git a/contrib/dma/dma.h b/contrib/dma/dma.h index acf5e44..4ce0094 100644 --- a/contrib/dma/dma.h +++ b/contrib/dma/dma.h @@ -1,9 +1,8 @@ /* - * 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 Schubert <2@0x2c.org> and + * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de> and * Matthias Schmidt <matthias@dragonflybsd.org>. * * Redistribution and use in source and binary forms, with or without @@ -44,7 +43,6 @@ #include <arpa/inet.h> #include <openssl/ssl.h> #include <netdb.h> -#include <sysexits.h> #define VERSION "DragonFly Mail Agent " DMA_VERSION @@ -175,8 +173,6 @@ 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 dd9ebfc..fc5213f 100644 --- a/contrib/dma/dns.c +++ b/contrib/dma/dns.c @@ -1,9 +1,8 @@ /* - * 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 Schubert <2@0x2c.org>. + * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de> * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -68,6 +67,7 @@ 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,26 +75,9 @@ 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); - 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); - } + err = getaddrinfo(host, servname, &hints, &res0); + if (err) + return (err == EAI_AGAIN ? 1 : -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 d9691ac..aecc333 100755 --- a/contrib/dma/get-version.sh +++ b/contrib/dma/get-version.sh @@ -1,9 +1,7 @@ #!/bin/sh -tmp=$1 -file=${tmp:=VERSION} gitver=$(git describe 2>/dev/null | tr - .) -filever=$(cat ${file} 2>/dev/null) +filever=$(cat VERSION) version=${gitver} : ${version:=$filever} diff --git a/contrib/dma/local.c b/contrib/dma/local.c index e3e0152..6a6407e 100644 --- a/contrib/dma/local.c +++ b/contrib/dma/local.c @@ -1,9 +1,8 @@ /* - * 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 Schubert <2@0x2c.org>. + * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -82,7 +81,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(EX_SOFTWARE); + exit(1); default: /* parent */ diff --git a/contrib/dma/mail.c b/contrib/dma/mail.c index a6d11fc..f899d4b 100644 --- a/contrib/dma/mail.c +++ b/contrib/dma/mail.c @@ -1,9 +1,8 @@ /* - * 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 Schubert <2@0x2c.org>. + * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -52,7 +51,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(EX_SOFTWARE); + exit(1); } bzero(&bounceq, sizeof(bounceq)); @@ -133,7 +132,7 @@ bounce(struct qitem *it, const char *reason) fail: syslog(LOG_CRIT, "error creating bounce: %m"); delqueue(it); - exit(EX_IOERR); + exit(1); } struct parse_state { @@ -333,10 +332,10 @@ newaddr: ps->pos = 0; addr = strdup(ps->addr); if (addr == NULL) - errlog(EX_SOFTWARE, NULL); + errlog(1, "strdup failed"); if (add_recp(queue, addr, EXPAND_WILDCARD) != 0) - errlogx(EX_DATAERR, "invalid recipient `%s'", addr); + errlogx(1, "invalid recipient `%s'", addr); goto again; } @@ -375,9 +374,7 @@ readmail(struct queue *queue, int nodot, int recp_from_header) if (fgets(line, sizeof(line) - 1, stdin) == NULL) break; if (had_last_line) - errlogx(EX_DATAERR, "bad mail input format:" - " from %s (uid %d) (envelope-from %s)", - username, useruid, queue->sender); + errlogx(1, "bad mail input format"); linelen = strlen(line); if (linelen == 0 || line[linelen - 1] != '\n') { /* @@ -408,7 +405,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(EX_DATAERR, "invalid address in header\n"); + errlogx(1, "invalid address in header\n"); /* NOTREACHED */ } } @@ -419,7 +416,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(EX_DATAERR, "invalid address in header\n"); + errlogx(1, "invalid address in header\n"); /* NOTREACHED */ } } diff --git a/contrib/dma/net.c b/contrib/dma/net.c index 26935a8..d95a788 100644 --- a/contrib/dma/net.c +++ b/contrib/dma/net.c @@ -1,5 +1,4 @@ /* - * 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 d71332b..2864909 100644 --- a/contrib/dma/spool.c +++ b/contrib/dma/spool.c @@ -1,9 +1,8 @@ /* - * 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 Schubert <2@0x2c.org>. + * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -290,7 +289,7 @@ load_queue(struct queue *queue) spooldir = opendir(config.spooldir); if (spooldir == NULL) - err(EX_NOINPUT, "reading queue"); + err(1, "reading queue"); while ((de = readdir(spooldir)) != NULL) { queuefn = NULL; diff --git a/contrib/dma/util.c b/contrib/dma/util.c index d528f31..a139b20 100644 --- a/contrib/dma/util.c +++ b/contrib/dma/util.c @@ -1,9 +1,8 @@ /* - * 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 Schubert <2@0x2c.org>. + * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions |