%bcond_without selinux %bcond_without auth_plain Name: dma Version: 0.14 Release: 2%{?dist} Summary: DragonFly Mail Agent License: BSD-3-Clause AND BSD-2-Clause AND ISC URL: https://github.com/corecode/dma Source0: https://github.com/corecode/dma/archive/refs/tags/v%{version}.tar.gz#/dma-%{version}.tar.gz Source1: dma-queue.service Source2: dma-queue.timer Source3: dma-local.fc Source4: dma-local.te Patch0: 0001-Add-support-for-AUTH-PLAIN.patch BuildRequires: gcc BuildRequires: make BuildRequires: bison BuildRequires: flex BuildRequires: openssl-devel BuildRequires: redhat-rpm-config %if 0%{?rhel} == 8 BuildRequires: systemd %else BuildRequires: systemd-rpm-macros %endif BuildRequires: binutils Requires: setup Requires: ca-certificates Requires(post): /usr/sbin/alternatives Requires(preun): /usr/sbin/alternatives %{?systemd_requires} Provides: MTA %description Small mail transport agent accepting locally submitted mail and delivering it to local mailboxes or a remote SMTP relay. It does not listen for incoming SMTP connections. Built from upstream release 0.14, with the upstream AUTH PLAIN change backported by default for SMTP relays such as OCI. %if %{with selinux} %package selinux Summary: SELinux file-context mappings for dma BuildArch: noarch BuildRequires: selinux-policy-devel Requires: %{name} = %{version}-%{release} Requires: selinux-policy-targeted Supplements: (%{name} = %{version}-%{release} and selinux-policy-targeted) Requires(post): policycoreutils Requires(post): /usr/bin/grep Requires(postun): policycoreutils Requires(postun): /usr/bin/grep %description selinux Maps dma's executable and mailbox helper to the existing sendmail entrypoint type, its configuration to the mail configuration type, and its queue to the MTA queue type. Uses existing Enterprise Linux mail policy without adding allow rules. Delivery from each intended caller still needs verification in enforcing mode. %endif %prep %autosetup -N -n dma-%{version} %if %{with auth_plain} %patch -P 0 -p1 %endif # Fix the generated parser-header dependency for parallel builds. printf '\naliases_scan.o: aliases_parse.h\naliases_parse.h: aliases_parse.c\n' >> Makefile %build %{?set_build_flags} export CFLAGS="${CFLAGS:-%{optflags}}" export LDFLAGS="${LDFLAGS:-%{?build_ldflags}%{!?build_ldflags:%{?__global_ldflags}}}" # EL8/EL9 use dma's compatibility implementation; newer libc may supply it. cat > conftest.c <<'EOF' #define _GNU_SOURCE #include int main(void) { char dest[4]; return strlcpy(dest, "", sizeof dest) != 0; } EOF if %{__cc} ${CPPFLAGS:-} -Werror=implicit-function-declaration conftest.c -o conftest >/dev/null 2>&1; then export CPPFLAGS="${CPPFLAGS:-} -DHAVE_STRLCPY" echo 'strlcpy: using libc implementation' else echo 'strlcpy: using bundled compatibility implementation' fi rm -f conftest.c conftest %make_build PREFIX=%{_prefix} SBIN=%{_sbindir} \ LIBEXEC=%{_libexecdir}/dma CONFDIR=%{_sysconfdir}/dma \ YACC='bison -y' %if %{with selinux} mkdir selinux cp %{SOURCE3} selinux/dma_local.fc cp %{SOURCE4} selinux/dma_local.te make -C selinux -f %{_datadir}/selinux/devel/Makefile dma_local.pp %endif %install # Install manually: upstream install uses chown, which fails in unprivileged # RPM builds. RPM applies the ownership and special modes from %%files. install -Dpm0755 dma %{buildroot}%{_sbindir}/dma install -Dpm0755 dma-mbox-create %{buildroot}%{_libexecdir}/dma/dma-mbox-create install -Dpm0644 dma.8 %{buildroot}%{_mandir}/man8/dma.8 install -Dpm0644 dma.conf %{buildroot}%{_sysconfdir}/dma/dma.conf install -Dpm0640 auth.conf %{buildroot}%{_sysconfdir}/dma/auth.conf install -dm2775 %{buildroot}%{_localstatedir}/spool/dma ln -s dma %{buildroot}%{_sbindir}/sendmail.dma ln -s dma %{buildroot}%{_sbindir}/mailq.dma install -Dpm0644 %{SOURCE1} %{buildroot}%{_unitdir}/dma-queue.service install -Dpm0644 %{SOURCE2} %{buildroot}%{_unitdir}/dma-queue.timer %if %{with selinux} install -Dpm0644 selinux/dma_local.pp %{buildroot}%{_datadir}/selinux/packages/dma_local.pp %endif %check # Upstream has no automated test target. Verify both built ELF architectures # and embedded paths without invoking mail delivery. readelf -h dma readelf -h dma-mbox-create strings dma | grep -F '%{_libexecdir}/dma' strings dma | grep -F '%{_sysconfdir}/dma' %post /usr/sbin/alternatives --install %{_sbindir}/sendmail mta %{_sbindir}/sendmail.dma 20 \ --slave /usr/lib/sendmail mta-sendmail %{_sbindir}/sendmail.dma \ --slave %{_bindir}/mailq mta-mailq %{_sbindir}/mailq.dma %systemd_post dma-queue.timer %preun %systemd_preun dma-queue.timer dma-queue.service if [ "$1" -eq 0 ]; then /usr/sbin/alternatives --remove mta %{_sbindir}/sendmail.dma fi %postun %systemd_postun_with_restart dma-queue.timer %if %{with selinux} %post selinux # Older policy compilers reject identical file contexts in both series. if /usr/sbin/semodule -l | /usr/bin/grep -Eq '^dma_git([[:space:]]|$)'; then /usr/sbin/semodule -n -r dma_git || exit $? fi /usr/sbin/semodule -n -i %{_datadir}/selinux/packages/dma_local.pp || exit $? /usr/sbin/selinuxenabled && /usr/sbin/load_policy || : /usr/sbin/restorecon -RF %{_sbindir}/dma %{_libexecdir}/dma %{_sysconfdir}/dma %{_localstatedir}/spool/dma || : %postun selinux if [ "$1" -eq 0 ]; then if /usr/sbin/semodule -l | /usr/bin/grep -Eq '^dma_local([[:space:]]|$)'; then /usr/sbin/semodule -n -r dma_local || : fi /usr/sbin/selinuxenabled && /usr/sbin/load_policy || : /usr/sbin/restorecon -RF %{_sbindir}/dma %{_libexecdir}/dma %{_sysconfdir}/dma %{_localstatedir}/spool/dma 2>/dev/null || : fi %endif %files %license LICENSE dfcompat.c %doc README.markdown INSTALL %attr(2755,root,mail) %{_sbindir}/dma %{_sbindir}/sendmail.dma %{_sbindir}/mailq.dma %dir %{_libexecdir}/dma %attr(4754,root,mail) %{_libexecdir}/dma/dma-mbox-create %dir %attr(0755,root,root) %{_sysconfdir}/dma %config(noreplace) %attr(0644,root,root) %{_sysconfdir}/dma/dma.conf %config(noreplace) %attr(0640,root,mail) %{_sysconfdir}/dma/auth.conf %dir %attr(2775,root,mail) %{_localstatedir}/spool/dma %{_unitdir}/dma-queue.service %{_unitdir}/dma-queue.timer %{_mandir}/man8/dma.8* %if %{with selinux} %files selinux %{_datadir}/selinux/packages/dma_local.pp %endif %changelog * Fri Oct 30 2026 Nick Winterer - 0.14-2 - Supplement the matching main package only when targeted SELinux policy is present. * Fri Oct 30 2026 Nick Winterer - 0.14-1 - Package upstream release 0.14. - Backport upstream commit 33ef5a3a2073ad34f1e6fd415c31883b2e23d0db (AUTH PLAIN). - Support EL8, EL9 and EL10 libc, RPM macros and SELinux path mappings.