%global commit f4e1d913e6f393a830a5eaddfcbf48d47a796b70 %global shortcommit %(c=%{commit}; echo ${c:0:12}) %global base_version 0.14 %global git_count 499 %bcond_without selinux Name: dma-git Version: %{base_version}^git%{git_count}.g%{shortcommit} 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/%{commit}/dma-%{commit}.tar.gz Source1: dma-queue.service Source2: dma-queue.timer Source3: dma-git.fc Source4: dma-git.te 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 Conflicts: dma %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. This package builds a pinned upstream master snapshot. %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) Conflicts: dma-selinux 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 dma-%{commit} # GitHub archives have no .git metadata. Record the actual snapshot identity. printf 'v%{base_version}+git%{git_count}.%{shortcommit}\n' > VERSION # 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_git.fc cp %{SOURCE4} selinux/dma_git.te make -C selinux -f %{_datadir}/selinux/devel/Makefile dma_git.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-git ln -s dma %{buildroot}%{_sbindir}/mailq.dma-git install -Dpm0644 %{SOURCE1} %{buildroot}%{_unitdir}/dma-queue.service install -Dpm0644 %{SOURCE2} %{buildroot}%{_unitdir}/dma-queue.timer %if %{with selinux} install -Dpm0644 selinux/dma_git.pp %{buildroot}%{_datadir}/selinux/packages/dma_git.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-git 20 \ --slave /usr/lib/sendmail mta-sendmail %{_sbindir}/sendmail.dma-git \ --slave %{_bindir}/mailq mta-mailq %{_sbindir}/mailq.dma-git %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-git 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_local([[:space:]]|$)'; then /usr/sbin/semodule -n -r dma_local || exit $? fi /usr/sbin/semodule -n -i %{_datadir}/selinux/packages/dma_git.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_git([[:space:]]|$)'; then /usr/sbin/semodule -n -r dma_git || : 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-git %{_sbindir}/mailq.dma-git %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_git.pp %endif %changelog * Fri Oct 30 2026 Nick Winterer - 0.14^git499.gf4e1d913e6f3-2 - Supplement the matching main package only when targeted SELinux policy is present. * Fri Oct 30 2026 Nick Winterer - 0.14^git499.gf4e1d913e6f3-1 - Separate master snapshots from stable dma without Provides/Obsoletes for dma. - Use commit-count snapshot ordering and a separate SELinux module. - Support EL8, EL9 and EL10 libc, RPM macros and SELinux path mappings.